From faffc8cddff3c5b8f392aac233ff988babb6d25f Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Tue, 18 Aug 2020 21:13:45 +0300 Subject: [PATCH] feat: add imports for generic types in schematics --- .../schematics/src/models/api-definition.ts | 4 +- .../packages/schematics/src/utils/service.ts | 47 ++++++++++++------- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/npm/ng-packs/packages/schematics/src/models/api-definition.ts b/npm/ng-packs/packages/schematics/src/models/api-definition.ts index 2903066b74..32ac847e5b 100644 --- a/npm/ng-packs/packages/schematics/src/models/api-definition.ts +++ b/npm/ng-packs/packages/schematics/src/models/api-definition.ts @@ -45,7 +45,7 @@ export interface Action { supportedVersions: string[]; parametersOnMethod: ParameterInSignature[]; parameters: ParameterInBody[]; - returnValue: ReturnValue; + returnValue: TypeDef; } export interface ParameterInSignature { @@ -69,7 +69,7 @@ export interface ParameterInBody { descriptorName: string; } -export interface ReturnValue { +export interface TypeDef { type: string; typeSimple: string; } diff --git a/npm/ng-packs/packages/schematics/src/utils/service.ts b/npm/ng-packs/packages/schematics/src/utils/service.ts index 32eede578e..85034b2ce5 100644 --- a/npm/ng-packs/packages/schematics/src/utils/service.ts +++ b/npm/ng-packs/packages/schematics/src/utils/service.ts @@ -6,9 +6,9 @@ import { Import, Method, Parameter, - ReturnValue, Service, Signature, + TypeDef, } from '../models'; import { parseNamespace } from './namespace'; import { relativePathFromServiceToModel } from './path'; @@ -30,7 +30,8 @@ export function createActionToImportsReducer(solution: string, namespace: string const mapTypeDefToImport = createTypeDefToImportMapper(solution, namespace); return (imports: Import[], action: Action) => { - const typeDefs = [action.returnValue, ...action.parametersOnMethod]; + const typeDefs = getTypeDefsFromAction(action); + typeDefs.forEach(typeDef => { const def = mapTypeDefToImport(typeDef); if (!def) return; @@ -51,14 +52,14 @@ export function createActionToImportsReducer(solution: string, namespace: string export function createTypeDefToImportMapper(solution: string, namespace: string) { const adaptType = createTypeAdapter(solution); - return ({ type, typeSimple }: ReturnValue) => { + return ({ type, typeSimple }: TypeDef) => { if (type.startsWith('System')) return; const modelNamespace = parseNamespace(solution, type); const path = type.startsWith('Volo.Abp.Application.Dtos') - ? '@volo/abp.ng.core' + ? '@abp/ng.core' : relativePathFromServiceToModel(namespace, modelNamespace); - const specifier = adaptType(typeSimple.split('<')[0]); - return new Import({ keyword: eImportKeyword.Type, path, specifiers: [specifier] }); + const specifiers = [adaptType(typeSimple.split('<')[0])]; + return new Import({ keyword: eImportKeyword.Type, path, specifiers }); }; } @@ -116,15 +117,29 @@ function createTypeAdapter(solution: string) { return (typeSimple: string) => { if (typeSimple === 'System.Void') return 'void'; - return typeSimple - .replace(/>+$/, '') - .split('<') - .reduceRight((acc, type) => { - type = type.replace(voloRegex, ''); - type = type.replace(solutionRegex, ''); - type = type.replace(optionalRegex, ''); - type = type.split('.').pop()!; - return acc ? `${type}<${acc}>` : type; - }, ''); + return parseGenerics(typeSimple).reduceRight((acc, type) => { + type = type.replace(voloRegex, ''); + type = type.replace(solutionRegex, ''); + type = type.replace(optionalRegex, ''); + type = type.split('.').pop()!; + return acc ? `${type}<${acc}>` : type; + }, ''); }; } + +function parseGenerics(type: string) { + return type.replace(/>+$/, '').split('<'); +} + +function getTypeDefsFromAction({ parametersOnMethod, returnValue }: Action) { + const typeDefs: TypeDef[] = []; + + [returnValue, ...parametersOnMethod].forEach(({ type, typeSimple }) => { + const types = parseGenerics(type); + const simpleTypes = parseGenerics(typeSimple); + + types.forEach((type, i) => typeDefs.push({ type, typeSimple: simpleTypes[i] })); + }); + + return typeDefs; +}