Skip to content

Commit c2c186e

Browse files
authored
fix: tuples type generation support (#1011) (#1082)
1 parent aa963bb commit c2c186e

File tree

3 files changed

+20
-4
lines changed

3 files changed

+20
-4
lines changed

src/transform/schema-object.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,19 @@ export function defaultSchemaObjectTransform(
126126
// "type": "array"
127127
if (schemaObject.type === "array") {
128128
indentLv++;
129-
let itemType = schemaObject.items
130-
? transformSchemaObject(schemaObject.items, { path, ctx: { ...ctx, indentLv } })
131-
: "unknown";
129+
let itemType = "unknown";
130+
if (schemaObject.items) {
131+
if (Array.isArray(schemaObject.items)) {
132+
// tuple type support
133+
const result: string[] = [];
134+
schemaObject.items.forEach((item) => {
135+
result.push(transformSchemaObject(item, { path, ctx: { ...ctx, indentLv } }));
136+
});
137+
itemType = `[${result.join(",")}]`;
138+
} else {
139+
itemType = transformSchemaObject(schemaObject.items, { path, ctx: { ...ctx, indentLv } });
140+
}
141+
}
132142
const minItems: number =
133143
typeof schemaObject.minItems === "number" && schemaObject.minItems >= 0 ? schemaObject.minItems : 0;
134144
const maxItems: number | undefined =

src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ export type SchemaObject = {
439439
| {
440440
type: "array";
441441
prefixItems?: SchemaObject | ReferenceObject;
442-
items?: SchemaObject | ReferenceObject;
442+
items?: SchemaObject | ReferenceObject | (SchemaObject | ReferenceObject)[];
443443
minItems?: number;
444444
maxItems?: number;
445445
}

test/schema-object.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@ describe("Schema Object", () => {
109109
expect(generated).toBe("(string)[]");
110110
});
111111

112+
test("tuple array", () => {
113+
const schema: SchemaObject = { type: "array", items: [{ type: "string" },{"type": "number"}],minItems:2,maxItems:2 };
114+
const generated = transformSchemaObject(schema, options);
115+
expect(generated).toBe("([string,number])[]");
116+
});
117+
112118
test("ref", () => {
113119
const schema: SchemaObject = { type: "array", items: { $ref: 'components["schemas"]["ArrayItem"]' } };
114120
const generated = transformSchemaObject(schema, options);

0 commit comments

Comments
 (0)