Skip to content

Commit 5c18205

Browse files
authored
feat: render pattern properties for JS class (#302)
1 parent e874998 commit 5c18205

File tree

3 files changed

+45
-8
lines changed

3 files changed

+45
-8
lines changed

src/generators/javascript/JavaScriptRenderer.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,15 @@ ${content}
6868
const additionalProperty = await this.runPropertyPreset(propertyName, this.model.additionalProperties, PropertyType.additionalProperty);
6969
content.push(additionalProperty);
7070
}
71+
72+
if (this.model.patternProperties !== undefined) {
73+
for (const [pattern, patternModel] of Object.entries(this.model.patternProperties)) {
74+
const propertyName = getUniquePropertyName(this.model, `${pattern}${DefaultPropertyNames.patternProperties}`);
75+
const renderedPatternProperty = await this.runPropertyPreset(propertyName, patternModel, PropertyType.patternProperties);
76+
content.push(renderedPatternProperty);
77+
}
78+
}
79+
7180
return this.renderBlock(content);
7281
}
7382

src/generators/javascript/renderers/ClassRenderer.ts

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { JavaScriptRenderer } from '../JavaScriptRenderer';
22

3-
import { CommonModel, ClassPreset } from '../../../models';
4-
import { FormatHelpers } from '../../../helpers';
3+
import { CommonModel, ClassPreset, PropertyType } from '../../../models';
4+
import { DefaultPropertyNames, FormatHelpers, getUniquePropertyName } from '../../../helpers';
55

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

40+
if (this.model.additionalProperties !== undefined) {
41+
const propertyName = getUniquePropertyName(this.model, DefaultPropertyNames.additionalProperties);
42+
const getter = await this.runGetterPreset(propertyName, this.model.additionalProperties, PropertyType.additionalProperty);
43+
const setter = await this.runSetterPreset(propertyName, this.model.additionalProperties, PropertyType.additionalProperty);
44+
content.push(this.renderBlock([getter, setter]));
45+
}
46+
47+
if (this.model.patternProperties !== undefined) {
48+
for (const [pattern, patternModel] of Object.entries(this.model.patternProperties)) {
49+
const propertyName = getUniquePropertyName(this.model, `${pattern}${DefaultPropertyNames.patternProperties}`);
50+
const getter = await this.runGetterPreset(propertyName, patternModel, PropertyType.patternProperties);
51+
const setter = await this.runSetterPreset(propertyName, patternModel, PropertyType.patternProperties);
52+
content.push(this.renderBlock([getter, setter]));
53+
}
54+
}
55+
4056
return this.renderBlock(content, 2);
4157
}
4258

43-
runGetterPreset(propertyName: string, property: CommonModel): Promise<string> {
44-
return this.runPreset('getter', { propertyName, property });
59+
runGetterPreset(propertyName: string, property: CommonModel, type: PropertyType = PropertyType.property): Promise<string> {
60+
return this.runPreset('getter', { propertyName, property, type });
4561
}
4662

47-
runSetterPreset(propertyName: string, property: CommonModel): Promise<string> {
48-
return this.runPreset('setter', { propertyName, property });
63+
runSetterPreset(propertyName: string, property: CommonModel, type: PropertyType = PropertyType.property): Promise<string> {
64+
return this.runPreset('setter', { propertyName, property, type });
4965
}
5066
}
5167

test/generators/javascript/JavaScriptGenerator.spec.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ describe('JavaScriptGenerator', () => {
1919
members: { oneOf: [{ type: 'string' }, { type: 'number' }, { type: 'boolean' }], },
2020
array_type: { type: 'array', items: [{ type: 'string' }, { type: 'number' }] },
2121
},
22+
patternProperties: {
23+
'^S(.?*)test&': {
24+
type: 'string'
25+
}
26+
},
2227
required: ['street_name', 'city', 'state', 'house_number', 'array_type'],
2328
};
2429
const expected = `class Address {
@@ -30,6 +35,7 @@ describe('JavaScriptGenerator', () => {
3035
members;
3136
arrayType;
3237
additionalProperties;
38+
sTestPatternProperties;
3339
3440
constructor(input) {
3541
this.streetName = input.streetName;
@@ -61,6 +67,12 @@ describe('JavaScriptGenerator', () => {
6167
6268
get arrayType() { return this.arrayType; }
6369
set arrayType(arrayType) { this.arrayType = arrayType; }
70+
71+
get additionalProperties() { return this.additionalProperties; }
72+
set additionalProperties(additionalProperties) { this.additionalProperties = additionalProperties; }
73+
74+
get sTestPatternProperties() { return this.sTestPatternProperties; }
75+
set sTestPatternProperties(sTestPatternProperties) { this.sTestPatternProperties = sTestPatternProperties; }
6476
}`;
6577

6678
const inputModel = await generator.process(doc);
@@ -96,11 +108,11 @@ describe('JavaScriptGenerator', () => {
96108
type: 'object',
97109
properties: {
98110
property: { type: 'string' },
99-
}
111+
},
112+
additionalProperties: false
100113
};
101114
const expected = `export class CustomClass {
102115
#property;
103-
#additionalProperties;
104116
105117
constructor(input) {
106118
this.#property = input.property;

0 commit comments

Comments
 (0)