Skip to content

Commit 4232826

Browse files
committed
more test cases and tiny type format tweaks
1 parent ebc955d commit 4232826

File tree

2 files changed

+58
-37
lines changed

2 files changed

+58
-37
lines changed

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

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

33-
export type ValidateSerializable<T, TSerializable> =
34-
T extends unknown
35-
? T extends TSerializable
36-
? T
37-
: T extends ReadonlyArray<any>
38-
? ValidateSerializableArray<T, TSerializable>
39-
: T extends (...args: Array<any>) => any
40-
? 'Function is not serializable'
41-
: T extends Promise<any>
42-
? ValidateSerializablePromise<T, TSerializable>
43-
: T extends ReadableStream<any>
44-
? ValidateReadableStream<T, TSerializable>
45-
: T extends Set<any>
46-
? ValidateSerializableSet<T, TSerializable>
47-
: T extends Map<any, any>
48-
? ValidateSerializableMap<T, TSerializable>
49-
: { [K in keyof T]: ValidateSerializable<T[K], TSerializable> }
50-
: never
33+
export type ValidateSerializable<T, TSerializable> = T extends unknown
34+
? T extends TSerializable
35+
? T
36+
: T extends ReadonlyArray<any>
37+
? ValidateSerializableArray<T, TSerializable>
38+
: T extends (...args: Array<any>) => any
39+
? 'Function is not serializable'
40+
: T extends Promise<any>
41+
? ValidateSerializablePromise<T, TSerializable>
42+
: T extends ReadableStream<any>
43+
? ValidateReadableStream<T, TSerializable>
44+
: T extends Set<any>
45+
? ValidateSerializableSet<T, TSerializable>
46+
: T extends Map<any, any>
47+
? ValidateSerializableMap<T, TSerializable>
48+
: { [K in keyof T]: ValidateSerializable<T[K], TSerializable> }
49+
: never
5150

5251
export type ValidateSerializablePromise<T, TSerializable> =
5352
T extends Promise<infer TAwaited>
@@ -188,27 +187,27 @@ export type RegisteredSerializationAdapters<TRegister> = RegisteredConfigType<
188187
export type ValidateSerializableInputResult<TRegister, T> =
189188
ValidateSerializableResult<T, RegisteredSerializableInput<TRegister>>
190189

191-
export type ValidateSerializableResult<T, TSerializable> =
192-
T extends unknown
193-
? T extends TSerializable
194-
? T
195-
: T extends ReadonlyArray<any>
196-
? ValidateSerializableResultArray<T, TSerializable>
197-
: unknown extends SerializerExtensions['ReadableStream']
198-
? { [K in keyof T]: ValidateSerializableResult<T[K], TSerializable> }
199-
: T extends SerializerExtensions['ReadableStream']
200-
? ReadableStream
201-
: { [K in keyof T]: ValidateSerializableResult<T[K], TSerializable> }
202-
: never
190+
export type ValidateSerializableResult<T, TSerializable> = T extends unknown
191+
? T extends TSerializable
192+
? T
193+
: T extends ReadonlyArray<any>
194+
? ValidateSerializableResultArray<T, TSerializable>
195+
: unknown extends SerializerExtensions['ReadableStream']
196+
? { [K in keyof T]: ValidateSerializableResult<T[K], TSerializable> }
197+
: T extends SerializerExtensions['ReadableStream']
198+
? ReadableStream
199+
: { [K in keyof T]: ValidateSerializableResult<T[K], TSerializable> }
200+
: never
203201

204202
type ValidateSerializableResultArray<
205203
T extends ReadonlyArray<any>,
206204
TSerializable,
207-
> = IsTuple<T> extends true
208-
? { [K in keyof T]: ValidateSerializableResult<T[K], TSerializable> }
209-
: T extends Array<infer U>
210-
? Array<ValidateSerializableResult<U, TSerializable>>
211-
: ReadonlyArray<ValidateSerializableResult<T[number], TSerializable>>
205+
> =
206+
IsTuple<T> extends true
207+
? { [K in keyof T]: ValidateSerializableResult<T[K], TSerializable> }
208+
: T extends Array<infer U>
209+
? Array<ValidateSerializableResult<U, TSerializable>>
210+
: ReadonlyArray<ValidateSerializableResult<T[number], TSerializable>>
212211

213212
export type RegisteredSSROption<TRegister> =
214213
unknown extends RegisteredConfigType<TRegister, 'defaultSsr'>

packages/router-core/tests/serializer-recursion.test-d.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,32 @@ import { describe, expectTypeOf, it } from 'vitest'
22

33
import type {
44
Serializable,
5+
ValidateSerializable,
56
ValidateSerializableResult,
67
} from '../src/ssr/serializer/transformer'
78

8-
describe('ValidateSerializableResult recursion', () => {
9+
describe('ValidateSerializable array handling', () => {
10+
it('preserves nested array payloads for input validation', () => {
11+
type Input = Array<{ value: string; nested: Array<{ id: number }> }>
12+
expectTypeOf<
13+
ValidateSerializable<Input, Serializable>
14+
>().branded.toEqualTypeOf<Input>()
15+
})
16+
17+
it('preserves tuple structure for input validation', () => {
18+
type InputTuple = readonly [{ name: string }, { count: number }]
19+
expectTypeOf<
20+
ValidateSerializable<InputTuple, Serializable>
21+
>().branded.toEqualTypeOf<InputTuple>()
22+
})
23+
24+
it('preserves readonly array structure for input validation', () => {
25+
type InputReadonlyArray = ReadonlyArray<{ value: string }>
26+
expectTypeOf<
27+
ValidateSerializable<InputReadonlyArray, Serializable>
28+
>().branded.toEqualTypeOf<InputReadonlyArray>()
29+
})
30+
931
it('should preserve recursive payload without infinite expansion', () => {
1032
type Result = Array<Result> | { [key: string]: Result }
1133
expectTypeOf<
@@ -16,7 +38,7 @@ describe('ValidateSerializableResult recursion', () => {
1638
it('should preserve recursive tuples without infinite expansion', () => {
1739
type ResultTuple = readonly [
1840
ReadonlyArray<ResultTuple>,
19-
{ [key: string]: ResultTuple }
41+
{ [key: string]: ResultTuple },
2042
]
2143
expectTypeOf<
2244
ValidateSerializableResult<ResultTuple, Serializable>

0 commit comments

Comments
 (0)