Browse Source

feat: add imports for generic types in schematics

pull/5137/head
Arman Ozak 6 years ago
parent
commit
faffc8cddf
  1. 4
      npm/ng-packs/packages/schematics/src/models/api-definition.ts
  2. 47
      npm/ng-packs/packages/schematics/src/utils/service.ts

4
npm/ng-packs/packages/schematics/src/models/api-definition.ts

@ -45,7 +45,7 @@ export interface Action {
supportedVersions: string[]; supportedVersions: string[];
parametersOnMethod: ParameterInSignature[]; parametersOnMethod: ParameterInSignature[];
parameters: ParameterInBody[]; parameters: ParameterInBody[];
returnValue: ReturnValue; returnValue: TypeDef;
} }
export interface ParameterInSignature { export interface ParameterInSignature {
@ -69,7 +69,7 @@ export interface ParameterInBody {
descriptorName: string; descriptorName: string;
} }
export interface ReturnValue { export interface TypeDef {
type: string; type: string;
typeSimple: string; typeSimple: string;
} }

47
npm/ng-packs/packages/schematics/src/utils/service.ts

@ -6,9 +6,9 @@ import {
Import, Import,
Method, Method,
Parameter, Parameter,
ReturnValue,
Service, Service,
Signature, Signature,
TypeDef,
} from '../models'; } from '../models';
import { parseNamespace } from './namespace'; import { parseNamespace } from './namespace';
import { relativePathFromServiceToModel } from './path'; import { relativePathFromServiceToModel } from './path';
@ -30,7 +30,8 @@ export function createActionToImportsReducer(solution: string, namespace: string
const mapTypeDefToImport = createTypeDefToImportMapper(solution, namespace); const mapTypeDefToImport = createTypeDefToImportMapper(solution, namespace);
return (imports: Import[], action: Action) => { return (imports: Import[], action: Action) => {
const typeDefs = [action.returnValue, ...action.parametersOnMethod]; const typeDefs = getTypeDefsFromAction(action);
typeDefs.forEach(typeDef => { typeDefs.forEach(typeDef => {
const def = mapTypeDefToImport(typeDef); const def = mapTypeDefToImport(typeDef);
if (!def) return; if (!def) return;
@ -51,14 +52,14 @@ export function createActionToImportsReducer(solution: string, namespace: string
export function createTypeDefToImportMapper(solution: string, namespace: string) { export function createTypeDefToImportMapper(solution: string, namespace: string) {
const adaptType = createTypeAdapter(solution); const adaptType = createTypeAdapter(solution);
return ({ type, typeSimple }: ReturnValue) => { return ({ type, typeSimple }: TypeDef) => {
if (type.startsWith('System')) return; if (type.startsWith('System')) return;
const modelNamespace = parseNamespace(solution, type); const modelNamespace = parseNamespace(solution, type);
const path = type.startsWith('Volo.Abp.Application.Dtos') const path = type.startsWith('Volo.Abp.Application.Dtos')
? '@volo/abp.ng.core' ? '@abp/ng.core'
: relativePathFromServiceToModel(namespace, modelNamespace); : relativePathFromServiceToModel(namespace, modelNamespace);
const specifier = adaptType(typeSimple.split('<')[0]); const specifiers = [adaptType(typeSimple.split('<')[0])];
return new Import({ keyword: eImportKeyword.Type, path, specifiers: [specifier] }); return new Import({ keyword: eImportKeyword.Type, path, specifiers });
}; };
} }
@ -116,15 +117,29 @@ function createTypeAdapter(solution: string) {
return (typeSimple: string) => { return (typeSimple: string) => {
if (typeSimple === 'System.Void') return 'void'; if (typeSimple === 'System.Void') return 'void';
return typeSimple return parseGenerics(typeSimple).reduceRight((acc, type) => {
.replace(/>+$/, '') type = type.replace(voloRegex, '');
.split('<') type = type.replace(solutionRegex, '');
.reduceRight((acc, type) => { type = type.replace(optionalRegex, '');
type = type.replace(voloRegex, ''); type = type.split('.').pop()!;
type = type.replace(solutionRegex, ''); return acc ? `${type}<${acc}>` : type;
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;
}

Loading…
Cancel
Save