diff --git a/package-lock.json b/package-lock.json index 0b753154ac..1b5436ec7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@asyncapi/modelina", - "version": "3.10.0", + "version": "3.10.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@asyncapi/modelina", - "version": "3.10.0", + "version": "3.10.1", "license": "Apache-2.0", "dependencies": { "@apidevtools/json-schema-ref-parser": "^11.1.0", diff --git a/package.json b/package.json index dbcf6b0736..7abde35010 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@asyncapi/modelina", - "version": "3.10.0", + "version": "3.10.1", "description": "Library for generating data models based on inputs such as AsyncAPI, OpenAPI, or JSON Schema documents", "license": "Apache-2.0", "homepage": "https://www.modelina.org", diff --git a/src/generators/typescript/presets/utils/UnmarshalFunction.ts b/src/generators/typescript/presets/utils/UnmarshalFunction.ts index f4175febab..c8aea0e57e 100644 --- a/src/generators/typescript/presets/utils/UnmarshalFunction.ts +++ b/src/generators/typescript/presets/utils/UnmarshalFunction.ts @@ -27,6 +27,8 @@ function renderUnmarshalProperty( if ( model instanceof ConstrainedArrayModel && + model.valueModel instanceof ConstrainedReferenceModel && + !(model.valueModel.ref instanceof ConstrainedEnumModel) && !(model.valueModel instanceof ConstrainedUnionModel) ) { return `${modelInstanceVariable} == null diff --git a/test/generators/typescript/preset/MarshallingPreset.spec.ts b/test/generators/typescript/preset/MarshallingPreset.spec.ts index 68a121045a..b247d3d20b 100644 --- a/test/generators/typescript/preset/MarshallingPreset.spec.ts +++ b/test/generators/typescript/preset/MarshallingPreset.spec.ts @@ -57,6 +57,13 @@ const doc = { $ref: '#/definitions/NestedTest' } }, + primitiveArrayTest: { + type: 'array', + additionalItems: false, + items: { + type: 'string' + } + }, tupleTest: { type: 'array', additionalItems: false, diff --git a/test/generators/typescript/preset/__snapshots__/MarshallingPreset.spec.ts.snap b/test/generators/typescript/preset/__snapshots__/MarshallingPreset.spec.ts.snap index 66ca9c668c..eb725d2811 100644 --- a/test/generators/typescript/preset/__snapshots__/MarshallingPreset.spec.ts.snap +++ b/test/generators/typescript/preset/__snapshots__/MarshallingPreset.spec.ts.snap @@ -9,6 +9,7 @@ exports[`Marshalling preset should render un/marshal code 1`] = ` private _unionTest?: NestedTest | string; private _unionArrayTest?: (NestedTest | string)[]; private _arrayTest?: NestedTest[]; + private _primitiveArrayTest?: string[]; private _tupleTest?: [NestedTest, string]; private _constTest?: 'TEST' = 'TEST'; private _additionalProperties?: Map; @@ -21,6 +22,7 @@ exports[`Marshalling preset should render un/marshal code 1`] = ` unionTest?: NestedTest | string, unionArrayTest?: (NestedTest | string)[], arrayTest?: NestedTest[], + primitiveArrayTest?: string[], tupleTest?: [NestedTest, string], additionalProperties?: Map, }) { @@ -31,6 +33,7 @@ exports[`Marshalling preset should render un/marshal code 1`] = ` this._unionTest = input.unionTest; this._unionArrayTest = input.unionArrayTest; this._arrayTest = input.arrayTest; + this._primitiveArrayTest = input.primitiveArrayTest; this._tupleTest = input.tupleTest; this._additionalProperties = input.additionalProperties; } @@ -56,6 +59,9 @@ exports[`Marshalling preset should render un/marshal code 1`] = ` get arrayTest(): NestedTest[] | undefined { return this._arrayTest; } set arrayTest(arrayTest: NestedTest[] | undefined) { this._arrayTest = arrayTest; } + get primitiveArrayTest(): string[] | undefined { return this._primitiveArrayTest; } + set primitiveArrayTest(primitiveArrayTest: string[] | undefined) { this._primitiveArrayTest = primitiveArrayTest; } + get tupleTest(): [NestedTest, string] | undefined { return this._tupleTest; } set tupleTest(tupleTest: [NestedTest, string] | undefined) { this._tupleTest = tupleTest; } @@ -103,6 +109,13 @@ exports[`Marshalling preset should render un/marshal code 1`] = ` } json += \`\\"arrayTest\\": [\${arrayTestJsonValues.join(',')}],\`; } + if(this.primitiveArrayTest !== undefined) { + let primitiveArrayTestJsonValues: any[] = []; + for (const unionItem of this.primitiveArrayTest) { + primitiveArrayTestJsonValues.push(\`\${typeof unionItem === 'number' || typeof unionItem === 'boolean' ? unionItem : JSON.stringify(unionItem)}\`); + } + json += \`\\"primitiveArrayTest\\": [\${primitiveArrayTestJsonValues.join(',')}],\`; + } if(this.tupleTest !== undefined) { const serializedTuple = []; if(this.tupleTest[0]) { @@ -123,7 +136,7 @@ exports[`Marshalling preset should render un/marshal code 1`] = ` if(this.additionalProperties !== undefined) { for (const [key, value] of this.additionalProperties.entries()) { //Only unwrap those that are not already a property in the JSON object - if([\\"string prop\\",\\"enumProp\\",\\"numberProp\\",\\"nestedObject\\",\\"unionTest\\",\\"unionArrayTest\\",\\"arrayTest\\",\\"tupleTest\\",\\"constTest\\",\\"additionalProperties\\"].includes(String(key))) continue; + if([\\"string prop\\",\\"enumProp\\",\\"numberProp\\",\\"nestedObject\\",\\"unionTest\\",\\"unionArrayTest\\",\\"arrayTest\\",\\"primitiveArrayTest\\",\\"tupleTest\\",\\"constTest\\",\\"additionalProperties\\"].includes(String(key))) continue; if(value instanceof NestedTest) { json += \`\\"\${key}\\": \${value.marshal()},\`; } else { @@ -162,13 +175,16 @@ exports[`Marshalling preset should render un/marshal code 1`] = ` ? null : obj[\\"arrayTest\\"].map((item: any) => NestedTest.unmarshal(item)); } + if (obj[\\"primitiveArrayTest\\"] !== undefined) { + instance.primitiveArrayTest = obj[\\"primitiveArrayTest\\"]; + } if (obj[\\"tupleTest\\"] !== undefined) { instance.tupleTest = obj[\\"tupleTest\\"]; } instance.additionalProperties = new Map(); - const propsToCheck = Object.entries(obj).filter((([key,]) => {return ![\\"string prop\\",\\"enumProp\\",\\"numberProp\\",\\"nestedObject\\",\\"unionTest\\",\\"unionArrayTest\\",\\"arrayTest\\",\\"tupleTest\\",\\"constTest\\",\\"additionalProperties\\"].includes(key);})); + const propsToCheck = Object.entries(obj).filter((([key,]) => {return ![\\"string prop\\",\\"enumProp\\",\\"numberProp\\",\\"nestedObject\\",\\"unionTest\\",\\"unionArrayTest\\",\\"arrayTest\\",\\"primitiveArrayTest\\",\\"tupleTest\\",\\"constTest\\",\\"additionalProperties\\"].includes(key);})); for (const [key, value] of propsToCheck) { instance.additionalProperties.set(key, value as any); }