From 3a2f6ba2f9f270c637ac7b6bdff2f7f989b9fbaa Mon Sep 17 00:00:00 2001 From: Tobias Schlatter Date: Wed, 4 Sep 2024 13:46:57 +0200 Subject: [PATCH] RFC: feat: support pattern properties --- .../src/transform/schema-object.ts | 23 +++++++++++++++---- packages/openapi-typescript/src/types.ts | 1 + 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/packages/openapi-typescript/src/transform/schema-object.ts b/packages/openapi-typescript/src/transform/schema-object.ts index 7e74f094c..cb607a711 100644 --- a/packages/openapi-typescript/src/transform/schema-object.ts +++ b/packages/openapi-typescript/src/transform/schema-object.ts @@ -434,6 +434,9 @@ function transformSchemaObjectCore(schemaObject: SchemaObject, options: Transfor if ( ("properties" in schemaObject && schemaObject.properties && Object.keys(schemaObject.properties).length) || + ("patternProperties" in schemaObject && + schemaObject.patternProperties && + Object.keys(schemaObject.patternProperties).length) || ("additionalProperties" in schemaObject && schemaObject.additionalProperties) || ("$defs" in schemaObject && schemaObject.$defs) ) { @@ -526,13 +529,23 @@ function transformSchemaObjectCore(schemaObject: SchemaObject, options: Transfor ); } - // additionalProperties - if (schemaObject.additionalProperties || options.ctx.additionalProperties) { + // additionalProperties / patternProperties + if (schemaObject.additionalProperties || options.ctx.additionalProperties || schemaObject.patternProperties) { + const addlTypes = []; + const hasExplicitAdditionalProperties = typeof schemaObject.additionalProperties === "object" && Object.keys(schemaObject.additionalProperties).length; - const addlType = hasExplicitAdditionalProperties - ? transformSchemaObject(schemaObject.additionalProperties as SchemaObject, options) - : UNKNOWN; + + if (hasExplicitAdditionalProperties) { + addlTypes.push(transformSchemaObject(schemaObject.additionalProperties as SchemaObject, options)); + } + + for (const [_, v] of getEntries(schemaObject.patternProperties ?? {}, options.ctx)) { + addlTypes.push(transformSchemaObject(v, options)); + } + + const addlType = addlTypes ? tsUnion(addlTypes) : UNKNOWN; + return tsIntersection([ ...(coreObjectType.length ? [ts.factory.createTypeLiteralNode(coreObjectType)] : []), ts.factory.createTypeLiteralNode([ diff --git a/packages/openapi-typescript/src/types.ts b/packages/openapi-typescript/src/types.ts index d045d521d..f143e3add 100644 --- a/packages/openapi-typescript/src/types.ts +++ b/packages/openapi-typescript/src/types.ts @@ -502,6 +502,7 @@ export interface ObjectSubtype { type: "object" | ["object", "null"]; properties?: { [name: string]: SchemaObject | ReferenceObject }; additionalProperties?: boolean | Record | SchemaObject | ReferenceObject; + patternProperties?: Record; required?: string[]; allOf?: (SchemaObject | ReferenceObject)[]; anyOf?: (SchemaObject | ReferenceObject)[];