@tanstack/react-router 1.97.14 → 1.97.16
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/Match.cjs +8 -24
- package/dist/cjs/Match.cjs.map +1 -1
- package/dist/cjs/Matches.cjs +1 -1
- package/dist/cjs/Matches.cjs.map +1 -1
- package/dist/cjs/RouterProvider.cjs.map +1 -1
- package/dist/cjs/RouterProvider.d.cts +0 -1
- package/dist/cjs/ScriptOnce.cjs +1 -8
- package/dist/cjs/ScriptOnce.cjs.map +1 -1
- package/dist/cjs/ScriptOnce.d.cts +1 -1
- package/dist/cjs/Transitioner.cjs +1 -2
- package/dist/cjs/Transitioner.cjs.map +1 -1
- package/dist/cjs/awaited.cjs +1 -22
- package/dist/cjs/awaited.cjs.map +1 -1
- package/dist/cjs/index.cjs +2 -7
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +4 -6
- package/dist/cjs/router.cjs +11 -129
- package/dist/cjs/router.cjs.map +1 -1
- package/dist/cjs/router.d.cts +33 -93
- package/dist/cjs/routerContext.cjs.map +1 -1
- package/dist/cjs/routerContext.d.cts +7 -2
- package/dist/cjs/serializer.d.cts +15 -0
- package/dist/esm/Match.js +9 -25
- package/dist/esm/Match.js.map +1 -1
- package/dist/esm/Matches.js +1 -1
- package/dist/esm/Matches.js.map +1 -1
- package/dist/esm/RouterProvider.d.ts +0 -1
- package/dist/esm/RouterProvider.js.map +1 -1
- package/dist/esm/ScriptOnce.d.ts +1 -1
- package/dist/esm/ScriptOnce.js +1 -8
- package/dist/esm/ScriptOnce.js.map +1 -1
- package/dist/esm/Transitioner.js +1 -2
- package/dist/esm/Transitioner.js.map +1 -1
- package/dist/esm/awaited.js +1 -22
- package/dist/esm/awaited.js.map +1 -1
- package/dist/esm/index.d.ts +4 -6
- package/dist/esm/index.js +1 -6
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/router.d.ts +33 -93
- package/dist/esm/router.js +11 -129
- package/dist/esm/router.js.map +1 -1
- package/dist/esm/routerContext.d.ts +7 -2
- package/dist/esm/routerContext.js.map +1 -1
- package/dist/esm/serializer.d.ts +15 -0
- package/package.json +1 -1
- package/src/Match.tsx +4 -29
- package/src/Matches.tsx +1 -1
- package/src/RouterProvider.tsx +3 -3
- package/src/ScriptOnce.tsx +0 -8
- package/src/Transitioner.tsx +1 -1
- package/src/awaited.tsx +3 -25
- package/src/index.tsx +12 -34
- package/src/router.ts +44 -271
- package/src/routerContext.tsx +7 -1
- package/src/serializer.ts +24 -0
- package/dist/cjs/isServerSideError.cjs +0 -22
- package/dist/cjs/isServerSideError.cjs.map +0 -1
- package/dist/cjs/isServerSideError.d.cts +0 -5
- package/dist/cjs/transformer.cjs +0 -137
- package/dist/cjs/transformer.cjs.map +0 -1
- package/dist/cjs/transformer.d.cts +0 -16
- package/dist/esm/isServerSideError.d.ts +0 -5
- package/dist/esm/isServerSideError.js +0 -22
- package/dist/esm/isServerSideError.js.map +0 -1
- package/dist/esm/transformer.d.ts +0 -16
- package/dist/esm/transformer.js +0 -137
- package/dist/esm/transformer.js.map +0 -1
- package/src/isServerSideError.tsx +0 -23
- package/src/transformer.ts +0 -192
package/dist/cjs/transformer.cjs
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const utils = require("./utils.cjs");
|
|
4
|
-
const defaultTransformer = {
|
|
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
|
-
if (transformer) {
|
|
9
|
-
return transformer.stringify(ogVal);
|
|
10
|
-
}
|
|
11
|
-
return val;
|
|
12
|
-
}),
|
|
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));
|
|
36
|
-
if (transformer) {
|
|
37
|
-
return transformer.stringify(value);
|
|
38
|
-
}
|
|
39
|
-
return value;
|
|
40
|
-
},
|
|
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;
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
const createTransformer = (key, check, toValue, fromValue) => ({
|
|
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
|
-
),
|
|
100
|
-
createTransformer(
|
|
101
|
-
// Key
|
|
102
|
-
"formData",
|
|
103
|
-
// Check
|
|
104
|
-
(v) => v instanceof FormData,
|
|
105
|
-
// To
|
|
106
|
-
(v) => {
|
|
107
|
-
const entries = {};
|
|
108
|
-
v.forEach((value, key) => {
|
|
109
|
-
const entry = entries[key];
|
|
110
|
-
if (entry !== void 0) {
|
|
111
|
-
if (Array.isArray(entry)) {
|
|
112
|
-
entry.push(value);
|
|
113
|
-
} else {
|
|
114
|
-
entries[key] = [entry, value];
|
|
115
|
-
}
|
|
116
|
-
} else {
|
|
117
|
-
entries[key] = value;
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
return entries;
|
|
121
|
-
},
|
|
122
|
-
// From
|
|
123
|
-
(v) => {
|
|
124
|
-
const formData = new FormData();
|
|
125
|
-
Object.entries(v).forEach(([key, value]) => {
|
|
126
|
-
if (Array.isArray(value)) {
|
|
127
|
-
value.forEach((val) => formData.append(key, val));
|
|
128
|
-
} else {
|
|
129
|
-
formData.append(key, value);
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
return formData;
|
|
133
|
-
}
|
|
134
|
-
)
|
|
135
|
-
];
|
|
136
|
-
exports.defaultTransformer = defaultTransformer;
|
|
137
|
-
//# sourceMappingURL=transformer.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
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 encoding, 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 = <TKey extends string, TInput, TSerialized>(\n key: TKey,\n check: (value: any) => value is TInput,\n toValue: (value: TInput) => TSerialized,\n fromValue: (value: TSerialized) => TInput,\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\n// Make sure to keep DefaultSerializeable in sync with these transformers\n// Also, make sure that they are unit tested in transformer.test.tsx\nconst transformers = [\n createTransformer(\n // Key\n 'undefined',\n // Check\n (v): v is undefined => v === undefined,\n // To\n () => 0,\n // From\n () => undefined,\n ),\n createTransformer(\n // Key\n 'date',\n // Check\n (v): v is Date => 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 is Error => 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 createTransformer(\n // Key\n 'formData',\n // Check\n (v): v is FormData => v instanceof FormData,\n // To\n (v) => {\n const entries: Record<\n string,\n Array<FormDataEntryValue> | FormDataEntryValue\n > = {}\n v.forEach((value, key) => {\n const entry = entries[key]\n if (entry !== undefined) {\n if (Array.isArray(entry)) {\n entry.push(value)\n } else {\n entries[key] = [entry, value]\n }\n } else {\n entries[key] = value\n }\n })\n return entries\n },\n // From\n (v) => {\n const formData = new FormData()\n Object.entries(v).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n value.forEach((val) => formData.append(key, val))\n } else {\n formData.append(key, value)\n }\n })\n return formData\n },\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 DefaultSerializable = Date | undefined | Error | FormData\n\nexport type DefaultTransformerStringify<T> = TransformerStringify<\n T,\n DefaultSerializable\n>\n\nexport type DefaultTransformerParse<T> = TransformerParse<\n T,\n DefaultSerializable\n>\n"],"names":["isPlainObject"],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export interface RouterTransformer {
|
|
2
|
-
stringify: (obj: unknown) => string;
|
|
3
|
-
parse: (str: string) => unknown;
|
|
4
|
-
encode: <T>(value: T) => T;
|
|
5
|
-
decode: <T>(value: T) => T;
|
|
6
|
-
}
|
|
7
|
-
export declare const defaultTransformer: RouterTransformer;
|
|
8
|
-
export type TransformerStringify<T, TSerializable> = T extends TSerializable ? T : T extends (...args: Array<any>) => any ? 'Function is not serializable' : {
|
|
9
|
-
[K in keyof T]: TransformerStringify<T[K], TSerializable>;
|
|
10
|
-
};
|
|
11
|
-
export type TransformerParse<T, TSerializable> = T extends TSerializable ? T : T extends React.JSX.Element ? ReadableStream : {
|
|
12
|
-
[K in keyof T]: TransformerParse<T[K], TSerializable>;
|
|
13
|
-
};
|
|
14
|
-
export type DefaultSerializable = Date | undefined | Error | FormData;
|
|
15
|
-
export type DefaultTransformerStringify<T> = TransformerStringify<T, DefaultSerializable>;
|
|
16
|
-
export type DefaultTransformerParse<T> = TransformerParse<T, DefaultSerializable>;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
function isServerSideError(error) {
|
|
2
|
-
if (!(typeof error === "object" && error && "data" in error)) return false;
|
|
3
|
-
if (!("__isServerError" in error && error.__isServerError)) return false;
|
|
4
|
-
if (!(typeof error.data === "object" && error.data)) return false;
|
|
5
|
-
return error.__isServerError === true;
|
|
6
|
-
}
|
|
7
|
-
function defaultDeserializeError(serializedData) {
|
|
8
|
-
if ("name" in serializedData && "message" in serializedData) {
|
|
9
|
-
const error = new Error(serializedData.message);
|
|
10
|
-
error.name = serializedData.name;
|
|
11
|
-
if (process.env.NODE_ENV === "development") {
|
|
12
|
-
error.stack = serializedData.stack;
|
|
13
|
-
}
|
|
14
|
-
return error;
|
|
15
|
-
}
|
|
16
|
-
return serializedData.data;
|
|
17
|
-
}
|
|
18
|
-
export {
|
|
19
|
-
defaultDeserializeError,
|
|
20
|
-
isServerSideError
|
|
21
|
-
};
|
|
22
|
-
//# sourceMappingURL=isServerSideError.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"isServerSideError.js","sources":["../../src/isServerSideError.tsx"],"sourcesContent":["export function isServerSideError(error: unknown): error is {\n __isServerError: true\n data: Record<string, any>\n} {\n if (!(typeof error === 'object' && error && 'data' in error)) return false\n if (!('__isServerError' in error && error.__isServerError)) return false\n if (!(typeof error.data === 'object' && error.data)) return false\n\n return error.__isServerError === true\n}\n\nexport function defaultDeserializeError(serializedData: Record<string, any>) {\n if ('name' in serializedData && 'message' in serializedData) {\n const error = new Error(serializedData.message)\n error.name = serializedData.name\n if (process.env.NODE_ENV === 'development') {\n error.stack = serializedData.stack\n }\n return error\n }\n\n return serializedData.data\n}\n"],"names":[],"mappings":"AAAO,SAAS,kBAAkB,OAGhC;AACA,MAAI,EAAE,OAAO,UAAU,YAAY,SAAS,UAAU,OAAe,QAAA;AACrE,MAAI,EAAE,qBAAqB,SAAS,MAAM,iBAAyB,QAAA;AACnE,MAAI,EAAE,OAAO,MAAM,SAAS,YAAY,MAAM,MAAc,QAAA;AAE5D,SAAO,MAAM,oBAAoB;AACnC;AAEO,SAAS,wBAAwB,gBAAqC;AACvE,MAAA,UAAU,kBAAkB,aAAa,gBAAgB;AAC3D,UAAM,QAAQ,IAAI,MAAM,eAAe,OAAO;AAC9C,UAAM,OAAO,eAAe;AACxB,QAAA,QAAQ,IAAI,aAAa,eAAe;AAC1C,YAAM,QAAQ,eAAe;AAAA,IAAA;AAExB,WAAA;AAAA,EAAA;AAGT,SAAO,eAAe;AACxB;"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export interface RouterTransformer {
|
|
2
|
-
stringify: (obj: unknown) => string;
|
|
3
|
-
parse: (str: string) => unknown;
|
|
4
|
-
encode: <T>(value: T) => T;
|
|
5
|
-
decode: <T>(value: T) => T;
|
|
6
|
-
}
|
|
7
|
-
export declare const defaultTransformer: RouterTransformer;
|
|
8
|
-
export type TransformerStringify<T, TSerializable> = T extends TSerializable ? T : T extends (...args: Array<any>) => any ? 'Function is not serializable' : {
|
|
9
|
-
[K in keyof T]: TransformerStringify<T[K], TSerializable>;
|
|
10
|
-
};
|
|
11
|
-
export type TransformerParse<T, TSerializable> = T extends TSerializable ? T : T extends React.JSX.Element ? ReadableStream : {
|
|
12
|
-
[K in keyof T]: TransformerParse<T[K], TSerializable>;
|
|
13
|
-
};
|
|
14
|
-
export type DefaultSerializable = Date | undefined | Error | FormData;
|
|
15
|
-
export type DefaultTransformerStringify<T> = TransformerStringify<T, DefaultSerializable>;
|
|
16
|
-
export type DefaultTransformerParse<T> = TransformerParse<T, DefaultSerializable>;
|
package/dist/esm/transformer.js
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { isPlainObject } from "./utils.js";
|
|
2
|
-
const defaultTransformer = {
|
|
3
|
-
stringify: (value) => JSON.stringify(value, function replacer(key, val) {
|
|
4
|
-
const ogVal = this[key];
|
|
5
|
-
const transformer = transformers.find((t) => t.stringifyCondition(ogVal));
|
|
6
|
-
if (transformer) {
|
|
7
|
-
return transformer.stringify(ogVal);
|
|
8
|
-
}
|
|
9
|
-
return val;
|
|
10
|
-
}),
|
|
11
|
-
parse: (value) => JSON.parse(value, function parser(key, val) {
|
|
12
|
-
const ogVal = this[key];
|
|
13
|
-
if (isPlainObject(ogVal)) {
|
|
14
|
-
const transformer = transformers.find((t) => t.parseCondition(ogVal));
|
|
15
|
-
if (transformer) {
|
|
16
|
-
return transformer.parse(ogVal);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return val;
|
|
20
|
-
}),
|
|
21
|
-
encode: (value) => {
|
|
22
|
-
if (Array.isArray(value)) {
|
|
23
|
-
return value.map((v) => defaultTransformer.encode(v));
|
|
24
|
-
}
|
|
25
|
-
if (isPlainObject(value)) {
|
|
26
|
-
return Object.fromEntries(
|
|
27
|
-
Object.entries(value).map(([key, v]) => [
|
|
28
|
-
key,
|
|
29
|
-
defaultTransformer.encode(v)
|
|
30
|
-
])
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
const transformer = transformers.find((t) => t.stringifyCondition(value));
|
|
34
|
-
if (transformer) {
|
|
35
|
-
return transformer.stringify(value);
|
|
36
|
-
}
|
|
37
|
-
return value;
|
|
38
|
-
},
|
|
39
|
-
decode: (value) => {
|
|
40
|
-
if (isPlainObject(value)) {
|
|
41
|
-
const transformer = transformers.find((t) => t.parseCondition(value));
|
|
42
|
-
if (transformer) {
|
|
43
|
-
return transformer.parse(value);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
if (Array.isArray(value)) {
|
|
47
|
-
return value.map((v) => defaultTransformer.decode(v));
|
|
48
|
-
}
|
|
49
|
-
if (isPlainObject(value)) {
|
|
50
|
-
return Object.fromEntries(
|
|
51
|
-
Object.entries(value).map(([key, v]) => [
|
|
52
|
-
key,
|
|
53
|
-
defaultTransformer.decode(v)
|
|
54
|
-
])
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
return value;
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
const createTransformer = (key, check, toValue, fromValue) => ({
|
|
61
|
-
key,
|
|
62
|
-
stringifyCondition: check,
|
|
63
|
-
stringify: (value) => ({ [`$${key}`]: toValue(value) }),
|
|
64
|
-
parseCondition: (value) => Object.hasOwn(value, `$${key}`),
|
|
65
|
-
parse: (value) => fromValue(value[`$${key}`])
|
|
66
|
-
});
|
|
67
|
-
const transformers = [
|
|
68
|
-
createTransformer(
|
|
69
|
-
// Key
|
|
70
|
-
"undefined",
|
|
71
|
-
// Check
|
|
72
|
-
(v) => v === void 0,
|
|
73
|
-
// To
|
|
74
|
-
() => 0,
|
|
75
|
-
// From
|
|
76
|
-
() => void 0
|
|
77
|
-
),
|
|
78
|
-
createTransformer(
|
|
79
|
-
// Key
|
|
80
|
-
"date",
|
|
81
|
-
// Check
|
|
82
|
-
(v) => v instanceof Date,
|
|
83
|
-
// To
|
|
84
|
-
(v) => v.toISOString(),
|
|
85
|
-
// From
|
|
86
|
-
(v) => new Date(v)
|
|
87
|
-
),
|
|
88
|
-
createTransformer(
|
|
89
|
-
// Key
|
|
90
|
-
"error",
|
|
91
|
-
// Check
|
|
92
|
-
(v) => v instanceof Error,
|
|
93
|
-
// To
|
|
94
|
-
(v) => ({ ...v, message: v.message, stack: v.stack, cause: v.cause }),
|
|
95
|
-
// From
|
|
96
|
-
(v) => Object.assign(new Error(v.message), v)
|
|
97
|
-
),
|
|
98
|
-
createTransformer(
|
|
99
|
-
// Key
|
|
100
|
-
"formData",
|
|
101
|
-
// Check
|
|
102
|
-
(v) => v instanceof FormData,
|
|
103
|
-
// To
|
|
104
|
-
(v) => {
|
|
105
|
-
const entries = {};
|
|
106
|
-
v.forEach((value, key) => {
|
|
107
|
-
const entry = entries[key];
|
|
108
|
-
if (entry !== void 0) {
|
|
109
|
-
if (Array.isArray(entry)) {
|
|
110
|
-
entry.push(value);
|
|
111
|
-
} else {
|
|
112
|
-
entries[key] = [entry, value];
|
|
113
|
-
}
|
|
114
|
-
} else {
|
|
115
|
-
entries[key] = value;
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
return entries;
|
|
119
|
-
},
|
|
120
|
-
// From
|
|
121
|
-
(v) => {
|
|
122
|
-
const formData = new FormData();
|
|
123
|
-
Object.entries(v).forEach(([key, value]) => {
|
|
124
|
-
if (Array.isArray(value)) {
|
|
125
|
-
value.forEach((val) => formData.append(key, val));
|
|
126
|
-
} else {
|
|
127
|
-
formData.append(key, value);
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
return formData;
|
|
131
|
-
}
|
|
132
|
-
)
|
|
133
|
-
];
|
|
134
|
-
export {
|
|
135
|
-
defaultTransformer
|
|
136
|
-
};
|
|
137
|
-
//# sourceMappingURL=transformer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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 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 encoding, 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 = <TKey extends string, TInput, TSerialized>(\n key: TKey,\n check: (value: any) => value is TInput,\n toValue: (value: TInput) => TSerialized,\n fromValue: (value: TSerialized) => TInput,\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\n// Make sure to keep DefaultSerializeable in sync with these transformers\n// Also, make sure that they are unit tested in transformer.test.tsx\nconst transformers = [\n createTransformer(\n // Key\n 'undefined',\n // Check\n (v): v is undefined => v === undefined,\n // To\n () => 0,\n // From\n () => undefined,\n ),\n createTransformer(\n // Key\n 'date',\n // Check\n (v): v is Date => 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 is Error => 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 createTransformer(\n // Key\n 'formData',\n // Check\n (v): v is FormData => v instanceof FormData,\n // To\n (v) => {\n const entries: Record<\n string,\n Array<FormDataEntryValue> | FormDataEntryValue\n > = {}\n v.forEach((value, key) => {\n const entry = entries[key]\n if (entry !== undefined) {\n if (Array.isArray(entry)) {\n entry.push(value)\n } else {\n entries[key] = [entry, value]\n }\n } else {\n entries[key] = value\n }\n })\n return entries\n },\n // From\n (v) => {\n const formData = new FormData()\n Object.entries(v).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n value.forEach((val) => formData.append(key, val))\n } else {\n formData.append(key, value)\n }\n })\n return formData\n },\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 DefaultSerializable = Date | undefined | Error | FormData\n\nexport type DefaultTransformerStringify<T> = TransformerStringify<\n T,\n DefaultSerializable\n>\n\nexport type DefaultTransformerParse<T> = TransformerParse<\n T,\n DefaultSerializable\n>\n"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export function isServerSideError(error: unknown): error is {
|
|
2
|
-
__isServerError: true
|
|
3
|
-
data: Record<string, any>
|
|
4
|
-
} {
|
|
5
|
-
if (!(typeof error === 'object' && error && 'data' in error)) return false
|
|
6
|
-
if (!('__isServerError' in error && error.__isServerError)) return false
|
|
7
|
-
if (!(typeof error.data === 'object' && error.data)) return false
|
|
8
|
-
|
|
9
|
-
return error.__isServerError === true
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function defaultDeserializeError(serializedData: Record<string, any>) {
|
|
13
|
-
if ('name' in serializedData && 'message' in serializedData) {
|
|
14
|
-
const error = new Error(serializedData.message)
|
|
15
|
-
error.name = serializedData.name
|
|
16
|
-
if (process.env.NODE_ENV === 'development') {
|
|
17
|
-
error.stack = serializedData.stack
|
|
18
|
-
}
|
|
19
|
-
return error
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
return serializedData.data
|
|
23
|
-
}
|
package/src/transformer.ts
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
import { isPlainObject } from './utils'
|
|
2
|
-
|
|
3
|
-
export interface RouterTransformer {
|
|
4
|
-
stringify: (obj: unknown) => string
|
|
5
|
-
parse: (str: string) => unknown
|
|
6
|
-
encode: <T>(value: T) => T
|
|
7
|
-
decode: <T>(value: T) => T
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export const defaultTransformer: RouterTransformer = {
|
|
11
|
-
stringify: (value: any) =>
|
|
12
|
-
JSON.stringify(value, function replacer(key, val) {
|
|
13
|
-
const ogVal = this[key]
|
|
14
|
-
const transformer = transformers.find((t) => t.stringifyCondition(ogVal))
|
|
15
|
-
|
|
16
|
-
if (transformer) {
|
|
17
|
-
return transformer.stringify(ogVal)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
return val
|
|
21
|
-
}),
|
|
22
|
-
parse: (value: string) =>
|
|
23
|
-
JSON.parse(value, function parser(key, val) {
|
|
24
|
-
const ogVal = this[key]
|
|
25
|
-
if (isPlainObject(ogVal)) {
|
|
26
|
-
const transformer = transformers.find((t) => t.parseCondition(ogVal))
|
|
27
|
-
|
|
28
|
-
if (transformer) {
|
|
29
|
-
return transformer.parse(ogVal)
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return val
|
|
34
|
-
}),
|
|
35
|
-
encode: (value: any) => {
|
|
36
|
-
// When encoding, dive first
|
|
37
|
-
if (Array.isArray(value)) {
|
|
38
|
-
return value.map((v) => defaultTransformer.encode(v))
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
if (isPlainObject(value)) {
|
|
42
|
-
return Object.fromEntries(
|
|
43
|
-
Object.entries(value).map(([key, v]) => [
|
|
44
|
-
key,
|
|
45
|
-
defaultTransformer.encode(v),
|
|
46
|
-
]),
|
|
47
|
-
)
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const transformer = transformers.find((t) => t.stringifyCondition(value))
|
|
51
|
-
if (transformer) {
|
|
52
|
-
return transformer.stringify(value)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return value
|
|
56
|
-
},
|
|
57
|
-
decode: (value: any) => {
|
|
58
|
-
// Attempt transform first
|
|
59
|
-
if (isPlainObject(value)) {
|
|
60
|
-
const transformer = transformers.find((t) => t.parseCondition(value))
|
|
61
|
-
if (transformer) {
|
|
62
|
-
return transformer.parse(value)
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (Array.isArray(value)) {
|
|
67
|
-
return value.map((v) => defaultTransformer.decode(v))
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (isPlainObject(value)) {
|
|
71
|
-
return Object.fromEntries(
|
|
72
|
-
Object.entries(value).map(([key, v]) => [
|
|
73
|
-
key,
|
|
74
|
-
defaultTransformer.decode(v),
|
|
75
|
-
]),
|
|
76
|
-
)
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return value
|
|
80
|
-
},
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const createTransformer = <TKey extends string, TInput, TSerialized>(
|
|
84
|
-
key: TKey,
|
|
85
|
-
check: (value: any) => value is TInput,
|
|
86
|
-
toValue: (value: TInput) => TSerialized,
|
|
87
|
-
fromValue: (value: TSerialized) => TInput,
|
|
88
|
-
) => ({
|
|
89
|
-
key,
|
|
90
|
-
stringifyCondition: check,
|
|
91
|
-
stringify: (value: any) => ({ [`$${key}`]: toValue(value) }),
|
|
92
|
-
parseCondition: (value: any) => Object.hasOwn(value, `$${key}`),
|
|
93
|
-
parse: (value: any) => fromValue(value[`$${key}`]),
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
// Keep these ordered by predicted frequency
|
|
97
|
-
// Make sure to keep DefaultSerializeable in sync with these transformers
|
|
98
|
-
// Also, make sure that they are unit tested in transformer.test.tsx
|
|
99
|
-
const transformers = [
|
|
100
|
-
createTransformer(
|
|
101
|
-
// Key
|
|
102
|
-
'undefined',
|
|
103
|
-
// Check
|
|
104
|
-
(v): v is undefined => v === undefined,
|
|
105
|
-
// To
|
|
106
|
-
() => 0,
|
|
107
|
-
// From
|
|
108
|
-
() => undefined,
|
|
109
|
-
),
|
|
110
|
-
createTransformer(
|
|
111
|
-
// Key
|
|
112
|
-
'date',
|
|
113
|
-
// Check
|
|
114
|
-
(v): v is Date => v instanceof Date,
|
|
115
|
-
// To
|
|
116
|
-
(v) => v.toISOString(),
|
|
117
|
-
// From
|
|
118
|
-
(v) => new Date(v),
|
|
119
|
-
),
|
|
120
|
-
createTransformer(
|
|
121
|
-
// Key
|
|
122
|
-
'error',
|
|
123
|
-
// Check
|
|
124
|
-
(v): v is Error => v instanceof Error,
|
|
125
|
-
// To
|
|
126
|
-
(v) => ({ ...v, message: v.message, stack: v.stack, cause: v.cause }),
|
|
127
|
-
// From
|
|
128
|
-
(v) => Object.assign(new Error(v.message), v),
|
|
129
|
-
),
|
|
130
|
-
createTransformer(
|
|
131
|
-
// Key
|
|
132
|
-
'formData',
|
|
133
|
-
// Check
|
|
134
|
-
(v): v is FormData => v instanceof FormData,
|
|
135
|
-
// To
|
|
136
|
-
(v) => {
|
|
137
|
-
const entries: Record<
|
|
138
|
-
string,
|
|
139
|
-
Array<FormDataEntryValue> | FormDataEntryValue
|
|
140
|
-
> = {}
|
|
141
|
-
v.forEach((value, key) => {
|
|
142
|
-
const entry = entries[key]
|
|
143
|
-
if (entry !== undefined) {
|
|
144
|
-
if (Array.isArray(entry)) {
|
|
145
|
-
entry.push(value)
|
|
146
|
-
} else {
|
|
147
|
-
entries[key] = [entry, value]
|
|
148
|
-
}
|
|
149
|
-
} else {
|
|
150
|
-
entries[key] = value
|
|
151
|
-
}
|
|
152
|
-
})
|
|
153
|
-
return entries
|
|
154
|
-
},
|
|
155
|
-
// From
|
|
156
|
-
(v) => {
|
|
157
|
-
const formData = new FormData()
|
|
158
|
-
Object.entries(v).forEach(([key, value]) => {
|
|
159
|
-
if (Array.isArray(value)) {
|
|
160
|
-
value.forEach((val) => formData.append(key, val))
|
|
161
|
-
} else {
|
|
162
|
-
formData.append(key, value)
|
|
163
|
-
}
|
|
164
|
-
})
|
|
165
|
-
return formData
|
|
166
|
-
},
|
|
167
|
-
),
|
|
168
|
-
] as const
|
|
169
|
-
|
|
170
|
-
export type TransformerStringify<T, TSerializable> = T extends TSerializable
|
|
171
|
-
? T
|
|
172
|
-
: T extends (...args: Array<any>) => any
|
|
173
|
-
? 'Function is not serializable'
|
|
174
|
-
: { [K in keyof T]: TransformerStringify<T[K], TSerializable> }
|
|
175
|
-
|
|
176
|
-
export type TransformerParse<T, TSerializable> = T extends TSerializable
|
|
177
|
-
? T
|
|
178
|
-
: T extends React.JSX.Element
|
|
179
|
-
? ReadableStream
|
|
180
|
-
: { [K in keyof T]: TransformerParse<T[K], TSerializable> }
|
|
181
|
-
|
|
182
|
-
export type DefaultSerializable = Date | undefined | Error | FormData
|
|
183
|
-
|
|
184
|
-
export type DefaultTransformerStringify<T> = TransformerStringify<
|
|
185
|
-
T,
|
|
186
|
-
DefaultSerializable
|
|
187
|
-
>
|
|
188
|
-
|
|
189
|
-
export type DefaultTransformerParse<T> = TransformerParse<
|
|
190
|
-
T,
|
|
191
|
-
DefaultSerializable
|
|
192
|
-
>
|