Skip to content

Commit 6ef99cc

Browse files
committed
Fix additionalProperties.oneOf
#305
1 parent 9b9236f commit 6ef99cc

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

src/v3.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,18 +83,24 @@ export default function generateTypesV3(input: OpenAPI3 | OpenAPI3Schemas, optio
8383
let properties = createKeys(node.properties || {}, node.required);
8484

8585
// if additional properties, add an intersection with a generic map type
86-
const additionalProperties = node.additionalProperties
87-
? [
88-
`{ [key: string]: ${
89-
node.additionalProperties === true ? "any" : transform(node.additionalProperties) || "any"
90-
};}\n`,
91-
]
92-
: [];
86+
let additionalProperties: string | undefined;
87+
if (node.additionalProperties) {
88+
if (node.additionalProperties === true) {
89+
additionalProperties = `{ [key: string]: any }\n`;
90+
} else if (typeof node.additionalProperties === "object") {
91+
const oneOf: any[] | undefined = (node.additionalProperties as any).oneOf || undefined; // TypeScript does a really bad job at inference here, so we enforce a type
92+
if (oneOf) {
93+
additionalProperties = `{ [key: string]: ${tsUnionOf(oneOf.map(transform))}; }\n`;
94+
} else {
95+
additionalProperties = `{ [key: string]: ${transform(node.additionalProperties) || "any"}; }\n`;
96+
}
97+
}
98+
}
9399

94100
return tsIntersectionOf([
95101
...(node.allOf ? (node.allOf as any[]).map(transform) : []), // append allOf first
96102
...(properties ? [`{ ${properties} }`] : []), // then properties
97-
...additionalProperties, // then additional properties
103+
...(additionalProperties ? [additionalProperties] : []), // then additional properties
98104
]);
99105
}
100106
case "array": {

tests/v3/index.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,12 @@ describe("OpenAPI3 features", () => {
494494
},
495495
],
496496
},
497+
one_of_addl_props: {
498+
type: "object",
499+
additionalProperties: {
500+
oneOf: [{ type: "string" }, { type: "number" }, { type: "boolean" }],
501+
},
502+
},
497503
},
498504
},
499505
};
@@ -509,6 +515,7 @@ describe("OpenAPI3 features", () => {
509515
one_of_inferred:
510516
| { kibana?: { versions?: string } }
511517
| { elasticsearch?: { versions?: string } }
518+
one_of_addl_props: { [key: string]: string | number | boolean }
512519
}
513520
}
514521
`)

0 commit comments

Comments
 (0)