@tanstack/react-router 1.82.1 → 1.82.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,3 +3,11 @@ export interface RouterTransformer {
3
3
  parse: (str: string) => unknown;
4
4
  }
5
5
  export declare const defaultTransformer: RouterTransformer;
6
+ export type TransformerStringify<T, TSerializable> = T extends TSerializable ? T : T extends (...args: Array<any>) => any ? 'Function is not serializable' : {
7
+ [K in keyof T]: TransformerStringify<T[K], TSerializable>;
8
+ };
9
+ export type TransformerParse<T, TSerializable> = T extends TSerializable ? T : T extends JSX.Element ? ReadableStream : {
10
+ [K in keyof T]: TransformerParse<T[K], TSerializable>;
11
+ };
12
+ export type DefaultTransformerStringify<T> = TransformerStringify<T, Date | undefined>;
13
+ export type DefaultTransformerParse<T> = TransformerParse<T, Date | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"transformer.js","sources":["../../src/transformer.ts"],"sourcesContent":["import { isPlainObject } from './utils'\n\nexport interface RouterTransformer {\n stringify: (obj: unknown) => string\n parse: (str: string) => unknown\n}\n\nexport const defaultTransformer: RouterTransformer = {\n stringify: (value: any) =>\n JSON.stringify(value, function replacer(key, value) {\n const keyVal = this[key]\n const transformer = transformers.find((t) => t.stringifyCondition(keyVal))\n\n if (transformer) {\n return transformer.stringify(keyVal)\n }\n\n return value\n }),\n parse: (value: string) =>\n JSON.parse(value, function parser(key, value) {\n const keyVal = this[key]\n const transformer = transformers.find((t) => t.parseCondition(keyVal))\n\n if (transformer) {\n return transformer.parse(keyVal)\n }\n\n return value\n }),\n}\n\nconst transformers = [\n {\n // Dates\n stringifyCondition: (value: any) => value instanceof Date,\n stringify: (value: any) => ({ $date: value.toISOString() }),\n parseCondition: (value: any) => isPlainObject(value) && value.$date,\n parse: (value: any) => new Date(value.$date),\n },\n {\n // undefined\n stringifyCondition: (value: any) => value === undefined,\n stringify: () => ({ $undefined: '' }),\n parseCondition: (value: any) =>\n isPlainObject(value) && value.$undefined === '',\n parse: () => undefined,\n },\n] as const\n"],"names":["value"],"mappings":";AAOO,MAAM,qBAAwC;AAAA,EACnD,WAAW,CAAC,UACV,KAAK,UAAU,OAAO,SAAS,SAAS,KAAKA,QAAO;AAC5C,UAAA,SAAS,KAAK,GAAG;AACjB,UAAA,cAAc,aAAa,KAAK,CAAC,MAAM,EAAE,mBAAmB,MAAM,CAAC;AAEzE,QAAI,aAAa;AACR,aAAA,YAAY,UAAU,MAAM;AAAA,IAAA;AAG9BA,WAAAA;AAAAA,EAAA,CACR;AAAA,EACH,OAAO,CAAC,UACN,KAAK,MAAM,OAAO,SAAS,OAAO,KAAKA,QAAO;AACtC,UAAA,SAAS,KAAK,GAAG;AACjB,UAAA,cAAc,aAAa,KAAK,CAAC,MAAM,EAAE,eAAe,MAAM,CAAC;AAErE,QAAI,aAAa;AACR,aAAA,YAAY,MAAM,MAAM;AAAA,IAAA;AAG1BA,WAAAA;AAAAA,EACR,CAAA;AACL;AAEA,MAAM,eAAe;AAAA,EACnB;AAAA;AAAA,IAEE,oBAAoB,CAAC,UAAe,iBAAiB;AAAA,IACrD,WAAW,CAAC,WAAgB,EAAE,OAAO,MAAM;IAC3C,gBAAgB,CAAC,UAAe,cAAc,KAAK,KAAK,MAAM;AAAA,IAC9D,OAAO,CAAC,UAAe,IAAI,KAAK,MAAM,KAAK;AAAA,EAC7C;AAAA,EACA;AAAA;AAAA,IAEE,oBAAoB,CAAC,UAAe,UAAU;AAAA,IAC9C,WAAW,OAAO,EAAE,YAAY;IAChC,gBAAgB,CAAC,UACf,cAAc,KAAK,KAAK,MAAM,eAAe;AAAA,IAC/C,OAAO,MAAM;AAAA,EAAA;AAEjB;"}
1
+ {"version":3,"file":"transformer.js","sources":["../../src/transformer.ts"],"sourcesContent":["import { isPlainObject } from './utils'\n\nexport interface RouterTransformer {\n stringify: (obj: unknown) => string\n parse: (str: string) => unknown\n}\n\nexport const defaultTransformer: RouterTransformer = {\n stringify: (value: any) =>\n JSON.stringify(value, function replacer(key, value) {\n const keyVal = this[key]\n const transformer = transformers.find((t) => t.stringifyCondition(keyVal))\n\n if (transformer) {\n return transformer.stringify(keyVal)\n }\n\n return value\n }),\n parse: (value: string) =>\n JSON.parse(value, function parser(key, value) {\n const keyVal = this[key]\n const transformer = transformers.find((t) => t.parseCondition(keyVal))\n\n if (transformer) {\n return transformer.parse(keyVal)\n }\n\n return value\n }),\n}\n\nconst transformers = [\n {\n // Dates\n stringifyCondition: (value: any) => value instanceof Date,\n stringify: (value: any) => ({ $date: value.toISOString() }),\n parseCondition: (value: any) => isPlainObject(value) && value.$date,\n parse: (value: any) => new Date(value.$date),\n },\n {\n // undefined\n stringifyCondition: (value: any) => value === undefined,\n stringify: () => ({ $undefined: '' }),\n parseCondition: (value: any) =>\n isPlainObject(value) && value.$undefined === '',\n parse: () => undefined,\n },\n] as const\n\nexport type TransformerStringify<T, TSerializable> = T extends TSerializable\n ? T\n : T extends (...args: Array<any>) => any\n ? 'Function is not serializable'\n : { [K in keyof T]: TransformerStringify<T[K], TSerializable> }\n\nexport type TransformerParse<T, TSerializable> = T extends TSerializable\n ? T\n : T extends JSX.Element\n ? ReadableStream\n : { [K in keyof T]: TransformerParse<T[K], TSerializable> }\n\nexport type DefaultTransformerStringify<T> = TransformerStringify<\n T,\n Date | undefined\n>\n\nexport type DefaultTransformerParse<T> = TransformerParse<T, Date | undefined>\n"],"names":["value"],"mappings":";AAOO,MAAM,qBAAwC;AAAA,EACnD,WAAW,CAAC,UACV,KAAK,UAAU,OAAO,SAAS,SAAS,KAAKA,QAAO;AAC5C,UAAA,SAAS,KAAK,GAAG;AACjB,UAAA,cAAc,aAAa,KAAK,CAAC,MAAM,EAAE,mBAAmB,MAAM,CAAC;AAEzE,QAAI,aAAa;AACR,aAAA,YAAY,UAAU,MAAM;AAAA,IAAA;AAG9BA,WAAAA;AAAAA,EAAA,CACR;AAAA,EACH,OAAO,CAAC,UACN,KAAK,MAAM,OAAO,SAAS,OAAO,KAAKA,QAAO;AACtC,UAAA,SAAS,KAAK,GAAG;AACjB,UAAA,cAAc,aAAa,KAAK,CAAC,MAAM,EAAE,eAAe,MAAM,CAAC;AAErE,QAAI,aAAa;AACR,aAAA,YAAY,MAAM,MAAM;AAAA,IAAA;AAG1BA,WAAAA;AAAAA,EACR,CAAA;AACL;AAEA,MAAM,eAAe;AAAA,EACnB;AAAA;AAAA,IAEE,oBAAoB,CAAC,UAAe,iBAAiB;AAAA,IACrD,WAAW,CAAC,WAAgB,EAAE,OAAO,MAAM;IAC3C,gBAAgB,CAAC,UAAe,cAAc,KAAK,KAAK,MAAM;AAAA,IAC9D,OAAO,CAAC,UAAe,IAAI,KAAK,MAAM,KAAK;AAAA,EAC7C;AAAA,EACA;AAAA;AAAA,IAEE,oBAAoB,CAAC,UAAe,UAAU;AAAA,IAC9C,WAAW,OAAO,EAAE,YAAY;IAChC,gBAAgB,CAAC,UACf,cAAc,KAAK,KAAK,MAAM,eAAe;AAAA,IAC/C,OAAO,MAAM;AAAA,EAAA;AAEjB;"}
@@ -43,7 +43,9 @@ export type Validator<TInput, TOutput> = ValidatorObj<TInput, TOutput> | Validat
43
43
  export type AnyValidator = Validator<any, any>;
44
44
  export type AnySchema = {};
45
45
  export type DefaultValidator = Validator<Record<string, unknown>, AnySchema>;
46
- export type ResolveValidatorInputFn<TValidator> = TValidator extends (input: infer TSchemaInput) => any ? TSchemaInput extends SearchSchemaInput ? Omit<TSchemaInput, keyof SearchSchemaInput> : ResolveValidatorOutputFn<TValidator> : AnySchema;
46
+ export type ResolveSearchValidatorInputFn<TValidator> = TValidator extends (input: infer TSchemaInput) => any ? TSchemaInput extends SearchSchemaInput ? Omit<TSchemaInput, keyof SearchSchemaInput> : ResolveValidatorOutputFn<TValidator> : AnySchema;
47
+ export type ResolveSearchValidatorInput<TValidator> = TValidator extends AnyStandardSchemaValidator ? NonNullable<TValidator['~standard']['types']>['input'] : TValidator extends AnyValidatorAdapter ? TValidator['types']['input'] : TValidator extends AnyValidatorObj ? ResolveSearchValidatorInputFn<TValidator['parse']> : ResolveSearchValidatorInputFn<TValidator>;
48
+ export type ResolveValidatorInputFn<TValidator> = TValidator extends (input: infer TInput) => any ? TInput : undefined;
47
49
  export type ResolveValidatorInput<TValidator> = TValidator extends AnyStandardSchemaValidator ? NonNullable<TValidator['~standard']['types']>['input'] : TValidator extends AnyValidatorAdapter ? TValidator['types']['input'] : TValidator extends AnyValidatorObj ? ResolveValidatorInputFn<TValidator['parse']> : ResolveValidatorInputFn<TValidator>;
48
50
  export type ResolveValidatorOutputFn<TValidator> = TValidator extends (...args: any) => infer TSchema ? TSchema : AnySchema;
49
51
  export type ResolveValidatorOutput<TValidator> = unknown extends TValidator ? TValidator : TValidator extends AnyStandardSchemaValidator ? NonNullable<TValidator['~standard']['types']>['output'] : TValidator extends AnyValidatorAdapter ? TValidator['types']['output'] : TValidator extends AnyValidatorObj ? ResolveValidatorOutputFn<TValidator['parse']> : ResolveValidatorOutputFn<TValidator>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/react-router",
3
- "version": "1.82.1",
3
+ "version": "1.82.8",
4
4
  "description": "Modern and scalable routing for React applications",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
package/src/index.tsx CHANGED
@@ -290,7 +290,13 @@ export {
290
290
  export type { SearchSerializer, SearchParser } from './searchParams'
291
291
 
292
292
  export { defaultTransformer } from './transformer'
293
- export type { RouterTransformer } from './transformer'
293
+ export type {
294
+ RouterTransformer,
295
+ TransformerParse,
296
+ TransformerStringify,
297
+ DefaultTransformerParse,
298
+ DefaultTransformerStringify,
299
+ } from './transformer'
294
300
 
295
301
  export { useBlocker, Block } from './useBlocker'
296
302
 
@@ -351,6 +357,8 @@ export type {
351
357
  AnyValidatorObj,
352
358
  ResolveValidatorInputFn,
353
359
  ResolveValidatorOutputFn,
360
+ ResolveSearchValidatorInput,
361
+ ResolveSearchValidatorInputFn,
354
362
  Validator,
355
363
  ValidatorAdapter,
356
364
  ValidatorObj,
package/src/route.ts CHANGED
@@ -37,7 +37,7 @@ import type {
37
37
  AnyValidatorAdapter,
38
38
  AnyValidatorObj,
39
39
  DefaultValidator,
40
- ResolveValidatorInput,
40
+ ResolveSearchValidatorInput,
41
41
  ResolveValidatorOutput,
42
42
  StandardSchemaValidator,
43
43
  ValidatorAdapter,
@@ -679,7 +679,7 @@ export type ResolveFullSearchSchemaInput<
679
679
  TSearchValidator,
680
680
  > = Assign<
681
681
  InferFullSearchSchemaInput<TParentRoute>,
682
- ResolveValidatorInput<TSearchValidator>
682
+ ResolveSearchValidatorInput<TSearchValidator>
683
683
  >
684
684
 
685
685
  export type LooseReturnType<T> = T extends (
@@ -988,7 +988,7 @@ export class Route<
988
988
  customId: TCustomId
989
989
  id: TId
990
990
  searchSchema: ResolveValidatorOutput<TSearchValidator>
991
- searchSchemaInput: ResolveValidatorInput<TSearchValidator>
991
+ searchSchemaInput: ResolveSearchValidatorInput<TSearchValidator>
992
992
  searchValidator: TSearchValidator
993
993
  fullSearchSchema: ResolveFullSearchSchema<TParentRoute, TSearchValidator>
994
994
  fullSearchSchemaInput: ResolveFullSearchSchemaInput<
package/src/router.ts CHANGED
@@ -584,12 +584,13 @@ function validateSearch(validateSearch: AnyValidator, input: unknown): unknown {
584
584
  if ('~standard' in validateSearch) {
585
585
  const result = validateSearch['~standard'].validate(input)
586
586
 
587
- if ('value' in result) return result.value
588
-
589
587
  if (result instanceof Promise)
590
588
  throw new SearchParamError('Async validation not supported')
591
589
 
592
- throw new SearchParamError(JSON.stringify(result.issues, undefined, 2))
590
+ if (result.issues)
591
+ throw new SearchParamError(JSON.stringify(result.issues, undefined, 2))
592
+
593
+ return result.value
593
594
  }
594
595
 
595
596
  if ('parse' in validateSearch) {
@@ -47,3 +47,22 @@ const transformers = [
47
47
  parse: () => undefined,
48
48
  },
49
49
  ] as const
50
+
51
+ export type TransformerStringify<T, TSerializable> = T extends TSerializable
52
+ ? T
53
+ : T extends (...args: Array<any>) => any
54
+ ? 'Function is not serializable'
55
+ : { [K in keyof T]: TransformerStringify<T[K], TSerializable> }
56
+
57
+ export type TransformerParse<T, TSerializable> = T extends TSerializable
58
+ ? T
59
+ : T extends JSX.Element
60
+ ? ReadableStream
61
+ : { [K in keyof T]: TransformerParse<T[K], TSerializable> }
62
+
63
+ export type DefaultTransformerStringify<T> = TransformerStringify<
64
+ T,
65
+ Date | undefined
66
+ >
67
+
68
+ export type DefaultTransformerParse<T> = TransformerParse<T, Date | undefined>
package/src/validators.ts CHANGED
@@ -72,7 +72,7 @@ export type AnySchema = {}
72
72
 
73
73
  export type DefaultValidator = Validator<Record<string, unknown>, AnySchema>
74
74
 
75
- export type ResolveValidatorInputFn<TValidator> = TValidator extends (
75
+ export type ResolveSearchValidatorInputFn<TValidator> = TValidator extends (
76
76
  input: infer TSchemaInput,
77
77
  ) => any
78
78
  ? TSchemaInput extends SearchSchemaInput
@@ -80,6 +80,21 @@ export type ResolveValidatorInputFn<TValidator> = TValidator extends (
80
80
  : ResolveValidatorOutputFn<TValidator>
81
81
  : AnySchema
82
82
 
83
+ export type ResolveSearchValidatorInput<TValidator> =
84
+ TValidator extends AnyStandardSchemaValidator
85
+ ? NonNullable<TValidator['~standard']['types']>['input']
86
+ : TValidator extends AnyValidatorAdapter
87
+ ? TValidator['types']['input']
88
+ : TValidator extends AnyValidatorObj
89
+ ? ResolveSearchValidatorInputFn<TValidator['parse']>
90
+ : ResolveSearchValidatorInputFn<TValidator>
91
+
92
+ export type ResolveValidatorInputFn<TValidator> = TValidator extends (
93
+ input: infer TInput,
94
+ ) => any
95
+ ? TInput
96
+ : undefined
97
+
83
98
  export type ResolveValidatorInput<TValidator> =
84
99
  TValidator extends AnyStandardSchemaValidator
85
100
  ? NonNullable<TValidator['~standard']['types']>['input']