Skip to content

Commit 0ae4db4

Browse files
committed
- Added better support for deprecated prop
1 parent 4428f85 commit 0ae4db4

16 files changed

+179
-15
lines changed

rollup.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const handlebarsPlugin = () => ({
2828
preventIndent: true,
2929
knownHelpersOnly: true,
3030
knownHelpers: {
31+
ifdef: true,
3132
equals: true,
3233
notEquals: true,
3334
containsSpaces: true,

src/client/interfaces/Model.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export interface Model extends Schema {
99
template: string | null;
1010
link: Model | null;
1111
description: string | null;
12+
deprecated?: boolean;
1213
default?: string;
1314
imports: string[];
1415
enum: Enum[];

src/openApi/v3/parser/getModel.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export const getModel = (
2323
template: null,
2424
link: null,
2525
description: definition.description || null,
26+
deprecated: definition.deprecated === true,
2627
isDefinition,
2728
isReadOnly: definition.readOnly === true,
2829
isNullable: definition.nullable === true,

src/openApi/v3/parser/getModelProperties.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export const getModelProperties = (
3737
> = {
3838
name: escapeName(propertyName),
3939
description: property.description || null,
40+
deprecated: property.deprecated === true,
4041
isDefinition: false,
4142
isReadOnly: property.readOnly === true,
4243
isRequired: propertyRequired,

src/openApi/v3/parser/getOperationParameter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export const getOperationParameter = (openApi: OpenApi, parameter: OpenApiParame
2020
template: null,
2121
link: null,
2222
description: parameter.description || null,
23+
deprecated: parameter.deprecated === true,
2324
isDefinition: false,
2425
isReadOnly: false,
2526
isRequired: parameter.required === true,

src/templates/partials/exportComposition.hbs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,30 @@
1-
{{#if description}}
1+
{{#ifdef description deprecated}}
22
/**
3+
{{#if description}}
34
* {{{escapeComment description}}}
4-
*/
55
{{/if}}
6+
{{#if deprecated}}
7+
* @deprecated
8+
{{/if}}
9+
*/
10+
{{/ifdef}}
611
export type {{{name}}} = {{>type parent=name}};
712
{{#if enums}}
813
{{#unless @root.useUnionTypes}}
914

1015
export namespace {{{name}}} {
1116

1217
{{#each enums}}
13-
{{#if description}}
18+
{{#ifdef description deprecated}}
1419
/**
20+
{{#if description}}
1521
* {{{escapeComment description}}}
16-
*/
1722
{{/if}}
23+
{{#if deprecated}}
24+
* @deprecated
25+
{{/if}}
26+
*/
27+
{{/ifdef}}
1828
export enum {{{name}}} {
1929
{{#each enum}}
2030
{{{name}}} = {{{value}}},

src/templates/partials/exportEnum.hbs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1-
{{#if description}}
1+
{{#ifdef description deprecated}}
22
/**
3+
{{#if description}}
34
* {{{escapeComment description}}}
4-
*/
55
{{/if}}
6+
{{#if deprecated}}
7+
* @deprecated
8+
{{/if}}
9+
*/
10+
{{/ifdef}}
611
export enum {{{name}}} {
712
{{#each enum}}
813
{{#if description}}

src/templates/partials/exportInterface.hbs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,25 @@
1-
{{#if description}}
1+
{{#ifdef description deprecated}}
22
/**
3+
{{#if description}}
34
* {{{escapeComment description}}}
4-
*/
55
{{/if}}
6+
{{#if deprecated}}
7+
* @deprecated
8+
{{/if}}
9+
*/
10+
{{/ifdef}}
611
export type {{{name}}} = {
712
{{#each properties}}
8-
{{#if description}}
13+
{{#ifdef description deprecated}}
914
/**
15+
{{#if description}}
1016
* {{{escapeComment description}}}
11-
*/
1217
{{/if}}
18+
{{#if deprecated}}
19+
* @deprecated
20+
{{/if}}
21+
*/
22+
{{/ifdef}}
1323
{{>isReadOnly}}{{{name}}}{{>isRequired}}: {{>type parent=../name}};
1424
{{/each}}
1525
};

src/templates/partials/exportType.hbs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1-
{{#if description}}
1+
{{#ifdef description deprecated}}
22
/**
3+
{{#if description}}
34
* {{{escapeComment description}}}
4-
*/
55
{{/if}}
6+
{{#if deprecated}}
7+
* @deprecated
8+
{{/if}}
9+
*/
10+
{{/ifdef}}
611
export type {{{name}}} = {{>type}};

src/templates/partials/parameters.hbs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,16 @@
66
{{/each}}
77
}: {
88
{{#each parameters}}
9+
{{#ifdef description deprecated}}
10+
/**
911
{{#if description}}
10-
/** {{{escapeComment description}}} **/
12+
* {{{escapeComment description}}}
1113
{{/if}}
14+
{{#if deprecated}}
15+
* @deprecated
16+
{{/if}}
17+
*/
18+
{{/ifdef}}
1219
{{{name}}}{{>isRequired}}: {{>type}},
1320
{{/each}}
1421
}

src/templates/partials/typeInterface.hbs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
{{~#if properties~}}
22
{
33
{{#each properties}}
4-
{{#if description}}
4+
{{#ifdef description deprecated}}
55
/**
6+
{{#if description}}
67
* {{{escapeComment description}}}
7-
*/
88
{{/if}}
9+
{{#if deprecated}}
10+
* @deprecated
11+
{{/if}}
12+
*/
13+
{{/ifdef}}
914
{{#if ../parent}}
1015
{{>isReadOnly}}{{{name}}}{{>isRequired}}: {{>type parent=../parent}};
1116
{{else}}

src/utils/registerHandlebarHelpers.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ describe('registerHandlebarHelpers', () => {
1111
useUnionTypes: false,
1212
});
1313
const helpers = Object.keys(Handlebars.helpers);
14+
expect(helpers).toContain('ifdef');
1415
expect(helpers).toContain('equals');
1516
expect(helpers).toContain('notEquals');
1617
expect(helpers).toContain('containsSpaces');

src/utils/registerHandlebarHelpers.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@ export const registerHandlebarHelpers = (root: {
1212
useOptions: boolean;
1313
useUnionTypes: boolean;
1414
}): void => {
15+
Handlebars.registerHelper('ifdef', function (this: any, ...args): string {
16+
const options = args.pop();
17+
if (!args.every(value => !value)) {
18+
return options.fn(this);
19+
}
20+
return options.inverse(this);
21+
});
22+
1523
Handlebars.registerHelper(
1624
'equals',
1725
function (this: any, a: string, b: string, options: Handlebars.HelperOptions): string {

test/__snapshots__/index.spec.ts.snap

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3632,6 +3632,7 @@ export type { CompositionWithOneOfAndSimpleArrayDictionary } from './models/Comp
36323632
export type { CompositionWithOneOfAndSimpleDictionary } from './models/CompositionWithOneOfAndSimpleDictionary';
36333633
export type { CompositionWithOneOfAnonymous } from './models/CompositionWithOneOfAnonymous';
36343634
export type { CompositionWithOneOfDiscriminator } from './models/CompositionWithOneOfDiscriminator';
3635+
export type { DeprecatedModel } from './models/DeprecatedModel';
36353636
export type { DictionaryWithArray } from './models/DictionaryWithArray';
36363637
export type { DictionaryWithDictionary } from './models/DictionaryWithDictionary';
36373638
export type { DictionaryWithProperties } from './models/DictionaryWithProperties';
@@ -3696,6 +3697,7 @@ export { $CompositionWithOneOfAndSimpleArrayDictionary } from './schemas/$Compos
36963697
export { $CompositionWithOneOfAndSimpleDictionary } from './schemas/$CompositionWithOneOfAndSimpleDictionary';
36973698
export { $CompositionWithOneOfAnonymous } from './schemas/$CompositionWithOneOfAnonymous';
36983699
export { $CompositionWithOneOfDiscriminator } from './schemas/$CompositionWithOneOfDiscriminator';
3700+
export { $DeprecatedModel } from './schemas/$DeprecatedModel';
36993701
export { $DictionaryWithArray } from './schemas/$DictionaryWithArray';
37003702
export { $DictionaryWithDictionary } from './schemas/$DictionaryWithDictionary';
37013703
export { $DictionaryWithProperties } from './schemas/$DictionaryWithProperties';
@@ -3739,6 +3741,7 @@ export { CollectionFormatService } from './services/CollectionFormatService';
37393741
export { ComplexService } from './services/ComplexService';
37403742
export { DefaultService } from './services/DefaultService';
37413743
export { DefaultsService } from './services/DefaultsService';
3744+
export { DeprecatedService } from './services/DeprecatedService';
37423745
export { DescriptionsService } from './services/DescriptionsService';
37433746
export { DuplicateService } from './services/DuplicateService';
37443747
export { ErrorService } from './services/ErrorService';
@@ -4145,6 +4148,26 @@ export type CompositionWithOneOfDiscriminator = (ModelCircle | ModelSquare);
41454148
"
41464149
`;
41474150

4151+
exports[`v3 should generate: ./test/generated/v3/models/DeprecatedModel.ts 1`] = `
4152+
"/* istanbul ignore file */
4153+
/* tslint:disable */
4154+
/* eslint-disable */
4155+
4156+
/**
4157+
* This is a deprecated model with a deprecated property
4158+
* @deprecated
4159+
*/
4160+
export type DeprecatedModel = {
4161+
/**
4162+
* This is a deprecated property
4163+
* @deprecated
4164+
*/
4165+
prop?: string;
4166+
};
4167+
4168+
"
4169+
`;
4170+
41484171
exports[`v3 should generate: ./test/generated/v3/models/DictionaryWithArray.ts 1`] = `
41494172
"/* istanbul ignore file */
41504173
/* tslint:disable */
@@ -5319,6 +5342,22 @@ export const $CompositionWithOneOfDiscriminator = {
53195342
"
53205343
`;
53215344

5345+
exports[`v3 should generate: ./test/generated/v3/schemas/$DeprecatedModel.ts 1`] = `
5346+
"/* istanbul ignore file */
5347+
/* tslint:disable */
5348+
/* eslint-disable */
5349+
export const $DeprecatedModel = {
5350+
description: \`This is a deprecated model with a deprecated property\`,
5351+
properties: {
5352+
prop: {
5353+
type: 'string',
5354+
description: \`This is a deprecated property\`,
5355+
},
5356+
},
5357+
} as const;
5358+
"
5359+
`;
5360+
53225361
exports[`v3 should generate: ./test/generated/v3/schemas/$DictionaryWithArray.ts 1`] = `
53235362
"/* istanbul ignore file */
53245363
/* tslint:disable */
@@ -6337,6 +6376,39 @@ export class DefaultsService {
63376376
"
63386377
`;
63396378

6379+
exports[`v3 should generate: ./test/generated/v3/services/DeprecatedService.ts 1`] = `
6380+
"/* istanbul ignore file */
6381+
/* tslint:disable */
6382+
/* eslint-disable */
6383+
import type { DeprecatedModel } from '../models/DeprecatedModel';
6384+
6385+
import type { CancelablePromise } from '../core/CancelablePromise';
6386+
import { OpenAPI } from '../core/OpenAPI';
6387+
import { request as __request } from '../core/request';
6388+
6389+
export class DeprecatedService {
6390+
6391+
/**
6392+
* @deprecated
6393+
* @param parameter This parameter is deprecated
6394+
* @throws ApiError
6395+
*/
6396+
public static deprecatedCall(
6397+
parameter: DeprecatedModel | null,
6398+
): CancelablePromise<void> {
6399+
return __request(OpenAPI, {
6400+
method: 'POST',
6401+
url: '/api/v{api-version}/parameters/deprecated',
6402+
headers: {
6403+
'parameter': parameter,
6404+
},
6405+
});
6406+
}
6407+
6408+
}
6409+
"
6410+
`;
6411+
63406412
exports[`v3 should generate: ./test/generated/v3/services/DescriptionsService.ts 1`] = `
63416413
"/* istanbul ignore file */
63426414
/* tslint:disable */

test/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ const generateRealWorldSpecs = async () => {
5959
const main = async () => {
6060
await generate('./test/spec/v2.json', './test/generated/v2/');
6161
await generate('./test/spec/v3.json', './test/generated/v3/');
62+
await generate('./test/spec/swagger.json', './test/generated/swagger/');
63+
await generate('./test/spec/swagger_klara_2.json', './test/generated/swagger_klara_2/');
6264
// await generateRealWorldSpecs();
6365
};
6466

test/spec/v3.json

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,28 @@
106106
]
107107
}
108108
},
109+
"/api/v{api-version}/parameters/deprecated": {
110+
"post": {
111+
"tags": [
112+
"Deprecated"
113+
],
114+
"deprecated": true,
115+
"operationId": "DeprecatedCall",
116+
"parameters": [
117+
{
118+
"deprecated": true,
119+
"description": "This parameter is deprecated",
120+
"name": "parameter",
121+
"in": "header",
122+
"required": true,
123+
"nullable": true,
124+
"schema": {
125+
"$ref": "#/components/schemas/DeprecatedModel"
126+
}
127+
}
128+
]
129+
}
130+
},
109131
"/api/v{api-version}/parameters/{parameterPath}": {
110132
"post": {
111133
"tags": [
@@ -1877,6 +1899,18 @@
18771899
}
18781900
}
18791901
},
1902+
"DeprecatedModel": {
1903+
"deprecated": true,
1904+
"description": "This is a deprecated model with a deprecated property",
1905+
"type": "object",
1906+
"properties": {
1907+
"prop": {
1908+
"deprecated": true,
1909+
"description": "This is a deprecated property",
1910+
"type": "string"
1911+
}
1912+
}
1913+
},
18801914
"ModelWithCircularReference": {
18811915
"description": "This is a model with one property containing a circular reference",
18821916
"type": "object",

0 commit comments

Comments
 (0)