@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.
Files changed (69) hide show
  1. package/dist/cjs/Match.cjs +8 -24
  2. package/dist/cjs/Match.cjs.map +1 -1
  3. package/dist/cjs/Matches.cjs +1 -1
  4. package/dist/cjs/Matches.cjs.map +1 -1
  5. package/dist/cjs/RouterProvider.cjs.map +1 -1
  6. package/dist/cjs/RouterProvider.d.cts +0 -1
  7. package/dist/cjs/ScriptOnce.cjs +1 -8
  8. package/dist/cjs/ScriptOnce.cjs.map +1 -1
  9. package/dist/cjs/ScriptOnce.d.cts +1 -1
  10. package/dist/cjs/Transitioner.cjs +1 -2
  11. package/dist/cjs/Transitioner.cjs.map +1 -1
  12. package/dist/cjs/awaited.cjs +1 -22
  13. package/dist/cjs/awaited.cjs.map +1 -1
  14. package/dist/cjs/index.cjs +2 -7
  15. package/dist/cjs/index.cjs.map +1 -1
  16. package/dist/cjs/index.d.cts +4 -6
  17. package/dist/cjs/router.cjs +11 -129
  18. package/dist/cjs/router.cjs.map +1 -1
  19. package/dist/cjs/router.d.cts +33 -93
  20. package/dist/cjs/routerContext.cjs.map +1 -1
  21. package/dist/cjs/routerContext.d.cts +7 -2
  22. package/dist/cjs/serializer.d.cts +15 -0
  23. package/dist/esm/Match.js +9 -25
  24. package/dist/esm/Match.js.map +1 -1
  25. package/dist/esm/Matches.js +1 -1
  26. package/dist/esm/Matches.js.map +1 -1
  27. package/dist/esm/RouterProvider.d.ts +0 -1
  28. package/dist/esm/RouterProvider.js.map +1 -1
  29. package/dist/esm/ScriptOnce.d.ts +1 -1
  30. package/dist/esm/ScriptOnce.js +1 -8
  31. package/dist/esm/ScriptOnce.js.map +1 -1
  32. package/dist/esm/Transitioner.js +1 -2
  33. package/dist/esm/Transitioner.js.map +1 -1
  34. package/dist/esm/awaited.js +1 -22
  35. package/dist/esm/awaited.js.map +1 -1
  36. package/dist/esm/index.d.ts +4 -6
  37. package/dist/esm/index.js +1 -6
  38. package/dist/esm/index.js.map +1 -1
  39. package/dist/esm/router.d.ts +33 -93
  40. package/dist/esm/router.js +11 -129
  41. package/dist/esm/router.js.map +1 -1
  42. package/dist/esm/routerContext.d.ts +7 -2
  43. package/dist/esm/routerContext.js.map +1 -1
  44. package/dist/esm/serializer.d.ts +15 -0
  45. package/package.json +1 -1
  46. package/src/Match.tsx +4 -29
  47. package/src/Matches.tsx +1 -1
  48. package/src/RouterProvider.tsx +3 -3
  49. package/src/ScriptOnce.tsx +0 -8
  50. package/src/Transitioner.tsx +1 -1
  51. package/src/awaited.tsx +3 -25
  52. package/src/index.tsx +12 -34
  53. package/src/router.ts +44 -271
  54. package/src/routerContext.tsx +7 -1
  55. package/src/serializer.ts +24 -0
  56. package/dist/cjs/isServerSideError.cjs +0 -22
  57. package/dist/cjs/isServerSideError.cjs.map +0 -1
  58. package/dist/cjs/isServerSideError.d.cts +0 -5
  59. package/dist/cjs/transformer.cjs +0 -137
  60. package/dist/cjs/transformer.cjs.map +0 -1
  61. package/dist/cjs/transformer.d.cts +0 -16
  62. package/dist/esm/isServerSideError.d.ts +0 -5
  63. package/dist/esm/isServerSideError.js +0 -22
  64. package/dist/esm/isServerSideError.js.map +0 -1
  65. package/dist/esm/transformer.d.ts +0 -16
  66. package/dist/esm/transformer.js +0 -137
  67. package/dist/esm/transformer.js.map +0 -1
  68. package/src/isServerSideError.tsx +0 -23
  69. package/src/transformer.ts +0 -192
@@ -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,5 +0,0 @@
1
- export declare function isServerSideError(error: unknown): error is {
2
- __isServerError: true;
3
- data: Record<string, any>;
4
- };
5
- export declare function defaultDeserializeError(serializedData: Record<string, any>): any;
@@ -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>;
@@ -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
- }
@@ -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
- >