Skip to content

Commit 3a2f6ba

Browse files
committed
RFC: feat: support pattern properties
1 parent fdc6d22 commit 3a2f6ba

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

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

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

435435
if (
436436
("properties" in schemaObject && schemaObject.properties && Object.keys(schemaObject.properties).length) ||
437+
("patternProperties" in schemaObject &&
438+
schemaObject.patternProperties &&
439+
Object.keys(schemaObject.patternProperties).length) ||
437440
("additionalProperties" in schemaObject && schemaObject.additionalProperties) ||
438441
("$defs" in schemaObject && schemaObject.$defs)
439442
) {
@@ -526,13 +529,23 @@ function transformSchemaObjectCore(schemaObject: SchemaObject, options: Transfor
526529
);
527530
}
528531

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