Skip to content

Commit c297889

Browse files
committed
feat: combine 'additionalProperties: true' with explicit properties
1 parent 287820a commit c297889

File tree

3 files changed

+71
-4
lines changed

3 files changed

+71
-4
lines changed

src/openApi/v3/parser/getModel.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,7 @@ export const getModel = (
9595
}
9696
}
9797

98-
if (
99-
definition.type === 'object' &&
100-
(typeof definition.additionalProperties === 'object' || definition.additionalProperties === true)
101-
) {
98+
if (definition.type === 'object' && typeof definition.additionalProperties === 'object') {
10299
const ap = typeof definition.additionalProperties === 'object' ? definition.additionalProperties : {};
103100
if (ap.$ref) {
104101
const additionalProperties = getType(ap.$ref);
@@ -165,6 +162,23 @@ export const getModel = (
165162
model.enums.push(modelProperty);
166163
}
167164
});
165+
166+
if (definition.additionalProperties === true) {
167+
const additionalPropertiesModel = JSON.parse(JSON.stringify(model)); //deepcopy
168+
const additionalProperties = getModel(openApi, {});
169+
additionalPropertiesModel.name = '[key: string]';
170+
additionalPropertiesModel.export = 'generic';
171+
additionalPropertiesModel.type = 'any';
172+
additionalPropertiesModel.base = 'any';
173+
additionalPropertiesModel.isRequired = true;
174+
additionalPropertiesModel.template = additionalProperties.template;
175+
additionalPropertiesModel.link = additionalProperties;
176+
additionalPropertiesModel.imports.push(...additionalProperties.imports);
177+
additionalPropertiesModel.default = getModelDefault(definition, model);
178+
additionalPropertiesModel.description = null;
179+
model.properties.push(additionalPropertiesModel);
180+
}
181+
168182
return model;
169183
} else {
170184
const additionalProperties = getModel(openApi, {});

test/__snapshots__/index.spec.ts.snap

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3707,6 +3707,7 @@ export type { ModelCircle } from './models/ModelCircle';
37073707
export type { ModelSquare } from './models/ModelSquare';
37083708
export type { ModelThatExtends } from './models/ModelThatExtends';
37093709
export type { ModelThatExtendsExtends } from './models/ModelThatExtendsExtends';
3710+
export type { ModelWithAdditionalPropertiesEqTrue } from './models/ModelWithAdditionalPropertiesEqTrue';
37103711
export type { ModelWithArray } from './models/ModelWithArray';
37113712
export type { ModelWithBoolean } from './models/ModelWithBoolean';
37123713
export type { ModelWithCircularReference } from './models/ModelWithCircularReference';
@@ -3777,6 +3778,7 @@ export { $ModelCircle } from './schemas/$ModelCircle';
37773778
export { $ModelSquare } from './schemas/$ModelSquare';
37783779
export { $ModelThatExtends } from './schemas/$ModelThatExtends';
37793780
export { $ModelThatExtendsExtends } from './schemas/$ModelThatExtendsExtends';
3781+
export { $ModelWithAdditionalPropertiesEqTrue } from './schemas/$ModelWithAdditionalPropertiesEqTrue';
37803782
export { $ModelWithArray } from './schemas/$ModelWithArray';
37813783
export { $ModelWithBoolean } from './schemas/$ModelWithBoolean';
37823784
export { $ModelWithCircularReference } from './schemas/$ModelWithCircularReference';
@@ -4504,6 +4506,25 @@ export type ModelThatExtendsExtends = (ModelWithString & ModelThatExtends & {
45044506
"
45054507
`;
45064508

4509+
exports[`v3 should generate: test/generated/v3/models/ModelWithAdditionalPropertiesEqTrue.ts 1`] = `
4510+
"/* generated using openapi-typescript-codegen -- do no edit */
4511+
/* istanbul ignore file */
4512+
/* tslint:disable */
4513+
/* eslint-disable */
4514+
/**
4515+
* This is a model with one property and additionalProperties: true
4516+
*/
4517+
export type ModelWithAdditionalPropertiesEqTrue = {
4518+
/**
4519+
* This is a simple string property
4520+
*/
4521+
prop?: string;
4522+
[key: string]: any;
4523+
};
4524+
4525+
"
4526+
`;
4527+
45074528
exports[`v3 should generate: test/generated/v3/models/ModelWithArray.ts 1`] = `
45084529
"/* generated using openapi-typescript-codegen -- do no edit */
45094530
/* istanbul ignore file */
@@ -5802,6 +5823,27 @@ export const $ModelThatExtendsExtends = {
58025823
"
58035824
`;
58045825

5826+
exports[`v3 should generate: test/generated/v3/schemas/$ModelWithAdditionalPropertiesEqTrue.ts 1`] = `
5827+
"/* generated using openapi-typescript-codegen -- do no edit */
5828+
/* istanbul ignore file */
5829+
/* tslint:disable */
5830+
/* eslint-disable */
5831+
export const $ModelWithAdditionalPropertiesEqTrue = {
5832+
description: \`This is a model with one property and additionalProperties: true\`,
5833+
properties: {
5834+
prop: {
5835+
type: 'string',
5836+
description: \`This is a simple string property\`,
5837+
},
5838+
[key: string]: {
5839+
type: 'any',
5840+
isRequired: true,
5841+
},
5842+
},
5843+
} as const;
5844+
"
5845+
`;
5846+
58055847
exports[`v3 should generate: test/generated/v3/schemas/$ModelWithArray.ts 1`] = `
58065848
"/* generated using openapi-typescript-codegen -- do no edit */
58075849
/* istanbul ignore file */

test/spec/v3.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2549,6 +2549,17 @@
25492549
"type": "object",
25502550
"additionalProperties": true
25512551
},
2552+
"ModelWithAdditionalPropertiesEqTrue": {
2553+
"description": "This is a model with one property and additionalProperties: true",
2554+
"type": "object",
2555+
"properties": {
2556+
"prop": {
2557+
"description": "This is a simple string property",
2558+
"type": "string"
2559+
}
2560+
},
2561+
"additionalProperties": true
2562+
},
25522563
"FreeFormObjectWithAdditionalPropertiesEqEmptyObject": {
25532564
"description": "This is a free-form object with additionalProperties: {}.",
25542565
"type": "object",

0 commit comments

Comments
 (0)