@bleedingdev/modern-js-ultramodern-create 3.9.0-ultramodern.2 → 3.9.0-ultramodern.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (442) hide show
  1. package/README.md +43 -74
  2. package/dist/cjs/cli/package-source.cjs +2 -2
  3. package/dist/cjs/cli/project-setup.cjs +2 -22
  4. package/dist/cjs/index.cjs +9 -1
  5. package/dist/cjs/locale/en.cjs +2 -1
  6. package/dist/cjs/locale/zh.cjs +2 -1
  7. package/dist/cjs/ultramodern-package-source.cjs +13 -9
  8. package/dist/cjs/ultramodern-release-cohort.cjs +6 -21
  9. package/dist/cjs/ultramodern-tooling/commands/cloudflare-output-verify.cjs +49 -56
  10. package/dist/cjs/ultramodern-tooling/commands/context.cjs +11 -29
  11. package/dist/cjs/ultramodern-tooling/commands/routes-generate-app.cjs +67 -0
  12. package/dist/cjs/ultramodern-tooling/commands/routes-generate.cjs +24 -53
  13. package/dist/cjs/ultramodern-tooling/commands/validate.cjs +5 -11
  14. package/dist/cjs/ultramodern-tooling/commands.cjs +15 -8
  15. package/dist/cjs/ultramodern-tooling/config/index.cjs +10 -24
  16. package/dist/cjs/ultramodern-tooling/config/load.cjs +12 -10
  17. package/dist/cjs/ultramodern-tooling/config/metadata.cjs +34 -32
  18. package/dist/cjs/ultramodern-tooling/config/normalize.cjs +165 -164
  19. package/dist/cjs/ultramodern-workspace/add-shell.cjs +118 -118
  20. package/dist/cjs/ultramodern-workspace/add-vertical/execute.cjs +121 -25
  21. package/dist/cjs/ultramodern-workspace/add-vertical/plan.cjs +14 -160
  22. package/dist/cjs/ultramodern-workspace/add-vertical/preflight.cjs +16 -48
  23. package/dist/cjs/ultramodern-workspace/add-vertical/preview.cjs +78 -0
  24. package/dist/cjs/ultramodern-workspace/add-vertical/shell-files.cjs +87 -24
  25. package/dist/cjs/ultramodern-workspace/add-vertical/topology.cjs +4 -1
  26. package/dist/cjs/ultramodern-workspace/add-vertical/transaction.cjs +378 -45
  27. package/dist/cjs/ultramodern-workspace/add-vertical/workspace-state.cjs +21 -44
  28. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +0 -9
  29. package/dist/cjs/ultramodern-workspace/api/client.cjs +5 -5
  30. package/dist/cjs/ultramodern-workspace/api/contracts.cjs +2 -2
  31. package/dist/cjs/ultramodern-workspace/api/rpc.cjs +20 -18
  32. package/dist/cjs/ultramodern-workspace/api/service.cjs +49 -24
  33. package/dist/cjs/ultramodern-workspace/api/shared.cjs +28 -18
  34. package/dist/cjs/ultramodern-workspace/app-files.cjs +3 -23
  35. package/dist/cjs/ultramodern-workspace/backend-federation.cjs +27 -27
  36. package/dist/cjs/ultramodern-workspace/contracts.cjs +14 -183
  37. package/dist/cjs/ultramodern-workspace/delivery-unit-schema/surfaces.cjs +85 -0
  38. package/dist/cjs/ultramodern-workspace/delivery-unit-schema/types.cjs +8 -85
  39. package/dist/cjs/ultramodern-workspace/delivery-unit-stamp.cjs +16 -4
  40. package/dist/cjs/ultramodern-workspace/delivery-unit-sync.cjs +27 -17
  41. package/dist/cjs/ultramodern-workspace/delivery-unit.cjs +16 -10
  42. package/dist/cjs/ultramodern-workspace/demo-components.cjs +66 -433
  43. package/dist/cjs/ultramodern-workspace/descriptors.cjs +0 -4
  44. package/dist/cjs/ultramodern-workspace/fs-io.cjs +37 -2
  45. package/dist/cjs/ultramodern-workspace/generation-result.cjs +4 -4
  46. package/dist/cjs/ultramodern-workspace/index.cjs +2 -5
  47. package/dist/cjs/ultramodern-workspace/mf-validation/constants.cjs +0 -6
  48. package/dist/cjs/ultramodern-workspace/mf-validation/discovery.cjs +6 -6
  49. package/dist/cjs/{ultramodern-tooling/commands/migrate-strict-effect/generated-patches.cjs → ultramodern-workspace/mf-validation/exposes.cjs} +13 -17
  50. package/dist/cjs/ultramodern-workspace/mf-validation/inspect.cjs +26 -7
  51. package/dist/cjs/ultramodern-workspace/mf-validation/object-literal.cjs +21 -122
  52. package/dist/cjs/ultramodern-workspace/mf-validation/path-utils.cjs +37 -38
  53. package/dist/cjs/ultramodern-workspace/mf-validation/syntax.cjs +93 -153
  54. package/dist/cjs/ultramodern-workspace/mf-validation.cjs +4 -0
  55. package/dist/cjs/ultramodern-workspace/module-federation/config.cjs +24 -29
  56. package/dist/cjs/ultramodern-workspace/module-federation/reexport-module.cjs +39 -58
  57. package/dist/cjs/ultramodern-workspace/module-federation/remote-refs.cjs +1 -43
  58. package/dist/cjs/ultramodern-workspace/package-json.cjs +63 -37
  59. package/dist/cjs/ultramodern-workspace/patch-inventory.cjs +104 -0
  60. package/dist/cjs/ultramodern-workspace/policy.cjs +3 -577
  61. package/dist/cjs/ultramodern-workspace/public-surface.cjs +3 -3
  62. package/dist/cjs/ultramodern-workspace/routes.cjs +2 -11
  63. package/dist/cjs/ultramodern-workspace/shared-patches.cjs +12 -2
  64. package/dist/cjs/ultramodern-workspace/shells.cjs +0 -70
  65. package/dist/cjs/ultramodern-workspace/tooling-command-catalog.cjs +27 -41
  66. package/dist/cjs/ultramodern-workspace/tsconfigs.cjs +8 -2
  67. package/dist/cjs/ultramodern-workspace/validation/architecture.cjs +397 -0
  68. package/dist/cjs/ultramodern-workspace/validation/assertions.cjs +140 -0
  69. package/dist/cjs/ultramodern-workspace/validation/types.cjs +18 -0
  70. package/dist/cjs/ultramodern-workspace/validation/workspace.cjs +344 -0
  71. package/dist/cjs/ultramodern-workspace/versions.cjs +81 -45
  72. package/dist/cjs/ultramodern-workspace/workspace-artifact-ownership.cjs +183 -0
  73. package/dist/cjs/ultramodern-workspace/workspace-script-plan.cjs +36 -25
  74. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +11 -200
  75. package/dist/cjs/ultramodern-workspace/workspace-validation-contract.cjs +62 -373
  76. package/dist/cjs/ultramodern-workspace/write-app.cjs +19 -11
  77. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +20 -50
  78. package/dist/cjs/ultramodern-workspace/zerops.cjs +2 -0
  79. package/dist/esm/cli/package-source.js +3 -3
  80. package/dist/esm/cli/project-setup.js +2 -22
  81. package/dist/esm/index.js +10 -2
  82. package/dist/esm/locale/en.js +2 -1
  83. package/dist/esm/locale/zh.js +2 -1
  84. package/dist/esm/ultramodern-package-source.js +14 -4
  85. package/dist/esm/ultramodern-release-cohort.js +5 -14
  86. package/dist/esm/ultramodern-tooling/commands/cloudflare-output-verify.js +49 -56
  87. package/dist/esm/ultramodern-tooling/commands/context.js +10 -26
  88. package/dist/esm/ultramodern-tooling/commands/routes-generate-app.js +35 -0
  89. package/dist/esm/ultramodern-tooling/commands/routes-generate.js +25 -54
  90. package/dist/esm/ultramodern-tooling/commands/validate.js +6 -12
  91. package/dist/esm/ultramodern-tooling/commands.js +15 -9
  92. package/dist/esm/ultramodern-tooling/config/index.js +0 -2
  93. package/dist/esm/ultramodern-tooling/config/load.js +9 -9
  94. package/dist/esm/ultramodern-tooling/config/metadata.js +33 -28
  95. package/dist/esm/ultramodern-tooling/config/normalize.js +159 -156
  96. package/dist/esm/ultramodern-workspace/add-shell.js +124 -123
  97. package/dist/esm/ultramodern-workspace/add-vertical/execute.js +119 -27
  98. package/dist/esm/ultramodern-workspace/add-vertical/plan.js +16 -150
  99. package/dist/esm/ultramodern-workspace/add-vertical/preflight.js +15 -47
  100. package/dist/esm/ultramodern-workspace/add-vertical/preview.js +40 -0
  101. package/dist/esm/ultramodern-workspace/add-vertical/shell-files.js +87 -25
  102. package/dist/esm/ultramodern-workspace/add-vertical/topology.js +4 -1
  103. package/dist/esm/ultramodern-workspace/add-vertical/transaction.js +373 -46
  104. package/dist/esm/ultramodern-workspace/add-vertical/workspace-state.js +17 -34
  105. package/dist/esm/ultramodern-workspace/add-vertical.js +1 -1
  106. package/dist/esm/ultramodern-workspace/api/client.js +5 -5
  107. package/dist/esm/ultramodern-workspace/api/contracts.js +2 -2
  108. package/dist/esm/ultramodern-workspace/api/rpc.js +20 -18
  109. package/dist/esm/ultramodern-workspace/api/service.js +49 -24
  110. package/dist/esm/ultramodern-workspace/api/shared.js +28 -18
  111. package/dist/esm/ultramodern-workspace/app-files.js +3 -23
  112. package/dist/esm/ultramodern-workspace/backend-federation.js +5 -5
  113. package/dist/esm/ultramodern-workspace/contracts.js +14 -180
  114. package/dist/esm/ultramodern-workspace/delivery-unit-schema/surfaces.js +41 -0
  115. package/dist/esm/ultramodern-workspace/delivery-unit-schema/types.js +1 -75
  116. package/dist/esm/ultramodern-workspace/delivery-unit-stamp.js +16 -4
  117. package/dist/esm/ultramodern-workspace/delivery-unit-sync.js +28 -18
  118. package/dist/esm/ultramodern-workspace/delivery-unit.js +12 -6
  119. package/dist/esm/ultramodern-workspace/demo-components.js +67 -428
  120. package/dist/esm/ultramodern-workspace/descriptors.js +1 -2
  121. package/dist/esm/ultramodern-workspace/fs-io.js +37 -2
  122. package/dist/esm/ultramodern-workspace/generation-result.js +3 -3
  123. package/dist/esm/ultramodern-workspace/index.js +1 -1
  124. package/dist/esm/ultramodern-workspace/mf-validation/constants.js +1 -4
  125. package/dist/esm/ultramodern-workspace/mf-validation/discovery.js +7 -7
  126. package/dist/esm/ultramodern-workspace/mf-validation/exposes.js +14 -0
  127. package/dist/esm/ultramodern-workspace/mf-validation/inspect.js +27 -8
  128. package/dist/esm/ultramodern-workspace/mf-validation/object-literal.js +22 -123
  129. package/dist/esm/ultramodern-workspace/mf-validation/path-utils.js +36 -34
  130. package/dist/esm/ultramodern-workspace/mf-validation/syntax.js +83 -143
  131. package/dist/esm/ultramodern-workspace/mf-validation.js +1 -0
  132. package/dist/esm/ultramodern-workspace/module-federation/config.js +25 -30
  133. package/dist/esm/ultramodern-workspace/module-federation/reexport-module.js +39 -58
  134. package/dist/esm/ultramodern-workspace/module-federation/remote-refs.js +1 -43
  135. package/dist/esm/ultramodern-workspace/package-json.js +58 -32
  136. package/dist/esm/ultramodern-workspace/patch-inventory.js +66 -0
  137. package/dist/esm/ultramodern-workspace/policy.js +2 -564
  138. package/dist/esm/ultramodern-workspace/public-surface.js +3 -3
  139. package/dist/esm/ultramodern-workspace/routes.js +2 -11
  140. package/dist/esm/ultramodern-workspace/shared-patches.js +2 -2
  141. package/dist/esm/ultramodern-workspace/shells.js +3 -67
  142. package/dist/esm/ultramodern-workspace/tooling-command-catalog.js +22 -37
  143. package/dist/esm/ultramodern-workspace/tsconfigs.js +9 -3
  144. package/dist/esm/ultramodern-workspace/validation/architecture.js +348 -0
  145. package/dist/esm/ultramodern-workspace/validation/assertions.js +65 -0
  146. package/dist/esm/ultramodern-workspace/validation/types.js +0 -0
  147. package/dist/esm/ultramodern-workspace/validation/workspace.js +286 -0
  148. package/dist/esm/ultramodern-workspace/versions.js +74 -29
  149. package/dist/esm/ultramodern-workspace/workspace-artifact-ownership.js +128 -0
  150. package/dist/esm/ultramodern-workspace/workspace-script-plan.js +35 -27
  151. package/dist/esm/ultramodern-workspace/workspace-scripts.js +10 -190
  152. package/dist/esm/ultramodern-workspace/workspace-validation-contract.js +65 -376
  153. package/dist/esm/ultramodern-workspace/write-app.js +18 -10
  154. package/dist/esm/ultramodern-workspace/write-workspace.js +25 -52
  155. package/dist/esm/ultramodern-workspace/zerops.js +2 -0
  156. package/dist/esm-node/cli/package-source.js +3 -3
  157. package/dist/esm-node/cli/project-setup.js +2 -22
  158. package/dist/esm-node/index.js +10 -2
  159. package/dist/esm-node/locale/en.js +2 -1
  160. package/dist/esm-node/locale/zh.js +2 -1
  161. package/dist/esm-node/ultramodern-package-source.js +14 -4
  162. package/dist/esm-node/ultramodern-release-cohort.js +5 -14
  163. package/dist/esm-node/ultramodern-tooling/commands/cloudflare-output-verify.js +49 -56
  164. package/dist/esm-node/ultramodern-tooling/commands/context.js +10 -26
  165. package/dist/esm-node/ultramodern-tooling/commands/routes-generate-app.js +36 -0
  166. package/dist/esm-node/ultramodern-tooling/commands/routes-generate.js +25 -54
  167. package/dist/esm-node/ultramodern-tooling/commands/validate.js +6 -12
  168. package/dist/esm-node/ultramodern-tooling/commands.js +15 -9
  169. package/dist/esm-node/ultramodern-tooling/config/index.js +0 -2
  170. package/dist/esm-node/ultramodern-tooling/config/load.js +9 -9
  171. package/dist/esm-node/ultramodern-tooling/config/metadata.js +33 -28
  172. package/dist/esm-node/ultramodern-tooling/config/normalize.js +159 -156
  173. package/dist/esm-node/ultramodern-workspace/add-shell.js +124 -123
  174. package/dist/esm-node/ultramodern-workspace/add-vertical/execute.js +119 -27
  175. package/dist/esm-node/ultramodern-workspace/add-vertical/plan.js +16 -150
  176. package/dist/esm-node/ultramodern-workspace/add-vertical/preflight.js +15 -47
  177. package/dist/esm-node/ultramodern-workspace/add-vertical/preview.js +41 -0
  178. package/dist/esm-node/ultramodern-workspace/add-vertical/shell-files.js +87 -25
  179. package/dist/esm-node/ultramodern-workspace/add-vertical/topology.js +4 -1
  180. package/dist/esm-node/ultramodern-workspace/add-vertical/transaction.js +373 -46
  181. package/dist/esm-node/ultramodern-workspace/add-vertical/workspace-state.js +17 -34
  182. package/dist/esm-node/ultramodern-workspace/add-vertical.js +1 -1
  183. package/dist/esm-node/ultramodern-workspace/api/client.js +5 -5
  184. package/dist/esm-node/ultramodern-workspace/api/contracts.js +2 -2
  185. package/dist/esm-node/ultramodern-workspace/api/rpc.js +20 -18
  186. package/dist/esm-node/ultramodern-workspace/api/service.js +49 -24
  187. package/dist/esm-node/ultramodern-workspace/api/shared.js +28 -18
  188. package/dist/esm-node/ultramodern-workspace/app-files.js +3 -23
  189. package/dist/esm-node/ultramodern-workspace/backend-federation.js +5 -5
  190. package/dist/esm-node/ultramodern-workspace/contracts.js +14 -180
  191. package/dist/esm-node/ultramodern-workspace/delivery-unit-schema/surfaces.js +42 -0
  192. package/dist/esm-node/ultramodern-workspace/delivery-unit-schema/types.js +1 -75
  193. package/dist/esm-node/ultramodern-workspace/delivery-unit-stamp.js +16 -4
  194. package/dist/esm-node/ultramodern-workspace/delivery-unit-sync.js +28 -18
  195. package/dist/esm-node/ultramodern-workspace/delivery-unit.js +12 -6
  196. package/dist/esm-node/ultramodern-workspace/demo-components.js +67 -428
  197. package/dist/esm-node/ultramodern-workspace/descriptors.js +1 -2
  198. package/dist/esm-node/ultramodern-workspace/fs-io.js +37 -2
  199. package/dist/esm-node/ultramodern-workspace/generation-result.js +3 -3
  200. package/dist/esm-node/ultramodern-workspace/index.js +1 -1
  201. package/dist/esm-node/ultramodern-workspace/mf-validation/constants.js +1 -4
  202. package/dist/esm-node/ultramodern-workspace/mf-validation/discovery.js +7 -7
  203. package/dist/esm-node/ultramodern-workspace/mf-validation/exposes.js +15 -0
  204. package/dist/esm-node/ultramodern-workspace/mf-validation/inspect.js +27 -8
  205. package/dist/esm-node/ultramodern-workspace/mf-validation/object-literal.js +22 -123
  206. package/dist/esm-node/ultramodern-workspace/mf-validation/path-utils.js +36 -34
  207. package/dist/esm-node/ultramodern-workspace/mf-validation/syntax.js +83 -143
  208. package/dist/esm-node/ultramodern-workspace/mf-validation.js +1 -0
  209. package/dist/esm-node/ultramodern-workspace/module-federation/config.js +25 -30
  210. package/dist/esm-node/ultramodern-workspace/module-federation/reexport-module.js +39 -58
  211. package/dist/esm-node/ultramodern-workspace/module-federation/remote-refs.js +1 -43
  212. package/dist/esm-node/ultramodern-workspace/package-json.js +58 -32
  213. package/dist/esm-node/ultramodern-workspace/patch-inventory.js +67 -0
  214. package/dist/esm-node/ultramodern-workspace/policy.js +2 -564
  215. package/dist/esm-node/ultramodern-workspace/public-surface.js +3 -3
  216. package/dist/esm-node/ultramodern-workspace/routes.js +2 -11
  217. package/dist/esm-node/ultramodern-workspace/shared-patches.js +2 -2
  218. package/dist/esm-node/ultramodern-workspace/shells.js +3 -67
  219. package/dist/esm-node/ultramodern-workspace/tooling-command-catalog.js +22 -37
  220. package/dist/esm-node/ultramodern-workspace/tsconfigs.js +9 -3
  221. package/dist/esm-node/ultramodern-workspace/validation/architecture.js +349 -0
  222. package/dist/esm-node/ultramodern-workspace/validation/assertions.js +66 -0
  223. package/dist/esm-node/ultramodern-workspace/validation/types.js +1 -0
  224. package/dist/esm-node/ultramodern-workspace/validation/workspace.js +287 -0
  225. package/dist/esm-node/ultramodern-workspace/versions.js +74 -29
  226. package/dist/esm-node/ultramodern-workspace/workspace-artifact-ownership.js +129 -0
  227. package/dist/esm-node/ultramodern-workspace/workspace-script-plan.js +35 -27
  228. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +10 -190
  229. package/dist/esm-node/ultramodern-workspace/workspace-validation-contract.js +65 -376
  230. package/dist/esm-node/ultramodern-workspace/write-app.js +18 -10
  231. package/dist/esm-node/ultramodern-workspace/write-workspace.js +25 -52
  232. package/dist/esm-node/ultramodern-workspace/zerops.js +2 -0
  233. package/dist/types/cli/project-setup.d.ts +1 -1
  234. package/dist/types/locale/en.d.ts +1 -0
  235. package/dist/types/locale/index.d.ts +2 -0
  236. package/dist/types/locale/zh.d.ts +1 -0
  237. package/dist/types/ultramodern-package-source.d.ts +2 -4
  238. package/dist/types/ultramodern-release-cohort.d.ts +1 -3
  239. package/dist/types/ultramodern-tooling/commands/cloudflare-output-verify.d.ts +2 -2
  240. package/dist/types/ultramodern-tooling/commands/context.d.ts +4 -1
  241. package/dist/types/ultramodern-tooling/commands/routes-generate-app.d.ts +1 -0
  242. package/dist/types/ultramodern-tooling/commands/routes-generate.d.ts +1 -1
  243. package/dist/types/ultramodern-tooling/commands/validate.d.ts +1 -1
  244. package/dist/types/ultramodern-tooling/config/index.d.ts +0 -2
  245. package/dist/types/ultramodern-tooling/config/load.d.ts +10 -2
  246. package/dist/types/ultramodern-tooling/config/metadata.d.ts +2 -2
  247. package/dist/types/ultramodern-tooling/config/normalize.d.ts +19 -19
  248. package/dist/types/ultramodern-tooling/config/types.d.ts +2 -9
  249. package/dist/types/ultramodern-workspace/add-shell.d.ts +1 -1
  250. package/dist/types/ultramodern-workspace/add-vertical/execute.d.ts +1 -0
  251. package/dist/types/ultramodern-workspace/add-vertical/preflight.d.ts +4 -3
  252. package/dist/types/ultramodern-workspace/add-vertical/preview.d.ts +4 -0
  253. package/dist/types/ultramodern-workspace/add-vertical/shell-files.d.ts +7 -2
  254. package/dist/types/ultramodern-workspace/add-vertical/transaction.d.ts +32 -6
  255. package/dist/types/ultramodern-workspace/add-vertical/workspace-state.d.ts +10 -7
  256. package/dist/types/ultramodern-workspace/add-vertical.d.ts +1 -1
  257. package/dist/types/ultramodern-workspace/api/client.d.ts +3 -1
  258. package/dist/types/ultramodern-workspace/api/rpc.d.ts +1 -1
  259. package/dist/types/ultramodern-workspace/api/service.d.ts +3 -1
  260. package/dist/types/ultramodern-workspace/api/shared.d.ts +2 -0
  261. package/dist/types/ultramodern-workspace/backend-federation.d.ts +1 -1
  262. package/dist/types/ultramodern-workspace/contracts.d.ts +1 -3
  263. package/dist/types/ultramodern-workspace/delivery-unit-schema/surfaces.d.ts +17 -0
  264. package/dist/types/ultramodern-workspace/delivery-unit-schema/types.d.ts +3 -68
  265. package/dist/types/ultramodern-workspace/delivery-unit-stamp.d.ts +2 -2
  266. package/dist/types/ultramodern-workspace/delivery-unit.d.ts +3 -3
  267. package/dist/types/ultramodern-workspace/demo-components.d.ts +0 -3
  268. package/dist/types/ultramodern-workspace/descriptors.d.ts +0 -1
  269. package/dist/types/ultramodern-workspace/fs-io.d.ts +1 -1
  270. package/dist/types/ultramodern-workspace/index.d.ts +1 -1
  271. package/dist/types/ultramodern-workspace/mf-validation/constants.d.ts +0 -1
  272. package/dist/types/ultramodern-workspace/mf-validation/exposes.d.ts +11 -0
  273. package/dist/types/ultramodern-workspace/mf-validation/path-utils.d.ts +2 -3
  274. package/dist/types/ultramodern-workspace/mf-validation/syntax.d.ts +4 -3
  275. package/dist/types/ultramodern-workspace/mf-validation/types.d.ts +1 -0
  276. package/dist/types/ultramodern-workspace/mf-validation.d.ts +1 -0
  277. package/dist/types/ultramodern-workspace/module-federation/config.d.ts +1 -1
  278. package/dist/types/ultramodern-workspace/module-federation/reexport-module.d.ts +2 -2
  279. package/dist/types/ultramodern-workspace/package-json.d.ts +1 -1
  280. package/dist/types/ultramodern-workspace/patch-inventory.d.ts +10 -0
  281. package/dist/types/ultramodern-workspace/policy.d.ts +31 -209
  282. package/dist/types/ultramodern-workspace/routes.d.ts +6 -1
  283. package/dist/types/ultramodern-workspace/shells.d.ts +2 -15
  284. package/dist/types/ultramodern-workspace/tooling-command-catalog.d.ts +8 -7
  285. package/dist/types/ultramodern-workspace/types.d.ts +9 -9
  286. package/dist/types/ultramodern-workspace/validation/architecture.d.ts +2 -0
  287. package/dist/types/ultramodern-workspace/validation/assertions.d.ts +14 -0
  288. package/dist/types/ultramodern-workspace/validation/types.d.ts +9 -0
  289. package/dist/types/ultramodern-workspace/validation/workspace.d.ts +6 -0
  290. package/dist/types/ultramodern-workspace/versions.d.ts +73 -28
  291. package/dist/types/ultramodern-workspace/workspace-artifact-ownership.d.ts +18 -0
  292. package/dist/types/ultramodern-workspace/workspace-script-plan.d.ts +4 -5
  293. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +8 -13
  294. package/dist/types/ultramodern-workspace/workspace-validation-contract.d.ts +22 -188
  295. package/dist/types/ultramodern-workspace/write-workspace.d.ts +1 -3
  296. package/package.json +18 -11
  297. package/{template-workspace/.modernjs/release-cohort.json → release-cohort.json} +88 -40
  298. package/template-workspace/.codex/skills/rspack-tracing/scripts/analyze_trace.js +1 -1
  299. package/template-workspace/README.md.handlebars +20 -35
  300. package/template-workspace/oxfmt.config.ts +3 -0
  301. package/template-workspace/pnpm-workspace.yaml.handlebars +0 -24
  302. package/template-workspace/scripts/bootstrap-agent-skills.mjs +4 -4
  303. package/templates/packages/shared-contracts-index.ts +4 -332
  304. package/templates/workspace/apps/modern.config.shared-module-federation.ts.handlebars +10 -0
  305. package/templates/workspace/apps/modern.config.ts.handlebars +13 -27
  306. package/templates/workspace/apps/shared/src/routes/ultramodern-route-metadata.ts.handlebars +21 -11
  307. package/templates/workspace/apps/shell-super-app/src/routes/[lang]/page.tsx.handlebars +20 -20
  308. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.helpers.tsx.handlebars +4 -6
  309. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.imports.tsx.handlebars +2 -2
  310. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.tsx.handlebars +11 -11
  311. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.worker.helpers.tsx.handlebars +1 -1
  312. package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.worker.imports.tsx.handlebars +1 -1
  313. package/templates/workspace-scripts/generate-node-backend-federation.mjs +68 -77
  314. package/templates/workspace-scripts/generate-public-surface-assets.mjs +107 -207
  315. package/templates/workspace-scripts/materialize-zerops-runtime.mjs +12 -19
  316. package/templates/workspace-scripts/proof-cloudflare-version.mjs +53 -444
  317. package/templates/workspace-scripts/proof-node-backend-federation.mjs +212 -91
  318. package/templates/workspace-scripts/{proof-workerd-ssr.mts → proof-workerd-ssr.mjs} +434 -239
  319. package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +25 -7
  320. package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +45 -147
  321. package/templates/workspace-scripts/ultramodern-typecheck.mjs +1 -1
  322. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.cjs +0 -212
  323. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.cjs +0 -47
  324. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.cjs +0 -112
  325. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.cjs +0 -55
  326. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.cjs +0 -102
  327. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.cjs +0 -195
  328. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.cjs +0 -146
  329. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.cjs +0 -110
  330. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.cjs +0 -67
  331. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.cjs +0 -307
  332. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.cjs +0 -58
  333. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.cjs +0 -71
  334. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.cjs +0 -151
  335. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/help.cjs +0 -67
  336. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/install.cjs +0 -52
  337. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/io.cjs +0 -447
  338. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.cjs +0 -323
  339. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-source.cjs +0 -87
  340. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.cjs +0 -612
  341. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.cjs +0 -376
  342. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.cjs +0 -73
  343. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.cjs +0 -215
  344. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.cjs +0 -135
  345. package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect.cjs +0 -454
  346. package/dist/cjs/ultramodern-tooling/config/constants.cjs +0 -48
  347. package/dist/cjs/ultramodern-tooling/config/synthesize.cjs +0 -157
  348. package/dist/cjs/ultramodern-workspace/delivery-unit-schema/up-projection.cjs +0 -188
  349. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.js +0 -154
  350. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.js +0 -9
  351. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.js +0 -63
  352. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.js +0 -7
  353. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +0 -47
  354. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +0 -146
  355. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.js +0 -97
  356. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.js +0 -61
  357. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.js +0 -16
  358. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +0 -258
  359. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.js +0 -10
  360. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.js +0 -8
  361. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.js +0 -15
  362. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.js +0 -100
  363. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/help.js +0 -29
  364. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/install.js +0 -14
  365. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/io.js +0 -385
  366. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +0 -276
  367. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-source.js +0 -49
  368. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +0 -559
  369. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +0 -329
  370. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.js +0 -19
  371. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.js +0 -148
  372. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.js +0 -80
  373. package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect.js +0 -405
  374. package/dist/esm/ultramodern-tooling/config/constants.js +0 -4
  375. package/dist/esm/ultramodern-tooling/config/synthesize.js +0 -108
  376. package/dist/esm/ultramodern-workspace/delivery-unit-schema/up-projection.js +0 -129
  377. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.js +0 -155
  378. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.js +0 -10
  379. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.js +0 -64
  380. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.js +0 -8
  381. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +0 -48
  382. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +0 -147
  383. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.js +0 -98
  384. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.js +0 -62
  385. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.js +0 -17
  386. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +0 -259
  387. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.js +0 -11
  388. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.js +0 -9
  389. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.js +0 -16
  390. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.js +0 -101
  391. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/help.js +0 -30
  392. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/install.js +0 -15
  393. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/io.js +0 -386
  394. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +0 -277
  395. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-source.js +0 -50
  396. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +0 -560
  397. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +0 -330
  398. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.js +0 -20
  399. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.js +0 -149
  400. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.js +0 -81
  401. package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect.js +0 -406
  402. package/dist/esm-node/ultramodern-tooling/config/constants.js +0 -5
  403. package/dist/esm-node/ultramodern-tooling/config/synthesize.js +0 -109
  404. package/dist/esm-node/ultramodern-workspace/delivery-unit-schema/up-projection.js +0 -130
  405. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.d.ts +0 -12
  406. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.d.ts +0 -4
  407. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.d.ts +0 -1
  408. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.d.ts +0 -3
  409. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.d.ts +0 -5
  410. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.d.ts +0 -3
  411. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.d.ts +0 -2
  412. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.d.ts +0 -2
  413. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.d.ts +0 -4
  414. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.d.ts +0 -3
  415. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.d.ts +0 -3
  416. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.d.ts +0 -8
  417. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.d.ts +0 -3
  418. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.d.ts +0 -3
  419. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/help.d.ts +0 -1
  420. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/install.d.ts +0 -2
  421. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/io.d.ts +0 -26
  422. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.d.ts +0 -25
  423. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-source.d.ts +0 -3
  424. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.d.ts +0 -26
  425. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.d.ts +0 -26
  426. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.d.ts +0 -6
  427. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.d.ts +0 -37
  428. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.d.ts +0 -4
  429. package/dist/types/ultramodern-tooling/commands/migrate-strict-effect.d.ts +0 -2
  430. package/dist/types/ultramodern-tooling/config/constants.d.ts +0 -3
  431. package/dist/types/ultramodern-tooling/config/synthesize.d.ts +0 -5
  432. package/dist/types/ultramodern-workspace/delivery-unit-schema/up-projection.d.ts +0 -189
  433. package/template-workspace/patches/@module-federation__bridge-react@2.9.0.patch +0 -47
  434. package/template-workspace/patches/@module-federation__dts-plugin@2.9.0.patch +0 -26
  435. package/template-workspace/patches/@module-federation__modern-js-v3@2.9.0.patch +0 -268
  436. package/template-workspace/patches/@module-federation__runtime-core@2.9.0.patch +0 -13
  437. package/template-workspace/patches/drizzle-orm-ts7-strict-declarations.patch +0 -471
  438. package/template-workspace/patches/msgpackr@2.1.0.patch +0 -30
  439. package/template-workspace/patches/zod@4.5.4.patch +0 -56
  440. package/templates/workspace-scripts/check-ultramodern-api-boundaries.mts +0 -779
  441. package/templates/workspace-scripts/check-ultramodern-i18n-boundaries.mts +0 -9
  442. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +0 -4109
@@ -9,7 +9,8 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
9
9
 
10
10
  const workspaceRoot = path.resolve(process.env.ULTRAMODERN_WORKSPACE_ROOT ?? process.cwd());
11
11
  const workspaceRequire = createRequire(path.join(workspaceRoot, 'package.json'));
12
- const compactConfigPath = path.join(workspaceRoot, '.modernjs/ultramodern.json');
12
+ const topologyPath = path.join(workspaceRoot, 'topology/reference-topology.json');
13
+ const localOverlayPath = path.join(workspaceRoot, 'topology/local-overlays/development.json');
13
14
  const defaultOut = path.join(
14
15
  workspaceRoot,
15
16
  '.codex/reports/node-backend-federation-proof/proof.json',
@@ -19,13 +20,9 @@ const defaultOut = path.join(
19
20
  // @modern-js/utils/universal backend-federation-contract. Generated workspace
20
21
  // scripts do not currently import @modern-js/utils directly.
21
22
  const contractVersion = 'microvertical-server-effect-v1';
22
- const nodeAdapterVersion = 'backend-mf-effect-v1';
23
+ const nodeAdapterVersion = 'backend-mf-effect-v2';
23
24
  const backendExpose = './effect-api';
24
25
  const releaseEnvelopePath = 'release/microvertical-release-envelope.json';
25
- const localRuntimeRelativePaths = [
26
- 'packages/cli/plugin-bff/dist/esm-node/runtime/effect/index.mjs',
27
- 'cli/plugin-bff/dist/esm-node/runtime/effect/index.mjs',
28
- ];
29
26
 
30
27
  function readJson(filePath) {
31
28
  return JSON.parse(fs.readFileSync(filePath, 'utf8'));
@@ -55,60 +52,30 @@ function hasBackendFederationManifestAdapter(runtime) {
55
52
  return typeof runtime?.loadBackendFederatedEffectApiFromManifest === 'function';
56
53
  }
57
54
 
58
- function findLocalRuntimePath(createBin) {
59
- let current = path.dirname(fileURLToPath(pathToFileURL(createBin)));
60
- for (let depth = 0; depth < 8; depth += 1) {
61
- for (const relativePath of localRuntimeRelativePaths) {
62
- const candidate = path.join(current, relativePath);
63
- if (fs.existsSync(candidate)) {
64
- return candidate;
65
- }
66
- }
67
-
68
- const parent = path.dirname(current);
69
- if (parent === current) {
70
- break;
71
- }
72
- current = parent;
73
- }
74
-
75
- return undefined;
76
- }
77
-
78
- async function importBackendFederationRuntime() {
79
- let importError;
80
- try {
81
- const runtimePath = workspaceRequire.resolve('@modern-js/plugin-bff/effect');
82
- const runtime = await import(pathToFileURL(runtimePath).href);
83
- if (hasBackendFederationManifestAdapter(runtime)) {
84
- return runtime;
85
- }
86
-
87
- importError = new Error(
55
+ export async function importBackendFederationRuntime() {
56
+ const runtimePath = workspaceRequire.resolve(
57
+ '@modern-js/plugin-bff-extensions/backend-federation-manifest/node',
58
+ );
59
+ const effectPath = workspaceRequire.resolve('@modern-js/bff-effect/effect');
60
+ const [runtime, effect] = await Promise.all([
61
+ import(pathToFileURL(runtimePath).href),
62
+ import(pathToFileURL(effectPath).href),
63
+ ]);
64
+ if (!hasBackendFederationManifestAdapter(runtime)) {
65
+ throw new Error(
88
66
  `${runtimePath} does not export loadBackendFederatedEffectApiFromManifest`,
89
67
  );
90
- } catch (error) {
91
- importError = error;
92
68
  }
93
-
94
- const createBin = process.env.ULTRAMODERN_CREATE_BIN;
95
- if (!createBin) {
96
- throw importError;
97
- }
98
-
99
- const localRuntimePath = findLocalRuntimePath(createBin);
100
- if (!localRuntimePath) {
101
- throw importError;
102
- }
103
-
104
- const localRuntime = await import(pathToFileURL(localRuntimePath).href);
105
- if (!hasBackendFederationManifestAdapter(localRuntime)) {
69
+ if (typeof effect.createEffectBffTestHandler !== 'function') {
106
70
  throw new Error(
107
- `${localRuntimePath} does not export loadBackendFederatedEffectApiFromManifest`,
71
+ `${effectPath} does not export createEffectBffTestHandler`,
108
72
  );
109
73
  }
110
-
111
- return localRuntime;
74
+ return {
75
+ loadBackendFederatedEffectApiFromManifest:
76
+ runtime.loadBackendFederatedEffectApiFromManifest,
77
+ createEffectBffTestHandler: effect.createEffectBffTestHandler,
78
+ };
112
79
  }
113
80
 
114
81
  function normalizeRelativePath(value) {
@@ -129,7 +96,6 @@ function createBackendName(app) {
129
96
  return (
130
97
  app.backendFederation?.name ??
131
98
  app.backendFederation?.executionSurfaces?.node?.remoteName ??
132
- app.serverExecution?.node?.remoteName ??
133
99
  (typeof app.moduleFederation?.name === 'string'
134
100
  ? `${app.moduleFederation.name}Backend`
135
101
  : `vertical${toPascalCase(app.id)}Backend`)
@@ -138,7 +104,6 @@ function createBackendName(app) {
138
104
 
139
105
  function createBackendManifestUrl(app) {
140
106
  return (
141
- app.backendFederation?.executionSurfaces?.node?.manifestUrl ??
142
107
  app.serverExecution?.node?.manifestUrl ??
143
108
  `http://localhost:${app.port}/backend-mf-manifest.json`
144
109
  );
@@ -146,7 +111,6 @@ function createBackendManifestUrl(app) {
146
111
 
147
112
  function createBackendContainerEntry(app) {
148
113
  return (
149
- app.backendFederation?.executionSurfaces?.node?.containerEntry ??
150
114
  app.serverExecution?.node?.containerEntry ??
151
115
  `http://localhost:${app.port}/backendRemoteEntry.cjs`
152
116
  );
@@ -154,8 +118,8 @@ function createBackendContainerEntry(app) {
154
118
 
155
119
  function resolveRemoteType(app) {
156
120
  return (
157
- app.backendFederation?.executionSurfaces?.node?.remoteType ??
158
121
  app.serverExecution?.node?.remoteType ??
122
+ app.backendFederation?.executionSurfaces?.node?.remoteType ??
159
123
  'commonjs-module'
160
124
  );
161
125
  }
@@ -173,8 +137,8 @@ function collectJsonSmokeChecks(apps, targetApp) {
173
137
 
174
138
  const configuredChecks = apps
175
139
  .flatMap((app) =>
176
- Array.isArray(app?.deploy?.cloudflare?.jsonSmokeChecks)
177
- ? app.deploy.cloudflare.jsonSmokeChecks
140
+ Array.isArray(app?.cloudflare?.jsonSmokeChecks)
141
+ ? app.cloudflare.jsonSmokeChecks
178
142
  : [],
179
143
  )
180
144
  .filter((check) => {
@@ -211,27 +175,70 @@ function collectJsonSmokeChecks(apps, targetApp) {
211
175
  ];
212
176
  }
213
177
 
214
- function compactApps(config, appFilter) {
215
- const apps = Array.isArray(config.topology?.apps) ? config.topology.apps : [];
178
+ export function topologyApps(topology, localOverlay, appFilter, env = process.env) {
179
+ if (!Array.isArray(topology?.verticals) || !localOverlay?.ports || !localOverlay?.serverExecution) {
180
+ throw new Error('Node proof requires declared reference topology and development overlay.');
181
+ }
182
+ const apps = topology.verticals;
216
183
  const filteredApps = apps
217
184
  .filter((app) => app?.kind === 'vertical' && app.api)
218
185
  .filter((app) => !appFilter || app.id === appFilter)
219
- .map((app) => ({
186
+ .map((app) => {
187
+ const overlayPort = localOverlay.ports[app.id];
188
+ const domain = app.domain ?? app.id;
189
+ const portEnv = app.portEnv ??
190
+ `VERTICAL_${String(domain).replace(/[^a-zA-Z0-9]/gu, '_').toUpperCase()}_PORT`;
191
+ const configuredPort = env[portEnv];
192
+ const port = configuredPort === undefined ? overlayPort : Number(configuredPort);
193
+ const serverExecution = localOverlay.serverExecution[app.id];
194
+ if (!app.path || !Number.isInteger(overlayPort) || !Number.isInteger(port) || port < 1 || port > 65535 || !serverExecution?.node) {
195
+ throw new Error(`${app.id} is missing its declared path, port or Node server execution.`);
196
+ }
197
+ const appManifest = readJson(path.join(workspaceRoot, app.path, 'package.json'));
198
+ if (app.package !== appManifest.name || typeof appManifest.version !== 'string') {
199
+ throw new Error(`${app.id} topology package identity must match package.json`);
200
+ }
201
+ const api = { ...app.api, prefix: app.api.bff?.prefix };
202
+ const declared = { ...app, api, serverExecution };
203
+ const publicUrlEnv = app.cloudflare?.publicUrlEnv;
204
+ const configuredPublicUrl = publicUrlEnv ? env[publicUrlEnv] : undefined;
205
+ const publicOrigin = configuredPublicUrl
206
+ ? new URL(configuredPublicUrl).origin
207
+ : `http://localhost:${port}`;
208
+ if (!/^https?:\/\//u.test(publicOrigin)) {
209
+ throw new Error(`${app.id} has an invalid declared public URL.`);
210
+ }
211
+ const nodeUrl = (declaredUrl) => {
212
+ const url = new URL(declaredUrl);
213
+ return url.origin === new URL(`http://localhost:${overlayPort}`).origin &&
214
+ url.username === '' &&
215
+ url.password === ''
216
+ ? `${publicOrigin}${url.pathname}${url.search}${url.hash}`
217
+ : declaredUrl;
218
+ };
219
+ return {
220
220
  id: app.id,
221
- directory:
222
- typeof app.path === 'string' ? normalizeRelativePath(app.path) : `verticals/${app.id}`,
223
- backendName: createBackendName(app),
224
- manifestUrl: createBackendManifestUrl(app),
225
- containerEntry: createBackendContainerEntry(app),
226
- port: app.port,
227
- portEnv: app.portEnv,
228
- remoteType: resolveRemoteType(app),
229
- smokeChecks: collectJsonSmokeChecks(apps, app),
230
- compactDeliveryUnit:
221
+ directory: normalizeRelativePath(app.path),
222
+ backendName: createBackendName(declared),
223
+ manifestUrl: nodeUrl(createBackendManifestUrl(declared)),
224
+ containerEntry: nodeUrl(createBackendContainerEntry(declared)),
225
+ port,
226
+ portEnv,
227
+ remoteType: resolveRemoteType(declared),
228
+ apiProtocol: app.api.protocol ?? 'rest',
229
+ apiPrefix: app.api.bff?.prefix,
230
+ rpcPath: app.api.rpcPath,
231
+ rpcSerialization: app.api.rpcSerialization,
232
+ apiOnly: app.surfaceProfile === 'api-only',
233
+ smokeChecks: collectJsonSmokeChecks(apps, declared),
234
+ topologyDeliveryUnit:
231
235
  app.deliveryUnit && typeof app.deliveryUnit === 'object'
232
236
  ? app.deliveryUnit
233
237
  : undefined,
234
- }));
238
+ packageName: appManifest.name,
239
+ version: appManifest.version,
240
+ };
241
+ });
235
242
 
236
243
  if (appFilter && filteredApps.length === 0) {
237
244
  throw new Error(`No vertical API app matched --app ${appFilter}`);
@@ -473,7 +480,7 @@ function sha256(bytes) {
473
480
  return createHash('sha256').update(bytes).digest('hex');
474
481
  }
475
482
 
476
- function readBoundReleaseEnvelope(app, target) {
483
+ export function readBoundReleaseEnvelope(app, target) {
477
484
  const targetDirectory = path.join(workspaceRoot, app.directory, target);
478
485
  const envelopePath = path.join(targetDirectory, releaseEnvelopePath);
479
486
  assertFile(envelopePath, app.id, 'Node release envelope');
@@ -484,6 +491,18 @@ function readBoundReleaseEnvelope(app, target) {
484
491
  `${app.id} release-envelope schema`,
485
492
  );
486
493
  assertEqual(envelope.target, 'node', `${app.id} release-envelope target`);
494
+ assertEqual(
495
+ envelope.kind,
496
+ 'ultramodern-target-microvertical-release-envelope',
497
+ `${app.id} release-envelope kind`,
498
+ );
499
+ if (app.apiOnly) {
500
+ if (envelope.surfaces?.uiClient?.length !== 0 || envelope.surfaces?.ssr?.length !== 0) {
501
+ throw new Error(`${app.id} API-only release envelope must declare empty UI/client and SSR surfaces`);
502
+ }
503
+ } else if (!envelope.surfaces?.uiClient?.length || !envelope.surfaces?.ssr?.length) {
504
+ throw new Error(`${app.id} full-stack release envelope must bind UI/client and SSR surfaces`);
505
+ }
487
506
 
488
507
  const manifestLogicalPath = envelope.surfaces?.backendFederation?.manifest;
489
508
  const containerLogicalPath = envelope.surfaces?.backendFederation?.container;
@@ -729,6 +748,98 @@ async function proveLiveApi(app, manifest, releaseBinding) {
729
748
  };
730
749
  }
731
750
 
751
+ export async function proveLiveRpcApi(app, loaded, manifest, releaseBinding) {
752
+ const contract = loaded.contract;
753
+ if (contract?.protocol !== 'rpc' || typeof contract.group !== 'string' ||
754
+ typeof contract.path !== 'string' || contract.serialization !== 'json') {
755
+ throw new Error(`${app.id} backend expose missing native RPC contract`);
756
+ }
757
+ assertEqual(contract.path, app.rpcPath, `${app.id} RPC contract/topology path`);
758
+ assertEqual(contract.path, manifest.backendFederation?.rpcPath, `${app.id} RPC contract/manifest path`);
759
+ assertEqual(contract.serialization, app.rpcSerialization, `${app.id} RPC contract/topology serialization`);
760
+ assertEqual(contract.serialization, manifest.backendFederation?.rpcSerialization, `${app.id} RPC contract/manifest serialization`);
761
+ const check = app.smokeChecks.find((entry) => entry?.body?.method === 'list' && entry.route === contract.path);
762
+ if (!check || !Number.isInteger(check.body?.params?.limit) || check.body.params.limit < 1) {
763
+ throw new Error(`${app.id} has no declared RPC list smoke check`);
764
+ }
765
+ const route = normalizeRoutePath(contract.path);
766
+ const url = new URL(route, app.manifestUrl).href;
767
+ const clientModule = createRequire(
768
+ path.join(workspaceRoot, app.directory, 'package.json'),
769
+ )(`${app.packageName}/api/rpc-client`);
770
+ const clientName = toPascalCase(contract.group);
771
+ const localContract = clientModule[`${clientName}RpcContract`];
772
+ if (localContract?.path !== contract.path ||
773
+ localContract?.group !== contract.group ||
774
+ localContract?.serialization !== contract.serialization ||
775
+ localContract?.protocol !== contract.protocol) {
776
+ throw new Error(`${app.id} public RPC client contract does not match the verified backend expose`);
777
+ }
778
+ const makeClient = clientModule[`make${clientName}RpcClient`];
779
+ if (typeof makeClient !== 'function' ||
780
+ typeof clientModule.Effect?.runPromise !== 'function') {
781
+ throw new Error(`${app.id} has no native public RPC client`);
782
+ }
783
+ const client = await clientModule.Effect.runPromise(makeClient({ url }));
784
+ try {
785
+ const listed = await clientModule.Effect.runPromise(client.list({ limit: check.body.params.limit }));
786
+ const item = listed?.items?.[0];
787
+ if (typeof item?.id !== 'string' || item.id.length === 0) {
788
+ throw new Error(`${app.id} native RPC list returned no item id`);
789
+ }
790
+ for (const expectation of normalizeJsonExpectations(check)) {
791
+ if (expectation.path === 'id') {
792
+ assertJsonEqual(check.body.id, expectation.value, `${app.id} declared RPC request id`);
793
+ } else if (expectation.path.startsWith('result.')) {
794
+ assertJsonEqual(
795
+ jsonPathValue(listed, expectation.path.slice('result.'.length)),
796
+ expectation.value,
797
+ `${app.id} native RPC ${expectation.path}`,
798
+ );
799
+ } else {
800
+ throw new Error(`${app.id} RPC smoke check has unsupported expectation ${expectation.path}`);
801
+ }
802
+ }
803
+ const fetched = await clientModule.Effect.runPromise(client.get({ id: item.id }));
804
+ assertEqual(fetched?.id, item.id, `${app.id} native RPC get item id`);
805
+ const missingId = `__ultramodern-proof-missing-${item.id}__`;
806
+ const missing = await clientModule.Effect.runPromise(
807
+ clientModule.Effect.match(client.get({ id: missingId }), {
808
+ onFailure: (error) => ({ error }),
809
+ onSuccess: (value) => ({ value }),
810
+ }),
811
+ );
812
+ const expectedErrorTag = `${toPascalCase(contract.group)}NotFoundRpc`;
813
+ if (missing?.error?._tag !== expectedErrorTag ||
814
+ missing.error?.id !== missingId) {
815
+ throw new Error(`${app.id} native RPC get did not return ${expectedErrorTag} for a missing item`);
816
+ }
817
+ return {
818
+ method: 'RPC',
819
+ route,
820
+ url,
821
+ protocol: contract.protocol,
822
+ serialization: contract.serialization,
823
+ group: contract.group,
824
+ operations: [
825
+ { method: 'list', itemId: item.id, status: 'pass' },
826
+ { method: 'get', itemId: fetched.id, status: 'pass' },
827
+ { method: 'get', errorTag: missing.error._tag, missingId, status: 'pass' },
828
+ ],
829
+ envelopeDigest: releaseBinding.envelope.envelopeDigest,
830
+ apiBackendArtifacts: releaseBinding.apiBackendArtifacts.map((artifact) => ({
831
+ logicalPath: artifact.logicalPath,
832
+ runtime: artifact.runtime,
833
+ byteLength: artifact.byteLength,
834
+ sha256: artifact.sha256,
835
+ })),
836
+ status: 'pass',
837
+ };
838
+ } finally {
839
+ await client.dispose();
840
+ }
841
+ }
842
+
732
843
  function jsonPathValue(value, path) {
733
844
  const segments = String(path ?? '')
734
845
  .split('.')
@@ -781,12 +892,17 @@ async function runSmokeChecks(app, loaded, createEffectBffTestHandler) {
781
892
  throw new Error(`${app.id} backend runtime cannot create Effect test handler`);
782
893
  }
783
894
 
784
- const servicePrefix = loaded.contract?.servicePrefix ?? loaded.contract?.apiPrefix;
895
+ const servicePrefix = loaded.contract?.protocol === 'rpc'
896
+ ? app.apiPrefix
897
+ : loaded.contract?.servicePrefix ?? loaded.contract?.apiPrefix;
785
898
  if (typeof servicePrefix !== 'string' || servicePrefix.length === 0) {
786
899
  throw new Error(
787
- `${app.id} backend expose missing contract.servicePrefix/apiPrefix`,
900
+ `${app.id} backend expose missing declared API prefix`,
788
901
  );
789
902
  }
903
+ if (loaded.contract?.protocol === 'rpc') {
904
+ assertEqual(loaded.contract.path, app.rpcPath, `${app.id} RPC smoke route`);
905
+ }
790
906
 
791
907
  const edge = await createEffectBffTestHandler({
792
908
  module: loaded.runtime,
@@ -995,10 +1111,10 @@ function validateManifest(app, manifest, buildIdentity) {
995
1111
  }
996
1112
  }
997
1113
 
998
- function assertCompactStableIdentityMatchesBuild(app, buildIdentity) {
999
- const compactDeliveryUnit = app.compactDeliveryUnit;
1000
- if (!compactDeliveryUnit) {
1001
- return;
1114
+ function assertTopologyStableIdentityMatchesBuild(app, buildIdentity) {
1115
+ const topologyDeliveryUnit = app.topologyDeliveryUnit;
1116
+ if (!topologyDeliveryUnit) {
1117
+ throw new Error(`${app.id} is missing its declared topology delivery-unit identity`);
1002
1118
  }
1003
1119
 
1004
1120
  const mismatches = [];
@@ -1007,20 +1123,22 @@ function assertCompactStableIdentityMatchesBuild(app, buildIdentity) {
1007
1123
  mismatches.push(`${label}: deliveryUnit=${a} vs ultramodern-build=${b}`);
1008
1124
  }
1009
1125
  };
1010
- compare('unitId', compactDeliveryUnit.unitId, buildIdentity.unitId);
1126
+ compare('unitId', topologyDeliveryUnit.unitId, buildIdentity.unitId);
1011
1127
  compare(
1012
1128
  'packageName',
1013
- compactDeliveryUnit.packageName,
1129
+ topologyDeliveryUnit.packageName,
1014
1130
  buildIdentity.packageName,
1015
1131
  );
1016
- compare('version', compactDeliveryUnit.version, buildIdentity.version);
1132
+ compare('version', topologyDeliveryUnit.version, buildIdentity.version);
1133
+ compare('packageName', app.packageName, buildIdentity.packageName);
1134
+ compare('version', app.version, buildIdentity.version);
1017
1135
 
1018
1136
  if (mismatches.length > 0) {
1019
1137
  throw new Error(
1020
1138
  `${app.id} delivery-unit identity drift between ${path.relative(
1021
1139
  workspaceRoot,
1022
- compactConfigPath,
1023
- )} (generation metadata) and ${path.relative(
1140
+ topologyPath,
1141
+ )} (reference topology) and ${path.relative(
1024
1142
  workspaceRoot,
1025
1143
  buildIdentity.artifactPath,
1026
1144
  )} (stamped target identity): ${mismatches.join('; ')}`,
@@ -1039,7 +1157,7 @@ async function proveBackend(app, backendRuntime, target) {
1039
1157
  assertFile(entryPath, app.id, 'backend remote entry');
1040
1158
 
1041
1159
  const buildIdentity = readBuildIdentity(app, target);
1042
- assertCompactStableIdentityMatchesBuild(app, buildIdentity);
1160
+ assertTopologyStableIdentityMatchesBuild(app, buildIdentity);
1043
1161
  const manifest = readJson(manifestPath);
1044
1162
  validateManifest(app, manifest, buildIdentity);
1045
1163
  const releaseBinding = readBoundReleaseEnvelope(app, target);
@@ -1141,7 +1259,9 @@ async function proveBackend(app, backendRuntime, target) {
1141
1259
  }
1142
1260
 
1143
1261
  const smokeChecks = await runSmokeChecks(app, loaded, createEffectBffTestHandler);
1144
- const liveApi = await proveLiveApi(app, manifest, releaseBinding);
1262
+ const liveApi = loaded.contract?.protocol === 'rpc'
1263
+ ? await proveLiveRpcApi(app, loaded, manifest, releaseBinding)
1264
+ : await proveLiveApi(app, manifest, releaseBinding);
1145
1265
 
1146
1266
  return {
1147
1267
  appId: app.id,
@@ -1218,9 +1338,10 @@ async function main(argv = process.argv.slice(2)) {
1218
1338
  return 0;
1219
1339
  }
1220
1340
 
1221
- const config = readJson(compactConfigPath);
1222
- const runtimeApps = compactApps(config);
1223
- const apps = args.app ? compactApps(config, args.app) : runtimeApps;
1341
+ const topology = readJson(topologyPath);
1342
+ const localOverlay = readJson(localOverlayPath);
1343
+ const runtimeApps = topologyApps(topology, localOverlay);
1344
+ const apps = args.app ? topologyApps(topology, localOverlay, args.app) : runtimeApps;
1224
1345
  const results = [];
1225
1346
  const backendRuntime =
1226
1347
  apps.length > 0 ? await importBackendFederationRuntime() : undefined;