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

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 (217) hide show
  1. package/dist/cjs/backend-federation-build/codegen.js +267 -0
  2. package/dist/cjs/backend-federation-build/config.js +239 -0
  3. package/dist/cjs/backend-federation-build/emit.js +154 -0
  4. package/dist/cjs/backend-federation-build/index.js +53 -0
  5. package/dist/cjs/build-config/build-environment.js +129 -0
  6. package/dist/cjs/build-config/precompress/plugin.js +124 -0
  7. package/dist/cjs/build-config/precompress/types.js +18 -0
  8. package/dist/cjs/build-config/public.js +43 -0
  9. package/dist/cjs/build-config/remote-address.js +58 -0
  10. package/dist/cjs/cloudflare/artifacts.js +8 -19
  11. package/dist/cjs/cloudflare/constants.js +1 -1
  12. package/dist/cjs/cloudflare/delivery-unit.js +23 -42
  13. package/dist/cjs/cloudflare/index.js +10 -2
  14. package/dist/cjs/cloudflare/worker-manifest.js +13 -4
  15. package/dist/cjs/cloudflare/wrangler-config.js +35 -7
  16. package/dist/cjs/cloudflare-builder.js +252 -75
  17. package/dist/cjs/cloudflare-output-contract.js +69 -3
  18. package/dist/cjs/cloudflare-output-verifier/identity.js +29 -27
  19. package/dist/cjs/cloudflare-output-verifier/index.js +10 -0
  20. package/dist/cjs/cloudflare-output-verifier/manifest.js +46 -0
  21. package/dist/cjs/cloudflare-output-verifier/mutation-policy.js +7 -1
  22. package/dist/cjs/cloudflare-output-verifier/worker-bundles.js +14 -6
  23. package/dist/cjs/config.js +34 -1
  24. package/dist/cjs/deploy-output/npmAliases.js +251 -0
  25. package/dist/cjs/deploy-output/plugin.js +97 -0
  26. package/dist/cjs/deploy-output/public-assets.js +146 -0
  27. package/dist/cjs/deploy-output/target.js +104 -0
  28. package/dist/cjs/deploy-output/trace-files.js +90 -0
  29. package/dist/cjs/native-type-checker.js +193 -0
  30. package/dist/cjs/policy-defaults.js +101 -0
  31. package/dist/cjs/release-envelope/framework-output.js +153 -79
  32. package/dist/cjs/release-envelope/index.js +10 -4
  33. package/dist/cjs/release-envelope/plugin.js +18 -13
  34. package/dist/cjs/release-identity.js +5 -6
  35. package/dist/cjs/runtime-package-resolution.js +118 -0
  36. package/dist/cjs/templates/cloudflare-entry.001-bootstrap-security.mjs +0 -3
  37. package/dist/cjs/templates/cloudflare-entry.002-assets-routes.mjs +1 -1
  38. package/dist/cjs/templates/cloudflare-entry.004-rendering-css.mjs +5 -1
  39. package/dist/cjs/templates/cloudflare-entry.005-worker-dispatch.mjs +98 -10
  40. package/dist/cjs/templates/cloudflare-entry.006-fetch-handler.mjs +9 -2
  41. package/dist/cjs/templates/cloudflare-worker-route-data.mjs +1069 -0
  42. package/dist/esm/backend-federation-build/codegen.mjs +216 -0
  43. package/dist/esm/backend-federation-build/config.mjs +163 -0
  44. package/dist/esm/backend-federation-build/emit.mjs +103 -0
  45. package/dist/esm/backend-federation-build/index.mjs +1 -0
  46. package/dist/esm/build-config/build-environment.mjs +88 -0
  47. package/dist/esm/build-config/precompress/plugin.mjs +76 -0
  48. package/dist/esm/build-config/precompress/types.mjs +0 -0
  49. package/dist/esm/build-config/public.mjs +1 -0
  50. package/dist/esm/build-config/remote-address.mjs +20 -0
  51. package/dist/esm/cloudflare/artifacts.mjs +8 -19
  52. package/dist/esm/cloudflare/constants.mjs +1 -1
  53. package/dist/esm/cloudflare/delivery-unit.mjs +17 -36
  54. package/dist/esm/cloudflare/index.mjs +10 -2
  55. package/dist/esm/cloudflare/worker-manifest.mjs +13 -4
  56. package/dist/esm/cloudflare/wrangler-config.mjs +35 -7
  57. package/dist/esm/cloudflare-builder.mjs +246 -75
  58. package/dist/esm/cloudflare-output-contract.mjs +59 -2
  59. package/dist/esm/cloudflare-output-verifier/identity.mjs +27 -25
  60. package/dist/esm/cloudflare-output-verifier/index.mjs +10 -0
  61. package/dist/esm/cloudflare-output-verifier/manifest.mjs +46 -0
  62. package/dist/esm/cloudflare-output-verifier/mutation-policy.mjs +7 -1
  63. package/dist/esm/cloudflare-output-verifier/worker-bundles.mjs +15 -7
  64. package/dist/esm/config.mjs +3 -0
  65. package/dist/esm/deploy-output/npmAliases.mjs +199 -0
  66. package/dist/esm/deploy-output/plugin.mjs +46 -0
  67. package/dist/esm/deploy-output/public-assets.mjs +82 -0
  68. package/dist/esm/deploy-output/target.mjs +57 -0
  69. package/dist/esm/deploy-output/trace-files.mjs +38 -0
  70. package/dist/esm/native-type-checker.mjs +142 -0
  71. package/dist/esm/policy-defaults.mjs +45 -0
  72. package/dist/esm/release-envelope/framework-output.mjs +130 -56
  73. package/dist/esm/release-envelope/index.mjs +10 -4
  74. package/dist/esm/release-envelope/plugin.mjs +18 -13
  75. package/dist/esm/release-identity.mjs +5 -6
  76. package/dist/esm/runtime-package-resolution.mjs +60 -0
  77. package/dist/esm/templates/cloudflare-entry.001-bootstrap-security.mjs +0 -3
  78. package/dist/esm/templates/cloudflare-entry.002-assets-routes.mjs +1 -1
  79. package/dist/esm/templates/cloudflare-entry.004-rendering-css.mjs +5 -1
  80. package/dist/esm/templates/cloudflare-entry.005-worker-dispatch.mjs +98 -10
  81. package/dist/esm/templates/cloudflare-entry.006-fetch-handler.mjs +9 -2
  82. package/dist/esm/templates/cloudflare-worker-route-data.mjs +1069 -0
  83. package/dist/esm-node/backend-federation-build/codegen.mjs +217 -0
  84. package/dist/esm-node/backend-federation-build/config.mjs +164 -0
  85. package/dist/esm-node/backend-federation-build/emit.mjs +104 -0
  86. package/dist/esm-node/backend-federation-build/index.mjs +2 -0
  87. package/dist/esm-node/build-config/build-environment.mjs +89 -0
  88. package/dist/esm-node/build-config/precompress/plugin.mjs +77 -0
  89. package/dist/esm-node/build-config/precompress/types.mjs +1 -0
  90. package/dist/esm-node/build-config/public.mjs +2 -0
  91. package/dist/esm-node/build-config/remote-address.mjs +21 -0
  92. package/dist/esm-node/cloudflare/artifacts.mjs +8 -19
  93. package/dist/esm-node/cloudflare/constants.mjs +1 -1
  94. package/dist/esm-node/cloudflare/delivery-unit.mjs +17 -36
  95. package/dist/esm-node/cloudflare/index.mjs +10 -2
  96. package/dist/esm-node/cloudflare/worker-manifest.mjs +13 -4
  97. package/dist/esm-node/cloudflare/wrangler-config.mjs +35 -7
  98. package/dist/esm-node/cloudflare-builder.mjs +246 -75
  99. package/dist/esm-node/cloudflare-output-contract.mjs +59 -2
  100. package/dist/esm-node/cloudflare-output-verifier/identity.mjs +27 -25
  101. package/dist/esm-node/cloudflare-output-verifier/index.mjs +10 -0
  102. package/dist/esm-node/cloudflare-output-verifier/manifest.mjs +46 -0
  103. package/dist/esm-node/cloudflare-output-verifier/mutation-policy.mjs +7 -1
  104. package/dist/esm-node/cloudflare-output-verifier/worker-bundles.mjs +15 -7
  105. package/dist/esm-node/config.mjs +3 -0
  106. package/dist/esm-node/deploy-output/npmAliases.mjs +200 -0
  107. package/dist/esm-node/deploy-output/plugin.mjs +49 -0
  108. package/dist/esm-node/deploy-output/public-assets.mjs +83 -0
  109. package/dist/esm-node/deploy-output/target.mjs +58 -0
  110. package/dist/esm-node/deploy-output/trace-files.mjs +39 -0
  111. package/dist/esm-node/native-type-checker.mjs +143 -0
  112. package/dist/esm-node/policy-defaults.mjs +46 -0
  113. package/dist/esm-node/release-envelope/framework-output.mjs +130 -56
  114. package/dist/esm-node/release-envelope/index.mjs +10 -4
  115. package/dist/esm-node/release-envelope/plugin.mjs +18 -13
  116. package/dist/esm-node/release-identity.mjs +5 -6
  117. package/dist/esm-node/runtime-package-resolution.mjs +61 -0
  118. package/dist/esm-node/templates/cloudflare-entry.001-bootstrap-security.mjs +0 -3
  119. package/dist/esm-node/templates/cloudflare-entry.002-assets-routes.mjs +1 -1
  120. package/dist/esm-node/templates/cloudflare-entry.004-rendering-css.mjs +5 -1
  121. package/dist/esm-node/templates/cloudflare-entry.005-worker-dispatch.mjs +98 -10
  122. package/dist/esm-node/templates/cloudflare-entry.006-fetch-handler.mjs +9 -2
  123. package/dist/esm-node/templates/cloudflare-worker-route-data.mjs +1069 -0
  124. package/dist/types/backend-federation-build/codegen.d.ts +116 -0
  125. package/dist/types/backend-federation-build/config.d.ts +121 -0
  126. package/dist/types/backend-federation-build/emit.d.ts +21 -0
  127. package/dist/types/backend-federation-build/index.d.ts +2 -0
  128. package/dist/types/build-config/build-environment.d.ts +14 -0
  129. package/dist/types/build-config/precompress/plugin.d.ts +4 -0
  130. package/dist/types/build-config/precompress/types.d.ts +19 -0
  131. package/dist/types/build-config/public.d.ts +2 -0
  132. package/dist/types/build-config/remote-address.d.ts +3 -0
  133. package/dist/types/cloudflare/artifacts.d.ts +7 -6
  134. package/dist/types/cloudflare/constants.d.ts +1 -1
  135. package/dist/types/cloudflare/delivery-unit.d.ts +3 -3
  136. package/dist/types/cloudflare/worker-manifest.d.ts +2 -2
  137. package/dist/types/cloudflare/wrangler-config.d.ts +6 -0
  138. package/dist/types/cloudflare-builder.d.ts +49 -9
  139. package/dist/types/cloudflare-output-contract.d.ts +4 -1
  140. package/dist/types/cloudflare-output-verifier/identity.d.ts +1 -1
  141. package/dist/types/cloudflare-output-verifier/worker-bundles.d.ts +2 -2
  142. package/dist/types/config.d.ts +29 -1
  143. package/dist/types/deploy-output/npmAliases.d.ts +14 -0
  144. package/dist/types/deploy-output/plugin.d.ts +35 -0
  145. package/dist/types/deploy-output/public-assets.d.ts +51 -0
  146. package/dist/types/deploy-output/target.d.ts +29 -0
  147. package/dist/types/deploy-output/trace-files.d.ts +17 -0
  148. package/dist/types/native-type-checker.d.ts +15 -0
  149. package/dist/types/policy-defaults.d.ts +46 -0
  150. package/dist/types/precompress/LICENSE +20 -0
  151. package/dist/types/precompress/index.d.ts +76 -0
  152. package/dist/types/release-envelope/framework-output.d.ts +8 -3
  153. package/dist/types/release-envelope/plugin.d.ts +7 -7
  154. package/dist/types/runtime-package-resolution.d.ts +28 -0
  155. package/dist/types/templates/cloudflare-worker-route-data.d.mts +14 -0
  156. package/package.json +97 -15
  157. package/src/backend-federation-build/codegen.ts +254 -0
  158. package/src/backend-federation-build/config.ts +492 -0
  159. package/src/backend-federation-build/emit.ts +213 -0
  160. package/src/backend-federation-build/index.ts +2 -0
  161. package/src/build-config/build-environment.ts +160 -0
  162. package/src/build-config/precompress/plugin.ts +140 -0
  163. package/src/build-config/precompress/types.ts +26 -0
  164. package/src/build-config/public.ts +5 -0
  165. package/src/build-config/remote-address.ts +33 -0
  166. package/src/cloudflare/artifacts.ts +22 -43
  167. package/src/cloudflare/constants.ts +1 -1
  168. package/src/cloudflare/delivery-unit.ts +42 -53
  169. package/src/cloudflare/index.ts +24 -11
  170. package/src/cloudflare/worker-manifest.ts +20 -3
  171. package/src/cloudflare/wrangler-config.ts +86 -10
  172. package/src/cloudflare-builder.ts +475 -151
  173. package/src/cloudflare-output-contract.ts +70 -0
  174. package/src/cloudflare-output-verifier/identity.ts +5 -1
  175. package/src/cloudflare-output-verifier/index.ts +20 -0
  176. package/src/cloudflare-output-verifier/manifest.ts +77 -0
  177. package/src/cloudflare-output-verifier/mutation-policy.ts +11 -1
  178. package/src/cloudflare-output-verifier/worker-bundles.ts +32 -14
  179. package/src/config.ts +34 -6
  180. package/src/deploy-output/npmAliases.ts +382 -0
  181. package/src/deploy-output/plugin.ts +86 -0
  182. package/src/deploy-output/public-assets.ts +224 -0
  183. package/src/deploy-output/target.ts +106 -0
  184. package/src/deploy-output/trace-files.ts +67 -0
  185. package/src/native-type-checker.ts +183 -0
  186. package/src/policy-defaults.ts +127 -0
  187. package/src/release-envelope/framework-output.ts +346 -94
  188. package/src/release-envelope/index.ts +26 -5
  189. package/src/release-envelope/plugin.ts +43 -40
  190. package/src/release-identity.ts +13 -2
  191. package/src/runtime-package-resolution.ts +115 -0
  192. package/src/templates/cloudflare-entry.001-bootstrap-security.mjs +0 -3
  193. package/src/templates/cloudflare-entry.002-assets-routes.mjs +1 -1
  194. package/src/templates/cloudflare-entry.004-rendering-css.mjs +5 -1
  195. package/src/templates/cloudflare-entry.005-worker-dispatch.mjs +98 -10
  196. package/src/templates/cloudflare-entry.006-fetch-handler.mjs +9 -2
  197. package/src/templates/cloudflare-worker-route-data.mjs +1069 -0
  198. package/dist/cjs/templates/cloudflare-worker-fs-promises.mjs +0 -11
  199. package/dist/cjs/templates/cloudflare-worker-loadable-server.mjs +0 -281
  200. package/dist/cjs/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  201. package/dist/cjs/templates/cloudflare-worker-path.mjs +0 -98
  202. package/dist/esm/templates/cloudflare-worker-fs-promises.mjs +0 -11
  203. package/dist/esm/templates/cloudflare-worker-loadable-server.mjs +0 -281
  204. package/dist/esm/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  205. package/dist/esm/templates/cloudflare-worker-path.mjs +0 -98
  206. package/dist/esm-node/templates/cloudflare-worker-fs-promises.mjs +0 -11
  207. package/dist/esm-node/templates/cloudflare-worker-loadable-server.mjs +0 -281
  208. package/dist/esm-node/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  209. package/dist/esm-node/templates/cloudflare-worker-path.mjs +0 -98
  210. package/dist/types/templates/cloudflare-worker-fs-promises.d.mts +0 -5
  211. package/dist/types/templates/cloudflare-worker-loadable-server.d.mts +0 -48
  212. package/dist/types/templates/cloudflare-worker-mf-ssr-runtime-plugin.d.mts +0 -13
  213. package/dist/types/templates/cloudflare-worker-path.d.mts +0 -21
  214. package/src/templates/cloudflare-worker-fs-promises.mjs +0 -11
  215. package/src/templates/cloudflare-worker-loadable-server.mjs +0 -281
  216. package/src/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  217. package/src/templates/cloudflare-worker-path.mjs +0 -98
@@ -0,0 +1,254 @@
1
+ import path from 'node:path';
2
+ import {
3
+ BACKEND_FEDERATION_EFFECT_EXPOSE as BACKEND_EXPOSE,
4
+ BACKEND_FEDERATION_REMOTE_ENTRY_FILE as BACKEND_REMOTE_ENTRY_FILE,
5
+ BACKEND_FEDERATION_CONTRACT_VERSION as CONTRACT_VERSION,
6
+ formatBackendFederationValidationErrors,
7
+ BACKEND_FEDERATION_NODE_ADAPTER_VERSION as NODE_ADAPTER_VERSION,
8
+ validateBackendFederationManifest,
9
+ } from '@modern-js/backend-federation-contracts';
10
+ import type { BackendFederationEntryIntegrity } from '@modern-js/server-runtime-extensions/backend-federation-security';
11
+ import { build } from 'esbuild';
12
+ import { type BackendFederationApp, normalizeRelativePath } from './config';
13
+
14
+ const createRelativeImportSpecifier = (
15
+ fromDirectory: string,
16
+ toFile: string,
17
+ ) => {
18
+ const relativePath = normalizeRelativePath(
19
+ path.relative(fromDirectory, toFile),
20
+ );
21
+ return relativePath.startsWith('.') ? relativePath : `./${relativePath}`;
22
+ };
23
+
24
+ const createPublicPath = (containerEntry: string, fallbackPort: number) => {
25
+ try {
26
+ return new URL('.', containerEntry).href;
27
+ } catch {
28
+ const slashIndex = containerEntry.lastIndexOf('/');
29
+ if (slashIndex >= 0) {
30
+ return containerEntry.slice(0, slashIndex + 1);
31
+ }
32
+
33
+ return `http://localhost:${fallbackPort}/`;
34
+ }
35
+ };
36
+
37
+ export const createBackendRemoteEntrySource = async (
38
+ workspaceRoot: string,
39
+ app: BackendFederationApp,
40
+ effectApiPath: string,
41
+ entryPath: string,
42
+ ) => {
43
+ const effectApiSpecifier = createRelativeImportSpecifier(
44
+ path.dirname(effectApiPath),
45
+ effectApiPath,
46
+ );
47
+ const containerMetadata = {
48
+ buildVersion: app.buildVersion,
49
+ expose: BACKEND_EXPOSE,
50
+ name: app.backendName,
51
+ packageName: app.packageName,
52
+ remoteType: app.remoteType,
53
+ source: normalizeRelativePath(path.relative(workspaceRoot, effectApiPath)),
54
+ version: app.version,
55
+ ...(app.unitId ? { unitId: app.unitId } : {}),
56
+ ...(app.sourceRevision ? { sourceRevision: app.sourceRevision } : {}),
57
+ };
58
+ const compatibility = {
59
+ build: app.buildVersion,
60
+ contractVersion: CONTRACT_VERSION,
61
+ nodeAdapterVersion: NODE_ADAPTER_VERSION,
62
+ packageName: app.packageName,
63
+ ...(app.unitId ? { unitId: app.unitId } : {}),
64
+ ...(app.sourceRevision ? { sourceRevision: app.sourceRevision } : {}),
65
+ };
66
+ const source = `// Generated by Modern.js backend federation build.
67
+ import { adoptEffectBffShareScope } from '@modern-js/bff-effect/effect-edge';
68
+
69
+ // The expose evaluates lazily so defineEffectBff registers its handler
70
+ // factories with the registry the host shares through init().
71
+ let exposedModule;
72
+ const loadExposedModule = () =>
73
+ (exposedModule ??= import(${JSON.stringify(effectApiSpecifier)}).then(exposedNamespace => ({
74
+ ...exposedNamespace,
75
+ backendFederationContract: {
76
+ ...(exposedNamespace.backendFederationContract ?? {}),
77
+ compatibility: {
78
+ ...(exposedNamespace.backendFederationContract?.compatibility ?? {}),
79
+ ...${JSON.stringify(compatibility)},
80
+ },
81
+ name: ${JSON.stringify(app.backendName)},
82
+ role: 'microvertical-server',
83
+ runtimeFramework: 'effect',
84
+ strictEffectApproach: true,
85
+ },
86
+ })));
87
+ const exposedModules = {
88
+ ${JSON.stringify(BACKEND_EXPOSE)}: loadExposedModule,
89
+ };
90
+ const __modernjsBackendFederation = ${JSON.stringify(containerMetadata)};
91
+
92
+ function init(shareScope) {
93
+ return adoptEffectBffShareScope(shareScope);
94
+ }
95
+
96
+ function get(id) {
97
+ const load = exposedModules[id];
98
+ if (!load) {
99
+ throw new Error(\`Unexpected backend federation expose: \${id}\`);
100
+ }
101
+
102
+ return async () => load();
103
+ }
104
+
105
+ module.exports = { __modernjsBackendFederation, get, init };
106
+ `;
107
+ const result = await build({
108
+ absWorkingDir: path.dirname(effectApiPath),
109
+ bundle: true,
110
+ format: 'cjs',
111
+ logLevel: 'silent',
112
+ platform: 'node',
113
+ stdin: {
114
+ contents: source,
115
+ loader: 'ts',
116
+ resolveDir: path.dirname(effectApiPath),
117
+ sourcefile: path.basename(entryPath),
118
+ },
119
+ target: 'node20',
120
+ write: false,
121
+ });
122
+ const output = result.outputFiles[0];
123
+ if (!output) {
124
+ throw new Error(
125
+ '[backend-federation-build] CommonJS backend federation container emitted no output.',
126
+ );
127
+ }
128
+ return output.text;
129
+ };
130
+
131
+ export const createBackendManifest = (
132
+ workspaceRoot: string,
133
+ distDirectory: string,
134
+ app: BackendFederationApp,
135
+ entryIntegrity: BackendFederationEntryIntegrity,
136
+ ) => {
137
+ const sourceModule = `${app.directory}/api/effect-api.ts`;
138
+ const publicPath = createPublicPath(app.containerEntry, app.port);
139
+
140
+ const manifest = {
141
+ schemaVersion: 1,
142
+ id: app.backendName,
143
+ name: app.backendName,
144
+ version: app.version,
145
+ buildVersion: app.buildVersion,
146
+ metaData: {
147
+ name: app.backendName,
148
+ type: 'backend',
149
+ buildInfo: {
150
+ buildVersion: app.buildVersion,
151
+ buildName: app.packageName,
152
+ },
153
+ remoteEntry: {
154
+ name: BACKEND_REMOTE_ENTRY_FILE,
155
+ path: '',
156
+ type: app.remoteType,
157
+ },
158
+ globalName: app.backendName,
159
+ publicPath,
160
+ ssrRemoteEntry: {
161
+ name: BACKEND_REMOTE_ENTRY_FILE,
162
+ path: '',
163
+ type: app.remoteType,
164
+ },
165
+ ssrPublicPath: publicPath,
166
+ },
167
+ entry: {
168
+ ...entryIntegrity,
169
+ file: BACKEND_REMOTE_ENTRY_FILE,
170
+ path: normalizeRelativePath(
171
+ path.relative(
172
+ workspaceRoot,
173
+ path.join(distDirectory, BACKEND_REMOTE_ENTRY_FILE),
174
+ ),
175
+ ),
176
+ type: app.remoteType,
177
+ url: app.containerEntry,
178
+ },
179
+ exposes: [
180
+ {
181
+ id: `${app.backendName}:${BACKEND_EXPOSE}`,
182
+ name: BACKEND_EXPOSE,
183
+ path: '',
184
+ assets: {
185
+ js: {
186
+ async: [],
187
+ sync: [BACKEND_REMOTE_ENTRY_FILE],
188
+ },
189
+ css: {
190
+ async: [],
191
+ sync: [],
192
+ },
193
+ },
194
+ },
195
+ ],
196
+ shared: [],
197
+ backendFederation: {
198
+ role: 'microvertical-server',
199
+ appId: app.id,
200
+ name: app.backendName,
201
+ runtimeFramework: 'effect',
202
+ strictEffectApproach: true,
203
+ contractVersion: CONTRACT_VERSION,
204
+ nodeAdapterVersion: NODE_ADAPTER_VERSION,
205
+ remoteType: app.remoteType,
206
+ expose: BACKEND_EXPOSE,
207
+ manifestUrl: app.manifestUrl,
208
+ containerEntry: app.containerEntry,
209
+ source: {
210
+ module: sourceModule,
211
+ },
212
+ ...(app.apiProtocol === 'rpc'
213
+ ? { rpcPath: app.rpcPath, rpcSerialization: 'json' }
214
+ : {
215
+ readinessPath: `${app.apiPrefix}/${app.apiStem}/readiness`,
216
+ openapiPath: `${app.apiPrefix}/openapi.json`,
217
+ }),
218
+ ...(app.deliveryUnit ? { deliveryUnit: app.deliveryUnit } : {}),
219
+ versionBoundary: {
220
+ invariant: 'web-and-api-same-build',
221
+ packageName: app.packageName,
222
+ version: app.version,
223
+ buildVersion: app.buildVersion,
224
+ ...(app.uiManifestUrl ? { uiManifestUrl: app.uiManifestUrl } : {}),
225
+ ...(app.deliveryUnit
226
+ ? {
227
+ deliveryUnit: {
228
+ unitId: app.deliveryUnit.unitId,
229
+ buildMarker: app.deliveryUnit.buildMarker,
230
+ sourceRevision: app.deliveryUnit.sourceRevision,
231
+ },
232
+ }
233
+ : {}),
234
+ },
235
+ },
236
+ };
237
+
238
+ const validation = validateBackendFederationManifest(manifest, {
239
+ path: 'backendFederationManifest',
240
+ requireEffectExpose: true,
241
+ requireEffectRuntime: true,
242
+ requireVersionFields: true,
243
+ });
244
+
245
+ if (!validation.ok) {
246
+ throw new Error(
247
+ `[backend-federation-build] Invalid backend federation manifest: ${formatBackendFederationValidationErrors(
248
+ validation.errors,
249
+ )}.`,
250
+ );
251
+ }
252
+
253
+ return manifest;
254
+ };