diff --git a/.changeset/eighty-chairs-join.md b/.changeset/eighty-chairs-join.md new file mode 100644 index 000000000..fcf7007d1 --- /dev/null +++ b/.changeset/eighty-chairs-join.md @@ -0,0 +1,5 @@ +--- +"openapi-typescript": minor +--- + +Stringify const values with no specified type diff --git a/packages/openapi-typescript/src/transform/schema-object.ts b/packages/openapi-typescript/src/transform/schema-object.ts index 5f10a6740..a0f89ab96 100644 --- a/packages/openapi-typescript/src/transform/schema-object.ts +++ b/packages/openapi-typescript/src/transform/schema-object.ts @@ -41,13 +41,7 @@ export function defaultSchemaObjectTransform(schemaObject: SchemaObject | Refere // const (valid for any type) if (schemaObject.const !== null && schemaObject.const !== undefined) { - let schemaConst = schemaObject.const as any; - if ("type" in schemaObject) { - if (schemaObject.type === "string") { - schemaConst = escStr(schemaConst); - } - } - return transformSchemaObject(schemaConst, { + return transformSchemaObject(escStr(schemaObject.const) as any, { path, ctx: { ...ctx, immutableTypes: false, indentLv: indentLv + 1 }, // note: guarantee readonly happens once, here }); diff --git a/packages/openapi-typescript/src/utils.ts b/packages/openapi-typescript/src/utils.ts index 8c7ce6b62..ebd82621e 100644 --- a/packages/openapi-typescript/src/utils.ts +++ b/packages/openapi-typescript/src/utils.ts @@ -257,7 +257,7 @@ export function tsUnionOf(...types: (string | number | boolean)[]): string { /** escape string value */ export function escStr(input: any): string { - if (typeof input !== "string") return input; + if (typeof input !== "string") return JSON.stringify(input); return `"${input.trim().replace(DOUBLE_QUOTE_RE, '\\"')}"`; } diff --git a/packages/openapi-typescript/test/schema-object.test.ts b/packages/openapi-typescript/test/schema-object.test.ts index c9936ba01..cdec5b9af 100644 --- a/packages/openapi-typescript/test/schema-object.test.ts +++ b/packages/openapi-typescript/test/schema-object.test.ts @@ -255,6 +255,21 @@ describe("Schema Object", () => { const generated = transformSchemaObject({ type: "string", const: "duck" }, options); expect(generated).toBe(`"duck"`); }); + + test("number", () => { + const generated = transformSchemaObject({ type: "number", const: 42 }, options); + expect(generated).toBe("42"); + }); + + test("string, no type specified", () => { + const generated = transformSchemaObject({ const: "99" }, options); + expect(generated).toBe(`"99"`); + }); + + test("number, no type specified", () => { + const generated = transformSchemaObject({ const: 300 }, options); + expect(generated).toBe("300"); + }); }); describe("polymorphic", () => {