@tanstack/router-core 1.121.0-alpha.22 → 1.121.0-alpha.28

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 (170) hide show
  1. package/dist/cjs/Matches.cjs.map +1 -1
  2. package/dist/cjs/Matches.d.cts +31 -1
  3. package/dist/cjs/RouterProvider.d.cts +2 -1
  4. package/dist/cjs/defer.cjs +1 -1
  5. package/dist/cjs/defer.cjs.map +1 -1
  6. package/dist/cjs/global.d.cts +7 -0
  7. package/dist/cjs/index.cjs +1 -2
  8. package/dist/cjs/index.cjs.map +1 -1
  9. package/dist/cjs/index.d.cts +6 -6
  10. package/dist/cjs/link.cjs.map +1 -1
  11. package/dist/cjs/link.d.cts +12 -0
  12. package/dist/cjs/lru-cache.cjs +62 -0
  13. package/dist/cjs/lru-cache.cjs.map +1 -0
  14. package/dist/cjs/lru-cache.d.cts +5 -0
  15. package/dist/cjs/not-found.cjs +1 -1
  16. package/dist/cjs/not-found.cjs.map +1 -1
  17. package/dist/cjs/path.cjs +316 -148
  18. package/dist/cjs/path.cjs.map +1 -1
  19. package/dist/cjs/path.d.cts +18 -24
  20. package/dist/cjs/qss.cjs +2 -4
  21. package/dist/cjs/qss.cjs.map +1 -1
  22. package/dist/cjs/qss.d.cts +9 -0
  23. package/dist/cjs/redirect.cjs +3 -0
  24. package/dist/cjs/redirect.cjs.map +1 -1
  25. package/dist/cjs/route.cjs +6 -12
  26. package/dist/cjs/route.cjs.map +1 -1
  27. package/dist/cjs/route.d.cts +29 -9
  28. package/dist/cjs/router.cjs +454 -272
  29. package/dist/cjs/router.cjs.map +1 -1
  30. package/dist/cjs/router.d.cts +55 -85
  31. package/dist/cjs/scroll-restoration.cjs +20 -13
  32. package/dist/cjs/scroll-restoration.cjs.map +1 -1
  33. package/dist/cjs/scroll-restoration.d.cts +9 -1
  34. package/dist/cjs/searchMiddleware.cjs.map +1 -1
  35. package/dist/cjs/searchParams.cjs.map +1 -1
  36. package/dist/cjs/ssr/client.cjs +10 -0
  37. package/dist/cjs/ssr/client.cjs.map +1 -0
  38. package/dist/cjs/ssr/client.d.cts +5 -0
  39. package/dist/cjs/ssr/createRequestHandler.cjs +50 -0
  40. package/dist/cjs/ssr/createRequestHandler.cjs.map +1 -0
  41. package/dist/cjs/ssr/createRequestHandler.d.cts +9 -0
  42. package/dist/cjs/ssr/handlerCallback.cjs +7 -0
  43. package/dist/cjs/ssr/handlerCallback.cjs.map +1 -0
  44. package/dist/cjs/ssr/handlerCallback.d.cts +9 -0
  45. package/dist/cjs/ssr/headers.cjs +39 -0
  46. package/dist/cjs/ssr/headers.cjs.map +1 -0
  47. package/dist/cjs/ssr/headers.d.cts +5 -0
  48. package/dist/cjs/ssr/json.cjs +14 -0
  49. package/dist/cjs/ssr/json.cjs.map +1 -0
  50. package/dist/cjs/ssr/json.d.cts +4 -0
  51. package/dist/cjs/ssr/seroval-plugins.cjs +34 -0
  52. package/dist/cjs/ssr/seroval-plugins.cjs.map +1 -0
  53. package/dist/cjs/ssr/seroval-plugins.d.cts +10 -0
  54. package/dist/cjs/ssr/server.cjs +13 -0
  55. package/dist/cjs/ssr/server.cjs.map +1 -0
  56. package/dist/cjs/ssr/server.d.cts +6 -0
  57. package/dist/cjs/ssr/ssr-client.cjs +159 -0
  58. package/dist/cjs/ssr/ssr-client.cjs.map +1 -0
  59. package/dist/cjs/ssr/ssr-client.d.cts +29 -0
  60. package/dist/cjs/ssr/ssr-server.cjs +107 -0
  61. package/dist/cjs/ssr/ssr-server.cjs.map +1 -0
  62. package/dist/cjs/ssr/ssr-server.d.cts +18 -0
  63. package/dist/cjs/ssr/transformStreamWithRouter.cjs +183 -0
  64. package/dist/cjs/ssr/transformStreamWithRouter.cjs.map +1 -0
  65. package/dist/cjs/ssr/transformStreamWithRouter.d.cts +6 -0
  66. package/dist/cjs/ssr/tsrScript.cjs +4 -0
  67. package/dist/cjs/ssr/tsrScript.cjs.map +1 -0
  68. package/dist/cjs/ssr/tsrScript.d.cts +0 -0
  69. package/dist/cjs/utils.cjs +7 -30
  70. package/dist/cjs/utils.cjs.map +1 -1
  71. package/dist/cjs/utils.d.cts +1 -18
  72. package/dist/esm/Matches.d.ts +31 -1
  73. package/dist/esm/Matches.js.map +1 -1
  74. package/dist/esm/RouterProvider.d.ts +2 -1
  75. package/dist/esm/defer.js +1 -1
  76. package/dist/esm/defer.js.map +1 -1
  77. package/dist/esm/global.d.ts +7 -0
  78. package/dist/esm/index.d.ts +6 -6
  79. package/dist/esm/index.js +2 -3
  80. package/dist/esm/link.d.ts +12 -0
  81. package/dist/esm/link.js.map +1 -1
  82. package/dist/esm/lru-cache.d.ts +5 -0
  83. package/dist/esm/lru-cache.js +62 -0
  84. package/dist/esm/lru-cache.js.map +1 -0
  85. package/dist/esm/not-found.js +1 -1
  86. package/dist/esm/not-found.js.map +1 -1
  87. package/dist/esm/path.d.ts +18 -24
  88. package/dist/esm/path.js +316 -148
  89. package/dist/esm/path.js.map +1 -1
  90. package/dist/esm/qss.d.ts +9 -0
  91. package/dist/esm/qss.js +2 -4
  92. package/dist/esm/qss.js.map +1 -1
  93. package/dist/esm/redirect.js +3 -0
  94. package/dist/esm/redirect.js.map +1 -1
  95. package/dist/esm/route.d.ts +29 -9
  96. package/dist/esm/route.js +6 -12
  97. package/dist/esm/route.js.map +1 -1
  98. package/dist/esm/router.d.ts +55 -85
  99. package/dist/esm/router.js +463 -281
  100. package/dist/esm/router.js.map +1 -1
  101. package/dist/esm/scroll-restoration.d.ts +9 -1
  102. package/dist/esm/scroll-restoration.js +20 -13
  103. package/dist/esm/scroll-restoration.js.map +1 -1
  104. package/dist/esm/searchMiddleware.js.map +1 -1
  105. package/dist/esm/searchParams.js.map +1 -1
  106. package/dist/esm/ssr/client.d.ts +5 -0
  107. package/dist/esm/ssr/client.js +10 -0
  108. package/dist/esm/ssr/client.js.map +1 -0
  109. package/dist/esm/ssr/createRequestHandler.d.ts +9 -0
  110. package/dist/esm/ssr/createRequestHandler.js +50 -0
  111. package/dist/esm/ssr/createRequestHandler.js.map +1 -0
  112. package/dist/esm/ssr/handlerCallback.d.ts +9 -0
  113. package/dist/esm/ssr/handlerCallback.js +7 -0
  114. package/dist/esm/ssr/handlerCallback.js.map +1 -0
  115. package/dist/esm/ssr/headers.d.ts +5 -0
  116. package/dist/esm/ssr/headers.js +39 -0
  117. package/dist/esm/ssr/headers.js.map +1 -0
  118. package/dist/esm/ssr/json.d.ts +4 -0
  119. package/dist/esm/ssr/json.js +14 -0
  120. package/dist/esm/ssr/json.js.map +1 -0
  121. package/dist/esm/ssr/seroval-plugins.d.ts +10 -0
  122. package/dist/esm/ssr/seroval-plugins.js +34 -0
  123. package/dist/esm/ssr/seroval-plugins.js.map +1 -0
  124. package/dist/esm/ssr/server.d.ts +6 -0
  125. package/dist/esm/ssr/server.js +13 -0
  126. package/dist/esm/ssr/server.js.map +1 -0
  127. package/dist/esm/ssr/ssr-client.d.ts +29 -0
  128. package/dist/esm/ssr/ssr-client.js +159 -0
  129. package/dist/esm/ssr/ssr-client.js.map +1 -0
  130. package/dist/esm/ssr/ssr-server.d.ts +18 -0
  131. package/dist/esm/ssr/ssr-server.js +107 -0
  132. package/dist/esm/ssr/ssr-server.js.map +1 -0
  133. package/dist/esm/ssr/transformStreamWithRouter.d.ts +6 -0
  134. package/dist/esm/ssr/transformStreamWithRouter.js +183 -0
  135. package/dist/esm/ssr/transformStreamWithRouter.js.map +1 -0
  136. package/dist/esm/ssr/tsrScript.d.ts +0 -0
  137. package/dist/esm/ssr/tsrScript.js +5 -0
  138. package/dist/esm/ssr/tsrScript.js.map +1 -0
  139. package/dist/esm/utils.d.ts +1 -18
  140. package/dist/esm/utils.js +8 -31
  141. package/dist/esm/utils.js.map +1 -1
  142. package/package.json +29 -2
  143. package/src/Matches.ts +40 -1
  144. package/src/RouterProvider.ts +2 -1
  145. package/src/global.ts +9 -0
  146. package/src/index.ts +12 -20
  147. package/src/link.ts +12 -0
  148. package/src/lru-cache.ts +68 -0
  149. package/src/path.ts +424 -174
  150. package/src/qss.ts +2 -6
  151. package/src/redirect.ts +3 -0
  152. package/src/route.ts +44 -13
  153. package/src/router.ts +581 -312
  154. package/src/scroll-restoration.ts +30 -18
  155. package/src/ssr/client.ts +5 -0
  156. package/src/ssr/createRequestHandler.ts +74 -0
  157. package/src/ssr/handlerCallback.ts +15 -0
  158. package/src/ssr/headers.ts +51 -0
  159. package/src/ssr/json.ts +18 -0
  160. package/src/ssr/seroval-plugins.ts +43 -0
  161. package/src/ssr/server.ts +10 -0
  162. package/src/ssr/ssr-client.ts +242 -0
  163. package/src/ssr/ssr-server.ts +132 -0
  164. package/src/ssr/transformStreamWithRouter.ts +259 -0
  165. package/src/ssr/tsrScript.ts +7 -0
  166. package/src/utils.ts +10 -56
  167. package/src/vite-env.d.ts +4 -0
  168. package/dist/cjs/serializer.d.cts +0 -22
  169. package/dist/esm/serializer.d.ts +0 -22
  170. package/src/serializer.ts +0 -32
@@ -0,0 +1,259 @@
1
+ import { ReadableStream } from 'node:stream/web'
2
+ import { Readable } from 'node:stream'
3
+ import { createControlledPromise } from '../utils'
4
+ import type { AnyRouter } from '../router'
5
+
6
+ export function transformReadableStreamWithRouter(
7
+ router: AnyRouter,
8
+ routerStream: ReadableStream,
9
+ ) {
10
+ return transformStreamWithRouter(router, routerStream)
11
+ }
12
+
13
+ export function transformPipeableStreamWithRouter(
14
+ router: AnyRouter,
15
+ routerStream: Readable,
16
+ ) {
17
+ return Readable.fromWeb(
18
+ transformStreamWithRouter(router, Readable.toWeb(routerStream)),
19
+ )
20
+ }
21
+
22
+ // regex pattern for matching closing body and html tags
23
+ const patternBodyStart = /(<body)/
24
+ const patternBodyEnd = /(<\/body>)/
25
+ const patternHtmlEnd = /(<\/html>)/
26
+ const patternHeadStart = /(<head.*?>)/
27
+ // regex pattern for matching closing tags
28
+ const patternClosingTag = /(<\/[a-zA-Z][\w:.-]*?>)/g
29
+
30
+ const textDecoder = new TextDecoder()
31
+
32
+ type ReadablePassthrough = {
33
+ stream: ReadableStream
34
+ write: (chunk: string) => void
35
+ end: (chunk?: string) => void
36
+ destroy: (error: unknown) => void
37
+ destroyed: boolean
38
+ }
39
+
40
+ function createPassthrough() {
41
+ let controller: ReadableStreamDefaultController<any>
42
+ const encoder = new TextEncoder()
43
+ const stream = new ReadableStream({
44
+ start(c) {
45
+ controller = c
46
+ },
47
+ })
48
+
49
+ const res: ReadablePassthrough = {
50
+ stream,
51
+ write: (chunk) => {
52
+ controller.enqueue(encoder.encode(chunk))
53
+ },
54
+ end: (chunk) => {
55
+ if (chunk) {
56
+ controller.enqueue(encoder.encode(chunk))
57
+ }
58
+ controller.close()
59
+ res.destroyed = true
60
+ },
61
+ destroy: (error) => {
62
+ controller.error(error)
63
+ },
64
+ destroyed: false,
65
+ }
66
+
67
+ return res
68
+ }
69
+
70
+ async function readStream(
71
+ stream: ReadableStream,
72
+ opts: {
73
+ onData?: (chunk: ReadableStreamReadValueResult<any>) => void
74
+ onEnd?: () => void
75
+ onError?: (error: unknown) => void
76
+ },
77
+ ) {
78
+ try {
79
+ const reader = stream.getReader()
80
+ let chunk
81
+ while (!(chunk = await reader.read()).done) {
82
+ opts.onData?.(chunk)
83
+ }
84
+ opts.onEnd?.()
85
+ } catch (error) {
86
+ opts.onError?.(error)
87
+ }
88
+ }
89
+
90
+ export function transformStreamWithRouter(
91
+ router: AnyRouter,
92
+ appStream: ReadableStream,
93
+ ) {
94
+ const finalPassThrough = createPassthrough()
95
+
96
+ let isAppRendering = true as boolean
97
+ let routerStreamBuffer = ''
98
+ let pendingClosingTags = ''
99
+ let bodyStarted = false as boolean
100
+ let headStarted = false as boolean
101
+ let leftover = ''
102
+ let leftoverHtml = ''
103
+
104
+ function getBufferedRouterStream() {
105
+ const html = routerStreamBuffer
106
+ routerStreamBuffer = ''
107
+ return html
108
+ }
109
+
110
+ function decodeChunk(chunk: unknown): string {
111
+ if (chunk instanceof Uint8Array) {
112
+ return textDecoder.decode(chunk)
113
+ }
114
+ return String(chunk)
115
+ }
116
+
117
+ const injectedHtmlDonePromise = createControlledPromise<void>()
118
+
119
+ let processingCount = 0
120
+
121
+ // Process any already-injected HTML
122
+ router.serverSsr!.injectedHtml.forEach((promise) => {
123
+ handleInjectedHtml(promise)
124
+ })
125
+
126
+ // Listen for any new injected HTML
127
+ const stopListeningToInjectedHtml = router.subscribe(
128
+ 'onInjectedHtml',
129
+ (e) => {
130
+ handleInjectedHtml(e.promise)
131
+ },
132
+ )
133
+
134
+ function handleInjectedHtml(promise: Promise<string>) {
135
+ processingCount++
136
+
137
+ promise
138
+ .then((html) => {
139
+ if (!bodyStarted) {
140
+ routerStreamBuffer += html
141
+ } else {
142
+ finalPassThrough.write(html)
143
+ }
144
+ })
145
+ .catch(injectedHtmlDonePromise.reject)
146
+ .finally(() => {
147
+ processingCount--
148
+
149
+ if (!isAppRendering && processingCount === 0) {
150
+ stopListeningToInjectedHtml()
151
+ injectedHtmlDonePromise.resolve()
152
+ }
153
+ })
154
+ }
155
+
156
+ injectedHtmlDonePromise
157
+ .then(() => {
158
+ const finalHtml =
159
+ leftoverHtml + getBufferedRouterStream() + pendingClosingTags
160
+
161
+ finalPassThrough.end(finalHtml)
162
+ })
163
+ .catch((err) => {
164
+ console.error('Error reading routerStream:', err)
165
+ finalPassThrough.destroy(err)
166
+ })
167
+
168
+ // Transform the appStream
169
+ readStream(appStream, {
170
+ onData: (chunk) => {
171
+ const text = decodeChunk(chunk.value)
172
+
173
+ let chunkString = leftover + text
174
+ const bodyEndMatch = chunkString.match(patternBodyEnd)
175
+ const htmlEndMatch = chunkString.match(patternHtmlEnd)
176
+
177
+ if (!bodyStarted) {
178
+ const bodyStartMatch = chunkString.match(patternBodyStart)
179
+ if (bodyStartMatch) {
180
+ bodyStarted = true
181
+ }
182
+ }
183
+
184
+ if (!headStarted) {
185
+ const headStartMatch = chunkString.match(patternHeadStart)
186
+ if (headStartMatch) {
187
+ headStarted = true
188
+ const index = headStartMatch.index!
189
+ const headTag = headStartMatch[0]
190
+ const remaining = chunkString.slice(index + headTag.length)
191
+ finalPassThrough.write(
192
+ chunkString.slice(0, index) + headTag + getBufferedRouterStream(),
193
+ )
194
+ // make sure to only write `remaining` until the next closing tag
195
+ chunkString = remaining
196
+ }
197
+ }
198
+
199
+ if (!bodyStarted) {
200
+ finalPassThrough.write(chunkString)
201
+ leftover = ''
202
+ return
203
+ }
204
+
205
+ // If either the body end or html end is in the chunk,
206
+ // We need to get all of our data in asap
207
+ if (
208
+ bodyEndMatch &&
209
+ htmlEndMatch &&
210
+ bodyEndMatch.index! < htmlEndMatch.index!
211
+ ) {
212
+ const bodyEndIndex = bodyEndMatch.index!
213
+ pendingClosingTags = chunkString.slice(bodyEndIndex)
214
+
215
+ finalPassThrough.write(
216
+ chunkString.slice(0, bodyEndIndex) + getBufferedRouterStream(),
217
+ )
218
+
219
+ leftover = ''
220
+ return
221
+ }
222
+
223
+ let result: RegExpExecArray | null
224
+ let lastIndex = 0
225
+ while ((result = patternClosingTag.exec(chunkString)) !== null) {
226
+ lastIndex = result.index + result[0].length
227
+ }
228
+
229
+ if (lastIndex > 0) {
230
+ const processed =
231
+ chunkString.slice(0, lastIndex) +
232
+ getBufferedRouterStream() +
233
+ leftoverHtml
234
+
235
+ finalPassThrough.write(processed)
236
+ leftover = chunkString.slice(lastIndex)
237
+ } else {
238
+ leftover = chunkString
239
+ leftoverHtml += getBufferedRouterStream()
240
+ }
241
+ },
242
+ onEnd: () => {
243
+ // Mark the app as done rendering
244
+ isAppRendering = false
245
+ router.serverSsr!.setRenderFinished()
246
+
247
+ // If there are no pending promises, resolve the injectedHtmlDonePromise
248
+ if (processingCount === 0) {
249
+ injectedHtmlDonePromise.resolve()
250
+ }
251
+ },
252
+ onError: (error) => {
253
+ console.error('Error reading appStream:', error)
254
+ finalPassThrough.destroy(error)
255
+ },
256
+ })
257
+
258
+ return finalPassThrough.stream
259
+ }
@@ -0,0 +1,7 @@
1
+ self.$_TSR = {
2
+ c: () => {
3
+ document.querySelectorAll('.\\$tsr').forEach((o) => {
4
+ o.remove()
5
+ })
6
+ },
7
+ }
package/src/utils.ts CHANGED
@@ -421,60 +421,14 @@ export function createControlledPromise<T>(onResolve?: (value: T) => void) {
421
421
  return controlledPromise
422
422
  }
423
423
 
424
- /**
425
- *
426
- * @deprecated use `jsesc` instead
427
- */
428
- export function escapeJSON(jsonString: string) {
429
- return jsonString
430
- .replace(/\\/g, '\\\\') // Escape backslashes
431
- .replace(/'/g, "\\'") // Escape single quotes
432
- .replace(/"/g, '\\"') // Escape double quotes
433
- }
434
-
435
- export function shallow<T>(objA: T, objB: T) {
436
- if (Object.is(objA, objB)) {
437
- return true
438
- }
439
-
440
- if (
441
- typeof objA !== 'object' ||
442
- objA === null ||
443
- typeof objB !== 'object' ||
444
- objB === null
445
- ) {
446
- return false
447
- }
448
-
449
- const keysA = Object.keys(objA)
450
- if (keysA.length !== Object.keys(objB).length) {
451
- return false
452
- }
453
-
454
- for (const item of keysA) {
455
- if (
456
- !Object.prototype.hasOwnProperty.call(objB, item) ||
457
- !Object.is(objA[item as keyof T], objB[item as keyof T])
458
- ) {
459
- return false
460
- }
461
- }
462
- return true
463
- }
464
-
465
- /**
466
- * Checks if a string contains URI-encoded special characters (e.g., %3F, %20).
467
- *
468
- * @param {string} inputString The string to check.
469
- * @returns {boolean} True if the string contains URI-encoded characters, false otherwise.
470
- * @example
471
- * ```typescript
472
- * const str1 = "foo%3Fbar";
473
- * const hasEncodedChars = hasUriEncodedChars(str1); // returns true
474
- * ```
475
- */
476
- export function hasUriEncodedChars(inputString: string): boolean {
477
- // This regex looks for a percent sign followed by two hexadecimal digits
478
- const pattern = /%[0-9A-Fa-f]{2}/
479
- return pattern.test(inputString)
424
+ export function isModuleNotFoundError(error: any): boolean {
425
+ // chrome: "Failed to fetch dynamically imported module: http://localhost:5173/src/routes/posts.index.tsx?tsr-split"
426
+ // firefox: "error loading dynamically imported module: http://localhost:5173/src/routes/posts.index.tsx?tsr-split"
427
+ // safari: "Importing a module script failed."
428
+ if (typeof error?.message !== 'string') return false
429
+ return (
430
+ error.message.startsWith('Failed to fetch dynamically imported module') ||
431
+ error.message.startsWith('error loading dynamically imported module') ||
432
+ error.message.startsWith('Importing a module script failed')
433
+ )
480
434
  }
@@ -0,0 +1,4 @@
1
+ declare module '*?script-string' {
2
+ const content: string
3
+ export default content
4
+ }
@@ -1,22 +0,0 @@
1
- export interface StartSerializer {
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 type SerializerStringifyBy<T, TSerializable> = T extends TSerializable ? T : T extends (...args: Array<any>) => any ? 'Function is not serializable' : {
8
- [K in keyof T]: SerializerStringifyBy<T[K], TSerializable>;
9
- };
10
- export type SerializerParseBy<T, TSerializable> = T extends TSerializable ? T : unknown extends SerializerExtensions['ReadableStream'] ? {
11
- [K in keyof T]: SerializerParseBy<T[K], TSerializable>;
12
- } : T extends SerializerExtensions['ReadableStream'] ? ReadableStream : {
13
- [K in keyof T]: SerializerParseBy<T[K], TSerializable>;
14
- };
15
- export interface DefaultSerializerExtensions {
16
- ReadableStream: unknown;
17
- }
18
- export interface SerializerExtensions extends DefaultSerializerExtensions {
19
- }
20
- export type Serializable = Date | undefined | Error | FormData | bigint;
21
- export type SerializerStringify<T> = SerializerStringifyBy<T, Serializable>;
22
- export type SerializerParse<T> = SerializerParseBy<T, Serializable>;
@@ -1,22 +0,0 @@
1
- export interface StartSerializer {
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 type SerializerStringifyBy<T, TSerializable> = T extends TSerializable ? T : T extends (...args: Array<any>) => any ? 'Function is not serializable' : {
8
- [K in keyof T]: SerializerStringifyBy<T[K], TSerializable>;
9
- };
10
- export type SerializerParseBy<T, TSerializable> = T extends TSerializable ? T : unknown extends SerializerExtensions['ReadableStream'] ? {
11
- [K in keyof T]: SerializerParseBy<T[K], TSerializable>;
12
- } : T extends SerializerExtensions['ReadableStream'] ? ReadableStream : {
13
- [K in keyof T]: SerializerParseBy<T[K], TSerializable>;
14
- };
15
- export interface DefaultSerializerExtensions {
16
- ReadableStream: unknown;
17
- }
18
- export interface SerializerExtensions extends DefaultSerializerExtensions {
19
- }
20
- export type Serializable = Date | undefined | Error | FormData | bigint;
21
- export type SerializerStringify<T> = SerializerStringifyBy<T, Serializable>;
22
- export type SerializerParse<T> = SerializerParseBy<T, Serializable>;
package/src/serializer.ts DELETED
@@ -1,32 +0,0 @@
1
- export interface StartSerializer {
2
- stringify: (obj: unknown) => string
3
- parse: (str: string) => unknown
4
- encode: <T>(value: T) => T
5
- decode: <T>(value: T) => T
6
- }
7
-
8
- export type SerializerStringifyBy<T, TSerializable> = T extends TSerializable
9
- ? T
10
- : T extends (...args: Array<any>) => any
11
- ? 'Function is not serializable'
12
- : { [K in keyof T]: SerializerStringifyBy<T[K], TSerializable> }
13
-
14
- export type SerializerParseBy<T, TSerializable> = T extends TSerializable
15
- ? T
16
- : unknown extends SerializerExtensions['ReadableStream']
17
- ? { [K in keyof T]: SerializerParseBy<T[K], TSerializable> }
18
- : T extends SerializerExtensions['ReadableStream']
19
- ? ReadableStream
20
- : { [K in keyof T]: SerializerParseBy<T[K], TSerializable> }
21
-
22
- export interface DefaultSerializerExtensions {
23
- ReadableStream: unknown
24
- }
25
-
26
- export interface SerializerExtensions extends DefaultSerializerExtensions {}
27
-
28
- export type Serializable = Date | undefined | Error | FormData | bigint
29
-
30
- export type SerializerStringify<T> = SerializerStringifyBy<T, Serializable>
31
-
32
- export type SerializerParse<T> = SerializerParseBy<T, Serializable>