@bleedingdev/modern-js-runtime 3.2.0-ultramodern.120 → 3.2.0-ultramodern.122
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/boundary-debugger/index.js +4 -0
- package/dist/cjs/cli/index.js +11 -0
- package/dist/cjs/{router/runtime/tanstack/rsc/ClientSlot.js → core/context/extensions.js} +33 -21
- package/dist/cjs/{router/runtime/tanstack/rsc/SlotContext.js → core/context/helmetContext.js} +16 -20
- package/dist/cjs/core/context/index.js +65 -0
- package/dist/cjs/core/react/wrapper.js +6 -4
- package/dist/cjs/core/server/helmet.js +2 -1
- package/dist/cjs/core/server/requestHandler.js +42 -29
- package/dist/cjs/core/server/routerCleanup.js +110 -0
- package/dist/cjs/core/server/scriptOrder.js +75 -4
- package/dist/cjs/core/server/stream/afterTemplate.js +6 -18
- package/dist/cjs/core/server/stream/deferredScript.js +4 -1
- package/dist/cjs/core/server/string/index.js +1 -7
- package/dist/cjs/core/server/string/loadable.js +13 -40
- package/dist/cjs/core/server/string/ssrData.js +1 -1
- package/dist/cjs/core/server/utils.js +31 -8
- package/dist/cjs/exports/head.js +135 -74
- package/dist/cjs/exports/tanstack-router.js +36 -305
- package/dist/cjs/module-federation/index.js +178 -0
- package/dist/cjs/router/cli/code/index.js +1 -47
- package/dist/cjs/router/cli/code/templates.js +1 -14
- package/dist/cjs/router/cli/handler.js +1 -1
- package/dist/cjs/router/cli/index.js +2 -23
- package/dist/cjs/router/runtime/DeferredDataScripts.node.js +16 -4
- package/dist/cjs/router/runtime/PrefetchLink.js +2 -3
- package/dist/cjs/router/runtime/internal.js +20 -13
- package/dist/cjs/router/runtime/lifecycle.js +37 -22
- package/dist/cjs/router/runtime/plugin.js +2 -9
- package/dist/cjs/router/runtime/plugin.node.js +2 -7
- package/dist/cjs/router/runtime/provider.js +107 -0
- package/dist/cjs/router/runtime/utils.js +35 -9
- package/dist/esm/boundary-debugger/index.mjs +4 -0
- package/dist/esm/cli/index.mjs +4 -2
- package/dist/esm/core/context/extensions.mjs +28 -0
- package/dist/esm/core/context/helmetContext.mjs +13 -0
- package/dist/esm/core/context/index.mjs +5 -0
- package/dist/esm/core/react/wrapper.mjs +6 -4
- package/dist/esm/core/server/helmet.mjs +2 -1
- package/dist/esm/core/server/requestHandler.mjs +43 -30
- package/dist/esm/core/server/routerCleanup.mjs +66 -0
- package/dist/esm/core/server/scriptOrder.mjs +60 -1
- package/dist/esm/core/server/stream/afterTemplate.mjs +8 -20
- package/dist/esm/core/server/stream/deferredScript.mjs +4 -1
- package/dist/esm/core/server/string/index.mjs +3 -9
- package/dist/esm/core/server/string/loadable.mjs +11 -38
- package/dist/esm/core/server/string/ssrData.mjs +2 -2
- package/dist/esm/core/server/utils.mjs +31 -8
- package/dist/esm/exports/head.mjs +135 -74
- package/dist/esm/exports/tanstack-router.mjs +30 -4
- package/dist/esm/module-federation/index.mjs +109 -0
- package/dist/esm/router/cli/code/index.mjs +1 -47
- package/dist/esm/router/cli/code/templates.mjs +1 -14
- package/dist/esm/router/cli/handler.mjs +1 -1
- package/dist/esm/router/cli/index.mjs +3 -24
- package/dist/esm/router/runtime/DeferredDataScripts.node.mjs +16 -4
- package/dist/esm/router/runtime/PrefetchLink.mjs +2 -3
- package/dist/esm/router/runtime/internal.mjs +16 -15
- package/dist/esm/router/runtime/lifecycle.mjs +22 -13
- package/dist/esm/router/runtime/plugin.mjs +4 -11
- package/dist/esm/router/runtime/plugin.node.mjs +4 -9
- package/dist/esm/router/runtime/provider.mjs +57 -0
- package/dist/esm/router/runtime/utils.mjs +35 -9
- package/dist/esm-node/boundary-debugger/index.mjs +4 -0
- package/dist/esm-node/cli/index.mjs +4 -2
- package/dist/esm-node/core/context/extensions.mjs +29 -0
- package/dist/esm-node/core/context/helmetContext.mjs +14 -0
- package/dist/esm-node/core/context/index.mjs +5 -0
- package/dist/esm-node/core/react/wrapper.mjs +6 -4
- package/dist/esm-node/core/server/helmet.mjs +2 -1
- package/dist/esm-node/core/server/requestHandler.mjs +43 -30
- package/dist/esm-node/core/server/routerCleanup.mjs +67 -0
- package/dist/esm-node/core/server/scriptOrder.mjs +60 -1
- package/dist/esm-node/core/server/stream/afterTemplate.mjs +8 -20
- package/dist/esm-node/core/server/stream/deferredScript.mjs +4 -1
- package/dist/esm-node/core/server/string/index.mjs +3 -9
- package/dist/esm-node/core/server/string/loadable.mjs +11 -38
- package/dist/esm-node/core/server/string/ssrData.mjs +2 -2
- package/dist/esm-node/core/server/utils.mjs +31 -8
- package/dist/esm-node/exports/head.mjs +135 -74
- package/dist/esm-node/exports/tanstack-router.mjs +30 -4
- package/dist/esm-node/module-federation/index.mjs +110 -0
- package/dist/esm-node/router/cli/code/index.mjs +1 -47
- package/dist/esm-node/router/cli/code/templates.mjs +1 -14
- package/dist/esm-node/router/cli/handler.mjs +1 -1
- package/dist/esm-node/router/cli/index.mjs +3 -24
- package/dist/esm-node/router/runtime/DeferredDataScripts.node.mjs +16 -4
- package/dist/esm-node/router/runtime/PrefetchLink.mjs +2 -3
- package/dist/esm-node/router/runtime/internal.mjs +16 -15
- package/dist/esm-node/router/runtime/lifecycle.mjs +22 -13
- package/dist/esm-node/router/runtime/plugin.mjs +4 -11
- package/dist/esm-node/router/runtime/plugin.node.mjs +4 -9
- package/dist/esm-node/router/runtime/provider.mjs +58 -0
- package/dist/esm-node/router/runtime/utils.mjs +35 -9
- package/dist/types/cli/index.d.ts +3 -1
- package/dist/types/core/context/extensions.d.ts +37 -0
- package/dist/types/core/context/helmetContext.d.ts +10 -0
- package/dist/types/core/context/index.d.ts +6 -0
- package/dist/types/core/context/runtime.d.ts +1 -11
- package/dist/types/core/server/routerCleanup.d.ts +28 -0
- package/dist/types/core/server/scriptOrder.d.ts +24 -0
- package/dist/types/core/server/string/loadable.d.ts +1 -7
- package/dist/types/core/server/utils.d.ts +1 -0
- package/dist/types/exports/tanstack-router.d.ts +88 -7
- package/dist/types/module-federation/index.d.ts +65 -0
- package/dist/types/router/cli/code/index.d.ts +1 -3
- package/dist/types/router/cli/handler.d.ts +0 -3
- package/dist/types/router/runtime/internal.d.ts +1 -0
- package/dist/types/router/runtime/lifecycle.d.ts +2 -0
- package/dist/types/router/runtime/plugin.d.ts +1 -1
- package/dist/types/router/runtime/plugin.node.d.ts +1 -1
- package/dist/types/router/runtime/provider.d.ts +61 -0
- package/package.json +16 -12
- package/rstest.config.mts +2 -4
- package/dist/cjs/router/cli/code/tanstackTypes.js +0 -447
- package/dist/cjs/router/runtime/tanstack/basepathRewrite.js +0 -66
- package/dist/cjs/router/runtime/tanstack/dataMutation.js +0 -349
- package/dist/cjs/router/runtime/tanstack/hydrationBoundary.js +0 -48
- package/dist/cjs/router/runtime/tanstack/outlet.js +0 -58
- package/dist/cjs/router/runtime/tanstack/plugin.js +0 -342
- package/dist/cjs/router/runtime/tanstack/plugin.node.js +0 -272
- package/dist/cjs/router/runtime/tanstack/prefetchLink.js +0 -59
- package/dist/cjs/router/runtime/tanstack/routeTree.js +0 -525
- package/dist/cjs/router/runtime/tanstack/rsc/CompositeComponent.js +0 -79
- package/dist/cjs/router/runtime/tanstack/rsc/ReplayableStream.js +0 -146
- package/dist/cjs/router/runtime/tanstack/rsc/RscNodeRenderer.js +0 -69
- package/dist/cjs/router/runtime/tanstack/rsc/client.js +0 -97
- package/dist/cjs/router/runtime/tanstack/rsc/createRscProxy.js +0 -145
- package/dist/cjs/router/runtime/tanstack/rsc/index.js +0 -46
- package/dist/cjs/router/runtime/tanstack/rsc/server.js +0 -250
- package/dist/cjs/router/runtime/tanstack/rsc/slotUsageSanitizer.js +0 -69
- package/dist/cjs/router/runtime/tanstack/rsc/symbols.js +0 -77
- package/dist/cjs/ssr/index.node.js +0 -125
- package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +0 -88
- package/dist/cjs/ssr/serverRender/renderToString/entry.js +0 -200
- package/dist/cjs/ssr/serverRender/types.js +0 -40
- package/dist/esm/router/cli/code/tanstackTypes.mjs +0 -396
- package/dist/esm/router/runtime/tanstack/basepathRewrite.mjs +0 -28
- package/dist/esm/router/runtime/tanstack/dataMutation.mjs +0 -305
- package/dist/esm/router/runtime/tanstack/hydrationBoundary.mjs +0 -10
- package/dist/esm/router/runtime/tanstack/outlet.mjs +0 -17
- package/dist/esm/router/runtime/tanstack/plugin.mjs +0 -304
- package/dist/esm/router/runtime/tanstack/plugin.node.mjs +0 -234
- package/dist/esm/router/runtime/tanstack/prefetchLink.mjs +0 -18
- package/dist/esm/router/runtime/tanstack/routeTree.mjs +0 -481
- package/dist/esm/router/runtime/tanstack/rsc/ClientSlot.mjs +0 -19
- package/dist/esm/router/runtime/tanstack/rsc/CompositeComponent.mjs +0 -41
- package/dist/esm/router/runtime/tanstack/rsc/ReplayableStream.mjs +0 -104
- package/dist/esm/router/runtime/tanstack/rsc/RscNodeRenderer.mjs +0 -31
- package/dist/esm/router/runtime/tanstack/rsc/SlotContext.mjs +0 -17
- package/dist/esm/router/runtime/tanstack/rsc/client.mjs +0 -53
- package/dist/esm/router/runtime/tanstack/rsc/createRscProxy.mjs +0 -107
- package/dist/esm/router/runtime/tanstack/rsc/index.mjs +0 -1
- package/dist/esm/router/runtime/tanstack/rsc/server.mjs +0 -200
- package/dist/esm/router/runtime/tanstack/rsc/slotUsageSanitizer.mjs +0 -31
- package/dist/esm/router/runtime/tanstack/rsc/symbols.mjs +0 -17
- package/dist/esm/ssr/index.node.mjs +0 -44
- package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.mjs +0 -50
- package/dist/esm/ssr/serverRender/renderToString/entry.mjs +0 -151
- package/dist/esm/ssr/serverRender/types.mjs +0 -1
- package/dist/esm-node/router/cli/code/tanstackTypes.mjs +0 -397
- package/dist/esm-node/router/runtime/tanstack/basepathRewrite.mjs +0 -29
- package/dist/esm-node/router/runtime/tanstack/dataMutation.mjs +0 -306
- package/dist/esm-node/router/runtime/tanstack/hydrationBoundary.mjs +0 -11
- package/dist/esm-node/router/runtime/tanstack/outlet.mjs +0 -18
- package/dist/esm-node/router/runtime/tanstack/plugin.mjs +0 -305
- package/dist/esm-node/router/runtime/tanstack/plugin.node.mjs +0 -235
- package/dist/esm-node/router/runtime/tanstack/prefetchLink.mjs +0 -19
- package/dist/esm-node/router/runtime/tanstack/routeTree.mjs +0 -482
- package/dist/esm-node/router/runtime/tanstack/rsc/ClientSlot.mjs +0 -20
- package/dist/esm-node/router/runtime/tanstack/rsc/CompositeComponent.mjs +0 -42
- package/dist/esm-node/router/runtime/tanstack/rsc/ReplayableStream.mjs +0 -105
- package/dist/esm-node/router/runtime/tanstack/rsc/RscNodeRenderer.mjs +0 -32
- package/dist/esm-node/router/runtime/tanstack/rsc/SlotContext.mjs +0 -18
- package/dist/esm-node/router/runtime/tanstack/rsc/client.mjs +0 -54
- package/dist/esm-node/router/runtime/tanstack/rsc/createRscProxy.mjs +0 -108
- package/dist/esm-node/router/runtime/tanstack/rsc/index.mjs +0 -2
- package/dist/esm-node/router/runtime/tanstack/rsc/server.mjs +0 -201
- package/dist/esm-node/router/runtime/tanstack/rsc/slotUsageSanitizer.mjs +0 -32
- package/dist/esm-node/router/runtime/tanstack/rsc/symbols.mjs +0 -18
- package/dist/esm-node/ssr/index.node.mjs +0 -45
- package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.mjs +0 -51
- package/dist/esm-node/ssr/serverRender/renderToString/entry.mjs +0 -152
- package/dist/esm-node/ssr/serverRender/types.mjs +0 -2
- package/dist/types/router/cli/code/tanstackTypes.d.ts +0 -10
- package/dist/types/router/runtime/tanstack/basepathRewrite.d.ts +0 -8
- package/dist/types/router/runtime/tanstack/dataMutation.d.ts +0 -29
- package/dist/types/router/runtime/tanstack/hydrationBoundary.d.ts +0 -2
- package/dist/types/router/runtime/tanstack/outlet.d.ts +0 -2
- package/dist/types/router/runtime/tanstack/plugin.d.ts +0 -6
- package/dist/types/router/runtime/tanstack/plugin.node.d.ts +0 -6
- package/dist/types/router/runtime/tanstack/prefetchLink.d.ts +0 -11
- package/dist/types/router/runtime/tanstack/routeTree.d.ts +0 -8
- package/dist/types/router/runtime/tanstack/rsc/ClientSlot.d.ts +0 -5
- package/dist/types/router/runtime/tanstack/rsc/CompositeComponent.d.ts +0 -3
- package/dist/types/router/runtime/tanstack/rsc/ReplayableStream.d.ts +0 -24
- package/dist/types/router/runtime/tanstack/rsc/RscNodeRenderer.d.ts +0 -5
- package/dist/types/router/runtime/tanstack/rsc/SlotContext.d.ts +0 -11
- package/dist/types/router/runtime/tanstack/rsc/client.d.ts +0 -11
- package/dist/types/router/runtime/tanstack/rsc/createRscProxy.d.ts +0 -7
- package/dist/types/router/runtime/tanstack/rsc/index.d.ts +0 -2
- package/dist/types/router/runtime/tanstack/rsc/server.d.ts +0 -14
- package/dist/types/router/runtime/tanstack/rsc/slotUsageSanitizer.d.ts +0 -2
- package/dist/types/router/runtime/tanstack/rsc/symbols.d.ts +0 -46
|
@@ -27,6 +27,16 @@ var __webpack_require__ = {};
|
|
|
27
27
|
})();
|
|
28
28
|
var __webpack_exports__ = {};
|
|
29
29
|
__webpack_require__.r(__webpack_exports__);
|
|
30
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
31
|
+
createRouteHydrationScriptTags: ()=>createRouteHydrationScriptTags,
|
|
32
|
+
getMatchedRouteAssets: ()=>getMatchedRouteAssets,
|
|
33
|
+
injectBeforeHydrationEntryScript: ()=>injectBeforeHydrationEntryScript,
|
|
34
|
+
orderHydrationScriptChunks: ()=>orderHydrationScriptChunks,
|
|
35
|
+
replaceChunkJsPlaceholder: ()=>replaceChunkJsPlaceholder
|
|
36
|
+
});
|
|
37
|
+
const lifecycle_js_namespaceObject = require("../../router/runtime/lifecycle.js");
|
|
38
|
+
const external_constants_js_namespaceObject = require("./constants.js");
|
|
39
|
+
const external_utils_js_namespaceObject = require("./utils.js");
|
|
30
40
|
function getScriptTags(template) {
|
|
31
41
|
const scriptRegExp = /<script\b[^>]*\bsrc=(["'])(.*?)\1[^>]*><\/script>/g;
|
|
32
42
|
return Array.from(template.matchAll(scriptRegExp)).map((match)=>({
|
|
@@ -44,6 +54,42 @@ function isEntryScript(src, entryName, asyncEntry) {
|
|
|
44
54
|
const prefix = asyncEntry ? `async-${entryName}` : entryName;
|
|
45
55
|
return basename === `${prefix}.js` || basename.startsWith(`${prefix}.`) || basename.startsWith(`${prefix}-`);
|
|
46
56
|
}
|
|
57
|
+
const dedupeByUrl = (chunks)=>{
|
|
58
|
+
const seen = new Set();
|
|
59
|
+
return chunks.filter((chunk)=>{
|
|
60
|
+
if (void 0 === chunk.url || '' === chunk.url || seen.has(chunk.url)) return false;
|
|
61
|
+
seen.add(chunk.url);
|
|
62
|
+
return true;
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
const isAsyncEntryScriptChunk = (chunk, entryName)=>{
|
|
66
|
+
if (void 0 === chunk.url || !chunk.url.endsWith('.js')) return false;
|
|
67
|
+
const asyncEntryName = `async-${entryName}`;
|
|
68
|
+
const filename = chunk.filename ?? chunk.url;
|
|
69
|
+
const basename = filename.split('/').pop() ?? filename;
|
|
70
|
+
return basename === `${asyncEntryName}.js` || basename.startsWith(`${asyncEntryName}.`) || basename.startsWith(`${asyncEntryName}-`);
|
|
71
|
+
};
|
|
72
|
+
function getRouteAssets(runtimeContext, routeManifest = runtimeContext.routeManifest) {
|
|
73
|
+
return routeManifest?.routeAssets;
|
|
74
|
+
}
|
|
75
|
+
function getMatchedRouteAssets(runtimeContext, routeManifest) {
|
|
76
|
+
const routeAssets = getRouteAssets(runtimeContext, routeManifest);
|
|
77
|
+
if (void 0 === routeAssets) return [];
|
|
78
|
+
const matchedRouteIds = (0, lifecycle_js_namespaceObject.getRouterMatchedRouteIds)(runtimeContext) ?? [];
|
|
79
|
+
return matchedRouteIds.flatMap((routeId)=>routeAssets[routeId]?.assets ?? []);
|
|
80
|
+
}
|
|
81
|
+
const orderHydrationScriptChunks = ({ asyncEntryChunks, collectedChunks, matchedRouteChunks, entryName })=>{
|
|
82
|
+
const asyncEntryScriptChunks = [];
|
|
83
|
+
const asyncEntryDependencyChunks = [];
|
|
84
|
+
for (const chunk of asyncEntryChunks)if (isAsyncEntryScriptChunk(chunk, entryName)) asyncEntryScriptChunks.push(chunk);
|
|
85
|
+
else asyncEntryDependencyChunks.push(chunk);
|
|
86
|
+
return dedupeByUrl([
|
|
87
|
+
...asyncEntryDependencyChunks,
|
|
88
|
+
...collectedChunks,
|
|
89
|
+
...matchedRouteChunks,
|
|
90
|
+
...asyncEntryScriptChunks
|
|
91
|
+
]);
|
|
92
|
+
};
|
|
47
93
|
function injectBeforeHydrationEntryScript(template, scripts, entryName = 'index') {
|
|
48
94
|
if ('' === scripts) return template;
|
|
49
95
|
const scriptTags = getScriptTags(template);
|
|
@@ -51,12 +97,37 @@ function injectBeforeHydrationEntryScript(template, scripts, entryName = 'index'
|
|
|
51
97
|
if (void 0 === target) return template;
|
|
52
98
|
return `${template.slice(0, target.index)}${scripts}${template.slice(target.index)}`;
|
|
53
99
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
100
|
+
function replaceChunkJsPlaceholder(template, scripts, entryName, placeholder = external_constants_js_namespaceObject.CHUNK_JS_PLACEHOLDER) {
|
|
101
|
+
if ('' === scripts) return (0, external_utils_js_namespaceObject.safeReplace)(template, placeholder, '');
|
|
102
|
+
const withoutPlaceholder = (0, external_utils_js_namespaceObject.safeReplace)(template, placeholder, '');
|
|
103
|
+
const withEarlyScripts = injectBeforeHydrationEntryScript(withoutPlaceholder, scripts, entryName);
|
|
104
|
+
if (withEarlyScripts !== withoutPlaceholder) return withEarlyScripts;
|
|
105
|
+
return (0, external_utils_js_namespaceObject.safeReplace)(template, placeholder, scripts);
|
|
106
|
+
}
|
|
107
|
+
function createRouteHydrationScriptTags(runtimeContext, entryName, options = {}) {
|
|
108
|
+
const { nonce, template } = options;
|
|
109
|
+
const routeAssets = getRouteAssets(runtimeContext);
|
|
110
|
+
if (void 0 === routeAssets) return '';
|
|
111
|
+
const matchedRouteIds = (0, lifecycle_js_namespaceObject.getRouterMatchedRouteIds)(runtimeContext) ?? [];
|
|
112
|
+
const assetEntries = [
|
|
113
|
+
...matchedRouteIds.map((routeId)=>routeAssets[routeId]),
|
|
114
|
+
routeAssets[`async-${entryName}`]
|
|
115
|
+
].filter((entry)=>void 0 !== entry);
|
|
116
|
+
const jsAssets = Array.from(new Set(assetEntries.flatMap((entry)=>(entry.assets ?? []).filter((asset)=>asset.endsWith('.js')))));
|
|
117
|
+
const nonceAttr = void 0 === nonce || '' === nonce ? '' : ` nonce="${nonce}"`;
|
|
118
|
+
return jsAssets.filter((asset)=>template?.includes(asset) !== true).map((asset)=>`<script src=${asset}${nonceAttr}></script>`).join(' ');
|
|
119
|
+
}
|
|
120
|
+
exports.createRouteHydrationScriptTags = __webpack_exports__.createRouteHydrationScriptTags;
|
|
121
|
+
exports.getMatchedRouteAssets = __webpack_exports__.getMatchedRouteAssets;
|
|
57
122
|
exports.injectBeforeHydrationEntryScript = __webpack_exports__.injectBeforeHydrationEntryScript;
|
|
123
|
+
exports.orderHydrationScriptChunks = __webpack_exports__.orderHydrationScriptChunks;
|
|
124
|
+
exports.replaceChunkJsPlaceholder = __webpack_exports__.replaceChunkJsPlaceholder;
|
|
58
125
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
59
|
-
"
|
|
126
|
+
"createRouteHydrationScriptTags",
|
|
127
|
+
"getMatchedRouteAssets",
|
|
128
|
+
"injectBeforeHydrationEntryScript",
|
|
129
|
+
"orderHydrationScriptChunks",
|
|
130
|
+
"replaceChunkJsPlaceholder"
|
|
60
131
|
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
61
132
|
Object.defineProperty(exports, '__esModule', {
|
|
62
133
|
value: true
|
|
@@ -51,24 +51,12 @@ function buildShellAfterTemplate(afterAppTemplate, options) {
|
|
|
51
51
|
(template)=>injectJs(template, entryName, config.nonce)
|
|
52
52
|
];
|
|
53
53
|
async function injectJs(template, entryName, nonce) {
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
...matchedRouteIds.map((routeId)=>routeAssets[routeId]),
|
|
61
|
-
routeAssets[`async-${entryName}`]
|
|
62
|
-
].filter(Boolean);
|
|
63
|
-
const jsAssets = Array.from(new Set(assetEntries.flatMap((entry)=>(entry.assets ?? []).filter((asset)=>asset.endsWith('.js')))));
|
|
64
|
-
const nonceAttr = nonce ? ` nonce="${nonce}"` : '';
|
|
65
|
-
const jsChunkStr = jsAssets.filter((asset)=>!template.includes(asset)).map((asset)=>`<script src=${asset}${nonceAttr}></script>`).join(' ');
|
|
66
|
-
if (jsChunkStr) {
|
|
67
|
-
const withoutPlaceholder = (0, external_utils_js_namespaceObject.safeReplace)(template, '<!--<?- chunksMap.js ?>-->', '');
|
|
68
|
-
const withEarlyScripts = (0, external_scriptOrder_js_namespaceObject.injectBeforeHydrationEntryScript)(withoutPlaceholder, jsChunkStr, entryName);
|
|
69
|
-
return withEarlyScripts !== withoutPlaceholder ? withEarlyScripts : (0, external_utils_js_namespaceObject.safeReplace)(template, '<!--<?- chunksMap.js ?>-->', jsChunkStr);
|
|
70
|
-
}
|
|
71
|
-
return template;
|
|
54
|
+
const jsChunkStr = (0, external_scriptOrder_js_namespaceObject.createRouteHydrationScriptTags)(runtimeContext, entryName, {
|
|
55
|
+
nonce,
|
|
56
|
+
template
|
|
57
|
+
});
|
|
58
|
+
if (!jsChunkStr) return template;
|
|
59
|
+
return (0, external_scriptOrder_js_namespaceObject.replaceChunkJsPlaceholder)(template, jsChunkStr, entryName);
|
|
72
60
|
}
|
|
73
61
|
return (0, external_shared_js_namespaceObject.buildHtml)(afterAppTemplate, callbacks);
|
|
74
62
|
}
|
|
@@ -60,12 +60,15 @@ function isPromiseLike(value) {
|
|
|
60
60
|
return !!value && 'function' == typeof value.then;
|
|
61
61
|
}
|
|
62
62
|
function toErrorInfo(error) {
|
|
63
|
+
if ('production' === process.env.NODE_ENV) return {
|
|
64
|
+
message: 'Unexpected Server Error'
|
|
65
|
+
};
|
|
63
66
|
if (error && 'object' == typeof error) {
|
|
64
67
|
const maybeMsg = error.message;
|
|
65
68
|
const maybeStack = error.stack;
|
|
66
69
|
return {
|
|
67
70
|
message: 'string' == typeof maybeMsg ? maybeMsg : String(maybeMsg ?? error),
|
|
68
|
-
stack:
|
|
71
|
+
stack: maybeStack
|
|
69
72
|
};
|
|
70
73
|
}
|
|
71
74
|
return {
|
|
@@ -140,13 +140,7 @@ function createReplaceSSRDataScript(data) {
|
|
|
140
140
|
return (template)=>(0, external_utils_js_namespaceObject.safeReplace)(template, external_constants_js_namespaceObject_1.SSR_DATA_PLACEHOLDER, data);
|
|
141
141
|
}
|
|
142
142
|
function createReplaceChunkJs(js, entryName) {
|
|
143
|
-
return (template)=>
|
|
144
|
-
if (!js) return (0, external_utils_js_namespaceObject.safeReplace)(template, external_constants_js_namespaceObject_1.CHUNK_JS_PLACEHOLDER, '');
|
|
145
|
-
const withoutPlaceholder = (0, external_utils_js_namespaceObject.safeReplace)(template, external_constants_js_namespaceObject_1.CHUNK_JS_PLACEHOLDER, '');
|
|
146
|
-
const withEarlyScripts = (0, external_scriptOrder_js_namespaceObject.injectBeforeHydrationEntryScript)(withoutPlaceholder, js, entryName);
|
|
147
|
-
if (withEarlyScripts !== withoutPlaceholder) return withEarlyScripts;
|
|
148
|
-
return (0, external_utils_js_namespaceObject.safeReplace)(template, external_constants_js_namespaceObject_1.CHUNK_JS_PLACEHOLDER, js);
|
|
149
|
-
};
|
|
143
|
+
return (template)=>(0, external_scriptOrder_js_namespaceObject.replaceChunkJsPlaceholder)(template, js, entryName);
|
|
150
144
|
}
|
|
151
145
|
function createReplaceChunkCss(css) {
|
|
152
146
|
return (template)=>(0, external_utils_js_namespaceObject.safeReplace)(template, external_constants_js_namespaceObject_1.CHUNK_CSS_PLACEHOLDER, css);
|
|
@@ -29,44 +29,26 @@ var __webpack_exports__ = {};
|
|
|
29
29
|
__webpack_require__.r(__webpack_exports__);
|
|
30
30
|
__webpack_require__.d(__webpack_exports__, {
|
|
31
31
|
LoadableCollector: ()=>LoadableCollector,
|
|
32
|
-
orderHydrationScriptChunks: ()=>orderHydrationScriptChunks
|
|
32
|
+
orderHydrationScriptChunks: ()=>external_scriptOrder_js_namespaceObject.orderHydrationScriptChunks
|
|
33
33
|
});
|
|
34
34
|
const server_namespaceObject = require("@loadable/server");
|
|
35
|
-
const lifecycle_js_namespaceObject = require("../../../router/runtime/lifecycle.js");
|
|
36
35
|
const external_federatedCss_js_namespaceObject = require("../federatedCss.js");
|
|
36
|
+
const external_scriptOrder_js_namespaceObject = require("../scriptOrder.js");
|
|
37
37
|
const external_utils_js_namespaceObject = require("../utils.js");
|
|
38
38
|
const extname = (uri)=>{
|
|
39
39
|
if ('string' != typeof uri || !uri.includes('.')) return '';
|
|
40
40
|
return `.${uri?.split('.').pop()}` || '';
|
|
41
41
|
};
|
|
42
42
|
const generateChunks = (chunks, ext)=>chunks.filter((chunk)=>Boolean(chunk.url)).filter((chunk)=>extname(chunk.url).slice(1) === ext);
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
43
|
+
const routeAssetToChunk = (asset)=>({
|
|
44
|
+
chunk: asset,
|
|
45
|
+
filename: asset.replace(/^\//, ''),
|
|
46
|
+
linkType: 'preload',
|
|
47
|
+
path: asset,
|
|
48
|
+
scriptType: asset.endsWith('.css') ? 'style' : "script",
|
|
49
|
+
type: 'routeAsset',
|
|
50
|
+
url: asset
|
|
49
51
|
});
|
|
50
|
-
};
|
|
51
|
-
const isAsyncEntryScriptChunk = (chunk, entryName)=>{
|
|
52
|
-
if (!chunk.url?.endsWith('.js')) return false;
|
|
53
|
-
const asyncEntryName = `async-${entryName}`;
|
|
54
|
-
const filename = chunk.filename || chunk.url;
|
|
55
|
-
const basename = filename.split('/').pop() || filename;
|
|
56
|
-
return basename === `${asyncEntryName}.js` || basename.startsWith(`${asyncEntryName}.`) || basename.startsWith(`${asyncEntryName}-`);
|
|
57
|
-
};
|
|
58
|
-
const orderHydrationScriptChunks = ({ asyncEntryChunks, collectedChunks, matchedRouteChunks, entryName })=>{
|
|
59
|
-
const asyncEntryScriptChunks = [];
|
|
60
|
-
const asyncEntryDependencyChunks = [];
|
|
61
|
-
for (const chunk of asyncEntryChunks)if (isAsyncEntryScriptChunk(chunk, entryName)) asyncEntryScriptChunks.push(chunk);
|
|
62
|
-
else asyncEntryDependencyChunks.push(chunk);
|
|
63
|
-
return dedupeChunksByUrl([
|
|
64
|
-
...asyncEntryDependencyChunks,
|
|
65
|
-
...collectedChunks,
|
|
66
|
-
...matchedRouteChunks,
|
|
67
|
-
...asyncEntryScriptChunks
|
|
68
|
-
]);
|
|
69
|
-
};
|
|
70
52
|
const checkIsInline = (chunk, enableInline)=>{
|
|
71
53
|
if ('production' !== process.env.NODE_ENV) return false;
|
|
72
54
|
if (enableInline instanceof RegExp) return enableInline.test(chunk.url);
|
|
@@ -85,17 +67,8 @@ class LoadableCollector {
|
|
|
85
67
|
}
|
|
86
68
|
getMatchedRouteChunks() {
|
|
87
69
|
const { routeManifest, runtimeContext } = this.options;
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const matchedRouteIds = (0, lifecycle_js_namespaceObject.getRouterMatchedRouteIds)(runtimeContext) ?? [];
|
|
91
|
-
return matchedRouteIds.flatMap((routeId)=>{
|
|
92
|
-
const routeAsset = routeAssets[routeId];
|
|
93
|
-
return (routeAsset?.assets ?? []).map((asset)=>({
|
|
94
|
-
filename: asset.replace(/^\//, ''),
|
|
95
|
-
path: asset,
|
|
96
|
-
url: asset
|
|
97
|
-
}));
|
|
98
|
-
});
|
|
70
|
+
if (!routeManifest) return [];
|
|
71
|
+
return (0, external_scriptOrder_js_namespaceObject.getMatchedRouteAssets)(runtimeContext, routeManifest).map(routeAssetToChunk);
|
|
99
72
|
}
|
|
100
73
|
collect(comopnent) {
|
|
101
74
|
const { stats, entryName } = this.options;
|
|
@@ -119,7 +92,7 @@ class LoadableCollector {
|
|
|
119
92
|
} catch (e) {}
|
|
120
93
|
const collectedChunks = extractor ? extractor.getChunkAssets(extractor.chunks) : [];
|
|
121
94
|
const matchedRouteChunks = this.getMatchedRouteChunks();
|
|
122
|
-
const orderedScriptChunks = orderHydrationScriptChunks({
|
|
95
|
+
const orderedScriptChunks = (0, external_scriptOrder_js_namespaceObject.orderHydrationScriptChunks)({
|
|
123
96
|
asyncEntryChunks: asyncChunks,
|
|
124
97
|
collectedChunks,
|
|
125
98
|
matchedRouteChunks,
|
|
@@ -121,7 +121,7 @@ function getSSRData() {
|
|
|
121
121
|
}
|
|
122
122
|
function getRouterData() {
|
|
123
123
|
const { routerContext, runtimeContext } = _class_private_field_get(this, _options);
|
|
124
|
-
const snapshotRouterData = runtimeContext
|
|
124
|
+
const snapshotRouterData = (0, lifecycle_js_namespaceObject.getRouterServerSnapshot)(runtimeContext)?.routerData;
|
|
125
125
|
if (snapshotRouterData) return {
|
|
126
126
|
loaderData: snapshotRouterData.loaderData,
|
|
127
127
|
errors: (0, external_utils_js_namespaceObject.serializeErrors)(snapshotRouterData.errors || null)
|
|
@@ -49,17 +49,40 @@ function serializeErrors(errors) {
|
|
|
49
49
|
if (!errors) return null;
|
|
50
50
|
const entries = Object.entries(errors);
|
|
51
51
|
const serialized = {};
|
|
52
|
-
for (const [key, val] of entries)if ((0, router_namespaceObject.isRouteErrorResponse)(val)) serialized[key] =
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
for (const [key, val] of entries)if ((0, router_namespaceObject.isRouteErrorResponse)(val)) serialized[key] = serializeRouteErrorResponse(val);
|
|
53
|
+
else if (val instanceof Error) serialized[key] = serializeError(val);
|
|
54
|
+
else serialized[key] = val;
|
|
55
|
+
return serialized;
|
|
56
|
+
}
|
|
57
|
+
function shouldRedactServerError() {
|
|
58
|
+
return 'development' !== process.env.NODE_ENV && 'test' !== process.env.NODE_ENV;
|
|
59
|
+
}
|
|
60
|
+
function serializeError(error) {
|
|
61
|
+
if (shouldRedactServerError()) return {
|
|
62
|
+
message: 'Unexpected Server Error',
|
|
63
|
+
stack: void 0,
|
|
64
|
+
__type: 'Error'
|
|
55
65
|
};
|
|
56
|
-
|
|
57
|
-
message:
|
|
58
|
-
stack:
|
|
66
|
+
return {
|
|
67
|
+
message: error.message,
|
|
68
|
+
stack: error.stack,
|
|
59
69
|
__type: 'Error'
|
|
60
70
|
};
|
|
61
|
-
|
|
62
|
-
|
|
71
|
+
}
|
|
72
|
+
function serializeRouteErrorResponse(error) {
|
|
73
|
+
if (!(0, router_namespaceObject.isRouteErrorResponse)(error)) return error;
|
|
74
|
+
if (error.status >= 500 && shouldRedactServerError()) return {
|
|
75
|
+
status: error.status,
|
|
76
|
+
statusText: 'Internal Server Error',
|
|
77
|
+
data: 'Unexpected Server Error',
|
|
78
|
+
__type: 'RouteErrorResponse'
|
|
79
|
+
};
|
|
80
|
+
return {
|
|
81
|
+
status: error.status,
|
|
82
|
+
statusText: error.statusText,
|
|
83
|
+
data: error.data,
|
|
84
|
+
__type: 'RouteErrorResponse'
|
|
85
|
+
};
|
|
63
86
|
}
|
|
64
87
|
function getSSRConfigByEntry(entryName, ssr, ssrByEntries) {
|
|
65
88
|
if (ssrByEntries?.[entryName]) return ssrByEntries[entryName];
|
package/dist/cjs/exports/head.js
CHANGED
|
@@ -47,6 +47,7 @@ const external_react_namespaceObject = require("react");
|
|
|
47
47
|
var external_react_default = /*#__PURE__*/ __webpack_require__.n(external_react_namespaceObject);
|
|
48
48
|
const external_react_helmet_async_namespaceObject = require("react-helmet-async");
|
|
49
49
|
const index_js_namespaceObject = require("../core/context/index.js");
|
|
50
|
+
const helmetContext_js_namespaceObject = require("../core/context/helmetContext.js");
|
|
50
51
|
const ATTRIBUTE_NAME_MAP = {
|
|
51
52
|
charSet: 'charset',
|
|
52
53
|
className: 'class',
|
|
@@ -56,6 +57,10 @@ const ATTRIBUTE_NAME_MAP = {
|
|
|
56
57
|
itemProp: 'itemprop',
|
|
57
58
|
tabIndex: 'tabindex'
|
|
58
59
|
};
|
|
60
|
+
const CONTENT_PROPERTIES = new Set([
|
|
61
|
+
'innerHTML',
|
|
62
|
+
'cssText'
|
|
63
|
+
]);
|
|
59
64
|
const escapeHtml = (value)=>String(value).replaceAll('&', '&').replaceAll('"', '"').replaceAll('<', '<').replaceAll('>', '>');
|
|
60
65
|
const toHtmlAttributeName = (name)=>ATTRIBUTE_NAME_MAP[name] ?? name;
|
|
61
66
|
const attributesToString = (attributes, includeHelmetAttribute = false)=>{
|
|
@@ -63,6 +68,7 @@ const attributesToString = (attributes, includeHelmetAttribute = false)=>{
|
|
|
63
68
|
if (includeHelmetAttribute) pairs.push('data-rh="true"');
|
|
64
69
|
for (const [name, value] of Object.entries(attributes ?? {})){
|
|
65
70
|
if (false === value || null == value) continue;
|
|
71
|
+
if (CONTENT_PROPERTIES.has(name)) continue;
|
|
66
72
|
const htmlName = toHtmlAttributeName(name);
|
|
67
73
|
if (true === value) pairs.push(htmlName);
|
|
68
74
|
else pairs.push(`${htmlName}="${escapeHtml(value)}"`);
|
|
@@ -91,18 +97,6 @@ const createTitleDatum = (title, attributes)=>({
|
|
|
91
97
|
return `<title ${attrs}>${escapeHtml(title)}</title>`;
|
|
92
98
|
}
|
|
93
99
|
});
|
|
94
|
-
const createEmptyHelmetState = ()=>({
|
|
95
|
-
base: createDatum('base', []),
|
|
96
|
-
bodyAttributes: createAttributeDatum({}),
|
|
97
|
-
htmlAttributes: createAttributeDatum({}),
|
|
98
|
-
link: createDatum('link', []),
|
|
99
|
-
meta: createDatum('meta', []),
|
|
100
|
-
noscript: createDatum("noscript", []),
|
|
101
|
-
priority: createDatum('meta', []),
|
|
102
|
-
script: createDatum("script", []),
|
|
103
|
-
style: createDatum('style', []),
|
|
104
|
-
title: createTitleDatum(void 0, {})
|
|
105
|
-
});
|
|
106
100
|
const normalizeHelmetTitle = (title)=>{
|
|
107
101
|
if ('string' == typeof title) return title;
|
|
108
102
|
if (Array.isArray(title)) return title.map((part)=>String(part)).join('');
|
|
@@ -122,7 +116,14 @@ const collectChildren = (children, draft)=>{
|
|
|
122
116
|
draft.titleAttributes = mergeAttributes(draft.titleAttributes, props);
|
|
123
117
|
return;
|
|
124
118
|
}
|
|
125
|
-
if ('html' === child.type
|
|
119
|
+
if ('html' === child.type) {
|
|
120
|
+
draft.htmlAttributes = mergeAttributes(draft.htmlAttributes ?? {}, props);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if ('body' === child.type) {
|
|
124
|
+
draft.bodyAttributes = mergeAttributes(draft.bodyAttributes ?? {}, props);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
126
127
|
if ('base' === child.type || 'link' === child.type || 'meta' === child.type || "noscript" === child.type || "script" === child.type || 'style' === child.type) {
|
|
127
128
|
const tag = {
|
|
128
129
|
...props
|
|
@@ -132,8 +133,7 @@ const collectChildren = (children, draft)=>{
|
|
|
132
133
|
}
|
|
133
134
|
});
|
|
134
135
|
};
|
|
135
|
-
const
|
|
136
|
-
const baseState = current ?? createEmptyHelmetState();
|
|
136
|
+
const createHelmetRecord = (props)=>{
|
|
137
137
|
const draft = {
|
|
138
138
|
base: [
|
|
139
139
|
...void 0 !== props.base ? [
|
|
@@ -161,71 +161,132 @@ const collectHelmetProps = (current, props)=>{
|
|
|
161
161
|
titleAttributes: props.titleAttributes ?? {}
|
|
162
162
|
};
|
|
163
163
|
collectChildren(props.children, draft);
|
|
164
|
-
const title = void 0 !== draft.title && '' !== draft.title && void 0 !== props.titleTemplate ? props.titleTemplate.replaceAll('%s', draft.title) : draft.title ?? props.defaultTitle;
|
|
165
164
|
return {
|
|
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
|
-
|
|
165
|
+
...draft,
|
|
166
|
+
titleTemplate: props.titleTemplate,
|
|
167
|
+
defaultTitle: props.defaultTitle
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
const getInnermostDefined = (records, pick)=>{
|
|
171
|
+
for(let i = records.length - 1; i >= 0; i -= 1){
|
|
172
|
+
const value = pick(records[i]);
|
|
173
|
+
if (void 0 !== value) return value;
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
const deriveTitle = (records)=>{
|
|
177
|
+
const innermostTitle = getInnermostDefined(records, (record)=>record.title);
|
|
178
|
+
const innermostTemplate = getInnermostDefined(records, (record)=>record.titleTemplate);
|
|
179
|
+
if (innermostTemplate && innermostTitle) return innermostTemplate.replaceAll('%s', innermostTitle);
|
|
180
|
+
return innermostTitle || getInnermostDefined(records, (record)=>record.defaultTitle);
|
|
181
|
+
};
|
|
182
|
+
const mergeRecordAttributes = (records, pick)=>records.reduce((merged, record)=>mergeAttributes(merged, pick(record)), {});
|
|
183
|
+
const deriveBaseTags = (records)=>{
|
|
184
|
+
for(let i = records.length - 1; i >= 0; i -= 1){
|
|
185
|
+
const tags = records[i].base;
|
|
186
|
+
for(let j = tags.length - 1; j >= 0; j -= 1)if (tags[j].href) return [
|
|
187
|
+
tags[j]
|
|
188
|
+
];
|
|
189
|
+
}
|
|
190
|
+
return [];
|
|
191
|
+
};
|
|
192
|
+
const TAG_PRIMARY_ATTRIBUTES = {
|
|
193
|
+
link: [
|
|
194
|
+
'rel',
|
|
195
|
+
'href'
|
|
196
|
+
],
|
|
197
|
+
meta: [
|
|
198
|
+
'name',
|
|
199
|
+
'charset',
|
|
200
|
+
'http-equiv',
|
|
201
|
+
'property',
|
|
202
|
+
'itemprop'
|
|
203
|
+
],
|
|
204
|
+
noscript: [
|
|
205
|
+
'innerHTML'
|
|
206
|
+
],
|
|
207
|
+
script: [
|
|
208
|
+
'src',
|
|
209
|
+
'innerHTML'
|
|
210
|
+
],
|
|
211
|
+
style: [
|
|
212
|
+
'cssText'
|
|
213
|
+
]
|
|
214
|
+
};
|
|
215
|
+
const getPrimaryAttribute = (tagName, tag)=>{
|
|
216
|
+
const candidates = TAG_PRIMARY_ATTRIBUTES[tagName];
|
|
217
|
+
let selectedKey;
|
|
218
|
+
let selectedValue;
|
|
219
|
+
for (const [key, value] of Object.entries(tag)){
|
|
220
|
+
const normalizedKey = CONTENT_PROPERTIES.has(key) ? key : toHtmlAttributeName(key).toLowerCase();
|
|
221
|
+
if (candidates.includes(normalizedKey)) {
|
|
222
|
+
if ('rel' !== selectedKey || 'canonical' !== String(selectedValue).toLowerCase()) {
|
|
223
|
+
if ('rel' !== normalizedKey || 'stylesheet' !== String(value).toLowerCase()) {
|
|
224
|
+
selectedKey = normalizedKey;
|
|
225
|
+
selectedValue = value;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (void 0 === selectedKey || !selectedValue) return;
|
|
231
|
+
return {
|
|
232
|
+
key: selectedKey,
|
|
233
|
+
value: String(selectedValue).toLowerCase()
|
|
222
234
|
};
|
|
223
235
|
};
|
|
236
|
+
const dedupeTags = (tagName, records)=>{
|
|
237
|
+
const approvedValues = new Map();
|
|
238
|
+
const approved = [];
|
|
239
|
+
for(let i = records.length - 1; i >= 0; i -= 1){
|
|
240
|
+
const instanceValues = new Map();
|
|
241
|
+
const kept = [];
|
|
242
|
+
for (const tag of records[i][tagName]){
|
|
243
|
+
const primary = getPrimaryAttribute(tagName, tag);
|
|
244
|
+
if (void 0 === primary) continue;
|
|
245
|
+
if (approvedValues.get(primary.key)?.has(primary.value)) continue;
|
|
246
|
+
let seen = instanceValues.get(primary.key);
|
|
247
|
+
if (void 0 === seen) {
|
|
248
|
+
seen = new Set();
|
|
249
|
+
instanceValues.set(primary.key, seen);
|
|
250
|
+
}
|
|
251
|
+
seen.add(primary.value);
|
|
252
|
+
kept.push(tag);
|
|
253
|
+
}
|
|
254
|
+
approved.unshift(...kept);
|
|
255
|
+
for (const [key, values] of instanceValues){
|
|
256
|
+
const target = approvedValues.get(key);
|
|
257
|
+
if (void 0 === target) approvedValues.set(key, values);
|
|
258
|
+
else for (const value of values)target.add(value);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return approved;
|
|
262
|
+
};
|
|
263
|
+
const deriveHelmetServerState = (records)=>({
|
|
264
|
+
base: createDatum('base', deriveBaseTags(records)),
|
|
265
|
+
bodyAttributes: createAttributeDatum(mergeRecordAttributes(records, (record)=>record.bodyAttributes)),
|
|
266
|
+
htmlAttributes: createAttributeDatum(mergeRecordAttributes(records, (record)=>record.htmlAttributes)),
|
|
267
|
+
link: createDatum('link', dedupeTags('link', records)),
|
|
268
|
+
meta: createDatum('meta', dedupeTags('meta', records)),
|
|
269
|
+
noscript: createDatum("noscript", dedupeTags("noscript", records)),
|
|
270
|
+
priority: createDatum('meta', []),
|
|
271
|
+
script: createDatum("script", dedupeTags("script", records)),
|
|
272
|
+
style: createDatum('style', dedupeTags('style', records)),
|
|
273
|
+
title: createTitleDatum(deriveTitle(records), mergeRecordAttributes(records, (record)=>record.titleAttributes))
|
|
274
|
+
});
|
|
275
|
+
const serverHelmetRecords = new WeakMap();
|
|
276
|
+
const collectServerHelmet = (runtimeContext, props)=>{
|
|
277
|
+
const helmetContext = (0, helmetContext_js_namespaceObject.ensureHelmetContext)(runtimeContext);
|
|
278
|
+
let records = serverHelmetRecords.get(helmetContext);
|
|
279
|
+
if (void 0 === records) {
|
|
280
|
+
records = [];
|
|
281
|
+
serverHelmetRecords.set(helmetContext, records);
|
|
282
|
+
}
|
|
283
|
+
records.push(createHelmetRecord(props));
|
|
284
|
+
helmetContext.helmet = deriveHelmetServerState(records);
|
|
285
|
+
};
|
|
224
286
|
const Helmet = (props)=>{
|
|
225
287
|
const runtimeContext = external_react_default().useContext(index_js_namespaceObject.InternalRuntimeContext);
|
|
226
288
|
if (null !== runtimeContext && false === runtimeContext.isBrowser) {
|
|
227
|
-
runtimeContext
|
|
228
|
-
runtimeContext._helmetContext.helmet = collectHelmetProps(runtimeContext._helmetContext.helmet ?? void 0, props);
|
|
289
|
+
collectServerHelmet(runtimeContext, props);
|
|
229
290
|
return null;
|
|
230
291
|
}
|
|
231
292
|
return external_react_default().createElement(external_react_helmet_async_namespaceObject.Helmet, props);
|