Skip to content

Commit 62de3ab

Browse files
committed
RFC: feat: support pattern properties
1 parent fdc6d22 commit 62de3ab

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

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

+16-5
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@ function transformSchemaObjectCore(schemaObject: SchemaObject, options: Transfor
434434

435435
if (
436436
("properties" in schemaObject && schemaObject.properties && Object.keys(schemaObject.properties).length) ||
437+
("patternProperties" in schemaObject && schemaObject.patternProperties && Object.keys(schemaObject.patternProperties).length) ||
437438
("additionalProperties" in schemaObject && schemaObject.additionalProperties) ||
438439
("$defs" in schemaObject && schemaObject.$defs)
439440
) {
@@ -526,13 +527,23 @@ function transformSchemaObjectCore(schemaObject: SchemaObject, options: Transfor
526527
);
527528
}
528529

529-
// additionalProperties
530-
if (schemaObject.additionalProperties || options.ctx.additionalProperties) {
530+
// additionalProperties / patternProperties
531+
if (schemaObject.additionalProperties || options.ctx.additionalProperties || schemaObject.patternProperties) {
532+
const addlTypes = [];
533+
531534
const hasExplicitAdditionalProperties =
532535
typeof schemaObject.additionalProperties === "object" && Object.keys(schemaObject.additionalProperties).length;
533-
const addlType = hasExplicitAdditionalProperties
534-
? transformSchemaObject(schemaObject.additionalProperties as SchemaObject, options)
535-
: UNKNOWN;
536+
537+
if (hasExplicitAdditionalProperties) {
538+
addlTypes.push(transformSchemaObject(schemaObject.additionalProperties as SchemaObject, options))
539+
}
540+
541+
for (const [_, v] of getEntries(schemaObject.patternProperties ?? {}, options.ctx)) {
542+
addlTypes.push(transformSchemaObject(v, options))
543+
}
544+
545+
const addlType = addlTypes ? tsUnion(addlTypes) : UNKNOWN;
546+
536547
return tsIntersection([
537548
...(coreObjectType.length ? [ts.factory.createTypeLiteralNode(coreObjectType)] : []),
538549
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)