Skip to content

Commit 234d304

Browse files
author
Pontus Lundin
committed
add support for pattern properties
1 parent 6baf966 commit 234d304

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

packages/openapi-typescript/src/transform/schema-object.ts

+15-5
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,7 @@ function transformSchemaObjectCore(schemaObject: SchemaObject, options: Transfor
448448
if (
449449
("properties" in schemaObject && schemaObject.properties && Object.keys(schemaObject.properties).length) ||
450450
("additionalProperties" in schemaObject && schemaObject.additionalProperties) ||
451+
("patternProperties" in schemaObject && schemaObject.patternProperties) ||
451452
("$defs" in schemaObject && schemaObject.$defs)
452453
) {
453454
// properties
@@ -547,13 +548,22 @@ function transformSchemaObjectCore(schemaObject: SchemaObject, options: Transfor
547548
);
548549
}
549550

550-
// additionalProperties
551-
if (schemaObject.additionalProperties || options.ctx.additionalProperties) {
551+
// additionalProperties / patternProperties
552+
if (schemaObject.additionalProperties || options.ctx.additionalProperties || schemaObject.patternProperties) {
552553
const hasExplicitAdditionalProperties =
553554
typeof schemaObject.additionalProperties === "object" && Object.keys(schemaObject.additionalProperties).length;
554-
const addlType = hasExplicitAdditionalProperties
555-
? transformSchemaObject(schemaObject.additionalProperties as SchemaObject, options)
556-
: UNKNOWN;
555+
const hasExplicitPatternProperties =
556+
typeof schemaObject.patternProperties === "object" && Object.keys(schemaObject.patternProperties).length;
557+
const addlTypes = [];
558+
if (hasExplicitAdditionalProperties) {
559+
addlTypes.push(transformSchemaObject(schemaObject.additionalProperties as SchemaObject, options));
560+
}
561+
if (hasExplicitPatternProperties) {
562+
for (const [_, v] of getEntries(schemaObject.patternProperties ?? {}, options.ctx)) {
563+
addlTypes.push(transformSchemaObject(v, options));
564+
}
565+
}
566+
const addlType = addlTypes.length === 0 ? UNKNOWN : tsUnion(addlTypes);
557567
return tsIntersection([
558568
...(coreObjectType.length ? [ts.factory.createTypeLiteralNode(coreObjectType)] : []),
559569
ts.factory.createTypeLiteralNode([

packages/openapi-typescript/src/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,7 @@ export interface ObjectSubtype {
502502
type: "object" | ["object", "null"];
503503
properties?: { [name: string]: SchemaObject | ReferenceObject };
504504
additionalProperties?: boolean | Record<string, never> | SchemaObject | ReferenceObject;
505+
patternProperties?: Record<string, SchemaObject | ReferenceObject>;
505506
required?: string[];
506507
allOf?: (SchemaObject | ReferenceObject)[];
507508
anyOf?: (SchemaObject | ReferenceObject)[];

0 commit comments

Comments
 (0)