@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.
- package/dist/cjs/Matches.cjs.map +1 -1
- package/dist/cjs/Matches.d.cts +31 -1
- package/dist/cjs/RouterProvider.d.cts +2 -1
- package/dist/cjs/defer.cjs +1 -1
- package/dist/cjs/defer.cjs.map +1 -1
- package/dist/cjs/global.d.cts +7 -0
- package/dist/cjs/index.cjs +1 -2
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +6 -6
- package/dist/cjs/link.cjs.map +1 -1
- package/dist/cjs/link.d.cts +12 -0
- package/dist/cjs/lru-cache.cjs +62 -0
- package/dist/cjs/lru-cache.cjs.map +1 -0
- package/dist/cjs/lru-cache.d.cts +5 -0
- package/dist/cjs/not-found.cjs +1 -1
- package/dist/cjs/not-found.cjs.map +1 -1
- package/dist/cjs/path.cjs +316 -148
- package/dist/cjs/path.cjs.map +1 -1
- package/dist/cjs/path.d.cts +18 -24
- package/dist/cjs/qss.cjs +2 -4
- package/dist/cjs/qss.cjs.map +1 -1
- package/dist/cjs/qss.d.cts +9 -0
- package/dist/cjs/redirect.cjs +3 -0
- package/dist/cjs/redirect.cjs.map +1 -1
- package/dist/cjs/route.cjs +6 -12
- package/dist/cjs/route.cjs.map +1 -1
- package/dist/cjs/route.d.cts +29 -9
- package/dist/cjs/router.cjs +454 -272
- package/dist/cjs/router.cjs.map +1 -1
- package/dist/cjs/router.d.cts +55 -85
- package/dist/cjs/scroll-restoration.cjs +20 -13
- package/dist/cjs/scroll-restoration.cjs.map +1 -1
- package/dist/cjs/scroll-restoration.d.cts +9 -1
- package/dist/cjs/searchMiddleware.cjs.map +1 -1
- package/dist/cjs/searchParams.cjs.map +1 -1
- package/dist/cjs/ssr/client.cjs +10 -0
- package/dist/cjs/ssr/client.cjs.map +1 -0
- package/dist/cjs/ssr/client.d.cts +5 -0
- package/dist/cjs/ssr/createRequestHandler.cjs +50 -0
- package/dist/cjs/ssr/createRequestHandler.cjs.map +1 -0
- package/dist/cjs/ssr/createRequestHandler.d.cts +9 -0
- package/dist/cjs/ssr/handlerCallback.cjs +7 -0
- package/dist/cjs/ssr/handlerCallback.cjs.map +1 -0
- package/dist/cjs/ssr/handlerCallback.d.cts +9 -0
- package/dist/cjs/ssr/headers.cjs +39 -0
- package/dist/cjs/ssr/headers.cjs.map +1 -0
- package/dist/cjs/ssr/headers.d.cts +5 -0
- package/dist/cjs/ssr/json.cjs +14 -0
- package/dist/cjs/ssr/json.cjs.map +1 -0
- package/dist/cjs/ssr/json.d.cts +4 -0
- package/dist/cjs/ssr/seroval-plugins.cjs +34 -0
- package/dist/cjs/ssr/seroval-plugins.cjs.map +1 -0
- package/dist/cjs/ssr/seroval-plugins.d.cts +10 -0
- package/dist/cjs/ssr/server.cjs +13 -0
- package/dist/cjs/ssr/server.cjs.map +1 -0
- package/dist/cjs/ssr/server.d.cts +6 -0
- package/dist/cjs/ssr/ssr-client.cjs +159 -0
- package/dist/cjs/ssr/ssr-client.cjs.map +1 -0
- package/dist/cjs/ssr/ssr-client.d.cts +29 -0
- package/dist/cjs/ssr/ssr-server.cjs +107 -0
- package/dist/cjs/ssr/ssr-server.cjs.map +1 -0
- package/dist/cjs/ssr/ssr-server.d.cts +18 -0
- package/dist/cjs/ssr/transformStreamWithRouter.cjs +183 -0
- package/dist/cjs/ssr/transformStreamWithRouter.cjs.map +1 -0
- package/dist/cjs/ssr/transformStreamWithRouter.d.cts +6 -0
- package/dist/cjs/ssr/tsrScript.cjs +4 -0
- package/dist/cjs/ssr/tsrScript.cjs.map +1 -0
- package/dist/cjs/ssr/tsrScript.d.cts +0 -0
- package/dist/cjs/utils.cjs +7 -30
- package/dist/cjs/utils.cjs.map +1 -1
- package/dist/cjs/utils.d.cts +1 -18
- package/dist/esm/Matches.d.ts +31 -1
- package/dist/esm/Matches.js.map +1 -1
- package/dist/esm/RouterProvider.d.ts +2 -1
- package/dist/esm/defer.js +1 -1
- package/dist/esm/defer.js.map +1 -1
- package/dist/esm/global.d.ts +7 -0
- package/dist/esm/index.d.ts +6 -6
- package/dist/esm/index.js +2 -3
- package/dist/esm/link.d.ts +12 -0
- package/dist/esm/link.js.map +1 -1
- package/dist/esm/lru-cache.d.ts +5 -0
- package/dist/esm/lru-cache.js +62 -0
- package/dist/esm/lru-cache.js.map +1 -0
- package/dist/esm/not-found.js +1 -1
- package/dist/esm/not-found.js.map +1 -1
- package/dist/esm/path.d.ts +18 -24
- package/dist/esm/path.js +316 -148
- package/dist/esm/path.js.map +1 -1
- package/dist/esm/qss.d.ts +9 -0
- package/dist/esm/qss.js +2 -4
- package/dist/esm/qss.js.map +1 -1
- package/dist/esm/redirect.js +3 -0
- package/dist/esm/redirect.js.map +1 -1
- package/dist/esm/route.d.ts +29 -9
- package/dist/esm/route.js +6 -12
- package/dist/esm/route.js.map +1 -1
- package/dist/esm/router.d.ts +55 -85
- package/dist/esm/router.js +463 -281
- package/dist/esm/router.js.map +1 -1
- package/dist/esm/scroll-restoration.d.ts +9 -1
- package/dist/esm/scroll-restoration.js +20 -13
- package/dist/esm/scroll-restoration.js.map +1 -1
- package/dist/esm/searchMiddleware.js.map +1 -1
- package/dist/esm/searchParams.js.map +1 -1
- package/dist/esm/ssr/client.d.ts +5 -0
- package/dist/esm/ssr/client.js +10 -0
- package/dist/esm/ssr/client.js.map +1 -0
- package/dist/esm/ssr/createRequestHandler.d.ts +9 -0
- package/dist/esm/ssr/createRequestHandler.js +50 -0
- package/dist/esm/ssr/createRequestHandler.js.map +1 -0
- package/dist/esm/ssr/handlerCallback.d.ts +9 -0
- package/dist/esm/ssr/handlerCallback.js +7 -0
- package/dist/esm/ssr/handlerCallback.js.map +1 -0
- package/dist/esm/ssr/headers.d.ts +5 -0
- package/dist/esm/ssr/headers.js +39 -0
- package/dist/esm/ssr/headers.js.map +1 -0
- package/dist/esm/ssr/json.d.ts +4 -0
- package/dist/esm/ssr/json.js +14 -0
- package/dist/esm/ssr/json.js.map +1 -0
- package/dist/esm/ssr/seroval-plugins.d.ts +10 -0
- package/dist/esm/ssr/seroval-plugins.js +34 -0
- package/dist/esm/ssr/seroval-plugins.js.map +1 -0
- package/dist/esm/ssr/server.d.ts +6 -0
- package/dist/esm/ssr/server.js +13 -0
- package/dist/esm/ssr/server.js.map +1 -0
- package/dist/esm/ssr/ssr-client.d.ts +29 -0
- package/dist/esm/ssr/ssr-client.js +159 -0
- package/dist/esm/ssr/ssr-client.js.map +1 -0
- package/dist/esm/ssr/ssr-server.d.ts +18 -0
- package/dist/esm/ssr/ssr-server.js +107 -0
- package/dist/esm/ssr/ssr-server.js.map +1 -0
- package/dist/esm/ssr/transformStreamWithRouter.d.ts +6 -0
- package/dist/esm/ssr/transformStreamWithRouter.js +183 -0
- package/dist/esm/ssr/transformStreamWithRouter.js.map +1 -0
- package/dist/esm/ssr/tsrScript.d.ts +0 -0
- package/dist/esm/ssr/tsrScript.js +5 -0
- package/dist/esm/ssr/tsrScript.js.map +1 -0
- package/dist/esm/utils.d.ts +1 -18
- package/dist/esm/utils.js +8 -31
- package/dist/esm/utils.js.map +1 -1
- package/package.json +29 -2
- package/src/Matches.ts +40 -1
- package/src/RouterProvider.ts +2 -1
- package/src/global.ts +9 -0
- package/src/index.ts +12 -20
- package/src/link.ts +12 -0
- package/src/lru-cache.ts +68 -0
- package/src/path.ts +424 -174
- package/src/qss.ts +2 -6
- package/src/redirect.ts +3 -0
- package/src/route.ts +44 -13
- package/src/router.ts +581 -312
- package/src/scroll-restoration.ts +30 -18
- package/src/ssr/client.ts +5 -0
- package/src/ssr/createRequestHandler.ts +74 -0
- package/src/ssr/handlerCallback.ts +15 -0
- package/src/ssr/headers.ts +51 -0
- package/src/ssr/json.ts +18 -0
- package/src/ssr/seroval-plugins.ts +43 -0
- package/src/ssr/server.ts +10 -0
- package/src/ssr/ssr-client.ts +242 -0
- package/src/ssr/ssr-server.ts +132 -0
- package/src/ssr/transformStreamWithRouter.ts +259 -0
- package/src/ssr/tsrScript.ts +7 -0
- package/src/utils.ts +10 -56
- package/src/vite-env.d.ts +4 -0
- package/dist/cjs/serializer.d.cts +0 -22
- package/dist/esm/serializer.d.ts +0 -22
- 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
|
+
}
|
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
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
return
|
|
430
|
-
.
|
|
431
|
-
.
|
|
432
|
-
.
|
|
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
|
}
|
|
@@ -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/dist/esm/serializer.d.ts
DELETED
|
@@ -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>
|