@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
@@ -18,60 +18,24 @@ import {
18
18
  validateUltramodernBuildArtifact,
19
19
  } from '@modern-js/backend-federation-contracts';
20
20
 
21
- export const COMPACT_CONFIG_PATH = '.modernjs/ultramodern.json';
22
-
23
- export type CompactApp = {
24
- id?: unknown;
25
- kind?: unknown;
26
- path?: unknown;
27
- package?: unknown;
28
- port?: unknown;
29
- api?: {
30
- prefix?: unknown;
31
- stem?: unknown;
32
- };
33
- moduleFederation?: {
34
- name?: unknown;
35
- manifestUrl?: unknown;
36
- };
37
- backendFederation?: {
38
- name?: unknown;
39
- versionBoundary?: {
40
- ui?: {
41
- manifestUrl?: unknown;
42
- };
43
- };
44
- executionSurfaces?: {
45
- node?: {
46
- remoteName?: unknown;
47
- manifestUrl?: unknown;
48
- containerEntry?: unknown;
49
- remoteType?: unknown;
50
- };
51
- };
52
- };
53
- deliveryUnit?: {
54
- unitId?: unknown;
55
- buildMarker?: unknown;
56
- sourceRevision?: unknown;
57
- packageName?: unknown;
58
- version?: unknown;
59
- };
60
- serverExecution?: {
61
- node?: {
62
- remoteName?: unknown;
63
- manifestUrl?: unknown;
64
- containerEntry?: unknown;
65
- remoteType?: unknown;
66
- };
67
- };
68
- };
69
-
70
- export type CompactConfig = {
71
- topology?: {
72
- apps?: CompactApp[];
73
- };
74
- };
21
+ import {
22
+ DEVELOPMENT_OVERLAY_PATH,
23
+ type DevelopmentOverlay,
24
+ normalizeRelativePath,
25
+ REFERENCE_TOPOLOGY_PATH,
26
+ type ReferenceTopology,
27
+ type TopologyApp,
28
+ } from '../workspace-topology';
29
+
30
+ export {
31
+ DEVELOPMENT_OVERLAY_PATH,
32
+ type DevelopmentOverlay,
33
+ findWorkspaceRoot,
34
+ normalizeRelativePath,
35
+ REFERENCE_TOPOLOGY_PATH,
36
+ type ReferenceTopology,
37
+ type TopologyApp,
38
+ } from '../workspace-topology';
75
39
 
76
40
  export type BackendFederationApp = {
77
41
  id: string;
@@ -84,13 +48,15 @@ export type BackendFederationApp = {
84
48
  deliveryUnit?: DeliveryUnitContractBlock;
85
49
  port: number;
86
50
  apiPrefix: string;
51
+ apiProtocol: 'rest' | 'rpc';
52
+ rpcPath?: string;
87
53
  apiStem: string;
88
54
  backendName: string;
89
55
  manifestUrl: string;
90
56
  containerEntry: string;
91
57
  remoteType: string;
92
58
  uiManifestUrl?: string;
93
- compactDeliveryUnit?: {
59
+ topologyDeliveryUnit?: {
94
60
  unitId?: string;
95
61
  buildMarker?: string;
96
62
  sourceRevision?: string;
@@ -109,9 +75,6 @@ export type BackendFederationBuildIdentity = {
109
75
  artifact?: UltramodernBuildArtifact;
110
76
  };
111
77
 
112
- export const normalizeRelativePath = (value: string) =>
113
- value.replace(/\\/gu, '/').replace(/^\.\/+/u, '');
114
-
115
78
  const isRecord = (value: unknown): value is Record<string, unknown> =>
116
79
  typeof value === 'object' && value !== null;
117
80
 
@@ -169,11 +132,10 @@ const toPascalCase = (value: string) =>
169
132
  const stringValue = (value: unknown) =>
170
133
  typeof value === 'string' && value.length > 0 ? value : undefined;
171
134
 
172
- const createBackendName = (app: CompactApp, id: string) => {
135
+ const createBackendName = (app: TopologyApp, id: string) => {
173
136
  const configuredName =
174
137
  stringValue(app.backendFederation?.name) ??
175
- stringValue(app.backendFederation?.executionSurfaces?.node?.remoteName) ??
176
- stringValue(app.serverExecution?.node?.remoteName);
138
+ stringValue(app.backendFederation?.executionSurfaces?.node?.remoteName);
177
139
 
178
140
  if (configuredName) {
179
141
  return configuredName;
@@ -183,20 +145,27 @@ const createBackendName = (app: CompactApp, id: string) => {
183
145
  return mfName ? `${mfName}Backend` : `vertical${toPascalCase(id)}Backend`;
184
146
  };
185
147
 
186
- export const findWorkspaceRoot = (appDirectory: string) => {
187
- let current = appDirectory;
188
-
189
- while (true) {
190
- if (existsSync(path.join(current, COMPACT_CONFIG_PATH))) {
191
- return current;
192
- }
193
-
194
- const parent = path.dirname(current);
195
- if (parent === current) {
196
- return undefined;
197
- }
198
- current = parent;
148
+ const rebaseDefaultLocalUrl = (
149
+ value: string,
150
+ defaultPort: number,
151
+ publicOrigin: string,
152
+ ) => {
153
+ let url: URL;
154
+ try {
155
+ url = new URL(value);
156
+ } catch {
157
+ return value;
158
+ }
159
+ if (
160
+ url.protocol !== 'http:' ||
161
+ url.hostname !== 'localhost' ||
162
+ Number(url.port) !== defaultPort ||
163
+ url.username ||
164
+ url.password
165
+ ) {
166
+ return value;
199
167
  }
168
+ return `${publicOrigin}${url.pathname}${url.search}${url.hash}`;
200
169
  };
201
170
 
202
171
  export const resolveWorkspaceSourceRevision = async (workspaceRoot: string) => {
@@ -240,50 +209,121 @@ export const createStampedDeliveryUnit = (input: {
240
209
  return deliveryUnitContractBlock(record as DeliveryUnitRecord);
241
210
  };
242
211
 
243
- export const createAppFromCompactMetadata = (
212
+ export const createAppFromTopology = (
244
213
  workspaceRoot: string,
245
214
  appDirectory: string,
246
- compactApp: CompactApp,
215
+ topologyApp: TopologyApp,
216
+ overlay: DevelopmentOverlay,
217
+ packageManifest: { name?: unknown; version?: unknown },
247
218
  ): BackendFederationApp | undefined => {
248
- const id = stringValue(compactApp.id);
249
- const appPath = stringValue(compactApp.path);
219
+ const id = stringValue(topologyApp.id);
220
+ const appPath = stringValue(topologyApp.path);
250
221
 
251
- if (!id || compactApp.kind !== 'vertical' || !isRecord(compactApp.api)) {
222
+ if (
223
+ !id ||
224
+ !appPath ||
225
+ topologyApp.kind !== 'vertical' ||
226
+ !isRecord(topologyApp.api) ||
227
+ !isRecord(topologyApp.backendFederation)
228
+ ) {
252
229
  return undefined;
253
230
  }
254
231
 
255
- const directory = appPath
256
- ? normalizeRelativePath(appPath)
257
- : `verticals/${id}`;
232
+ const directory = normalizeRelativePath(appPath);
258
233
  if (path.resolve(workspaceRoot, directory) !== path.resolve(appDirectory)) {
259
234
  return undefined;
260
235
  }
261
236
 
262
- const port =
263
- typeof compactApp.port === 'number' ? compactApp.port : undefined;
264
- if (port === undefined) {
265
- return undefined;
237
+ const defaultPort = overlay.ports?.[id];
238
+ if (
239
+ typeof defaultPort !== 'number' ||
240
+ !Number.isInteger(defaultPort) ||
241
+ defaultPort < 1 ||
242
+ defaultPort > 65535
243
+ ) {
244
+ throw new Error(
245
+ `[backend-federation-build] Invalid development port for ${id}.`,
246
+ );
247
+ }
248
+ const portEnv =
249
+ stringValue(topologyApp.portEnv) ??
250
+ `VERTICAL_${(stringValue(topologyApp.domain) ?? id)
251
+ .replace(/[^a-zA-Z0-9]/gu, '_')
252
+ .toUpperCase()}_PORT`;
253
+ const port = Number(process.env[portEnv] ?? defaultPort);
254
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
255
+ throw new Error(
256
+ `[backend-federation-build] Invalid ${portEnv} development port for ${id}.`,
257
+ );
258
+ }
259
+ const publicUrlEnv = stringValue(topologyApp.cloudflare?.publicUrlEnv);
260
+ const configuredPublicUrl = publicUrlEnv
261
+ ? process.env[publicUrlEnv]?.trim()
262
+ : undefined;
263
+ let publicOrigin = `http://localhost:${port}`;
264
+ if (configuredPublicUrl) {
265
+ let url: URL;
266
+ try {
267
+ url = new URL(configuredPublicUrl);
268
+ } catch {
269
+ throw new Error(
270
+ `[backend-federation-build] Invalid ${publicUrlEnv} public URL for ${id}.`,
271
+ );
272
+ }
273
+ if (
274
+ !['http:', 'https:'].includes(url.protocol) ||
275
+ url.username ||
276
+ url.password
277
+ ) {
278
+ throw new Error(
279
+ `[backend-federation-build] Invalid ${publicUrlEnv} public URL for ${id}.`,
280
+ );
281
+ }
282
+ publicOrigin = url.origin;
266
283
  }
267
284
 
268
- const apiPrefix = stringValue(compactApp.api.prefix) ?? `/${id}-api`;
269
- const apiStem = stringValue(compactApp.api.stem) ?? id;
270
- const backendName = createBackendName(compactApp, id);
271
- const manifestUrl =
272
- stringValue(
273
- compactApp.backendFederation?.executionSurfaces?.node?.manifestUrl,
274
- ) ??
275
- stringValue(compactApp.serverExecution?.node?.manifestUrl) ??
276
- `http://localhost:${port}/${BACKEND_MANIFEST_FILE}`;
277
- const containerEntry =
278
- stringValue(
279
- compactApp.backendFederation?.executionSurfaces?.node?.containerEntry,
280
- ) ??
281
- stringValue(compactApp.serverExecution?.node?.containerEntry) ??
282
- `http://localhost:${port}/${BACKEND_REMOTE_ENTRY_FILE}`;
285
+ const apiPrefix = stringValue(topologyApp.api.bff?.prefix) ?? `/${id}-api`;
286
+ const apiProtocol = topologyApp.api.protocol ?? 'rest';
287
+ if (apiProtocol !== 'rest' && apiProtocol !== 'rpc') {
288
+ throw new Error(
289
+ `[backend-federation-build] Unsupported API protocol for ${id}.`,
290
+ );
291
+ }
292
+ const rpcPath =
293
+ apiProtocol === 'rpc' ? stringValue(topologyApp.api.rpcPath) : undefined;
294
+ if (
295
+ apiProtocol === 'rpc' &&
296
+ (!rpcPath || topologyApp.api.rpcSerialization !== 'json')
297
+ ) {
298
+ throw new Error(
299
+ `[backend-federation-build] Missing JSON RPC route metadata for ${id}.`,
300
+ );
301
+ }
302
+ const apiStem = stringValue(topologyApp.api.stem) ?? id;
303
+ const backendName = createBackendName(topologyApp, id);
304
+ const nodeOverlay = overlay.serverExecution?.[id]?.node;
305
+ if (!isRecord(nodeOverlay)) {
306
+ throw new Error(
307
+ `[backend-federation-build] Missing declared Node server execution for ${id}.`,
308
+ );
309
+ }
310
+ const manifestUrl = rebaseDefaultLocalUrl(
311
+ stringValue(nodeOverlay?.manifestUrl) ??
312
+ `http://localhost:${defaultPort}/${BACKEND_MANIFEST_FILE}`,
313
+ defaultPort,
314
+ publicOrigin,
315
+ );
316
+ const containerEntry = rebaseDefaultLocalUrl(
317
+ stringValue(nodeOverlay?.containerEntry) ??
318
+ `http://localhost:${defaultPort}/${BACKEND_REMOTE_ENTRY_FILE}`,
319
+ defaultPort,
320
+ publicOrigin,
321
+ );
283
322
  const configuredRemoteType =
323
+ stringValue(nodeOverlay?.remoteType) ??
284
324
  stringValue(
285
- compactApp.backendFederation?.executionSurfaces?.node?.remoteType,
286
- ) ?? stringValue(compactApp.serverExecution?.node?.remoteType);
325
+ topologyApp.backendFederation?.executionSurfaces?.node?.remoteType,
326
+ );
287
327
  if (
288
328
  configuredRemoteType !== undefined &&
289
329
  configuredRemoteType !== 'commonjs-module'
@@ -300,18 +340,24 @@ export const createAppFromCompactMetadata = (
300
340
  );
301
341
  }
302
342
  const remoteType = 'commonjs-module';
303
- const packageName = stringValue(compactApp.package);
304
- const uiManifestUrl =
305
- stringValue(
306
- compactApp.backendFederation?.versionBoundary?.ui?.manifestUrl,
307
- ) ?? stringValue(compactApp.moduleFederation?.manifestUrl);
308
- const compactDeliveryUnit = isRecord(compactApp.deliveryUnit)
343
+ const packageName = stringValue(packageManifest.name);
344
+ const version = stringValue(packageManifest.version);
345
+ if (stringValue(topologyApp.package) !== packageName || !version) {
346
+ throw new Error(
347
+ `[backend-federation-build] Topology package identity must match package.json for ${id}.`,
348
+ );
349
+ }
350
+ const declaredUiManifestUrl = stringValue(overlay.manifests?.[id]);
351
+ const uiManifestUrl = declaredUiManifestUrl
352
+ ? rebaseDefaultLocalUrl(declaredUiManifestUrl, defaultPort, publicOrigin)
353
+ : undefined;
354
+ const topologyDeliveryUnit = isRecord(topologyApp.deliveryUnit)
309
355
  ? {
310
- unitId: stringValue(compactApp.deliveryUnit.unitId),
311
- buildMarker: stringValue(compactApp.deliveryUnit.buildMarker),
312
- sourceRevision: stringValue(compactApp.deliveryUnit.sourceRevision),
313
- packageName: stringValue(compactApp.deliveryUnit.packageName),
314
- version: stringValue(compactApp.deliveryUnit.version),
356
+ unitId: stringValue(topologyApp.deliveryUnit.unitId),
357
+ buildMarker: stringValue(topologyApp.deliveryUnit.buildMarker),
358
+ sourceRevision: stringValue(topologyApp.deliveryUnit.sourceRevision),
359
+ packageName: stringValue(topologyApp.deliveryUnit.packageName),
360
+ version: stringValue(topologyApp.deliveryUnit.version),
315
361
  }
316
362
  : undefined;
317
363
 
@@ -319,15 +365,18 @@ export const createAppFromCompactMetadata = (
319
365
  id,
320
366
  directory,
321
367
  packageName,
368
+ version,
322
369
  port,
323
370
  apiPrefix,
371
+ apiProtocol,
372
+ rpcPath,
324
373
  apiStem,
325
374
  backendName,
326
375
  manifestUrl,
327
376
  containerEntry,
328
377
  remoteType,
329
378
  uiManifestUrl,
330
- compactDeliveryUnit,
379
+ topologyDeliveryUnit,
331
380
  };
332
381
  };
333
382
 
@@ -335,22 +384,39 @@ export const findBackendFederationApp = async (
335
384
  workspaceRoot: string,
336
385
  appDirectory: string,
337
386
  ) => {
338
- const compactConfigPath = path.join(workspaceRoot, COMPACT_CONFIG_PATH);
339
- const compactConfig = await readJsonFile<CompactConfig>(compactConfigPath);
340
- const apps = Array.isArray(compactConfig.topology?.apps)
341
- ? compactConfig.topology.apps
342
- : [];
387
+ const topologyPath = path.join(workspaceRoot, REFERENCE_TOPOLOGY_PATH);
388
+ const topology = await readJsonFile<ReferenceTopology>(topologyPath);
389
+ if (!isRecord(topology) || !Array.isArray(topology.verticals)) {
390
+ throw new Error(
391
+ `[backend-federation-build] Invalid declared topology at ${topologyPath}.`,
392
+ );
393
+ }
394
+ const overlayPath = path.join(workspaceRoot, DEVELOPMENT_OVERLAY_PATH);
395
+ const overlay = await readJsonFile<DevelopmentOverlay>(overlayPath);
396
+ if (!isRecord(overlay) || !isRecord(overlay.ports)) {
397
+ throw new Error(
398
+ `[backend-federation-build] Invalid development overlay at ${overlayPath}.`,
399
+ );
400
+ }
401
+ const packageManifest = await readJsonFile<{
402
+ name?: unknown;
403
+ version?: unknown;
404
+ }>(path.join(appDirectory, 'package.json'));
343
405
 
344
- for (const app of apps) {
345
- const resolved = createAppFromCompactMetadata(
406
+ for (const app of topology.verticals) {
407
+ const resolved = createAppFromTopology(
346
408
  workspaceRoot,
347
409
  appDirectory,
348
410
  app,
411
+ overlay,
412
+ packageManifest,
349
413
  );
350
414
  if (resolved) {
351
415
  return resolved;
352
416
  }
353
417
  }
354
418
 
355
- return undefined;
419
+ throw new Error(
420
+ `[backend-federation-build] ${appDirectory} is missing from the declared reference topology.`,
421
+ );
356
422
  };
@@ -9,6 +9,14 @@ import {
9
9
  ULTRAMODERN_BUILD_ARTIFACT_FILE,
10
10
  } from '@modern-js/backend-federation-contracts';
11
11
  import { createBackendFederationEntryIntegrity } from '@modern-js/server-runtime-extensions/backend-federation-security/node';
12
+ import {
13
+ emitRendererBuildArtifact,
14
+ type FinalizedRendererBuildOutput,
15
+ type RendererBuildOutputContext,
16
+ type RendererBuildOutputOptions,
17
+ stampFinalizedRendererBuildArtifact,
18
+ validateFinalizedRendererBuild,
19
+ } from '../release-envelope/renderer-output-stamp';
12
20
  import {
13
21
  createBackendManifest,
14
22
  createBackendRemoteEntrySource,
@@ -16,10 +24,10 @@ import {
16
24
  import {
17
25
  type BackendFederationApp,
18
26
  buildArtifactPathFor,
19
- COMPACT_CONFIG_PATH,
20
27
  createStampedDeliveryUnit,
21
28
  findBackendFederationApp,
22
29
  findWorkspaceRoot,
30
+ REFERENCE_TOPOLOGY_PATH,
23
31
  readBuildIdentity,
24
32
  resolveWorkspaceSourceRevision,
25
33
  } from './config';
@@ -35,9 +43,16 @@ export type BackendFederationArtifactResult = {
35
43
  remoteType: string;
36
44
  };
37
45
 
46
+ export type BackendFederationBuildOptions = {
47
+ resolveRendererBuild?: RendererBuildOutputOptions['resolveRendererBuild'];
48
+ rendererBuildPlugin?: RendererBuildOutputOptions['rendererBuildPlugin'];
49
+ entrypoints?: RendererBuildOutputContext['entrypoints'];
50
+ };
51
+
38
52
  export const emitBackendFederationArtifacts = async (
39
53
  appDirectory: string,
40
54
  distDirectory: string,
55
+ options: BackendFederationBuildOptions = {},
41
56
  ): Promise<BackendFederationArtifactResult | undefined> => {
42
57
  const workspaceRoot = findWorkspaceRoot(appDirectory);
43
58
  if (!workspaceRoot) {
@@ -58,13 +73,13 @@ export const emitBackendFederationArtifacts = async (
58
73
  return undefined;
59
74
  }
60
75
  const buildIdentity = await readBuildIdentity(appDirectory);
61
- const compactDeliveryUnit = app.compactDeliveryUnit;
62
- const hasCompactDeliveryUnit =
63
- compactDeliveryUnit !== undefined &&
64
- (compactDeliveryUnit.unitId !== undefined ||
65
- compactDeliveryUnit.buildMarker !== undefined ||
66
- compactDeliveryUnit.packageName !== undefined ||
67
- compactDeliveryUnit.version !== undefined);
76
+ const topologyDeliveryUnit = app.topologyDeliveryUnit;
77
+ const hasTopologyDeliveryUnit =
78
+ topologyDeliveryUnit !== undefined &&
79
+ (topologyDeliveryUnit.unitId !== undefined ||
80
+ topologyDeliveryUnit.buildMarker !== undefined ||
81
+ topologyDeliveryUnit.packageName !== undefined ||
82
+ topologyDeliveryUnit.version !== undefined);
68
83
  const hasBuildIdentity =
69
84
  buildIdentity.unitId !== undefined ||
70
85
  buildIdentity.buildVersion !== undefined ||
@@ -72,7 +87,7 @@ export const emitBackendFederationArtifacts = async (
72
87
  buildIdentity.version !== undefined;
73
88
 
74
89
  if (hasBuildIdentity) {
75
- const compactConfigPath = path.join(workspaceRoot, COMPACT_CONFIG_PATH);
90
+ const topologyPath = path.join(workspaceRoot, REFERENCE_TOPOLOGY_PATH);
76
91
  const buildIdentityPath = buildArtifactPathFor(appDirectory);
77
92
  const mismatches: string[] = [];
78
93
  const compare = (
@@ -89,45 +104,73 @@ export const emitBackendFederationArtifacts = async (
89
104
  };
90
105
  compare('appId', app.id, buildIdentity.appId, 'topology');
91
106
 
92
- if (hasCompactDeliveryUnit) {
93
- compare('unitId', compactDeliveryUnit?.unitId, buildIdentity.unitId);
107
+ if (hasTopologyDeliveryUnit) {
108
+ compare('unitId', topologyDeliveryUnit?.unitId, buildIdentity.unitId);
94
109
  compare(
95
110
  'buildMarker/build',
96
- compactDeliveryUnit?.buildMarker,
111
+ topologyDeliveryUnit?.buildMarker,
97
112
  buildIdentity.buildVersion,
98
113
  );
99
114
  compare(
100
115
  'packageName',
101
- compactDeliveryUnit?.packageName,
116
+ topologyDeliveryUnit?.packageName,
102
117
  buildIdentity.packageName,
103
118
  );
104
- compare('version', compactDeliveryUnit?.version, buildIdentity.version);
119
+ compare('version', topologyDeliveryUnit?.version, buildIdentity.version);
105
120
  }
121
+ compare(
122
+ 'packageName',
123
+ app.packageName,
124
+ buildIdentity.packageName,
125
+ 'package.json',
126
+ );
127
+ compare(
128
+ 'packageName',
129
+ topologyDeliveryUnit?.packageName,
130
+ app.packageName,
131
+ 'topology',
132
+ );
133
+ compare('version', app.version, buildIdentity.version, 'package.json');
134
+ compare('version', topologyDeliveryUnit?.version, app.version, 'topology');
106
135
 
107
136
  if (mismatches.length > 0) {
108
137
  throw new Error(
109
- `[backend-federation-build] Delivery-unit identity drift between ${compactConfigPath} (topology) and ${buildIdentityPath}: ${mismatches.join('; ')}`,
138
+ `[backend-federation-build] Delivery-unit identity drift between ${topologyPath}, package.json and ${buildIdentityPath}: ${mismatches.join('; ')}`,
110
139
  );
111
140
  }
112
141
  }
113
142
 
114
- const unitId = compactDeliveryUnit?.unitId ?? buildIdentity.unitId;
143
+ const unitId = topologyDeliveryUnit?.unitId ?? buildIdentity.unitId;
115
144
  const generationBuildMarker =
116
- compactDeliveryUnit?.buildMarker ?? buildIdentity.buildVersion;
117
- const sourceRevision = await resolveWorkspaceSourceRevision(workspaceRoot);
145
+ topologyDeliveryUnit?.buildMarker ?? buildIdentity.buildVersion;
146
+ let finalizedRendererBuild: FinalizedRendererBuildOutput | undefined;
147
+ if (options.resolveRendererBuild && buildIdentity.artifact?.surfaces.ui) {
148
+ if (!options.entrypoints?.length)
149
+ throw new Error(
150
+ '[backend-federation-build] Renderer output stamping requires the actual finalized application entries.',
151
+ );
152
+ const context = {
153
+ appDirectory,
154
+ distDirectory,
155
+ entrypoints: options.entrypoints,
156
+ };
157
+ finalizedRendererBuild = await options.resolveRendererBuild(context);
158
+ validateFinalizedRendererBuild(finalizedRendererBuild, context, app.id);
159
+ }
160
+ const sourceRevision =
161
+ finalizedRendererBuild?.sourceRevision ??
162
+ (await resolveWorkspaceSourceRevision(workspaceRoot));
118
163
  const buildVersion =
119
- generationBuildMarker && unitId
164
+ finalizedRendererBuild?.buildMarker ??
165
+ (generationBuildMarker && unitId
120
166
  ? resolveUltramodernReleaseIdentity({
121
167
  generationBuildMarker,
122
168
  unitId,
123
169
  workspaceRoot,
124
170
  }).buildMarker
125
- : undefined;
126
- const packageName =
127
- compactDeliveryUnit?.packageName ??
128
- buildIdentity.packageName ??
129
- app.packageName;
130
- const version = compactDeliveryUnit?.version ?? buildIdentity.version;
171
+ : undefined);
172
+ const packageName = app.packageName;
173
+ const version = app.version;
131
174
  const deliveryUnit = createStampedDeliveryUnit({
132
175
  appId: app.id,
133
176
  unitId,
@@ -136,13 +179,20 @@ export const emitBackendFederationArtifacts = async (
136
179
  version,
137
180
  sourceRevision,
138
181
  });
139
- const stampedBuildArtifact = buildIdentity.artifact
182
+ let stampedBuildArtifact = buildIdentity.artifact
140
183
  ? stampUltramodernBuildArtifactIdentity(buildIdentity.artifact, {
141
184
  buildMarker:
142
185
  buildVersion ?? buildIdentity.artifact.deliveryUnit.buildMarker,
143
186
  sourceRevision,
144
187
  })
145
188
  : undefined;
189
+ if (finalizedRendererBuild && stampedBuildArtifact?.surfaces.ui) {
190
+ stampedBuildArtifact = stampFinalizedRendererBuildArtifact(
191
+ stampedBuildArtifact,
192
+ finalizedRendererBuild,
193
+ { appDirectory, distDirectory, entrypoints: options.entrypoints! },
194
+ );
195
+ }
146
196
 
147
197
  const resolvedApp: BackendFederationApp = {
148
198
  ...app,
@@ -188,15 +238,46 @@ export const emitBackendFederationArtifacts = async (
188
238
  };
189
239
  };
190
240
 
191
- export default () => ({
192
- name: '@modern-js/backend-federation-build',
193
- setup(api: {
194
- getAppContext(): { appDirectory: string; distDirectory: string };
195
- onAfterBuild(handler: () => Promise<void>): void;
196
- }) {
197
- api.onAfterBuild(async () => {
198
- const { appDirectory, distDirectory } = api.getAppContext();
199
- await emitBackendFederationArtifacts(appDirectory, distDirectory);
200
- });
201
- },
202
- });
241
+ export default (
242
+ options: Omit<BackendFederationBuildOptions, 'entrypoints'> = {},
243
+ ) => {
244
+ if (options.resolveRendererBuild && !options.rendererBuildPlugin) {
245
+ throw new Error(
246
+ '[backend-federation-build] A finalized renderer resolver requires its owning metadata producer plugin.',
247
+ );
248
+ }
249
+ return {
250
+ name: '@modern-js/backend-federation-build',
251
+ pre: options.resolveRendererBuild ? [options.rendererBuildPlugin!] : [],
252
+ required: options.resolveRendererBuild
253
+ ? [options.rendererBuildPlugin!]
254
+ : [],
255
+ setup(api: {
256
+ getAppContext(): {
257
+ appDirectory: string;
258
+ distDirectory: string;
259
+ entrypoints?: RendererBuildOutputContext['entrypoints'];
260
+ apiOnly?: boolean;
261
+ };
262
+ onAfterBuild(handler: () => Promise<void>): void;
263
+ }) {
264
+ api.onAfterBuild(async () => {
265
+ const { appDirectory, distDirectory, entrypoints, apiOnly } =
266
+ api.getAppContext();
267
+ if (options.resolveRendererBuild && !apiOnly) {
268
+ await emitRendererBuildArtifact(
269
+ { appDirectory, distDirectory, entrypoints: entrypoints ?? [] },
270
+ {
271
+ resolveRendererBuild: options.resolveRendererBuild,
272
+ rendererBuildPlugin: options.rendererBuildPlugin!,
273
+ },
274
+ );
275
+ }
276
+ await emitBackendFederationArtifacts(appDirectory, distDirectory, {
277
+ ...options,
278
+ entrypoints,
279
+ });
280
+ });
281
+ },
282
+ };
283
+ };
@@ -1,2 +1,5 @@
1
- export type { BackendFederationArtifactResult } from './emit';
1
+ export type {
2
+ BackendFederationArtifactResult,
3
+ BackendFederationBuildOptions,
4
+ } from './emit';
2
5
  export { default, emitBackendFederationArtifacts } from './emit';