Skip to content

Commit 1ecc7d8

Browse files
committed
feat(cli): MappedType key remapping
1 parent b1b4b5a commit 1ecc7d8

File tree

4 files changed

+228
-3
lines changed

4 files changed

+228
-3
lines changed

packages/cli/src/metadataGeneration/typeResolver.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,9 @@ export class TypeResolver {
162162
const declaration = getDeclaration(property) as ts.PropertySignature | ts.PropertyDeclaration | ts.ParameterDeclaration | undefined;
163163

164164
if (declaration && ts.isPropertySignature(declaration)) {
165-
return this.propertyFromSignature(declaration, mappedTypeNode.questionToken);
165+
return { ...this.propertyFromSignature(declaration, mappedTypeNode.questionToken), name: property.getName() };
166166
} else if (declaration && (ts.isPropertyDeclaration(declaration) || ts.isParameter(declaration))) {
167-
return this.propertyFromDeclaration(declaration, mappedTypeNode.questionToken);
167+
return { ...this.propertyFromDeclaration(declaration, mappedTypeNode.questionToken), name: property.getName() };
168168
}
169169

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

179179
// Push property
180180
return {
181-
name: property.name,
181+
name: property.getName(),
182182
required,
183183
type: new TypeResolver(typeNode, this.current, this.typeNode, this.context, this.referencer).resolve(),
184184
validators: {},

tests/fixtures/testModel.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,9 @@ export interface TestModel extends Model {
157157

158158
templateLiteralString?: TemplateLiteralString,
159159
inlineTLS?: `${Uppercase<OrderDirection>}`
160+
inlineMappedType?: {[K in Exclude<TemplateLiteralString, 'firstname:asc'>]: boolean}
161+
inlineMappedTypeRemapped?: {
162+
[K in keyof ParameterTestModel as `${Capitalize<K>}Prop`]?: string}
160163
}
161164

162165
interface Generic<T> {

tests/unit/swagger/definitionsGeneration/definitions.spec.ts

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,6 +1199,117 @@ describe('Definition generation', () => {
11991199
`for property ${propertyName}`,
12001200
);
12011201
},
1202+
inlineMappedType: (propertyName, propertySchema) => {
1203+
expect(propertySchema).to.deep.equal(
1204+
{
1205+
properties: {
1206+
'lastname:asc': {
1207+
type: 'boolean',
1208+
description: undefined,
1209+
example: undefined,
1210+
format: undefined,
1211+
default: undefined,
1212+
},
1213+
'age:asc': {
1214+
type: 'boolean',
1215+
description: undefined,
1216+
example: undefined,
1217+
format: undefined,
1218+
default: undefined,
1219+
},
1220+
'weight:asc': {
1221+
type: 'boolean',
1222+
description: undefined,
1223+
example: undefined,
1224+
format: undefined,
1225+
default: undefined,
1226+
},
1227+
'human:asc': {
1228+
type: 'boolean',
1229+
description: undefined,
1230+
example: undefined,
1231+
format: undefined,
1232+
default: undefined,
1233+
},
1234+
'gender:asc': {
1235+
type: 'boolean',
1236+
description: undefined,
1237+
example: undefined,
1238+
format: undefined,
1239+
default: undefined,
1240+
},
1241+
'nicknames:asc': {
1242+
type: 'boolean',
1243+
description: undefined,
1244+
example: undefined,
1245+
format: undefined,
1246+
default: undefined,
1247+
},
1248+
'firstname:desc': {
1249+
type: 'boolean',
1250+
description: undefined,
1251+
example: undefined,
1252+
format: undefined,
1253+
default: undefined,
1254+
},
1255+
'lastname:desc': {
1256+
type: 'boolean',
1257+
description: undefined,
1258+
example: undefined,
1259+
format: undefined,
1260+
default: undefined,
1261+
},
1262+
'age:desc': {
1263+
type: 'boolean',
1264+
description: undefined,
1265+
example: undefined,
1266+
format: undefined,
1267+
default: undefined,
1268+
},
1269+
'weight:desc': {
1270+
type: 'boolean',
1271+
description: undefined,
1272+
example: undefined,
1273+
format: undefined,
1274+
default: undefined,
1275+
},
1276+
'human:desc': {
1277+
type: 'boolean',
1278+
description: undefined,
1279+
example: undefined,
1280+
format: undefined,
1281+
default: undefined,
1282+
},
1283+
'gender:desc': {
1284+
type: 'boolean',
1285+
description: undefined,
1286+
example: undefined,
1287+
format: undefined,
1288+
default: undefined,
1289+
},
1290+
'nicknames:desc': {
1291+
type: 'boolean',
1292+
description: undefined,
1293+
example: undefined,
1294+
format: undefined,
1295+
default: undefined,
1296+
},
1297+
},
1298+
type: 'object',
1299+
description: undefined,
1300+
example: undefined,
1301+
format: undefined,
1302+
default: undefined,
1303+
},
1304+
`for property ${propertyName}`,
1305+
);
1306+
},
1307+
inlineMappedTypeRemapped: (propertyName, propertySchema) => {
1308+
expect(Object.keys(propertySchema.properties || {})).to.have.members(
1309+
['FirstnameProp', 'LastnameProp', 'AgeProp', 'WeightProp', 'HumanProp', 'GenderProp', 'NicknamesProp'],
1310+
`for property ${propertyName}`,
1311+
);
1312+
},
12021313
};
12031314

12041315
Object.keys(assertionsPerProperty).forEach(aPropertyName => {

tests/unit/swagger/schemaDetails3.spec.ts

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1592,6 +1592,117 @@ describe('Definition generation for OpenAPI 3.0.0', () => {
15921592
`for property ${propertyName}`,
15931593
);
15941594
},
1595+
inlineMappedType: (propertyName, propertySchema) => {
1596+
expect(propertySchema).to.deep.equal(
1597+
{
1598+
properties: {
1599+
'lastname:asc': {
1600+
type: 'boolean',
1601+
description: undefined,
1602+
example: undefined,
1603+
format: undefined,
1604+
default: undefined,
1605+
},
1606+
'age:asc': {
1607+
type: 'boolean',
1608+
description: undefined,
1609+
example: undefined,
1610+
format: undefined,
1611+
default: undefined,
1612+
},
1613+
'weight:asc': {
1614+
type: 'boolean',
1615+
description: undefined,
1616+
example: undefined,
1617+
format: undefined,
1618+
default: undefined,
1619+
},
1620+
'human:asc': {
1621+
type: 'boolean',
1622+
description: undefined,
1623+
example: undefined,
1624+
format: undefined,
1625+
default: undefined,
1626+
},
1627+
'gender:asc': {
1628+
type: 'boolean',
1629+
description: undefined,
1630+
example: undefined,
1631+
format: undefined,
1632+
default: undefined,
1633+
},
1634+
'nicknames:asc': {
1635+
type: 'boolean',
1636+
description: undefined,
1637+
example: undefined,
1638+
format: undefined,
1639+
default: undefined,
1640+
},
1641+
'firstname:desc': {
1642+
type: 'boolean',
1643+
description: undefined,
1644+
example: undefined,
1645+
format: undefined,
1646+
default: undefined,
1647+
},
1648+
'lastname:desc': {
1649+
type: 'boolean',
1650+
description: undefined,
1651+
example: undefined,
1652+
format: undefined,
1653+
default: undefined,
1654+
},
1655+
'age:desc': {
1656+
type: 'boolean',
1657+
description: undefined,
1658+
example: undefined,
1659+
format: undefined,
1660+
default: undefined,
1661+
},
1662+
'weight:desc': {
1663+
type: 'boolean',
1664+
description: undefined,
1665+
example: undefined,
1666+
format: undefined,
1667+
default: undefined,
1668+
},
1669+
'human:desc': {
1670+
type: 'boolean',
1671+
description: undefined,
1672+
example: undefined,
1673+
format: undefined,
1674+
default: undefined,
1675+
},
1676+
'gender:desc': {
1677+
type: 'boolean',
1678+
description: undefined,
1679+
example: undefined,
1680+
format: undefined,
1681+
default: undefined,
1682+
},
1683+
'nicknames:desc': {
1684+
type: 'boolean',
1685+
description: undefined,
1686+
example: undefined,
1687+
format: undefined,
1688+
default: undefined,
1689+
},
1690+
},
1691+
type: 'object',
1692+
description: undefined,
1693+
example: undefined,
1694+
format: undefined,
1695+
default: undefined,
1696+
},
1697+
`for property ${propertyName}`,
1698+
);
1699+
},
1700+
inlineMappedTypeRemapped: (propertyName, propertySchema) => {
1701+
expect(Object.keys(propertySchema.properties || {})).to.have.members(
1702+
['FirstnameProp', 'LastnameProp', 'AgeProp', 'WeightProp', 'HumanProp', 'GenderProp', 'NicknamesProp'],
1703+
`for property ${propertyName}`,
1704+
);
1705+
},
15951706
};
15961707

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

0 commit comments

Comments
 (0)