@bleedingdev/modern-js-app-tools-extensions 3.9.0-ultramodern.8 → 3.9.3-ultramodern.1

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 (280) hide show
  1. package/README.md +23 -0
  2. package/dist/cjs/backend-federation-build/codegen.js +29 -18
  3. package/dist/cjs/backend-federation-build/config.js +84 -45
  4. package/dist/cjs/backend-federation-build/emit.js +63 -22
  5. package/dist/cjs/build-config/build-environment.js +25 -162
  6. package/dist/cjs/build-config/internal-effect-discovery.js +143 -0
  7. package/dist/cjs/build-config/public.js +2 -5
  8. package/dist/cjs/build-config/remote-address.js +58 -0
  9. package/dist/cjs/cloudflare/artifacts.js +8 -19
  10. package/dist/cjs/cloudflare/delivery-unit.js +125 -43
  11. package/dist/cjs/cloudflare/index.js +14 -4
  12. package/dist/cjs/cloudflare/native-renderer.js +100 -0
  13. package/dist/cjs/cloudflare/renderer-identity.js +106 -0
  14. package/dist/cjs/cloudflare/worker-manifest.js +54 -13
  15. package/dist/cjs/cloudflare/worker-options.js +48 -0
  16. package/dist/cjs/cloudflare/wrangler-config.js +210 -13
  17. package/dist/cjs/cloudflare-builder.js +307 -89
  18. package/dist/cjs/cloudflare-output-contract.js +36 -4
  19. package/dist/cjs/cloudflare-output-verifier/identity.js +112 -23
  20. package/dist/cjs/cloudflare-output-verifier/index.js +10 -0
  21. package/dist/cjs/cloudflare-output-verifier/manifest.js +46 -0
  22. package/dist/cjs/cloudflare-output-verifier/mutation-policy.js +7 -1
  23. package/dist/cjs/cloudflare-output-verifier/worker-bundles.js +10 -5
  24. package/dist/cjs/config.js +10 -5
  25. package/dist/cjs/deploy-output/npmAliases.js +92 -6
  26. package/dist/cjs/deploy-output/plugin.js +27 -6
  27. package/dist/cjs/deploy-output/public-assets.js +146 -0
  28. package/dist/cjs/deploy-output/target.js +57 -1
  29. package/dist/cjs/deploy-output/trace-files.js +99 -0
  30. package/dist/cjs/module-federation-config/exposes.js +70 -0
  31. package/dist/cjs/module-federation-config/index.js +73 -0
  32. package/dist/cjs/module-federation-config/inspect.js +103 -0
  33. package/dist/cjs/module-federation-config/object-literal.js +87 -0
  34. package/dist/cjs/module-federation-config/syntax.js +151 -0
  35. package/dist/cjs/module-federation-config/types.js +18 -0
  36. package/dist/cjs/native-type-checker.js +164 -18
  37. package/dist/cjs/policy-defaults.js +110 -0
  38. package/dist/cjs/release-envelope/canonical.js +2 -9
  39. package/dist/cjs/release-envelope/contract.js +68 -0
  40. package/dist/cjs/release-envelope/framework-output.js +296 -105
  41. package/dist/cjs/release-envelope/index.js +150 -36
  42. package/dist/cjs/release-envelope/plugin.js +24 -15
  43. package/dist/cjs/release-envelope/renderer-output-stamp.js +170 -0
  44. package/dist/cjs/release-envelope/types.js +10 -8
  45. package/dist/cjs/release-identity.js +8 -5
  46. package/dist/cjs/renderer-build-identity.js +134 -0
  47. package/dist/cjs/runtime-package-resolution.js +118 -0
  48. package/dist/cjs/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
  49. package/dist/cjs/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
  50. package/dist/cjs/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
  51. package/dist/cjs/templates/cloudflare-entry.005-worker-dispatch.mjs +530 -103
  52. package/dist/cjs/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
  53. package/dist/cjs/templates/cloudflare-worker-route-data.mjs +1069 -0
  54. package/dist/cjs/workspace-topology.js +84 -0
  55. package/dist/esm/backend-federation-build/codegen.mjs +29 -18
  56. package/dist/esm/backend-federation-build/config.mjs +74 -38
  57. package/dist/esm/backend-federation-build/emit.mjs +64 -23
  58. package/dist/esm/build-config/build-environment.mjs +26 -160
  59. package/dist/esm/build-config/internal-effect-discovery.mjs +102 -0
  60. package/dist/esm/build-config/public.mjs +1 -1
  61. package/dist/esm/build-config/remote-address.mjs +20 -0
  62. package/dist/esm/cloudflare/artifacts.mjs +8 -19
  63. package/dist/esm/cloudflare/delivery-unit.mjs +124 -45
  64. package/dist/esm/cloudflare/index.mjs +15 -5
  65. package/dist/esm/cloudflare/native-renderer.mjs +48 -0
  66. package/dist/esm/cloudflare/renderer-identity.mjs +57 -0
  67. package/dist/esm/cloudflare/worker-manifest.mjs +55 -14
  68. package/dist/esm/cloudflare/worker-options.mjs +10 -0
  69. package/dist/esm/cloudflare/wrangler-config.mjs +203 -12
  70. package/dist/esm/cloudflare-builder.mjs +301 -89
  71. package/dist/esm/cloudflare-output-contract.mjs +29 -3
  72. package/dist/esm/cloudflare-output-verifier/identity.mjs +113 -24
  73. package/dist/esm/cloudflare-output-verifier/index.mjs +10 -0
  74. package/dist/esm/cloudflare-output-verifier/manifest.mjs +46 -0
  75. package/dist/esm/cloudflare-output-verifier/mutation-policy.mjs +7 -1
  76. package/dist/esm/cloudflare-output-verifier/worker-bundles.mjs +11 -6
  77. package/dist/esm/config.mjs +3 -1
  78. package/dist/esm/deploy-output/npmAliases.mjs +92 -6
  79. package/dist/esm/deploy-output/plugin.mjs +24 -6
  80. package/dist/esm/deploy-output/public-assets.mjs +82 -0
  81. package/dist/esm/deploy-output/target.mjs +50 -3
  82. package/dist/esm/deploy-output/trace-files.mjs +47 -0
  83. package/dist/esm/module-federation-config/exposes.mjs +18 -0
  84. package/dist/esm/module-federation-config/index.mjs +4 -0
  85. package/dist/esm/module-federation-config/inspect.mjs +65 -0
  86. package/dist/esm/module-federation-config/object-literal.mjs +43 -0
  87. package/dist/esm/module-federation-config/syntax.mjs +101 -0
  88. package/dist/esm/module-federation-config/types.mjs +0 -0
  89. package/dist/esm/native-type-checker.mjs +158 -18
  90. package/dist/esm/policy-defaults.mjs +51 -0
  91. package/dist/esm/release-envelope/canonical.mjs +2 -9
  92. package/dist/esm/release-envelope/contract.mjs +21 -0
  93. package/dist/esm/release-envelope/framework-output.mjs +297 -106
  94. package/dist/esm/release-envelope/index.mjs +149 -38
  95. package/dist/esm/release-envelope/plugin.mjs +24 -15
  96. package/dist/esm/release-envelope/renderer-output-stamp.mjs +112 -0
  97. package/dist/esm/release-envelope/types.mjs +2 -3
  98. package/dist/esm/release-identity.mjs +8 -5
  99. package/dist/esm/renderer-build-identity.mjs +82 -0
  100. package/dist/esm/runtime-package-resolution.mjs +60 -0
  101. package/dist/esm/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
  102. package/dist/esm/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
  103. package/dist/esm/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
  104. package/dist/esm/templates/cloudflare-entry.005-worker-dispatch.mjs +530 -103
  105. package/dist/esm/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
  106. package/dist/esm/templates/cloudflare-worker-route-data.mjs +1069 -0
  107. package/dist/esm/workspace-topology.mjs +21 -0
  108. package/dist/esm-node/backend-federation-build/codegen.mjs +29 -18
  109. package/dist/esm-node/backend-federation-build/config.mjs +74 -38
  110. package/dist/esm-node/backend-federation-build/emit.mjs +64 -23
  111. package/dist/esm-node/build-config/build-environment.mjs +26 -160
  112. package/dist/esm-node/build-config/internal-effect-discovery.mjs +103 -0
  113. package/dist/esm-node/build-config/public.mjs +1 -1
  114. package/dist/esm-node/build-config/remote-address.mjs +21 -0
  115. package/dist/esm-node/cloudflare/artifacts.mjs +8 -19
  116. package/dist/esm-node/cloudflare/delivery-unit.mjs +124 -45
  117. package/dist/esm-node/cloudflare/index.mjs +15 -5
  118. package/dist/esm-node/cloudflare/native-renderer.mjs +49 -0
  119. package/dist/esm-node/cloudflare/renderer-identity.mjs +58 -0
  120. package/dist/esm-node/cloudflare/worker-manifest.mjs +55 -14
  121. package/dist/esm-node/cloudflare/worker-options.mjs +11 -0
  122. package/dist/esm-node/cloudflare/wrangler-config.mjs +203 -12
  123. package/dist/esm-node/cloudflare-builder.mjs +301 -89
  124. package/dist/esm-node/cloudflare-output-contract.mjs +29 -3
  125. package/dist/esm-node/cloudflare-output-verifier/identity.mjs +113 -24
  126. package/dist/esm-node/cloudflare-output-verifier/index.mjs +10 -0
  127. package/dist/esm-node/cloudflare-output-verifier/manifest.mjs +46 -0
  128. package/dist/esm-node/cloudflare-output-verifier/mutation-policy.mjs +7 -1
  129. package/dist/esm-node/cloudflare-output-verifier/worker-bundles.mjs +11 -6
  130. package/dist/esm-node/config.mjs +3 -1
  131. package/dist/esm-node/deploy-output/npmAliases.mjs +92 -6
  132. package/dist/esm-node/deploy-output/plugin.mjs +24 -6
  133. package/dist/esm-node/deploy-output/public-assets.mjs +83 -0
  134. package/dist/esm-node/deploy-output/target.mjs +50 -3
  135. package/dist/esm-node/deploy-output/trace-files.mjs +48 -0
  136. package/dist/esm-node/module-federation-config/exposes.mjs +19 -0
  137. package/dist/esm-node/module-federation-config/index.mjs +5 -0
  138. package/dist/esm-node/module-federation-config/inspect.mjs +66 -0
  139. package/dist/esm-node/module-federation-config/object-literal.mjs +44 -0
  140. package/dist/esm-node/module-federation-config/syntax.mjs +102 -0
  141. package/dist/esm-node/module-federation-config/types.mjs +1 -0
  142. package/dist/esm-node/native-type-checker.mjs +158 -18
  143. package/dist/esm-node/policy-defaults.mjs +52 -0
  144. package/dist/esm-node/release-envelope/canonical.mjs +2 -9
  145. package/dist/esm-node/release-envelope/contract.mjs +22 -0
  146. package/dist/esm-node/release-envelope/framework-output.mjs +297 -106
  147. package/dist/esm-node/release-envelope/index.mjs +149 -38
  148. package/dist/esm-node/release-envelope/plugin.mjs +24 -15
  149. package/dist/esm-node/release-envelope/renderer-output-stamp.mjs +113 -0
  150. package/dist/esm-node/release-envelope/types.mjs +2 -3
  151. package/dist/esm-node/release-identity.mjs +8 -5
  152. package/dist/esm-node/renderer-build-identity.mjs +83 -0
  153. package/dist/esm-node/runtime-package-resolution.mjs +61 -0
  154. package/dist/esm-node/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
  155. package/dist/esm-node/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
  156. package/dist/esm-node/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
  157. package/dist/esm-node/templates/cloudflare-entry.005-worker-dispatch.mjs +530 -103
  158. package/dist/esm-node/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
  159. package/dist/esm-node/templates/cloudflare-worker-route-data.mjs +1069 -0
  160. package/dist/esm-node/workspace-topology.mjs +22 -0
  161. package/dist/types/backend-federation-build/codegen.d.ts +30 -0
  162. package/dist/types/backend-federation-build/config.d.ts +10 -57
  163. package/dist/types/backend-federation-build/emit.d.ts +12 -2
  164. package/dist/types/backend-federation-build/index.d.ts +1 -1
  165. package/dist/types/build-config/build-environment.d.ts +1 -9
  166. package/dist/types/build-config/internal-effect-discovery.d.ts +4 -0
  167. package/dist/types/build-config/public.d.ts +1 -1
  168. package/dist/types/build-config/remote-address.d.ts +3 -0
  169. package/dist/types/cloudflare/artifacts.d.ts +7 -6
  170. package/dist/types/cloudflare/constants.d.ts +1 -1
  171. package/dist/types/cloudflare/delivery-unit.d.ts +38 -7
  172. package/dist/types/cloudflare/native-renderer.d.ts +30 -0
  173. package/dist/types/cloudflare/renderer-identity.d.ts +25 -0
  174. package/dist/types/cloudflare/worker-manifest.d.ts +17 -2
  175. package/dist/types/cloudflare/worker-options.d.ts +20 -0
  176. package/dist/types/cloudflare/wrangler-config.d.ts +55 -2
  177. package/dist/types/cloudflare-builder.d.ts +51 -8
  178. package/dist/types/cloudflare-output-contract.d.ts +5 -3
  179. package/dist/types/cloudflare-output-verifier/identity.d.ts +7 -3
  180. package/dist/types/cloudflare-output-verifier/worker-bundles.d.ts +2 -2
  181. package/dist/types/config.d.ts +98 -13
  182. package/dist/types/deploy-output/plugin.d.ts +29 -9
  183. package/dist/types/deploy-output/public-assets.d.ts +51 -0
  184. package/dist/types/deploy-output/target.d.ts +28 -5
  185. package/dist/types/deploy-output/trace-files.d.ts +17 -0
  186. package/dist/types/module-federation-config/exposes.d.ts +11 -0
  187. package/dist/types/module-federation-config/index.d.ts +5 -0
  188. package/dist/types/module-federation-config/inspect.d.ts +2 -0
  189. package/dist/types/module-federation-config/object-literal.d.ts +4 -0
  190. package/dist/types/module-federation-config/syntax.d.ts +7 -0
  191. package/dist/types/module-federation-config/types.d.ts +20 -0
  192. package/dist/types/native-type-checker.d.ts +26 -3
  193. package/dist/types/policy-defaults.d.ts +56 -0
  194. package/dist/types/release-envelope/canonical.d.ts +5 -5
  195. package/dist/types/release-envelope/contract.d.mts +8 -0
  196. package/dist/types/release-envelope/framework-output.d.ts +23 -13
  197. package/dist/types/release-envelope/index.d.ts +17 -5
  198. package/dist/types/release-envelope/plugin.d.ts +10 -6
  199. package/dist/types/release-envelope/renderer-output-stamp.d.ts +34 -0
  200. package/dist/types/release-envelope/types.d.ts +42 -4
  201. package/dist/types/release-identity.d.ts +3 -2
  202. package/dist/types/renderer-build-identity.d.ts +30 -0
  203. package/dist/types/runtime-package-resolution.d.ts +28 -0
  204. package/dist/types/templates/cloudflare-worker-route-data.d.mts +14 -0
  205. package/dist/types/workspace-topology.d.ts +91 -0
  206. package/package.json +97 -26
  207. package/src/backend-federation-build/codegen.ts +28 -19
  208. package/src/backend-federation-build/config.ts +189 -123
  209. package/src/backend-federation-build/emit.ts +119 -38
  210. package/src/backend-federation-build/index.ts +4 -1
  211. package/src/build-config/build-environment.ts +59 -285
  212. package/src/build-config/internal-effect-discovery.ts +239 -0
  213. package/src/build-config/public.ts +0 -1
  214. package/src/build-config/remote-address.ts +33 -0
  215. package/src/cloudflare/artifacts.ts +22 -43
  216. package/src/cloudflare/delivery-unit.ts +283 -60
  217. package/src/cloudflare/index.ts +35 -19
  218. package/src/cloudflare/native-renderer.ts +117 -0
  219. package/src/cloudflare/renderer-identity.ts +171 -0
  220. package/src/cloudflare/worker-manifest.ts +108 -10
  221. package/src/cloudflare/worker-options.ts +60 -0
  222. package/src/cloudflare/wrangler-config.ts +390 -14
  223. package/src/cloudflare-builder.ts +543 -170
  224. package/src/cloudflare-output-contract.ts +45 -2
  225. package/src/cloudflare-output-verifier/identity.ts +138 -7
  226. package/src/cloudflare-output-verifier/index.ts +20 -0
  227. package/src/cloudflare-output-verifier/manifest.ts +77 -0
  228. package/src/cloudflare-output-verifier/mutation-policy.ts +11 -1
  229. package/src/cloudflare-output-verifier/worker-bundles.ts +27 -11
  230. package/src/config.ts +101 -19
  231. package/src/deploy-output/npmAliases.ts +141 -4
  232. package/src/deploy-output/plugin.ts +55 -18
  233. package/src/deploy-output/public-assets.ts +224 -0
  234. package/src/deploy-output/target.ts +97 -14
  235. package/src/deploy-output/trace-files.ts +80 -0
  236. package/src/module-federation-config/exposes.ts +46 -0
  237. package/src/module-federation-config/index.ts +22 -0
  238. package/src/module-federation-config/inspect.ts +157 -0
  239. package/src/module-federation-config/object-literal.ts +76 -0
  240. package/src/module-federation-config/syntax.ts +212 -0
  241. package/src/module-federation-config/types.ts +22 -0
  242. package/src/native-type-checker.ts +281 -26
  243. package/src/policy-defaults.ts +157 -0
  244. package/src/release-envelope/canonical.ts +6 -18
  245. package/src/release-envelope/contract.mjs +28 -0
  246. package/src/release-envelope/framework-output.ts +681 -156
  247. package/src/release-envelope/index.ts +315 -60
  248. package/src/release-envelope/plugin.ts +54 -38
  249. package/src/release-envelope/renderer-output-stamp.ts +210 -0
  250. package/src/release-envelope/types.ts +75 -6
  251. package/src/release-identity.ts +19 -2
  252. package/src/renderer-build-identity.ts +168 -0
  253. package/src/runtime-package-resolution.ts +115 -0
  254. package/src/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
  255. package/src/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
  256. package/src/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
  257. package/src/templates/cloudflare-entry.005-worker-dispatch.mjs +530 -103
  258. package/src/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
  259. package/src/templates/cloudflare-worker-route-data.mjs +1069 -0
  260. package/src/workspace-topology.ts +125 -0
  261. package/dist/cjs/templates/cloudflare-worker-fs-promises.mjs +0 -11
  262. package/dist/cjs/templates/cloudflare-worker-loadable-server.mjs +0 -281
  263. package/dist/cjs/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  264. package/dist/cjs/templates/cloudflare-worker-path.mjs +0 -98
  265. package/dist/esm/templates/cloudflare-worker-fs-promises.mjs +0 -11
  266. package/dist/esm/templates/cloudflare-worker-loadable-server.mjs +0 -281
  267. package/dist/esm/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  268. package/dist/esm/templates/cloudflare-worker-path.mjs +0 -98
  269. package/dist/esm-node/templates/cloudflare-worker-fs-promises.mjs +0 -11
  270. package/dist/esm-node/templates/cloudflare-worker-loadable-server.mjs +0 -281
  271. package/dist/esm-node/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  272. package/dist/esm-node/templates/cloudflare-worker-path.mjs +0 -98
  273. package/dist/types/templates/cloudflare-worker-fs-promises.d.mts +0 -5
  274. package/dist/types/templates/cloudflare-worker-loadable-server.d.mts +0 -48
  275. package/dist/types/templates/cloudflare-worker-mf-ssr-runtime-plugin.d.mts +0 -13
  276. package/dist/types/templates/cloudflare-worker-path.d.mts +0 -21
  277. package/src/templates/cloudflare-worker-fs-promises.mjs +0 -11
  278. package/src/templates/cloudflare-worker-loadable-server.mjs +0 -281
  279. package/src/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  280. package/src/templates/cloudflare-worker-path.mjs +0 -98
@@ -38,19 +38,28 @@ var __webpack_exports__ = {};
38
38
  __webpack_require__.r(__webpack_exports__);
39
39
  __webpack_require__.d(__webpack_exports__, {
40
40
  resolveTopologyDeliveryUnit: ()=>resolveTopologyDeliveryUnit,
41
+ resolveTopologyReleaseRole: ()=>resolveTopologyReleaseRole,
41
42
  resolveWorkerDeliveryUnitStamp: ()=>resolveWorkerDeliveryUnitStamp
42
43
  });
43
44
  const external_node_path_namespaceObject = require("node:path");
44
45
  var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
46
+ const external_node_util_namespaceObject = require("node:util");
45
47
  const backend_federation_contracts_namespaceObject = require("@modern-js/backend-federation-contracts");
46
48
  const utils_namespaceObject = require("@modern-js/utils");
47
49
  const external_release_identity_js_namespaceObject = require("../release-identity.js");
48
50
  const external_utils_js_namespaceObject = require("./utils.js");
49
- const COMPACT_CONFIG_PATH = '.modernjs/ultramodern.json';
51
+ const TOPOLOGY_PATH = 'topology/reference-topology.json';
52
+ const RENDERER_PROJECTION_FIELDS = [
53
+ 'renderer',
54
+ 'rendererIdentity',
55
+ 'rendererIdentities',
56
+ 'rendererProfile',
57
+ 'routerBindings'
58
+ ];
50
59
  const findWorkspaceRoot = async (appDirectory)=>{
51
60
  let current = external_node_path_default().resolve(appDirectory);
52
61
  for(;;){
53
- if (await utils_namespaceObject.fs.pathExists(external_node_path_default().join(current, COMPACT_CONFIG_PATH))) return current;
62
+ if (await utils_namespaceObject.fs.pathExists(external_node_path_default().join(current, TOPOLOGY_PATH))) return current;
54
63
  const parent = external_node_path_default().dirname(current);
55
64
  if (parent === current) return;
56
65
  current = parent;
@@ -67,51 +76,83 @@ const stampReleaseIdentity = (identity, workspaceRoot)=>{
67
76
  })
68
77
  };
69
78
  };
70
- const resolveCompactApp = async (appDirectory)=>{
79
+ const resolveTopologyApp = async (appDirectory)=>{
71
80
  const workspaceRoot = await findWorkspaceRoot(appDirectory);
72
81
  if (!workspaceRoot) return;
73
- let compactConfig;
74
- try {
75
- compactConfig = await utils_namespaceObject.fs.readJSON(external_node_path_default().join(workspaceRoot, COMPACT_CONFIG_PATH));
76
- } catch {
77
- return {
78
- workspaceRoot
79
- };
80
- }
81
- if (!(0, external_utils_js_namespaceObject.isRecord)(compactConfig)) return {
82
- workspaceRoot
83
- };
84
- const topology = (0, external_utils_js_namespaceObject.isRecord)(compactConfig.topology) ? compactConfig.topology : void 0;
85
- const apps = Array.isArray(topology?.apps) ? topology.apps : void 0;
86
- if (!apps) return {
87
- app: compactConfig,
88
- workspaceRoot
89
- };
82
+ const topology = await utils_namespaceObject.fs.readJSON(external_node_path_default().join(workspaceRoot, TOPOLOGY_PATH));
83
+ if (!(0, external_utils_js_namespaceObject.isRecord)(topology) || !(0, external_utils_js_namespaceObject.isRecord)(topology.shell) || !Array.isArray(topology.verticals) || void 0 !== topology.shells && !Array.isArray(topology.shells)) throw new Error('[cloudflare-delivery-unit] Invalid declared reference topology.');
84
+ const apps = [
85
+ topology.shell,
86
+ ...topology.verticals,
87
+ ...Array.isArray(topology.shells) ? topology.shells : []
88
+ ];
90
89
  const resolvedAppDirectory = external_node_path_default().resolve(appDirectory);
91
90
  const app = apps.find((candidate)=>{
92
91
  if (!(0, external_utils_js_namespaceObject.isRecord)(candidate)) return false;
93
92
  const appPath = (0, backend_federation_contracts_namespaceObject.nonEmptyString)(candidate.path);
94
93
  return void 0 !== appPath && external_node_path_default().resolve(workspaceRoot, appPath.replace(/^\.\/+/u, '')) === resolvedAppDirectory;
95
94
  });
95
+ if (!(0, external_utils_js_namespaceObject.isRecord)(app)) throw new Error(`[cloudflare-delivery-unit] ${appDirectory} is missing from the declared reference topology.`);
96
96
  return {
97
- ...(0, external_utils_js_namespaceObject.isRecord)(app) ? {
98
- app
99
- } : {},
97
+ app,
98
+ role: app === topology.shell || Array.isArray(topology.shells) && topology.shells.includes(app) ? 'shell' : 'microvertical',
100
99
  workspaceRoot
101
100
  };
102
101
  };
103
- const createDeliveryUnitStamp = (identity, app)=>{
104
- const surfaceProfile = (0, backend_federation_contracts_namespaceObject.nonEmptyString)(app?.surfaceProfile);
102
+ const resolveTopologyReleaseRole = async (appDirectory)=>{
103
+ const resolved = await resolveTopologyApp(appDirectory);
104
+ if (!resolved?.app) return;
105
+ const kind = 'shell' === resolved.role ? 'shell' : 'vertical';
106
+ if (resolved.app.kind !== kind) throw new Error('[cloudflare-delivery-unit] Declared app kind disagrees with its topology membership.');
107
+ return resolved.role;
108
+ };
109
+ const createTopologyDeliveryUnitStamp = (identity, app)=>{
110
+ const surfaceProfile = (0, backend_federation_contracts_namespaceObject.nonEmptyString)(app.surfaceProfile);
111
+ if (void 0 !== surfaceProfile && ![
112
+ 'api-only',
113
+ 'ui-only',
114
+ 'full-stack'
115
+ ].includes(surfaceProfile)) throw new Error('[cloudflare-delivery-unit] Declared app has an invalid surface profile.');
105
116
  const emitsUi = 'api-only' !== surfaceProfile;
106
117
  const emitsApi = 'ui-only' !== surfaceProfile;
118
+ const appId = (0, backend_federation_contracts_namespaceObject.nonEmptyString)(app.id);
119
+ if (!appId) throw new Error('[cloudflare-delivery-unit] Declared app requires an id.');
120
+ let ui;
121
+ if (emitsUi) if (RENDERER_PROJECTION_FIELDS.every((field)=>!Object.hasOwn(app, field))) ui = {
122
+ ...identity,
123
+ surface: 'ui'
124
+ };
125
+ else {
126
+ const routerBindings = (0, external_utils_js_namespaceObject.isRecord)(app.routerBindings) ? app.routerBindings : {};
127
+ const errors = [
128
+ ...(0, backend_federation_contracts_namespaceObject.validateRendererIdentity)(app.rendererIdentity).errors,
129
+ ...(0, backend_federation_contracts_namespaceObject.validateRendererProfile)(app.rendererProfile).errors,
130
+ ...(0, backend_federation_contracts_namespaceObject.validateRendererRouterBindings)(app.routerBindings, Object.keys(routerBindings), 'routerBindings').errors
131
+ ];
132
+ if (errors.length) throw new Error(`[cloudflare-delivery-unit] ${(0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(errors)}`);
133
+ const rendererIdentity = app.rendererIdentity;
134
+ const rendererProfile = app.rendererProfile;
135
+ if (!Object.hasOwn(routerBindings, rendererIdentity.entryName)) throw new Error('[cloudflare-delivery-unit] Topology routerBindings must include the primary renderer identity entry.');
136
+ const declaredIdentity = (0, backend_federation_contracts_namespaceObject.toDeliveryUnitIdentity)(app.deliveryUnit);
137
+ if (rendererIdentity.renderer !== app.renderer || rendererIdentity.renderer !== rendererProfile.renderer || rendererIdentity.appId !== app.id || rendererIdentity.buildId !== declaredIdentity?.buildMarker) throw new Error('[cloudflare-delivery-unit] Topology UI renderer metadata must match its app and delivery-unit identity.');
138
+ ui = {
139
+ ...identity,
140
+ surface: 'ui',
141
+ rendererIdentity: {
142
+ ...rendererIdentity,
143
+ buildId: identity.buildMarker
144
+ },
145
+ rendererProfile,
146
+ routerBindings: (0, backend_federation_contracts_namespaceObject.immutableRendererRouterBindings)(routerBindings)
147
+ };
148
+ }
149
+ else if (void 0 !== app.rendererIdentity || void 0 !== app.rendererProfile || void 0 !== app.routerBindings) throw new Error('[cloudflare-delivery-unit] API-only topology must not declare a UI renderer identity or profile.');
107
150
  return {
108
151
  ...identity,
152
+ appId,
109
153
  surfaces: {
110
- ...emitsUi ? {
111
- ui: {
112
- ...identity,
113
- surface: 'ui'
114
- }
154
+ ...ui ? {
155
+ ui
115
156
  } : {},
116
157
  ...emitsApi ? {
117
158
  api: {
@@ -123,28 +164,69 @@ const createDeliveryUnitStamp = (identity, app)=>{
123
164
  };
124
165
  };
125
166
  const resolveTopologyDeliveryUnit = async (appDirectory)=>{
126
- const resolved = await resolveCompactApp(appDirectory);
167
+ const resolved = await resolveTopologyApp(appDirectory);
127
168
  if (!resolved?.app) return;
128
169
  const identity = (0, backend_federation_contracts_namespaceObject.toDeliveryUnitIdentity)(resolved.app.deliveryUnit);
129
- return identity ? createDeliveryUnitStamp(stampReleaseIdentity(identity, resolved.workspaceRoot), resolved.app) : void 0;
170
+ if (!identity) throw new Error('[cloudflare-delivery-unit] Declared app is missing a valid delivery-unit identity.');
171
+ return createTopologyDeliveryUnitStamp(stampReleaseIdentity(identity, resolved.workspaceRoot), resolved.app);
130
172
  };
131
- const resolveWorkerDeliveryUnitStamp = async (appDirectory)=>{
132
- const buildArtifactPath = external_node_path_default().join(appDirectory, backend_federation_contracts_namespaceObject.ULTRAMODERN_BUILD_ARTIFACT_PATH);
133
- let identity;
134
- if (await utils_namespaceObject.fs.pathExists(buildArtifactPath)) {
135
- const artifact = await utils_namespaceObject.fs.readJSON(buildArtifactPath);
136
- if (!(0, backend_federation_contracts_namespaceObject.isUltramodernBuildArtifact)(artifact)) return;
137
- identity = (0, backend_federation_contracts_namespaceObject.toDeliveryUnitIdentity)(artifact.deliveryUnit);
173
+ const resolveWorkerDeliveryUnitStamp = async (appDirectory, distDirectory)=>{
174
+ const buildArtifactPath = external_node_path_default().join(distDirectory, backend_federation_contracts_namespaceObject.ULTRAMODERN_BUILD_ARTIFACT_FILE);
175
+ if (!await utils_namespaceObject.fs.pathExists(buildArtifactPath)) {
176
+ if (await utils_namespaceObject.fs.pathExists(external_node_path_default().join(appDirectory, backend_federation_contracts_namespaceObject.ULTRAMODERN_BUILD_ARTIFACT_PATH))) throw new Error('[cloudflare-delivery-unit] Finalized build artifact is required before worker output stamping.');
177
+ return;
178
+ }
179
+ const artifact = await utils_namespaceObject.fs.readJSON(buildArtifactPath);
180
+ (0, backend_federation_contracts_namespaceObject.assertUltramodernBuildArtifact)(artifact);
181
+ const identity = {
182
+ unitId: artifact.deliveryUnit.unitId,
183
+ buildMarker: artifact.deliveryUnit.buildMarker,
184
+ sourceRevision: artifact.deliveryUnit.sourceRevision
185
+ };
186
+ const resolved = await resolveTopologyApp(appDirectory);
187
+ const stampedArtifact = artifact;
188
+ let emitsApi = true;
189
+ if (resolved?.app) {
190
+ if (stampedArtifact.deliveryUnit.appId !== resolved.app.id) throw new Error('[cloudflare-delivery-unit] Build artifact appId must match the declared topology app.');
191
+ const declaredIdentity = (0, backend_federation_contracts_namespaceObject.toDeliveryUnitIdentity)(resolved.app.deliveryUnit);
192
+ if (!declaredIdentity) throw new Error('[cloudflare-delivery-unit] Declared app is missing a valid delivery-unit identity.');
193
+ const expected = createTopologyDeliveryUnitStamp(identity, resolved.app);
194
+ for (const field of [
195
+ 'unitId'
196
+ ])if (declaredIdentity[field] !== identity[field]) throw new Error(`[cloudflare-delivery-unit] Build artifact ${field} must match the declared topology delivery-unit identity.`);
197
+ const ui = stampedArtifact.surfaces.ui;
198
+ if (Boolean(expected.surfaces.ui) !== Boolean(ui)) throw new Error('[cloudflare-delivery-unit] Build artifact UI surface must match the declared topology surface profile.');
199
+ if (expected.surfaces.ui?.rendererIdentity && ui) {
200
+ if (!(0, external_node_util_namespaceObject.isDeepStrictEqual)(expected.surfaces.ui.routerBindings, ui.routerBindings)) throw new Error('[cloudflare-delivery-unit] Finalized build routerBindings must match the declared topology router bindings.');
201
+ for (const field of [
202
+ 'renderer',
203
+ 'appId',
204
+ 'entryName',
205
+ 'protocolVersion',
206
+ 'buildId'
207
+ ])if (expected.surfaces.ui.rendererIdentity[field] !== ui.rendererIdentity[field]) throw new Error(`[cloudflare-delivery-unit] Build artifact UI rendererIdentity.${field} must match the declared topology renderer identity.`);
208
+ (0, backend_federation_contracts_namespaceObject.assertRendererProfileCompatibility)(expected.surfaces.ui.rendererProfile, ui.rendererProfile);
209
+ }
210
+ emitsApi = void 0 !== expected.surfaces.api;
138
211
  }
139
- if (!identity) return;
140
- const resolved = await resolveCompactApp(appDirectory);
141
- if (resolved) identity = stampReleaseIdentity(identity, resolved.workspaceRoot);
142
- return createDeliveryUnitStamp(identity, resolved?.app);
212
+ return {
213
+ ...stampedArtifact.deliveryUnit,
214
+ surfaces: {
215
+ ...emitsApi ? {
216
+ api: stampedArtifact.surfaces.api
217
+ } : {},
218
+ ...stampedArtifact.surfaces.ui ? {
219
+ ui: stampedArtifact.surfaces.ui
220
+ } : {}
221
+ }
222
+ };
143
223
  };
144
224
  exports.resolveTopologyDeliveryUnit = __webpack_exports__.resolveTopologyDeliveryUnit;
225
+ exports.resolveTopologyReleaseRole = __webpack_exports__.resolveTopologyReleaseRole;
145
226
  exports.resolveWorkerDeliveryUnitStamp = __webpack_exports__.resolveWorkerDeliveryUnitStamp;
146
227
  for(var __rspack_i in __webpack_exports__)if (-1 === [
147
228
  "resolveTopologyDeliveryUnit",
229
+ "resolveTopologyReleaseRole",
148
230
  "resolveWorkerDeliveryUnitStamp"
149
231
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
150
232
  Object.defineProperty(exports, '__esModule', {
@@ -41,6 +41,7 @@ __webpack_require__.d(__webpack_exports__, {
41
41
  });
42
42
  const external_node_path_namespaceObject = require("node:path");
43
43
  var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
44
+ const backend_federation_contracts_namespaceObject = require("@modern-js/backend-federation-contracts");
44
45
  const utils_namespaceObject = require("@modern-js/utils");
45
46
  const external_cloudflare_output_plan_js_namespaceObject = require("../cloudflare-output-plan.js");
46
47
  const index_js_namespaceObject = require("../cloudflare-output-verifier/index.js");
@@ -73,20 +74,28 @@ const createCloudflarePreset = ({ api, appContext, modernConfig })=>{
73
74
  const publicAssetExcludes = (0, external_worker_manifest_js_namespaceObject.getPublicAssetExcludes)(appDirectory, modernConfig);
74
75
  const releaseEnvelopeEnabled = api.isPluginExists('@modern-js/ultramodern-release-envelope');
75
76
  let hasReleaseEnvelope = false;
77
+ let declaredPublicAssets = [];
76
78
  return {
77
79
  async prepare () {
78
80
  await utils_namespaceObject.fs.remove(outputDirectory);
79
81
  },
80
82
  async writeOutput () {
81
- if (releaseEnvelopeEnabled && await utils_namespaceObject.fs.pathExists(external_node_path_default().join(distDirectory, framework_output_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_PATH))) await (0, framework_output_js_namespaceObject.emitFrameworkMicroVerticalReleaseEnvelope)({
83
+ if (releaseEnvelopeEnabled) await (0, framework_output_js_namespaceObject.emitFrameworkMicroVerticalReleaseEnvelope)({
82
84
  apiOnly,
85
+ appDirectory,
83
86
  distDirectory,
87
+ role: modernConfig.deploy?.releaseEnvelopeRole,
84
88
  target: 'cloudflare'
85
89
  });
86
90
  if (releaseEnvelopeEnabled) await (0, framework_output_js_namespaceObject.verifyBuildOutputReleaseEnvelope)(distDirectory, 'cloudflare');
87
91
  await utils_namespaceObject.fs.copy(distDirectory, publicDirectory, {
88
92
  filter: (src)=>{
89
93
  const relativePath = external_node_path_default().relative(distDirectory, src).replace(/\\/gu, '/');
94
+ if (apiOnly && '' !== relativePath && ![
95
+ backend_federation_contracts_namespaceObject.BACKEND_FEDERATION_MANIFEST_FILE,
96
+ backend_federation_contracts_namespaceObject.BACKEND_FEDERATION_REMOTE_ENTRY_FILE,
97
+ backend_federation_contracts_namespaceObject.ULTRAMODERN_BUILD_ARTIFACT_FILE
98
+ ].includes(relativePath)) return false;
90
99
  return 'release' !== relativePath && !relativePath.startsWith('release/') && 'public' !== relativePath && !relativePath.startsWith('public/') && (0, external_worker_manifest_js_namespaceObject.shouldCopyToPublicAssets)(src, distDirectory, publicAssetExcludes);
91
100
  }
92
101
  });
@@ -110,12 +119,12 @@ const createCloudflarePreset = ({ api, appContext, modernConfig })=>{
110
119
  await utils_namespaceObject.fs.writeJSON(outputPlan.paths.workerPackage, outputPlan.packages.worker);
111
120
  }
112
121
  await (0, external_artifacts_js_namespaceObject.copyCloudflareArtifacts)(appDirectory, outputDirectory, cloudflareArtifacts);
113
- await (0, external_artifacts_js_namespaceObject.copyCloudflarePublicAssets)(appDirectory, publicDirectory, (0, external_artifacts_js_namespaceObject.getCloudflarePublicAssets)(modernConfig));
122
+ declaredPublicAssets = await (0, external_artifacts_js_namespaceObject.copyCloudflarePublicAssets)(appDirectory, outputDirectory, (0, external_artifacts_js_namespaceObject.getCloudflarePublicAssets)(modernConfig));
114
123
  await (0, external_artifacts_js_namespaceObject.copyCloudflareD1Migrations)(appDirectory, outputDirectory, modernConfig);
115
124
  await utils_namespaceObject.fs.writeJSON(wranglerConfigPath, (0, external_wrangler_config_js_namespaceObject.createWranglerConfig)(appDirectory, modernConfig), {
116
125
  spaces: 2
117
126
  });
118
- const deliveryUnitStamp = await (0, external_delivery_unit_js_namespaceObject.resolveWorkerDeliveryUnitStamp)(appDirectory);
127
+ const deliveryUnitStamp = await (0, external_delivery_unit_js_namespaceObject.resolveWorkerDeliveryUnitStamp)(appDirectory, distDirectory);
119
128
  await utils_namespaceObject.fs.writeJSON(workerManifestPath, await (0, external_worker_manifest_js_namespaceObject.createWorkerManifest)(outputDirectory, modernConfig, appContext, deliveryUnitStamp), {
120
129
  spaces: 2
121
130
  });
@@ -129,7 +138,7 @@ const createCloudflarePreset = ({ api, appContext, modernConfig })=>{
129
138
  const template = await readCloudflareEntryTemplate();
130
139
  const manifest = await utils_namespaceObject.fs.readJSON(workerManifestPath);
131
140
  await utils_namespaceObject.fs.writeFile(workerEntryPath, template.replace('p_workerManifest', JSON.stringify(manifest, null, 2)).replace('p_workerModuleLoaders', (0, external_worker_manifest_js_namespaceObject.createWorkerModuleLoaders)(manifest)));
132
- const topologyDeliveryUnit = await (0, external_delivery_unit_js_namespaceObject.resolveTopologyDeliveryUnit)(appDirectory);
141
+ const topologyDeliveryUnit = await (0, external_delivery_unit_js_namespaceObject.resolveWorkerDeliveryUnitStamp)(appDirectory, distDirectory);
133
142
  await (0, index_js_namespaceObject.assertCloudflareOutput)({
134
143
  outputDirectory,
135
144
  importWorker: false,
@@ -139,6 +148,7 @@ const createCloudflarePreset = ({ api, appContext, modernConfig })=>{
139
148
  });
140
149
  if (hasReleaseEnvelope) {
141
150
  await (0, framework_output_js_namespaceObject.emitCloudflareStagedReleaseEnvelope)({
151
+ declaredPublicAssets,
142
152
  distDirectory,
143
153
  outputDirectory
144
154
  });
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
12
+ (()=>{
13
+ __webpack_require__.d = (exports1, getters, values)=>{
14
+ var define = (defs, kind)=>{
15
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
16
+ enumerable: true,
17
+ [kind]: defs[key]
18
+ });
19
+ };
20
+ define(getters, "get");
21
+ define(values, "value");
22
+ };
23
+ })();
24
+ (()=>{
25
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
26
+ })();
27
+ (()=>{
28
+ __webpack_require__.r = (exports1)=>{
29
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
30
+ value: 'Module'
31
+ });
32
+ Object.defineProperty(exports1, '__esModule', {
33
+ value: true
34
+ });
35
+ };
36
+ })();
37
+ var __webpack_exports__ = {};
38
+ __webpack_require__.r(__webpack_exports__);
39
+ __webpack_require__.d(__webpack_exports__, {
40
+ NATIVE_RENDERER_WORKER_RESOURCES_FILE: ()=>NATIVE_RENDERER_WORKER_RESOURCES_FILE,
41
+ readNativeRendererWorkerResources: ()=>readNativeRendererWorkerResources
42
+ });
43
+ const promises_namespaceObject = require("node:fs/promises");
44
+ var promises_default = /*#__PURE__*/ __webpack_require__.n(promises_namespaceObject);
45
+ const external_node_path_namespaceObject = require("node:path");
46
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
47
+ const external_constants_js_namespaceObject = require("./constants.js");
48
+ const external_utils_js_namespaceObject = require("./utils.js");
49
+ const NATIVE_RENDERER_WORKER_RESOURCES_FILE = `${external_constants_js_namespaceObject.WORKER_BUNDLE_DIRECTORY}/native-renderer.json`;
50
+ const invalid = (detail)=>new Error(`Invalid native renderer worker resources (${NATIVE_RENDERER_WORKER_RESOURCES_FILE}): ${detail}. Rebuild the application with deploy.worker.ssr before deploying.`);
51
+ function validateEntry(entryName, value) {
52
+ if (!(0, external_utils_js_namespaceObject.isRecord)(value)) throw invalid(`entry ${entryName} is not an object`);
53
+ const { assets, hydrationBuildId, serverConfig, csrFallbackHeader, nonce } = value;
54
+ if (!Array.isArray(assets) || !assets.length) throw invalid(`entry ${entryName} has no document assets`);
55
+ if (void 0 !== hydrationBuildId && ('string' != typeof hydrationBuildId || !hydrationBuildId.trim())) throw invalid(`entry ${entryName} has an empty hydration build ID`);
56
+ if (!(0, external_utils_js_namespaceObject.isRecord)(serverConfig) || ![
57
+ true,
58
+ false,
59
+ 'stream'
60
+ ].includes(serverConfig.ssr) || void 0 !== serverConfig.ssrByRouteIds && (!Array.isArray(serverConfig.ssrByRouteIds) || serverConfig.ssrByRouteIds.some((id)=>'string' != typeof id))) throw invalid(`entry ${entryName} has an invalid server config`);
61
+ for (const [field, text] of [
62
+ [
63
+ 'csrFallbackHeader',
64
+ csrFallbackHeader
65
+ ],
66
+ [
67
+ 'nonce',
68
+ nonce
69
+ ]
70
+ ])if (void 0 !== text && ('string' != typeof text || !text)) throw invalid(`entry ${entryName} has an invalid ${field}`);
71
+ }
72
+ async function readNativeRendererWorkerResources(distDirectory, build) {
73
+ let bytes;
74
+ try {
75
+ bytes = await promises_default().readFile(external_node_path_default().join(distDirectory, NATIVE_RENDERER_WORKER_RESOURCES_FILE), 'utf8');
76
+ } catch (error) {
77
+ if (error instanceof Error && 'code' in error && 'ENOENT' === error.code) return;
78
+ throw error;
79
+ }
80
+ const value = JSON.parse(bytes);
81
+ if (!(0, external_utils_js_namespaceObject.isRecord)(value) || 'ultramodern-native-worker-resources' !== value.schema || 1 !== value.version || 'string' != typeof value.renderer || !value.renderer || !(0, external_utils_js_namespaceObject.isRecord)(value.entries)) throw invalid('unknown schema');
82
+ if (value.renderer !== build?.renderer.name || !build.renderer.nativeDocuments) throw invalid(`renderer ${value.renderer} is not the built native-document renderer`);
83
+ const entries = value.entries;
84
+ const nativeEntries = Object.entries(build.identities).filter(([, identity])=>identity.renderer === value.renderer);
85
+ for (const [entryName] of nativeEntries)if (!Object.hasOwn(entries, entryName)) throw invalid(`entry ${entryName} is missing`);
86
+ for (const [entryName, entry] of Object.entries(entries)){
87
+ if (!nativeEntries.some(([name])=>name === entryName)) throw invalid(`entry ${entryName} has no built ${value.renderer} renderer identity`);
88
+ validateEntry(entryName, entry);
89
+ }
90
+ return value;
91
+ }
92
+ exports.NATIVE_RENDERER_WORKER_RESOURCES_FILE = __webpack_exports__.NATIVE_RENDERER_WORKER_RESOURCES_FILE;
93
+ exports.readNativeRendererWorkerResources = __webpack_exports__.readNativeRendererWorkerResources;
94
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
95
+ "NATIVE_RENDERER_WORKER_RESOURCES_FILE",
96
+ "readNativeRendererWorkerResources"
97
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
98
+ Object.defineProperty(exports, '__esModule', {
99
+ value: true
100
+ });
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
12
+ (()=>{
13
+ __webpack_require__.d = (exports1, getters, values)=>{
14
+ var define = (defs, kind)=>{
15
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
16
+ enumerable: true,
17
+ [kind]: defs[key]
18
+ });
19
+ };
20
+ define(getters, "get");
21
+ define(values, "value");
22
+ };
23
+ })();
24
+ (()=>{
25
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
26
+ })();
27
+ (()=>{
28
+ __webpack_require__.r = (exports1)=>{
29
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
30
+ value: 'Module'
31
+ });
32
+ Object.defineProperty(exports1, '__esModule', {
33
+ value: true
34
+ });
35
+ };
36
+ })();
37
+ var __webpack_exports__ = {};
38
+ __webpack_require__.r(__webpack_exports__);
39
+ __webpack_require__.d(__webpack_exports__, {
40
+ readWorkerRendererBuild: ()=>readWorkerRendererBuild
41
+ });
42
+ const promises_namespaceObject = require("node:fs/promises");
43
+ var promises_default = /*#__PURE__*/ __webpack_require__.n(promises_namespaceObject);
44
+ const external_node_path_namespaceObject = require("node:path");
45
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
46
+ const external_node_util_namespaceObject = require("node:util");
47
+ const backend_federation_contracts_namespaceObject = require("@modern-js/backend-federation-contracts");
48
+ const external_utils_js_namespaceObject = require("./utils.js");
49
+ async function readWorkerRendererBuild(distDirectory, routes, deliveryUnit) {
50
+ let bytes;
51
+ try {
52
+ bytes = await promises_default().readFile(external_node_path_default().join(distDirectory, 'renderer-build.json'), 'utf8');
53
+ } catch (error) {
54
+ if (error instanceof Error && 'code' in error && 'ENOENT' === error.code) return;
55
+ throw error;
56
+ }
57
+ const build = JSON.parse(bytes);
58
+ if (!(0, external_utils_js_namespaceObject.isRecord)(build) || 'ultramodern-renderer-build' !== build.schema || 2 !== build.version || 'string' != typeof build.buildId || !/^[a-f0-9]{64}$/u.test(build.buildId) || !(0, external_utils_js_namespaceObject.isRecord)(build.profile) || build.renderer !== build.profile.renderer || !(0, external_utils_js_namespaceObject.isRecord)(build.worker) || 'boolean' != typeof build.worker.nativeDocuments || 'boolean' != typeof build.worker.rsc || !(0, external_utils_js_namespaceObject.isRecord)(build.entries) || !Object.keys(build.entries).length) throw new Error('Invalid or outdated renderer-build.json for the Cloudflare worker; rebuild the application.');
59
+ const { renderer, protocolVersion, compiler, hydration, router } = build.profile;
60
+ const validation = (0, backend_federation_contracts_namespaceObject.validateRendererProfile)({
61
+ renderer,
62
+ protocolVersion,
63
+ compiler,
64
+ hydration,
65
+ router
66
+ });
67
+ if (!validation.ok) throw new Error((0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(validation.errors));
68
+ const identities = {};
69
+ let appId;
70
+ for (const [entryName, value] of Object.entries(build.entries)){
71
+ const validation = (0, backend_federation_contracts_namespaceObject.validateRendererIdentity)(value);
72
+ if (!validation.ok) throw new Error((0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(validation.errors));
73
+ const identity = value;
74
+ if ('__proto__' === entryName || identity.entryName !== entryName || identity.renderer !== renderer || identity.protocolVersion !== protocolVersion || identity.buildId !== build.buildId || void 0 !== appId && identity.appId !== appId) throw new Error('Cloudflare renderer entry identity conflicts with its built manifest');
75
+ appId = identity.appId;
76
+ identities[entryName] = Object.freeze({
77
+ ...identity
78
+ });
79
+ }
80
+ for (const route of routes){
81
+ if (false === route.isSSR && void 0 === route.entryName && void 0 === route.worker && void 0 === route.bundle && (void 0 === route.isRSC || false === route.isRSC) && (void 0 === route.isStream || false === route.isStream) && 'string' == typeof route.entryPath && route.entryPath.startsWith('public/') && !route.entryPath.includes('\\') && external_node_path_default().posix.normalize(route.entryPath) === route.entryPath) {
82
+ const asset = await promises_default().stat(external_node_path_default().join(distDirectory, route.entryPath));
83
+ if (asset.isFile()) continue;
84
+ }
85
+ if (true !== route.isApi || false !== route.isSSR || void 0 !== route.entryName || '' !== route.entryPath || void 0 !== route.worker || void 0 !== route.bundle || void 0 !== route.isRSC && false !== route.isRSC || void 0 !== route.isStream && false !== route.isStream) {
86
+ if ('string' != typeof route.entryName || !Object.hasOwn(identities, route.entryName)) throw new Error(`Cloudflare generated route has no built renderer identity for ${String(route.entryName)}`);
87
+ }
88
+ }
89
+ const ui = deliveryUnit?.surfaces.ui;
90
+ if (ui && !(0, external_node_util_namespaceObject.isDeepStrictEqual)(identities[ui.rendererIdentity.entryName], ui.rendererIdentity)) throw new Error('Cloudflare built renderer identity conflicts with its finalized delivery unit');
91
+ return Object.freeze({
92
+ renderer: Object.freeze({
93
+ name: renderer,
94
+ nativeDocuments: build.worker.nativeDocuments,
95
+ rsc: build.worker.rsc
96
+ }),
97
+ identities: Object.freeze(identities)
98
+ });
99
+ }
100
+ exports.readWorkerRendererBuild = __webpack_exports__.readWorkerRendererBuild;
101
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
102
+ "readWorkerRendererBuild"
103
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
104
+ Object.defineProperty(exports, '__esModule', {
105
+ value: true
106
+ });
@@ -46,9 +46,12 @@ __webpack_require__.d(__webpack_exports__, {
46
46
  const external_node_path_namespaceObject = require("node:path");
47
47
  var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
48
48
  const utils_namespaceObject = require("@modern-js/utils");
49
+ const external_cloudflare_output_contract_js_namespaceObject = require("../cloudflare-output-contract.js");
49
50
  const external_artifacts_js_namespaceObject = require("./artifacts.js");
50
51
  const external_constants_js_namespaceObject = require("./constants.js");
51
52
  const external_i18n_worker_js_namespaceObject = require("./i18n-worker.js");
53
+ const external_native_renderer_js_namespaceObject = require("./native-renderer.js");
54
+ const external_renderer_identity_js_namespaceObject = require("./renderer-identity.js");
52
55
  const external_security_policies_js_namespaceObject = require("./security-policies.js");
53
56
  const external_utils_js_namespaceObject = require("./utils.js");
54
57
  const external_wrangler_config_js_namespaceObject = require("./wrangler-config.js");
@@ -102,31 +105,59 @@ const createModuleFederationWorkerManifest = async (outputDirectory)=>{
102
105
  }
103
106
  ];
104
107
  });
105
- return name && exposes.length > 0 ? {
108
+ if (!name || 0 === exposes.length) return;
109
+ const routeManifestPath = external_node_path_default().join(outputDirectory, external_constants_js_namespaceObject.PUBLIC_ASSETS_DIRECTORY, external_constants_js_namespaceObject.ROUTE_MANIFEST_FILE);
110
+ const routeManifest = await utils_namespaceObject.fs.pathExists(routeManifestPath) ? await utils_namespaceObject.fs.readJson(routeManifestPath) : void 0;
111
+ const routeAssets = (0, external_utils_js_namespaceObject.isRecord)(routeManifest) && (0, external_utils_js_namespaceObject.isRecord)(routeManifest.routeAssets) ? Object.values(routeManifest.routeAssets).filter(external_utils_js_namespaceObject.isRecord) : [];
112
+ const routeCss = [
113
+ ...new Set(routeAssets.flatMap((routeAsset)=>[
114
+ routeAsset.referenceCssAssets,
115
+ routeAsset.assets
116
+ ].flatMap((value)=>Array.isArray(value) ? value : []).filter((asset)=>'string' == typeof asset && asset.endsWith('.css'))))
117
+ ];
118
+ return {
106
119
  name,
107
- exposes
108
- } : void 0;
120
+ exposes,
121
+ routeCss
122
+ };
109
123
  };
110
124
  const createWorkerManifest = async (outputDirectory, modernConfig, appContext, deliveryUnitStamp)=>{
111
125
  const routeSpec = await (0, external_artifacts_js_namespaceObject.readRouteSpec)(outputDirectory);
112
126
  const routes = await Promise.all(routeSpec.routes.map(async (route)=>{
113
127
  const worker = 'string' == typeof route.worker ? route.worker : void 0;
128
+ const routeDataWorker = route.isSSR && 'string' == typeof route.entryName ? `${external_constants_js_namespaceObject.WORKER_BUNDLE_DIRECTORY}/${(0, external_cloudflare_output_contract_js_namespaceObject.getCloudflareWorkerRouteDataEntryName)(route.entryName)}.js` : void 0;
129
+ const hasRouteDataWorker = routeDataWorker ? await utils_namespaceObject.fs.pathExists(external_node_path_default().join(outputDirectory, routeDataWorker)) : false;
114
130
  return {
115
131
  urlPath: route.urlPath,
116
132
  entryName: route.entryName,
117
133
  entryPath: route.entryPath,
118
134
  isSSR: Boolean(route.isSSR),
119
135
  worker,
120
- workerExists: worker ? await utils_namespaceObject.fs.pathExists(external_node_path_default().join(outputDirectory, worker)) : false
136
+ workerExists: worker ? await utils_namespaceObject.fs.pathExists(external_node_path_default().join(outputDirectory, worker)) : false,
137
+ ...hasRouteDataWorker ? {
138
+ routeDataWorker
139
+ } : {},
140
+ ...route.responseHeaders && 'object' == typeof route.responseHeaders ? {
141
+ responseHeaders: route.responseHeaders
142
+ } : {}
121
143
  };
122
144
  }));
123
- const bffPrefix = modernConfig.bff?.prefix;
124
- const primaryBffPrefix = Array.isArray(bffPrefix) ? bffPrefix[0] : bffPrefix;
145
+ const rendererBuild = await (0, external_renderer_identity_js_namespaceObject.readWorkerRendererBuild)(appContext.distDirectory, routeSpec.routes, deliveryUnitStamp);
146
+ const rendererIdentities = rendererBuild?.identities;
147
+ const nativeRenderer = await (0, external_native_renderer_js_namespaceObject.readNativeRendererWorkerResources)(appContext.distDirectory, rendererBuild);
148
+ for (const route of routes){
149
+ const renderer = 'string' == typeof route.entryName && rendererIdentities && Object.hasOwn(rendererIdentities, route.entryName) ? rendererIdentities[route.entryName].renderer : void 0;
150
+ if (void 0 !== renderer && rendererBuild?.renderer.nativeDocuments && (nativeRenderer?.renderer !== renderer || !route.workerExists)) throw new Error(`Cloudflare worker deploy of the ${renderer} renderer requires its native worker build for entry ${route.entryName}. Set deploy.worker.ssr: true and rebuild with the Cloudflare deploy target.`);
151
+ }
125
152
  const isEffectApi = Boolean(modernConfig.bff) && modernConfig.bff?.runtimeFramework !== 'hono';
153
+ const effectBffPrefix = (0, external_wrangler_config_js_namespaceObject.getWorkerEffectBffPrefix)(modernConfig);
126
154
  const effectApiWorkerExists = await utils_namespaceObject.fs.pathExists(external_node_path_default().join(outputDirectory, external_constants_js_namespaceObject.BFF_EFFECT_WORKER_ENTRY));
127
- const serviceBindings = (0, external_wrangler_config_js_namespaceObject.createWorkerManifestServiceBindings)((0, external_wrangler_config_js_namespaceObject.createWorkerServiceBindings)(modernConfig, void 0));
155
+ const typedServiceBindings = (0, external_wrangler_config_js_namespaceObject.createWorkerServiceBindings)(modernConfig, void 0);
156
+ const serviceBindings = (0, external_wrangler_config_js_namespaceObject.createWorkerManifestServiceBindings)(typedServiceBindings, (0, external_wrangler_config_js_namespaceObject.createWorkerVpcServiceBindings)(modernConfig, void 0, typedServiceBindings, new Set([
157
+ external_constants_js_namespaceObject.ASSETS_BINDING
158
+ ])));
128
159
  const moduleFederation = await createModuleFederationWorkerManifest(outputDirectory);
129
- if (isEffectApi && primaryBffPrefix && !effectApiWorkerExists) throw createMissingEffectBffWorkerError(outputDirectory, external_constants_js_namespaceObject.BFF_EFFECT_WORKER_ENTRY);
160
+ if (void 0 !== effectBffPrefix && !effectApiWorkerExists) throw createMissingEffectBffWorkerError(outputDirectory, external_constants_js_namespaceObject.BFF_EFFECT_WORKER_ENTRY);
130
161
  const effectBffManifest = isEffectApi ? createEffectBffWorkerManifest(modernConfig) : void 0;
131
162
  return {
132
163
  version: 1,
@@ -162,11 +193,18 @@ const createWorkerManifest = async (outputDirectory, modernConfig, appContext, d
162
193
  ...deliveryUnitStamp ? {
163
194
  deliveryUnit: deliveryUnitStamp
164
195
  } : {},
196
+ ...rendererBuild ? {
197
+ renderer: rendererBuild.renderer,
198
+ rendererIdentities
199
+ } : {},
200
+ ...nativeRenderer ? {
201
+ nativeRenderer
202
+ } : {},
165
203
  i18n: (0, external_i18n_worker_js_namespaceObject.createI18nWorkerManifest)(routeSpec, appContext),
166
- bff: isEffectApi && primaryBffPrefix && effectApiWorkerExists ? {
204
+ bff: void 0 !== effectBffPrefix && effectApiWorkerExists ? {
167
205
  dispatcherExport: external_constants_js_namespaceObject.BFF_EFFECT_WORKER_DISPATCHER_EXPORT,
168
206
  runtimeFramework: 'effect',
169
- prefix: primaryBffPrefix,
207
+ prefix: effectBffPrefix,
170
208
  worker: external_constants_js_namespaceObject.BFF_EFFECT_WORKER_ENTRY,
171
209
  effect: effectBffManifest
172
210
  } : void 0,
@@ -177,9 +215,12 @@ const createWorkerManifest = async (outputDirectory, modernConfig, appContext, d
177
215
  };
178
216
  const createWorkerModuleLoaders = (manifest)=>{
179
217
  const imports = new Map();
180
- for (const route of manifest.routeSpec.routes)if (route.worker && route.workerExists) {
181
- const importPath = `../${String(route.worker).replace(/^\/+/u, '')}`;
182
- imports.set(route.worker, `() => import(${JSON.stringify(importPath)})`);
218
+ for (const route of manifest.routeSpec.routes)for (const worker of [
219
+ route.workerExists ? route.worker : void 0,
220
+ route.routeDataWorker
221
+ ])if (worker) {
222
+ const importPath = `../${String(worker).replace(/^\/+/u, '')}`;
223
+ imports.set(worker, `() => import(${JSON.stringify(importPath)})`);
183
224
  }
184
225
  if (manifest.bff?.worker) {
185
226
  const importPath = `../${String(manifest.bff.worker).replace(/^\/+/u, '')}`;