Skip to content

Commit b94486c

Browse files
committed
we gotta treat tuples differently i guess
1 parent 0bbb800 commit b94486c

File tree

1 file changed

+46
-36
lines changed

1 file changed

+46
-36
lines changed

packages/router-core/src/ssr/serializer/transformer.ts

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ export interface CreateSerializationAdapterOptions<TInput, TOutput> {
3030
fromSerializable: (value: TOutput) => TInput
3131
}
3232

33-
export type ValidateSerializable<T, TSerializable> = T extends unknown
34-
? T extends ReadonlyArray<unknown>
33+
export type ValidateSerializable<T, TSerializable> =
34+
T extends ReadonlyArray<unknown>
3535
? ValidateSerializableArray<T, TSerializable>
3636
: T extends TSerializable
3737
? T
@@ -45,8 +45,9 @@ export type ValidateSerializable<T, TSerializable> = T extends unknown
4545
? ValidateSerializableSet<T, TSerializable>
4646
: T extends Map<any, any>
4747
? ValidateSerializableMap<T, TSerializable>
48-
: { [K in keyof T]: ValidateSerializable<T[K], TSerializable> }
49-
: never
48+
: {
49+
[K in keyof T]: ValidateSerializable<T[K], TSerializable>
50+
}
5051

5152
export type ValidateSerializablePromise<T, TSerializable> =
5253
T extends Promise<infer TAwaited>
@@ -71,30 +72,27 @@ export type ValidateSerializableMap<T, TSerializable> =
7172
>
7273
: never
7374

74-
type ApplyArrayValidation<
75-
TValue,
76-
TSerializable,
77-
TKind extends 'input' | 'result',
78-
> = TKind extends 'input'
79-
? ValidateSerializable<TValue, TSerializable>
80-
: ValidateSerializableResult<TValue, TSerializable>
81-
82-
type ValidateSerializableArrayCore<
75+
type ValidateSerializableArray<
8376
T extends ReadonlyArray<unknown>,
8477
TSerializable,
85-
TKind extends 'input' | 'result',
86-
> = T extends any
87-
? number extends T['length']
88-
? T extends Array<infer U>
89-
? Array<ApplyArrayValidation<U, TSerializable, TKind>>
90-
: ReadonlyArray<ApplyArrayValidation<T[number], TSerializable, TKind>>
91-
: { [K in keyof T]: ApplyArrayValidation<T[K], TSerializable, TKind> }
92-
: never
78+
> = number extends T['length']
79+
? T extends Array<infer U>
80+
? Array<ValidateSerializable<U, TSerializable>>
81+
: ReadonlyArray<ValidateSerializable<T[number], TSerializable>>
82+
: ValidateSerializableTuple<T, TSerializable>
9383

94-
type ValidateSerializableArray<
84+
type ValidateSerializableTuple<
9585
T extends ReadonlyArray<unknown>,
9686
TSerializable,
97-
> = ValidateSerializableArrayCore<T, TSerializable, 'input'>
87+
> = T extends readonly [infer THead, ...infer TTail]
88+
? readonly [
89+
ValidateSerializable<THead, TSerializable>,
90+
...ValidateSerializableTuple<
91+
TTail extends ReadonlyArray<unknown> ? TTail : [],
92+
TSerializable
93+
>,
94+
]
95+
: T
9896

9997
export type RegisteredReadableStream =
10098
unknown extends SerializerExtensions['ReadableStream']
@@ -199,26 +197,38 @@ export type RegisteredSerializationAdapters<TRegister> = RegisteredConfigType<
199197
export type ValidateSerializableInputResult<TRegister, T> =
200198
ValidateSerializableResult<T, RegisteredSerializableInput<TRegister>>
201199

202-
export type ValidateSerializableResult<T, TSerializable> = T extends unknown
203-
? T extends ReadonlyArray<unknown>
200+
export type ValidateSerializableResult<T, TSerializable> =
201+
T extends ReadonlyArray<unknown>
204202
? ValidateSerializableResultArray<T, TSerializable>
205203
: T extends TSerializable
206204
? T
207-
: T extends (...args: Array<any>) => any
208-
? 'Function is not serializable'
209-
: unknown extends SerializerExtensions['ReadableStream']
210-
? { [K in keyof T]: ValidateSerializableResult<T[K], TSerializable> }
211-
: T extends SerializerExtensions['ReadableStream']
212-
? ReadableStream
213-
: {
214-
[K in keyof T]: ValidateSerializableResult<T[K], TSerializable>
215-
}
216-
: never
205+
: unknown extends SerializerExtensions['ReadableStream']
206+
? { [K in keyof T]: ValidateSerializableResult<T[K], TSerializable> }
207+
: T extends SerializerExtensions['ReadableStream']
208+
? ReadableStream
209+
: { [K in keyof T]: ValidateSerializableResult<T[K], TSerializable> }
217210

218211
type ValidateSerializableResultArray<
219212
T extends ReadonlyArray<unknown>,
220213
TSerializable,
221-
> = ValidateSerializableArrayCore<T, TSerializable, 'result'>
214+
> = number extends T['length']
215+
? T extends Array<infer U>
216+
? Array<ValidateSerializableResult<U, TSerializable>>
217+
: ReadonlyArray<ValidateSerializableResult<T[number], TSerializable>>
218+
: ValidateSerializableResultTuple<T, TSerializable>
219+
220+
type ValidateSerializableResultTuple<
221+
T extends ReadonlyArray<unknown>,
222+
TSerializable,
223+
> = T extends readonly [infer THead, ...infer TTail]
224+
? readonly [
225+
ValidateSerializableResult<THead, TSerializable>,
226+
...ValidateSerializableResultTuple<
227+
TTail extends ReadonlyArray<unknown> ? TTail : [],
228+
TSerializable
229+
>,
230+
]
231+
: T
222232

223233
export type RegisteredSSROption<TRegister> =
224234
unknown extends RegisteredConfigType<TRegister, 'defaultSsr'>

0 commit comments

Comments
 (0)