Skip to content

Commit

Permalink
feat: render pattern properties for JS class (#302)
Browse files Browse the repository at this point in the history
  • Loading branch information
jonaslagoni authored Jul 9, 2021
1 parent e874998 commit 5c18205
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 8 deletions.
9 changes: 9 additions & 0 deletions src/generators/javascript/JavaScriptRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,15 @@ ${content}
const additionalProperty = await this.runPropertyPreset(propertyName, this.model.additionalProperties, PropertyType.additionalProperty);
content.push(additionalProperty);
}

if (this.model.patternProperties !== undefined) {
for (const [pattern, patternModel] of Object.entries(this.model.patternProperties)) {
const propertyName = getUniquePropertyName(this.model, `${pattern}${DefaultPropertyNames.patternProperties}`);
const renderedPatternProperty = await this.runPropertyPreset(propertyName, patternModel, PropertyType.patternProperties);
content.push(renderedPatternProperty);
}
}

return this.renderBlock(content);
}

Expand Down
28 changes: 22 additions & 6 deletions src/generators/javascript/renderers/ClassRenderer.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { JavaScriptRenderer } from '../JavaScriptRenderer';

import { CommonModel, ClassPreset } from '../../../models';
import { FormatHelpers } from '../../../helpers';
import { CommonModel, ClassPreset, PropertyType } from '../../../models';
import { DefaultPropertyNames, FormatHelpers, getUniquePropertyName } from '../../../helpers';

/**
* Renderer for JavaScript's `class` type
Expand Down Expand Up @@ -37,15 +37,31 @@ ${this.indent(this.renderBlock(content, 2))}
content.push(this.renderBlock([getter, setter]));
}

if (this.model.additionalProperties !== undefined) {
const propertyName = getUniquePropertyName(this.model, DefaultPropertyNames.additionalProperties);
const getter = await this.runGetterPreset(propertyName, this.model.additionalProperties, PropertyType.additionalProperty);
const setter = await this.runSetterPreset(propertyName, this.model.additionalProperties, PropertyType.additionalProperty);
content.push(this.renderBlock([getter, setter]));
}

if (this.model.patternProperties !== undefined) {
for (const [pattern, patternModel] of Object.entries(this.model.patternProperties)) {
const propertyName = getUniquePropertyName(this.model, `${pattern}${DefaultPropertyNames.patternProperties}`);
const getter = await this.runGetterPreset(propertyName, patternModel, PropertyType.patternProperties);
const setter = await this.runSetterPreset(propertyName, patternModel, PropertyType.patternProperties);
content.push(this.renderBlock([getter, setter]));
}
}

return this.renderBlock(content, 2);
}

runGetterPreset(propertyName: string, property: CommonModel): Promise<string> {
return this.runPreset('getter', { propertyName, property });
runGetterPreset(propertyName: string, property: CommonModel, type: PropertyType = PropertyType.property): Promise<string> {
return this.runPreset('getter', { propertyName, property, type });
}

runSetterPreset(propertyName: string, property: CommonModel): Promise<string> {
return this.runPreset('setter', { propertyName, property });
runSetterPreset(propertyName: string, property: CommonModel, type: PropertyType = PropertyType.property): Promise<string> {
return this.runPreset('setter', { propertyName, property, type });
}
}

Expand Down
16 changes: 14 additions & 2 deletions test/generators/javascript/JavaScriptGenerator.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ describe('JavaScriptGenerator', () => {
members: { oneOf: [{ type: 'string' }, { type: 'number' }, { type: 'boolean' }], },
array_type: { type: 'array', items: [{ type: 'string' }, { type: 'number' }] },
},
patternProperties: {
'^S(.?*)test&': {
type: 'string'
}
},
required: ['street_name', 'city', 'state', 'house_number', 'array_type'],
};
const expected = `class Address {
Expand All @@ -30,6 +35,7 @@ describe('JavaScriptGenerator', () => {
members;
arrayType;
additionalProperties;
sTestPatternProperties;
constructor(input) {
this.streetName = input.streetName;
Expand Down Expand Up @@ -61,6 +67,12 @@ describe('JavaScriptGenerator', () => {
get arrayType() { return this.arrayType; }
set arrayType(arrayType) { this.arrayType = arrayType; }
get additionalProperties() { return this.additionalProperties; }
set additionalProperties(additionalProperties) { this.additionalProperties = additionalProperties; }
get sTestPatternProperties() { return this.sTestPatternProperties; }
set sTestPatternProperties(sTestPatternProperties) { this.sTestPatternProperties = sTestPatternProperties; }
}`;

const inputModel = await generator.process(doc);
Expand Down Expand Up @@ -96,11 +108,11 @@ describe('JavaScriptGenerator', () => {
type: 'object',
properties: {
property: { type: 'string' },
}
},
additionalProperties: false
};
const expected = `export class CustomClass {
#property;
#additionalProperties;
constructor(input) {
this.#property = input.property;
Expand Down

0 comments on commit 5c18205

Please sign in to comment.