@bleedingdev/modern-js-runtime 3.9.0-ultramodern.2 → 3.9.0-ultramodern.20

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 (209) hide show
  1. package/dist/cjs/cli/code.js +3 -1
  2. package/dist/cjs/cli/ssr/index.js +2 -74
  3. package/dist/cjs/cli/ssr/loadable-bundler-plugin.js +2 -0
  4. package/dist/cjs/cli/template.server.js +1 -2
  5. package/dist/cjs/core/browser/hydrate.js +9 -10
  6. package/dist/cjs/core/browser/index.js +4 -5
  7. package/dist/cjs/core/context/index.js +12 -45
  8. package/dist/cjs/core/context/public.js +4 -7
  9. package/dist/cjs/core/context/runtime.js +10 -4
  10. package/dist/cjs/core/index.js +3 -3
  11. package/dist/cjs/core/plugin/index.js +2 -2
  12. package/dist/cjs/core/react/index.js +3 -3
  13. package/dist/cjs/core/react/wrapper.js +23 -67
  14. package/dist/cjs/core/server/helmet.js +5 -4
  15. package/dist/cjs/core/server/requestHandler.js +6 -7
  16. package/dist/cjs/core/server/requestResponse.js +4 -4
  17. package/dist/cjs/core/server/routerCleanup.js +2 -2
  18. package/dist/cjs/core/server/shared.js +171 -4
  19. package/dist/cjs/core/server/stream/afterTemplate.js +21 -16
  20. package/dist/cjs/core/server/stream/beforeTemplate.js +37 -28
  21. package/dist/cjs/core/server/stream/beforeTemplate.worker.js +30 -23
  22. package/dist/cjs/core/server/stream/createReadableStream.js +222 -125
  23. package/dist/cjs/core/server/stream/createReadableStream.worker.js +171 -90
  24. package/dist/cjs/core/server/stream/deferredScript.js +3 -3
  25. package/dist/cjs/core/server/stream/shared.js +6 -2
  26. package/dist/cjs/core/server/string/index.js +104 -66
  27. package/dist/cjs/core/server/string/loadable.js +38 -23
  28. package/dist/cjs/core/server/string/ssrData.js +5 -12
  29. package/dist/cjs/core/server/utils.js +1 -2
  30. package/dist/cjs/exports/head.js +7 -14
  31. package/dist/cjs/internal.js +2 -2
  32. package/dist/cjs/router/cli/code/nestedRoutes.js +1 -2
  33. package/dist/cjs/router/cli/code/templates.js +1 -1
  34. package/dist/cjs/router/cli/code/utils.js +2 -2
  35. package/dist/cjs/router/runtime/DeferredDataScripts.node.js +10 -9
  36. package/dist/cjs/router/runtime/PrefetchLink.js +69 -125
  37. package/dist/cjs/router/runtime/hooks.js +13 -2
  38. package/dist/cjs/router/runtime/internal.js +7 -45
  39. package/dist/cjs/router/runtime/plugin.js +19 -34
  40. package/dist/cjs/router/runtime/plugin.node.js +9 -37
  41. package/dist/cjs/router/runtime/redirect.js +1 -1
  42. package/dist/esm/cli/code.mjs +3 -1
  43. package/dist/esm/cli/ssr/index.mjs +3 -72
  44. package/dist/esm/cli/ssr/loadable-bundler-plugin.mjs +2 -0
  45. package/dist/esm/cli/template.server.mjs +1 -2
  46. package/dist/esm/core/browser/hydrate.mjs +10 -11
  47. package/dist/esm/core/browser/index.mjs +1 -2
  48. package/dist/esm/core/context/index.mjs +2 -5
  49. package/dist/esm/core/context/public.mjs +1 -5
  50. package/dist/esm/core/context/runtime.mjs +6 -3
  51. package/dist/esm/core/index.mjs +1 -1
  52. package/dist/esm/core/plugin/index.mjs +1 -1
  53. package/dist/esm/core/react/index.mjs +1 -1
  54. package/dist/esm/core/react/wrapper.mjs +20 -67
  55. package/dist/esm/core/server/helmet.mjs +5 -4
  56. package/dist/esm/core/server/requestHandler.mjs +1 -2
  57. package/dist/esm/core/server/requestResponse.mjs +3 -3
  58. package/dist/esm/core/server/routerCleanup.mjs +1 -1
  59. package/dist/esm/core/server/shared.mjs +153 -1
  60. package/dist/esm/core/server/stream/afterTemplate.mjs +23 -18
  61. package/dist/esm/core/server/stream/beforeTemplate.mjs +40 -31
  62. package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +33 -26
  63. package/dist/esm/core/server/stream/createReadableStream.mjs +220 -123
  64. package/dist/esm/core/server/stream/createReadableStream.worker.mjs +161 -90
  65. package/dist/esm/core/server/stream/deferredScript.mjs +3 -3
  66. package/dist/esm/core/server/stream/shared.mjs +4 -3
  67. package/dist/esm/core/server/string/index.mjs +106 -68
  68. package/dist/esm/core/server/string/loadable.mjs +38 -23
  69. package/dist/esm/core/server/string/ssrData.mjs +5 -12
  70. package/dist/esm/core/server/utils.mjs +1 -2
  71. package/dist/esm/exports/head.mjs +7 -14
  72. package/dist/esm/internal.mjs +1 -1
  73. package/dist/esm/router/cli/code/nestedRoutes.mjs +1 -2
  74. package/dist/esm/router/cli/code/templates.mjs +1 -1
  75. package/dist/esm/router/cli/code/utils.mjs +2 -2
  76. package/dist/esm/router/runtime/DeferredDataScripts.node.mjs +10 -9
  77. package/dist/esm/router/runtime/PrefetchLink.mjs +68 -124
  78. package/dist/esm/router/runtime/hooks.mjs +9 -1
  79. package/dist/esm/router/runtime/internal.mjs +2 -33
  80. package/dist/esm/router/runtime/plugin.mjs +10 -25
  81. package/dist/esm/router/runtime/plugin.node.mjs +3 -31
  82. package/dist/esm/router/runtime/redirect.mjs +1 -1
  83. package/dist/esm-node/cli/code.mjs +3 -1
  84. package/dist/esm-node/cli/ssr/index.mjs +3 -72
  85. package/dist/esm-node/cli/ssr/loadable-bundler-plugin.mjs +2 -0
  86. package/dist/esm-node/cli/template.server.mjs +1 -2
  87. package/dist/esm-node/core/browser/hydrate.mjs +10 -11
  88. package/dist/esm-node/core/browser/index.mjs +1 -2
  89. package/dist/esm-node/core/context/index.mjs +2 -5
  90. package/dist/esm-node/core/context/public.mjs +1 -5
  91. package/dist/esm-node/core/context/runtime.mjs +6 -3
  92. package/dist/esm-node/core/index.mjs +1 -1
  93. package/dist/esm-node/core/plugin/index.mjs +1 -1
  94. package/dist/esm-node/core/react/index.mjs +1 -1
  95. package/dist/esm-node/core/react/wrapper.mjs +20 -67
  96. package/dist/esm-node/core/server/helmet.mjs +5 -4
  97. package/dist/esm-node/core/server/requestHandler.mjs +1 -2
  98. package/dist/esm-node/core/server/requestResponse.mjs +3 -3
  99. package/dist/esm-node/core/server/routerCleanup.mjs +1 -1
  100. package/dist/esm-node/core/server/shared.mjs +153 -1
  101. package/dist/esm-node/core/server/stream/afterTemplate.mjs +23 -18
  102. package/dist/esm-node/core/server/stream/beforeTemplate.mjs +40 -31
  103. package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +33 -26
  104. package/dist/esm-node/core/server/stream/createReadableStream.mjs +220 -123
  105. package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +161 -90
  106. package/dist/esm-node/core/server/stream/deferredScript.mjs +3 -3
  107. package/dist/esm-node/core/server/stream/shared.mjs +4 -3
  108. package/dist/esm-node/core/server/string/index.mjs +106 -68
  109. package/dist/esm-node/core/server/string/loadable.mjs +38 -23
  110. package/dist/esm-node/core/server/string/ssrData.mjs +5 -12
  111. package/dist/esm-node/core/server/utils.mjs +1 -2
  112. package/dist/esm-node/exports/head.mjs +7 -14
  113. package/dist/esm-node/internal.mjs +1 -1
  114. package/dist/esm-node/router/cli/code/nestedRoutes.mjs +1 -2
  115. package/dist/esm-node/router/cli/code/templates.mjs +1 -1
  116. package/dist/esm-node/router/cli/code/utils.mjs +2 -2
  117. package/dist/esm-node/router/runtime/DeferredDataScripts.node.mjs +10 -9
  118. package/dist/esm-node/router/runtime/PrefetchLink.mjs +68 -124
  119. package/dist/esm-node/router/runtime/hooks.mjs +9 -1
  120. package/dist/esm-node/router/runtime/internal.mjs +2 -33
  121. package/dist/esm-node/router/runtime/plugin.mjs +10 -25
  122. package/dist/esm-node/router/runtime/plugin.node.mjs +3 -31
  123. package/dist/esm-node/router/runtime/redirect.mjs +1 -1
  124. package/dist/types/cli/ssr/index.d.ts +0 -3
  125. package/dist/types/core/context/index.d.ts +4 -6
  126. package/dist/types/core/context/public.d.ts +1 -23
  127. package/dist/types/core/context/runtime.d.ts +26 -2
  128. package/dist/types/core/index.d.ts +1 -1
  129. package/dist/types/core/react/wrapper.d.ts +7 -1
  130. package/dist/types/core/server/helmet.d.ts +4 -5
  131. package/dist/types/core/server/requestHandler.d.ts +3 -3
  132. package/dist/types/core/server/requestResponse.d.ts +1 -1
  133. package/dist/types/core/server/routerCleanup.d.ts +1 -1
  134. package/dist/types/core/server/shared.d.ts +24 -1
  135. package/dist/types/core/server/stream/afterTemplate.d.ts +2 -1
  136. package/dist/types/core/server/stream/beforeTemplate.d.ts +4 -1
  137. package/dist/types/core/server/stream/beforeTemplate.worker.d.ts +4 -1
  138. package/dist/types/core/server/stream/shared.d.ts +16 -2
  139. package/dist/types/core/server/string/loadable.d.ts +6 -3
  140. package/dist/types/core/server/string/ssrData.d.ts +2 -1
  141. package/dist/types/core/server/string/types.d.ts +1 -5
  142. package/dist/types/core/server/tracer.d.ts +1 -1
  143. package/dist/types/core/server/utils.d.ts +1 -1
  144. package/dist/types/core/types.d.ts +1 -2
  145. package/dist/types/exports/head.d.ts +2 -2
  146. package/dist/types/internal.d.ts +1 -1
  147. package/dist/types/router/runtime/PrefetchLink.d.ts +27 -2
  148. package/dist/types/router/runtime/hooks.d.ts +19 -2
  149. package/dist/types/router/runtime/internal.d.ts +4 -21
  150. package/dist/types/router/runtime/types.d.ts +2 -43
  151. package/package.json +18 -46
  152. package/rslib.config.mts +3 -0
  153. package/rstest.config.mts +28 -2
  154. package/dist/cjs/boundary-debugger/index.js +0 -317
  155. package/dist/cjs/core/context/extensions.js +0 -74
  156. package/dist/cjs/core/context/helmetContext.js +0 -54
  157. package/dist/cjs/core/server/federatedCss.js +0 -58
  158. package/dist/cjs/core/server/scriptOrder.js +0 -140
  159. package/dist/cjs/module-federation/consume-surface.js +0 -199
  160. package/dist/cjs/module-federation/distributed-ssr.js +0 -135
  161. package/dist/cjs/module-federation/index.js +0 -316
  162. package/dist/cjs/module-federation/last-known-good.js +0 -157
  163. package/dist/cjs/module-federation/manifest-recovery-runtime-plugin.js +0 -129
  164. package/dist/cjs/module-federation/surface-resolution-types.js +0 -61
  165. package/dist/cjs/router/runtime/lifecycle.js +0 -167
  166. package/dist/cjs/router/runtime/provider.js +0 -153
  167. package/dist/cjs/rsc/server.worker.js +0 -62
  168. package/dist/esm/boundary-debugger/index.mjs +0 -277
  169. package/dist/esm/core/context/extensions.mjs +0 -33
  170. package/dist/esm/core/context/helmetContext.mjs +0 -13
  171. package/dist/esm/core/server/federatedCss.mjs +0 -20
  172. package/dist/esm/core/server/scriptOrder.mjs +0 -90
  173. package/dist/esm/module-federation/consume-surface.mjs +0 -158
  174. package/dist/esm/module-federation/distributed-ssr.mjs +0 -82
  175. package/dist/esm/module-federation/index.mjs +0 -115
  176. package/dist/esm/module-federation/last-known-good.mjs +0 -113
  177. package/dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs +0 -89
  178. package/dist/esm/module-federation/surface-resolution-types.mjs +0 -8
  179. package/dist/esm/router/runtime/lifecycle.mjs +0 -105
  180. package/dist/esm/router/runtime/provider.mjs +0 -100
  181. package/dist/esm/rsc/server.worker.mjs +0 -1
  182. package/dist/esm-node/boundary-debugger/index.mjs +0 -278
  183. package/dist/esm-node/core/context/extensions.mjs +0 -34
  184. package/dist/esm-node/core/context/helmetContext.mjs +0 -14
  185. package/dist/esm-node/core/server/federatedCss.mjs +0 -21
  186. package/dist/esm-node/core/server/scriptOrder.mjs +0 -91
  187. package/dist/esm-node/module-federation/consume-surface.mjs +0 -159
  188. package/dist/esm-node/module-federation/distributed-ssr.mjs +0 -83
  189. package/dist/esm-node/module-federation/index.mjs +0 -116
  190. package/dist/esm-node/module-federation/last-known-good.mjs +0 -114
  191. package/dist/esm-node/module-federation/manifest-recovery-runtime-plugin.mjs +0 -90
  192. package/dist/esm-node/module-federation/surface-resolution-types.mjs +0 -9
  193. package/dist/esm-node/router/runtime/lifecycle.mjs +0 -106
  194. package/dist/esm-node/router/runtime/provider.mjs +0 -101
  195. package/dist/esm-node/rsc/server.worker.mjs +0 -2
  196. package/dist/types/boundary-debugger/index.d.ts +0 -28
  197. package/dist/types/core/context/extensions.d.ts +0 -35
  198. package/dist/types/core/context/helmetContext.d.ts +0 -10
  199. package/dist/types/core/server/federatedCss.d.ts +0 -5
  200. package/dist/types/core/server/scriptOrder.d.ts +0 -25
  201. package/dist/types/module-federation/consume-surface.d.ts +0 -104
  202. package/dist/types/module-federation/distributed-ssr.d.ts +0 -61
  203. package/dist/types/module-federation/index.d.ts +0 -71
  204. package/dist/types/module-federation/last-known-good.d.ts +0 -52
  205. package/dist/types/module-federation/manifest-recovery-runtime-plugin.d.ts +0 -25
  206. package/dist/types/module-federation/surface-resolution-types.d.ts +0 -23
  207. package/dist/types/router/runtime/lifecycle.d.ts +0 -27
  208. package/dist/types/router/runtime/provider.d.ts +0 -78
  209. package/dist/types/rsc/server.worker.d.ts +0 -1
@@ -31,15 +31,13 @@ __webpack_require__.d(__webpack_exports__, {
31
31
  LoadableCollector: ()=>LoadableCollector
32
32
  });
33
33
  const server_namespaceObject = require("@loadable/server");
34
- const external_federatedCss_js_namespaceObject = require("../federatedCss.js");
35
- const external_scriptOrder_js_namespaceObject = require("../scriptOrder.js");
36
34
  const external_utils_js_namespaceObject = require("../utils.js");
37
35
  const extname = (uri)=>{
38
36
  if ('string' != typeof uri || !uri.includes('.')) return '';
39
37
  return `.${uri?.split('.').pop()}` || '';
40
38
  };
41
39
  const generateChunks = (chunks, ext)=>chunks.filter((chunk)=>Boolean(chunk.url)).filter((chunk)=>extname(chunk.url).slice(1) === ext);
42
- const routeAssetToChunk = (asset)=>({
40
+ const assetToChunk = (asset)=>({
43
41
  chunk: asset,
44
42
  filename: asset.replace(/^\//, ''),
45
43
  linkType: 'preload',
@@ -50,8 +48,8 @@ const routeAssetToChunk = (asset)=>({
50
48
  });
51
49
  const checkIsInline = (chunk, enableInline)=>{
52
50
  if ('production' !== process.env.NODE_ENV) return false;
53
- if (enableInline instanceof RegExp) return enableInline.test(chunk.url);
54
- return Boolean(enableInline);
51
+ else if (enableInline instanceof RegExp) return enableInline.test(chunk.url);
52
+ else return Boolean(enableInline);
55
53
  };
56
54
  const readAsset = async (chunk)=>{
57
55
  const fs = await import("fs/promises");
@@ -85,16 +83,32 @@ class LoadableCollector {
85
83
  ]));
86
84
  } catch (e) {}
87
85
  const collectedChunks = extractor ? extractor.getChunkAssets(extractor.chunks) : [];
88
- const matchedRouteChunks = (0, external_scriptOrder_js_namespaceObject.getMatchedRouteChunks)(options.runtimeContext, options.routeManifest, routeAssetToChunk);
89
- const orderedScriptChunks = (0, external_scriptOrder_js_namespaceObject.orderHydrationScriptChunks)({
90
- asyncEntryChunks: asyncChunks,
91
- collectedChunks,
92
- matchedRouteChunks,
93
- entryName
94
- });
95
- const chunks = [].concat(asyncChunks).concat(collectedChunks).concat(matchedRouteChunks);
96
- const scriptChunks = generateChunks(orderedScriptChunks, 'js');
97
- const styleChunks = generateChunks(chunks, 'css');
86
+ const groups = [
87
+ {
88
+ name: 'async-entry',
89
+ assets: asyncChunks
90
+ },
91
+ {
92
+ name: 'loadable',
93
+ assets: collectedChunks
94
+ }
95
+ ];
96
+ const nativeChunks = [
97
+ ...asyncChunks,
98
+ ...collectedChunks
99
+ ];
100
+ const prepare = (kind)=>options.lifecycle?.transformAssets(groups, {
101
+ kind,
102
+ source: 'loadable',
103
+ template: options.template,
104
+ createAsset: assetToChunk
105
+ }) ?? nativeChunks;
106
+ const scriptChunks = generateChunks([
107
+ ...prepare("script")
108
+ ], 'js');
109
+ const styleChunks = generateChunks([
110
+ ...prepare('style')
111
+ ], 'css');
98
112
  if (extractor) {
99
113
  this.emitLoadableScripts(extractor);
100
114
  await this.emitScriptAssets(scriptChunks);
@@ -128,12 +142,12 @@ class LoadableCollector {
128
142
  const scripts = await Promise.all(chunks.filter((chunk)=>!existedScript.includes(chunk.url) && !this.existsAssets?.includes(chunk.path)).map(async (chunk)=>{
129
143
  const script = `<script${attributes} src="${chunk.url}"></script>`;
130
144
  if ((0, external_utils_js_namespaceObject.checkIsNode)() && checkIsInline(chunk, inlineStyles)) return readAsset(chunk).then((content)=>`<script>${content}</script>`).catch((_)=>script);
131
- return script;
145
+ else return script;
132
146
  }));
133
147
  chunkSet.jsChunk += scripts.filter((script)=>Boolean(script)).join('');
134
148
  }
135
149
  async emitStyleAssets(chunks) {
136
- const { template, chunkSet, config, moduleFederationCssAssets } = this.options;
150
+ const { template, chunkSet, config } = this.options;
137
151
  const { inlineStyles } = config;
138
152
  const atrributes = (0, external_utils_js_namespaceObject.attributesToString)(this.generateAttributes());
139
153
  const emittedAssetUrls = new Set();
@@ -145,14 +159,11 @@ class LoadableCollector {
145
159
  const css = await Promise.all(emittedChunks.map(async (chunk)=>{
146
160
  const link = `<link${atrributes} href="${chunk.url}" rel="stylesheet" />`;
147
161
  if ((0, external_utils_js_namespaceObject.checkIsNode)() && checkIsInline(chunk, inlineStyles)) return readAsset(chunk).then((content)=>`<style>${content}</style>`).catch((_)=>link);
148
- return link;
162
+ else return link;
149
163
  }));
150
164
  chunkSet.cssChunk += css.filter((css)=>Boolean(css)).join('');
151
- chunkSet.cssChunk += (0, external_federatedCss_js_namespaceObject.createFederatedCssLinks)(moduleFederationCssAssets, {
152
- template,
153
- attributes: this.generateAttributes(),
154
- existingAssets: emittedChunks.map((chunk)=>chunk.url)
155
- });
165
+ this.stylesheetInfo.emittedAssets = emittedChunks.map((chunk)=>chunk.url);
166
+ this.stylesheetInfo.attributes = this.generateAttributes();
156
167
  }
157
168
  generateAttributes(extraAtr = {}) {
158
169
  const { config } = this.options;
@@ -165,6 +176,10 @@ class LoadableCollector {
165
176
  };
166
177
  }
167
178
  constructor(options){
179
+ this.stylesheetInfo = {
180
+ emittedAssets: [],
181
+ attributes: {}
182
+ };
168
183
  this.options = options;
169
184
  }
170
185
  }
@@ -31,7 +31,6 @@ __webpack_require__.d(__webpack_exports__, {
31
31
  SSRDataCollector: ()=>SSRDataCollector
32
32
  });
33
33
  const node_namespaceObject = require("@modern-js/runtime-utils/node");
34
- const lifecycle_js_namespaceObject = require("../../../router/runtime/lifecycle.js");
35
34
  const external_constants_js_namespaceObject = require("../../constants.js");
36
35
  const external_utils_js_namespaceObject = require("../utils.js");
37
36
  function _check_private_redeclaration(obj, privateCollection) {
@@ -120,20 +119,15 @@ function getSSRData() {
120
119
  };
121
120
  }
122
121
  function getRouterData() {
123
- const { routerContext, runtimeContext } = _class_private_field_get(this, _options);
124
- const snapshotRouterData = (0, lifecycle_js_namespaceObject.getRouterServerSnapshot)(runtimeContext)?.routerData;
125
- if (snapshotRouterData) return {
126
- loaderData: snapshotRouterData.loaderData,
127
- errors: (0, external_utils_js_namespaceObject.serializeErrors)(snapshotRouterData.errors || null)
128
- };
129
- return routerContext ? {
130
- loaderData: routerContext.loaderData,
131
- errors: (0, external_utils_js_namespaceObject.serializeErrors)(routerContext.errors)
122
+ const { routerContext, lifecycle } = _class_private_field_get(this, _options);
123
+ const data = lifecycle?.getRouterData() ?? routerContext;
124
+ return data ? {
125
+ loaderData: data.loaderData,
126
+ errors: (0, external_utils_js_namespaceObject.serializeErrors)(data.errors || null)
132
127
  } : void 0;
133
128
  }
134
129
  function getSSRDataScripts(ssrData, routerData) {
135
130
  const { nonce, useJsonScript = false } = _class_private_field_get(this, _options);
136
- const hydrationScripts = (0, lifecycle_js_namespaceObject.getRouterHydrationScripts)(_class_private_field_get(this, _options).runtimeContext);
137
131
  const serializeSSRData = (0, node_namespaceObject.serializeJson)(ssrData);
138
132
  const attrsStr = (0, external_utils_js_namespaceObject.attributesToString)({
139
133
  nonce
@@ -143,7 +137,6 @@ function getSSRDataScripts(ssrData, routerData) {
143
137
  const serializedRouterData = (0, node_namespaceObject.serializeJson)(routerData);
144
138
  ssrDataScripts += useJsonScript ? `\n<script type="application/json" id="${external_constants_js_namespaceObject.ROUTER_DATA_JSON_ID}">${serializedRouterData}</script>` : `\n<script${attrsStr}>window._ROUTER_DATA = ${serializedRouterData}</script>`;
145
139
  }
146
- if (hydrationScripts.length) ssrDataScripts += `\n${hydrationScripts.join('\n')}`;
147
140
  return ssrDataScripts;
148
141
  }
149
142
  exports.SSRDataCollector = __webpack_exports__.SSRDataCollector;
@@ -37,10 +37,9 @@ __webpack_require__.d(__webpack_exports__, {
37
37
  serializeErrors: ()=>serializeErrors,
38
38
  shouldRedactServerError: ()=>shouldRedactServerError
39
39
  });
40
- const runtime_extensions_namespaceObject = require("@modern-js/runtime-extensions");
41
40
  const routerHelper_js_namespaceObject = require("../../router/runtime/routerHelper.js");
42
41
  function attributesToString(attributes) {
43
- return Object.entries(attributes).reduce((str, [key, value])=>void 0 !== value && (0, runtime_extensions_namespaceObject.isSafeHtmlAttributeName)(key) ? `${str} ${key}="${(0, runtime_extensions_namespaceObject.escapeHtmlAttribute)(value)}"` : str, '');
42
+ return Object.entries(attributes).reduce((str, [key, value])=>void 0 !== value && /^[^\u0000-\u0020"'<>/=]+$/u.test(key) ? `${str} ${key}="${String(value).replaceAll('&', '&amp;').replaceAll('"', '&quot;').replaceAll('<', '&lt;').replaceAll('>', '&gt;')}"` : str, '');
44
43
  }
45
44
  function safeReplace(source, searchValue, replaceValue) {
46
45
  return source.replace(searchValue, ()=>replaceValue);
@@ -41,24 +41,17 @@ __webpack_require__.d(__webpack_exports__, {
41
41
  Helmet: ()=>Helmet,
42
42
  default: ()=>exports_head
43
43
  });
44
- const runtime_extensions_namespaceObject = require("@modern-js/runtime-extensions");
44
+ const context_namespaceObject = require("@modern-js/runtime/context");
45
45
  const external_react_namespaceObject = require("react");
46
46
  var external_react_default = /*#__PURE__*/ __webpack_require__.n(external_react_namespaceObject);
47
47
  const external_react_helmet_async_namespaceObject = require("react-helmet-async");
48
- const index_js_namespaceObject = require("../core/context/index.js");
49
- const helmetContext_js_namespaceObject = require("../core/context/helmetContext.js");
50
- const collectServerHelmet = (runtimeContext, props)=>{
51
- const helmetContext = (0, helmetContext_js_namespaceObject.ensureHelmetContext)(runtimeContext);
52
- const createRecord = ()=>runtime_extensions_namespaceObject.createHelmetRecord(external_react_default(), props);
53
- const deriveState = (records)=>runtime_extensions_namespaceObject.deriveHelmetServerState(external_react_default(), records);
54
- const marker = runtime_extensions_namespaceObject.collectHeadState(runtimeContext, createRecord, deriveState, helmetContext);
55
- if (void 0 !== marker) return marker;
56
- helmetContext.helmet = runtime_extensions_namespaceObject.collectImmediateHelmetState(external_react_default(), helmetContext, createRecord());
57
- };
58
48
  const Helmet = (props)=>{
59
- const runtimeContext = external_react_default().useContext(index_js_namespaceObject.InternalRuntimeContext);
60
- if (null !== runtimeContext && false === runtimeContext.isBrowser) return runtime_extensions_namespaceObject.renderHeadMarker(external_react_default(), collectServerHelmet(runtimeContext, props));
61
- return external_react_default().createElement(external_react_helmet_async_namespaceObject.Helmet, props);
49
+ const resolveComponent = external_react_default().useContext(context_namespaceObject.RuntimeComponentResolverContext);
50
+ const Component = resolveComponent?.(external_react_helmet_async_namespaceObject.Helmet, {
51
+ name: 'head.Helmet'
52
+ }) ?? external_react_helmet_async_namespaceObject.Helmet;
53
+ if (Component === Helmet) throw new Error('A component resolver cannot resolve head.Helmet to itself.');
54
+ return external_react_default().createElement(Component, props);
62
55
  };
63
56
  const head = {
64
57
  Helmet,
@@ -28,9 +28,9 @@ var __webpack_require__ = {};
28
28
  var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
- InternalRuntimeContext: ()=>runtime_js_namespaceObject.InternalRuntimeContext
31
+ InternalRuntimeContext: ()=>context_namespaceObject.InternalRuntimeContext
32
32
  });
33
- const runtime_js_namespaceObject = require("./core/context/runtime.js");
33
+ const context_namespaceObject = require("@modern-js/runtime/context");
34
34
  exports.InternalRuntimeContext = __webpack_exports__.InternalRuntimeContext;
35
35
  for(var __rspack_i in __webpack_exports__)if (-1 === [
36
36
  "InternalRuntimeContext"
@@ -76,8 +76,7 @@ const optimizeRoute = (routeTree)=>{
76
76
  children: optimizedChildren
77
77
  }
78
78
  ];
79
- }
80
- {
79
+ } else {
81
80
  const newRoutes = children.map((child)=>{
82
81
  const routePath = routeTree.path ? `${routeTree.path}${child.path ? `/${child.path}` : ''}` : child.path || '';
83
82
  const newRoute = {
@@ -422,7 +422,7 @@ const runtimeGlobalContext = async ({ entryName, metaName, srcDirectory, nestedR
422
422
  enableRsc: true,
423
423
  });
424
424
  `;
425
- return `${imports.join('\n')}
425
+ else return `${imports.join('\n')}
426
426
 
427
427
  import { routes } from '${routesImportPath}';
428
428
 
@@ -61,7 +61,7 @@ const walkDirectory = (dir)=>external_fs_default().readdirSync(dir).reduce((prev
61
61
  ...previous,
62
62
  ...walkDirectory(filePath)
63
63
  ];
64
- return [
64
+ else return [
65
65
  ...previous,
66
66
  filePath
67
67
  ];
@@ -78,7 +78,7 @@ const isPageComponentFile = (filePath)=>{
78
78
  };
79
79
  const replaceWithAlias = (base, filePath, alias)=>{
80
80
  if (filePath.includes(base)) return (0, utils_namespaceObject.normalizeToPosixPath)(external_path_default().join(alias, external_path_default().relative(base, filePath)));
81
- return filePath;
81
+ else return filePath;
82
82
  };
83
83
  const parseModule = async ({ source, filename })=>{
84
84
  let content = source;
@@ -83,7 +83,7 @@ const DeferredDataScripts = (props)=>{
83
83
  (0, node_namespaceObject.serializeJson)(key)
84
84
  ]
85
85
  };
86
- {
86
+ else {
87
87
  const trackedPromise = deferredData.data[key];
88
88
  if (void 0 !== trackedPromise._error) {
89
89
  const error = toDeferredErrorInfo(trackedPromise._error);
@@ -95,15 +95,16 @@ const DeferredDataScripts = (props)=>{
95
95
  (0, node_namespaceObject.serializeJson)(error)
96
96
  ]
97
97
  };
98
+ } else {
99
+ if (void 0 === trackedPromise._data) throw new Error(`The deferred data for ${key} was not resolved, did you forget to return data from a deferred promise`);
100
+ return {
101
+ key,
102
+ routerDataFnName: 'p',
103
+ routerDataFnArgs: [
104
+ (0, node_namespaceObject.serializeJson)(trackedPromise._data)
105
+ ]
106
+ };
98
107
  }
99
- if (void 0 === trackedPromise._data) throw new Error(`The deferred data for ${key} was not resolved, did you forget to return data from a deferred promise`);
100
- return {
101
- key,
102
- routerDataFnName: 'p',
103
- routerDataFnArgs: [
104
- (0, node_namespaceObject.serializeJson)(trackedPromise._data)
105
- ]
106
- };
107
108
  }
108
109
  });
109
110
  return {
@@ -70,11 +70,10 @@ __webpack_require__.d(__webpack_exports__, {
70
70
  NavLink: ()=>NavLink
71
71
  });
72
72
  const jsx_runtime_namespaceObject = require("react/jsx-runtime");
73
- const runtime_extensions_namespaceObject = require("@modern-js/runtime-extensions");
73
+ const context_namespaceObject = require("@modern-js/runtime/context");
74
74
  const router_namespaceObject = require("@modern-js/runtime-utils/router");
75
75
  const external_react_namespaceObject = require("react");
76
76
  var external_react_default = /*#__PURE__*/ __webpack_require__.n(external_react_namespaceObject);
77
- const index_js_namespaceObject = require("../../core/context/index.js");
78
77
  const getWebpackChunkLoader = ()=>__webpack_chunk_load__;
79
78
  const getWebpackPublicPath = ()=>{
80
79
  try {
@@ -90,62 +89,6 @@ function composeEventHandlers(theirHandler, ourHandler) {
90
89
  };
91
90
  }
92
91
  const ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
93
- const DEFAULT_PREFETCH_BEHAVIOR = 'render';
94
- const INTENT_DELAY = 100;
95
- const VIEWPORT_ROOT_MARGIN = '200px';
96
- const MAX_CONCURRENT_WARMUPS = 4;
97
- const WARMUP_TTL = 30000;
98
- const SLOW_EFFECTIVE_TYPES = new Set([
99
- 'slow-2g',
100
- '2g'
101
- ]);
102
- const warmupCache = new Map();
103
- const warmupQueue = [];
104
- let activeWarmups = 0;
105
- const getWarmupTimestamp = ()=>performance.now();
106
- const getConnection = ()=>{
107
- const nav = globalThis.navigator;
108
- return nav?.connection || nav?.mozConnection || nav?.webkitConnection;
109
- };
110
- const shouldWarmupOnCurrentNetwork = ()=>{
111
- const connection = getConnection();
112
- if (connection?.saveData) return false;
113
- if ('string' == typeof connection?.effectiveType && SLOW_EFFECTIVE_TYPES.has(connection.effectiveType)) return false;
114
- return true;
115
- };
116
- const pruneWarmupCache = (now = getWarmupTimestamp())=>{
117
- for (const [key, timestamp] of warmupCache)if (now - timestamp > WARMUP_TTL) warmupCache.delete(key);
118
- };
119
- const runNextWarmup = ()=>{
120
- while(activeWarmups < MAX_CONCURRENT_WARMUPS && warmupQueue.length > 0){
121
- const task = warmupQueue.shift();
122
- if (task.cancelled) continue;
123
- activeWarmups += 1;
124
- task.run().catch(()=>{
125
- warmupCache.delete(task.key);
126
- }).finally(()=>{
127
- activeWarmups -= 1;
128
- runNextWarmup();
129
- });
130
- }
131
- };
132
- const scheduleWarmup = (key, run)=>{
133
- if (!shouldWarmupOnCurrentNetwork()) return ()=>{};
134
- pruneWarmupCache();
135
- if (warmupCache.has(key)) return ()=>{};
136
- warmupCache.set(key, getWarmupTimestamp());
137
- const task = {
138
- key,
139
- run,
140
- cancelled: false
141
- };
142
- warmupQueue.push(task);
143
- runNextWarmup();
144
- return ()=>{
145
- task.cancelled = true;
146
- if (warmupQueue.includes(task)) warmupCache.delete(task.key);
147
- };
148
- };
149
92
  const setRef = (ref, value)=>{
150
93
  if (!ref) return;
151
94
  if ('function' == typeof ref) return void ref(value);
@@ -153,70 +96,65 @@ const setRef = (ref, value)=>{
153
96
  ref.current = value;
154
97
  } catch {}
155
98
  };
156
- const isDataWarmupEnabled = (route)=>{
157
- const handle = route.handle;
158
- return handle?.navigationWarmup?.data !== false;
159
- };
160
- function usePrefetchBehavior(prefetch, preload, theirElementProps) {
161
- const [maybeWarmup, setMaybeWarmup] = external_react_default().useState(false);
162
- const [shouldPrefetch, setShouldPrefetch] = external_react_default().useState(false);
163
- const [shouldPreload, setShouldPreload] = external_react_default().useState(false);
164
- const [viewportElement, setViewportElement] = external_react_default().useState(null);
99
+ function usePrefetchBehavior(prefetch, preload, theirElementProps, policy) {
100
+ const [maybePrefetch, setMaybePrefetch] = external_react_default().useState(false);
101
+ const [state, setState] = external_react_default().useState({
102
+ code: false,
103
+ data: false
104
+ });
105
+ const [element, setElement] = external_react_default().useState(null);
106
+ const observerRef = external_react_default().useRef(void 0);
165
107
  const { onFocus, onBlur, onMouseEnter, onMouseLeave, onTouchStart } = theirElementProps;
166
108
  external_react_default().useEffect(()=>{
167
- if ('render' === prefetch) setShouldPrefetch(true);
168
- if ('render' === preload) setShouldPreload(true);
109
+ if (!policy) return void setState({
110
+ code: 'render' === prefetch,
111
+ data: 'render' === prefetch
112
+ });
113
+ const observer = policy.observe({
114
+ element,
115
+ prefetch,
116
+ preload,
117
+ notify: (next)=>setState((previous)=>previous.code === next.code && previous.data === next.data ? previous : next)
118
+ });
119
+ observerRef.current = observer;
120
+ return ()=>{
121
+ observerRef.current = void 0;
122
+ observer.dispose();
123
+ };
169
124
  }, [
125
+ policy,
170
126
  prefetch,
171
- preload
127
+ preload,
128
+ element
129
+ ]);
130
+ external_react_default().useEffect(()=>{
131
+ if (policy || !maybePrefetch) return;
132
+ const timer = setTimeout(()=>setState({
133
+ code: true,
134
+ data: true
135
+ }), 100);
136
+ return ()=>clearTimeout(timer);
137
+ }, [
138
+ policy,
139
+ maybePrefetch
172
140
  ]);
173
141
  const setIntent = ()=>{
174
- if ('intent' === prefetch || 'intent' === preload) setMaybeWarmup(true);
142
+ if (policy) observerRef.current?.onIntent();
143
+ else if ('intent' === prefetch) setMaybePrefetch(true);
175
144
  };
176
145
  const cancelIntent = ()=>{
177
- if ('intent' === prefetch || 'intent' === preload) {
178
- setMaybeWarmup(false);
179
- setShouldPrefetch(false);
180
- setShouldPreload(false);
146
+ if (policy) observerRef.current?.onCancel();
147
+ else if ('intent' === prefetch) {
148
+ setMaybePrefetch(false);
149
+ setState({
150
+ code: false,
151
+ data: false
152
+ });
181
153
  }
182
154
  };
183
- external_react_default().useEffect(()=>{
184
- if (maybeWarmup) {
185
- const id = setTimeout(()=>{
186
- if ('intent' === prefetch) setShouldPrefetch(true);
187
- if ('intent' === preload) setShouldPreload(true);
188
- }, INTENT_DELAY);
189
- return ()=>{
190
- clearTimeout(id);
191
- };
192
- }
193
- }, [
194
- maybeWarmup,
195
- prefetch,
196
- preload
197
- ]);
198
- external_react_default().useEffect(()=>{
199
- if (!viewportElement || 'viewport' !== prefetch && 'viewport' !== preload || "u" < typeof IntersectionObserver) return;
200
- const observer = new IntersectionObserver((entries)=>{
201
- if (!entries.some((entry)=>entry.isIntersecting)) return;
202
- if ('viewport' === prefetch) setShouldPrefetch(true);
203
- if ('viewport' === preload) setShouldPreload(true);
204
- observer.disconnect();
205
- }, {
206
- rootMargin: VIEWPORT_ROOT_MARGIN
207
- });
208
- observer.observe(viewportElement);
209
- return ()=>{
210
- observer.disconnect();
211
- };
212
- }, [
213
- prefetch,
214
- preload,
215
- viewportElement
216
- ]);
217
155
  return [
218
- shouldPrefetch,
219
- shouldPreload,
156
+ state.data,
157
+ state.code,
220
158
  {
221
159
  onFocus: composeEventHandlers(onFocus, setIntent),
222
160
  onBlur: composeEventHandlers(onBlur, cancelIntent),
@@ -224,7 +162,7 @@ function usePrefetchBehavior(prefetch, preload, theirElementProps) {
224
162
  onMouseLeave: composeEventHandlers(onMouseLeave, cancelIntent),
225
163
  onTouchStart: composeEventHandlers(onTouchStart, setIntent)
226
164
  },
227
- setViewportElement
165
+ setElement
228
166
  ];
229
167
  }
230
168
  async function loadRouteModule(route, routeAssets, chunkLoader) {
@@ -262,10 +200,11 @@ const getDataHref = (route, pathname, basename)=>{
262
200
  };
263
201
  const PrefetchPageLinks = ({ path, includeData })=>{
264
202
  const { pathname } = path;
265
- const context = (0, external_react_namespaceObject.useContext)(index_js_namespaceObject.InternalRuntimeContext);
203
+ const context = (0, external_react_namespaceObject.useContext)(context_namespaceObject.InternalRuntimeContext);
266
204
  const { routeManifest, routes } = context;
267
205
  const { routeAssets } = routeManifest || {};
268
- const allowNetworkWarmup = shouldWarmupOnCurrentNetwork();
206
+ const policy = context.linkPrefetchPolicy;
207
+ const allowNetworkWarmup = policy?.canWarmup() ?? true;
269
208
  const matches = (0, external_react_namespaceObject.useMemo)(()=>Array.isArray(routes) ? (0, router_namespaceObject.matchRoutes)(routes, pathname) : [], [
270
209
  pathname,
271
210
  routes
@@ -285,7 +224,16 @@ const PrefetchPageLinks = ({ path, includeData })=>{
285
224
  const routeAsset = routeId ? routeAssets[routeId] : void 0;
286
225
  const chunkIds = routeAsset?.chunkIds;
287
226
  if (!routeId || !Array.isArray(chunkIds) || 0 === chunkIds.length) return ()=>{};
288
- return scheduleWarmup((0, runtime_extensions_namespaceObject.getNavigationWarmupCacheKey)(context, chunkLoader, getWebpackPublicPath(), `route-module:${routeId}:${chunkIds.join(',')}`), ()=>loadRouteModule(match.route, routeAssets, chunkLoader));
227
+ const run = ()=>loadRouteModule(match.route, routeAssets, chunkLoader);
228
+ if (policy) return policy.schedule({
229
+ runtimeContext: context,
230
+ chunkLoader,
231
+ publicPath: getWebpackPublicPath(),
232
+ key: `route-module:${routeId}:${chunkIds.join(',')}`,
233
+ run
234
+ });
235
+ run().catch(()=>{});
236
+ return ()=>{};
289
237
  });
290
238
  return ()=>{
291
239
  cancellations.forEach((cancel)=>cancel());
@@ -294,6 +242,7 @@ const PrefetchPageLinks = ({ path, includeData })=>{
294
242
  allowNetworkWarmup,
295
243
  chunkLoader,
296
244
  context,
245
+ policy,
297
246
  routeAssetGeneration
298
247
  ]);
299
248
  if (!allowNetworkWarmup || !includeData || !window._SSR_DATA) return null;
@@ -305,10 +254,11 @@ const PrefetchPageLinks = ({ path, includeData })=>{
305
254
  };
306
255
  const PrefetchDataLinks = ({ matches, path, routeManifest })=>{
307
256
  const { pathname, search, hash } = path;
257
+ const policy = (0, external_react_namespaceObject.useContext)(context_namespaceObject.InternalRuntimeContext).linkPrefetchPolicy;
308
258
  const currentMatches = (0, router_namespaceObject.useMatches)();
309
259
  const basename = (0, router_namespaceObject.useHref)('/');
310
260
  const dataHrefs = (0, external_react_namespaceObject.useMemo)(()=>matches?.filter((match, index)=>{
311
- if (!isDataWarmupEnabled(match.route) || !match.route.loader || 'function' != typeof match.route.loader || 0 === match.route.loader.length) return false;
261
+ if (policy?.allowData(match.route) === false || !match.route.loader || 'function' != typeof match.route.loader || 0 === match.route.loader.length) return false;
312
262
  if (match.route.shouldRevalidate) {
313
263
  const currentUrl = new URL(location.pathname + location.search + location.hash, window.origin);
314
264
  const nextUrl = new URL(pathname + search + hash, window.origin);
@@ -335,16 +285,10 @@ const PrefetchDataLinks = ({ matches, path, routeManifest })=>{
335
285
  children: dataHrefs
336
286
  });
337
287
  };
338
- const normalizePreloadBehavior = (preload, prefetch)=>{
339
- if (false === preload || 'none' === preload) return 'none';
340
- if (void 0 !== preload) return preload;
341
- if ('none' === prefetch) return 'none';
342
- return prefetch;
343
- };
344
- const createPrefetchLink = (Link)=>/*#__PURE__*/ (external_react_default()).forwardRef(({ to, prefetch = DEFAULT_PREFETCH_BEHAVIOR, preload, ...props }, forwardedRef)=>{
288
+ const createPrefetchLink = (Link)=>/*#__PURE__*/ (external_react_default()).forwardRef(({ to, prefetch, preload, ...props }, forwardedRef)=>{
345
289
  const isAbsolute = 'string' == typeof to && ABSOLUTE_URL_REGEX.test(to);
346
- const resolvedPreload = normalizePreloadBehavior(preload, prefetch);
347
- const [shouldPrefetch, shouldPreload, prefetchHandlers, setViewportElement] = usePrefetchBehavior(prefetch, resolvedPreload, props);
290
+ const policy = (0, external_react_namespaceObject.useContext)(context_namespaceObject.InternalRuntimeContext).linkPrefetchPolicy;
291
+ const [shouldPrefetch, shouldPreload, prefetchHandlers, setViewportElement] = usePrefetchBehavior(prefetch, preload, props, policy);
348
292
  const setAnchorRef = external_react_default().useCallback((element)=>{
349
293
  setViewportElement(element);
350
294
  setRef(forwardedRef, element);
@@ -33,7 +33,8 @@ __webpack_require__.d(__webpack_exports__, {
33
33
  onAfterHydrateRouter: ()=>onAfterHydrateRouter,
34
34
  onBeforeCreateRouter: ()=>onBeforeCreateRouter,
35
35
  onBeforeCreateRoutes: ()=>onBeforeCreateRoutes,
36
- onBeforeHydrateRouter: ()=>onBeforeHydrateRouter
36
+ onBeforeHydrateRouter: ()=>onBeforeHydrateRouter,
37
+ routerProviderRegistryHooks: ()=>routerProviderRegistryHooks
37
38
  });
38
39
  const plugin_namespaceObject = require("@modern-js/plugin");
39
40
  const createRouterSyncHook = ()=>(0, plugin_namespaceObject.createSyncHook)();
@@ -43,19 +44,29 @@ const onBeforeCreateRouter = createRouterSyncHook();
43
44
  const onAfterCreateRouter = createRouterSyncHook();
44
45
  const onBeforeHydrateRouter = createRouterSyncHook();
45
46
  const onAfterHydrateRouter = createRouterSyncHook();
47
+ const routerProviderRegistryHooks = {
48
+ modifyRoutes,
49
+ onBeforeCreateRoutes,
50
+ onBeforeCreateRouter,
51
+ onAfterCreateRouter,
52
+ onBeforeHydrateRouter,
53
+ onAfterHydrateRouter
54
+ };
46
55
  exports.modifyRoutes = __webpack_exports__.modifyRoutes;
47
56
  exports.onAfterCreateRouter = __webpack_exports__.onAfterCreateRouter;
48
57
  exports.onAfterHydrateRouter = __webpack_exports__.onAfterHydrateRouter;
49
58
  exports.onBeforeCreateRouter = __webpack_exports__.onBeforeCreateRouter;
50
59
  exports.onBeforeCreateRoutes = __webpack_exports__.onBeforeCreateRoutes;
51
60
  exports.onBeforeHydrateRouter = __webpack_exports__.onBeforeHydrateRouter;
61
+ exports.routerProviderRegistryHooks = __webpack_exports__.routerProviderRegistryHooks;
52
62
  for(var __rspack_i in __webpack_exports__)if (-1 === [
53
63
  "modifyRoutes",
54
64
  "onAfterCreateRouter",
55
65
  "onAfterHydrateRouter",
56
66
  "onBeforeCreateRouter",
57
67
  "onBeforeCreateRoutes",
58
- "onBeforeHydrateRouter"
68
+ "onBeforeHydrateRouter",
69
+ "routerProviderRegistryHooks"
59
70
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
60
71
  Object.defineProperty(exports, '__esModule', {
61
72
  value: true