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)[];