Skip to content

Commit 14353af

Browse files
authored
Fix additionalProperties.oneOf (#442)
#305
1 parent 3c8f1ff commit 14353af

File tree

2 files changed

+26
-8
lines changed

2 files changed

+26
-8
lines changed

src/v3.ts

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,18 +83,29 @@ 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+
const anyOf: any[] | undefined = (node.additionalProperties as any).anyOf || undefined; // "
93+
if (oneOf) {
94+
additionalProperties = `{ [key: string]: ${tsUnionOf(oneOf.map(transform))}; }\n`;
95+
} else if (anyOf) {
96+
additionalProperties = `{ [key: string]: ${tsIntersectionOf(
97+
anyOf.map((s) => tsPartial(transform(s)))
98+
)}; }\n`;
99+
} else {
100+
additionalProperties = `{ [key: string]: ${transform(node.additionalProperties) || "any"}; }\n`;
101+
}
102+
}
103+
}
93104

94105
return tsIntersectionOf([
95106
...(node.allOf ? (node.allOf as any[]).map(transform) : []), // append allOf first
96107
...(properties ? [`{ ${properties} }`] : []), // then properties
97-
...additionalProperties, // then additional properties
108+
...(additionalProperties ? [additionalProperties] : []), // then additional properties
98109
]);
99110
}
100111
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)