@bleedingdev/modern-js-create 3.5.0-ultramodern.6 → 3.5.0-ultramodern.75

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 (562) hide show
  1. package/README.md +25 -25
  2. package/bin/run.js +0 -0
  3. package/dist/cjs/cli/flags.cjs +357 -0
  4. package/dist/cjs/cli/help.cjs +108 -0
  5. package/dist/cjs/cli/package-source.cjs +188 -0
  6. package/dist/cjs/cli/project-setup.cjs +162 -0
  7. package/dist/cjs/cli/prompts.cjs +100 -0
  8. package/dist/cjs/index.cjs +35 -585
  9. package/dist/cjs/locale/en.cjs +5 -6
  10. package/dist/cjs/locale/zh.cjs +5 -6
  11. package/dist/cjs/ultramodern-package-source.cjs +0 -32
  12. package/dist/cjs/ultramodern-release-cohort.cjs +206 -0
  13. package/dist/cjs/ultramodern-tooling/commands/cloudflare-output-verify.cjs +136 -0
  14. package/dist/cjs/ultramodern-tooling/commands/context.cjs +131 -0
  15. package/dist/cjs/ultramodern-tooling/commands/mf-types.cjs +55 -0
  16. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.cjs +212 -0
  17. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.cjs +50 -0
  18. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.cjs +87 -0
  19. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.cjs +58 -0
  20. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.cjs +74 -0
  21. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.cjs +99 -0
  22. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.cjs +132 -0
  23. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.cjs +67 -0
  24. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.cjs +205 -0
  25. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.cjs +60 -0
  26. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.cjs +67 -0
  27. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.cjs +67 -0
  28. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/help.cjs +54 -0
  29. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/install.cjs +52 -0
  30. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/io.cjs +350 -0
  31. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.cjs +200 -0
  32. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-source.cjs +89 -0
  33. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.cjs +442 -0
  34. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.cjs +358 -0
  35. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.cjs +99 -0
  36. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.cjs +135 -0
  37. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect.cjs +410 -0
  38. package/dist/cjs/ultramodern-tooling/commands/options.cjs +59 -0
  39. package/dist/cjs/ultramodern-tooling/commands/routes-generate.cjs +122 -0
  40. package/dist/cjs/ultramodern-tooling/commands/skills.cjs +49 -0
  41. package/dist/cjs/ultramodern-tooling/commands/sync-delivery-unit.cjs +40 -0
  42. package/dist/cjs/ultramodern-tooling/commands/validate.cjs +53 -0
  43. package/dist/cjs/ultramodern-tooling/commands.cjs +27 -491
  44. package/dist/cjs/ultramodern-tooling/config/constants.cjs +48 -0
  45. package/dist/cjs/ultramodern-tooling/config/index.cjs +104 -0
  46. package/dist/cjs/ultramodern-tooling/config/json.cjs +61 -0
  47. package/dist/cjs/ultramodern-tooling/config/load.cjs +62 -0
  48. package/dist/cjs/ultramodern-tooling/config/metadata.cjs +92 -0
  49. package/dist/cjs/ultramodern-tooling/config/normalize.cjs +236 -0
  50. package/dist/cjs/ultramodern-tooling/config/synthesize.cjs +157 -0
  51. package/dist/cjs/ultramodern-tooling/config/types.cjs +18 -0
  52. package/dist/cjs/ultramodern-tooling/config.cjs +23 -133
  53. package/dist/cjs/ultramodern-workspace/add-shell.cjs +274 -0
  54. package/dist/cjs/ultramodern-workspace/add-vertical/constants.cjs +52 -0
  55. package/dist/cjs/ultramodern-workspace/add-vertical/execute.cjs +183 -0
  56. package/dist/cjs/ultramodern-workspace/add-vertical/plan.cjs +255 -0
  57. package/dist/cjs/ultramodern-workspace/add-vertical/preflight.cjs +256 -0
  58. package/dist/cjs/ultramodern-workspace/add-vertical/shell-files.cjs +122 -0
  59. package/dist/cjs/ultramodern-workspace/add-vertical/topology.cjs +152 -0
  60. package/dist/cjs/ultramodern-workspace/add-vertical/transaction.cjs +327 -0
  61. package/dist/cjs/ultramodern-workspace/add-vertical/workspace-state.cjs +137 -0
  62. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +22 -571
  63. package/dist/cjs/ultramodern-workspace/api/checkout-cart.cjs +145 -0
  64. package/dist/cjs/ultramodern-workspace/api/client.cjs +224 -0
  65. package/dist/cjs/ultramodern-workspace/api/contracts.cjs +251 -0
  66. package/dist/cjs/ultramodern-workspace/api/names.cjs +98 -0
  67. package/dist/cjs/ultramodern-workspace/api/rpc.cjs +264 -0
  68. package/dist/cjs/ultramodern-workspace/api/service.cjs +252 -0
  69. package/dist/cjs/ultramodern-workspace/api/shared.cjs +270 -0
  70. package/dist/cjs/ultramodern-workspace/api.cjs +49 -1005
  71. package/dist/cjs/ultramodern-workspace/app-files.cjs +51 -69
  72. package/dist/cjs/ultramodern-workspace/backend-federation.cjs +346 -0
  73. package/dist/cjs/ultramodern-workspace/bridge-config/cli.cjs +71 -0
  74. package/dist/cjs/ultramodern-workspace/bridge-config/defaults.cjs +43 -0
  75. package/dist/cjs/ultramodern-workspace/bridge-config/gates.cjs +93 -0
  76. package/dist/cjs/ultramodern-workspace/bridge-config/index.cjs +60 -0
  77. package/dist/cjs/ultramodern-workspace/bridge-config/normalize.cjs +68 -0
  78. package/dist/cjs/ultramodern-workspace/bridge-config/schema.cjs +78 -0
  79. package/dist/cjs/ultramodern-workspace/bridge-config/shared.cjs +110 -0
  80. package/dist/cjs/ultramodern-workspace/bridge-config/validation.cjs +68 -0
  81. package/dist/cjs/ultramodern-workspace/bridge-config/workspace-packages.cjs +108 -0
  82. package/dist/cjs/ultramodern-workspace/bridge-config.cjs +32 -297
  83. package/dist/cjs/ultramodern-workspace/codesmith.cjs +10 -1
  84. package/dist/cjs/ultramodern-workspace/contracts.cjs +80 -26
  85. package/dist/cjs/ultramodern-workspace/delivery-unit-schema/types.cjs +291 -0
  86. package/dist/cjs/ultramodern-workspace/delivery-unit-schema/up-projection.cjs +188 -0
  87. package/dist/cjs/ultramodern-workspace/delivery-unit-stamp.cjs +56 -0
  88. package/dist/cjs/ultramodern-workspace/delivery-unit-sync.cjs +153 -0
  89. package/dist/cjs/ultramodern-workspace/delivery-unit.cjs +75 -0
  90. package/dist/cjs/ultramodern-workspace/demo-components.cjs +474 -205
  91. package/dist/cjs/ultramodern-workspace/descriptors.cjs +101 -16
  92. package/dist/cjs/ultramodern-workspace/effect-diagnostics.cjs +114 -0
  93. package/dist/cjs/ultramodern-workspace/fs-io.cjs +26 -36
  94. package/dist/cjs/ultramodern-workspace/generation-result.cjs +36 -3
  95. package/dist/cjs/ultramodern-workspace/index.cjs +28 -0
  96. package/dist/cjs/ultramodern-workspace/locales.cjs +3 -17
  97. package/dist/cjs/ultramodern-workspace/mf-validation/constants.cjs +69 -0
  98. package/dist/cjs/ultramodern-workspace/mf-validation/discovery.cjs +77 -0
  99. package/dist/cjs/ultramodern-workspace/mf-validation/inspect.cjs +84 -0
  100. package/dist/cjs/ultramodern-workspace/mf-validation/object-literal.cjs +188 -0
  101. package/dist/cjs/ultramodern-workspace/mf-validation/path-utils.cjs +165 -0
  102. package/dist/cjs/ultramodern-workspace/mf-validation/syntax.cjs +201 -0
  103. package/dist/cjs/ultramodern-workspace/mf-validation/types.cjs +18 -0
  104. package/dist/cjs/ultramodern-workspace/mf-validation/validate.cjs +112 -0
  105. package/dist/cjs/ultramodern-workspace/mf-validation.cjs +6 -529
  106. package/dist/cjs/ultramodern-workspace/module-federation/config.cjs +336 -0
  107. package/dist/cjs/ultramodern-workspace/module-federation/index.cjs +73 -0
  108. package/dist/cjs/ultramodern-workspace/module-federation/reexport-module.cjs +111 -0
  109. package/dist/cjs/ultramodern-workspace/module-federation/remote-refs.cjs +106 -0
  110. package/dist/cjs/ultramodern-workspace/module-federation/shared-config.cjs +53 -0
  111. package/dist/cjs/ultramodern-workspace/module-federation.cjs +18 -477
  112. package/dist/cjs/ultramodern-workspace/naming.cjs +1 -7
  113. package/dist/cjs/ultramodern-workspace/overlay-baseline-guard.cjs +408 -0
  114. package/dist/cjs/ultramodern-workspace/overlays.cjs +39 -5
  115. package/dist/cjs/ultramodern-workspace/package-json.cjs +54 -301
  116. package/dist/cjs/ultramodern-workspace/package-source.cjs +11 -2
  117. package/dist/cjs/ultramodern-workspace/policy.cjs +789 -24
  118. package/dist/cjs/ultramodern-workspace/public-surface.cjs +1 -22
  119. package/dist/cjs/ultramodern-workspace/routes.cjs +8 -157
  120. package/dist/cjs/ultramodern-workspace/shared-patches.cjs +41 -0
  121. package/dist/cjs/ultramodern-workspace/shells.cjs +151 -0
  122. package/dist/cjs/ultramodern-workspace/tooling-command-catalog.cjs +147 -0
  123. package/dist/cjs/ultramodern-workspace/tsconfigs.cjs +200 -0
  124. package/dist/cjs/ultramodern-workspace/types.cjs +27 -0
  125. package/dist/cjs/ultramodern-workspace/versions.cjs +52 -37
  126. package/dist/cjs/ultramodern-workspace/workspace-script-plan.cjs +174 -0
  127. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +118 -88
  128. package/dist/cjs/ultramodern-workspace/workspace-validation-contract.cjs +642 -0
  129. package/dist/cjs/ultramodern-workspace/write-app.cjs +148 -0
  130. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +45 -67
  131. package/dist/cjs/ultramodern-workspace/zerops.cjs +108 -0
  132. package/dist/esm/cli/flags.js +262 -0
  133. package/dist/esm/cli/help.js +67 -0
  134. package/dist/esm/cli/package-source.js +124 -0
  135. package/dist/esm/cli/project-setup.js +105 -0
  136. package/dist/esm/cli/prompts.js +51 -0
  137. package/dist/esm/index.js +19 -565
  138. package/dist/esm/locale/en.js +5 -6
  139. package/dist/esm/locale/zh.js +5 -6
  140. package/dist/esm/ultramodern-package-source.js +1 -24
  141. package/dist/esm/ultramodern-release-cohort.js +133 -0
  142. package/dist/esm/ultramodern-tooling/commands/cloudflare-output-verify.js +88 -0
  143. package/dist/esm/ultramodern-tooling/commands/context.js +66 -0
  144. package/dist/esm/ultramodern-tooling/commands/mf-types.js +17 -0
  145. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.js +154 -0
  146. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.js +12 -0
  147. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.js +38 -0
  148. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.js +10 -0
  149. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +22 -0
  150. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +50 -0
  151. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.js +83 -0
  152. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.js +16 -0
  153. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +156 -0
  154. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.js +12 -0
  155. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.js +7 -0
  156. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.js +15 -0
  157. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/help.js +16 -0
  158. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/install.js +14 -0
  159. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/io.js +285 -0
  160. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +156 -0
  161. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-source.js +51 -0
  162. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +383 -0
  163. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +311 -0
  164. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.js +24 -0
  165. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.js +80 -0
  166. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect.js +361 -0
  167. package/dist/esm/ultramodern-tooling/commands/options.js +18 -0
  168. package/dist/esm/ultramodern-tooling/commands/routes-generate.js +74 -0
  169. package/dist/esm/ultramodern-tooling/commands/skills.js +11 -0
  170. package/dist/esm/ultramodern-tooling/commands/sync-delivery-unit.js +1 -0
  171. package/dist/esm/ultramodern-tooling/commands/validate.js +15 -0
  172. package/dist/esm/ultramodern-tooling/commands.js +23 -482
  173. package/dist/esm/ultramodern-tooling/config/constants.js +4 -0
  174. package/dist/esm/ultramodern-tooling/config/index.js +7 -0
  175. package/dist/esm/ultramodern-tooling/config/json.js +10 -0
  176. package/dist/esm/ultramodern-tooling/config/load.js +13 -0
  177. package/dist/esm/ultramodern-tooling/config/metadata.js +37 -0
  178. package/dist/esm/ultramodern-tooling/config/normalize.js +173 -0
  179. package/dist/esm/ultramodern-tooling/config/synthesize.js +108 -0
  180. package/dist/esm/ultramodern-tooling/config/types.js +0 -0
  181. package/dist/esm/ultramodern-tooling/config.js +1 -120
  182. package/dist/esm/ultramodern-workspace/add-shell.js +221 -0
  183. package/dist/esm/ultramodern-workspace/add-vertical/constants.js +5 -0
  184. package/dist/esm/ultramodern-workspace/add-vertical/execute.js +135 -0
  185. package/dist/esm/ultramodern-workspace/add-vertical/plan.js +205 -0
  186. package/dist/esm/ultramodern-workspace/add-vertical/preflight.js +198 -0
  187. package/dist/esm/ultramodern-workspace/add-vertical/shell-files.js +65 -0
  188. package/dist/esm/ultramodern-workspace/add-vertical/topology.js +108 -0
  189. package/dist/esm/ultramodern-workspace/add-vertical/transaction.js +254 -0
  190. package/dist/esm/ultramodern-workspace/add-vertical/workspace-state.js +67 -0
  191. package/dist/esm/ultramodern-workspace/add-vertical.js +6 -544
  192. package/dist/esm/ultramodern-workspace/api/checkout-cart.js +86 -0
  193. package/dist/esm/ultramodern-workspace/api/client.js +183 -0
  194. package/dist/esm/ultramodern-workspace/api/contracts.js +201 -0
  195. package/dist/esm/ultramodern-workspace/api/names.js +33 -0
  196. package/dist/esm/ultramodern-workspace/api/rpc.js +205 -0
  197. package/dist/esm/ultramodern-workspace/api/service.js +211 -0
  198. package/dist/esm/ultramodern-workspace/api/shared.js +226 -0
  199. package/dist/esm/ultramodern-workspace/api.js +6 -984
  200. package/dist/esm/ultramodern-workspace/app-files.js +51 -51
  201. package/dist/esm/ultramodern-workspace/backend-federation.js +281 -0
  202. package/dist/esm/ultramodern-workspace/bridge-config/cli.js +30 -0
  203. package/dist/esm/ultramodern-workspace/bridge-config/defaults.js +5 -0
  204. package/dist/esm/ultramodern-workspace/bridge-config/gates.js +52 -0
  205. package/dist/esm/ultramodern-workspace/bridge-config/index.js +3 -0
  206. package/dist/esm/ultramodern-workspace/bridge-config/normalize.js +30 -0
  207. package/dist/esm/ultramodern-workspace/bridge-config/schema.js +31 -0
  208. package/dist/esm/ultramodern-workspace/bridge-config/shared.js +51 -0
  209. package/dist/esm/ultramodern-workspace/bridge-config/validation.js +27 -0
  210. package/dist/esm/ultramodern-workspace/bridge-config/workspace-packages.js +67 -0
  211. package/dist/esm/ultramodern-workspace/bridge-config.js +1 -270
  212. package/dist/esm/ultramodern-workspace/codesmith.js +10 -1
  213. package/dist/esm/ultramodern-workspace/contracts.js +81 -27
  214. package/dist/esm/ultramodern-workspace/delivery-unit-schema/types.js +235 -0
  215. package/dist/esm/ultramodern-workspace/delivery-unit-schema/up-projection.js +129 -0
  216. package/dist/esm/ultramodern-workspace/delivery-unit-stamp.js +18 -0
  217. package/dist/esm/ultramodern-workspace/delivery-unit-sync.js +104 -0
  218. package/dist/esm/ultramodern-workspace/delivery-unit.js +21 -0
  219. package/dist/esm/ultramodern-workspace/demo-components.js +461 -204
  220. package/dist/esm/ultramodern-workspace/descriptors.js +75 -17
  221. package/dist/esm/ultramodern-workspace/effect-diagnostics.js +76 -0
  222. package/dist/esm/ultramodern-workspace/fs-io.js +27 -18
  223. package/dist/esm/ultramodern-workspace/generation-result.js +33 -3
  224. package/dist/esm/ultramodern-workspace/index.js +4 -0
  225. package/dist/esm/ultramodern-workspace/locales.js +3 -4
  226. package/dist/esm/ultramodern-workspace/mf-validation/constants.js +19 -0
  227. package/dist/esm/ultramodern-workspace/mf-validation/discovery.js +28 -0
  228. package/dist/esm/ultramodern-workspace/mf-validation/inspect.js +46 -0
  229. package/dist/esm/ultramodern-workspace/mf-validation/object-literal.js +144 -0
  230. package/dist/esm/ultramodern-workspace/mf-validation/path-utils.js +89 -0
  231. package/dist/esm/ultramodern-workspace/mf-validation/syntax.js +154 -0
  232. package/dist/esm/ultramodern-workspace/mf-validation/types.js +0 -0
  233. package/dist/esm/ultramodern-workspace/mf-validation/validate.js +57 -0
  234. package/dist/esm/ultramodern-workspace/mf-validation.js +3 -516
  235. package/dist/esm/ultramodern-workspace/module-federation/config.js +289 -0
  236. package/dist/esm/ultramodern-workspace/module-federation/index.js +4 -0
  237. package/dist/esm/ultramodern-workspace/module-federation/reexport-module.js +67 -0
  238. package/dist/esm/ultramodern-workspace/module-federation/remote-refs.js +65 -0
  239. package/dist/esm/ultramodern-workspace/module-federation/shared-config.js +12 -0
  240. package/dist/esm/ultramodern-workspace/module-federation.js +2 -458
  241. package/dist/esm/ultramodern-workspace/naming.js +2 -2
  242. package/dist/esm/ultramodern-workspace/overlay-baseline-guard.js +350 -0
  243. package/dist/esm/ultramodern-workspace/overlays.js +28 -5
  244. package/dist/esm/ultramodern-workspace/package-json.js +48 -283
  245. package/dist/esm/ultramodern-workspace/package-source.js +7 -1
  246. package/dist/esm/ultramodern-workspace/policy.js +772 -10
  247. package/dist/esm/ultramodern-workspace/public-surface.js +2 -2
  248. package/dist/esm/ultramodern-workspace/routes.js +9 -143
  249. package/dist/esm/ultramodern-workspace/shared-patches.js +3 -0
  250. package/dist/esm/ultramodern-workspace/shells.js +92 -0
  251. package/dist/esm/ultramodern-workspace/tooling-command-catalog.js +100 -0
  252. package/dist/esm/ultramodern-workspace/tsconfigs.js +137 -0
  253. package/dist/esm/ultramodern-workspace/types.js +16 -1
  254. package/dist/esm/ultramodern-workspace/versions.js +35 -26
  255. package/dist/esm/ultramodern-workspace/workspace-script-plan.js +124 -0
  256. package/dist/esm/ultramodern-workspace/workspace-scripts.js +115 -85
  257. package/dist/esm/ultramodern-workspace/workspace-validation-contract.js +604 -0
  258. package/dist/esm/ultramodern-workspace/write-app.js +105 -0
  259. package/dist/esm/ultramodern-workspace/write-workspace.js +47 -66
  260. package/dist/esm/ultramodern-workspace/zerops.js +70 -0
  261. package/dist/esm-node/cli/flags.js +263 -0
  262. package/dist/esm-node/cli/help.js +68 -0
  263. package/dist/esm-node/cli/package-source.js +125 -0
  264. package/dist/esm-node/cli/project-setup.js +106 -0
  265. package/dist/esm-node/cli/prompts.js +52 -0
  266. package/dist/esm-node/index.js +19 -565
  267. package/dist/esm-node/locale/en.js +5 -6
  268. package/dist/esm-node/locale/zh.js +5 -6
  269. package/dist/esm-node/ultramodern-package-source.js +1 -24
  270. package/dist/esm-node/ultramodern-release-cohort.js +134 -0
  271. package/dist/esm-node/ultramodern-tooling/commands/cloudflare-output-verify.js +89 -0
  272. package/dist/esm-node/ultramodern-tooling/commands/context.js +67 -0
  273. package/dist/esm-node/ultramodern-tooling/commands/mf-types.js +18 -0
  274. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.js +155 -0
  275. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.js +13 -0
  276. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.js +39 -0
  277. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.js +11 -0
  278. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +23 -0
  279. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +51 -0
  280. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.js +84 -0
  281. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.js +17 -0
  282. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +157 -0
  283. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.js +13 -0
  284. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.js +8 -0
  285. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.js +16 -0
  286. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/help.js +17 -0
  287. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/install.js +15 -0
  288. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/io.js +286 -0
  289. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +157 -0
  290. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-source.js +52 -0
  291. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +384 -0
  292. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +312 -0
  293. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.js +25 -0
  294. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.js +81 -0
  295. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect.js +362 -0
  296. package/dist/esm-node/ultramodern-tooling/commands/options.js +19 -0
  297. package/dist/esm-node/ultramodern-tooling/commands/routes-generate.js +75 -0
  298. package/dist/esm-node/ultramodern-tooling/commands/skills.js +12 -0
  299. package/dist/esm-node/ultramodern-tooling/commands/sync-delivery-unit.js +2 -0
  300. package/dist/esm-node/ultramodern-tooling/commands/validate.js +16 -0
  301. package/dist/esm-node/ultramodern-tooling/commands.js +23 -482
  302. package/dist/esm-node/ultramodern-tooling/config/constants.js +5 -0
  303. package/dist/esm-node/ultramodern-tooling/config/index.js +8 -0
  304. package/dist/esm-node/ultramodern-tooling/config/json.js +11 -0
  305. package/dist/esm-node/ultramodern-tooling/config/load.js +14 -0
  306. package/dist/esm-node/ultramodern-tooling/config/metadata.js +38 -0
  307. package/dist/esm-node/ultramodern-tooling/config/normalize.js +174 -0
  308. package/dist/esm-node/ultramodern-tooling/config/synthesize.js +109 -0
  309. package/dist/esm-node/ultramodern-tooling/config/types.js +1 -0
  310. package/dist/esm-node/ultramodern-tooling/config.js +1 -120
  311. package/dist/esm-node/ultramodern-workspace/add-shell.js +222 -0
  312. package/dist/esm-node/ultramodern-workspace/add-vertical/constants.js +6 -0
  313. package/dist/esm-node/ultramodern-workspace/add-vertical/execute.js +136 -0
  314. package/dist/esm-node/ultramodern-workspace/add-vertical/plan.js +206 -0
  315. package/dist/esm-node/ultramodern-workspace/add-vertical/preflight.js +199 -0
  316. package/dist/esm-node/ultramodern-workspace/add-vertical/shell-files.js +66 -0
  317. package/dist/esm-node/ultramodern-workspace/add-vertical/topology.js +109 -0
  318. package/dist/esm-node/ultramodern-workspace/add-vertical/transaction.js +255 -0
  319. package/dist/esm-node/ultramodern-workspace/add-vertical/workspace-state.js +68 -0
  320. package/dist/esm-node/ultramodern-workspace/add-vertical.js +6 -544
  321. package/dist/esm-node/ultramodern-workspace/api/checkout-cart.js +87 -0
  322. package/dist/esm-node/ultramodern-workspace/api/client.js +184 -0
  323. package/dist/esm-node/ultramodern-workspace/api/contracts.js +202 -0
  324. package/dist/esm-node/ultramodern-workspace/api/names.js +34 -0
  325. package/dist/esm-node/ultramodern-workspace/api/rpc.js +206 -0
  326. package/dist/esm-node/ultramodern-workspace/api/service.js +212 -0
  327. package/dist/esm-node/ultramodern-workspace/api/shared.js +227 -0
  328. package/dist/esm-node/ultramodern-workspace/api.js +6 -984
  329. package/dist/esm-node/ultramodern-workspace/app-files.js +51 -51
  330. package/dist/esm-node/ultramodern-workspace/backend-federation.js +282 -0
  331. package/dist/esm-node/ultramodern-workspace/bridge-config/cli.js +31 -0
  332. package/dist/esm-node/ultramodern-workspace/bridge-config/defaults.js +6 -0
  333. package/dist/esm-node/ultramodern-workspace/bridge-config/gates.js +53 -0
  334. package/dist/esm-node/ultramodern-workspace/bridge-config/index.js +4 -0
  335. package/dist/esm-node/ultramodern-workspace/bridge-config/normalize.js +31 -0
  336. package/dist/esm-node/ultramodern-workspace/bridge-config/schema.js +32 -0
  337. package/dist/esm-node/ultramodern-workspace/bridge-config/shared.js +52 -0
  338. package/dist/esm-node/ultramodern-workspace/bridge-config/validation.js +28 -0
  339. package/dist/esm-node/ultramodern-workspace/bridge-config/workspace-packages.js +68 -0
  340. package/dist/esm-node/ultramodern-workspace/bridge-config.js +1 -270
  341. package/dist/esm-node/ultramodern-workspace/codesmith.js +10 -1
  342. package/dist/esm-node/ultramodern-workspace/contracts.js +81 -27
  343. package/dist/esm-node/ultramodern-workspace/delivery-unit-schema/types.js +236 -0
  344. package/dist/esm-node/ultramodern-workspace/delivery-unit-schema/up-projection.js +130 -0
  345. package/dist/esm-node/ultramodern-workspace/delivery-unit-stamp.js +19 -0
  346. package/dist/esm-node/ultramodern-workspace/delivery-unit-sync.js +105 -0
  347. package/dist/esm-node/ultramodern-workspace/delivery-unit.js +22 -0
  348. package/dist/esm-node/ultramodern-workspace/demo-components.js +461 -204
  349. package/dist/esm-node/ultramodern-workspace/descriptors.js +75 -17
  350. package/dist/esm-node/ultramodern-workspace/effect-diagnostics.js +77 -0
  351. package/dist/esm-node/ultramodern-workspace/fs-io.js +27 -18
  352. package/dist/esm-node/ultramodern-workspace/generation-result.js +33 -3
  353. package/dist/esm-node/ultramodern-workspace/index.js +4 -0
  354. package/dist/esm-node/ultramodern-workspace/locales.js +3 -4
  355. package/dist/esm-node/ultramodern-workspace/mf-validation/constants.js +20 -0
  356. package/dist/esm-node/ultramodern-workspace/mf-validation/discovery.js +29 -0
  357. package/dist/esm-node/ultramodern-workspace/mf-validation/inspect.js +47 -0
  358. package/dist/esm-node/ultramodern-workspace/mf-validation/object-literal.js +145 -0
  359. package/dist/esm-node/ultramodern-workspace/mf-validation/path-utils.js +90 -0
  360. package/dist/esm-node/ultramodern-workspace/mf-validation/syntax.js +155 -0
  361. package/dist/esm-node/ultramodern-workspace/mf-validation/types.js +1 -0
  362. package/dist/esm-node/ultramodern-workspace/mf-validation/validate.js +58 -0
  363. package/dist/esm-node/ultramodern-workspace/mf-validation.js +3 -516
  364. package/dist/esm-node/ultramodern-workspace/module-federation/config.js +290 -0
  365. package/dist/esm-node/ultramodern-workspace/module-federation/index.js +5 -0
  366. package/dist/esm-node/ultramodern-workspace/module-federation/reexport-module.js +68 -0
  367. package/dist/esm-node/ultramodern-workspace/module-federation/remote-refs.js +66 -0
  368. package/dist/esm-node/ultramodern-workspace/module-federation/shared-config.js +13 -0
  369. package/dist/esm-node/ultramodern-workspace/module-federation.js +2 -458
  370. package/dist/esm-node/ultramodern-workspace/naming.js +2 -2
  371. package/dist/esm-node/ultramodern-workspace/overlay-baseline-guard.js +351 -0
  372. package/dist/esm-node/ultramodern-workspace/overlays.js +28 -5
  373. package/dist/esm-node/ultramodern-workspace/package-json.js +48 -283
  374. package/dist/esm-node/ultramodern-workspace/package-source.js +7 -1
  375. package/dist/esm-node/ultramodern-workspace/policy.js +772 -10
  376. package/dist/esm-node/ultramodern-workspace/public-surface.js +2 -2
  377. package/dist/esm-node/ultramodern-workspace/routes.js +9 -143
  378. package/dist/esm-node/ultramodern-workspace/shared-patches.js +4 -0
  379. package/dist/esm-node/ultramodern-workspace/shells.js +93 -0
  380. package/dist/esm-node/ultramodern-workspace/tooling-command-catalog.js +101 -0
  381. package/dist/esm-node/ultramodern-workspace/tsconfigs.js +138 -0
  382. package/dist/esm-node/ultramodern-workspace/types.js +16 -1
  383. package/dist/esm-node/ultramodern-workspace/versions.js +35 -26
  384. package/dist/esm-node/ultramodern-workspace/workspace-script-plan.js +125 -0
  385. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +115 -85
  386. package/dist/esm-node/ultramodern-workspace/workspace-validation-contract.js +605 -0
  387. package/dist/esm-node/ultramodern-workspace/write-app.js +106 -0
  388. package/dist/esm-node/ultramodern-workspace/write-workspace.js +47 -66
  389. package/dist/esm-node/ultramodern-workspace/zerops.js +71 -0
  390. package/dist/types/cli/flags.d.ts +35 -0
  391. package/dist/types/cli/help.d.ts +2 -0
  392. package/dist/types/cli/package-source.d.ts +15 -0
  393. package/dist/types/cli/project-setup.d.ts +8 -0
  394. package/dist/types/cli/prompts.d.ts +4 -0
  395. package/dist/types/locale/en.d.ts +3 -4
  396. package/dist/types/locale/index.d.ts +6 -8
  397. package/dist/types/locale/zh.d.ts +3 -4
  398. package/dist/types/ultramodern-package-source.d.ts +0 -11
  399. package/dist/types/ultramodern-release-cohort.d.ts +30 -0
  400. package/dist/types/ultramodern-tooling/commands/cloudflare-output-verify.d.ts +2 -0
  401. package/dist/types/ultramodern-tooling/commands/context.d.ts +11 -0
  402. package/dist/types/ultramodern-tooling/commands/mf-types.d.ts +2 -0
  403. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.d.ts +12 -0
  404. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.d.ts +4 -0
  405. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.d.ts +1 -0
  406. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.d.ts +3 -0
  407. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.d.ts +4 -0
  408. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.d.ts +3 -0
  409. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.d.ts +2 -0
  410. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.d.ts +4 -0
  411. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.d.ts +3 -0
  412. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.d.ts +3 -0
  413. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.d.ts +7 -0
  414. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.d.ts +3 -0
  415. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/help.d.ts +1 -0
  416. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/install.d.ts +2 -0
  417. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/io.d.ts +20 -0
  418. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.d.ts +9 -0
  419. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-source.d.ts +3 -0
  420. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.d.ts +27 -0
  421. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.d.ts +26 -0
  422. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.d.ts +10 -0
  423. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.d.ts +4 -0
  424. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect.d.ts +2 -0
  425. package/dist/types/ultramodern-tooling/commands/options.d.ts +2 -0
  426. package/dist/types/ultramodern-tooling/commands/routes-generate.d.ts +2 -0
  427. package/dist/types/ultramodern-tooling/commands/skills.d.ts +2 -0
  428. package/dist/types/ultramodern-tooling/commands/sync-delivery-unit.d.ts +1 -0
  429. package/dist/types/ultramodern-tooling/commands/validate.d.ts +2 -0
  430. package/dist/types/ultramodern-tooling/commands.d.ts +1 -1
  431. package/dist/types/ultramodern-tooling/config/constants.d.ts +3 -0
  432. package/dist/types/ultramodern-tooling/config/index.d.ts +7 -0
  433. package/dist/types/ultramodern-tooling/config/json.d.ts +2 -0
  434. package/dist/types/ultramodern-tooling/config/load.d.ts +2 -0
  435. package/dist/types/ultramodern-tooling/config/metadata.d.ts +4 -0
  436. package/dist/types/ultramodern-tooling/config/normalize.d.ts +22 -0
  437. package/dist/types/ultramodern-tooling/config/synthesize.d.ts +5 -0
  438. package/dist/types/ultramodern-tooling/config/types.d.ts +45 -0
  439. package/dist/types/ultramodern-tooling/config.d.ts +1 -43
  440. package/dist/types/ultramodern-workspace/add-shell.d.ts +14 -0
  441. package/dist/types/ultramodern-workspace/add-vertical/constants.d.ts +4 -0
  442. package/dist/types/ultramodern-workspace/add-vertical/execute.d.ts +9 -0
  443. package/dist/types/ultramodern-workspace/add-vertical/plan.d.ts +2 -0
  444. package/dist/types/ultramodern-workspace/add-vertical/preflight.d.ts +42 -0
  445. package/dist/types/ultramodern-workspace/add-vertical/shell-files.d.ts +6 -0
  446. package/dist/types/ultramodern-workspace/add-vertical/topology.d.ts +9 -0
  447. package/dist/types/ultramodern-workspace/add-vertical/transaction.d.ts +80 -0
  448. package/dist/types/ultramodern-workspace/add-vertical/workspace-state.d.ts +15 -0
  449. package/dist/types/ultramodern-workspace/add-vertical.d.ts +7 -39
  450. package/dist/types/ultramodern-workspace/api/checkout-cart.d.ts +33 -0
  451. package/dist/types/ultramodern-workspace/api/client.d.ts +6 -0
  452. package/dist/types/ultramodern-workspace/api/contracts.d.ts +15 -0
  453. package/dist/types/ultramodern-workspace/api/names.d.ts +41 -0
  454. package/dist/types/ultramodern-workspace/api/rpc.d.ts +41 -0
  455. package/dist/types/ultramodern-workspace/api/service.d.ts +6 -0
  456. package/dist/types/ultramodern-workspace/api/shared.d.ts +10 -0
  457. package/dist/types/ultramodern-workspace/api.d.ts +6 -73
  458. package/dist/types/ultramodern-workspace/app-files.d.ts +4 -10
  459. package/dist/types/ultramodern-workspace/backend-federation.d.ts +11 -0
  460. package/dist/types/ultramodern-workspace/bridge-config/cli.d.ts +3 -0
  461. package/dist/types/ultramodern-workspace/bridge-config/defaults.d.ts +1 -0
  462. package/dist/types/ultramodern-workspace/bridge-config/gates.d.ts +3 -0
  463. package/dist/types/ultramodern-workspace/bridge-config/index.d.ts +4 -0
  464. package/dist/types/ultramodern-workspace/bridge-config/normalize.d.ts +2 -0
  465. package/dist/types/ultramodern-workspace/bridge-config/schema.d.ts +61 -0
  466. package/dist/types/ultramodern-workspace/bridge-config/shared.d.ts +12 -0
  467. package/dist/types/ultramodern-workspace/bridge-config/validation.d.ts +3 -0
  468. package/dist/types/ultramodern-workspace/bridge-config/workspace-packages.d.ts +3 -0
  469. package/dist/types/ultramodern-workspace/bridge-config.d.ts +1 -64
  470. package/dist/types/ultramodern-workspace/codesmith.d.ts +12 -6
  471. package/dist/types/ultramodern-workspace/contracts.d.ts +3 -3
  472. package/dist/types/ultramodern-workspace/delivery-unit-schema/types.d.ts +291 -0
  473. package/dist/types/ultramodern-workspace/delivery-unit-schema/up-projection.d.ts +189 -0
  474. package/dist/types/ultramodern-workspace/delivery-unit-stamp.d.ts +3 -0
  475. package/dist/types/ultramodern-workspace/delivery-unit-sync.d.ts +6 -0
  476. package/dist/types/ultramodern-workspace/delivery-unit.d.ts +8 -0
  477. package/dist/types/ultramodern-workspace/demo-components.d.ts +14 -3
  478. package/dist/types/ultramodern-workspace/descriptors.d.ts +27 -3
  479. package/dist/types/ultramodern-workspace/effect-diagnostics.d.ts +1 -0
  480. package/dist/types/ultramodern-workspace/fs-io.d.ts +2 -8
  481. package/dist/types/ultramodern-workspace/generation-result.d.ts +3 -1
  482. package/dist/types/ultramodern-workspace/index.d.ts +6 -1
  483. package/dist/types/ultramodern-workspace/locales.d.ts +1 -133
  484. package/dist/types/ultramodern-workspace/mf-validation/constants.d.ts +5 -0
  485. package/dist/types/ultramodern-workspace/mf-validation/discovery.d.ts +2 -0
  486. package/dist/types/ultramodern-workspace/mf-validation/inspect.d.ts +2 -0
  487. package/dist/types/ultramodern-workspace/mf-validation/object-literal.d.ts +4 -0
  488. package/dist/types/ultramodern-workspace/mf-validation/path-utils.d.ts +11 -0
  489. package/dist/types/ultramodern-workspace/mf-validation/syntax.d.ts +5 -0
  490. package/dist/types/ultramodern-workspace/mf-validation/types.d.ts +33 -0
  491. package/dist/types/ultramodern-workspace/mf-validation/validate.d.ts +4 -0
  492. package/dist/types/ultramodern-workspace/mf-validation.d.ts +4 -27
  493. package/dist/types/ultramodern-workspace/module-federation/config.d.ts +5 -0
  494. package/dist/types/ultramodern-workspace/module-federation/index.d.ts +4 -0
  495. package/dist/types/ultramodern-workspace/module-federation/reexport-module.d.ts +4 -0
  496. package/dist/types/ultramodern-workspace/module-federation/remote-refs.d.ts +3 -0
  497. package/dist/types/ultramodern-workspace/module-federation/shared-config.d.ts +2 -0
  498. package/dist/types/ultramodern-workspace/module-federation.d.ts +2 -17
  499. package/dist/types/ultramodern-workspace/naming.d.ts +0 -2
  500. package/dist/types/ultramodern-workspace/overlay-baseline-guard.d.ts +57 -0
  501. package/dist/types/ultramodern-workspace/package-json.d.ts +2 -17
  502. package/dist/types/ultramodern-workspace/package-source.d.ts +1 -0
  503. package/dist/types/ultramodern-workspace/policy.d.ts +254 -47
  504. package/dist/types/ultramodern-workspace/public-api.d.ts +1 -1
  505. package/dist/types/ultramodern-workspace/public-surface.d.ts +5 -15
  506. package/dist/types/ultramodern-workspace/routes.d.ts +0 -9
  507. package/dist/types/ultramodern-workspace/shared-patches.d.ts +1 -0
  508. package/dist/types/ultramodern-workspace/shells.d.ts +51 -0
  509. package/dist/types/ultramodern-workspace/tooling-command-catalog.d.ts +18 -0
  510. package/dist/types/ultramodern-workspace/tsconfigs.d.ts +13 -0
  511. package/dist/types/ultramodern-workspace/types.d.ts +134 -3
  512. package/dist/types/ultramodern-workspace/versions.d.ts +35 -26
  513. package/dist/types/ultramodern-workspace/workspace-script-plan.d.ts +63 -0
  514. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +15 -5
  515. package/dist/types/ultramodern-workspace/workspace-validation-contract.d.ts +243 -0
  516. package/dist/types/ultramodern-workspace/write-app.d.ts +4 -0
  517. package/dist/types/ultramodern-workspace/write-workspace.d.ts +3 -3
  518. package/dist/types/ultramodern-workspace/zerops.d.ts +2 -0
  519. package/package.json +15 -13
  520. package/template-workspace/.gitignore.handlebars +8 -0
  521. package/template-workspace/.modernjs/release-cohort.json +208 -0
  522. package/template-workspace/AGENTS.md.handlebars +16 -89
  523. package/template-workspace/README.md.handlebars +17 -16
  524. package/template-workspace/patches/@module-federation__bridge-react@2.8.0.patch +138 -0
  525. package/template-workspace/patches/@module-federation__modern-js-v3@2.8.0.patch +259 -0
  526. package/template-workspace/patches/@tanstack__router-core@1.171.14.patch +123 -0
  527. package/template-workspace/patches/drizzle-orm-ts7-strict-declarations.patch +452 -0
  528. package/template-workspace/patches/effect-schema-error-type-id.patch +18 -0
  529. package/template-workspace/pnpm-workspace.yaml.handlebars +8 -25
  530. package/template-workspace/scripts/bootstrap-agent-skills.mjs +11 -3
  531. package/templates/app/shell-frame.tsx +5 -4
  532. package/templates/workspace/apps/modern.config.shared-module-federation.ts.handlebars +37 -0
  533. package/templates/workspace/apps/modern.config.ts.handlebars +191 -0
  534. package/templates/workspace/apps/shared/src/routes/ultramodern-jsonld.ts.handlebars +119 -0
  535. package/templates/workspace/apps/shared/src/routes/ultramodern-route-metadata.ts.handlebars +21 -0
  536. package/templates/workspace/apps/shell-super-app/src/routes/[lang]/page.tsx.handlebars +49 -0
  537. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.helpers.tsx.handlebars +27 -0
  538. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.imports.tsx.handlebars +4 -0
  539. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.tsx.handlebars +44 -0
  540. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.worker.helpers.tsx.handlebars +17 -0
  541. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.worker.imports.tsx.handlebars +1 -0
  542. package/templates/workspace/packages/shared-design-tokens/tokens.css.handlebars +7 -0
  543. package/templates/workspace/tailwind.config.ts.handlebars +3 -0
  544. package/templates/workspace/verticals/server/checkout-cart-handlers.ts.handlebars +49 -0
  545. package/templates/workspace/verticals/server/checkout-cart-state.ts.handlebars +23 -0
  546. package/templates/workspace/verticals/shared/api.checkout-cart-contract-fields.ts.handlebars +1 -0
  547. package/templates/workspace/verticals/shared/api.checkout-cart-endpoints.ts.handlebars +23 -0
  548. package/templates/workspace/verticals/shared/api.checkout-cart-operation-contexts.ts.handlebars +29 -0
  549. package/templates/workspace/verticals/shared/api.checkout-cart-schemas.ts.handlebars +48 -0
  550. package/templates/workspace/verticals/src/api/checkout-cart-client-exports.ts.handlebars +70 -0
  551. package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +4 -4
  552. package/templates/workspace-scripts/check-ultramodern-api-boundaries.mts +40 -2
  553. package/templates/workspace-scripts/generate-node-backend-federation.mjs +379 -0
  554. package/templates/workspace-scripts/generate-public-surface-assets.mjs +5 -5
  555. package/templates/workspace-scripts/materialize-zerops-runtime.mjs +447 -0
  556. package/templates/workspace-scripts/proof-cloudflare-version.mjs +237 -9
  557. package/templates/workspace-scripts/proof-node-backend-federation.mjs +984 -0
  558. package/templates/workspace-scripts/proof-workerd-ssr.mts +815 -0
  559. package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +188 -2
  560. package/templates/workspace-scripts/ultramodern-typecheck.mjs +6 -46
  561. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +2447 -249
  562. package/template-workspace/patches/@tanstack__router-core@1.171.13.patch +0 -51
@@ -0,0 +1,984 @@
1
+ #!/usr/bin/env node
2
+ import { createHash } from 'node:crypto';
3
+ import fs from 'node:fs';
4
+ import { createRequire } from 'node:module';
5
+ import path from 'node:path';
6
+ import { fileURLToPath, pathToFileURL } from 'node:url';
7
+
8
+ const workspaceRoot = path.resolve(process.env.ULTRAMODERN_WORKSPACE_ROOT ?? process.cwd());
9
+ const workspaceRequire = createRequire(path.join(workspaceRoot, 'package.json'));
10
+ const compactConfigPath = path.join(workspaceRoot, '.modernjs/ultramodern.json');
11
+ const defaultOut = path.join(
12
+ workspaceRoot,
13
+ '.codex/reports/node-backend-federation-proof/proof.json',
14
+ );
15
+
16
+ // Keep these constants/checks in sync with
17
+ // @modern-js/utils/universal backend-federation-contract. Generated workspace
18
+ // scripts do not currently import @modern-js/utils directly.
19
+ const contractVersion = 'microvertical-server-effect-v1';
20
+ const nodeAdapterVersion = 'backend-mf-effect-v1';
21
+ const backendExpose = './effect-api';
22
+ const releaseEnvelopePath = 'release/microvertical-release-envelope.json';
23
+ const localRuntimeRelativePaths = [
24
+ 'packages/cli/plugin-bff/dist/esm-node/runtime/effect/index.mjs',
25
+ 'cli/plugin-bff/dist/esm-node/runtime/effect/index.mjs',
26
+ ];
27
+
28
+ function readJson(filePath) {
29
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'));
30
+ }
31
+
32
+ function readBuildIdentity(app, target) {
33
+ const buildArtifactPath = path.join(
34
+ workspaceRoot,
35
+ app.directory,
36
+ target,
37
+ 'ultramodern-build.json',
38
+ );
39
+ assertFile(buildArtifactPath, app.id, 'stamped target build identity');
40
+ const artifact = readJson(buildArtifactPath);
41
+ const deliveryUnit = artifact.deliveryUnit ?? {};
42
+ return {
43
+ artifactPath: buildArtifactPath,
44
+ buildVersion: deliveryUnit.buildMarker ?? deliveryUnit.build,
45
+ packageName: deliveryUnit.packageName,
46
+ version: deliveryUnit.version,
47
+ unitId: deliveryUnit.unitId,
48
+ sourceRevision: deliveryUnit.sourceRevision,
49
+ };
50
+ }
51
+
52
+ function hasBackendFederationManifestAdapter(runtime) {
53
+ return typeof runtime?.loadBackendFederatedEffectApiFromManifest === 'function';
54
+ }
55
+
56
+ function findLocalRuntimePath(createBin) {
57
+ let current = path.dirname(fileURLToPath(pathToFileURL(createBin)));
58
+ for (let depth = 0; depth < 8; depth += 1) {
59
+ for (const relativePath of localRuntimeRelativePaths) {
60
+ const candidate = path.join(current, relativePath);
61
+ if (fs.existsSync(candidate)) {
62
+ return candidate;
63
+ }
64
+ }
65
+
66
+ const parent = path.dirname(current);
67
+ if (parent === current) {
68
+ break;
69
+ }
70
+ current = parent;
71
+ }
72
+
73
+ return undefined;
74
+ }
75
+
76
+ async function importBackendFederationRuntime() {
77
+ let importError;
78
+ try {
79
+ const runtimePath = workspaceRequire.resolve('@modern-js/plugin-bff/effect');
80
+ const runtime = await import(pathToFileURL(runtimePath).href);
81
+ if (hasBackendFederationManifestAdapter(runtime)) {
82
+ return runtime;
83
+ }
84
+
85
+ importError = new Error(
86
+ `${runtimePath} does not export loadBackendFederatedEffectApiFromManifest`,
87
+ );
88
+ } catch (error) {
89
+ importError = error;
90
+ }
91
+
92
+ const createBin = process.env.ULTRAMODERN_CREATE_BIN;
93
+ if (!createBin) {
94
+ throw importError;
95
+ }
96
+
97
+ const localRuntimePath = findLocalRuntimePath(createBin);
98
+ if (!localRuntimePath) {
99
+ throw importError;
100
+ }
101
+
102
+ const localRuntime = await import(pathToFileURL(localRuntimePath).href);
103
+ if (!hasBackendFederationManifestAdapter(localRuntime)) {
104
+ throw new Error(
105
+ `${localRuntimePath} does not export loadBackendFederatedEffectApiFromManifest`,
106
+ );
107
+ }
108
+
109
+ return localRuntime;
110
+ }
111
+
112
+ function normalizeRelativePath(value) {
113
+ return String(value ?? '')
114
+ .replace(/\\/gu, '/')
115
+ .replace(/^\.\/+/u, '');
116
+ }
117
+
118
+ function toPascalCase(value) {
119
+ return String(value)
120
+ .split(/[^a-zA-Z0-9]+/u)
121
+ .filter(Boolean)
122
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
123
+ .join('');
124
+ }
125
+
126
+ function createBackendName(app) {
127
+ return (
128
+ app.backendFederation?.name ??
129
+ app.backendFederation?.executionSurfaces?.node?.remoteName ??
130
+ app.serverExecution?.node?.remoteName ??
131
+ (typeof app.moduleFederation?.name === 'string'
132
+ ? `${app.moduleFederation.name}Backend`
133
+ : `vertical${toPascalCase(app.id)}Backend`)
134
+ );
135
+ }
136
+
137
+ function createBackendManifestUrl(app) {
138
+ return (
139
+ app.backendFederation?.executionSurfaces?.node?.manifestUrl ??
140
+ app.serverExecution?.node?.manifestUrl ??
141
+ `http://localhost:${app.port}/backend-mf-manifest.json`
142
+ );
143
+ }
144
+
145
+ function createBackendContainerEntry(app) {
146
+ return (
147
+ app.backendFederation?.executionSurfaces?.node?.containerEntry ??
148
+ app.serverExecution?.node?.containerEntry ??
149
+ `http://localhost:${app.port}/backendRemoteEntry.cjs`
150
+ );
151
+ }
152
+
153
+ function resolveRemoteType(app) {
154
+ return (
155
+ app.backendFederation?.executionSurfaces?.node?.remoteType ??
156
+ app.serverExecution?.node?.remoteType ??
157
+ 'commonjs-module'
158
+ );
159
+ }
160
+
161
+ function normalizeRoutePath(value) {
162
+ const route = String(value ?? '').trim();
163
+ if (!route) {
164
+ return '/';
165
+ }
166
+ return route.startsWith('/') ? route : `/${route}`;
167
+ }
168
+
169
+ function collectJsonSmokeChecks(apps, targetApp) {
170
+ const apiPrefix = normalizeRoutePath(targetApp.api?.prefix ?? `/${targetApp.id}-api`);
171
+
172
+ const configuredChecks = apps
173
+ .flatMap((app) =>
174
+ Array.isArray(app?.deploy?.cloudflare?.jsonSmokeChecks)
175
+ ? app.deploy.cloudflare.jsonSmokeChecks
176
+ : [],
177
+ )
178
+ .filter((check) => {
179
+ if (typeof check?.route !== 'string') {
180
+ return false;
181
+ }
182
+ const route = normalizeRoutePath(check.route);
183
+ return route === apiPrefix || route.startsWith(`${apiPrefix}/`);
184
+ });
185
+
186
+ if (configuredChecks.length > 0) {
187
+ return configuredChecks;
188
+ }
189
+
190
+ const readinessRoute =
191
+ targetApp.backendFederation?.exposes?.[backendExpose]?.readiness ??
192
+ targetApp.backendFederation?.versionBoundary?.api?.readiness ??
193
+ targetApp.serverExecution?.cloudflare?.apiReadiness;
194
+ if (typeof readinessRoute !== 'string' || readinessRoute.length === 0) {
195
+ return [];
196
+ }
197
+
198
+ return [
199
+ {
200
+ id: `${targetApp.id}-backend-readiness`,
201
+ method: 'GET',
202
+ route: readinessRoute,
203
+ expect: {
204
+ 'checks.api': 'ready',
205
+ status: 'ready',
206
+ versionSkew: 'none',
207
+ },
208
+ },
209
+ ];
210
+ }
211
+
212
+ function compactApps(config, appFilter) {
213
+ const apps = Array.isArray(config.topology?.apps) ? config.topology.apps : [];
214
+ const filteredApps = apps
215
+ .filter((app) => app?.kind === 'vertical' && app.api)
216
+ .filter((app) => !appFilter || app.id === appFilter)
217
+ .map((app) => ({
218
+ id: app.id,
219
+ directory:
220
+ typeof app.path === 'string' ? normalizeRelativePath(app.path) : `verticals/${app.id}`,
221
+ backendName: createBackendName(app),
222
+ manifestUrl: createBackendManifestUrl(app),
223
+ containerEntry: createBackendContainerEntry(app),
224
+ remoteType: resolveRemoteType(app),
225
+ smokeChecks: collectJsonSmokeChecks(apps, app),
226
+ compactDeliveryUnit:
227
+ app.deliveryUnit && typeof app.deliveryUnit === 'object'
228
+ ? app.deliveryUnit
229
+ : undefined,
230
+ }));
231
+
232
+ if (appFilter && filteredApps.length === 0) {
233
+ throw new Error(`No vertical API app matched --app ${appFilter}`);
234
+ }
235
+
236
+ return filteredApps;
237
+ }
238
+
239
+ function assertEqual(actual, expected, message) {
240
+ if (actual !== expected) {
241
+ throw new Error(`${message}: expected ${expected}, received ${actual}`);
242
+ }
243
+ }
244
+
245
+ function assertFile(filePath, appId, label) {
246
+ if (!fs.existsSync(filePath)) {
247
+ throw new Error(
248
+ `${appId} missing ${path.relative(
249
+ workspaceRoot,
250
+ filePath,
251
+ )}; run pnpm build or the relevant vertical build before pnpm node:proof`,
252
+ );
253
+ }
254
+
255
+ if (!fs.statSync(filePath).isFile()) {
256
+ throw new Error(`${appId} ${label} is not a file`);
257
+ }
258
+ }
259
+
260
+ function sha256(bytes) {
261
+ return createHash('sha256').update(bytes).digest('hex');
262
+ }
263
+
264
+ function readBoundReleaseEnvelope(app, target) {
265
+ const targetDirectory = path.join(workspaceRoot, app.directory, target);
266
+ const envelopePath = path.join(targetDirectory, releaseEnvelopePath);
267
+ assertFile(envelopePath, app.id, 'Node release envelope');
268
+ const envelope = readJson(envelopePath);
269
+ assertEqual(
270
+ envelope.schemaVersion,
271
+ 3,
272
+ `${app.id} release-envelope schema`,
273
+ );
274
+ assertEqual(envelope.target, 'node', `${app.id} release-envelope target`);
275
+
276
+ const manifestLogicalPath = envelope.surfaces?.backendFederation?.manifest;
277
+ const containerLogicalPath = envelope.surfaces?.backendFederation?.container;
278
+ assertEqual(
279
+ manifestLogicalPath,
280
+ 'backend-mf-manifest.json',
281
+ `${app.id} release-envelope backend manifest path`,
282
+ );
283
+ assertEqual(
284
+ containerLogicalPath,
285
+ 'backendRemoteEntry.cjs',
286
+ `${app.id} release-envelope backend container path`,
287
+ );
288
+
289
+ const apiBackendPaths = envelope.surfaces?.apiBackend;
290
+ if (!Array.isArray(apiBackendPaths) || apiBackendPaths.length === 0) {
291
+ throw new Error(`${app.id} release envelope has no bound API/backend executable`);
292
+ }
293
+ if (
294
+ !apiBackendPaths.some((logicalPath) =>
295
+ /^api\/.*\.(?:c|m)?js$/u.test(logicalPath),
296
+ )
297
+ ) {
298
+ throw new Error(
299
+ `${app.id} release envelope does not bind a compiled api/**/*.js executable`,
300
+ );
301
+ }
302
+
303
+ const artifacts = Array.isArray(envelope.artifacts) ? envelope.artifacts : [];
304
+ const artifactByPath = new Map(
305
+ artifacts.map((artifact) => [artifact.logicalPath, artifact]),
306
+ );
307
+ const requiredPaths = [
308
+ manifestLogicalPath,
309
+ containerLogicalPath,
310
+ ...apiBackendPaths,
311
+ ];
312
+ const boundArtifacts = requiredPaths.map((logicalPath) => {
313
+ const artifact = artifactByPath.get(logicalPath);
314
+ if (!artifact) {
315
+ throw new Error(
316
+ `${app.id} release envelope surface references unbound artifact ${logicalPath}`,
317
+ );
318
+ }
319
+ if (artifact.kind !== 'file') {
320
+ throw new Error(
321
+ `${app.id} release envelope surface references non-file artifact ${logicalPath}`,
322
+ );
323
+ }
324
+ const artifactPath = path.join(targetDirectory, logicalPath);
325
+ assertFile(artifactPath, app.id, `release-envelope artifact ${logicalPath}`);
326
+ const bytes = fs.readFileSync(artifactPath);
327
+ assertEqual(
328
+ bytes.byteLength,
329
+ artifact.byteLength,
330
+ `${app.id} ${logicalPath} envelope byte length`,
331
+ );
332
+ assertEqual(
333
+ sha256(bytes),
334
+ artifact.sha256,
335
+ `${app.id} ${logicalPath} envelope SHA-256`,
336
+ );
337
+ return artifact;
338
+ });
339
+
340
+ return {
341
+ envelope,
342
+ envelopePath,
343
+ manifestArtifact: artifactByPath.get(manifestLogicalPath),
344
+ containerArtifact: artifactByPath.get(containerLogicalPath),
345
+ apiBackendArtifacts: boundArtifacts.filter((artifact) =>
346
+ apiBackendPaths.includes(artifact.logicalPath),
347
+ ),
348
+ };
349
+ }
350
+
351
+ async function fetchBoundArtifact(app, url, artifact, label) {
352
+ const response = await fetch(url, {
353
+ headers: {
354
+ accept: '*/*',
355
+ 'cache-control': 'no-cache',
356
+ },
357
+ });
358
+ if (!response.ok) {
359
+ throw new Error(`${app.id} live ${label} returned HTTP ${response.status}`);
360
+ }
361
+ const bytes = Buffer.from(await response.arrayBuffer());
362
+ assertEqual(
363
+ bytes.byteLength,
364
+ artifact.byteLength,
365
+ `${app.id} live ${label} byte length`,
366
+ );
367
+ const digest = sha256(bytes);
368
+ assertEqual(
369
+ digest,
370
+ artifact.sha256,
371
+ `${app.id} live ${label} SHA-256`,
372
+ );
373
+ const urlPath = normalizeRelativePath(new URL(url).pathname);
374
+ if (!urlPath.endsWith(artifact.logicalPath)) {
375
+ throw new Error(
376
+ `${app.id} live ${label} URL ${url} does not map to envelope artifact ${artifact.logicalPath}`,
377
+ );
378
+ }
379
+ return {
380
+ url,
381
+ logicalPath: artifact.logicalPath,
382
+ statusCode: response.status,
383
+ byteLength: bytes.byteLength,
384
+ sha256: digest,
385
+ status: 'pass',
386
+ };
387
+ }
388
+
389
+ async function proveLiveApi(app, manifest, releaseBinding) {
390
+ const route = normalizeRoutePath(
391
+ manifest.backendFederation?.readinessPath,
392
+ );
393
+ const url = new URL(route, app.manifestUrl).href;
394
+ const response = await fetch(url, {
395
+ headers: {
396
+ accept: 'application/json',
397
+ 'cache-control': 'no-cache',
398
+ },
399
+ });
400
+ const bodyText = await response.text();
401
+ let body;
402
+ try {
403
+ body = bodyText.length > 0 ? JSON.parse(bodyText) : undefined;
404
+ } catch (error) {
405
+ throw new Error(
406
+ `${app.id} live API GET ${route} did not return JSON: ${error.message}`,
407
+ );
408
+ }
409
+ if (!response.ok) {
410
+ throw new Error(
411
+ `${app.id} live API GET ${route} returned HTTP ${response.status}`,
412
+ );
413
+ }
414
+
415
+ const identity = releaseBinding.envelope.identity ?? {};
416
+ const marker = body?.marker;
417
+ assertEqual(
418
+ marker?.unitId,
419
+ identity.unitId,
420
+ `${app.id} live API marker unitId`,
421
+ );
422
+ assertEqual(
423
+ marker?.buildMarker ?? marker?.build,
424
+ identity.buildMarker,
425
+ `${app.id} live API marker buildMarker`,
426
+ );
427
+ assertEqual(
428
+ marker?.sourceRevision,
429
+ identity.sourceRevision,
430
+ `${app.id} live API marker sourceRevision`,
431
+ );
432
+ assertEqual(
433
+ marker?.version,
434
+ identity.releaseVersion,
435
+ `${app.id} live API marker releaseVersion`,
436
+ );
437
+
438
+ return {
439
+ method: 'GET',
440
+ route,
441
+ url,
442
+ statusCode: response.status,
443
+ marker: {
444
+ unitId: marker.unitId,
445
+ buildMarker: marker.buildMarker ?? marker.build,
446
+ sourceRevision: marker.sourceRevision,
447
+ releaseVersion: marker.version,
448
+ },
449
+ envelopeDigest: releaseBinding.envelope.envelopeDigest,
450
+ apiBackendArtifacts: releaseBinding.apiBackendArtifacts.map((artifact) => ({
451
+ logicalPath: artifact.logicalPath,
452
+ runtime: artifact.runtime,
453
+ byteLength: artifact.byteLength,
454
+ sha256: artifact.sha256,
455
+ })),
456
+ status: 'pass',
457
+ };
458
+ }
459
+
460
+ function jsonPathValue(value, path) {
461
+ const segments = String(path ?? '')
462
+ .split('.')
463
+ .filter(Boolean);
464
+ let current = value;
465
+ for (const segment of segments) {
466
+ if (current === null || current === undefined) {
467
+ return undefined;
468
+ }
469
+ if (Array.isArray(current) && /^\d+$/u.test(segment)) {
470
+ current = current[Number(segment)];
471
+ continue;
472
+ }
473
+ if (typeof current !== 'object' || !Object.hasOwn(current, segment)) {
474
+ return undefined;
475
+ }
476
+ current = current[segment];
477
+ }
478
+ return current;
479
+ }
480
+
481
+ function normalizeJsonExpectations(check) {
482
+ if (Array.isArray(check.expectations)) {
483
+ return check.expectations;
484
+ }
485
+ if (check.expect && typeof check.expect === 'object') {
486
+ return Object.entries(check.expect).map(([path, value]) => ({
487
+ path,
488
+ value,
489
+ }));
490
+ }
491
+ return [];
492
+ }
493
+
494
+ function assertJsonEqual(actual, expected, message) {
495
+ if (JSON.stringify(actual) !== JSON.stringify(expected)) {
496
+ throw new Error(
497
+ `${message}: expected ${JSON.stringify(expected)}, received ${JSON.stringify(actual)}`,
498
+ );
499
+ }
500
+ }
501
+
502
+ async function runSmokeChecks(app, loaded, createEffectBffTestHandler) {
503
+ if (!Array.isArray(app.smokeChecks) || app.smokeChecks.length === 0) {
504
+ throw new Error(
505
+ `${app.id} backend runtime has no smoke checks; configure a JSON smoke check or expose an API readiness route`,
506
+ );
507
+ }
508
+ if (typeof createEffectBffTestHandler !== 'function') {
509
+ throw new Error(`${app.id} backend runtime cannot create Effect test handler`);
510
+ }
511
+
512
+ const servicePrefix = loaded.contract?.servicePrefix ?? loaded.contract?.apiPrefix;
513
+ if (typeof servicePrefix !== 'string' || servicePrefix.length === 0) {
514
+ throw new Error(
515
+ `${app.id} backend expose missing contract.servicePrefix/apiPrefix`,
516
+ );
517
+ }
518
+
519
+ const edge = await createEffectBffTestHandler({
520
+ module: loaded.runtime,
521
+ prefix: servicePrefix,
522
+ });
523
+ try {
524
+ const results = [];
525
+ for (const check of app.smokeChecks) {
526
+ const method = String(check.method ?? 'GET').toUpperCase();
527
+ const route = normalizeRoutePath(check.route);
528
+ const headers = {};
529
+ const init = { method, headers };
530
+ if (check.body !== undefined) {
531
+ headers['content-type'] = 'application/json';
532
+ init.body = JSON.stringify(check.body);
533
+ }
534
+
535
+ const response = await edge.handler(new Request(new URL(route, 'http://localhost'), init));
536
+ const bodyText = await response.text();
537
+ let body;
538
+ try {
539
+ body = bodyText.length > 0 ? JSON.parse(bodyText) : undefined;
540
+ } catch (error) {
541
+ throw new Error(`${app.id} ${method} ${route} did not return JSON: ${error.message}`);
542
+ }
543
+
544
+ if (!response.ok) {
545
+ throw new Error(`${app.id} ${method} ${route} returned HTTP ${response.status}`);
546
+ }
547
+
548
+ const assertions = normalizeJsonExpectations(check).map((expectation) => {
549
+ const actual = jsonPathValue(body, expectation.path);
550
+ assertJsonEqual(
551
+ actual,
552
+ expectation.value,
553
+ `${app.id} ${method} ${route} ${expectation.path}`,
554
+ );
555
+ return {
556
+ path: expectation.path,
557
+ expected: expectation.value,
558
+ actual,
559
+ status: 'pass',
560
+ };
561
+ });
562
+
563
+ results.push({
564
+ id: check.id ?? `${method} ${route}`,
565
+ method,
566
+ route,
567
+ statusCode: response.status,
568
+ assertions,
569
+ status: 'pass',
570
+ });
571
+ }
572
+ return results;
573
+ } finally {
574
+ await edge.dispose?.();
575
+ }
576
+ }
577
+
578
+ function resolveArtifacts(app, target) {
579
+ const targetDirectory = path.join(workspaceRoot, app.directory, target);
580
+
581
+ return {
582
+ manifestPath: path.join(targetDirectory, 'backend-mf-manifest.json'),
583
+ entryPath: path.join(targetDirectory, 'backendRemoteEntry.cjs'),
584
+ };
585
+ }
586
+
587
+ function validateManifest(app, manifest, buildIdentity) {
588
+ assertEqual(manifest.schemaVersion, 1, `${app.id} backend manifest schema`);
589
+ assertEqual(manifest.name, app.backendName, `${app.id} backend manifest name`);
590
+ assertEqual(manifest.id, app.backendName, `${app.id} backend manifest id`);
591
+ assertEqual(
592
+ manifest.version,
593
+ buildIdentity.version,
594
+ `${app.id} backend manifest version`,
595
+ );
596
+ assertEqual(
597
+ manifest.buildVersion,
598
+ buildIdentity.buildVersion,
599
+ `${app.id} backend manifest build version`,
600
+ );
601
+ assertEqual(manifest.metaData?.name, app.backendName, `${app.id} backend manifest metadata name`);
602
+ assertEqual(
603
+ manifest.metaData?.buildInfo?.buildName,
604
+ buildIdentity.packageName,
605
+ `${app.id} backend manifest package name`,
606
+ );
607
+ assertEqual(
608
+ manifest.metaData?.buildInfo?.buildVersion,
609
+ buildIdentity.buildVersion,
610
+ `${app.id} backend manifest metadata build version`,
611
+ );
612
+ assertEqual(
613
+ manifest.metaData?.remoteEntry?.name,
614
+ 'backendRemoteEntry.cjs',
615
+ `${app.id} backend manifest remote entry filename`,
616
+ );
617
+ assertEqual(
618
+ manifest.metaData?.remoteEntry?.type,
619
+ app.remoteType,
620
+ `${app.id} backend manifest remote entry type`,
621
+ );
622
+ assertEqual(manifest.entry?.url, app.containerEntry, `${app.id} backend manifest entry URL`);
623
+ assertEqual(manifest.entry?.type, app.remoteType, `${app.id} backend manifest entry type`);
624
+ assertEqual(
625
+ manifest.backendFederation?.role,
626
+ 'microvertical-server',
627
+ `${app.id} backend manifest role`,
628
+ );
629
+ assertEqual(
630
+ manifest.backendFederation?.runtimeFramework,
631
+ 'effect',
632
+ `${app.id} backend manifest runtime framework`,
633
+ );
634
+ assertEqual(
635
+ manifest.backendFederation?.strictEffectApproach,
636
+ true,
637
+ `${app.id} backend manifest strict Effect flag`,
638
+ );
639
+ assertEqual(
640
+ manifest.backendFederation?.contractVersion,
641
+ contractVersion,
642
+ `${app.id} backend manifest contract version`,
643
+ );
644
+ assertEqual(
645
+ manifest.backendFederation?.nodeAdapterVersion,
646
+ nodeAdapterVersion,
647
+ `${app.id} backend manifest Node adapter version`,
648
+ );
649
+ assertEqual(
650
+ manifest.backendFederation?.manifestUrl,
651
+ app.manifestUrl,
652
+ `${app.id} backend manifest URL`,
653
+ );
654
+ assertEqual(
655
+ manifest.backendFederation?.containerEntry,
656
+ app.containerEntry,
657
+ `${app.id} backend container URL`,
658
+ );
659
+ assertEqual(manifest.backendFederation?.expose, backendExpose, `${app.id} backend expose`);
660
+ assertEqual(
661
+ manifest.backendFederation?.versionBoundary?.packageName,
662
+ buildIdentity.packageName,
663
+ `${app.id} backend manifest version-boundary package`,
664
+ );
665
+ assertEqual(
666
+ manifest.backendFederation?.versionBoundary?.version,
667
+ buildIdentity.version,
668
+ `${app.id} backend manifest version-boundary version`,
669
+ );
670
+ assertEqual(
671
+ manifest.backendFederation?.versionBoundary?.buildVersion,
672
+ buildIdentity.buildVersion,
673
+ `${app.id} backend manifest version-boundary build version`,
674
+ );
675
+
676
+ const manifestDeliveryUnit = manifest.backendFederation?.deliveryUnit;
677
+ if (manifestDeliveryUnit) {
678
+ assertEqual(
679
+ manifestDeliveryUnit.unitId,
680
+ buildIdentity.unitId,
681
+ `${app.id} backend manifest delivery-unit id`,
682
+ );
683
+ assertEqual(
684
+ manifestDeliveryUnit.buildMarker,
685
+ buildIdentity.buildVersion,
686
+ `${app.id} backend manifest delivery-unit build marker`,
687
+ );
688
+ assertEqual(
689
+ manifestDeliveryUnit.packageName,
690
+ buildIdentity.packageName,
691
+ `${app.id} backend manifest delivery-unit package name`,
692
+ );
693
+ assertEqual(
694
+ manifestDeliveryUnit.version,
695
+ buildIdentity.version,
696
+ `${app.id} backend manifest delivery-unit version`,
697
+ );
698
+ assertEqual(
699
+ manifestDeliveryUnit.sourceRevision,
700
+ buildIdentity.sourceRevision,
701
+ `${app.id} backend manifest delivery-unit source revision`,
702
+ );
703
+ }
704
+
705
+ const versionBoundaryDeliveryUnit =
706
+ manifest.backendFederation?.versionBoundary?.deliveryUnit;
707
+ if (versionBoundaryDeliveryUnit) {
708
+ assertEqual(
709
+ versionBoundaryDeliveryUnit.unitId,
710
+ buildIdentity.unitId,
711
+ `${app.id} backend manifest version-boundary delivery-unit id`,
712
+ );
713
+ assertEqual(
714
+ versionBoundaryDeliveryUnit.buildMarker,
715
+ buildIdentity.buildVersion,
716
+ `${app.id} backend manifest version-boundary delivery-unit build marker`,
717
+ );
718
+ }
719
+
720
+ const exposes = Array.isArray(manifest.exposes) ? manifest.exposes : [];
721
+ if (!exposes.some((expose) => expose?.name === backendExpose)) {
722
+ throw new Error(`${app.id} backend manifest missing ${backendExpose} expose`);
723
+ }
724
+ }
725
+
726
+ function assertCompactStableIdentityMatchesBuild(app, buildIdentity) {
727
+ const compactDeliveryUnit = app.compactDeliveryUnit;
728
+ if (!compactDeliveryUnit) {
729
+ return;
730
+ }
731
+
732
+ const mismatches = [];
733
+ const compare = (label, a, b) => {
734
+ if (a !== undefined && b !== undefined && a !== b) {
735
+ mismatches.push(`${label}: deliveryUnit=${a} vs ultramodern-build=${b}`);
736
+ }
737
+ };
738
+ compare('unitId', compactDeliveryUnit.unitId, buildIdentity.unitId);
739
+ compare(
740
+ 'packageName',
741
+ compactDeliveryUnit.packageName,
742
+ buildIdentity.packageName,
743
+ );
744
+ compare('version', compactDeliveryUnit.version, buildIdentity.version);
745
+
746
+ if (mismatches.length > 0) {
747
+ throw new Error(
748
+ `${app.id} delivery-unit identity drift between ${path.relative(
749
+ workspaceRoot,
750
+ compactConfigPath,
751
+ )} (generation metadata) and ${path.relative(
752
+ workspaceRoot,
753
+ buildIdentity.artifactPath,
754
+ )} (stamped target identity): ${mismatches.join('; ')}`,
755
+ );
756
+ }
757
+ }
758
+
759
+ async function proveBackend(app, backendRuntime, target) {
760
+ const {
761
+ createEffectBffTestHandler,
762
+ loadBackendFederatedEffectApiFromManifest,
763
+ } = backendRuntime;
764
+ const { manifestPath, entryPath } = resolveArtifacts(app, target);
765
+
766
+ assertFile(manifestPath, app.id, 'backend manifest');
767
+ assertFile(entryPath, app.id, 'backend remote entry');
768
+
769
+ const buildIdentity = readBuildIdentity(app, target);
770
+ assertCompactStableIdentityMatchesBuild(app, buildIdentity);
771
+ const manifest = readJson(manifestPath);
772
+ validateManifest(app, manifest, buildIdentity);
773
+ const releaseBinding = readBoundReleaseEnvelope(app, target);
774
+ assertEqual(
775
+ releaseBinding.envelope.identity?.unitId,
776
+ buildIdentity.unitId,
777
+ `${app.id} release-envelope/build unitId`,
778
+ );
779
+ assertEqual(
780
+ releaseBinding.envelope.identity?.buildMarker,
781
+ buildIdentity.buildVersion,
782
+ `${app.id} release-envelope/build marker`,
783
+ );
784
+ assertEqual(
785
+ releaseBinding.envelope.identity?.sourceRevision,
786
+ buildIdentity.sourceRevision,
787
+ `${app.id} release-envelope/build source revision`,
788
+ );
789
+ assertEqual(
790
+ releaseBinding.envelope.identity?.releaseVersion,
791
+ buildIdentity.version,
792
+ `${app.id} release-envelope/build version`,
793
+ );
794
+ const liveArtifacts = {
795
+ manifest: await fetchBoundArtifact(
796
+ app,
797
+ app.manifestUrl,
798
+ releaseBinding.manifestArtifact,
799
+ 'backend manifest',
800
+ ),
801
+ container: await fetchBoundArtifact(
802
+ app,
803
+ app.containerEntry,
804
+ releaseBinding.containerArtifact,
805
+ 'backend container',
806
+ ),
807
+ };
808
+
809
+ const loaded = await loadBackendFederatedEffectApiFromManifest({
810
+ hostName: 'ultramodernNodeBackendProof',
811
+ manifestUrl: app.manifestUrl,
812
+ expected: {
813
+ buildMarker: buildIdentity.buildVersion,
814
+ buildVersion: buildIdentity.buildVersion,
815
+ contractVersion,
816
+ nodeAdapterVersion,
817
+ packageName: buildIdentity.packageName,
818
+ remoteName: app.backendName,
819
+ unitId: buildIdentity.unitId,
820
+ },
821
+ });
822
+ const backendContract = loaded.backendFederationContract;
823
+
824
+ assertEqual(
825
+ backendContract?.strictEffectApproach,
826
+ true,
827
+ `${app.id} backend expose strict Effect flag`,
828
+ );
829
+ assertEqual(
830
+ backendContract?.runtimeFramework,
831
+ 'effect',
832
+ `${app.id} backend expose runtime framework`,
833
+ );
834
+ assertEqual(backendContract?.role, 'microvertical-server', `${app.id} backend expose role`);
835
+ assertEqual(backendContract?.name, app.backendName, `${app.id} backend expose name`);
836
+ assertEqual(
837
+ backendContract?.compatibility?.contractVersion,
838
+ contractVersion,
839
+ `${app.id} backend expose contract version`,
840
+ );
841
+ assertEqual(
842
+ backendContract?.compatibility?.nodeAdapterVersion,
843
+ nodeAdapterVersion,
844
+ `${app.id} backend expose Node adapter version`,
845
+ );
846
+ assertEqual(
847
+ backendContract?.compatibility?.packageName,
848
+ buildIdentity.packageName,
849
+ `${app.id} backend expose package name`,
850
+ );
851
+ assertEqual(
852
+ backendContract?.compatibility?.build,
853
+ buildIdentity.buildVersion,
854
+ `${app.id} backend expose build version`,
855
+ );
856
+ assertEqual(
857
+ manifest.buildVersion,
858
+ backendContract?.compatibility?.build,
859
+ `${app.id} backend manifest/expose build coupling`,
860
+ );
861
+ if (backendContract?.compatibility?.unitId !== undefined) {
862
+ assertEqual(
863
+ backendContract.compatibility.unitId,
864
+ manifest.backendFederation?.deliveryUnit?.unitId,
865
+ `${app.id} backend expose delivery-unit id`,
866
+ );
867
+ }
868
+
869
+ if (loaded.api === undefined || loaded.runtime === undefined) {
870
+ throw new Error(`${app.id} backend expose missing api/runtime exports`);
871
+ }
872
+
873
+ const smokeChecks = await runSmokeChecks(app, loaded, createEffectBffTestHandler);
874
+ const liveApi = await proveLiveApi(app, manifest, releaseBinding);
875
+
876
+ return {
877
+ appId: app.id,
878
+ expose: backendExpose,
879
+ manifestPath: normalizeRelativePath(path.relative(workspaceRoot, manifestPath)),
880
+ containerPath: normalizeRelativePath(path.relative(workspaceRoot, entryPath)),
881
+ manifestUrl: app.manifestUrl,
882
+ containerEntry: app.containerEntry,
883
+ runtimeEntry: app.containerEntry,
884
+ releaseEnvelope: {
885
+ path: normalizeRelativePath(
886
+ path.relative(workspaceRoot, releaseBinding.envelopePath),
887
+ ),
888
+ envelopeDigest: releaseBinding.envelope.envelopeDigest,
889
+ target: releaseBinding.envelope.target,
890
+ },
891
+ liveArtifacts,
892
+ liveApi,
893
+ remoteName: app.backendName,
894
+ remoteType: app.remoteType,
895
+ versionBoundary: {
896
+ packageName: buildIdentity.packageName,
897
+ version: buildIdentity.version,
898
+ buildVersion: buildIdentity.buildVersion,
899
+ unitId: buildIdentity.unitId,
900
+ sourceRevision: buildIdentity.sourceRevision,
901
+ },
902
+ smokeChecks,
903
+ status: 'pass',
904
+ };
905
+ }
906
+
907
+ function parseArgs(argv) {
908
+ const parsed = { app: undefined, out: defaultOut, target: '.output' };
909
+
910
+ for (let index = 0; index < argv.length; index += 1) {
911
+ const arg = argv[index];
912
+ if (arg === '--out') {
913
+ parsed.out = argv[index + 1];
914
+ index += 1;
915
+ } else if (arg === '--app') {
916
+ parsed.app = argv[index + 1];
917
+ index += 1;
918
+ } else if (arg === '--target') {
919
+ parsed.target = argv[index + 1];
920
+ index += 1;
921
+ } else if (arg === '--help' || arg === '-h') {
922
+ parsed.help = true;
923
+ } else {
924
+ throw new Error(`Unknown argument: ${arg}`);
925
+ }
926
+ }
927
+
928
+ if (!parsed.out) {
929
+ throw new Error('--out requires a path');
930
+ }
931
+ if (!parsed.target) {
932
+ throw new Error('--target requires a directory name');
933
+ }
934
+
935
+ return parsed;
936
+ }
937
+
938
+ function printHelp() {
939
+ process.stdout
940
+ .write(`Usage: node scripts/proof-node-backend-federation.mjs [--app id] [--target .output] [--out proof.json]
941
+ `);
942
+ }
943
+
944
+ async function main(argv = process.argv.slice(2)) {
945
+ const args = parseArgs(argv);
946
+ if (args.help) {
947
+ printHelp();
948
+ return 0;
949
+ }
950
+
951
+ const config = readJson(compactConfigPath);
952
+ const apps = compactApps(config, args.app);
953
+ const results = [];
954
+ const backendRuntime =
955
+ apps.length > 0 ? await importBackendFederationRuntime() : undefined;
956
+
957
+ for (const app of apps) {
958
+ results.push(await proveBackend(app, backendRuntime, args.target));
959
+ }
960
+
961
+ const report = {
962
+ schemaVersion: 1,
963
+ generatedAt: new Date().toISOString(),
964
+ status: results.length > 0 ? 'pass' : 'skipped',
965
+ target: args.target,
966
+ results,
967
+ };
968
+
969
+ fs.mkdirSync(path.dirname(args.out), { recursive: true });
970
+ fs.writeFileSync(args.out, `${JSON.stringify(report, null, 2)}\n`);
971
+ process.stdout.write(`[node-backend-federation-proof] ${report.status}: ${args.out}\n`);
972
+
973
+ return 0;
974
+ }
975
+
976
+ main().then(
977
+ (exitCode) => {
978
+ process.exitCode = exitCode;
979
+ },
980
+ (error) => {
981
+ process.stderr.write(`[node-backend-federation-proof] ${error.message}\n`);
982
+ process.exitCode = 1;
983
+ },
984
+ );