diff --git a/src/generateTS/factory.ts b/src/generateTS/factory.ts index a2c2523..d82e4df 100644 --- a/src/generateTS/factory.ts +++ b/src/generateTS/factory.ts @@ -160,6 +160,10 @@ export default function (userOptions: TSGenOptions) { if (field.multiple) { op = "[]"; + + if (field.max_instance) { + return ["MaxTuple<", type, ", ", field.max_instance, ">"].join(""); + } } return type + op; diff --git a/src/generateTS/stack/builtins.ts b/src/generateTS/stack/builtins.ts index 86d844d..e9d95d6 100644 --- a/src/generateTS/stack/builtins.ts +++ b/src/generateTS/stack/builtins.ts @@ -4,6 +4,11 @@ export const defaultInterfaces = ( hasJsonRte?: boolean ) => { const defaultInterfaces = [ + `type BuildTuple = + R['length'] extends N ? R : BuildTuple`, + `type TuplePrefixes = + T extends [any, ...infer Rest] ? T | TuplePrefixes : []`, + `type MaxTuple = TuplePrefixes>`, `export interface ${prefix}PublishDetails { environment: string; locale: string; diff --git a/tests/unit/tsgen/group.test.ts b/tests/unit/tsgen/group.test.ts index c5c4193..491c42b 100644 --- a/tests/unit/tsgen/group.test.ts +++ b/tests/unit/tsgen/group.test.ts @@ -26,9 +26,9 @@ describe("group", () => { /** Version */ _version: number; title: string; - multiple_group_max_limit?: { + multiple_group_max_limit?: MaxTuple<{ number?: number | null; - }[]; + }, 5>; multiple_group?: { single_line?: string; }[]; diff --git a/tests/unit/tsgen/isodate.test.ts b/tests/unit/tsgen/isodate.test.ts index 235fd3a..a7eb171 100644 --- a/tests/unit/tsgen/isodate.test.ts +++ b/tests/unit/tsgen/isodate.test.ts @@ -30,8 +30,8 @@ describe("builtin isodate field", () => { date?: string | null; date_required: string; date_multiple?: string[] | null; - date_multiple_maxlength?: string[] | null; - date_required_multiple_maxlength: string[]; + date_multiple_maxlength?: MaxTuple | null; + date_required_multiple_maxlength: MaxTuple; }" `); }); diff --git a/tests/unit/tsgen/number.test.ts b/tests/unit/tsgen/number.test.ts index 3b89799..64e81dc 100644 --- a/tests/unit/tsgen/number.test.ts +++ b/tests/unit/tsgen/number.test.ts @@ -28,8 +28,8 @@ describe("builtin number field", () => { number?: number | null; number_required: number; number_multiple?: number[] | null; - number_multiple_max_limit?: number[] | null; - number_required_multiple_max_limit: number[]; + number_multiple_max_limit?: MaxTuple | null; + number_required_multiple_max_limit: MaxTuple; }" `); }); diff --git a/tests/unit/tsgen/options.test.ts b/tests/unit/tsgen/options.test.ts index 652ad86..7b8bf2d 100644 --- a/tests/unit/tsgen/options.test.ts +++ b/tests/unit/tsgen/options.test.ts @@ -21,7 +21,7 @@ describe("all options", () => { single_line_textbox_not_required?: string; single_line_textbox_required: string; single_line_textbox_multiple?: string[]; - single_line_textbox_multiple_max_limit?: string[]; + single_line_textbox_multiple_max_limit?: MaxTuple; }" `); });