Skip to content

Commit

Permalink
feat: render tuple additionalItems for TS (#263)
Browse files Browse the repository at this point in the history
  • Loading branch information
jonaslagoni authored Jun 22, 2021
1 parent 7e291b2 commit 02768ca
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 11 deletions.
5 changes: 3 additions & 2 deletions src/generators/typescript/TypeScriptRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,9 @@ export abstract class TypeScriptRenderer extends AbstractRenderer<TypeScriptOpti
const types = model.items.map((item) => {
return this.renderType(item);
});
return `[${types.join(', ')}]`;
}
const additionalTypes = model.additionalItems ? `, ...(${this.renderType(model.additionalItems)})[]` : '';
return `[${types.join(', ')}${additionalTypes}]`;
}
const arrayType = model.items ? this.renderType(model.items) : 'unknown';
return `Array<${arrayType}>`;
}
Expand Down
12 changes: 6 additions & 6 deletions src/models/CommonModel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ export class CommonModel extends CommonSchema<CommonModel> {
* @param originalSchema
* @param alreadyIteratedModels
*/
private static mergeProperties(mergeTo: CommonModel, mergeFrom: CommonModel, originalSchema: Schema, alreadyIteratedModels: Map<CommonModel, CommonModel> = new Map()) {
private static mergeProperties(mergeTo: CommonModel, mergeFrom: CommonModel, originalSchema: Schema | boolean, alreadyIteratedModels: Map<CommonModel, CommonModel> = new Map()) {
const mergeToProperties = mergeTo.properties;
const mergeFromProperties = mergeFrom.properties;
if (mergeFromProperties !== undefined) {
Expand All @@ -362,7 +362,7 @@ export class CommonModel extends CommonSchema<CommonModel> {
* @param originalSchema
* @param alreadyIteratedModels
*/
private static mergeAdditionalProperties(mergeTo: CommonModel, mergeFrom: CommonModel, originalSchema: Schema, alreadyIteratedModels: Map<CommonModel, CommonModel> = new Map()) {
private static mergeAdditionalProperties(mergeTo: CommonModel, mergeFrom: CommonModel, originalSchema: Schema | boolean, alreadyIteratedModels: Map<CommonModel, CommonModel> = new Map()) {
const mergeToAdditionalProperties = mergeTo.additionalProperties;
const mergeFromAdditionalProperties = mergeFrom.additionalProperties;
if (mergeFromAdditionalProperties !== undefined) {
Expand All @@ -382,7 +382,7 @@ export class CommonModel extends CommonSchema<CommonModel> {
* @param originalSchema
* @param alreadyIteratedModels
*/
private static mergeAdditionalItems(mergeTo: CommonModel, mergeFrom: CommonModel, originalSchema: Schema, alreadyIteratedModels: Map<CommonModel, CommonModel> = new Map()) {
private static mergeAdditionalItems(mergeTo: CommonModel, mergeFrom: CommonModel, originalSchema: Schema | boolean, alreadyIteratedModels: Map<CommonModel, CommonModel> = new Map()) {
const mergeToAdditionalItems = mergeTo.additionalItems;
const mergeFromAdditionalItems= mergeFrom.additionalItems;
if (mergeFromAdditionalItems !== undefined) {
Expand All @@ -402,7 +402,7 @@ export class CommonModel extends CommonSchema<CommonModel> {
* @param originalSchema
* @param alreadyIteratedModels
*/
private static mergePatternProperties(mergeTo: CommonModel, mergeFrom: CommonModel, originalSchema: Schema, alreadyIteratedModels: Map<CommonModel, CommonModel> = new Map()) {
private static mergePatternProperties(mergeTo: CommonModel, mergeFrom: CommonModel, originalSchema: Schema | boolean, alreadyIteratedModels: Map<CommonModel, CommonModel> = new Map()) {
const mergeToPatternProperties = mergeTo.patternProperties;
const mergeFromPatternProperties = mergeFrom.patternProperties;
if (mergeFromPatternProperties !== undefined) {
Expand Down Expand Up @@ -430,7 +430,7 @@ export class CommonModel extends CommonSchema<CommonModel> {
* @param alreadyIteratedModels
*/
// eslint-disable-next-line sonarjs/cognitive-complexity
private static mergeItems(mergeTo: CommonModel, mergeFrom: CommonModel, originalSchema: Schema, alreadyIteratedModels: Map<CommonModel, CommonModel> = new Map()) {
private static mergeItems(mergeTo: CommonModel, mergeFrom: CommonModel, originalSchema: Schema | boolean, alreadyIteratedModels: Map<CommonModel, CommonModel> = new Map()) {
if (mergeFrom.items === undefined) { return; }
if (Array.isArray(mergeFrom.items) && mergeFrom.items.length === 0) { return; }
if (mergeTo.items === undefined) {
Expand Down Expand Up @@ -496,7 +496,7 @@ export class CommonModel extends CommonSchema<CommonModel> {
* @param originalSchema
* @param alreadyIteratedModels
*/
static mergeCommonModels(mergeTo: CommonModel | undefined, mergeFrom: CommonModel, originalSchema: Schema, alreadyIteratedModels: Map<CommonModel, CommonModel> = new Map()): CommonModel {
static mergeCommonModels(mergeTo: CommonModel | undefined, mergeFrom: CommonModel, originalSchema: Schema | boolean, alreadyIteratedModels: Map<CommonModel, CommonModel> = new Map()): CommonModel {
if (mergeTo === undefined) {return mergeFrom;}
Logger.debug(`Merging model ${mergeFrom.$id || 'unknown'} into ${mergeTo.$id || 'unknown'}`, mergeTo, mergeFrom, originalSchema);
if (alreadyIteratedModels.has(mergeFrom)) {return alreadyIteratedModels.get(mergeFrom) as CommonModel;}
Expand Down
21 changes: 20 additions & 1 deletion test/blackbox/docs/dummy.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@
"dummyArrayWithArray": {
"$ref": "#/definitions/dummyArrayWithArray"
},
"dummyArrayWithArrayNoAdditionalItems": {
"$ref": "#/definitions/dummyArrayWithArrayNoAdditionalItems"
},
"dummyObject": {
"$ref": "#/definitions/dummyObject"
}
Expand Down Expand Up @@ -82,7 +85,23 @@
{
"type": "number"
}
]
],
"additionalItems": true
},
"dummyArrayWithArrayNoAdditionalItems": {
"type": "array",
"items": [
{
"$ref": "#/definitions/dummyInfo"
},
{
"type": "string"
},
{
"type": "number"
}
],
"additionalItems": false
},
"dummyObject": {
"type": "object",
Expand Down
13 changes: 11 additions & 2 deletions test/generators/typescript/TypeScriptGenerator.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ describe('TypeScriptGenerator', () => {
house_number: { type: 'number' },
marriage: { type: 'boolean', description: 'Status if marriage live in given house' },
members: { oneOf: [{ type: 'string' }, { type: 'number' }, { type: 'boolean' }], },
tuple_type: { type: 'array', items: [{ type: 'string' }, { type: 'number' }] },
tuple_type: { type: 'array', items: [{ type: 'string' }, { type: 'number' }], additionalItems: false },
tuple_type_with_additional_items: { type: 'array', items: [{ type: 'string' }, { type: 'number' }], additionalItems: true },
array_type: { type: 'array', items: { type: 'string' } },
},
required: ['street_name', 'city', 'state', 'house_number', 'array_type'],
Expand All @@ -29,6 +30,7 @@ describe('TypeScriptGenerator', () => {
private _marriage?: boolean;
private _members?: string | number | boolean;
private _tupleType?: [string, number];
private _tupleTypeWithAdditionalItems?: [string, number, ...(object | string | number | Array<unknown> | boolean | null | number)[]];
private _arrayType: Array<string>;
private _additionalProperties?: Map<String, object | string | number | Array<unknown> | boolean | null | number>;
Expand All @@ -40,6 +42,7 @@ describe('TypeScriptGenerator', () => {
marriage?: boolean,
members?: string | number | boolean,
tupleType?: [string, number],
tupleTypeWithAdditionalItems?: [string, number, ...(object | string | number | Array<unknown> | boolean | null | number)[]],
arrayType: Array<string>,
}) {
this._streetName = input.streetName;
Expand All @@ -49,6 +52,7 @@ describe('TypeScriptGenerator', () => {
this._marriage = input.marriage;
this._members = input.members;
this._tupleType = input.tupleType;
this._tupleTypeWithAdditionalItems = input.tupleTypeWithAdditionalItems;
this._arrayType = input.arrayType;
}
Expand All @@ -73,6 +77,9 @@ describe('TypeScriptGenerator', () => {
get tupleType(): [string, number] | undefined { return this._tupleType; }
set tupleType(tupleType: [string, number] | undefined) { this._tupleType = tupleType; }
get tupleTypeWithAdditionalItems(): [string, number, ...(object | string | number | Array<unknown> | boolean | null | number)[]] | undefined { return this._tupleTypeWithAdditionalItems; }
set tupleTypeWithAdditionalItems(tupleTypeWithAdditionalItems: [string, number, ...(object | string | number | Array<unknown> | boolean | null | number)[]] | undefined) { this._tupleTypeWithAdditionalItems = tupleTypeWithAdditionalItems; }
get arrayType(): Array<string> { return this._arrayType; }
set arrayType(arrayType: Array<string>) { this._arrayType = arrayType; }
Expand Down Expand Up @@ -149,7 +156,8 @@ ${content}`;
house_number: { type: 'number' },
marriage: { type: 'boolean', description: 'Status if marriage live in given house' },
members: { oneOf: [{ type: 'string' }, { type: 'number' }, { type: 'boolean' }], },
tuple_type: { type: 'array', items: [{ type: 'string' }, { type: 'number' }] },
tuple_type: { type: 'array', items: [{ type: 'string' }, { type: 'number' }], additionalItems: false },
tuple_type_with_additional_items: { type: 'array', items: [{ type: 'string' }, { type: 'number' }], additionalItems: true },
array_type: { type: 'array', items: { type: 'string' } },
},
required: ['street_name', 'city', 'state', 'house_number', 'array_type'],
Expand All @@ -162,6 +170,7 @@ ${content}`;
marriage?: boolean;
members?: string | number | boolean;
tupleType?: [string, number];
tupleTypeWithAdditionalItems?: [string, number, ...(object | string | number | Array<unknown> | boolean | null | number)[]];
arrayType: Array<string>;
additionalProperties?: Map<String, object | string | number | Array<unknown> | boolean | null | number>;
}`;
Expand Down
6 changes: 6 additions & 0 deletions test/generators/typescript/TypeScriptRenderer.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ describe('TypeScriptRenderer', () => {
model.items = [CommonModel.toCommonModel({type: 'number'})];
expect(renderer.toTsType('array', model)).toEqual('[number]');
});
test('Should render tuple type with additionalItems', () => {
const model = new CommonModel();
model.items = [CommonModel.toCommonModel({type: 'number'})];
model.additionalItems = CommonModel.toCommonModel({type: 'string'});
expect(renderer.toTsType('array', model)).toEqual('[number, ...(string)[]]');
});
test('Should render multiple tuples', () => {
const model = new CommonModel();
model.items = [CommonModel.toCommonModel({type: 'number'}), CommonModel.toCommonModel({type: 'string'})];
Expand Down

0 comments on commit 02768ca

Please sign in to comment.