@tanstack/react-router 1.92.1 → 1.92.6

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.
@@ -2,38 +2,101 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const utils = require("./utils.cjs");
4
4
  const defaultTransformer = {
5
- stringify: (value) => JSON.stringify(value, function replacer(key, value2) {
6
- const keyVal = this[key];
7
- const transformer = transformers.find((t) => t.stringifyCondition(keyVal));
5
+ stringify: (value) => JSON.stringify(value, function replacer(key, val) {
6
+ const ogVal = this[key];
7
+ const transformer = transformers.find((t) => t.stringifyCondition(ogVal));
8
8
  if (transformer) {
9
- return transformer.stringify(keyVal);
9
+ return transformer.stringify(ogVal);
10
10
  }
11
- return value2;
11
+ return val;
12
12
  }),
13
- parse: (value) => JSON.parse(value, function parser(key, value2) {
14
- const keyVal = this[key];
15
- const transformer = transformers.find((t) => t.parseCondition(keyVal));
13
+ parse: (value) => JSON.parse(value, function parser(key, val) {
14
+ const ogVal = this[key];
15
+ if (utils.isPlainObject(ogVal)) {
16
+ const transformer = transformers.find((t) => t.parseCondition(ogVal));
17
+ if (transformer) {
18
+ return transformer.parse(ogVal);
19
+ }
20
+ }
21
+ return val;
22
+ }),
23
+ encode: (value) => {
24
+ if (Array.isArray(value)) {
25
+ return value.map((v) => defaultTransformer.encode(v));
26
+ }
27
+ if (utils.isPlainObject(value)) {
28
+ return Object.fromEntries(
29
+ Object.entries(value).map(([key, v]) => [
30
+ key,
31
+ defaultTransformer.encode(v)
32
+ ])
33
+ );
34
+ }
35
+ const transformer = transformers.find((t) => t.stringifyCondition(value));
16
36
  if (transformer) {
17
- return transformer.parse(keyVal);
37
+ return transformer.stringify(value);
18
38
  }
19
- return value2;
20
- })
21
- };
22
- const transformers = [
23
- {
24
- // Dates
25
- stringifyCondition: (value) => value instanceof Date,
26
- stringify: (value) => ({ $date: value.toISOString() }),
27
- parseCondition: (value) => utils.isPlainObject(value) && value.$date,
28
- parse: (value) => new Date(value.$date)
39
+ return value;
29
40
  },
30
- {
31
- // undefined
32
- stringifyCondition: (value) => value === void 0,
33
- stringify: () => ({ $undefined: "" }),
34
- parseCondition: (value) => utils.isPlainObject(value) && value.$undefined === "",
35
- parse: () => void 0
41
+ decode: (value) => {
42
+ if (utils.isPlainObject(value)) {
43
+ const transformer = transformers.find((t) => t.parseCondition(value));
44
+ if (transformer) {
45
+ return transformer.parse(value);
46
+ }
47
+ }
48
+ if (Array.isArray(value)) {
49
+ return value.map((v) => defaultTransformer.decode(v));
50
+ }
51
+ if (utils.isPlainObject(value)) {
52
+ return Object.fromEntries(
53
+ Object.entries(value).map(([key, v]) => [
54
+ key,
55
+ defaultTransformer.decode(v)
56
+ ])
57
+ );
58
+ }
59
+ return value;
36
60
  }
61
+ };
62
+ const createTransformer = (key, check, toValue = (v) => v, fromValue = (v) => v) => ({
63
+ key,
64
+ stringifyCondition: check,
65
+ stringify: (value) => ({ [`$${key}`]: toValue(value) }),
66
+ parseCondition: (value) => Object.hasOwn(value, `$${key}`),
67
+ parse: (value) => fromValue(value[`$${key}`])
68
+ });
69
+ const transformers = [
70
+ createTransformer(
71
+ // Key
72
+ "undefined",
73
+ // Check
74
+ (v) => v === void 0,
75
+ // To
76
+ () => 0,
77
+ // From
78
+ () => void 0
79
+ ),
80
+ createTransformer(
81
+ // Key
82
+ "date",
83
+ // Check
84
+ (v) => v instanceof Date,
85
+ // To
86
+ (v) => v.toISOString(),
87
+ // From
88
+ (v) => new Date(v)
89
+ ),
90
+ createTransformer(
91
+ // Key
92
+ "error",
93
+ // Check
94
+ (v) => v instanceof Error,
95
+ // To
96
+ (v) => ({ ...v, message: v.message, stack: v.stack, cause: v.cause }),
97
+ // From
98
+ (v) => Object.assign(new Error(v.message), v)
99
+ )
37
100
  ];
38
101
  exports.defaultTransformer = defaultTransformer;
39
102
  //# sourceMappingURL=transformer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"transformer.cjs","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 React.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","isPlainObject"],"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,UAAeC,MAAAA,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,UACfA,oBAAc,KAAK,KAAK,MAAM,eAAe;AAAA,IAC/C,OAAO,MAAM;AAAA,EAAA;AAEjB;;"}
1
+ {"version":3,"file":"transformer.cjs","sources":["../../src/transformer.ts"],"sourcesContent":["import { isPlainObject } from './utils'\n\nexport interface RouterTransformer {\n stringify: (obj: unknown) => string\n parse: (str: string) => unknown\n encode: <T>(value: T) => T\n decode: <T>(value: T) => T\n}\n\nexport const defaultTransformer: RouterTransformer = {\n stringify: (value: any) =>\n JSON.stringify(value, function replacer(key, val) {\n const ogVal = this[key]\n const transformer = transformers.find((t) => t.stringifyCondition(ogVal))\n\n if (transformer) {\n return transformer.stringify(ogVal)\n }\n\n return val\n }),\n parse: (value: string) =>\n JSON.parse(value, function parser(key, val) {\n const ogVal = this[key]\n if (isPlainObject(ogVal)) {\n const transformer = transformers.find((t) => t.parseCondition(ogVal))\n\n if (transformer) {\n return transformer.parse(ogVal)\n }\n }\n\n return val\n }),\n encode: (value: any) => {\n // When encodign, dive first\n if (Array.isArray(value)) {\n return value.map((v) => defaultTransformer.encode(v))\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, v]) => [\n key,\n defaultTransformer.encode(v),\n ]),\n )\n }\n\n const transformer = transformers.find((t) => t.stringifyCondition(value))\n if (transformer) {\n return transformer.stringify(value)\n }\n\n return value\n },\n decode: (value: any) => {\n // Attempt transform first\n if (isPlainObject(value)) {\n const transformer = transformers.find((t) => t.parseCondition(value))\n if (transformer) {\n return transformer.parse(value)\n }\n }\n\n if (Array.isArray(value)) {\n return value.map((v) => defaultTransformer.decode(v))\n }\n\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([key, v]) => [\n key,\n defaultTransformer.decode(v),\n ]),\n )\n }\n\n return value\n },\n}\n\nconst createTransformer = <T extends string>(\n key: T,\n check: (value: any) => boolean,\n toValue: (value: any) => any = (v) => v,\n fromValue: (value: any) => any = (v) => v,\n) => ({\n key,\n stringifyCondition: check,\n stringify: (value: any) => ({ [`$${key}`]: toValue(value) }),\n parseCondition: (value: any) => Object.hasOwn(value, `$${key}`),\n parse: (value: any) => fromValue(value[`$${key}`]),\n})\n\n// Keep these ordered by predicted frequency\nconst transformers = [\n createTransformer(\n // Key\n 'undefined',\n // Check\n (v) => v === undefined,\n // To\n () => 0,\n // From\n () => undefined,\n ),\n createTransformer(\n // Key\n 'date',\n // Check\n (v) => v instanceof Date,\n // To\n (v) => v.toISOString(),\n // From\n (v) => new Date(v),\n ),\n createTransformer(\n // Key\n 'error',\n // Check\n (v) => v instanceof Error,\n // To\n (v) => ({ ...v, message: v.message, stack: v.stack, cause: v.cause }),\n // From\n (v) => Object.assign(new Error(v.message), v),\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 React.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":["isPlainObject"],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  export interface RouterTransformer {
2
2
  stringify: (obj: unknown) => string;
3
3
  parse: (str: string) => unknown;
4
+ encode: <T>(value: T) => T;
5
+ decode: <T>(value: T) => T;
4
6
  }
5
7
  export declare const defaultTransformer: RouterTransformer;
6
8
  export type TransformerStringify<T, TSerializable> = T extends TSerializable ? T : T extends (...args: Array<any>) => any ? 'Function is not serializable' : {
@@ -1,5 +1,5 @@
1
1
  import { createMemoryHistory, createBrowserHistory, parseHref } from "@tanstack/history";
2
- import { Store } from "@tanstack/react-store";
2
+ import { Store, batch } from "@tanstack/react-store";
3
3
  import invariant from "tiny-invariant";
4
4
  import warning from "tiny-warning";
5
5
  import { rootRouteId } from "./root.js";
@@ -630,7 +630,7 @@ class Router {
630
630
  const pathChanged = prevLocation.pathname !== next.pathname;
631
631
  this.cancelMatches();
632
632
  let pendingMatches;
633
- this.__store.batch(() => {
633
+ batch(() => {
634
634
  pendingMatches = this.matchRoutes(next);
635
635
  this.__store.setState((s) => ({
636
636
  ...s,
@@ -669,7 +669,7 @@ class Router {
669
669
  let exitingMatches;
670
670
  let enteringMatches;
671
671
  let stayingMatches;
672
- this.__store.batch(() => {
672
+ batch(() => {
673
673
  this.__store.setState((s) => {
674
674
  const previousMatches = s.matches;
675
675
  const newMatches = s.pendingMatches || s.matches;
@@ -1276,7 +1276,7 @@ class Router {
1276
1276
  ...activeMatchIds,
1277
1277
  ...this.state.cachedMatches.map((d) => d.id)
1278
1278
  ]);
1279
- this.__store.batch(() => {
1279
+ batch(() => {
1280
1280
  matches.forEach((match) => {
1281
1281
  if (!loadedMatchIds.has(match.id)) {
1282
1282
  this.__store.setState((s) => ({