diff --git a/packages/core/src/getters/enum.ts b/packages/core/src/getters/enum.ts index dc641794a..e5c6d5633 100644 --- a/packages/core/src/getters/enum.ts +++ b/packages/core/src/getters/enum.ts @@ -23,6 +23,9 @@ export const getEnum = (value: string, enumName: string, names?: string[]) => { }; export const getEnumImplementation = (value: string, names?: string[]) => { + // empty enum or null-only enum + if (value === '') return ''; + return [...new Set(value.split(' | '))].reduce((acc, val, index) => { const name = names?.[index]; if (name) { diff --git a/packages/core/src/getters/scalar.ts b/packages/core/src/getters/scalar.ts index f274c1595..07b9f26d9 100644 --- a/packages/core/src/getters/scalar.ts +++ b/packages/core/src/getters/scalar.ts @@ -37,7 +37,9 @@ export const getScalar = ({ let isEnum = false; if (enumItems) { - value = enumItems.map((enumItem: string) => `${enumItem}`).join(' | '); + value = enumItems + .map((enumItem: number | null) => `${enumItem}`) + .join(' | '); isEnum = true; } @@ -84,12 +86,12 @@ export const getScalar = ({ let isEnum = false; if (enumItems) { - value = `'${enumItems - .map((enumItem: string) => - isString(enumItem) ? escape(enumItem) : `${enumItem}`, + value = `${enumItems + .map((enumItem: string | null) => + isString(enumItem) ? `'${escape(enumItem)}'` : `${enumItem}`, ) .filter(Boolean) - .join(`' | '`)}'`; + .join(` | `)}`; isEnum = true; } @@ -131,12 +133,12 @@ export const getScalar = ({ case 'object': default: { if (enumItems) { - const value = `'${enumItems - .map((enumItem: string) => - isString(enumItem) ? escape(enumItem) : `${enumItem}`, + const value = `${enumItems + .map((enumItem: unknown) => + isString(enumItem) ? `'${escape(enumItem)}'` : `${enumItem}`, ) .filter(Boolean) - .join(`' | '`)}'`; + .join(` | `)}`; return { value: value + nullable, diff --git a/tests/configs/default.config.ts b/tests/configs/default.config.ts index 7bea6768f..757bdf0c2 100644 --- a/tests/configs/default.config.ts +++ b/tests/configs/default.config.ts @@ -64,13 +64,6 @@ export default defineConfig({ target: '../generated/default/null-type-v3-0/endpoints.ts', }, }, - 'nullable-enum': { - input: '../specifications/nullable-enum.yaml', - output: { - schemas: '../generated/default/nullable-enum/model', - target: '../generated/default/nullable-enum/endpoints.ts', - }, - }, readonly: { input: '../specifications/readonly.yaml', output: { diff --git a/tests/specifications/null-type-v3-0.yaml b/tests/specifications/null-type-v3-0.yaml index bce3e3087..0da68d530 100644 --- a/tests/specifications/null-type-v3-0.yaml +++ b/tests/specifications/null-type-v3-0.yaml @@ -51,7 +51,7 @@ paths: $ref: '#/components/schemas/NullableAnyObject' components: schemas: - ObjectWithNullableObjectKey: + ObjectWithNullableItems: type: object properties: nullableObject: @@ -66,3 +66,33 @@ components: NullableAnyObject: type: object nullable: true + + # Nullable Enums + NullableStringEnum: + type: string + nullable: true + enum: + - ONE + - TWO + - THREE + - null + NullableNumberEnum: + type: number + nullable: true + enum: + - 1 + - 2 + - 3 + - null + NullOnlyStringEnum: + type: string + nullable: true + enum: + - null + NullOnlyNumberEnum: + type: number + nullable: true + enum: + - null + EmptyEnum: + enum: [] diff --git a/tests/specifications/nullable-enum.yaml b/tests/specifications/nullable-enum.yaml deleted file mode 100644 index 085e1d84c..000000000 --- a/tests/specifications/nullable-enum.yaml +++ /dev/null @@ -1,66 +0,0 @@ -openapi: 3.0.0 -info: - title: Nullables - description: 'OpenAPI 3.0 Nullable types' - version: 1.0.0 -tags: - - name: nullables - description: Nullable types -servers: - - url: http://localhost -paths: - /post-object-with-nullable-enum: - post: - tags: - - nullables - summary: Nullable object with nullable properties request - operationId: createNullableObject - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ObjectWithNullableEnum' - responses: - 200: - description: Successful Operation - content: - application/json: - schema: - $ref: '#/components/schemas/ObjectWithNullableEnum' - /get-object-with-nullable-enum: - get: - tags: - - nullables - summary: Nullable object with nullable properties response - operationId: getNullableObject - parameters: - - name: nullableEnum - in: query - description: Nullable enum - required: false - schema: - type: string - nullable: true - enum: - - ONE - - TWO - - THREE - responses: - 200: - description: Successful Operation - content: - application/json: - schema: - $ref: '#/components/schemas/ObjectWithNullableEnum' -components: - schemas: - ObjectWithNullableEnum: - type: object - properties: - nullableEnum: - type: string - nullable: true - enum: - - ONE - - TWO - - THREE