@bleedingdev/modern-js-runtime 3.2.0-ultramodern.120 → 3.2.0-ultramodern.121

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 (203) hide show
  1. package/dist/cjs/boundary-debugger/index.js +4 -0
  2. package/dist/cjs/cli/index.js +11 -0
  3. package/dist/cjs/{router/runtime/tanstack/rsc/ClientSlot.js → core/context/extensions.js} +33 -21
  4. package/dist/cjs/{router/runtime/tanstack/rsc/SlotContext.js → core/context/helmetContext.js} +16 -20
  5. package/dist/cjs/core/context/index.js +65 -0
  6. package/dist/cjs/core/react/wrapper.js +6 -4
  7. package/dist/cjs/core/server/helmet.js +2 -1
  8. package/dist/cjs/core/server/requestHandler.js +42 -29
  9. package/dist/cjs/core/server/routerCleanup.js +110 -0
  10. package/dist/cjs/core/server/scriptOrder.js +75 -4
  11. package/dist/cjs/core/server/stream/afterTemplate.js +6 -18
  12. package/dist/cjs/core/server/stream/deferredScript.js +4 -1
  13. package/dist/cjs/core/server/string/index.js +1 -7
  14. package/dist/cjs/core/server/string/loadable.js +13 -40
  15. package/dist/cjs/core/server/string/ssrData.js +1 -1
  16. package/dist/cjs/core/server/utils.js +31 -8
  17. package/dist/cjs/exports/head.js +135 -74
  18. package/dist/cjs/exports/tanstack-router.js +36 -305
  19. package/dist/cjs/module-federation/index.js +178 -0
  20. package/dist/cjs/router/cli/code/index.js +1 -47
  21. package/dist/cjs/router/cli/code/templates.js +1 -14
  22. package/dist/cjs/router/cli/handler.js +1 -1
  23. package/dist/cjs/router/cli/index.js +2 -23
  24. package/dist/cjs/router/runtime/DeferredDataScripts.node.js +16 -4
  25. package/dist/cjs/router/runtime/PrefetchLink.js +2 -3
  26. package/dist/cjs/router/runtime/internal.js +20 -13
  27. package/dist/cjs/router/runtime/lifecycle.js +37 -22
  28. package/dist/cjs/router/runtime/plugin.js +2 -9
  29. package/dist/cjs/router/runtime/plugin.node.js +2 -7
  30. package/dist/cjs/router/runtime/provider.js +107 -0
  31. package/dist/cjs/router/runtime/utils.js +35 -9
  32. package/dist/esm/boundary-debugger/index.mjs +4 -0
  33. package/dist/esm/cli/index.mjs +4 -2
  34. package/dist/esm/core/context/extensions.mjs +28 -0
  35. package/dist/esm/core/context/helmetContext.mjs +13 -0
  36. package/dist/esm/core/context/index.mjs +5 -0
  37. package/dist/esm/core/react/wrapper.mjs +6 -4
  38. package/dist/esm/core/server/helmet.mjs +2 -1
  39. package/dist/esm/core/server/requestHandler.mjs +43 -30
  40. package/dist/esm/core/server/routerCleanup.mjs +66 -0
  41. package/dist/esm/core/server/scriptOrder.mjs +60 -1
  42. package/dist/esm/core/server/stream/afterTemplate.mjs +8 -20
  43. package/dist/esm/core/server/stream/deferredScript.mjs +4 -1
  44. package/dist/esm/core/server/string/index.mjs +3 -9
  45. package/dist/esm/core/server/string/loadable.mjs +11 -38
  46. package/dist/esm/core/server/string/ssrData.mjs +2 -2
  47. package/dist/esm/core/server/utils.mjs +31 -8
  48. package/dist/esm/exports/head.mjs +135 -74
  49. package/dist/esm/exports/tanstack-router.mjs +30 -4
  50. package/dist/esm/module-federation/index.mjs +109 -0
  51. package/dist/esm/router/cli/code/index.mjs +1 -47
  52. package/dist/esm/router/cli/code/templates.mjs +1 -14
  53. package/dist/esm/router/cli/handler.mjs +1 -1
  54. package/dist/esm/router/cli/index.mjs +3 -24
  55. package/dist/esm/router/runtime/DeferredDataScripts.node.mjs +16 -4
  56. package/dist/esm/router/runtime/PrefetchLink.mjs +2 -3
  57. package/dist/esm/router/runtime/internal.mjs +16 -15
  58. package/dist/esm/router/runtime/lifecycle.mjs +22 -13
  59. package/dist/esm/router/runtime/plugin.mjs +4 -11
  60. package/dist/esm/router/runtime/plugin.node.mjs +4 -9
  61. package/dist/esm/router/runtime/provider.mjs +57 -0
  62. package/dist/esm/router/runtime/utils.mjs +35 -9
  63. package/dist/esm-node/boundary-debugger/index.mjs +4 -0
  64. package/dist/esm-node/cli/index.mjs +4 -2
  65. package/dist/esm-node/core/context/extensions.mjs +29 -0
  66. package/dist/esm-node/core/context/helmetContext.mjs +14 -0
  67. package/dist/esm-node/core/context/index.mjs +5 -0
  68. package/dist/esm-node/core/react/wrapper.mjs +6 -4
  69. package/dist/esm-node/core/server/helmet.mjs +2 -1
  70. package/dist/esm-node/core/server/requestHandler.mjs +43 -30
  71. package/dist/esm-node/core/server/routerCleanup.mjs +67 -0
  72. package/dist/esm-node/core/server/scriptOrder.mjs +60 -1
  73. package/dist/esm-node/core/server/stream/afterTemplate.mjs +8 -20
  74. package/dist/esm-node/core/server/stream/deferredScript.mjs +4 -1
  75. package/dist/esm-node/core/server/string/index.mjs +3 -9
  76. package/dist/esm-node/core/server/string/loadable.mjs +11 -38
  77. package/dist/esm-node/core/server/string/ssrData.mjs +2 -2
  78. package/dist/esm-node/core/server/utils.mjs +31 -8
  79. package/dist/esm-node/exports/head.mjs +135 -74
  80. package/dist/esm-node/exports/tanstack-router.mjs +30 -4
  81. package/dist/esm-node/module-federation/index.mjs +110 -0
  82. package/dist/esm-node/router/cli/code/index.mjs +1 -47
  83. package/dist/esm-node/router/cli/code/templates.mjs +1 -14
  84. package/dist/esm-node/router/cli/handler.mjs +1 -1
  85. package/dist/esm-node/router/cli/index.mjs +3 -24
  86. package/dist/esm-node/router/runtime/DeferredDataScripts.node.mjs +16 -4
  87. package/dist/esm-node/router/runtime/PrefetchLink.mjs +2 -3
  88. package/dist/esm-node/router/runtime/internal.mjs +16 -15
  89. package/dist/esm-node/router/runtime/lifecycle.mjs +22 -13
  90. package/dist/esm-node/router/runtime/plugin.mjs +4 -11
  91. package/dist/esm-node/router/runtime/plugin.node.mjs +4 -9
  92. package/dist/esm-node/router/runtime/provider.mjs +58 -0
  93. package/dist/esm-node/router/runtime/utils.mjs +35 -9
  94. package/dist/types/cli/index.d.ts +3 -1
  95. package/dist/types/core/context/extensions.d.ts +37 -0
  96. package/dist/types/core/context/helmetContext.d.ts +10 -0
  97. package/dist/types/core/context/index.d.ts +6 -0
  98. package/dist/types/core/context/runtime.d.ts +1 -11
  99. package/dist/types/core/server/routerCleanup.d.ts +28 -0
  100. package/dist/types/core/server/scriptOrder.d.ts +24 -0
  101. package/dist/types/core/server/string/loadable.d.ts +1 -7
  102. package/dist/types/core/server/utils.d.ts +1 -0
  103. package/dist/types/exports/tanstack-router.d.ts +88 -7
  104. package/dist/types/module-federation/index.d.ts +65 -0
  105. package/dist/types/router/cli/code/index.d.ts +1 -3
  106. package/dist/types/router/cli/handler.d.ts +0 -3
  107. package/dist/types/router/runtime/internal.d.ts +1 -0
  108. package/dist/types/router/runtime/lifecycle.d.ts +2 -0
  109. package/dist/types/router/runtime/plugin.d.ts +1 -1
  110. package/dist/types/router/runtime/plugin.node.d.ts +1 -1
  111. package/dist/types/router/runtime/provider.d.ts +61 -0
  112. package/package.json +15 -11
  113. package/rstest.config.mts +2 -4
  114. package/dist/cjs/router/cli/code/tanstackTypes.js +0 -447
  115. package/dist/cjs/router/runtime/tanstack/basepathRewrite.js +0 -66
  116. package/dist/cjs/router/runtime/tanstack/dataMutation.js +0 -349
  117. package/dist/cjs/router/runtime/tanstack/hydrationBoundary.js +0 -48
  118. package/dist/cjs/router/runtime/tanstack/outlet.js +0 -58
  119. package/dist/cjs/router/runtime/tanstack/plugin.js +0 -342
  120. package/dist/cjs/router/runtime/tanstack/plugin.node.js +0 -272
  121. package/dist/cjs/router/runtime/tanstack/prefetchLink.js +0 -59
  122. package/dist/cjs/router/runtime/tanstack/routeTree.js +0 -525
  123. package/dist/cjs/router/runtime/tanstack/rsc/CompositeComponent.js +0 -79
  124. package/dist/cjs/router/runtime/tanstack/rsc/ReplayableStream.js +0 -146
  125. package/dist/cjs/router/runtime/tanstack/rsc/RscNodeRenderer.js +0 -69
  126. package/dist/cjs/router/runtime/tanstack/rsc/client.js +0 -97
  127. package/dist/cjs/router/runtime/tanstack/rsc/createRscProxy.js +0 -145
  128. package/dist/cjs/router/runtime/tanstack/rsc/index.js +0 -46
  129. package/dist/cjs/router/runtime/tanstack/rsc/server.js +0 -250
  130. package/dist/cjs/router/runtime/tanstack/rsc/slotUsageSanitizer.js +0 -69
  131. package/dist/cjs/router/runtime/tanstack/rsc/symbols.js +0 -77
  132. package/dist/cjs/ssr/index.node.js +0 -125
  133. package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +0 -88
  134. package/dist/cjs/ssr/serverRender/renderToString/entry.js +0 -200
  135. package/dist/cjs/ssr/serverRender/types.js +0 -40
  136. package/dist/esm/router/cli/code/tanstackTypes.mjs +0 -396
  137. package/dist/esm/router/runtime/tanstack/basepathRewrite.mjs +0 -28
  138. package/dist/esm/router/runtime/tanstack/dataMutation.mjs +0 -305
  139. package/dist/esm/router/runtime/tanstack/hydrationBoundary.mjs +0 -10
  140. package/dist/esm/router/runtime/tanstack/outlet.mjs +0 -17
  141. package/dist/esm/router/runtime/tanstack/plugin.mjs +0 -304
  142. package/dist/esm/router/runtime/tanstack/plugin.node.mjs +0 -234
  143. package/dist/esm/router/runtime/tanstack/prefetchLink.mjs +0 -18
  144. package/dist/esm/router/runtime/tanstack/routeTree.mjs +0 -481
  145. package/dist/esm/router/runtime/tanstack/rsc/ClientSlot.mjs +0 -19
  146. package/dist/esm/router/runtime/tanstack/rsc/CompositeComponent.mjs +0 -41
  147. package/dist/esm/router/runtime/tanstack/rsc/ReplayableStream.mjs +0 -104
  148. package/dist/esm/router/runtime/tanstack/rsc/RscNodeRenderer.mjs +0 -31
  149. package/dist/esm/router/runtime/tanstack/rsc/SlotContext.mjs +0 -17
  150. package/dist/esm/router/runtime/tanstack/rsc/client.mjs +0 -53
  151. package/dist/esm/router/runtime/tanstack/rsc/createRscProxy.mjs +0 -107
  152. package/dist/esm/router/runtime/tanstack/rsc/index.mjs +0 -1
  153. package/dist/esm/router/runtime/tanstack/rsc/server.mjs +0 -200
  154. package/dist/esm/router/runtime/tanstack/rsc/slotUsageSanitizer.mjs +0 -31
  155. package/dist/esm/router/runtime/tanstack/rsc/symbols.mjs +0 -17
  156. package/dist/esm/ssr/index.node.mjs +0 -44
  157. package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.mjs +0 -50
  158. package/dist/esm/ssr/serverRender/renderToString/entry.mjs +0 -151
  159. package/dist/esm/ssr/serverRender/types.mjs +0 -1
  160. package/dist/esm-node/router/cli/code/tanstackTypes.mjs +0 -397
  161. package/dist/esm-node/router/runtime/tanstack/basepathRewrite.mjs +0 -29
  162. package/dist/esm-node/router/runtime/tanstack/dataMutation.mjs +0 -306
  163. package/dist/esm-node/router/runtime/tanstack/hydrationBoundary.mjs +0 -11
  164. package/dist/esm-node/router/runtime/tanstack/outlet.mjs +0 -18
  165. package/dist/esm-node/router/runtime/tanstack/plugin.mjs +0 -305
  166. package/dist/esm-node/router/runtime/tanstack/plugin.node.mjs +0 -235
  167. package/dist/esm-node/router/runtime/tanstack/prefetchLink.mjs +0 -19
  168. package/dist/esm-node/router/runtime/tanstack/routeTree.mjs +0 -482
  169. package/dist/esm-node/router/runtime/tanstack/rsc/ClientSlot.mjs +0 -20
  170. package/dist/esm-node/router/runtime/tanstack/rsc/CompositeComponent.mjs +0 -42
  171. package/dist/esm-node/router/runtime/tanstack/rsc/ReplayableStream.mjs +0 -105
  172. package/dist/esm-node/router/runtime/tanstack/rsc/RscNodeRenderer.mjs +0 -32
  173. package/dist/esm-node/router/runtime/tanstack/rsc/SlotContext.mjs +0 -18
  174. package/dist/esm-node/router/runtime/tanstack/rsc/client.mjs +0 -54
  175. package/dist/esm-node/router/runtime/tanstack/rsc/createRscProxy.mjs +0 -108
  176. package/dist/esm-node/router/runtime/tanstack/rsc/index.mjs +0 -2
  177. package/dist/esm-node/router/runtime/tanstack/rsc/server.mjs +0 -201
  178. package/dist/esm-node/router/runtime/tanstack/rsc/slotUsageSanitizer.mjs +0 -32
  179. package/dist/esm-node/router/runtime/tanstack/rsc/symbols.mjs +0 -18
  180. package/dist/esm-node/ssr/index.node.mjs +0 -45
  181. package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.mjs +0 -51
  182. package/dist/esm-node/ssr/serverRender/renderToString/entry.mjs +0 -152
  183. package/dist/esm-node/ssr/serverRender/types.mjs +0 -2
  184. package/dist/types/router/cli/code/tanstackTypes.d.ts +0 -10
  185. package/dist/types/router/runtime/tanstack/basepathRewrite.d.ts +0 -8
  186. package/dist/types/router/runtime/tanstack/dataMutation.d.ts +0 -29
  187. package/dist/types/router/runtime/tanstack/hydrationBoundary.d.ts +0 -2
  188. package/dist/types/router/runtime/tanstack/outlet.d.ts +0 -2
  189. package/dist/types/router/runtime/tanstack/plugin.d.ts +0 -6
  190. package/dist/types/router/runtime/tanstack/plugin.node.d.ts +0 -6
  191. package/dist/types/router/runtime/tanstack/prefetchLink.d.ts +0 -11
  192. package/dist/types/router/runtime/tanstack/routeTree.d.ts +0 -8
  193. package/dist/types/router/runtime/tanstack/rsc/ClientSlot.d.ts +0 -5
  194. package/dist/types/router/runtime/tanstack/rsc/CompositeComponent.d.ts +0 -3
  195. package/dist/types/router/runtime/tanstack/rsc/ReplayableStream.d.ts +0 -24
  196. package/dist/types/router/runtime/tanstack/rsc/RscNodeRenderer.d.ts +0 -5
  197. package/dist/types/router/runtime/tanstack/rsc/SlotContext.d.ts +0 -11
  198. package/dist/types/router/runtime/tanstack/rsc/client.d.ts +0 -11
  199. package/dist/types/router/runtime/tanstack/rsc/createRscProxy.d.ts +0 -7
  200. package/dist/types/router/runtime/tanstack/rsc/index.d.ts +0 -2
  201. package/dist/types/router/runtime/tanstack/rsc/server.d.ts +0 -14
  202. package/dist/types/router/runtime/tanstack/rsc/slotUsageSanitizer.d.ts +0 -2
  203. 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
- __webpack_require__.d(__webpack_exports__, {
55
- injectBeforeHydrationEntryScript: ()=>injectBeforeHydrationEntryScript
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
- "injectBeforeHydrationEntryScript"
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 { routeManifest } = runtimeContext;
55
- if (!routeManifest) return template;
56
- const { routeAssets } = routeManifest;
57
- if (!routeAssets) return template;
58
- const matchedRouteIds = (0, lifecycle_js_namespaceObject.getRouterMatchedRouteIds)(runtimeContext) ?? [];
59
- const assetEntries = [
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: 'production' !== process.env.NODE_ENV ? maybeStack : void 0
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 dedupeChunksByUrl = (chunks)=>{
44
- const seen = new Set();
45
- return chunks.filter((chunk)=>{
46
- if (!chunk.url || seen.has(chunk.url)) return false;
47
- seen.add(chunk.url);
48
- return true;
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
- const routeAssets = routeManifest?.routeAssets;
89
- if (!routeAssets) return [];
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.routerServerSnapshot?.routerData;
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
- ...val,
54
- __type: 'RouteErrorResponse'
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
- else if (val instanceof Error) serialized[key] = {
57
- message: val.message,
58
- stack: val.stack,
66
+ return {
67
+ message: error.message,
68
+ stack: error.stack,
59
69
  __type: 'Error'
60
70
  };
61
- else serialized[key] = val;
62
- return serialized;
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];
@@ -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('&', '&amp;').replaceAll('"', '&quot;').replaceAll('<', '&lt;').replaceAll('>', '&gt;');
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 || 'body' === child.type) return;
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 collectHelmetProps = (current, props)=>{
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
- base: createDatum('base', [
167
- ...baseState.__baseTags ?? [],
168
- ...draft.base
169
- ]),
170
- bodyAttributes: createAttributeDatum(mergeAttributes(baseState.__bodyAttributes ?? {}, draft.bodyAttributes)),
171
- htmlAttributes: createAttributeDatum(mergeAttributes(baseState.__htmlAttributes ?? {}, draft.htmlAttributes)),
172
- link: createDatum('link', [
173
- ...baseState.__linkTags ?? [],
174
- ...draft.link
175
- ]),
176
- meta: createDatum('meta', [
177
- ...baseState.__metaTags ?? [],
178
- ...draft.meta
179
- ]),
180
- noscript: createDatum("noscript", [
181
- ...baseState.__noscriptTags ?? [],
182
- ...draft.noscript
183
- ]),
184
- priority: createDatum('meta', []),
185
- script: createDatum("script", [
186
- ...baseState.__scriptTags ?? [],
187
- ...draft.script
188
- ]),
189
- style: createDatum('style', [
190
- ...baseState.__styleTags ?? [],
191
- ...draft.style
192
- ]),
193
- title: createTitleDatum(title ?? baseState.__title, mergeAttributes(baseState.__titleAttributes ?? {}, draft.titleAttributes)),
194
- __baseTags: [
195
- ...baseState.__baseTags ?? [],
196
- ...draft.base
197
- ],
198
- __bodyAttributes: mergeAttributes(baseState.__bodyAttributes ?? {}, draft.bodyAttributes),
199
- __htmlAttributes: mergeAttributes(baseState.__htmlAttributes ?? {}, draft.htmlAttributes),
200
- __linkTags: [
201
- ...baseState.__linkTags ?? [],
202
- ...draft.link
203
- ],
204
- __metaTags: [
205
- ...baseState.__metaTags ?? [],
206
- ...draft.meta
207
- ],
208
- __noscriptTags: [
209
- ...baseState.__noscriptTags ?? [],
210
- ...draft.noscript
211
- ],
212
- __scriptTags: [
213
- ...baseState.__scriptTags ?? [],
214
- ...draft.script
215
- ],
216
- __styleTags: [
217
- ...baseState.__styleTags ?? [],
218
- ...draft.style
219
- ],
220
- __title: title ?? baseState.__title,
221
- __titleAttributes: mergeAttributes(baseState.__titleAttributes ?? {}, draft.titleAttributes)
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._helmetContext ??= {};
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);