From 31054dceb33eac46bfe6ecd84f7bac5827a020cc Mon Sep 17 00:00:00 2001 From: Sultan Iman Date: Mon, 17 Mar 2025 21:13:48 +0100 Subject: [PATCH 1/2] Do not trim Schema prefix when --enum is used with --root-types-no-schema-prefix --- .gitignore | 3 +- packages/openapi-typescript/bin/cli.js | 3 + .../src/transform/components-object.ts | 4 +- .../test/transform/components-object.test.ts | 68 +++++++++++++++++++ 4 files changed, 76 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 41c3f87cc..a36d30c67 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,9 @@ dist node_modules coverage +mise.toml packages/openapi-typescript/test/fixtures/cli-outputs/out # IntelliJ IDEA settings folder -/.idea +/.idea \ No newline at end of file diff --git a/packages/openapi-typescript/bin/cli.js b/packages/openapi-typescript/bin/cli.js index d40bd6606..8c86973dc 100755 --- a/packages/openapi-typescript/bin/cli.js +++ b/packages/openapi-typescript/bin/cli.js @@ -61,6 +61,9 @@ if (args.includes("--redoc")) { } if (args.includes("--root-types-no-schema-prefix") && !args.includes("--root-types")) { console.warn("--root-types-no-schema-prefix has no effect without --root-types flag"); + if (args.includes("--enum")) { + console.warn("--root-types-no-schema-prefix has no effect when --enum used"); + } } const flags = parser(args, { diff --git a/packages/openapi-typescript/src/transform/components-object.ts b/packages/openapi-typescript/src/transform/components-object.ts index e5c100d26..52de11b3f 100644 --- a/packages/openapi-typescript/src/transform/components-object.ts +++ b/packages/openapi-typescript/src/transform/components-object.ts @@ -78,8 +78,10 @@ export default function transformComponentsObject(componentsObject: ComponentsOb conflictCounter++; aliasName = `${componentKey}${changeCase.pascalCase(name)}_${conflictCounter}`; } + const ref = ts.factory.createTypeReferenceNode(`components['${key}']['${name}']`); - if (ctx.rootTypesNoSchemaPrefix && key === "schemas") { + // We skip schema prefix replacement when --enum flag is present + if (ctx.rootTypesNoSchemaPrefix && key === "schemas" && !ctx.enum) { aliasName = aliasName.replace(componentKey, ""); } const typeAlias = ts.factory.createTypeAliasDeclaration( diff --git a/packages/openapi-typescript/test/transform/components-object.test.ts b/packages/openapi-typescript/test/transform/components-object.test.ts index 43116c8a7..8274f07e6 100644 --- a/packages/openapi-typescript/test/transform/components-object.test.ts +++ b/packages/openapi-typescript/test/transform/components-object.test.ts @@ -760,6 +760,74 @@ export type Error = components['schemas']['Error']; options: { ...DEFAULT_OPTIONS, rootTypes: true, rootTypesNoSchemaPrefix: true }, }, ], + [ + "options > rootTypes: true and rootTypesNoSchemaPrefix: true and enum: true", + { + given: { + schemas: { + Item: { + type: "object", + required: ["name", "url"], + properties: { + name: { type: "string" }, + url: { type: "string" }, + }, + }, + Document: { + type: "object", + required: ["name", "size", "url"], + properties: { + name: { type: "string" }, + size: { type: "number" }, + url: { type: "string" }, + }, + }, + Error: { + type: "object", + required: ["code", "message"], + properties: { + code: { type: "string" }, + message: { type: "string" }, + }, + }, + MyEnum: { + type: "string", + enum: ["first", "second", "last"], + }, + }, + }, + want: `{ + schemas: { + Item: { + name: string; + url: string; + }; + Document: { + name: string; + size: number; + url: string; + }; + Error: { + code: string; + message: string; + }; + /** @enum {string} */ + MyEnum: MyEnum; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type SchemaItem = components['schemas']['Item']; +export type SchemaDocument = components['schemas']['Document']; +export type SchemaError = components['schemas']['Error']; +export type SchemaMyEnum = components['schemas']['MyEnum']; +`, + options: { ...DEFAULT_OPTIONS, rootTypes: true, rootTypesNoSchemaPrefix: true, enum: true }, + }, + ], [ "transform > with transform object", { From 33923616135e5c7f533824a568c5f9cfa7d99909 Mon Sep 17 00:00:00 2001 From: Sultan Iman Date: Wed, 19 Mar 2025 21:37:25 +0100 Subject: [PATCH 2/2] Skip root types generation for enum and still trim Schema prefix if needed --- .gitignore | 3 +-- packages/openapi-typescript/bin/cli.js | 3 --- .../src/transform/components-object.ts | 9 ++++++--- .../test/transform/components-object.test.ts | 6 +++--- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index a36d30c67..41c3f87cc 100644 --- a/.gitignore +++ b/.gitignore @@ -3,9 +3,8 @@ dist node_modules coverage -mise.toml packages/openapi-typescript/test/fixtures/cli-outputs/out # IntelliJ IDEA settings folder -/.idea \ No newline at end of file +/.idea diff --git a/packages/openapi-typescript/bin/cli.js b/packages/openapi-typescript/bin/cli.js index 8c86973dc..d40bd6606 100755 --- a/packages/openapi-typescript/bin/cli.js +++ b/packages/openapi-typescript/bin/cli.js @@ -61,9 +61,6 @@ if (args.includes("--redoc")) { } if (args.includes("--root-types-no-schema-prefix") && !args.includes("--root-types")) { console.warn("--root-types-no-schema-prefix has no effect without --root-types flag"); - if (args.includes("--enum")) { - console.warn("--root-types-no-schema-prefix has no effect when --enum used"); - } } const flags = parser(args, { diff --git a/packages/openapi-typescript/src/transform/components-object.ts b/packages/openapi-typescript/src/transform/components-object.ts index 52de11b3f..420dbf092 100644 --- a/packages/openapi-typescript/src/transform/components-object.ts +++ b/packages/openapi-typescript/src/transform/components-object.ts @@ -80,9 +80,12 @@ export default function transformComponentsObject(componentsObject: ComponentsOb } const ref = ts.factory.createTypeReferenceNode(`components['${key}']['${name}']`); - // We skip schema prefix replacement when --enum flag is present - if (ctx.rootTypesNoSchemaPrefix && key === "schemas" && !ctx.enum) { - aliasName = aliasName.replace(componentKey, ""); + if (ctx.rootTypesNoSchemaPrefix && key === "schemas") { + // Skipping --root-types generation only for enums if --enum is set + // while still applying --root-types-no-schema-prefix to other types. + if (!(ctx.enum && item.enum !== undefined)) { + aliasName = aliasName.replace(componentKey, ""); + } } const typeAlias = ts.factory.createTypeAliasDeclaration( /* modifiers */ tsModifiers({ export: true }), diff --git a/packages/openapi-typescript/test/transform/components-object.test.ts b/packages/openapi-typescript/test/transform/components-object.test.ts index 8274f07e6..8c9924fd2 100644 --- a/packages/openapi-typescript/test/transform/components-object.test.ts +++ b/packages/openapi-typescript/test/transform/components-object.test.ts @@ -820,9 +820,9 @@ export type Error = components['schemas']['Error']; headers: never; pathItems: never; } -export type SchemaItem = components['schemas']['Item']; -export type SchemaDocument = components['schemas']['Document']; -export type SchemaError = components['schemas']['Error']; +export type Item = components['schemas']['Item']; +export type Document = components['schemas']['Document']; +export type Error = components['schemas']['Error']; export type SchemaMyEnum = components['schemas']['MyEnum']; `, options: { ...DEFAULT_OPTIONS, rootTypes: true, rootTypesNoSchemaPrefix: true, enum: true },