@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
@@ -0,0 +1,84 @@
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
+ DEVELOPMENT_OVERLAY_PATH: ()=>DEVELOPMENT_OVERLAY_PATH,
41
+ REFERENCE_TOPOLOGY_PATH: ()=>REFERENCE_TOPOLOGY_PATH,
42
+ distributedSsrFragmentRoute: ()=>distributedSsrFragmentRoute,
43
+ distributedSsrFragmentSlug: ()=>distributedSsrFragmentSlug,
44
+ findWorkspaceRoot: ()=>findWorkspaceRoot,
45
+ normalizeRelativePath: ()=>normalizeRelativePath
46
+ });
47
+ const external_node_fs_namespaceObject = require("node:fs");
48
+ const external_node_path_namespaceObject = require("node:path");
49
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
50
+ const REFERENCE_TOPOLOGY_PATH = 'topology/reference-topology.json';
51
+ const DEVELOPMENT_OVERLAY_PATH = 'topology/local-overlays/development.json';
52
+ const normalizeRelativePath = (value)=>value.replace(/\\/gu, '/').replace(/^\.\/+/u, '');
53
+ const distributedSsrFragmentSlug = (expose)=>{
54
+ const slug = expose.replace(/^\.\//u, '').trim().replace(/([a-z0-9])([A-Z])/gu, '$1-$2').replace(/[^a-zA-Z0-9._-]+/gu, '-').replace(/[._]+/gu, '-').toLowerCase().replace(/-+/gu, '-').replace(/^-+|-+$/gu, '');
55
+ if (!slug) throw new Error(`Invalid distributed SSR expose ${expose}.`);
56
+ return slug;
57
+ };
58
+ const distributedSsrFragmentRoute = (expose)=>`/{locale}/_mf/fragment/${distributedSsrFragmentSlug(expose)}`;
59
+ const findWorkspaceRoot = (appDirectory)=>{
60
+ let current = appDirectory;
61
+ while(true){
62
+ if ((0, external_node_fs_namespaceObject.existsSync)(external_node_path_default().join(current, REFERENCE_TOPOLOGY_PATH))) return current;
63
+ const parent = external_node_path_default().dirname(current);
64
+ if (parent === current) return;
65
+ current = parent;
66
+ }
67
+ };
68
+ exports.DEVELOPMENT_OVERLAY_PATH = __webpack_exports__.DEVELOPMENT_OVERLAY_PATH;
69
+ exports.REFERENCE_TOPOLOGY_PATH = __webpack_exports__.REFERENCE_TOPOLOGY_PATH;
70
+ exports.distributedSsrFragmentRoute = __webpack_exports__.distributedSsrFragmentRoute;
71
+ exports.distributedSsrFragmentSlug = __webpack_exports__.distributedSsrFragmentSlug;
72
+ exports.findWorkspaceRoot = __webpack_exports__.findWorkspaceRoot;
73
+ exports.normalizeRelativePath = __webpack_exports__.normalizeRelativePath;
74
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
75
+ "DEVELOPMENT_OVERLAY_PATH",
76
+ "REFERENCE_TOPOLOGY_PATH",
77
+ "distributedSsrFragmentRoute",
78
+ "distributedSsrFragmentSlug",
79
+ "findWorkspaceRoot",
80
+ "normalizeRelativePath"
81
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
82
+ Object.defineProperty(exports, '__esModule', {
83
+ value: true
84
+ });
@@ -45,28 +45,34 @@ const createBackendRemoteEntrySource = async (workspaceRoot, app, effectApiPath,
45
45
  } : {}
46
46
  };
47
47
  const source = `// Generated by Modern.js backend federation build.
48
- import * as exposedNamespace from ${JSON.stringify(effectApiSpecifier)};
48
+ import { adoptEffectBffShareScope } from '@modern-js/bff-effect/effect-edge';
49
49
 
50
- const exposedModule = {
51
- ...exposedNamespace,
52
- backendFederationContract: {
53
- ...(exposedNamespace.backendFederationContract ?? {}),
54
- compatibility: {
55
- ...(exposedNamespace.backendFederationContract?.compatibility ?? {}),
56
- ...${JSON.stringify(compatibility)},
50
+ // The expose evaluates lazily so defineEffectBff registers its handler
51
+ // factories with the registry the host shares through init().
52
+ let exposedModule;
53
+ const loadExposedModule = () =>
54
+ (exposedModule ??= import(${JSON.stringify(effectApiSpecifier)}).then(exposedNamespace => ({
55
+ ...exposedNamespace,
56
+ backendFederationContract: {
57
+ ...(exposedNamespace.backendFederationContract ?? {}),
58
+ compatibility: {
59
+ ...(exposedNamespace.backendFederationContract?.compatibility ?? {}),
60
+ ...${JSON.stringify(compatibility)},
61
+ },
62
+ name: ${JSON.stringify(app.backendName)},
63
+ role: 'microvertical-server',
64
+ runtimeFramework: 'effect',
65
+ strictEffectApproach: true,
57
66
  },
58
- name: ${JSON.stringify(app.backendName)},
59
- role: 'microvertical-server',
60
- runtimeFramework: 'effect',
61
- strictEffectApproach: true,
62
- },
63
- };
67
+ })));
64
68
  const exposedModules = {
65
- ${JSON.stringify(BACKEND_FEDERATION_EFFECT_EXPOSE)}: () => Promise.resolve(exposedModule),
69
+ ${JSON.stringify(BACKEND_FEDERATION_EFFECT_EXPOSE)}: loadExposedModule,
66
70
  };
67
71
  const __modernjsBackendFederation = ${JSON.stringify(containerMetadata)};
68
72
 
69
- function init() {}
73
+ function init(shareScope) {
74
+ return adoptEffectBffShareScope(shareScope);
75
+ }
70
76
 
71
77
  function get(id) {
72
78
  const load = exposedModules[id];
@@ -170,8 +176,13 @@ const createBackendManifest = (workspaceRoot, distDirectory, app, entryIntegrity
170
176
  source: {
171
177
  module: sourceModule
172
178
  },
173
- readinessPath: `${app.apiPrefix}/${app.apiStem}/readiness`,
174
- openapiPath: `${app.apiPrefix}/openapi.json`,
179
+ ...'rpc' === app.apiProtocol ? {
180
+ rpcPath: app.rpcPath,
181
+ rpcSerialization: 'json'
182
+ } : {
183
+ readinessPath: `${app.apiPrefix}/${app.apiStem}/readiness`,
184
+ openapiPath: `${app.apiPrefix}/openapi.json`
185
+ },
175
186
  ...app.deliveryUnit ? {
176
187
  deliveryUnit: app.deliveryUnit
177
188
  } : {},
@@ -3,8 +3,7 @@ import promises from "node:fs/promises";
3
3
  import node_path from "node:path";
4
4
  import { resolveUltramodernSourceRevision } from "@modern-js/app-tools-extensions/release-identity";
5
5
  import { BACKEND_FEDERATION_MANIFEST_FILE, BACKEND_FEDERATION_REMOTE_ENTRY_FILE, DELIVERY_UNIT_DEPLOY_PROFILE, DELIVERY_UNIT_KIND, DELIVERY_UNIT_SCHEMA_VERSION, ULTRAMODERN_BUILD_ARTIFACT_PATH, deliveryUnitContractBlock, isUltramodernBuildArtifact, validateDeliveryUnitRecord, validateUltramodernBuildArtifact } from "@modern-js/backend-federation-contracts";
6
- const COMPACT_CONFIG_PATH = '.modernjs/ultramodern.json';
7
- const normalizeRelativePath = (value)=>value.replace(/\\/gu, '/').replace(/^\.\/+/u, '');
6
+ import { DEVELOPMENT_OVERLAY_PATH, REFERENCE_TOPOLOGY_PATH, findWorkspaceRoot, normalizeRelativePath } from "../workspace-topology.mjs";
8
7
  const isRecord = (value)=>'object' == typeof value && null !== value;
9
8
  const readJsonFile = async (filePath)=>JSON.parse(await promises.readFile(filePath, 'utf8'));
10
9
  const buildArtifactPathFor = (appDirectory)=>node_path.join(appDirectory, ULTRAMODERN_BUILD_ARTIFACT_PATH);
@@ -31,19 +30,20 @@ const readBuildIdentity = async (appDirectory)=>{
31
30
  const toPascalCase = (value)=>value.split(/[^a-zA-Z0-9]+/u).filter(Boolean).map((part)=>part.charAt(0).toUpperCase() + part.slice(1)).join('');
32
31
  const stringValue = (value)=>'string' == typeof value && value.length > 0 ? value : void 0;
33
32
  const createBackendName = (app, id)=>{
34
- const configuredName = stringValue(app.backendFederation?.name) ?? stringValue(app.backendFederation?.executionSurfaces?.node?.remoteName) ?? stringValue(app.serverExecution?.node?.remoteName);
33
+ const configuredName = stringValue(app.backendFederation?.name) ?? stringValue(app.backendFederation?.executionSurfaces?.node?.remoteName);
35
34
  if (configuredName) return configuredName;
36
35
  const mfName = stringValue(app.moduleFederation?.name);
37
36
  return mfName ? `${mfName}Backend` : `vertical${toPascalCase(id)}Backend`;
38
37
  };
39
- const findWorkspaceRoot = (appDirectory)=>{
40
- let current = appDirectory;
41
- while(true){
42
- if (existsSync(node_path.join(current, COMPACT_CONFIG_PATH))) return current;
43
- const parent = node_path.dirname(current);
44
- if (parent === current) return;
45
- current = parent;
38
+ const rebaseDefaultLocalUrl = (value, defaultPort, publicOrigin)=>{
39
+ let url;
40
+ try {
41
+ url = new URL(value);
42
+ } catch {
43
+ return value;
46
44
  }
45
+ if ('http:' !== url.protocol || 'localhost' !== url.hostname || Number(url.port) !== defaultPort || url.username || url.password) return value;
46
+ return `${publicOrigin}${url.pathname}${url.search}${url.hash}`;
47
47
  };
48
48
  const resolveWorkspaceSourceRevision = async (workspaceRoot)=>resolveUltramodernSourceRevision(workspaceRoot);
49
49
  const createStampedDeliveryUnit = (input)=>{
@@ -63,54 +63,90 @@ const createStampedDeliveryUnit = (input)=>{
63
63
  if (!validation.ok) return;
64
64
  return deliveryUnitContractBlock(record);
65
65
  };
66
- const createAppFromCompactMetadata = (workspaceRoot, appDirectory, compactApp)=>{
67
- const id = stringValue(compactApp.id);
68
- const appPath = stringValue(compactApp.path);
69
- if (!id || 'vertical' !== compactApp.kind || !isRecord(compactApp.api)) return;
70
- const directory = appPath ? normalizeRelativePath(appPath) : `verticals/${id}`;
66
+ const createAppFromTopology = (workspaceRoot, appDirectory, topologyApp, overlay, packageManifest)=>{
67
+ const id = stringValue(topologyApp.id);
68
+ const appPath = stringValue(topologyApp.path);
69
+ if (!id || !appPath || 'vertical' !== topologyApp.kind || !isRecord(topologyApp.api) || !isRecord(topologyApp.backendFederation)) return;
70
+ const directory = normalizeRelativePath(appPath);
71
71
  if (node_path.resolve(workspaceRoot, directory) !== node_path.resolve(appDirectory)) return;
72
- const port = 'number' == typeof compactApp.port ? compactApp.port : void 0;
73
- if (void 0 === port) return;
74
- const apiPrefix = stringValue(compactApp.api.prefix) ?? `/${id}-api`;
75
- const apiStem = stringValue(compactApp.api.stem) ?? id;
76
- const backendName = createBackendName(compactApp, id);
77
- const manifestUrl = stringValue(compactApp.backendFederation?.executionSurfaces?.node?.manifestUrl) ?? stringValue(compactApp.serverExecution?.node?.manifestUrl) ?? `http://localhost:${port}/${BACKEND_FEDERATION_MANIFEST_FILE}`;
78
- const containerEntry = stringValue(compactApp.backendFederation?.executionSurfaces?.node?.containerEntry) ?? stringValue(compactApp.serverExecution?.node?.containerEntry) ?? `http://localhost:${port}/${BACKEND_FEDERATION_REMOTE_ENTRY_FILE}`;
79
- const configuredRemoteType = stringValue(compactApp.backendFederation?.executionSurfaces?.node?.remoteType) ?? stringValue(compactApp.serverExecution?.node?.remoteType);
72
+ const defaultPort = overlay.ports?.[id];
73
+ if ('number' != typeof defaultPort || !Number.isInteger(defaultPort) || defaultPort < 1 || defaultPort > 65535) throw new Error(`[backend-federation-build] Invalid development port for ${id}.`);
74
+ const portEnv = stringValue(topologyApp.portEnv) ?? `VERTICAL_${(stringValue(topologyApp.domain) ?? id).replace(/[^a-zA-Z0-9]/gu, '_').toUpperCase()}_PORT`;
75
+ const port = Number(process.env[portEnv] ?? defaultPort);
76
+ if (!Number.isInteger(port) || port < 1 || port > 65535) throw new Error(`[backend-federation-build] Invalid ${portEnv} development port for ${id}.`);
77
+ const publicUrlEnv = stringValue(topologyApp.cloudflare?.publicUrlEnv);
78
+ const configuredPublicUrl = publicUrlEnv ? process.env[publicUrlEnv]?.trim() : void 0;
79
+ let publicOrigin = `http://localhost:${port}`;
80
+ if (configuredPublicUrl) {
81
+ let url;
82
+ try {
83
+ url = new URL(configuredPublicUrl);
84
+ } catch {
85
+ throw new Error(`[backend-federation-build] Invalid ${publicUrlEnv} public URL for ${id}.`);
86
+ }
87
+ if (![
88
+ 'http:',
89
+ 'https:'
90
+ ].includes(url.protocol) || url.username || url.password) throw new Error(`[backend-federation-build] Invalid ${publicUrlEnv} public URL for ${id}.`);
91
+ publicOrigin = url.origin;
92
+ }
93
+ const apiPrefix = stringValue(topologyApp.api.bff?.prefix) ?? `/${id}-api`;
94
+ const apiProtocol = topologyApp.api.protocol ?? 'rest';
95
+ if ('rest' !== apiProtocol && 'rpc' !== apiProtocol) throw new Error(`[backend-federation-build] Unsupported API protocol for ${id}.`);
96
+ const rpcPath = 'rpc' === apiProtocol ? stringValue(topologyApp.api.rpcPath) : void 0;
97
+ if ('rpc' === apiProtocol && (!rpcPath || 'json' !== topologyApp.api.rpcSerialization)) throw new Error(`[backend-federation-build] Missing JSON RPC route metadata for ${id}.`);
98
+ const apiStem = stringValue(topologyApp.api.stem) ?? id;
99
+ const backendName = createBackendName(topologyApp, id);
100
+ const nodeOverlay = overlay.serverExecution?.[id]?.node;
101
+ if (!isRecord(nodeOverlay)) throw new Error(`[backend-federation-build] Missing declared Node server execution for ${id}.`);
102
+ const manifestUrl = rebaseDefaultLocalUrl(stringValue(nodeOverlay?.manifestUrl) ?? `http://localhost:${defaultPort}/${BACKEND_FEDERATION_MANIFEST_FILE}`, defaultPort, publicOrigin);
103
+ const containerEntry = rebaseDefaultLocalUrl(stringValue(nodeOverlay?.containerEntry) ?? `http://localhost:${defaultPort}/${BACKEND_FEDERATION_REMOTE_ENTRY_FILE}`, defaultPort, publicOrigin);
104
+ const configuredRemoteType = stringValue(nodeOverlay?.remoteType) ?? stringValue(topologyApp.backendFederation?.executionSurfaces?.node?.remoteType);
80
105
  if (void 0 !== configuredRemoteType && 'commonjs-module' !== configuredRemoteType) throw new Error(`[backend-federation-build] Node backend federation remoteType must be "commonjs-module"; received "${configuredRemoteType}" for ${id}.`);
81
106
  if (!new URL(containerEntry).pathname.endsWith(`/${BACKEND_FEDERATION_REMOTE_ENTRY_FILE}`)) throw new Error(`[backend-federation-build] Node backend federation containerEntry must end with "/${BACKEND_FEDERATION_REMOTE_ENTRY_FILE}"; received "${containerEntry}" for ${id}.`);
82
107
  const remoteType = 'commonjs-module';
83
- const packageName = stringValue(compactApp.package);
84
- const uiManifestUrl = stringValue(compactApp.backendFederation?.versionBoundary?.ui?.manifestUrl) ?? stringValue(compactApp.moduleFederation?.manifestUrl);
85
- const compactDeliveryUnit = isRecord(compactApp.deliveryUnit) ? {
86
- unitId: stringValue(compactApp.deliveryUnit.unitId),
87
- buildMarker: stringValue(compactApp.deliveryUnit.buildMarker),
88
- sourceRevision: stringValue(compactApp.deliveryUnit.sourceRevision),
89
- packageName: stringValue(compactApp.deliveryUnit.packageName),
90
- version: stringValue(compactApp.deliveryUnit.version)
108
+ const packageName = stringValue(packageManifest.name);
109
+ const version = stringValue(packageManifest.version);
110
+ if (stringValue(topologyApp.package) !== packageName || !version) throw new Error(`[backend-federation-build] Topology package identity must match package.json for ${id}.`);
111
+ const declaredUiManifestUrl = stringValue(overlay.manifests?.[id]);
112
+ const uiManifestUrl = declaredUiManifestUrl ? rebaseDefaultLocalUrl(declaredUiManifestUrl, defaultPort, publicOrigin) : void 0;
113
+ const topologyDeliveryUnit = isRecord(topologyApp.deliveryUnit) ? {
114
+ unitId: stringValue(topologyApp.deliveryUnit.unitId),
115
+ buildMarker: stringValue(topologyApp.deliveryUnit.buildMarker),
116
+ sourceRevision: stringValue(topologyApp.deliveryUnit.sourceRevision),
117
+ packageName: stringValue(topologyApp.deliveryUnit.packageName),
118
+ version: stringValue(topologyApp.deliveryUnit.version)
91
119
  } : void 0;
92
120
  return {
93
121
  id,
94
122
  directory,
95
123
  packageName,
124
+ version,
96
125
  port,
97
126
  apiPrefix,
127
+ apiProtocol,
128
+ rpcPath,
98
129
  apiStem,
99
130
  backendName,
100
131
  manifestUrl,
101
132
  containerEntry,
102
133
  remoteType,
103
134
  uiManifestUrl,
104
- compactDeliveryUnit
135
+ topologyDeliveryUnit
105
136
  };
106
137
  };
107
138
  const findBackendFederationApp = async (workspaceRoot, appDirectory)=>{
108
- const compactConfigPath = node_path.join(workspaceRoot, COMPACT_CONFIG_PATH);
109
- const compactConfig = await readJsonFile(compactConfigPath);
110
- const apps = Array.isArray(compactConfig.topology?.apps) ? compactConfig.topology.apps : [];
111
- for (const app of apps){
112
- const resolved = createAppFromCompactMetadata(workspaceRoot, appDirectory, app);
139
+ const topologyPath = node_path.join(workspaceRoot, REFERENCE_TOPOLOGY_PATH);
140
+ const topology = await readJsonFile(topologyPath);
141
+ if (!isRecord(topology) || !Array.isArray(topology.verticals)) throw new Error(`[backend-federation-build] Invalid declared topology at ${topologyPath}.`);
142
+ const overlayPath = node_path.join(workspaceRoot, DEVELOPMENT_OVERLAY_PATH);
143
+ const overlay = await readJsonFile(overlayPath);
144
+ if (!isRecord(overlay) || !isRecord(overlay.ports)) throw new Error(`[backend-federation-build] Invalid development overlay at ${overlayPath}.`);
145
+ const packageManifest = await readJsonFile(node_path.join(appDirectory, 'package.json'));
146
+ for (const app of topology.verticals){
147
+ const resolved = createAppFromTopology(workspaceRoot, appDirectory, app, overlay, packageManifest);
113
148
  if (resolved) return resolved;
114
149
  }
150
+ throw new Error(`[backend-federation-build] ${appDirectory} is missing from the declared reference topology.`);
115
151
  };
116
- export { COMPACT_CONFIG_PATH, buildArtifactPathFor, createAppFromCompactMetadata, createStampedDeliveryUnit, findBackendFederationApp, findWorkspaceRoot, normalizeRelativePath, readBuildIdentity, resolveWorkspaceSourceRevision };
152
+ export { DEVELOPMENT_OVERLAY_PATH, REFERENCE_TOPOLOGY_PATH, buildArtifactPathFor, createAppFromTopology, createStampedDeliveryUnit, findBackendFederationApp, findWorkspaceRoot, normalizeRelativePath, readBuildIdentity, resolveWorkspaceSourceRevision };
@@ -4,9 +4,10 @@ import node_path from "node:path";
4
4
  import { resolveUltramodernReleaseIdentity } from "@modern-js/app-tools-extensions/release-identity";
5
5
  import { BACKEND_FEDERATION_MANIFEST_FILE, BACKEND_FEDERATION_REMOTE_ENTRY_FILE, ULTRAMODERN_BUILD_ARTIFACT_FILE, stampUltramodernBuildArtifactIdentity } from "@modern-js/backend-federation-contracts";
6
6
  import { createBackendFederationEntryIntegrity } from "@modern-js/server-runtime-extensions/backend-federation-security/node";
7
+ import { emitRendererBuildArtifact, stampFinalizedRendererBuildArtifact, validateFinalizedRendererBuild } from "../release-envelope/renderer-output-stamp.mjs";
7
8
  import { createBackendManifest, createBackendRemoteEntrySource } from "./codegen.mjs";
8
- import { COMPACT_CONFIG_PATH, buildArtifactPathFor, createStampedDeliveryUnit, findBackendFederationApp, findWorkspaceRoot, readBuildIdentity, resolveWorkspaceSourceRevision } from "./config.mjs";
9
- const emitBackendFederationArtifacts = async (appDirectory, distDirectory)=>{
9
+ import { REFERENCE_TOPOLOGY_PATH, buildArtifactPathFor, createStampedDeliveryUnit, findBackendFederationApp, findWorkspaceRoot, readBuildIdentity, resolveWorkspaceSourceRevision } from "./config.mjs";
10
+ const emitBackendFederationArtifacts = async (appDirectory, distDirectory, options = {})=>{
10
11
  const workspaceRoot = findWorkspaceRoot(appDirectory);
11
12
  if (!workspaceRoot) return;
12
13
  const effectApiPath = node_path.join(appDirectory, 'api/effect-api.ts');
@@ -15,35 +16,50 @@ const emitBackendFederationArtifacts = async (appDirectory, distDirectory)=>{
15
16
  const app = await findBackendFederationApp(workspaceRoot, appDirectory);
16
17
  if (!app) return;
17
18
  const buildIdentity = await readBuildIdentity(appDirectory);
18
- const compactDeliveryUnit = app.compactDeliveryUnit;
19
- const hasCompactDeliveryUnit = void 0 !== compactDeliveryUnit && (void 0 !== compactDeliveryUnit.unitId || void 0 !== compactDeliveryUnit.buildMarker || void 0 !== compactDeliveryUnit.packageName || void 0 !== compactDeliveryUnit.version);
19
+ const topologyDeliveryUnit = app.topologyDeliveryUnit;
20
+ const hasTopologyDeliveryUnit = void 0 !== topologyDeliveryUnit && (void 0 !== topologyDeliveryUnit.unitId || void 0 !== topologyDeliveryUnit.buildMarker || void 0 !== topologyDeliveryUnit.packageName || void 0 !== topologyDeliveryUnit.version);
20
21
  const hasBuildIdentity = void 0 !== buildIdentity.unitId || void 0 !== buildIdentity.buildVersion || void 0 !== buildIdentity.packageName || void 0 !== buildIdentity.version;
21
22
  if (hasBuildIdentity) {
22
- const compactConfigPath = node_path.join(workspaceRoot, COMPACT_CONFIG_PATH);
23
+ const topologyPath = node_path.join(workspaceRoot, REFERENCE_TOPOLOGY_PATH);
23
24
  const buildIdentityPath = buildArtifactPathFor(appDirectory);
24
25
  const mismatches = [];
25
26
  const compare = (label, a, b, leftLabel = 'deliveryUnit')=>{
26
27
  if (void 0 !== a && void 0 !== b && a !== b) mismatches.push(`${label}: ${leftLabel}=${a} vs ultramodern-build=${b}`);
27
28
  };
28
29
  compare('appId', app.id, buildIdentity.appId, 'topology');
29
- if (hasCompactDeliveryUnit) {
30
- compare('unitId', compactDeliveryUnit?.unitId, buildIdentity.unitId);
31
- compare('buildMarker/build', compactDeliveryUnit?.buildMarker, buildIdentity.buildVersion);
32
- compare('packageName', compactDeliveryUnit?.packageName, buildIdentity.packageName);
33
- compare('version', compactDeliveryUnit?.version, buildIdentity.version);
30
+ if (hasTopologyDeliveryUnit) {
31
+ compare('unitId', topologyDeliveryUnit?.unitId, buildIdentity.unitId);
32
+ compare('buildMarker/build', topologyDeliveryUnit?.buildMarker, buildIdentity.buildVersion);
33
+ compare('packageName', topologyDeliveryUnit?.packageName, buildIdentity.packageName);
34
+ compare('version', topologyDeliveryUnit?.version, buildIdentity.version);
34
35
  }
35
- if (mismatches.length > 0) throw new Error(`[backend-federation-build] Delivery-unit identity drift between ${compactConfigPath} (topology) and ${buildIdentityPath}: ${mismatches.join('; ')}`);
36
+ compare('packageName', app.packageName, buildIdentity.packageName, 'package.json');
37
+ compare('packageName', topologyDeliveryUnit?.packageName, app.packageName, 'topology');
38
+ compare('version', app.version, buildIdentity.version, 'package.json');
39
+ compare('version', topologyDeliveryUnit?.version, app.version, 'topology');
40
+ if (mismatches.length > 0) throw new Error(`[backend-federation-build] Delivery-unit identity drift between ${topologyPath}, package.json and ${buildIdentityPath}: ${mismatches.join('; ')}`);
36
41
  }
37
- const unitId = compactDeliveryUnit?.unitId ?? buildIdentity.unitId;
38
- const generationBuildMarker = compactDeliveryUnit?.buildMarker ?? buildIdentity.buildVersion;
39
- const sourceRevision = await resolveWorkspaceSourceRevision(workspaceRoot);
40
- const buildVersion = generationBuildMarker && unitId ? resolveUltramodernReleaseIdentity({
42
+ const unitId = topologyDeliveryUnit?.unitId ?? buildIdentity.unitId;
43
+ const generationBuildMarker = topologyDeliveryUnit?.buildMarker ?? buildIdentity.buildVersion;
44
+ let finalizedRendererBuild;
45
+ if (options.resolveRendererBuild && buildIdentity.artifact?.surfaces.ui) {
46
+ if (!options.entrypoints?.length) throw new Error('[backend-federation-build] Renderer output stamping requires the actual finalized application entries.');
47
+ const context = {
48
+ appDirectory,
49
+ distDirectory,
50
+ entrypoints: options.entrypoints
51
+ };
52
+ finalizedRendererBuild = await options.resolveRendererBuild(context);
53
+ validateFinalizedRendererBuild(finalizedRendererBuild, context, app.id);
54
+ }
55
+ const sourceRevision = finalizedRendererBuild?.sourceRevision ?? await resolveWorkspaceSourceRevision(workspaceRoot);
56
+ const buildVersion = finalizedRendererBuild?.buildMarker ?? (generationBuildMarker && unitId ? resolveUltramodernReleaseIdentity({
41
57
  generationBuildMarker,
42
58
  unitId,
43
59
  workspaceRoot
44
- }).buildMarker : void 0;
45
- const packageName = compactDeliveryUnit?.packageName ?? buildIdentity.packageName ?? app.packageName;
46
- const version = compactDeliveryUnit?.version ?? buildIdentity.version;
60
+ }).buildMarker : void 0);
61
+ const packageName = app.packageName;
62
+ const version = app.version;
47
63
  const deliveryUnit = createStampedDeliveryUnit({
48
64
  appId: app.id,
49
65
  unitId,
@@ -52,10 +68,15 @@ const emitBackendFederationArtifacts = async (appDirectory, distDirectory)=>{
52
68
  version,
53
69
  sourceRevision
54
70
  });
55
- const stampedBuildArtifact = buildIdentity.artifact ? stampUltramodernBuildArtifactIdentity(buildIdentity.artifact, {
71
+ let stampedBuildArtifact = buildIdentity.artifact ? stampUltramodernBuildArtifactIdentity(buildIdentity.artifact, {
56
72
  buildMarker: buildVersion ?? buildIdentity.artifact.deliveryUnit.buildMarker,
57
73
  sourceRevision
58
74
  }) : void 0;
75
+ if (finalizedRendererBuild && stampedBuildArtifact?.surfaces.ui) stampedBuildArtifact = stampFinalizedRendererBuildArtifact(stampedBuildArtifact, finalizedRendererBuild, {
76
+ appDirectory,
77
+ distDirectory,
78
+ entrypoints: options.entrypoints
79
+ });
59
80
  const resolvedApp = {
60
81
  ...app,
61
82
  packageName,
@@ -86,14 +107,34 @@ const emitBackendFederationArtifacts = async (appDirectory, distDirectory)=>{
86
107
  remoteType: resolvedApp.remoteType
87
108
  };
88
109
  };
89
- const emit = ()=>({
110
+ const emit = (options = {})=>{
111
+ if (options.resolveRendererBuild && !options.rendererBuildPlugin) throw new Error('[backend-federation-build] A finalized renderer resolver requires its owning metadata producer plugin.');
112
+ return {
90
113
  name: '@modern-js/backend-federation-build',
114
+ pre: options.resolveRendererBuild ? [
115
+ options.rendererBuildPlugin
116
+ ] : [],
117
+ required: options.resolveRendererBuild ? [
118
+ options.rendererBuildPlugin
119
+ ] : [],
91
120
  setup (api) {
92
121
  api.onAfterBuild(async ()=>{
93
- const { appDirectory, distDirectory } = api.getAppContext();
94
- await emitBackendFederationArtifacts(appDirectory, distDirectory);
122
+ const { appDirectory, distDirectory, entrypoints, apiOnly } = api.getAppContext();
123
+ if (options.resolveRendererBuild && !apiOnly) await emitRendererBuildArtifact({
124
+ appDirectory,
125
+ distDirectory,
126
+ entrypoints: entrypoints ?? []
127
+ }, {
128
+ resolveRendererBuild: options.resolveRendererBuild,
129
+ rendererBuildPlugin: options.rendererBuildPlugin
130
+ });
131
+ await emitBackendFederationArtifacts(appDirectory, distDirectory, {
132
+ ...options,
133
+ entrypoints
134
+ });
95
135
  });
96
136
  }
97
- });
137
+ };
138
+ };
98
139
  export default emit;
99
140
  export { emitBackendFederationArtifacts };