Skip to content

Commit c145e39

Browse files
committed
serialization pls
1 parent d56aa42 commit c145e39

File tree

9 files changed

+72
-63
lines changed

9 files changed

+72
-63
lines changed
Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,28 @@
1-
import { createRouter as createTanStackRouter } from '@tanstack/react-router'
1+
import {
2+
createRouterConfig,
3+
createRouter as createTanStackRouter,
4+
} from '@tanstack/react-router'
25
import { routeTree } from './routeTree.gen'
36
import { carAdapter, fooAdapter } from './data'
47
import { customErrorAdapter } from './CustomError'
58

9+
const config = createRouterConfig({
10+
serializationAdapters: [fooAdapter, carAdapter, customErrorAdapter],
11+
})
12+
613
export function createRouter() {
714
const router = createTanStackRouter({
15+
...config,
816
routeTree,
917
scrollRestoration: true,
10-
serializationAdapters: [fooAdapter, carAdapter, customErrorAdapter],
1118
})
1219

1320
return router
1421
}
1522

1623
declare module '@tanstack/react-router' {
1724
interface Register {
25+
config: typeof config
1826
router: ReturnType<typeof createRouter>
1927
}
2028
}

packages/react-router/src/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ export { useMatch } from './useMatch'
248248
export { useLoaderDeps } from './useLoaderDeps'
249249
export { useLoaderData } from './useLoaderData'
250250

251-
export { redirect, isRedirect } from '@tanstack/router-core'
251+
export { redirect, isRedirect, createRouterConfig } from '@tanstack/router-core'
252252

253253
export {
254254
RouteApi,

packages/react-router/src/router.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import type {
55
AnyRoute,
66
CreateRouterFn,
77
RouterConstructorOptions,
8-
SSROption,
98
TrailingSlashOption,
109
} from '@tanstack/router-core'
1110

@@ -88,26 +87,20 @@ export class Router<
8887
in out TDefaultStructuralSharingOption extends boolean = false,
8988
in out TRouterHistory extends RouterHistory = RouterHistory,
9089
in out TDehydrated extends Record<string, any> = Record<string, any>,
91-
in out TSerializationAdapters = unknown,
92-
in out TDefaultSSR extends SSROption = SSROption,
9390
> extends RouterCore<
9491
TRouteTree,
9592
TTrailingSlashOption,
9693
TDefaultStructuralSharingOption,
9794
TRouterHistory,
98-
TDehydrated,
99-
TSerializationAdapters,
100-
TDefaultSSR
95+
TDehydrated
10196
> {
10297
constructor(
10398
options: RouterConstructorOptions<
10499
TRouteTree,
105100
TTrailingSlashOption,
106101
TDefaultStructuralSharingOption,
107102
TRouterHistory,
108-
TDehydrated,
109-
TSerializationAdapters,
110-
TDefaultSSR
103+
TDehydrated
111104
>,
112105
) {
113106
super(options)

packages/router-core/src/config.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import type { SSROption } from './router'
2+
import type { AnySerializationAdapter } from './ssr/serializer/transformer'
3+
4+
export interface RouterConfigOptions<
5+
in out TSerializationAdapters,
6+
in out TDefaultSsr,
7+
> {
8+
serializationAdapters?: TSerializationAdapters
9+
defaultSsr?: TDefaultSsr
10+
}
11+
12+
export interface RouterConfig<
13+
in out TSerializationAdapters,
14+
in out TDefaultSsr,
15+
> {
16+
'~types': RouterConfig<TSerializationAdapters, TDefaultSsr>
17+
serializationAdapters: TSerializationAdapters
18+
defaultSsr: TDefaultSsr | undefined
19+
}
20+
21+
export const createRouterConfig = <
22+
const TSerializationAdapters extends ReadonlyArray<AnySerializationAdapter>,
23+
TDefaultSsr extends SSROption,
24+
>(
25+
options: RouterConfigOptions<TSerializationAdapters, TDefaultSsr>,
26+
): RouterConfig<TSerializationAdapters, TDefaultSsr> => {
27+
return {
28+
serializationAdapters: options.serializationAdapters,
29+
defaultSsr: options.defaultSsr,
30+
} as RouterConfig<TSerializationAdapters, TDefaultSsr>
31+
}
32+
33+
export type AnyRouterConfig = RouterConfig<any, any>

packages/router-core/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,8 @@ export type {
249249
DefaultRegister,
250250
} from './router'
251251

252+
export * from './config'
253+
252254
export type {
253255
MatchLocation,
254256
CommitLocationOptions,

packages/router-core/src/router.ts

Lines changed: 12 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ import type { AnySchema, AnyValidator } from './validators'
8585
import type { NavigateOptions, ResolveRelativePath, ToOptions } from './link'
8686
import type { NotFoundError } from './not-found'
8787
import type { AnySerializationAdapter } from './ssr/serializer/transformer'
88+
import type { AnyRouterConfig } from './config'
8889

8990
export type ControllablePromise<T = any> = Promise<T> & {
9091
resolve: (value: T) => void
@@ -95,6 +96,7 @@ export type InjectedHtmlEntry = Promise<string>
9596

9697
export interface DefaultRegister {
9798
router: AnyRouter
99+
config: AnyRouterConfig
98100
ssr: SSROption
99101
}
100102

@@ -121,8 +123,6 @@ export interface RouterOptions<
121123
TDefaultStructuralSharingOption extends boolean = false,
122124
TRouterHistory extends RouterHistory = RouterHistory,
123125
TDehydrated extends Record<string, any> = Record<string, any>,
124-
TSerializationAdapters = unknown,
125-
TDefaultSSR extends SSROption = SSROption,
126126
> extends RouterOptionsExtensions {
127127
/**
128128
* The history object that will be used to manage the browser history.
@@ -360,7 +360,7 @@ export interface RouterOptions<
360360
*
361361
* @default true
362362
*/
363-
defaultSsr?: TDefaultSSR
363+
defaultSsr?: SSROption
364364

365365
search?: {
366366
/**
@@ -430,7 +430,7 @@ export interface RouterOptions<
430430
*/
431431
disableGlobalCatchBoundary?: boolean
432432

433-
serializationAdapters?: TSerializationAdapters
433+
serializationAdapters?: ReadonlyArray<AnySerializationAdapter>
434434
}
435435

436436
export interface RouterState<
@@ -539,17 +539,13 @@ export type RouterConstructorOptions<
539539
TDefaultStructuralSharingOption extends boolean,
540540
TRouterHistory extends RouterHistory,
541541
TDehydrated extends Record<string, any>,
542-
TSerializationAdapters,
543-
TDefaultSSR extends SSROption,
544542
> = Omit<
545543
RouterOptions<
546544
TRouteTree,
547545
TTrailingSlashOption,
548546
TDefaultStructuralSharingOption,
549547
TRouterHistory,
550-
TDehydrated,
551-
TSerializationAdapters,
552-
TDefaultSSR
548+
TDehydrated
553549
>,
554550
'context'
555551
> &
@@ -609,17 +605,13 @@ export type UpdateFn<
609605
TDefaultStructuralSharingOption extends boolean,
610606
TRouterHistory extends RouterHistory,
611607
TDehydrated extends Record<string, any>,
612-
TSerializationAdapters,
613-
TDefaultSSR extends SSROption,
614608
> = (
615609
newOptions: RouterConstructorOptions<
616610
TRouteTree,
617611
TTrailingSlashOption,
618612
TDefaultStructuralSharingOption,
619613
TRouterHistory,
620-
TDehydrated,
621-
TSerializationAdapters,
622-
TDefaultSSR
614+
TDehydrated
623615
>,
624616
) => void
625617

@@ -704,12 +696,10 @@ export type AnyRouterWithContext<TContext> = RouterCore<
704696
any,
705697
any,
706698
any,
707-
any,
708-
any,
709699
any
710700
>
711701

712-
export type AnyRouter = RouterCore<any, any, any, any, any, any, any>
702+
export type AnyRouter = RouterCore<any, any, any, any, any>
713703

714704
export interface ViewTransitionOptions {
715705
types:
@@ -763,9 +753,6 @@ export type CreateRouterFn = <
763753
TDefaultStructuralSharingOption extends boolean = false,
764754
TRouterHistory extends RouterHistory = RouterHistory,
765755
TDehydrated extends Record<string, any> = Record<string, any>,
766-
const TSerializationAdapters extends
767-
ReadonlyArray<AnySerializationAdapter> = [],
768-
TDefaultSSR extends SSROption = SSROption,
769756
>(
770757
options: undefined extends number
771758
? 'strictNullChecks must be enabled in tsconfig.json'
@@ -774,18 +761,14 @@ export type CreateRouterFn = <
774761
TTrailingSlashOption,
775762
TDefaultStructuralSharingOption,
776763
TRouterHistory,
777-
TDehydrated,
778-
TSerializationAdapters,
779-
TDefaultSSR
764+
TDehydrated
780765
>,
781766
) => RouterCore<
782767
TRouteTree,
783768
TTrailingSlashOption,
784769
TDefaultStructuralSharingOption,
785770
TRouterHistory,
786-
TDehydrated,
787-
TSerializationAdapters,
788-
TDefaultSSR
771+
TDehydrated
789772
>
790773

791774
export class RouterCore<
@@ -794,8 +777,6 @@ export class RouterCore<
794777
in out TDefaultStructuralSharingOption extends boolean,
795778
in out TRouterHistory extends RouterHistory = RouterHistory,
796779
in out TDehydrated extends Record<string, any> = Record<string, any>,
797-
in out TSerializationAdapters = unknown,
798-
in out TDefaultSSR extends SSROption = SSROption,
799780
> {
800781
// Option-independent properties
801782
tempLocationKey: string | undefined = `${Math.round(
@@ -817,9 +798,7 @@ export class RouterCore<
817798
TTrailingSlashOption,
818799
TDefaultStructuralSharingOption,
819800
TRouterHistory,
820-
TDehydrated,
821-
TSerializationAdapters,
822-
TDefaultSSR
801+
TDehydrated
823802
>,
824803
'stringifySearch' | 'parseSearch' | 'context'
825804
>
@@ -842,9 +821,7 @@ export class RouterCore<
842821
TTrailingSlashOption,
843822
TDefaultStructuralSharingOption,
844823
TRouterHistory,
845-
TDehydrated,
846-
TSerializationAdapters,
847-
TDefaultSSR
824+
TDehydrated
848825
>,
849826
) {
850827
this.update({
@@ -882,9 +859,7 @@ export class RouterCore<
882859
TTrailingSlashOption,
883860
TDefaultStructuralSharingOption,
884861
TRouterHistory,
885-
TDehydrated,
886-
TSerializationAdapters,
887-
TDefaultSSR
862+
TDehydrated
888863
> = (newOptions) => {
889864
if (newOptions.notFoundRoute) {
890865
console.warn(

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type { Plugin, SerovalNode } from 'seroval'
44
import type { Register } from '../../router'
55
import type { LooseReturnType } from '../../utils'
66
import type { AnyRoute, ResolveAllSSR } from '../../route'
7+
import type { RouterConfig } from '../../config'
78

89
export type Serializable =
910
| number
@@ -166,7 +167,9 @@ export type RegisteredSerializableInput<TRegister extends Register> =
166167
: Serializable
167168

168169
export type RegisteredSerializationAdapters<TRegister extends Register> =
169-
NonNullable<TRegister['router']['options']['serializationAdapters']>
170+
TRegister['config'] extends RouterConfig<infer TSerializationAdapters, any>
171+
? TSerializationAdapters
172+
: never
170173

171174
export type ValidateSerializableInputResult<
172175
TRegister extends Register,
@@ -182,9 +185,10 @@ export type ValidateSerializableResult<T, TSerializable> =
182185
? ReadableStream
183186
: { [K in keyof T]: ValidateSerializableResult<T[K], TSerializable> }
184187

185-
export type RegisteredSSROption<TRegister extends Register> = NonNullable<
186-
TRegister['router']['options']['defaultSsr']
187-
>
188+
export type RegisteredSSROption<TRegister extends Register> =
189+
TRegister['config'] extends RouterConfig<any, infer TDefaultSsr>
190+
? TDefaultSsr
191+
: never
188192

189193
export type ValidateSerializableLifecycleResult<
190194
TRegister extends Register,
@@ -210,6 +214,6 @@ export type ValidateSerializableLifecycleResultSSR<
210214
> =
211215
ResolveAllSSR<TParentRoute, TSSR> extends false
212216
? any
213-
: TRegister['router']['options']['defaultSsr'] extends false
217+
: RegisteredSSROption<TRegister> extends false
214218
? any
215219
: ValidateSerializableInput<TRegister, LooseReturnType<TFn>>

packages/solid-router/src/router.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,26 +84,20 @@ export class Router<
8484
in out TDefaultStructuralSharingOption extends boolean = false,
8585
in out TRouterHistory extends RouterHistory = RouterHistory,
8686
in out TDehydrated extends Record<string, any> = Record<string, any>,
87-
in out TSerializationAdapters = unknown,
88-
in out TDefaultSSR extends SSROption = SSROption,
8987
> extends RouterCore<
9088
TRouteTree,
9189
TTrailingSlashOption,
9290
TDefaultStructuralSharingOption,
9391
TRouterHistory,
94-
TDehydrated,
95-
TSerializationAdapters,
96-
TDefaultSSR
92+
TDehydrated
9793
> {
9894
constructor(
9995
options: RouterConstructorOptions<
10096
TRouteTree,
10197
TTrailingSlashOption,
10298
TDefaultStructuralSharingOption,
10399
TRouterHistory,
104-
TDehydrated,
105-
TSerializationAdapters,
106-
TDefaultSSR
100+
TDehydrated
107101
>,
108102
) {
109103
super(options)

packages/solid-router/tests/router.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export function validateSearchParams<
4848
}
4949

5050
function createTestRouter(
51-
options?: RouterOptions<AnyRoute, 'never', any, any, any, any, any>,
51+
options?: RouterOptions<AnyRoute, 'never', any, any, any>,
5252
) {
5353
const rootRoute = createRootRoute({
5454
validateSearch: z.object({ root: z.string().optional() }),

0 commit comments

Comments
 (0)