@tanstack/router-core 1.167.1 → 1.167.3
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 +15 -12
- package/dist/cjs/Matches.cjs.map +1 -1
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/cjs/config.cjs +9 -8
- package/dist/cjs/config.cjs.map +1 -1
- package/dist/cjs/defer.cjs +37 -21
- package/dist/cjs/defer.cjs.map +1 -1
- package/dist/cjs/index.cjs +87 -89
- package/dist/cjs/isServer/client.cjs +5 -3
- package/dist/cjs/isServer/client.cjs.map +1 -1
- package/dist/cjs/isServer/development.cjs +5 -3
- package/dist/cjs/isServer/development.cjs.map +1 -1
- package/dist/cjs/isServer/server.cjs +5 -3
- package/dist/cjs/isServer/server.cjs.map +1 -1
- package/dist/cjs/link.cjs +5 -4
- package/dist/cjs/link.cjs.map +1 -1
- package/dist/cjs/load-matches.cjs +622 -766
- package/dist/cjs/load-matches.cjs.map +1 -1
- package/dist/cjs/lru-cache.cjs +67 -64
- package/dist/cjs/lru-cache.cjs.map +1 -1
- package/dist/cjs/new-process-route-tree.cjs +707 -792
- package/dist/cjs/new-process-route-tree.cjs.map +1 -1
- package/dist/cjs/not-found.cjs +20 -7
- package/dist/cjs/not-found.cjs.map +1 -1
- package/dist/cjs/path.cjs +221 -232
- package/dist/cjs/path.cjs.map +1 -1
- package/dist/cjs/qss.cjs +62 -28
- package/dist/cjs/qss.cjs.map +1 -1
- package/dist/cjs/redirect.cjs +44 -30
- package/dist/cjs/redirect.cjs.map +1 -1
- package/dist/cjs/rewrite.cjs +56 -56
- package/dist/cjs/rewrite.cjs.map +1 -1
- package/dist/cjs/root.cjs +6 -4
- package/dist/cjs/root.cjs.map +1 -1
- package/dist/cjs/route.cjs +96 -105
- package/dist/cjs/route.cjs.map +1 -1
- package/dist/cjs/router.cjs +1154 -1524
- package/dist/cjs/router.cjs.map +1 -1
- package/dist/cjs/scroll-restoration.cjs +189 -207
- package/dist/cjs/scroll-restoration.cjs.map +1 -1
- package/dist/cjs/searchMiddleware.cjs +48 -37
- package/dist/cjs/searchMiddleware.cjs.map +1 -1
- package/dist/cjs/searchParams.cjs +57 -45
- package/dist/cjs/searchParams.cjs.map +1 -1
- package/dist/cjs/ssr/client.cjs +6 -8
- package/dist/cjs/ssr/constants.cjs +6 -5
- package/dist/cjs/ssr/constants.cjs.map +1 -1
- package/dist/cjs/ssr/createRequestHandler.cjs +41 -59
- package/dist/cjs/ssr/createRequestHandler.cjs.map +1 -1
- package/dist/cjs/ssr/handlerCallback.cjs +5 -4
- package/dist/cjs/ssr/handlerCallback.cjs.map +1 -1
- package/dist/cjs/ssr/headers.cjs +17 -26
- package/dist/cjs/ssr/headers.cjs.map +1 -1
- package/dist/cjs/ssr/json.cjs +8 -4
- package/dist/cjs/ssr/json.cjs.map +1 -1
- package/dist/cjs/ssr/serializer/RawStream.cjs +268 -268
- package/dist/cjs/ssr/serializer/RawStream.cjs.map +1 -1
- package/dist/cjs/ssr/serializer/ShallowErrorPlugin.cjs +31 -32
- package/dist/cjs/ssr/serializer/ShallowErrorPlugin.cjs.map +1 -1
- package/dist/cjs/ssr/serializer/seroval-plugins.cjs +12 -12
- package/dist/cjs/ssr/serializer/seroval-plugins.cjs.map +1 -1
- package/dist/cjs/ssr/serializer/transformer.cjs +45 -41
- package/dist/cjs/ssr/serializer/transformer.cjs.map +1 -1
- package/dist/cjs/ssr/server.cjs +12 -14
- package/dist/cjs/ssr/ssr-client.cjs +173 -211
- package/dist/cjs/ssr/ssr-client.cjs.map +1 -1
- package/dist/cjs/ssr/ssr-match-id.cjs +6 -5
- package/dist/cjs/ssr/ssr-match-id.cjs.map +1 -1
- package/dist/cjs/ssr/ssr-server.cjs +266 -300
- package/dist/cjs/ssr/ssr-server.cjs.map +1 -1
- package/dist/cjs/ssr/transformStreamWithRouter.cjs +317 -337
- package/dist/cjs/ssr/transformStreamWithRouter.cjs.map +1 -1
- package/dist/cjs/ssr/tsrScript.cjs +6 -4
- package/dist/cjs/ssr/tsrScript.cjs.map +1 -1
- package/dist/cjs/utils/batch.cjs +13 -13
- package/dist/cjs/utils/batch.cjs.map +1 -1
- package/dist/cjs/utils.cjs +274 -208
- package/dist/cjs/utils.cjs.map +1 -1
- package/dist/esm/Matches.js +16 -13
- package/dist/esm/Matches.js.map +1 -1
- package/dist/esm/config.js +10 -9
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/defer.js +37 -22
- package/dist/esm/defer.js.map +1 -1
- package/dist/esm/index.js +12 -82
- package/dist/esm/isServer/client.js +6 -5
- package/dist/esm/isServer/client.js.map +1 -1
- package/dist/esm/isServer/development.js +6 -5
- package/dist/esm/isServer/development.js.map +1 -1
- package/dist/esm/isServer/server.js +6 -5
- package/dist/esm/isServer/server.js.map +1 -1
- package/dist/esm/link.js +6 -5
- package/dist/esm/link.js.map +1 -1
- package/dist/esm/load-matches.js +617 -765
- package/dist/esm/load-matches.js.map +1 -1
- package/dist/esm/lru-cache.js +68 -65
- package/dist/esm/lru-cache.js.map +1 -1
- package/dist/esm/new-process-route-tree.js +705 -797
- package/dist/esm/new-process-route-tree.js.map +1 -1
- package/dist/esm/not-found.js +21 -9
- package/dist/esm/not-found.js.map +1 -1
- package/dist/esm/path.js +220 -241
- package/dist/esm/path.js.map +1 -1
- package/dist/esm/qss.js +63 -30
- package/dist/esm/qss.js.map +1 -1
- package/dist/esm/redirect.js +45 -34
- package/dist/esm/redirect.js.map +1 -1
- package/dist/esm/rewrite.js +57 -60
- package/dist/esm/rewrite.js.map +1 -1
- package/dist/esm/root.js +7 -5
- package/dist/esm/root.js.map +1 -1
- package/dist/esm/route.js +92 -105
- package/dist/esm/route.js.map +1 -1
- package/dist/esm/router.js +1148 -1527
- package/dist/esm/router.js.map +1 -1
- package/dist/esm/scroll-restoration.js +188 -213
- package/dist/esm/scroll-restoration.js.map +1 -1
- package/dist/esm/searchMiddleware.js +48 -38
- package/dist/esm/searchMiddleware.js.map +1 -1
- package/dist/esm/searchParams.js +57 -48
- package/dist/esm/searchParams.js.map +1 -1
- package/dist/esm/ssr/client.js +1 -6
- package/dist/esm/ssr/constants.js +7 -7
- package/dist/esm/ssr/constants.js.map +1 -1
- package/dist/esm/ssr/createRequestHandler.js +39 -58
- package/dist/esm/ssr/createRequestHandler.js.map +1 -1
- package/dist/esm/ssr/handlerCallback.js +6 -5
- package/dist/esm/ssr/handlerCallback.js.map +1 -1
- package/dist/esm/ssr/headers.js +16 -26
- package/dist/esm/ssr/headers.js.map +1 -1
- package/dist/esm/ssr/json.js +9 -5
- package/dist/esm/ssr/json.js.map +1 -1
- package/dist/esm/ssr/serializer/RawStream.js +267 -273
- package/dist/esm/ssr/serializer/RawStream.js.map +1 -1
- package/dist/esm/ssr/serializer/ShallowErrorPlugin.js +31 -32
- package/dist/esm/ssr/serializer/ShallowErrorPlugin.js.map +1 -1
- package/dist/esm/ssr/serializer/seroval-plugins.js +10 -11
- package/dist/esm/ssr/serializer/seroval-plugins.js.map +1 -1
- package/dist/esm/ssr/serializer/transformer.js +44 -43
- package/dist/esm/ssr/serializer/transformer.js.map +1 -1
- package/dist/esm/ssr/server.js +2 -12
- package/dist/esm/ssr/ssr-client.js +169 -209
- package/dist/esm/ssr/ssr-client.js.map +1 -1
- package/dist/esm/ssr/ssr-match-id.js +7 -7
- package/dist/esm/ssr/ssr-match-id.js.map +1 -1
- package/dist/esm/ssr/ssr-server.js +262 -300
- package/dist/esm/ssr/ssr-server.js.map +1 -1
- package/dist/esm/ssr/transformStreamWithRouter.js +315 -338
- package/dist/esm/ssr/transformStreamWithRouter.js.map +1 -1
- package/dist/esm/ssr/tsrScript.js +6 -5
- package/dist/esm/ssr/tsrScript.js.map +1 -1
- package/dist/esm/utils/batch.js +13 -14
- package/dist/esm/utils/batch.js.map +1 -1
- package/dist/esm/utils.js +273 -224
- package/dist/esm/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/load-matches.ts +4 -1
- package/src/router.ts +2 -1
- package/dist/cjs/index.cjs.map +0 -1
- package/dist/cjs/ssr/client.cjs.map +0 -1
- package/dist/cjs/ssr/server.cjs.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/ssr/client.js.map +0 -1
- package/dist/esm/ssr/server.js.map +0 -1
|
@@ -1,312 +1,274 @@
|
|
|
1
|
-
import { crossSerializeStream, getCrossReferenceHeader } from "seroval";
|
|
2
|
-
import invariant from "tiny-invariant";
|
|
3
1
|
import { decodePath } from "../utils.js";
|
|
4
2
|
import { createLRUCache } from "../lru-cache.js";
|
|
5
|
-
import
|
|
6
|
-
import { TSR_SCRIPT_BARRIER_ID, GLOBAL_TSR } from "./constants.js";
|
|
7
|
-
import { dehydrateSsrMatchId } from "./ssr-match-id.js";
|
|
8
|
-
import { defaultSerovalPlugins } from "./serializer/seroval-plugins.js";
|
|
3
|
+
import { GLOBAL_TSR, TSR_SCRIPT_BARRIER_ID } from "./constants.js";
|
|
9
4
|
import { makeSsrSerovalPlugin } from "./serializer/transformer.js";
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
5
|
+
import { defaultSerovalPlugins } from "./serializer/seroval-plugins.js";
|
|
6
|
+
import { dehydrateSsrMatchId } from "./ssr-match-id.js";
|
|
7
|
+
import tsrScript_default from "./tsrScript.js";
|
|
8
|
+
import invariant from "tiny-invariant";
|
|
9
|
+
import { crossSerializeStream, getCrossReferenceHeader } from "seroval";
|
|
10
|
+
//#region src/ssr/ssr-server.ts
|
|
11
|
+
var SCOPE_ID = "tsr";
|
|
12
|
+
var TSR_PREFIX = GLOBAL_TSR + ".router=";
|
|
13
|
+
var P_PREFIX = GLOBAL_TSR + ".p(()=>";
|
|
14
|
+
var P_SUFFIX = ")";
|
|
14
15
|
function dehydrateMatch(match) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
dehydratedMatch[shorthand] = match[key];
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
if (match.globalNotFound) {
|
|
32
|
-
dehydratedMatch.g = true;
|
|
33
|
-
}
|
|
34
|
-
return dehydratedMatch;
|
|
35
|
-
}
|
|
36
|
-
const INITIAL_SCRIPTS = [
|
|
37
|
-
getCrossReferenceHeader(SCOPE_ID),
|
|
38
|
-
minifiedTsrBootStrapScript
|
|
39
|
-
];
|
|
40
|
-
class ScriptBuffer {
|
|
41
|
-
constructor(router) {
|
|
42
|
-
this._scriptBarrierLifted = false;
|
|
43
|
-
this._cleanedUp = false;
|
|
44
|
-
this._pendingMicrotask = false;
|
|
45
|
-
this.router = router;
|
|
46
|
-
this._queue = INITIAL_SCRIPTS.slice();
|
|
47
|
-
}
|
|
48
|
-
enqueue(script) {
|
|
49
|
-
if (this._cleanedUp) return;
|
|
50
|
-
this._queue.push(script);
|
|
51
|
-
if (this._scriptBarrierLifted && !this._pendingMicrotask) {
|
|
52
|
-
this._pendingMicrotask = true;
|
|
53
|
-
queueMicrotask(() => {
|
|
54
|
-
this._pendingMicrotask = false;
|
|
55
|
-
this.injectBufferedScripts();
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
liftBarrier() {
|
|
60
|
-
if (this._scriptBarrierLifted || this._cleanedUp) return;
|
|
61
|
-
this._scriptBarrierLifted = true;
|
|
62
|
-
if (this._queue.length > 0 && !this._pendingMicrotask) {
|
|
63
|
-
this._pendingMicrotask = true;
|
|
64
|
-
queueMicrotask(() => {
|
|
65
|
-
this._pendingMicrotask = false;
|
|
66
|
-
this.injectBufferedScripts();
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Flushes any pending scripts synchronously.
|
|
72
|
-
* Call this before emitting onSerializationFinished to ensure all scripts are injected.
|
|
73
|
-
*
|
|
74
|
-
* IMPORTANT: Only injects if the barrier has been lifted. Before the barrier is lifted,
|
|
75
|
-
* scripts should remain in the queue so takeBufferedScripts() can retrieve them
|
|
76
|
-
*/
|
|
77
|
-
flush() {
|
|
78
|
-
if (!this._scriptBarrierLifted) return;
|
|
79
|
-
if (this._cleanedUp) return;
|
|
80
|
-
this._pendingMicrotask = false;
|
|
81
|
-
const scriptsToInject = this.takeAll();
|
|
82
|
-
if (scriptsToInject && this.router?.serverSsr) {
|
|
83
|
-
this.router.serverSsr.injectScript(scriptsToInject);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
takeAll() {
|
|
87
|
-
const bufferedScripts = this._queue;
|
|
88
|
-
this._queue = [];
|
|
89
|
-
if (bufferedScripts.length === 0) {
|
|
90
|
-
return void 0;
|
|
91
|
-
}
|
|
92
|
-
if (bufferedScripts.length === 1) {
|
|
93
|
-
return bufferedScripts[0] + ";document.currentScript.remove()";
|
|
94
|
-
}
|
|
95
|
-
return bufferedScripts.join(";") + ";document.currentScript.remove()";
|
|
96
|
-
}
|
|
97
|
-
injectBufferedScripts() {
|
|
98
|
-
if (this._cleanedUp) return;
|
|
99
|
-
if (this._queue.length === 0) return;
|
|
100
|
-
const scriptsToInject = this.takeAll();
|
|
101
|
-
if (scriptsToInject && this.router?.serverSsr) {
|
|
102
|
-
this.router.serverSsr.injectScript(scriptsToInject);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
cleanup() {
|
|
106
|
-
this._cleanedUp = true;
|
|
107
|
-
this._queue = [];
|
|
108
|
-
this.router = void 0;
|
|
109
|
-
}
|
|
16
|
+
const dehydratedMatch = {
|
|
17
|
+
i: dehydrateSsrMatchId(match.id),
|
|
18
|
+
u: match.updatedAt,
|
|
19
|
+
s: match.status
|
|
20
|
+
};
|
|
21
|
+
for (const [key, shorthand] of [
|
|
22
|
+
["__beforeLoadContext", "b"],
|
|
23
|
+
["loaderData", "l"],
|
|
24
|
+
["error", "e"],
|
|
25
|
+
["ssr", "ssr"]
|
|
26
|
+
]) if (match[key] !== void 0) dehydratedMatch[shorthand] = match[key];
|
|
27
|
+
if (match.globalNotFound) dehydratedMatch.g = true;
|
|
28
|
+
return dehydratedMatch;
|
|
110
29
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
30
|
+
var INITIAL_SCRIPTS = [getCrossReferenceHeader(SCOPE_ID), tsrScript_default];
|
|
31
|
+
var ScriptBuffer = class {
|
|
32
|
+
constructor(router) {
|
|
33
|
+
this._scriptBarrierLifted = false;
|
|
34
|
+
this._cleanedUp = false;
|
|
35
|
+
this._pendingMicrotask = false;
|
|
36
|
+
this.router = router;
|
|
37
|
+
this._queue = INITIAL_SCRIPTS.slice();
|
|
38
|
+
}
|
|
39
|
+
enqueue(script) {
|
|
40
|
+
if (this._cleanedUp) return;
|
|
41
|
+
this._queue.push(script);
|
|
42
|
+
if (this._scriptBarrierLifted && !this._pendingMicrotask) {
|
|
43
|
+
this._pendingMicrotask = true;
|
|
44
|
+
queueMicrotask(() => {
|
|
45
|
+
this._pendingMicrotask = false;
|
|
46
|
+
this.injectBufferedScripts();
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
liftBarrier() {
|
|
51
|
+
if (this._scriptBarrierLifted || this._cleanedUp) return;
|
|
52
|
+
this._scriptBarrierLifted = true;
|
|
53
|
+
if (this._queue.length > 0 && !this._pendingMicrotask) {
|
|
54
|
+
this._pendingMicrotask = true;
|
|
55
|
+
queueMicrotask(() => {
|
|
56
|
+
this._pendingMicrotask = false;
|
|
57
|
+
this.injectBufferedScripts();
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Flushes any pending scripts synchronously.
|
|
63
|
+
* Call this before emitting onSerializationFinished to ensure all scripts are injected.
|
|
64
|
+
*
|
|
65
|
+
* IMPORTANT: Only injects if the barrier has been lifted. Before the barrier is lifted,
|
|
66
|
+
* scripts should remain in the queue so takeBufferedScripts() can retrieve them
|
|
67
|
+
*/
|
|
68
|
+
flush() {
|
|
69
|
+
if (!this._scriptBarrierLifted) return;
|
|
70
|
+
if (this._cleanedUp) return;
|
|
71
|
+
this._pendingMicrotask = false;
|
|
72
|
+
const scriptsToInject = this.takeAll();
|
|
73
|
+
if (scriptsToInject && this.router?.serverSsr) this.router.serverSsr.injectScript(scriptsToInject);
|
|
74
|
+
}
|
|
75
|
+
takeAll() {
|
|
76
|
+
const bufferedScripts = this._queue;
|
|
77
|
+
this._queue = [];
|
|
78
|
+
if (bufferedScripts.length === 0) return;
|
|
79
|
+
if (bufferedScripts.length === 1) return bufferedScripts[0] + ";document.currentScript.remove()";
|
|
80
|
+
return bufferedScripts.join(";") + ";document.currentScript.remove()";
|
|
81
|
+
}
|
|
82
|
+
injectBufferedScripts() {
|
|
83
|
+
if (this._cleanedUp) return;
|
|
84
|
+
if (this._queue.length === 0) return;
|
|
85
|
+
const scriptsToInject = this.takeAll();
|
|
86
|
+
if (scriptsToInject && this.router?.serverSsr) this.router.serverSsr.injectScript(scriptsToInject);
|
|
87
|
+
}
|
|
88
|
+
cleanup() {
|
|
89
|
+
this._cleanedUp = true;
|
|
90
|
+
this._queue = [];
|
|
91
|
+
this.router = void 0;
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
var isProd = process.env.NODE_ENV === "production";
|
|
95
|
+
var MANIFEST_CACHE_SIZE = 100;
|
|
96
|
+
var manifestCaches = /* @__PURE__ */ new WeakMap();
|
|
114
97
|
function getManifestCache(manifest) {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
98
|
+
const cache = manifestCaches.get(manifest);
|
|
99
|
+
if (cache) return cache;
|
|
100
|
+
const newCache = createLRUCache(MANIFEST_CACHE_SIZE);
|
|
101
|
+
manifestCaches.set(manifest, newCache);
|
|
102
|
+
return newCache;
|
|
120
103
|
}
|
|
121
|
-
function attachRouterServerSsrUtils({
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
attrs: {
|
|
257
|
-
nonce: router.options.ssr?.nonce,
|
|
258
|
-
className: "$tsr",
|
|
259
|
-
id: TSR_SCRIPT_BARRIER_ID
|
|
260
|
-
},
|
|
261
|
-
children: scripts
|
|
262
|
-
};
|
|
263
|
-
return serverBufferedScript;
|
|
264
|
-
},
|
|
265
|
-
liftScriptBarrier() {
|
|
266
|
-
scriptBuffer.liftBarrier();
|
|
267
|
-
},
|
|
268
|
-
takeBufferedHtml() {
|
|
269
|
-
if (!injectedHtmlBuffer) {
|
|
270
|
-
return void 0;
|
|
271
|
-
}
|
|
272
|
-
const buffered = injectedHtmlBuffer;
|
|
273
|
-
injectedHtmlBuffer = "";
|
|
274
|
-
return buffered;
|
|
275
|
-
},
|
|
276
|
-
cleanup() {
|
|
277
|
-
if (!router.serverSsr) return;
|
|
278
|
-
renderFinishedListeners.length = 0;
|
|
279
|
-
serializationFinishedListeners.length = 0;
|
|
280
|
-
injectedHtmlBuffer = "";
|
|
281
|
-
scriptBuffer.cleanup();
|
|
282
|
-
router.serverSsr = void 0;
|
|
283
|
-
}
|
|
284
|
-
};
|
|
104
|
+
function attachRouterServerSsrUtils({ router, manifest }) {
|
|
105
|
+
router.ssr = { manifest };
|
|
106
|
+
let _dehydrated = false;
|
|
107
|
+
let _serializationFinished = false;
|
|
108
|
+
const renderFinishedListeners = [];
|
|
109
|
+
const serializationFinishedListeners = [];
|
|
110
|
+
const scriptBuffer = new ScriptBuffer(router);
|
|
111
|
+
let injectedHtmlBuffer = "";
|
|
112
|
+
router.serverSsr = {
|
|
113
|
+
injectHtml: (html) => {
|
|
114
|
+
if (!html) return;
|
|
115
|
+
injectedHtmlBuffer += html;
|
|
116
|
+
router.emit({ type: "onInjectedHtml" });
|
|
117
|
+
},
|
|
118
|
+
injectScript: (script) => {
|
|
119
|
+
if (!script) return;
|
|
120
|
+
const html = `<script${router.options.ssr?.nonce ? ` nonce='${router.options.ssr.nonce}'` : ""}>${script}<\/script>`;
|
|
121
|
+
router.serverSsr.injectHtml(html);
|
|
122
|
+
},
|
|
123
|
+
dehydrate: async () => {
|
|
124
|
+
invariant(!_dehydrated, "router is already dehydrated!");
|
|
125
|
+
let matchesToDehydrate = router.state.matches;
|
|
126
|
+
if (router.isShell()) matchesToDehydrate = matchesToDehydrate.slice(0, 1);
|
|
127
|
+
const matches = matchesToDehydrate.map(dehydrateMatch);
|
|
128
|
+
let manifestToDehydrate = void 0;
|
|
129
|
+
if (manifest) {
|
|
130
|
+
const currentRouteIdsList = matchesToDehydrate.map((m) => m.routeId);
|
|
131
|
+
const manifestCacheKey = currentRouteIdsList.join("\0");
|
|
132
|
+
let filteredRoutes;
|
|
133
|
+
if (isProd) filteredRoutes = getManifestCache(manifest).get(manifestCacheKey);
|
|
134
|
+
if (!filteredRoutes) {
|
|
135
|
+
const currentRouteIds = new Set(currentRouteIdsList);
|
|
136
|
+
const nextFilteredRoutes = {};
|
|
137
|
+
for (const routeId in manifest.routes) {
|
|
138
|
+
const routeManifest = manifest.routes[routeId];
|
|
139
|
+
if (currentRouteIds.has(routeId)) nextFilteredRoutes[routeId] = routeManifest;
|
|
140
|
+
else if (routeManifest.assets && routeManifest.assets.length > 0) nextFilteredRoutes[routeId] = { assets: routeManifest.assets };
|
|
141
|
+
}
|
|
142
|
+
if (isProd) getManifestCache(manifest).set(manifestCacheKey, nextFilteredRoutes);
|
|
143
|
+
filteredRoutes = nextFilteredRoutes;
|
|
144
|
+
}
|
|
145
|
+
manifestToDehydrate = { routes: filteredRoutes };
|
|
146
|
+
}
|
|
147
|
+
const dehydratedRouter = {
|
|
148
|
+
manifest: manifestToDehydrate,
|
|
149
|
+
matches
|
|
150
|
+
};
|
|
151
|
+
const lastMatchId = matchesToDehydrate[matchesToDehydrate.length - 1]?.id;
|
|
152
|
+
if (lastMatchId) dehydratedRouter.lastMatchId = dehydrateSsrMatchId(lastMatchId);
|
|
153
|
+
const dehydratedData = await router.options.dehydrate?.();
|
|
154
|
+
if (dehydratedData) dehydratedRouter.dehydratedData = dehydratedData;
|
|
155
|
+
_dehydrated = true;
|
|
156
|
+
const trackPlugins = { didRun: false };
|
|
157
|
+
const serializationAdapters = router.options.serializationAdapters;
|
|
158
|
+
const plugins = serializationAdapters ? serializationAdapters.map((t) => makeSsrSerovalPlugin(t, trackPlugins)).concat(defaultSerovalPlugins) : defaultSerovalPlugins;
|
|
159
|
+
const signalSerializationComplete = () => {
|
|
160
|
+
_serializationFinished = true;
|
|
161
|
+
try {
|
|
162
|
+
serializationFinishedListeners.forEach((l) => l());
|
|
163
|
+
router.emit({ type: "onSerializationFinished" });
|
|
164
|
+
} catch (err) {
|
|
165
|
+
console.error("Serialization listener error:", err);
|
|
166
|
+
} finally {
|
|
167
|
+
serializationFinishedListeners.length = 0;
|
|
168
|
+
renderFinishedListeners.length = 0;
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
crossSerializeStream(dehydratedRouter, {
|
|
172
|
+
refs: /* @__PURE__ */ new Map(),
|
|
173
|
+
plugins,
|
|
174
|
+
onSerialize: (data, initial) => {
|
|
175
|
+
let serialized = initial ? TSR_PREFIX + data : data;
|
|
176
|
+
if (trackPlugins.didRun) serialized = P_PREFIX + serialized + P_SUFFIX;
|
|
177
|
+
scriptBuffer.enqueue(serialized);
|
|
178
|
+
},
|
|
179
|
+
scopeId: SCOPE_ID,
|
|
180
|
+
onDone: () => {
|
|
181
|
+
scriptBuffer.enqueue(GLOBAL_TSR + ".e()");
|
|
182
|
+
scriptBuffer.flush();
|
|
183
|
+
signalSerializationComplete();
|
|
184
|
+
},
|
|
185
|
+
onError: (err) => {
|
|
186
|
+
console.error("Serialization error:", err);
|
|
187
|
+
signalSerializationComplete();
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
},
|
|
191
|
+
isDehydrated() {
|
|
192
|
+
return _dehydrated;
|
|
193
|
+
},
|
|
194
|
+
isSerializationFinished() {
|
|
195
|
+
return _serializationFinished;
|
|
196
|
+
},
|
|
197
|
+
onRenderFinished: (listener) => renderFinishedListeners.push(listener),
|
|
198
|
+
onSerializationFinished: (listener) => serializationFinishedListeners.push(listener),
|
|
199
|
+
setRenderFinished: () => {
|
|
200
|
+
try {
|
|
201
|
+
renderFinishedListeners.forEach((l) => l());
|
|
202
|
+
} catch (err) {
|
|
203
|
+
console.error("Error in render finished listener:", err);
|
|
204
|
+
} finally {
|
|
205
|
+
renderFinishedListeners.length = 0;
|
|
206
|
+
}
|
|
207
|
+
scriptBuffer.liftBarrier();
|
|
208
|
+
},
|
|
209
|
+
takeBufferedScripts() {
|
|
210
|
+
const scripts = scriptBuffer.takeAll();
|
|
211
|
+
return {
|
|
212
|
+
tag: "script",
|
|
213
|
+
attrs: {
|
|
214
|
+
nonce: router.options.ssr?.nonce,
|
|
215
|
+
className: "$tsr",
|
|
216
|
+
id: TSR_SCRIPT_BARRIER_ID
|
|
217
|
+
},
|
|
218
|
+
children: scripts
|
|
219
|
+
};
|
|
220
|
+
},
|
|
221
|
+
liftScriptBarrier() {
|
|
222
|
+
scriptBuffer.liftBarrier();
|
|
223
|
+
},
|
|
224
|
+
takeBufferedHtml() {
|
|
225
|
+
if (!injectedHtmlBuffer) return;
|
|
226
|
+
const buffered = injectedHtmlBuffer;
|
|
227
|
+
injectedHtmlBuffer = "";
|
|
228
|
+
return buffered;
|
|
229
|
+
},
|
|
230
|
+
cleanup() {
|
|
231
|
+
if (!router.serverSsr) return;
|
|
232
|
+
renderFinishedListeners.length = 0;
|
|
233
|
+
serializationFinishedListeners.length = 0;
|
|
234
|
+
injectedHtmlBuffer = "";
|
|
235
|
+
scriptBuffer.cleanup();
|
|
236
|
+
router.serverSsr = void 0;
|
|
237
|
+
}
|
|
238
|
+
};
|
|
285
239
|
}
|
|
240
|
+
/**
|
|
241
|
+
* Get the origin for the request.
|
|
242
|
+
*
|
|
243
|
+
* SECURITY: We intentionally do NOT trust the Origin header for determining
|
|
244
|
+
* the router's origin. The Origin header can be spoofed by attackers, which
|
|
245
|
+
* could lead to SSRF-like vulnerabilities where redirects are constructed
|
|
246
|
+
* using a malicious origin (CVE-2024-34351).
|
|
247
|
+
*
|
|
248
|
+
* Instead, we derive the origin from request.url, which is typically set by
|
|
249
|
+
* the server infrastructure (not client-controlled headers).
|
|
250
|
+
*
|
|
251
|
+
* For applications behind proxies that need to trust forwarded headers,
|
|
252
|
+
* use the router's `origin` option to explicitly configure a trusted origin.
|
|
253
|
+
*/
|
|
286
254
|
function getOrigin(request) {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
return "http://localhost";
|
|
255
|
+
try {
|
|
256
|
+
return new URL(request.url).origin;
|
|
257
|
+
} catch {}
|
|
258
|
+
return "http://localhost";
|
|
292
259
|
}
|
|
293
260
|
function getNormalizedURL(url, base) {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
handledProtocolRelativeURL
|
|
304
|
-
};
|
|
261
|
+
if (typeof url === "string") url = url.replace("\\", "%5C");
|
|
262
|
+
const rawUrl = new URL(url, base);
|
|
263
|
+
const { path: decodedPathname, handledProtocolRelativeURL } = decodePath(rawUrl.pathname);
|
|
264
|
+
const searchParams = new URLSearchParams(rawUrl.search);
|
|
265
|
+
const normalizedHref = decodedPathname + (searchParams.size > 0 ? "?" : "") + searchParams.toString() + rawUrl.hash;
|
|
266
|
+
return {
|
|
267
|
+
url: new URL(normalizedHref, rawUrl.origin),
|
|
268
|
+
handledProtocolRelativeURL
|
|
269
|
+
};
|
|
305
270
|
}
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
getOrigin
|
|
311
|
-
};
|
|
312
|
-
//# sourceMappingURL=ssr-server.js.map
|
|
271
|
+
//#endregion
|
|
272
|
+
export { attachRouterServerSsrUtils, getNormalizedURL, getOrigin };
|
|
273
|
+
|
|
274
|
+
//# sourceMappingURL=ssr-server.js.map
|