@bleedingdev/modern-js-app-tools-extensions 3.9.0-ultramodern.9 → 3.9.3-ultramodern.2

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 (275) 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 +130 -13
  37. package/dist/cjs/policy-defaults.js +38 -29
  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/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
  48. package/dist/cjs/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
  49. package/dist/cjs/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
  50. package/dist/cjs/templates/cloudflare-entry.005-worker-dispatch.mjs +530 -103
  51. package/dist/cjs/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
  52. package/dist/cjs/templates/cloudflare-worker-route-data.mjs +1069 -0
  53. package/dist/cjs/workspace-topology.js +84 -0
  54. package/dist/esm/backend-federation-build/codegen.mjs +29 -18
  55. package/dist/esm/backend-federation-build/config.mjs +74 -38
  56. package/dist/esm/backend-federation-build/emit.mjs +64 -23
  57. package/dist/esm/build-config/build-environment.mjs +26 -160
  58. package/dist/esm/build-config/internal-effect-discovery.mjs +102 -0
  59. package/dist/esm/build-config/public.mjs +1 -1
  60. package/dist/esm/build-config/remote-address.mjs +20 -0
  61. package/dist/esm/cloudflare/artifacts.mjs +8 -19
  62. package/dist/esm/cloudflare/delivery-unit.mjs +124 -45
  63. package/dist/esm/cloudflare/index.mjs +15 -5
  64. package/dist/esm/cloudflare/native-renderer.mjs +48 -0
  65. package/dist/esm/cloudflare/renderer-identity.mjs +57 -0
  66. package/dist/esm/cloudflare/worker-manifest.mjs +55 -14
  67. package/dist/esm/cloudflare/worker-options.mjs +10 -0
  68. package/dist/esm/cloudflare/wrangler-config.mjs +203 -12
  69. package/dist/esm/cloudflare-builder.mjs +301 -89
  70. package/dist/esm/cloudflare-output-contract.mjs +29 -3
  71. package/dist/esm/cloudflare-output-verifier/identity.mjs +113 -24
  72. package/dist/esm/cloudflare-output-verifier/index.mjs +10 -0
  73. package/dist/esm/cloudflare-output-verifier/manifest.mjs +46 -0
  74. package/dist/esm/cloudflare-output-verifier/mutation-policy.mjs +7 -1
  75. package/dist/esm/cloudflare-output-verifier/worker-bundles.mjs +11 -6
  76. package/dist/esm/config.mjs +3 -1
  77. package/dist/esm/deploy-output/npmAliases.mjs +92 -6
  78. package/dist/esm/deploy-output/plugin.mjs +24 -6
  79. package/dist/esm/deploy-output/public-assets.mjs +82 -0
  80. package/dist/esm/deploy-output/target.mjs +50 -3
  81. package/dist/esm/deploy-output/trace-files.mjs +47 -0
  82. package/dist/esm/module-federation-config/exposes.mjs +18 -0
  83. package/dist/esm/module-federation-config/index.mjs +4 -0
  84. package/dist/esm/module-federation-config/inspect.mjs +65 -0
  85. package/dist/esm/module-federation-config/object-literal.mjs +43 -0
  86. package/dist/esm/module-federation-config/syntax.mjs +101 -0
  87. package/dist/esm/module-federation-config/types.mjs +0 -0
  88. package/dist/esm/native-type-checker.mjs +124 -13
  89. package/dist/esm/policy-defaults.mjs +36 -30
  90. package/dist/esm/release-envelope/canonical.mjs +2 -9
  91. package/dist/esm/release-envelope/contract.mjs +21 -0
  92. package/dist/esm/release-envelope/framework-output.mjs +297 -106
  93. package/dist/esm/release-envelope/index.mjs +149 -38
  94. package/dist/esm/release-envelope/plugin.mjs +24 -15
  95. package/dist/esm/release-envelope/renderer-output-stamp.mjs +112 -0
  96. package/dist/esm/release-envelope/types.mjs +2 -3
  97. package/dist/esm/release-identity.mjs +8 -5
  98. package/dist/esm/renderer-build-identity.mjs +82 -0
  99. package/dist/esm/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
  100. package/dist/esm/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
  101. package/dist/esm/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
  102. package/dist/esm/templates/cloudflare-entry.005-worker-dispatch.mjs +530 -103
  103. package/dist/esm/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
  104. package/dist/esm/templates/cloudflare-worker-route-data.mjs +1069 -0
  105. package/dist/esm/workspace-topology.mjs +21 -0
  106. package/dist/esm-node/backend-federation-build/codegen.mjs +29 -18
  107. package/dist/esm-node/backend-federation-build/config.mjs +74 -38
  108. package/dist/esm-node/backend-federation-build/emit.mjs +64 -23
  109. package/dist/esm-node/build-config/build-environment.mjs +26 -160
  110. package/dist/esm-node/build-config/internal-effect-discovery.mjs +103 -0
  111. package/dist/esm-node/build-config/public.mjs +1 -1
  112. package/dist/esm-node/build-config/remote-address.mjs +21 -0
  113. package/dist/esm-node/cloudflare/artifacts.mjs +8 -19
  114. package/dist/esm-node/cloudflare/delivery-unit.mjs +124 -45
  115. package/dist/esm-node/cloudflare/index.mjs +15 -5
  116. package/dist/esm-node/cloudflare/native-renderer.mjs +49 -0
  117. package/dist/esm-node/cloudflare/renderer-identity.mjs +58 -0
  118. package/dist/esm-node/cloudflare/worker-manifest.mjs +55 -14
  119. package/dist/esm-node/cloudflare/worker-options.mjs +11 -0
  120. package/dist/esm-node/cloudflare/wrangler-config.mjs +203 -12
  121. package/dist/esm-node/cloudflare-builder.mjs +301 -89
  122. package/dist/esm-node/cloudflare-output-contract.mjs +29 -3
  123. package/dist/esm-node/cloudflare-output-verifier/identity.mjs +113 -24
  124. package/dist/esm-node/cloudflare-output-verifier/index.mjs +10 -0
  125. package/dist/esm-node/cloudflare-output-verifier/manifest.mjs +46 -0
  126. package/dist/esm-node/cloudflare-output-verifier/mutation-policy.mjs +7 -1
  127. package/dist/esm-node/cloudflare-output-verifier/worker-bundles.mjs +11 -6
  128. package/dist/esm-node/config.mjs +3 -1
  129. package/dist/esm-node/deploy-output/npmAliases.mjs +92 -6
  130. package/dist/esm-node/deploy-output/plugin.mjs +24 -6
  131. package/dist/esm-node/deploy-output/public-assets.mjs +83 -0
  132. package/dist/esm-node/deploy-output/target.mjs +50 -3
  133. package/dist/esm-node/deploy-output/trace-files.mjs +48 -0
  134. package/dist/esm-node/module-federation-config/exposes.mjs +19 -0
  135. package/dist/esm-node/module-federation-config/index.mjs +5 -0
  136. package/dist/esm-node/module-federation-config/inspect.mjs +66 -0
  137. package/dist/esm-node/module-federation-config/object-literal.mjs +44 -0
  138. package/dist/esm-node/module-federation-config/syntax.mjs +102 -0
  139. package/dist/esm-node/module-federation-config/types.mjs +1 -0
  140. package/dist/esm-node/native-type-checker.mjs +124 -13
  141. package/dist/esm-node/policy-defaults.mjs +36 -30
  142. package/dist/esm-node/release-envelope/canonical.mjs +2 -9
  143. package/dist/esm-node/release-envelope/contract.mjs +22 -0
  144. package/dist/esm-node/release-envelope/framework-output.mjs +297 -106
  145. package/dist/esm-node/release-envelope/index.mjs +149 -38
  146. package/dist/esm-node/release-envelope/plugin.mjs +24 -15
  147. package/dist/esm-node/release-envelope/renderer-output-stamp.mjs +113 -0
  148. package/dist/esm-node/release-envelope/types.mjs +2 -3
  149. package/dist/esm-node/release-identity.mjs +8 -5
  150. package/dist/esm-node/renderer-build-identity.mjs +83 -0
  151. package/dist/esm-node/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
  152. package/dist/esm-node/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
  153. package/dist/esm-node/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
  154. package/dist/esm-node/templates/cloudflare-entry.005-worker-dispatch.mjs +530 -103
  155. package/dist/esm-node/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
  156. package/dist/esm-node/templates/cloudflare-worker-route-data.mjs +1069 -0
  157. package/dist/esm-node/workspace-topology.mjs +22 -0
  158. package/dist/types/backend-federation-build/codegen.d.ts +30 -0
  159. package/dist/types/backend-federation-build/config.d.ts +10 -57
  160. package/dist/types/backend-federation-build/emit.d.ts +12 -2
  161. package/dist/types/backend-federation-build/index.d.ts +1 -1
  162. package/dist/types/build-config/build-environment.d.ts +1 -9
  163. package/dist/types/build-config/internal-effect-discovery.d.ts +4 -0
  164. package/dist/types/build-config/public.d.ts +1 -1
  165. package/dist/types/build-config/remote-address.d.ts +3 -0
  166. package/dist/types/cloudflare/artifacts.d.ts +7 -6
  167. package/dist/types/cloudflare/constants.d.ts +1 -1
  168. package/dist/types/cloudflare/delivery-unit.d.ts +38 -7
  169. package/dist/types/cloudflare/native-renderer.d.ts +30 -0
  170. package/dist/types/cloudflare/renderer-identity.d.ts +25 -0
  171. package/dist/types/cloudflare/worker-manifest.d.ts +17 -2
  172. package/dist/types/cloudflare/worker-options.d.ts +20 -0
  173. package/dist/types/cloudflare/wrangler-config.d.ts +55 -2
  174. package/dist/types/cloudflare-builder.d.ts +51 -8
  175. package/dist/types/cloudflare-output-contract.d.ts +5 -3
  176. package/dist/types/cloudflare-output-verifier/identity.d.ts +7 -3
  177. package/dist/types/cloudflare-output-verifier/worker-bundles.d.ts +2 -2
  178. package/dist/types/config.d.ts +98 -13
  179. package/dist/types/deploy-output/plugin.d.ts +29 -9
  180. package/dist/types/deploy-output/public-assets.d.ts +51 -0
  181. package/dist/types/deploy-output/target.d.ts +28 -5
  182. package/dist/types/deploy-output/trace-files.d.ts +17 -0
  183. package/dist/types/module-federation-config/exposes.d.ts +11 -0
  184. package/dist/types/module-federation-config/index.d.ts +5 -0
  185. package/dist/types/module-federation-config/inspect.d.ts +2 -0
  186. package/dist/types/module-federation-config/object-literal.d.ts +4 -0
  187. package/dist/types/module-federation-config/syntax.d.ts +7 -0
  188. package/dist/types/module-federation-config/types.d.ts +20 -0
  189. package/dist/types/native-type-checker.d.ts +26 -3
  190. package/dist/types/policy-defaults.d.ts +12 -2
  191. package/dist/types/release-envelope/canonical.d.ts +5 -5
  192. package/dist/types/release-envelope/contract.d.mts +8 -0
  193. package/dist/types/release-envelope/framework-output.d.ts +23 -13
  194. package/dist/types/release-envelope/index.d.ts +17 -5
  195. package/dist/types/release-envelope/plugin.d.ts +10 -6
  196. package/dist/types/release-envelope/renderer-output-stamp.d.ts +34 -0
  197. package/dist/types/release-envelope/types.d.ts +42 -4
  198. package/dist/types/release-identity.d.ts +3 -2
  199. package/dist/types/renderer-build-identity.d.ts +30 -0
  200. package/dist/types/templates/cloudflare-worker-route-data.d.mts +14 -0
  201. package/dist/types/workspace-topology.d.ts +91 -0
  202. package/package.json +87 -27
  203. package/src/backend-federation-build/codegen.ts +28 -19
  204. package/src/backend-federation-build/config.ts +189 -123
  205. package/src/backend-federation-build/emit.ts +119 -38
  206. package/src/backend-federation-build/index.ts +4 -1
  207. package/src/build-config/build-environment.ts +59 -285
  208. package/src/build-config/internal-effect-discovery.ts +239 -0
  209. package/src/build-config/public.ts +0 -1
  210. package/src/build-config/remote-address.ts +33 -0
  211. package/src/cloudflare/artifacts.ts +22 -43
  212. package/src/cloudflare/delivery-unit.ts +283 -60
  213. package/src/cloudflare/index.ts +35 -19
  214. package/src/cloudflare/native-renderer.ts +117 -0
  215. package/src/cloudflare/renderer-identity.ts +171 -0
  216. package/src/cloudflare/worker-manifest.ts +108 -10
  217. package/src/cloudflare/worker-options.ts +60 -0
  218. package/src/cloudflare/wrangler-config.ts +390 -14
  219. package/src/cloudflare-builder.ts +543 -170
  220. package/src/cloudflare-output-contract.ts +45 -2
  221. package/src/cloudflare-output-verifier/identity.ts +138 -7
  222. package/src/cloudflare-output-verifier/index.ts +20 -0
  223. package/src/cloudflare-output-verifier/manifest.ts +77 -0
  224. package/src/cloudflare-output-verifier/mutation-policy.ts +11 -1
  225. package/src/cloudflare-output-verifier/worker-bundles.ts +27 -11
  226. package/src/config.ts +101 -19
  227. package/src/deploy-output/npmAliases.ts +141 -4
  228. package/src/deploy-output/plugin.ts +55 -18
  229. package/src/deploy-output/public-assets.ts +224 -0
  230. package/src/deploy-output/target.ts +97 -14
  231. package/src/deploy-output/trace-files.ts +80 -0
  232. package/src/module-federation-config/exposes.ts +46 -0
  233. package/src/module-federation-config/index.ts +22 -0
  234. package/src/module-federation-config/inspect.ts +157 -0
  235. package/src/module-federation-config/object-literal.ts +76 -0
  236. package/src/module-federation-config/syntax.ts +212 -0
  237. package/src/module-federation-config/types.ts +22 -0
  238. package/src/native-type-checker.ts +233 -20
  239. package/src/policy-defaults.ts +47 -17
  240. package/src/release-envelope/canonical.ts +6 -18
  241. package/src/release-envelope/contract.mjs +28 -0
  242. package/src/release-envelope/framework-output.ts +681 -156
  243. package/src/release-envelope/index.ts +315 -60
  244. package/src/release-envelope/plugin.ts +54 -38
  245. package/src/release-envelope/renderer-output-stamp.ts +210 -0
  246. package/src/release-envelope/types.ts +75 -6
  247. package/src/release-identity.ts +19 -2
  248. package/src/renderer-build-identity.ts +168 -0
  249. package/src/templates/cloudflare-entry.001-bootstrap-security.mjs +14 -6
  250. package/src/templates/cloudflare-entry.002-assets-routes.mjs +10 -2
  251. package/src/templates/cloudflare-entry.004-rendering-css.mjs +403 -96
  252. package/src/templates/cloudflare-entry.005-worker-dispatch.mjs +530 -103
  253. package/src/templates/cloudflare-entry.006-fetch-handler.mjs +26 -7
  254. package/src/templates/cloudflare-worker-route-data.mjs +1069 -0
  255. package/src/workspace-topology.ts +125 -0
  256. package/dist/cjs/templates/cloudflare-worker-fs-promises.mjs +0 -11
  257. package/dist/cjs/templates/cloudflare-worker-loadable-server.mjs +0 -281
  258. package/dist/cjs/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  259. package/dist/cjs/templates/cloudflare-worker-path.mjs +0 -98
  260. package/dist/esm/templates/cloudflare-worker-fs-promises.mjs +0 -11
  261. package/dist/esm/templates/cloudflare-worker-loadable-server.mjs +0 -281
  262. package/dist/esm/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  263. package/dist/esm/templates/cloudflare-worker-path.mjs +0 -98
  264. package/dist/esm-node/templates/cloudflare-worker-fs-promises.mjs +0 -11
  265. package/dist/esm-node/templates/cloudflare-worker-loadable-server.mjs +0 -281
  266. package/dist/esm-node/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  267. package/dist/esm-node/templates/cloudflare-worker-path.mjs +0 -98
  268. package/dist/types/templates/cloudflare-worker-fs-promises.d.mts +0 -5
  269. package/dist/types/templates/cloudflare-worker-loadable-server.d.mts +0 -48
  270. package/dist/types/templates/cloudflare-worker-mf-ssr-runtime-plugin.d.mts +0 -13
  271. package/dist/types/templates/cloudflare-worker-path.d.mts +0 -21
  272. package/src/templates/cloudflare-worker-fs-promises.mjs +0 -11
  273. package/src/templates/cloudflare-worker-loadable-server.mjs +0 -281
  274. package/src/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  275. package/src/templates/cloudflare-worker-path.mjs +0 -98
@@ -40,6 +40,7 @@ __webpack_require__.d(__webpack_exports__, {
40
40
  MICROVERTICAL_RELEASE_ENVELOPE_KIND: ()=>external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_KIND,
41
41
  MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION: ()=>external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION,
42
42
  MICROVERTICAL_RELEASE_TARGETS: ()=>external_types_js_namespaceObject.MICROVERTICAL_RELEASE_TARGETS,
43
+ SHELL_RELEASE_ENVELOPE_KIND: ()=>external_types_js_namespaceObject.SHELL_RELEASE_ENVELOPE_KIND,
43
44
  canonicalSerializeMicroVerticalReleaseEnvelope: ()=>external_canonical_js_namespaceObject.canonicalSerializeMicroVerticalReleaseEnvelope,
44
45
  createMicroVerticalReleaseEnvelope: ()=>createMicroVerticalReleaseEnvelope,
45
46
  verifyMicroVerticalReleaseEnvelope: ()=>verifyMicroVerticalReleaseEnvelope
@@ -49,6 +50,7 @@ const promises_namespaceObject = require("node:fs/promises");
49
50
  var promises_default = /*#__PURE__*/ __webpack_require__.n(promises_namespaceObject);
50
51
  const external_node_path_namespaceObject = require("node:path");
51
52
  var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
53
+ const backend_federation_contracts_namespaceObject = require("@modern-js/backend-federation-contracts");
52
54
  const external_canonical_js_namespaceObject = require("./canonical.js");
53
55
  const external_types_js_namespaceObject = require("./types.js");
54
56
  const SHA256_PATTERN = /^[a-f0-9]{64}$/u;
@@ -74,6 +76,10 @@ const assertTarget = (value, location = 'target')=>{
74
76
  if (!TARGETS.has(target)) throw new Error(`${location} must be one of: ${external_types_js_namespaceObject.MICROVERTICAL_RELEASE_TARGETS.join(', ')}.`);
75
77
  return target;
76
78
  };
79
+ const assertEnvelopeKind = (value)=>{
80
+ if (value !== external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_KIND && value !== external_types_js_namespaceObject.SHELL_RELEASE_ENVELOPE_KIND) throw new Error(`envelope.kind must be "${external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_KIND}" or "${external_types_js_namespaceObject.SHELL_RELEASE_ENVELOPE_KIND}".`);
81
+ return value;
82
+ };
77
83
  const assertReleaseIdentity = (value, location = 'identity')=>{
78
84
  const identity = assertRecord(value, location);
79
85
  assertExactKeys(identity, [
@@ -232,7 +238,7 @@ const assertUniqueSortedArtifacts = (artifacts, location)=>{
232
238
  if (paths.some((logicalPath, index)=>logicalPath !== sorted[index])) throw new Error(`${location} must be sorted by logicalPath.`);
233
239
  };
234
240
  const assertSurfacePaths = (value, location)=>{
235
- if (!Array.isArray(value) || 0 === value.length) throw new Error(`${location} must contain at least one artifact path.`);
241
+ if (!Array.isArray(value)) throw new Error(`${location} must be an array of artifact paths.`);
236
242
  const paths = value.map((item, index)=>assertNormalizedLogicalPath(item, `${location}[${index}]`));
237
243
  const sorted = [
238
244
  ...paths
@@ -241,26 +247,51 @@ const assertSurfacePaths = (value, location)=>{
241
247
  if (new Set(paths).size !== paths.length) throw new Error(`${location} must not contain duplicate artifact paths.`);
242
248
  return paths;
243
249
  };
244
- const assertSurfaces = (value)=>{
250
+ const assertSurfaces = (value, kind)=>{
245
251
  const surfaces = assertRecord(value, 'surfaces');
246
252
  assertExactKeys(surfaces, [
247
253
  'uiClient',
248
254
  'ssr',
249
255
  'apiBackend',
250
- 'backendFederation'
256
+ ...kind !== external_types_js_namespaceObject.SHELL_RELEASE_ENVELOPE_KIND && Object.hasOwn(surfaces, 'backendFederation') ? [
257
+ 'backendFederation'
258
+ ] : []
251
259
  ], 'surfaces');
252
- const backendFederation = assertRecord(surfaces.backendFederation, 'surfaces.backendFederation');
253
- assertExactKeys(backendFederation, [
260
+ const backendFederation = Object.hasOwn(surfaces, 'backendFederation') ? assertRecord(surfaces.backendFederation, 'surfaces.backendFederation') : void 0;
261
+ if (backendFederation) assertExactKeys(backendFederation, [
254
262
  'manifest',
255
263
  'container'
256
264
  ], 'surfaces.backendFederation');
265
+ const uiClient = assertSurfacePaths(surfaces.uiClient, 'surfaces.uiClient');
266
+ const ssr = assertSurfacePaths(surfaces.ssr, 'surfaces.ssr');
267
+ const apiBackend = assertSurfacePaths(surfaces.apiBackend, 'surfaces.apiBackend');
268
+ if (uiClient.length > 0 && 0 === ssr.length) throw new Error('surfaces.ssr must contain at least one artifact path when UI/client is declared.');
269
+ if (ssr.length > 0 && 0 === uiClient.length) throw new Error('surfaces.uiClient must contain at least one artifact path when SSR is declared.');
270
+ if (0 === apiBackend.length && (backendFederation || 0 === uiClient.length)) throw new Error('surfaces.apiBackend must contain at least one artifact path.');
271
+ if (kind === external_types_js_namespaceObject.SHELL_RELEASE_ENVELOPE_KIND) {
272
+ if (0 === uiClient.length || 0 === ssr.length) throw new Error('Shell surfaces.uiClient and surfaces.ssr must each contain at least one artifact path.');
273
+ return {
274
+ kind,
275
+ surfaces: {
276
+ uiClient,
277
+ ssr,
278
+ apiBackend
279
+ }
280
+ };
281
+ }
282
+ if (apiBackend.length > 0 && !backendFederation) throw new Error('surfaces.backendFederation is required when API/backend is declared.');
257
283
  return {
258
- uiClient: assertSurfacePaths(surfaces.uiClient, 'surfaces.uiClient'),
259
- ssr: assertSurfacePaths(surfaces.ssr, 'surfaces.ssr'),
260
- apiBackend: assertSurfacePaths(surfaces.apiBackend, 'surfaces.apiBackend'),
261
- backendFederation: {
262
- manifest: assertNormalizedLogicalPath(backendFederation.manifest, 'surfaces.backendFederation.manifest'),
263
- container: assertNormalizedLogicalPath(backendFederation.container, 'surfaces.backendFederation.container')
284
+ kind,
285
+ surfaces: {
286
+ uiClient,
287
+ ssr,
288
+ apiBackend,
289
+ ...backendFederation ? {
290
+ backendFederation: {
291
+ manifest: assertNormalizedLogicalPath(backendFederation.manifest, 'surfaces.backendFederation.manifest'),
292
+ container: assertNormalizedLogicalPath(backendFederation.container, 'surfaces.backendFederation.container')
293
+ }
294
+ } : {}
264
295
  }
265
296
  };
266
297
  };
@@ -270,12 +301,14 @@ const assertSurfaceReferences = (artifacts, surfaces)=>{
270
301
  uiClient: surfaces.uiClient,
271
302
  ssr: surfaces.ssr,
272
303
  apiBackend: surfaces.apiBackend,
273
- 'backendFederation.manifest': [
274
- surfaces.backendFederation.manifest
275
- ],
276
- 'backendFederation.container': [
277
- surfaces.backendFederation.container
278
- ]
304
+ ...'backendFederation' in surfaces && surfaces.backendFederation ? {
305
+ 'backendFederation.manifest': [
306
+ surfaces.backendFederation.manifest
307
+ ],
308
+ 'backendFederation.container': [
309
+ surfaces.backendFederation.container
310
+ ]
311
+ } : {}
279
312
  }))for (const logicalPath of paths)if (!artifactPaths.has(logicalPath)) throw new Error(`surfaces.${surface} references unbound artifact "${logicalPath}".`);
280
313
  };
281
314
  const assertTargetSurfaceContract = (target, artifacts, surfaces)=>{
@@ -293,12 +326,14 @@ const assertTargetSurfaceContract = (target, artifacts, surfaces)=>{
293
326
  assertRuntime(surfaces.uiClient, 'browser', 'UI/client');
294
327
  assertRuntime(surfaces.ssr, 'node' === target ? 'nodejs' : 'workerd', 'SSR');
295
328
  assertRuntime(surfaces.apiBackend, 'node' === target ? 'nodejs' : 'workerd-effect', 'API/backend');
296
- assertRuntime([
297
- surfaces.backendFederation.manifest
298
- ], 'module-federation-manifest', 'backend federation manifest');
299
- assertRuntime([
300
- surfaces.backendFederation.container
301
- ], 'node' === target ? 'nodejs' : 'commonjs-module', 'backend federation container');
329
+ if ('backendFederation' in surfaces && surfaces.backendFederation) {
330
+ assertRuntime([
331
+ surfaces.backendFederation.manifest
332
+ ], 'module-federation-manifest', 'backend federation manifest');
333
+ assertRuntime([
334
+ surfaces.backendFederation.container
335
+ ], 'node' === target ? 'nodejs' : 'commonjs-module', 'backend federation container');
336
+ }
302
337
  };
303
338
  const deepFreeze = (value)=>{
304
339
  if (null !== value && 'object' == typeof value && !Object.isFrozen(value)) {
@@ -307,6 +342,51 @@ const deepFreeze = (value)=>{
307
342
  }
308
343
  return value;
309
344
  };
345
+ const assertReleaseUi = (value, identity, surfaces)=>{
346
+ if (0 === surfaces.uiClient.length) {
347
+ if (void 0 !== value) throw new Error('envelope.ui is forbidden for an API-only release.');
348
+ return;
349
+ }
350
+ const ui = assertRecord(value, 'envelope.ui');
351
+ assertExactKeys(ui, [
352
+ 'rendererIdentity',
353
+ 'rendererProfile',
354
+ 'routerBindings'
355
+ ], 'envelope.ui');
356
+ const routerBindings = assertRecord(ui.routerBindings, 'envelope.ui.routerBindings');
357
+ const errors = [
358
+ ...(0, backend_federation_contracts_namespaceObject.validateRendererIdentity)(ui.rendererIdentity, 'envelope.ui.rendererIdentity').errors,
359
+ ...(0, backend_federation_contracts_namespaceObject.validateRendererProfile)(ui.rendererProfile, 'envelope.ui.rendererProfile').errors,
360
+ ...(0, backend_federation_contracts_namespaceObject.validateRendererRouterBindings)(routerBindings, Object.keys(routerBindings), 'envelope.ui.routerBindings').errors
361
+ ];
362
+ if (errors.length > 0) throw new Error((0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(errors));
363
+ const rendererIdentity = ui.rendererIdentity;
364
+ const rendererProfile = ui.rendererProfile;
365
+ if (!Object.hasOwn(routerBindings, rendererIdentity.entryName)) throw new Error('envelope.ui.routerBindings must include the primary rendererIdentity.entryName.');
366
+ if (rendererIdentity.buildId !== identity.buildMarker) throw new Error('envelope.ui.rendererIdentity.buildId must match identity.buildMarker.');
367
+ for (const field of [
368
+ 'renderer',
369
+ 'protocolVersion'
370
+ ])if (rendererIdentity[field] !== rendererProfile[field]) throw new Error(`envelope.ui.rendererProfile.${field} must match rendererIdentity.${field}.`);
371
+ return {
372
+ rendererIdentity: {
373
+ ...rendererIdentity
374
+ },
375
+ rendererProfile: {
376
+ ...rendererProfile,
377
+ compiler: {
378
+ ...rendererProfile.compiler
379
+ },
380
+ hydration: {
381
+ ...rendererProfile.hydration
382
+ },
383
+ router: {
384
+ ...rendererProfile.router
385
+ }
386
+ },
387
+ routerBindings: (0, backend_federation_contracts_namespaceObject.immutableRendererRouterBindings)(routerBindings)
388
+ };
389
+ };
310
390
  const assertEnvelope = (value)=>{
311
391
  const envelope = assertRecord(value, 'envelope');
312
392
  assertExactKeys(envelope, [
@@ -314,26 +394,35 @@ const assertEnvelope = (value)=>{
314
394
  'kind',
315
395
  'target',
316
396
  'identity',
397
+ ...Object.hasOwn(envelope, 'ui') ? [
398
+ 'ui'
399
+ ] : [],
317
400
  'artifacts',
318
401
  'surfaces',
319
402
  'envelopeDigest'
320
403
  ], 'envelope');
321
404
  if (envelope.schemaVersion !== external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION) throw new Error(`envelope.schemaVersion must be ${external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION}.`);
322
- if (envelope.kind !== external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_KIND) throw new Error(`envelope.kind must be "${external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_KIND}".`);
405
+ const kind = assertEnvelopeKind(envelope.kind);
323
406
  if (!Array.isArray(envelope.artifacts) || 0 === envelope.artifacts.length) throw new Error('envelope.artifacts must contain at least one artifact.');
324
407
  const artifacts = envelope.artifacts.map((artifact, index)=>assertReleaseArtifact(artifact, `envelope.artifacts[${index}]`));
325
408
  assertUniqueSortedArtifacts(artifacts, 'envelope.artifacts');
326
409
  const target = assertTarget(envelope.target, 'envelope.target');
327
- const surfaces = assertSurfaces(envelope.surfaces);
410
+ const releaseSurfaces = assertSurfaces(envelope.surfaces, kind);
411
+ const { surfaces } = releaseSurfaces;
412
+ if (0 === surfaces.uiClient.length && Object.hasOwn(envelope, 'ui')) throw new Error('envelope.ui is forbidden for an API-only release.');
328
413
  assertSurfaceReferences(artifacts, surfaces);
329
414
  assertTargetSurfaceContract(target, artifacts, surfaces);
415
+ const identity = assertReleaseIdentity(envelope.identity, 'envelope.identity');
416
+ const ui = assertReleaseUi(envelope.ui, identity, surfaces);
330
417
  const parsed = {
418
+ ...releaseSurfaces,
331
419
  schemaVersion: external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION,
332
- kind: external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_KIND,
333
420
  target,
334
- identity: assertReleaseIdentity(envelope.identity, 'envelope.identity'),
421
+ identity,
422
+ ...ui ? {
423
+ ui
424
+ } : {},
335
425
  artifacts,
336
- surfaces,
337
426
  envelopeDigest: assertNonEmptyString(envelope.envelopeDigest, 'envelope.envelopeDigest')
338
427
  };
339
428
  if (!SHA256_PATTERN.test(parsed.envelopeDigest)) throw new Error('envelope.envelopeDigest must be a lowercase SHA-256 digest.');
@@ -341,36 +430,59 @@ const assertEnvelope = (value)=>{
341
430
  if (parsed.envelopeDigest !== expectedDigest) throw new Error('envelope.envelopeDigest does not match canonical payload.');
342
431
  return parsed;
343
432
  };
344
- const createMicroVerticalReleaseEnvelope = async (input)=>{
433
+ async function createMicroVerticalReleaseEnvelope(input) {
345
434
  const artifactRoot = await promises_default().realpath(external_node_path_default().resolve(input.artifactRoot));
346
435
  const target = assertTarget(input.target);
347
436
  const identity = assertReleaseIdentity(input.identity);
437
+ const kind = assertEnvelopeKind(void 0 === input.kind ? external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_KIND : input.kind);
348
438
  if (!Array.isArray(input.artifacts) || 0 === input.artifacts.length) throw new Error('artifacts must contain at least one artifact.');
349
439
  const inputs = input.artifacts.map((artifact, index)=>assertArtifactInput(artifact, `artifacts[${index}]`));
350
440
  const sortedInputs = [
351
441
  ...inputs
352
442
  ].sort((left, right)=>left.logicalPath.localeCompare(right.logicalPath));
353
443
  assertUniqueSortedArtifacts(sortedInputs, 'artifacts');
354
- const surfaces = assertSurfaces(input.surfaces);
444
+ const releaseSurfaces = assertSurfaces(input.surfaces, kind);
445
+ const { surfaces } = releaseSurfaces;
446
+ if (0 === surfaces.uiClient.length && Object.hasOwn(input, 'ui')) throw new Error('envelope.ui is forbidden for an API-only release.');
355
447
  assertSurfaceReferences(sortedInputs, surfaces);
356
448
  assertTargetSurfaceContract(target, sortedInputs, surfaces);
449
+ const ui = assertReleaseUi(input.ui, identity, surfaces);
357
450
  const artifacts = await Promise.all(sortedInputs.map((artifact)=>readFinalArtifact(artifactRoot, artifact)));
358
451
  assertTargetSurfaceContract(target, artifacts, surfaces);
359
452
  const payload = {
453
+ ...releaseSurfaces,
360
454
  schemaVersion: external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION,
361
- kind: external_types_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_KIND,
362
455
  target,
363
456
  identity,
364
- artifacts,
365
- surfaces
457
+ ...ui ? {
458
+ ui
459
+ } : {},
460
+ artifacts
366
461
  };
367
462
  return deepFreeze({
368
463
  ...payload,
369
464
  envelopeDigest: (0, external_canonical_js_namespaceObject.digestMicroVerticalReleaseEnvelopePayload)(payload)
370
465
  });
371
- };
372
- const verifyMicroVerticalReleaseEnvelope = async (value, options)=>{
466
+ }
467
+ async function verifyMicroVerticalReleaseEnvelope(value, options) {
373
468
  const envelope = assertEnvelope(value);
469
+ if (void 0 !== options.expectedRendererProfile) {
470
+ const result = (0, backend_federation_contracts_namespaceObject.validateRendererProfileCompatibility)(options.expectedRendererProfile, envelope.ui?.rendererProfile, 'envelope.ui.rendererProfile');
471
+ if (!result.ok) throw new Error((0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(result.errors));
472
+ }
473
+ if (void 0 !== options.expectedRendererIdentity) {
474
+ const expected = options.expectedRendererIdentity;
475
+ const result = (0, backend_federation_contracts_namespaceObject.validateRendererIdentity)(expected, 'expectedRendererIdentity');
476
+ if (!result.ok) throw new Error((0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(result.errors));
477
+ for (const field of [
478
+ 'renderer',
479
+ 'protocolVersion',
480
+ 'appId',
481
+ 'entryName',
482
+ 'buildId'
483
+ ])if (envelope.ui?.rendererIdentity[field] !== expected[field]) throw new Error(`envelope.ui.rendererIdentity.${field} must match the consuming renderer identity.`);
484
+ }
485
+ if (void 0 !== options.expectedKind && envelope.kind !== options.expectedKind) throw new Error(`envelope.kind must be "${options.expectedKind}" for this release owner; received "${envelope.kind}".`);
374
486
  if (void 0 !== options.expectedTarget && envelope.target !== options.expectedTarget) throw new Error(`envelope.target must be "${options.expectedTarget}" for this staging target; received "${envelope.target}".`);
375
487
  const artifactRoot = await promises_default().realpath(external_node_path_default().resolve(options.artifactRoot));
376
488
  for (const artifact of envelope.artifacts){
@@ -379,10 +491,11 @@ const verifyMicroVerticalReleaseEnvelope = async (value, options)=>{
379
491
  if (!matches) throw new Error('file' === artifact.kind && 'file' === finalArtifact.kind ? `Artifact "${artifact.logicalPath}" digest does not match final artifact bytes.` : `Artifact "${artifact.logicalPath}" does not match its final filesystem binding.`);
380
492
  }
381
493
  return deepFreeze(envelope);
382
- };
494
+ }
383
495
  exports.MICROVERTICAL_RELEASE_ENVELOPE_KIND = __webpack_exports__.MICROVERTICAL_RELEASE_ENVELOPE_KIND;
384
496
  exports.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION = __webpack_exports__.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION;
385
497
  exports.MICROVERTICAL_RELEASE_TARGETS = __webpack_exports__.MICROVERTICAL_RELEASE_TARGETS;
498
+ exports.SHELL_RELEASE_ENVELOPE_KIND = __webpack_exports__.SHELL_RELEASE_ENVELOPE_KIND;
386
499
  exports.canonicalSerializeMicroVerticalReleaseEnvelope = __webpack_exports__.canonicalSerializeMicroVerticalReleaseEnvelope;
387
500
  exports.createMicroVerticalReleaseEnvelope = __webpack_exports__.createMicroVerticalReleaseEnvelope;
388
501
  exports.verifyMicroVerticalReleaseEnvelope = __webpack_exports__.verifyMicroVerticalReleaseEnvelope;
@@ -390,6 +503,7 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
390
503
  "MICROVERTICAL_RELEASE_ENVELOPE_KIND",
391
504
  "MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION",
392
505
  "MICROVERTICAL_RELEASE_TARGETS",
506
+ "SHELL_RELEASE_ENVELOPE_KIND",
393
507
  "canonicalSerializeMicroVerticalReleaseEnvelope",
394
508
  "createMicroVerticalReleaseEnvelope",
395
509
  "verifyMicroVerticalReleaseEnvelope"
@@ -41,50 +41,59 @@ __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 public_assets_js_namespaceObject = require("../deploy-output/public-assets.js");
45
+ const target_js_namespaceObject = require("../deploy-output/target.js");
44
46
  const external_framework_output_js_namespaceObject = require("./framework-output.js");
45
- const resolveActiveDeployTarget = (api, resolveDeployTarget)=>{
46
- const { metaName } = api.getAppContext();
47
- const config = api.getNormalizedConfig();
48
- if ('modern-js' !== metaName && !config.deploy?.target && !process.env.MODERNJS_DEPLOY) return;
49
- return resolveDeployTarget(config);
50
- };
51
- const createUltramodernReleaseEnvelopePlugin = ({ resolveDeployTarget })=>({
47
+ const createUltramodernReleaseEnvelopePlugin = ({ resolveRendererProfile } = {})=>({
52
48
  name: '@modern-js/ultramodern-release-envelope',
53
49
  pre: [
54
50
  '@modern-js/backend-federation-build',
55
51
  '@modern-js/plugin-bff',
56
- '@modern-js/deploy-output-aliases'
52
+ '@modern-js/deploy-output-aliases',
53
+ '@modern-js/deploy-output-public-assets'
57
54
  ],
58
55
  post: [
59
56
  '@modern-js/plugin-deploy'
60
57
  ],
61
58
  setup (api) {
62
- const emitBuildEnvelope = async (target)=>{
63
- const { apiOnly, distDirectory } = api.getAppContext();
59
+ const emitBuildEnvelope = async (target, requirePromotable = true)=>{
60
+ const { apiOnly, appDirectory, distDirectory } = api.getAppContext();
64
61
  await (0, external_framework_output_js_namespaceObject.emitFrameworkMicroVerticalReleaseEnvelope)({
65
62
  apiOnly,
63
+ appDirectory,
66
64
  distDirectory,
67
- target
65
+ role: api.getNormalizedConfig().deploy?.releaseEnvelopeRole,
66
+ requirePromotable,
67
+ target,
68
+ ...!apiOnly && resolveRendererProfile ? {
69
+ expectedRendererProfile: resolveRendererProfile(api.getNormalizedConfig())
70
+ } : {}
68
71
  });
69
72
  };
70
73
  api.onAfterBuild(async ()=>{
71
- const configuredTarget = resolveDeployTarget(api.getNormalizedConfig());
74
+ const configuredTarget = api.getAppContext().deployTarget?.target;
72
75
  if ('node' !== configuredTarget && 'cloudflare' !== configuredTarget) return;
73
- await emitBuildEnvelope(configuredTarget);
76
+ await emitBuildEnvelope(configuredTarget, false);
74
77
  });
75
78
  api.onBeforeDeploy(async ()=>{
76
- const configuredTarget = resolveActiveDeployTarget(api, resolveDeployTarget);
79
+ const configuredTarget = (0, target_js_namespaceObject.getDeployingTarget)(api.getAppContext());
77
80
  if ('node' !== configuredTarget) return;
78
81
  await emitBuildEnvelope(configuredTarget);
79
82
  const { distDirectory } = api.getAppContext();
80
83
  await (0, external_framework_output_js_namespaceObject.verifyBuildOutputReleaseEnvelope)(distDirectory, configuredTarget);
81
84
  });
82
85
  api.onAfterDeploy(async ()=>{
83
- const configuredTarget = resolveActiveDeployTarget(api, resolveDeployTarget);
86
+ const configuredTarget = (0, target_js_namespaceObject.getDeployingTarget)(api.getAppContext());
84
87
  if ('node' !== configuredTarget) return;
85
88
  const { appDirectory, distDirectory } = api.getAppContext();
86
89
  const outputDirectory = external_node_path_default().join(appDirectory, '.output');
87
90
  const releaseEnvelope = await (0, external_framework_output_js_namespaceObject.emitNodeStagedReleaseEnvelope)({
91
+ declaredPublicAssets: await (0, public_assets_js_namespaceObject.resolveAddedDeclaredPublicAssetPaths)({
92
+ appDirectory,
93
+ assets: (0, public_assets_js_namespaceObject.normalizeDeclaredPublicAssets)(api.getNormalizedConfig().deploy?.node?.publicAssets, public_assets_js_namespaceObject.NODE_PUBLIC_ASSET_SCOPE),
94
+ generatedRoot: distDirectory,
95
+ scope: public_assets_js_namespaceObject.NODE_PUBLIC_ASSET_SCOPE
96
+ }),
88
97
  distDirectory,
89
98
  outputDirectory
90
99
  });
@@ -0,0 +1,170 @@
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
+ emitRendererBuildArtifact: ()=>emitRendererBuildArtifact,
41
+ rendererBuildArtifactStampPlugin: ()=>rendererBuildArtifactStampPlugin,
42
+ stampFinalizedRendererBuildArtifact: ()=>stampFinalizedRendererBuildArtifact,
43
+ validateFinalizedRendererBuild: ()=>validateFinalizedRendererBuild
44
+ });
45
+ const external_node_crypto_namespaceObject = require("node:crypto");
46
+ const promises_namespaceObject = require("node:fs/promises");
47
+ var promises_default = /*#__PURE__*/ __webpack_require__.n(promises_namespaceObject);
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 external_node_util_namespaceObject = require("node:util");
51
+ const backend_federation_contracts_namespaceObject = require("@modern-js/backend-federation-contracts");
52
+ const validateFinalizedRendererBuild = (output, context, appId)=>{
53
+ const entryNames = context.entrypoints.map((entry)=>entry.entryName);
54
+ const primary = context.entrypoints.find((entry)=>entry.isMainEntry) ?? context.entrypoints[0];
55
+ const errors = [
56
+ ...(0, backend_federation_contracts_namespaceObject.validateRendererIdentity)(output.ui.rendererIdentity).errors,
57
+ ...(0, backend_federation_contracts_namespaceObject.validateRendererProfile)(output.ui.rendererProfile).errors,
58
+ ...(0, backend_federation_contracts_namespaceObject.validateRendererRouterBindings)(output.ui.routerBindings, entryNames, 'routerBindings').errors
59
+ ];
60
+ if (errors.length) throw new Error((0, backend_federation_contracts_namespaceObject.formatBackendFederationValidationErrors)(errors));
61
+ if (!primary || new Set(entryNames).size !== entryNames.length || context.entrypoints.filter((entry)=>entry.isMainEntry).length > 1 || output.ui.rendererIdentity.entryName !== primary.entryName || output.ui.rendererIdentity.appId !== appId || output.ui.rendererIdentity.buildId !== output.buildMarker || output.ui.rendererIdentity.renderer !== output.ui.rendererProfile.renderer) throw new Error('Finalized renderer output conflicts with the actual application entries and release identity.');
62
+ };
63
+ const stampFinalizedRendererBuildArtifact = (artifact, output, context)=>{
64
+ (0, backend_federation_contracts_namespaceObject.assertUltramodernBuildArtifact)(artifact);
65
+ const ui = artifact.surfaces.ui;
66
+ if (!ui) throw new Error('Finalized renderer output requires a declared UI artifact');
67
+ validateFinalizedRendererBuild(output, context, artifact.deliveryUnit.appId);
68
+ const drifted = [
69
+ !(0, external_node_util_namespaceObject.isDeepStrictEqual)({
70
+ ...ui.rendererIdentity,
71
+ buildId: output.ui.rendererIdentity.buildId
72
+ }, output.ui.rendererIdentity) && `rendererIdentity (captured entry ${ui.rendererIdentity.entryName}, built entry ${output.ui.rendererIdentity.entryName})`,
73
+ !(0, external_node_util_namespaceObject.isDeepStrictEqual)(ui.rendererProfile, output.ui.rendererProfile) && 'rendererProfile',
74
+ !(0, external_node_util_namespaceObject.isDeepStrictEqual)(ui.routerBindings, output.ui.routerBindings) && `routerBindings (captured entries ${Object.keys(ui.routerBindings).join(', ')}, built entries ${Object.keys(output.ui.routerBindings).join(', ')})`
75
+ ].filter(Boolean);
76
+ if (drifted.length) throw new Error(`Finalized renderer output conflicts with the captured application profile or router bindings: ${drifted.join('; ')} differ from ${backend_federation_contracts_namespaceObject.ULTRAMODERN_BUILD_ARTIFACT_PATH}. After changing modern.config entries, renderer or router, recapture it with \`ultramodern-create ultramodern sync-delivery-unit\`.`);
77
+ const identity = {
78
+ buildMarker: output.buildMarker,
79
+ sourceRevision: output.sourceRevision
80
+ };
81
+ const stamped = (0, backend_federation_contracts_namespaceObject.stampUltramodernBuildArtifactIdentity)(artifact, identity);
82
+ return (0, backend_federation_contracts_namespaceObject.stampUltramodernBuildArtifactIdentity)({
83
+ ...stamped,
84
+ surfaces: {
85
+ ...stamped.surfaces,
86
+ ui: {
87
+ ...stamped.surfaces.ui,
88
+ ...output.ui
89
+ }
90
+ }
91
+ }, identity);
92
+ };
93
+ async function writeOwnedArtifact(file, bytes) {
94
+ await promises_default().mkdir(external_node_path_default().dirname(file), {
95
+ recursive: true
96
+ });
97
+ const temporary = `${file}.${(0, external_node_crypto_namespaceObject.randomUUID)()}.tmp`;
98
+ let created = false;
99
+ try {
100
+ const handle = await promises_default().open(temporary, 'wx');
101
+ created = true;
102
+ try {
103
+ await handle.writeFile(bytes);
104
+ } finally{
105
+ await handle.close();
106
+ }
107
+ await promises_default().rename(temporary, file);
108
+ } finally{
109
+ if (created) await promises_default().rm(temporary, {
110
+ force: true
111
+ });
112
+ }
113
+ }
114
+ async function emitRendererBuildArtifact(context, options) {
115
+ const source = external_node_path_default().join(context.appDirectory, backend_federation_contracts_namespaceObject.ULTRAMODERN_BUILD_ARTIFACT_PATH);
116
+ const bytes = await promises_default().readFile(source).catch((error)=>{
117
+ if ('ENOENT' === error.code) return;
118
+ throw error;
119
+ });
120
+ if (!bytes) {
121
+ const declaration = await promises_default().stat(source.replace(/\.json$/u, '.ts')).catch((error)=>{
122
+ if ('ENOENT' === error.code) return;
123
+ throw error;
124
+ });
125
+ if (declaration) throw new Error('Generated UI artifact declaration is missing its build carrier');
126
+ return;
127
+ }
128
+ const artifact = JSON.parse(bytes.toString('utf8'));
129
+ (0, backend_federation_contracts_namespaceObject.assertUltramodernBuildArtifact)(artifact);
130
+ const finalized = await options.resolveRendererBuild(context);
131
+ const stamped = stampFinalizedRendererBuildArtifact(artifact, finalized, context);
132
+ const serialized = `${JSON.stringify(stamped, null, 2)}\n`;
133
+ for (const directory of [
134
+ context.distDirectory,
135
+ external_node_path_default().join(context.distDirectory, 'public')
136
+ ])await writeOwnedArtifact(external_node_path_default().join(directory, backend_federation_contracts_namespaceObject.ULTRAMODERN_BUILD_ARTIFACT_FILE), serialized);
137
+ return stamped;
138
+ }
139
+ function rendererBuildArtifactStampPlugin(options) {
140
+ if ('string' != typeof options.rendererBuildPlugin || !options.rendererBuildPlugin || options.rendererBuildPlugin.trim() !== options.rendererBuildPlugin || 'function' != typeof options.resolveRendererBuild) throw new Error('Renderer artifact stamping requires its owning metadata producer');
141
+ return {
142
+ name: '@modern-js/renderer-build-artifact-stamp',
143
+ pre: [
144
+ options.rendererBuildPlugin
145
+ ],
146
+ required: [
147
+ options.rendererBuildPlugin
148
+ ],
149
+ setup (api) {
150
+ api.onAfterBuild(async ()=>{
151
+ const context = api.getAppContext();
152
+ if (context.apiOnly) return;
153
+ await emitRendererBuildArtifact(context, options);
154
+ });
155
+ }
156
+ };
157
+ }
158
+ exports.emitRendererBuildArtifact = __webpack_exports__.emitRendererBuildArtifact;
159
+ exports.rendererBuildArtifactStampPlugin = __webpack_exports__.rendererBuildArtifactStampPlugin;
160
+ exports.stampFinalizedRendererBuildArtifact = __webpack_exports__.stampFinalizedRendererBuildArtifact;
161
+ exports.validateFinalizedRendererBuild = __webpack_exports__.validateFinalizedRendererBuild;
162
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
163
+ "emitRendererBuildArtifact",
164
+ "rendererBuildArtifactStampPlugin",
165
+ "stampFinalizedRendererBuildArtifact",
166
+ "validateFinalizedRendererBuild"
167
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
168
+ Object.defineProperty(exports, '__esModule', {
169
+ value: true
170
+ });
@@ -27,24 +27,26 @@ var __webpack_require__ = {};
27
27
  })();
28
28
  var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
- const MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION = 3;
31
- const MICROVERTICAL_RELEASE_ENVELOPE_KIND = 'ultramodern-target-microvertical-release-envelope';
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ MICROVERTICAL_RELEASE_ENVELOPE_KIND: ()=>external_contract_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_KIND,
32
+ MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION: ()=>external_contract_js_namespaceObject.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION,
33
+ MICROVERTICAL_RELEASE_TARGETS: ()=>MICROVERTICAL_RELEASE_TARGETS,
34
+ SHELL_RELEASE_ENVELOPE_KIND: ()=>external_contract_js_namespaceObject.SHELL_RELEASE_ENVELOPE_KIND
35
+ });
36
+ const external_contract_js_namespaceObject = require("./contract.js");
32
37
  const MICROVERTICAL_RELEASE_TARGETS = [
33
38
  'node',
34
39
  'cloudflare'
35
40
  ];
36
- __webpack_require__.d(__webpack_exports__, {}, {
37
- MICROVERTICAL_RELEASE_ENVELOPE_KIND: MICROVERTICAL_RELEASE_ENVELOPE_KIND,
38
- MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION: MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION,
39
- MICROVERTICAL_RELEASE_TARGETS: MICROVERTICAL_RELEASE_TARGETS
40
- });
41
41
  exports.MICROVERTICAL_RELEASE_ENVELOPE_KIND = __webpack_exports__.MICROVERTICAL_RELEASE_ENVELOPE_KIND;
42
42
  exports.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION = __webpack_exports__.MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION;
43
43
  exports.MICROVERTICAL_RELEASE_TARGETS = __webpack_exports__.MICROVERTICAL_RELEASE_TARGETS;
44
+ exports.SHELL_RELEASE_ENVELOPE_KIND = __webpack_exports__.SHELL_RELEASE_ENVELOPE_KIND;
44
45
  for(var __rspack_i in __webpack_exports__)if (-1 === [
45
46
  "MICROVERTICAL_RELEASE_ENVELOPE_KIND",
46
47
  "MICROVERTICAL_RELEASE_ENVELOPE_SCHEMA_VERSION",
47
- "MICROVERTICAL_RELEASE_TARGETS"
48
+ "MICROVERTICAL_RELEASE_TARGETS",
49
+ "SHELL_RELEASE_ENVELOPE_KIND"
48
50
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
49
51
  Object.defineProperty(exports, '__esModule', {
50
52
  value: true
@@ -34,13 +34,16 @@ __webpack_require__.d(__webpack_exports__, {
34
34
  });
35
35
  const external_node_child_process_namespaceObject = require("node:child_process");
36
36
  const external_node_crypto_namespaceObject = require("node:crypto");
37
+ const invokeGit = external_node_child_process_namespaceObject.execFileSync;
37
38
  const BUILD_MARKER_NAMESPACE = 'ultramodern-delivery-unit-release-build-marker:v1';
38
39
  const PROMOTABLE_SOURCE_REVISION_PATTERN = /^(?:[a-f0-9]{40}|[a-f0-9]{64})$/u;
40
+ const workspaceGitEnv = ()=>Object.fromEntries(Object.entries(process.env).filter(([name])=>!name.toUpperCase().startsWith('GIT_')));
39
41
  const gitOutput = (workspaceRoot, args)=>{
40
42
  try {
41
- return (0, external_node_child_process_namespaceObject.execFileSync)('git', args, {
43
+ return invokeGit('git', args, {
42
44
  cwd: workspaceRoot,
43
45
  encoding: 'utf8',
46
+ env: workspaceGitEnv(),
44
47
  stdio: [
45
48
  'ignore',
46
49
  'pipe',
@@ -52,9 +55,9 @@ const gitOutput = (workspaceRoot, args)=>{
52
55
  }
53
56
  };
54
57
  const createUltramodernReleaseBuildMarker = ({ generationBuildMarker, sourceRevision, unitId })=>(0, external_node_crypto_namespaceObject.createHash)('sha256').update(`${BUILD_MARKER_NAMESPACE}:${unitId}:${generationBuildMarker}:${sourceRevision}`).digest('hex').slice(0, 16);
55
- const resolveUltramodernSourceRevision = (workspaceRoot = process.cwd(), configuredSourceRevision)=>{
58
+ const resolveUltramodernSourceRevision = (workspaceRoot = process.cwd(), configuredSourceRevision, environment = process.env)=>{
56
59
  const configuredArgumentValue = configuredSourceRevision?.trim();
57
- const configuredEnvironmentValue = process.env.ULTRAMODERN_SOURCE_REVISION?.trim();
60
+ const configuredEnvironmentValue = environment.ULTRAMODERN_SOURCE_REVISION?.trim();
58
61
  const configuredArgument = configuredArgumentValue && 'workspace' !== configuredArgumentValue ? configuredArgumentValue : void 0;
59
62
  const configuredEnvironment = configuredEnvironmentValue && 'workspace' !== configuredEnvironmentValue ? configuredEnvironmentValue : void 0;
60
63
  if (configuredArgument && configuredEnvironment && configuredArgument !== configuredEnvironment) throw new Error(`Configured source revision ${configuredArgument} does not match environment source revision ${configuredEnvironment}.`);
@@ -82,9 +85,9 @@ const resolveUltramodernSourceRevision = (workspaceRoot = process.cwd(), configu
82
85
  if (configured && configured !== revision) throw new Error(`Configured source revision ${configured} does not match clean Git HEAD ${revision}.`);
83
86
  return revision;
84
87
  };
85
- const resolveUltramodernReleaseIdentity = ({ generationBuildMarker, sourceRevision: configuredSourceRevision, unitId, workspaceRoot })=>{
88
+ const resolveUltramodernReleaseIdentity = ({ generationBuildMarker, sourceRevision: configuredSourceRevision, unitId, workspaceRoot, environment })=>{
86
89
  const explicitSourceRevision = configuredSourceRevision?.trim();
87
- const sourceRevision = resolveUltramodernSourceRevision(workspaceRoot, explicitSourceRevision);
90
+ const sourceRevision = resolveUltramodernSourceRevision(workspaceRoot, explicitSourceRevision, environment);
88
91
  return {
89
92
  buildMarker: 'workspace' === sourceRevision ? generationBuildMarker : createUltramodernReleaseBuildMarker({
90
93
  generationBuildMarker,