From b942878b0ad3115b35220b238fb2f75cbfa571a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Fri, 20 Dec 2024 09:48:58 +0100 Subject: [PATCH] Fixed TypeResolver issue for negative number literal types Also added negativeNumberLiteralType to the tests Fixes #1733 --- packages/cli/src/metadataGeneration/typeResolver.ts | 4 ++++ tests/fixtures/testModel.ts | 1 + .../swagger/definitionsGeneration/definitions.spec.ts | 9 +++++++++ tests/unit/swagger/schemaDetails3.spec.ts | 9 +++++++++ 4 files changed, 23 insertions(+) diff --git a/packages/cli/src/metadataGeneration/typeResolver.ts b/packages/cli/src/metadataGeneration/typeResolver.ts index 57c2ad5f..315854b3 100644 --- a/packages/cli/src/metadataGeneration/typeResolver.ts +++ b/packages/cli/src/metadataGeneration/typeResolver.ts @@ -508,6 +508,10 @@ export class TypeResolver { return typeNode.literal.text; case ts.SyntaxKind.NumericLiteral: return parseFloat(typeNode.literal.text); + case ts.SyntaxKind.PrefixUnaryExpression: + // make sure to only handle the MinusToken here + throwUnless((typeNode.literal as ts.PrefixUnaryExpression).operator === ts.SyntaxKind.MinusToken, new GenerateMetadataError(`Couldn't resolve literal node: ${typeNode.literal.getText()}`)); + return parseFloat(typeNode.literal.getText()); case ts.SyntaxKind.NullKeyword: return null; default: diff --git a/tests/fixtures/testModel.ts b/tests/fixtures/testModel.ts index 5da3abc1..4cf58b56 100644 --- a/tests/fixtures/testModel.ts +++ b/tests/fixtures/testModel.ts @@ -72,6 +72,7 @@ export interface TestModel extends Model { nullableUnionPrimitiveType?: 'String' | 1 | 20.0 | true | false | null; undefineableUnionPrimitiveType: 'String' | 1 | 20.0 | true | false | undefined; singleFloatLiteralType?: 3.1415; + negativeNumberLiteralType?: -1; dateValue?: Date; optionalString?: string; anyType?: any; diff --git a/tests/unit/swagger/definitionsGeneration/definitions.spec.ts b/tests/unit/swagger/definitionsGeneration/definitions.spec.ts index 32c415ef..0137136d 100644 --- a/tests/unit/swagger/definitionsGeneration/definitions.spec.ts +++ b/tests/unit/swagger/definitionsGeneration/definitions.spec.ts @@ -500,6 +500,15 @@ describe('Definition generation', () => { expect(propertySchema.enum).to.have.length(1, `for property ${propertyName}.enum`); expect(propertySchema.enum).to.include(3.1415, `for property ${propertyName}.enum`); }, + negativeNumberLiteralType: (propertyName, propertySchema) => { + expect(propertySchema.type).to.eq('number', `for property ${propertyName}.type`); + expect(propertySchema['x-nullable']).to.eq(false, `for property ${propertyName}[x-nullable]`); + if (!propertySchema.enum) { + throw new Error(`There was no 'enum' property on ${propertyName}.`); + } + expect(propertySchema.enum).to.have.length(1, `for property ${propertyName}.enum`); + expect(propertySchema.enum).to.include(-1, `for property ${propertyName}.enum`); + }, dateValue: (propertyName, propertySchema) => { expect(propertySchema.type).to.eq('string', `for property ${propertyName}.type`); expect(propertySchema['x-nullable']).to.eq(undefined, `for property ${propertyName}[x-nullable]`); diff --git a/tests/unit/swagger/schemaDetails3.spec.ts b/tests/unit/swagger/schemaDetails3.spec.ts index e480e1c7..ceb1a34b 100644 --- a/tests/unit/swagger/schemaDetails3.spec.ts +++ b/tests/unit/swagger/schemaDetails3.spec.ts @@ -1526,6 +1526,15 @@ describe('Definition generation for OpenAPI 3.0.0', () => { expect(propertySchema.enum).to.have.length(1, `for property ${propertyName}.enum`); expect(propertySchema.enum).to.include(3.1415, `for property ${propertyName}.enum`); }, + negativeNumberLiteralType: (propertyName, propertySchema) => { + expect(propertySchema.type).to.eq('number', `for property ${propertyName}.type`); + expect(propertySchema.nullable).to.eq(false, `for property ${propertyName}.nullable`); + if (!propertySchema.enum) { + throw new Error(`There was no 'enum' property on ${propertyName}.`); + } + expect(propertySchema.enum).to.have.length(1, `for property ${propertyName}.enum`); + expect(propertySchema.enum).to.include(-1, `for property ${propertyName}.enum`); + }, dateValue: (propertyName, propertySchema) => { expect(propertySchema.type).to.eq('string', `for property ${propertyName}.type`); expect(propertySchema.nullable).to.eq(undefined, `for property ${propertyName}.nullable`);