@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,13 +9,14 @@ const workspaceRoot = path.resolve(
9
9
  process.env.ULTRAMODERN_WORKSPACE_ROOT ??
10
10
  path.join(path.dirname(fileURLToPath(import.meta.url)), '../..'),
11
11
  );
12
- const configPath = path.join(workspaceRoot, '.modernjs/ultramodern.json');
12
+ const topologyPath = path.join(workspaceRoot, 'topology/reference-topology.json');
13
+ const overlayPath = path.join(workspaceRoot, 'topology/local-overlays/development.json');
13
14
  const { build } = createRequire(import.meta.url)('esbuild');
14
15
  // Keep these constants/checks in sync with
15
- // @modern-js/utils/universal backend-federation-contract. Generated workspace
16
+ // @modern-js/backend-federation-contracts backend-federation-contract. Generated workspace
16
17
  // scripts do not currently import @modern-js/utils directly.
17
18
  const contractVersion = 'microvertical-server-effect-v1';
18
- const nodeAdapterVersion = 'backend-mf-effect-v1';
19
+ const nodeAdapterVersion = 'backend-mf-effect-v2';
19
20
 
20
21
  function readJson(filePath) {
21
22
  return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
@@ -27,43 +28,23 @@ function readBuildIdentity(app) {
27
28
  app.path,
28
29
  'shared/ultramodern-build.json',
29
30
  );
30
- if (fs.existsSync(buildArtifactPath)) {
31
- const artifact = readJson(buildArtifactPath);
32
- const deliveryUnit = artifact.deliveryUnit ?? {};
33
- return {
34
- buildVersion: deliveryUnit.buildMarker ?? deliveryUnit.build,
35
- packageName: deliveryUnit.packageName,
36
- version: deliveryUnit.version,
37
- unitId: deliveryUnit.unitId,
38
- sourceRevision: deliveryUnit.sourceRevision,
39
- };
31
+ const artifact = readJson(buildArtifactPath);
32
+ const deliveryUnit = artifact.deliveryUnit ?? {};
33
+ const manifest = readJson(path.join(workspaceRoot, app.path, 'package.json'));
34
+ if (
35
+ app.package !== manifest.name ||
36
+ app.deliveryUnit?.unitId !== deliveryUnit.unitId ||
37
+ deliveryUnit.packageName !== manifest.name ||
38
+ deliveryUnit.version !== manifest.version
39
+ ) {
40
+ throw new Error(`${app.id} topology, package.json and stamped build identity disagree`);
40
41
  }
41
-
42
- const buildModulePath = path.join(
43
- workspaceRoot,
44
- app.path,
45
- 'shared/ultramodern-build.ts',
46
- );
47
- if (!fs.existsSync(buildModulePath)) {
48
- return {};
49
- }
50
- console.warn(
51
- `[backend-federation] ${path.relative(
52
- workspaceRoot,
53
- buildArtifactPath,
54
- )} missing; falling back to legacy regex parsing of ${path.relative(
55
- workspaceRoot,
56
- buildModulePath,
57
- )}.`,
58
- );
59
-
60
- const source = fs.readFileSync(buildModulePath, 'utf8');
61
42
  return {
62
- buildVersion: source.match(/\bbuild:\s*['"]([^'"]+)['"]/u)?.[1],
63
- packageName: source.match(/\bpackageName:\s*['"]([^'"]+)['"]/u)?.[1],
64
- version: source.match(/\bversion:\s*['"]([^'"]+)['"]/u)?.[1],
65
- unitId: source.match(/\bunitId:\s*['"]([^'"]+)['"]/u)?.[1],
66
- sourceRevision: source.match(/\bsourceRevision:\s*['"]([^'"]+)['"]/u)?.[1],
43
+ buildVersion: deliveryUnit.buildMarker ?? deliveryUnit.build,
44
+ packageName: deliveryUnit.packageName,
45
+ version: deliveryUnit.version,
46
+ unitId: deliveryUnit.unitId,
47
+ sourceRevision: deliveryUnit.sourceRevision,
67
48
  };
68
49
  }
69
50
 
@@ -94,8 +75,8 @@ function parseArgs(argv) {
94
75
  return options;
95
76
  }
96
77
 
97
- function backendApps(config, appFilter) {
98
- return (config.topology?.apps ?? []).filter(app => {
78
+ function backendApps(topology, appFilter) {
79
+ return topology.verticals.filter(app => {
99
80
  if (app.kind !== 'vertical') {
100
81
  return false;
101
82
  }
@@ -107,7 +88,7 @@ function backendApps(config, appFilter) {
107
88
  }
108
89
 
109
90
  function backendFederationMetadata(app) {
110
- return app.backendFederation ?? app.api?.backendFederation;
91
+ return app.backendFederation;
111
92
  }
112
93
 
113
94
  function backendFederationExposes(app) {
@@ -133,7 +114,7 @@ function backendFederationExposes(app) {
133
114
 
134
115
  function normalizeBackendFederation(app) {
135
116
  const backend = backendFederationMetadata(app);
136
- const nodeSurface = backend.executionSurfaces?.node ?? {};
117
+ const nodeSurface = app.nodeExecution ?? {};
137
118
  const exposes = backendFederationExposes(app);
138
119
 
139
120
  return {
@@ -168,39 +149,40 @@ async function createRemoteEntrySource(app, outputDir) {
168
149
  const exposes = backendFederationExposes(app);
169
150
  const buildIdentity = readBuildIdentity(app);
170
151
  const effectApiPath = path.join(workspaceRoot, app.path, 'api/effect-api.ts');
171
- const source = `import * as exposedNamespace from ${JSON.stringify(
172
- effectApiPath,
173
- )};
152
+ const source = `import { adoptEffectBffShareScope } from '@modern-js/bff-effect/effect-edge';
174
153
 
175
- const exposedModule = {
176
- ...exposedNamespace,
177
- backendFederationContract: {
178
- ...(exposedNamespace.backendFederationContract ?? {}),
179
- compatibility: {
180
- ...(exposedNamespace.backendFederationContract?.compatibility ?? {}),
181
- build: ${JSON.stringify(buildIdentity.buildVersion)},
182
- contractVersion: ${JSON.stringify(backend.contractVersion)},
183
- nodeAdapterVersion: ${JSON.stringify(backend.nodeAdapterVersion)},
184
- packageName: ${JSON.stringify(buildIdentity.packageName)},
185
- sourceRevision: ${JSON.stringify(buildIdentity.sourceRevision)},
186
- unitId: ${JSON.stringify(buildIdentity.unitId)},
154
+ // The expose evaluates lazily so defineEffectBff registers its handler
155
+ // factories with the registry the host shares through init().
156
+ let exposedModule;
157
+ const loadExposedModule = () =>
158
+ (exposedModule ??= import(${JSON.stringify(effectApiPath)}).then(exposedNamespace => ({
159
+ ...exposedNamespace,
160
+ backendFederationContract: {
161
+ ...(exposedNamespace.backendFederationContract ?? {}),
162
+ compatibility: {
163
+ ...(exposedNamespace.backendFederationContract?.compatibility ?? {}),
164
+ build: ${JSON.stringify(buildIdentity.buildVersion)},
165
+ contractVersion: ${JSON.stringify(backend.contractVersion)},
166
+ nodeAdapterVersion: ${JSON.stringify(backend.nodeAdapterVersion)},
167
+ packageName: ${JSON.stringify(buildIdentity.packageName)},
168
+ sourceRevision: ${JSON.stringify(buildIdentity.sourceRevision)},
169
+ unitId: ${JSON.stringify(buildIdentity.unitId)},
170
+ },
171
+ name: ${JSON.stringify(backend.name)},
172
+ role: 'microvertical-server',
173
+ runtimeFramework: 'effect',
174
+ strictEffectApproach: true,
187
175
  },
188
- name: ${JSON.stringify(backend.name)},
189
- role: 'microvertical-server',
190
- runtimeFramework: 'effect',
191
- strictEffectApproach: true,
192
- },
193
- };
176
+ })));
194
177
  const factories = {
195
178
  ${exposes
196
- .map(
197
- expose =>
198
- `${JSON.stringify(expose)}: () => Promise.resolve(exposedModule),`,
199
- )
179
+ .map(expose => `${JSON.stringify(expose)}: loadExposedModule,`)
200
180
  .join('\n')}
201
181
  };
202
182
 
203
- function init() {}
183
+ function init(shareScope) {
184
+ return adoptEffectBffShareScope(shareScope);
185
+ }
204
186
 
205
187
  function get(id) {
206
188
  const factory = factories[id];
@@ -242,13 +224,8 @@ function createManifest(app, outputDir, entrySource) {
242
224
  );
243
225
  }
244
226
  const buildIdentity = readBuildIdentity(app);
245
- const compactDeliveryUnit =
246
- app.deliveryUnit && typeof app.deliveryUnit === 'object'
247
- ? app.deliveryUnit
248
- : undefined;
249
- const unitId = compactDeliveryUnit?.unitId ?? buildIdentity.unitId;
250
- const sourceRevision =
251
- compactDeliveryUnit?.sourceRevision ?? buildIdentity.sourceRevision;
227
+ const unitId = app.deliveryUnit?.unitId ?? buildIdentity.unitId;
228
+ const sourceRevision = app.deliveryUnit?.sourceRevision ?? buildIdentity.sourceRevision;
252
229
  const publicPath = new URL('.', backend.containerEntry).href;
253
230
  return {
254
231
  schemaVersion: 1,
@@ -349,8 +326,22 @@ function createManifest(app, outputDir, entrySource) {
349
326
  }
350
327
 
351
328
  const options = parseArgs(process.argv.slice(2));
352
- const config = readJson(configPath);
353
- const apps = backendApps(config, options.app);
329
+ const topology = readJson(topologyPath);
330
+ const overlay = readJson(overlayPath);
331
+ if (topology.schemaVersion !== 1 || !Array.isArray(topology.verticals)) {
332
+ throw new Error('Invalid topology/reference-topology.json');
333
+ }
334
+ const apps = backendApps(topology, options.app).map(app => {
335
+ const nodeExecution = overlay.serverExecution?.[app.id]?.node;
336
+ if (
337
+ typeof app.path !== 'string' ||
338
+ !nodeExecution?.manifestUrl ||
339
+ !nodeExecution?.containerEntry
340
+ ) {
341
+ throw new Error(`${app.id} requires a topology path and Node execution URLs`);
342
+ }
343
+ return { ...app, nodeExecution };
344
+ });
354
345
 
355
346
  if (options.app && apps.length === 0) {
356
347
  throw new Error(`No generated backend federation app matched ${options.app}`);
@@ -2,155 +2,56 @@
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import { fileURLToPath, pathToFileURL } from 'node:url';
5
+ import { tsImport } from 'tsx/esm/api';
5
6
 
6
7
  const workspaceRoot = path.resolve(
7
8
  process.env.ULTRAMODERN_WORKSPACE_ROOT ??
8
9
  path.join(path.dirname(fileURLToPath(import.meta.url)), '..'),
9
10
  );
10
- const compactConfigPath = path.join(workspaceRoot, '.modernjs/ultramodern.json');
11
+ const topologyPath = path.join(workspaceRoot, 'topology/reference-topology.json');
11
12
 
12
13
  function readJson(filePath) {
13
14
  return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
14
15
  }
15
16
 
16
- function toKebabCase(value) {
17
- return String(value)
18
- .trim()
19
- .replace(/([a-z0-9])([A-Z])/gu, '$1-$2')
20
- .replace(/[^a-zA-Z0-9._-]+/gu, '-')
21
- .replace(/[._]+/gu, '-')
22
- .toLowerCase()
23
- .replace(/-+/gu, '-')
24
- .replace(/^-+|-+$/gu, '');
25
- }
26
-
27
- function toEnvSegment(value) {
28
- return toKebabCase(value).replace(/-/gu, '_').toUpperCase();
29
- }
30
-
31
- function normalizeRelativePath(value) {
32
- return String(value ?? '').replace(/\\/gu, '/').replace(/^\.\/+/u, '');
33
- }
34
-
35
- function appNamespace(app) {
36
- return app.kind === 'shell' ? 'shell' : (app.domain ?? app.id);
37
- }
38
-
39
- function defaultPortEnv(app) {
40
- return app.kind === 'shell'
41
- ? 'SHELL_SUPER_APP_PORT'
42
- : `VERTICAL_${toEnvSegment(app.domain ?? app.id)}_PORT`;
43
- }
44
-
45
- function defaultPort(app) {
46
- return app.kind === 'shell' ? 3020 : 3030;
47
- }
48
-
49
- function normalizeCompactApp(rawApp) {
50
- const id = String(rawApp.id);
51
- const kind = rawApp.kind === 'vertical' ? 'vertical' : 'shell';
52
- const appPath =
53
- typeof rawApp.path === 'string'
54
- ? normalizeRelativePath(rawApp.path)
55
- : kind === 'shell'
56
- ? 'apps/shell-super-app'
57
- : `verticals/${toKebabCase(id)}`;
58
- const packageSuffix =
59
- typeof rawApp.packageSuffix === 'string'
60
- ? rawApp.packageSuffix
61
- : appPath.split('/').at(-1) ?? id;
62
- const domain =
63
- typeof rawApp.domain === 'string'
64
- ? rawApp.domain
65
- : kind === 'vertical'
66
- ? packageSuffix
67
- : undefined;
68
- const moduleFederation =
69
- rawApp.moduleFederation && typeof rawApp.moduleFederation === 'object'
70
- ? rawApp.moduleFederation
71
- : {};
72
-
73
- return {
74
- id,
75
- kind,
76
- path: appPath,
77
- packageSuffix,
78
- domain,
79
- port:
80
- typeof rawApp.port === 'number'
81
- ? rawApp.port
82
- : defaultPort({ id, kind, domain }),
83
- portEnv:
84
- typeof rawApp.portEnv === 'string'
85
- ? rawApp.portEnv
86
- : defaultPortEnv({ id, kind, domain }),
87
- mfName:
88
- typeof moduleFederation.name === 'string'
89
- ? moduleFederation.name
90
- : kind === 'shell'
91
- ? 'shellSuperApp'
92
- : `vertical${toKebabCase(domain ?? id)
93
- .split('-')
94
- .filter(Boolean)
95
- .map(part => part.charAt(0).toUpperCase() + part.slice(1))
96
- .join('')}`,
97
- exposes: Array.isArray(moduleFederation.exposes)
98
- ? moduleFederation.exposes.filter(expose => typeof expose === 'string')
99
- : [],
100
- verticalRefs: Array.isArray(moduleFederation.verticalRefs)
101
- ? moduleFederation.verticalRefs.filter(ref => typeof ref === 'string')
102
- : [],
103
- marker: {
104
- appId: id,
105
- },
106
- routes:
107
- rawApp.routes && typeof rawApp.routes === 'object'
108
- ? rawApp.routes
109
- : undefined,
110
- api:
111
- rawApp.api && typeof rawApp.api === 'object'
112
- ? {
113
- stem:
114
- typeof rawApp.api.stem === 'string'
115
- ? rawApp.api.stem
116
- : domain ?? id,
117
- prefix:
118
- typeof rawApp.api.prefix === 'string'
119
- ? rawApp.api.prefix
120
- : `/${domain ?? id}-api`,
121
- }
122
- : undefined,
123
- };
124
- }
125
-
126
- function createRouteOwnedEntries(app) {
127
- const namespace = appNamespace(app);
128
- const base = {
129
- descriptionKey: `${namespace}.seo.description`,
130
- mfBoundaryId: app.mfName,
131
- namespace,
132
- ownerAppId: app.id,
133
- public: false,
134
- indexable: false,
135
- publicSurface: 'private-app-screen',
136
- };
137
-
138
- return [
139
- {
140
- ...base,
141
- canonicalPath: '/',
142
- id: app.kind === 'shell' ? 'shell-home' : `${app.id}-home`,
143
- localisedPaths: {
144
- cs: '/',
145
- en: '/',
146
- },
147
- titleKey: app.kind === 'shell' ? 'shell.title' : `${namespace}.title`,
148
- },
149
- ];
17
+ async function readRouteOwnedEntries(app) {
18
+ const appRoot = fs.realpathSync(path.join(workspaceRoot, app.path));
19
+ const workspaceReal = fs.realpathSync(workspaceRoot);
20
+ const relativeAppPath = path.relative(workspaceReal, appRoot);
21
+ if (!relativeAppPath || relativeAppPath === '..' ||
22
+ relativeAppPath.startsWith(`..${path.sep}`) || path.isAbsolute(relativeAppPath))
23
+ throw new Error(`${app.id} topology path escapes the workspace`);
24
+ const routesRoot = path.join(appRoot, 'src/routes');
25
+ if (!fs.existsSync(routesRoot)) {
26
+ if (app.surfaceProfile === 'api-only') return [];
27
+ throw new Error(`${app.id} is missing its route-owned metadata directory`);
28
+ }
29
+ const files = [];
30
+ function visit(directory) {
31
+ for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
32
+ const file = path.join(directory, entry.name);
33
+ if (entry.isSymbolicLink()) throw new Error(`${app.id} route metadata may not be a symbolic link`);
34
+ if (entry.isDirectory()) visit(file);
35
+ else if (entry.name === 'route.meta.ts') files.push(file);
36
+ }
37
+ }
38
+ visit(routesRoot);
39
+ const routes = [];
40
+ for (const file of files.sort()) {
41
+ const module = await tsImport(pathToFileURL(file).href, { parentURL: import.meta.url, tsconfig: false });
42
+ const route = module.routeMeta ?? module.default?.routeMeta ?? module.default?.default ?? module.default;
43
+ if (!route || typeof route !== 'object' || route.ownerAppId !== app.id ||
44
+ typeof route.id !== 'string' || typeof route.canonicalPath !== 'string' ||
45
+ !route.localisedPaths || typeof route.localisedPaths.en !== 'string' ||
46
+ typeof route.localisedPaths.cs !== 'string')
47
+ throw new Error(`${app.id} has invalid route-owned metadata in ${file}`);
48
+ routes.push(route);
49
+ }
50
+ return routes;
150
51
  }
151
52
 
152
- function createPublicRoutes(app) {
153
- return createRouteOwnedEntries(app)
53
+ function createPublicRoutes(routes) {
54
+ return routes
154
55
  .filter(route => route.public && route.indexable)
155
56
  .map(route => ({
156
57
  canonicalPath: route.canonicalPath,
@@ -163,15 +64,24 @@ function createPublicRoutes(app) {
163
64
  }));
164
65
  }
165
66
 
166
- function createPublicSurface(app) {
167
- const publicRoutes = createPublicRoutes(app);
67
+ function createPublicSurface(app, routes) {
68
+ const publicRoutes = createPublicRoutes(routes);
69
+ const routeEntries = publicRoutes.filter(route =>
70
+ Object.values(route.localisedPaths).every(routePath =>
71
+ !/(?:^|\/):[^/]+|\[[^\]]+\]|\*/u.test(routePath),
72
+ ),
73
+ ).map(route => ({ ...route,
74
+ canonicalUrlPath: createLocalisedPublicPath(route.localisedPaths.en, 'en'),
75
+ localeUrlPaths: Object.fromEntries(['en', 'cs'].map(language =>
76
+ [language, createLocalisedPublicPath(route.localisedPaths[language], language)])),
77
+ }));
168
78
  const basePublicSurface = {
169
79
  authoring: 'colocated-route-meta',
170
80
  artifactLifecycle: 'build-and-deploy-output',
171
81
  generatedManifest: './src/routes/ultramodern-route-metadata',
172
82
  source: 'route-owned-public-routes',
173
83
  metadataExport: './src/routes/ultramodern-route-metadata',
174
- generator: 'scripts/generate-public-surface-assets.mts',
84
+ generator: 'ultramodern-create ultramodern public-surface',
175
85
  outputRoot: 'dist/public',
176
86
  cloudflareBuildOutputRoot: 'dist-cloudflare/public',
177
87
  privateRoutePolicy: 'omit-from-generated-public-surface',
@@ -192,8 +102,8 @@ function createPublicSurface(app) {
192
102
  },
193
103
  contentSources: [],
194
104
  publicRoutes,
195
- routeEntries: [],
196
- concreteUrlPaths: [],
105
+ routeEntries,
106
+ concreteUrlPaths: uniqueSorted(routeEntries.flatMap(route => Object.values(route.localeUrlPaths))),
197
107
  };
198
108
 
199
109
  return app.routes?.publicSurface &&
@@ -205,54 +115,34 @@ function createPublicSurface(app) {
205
115
  : basePublicSurface;
206
116
  }
207
117
 
208
- function createCloudflareDeploy(config, app) {
209
- const packageScope =
210
- typeof config.workspace?.packageScope === 'string'
211
- ? config.workspace.packageScope
212
- : path.basename(workspaceRoot);
213
- const compatibilityDate =
214
- typeof config.deploy?.worker?.compatibilityDate === 'string'
215
- ? config.deploy.worker.compatibilityDate
216
- : '2026-06-02';
217
- return {
218
- workerName: `${toKebabCase(packageScope)}-${app.packageSuffix}`.slice(0, 63),
219
- publicUrlEnv: `ULTRAMODERN_PUBLIC_URL_${toEnvSegment(app.id)}`,
220
- compatibilityDate,
221
- compatibilityFlags: ['nodejs_compat', 'global_fetch_strictly_public'],
222
- };
223
- }
224
-
225
- function synthesizeContractFromCompactConfig(config) {
226
- const apps = Array.isArray(config.topology?.apps)
227
- ? config.topology.apps.map(normalizeCompactApp)
228
- : [];
229
-
118
+ export async function readGeneratedContractView() {
119
+ const topology = readJson(topologyPath);
120
+ if (topology.schemaVersion !== 1 || !topology.shell || !Array.isArray(topology.verticals)) {
121
+ throw new Error('Invalid topology/reference-topology.json');
122
+ }
123
+ const apps = [topology.shell, ...topology.verticals, ...(topology.shells ?? [])];
230
124
  return {
231
- sourcePath: compactConfigPath,
232
- apps: apps.map(app => ({
233
- ...app,
234
- deploy: {
235
- cloudflare: createCloudflareDeploy(config, app),
236
- },
237
- routes: {
238
- publicSurface: createPublicSurface(app),
239
- },
125
+ sourcePath: topologyPath,
126
+ apps: await Promise.all(apps.map(async app => {
127
+ if (typeof app.path !== 'string' || !app.path) {
128
+ throw new Error(`${app.id} topology path is missing`);
129
+ }
130
+ const routes = await readRouteOwnedEntries(app);
131
+ return {
132
+ id: app.id,
133
+ kind: app.kind,
134
+ surfaceProfile: app.surfaceProfile,
135
+ path: app.path,
136
+ domain: app.domain,
137
+ mfName: app.moduleFederation?.name,
138
+ marker: { appId: app.id },
139
+ deploy: { cloudflare: app.cloudflare },
140
+ routes: { publicSurface: createPublicSurface(app, routes) },
141
+ };
240
142
  })),
241
143
  };
242
144
  }
243
145
 
244
- function readGeneratedContractView() {
245
- if (fs.existsSync(compactConfigPath)) {
246
- return synthesizeContractFromCompactConfig(readJson(compactConfigPath));
247
- }
248
- throw new Error(
249
- `Missing UltraModern config. Expected ${path.relative(
250
- workspaceRoot,
251
- compactConfigPath,
252
- )}.`,
253
- );
254
- }
255
-
256
146
  function parseArgs(argv) {
257
147
  const parsed = {
258
148
  appId: undefined,
@@ -289,7 +179,7 @@ function parseArgs(argv) {
289
179
 
290
180
  function printHelp() {
291
181
  process.stdout.write(`Usage:
292
- node scripts/generate-public-surface-assets.mts --app shell-super-app [--target dist|cloudflare-dist] [--require-public-origin]
182
+ ultramodern-create ultramodern public-surface --app shell-super-app [--target dist|cloudflare-dist] [--require-public-origin]
293
183
 
294
184
  Set each app's production URL using the contract env key, for example:
295
185
  ULTRAMODERN_PUBLIC_URL_SHELL_SUPER_APP=https://example.com
@@ -714,19 +604,27 @@ function writeText(outputDir, fileName, content) {
714
604
  fs.writeFileSync(path.join(outputDir, fileName), content);
715
605
  }
716
606
 
717
- async function generatePublicSurfaceAssets(app, target, requirePublicOrigin) {
607
+ export async function resolvePublicSurface(app) {
718
608
  const publicSurface = app.routes?.publicSurface ?? {};
719
609
  const languages = publicSurface.languages ?? ['en', 'cs'];
720
- const outputDir = ensureOutputDir(app, target);
721
- const shouldRequirePublicOrigin =
722
- requirePublicOrigin ||
723
- process.env.ULTRAMODERN_CLOUDFLARE_REQUIRE_PUBLIC_URLS === 'true';
724
610
  const routeEntries = mergeRouteEntries(
725
611
  publicSurface.routeEntries ?? [],
726
612
  await expandContentSources(app, publicSurface, languages),
727
613
  languages,
728
614
  );
729
- const urlPaths = createConcreteUrlPaths(routeEntries, languages);
615
+ return {
616
+ ...publicSurface,
617
+ routeEntries,
618
+ concreteUrlPaths: createConcreteUrlPaths(routeEntries, languages),
619
+ };
620
+ }
621
+
622
+ async function generatePublicSurfaceAssets(app, target, requirePublicOrigin) {
623
+ const publicSurface = await resolvePublicSurface(app);
624
+ const languages = publicSurface.languages ?? ['en', 'cs'];
625
+ const outputDir = ensureOutputDir(app, target);
626
+ const routeEntries = publicSurface.routeEntries;
627
+ const urlPaths = publicSurface.concreteUrlPaths;
730
628
 
731
629
  if (routeEntries.length === 0) {
732
630
  writeText(outputDir, 'robots.txt', renderRobotsTxt([], undefined));
@@ -735,7 +633,7 @@ async function generatePublicSurfaceAssets(app, target, requirePublicOrigin) {
735
633
  return;
736
634
  }
737
635
 
738
- const origin = resolveOrigin(app, shouldRequirePublicOrigin);
636
+ const origin = resolveOrigin(app, requirePublicOrigin);
739
637
  if (!origin) {
740
638
  writeText(outputDir, 'robots.txt', renderRobotsTxt([], undefined));
741
639
  removeIfExists(outputDir, 'sitemap.xml');
@@ -748,19 +646,21 @@ async function generatePublicSurfaceAssets(app, target, requirePublicOrigin) {
748
646
  writeText(outputDir, 'robots.txt', renderRobotsTxt(urlPaths, `${origin}/sitemap.xml`));
749
647
  }
750
648
 
751
- try {
752
- const args = parseArgs(process.argv.slice(2));
753
- if (args.help) {
754
- printHelp();
755
- process.exit(0);
756
- }
757
- const contract = readGeneratedContractView();
758
- const app = contract.apps?.find(candidate => candidate.id === args.appId);
759
- if (!app) {
760
- throw new Error(`Unknown app in UltraModern config: ${args.appId}`);
649
+ if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
650
+ try {
651
+ const args = parseArgs(process.argv.slice(2));
652
+ if (args.help) {
653
+ printHelp();
654
+ process.exit(0);
655
+ }
656
+ const contract = await readGeneratedContractView();
657
+ const app = contract.apps?.find(candidate => candidate.id === args.appId);
658
+ if (!app) {
659
+ throw new Error(`Unknown app in UltraModern config: ${args.appId}`);
660
+ }
661
+ await generatePublicSurfaceAssets(app, args.target, args.requirePublicOrigin);
662
+ } catch (error) {
663
+ process.stderr.write(`[public-surface] ${error.message}\n`);
664
+ process.exitCode = 1;
761
665
  }
762
- await generatePublicSurfaceAssets(app, args.target, args.requirePublicOrigin);
763
- } catch (error) {
764
- process.stderr.write(`[public-surface] ${error.message}\n`);
765
- process.exitCode = 1;
766
666
  }