From b3e9c5d9d9997f8c8e916c1650f87e3d9f8ec6ec Mon Sep 17 00:00:00 2001 From: Zac Rosenbauer Date: Tue, 22 Apr 2025 16:21:03 -0400 Subject: [PATCH 1/3] fix(openapi-typescript): prevent type error when items is boolean --- .../src/transform/schema-object.ts | 12 +++++++++++- .../test/transform/schema-object/array.test.ts | 8 ++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/openapi-typescript/src/transform/schema-object.ts b/packages/openapi-typescript/src/transform/schema-object.ts index baa143933..0fc72c802 100644 --- a/packages/openapi-typescript/src/transform/schema-object.ts +++ b/packages/openapi-typescript/src/transform/schema-object.ts @@ -322,7 +322,7 @@ function transformSchemaObjectCore(schemaObject: SchemaObject, options: Transfor } // standard array type else if (schemaObject.items) { - if ("type" in schemaObject.items && schemaObject.items.type === "array") { + if (hasKey(schemaObject.items, "type") && schemaObject.items.type === "array") { itemType = ts.factory.createArrayTypeNode(transformSchemaObject(schemaObject.items, options)); } else { itemType = transformSchemaObject(schemaObject.items, options); @@ -579,3 +579,13 @@ function transformSchemaObjectCore(schemaObject: SchemaObject, options: Transfor return coreObjectType.length ? ts.factory.createTypeLiteralNode(coreObjectType) : undefined; } + +/** + * Check if an object has a key + * @param possibleObject - The object to check + * @param key - The key to check for + * @returns True if the object has the key, false otherwise + */ +function hasKey(possibleObject: unknown, key: K): possibleObject is { [key in K]: unknown } { + return typeof possibleObject === 'object' && possibleObject !== null && key in possibleObject; +} \ No newline at end of file diff --git a/packages/openapi-typescript/test/transform/schema-object/array.test.ts b/packages/openapi-typescript/test/transform/schema-object/array.test.ts index 37d468766..fe3e53358 100644 --- a/packages/openapi-typescript/test/transform/schema-object/array.test.ts +++ b/packages/openapi-typescript/test/transform/schema-object/array.test.ts @@ -18,6 +18,14 @@ describe("transformSchemaObject > array", () => { // options: DEFAULT_OPTIONS, }, ], + // Prevents: "TypeError: Cannot use 'in' operator to search for 'type' in true" + [ + "boolean items", + { + given: { type: "array", items: true }, + want: "unknown[]", + }, + ], [ "tuple > tuple items", { From ea144c0826b5dfdee269d60de3e432d3282436f6 Mon Sep 17 00:00:00 2001 From: Zac Rosenbauer Date: Tue, 22 Apr 2025 16:25:41 -0400 Subject: [PATCH 2/3] fix: add EOL --- packages/openapi-typescript/src/transform/schema-object.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/openapi-typescript/src/transform/schema-object.ts b/packages/openapi-typescript/src/transform/schema-object.ts index 0fc72c802..cac5b93c1 100644 --- a/packages/openapi-typescript/src/transform/schema-object.ts +++ b/packages/openapi-typescript/src/transform/schema-object.ts @@ -588,4 +588,4 @@ function transformSchemaObjectCore(schemaObject: SchemaObject, options: Transfor */ function hasKey(possibleObject: unknown, key: K): possibleObject is { [key in K]: unknown } { return typeof possibleObject === 'object' && possibleObject !== null && key in possibleObject; -} \ No newline at end of file +} From efccb282f6eb1824593d9e86691b91e587ecd859 Mon Sep 17 00:00:00 2001 From: Zac Rosenbauer Date: Tue, 22 Apr 2025 16:28:59 -0400 Subject: [PATCH 3/3] fix: linting --- packages/openapi-typescript/src/transform/schema-object.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/openapi-typescript/src/transform/schema-object.ts b/packages/openapi-typescript/src/transform/schema-object.ts index cac5b93c1..7219664df 100644 --- a/packages/openapi-typescript/src/transform/schema-object.ts +++ b/packages/openapi-typescript/src/transform/schema-object.ts @@ -587,5 +587,5 @@ function transformSchemaObjectCore(schemaObject: SchemaObject, options: Transfor * @returns True if the object has the key, false otherwise */ function hasKey(possibleObject: unknown, key: K): possibleObject is { [key in K]: unknown } { - return typeof possibleObject === 'object' && possibleObject !== null && key in possibleObject; + return typeof possibleObject === "object" && possibleObject !== null && key in possibleObject; }