@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.
- package/dist/cjs/router.cjs +3 -3
- package/dist/cjs/router.cjs.map +1 -1
- package/dist/cjs/transformer.cjs +88 -25
- package/dist/cjs/transformer.cjs.map +1 -1
- package/dist/cjs/transformer.d.cts +2 -0
- package/dist/esm/router.js +4 -4
- package/dist/esm/router.js.map +1 -1
- package/dist/esm/transformer.d.ts +2 -0
- package/dist/esm/transformer.js +88 -25
- package/dist/esm/transformer.js.map +1 -1
- package/package.json +2 -2
- package/src/router.ts +4 -4
- package/src/transformer.ts +105 -26
package/dist/cjs/transformer.cjs
CHANGED
|
@@ -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,
|
|
6
|
-
const
|
|
7
|
-
const transformer = transformers.find((t) => t.stringifyCondition(
|
|
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(
|
|
9
|
+
return transformer.stringify(ogVal);
|
|
10
10
|
}
|
|
11
|
-
return
|
|
11
|
+
return val;
|
|
12
12
|
}),
|
|
13
|
-
parse: (value) => JSON.parse(value, function parser(key,
|
|
14
|
-
const
|
|
15
|
-
|
|
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.
|
|
37
|
+
return transformer.stringify(value);
|
|
18
38
|
}
|
|
19
|
-
return
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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,
|
|
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":";;;AASO,MAAM,qBAAwC;AAAA,EACnD,WAAW,CAAC,UACV,KAAK,UAAU,OAAO,SAAS,SAAS,KAAK,KAAK;AAC1C,UAAA,QAAQ,KAAK,GAAG;AAChB,UAAA,cAAc,aAAa,KAAK,CAAC,MAAM,EAAE,mBAAmB,KAAK,CAAC;AAExE,QAAI,aAAa;AACR,aAAA,YAAY,UAAU,KAAK;AAAA,IAAA;AAG7B,WAAA;AAAA,EAAA,CACR;AAAA,EACH,OAAO,CAAC,UACN,KAAK,MAAM,OAAO,SAAS,OAAO,KAAK,KAAK;AACpC,UAAA,QAAQ,KAAK,GAAG;AAClB,QAAAA,MAAAA,cAAc,KAAK,GAAG;AAClB,YAAA,cAAc,aAAa,KAAK,CAAC,MAAM,EAAE,eAAe,KAAK,CAAC;AAEpE,UAAI,aAAa;AACR,eAAA,YAAY,MAAM,KAAK;AAAA,MAAA;AAAA,IAChC;AAGK,WAAA;AAAA,EAAA,CACR;AAAA,EACH,QAAQ,CAAC,UAAe;AAElB,QAAA,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAO,MAAM,IAAI,CAAC,MAAM,mBAAmB,OAAO,CAAC,CAAC;AAAA,IAAA;AAGlD,QAAAA,MAAAA,cAAc,KAAK,GAAG;AACxB,aAAO,OAAO;AAAA,QACZ,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM;AAAA,UACtC;AAAA,UACA,mBAAmB,OAAO,CAAC;AAAA,QAC5B,CAAA;AAAA,MACH;AAAA,IAAA;AAGI,UAAA,cAAc,aAAa,KAAK,CAAC,MAAM,EAAE,mBAAmB,KAAK,CAAC;AACxE,QAAI,aAAa;AACR,aAAA,YAAY,UAAU,KAAK;AAAA,IAAA;AAG7B,WAAA;AAAA,EACT;AAAA,EACA,QAAQ,CAAC,UAAe;AAElB,QAAAA,MAAAA,cAAc,KAAK,GAAG;AAClB,YAAA,cAAc,aAAa,KAAK,CAAC,MAAM,EAAE,eAAe,KAAK,CAAC;AACpE,UAAI,aAAa;AACR,eAAA,YAAY,MAAM,KAAK;AAAA,MAAA;AAAA,IAChC;AAGE,QAAA,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAO,MAAM,IAAI,CAAC,MAAM,mBAAmB,OAAO,CAAC,CAAC;AAAA,IAAA;AAGlD,QAAAA,MAAAA,cAAc,KAAK,GAAG;AACxB,aAAO,OAAO;AAAA,QACZ,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM;AAAA,UACtC;AAAA,UACA,mBAAmB,OAAO,CAAC;AAAA,QAC5B,CAAA;AAAA,MACH;AAAA,IAAA;AAGK,WAAA;AAAA,EAAA;AAEX;AAEA,MAAM,oBAAoB,CACxB,KACA,OACA,UAA+B,CAAC,MAAM,GACtC,YAAiC,CAAC,MAAM,OACpC;AAAA,EACJ;AAAA,EACA,oBAAoB;AAAA,EACpB,WAAW,CAAC,WAAgB,EAAE,CAAC,IAAI,GAAG,EAAE,GAAG,QAAQ,KAAK;EACxD,gBAAgB,CAAC,UAAe,OAAO,OAAO,OAAO,IAAI,GAAG,EAAE;AAAA,EAC9D,OAAO,CAAC,UAAe,UAAU,MAAM,IAAI,GAAG,EAAE,CAAC;AACnD;AAGA,MAAM,eAAe;AAAA,EACnB;AAAA;AAAA,IAEE;AAAA;AAAA,IAEA,CAAC,MAAM,MAAM;AAAA;AAAA,IAEb,MAAM;AAAA;AAAA,IAEN,MAAM;AAAA,EACR;AAAA,EACA;AAAA;AAAA,IAEE;AAAA;AAAA,IAEA,CAAC,MAAM,aAAa;AAAA;AAAA,IAEpB,CAAC,MAAM,EAAE,YAAY;AAAA;AAAA,IAErB,CAAC,MAAM,IAAI,KAAK,CAAC;AAAA,EACnB;AAAA,EACA;AAAA;AAAA,IAEE;AAAA;AAAA,IAEA,CAAC,MAAM,aAAa;AAAA;AAAA,IAEpB,CAAC,OAAO,EAAE,GAAG,GAAG,SAAS,EAAE,SAAS,OAAO,EAAE,OAAO,OAAO,EAAE,MAAM;AAAA;AAAA,IAEnE,CAAC,MAAM,OAAO,OAAO,IAAI,MAAM,EAAE,OAAO,GAAG,CAAC;AAAA,EAAA;AAEhD;;"}
|
|
@@ -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' : {
|
package/dist/esm/router.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1279
|
+
batch(() => {
|
|
1280
1280
|
matches.forEach((match) => {
|
|
1281
1281
|
if (!loadedMatchIds.has(match.id)) {
|
|
1282
1282
|
this.__store.setState((s) => ({
|