@bleedingdev/modern-js-create 3.5.0-ultramodern.4 → 3.5.0-ultramodern.40

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 (499) hide show
  1. package/README.md +28 -28
  2. package/dist/cjs/cli/flags.cjs +295 -0
  3. package/dist/cjs/cli/help.cjs +105 -0
  4. package/dist/cjs/cli/package-source.cjs +183 -0
  5. package/dist/cjs/cli/project-setup.cjs +138 -0
  6. package/dist/cjs/cli/prompts.cjs +100 -0
  7. package/dist/cjs/index.cjs +22 -584
  8. package/dist/cjs/locale/en.cjs +2 -6
  9. package/dist/cjs/locale/zh.cjs +2 -6
  10. package/dist/cjs/ultramodern-package-source.cjs +0 -32
  11. package/dist/cjs/ultramodern-tooling/commands/cloudflare-output-verify.cjs +132 -0
  12. package/dist/cjs/ultramodern-tooling/commands/context.cjs +131 -0
  13. package/dist/cjs/ultramodern-tooling/commands/mf-types.cjs +55 -0
  14. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.cjs +158 -0
  15. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.cjs +50 -0
  16. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.cjs +87 -0
  17. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.cjs +58 -0
  18. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.cjs +62 -0
  19. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.cjs +60 -0
  20. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.cjs +132 -0
  21. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.cjs +67 -0
  22. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.cjs +93 -0
  23. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.cjs +60 -0
  24. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.cjs +67 -0
  25. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.cjs +67 -0
  26. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/help.cjs +54 -0
  27. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/install.cjs +52 -0
  28. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/io.cjs +133 -0
  29. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.cjs +245 -0
  30. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-source.cjs +76 -0
  31. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.cjs +142 -0
  32. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.cjs +155 -0
  33. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.cjs +155 -0
  34. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect.cjs +149 -0
  35. package/dist/cjs/ultramodern-tooling/commands/options.cjs +59 -0
  36. package/dist/cjs/ultramodern-tooling/commands/routes-generate.cjs +122 -0
  37. package/dist/cjs/ultramodern-tooling/commands/skills.cjs +49 -0
  38. package/dist/cjs/ultramodern-tooling/commands/sync-delivery-unit.cjs +40 -0
  39. package/dist/cjs/ultramodern-tooling/commands/validate.cjs +49 -0
  40. package/dist/cjs/ultramodern-tooling/commands.cjs +27 -485
  41. package/dist/cjs/ultramodern-tooling/config/constants.cjs +48 -0
  42. package/dist/cjs/ultramodern-tooling/config/index.cjs +104 -0
  43. package/dist/cjs/ultramodern-tooling/config/json.cjs +61 -0
  44. package/dist/cjs/ultramodern-tooling/config/load.cjs +62 -0
  45. package/dist/cjs/ultramodern-tooling/config/metadata.cjs +92 -0
  46. package/dist/cjs/ultramodern-tooling/config/normalize.cjs +160 -0
  47. package/dist/cjs/ultramodern-tooling/config/synthesize.cjs +157 -0
  48. package/dist/cjs/ultramodern-tooling/config/types.cjs +18 -0
  49. package/dist/cjs/ultramodern-tooling/config.cjs +23 -133
  50. package/dist/cjs/ultramodern-workspace/add-vertical/constants.cjs +52 -0
  51. package/dist/cjs/ultramodern-workspace/add-vertical/execute.cjs +156 -0
  52. package/dist/cjs/ultramodern-workspace/add-vertical/plan.cjs +234 -0
  53. package/dist/cjs/ultramodern-workspace/add-vertical/preflight.cjs +174 -0
  54. package/dist/cjs/ultramodern-workspace/add-vertical/shell-files.cjs +116 -0
  55. package/dist/cjs/ultramodern-workspace/add-vertical/topology.cjs +135 -0
  56. package/dist/cjs/ultramodern-workspace/add-vertical/workspace-state.cjs +107 -0
  57. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +22 -571
  58. package/dist/cjs/ultramodern-workspace/api/checkout-cart.cjs +145 -0
  59. package/dist/cjs/ultramodern-workspace/api/client.cjs +218 -0
  60. package/dist/cjs/ultramodern-workspace/api/contracts.cjs +222 -0
  61. package/dist/cjs/ultramodern-workspace/api/names.cjs +98 -0
  62. package/dist/cjs/ultramodern-workspace/api/service.cjs +220 -0
  63. package/dist/cjs/ultramodern-workspace/api/shared.cjs +252 -0
  64. package/dist/cjs/ultramodern-workspace/api.cjs +29 -1004
  65. package/dist/cjs/ultramodern-workspace/app-files.cjs +12 -51
  66. package/dist/cjs/ultramodern-workspace/backend-federation.cjs +296 -0
  67. package/dist/cjs/ultramodern-workspace/bridge-config/cli.cjs +71 -0
  68. package/dist/cjs/ultramodern-workspace/bridge-config/defaults.cjs +43 -0
  69. package/dist/cjs/ultramodern-workspace/bridge-config/gates.cjs +93 -0
  70. package/dist/cjs/ultramodern-workspace/bridge-config/index.cjs +60 -0
  71. package/dist/cjs/ultramodern-workspace/bridge-config/normalize.cjs +68 -0
  72. package/dist/cjs/ultramodern-workspace/bridge-config/schema.cjs +78 -0
  73. package/dist/cjs/ultramodern-workspace/bridge-config/shared.cjs +110 -0
  74. package/dist/cjs/ultramodern-workspace/bridge-config/validation.cjs +68 -0
  75. package/dist/cjs/ultramodern-workspace/bridge-config/workspace-packages.cjs +108 -0
  76. package/dist/cjs/ultramodern-workspace/bridge-config.cjs +32 -297
  77. package/dist/cjs/ultramodern-workspace/contracts.cjs +40 -15
  78. package/dist/cjs/ultramodern-workspace/delivery-unit-sync.cjs +159 -0
  79. package/dist/cjs/ultramodern-workspace/delivery-unit.cjs +75 -0
  80. package/dist/cjs/ultramodern-workspace/demo-components.cjs +47 -192
  81. package/dist/cjs/ultramodern-workspace/descriptors.cjs +36 -1
  82. package/dist/cjs/ultramodern-workspace/effect-diagnostics.cjs +114 -0
  83. package/dist/cjs/ultramodern-workspace/fs-io.cjs +24 -35
  84. package/dist/cjs/ultramodern-workspace/index.cjs +4 -0
  85. package/dist/cjs/ultramodern-workspace/locales.cjs +1 -14
  86. package/dist/cjs/ultramodern-workspace/mf-validation/constants.cjs +69 -0
  87. package/dist/cjs/ultramodern-workspace/mf-validation/discovery.cjs +77 -0
  88. package/dist/cjs/ultramodern-workspace/mf-validation/inspect.cjs +84 -0
  89. package/dist/cjs/ultramodern-workspace/mf-validation/object-literal.cjs +188 -0
  90. package/dist/cjs/ultramodern-workspace/mf-validation/path-utils.cjs +165 -0
  91. package/dist/cjs/ultramodern-workspace/mf-validation/syntax.cjs +201 -0
  92. package/dist/cjs/ultramodern-workspace/mf-validation/types.cjs +18 -0
  93. package/dist/cjs/ultramodern-workspace/mf-validation/validate.cjs +112 -0
  94. package/dist/cjs/ultramodern-workspace/mf-validation.cjs +6 -529
  95. package/dist/cjs/ultramodern-workspace/module-federation/config.cjs +262 -0
  96. package/dist/cjs/ultramodern-workspace/module-federation/index.cjs +73 -0
  97. package/dist/cjs/ultramodern-workspace/module-federation/reexport-module.cjs +74 -0
  98. package/dist/cjs/ultramodern-workspace/module-federation/remote-refs.cjs +105 -0
  99. package/dist/cjs/ultramodern-workspace/module-federation/shared-config.cjs +53 -0
  100. package/dist/cjs/ultramodern-workspace/module-federation.cjs +18 -477
  101. package/dist/cjs/ultramodern-workspace/naming.cjs +0 -6
  102. package/dist/cjs/ultramodern-workspace/package-json.cjs +27 -269
  103. package/dist/cjs/ultramodern-workspace/policy.cjs +0 -21
  104. package/dist/cjs/ultramodern-workspace/public-surface.cjs +0 -21
  105. package/dist/cjs/ultramodern-workspace/routes.cjs +8 -157
  106. package/dist/cjs/ultramodern-workspace/shared-patches.cjs +45 -0
  107. package/dist/cjs/ultramodern-workspace/tooling-command-catalog.cjs +147 -0
  108. package/dist/cjs/ultramodern-workspace/tsconfigs.cjs +199 -0
  109. package/dist/cjs/ultramodern-workspace/versions.cjs +31 -38
  110. package/dist/cjs/ultramodern-workspace/workspace-script-plan.cjs +163 -0
  111. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +96 -73
  112. package/dist/cjs/ultramodern-workspace/workspace-validation-contract.cjs +97 -0
  113. package/dist/cjs/ultramodern-workspace/write-app.cjs +125 -0
  114. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +13 -63
  115. package/dist/cjs/ultramodern-workspace/zerops.cjs +103 -0
  116. package/dist/esm/cli/flags.js +218 -0
  117. package/dist/esm/cli/help.js +64 -0
  118. package/dist/esm/cli/package-source.js +119 -0
  119. package/dist/esm/cli/project-setup.js +81 -0
  120. package/dist/esm/cli/prompts.js +51 -0
  121. package/dist/esm/index.js +6 -564
  122. package/dist/esm/locale/en.js +2 -6
  123. package/dist/esm/locale/zh.js +2 -6
  124. package/dist/esm/ultramodern-package-source.js +1 -24
  125. package/dist/esm/ultramodern-tooling/commands/cloudflare-output-verify.js +84 -0
  126. package/dist/esm/ultramodern-tooling/commands/context.js +66 -0
  127. package/dist/esm/ultramodern-tooling/commands/mf-types.js +17 -0
  128. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.js +106 -0
  129. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.js +12 -0
  130. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.js +38 -0
  131. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.js +10 -0
  132. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +14 -0
  133. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +12 -0
  134. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.js +83 -0
  135. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.js +16 -0
  136. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +44 -0
  137. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.js +12 -0
  138. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.js +7 -0
  139. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.js +15 -0
  140. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/help.js +16 -0
  141. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/install.js +14 -0
  142. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/io.js +69 -0
  143. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +201 -0
  144. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-source.js +38 -0
  145. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +87 -0
  146. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +105 -0
  147. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.js +71 -0
  148. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect.js +100 -0
  149. package/dist/esm/ultramodern-tooling/commands/options.js +18 -0
  150. package/dist/esm/ultramodern-tooling/commands/routes-generate.js +74 -0
  151. package/dist/esm/ultramodern-tooling/commands/skills.js +11 -0
  152. package/dist/esm/ultramodern-tooling/commands/sync-delivery-unit.js +1 -0
  153. package/dist/esm/ultramodern-tooling/commands/validate.js +11 -0
  154. package/dist/esm/ultramodern-tooling/commands.js +22 -475
  155. package/dist/esm/ultramodern-tooling/config/constants.js +4 -0
  156. package/dist/esm/ultramodern-tooling/config/index.js +7 -0
  157. package/dist/esm/ultramodern-tooling/config/json.js +10 -0
  158. package/dist/esm/ultramodern-tooling/config/load.js +13 -0
  159. package/dist/esm/ultramodern-tooling/config/metadata.js +37 -0
  160. package/dist/esm/ultramodern-tooling/config/normalize.js +106 -0
  161. package/dist/esm/ultramodern-tooling/config/synthesize.js +108 -0
  162. package/dist/esm/ultramodern-tooling/config/types.js +0 -0
  163. package/dist/esm/ultramodern-tooling/config.js +1 -120
  164. package/dist/esm/ultramodern-workspace/add-vertical/constants.js +5 -0
  165. package/dist/esm/ultramodern-workspace/add-vertical/execute.js +108 -0
  166. package/dist/esm/ultramodern-workspace/add-vertical/plan.js +184 -0
  167. package/dist/esm/ultramodern-workspace/add-vertical/preflight.js +122 -0
  168. package/dist/esm/ultramodern-workspace/add-vertical/shell-files.js +59 -0
  169. package/dist/esm/ultramodern-workspace/add-vertical/topology.js +91 -0
  170. package/dist/esm/ultramodern-workspace/add-vertical/workspace-state.js +43 -0
  171. package/dist/esm/ultramodern-workspace/add-vertical.js +6 -544
  172. package/dist/esm/ultramodern-workspace/api/checkout-cart.js +86 -0
  173. package/dist/esm/ultramodern-workspace/api/client.js +177 -0
  174. package/dist/esm/ultramodern-workspace/api/contracts.js +172 -0
  175. package/dist/esm/ultramodern-workspace/api/names.js +33 -0
  176. package/dist/esm/ultramodern-workspace/api/service.js +179 -0
  177. package/dist/esm/ultramodern-workspace/api/shared.js +208 -0
  178. package/dist/esm/ultramodern-workspace/api.js +5 -984
  179. package/dist/esm/ultramodern-workspace/app-files.js +11 -32
  180. package/dist/esm/ultramodern-workspace/backend-federation.js +231 -0
  181. package/dist/esm/ultramodern-workspace/bridge-config/cli.js +30 -0
  182. package/dist/esm/ultramodern-workspace/bridge-config/defaults.js +5 -0
  183. package/dist/esm/ultramodern-workspace/bridge-config/gates.js +52 -0
  184. package/dist/esm/ultramodern-workspace/bridge-config/index.js +3 -0
  185. package/dist/esm/ultramodern-workspace/bridge-config/normalize.js +30 -0
  186. package/dist/esm/ultramodern-workspace/bridge-config/schema.js +31 -0
  187. package/dist/esm/ultramodern-workspace/bridge-config/shared.js +51 -0
  188. package/dist/esm/ultramodern-workspace/bridge-config/validation.js +27 -0
  189. package/dist/esm/ultramodern-workspace/bridge-config/workspace-packages.js +67 -0
  190. package/dist/esm/ultramodern-workspace/bridge-config.js +1 -270
  191. package/dist/esm/ultramodern-workspace/contracts.js +40 -15
  192. package/dist/esm/ultramodern-workspace/delivery-unit-sync.js +110 -0
  193. package/dist/esm/ultramodern-workspace/delivery-unit.js +21 -0
  194. package/dist/esm/ultramodern-workspace/demo-components.js +48 -190
  195. package/dist/esm/ultramodern-workspace/descriptors.js +25 -2
  196. package/dist/esm/ultramodern-workspace/effect-diagnostics.js +76 -0
  197. package/dist/esm/ultramodern-workspace/fs-io.js +25 -17
  198. package/dist/esm/ultramodern-workspace/index.js +1 -0
  199. package/dist/esm/ultramodern-workspace/locales.js +1 -1
  200. package/dist/esm/ultramodern-workspace/mf-validation/constants.js +19 -0
  201. package/dist/esm/ultramodern-workspace/mf-validation/discovery.js +28 -0
  202. package/dist/esm/ultramodern-workspace/mf-validation/inspect.js +46 -0
  203. package/dist/esm/ultramodern-workspace/mf-validation/object-literal.js +144 -0
  204. package/dist/esm/ultramodern-workspace/mf-validation/path-utils.js +89 -0
  205. package/dist/esm/ultramodern-workspace/mf-validation/syntax.js +154 -0
  206. package/dist/esm/ultramodern-workspace/mf-validation/types.js +0 -0
  207. package/dist/esm/ultramodern-workspace/mf-validation/validate.js +57 -0
  208. package/dist/esm/ultramodern-workspace/mf-validation.js +3 -516
  209. package/dist/esm/ultramodern-workspace/module-federation/config.js +215 -0
  210. package/dist/esm/ultramodern-workspace/module-federation/index.js +4 -0
  211. package/dist/esm/ultramodern-workspace/module-federation/reexport-module.js +30 -0
  212. package/dist/esm/ultramodern-workspace/module-federation/remote-refs.js +64 -0
  213. package/dist/esm/ultramodern-workspace/module-federation/shared-config.js +12 -0
  214. package/dist/esm/ultramodern-workspace/module-federation.js +2 -458
  215. package/dist/esm/ultramodern-workspace/naming.js +1 -1
  216. package/dist/esm/ultramodern-workspace/package-json.js +22 -252
  217. package/dist/esm/ultramodern-workspace/policy.js +1 -7
  218. package/dist/esm/ultramodern-workspace/public-surface.js +1 -1
  219. package/dist/esm/ultramodern-workspace/routes.js +9 -143
  220. package/dist/esm/ultramodern-workspace/shared-patches.js +7 -0
  221. package/dist/esm/ultramodern-workspace/tooling-command-catalog.js +100 -0
  222. package/dist/esm/ultramodern-workspace/tsconfigs.js +136 -0
  223. package/dist/esm/ultramodern-workspace/versions.js +23 -24
  224. package/dist/esm/ultramodern-workspace/workspace-script-plan.js +116 -0
  225. package/dist/esm/ultramodern-workspace/workspace-scripts.js +92 -69
  226. package/dist/esm/ultramodern-workspace/workspace-validation-contract.js +59 -0
  227. package/dist/esm/ultramodern-workspace/write-app.js +87 -0
  228. package/dist/esm/ultramodern-workspace/write-workspace.js +14 -61
  229. package/dist/esm/ultramodern-workspace/zerops.js +65 -0
  230. package/dist/esm-node/cli/flags.js +219 -0
  231. package/dist/esm-node/cli/help.js +65 -0
  232. package/dist/esm-node/cli/package-source.js +120 -0
  233. package/dist/esm-node/cli/project-setup.js +82 -0
  234. package/dist/esm-node/cli/prompts.js +52 -0
  235. package/dist/esm-node/index.js +6 -564
  236. package/dist/esm-node/locale/en.js +2 -6
  237. package/dist/esm-node/locale/zh.js +2 -6
  238. package/dist/esm-node/ultramodern-package-source.js +1 -24
  239. package/dist/esm-node/ultramodern-tooling/commands/cloudflare-output-verify.js +85 -0
  240. package/dist/esm-node/ultramodern-tooling/commands/context.js +67 -0
  241. package/dist/esm-node/ultramodern-tooling/commands/mf-types.js +18 -0
  242. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.js +107 -0
  243. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.js +13 -0
  244. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.js +39 -0
  245. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.js +11 -0
  246. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +15 -0
  247. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +13 -0
  248. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.js +84 -0
  249. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.js +17 -0
  250. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +45 -0
  251. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.js +13 -0
  252. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.js +8 -0
  253. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.js +16 -0
  254. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/help.js +17 -0
  255. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/install.js +15 -0
  256. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/io.js +70 -0
  257. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +202 -0
  258. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-source.js +39 -0
  259. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +88 -0
  260. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +106 -0
  261. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.js +72 -0
  262. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect.js +101 -0
  263. package/dist/esm-node/ultramodern-tooling/commands/options.js +19 -0
  264. package/dist/esm-node/ultramodern-tooling/commands/routes-generate.js +75 -0
  265. package/dist/esm-node/ultramodern-tooling/commands/skills.js +12 -0
  266. package/dist/esm-node/ultramodern-tooling/commands/sync-delivery-unit.js +2 -0
  267. package/dist/esm-node/ultramodern-tooling/commands/validate.js +12 -0
  268. package/dist/esm-node/ultramodern-tooling/commands.js +22 -475
  269. package/dist/esm-node/ultramodern-tooling/config/constants.js +5 -0
  270. package/dist/esm-node/ultramodern-tooling/config/index.js +8 -0
  271. package/dist/esm-node/ultramodern-tooling/config/json.js +11 -0
  272. package/dist/esm-node/ultramodern-tooling/config/load.js +14 -0
  273. package/dist/esm-node/ultramodern-tooling/config/metadata.js +38 -0
  274. package/dist/esm-node/ultramodern-tooling/config/normalize.js +107 -0
  275. package/dist/esm-node/ultramodern-tooling/config/synthesize.js +109 -0
  276. package/dist/esm-node/ultramodern-tooling/config/types.js +1 -0
  277. package/dist/esm-node/ultramodern-tooling/config.js +1 -120
  278. package/dist/esm-node/ultramodern-workspace/add-vertical/constants.js +6 -0
  279. package/dist/esm-node/ultramodern-workspace/add-vertical/execute.js +109 -0
  280. package/dist/esm-node/ultramodern-workspace/add-vertical/plan.js +185 -0
  281. package/dist/esm-node/ultramodern-workspace/add-vertical/preflight.js +123 -0
  282. package/dist/esm-node/ultramodern-workspace/add-vertical/shell-files.js +60 -0
  283. package/dist/esm-node/ultramodern-workspace/add-vertical/topology.js +92 -0
  284. package/dist/esm-node/ultramodern-workspace/add-vertical/workspace-state.js +44 -0
  285. package/dist/esm-node/ultramodern-workspace/add-vertical.js +6 -544
  286. package/dist/esm-node/ultramodern-workspace/api/checkout-cart.js +87 -0
  287. package/dist/esm-node/ultramodern-workspace/api/client.js +178 -0
  288. package/dist/esm-node/ultramodern-workspace/api/contracts.js +173 -0
  289. package/dist/esm-node/ultramodern-workspace/api/names.js +34 -0
  290. package/dist/esm-node/ultramodern-workspace/api/service.js +180 -0
  291. package/dist/esm-node/ultramodern-workspace/api/shared.js +209 -0
  292. package/dist/esm-node/ultramodern-workspace/api.js +5 -984
  293. package/dist/esm-node/ultramodern-workspace/app-files.js +11 -32
  294. package/dist/esm-node/ultramodern-workspace/backend-federation.js +232 -0
  295. package/dist/esm-node/ultramodern-workspace/bridge-config/cli.js +31 -0
  296. package/dist/esm-node/ultramodern-workspace/bridge-config/defaults.js +6 -0
  297. package/dist/esm-node/ultramodern-workspace/bridge-config/gates.js +53 -0
  298. package/dist/esm-node/ultramodern-workspace/bridge-config/index.js +4 -0
  299. package/dist/esm-node/ultramodern-workspace/bridge-config/normalize.js +31 -0
  300. package/dist/esm-node/ultramodern-workspace/bridge-config/schema.js +32 -0
  301. package/dist/esm-node/ultramodern-workspace/bridge-config/shared.js +52 -0
  302. package/dist/esm-node/ultramodern-workspace/bridge-config/validation.js +28 -0
  303. package/dist/esm-node/ultramodern-workspace/bridge-config/workspace-packages.js +68 -0
  304. package/dist/esm-node/ultramodern-workspace/bridge-config.js +1 -270
  305. package/dist/esm-node/ultramodern-workspace/contracts.js +40 -15
  306. package/dist/esm-node/ultramodern-workspace/delivery-unit-sync.js +111 -0
  307. package/dist/esm-node/ultramodern-workspace/delivery-unit.js +22 -0
  308. package/dist/esm-node/ultramodern-workspace/demo-components.js +48 -190
  309. package/dist/esm-node/ultramodern-workspace/descriptors.js +25 -2
  310. package/dist/esm-node/ultramodern-workspace/effect-diagnostics.js +77 -0
  311. package/dist/esm-node/ultramodern-workspace/fs-io.js +25 -17
  312. package/dist/esm-node/ultramodern-workspace/index.js +1 -0
  313. package/dist/esm-node/ultramodern-workspace/locales.js +1 -1
  314. package/dist/esm-node/ultramodern-workspace/mf-validation/constants.js +20 -0
  315. package/dist/esm-node/ultramodern-workspace/mf-validation/discovery.js +29 -0
  316. package/dist/esm-node/ultramodern-workspace/mf-validation/inspect.js +47 -0
  317. package/dist/esm-node/ultramodern-workspace/mf-validation/object-literal.js +145 -0
  318. package/dist/esm-node/ultramodern-workspace/mf-validation/path-utils.js +90 -0
  319. package/dist/esm-node/ultramodern-workspace/mf-validation/syntax.js +155 -0
  320. package/dist/esm-node/ultramodern-workspace/mf-validation/types.js +1 -0
  321. package/dist/esm-node/ultramodern-workspace/mf-validation/validate.js +58 -0
  322. package/dist/esm-node/ultramodern-workspace/mf-validation.js +3 -516
  323. package/dist/esm-node/ultramodern-workspace/module-federation/config.js +216 -0
  324. package/dist/esm-node/ultramodern-workspace/module-federation/index.js +5 -0
  325. package/dist/esm-node/ultramodern-workspace/module-federation/reexport-module.js +31 -0
  326. package/dist/esm-node/ultramodern-workspace/module-federation/remote-refs.js +65 -0
  327. package/dist/esm-node/ultramodern-workspace/module-federation/shared-config.js +13 -0
  328. package/dist/esm-node/ultramodern-workspace/module-federation.js +2 -458
  329. package/dist/esm-node/ultramodern-workspace/naming.js +1 -1
  330. package/dist/esm-node/ultramodern-workspace/package-json.js +22 -252
  331. package/dist/esm-node/ultramodern-workspace/policy.js +1 -7
  332. package/dist/esm-node/ultramodern-workspace/public-surface.js +1 -1
  333. package/dist/esm-node/ultramodern-workspace/routes.js +9 -143
  334. package/dist/esm-node/ultramodern-workspace/shared-patches.js +8 -0
  335. package/dist/esm-node/ultramodern-workspace/tooling-command-catalog.js +101 -0
  336. package/dist/esm-node/ultramodern-workspace/tsconfigs.js +137 -0
  337. package/dist/esm-node/ultramodern-workspace/versions.js +23 -24
  338. package/dist/esm-node/ultramodern-workspace/workspace-script-plan.js +117 -0
  339. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +92 -69
  340. package/dist/esm-node/ultramodern-workspace/workspace-validation-contract.js +60 -0
  341. package/dist/esm-node/ultramodern-workspace/write-app.js +88 -0
  342. package/dist/esm-node/ultramodern-workspace/write-workspace.js +14 -61
  343. package/dist/esm-node/ultramodern-workspace/zerops.js +66 -0
  344. package/dist/types/cli/flags.d.ts +25 -0
  345. package/dist/types/cli/help.d.ts +2 -0
  346. package/dist/types/cli/package-source.d.ts +15 -0
  347. package/dist/types/cli/project-setup.d.ts +8 -0
  348. package/dist/types/cli/prompts.d.ts +4 -0
  349. package/dist/types/locale/en.d.ts +0 -4
  350. package/dist/types/locale/index.d.ts +0 -8
  351. package/dist/types/locale/zh.d.ts +0 -4
  352. package/dist/types/ultramodern-package-source.d.ts +0 -11
  353. package/dist/types/ultramodern-tooling/commands/cloudflare-output-verify.d.ts +2 -0
  354. package/dist/types/ultramodern-tooling/commands/context.d.ts +11 -0
  355. package/dist/types/ultramodern-tooling/commands/mf-types.d.ts +2 -0
  356. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.d.ts +4 -0
  357. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.d.ts +4 -0
  358. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.d.ts +1 -0
  359. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.d.ts +3 -0
  360. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.d.ts +3 -0
  361. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.d.ts +3 -0
  362. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.d.ts +2 -0
  363. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.d.ts +4 -0
  364. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.d.ts +3 -0
  365. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.d.ts +3 -0
  366. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.d.ts +7 -0
  367. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.d.ts +3 -0
  368. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/help.d.ts +1 -0
  369. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/install.d.ts +2 -0
  370. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/io.d.ts +14 -0
  371. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.d.ts +9 -0
  372. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-source.d.ts +3 -0
  373. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.d.ts +4 -0
  374. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.d.ts +20 -0
  375. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.d.ts +13 -0
  376. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect.d.ts +2 -0
  377. package/dist/types/ultramodern-tooling/commands/options.d.ts +2 -0
  378. package/dist/types/ultramodern-tooling/commands/routes-generate.d.ts +2 -0
  379. package/dist/types/ultramodern-tooling/commands/skills.d.ts +2 -0
  380. package/dist/types/ultramodern-tooling/commands/sync-delivery-unit.d.ts +1 -0
  381. package/dist/types/ultramodern-tooling/commands/validate.d.ts +2 -0
  382. package/dist/types/ultramodern-tooling/commands.d.ts +1 -1
  383. package/dist/types/ultramodern-tooling/config/constants.d.ts +3 -0
  384. package/dist/types/ultramodern-tooling/config/index.d.ts +7 -0
  385. package/dist/types/ultramodern-tooling/config/json.d.ts +2 -0
  386. package/dist/types/ultramodern-tooling/config/load.d.ts +2 -0
  387. package/dist/types/ultramodern-tooling/config/metadata.d.ts +4 -0
  388. package/dist/types/ultramodern-tooling/config/normalize.d.ts +5 -0
  389. package/dist/types/ultramodern-tooling/config/synthesize.d.ts +5 -0
  390. package/dist/types/ultramodern-tooling/config/types.d.ts +41 -0
  391. package/dist/types/ultramodern-tooling/config.d.ts +1 -43
  392. package/dist/types/ultramodern-workspace/add-vertical/constants.d.ts +4 -0
  393. package/dist/types/ultramodern-workspace/add-vertical/execute.d.ts +2 -0
  394. package/dist/types/ultramodern-workspace/add-vertical/plan.d.ts +2 -0
  395. package/dist/types/ultramodern-workspace/add-vertical/preflight.d.ts +20 -0
  396. package/dist/types/ultramodern-workspace/add-vertical/shell-files.d.ts +6 -0
  397. package/dist/types/ultramodern-workspace/add-vertical/topology.d.ts +9 -0
  398. package/dist/types/ultramodern-workspace/add-vertical/workspace-state.d.ts +8 -0
  399. package/dist/types/ultramodern-workspace/add-vertical.d.ts +7 -39
  400. package/dist/types/ultramodern-workspace/api/checkout-cart.d.ts +33 -0
  401. package/dist/types/ultramodern-workspace/api/client.d.ts +6 -0
  402. package/dist/types/ultramodern-workspace/api/contracts.d.ts +15 -0
  403. package/dist/types/ultramodern-workspace/api/names.d.ts +41 -0
  404. package/dist/types/ultramodern-workspace/api/service.d.ts +6 -0
  405. package/dist/types/ultramodern-workspace/api/shared.d.ts +10 -0
  406. package/dist/types/ultramodern-workspace/api.d.ts +5 -73
  407. package/dist/types/ultramodern-workspace/app-files.d.ts +1 -7
  408. package/dist/types/ultramodern-workspace/backend-federation.d.ts +11 -0
  409. package/dist/types/ultramodern-workspace/bridge-config/cli.d.ts +3 -0
  410. package/dist/types/ultramodern-workspace/bridge-config/defaults.d.ts +1 -0
  411. package/dist/types/ultramodern-workspace/bridge-config/gates.d.ts +3 -0
  412. package/dist/types/ultramodern-workspace/bridge-config/index.d.ts +4 -0
  413. package/dist/types/ultramodern-workspace/bridge-config/normalize.d.ts +2 -0
  414. package/dist/types/ultramodern-workspace/bridge-config/schema.d.ts +61 -0
  415. package/dist/types/ultramodern-workspace/bridge-config/shared.d.ts +12 -0
  416. package/dist/types/ultramodern-workspace/bridge-config/validation.d.ts +3 -0
  417. package/dist/types/ultramodern-workspace/bridge-config/workspace-packages.d.ts +3 -0
  418. package/dist/types/ultramodern-workspace/bridge-config.d.ts +1 -64
  419. package/dist/types/ultramodern-workspace/codesmith.d.ts +5 -5
  420. package/dist/types/ultramodern-workspace/contracts.d.ts +1 -1
  421. package/dist/types/ultramodern-workspace/delivery-unit-sync.d.ts +6 -0
  422. package/dist/types/ultramodern-workspace/delivery-unit.d.ts +8 -0
  423. package/dist/types/ultramodern-workspace/demo-components.d.ts +0 -1
  424. package/dist/types/ultramodern-workspace/descriptors.d.ts +4 -0
  425. package/dist/types/ultramodern-workspace/effect-diagnostics.d.ts +1 -0
  426. package/dist/types/ultramodern-workspace/fs-io.d.ts +1 -7
  427. package/dist/types/ultramodern-workspace/generation-result.d.ts +2 -1
  428. package/dist/types/ultramodern-workspace/index.d.ts +1 -0
  429. package/dist/types/ultramodern-workspace/locales.d.ts +0 -181
  430. package/dist/types/ultramodern-workspace/mf-validation/constants.d.ts +5 -0
  431. package/dist/types/ultramodern-workspace/mf-validation/discovery.d.ts +2 -0
  432. package/dist/types/ultramodern-workspace/mf-validation/inspect.d.ts +2 -0
  433. package/dist/types/ultramodern-workspace/mf-validation/object-literal.d.ts +4 -0
  434. package/dist/types/ultramodern-workspace/mf-validation/path-utils.d.ts +11 -0
  435. package/dist/types/ultramodern-workspace/mf-validation/syntax.d.ts +5 -0
  436. package/dist/types/ultramodern-workspace/mf-validation/types.d.ts +33 -0
  437. package/dist/types/ultramodern-workspace/mf-validation/validate.d.ts +4 -0
  438. package/dist/types/ultramodern-workspace/mf-validation.d.ts +4 -27
  439. package/dist/types/ultramodern-workspace/module-federation/config.d.ts +5 -0
  440. package/dist/types/ultramodern-workspace/module-federation/index.d.ts +4 -0
  441. package/dist/types/ultramodern-workspace/module-federation/reexport-module.d.ts +4 -0
  442. package/dist/types/ultramodern-workspace/module-federation/remote-refs.d.ts +3 -0
  443. package/dist/types/ultramodern-workspace/module-federation/shared-config.d.ts +2 -0
  444. package/dist/types/ultramodern-workspace/module-federation.d.ts +2 -17
  445. package/dist/types/ultramodern-workspace/naming.d.ts +0 -2
  446. package/dist/types/ultramodern-workspace/package-json.d.ts +1 -16
  447. package/dist/types/ultramodern-workspace/policy.d.ts +0 -47
  448. package/dist/types/ultramodern-workspace/public-surface.d.ts +5 -15
  449. package/dist/types/ultramodern-workspace/routes.d.ts +0 -9
  450. package/dist/types/ultramodern-workspace/shared-patches.d.ts +1 -0
  451. package/dist/types/ultramodern-workspace/tooling-command-catalog.d.ts +18 -0
  452. package/dist/types/ultramodern-workspace/tsconfigs.d.ts +13 -0
  453. package/dist/types/ultramodern-workspace/types.d.ts +3 -2
  454. package/dist/types/ultramodern-workspace/versions.d.ts +23 -24
  455. package/dist/types/ultramodern-workspace/workspace-script-plan.d.ts +58 -0
  456. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +12 -4
  457. package/dist/types/ultramodern-workspace/workspace-validation-contract.d.ts +41 -0
  458. package/dist/types/ultramodern-workspace/write-app.d.ts +3 -0
  459. package/dist/types/ultramodern-workspace/write-workspace.d.ts +2 -2
  460. package/dist/types/ultramodern-workspace/zerops.d.ts +2 -0
  461. package/package.json +14 -11
  462. package/template-workspace/.gitignore.handlebars +4 -0
  463. package/template-workspace/AGENTS.md.handlebars +2 -2
  464. package/template-workspace/README.md.handlebars +21 -20
  465. package/template-workspace/patches/@module-federation__bridge-react@2.7.0.patch +140 -0
  466. package/template-workspace/patches/@module-federation__dts-plugin@2.7.0.patch +37 -0
  467. package/template-workspace/patches/@module-federation__modern-js-v3@2.7.0.patch +57 -0
  468. package/template-workspace/patches/@tanstack__router-core@1.171.14.patch +123 -0
  469. package/template-workspace/patches/drizzle-orm-ts7-strict-declarations.patch +452 -0
  470. package/template-workspace/patches/effect-schema-error-type-id.patch +18 -0
  471. package/template-workspace/pnpm-workspace.yaml.handlebars +80 -2
  472. package/template-workspace/scripts/bootstrap-agent-skills.mjs +11 -3
  473. package/templates/workspace/apps/modern.config.shared-module-federation.ts.handlebars +37 -0
  474. package/templates/workspace/apps/modern.config.ts.handlebars +252 -0
  475. package/templates/workspace/apps/shared/src/routes/ultramodern-jsonld.ts.handlebars +119 -0
  476. package/templates/workspace/apps/shared/src/routes/ultramodern-route-metadata.ts.handlebars +21 -0
  477. package/templates/workspace/apps/shell-super-app/src/routes/[lang]/page.tsx.handlebars +49 -0
  478. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.helpers.tsx.handlebars +79 -0
  479. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.imports.tsx.handlebars +11 -0
  480. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.tsx.handlebars +46 -0
  481. package/templates/workspace/packages/shared-design-tokens/tokens.css.handlebars +7 -0
  482. package/templates/workspace/tailwind.config.ts.handlebars +3 -0
  483. package/templates/workspace/verticals/server/checkout-cart-handlers.ts.handlebars +49 -0
  484. package/templates/workspace/verticals/server/checkout-cart-state.ts.handlebars +23 -0
  485. package/templates/workspace/verticals/shared/api.checkout-cart-contract-fields.ts.handlebars +1 -0
  486. package/templates/workspace/verticals/shared/api.checkout-cart-endpoints.ts.handlebars +23 -0
  487. package/templates/workspace/verticals/shared/api.checkout-cart-operation-contexts.ts.handlebars +25 -0
  488. package/templates/workspace/verticals/shared/api.checkout-cart-schemas.ts.handlebars +48 -0
  489. package/templates/workspace/verticals/src/api/checkout-cart-client-exports.ts.handlebars +70 -0
  490. package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +4 -4
  491. package/templates/workspace-scripts/check-ultramodern-api-boundaries.mts +40 -2
  492. package/templates/workspace-scripts/generate-node-backend-federation.mjs +299 -0
  493. package/templates/workspace-scripts/materialize-zerops-runtime.mjs +448 -0
  494. package/templates/workspace-scripts/proof-cloudflare-version.mjs +237 -9
  495. package/templates/workspace-scripts/proof-node-backend-federation.mjs +760 -0
  496. package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +188 -2
  497. package/templates/workspace-scripts/ultramodern-typecheck.mjs +1 -1
  498. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +479 -31
  499. package/template-workspace/patches/@tanstack__router-core@1.171.13.patch +0 -51
@@ -0,0 +1,760 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs';
3
+ import { createRequire } from 'node:module';
4
+ import path from 'node:path';
5
+ import { fileURLToPath, pathToFileURL } from 'node:url';
6
+
7
+ const workspaceRoot = path.resolve(process.env.ULTRAMODERN_WORKSPACE_ROOT ?? process.cwd());
8
+ const workspaceRequire = createRequire(path.join(workspaceRoot, 'package.json'));
9
+ const compactConfigPath = path.join(workspaceRoot, '.modernjs/ultramodern.json');
10
+ const defaultOut = path.join(
11
+ workspaceRoot,
12
+ '.codex/reports/node-backend-federation-proof/proof.json',
13
+ );
14
+
15
+ // Keep these constants/checks in sync with
16
+ // @modern-js/utils/universal backend-federation-contract. Generated workspace
17
+ // scripts do not currently import @modern-js/utils directly.
18
+ const contractVersion = 'microvertical-server-effect-v1';
19
+ const nodeAdapterVersion = 'backend-mf-effect-v1';
20
+ const backendExpose = './effect-api';
21
+ const localRuntimeRelativePaths = [
22
+ 'packages/cli/plugin-bff/dist/esm-node/runtime/effect/index.mjs',
23
+ 'cli/plugin-bff/dist/esm-node/runtime/effect/index.mjs',
24
+ ];
25
+
26
+ function readJson(filePath) {
27
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'));
28
+ }
29
+
30
+ function readBuildIdentity(app) {
31
+ const buildArtifactPath = path.join(
32
+ workspaceRoot,
33
+ app.directory,
34
+ 'shared/ultramodern-build.json',
35
+ );
36
+ if (fs.existsSync(buildArtifactPath)) {
37
+ const artifact = readJson(buildArtifactPath);
38
+ const deliveryUnit = artifact.deliveryUnit ?? {};
39
+ return {
40
+ buildVersion: deliveryUnit.buildMarker ?? deliveryUnit.build,
41
+ packageName: deliveryUnit.packageName,
42
+ version: deliveryUnit.version,
43
+ unitId: deliveryUnit.unitId,
44
+ sourceRevision: deliveryUnit.sourceRevision,
45
+ };
46
+ }
47
+
48
+ const buildModulePath = path.join(
49
+ workspaceRoot,
50
+ app.directory,
51
+ 'shared/ultramodern-build.ts',
52
+ );
53
+ if (!fs.existsSync(buildModulePath)) {
54
+ return {};
55
+ }
56
+ console.warn(
57
+ `[backend-federation-proof] ${path.relative(
58
+ workspaceRoot,
59
+ buildArtifactPath,
60
+ )} missing; falling back to legacy regex parsing of ${path.relative(
61
+ workspaceRoot,
62
+ buildModulePath,
63
+ )}.`,
64
+ );
65
+
66
+ const source = fs.readFileSync(buildModulePath, 'utf8');
67
+ return {
68
+ buildVersion: source.match(/\bbuild:\s*['"]([^'"]+)['"]/u)?.[1],
69
+ packageName: source.match(/\bpackageName:\s*['"]([^'"]+)['"]/u)?.[1],
70
+ version: source.match(/\bversion:\s*['"]([^'"]+)['"]/u)?.[1],
71
+ unitId: source.match(/\bunitId:\s*['"]([^'"]+)['"]/u)?.[1],
72
+ sourceRevision: source.match(/\bsourceRevision:\s*['"]([^'"]+)['"]/u)?.[1],
73
+ };
74
+ }
75
+
76
+ function hasBackendFederationManifestAdapter(runtime) {
77
+ return typeof runtime?.loadBackendFederatedEffectApiFromManifest === 'function';
78
+ }
79
+
80
+ function findLocalRuntimePath(createBin) {
81
+ let current = path.dirname(fileURLToPath(pathToFileURL(createBin)));
82
+ for (let depth = 0; depth < 8; depth += 1) {
83
+ for (const relativePath of localRuntimeRelativePaths) {
84
+ const candidate = path.join(current, relativePath);
85
+ if (fs.existsSync(candidate)) {
86
+ return candidate;
87
+ }
88
+ }
89
+
90
+ const parent = path.dirname(current);
91
+ if (parent === current) {
92
+ break;
93
+ }
94
+ current = parent;
95
+ }
96
+
97
+ return undefined;
98
+ }
99
+
100
+ async function importBackendFederationRuntime() {
101
+ let importError;
102
+ try {
103
+ const runtimePath = workspaceRequire.resolve('@modern-js/plugin-bff/effect');
104
+ const runtime = await import(pathToFileURL(runtimePath).href);
105
+ if (hasBackendFederationManifestAdapter(runtime)) {
106
+ return runtime;
107
+ }
108
+
109
+ importError = new Error(
110
+ `${runtimePath} does not export loadBackendFederatedEffectApiFromManifest`,
111
+ );
112
+ } catch (error) {
113
+ importError = error;
114
+ }
115
+
116
+ const createBin = process.env.ULTRAMODERN_CREATE_BIN;
117
+ if (!createBin) {
118
+ throw importError;
119
+ }
120
+
121
+ const localRuntimePath = findLocalRuntimePath(createBin);
122
+ if (!localRuntimePath) {
123
+ throw importError;
124
+ }
125
+
126
+ const localRuntime = await import(pathToFileURL(localRuntimePath).href);
127
+ if (!hasBackendFederationManifestAdapter(localRuntime)) {
128
+ throw new Error(
129
+ `${localRuntimePath} does not export loadBackendFederatedEffectApiFromManifest`,
130
+ );
131
+ }
132
+
133
+ return localRuntime;
134
+ }
135
+
136
+ function normalizeRelativePath(value) {
137
+ return String(value ?? '')
138
+ .replace(/\\/gu, '/')
139
+ .replace(/^\.\/+/u, '');
140
+ }
141
+
142
+ function toPascalCase(value) {
143
+ return String(value)
144
+ .split(/[^a-zA-Z0-9]+/u)
145
+ .filter(Boolean)
146
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
147
+ .join('');
148
+ }
149
+
150
+ function createBackendName(app) {
151
+ return (
152
+ app.backendFederation?.name ??
153
+ app.backendFederation?.executionSurfaces?.node?.remoteName ??
154
+ app.serverExecution?.node?.remoteName ??
155
+ (typeof app.moduleFederation?.name === 'string'
156
+ ? `${app.moduleFederation.name}Backend`
157
+ : `vertical${toPascalCase(app.id)}Backend`)
158
+ );
159
+ }
160
+
161
+ function createBackendManifestUrl(app) {
162
+ return (
163
+ app.backendFederation?.executionSurfaces?.node?.manifestUrl ??
164
+ app.serverExecution?.node?.manifestUrl ??
165
+ `http://localhost:${app.port}/backend-mf-manifest.json`
166
+ );
167
+ }
168
+
169
+ function createBackendContainerEntry(app) {
170
+ return (
171
+ app.backendFederation?.executionSurfaces?.node?.containerEntry ??
172
+ app.serverExecution?.node?.containerEntry ??
173
+ `http://localhost:${app.port}/backendRemoteEntry.mjs`
174
+ );
175
+ }
176
+
177
+ function resolveRemoteType(app) {
178
+ return (
179
+ app.backendFederation?.executionSurfaces?.node?.remoteType ??
180
+ app.serverExecution?.node?.remoteType ??
181
+ 'module'
182
+ );
183
+ }
184
+
185
+ function normalizeRoutePath(value) {
186
+ const route = String(value ?? '').trim();
187
+ if (!route) {
188
+ return '/';
189
+ }
190
+ return route.startsWith('/') ? route : `/${route}`;
191
+ }
192
+
193
+ function collectJsonSmokeChecks(apps, targetApp) {
194
+ const apiPrefix = normalizeRoutePath(targetApp.api?.prefix ?? `/${targetApp.id}-api`);
195
+
196
+ return apps
197
+ .flatMap((app) =>
198
+ Array.isArray(app?.deploy?.cloudflare?.jsonSmokeChecks)
199
+ ? app.deploy.cloudflare.jsonSmokeChecks
200
+ : [],
201
+ )
202
+ .filter((check) => {
203
+ if (typeof check?.route !== 'string') {
204
+ return false;
205
+ }
206
+ const route = normalizeRoutePath(check.route);
207
+ return route === apiPrefix || route.startsWith(`${apiPrefix}/`);
208
+ });
209
+ }
210
+
211
+ function compactApps(config, appFilter) {
212
+ const apps = Array.isArray(config.topology?.apps) ? config.topology.apps : [];
213
+ const filteredApps = apps
214
+ .filter((app) => app?.kind === 'vertical' && app.api)
215
+ .filter((app) => !appFilter || app.id === appFilter)
216
+ .map((app) => ({
217
+ id: app.id,
218
+ directory:
219
+ typeof app.path === 'string' ? normalizeRelativePath(app.path) : `verticals/${app.id}`,
220
+ backendName: createBackendName(app),
221
+ manifestUrl: createBackendManifestUrl(app),
222
+ containerEntry: createBackendContainerEntry(app),
223
+ remoteType: resolveRemoteType(app),
224
+ smokeChecks: collectJsonSmokeChecks(apps, app),
225
+ compactDeliveryUnit:
226
+ app.deliveryUnit && typeof app.deliveryUnit === 'object'
227
+ ? app.deliveryUnit
228
+ : undefined,
229
+ }));
230
+
231
+ if (appFilter && filteredApps.length === 0) {
232
+ throw new Error(`No vertical API app matched --app ${appFilter}`);
233
+ }
234
+
235
+ return filteredApps;
236
+ }
237
+
238
+ function assertEqual(actual, expected, message) {
239
+ if (actual !== expected) {
240
+ throw new Error(`${message}: expected ${expected}, received ${actual}`);
241
+ }
242
+ }
243
+
244
+ function assertFile(filePath, appId, label) {
245
+ if (!fs.existsSync(filePath)) {
246
+ throw new Error(
247
+ `${appId} missing ${path.relative(
248
+ workspaceRoot,
249
+ filePath,
250
+ )}; run pnpm build or the relevant vertical build before pnpm node:proof`,
251
+ );
252
+ }
253
+
254
+ if (!fs.statSync(filePath).isFile()) {
255
+ throw new Error(`${appId} ${label} is not a file`);
256
+ }
257
+ }
258
+
259
+ function jsonPathValue(value, path) {
260
+ const segments = String(path ?? '')
261
+ .split('.')
262
+ .filter(Boolean);
263
+ let current = value;
264
+ for (const segment of segments) {
265
+ if (current === null || current === undefined) {
266
+ return undefined;
267
+ }
268
+ if (Array.isArray(current) && /^\d+$/u.test(segment)) {
269
+ current = current[Number(segment)];
270
+ continue;
271
+ }
272
+ if (typeof current !== 'object' || !Object.hasOwn(current, segment)) {
273
+ return undefined;
274
+ }
275
+ current = current[segment];
276
+ }
277
+ return current;
278
+ }
279
+
280
+ function normalizeJsonExpectations(check) {
281
+ if (Array.isArray(check.expectations)) {
282
+ return check.expectations;
283
+ }
284
+ if (check.expect && typeof check.expect === 'object') {
285
+ return Object.entries(check.expect).map(([path, value]) => ({
286
+ path,
287
+ value,
288
+ }));
289
+ }
290
+ return [];
291
+ }
292
+
293
+ function assertJsonEqual(actual, expected, message) {
294
+ if (JSON.stringify(actual) !== JSON.stringify(expected)) {
295
+ throw new Error(
296
+ `${message}: expected ${JSON.stringify(expected)}, received ${JSON.stringify(actual)}`,
297
+ );
298
+ }
299
+ }
300
+
301
+ async function runSmokeChecks(app, loaded, createEffectBffTestHandler) {
302
+ if (!Array.isArray(app.smokeChecks) || app.smokeChecks.length === 0) {
303
+ return [];
304
+ }
305
+ if (typeof createEffectBffTestHandler !== 'function') {
306
+ throw new Error(`${app.id} backend runtime cannot create Effect test handler`);
307
+ }
308
+
309
+ const servicePrefix = loaded.contract?.servicePrefix;
310
+ if (typeof servicePrefix !== 'string' || servicePrefix.length === 0) {
311
+ throw new Error(`${app.id} backend expose missing contract.servicePrefix`);
312
+ }
313
+
314
+ const edge = await createEffectBffTestHandler({
315
+ module: loaded.runtime,
316
+ prefix: servicePrefix,
317
+ });
318
+ try {
319
+ const results = [];
320
+ for (const check of app.smokeChecks) {
321
+ const method = String(check.method ?? 'GET').toUpperCase();
322
+ const route = normalizeRoutePath(check.route);
323
+ const headers = {};
324
+ const init = { method, headers };
325
+ if (check.body !== undefined) {
326
+ headers['content-type'] = 'application/json';
327
+ init.body = JSON.stringify(check.body);
328
+ }
329
+
330
+ const response = await edge.handler(new Request(new URL(route, 'http://localhost'), init));
331
+ const bodyText = await response.text();
332
+ let body;
333
+ try {
334
+ body = bodyText.length > 0 ? JSON.parse(bodyText) : undefined;
335
+ } catch (error) {
336
+ throw new Error(`${app.id} ${method} ${route} did not return JSON: ${error.message}`);
337
+ }
338
+
339
+ if (!response.ok) {
340
+ throw new Error(`${app.id} ${method} ${route} returned HTTP ${response.status}`);
341
+ }
342
+
343
+ const assertions = normalizeJsonExpectations(check).map((expectation) => {
344
+ const actual = jsonPathValue(body, expectation.path);
345
+ assertJsonEqual(
346
+ actual,
347
+ expectation.value,
348
+ `${app.id} ${method} ${route} ${expectation.path}`,
349
+ );
350
+ return {
351
+ path: expectation.path,
352
+ expected: expectation.value,
353
+ actual,
354
+ status: 'pass',
355
+ };
356
+ });
357
+
358
+ results.push({
359
+ id: check.id ?? `${method} ${route}`,
360
+ method,
361
+ route,
362
+ statusCode: response.status,
363
+ assertions,
364
+ status: 'pass',
365
+ });
366
+ }
367
+ return results;
368
+ } finally {
369
+ await edge.dispose?.();
370
+ }
371
+ }
372
+
373
+ function resolveArtifacts(app, target) {
374
+ const targetDirectory = path.join(workspaceRoot, app.directory, target);
375
+
376
+ return {
377
+ manifestPath: path.join(targetDirectory, 'backend-mf-manifest.json'),
378
+ entryPath: path.join(targetDirectory, 'backendRemoteEntry.mjs'),
379
+ };
380
+ }
381
+
382
+ function validateManifest(app, manifest, buildIdentity) {
383
+ assertEqual(manifest.schemaVersion, 1, `${app.id} backend manifest schema`);
384
+ assertEqual(manifest.name, app.backendName, `${app.id} backend manifest name`);
385
+ assertEqual(manifest.id, app.backendName, `${app.id} backend manifest id`);
386
+ assertEqual(
387
+ manifest.version,
388
+ buildIdentity.version,
389
+ `${app.id} backend manifest version`,
390
+ );
391
+ assertEqual(
392
+ manifest.buildVersion,
393
+ buildIdentity.buildVersion,
394
+ `${app.id} backend manifest build version`,
395
+ );
396
+ assertEqual(manifest.metaData?.name, app.backendName, `${app.id} backend manifest metadata name`);
397
+ assertEqual(
398
+ manifest.metaData?.buildInfo?.buildName,
399
+ buildIdentity.packageName,
400
+ `${app.id} backend manifest package name`,
401
+ );
402
+ assertEqual(
403
+ manifest.metaData?.buildInfo?.buildVersion,
404
+ buildIdentity.buildVersion,
405
+ `${app.id} backend manifest metadata build version`,
406
+ );
407
+ assertEqual(
408
+ manifest.metaData?.remoteEntry?.name,
409
+ 'backendRemoteEntry.mjs',
410
+ `${app.id} backend manifest remote entry filename`,
411
+ );
412
+ assertEqual(
413
+ manifest.metaData?.remoteEntry?.type,
414
+ app.remoteType,
415
+ `${app.id} backend manifest remote entry type`,
416
+ );
417
+ assertEqual(manifest.entry?.url, app.containerEntry, `${app.id} backend manifest entry URL`);
418
+ assertEqual(manifest.entry?.type, app.remoteType, `${app.id} backend manifest entry type`);
419
+ assertEqual(
420
+ manifest.backendFederation?.role,
421
+ 'microvertical-server',
422
+ `${app.id} backend manifest role`,
423
+ );
424
+ assertEqual(
425
+ manifest.backendFederation?.runtimeFramework,
426
+ 'effect',
427
+ `${app.id} backend manifest runtime framework`,
428
+ );
429
+ assertEqual(
430
+ manifest.backendFederation?.strictEffectApproach,
431
+ true,
432
+ `${app.id} backend manifest strict Effect flag`,
433
+ );
434
+ assertEqual(
435
+ manifest.backendFederation?.contractVersion,
436
+ contractVersion,
437
+ `${app.id} backend manifest contract version`,
438
+ );
439
+ assertEqual(
440
+ manifest.backendFederation?.nodeAdapterVersion,
441
+ nodeAdapterVersion,
442
+ `${app.id} backend manifest Node adapter version`,
443
+ );
444
+ assertEqual(
445
+ manifest.backendFederation?.manifestUrl,
446
+ app.manifestUrl,
447
+ `${app.id} backend manifest URL`,
448
+ );
449
+ assertEqual(
450
+ manifest.backendFederation?.containerEntry,
451
+ app.containerEntry,
452
+ `${app.id} backend container URL`,
453
+ );
454
+ assertEqual(manifest.backendFederation?.expose, backendExpose, `${app.id} backend expose`);
455
+ assertEqual(
456
+ manifest.backendFederation?.versionBoundary?.packageName,
457
+ buildIdentity.packageName,
458
+ `${app.id} backend manifest version-boundary package`,
459
+ );
460
+ assertEqual(
461
+ manifest.backendFederation?.versionBoundary?.version,
462
+ buildIdentity.version,
463
+ `${app.id} backend manifest version-boundary version`,
464
+ );
465
+ assertEqual(
466
+ manifest.backendFederation?.versionBoundary?.buildVersion,
467
+ buildIdentity.buildVersion,
468
+ `${app.id} backend manifest version-boundary build version`,
469
+ );
470
+
471
+ const manifestDeliveryUnit = manifest.backendFederation?.deliveryUnit;
472
+ if (manifestDeliveryUnit) {
473
+ assertEqual(
474
+ manifestDeliveryUnit.unitId,
475
+ buildIdentity.unitId,
476
+ `${app.id} backend manifest delivery-unit id`,
477
+ );
478
+ assertEqual(
479
+ manifestDeliveryUnit.buildMarker,
480
+ buildIdentity.buildVersion,
481
+ `${app.id} backend manifest delivery-unit build marker`,
482
+ );
483
+ assertEqual(
484
+ manifestDeliveryUnit.packageName,
485
+ buildIdentity.packageName,
486
+ `${app.id} backend manifest delivery-unit package name`,
487
+ );
488
+ assertEqual(
489
+ manifestDeliveryUnit.version,
490
+ buildIdentity.version,
491
+ `${app.id} backend manifest delivery-unit version`,
492
+ );
493
+ assertEqual(
494
+ manifestDeliveryUnit.sourceRevision,
495
+ buildIdentity.sourceRevision,
496
+ `${app.id} backend manifest delivery-unit source revision`,
497
+ );
498
+ }
499
+
500
+ const versionBoundaryDeliveryUnit =
501
+ manifest.backendFederation?.versionBoundary?.deliveryUnit;
502
+ if (versionBoundaryDeliveryUnit) {
503
+ assertEqual(
504
+ versionBoundaryDeliveryUnit.unitId,
505
+ buildIdentity.unitId,
506
+ `${app.id} backend manifest version-boundary delivery-unit id`,
507
+ );
508
+ assertEqual(
509
+ versionBoundaryDeliveryUnit.buildMarker,
510
+ buildIdentity.buildVersion,
511
+ `${app.id} backend manifest version-boundary delivery-unit build marker`,
512
+ );
513
+ }
514
+
515
+ const exposes = Array.isArray(manifest.exposes) ? manifest.exposes : [];
516
+ if (!exposes.some((expose) => expose?.name === backendExpose)) {
517
+ throw new Error(`${app.id} backend manifest missing ${backendExpose} expose`);
518
+ }
519
+ }
520
+
521
+ function assertCompactDeliveryUnitMatchesBuild(app, buildIdentity) {
522
+ const compactDeliveryUnit = app.compactDeliveryUnit;
523
+ if (!compactDeliveryUnit) {
524
+ return;
525
+ }
526
+
527
+ const mismatches = [];
528
+ const compare = (label, a, b) => {
529
+ if (a !== undefined && b !== undefined && a !== b) {
530
+ mismatches.push(`${label}: deliveryUnit=${a} vs ultramodern-build=${b}`);
531
+ }
532
+ };
533
+ compare('unitId', compactDeliveryUnit.unitId, buildIdentity.unitId);
534
+ compare(
535
+ 'buildMarker/build',
536
+ compactDeliveryUnit.buildMarker,
537
+ buildIdentity.buildVersion,
538
+ );
539
+ compare(
540
+ 'packageName',
541
+ compactDeliveryUnit.packageName,
542
+ buildIdentity.packageName,
543
+ );
544
+ compare('version', compactDeliveryUnit.version, buildIdentity.version);
545
+
546
+ if (mismatches.length > 0) {
547
+ throw new Error(
548
+ `${app.id} delivery-unit identity drift between ${path.relative(
549
+ workspaceRoot,
550
+ compactConfigPath,
551
+ )} (deliveryUnit) and ${path.relative(
552
+ workspaceRoot,
553
+ path.join(workspaceRoot, app.directory, 'shared/ultramodern-build.ts'),
554
+ )}: ${mismatches.join('; ')}`,
555
+ );
556
+ }
557
+ }
558
+
559
+ async function importBackendEntry(entryPath) {
560
+ const entry = await import(pathToFileURL(entryPath).href);
561
+ const container = entry.default ?? entry;
562
+
563
+ if (!container || typeof container.get !== 'function' || typeof container.init !== 'function') {
564
+ throw new Error(
565
+ `${path.relative(
566
+ workspaceRoot,
567
+ entryPath,
568
+ )} does not export a Module Federation get/init container`,
569
+ );
570
+ }
571
+
572
+ return container;
573
+ }
574
+
575
+ async function proveBackend(app, backendRuntime, target) {
576
+ const {
577
+ createEffectBffTestHandler,
578
+ loadBackendFederatedEffectApiFromManifest,
579
+ } = backendRuntime;
580
+ const { manifestPath, entryPath } = resolveArtifacts(app, target);
581
+
582
+ assertFile(manifestPath, app.id, 'backend manifest');
583
+ assertFile(entryPath, app.id, 'backend remote entry');
584
+
585
+ const buildIdentity = readBuildIdentity(app);
586
+ assertCompactDeliveryUnitMatchesBuild(app, buildIdentity);
587
+ const manifest = readJson(manifestPath);
588
+ validateManifest(app, manifest, buildIdentity);
589
+
590
+ const localRuntimeEntry = pathToFileURL(entryPath).href;
591
+ const loaded = await loadBackendFederatedEffectApiFromManifest({
592
+ hostName: 'ultramodernNodeBackendProof',
593
+ manifest,
594
+ manifestPath,
595
+ remote: {
596
+ entry: localRuntimeEntry,
597
+ },
598
+ expected: {
599
+ buildMarker: buildIdentity.buildVersion,
600
+ buildVersion: buildIdentity.buildVersion,
601
+ contractVersion,
602
+ nodeAdapterVersion,
603
+ packageName: buildIdentity.packageName,
604
+ remoteName: app.backendName,
605
+ unitId: buildIdentity.unitId,
606
+ },
607
+ });
608
+ const backendContract = loaded.backendFederationContract;
609
+
610
+ assertEqual(
611
+ backendContract?.strictEffectApproach,
612
+ true,
613
+ `${app.id} backend expose strict Effect flag`,
614
+ );
615
+ assertEqual(
616
+ backendContract?.runtimeFramework,
617
+ 'effect',
618
+ `${app.id} backend expose runtime framework`,
619
+ );
620
+ assertEqual(backendContract?.role, 'microvertical-server', `${app.id} backend expose role`);
621
+ assertEqual(backendContract?.name, app.backendName, `${app.id} backend expose name`);
622
+ assertEqual(
623
+ backendContract?.compatibility?.contractVersion,
624
+ contractVersion,
625
+ `${app.id} backend expose contract version`,
626
+ );
627
+ assertEqual(
628
+ backendContract?.compatibility?.nodeAdapterVersion,
629
+ nodeAdapterVersion,
630
+ `${app.id} backend expose Node adapter version`,
631
+ );
632
+ assertEqual(
633
+ backendContract?.compatibility?.packageName,
634
+ buildIdentity.packageName,
635
+ `${app.id} backend expose package name`,
636
+ );
637
+ assertEqual(
638
+ backendContract?.compatibility?.build,
639
+ buildIdentity.buildVersion,
640
+ `${app.id} backend expose build version`,
641
+ );
642
+ assertEqual(
643
+ manifest.buildVersion,
644
+ backendContract?.compatibility?.build,
645
+ `${app.id} backend manifest/expose build coupling`,
646
+ );
647
+ if (backendContract?.compatibility?.unitId !== undefined) {
648
+ assertEqual(
649
+ backendContract.compatibility.unitId,
650
+ manifest.backendFederation?.deliveryUnit?.unitId,
651
+ `${app.id} backend expose delivery-unit id`,
652
+ );
653
+ }
654
+
655
+ if (loaded.api === undefined || loaded.runtime === undefined) {
656
+ throw new Error(`${app.id} backend expose missing api/runtime exports`);
657
+ }
658
+
659
+ const smokeChecks = await runSmokeChecks(app, loaded, createEffectBffTestHandler);
660
+
661
+ return {
662
+ appId: app.id,
663
+ expose: backendExpose,
664
+ manifestPath: normalizeRelativePath(path.relative(workspaceRoot, manifestPath)),
665
+ containerPath: normalizeRelativePath(path.relative(workspaceRoot, entryPath)),
666
+ manifestUrl: app.manifestUrl,
667
+ containerEntry: app.containerEntry,
668
+ runtimeEntry: localRuntimeEntry,
669
+ remoteName: app.backendName,
670
+ remoteType: app.remoteType,
671
+ versionBoundary: {
672
+ packageName: buildIdentity.packageName,
673
+ version: buildIdentity.version,
674
+ buildVersion: buildIdentity.buildVersion,
675
+ unitId: buildIdentity.unitId,
676
+ sourceRevision: buildIdentity.sourceRevision,
677
+ },
678
+ smokeChecks,
679
+ status: 'pass',
680
+ };
681
+ }
682
+
683
+ function parseArgs(argv) {
684
+ const parsed = { app: undefined, out: defaultOut, target: 'dist' };
685
+
686
+ for (let index = 0; index < argv.length; index += 1) {
687
+ const arg = argv[index];
688
+ if (arg === '--out') {
689
+ parsed.out = argv[index + 1];
690
+ index += 1;
691
+ } else if (arg === '--app') {
692
+ parsed.app = argv[index + 1];
693
+ index += 1;
694
+ } else if (arg === '--target') {
695
+ parsed.target = argv[index + 1];
696
+ index += 1;
697
+ } else if (arg === '--help' || arg === '-h') {
698
+ parsed.help = true;
699
+ } else {
700
+ throw new Error(`Unknown argument: ${arg}`);
701
+ }
702
+ }
703
+
704
+ if (!parsed.out) {
705
+ throw new Error('--out requires a path');
706
+ }
707
+ if (!parsed.target) {
708
+ throw new Error('--target requires a directory name');
709
+ }
710
+
711
+ return parsed;
712
+ }
713
+
714
+ function printHelp() {
715
+ process.stdout
716
+ .write(`Usage: node scripts/proof-node-backend-federation.mjs [--app id] [--target dist] [--out proof.json]
717
+ `);
718
+ }
719
+
720
+ async function main(argv = process.argv.slice(2)) {
721
+ const args = parseArgs(argv);
722
+ if (args.help) {
723
+ printHelp();
724
+ return 0;
725
+ }
726
+
727
+ const config = readJson(compactConfigPath);
728
+ const apps = compactApps(config, args.app);
729
+ const results = [];
730
+ const backendRuntime =
731
+ apps.length > 0 ? await importBackendFederationRuntime() : undefined;
732
+
733
+ for (const app of apps) {
734
+ results.push(await proveBackend(app, backendRuntime, args.target));
735
+ }
736
+
737
+ const report = {
738
+ schemaVersion: 1,
739
+ generatedAt: new Date().toISOString(),
740
+ status: results.length > 0 ? 'pass' : 'skipped',
741
+ target: args.target,
742
+ results,
743
+ };
744
+
745
+ fs.mkdirSync(path.dirname(args.out), { recursive: true });
746
+ fs.writeFileSync(args.out, `${JSON.stringify(report, null, 2)}\n`);
747
+ process.stdout.write(`[node-backend-federation-proof] ${report.status}: ${args.out}\n`);
748
+
749
+ return 0;
750
+ }
751
+
752
+ main().then(
753
+ (exitCode) => {
754
+ process.exitCode = exitCode;
755
+ },
756
+ (error) => {
757
+ process.stderr.write(`[node-backend-federation-proof] ${error.message}\n`);
758
+ process.exitCode = 1;
759
+ },
760
+ );