diff --git a/packages/openapi-typescript/src/lib/ts.ts b/packages/openapi-typescript/src/lib/ts.ts index d1f41eb88..16cb1893d 100644 --- a/packages/openapi-typescript/src/lib/ts.ts +++ b/packages/openapi-typescript/src/lib/ts.ts @@ -353,7 +353,7 @@ export function tsArrayLiteralExpression( ) ) { const helper = stringToAST( - "type FlattenedDeepRequired = { [K in keyof T]-?: FlattenedDeepRequired[number] : T[K]>; };", + "type FlattenedDeepRequired = { [K in keyof T]-?: FlattenedDeepRequired extends unknown[] ? Extract, unknown[]>[number] : NonNullable>; };", )[0] as any; options.injectFooter.push(helper); } diff --git a/packages/openapi-typescript/test/node-api.test.ts b/packages/openapi-typescript/test/node-api.test.ts index b22f8ad18..4c5c95cdc 100644 --- a/packages/openapi-typescript/test/node-api.test.ts +++ b/packages/openapi-typescript/test/node-api.test.ts @@ -991,7 +991,7 @@ export interface components { } export type $defs = Record; type FlattenedDeepRequired = { - [K in keyof T]-?: FlattenedDeepRequired[number] : T[K]>; + [K in keyof T]-?: FlattenedDeepRequired extends unknown[] ? Extract, unknown[]>[number] : NonNullable>; }; type ReadonlyArray = [ Exclude @@ -1046,7 +1046,7 @@ export interface components { } export type $defs = Record; type FlattenedDeepRequired = { - [K in keyof T]-?: FlattenedDeepRequired[number] : T[K]>; + [K in keyof T]-?: FlattenedDeepRequired extends unknown[] ? Extract, unknown[]>[number] : NonNullable>; }; type ReadonlyArray = [ Exclude @@ -1225,7 +1225,7 @@ export interface operations { }; } type FlattenedDeepRequired = { - [K in keyof T]-?: FlattenedDeepRequired[number] : T[K]>; + [K in keyof T]-?: FlattenedDeepRequired extends unknown[] ? Extract, unknown[]>[number] : NonNullable>; }; type ReadonlyArray = [ Exclude @@ -1457,7 +1457,7 @@ export interface components { } export type $defs = Record; type FlattenedDeepRequired = { - [K in keyof T]-?: FlattenedDeepRequired[number] : T[K]>; + [K in keyof T]-?: FlattenedDeepRequired extends unknown[] ? Extract, unknown[]>[number] : NonNullable>; }; type ReadonlyArray = [ Exclude @@ -1552,7 +1552,7 @@ export interface components { } export type $defs = Record; type FlattenedDeepRequired = { - [K in keyof T]-?: FlattenedDeepRequired[number] : T[K]>; + [K in keyof T]-?: FlattenedDeepRequired extends unknown[] ? Extract, unknown[]>[number] : NonNullable>; }; type ReadonlyArray = [ Exclude @@ -1653,7 +1653,7 @@ export interface components { } export type $defs = Record; type FlattenedDeepRequired = { - [K in keyof T]-?: FlattenedDeepRequired[number] : T[K]>; + [K in keyof T]-?: FlattenedDeepRequired extends unknown[] ? Extract, unknown[]>[number] : NonNullable>; }; type ReadonlyArray = [ Exclude @@ -1769,7 +1769,7 @@ export interface components { } export type $defs = Record; type FlattenedDeepRequired = { - [K in keyof T]-?: FlattenedDeepRequired[number] : T[K]>; + [K in keyof T]-?: FlattenedDeepRequired extends unknown[] ? Extract, unknown[]>[number] : NonNullable>; }; type ReadonlyArray = [ Exclude @@ -1799,6 +1799,62 @@ export const resourceOuterOneOf0InnerOneOf1DeepCodeValues: ReadonlyArray["schemas"]["Resource"]["outer"], { kind: unknown; }>["kind"]> = ["typeB"]; +export type operations = Record;`, + options: { enumValues: true }, + }, + ], + [ + "options > enumValues with nullable intermediate object", + { + given: { + openapi: "3.1", + info: { title: "Test", version: "1.0" }, + components: { + schemas: { + Submission: { + type: "object", + properties: { + details: { + type: ["object", "null"], + properties: { + status: { + type: "string", + enum: ["draft", "submitted"], + }, + }, + }, + }, + }, + }, + }, + }, + want: `export type paths = Record; +export type webhooks = Record; +export interface components { + schemas: { + Submission: { + details?: { + /** @enum {string} */ + status?: "draft" | "submitted"; + } | null; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +type FlattenedDeepRequired = { + [K in keyof T]-?: FlattenedDeepRequired extends unknown[] ? Extract, unknown[]>[number] : NonNullable>; +}; +type ReadonlyArray = [ + Exclude +] extends [ + unknown[] +] ? Readonly> : Readonly[]>; +export const submissionDetailsStatusValues: ReadonlyArray["schemas"]["Submission"]["details"]["status"]> = ["draft", "submitted"]; export type operations = Record;`, options: { enumValues: true }, },