Skip to content

Commit

Permalink
feat(cli): MappedType key remapping
Browse files Browse the repository at this point in the history
  • Loading branch information
WoH committed Oct 1, 2020
1 parent 5ba55b2 commit c260701
Show file tree
Hide file tree
Showing 4 changed files with 342 additions and 3 deletions.
6 changes: 3 additions & 3 deletions packages/cli/src/metadataGeneration/typeResolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -162,9 +162,9 @@ export class TypeResolver {
const declaration = getDeclaration(property) as ts.PropertySignature | ts.PropertyDeclaration | ts.ParameterDeclaration | undefined;

if (declaration && ts.isPropertySignature(declaration)) {
return this.propertyFromSignature(declaration, mappedTypeNode.questionToken);
return { ...this.propertyFromSignature(declaration, mappedTypeNode.questionToken), name: property.getName() };
} else if (declaration && (ts.isPropertyDeclaration(declaration) || ts.isParameter(declaration))) {
return this.propertyFromDeclaration(declaration, mappedTypeNode.questionToken);
return { ...this.propertyFromDeclaration(declaration, mappedTypeNode.questionToken), name: property.getName() };
}

// Resolve default value, required and typeNode
Expand All @@ -178,7 +178,7 @@ export class TypeResolver {

// Push property
return {
name: property.name,
name: property.getName(),
required,
type: new TypeResolver(typeNode, this.current, this.typeNode, this.context, this.referencer).resolve(),
validators: {},
Expand Down
3 changes: 3 additions & 0 deletions tests/fixtures/testModel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,9 @@ export interface TestModel extends Model {

templateLiteralString?: TemplateLiteralString,
inlineTLS?: `${Uppercase<OrderDirection>}`
inlineMappedType?: {[K in Exclude<TemplateLiteralString, 'firstname:asc'>]: boolean}
inlineMappedTypeRemapped?: {
[K in keyof ParameterTestModel as `${Capitalize<K>}Prop`]?: string}
}

interface Generic<T> {
Expand Down
168 changes: 168 additions & 0 deletions tests/unit/swagger/definitionsGeneration/definitions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1199,6 +1199,174 @@ describe('Definition generation', () => {
`for property ${propertyName}`,
);
},
inlineMappedType: (propertyName, propertySchema) => {
expect(propertySchema).to.deep.equal(
{
properties: {
'lastname:asc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'age:asc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'weight:asc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'human:asc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'gender:asc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'nicknames:asc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'firstname:desc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'lastname:desc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'age:desc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'weight:desc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'human:desc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'gender:desc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'nicknames:desc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
},
type: 'object',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
`for property ${propertyName}`,
);
},
inlineMappedTypeRemapped: (propertyName, propertySchema) => {
expect(propertySchema).to.deep.equal(
{
properties: {
FirstnameProp: {
type: 'string',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
LastnameProp: {
type: 'string',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
AgeProp: {
type: 'string',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
WeightProp: {
type: 'string',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
HumanProp: {
type: 'string',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
GenderProp: {
type: 'string',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
NicknamesProp: {
type: 'string',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
},
type: 'object',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
`for property ${propertyName}`,
);
},
};

Object.keys(assertionsPerProperty).forEach(aPropertyName => {
Expand Down
168 changes: 168 additions & 0 deletions tests/unit/swagger/schemaDetails3.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1592,6 +1592,174 @@ describe('Definition generation for OpenAPI 3.0.0', () => {
`for property ${propertyName}`,
);
},
inlineMappedType: (propertyName, propertySchema) => {
expect(propertySchema).to.deep.equal(
{
properties: {
'lastname:asc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'age:asc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'weight:asc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'human:asc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'gender:asc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'nicknames:asc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'firstname:desc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'lastname:desc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'age:desc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'weight:desc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'human:desc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'gender:desc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
'nicknames:desc': {
type: 'boolean',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
},
type: 'object',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
`for property ${propertyName}`,
);
},
inlineMappedTypeRemapped: (propertyName, propertySchema) => {
expect(propertySchema).to.deep.equal(
{
properties: {
FirstnameProp: {
type: 'string',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
LastnameProp: {
type: 'string',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
AgeProp: {
type: 'string',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
WeightProp: {
type: 'string',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
HumanProp: {
type: 'string',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
GenderProp: {
type: 'string',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
NicknamesProp: {
type: 'string',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
},
type: 'object',
description: undefined,
example: undefined,
format: undefined,
default: undefined,
},
`for property ${propertyName}`,
);
},
};

const testModel = currentSpec.spec.components.schemas[interfaceModelName];
Expand Down

0 comments on commit c260701

Please sign in to comment.