@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
@@ -1,51 +1,49 @@
1
1
  import node_fs from "node:fs";
2
- import node_os from "node:os";
3
2
  import node_path from "node:path";
4
- import { DEVELOPMENT_OVERLAY_PATH, TOPOLOGY_PATH } from "./add-vertical/constants.js";
5
- import { createPrimaryShellDescriptor } from "./add-vertical/preflight.js";
6
- import { verticalsFromTopology } from "./add-vertical/topology.js";
3
+ import { normalizeWorkspaceInputs } from "../ultramodern-tooling/config.js";
4
+ import { DEVELOPMENT_OVERLAY_PATH, OWNERSHIP_PATH, TOPOLOGY_PATH } from "./add-vertical/constants.js";
5
+ import { readRequiredJsonObject } from "./add-vertical/preflight.js";
6
+ import { describeJsonChanges } from "./add-vertical/preview.js";
7
+ import { updateRootWorkspaceScripts } from "./add-vertical/shell-files.js";
8
+ import { ownershipEntry } from "./add-vertical/topology.js";
7
9
  import { runWorkspaceTransaction } from "./add-vertical/transaction.js";
8
- import { assertGlobalPortUniqueness, configuredDevelopmentPorts, existingBridgeConfig, existingPackageSource, existingTailwindEnabled, nextAvailablePort } from "./add-vertical/workspace-state.js";
9
- import { ULTRAMODERN_CONFIG_PATH, appEmitsBrowserUi, shellApp } from "./descriptors.js";
10
- import { formatGeneratedWorkspaceFiles, readJsonFile, writeFileReplacing, writeJsonFile } from "./fs-io.js";
10
+ import { assertGlobalPortUniqueness, nextAvailablePort, workspaceOperationSettings } from "./add-vertical/workspace-state.js";
11
+ import { appEmitsBrowserUi, resolveRemoteRefs, shellApp } from "./descriptors.js";
12
+ import { formatGeneratedWorkspaceFiles, writeJsonFile } from "./fs-io.js";
11
13
  import { createFileSnapshot, createGenerationResult, diffFileSnapshots } from "./generation-result.js";
12
- import { assertUniqueTailwindPrefixes, toPackageScope } from "./naming.js";
13
- import { createRootPackageJson } from "./package-json.js";
14
- import { FIRST_ADDITIONAL_SHELL_PORT, PRIMARY_SHELL_ID, assertValidShellName, createAdditionalShellConfigEntry, createShellDescriptor, resolveConfiguredAdditionalShells } from "./shells.js";
14
+ import { createAppModernConfig } from "./module-federation.js";
15
+ import { assertUniqueTailwindPrefixes, packageName, toPackageScope } from "./naming.js";
16
+ import { createCloudflareDeployContract } from "./policy.js";
17
+ import { FIRST_ADDITIONAL_SHELL_PORT, PRIMARY_SHELL_ID, assertValidShellName, createShellDescriptor, shellDeliveryUnitBlock } from "./shells.js";
15
18
  import { createRootTsConfig } from "./tsconfigs.js";
16
- import { isRecord } from "./types.js";
19
+ import { preserveConsumerWorkspaceArtifacts, workspaceArtifactCandidates, workspaceDevelopmentPorts } from "./workspace-artifact-ownership.js";
17
20
  import { writeGeneratedWorkspaceScripts } from "./workspace-scripts.js";
18
- import { rewriteAppModernConfig, writeApp } from "./write-app.js";
21
+ import { writeApp } from "./write-app.js";
19
22
  import { createZeropsYaml } from "./zerops.js";
20
- function readRequiredJsonObject(filePath) {
21
- if (!node_fs.existsSync(filePath)) throw new Error(`Missing UltraModern workspace file: ${filePath}`);
22
- const value = readJsonFile(filePath);
23
- if (!isRecord(value)) throw new Error(`UltraModern workspace file must contain a JSON object: ${filePath}`);
24
- return value;
25
- }
26
23
  function prepareAddUltramodernShell(options) {
27
24
  const name = assertValidShellName(options.name);
28
- const configPath = node_path.join(options.workspaceRoot, ULTRAMODERN_CONFIG_PATH);
29
25
  const overlayPath = node_path.join(options.workspaceRoot, DEVELOPMENT_OVERLAY_PATH);
30
26
  const topologyPath = node_path.join(options.workspaceRoot, TOPOLOGY_PATH);
27
+ const ownershipPath = node_path.join(options.workspaceRoot, OWNERSHIP_PATH);
31
28
  const rootPackage = readRequiredJsonObject(node_path.join(options.workspaceRoot, 'package.json'));
32
- const config = readRequiredJsonObject(configPath);
33
29
  const overlay = readRequiredJsonObject(overlayPath);
34
30
  const topology = readRequiredJsonObject(topologyPath);
31
+ const ownership = readRequiredJsonObject(ownershipPath);
35
32
  overlay.ports ??= {};
36
33
  const scope = toPackageScope(String(rootPackage.name ?? node_path.basename(options.workspaceRoot)));
37
- const packageSource = existingPackageSource(options.workspaceRoot, options.modernVersion, options.packageSource);
38
- const enableTailwind = options.enableTailwind ?? existingTailwindEnabled(options.workspaceRoot);
39
- const bridge = existingBridgeConfig(options.workspaceRoot);
40
- const existingVerticals = verticalsFromTopology(topology, overlay.ports);
41
- const existingAdditionalShells = resolveConfiguredAdditionalShells(config);
34
+ const workspace = normalizeWorkspaceInputs(options.workspaceRoot, {
35
+ topology,
36
+ overlay
37
+ });
38
+ const { packageSource, enableTailwind, bridge } = workspaceOperationSettings(options, workspace.config);
39
+ const { primaryShell: resolvedPrimaryShell, verticals: existingVerticals, additionalShells: existingAdditionalShells } = workspace;
40
+ const primaryShell = resolvedPrimaryShell;
42
41
  const shellId = `shell-${name}`;
43
42
  if (shellId === PRIMARY_SHELL_ID || existingAdditionalShells.some((existing)=>existing.id === shellId)) throw new Error(`Shell "${shellId}" already exists in this workspace.`);
44
43
  if (node_fs.existsSync(node_path.join(options.workspaceRoot, `apps/${shellId}`))) throw new Error(`Refusing to overwrite existing path: apps/${shellId}`);
45
- const overlayPorts = overlay.ports ?? {};
46
44
  const portsWithPrimary = {
47
- ...overlayPorts,
48
- [shellApp.id]: 'number' == typeof overlayPorts[shellApp.id] ? overlayPorts[shellApp.id] : shellApp.port
45
+ ...overlay.ports,
46
+ [primaryShell.id]: primaryShell.port
49
47
  };
50
48
  assertGlobalPortUniqueness(portsWithPrimary, existingAdditionalShells);
51
49
  const shell = createShellDescriptor(name, nextAvailablePort(portsWithPrimary, existingAdditionalShells, FIRST_ADDITIONAL_SHELL_PORT));
@@ -71,17 +69,20 @@ function prepareAddUltramodernShell(options) {
71
69
  ]);
72
70
  return {
73
71
  scope,
74
- configPath,
72
+ topologyPath,
73
+ ownershipPath,
75
74
  overlayPath,
76
- config,
75
+ config: workspace.config,
76
+ topology,
77
+ ownership,
77
78
  overlay,
78
79
  packageSource,
79
80
  enableTailwind,
80
81
  bridge,
82
+ primaryShell,
81
83
  existingVerticals,
82
84
  existingAdditionalShells,
83
- shell,
84
- composedVerticals
85
+ shell
85
86
  };
86
87
  }
87
88
  function addUltramodernShell(options) {
@@ -93,43 +94,74 @@ function addUltramodernShell(options) {
93
94
  function executeAddUltramodernShell(options, logicalWorkspaceRoot = options.workspaceRoot) {
94
95
  const beforeFiles = createFileSnapshot(options.workspaceRoot);
95
96
  const preflight = prepareAddUltramodernShell(options);
96
- const { scope, configPath, config, packageSource, enableTailwind, bridge, existingVerticals, existingAdditionalShells, shell, composedVerticals } = preflight;
97
- const configuredPrimary = createPrimaryShellDescriptor({}, config);
98
- const primaryRefsConfigured = Array.isArray(config.topology?.apps?.find((app)=>app?.id === shellApp.id)?.moduleFederation?.verticalRefs);
99
- const primaryShell = {
100
- ...configuredPrimary,
101
- verticalRefs: primaryRefsConfigured ? configuredPrimary.verticalRefs : existingVerticals.filter(appEmitsBrowserUi).map((v)=>v.id)
102
- };
97
+ const { scope, topologyPath, ownershipPath, topology, ownership, config, packageSource, enableTailwind, bridge, primaryShell, existingVerticals, existingAdditionalShells, shell } = preflight;
103
98
  const allAdditionalShells = [
104
99
  ...existingAdditionalShells,
105
100
  shell
106
101
  ];
107
- const configuredDevPorts = configuredDevelopmentPorts({
108
- ...preflight.overlay.ports,
109
- [shell.id]: shell.port
110
- }, allAdditionalShells).toSorted((left, right)=>left - right);
111
- writeApp(options.workspaceRoot, scope, shell, packageSource, enableTailwind, composedVerticals, bridge, configuredDevPorts);
112
- const shellsCollection = Array.isArray(config.shells) ? config.shells.filter((entry)=>entry?.id !== shell.id) : [];
113
- shellsCollection.push(createAdditionalShellConfigEntry(scope, shell, existingVerticals));
114
- config.shells = shellsCollection;
115
- writeJsonFile(configPath, config);
116
- for (const app of [
102
+ const configuredDevPorts = workspaceDevelopmentPorts([
103
+ primaryShell,
104
+ ...existingVerticals,
105
+ ...allAdditionalShells
106
+ ], preflight.overlay.ports);
107
+ const previousApps = [
117
108
  primaryShell,
118
109
  ...existingVerticals,
119
110
  ...existingAdditionalShells
120
- ])rewriteAppModernConfig(options.workspaceRoot, scope, app, existingVerticals, enableTailwind, configuredDevPorts);
121
- const rootPackagePath = node_path.join(options.workspaceRoot, 'package.json');
122
- const rootPackage = readJsonFile(rootPackagePath);
123
- const generatedRootPackage = createRootPackageJson(scope, packageSource, existingVerticals, bridge, allAdditionalShells);
124
- rootPackage.scripts = generatedRootPackage.scripts;
125
- writeJsonFile(rootPackagePath, rootPackage);
126
- writeJsonFile(node_path.join(options.workspaceRoot, 'tsconfig.json'), createRootTsConfig([
111
+ ];
112
+ const { io: ownedIo } = preserveConsumerWorkspaceArtifacts(options.workspaceRoot, workspaceArtifactCandidates(scope, previousApps, enableTailwind, previousApps));
113
+ writeApp(options.workspaceRoot, scope, shell, packageSource, enableTailwind, existingVerticals, bridge, configuredDevPorts);
114
+ topology.shells ??= [];
115
+ topology.shells.push({
116
+ id: shell.id,
117
+ kind: 'shell',
118
+ package: packageName(scope, shell.packageSuffix),
119
+ path: shell.directory,
120
+ displayName: shell.displayName,
121
+ portEnv: shell.portEnv,
122
+ verticalRefs: shell.verticalRefs,
123
+ moduleFederation: {
124
+ role: 'host',
125
+ name: shell.mfName,
126
+ verticalRefs: shell.verticalRefs,
127
+ remotes: resolveRemoteRefs(shell, existingVerticals).map((remote)=>({
128
+ id: remote.id,
129
+ name: remote.mfName,
130
+ manifestUrl: `http://localhost:${remote.port}/mf-manifest.json`
131
+ })),
132
+ ssr: true,
133
+ sharedContractVersion: 'mf-ssr-contract-v1'
134
+ },
135
+ deliveryUnit: shellDeliveryUnitBlock(scope, shell),
136
+ cloudflare: createCloudflareDeployContract(scope, shell),
137
+ ownership: shell.ownership
138
+ });
139
+ writeJsonFile(topologyPath, topology);
140
+ ownership.owners ??= [];
141
+ ownership.owners.push(ownershipEntry(scope, shell));
142
+ writeJsonFile(ownershipPath, ownership);
143
+ preflight.overlay.ports[shell.id] = shell.port;
144
+ writeJsonFile(preflight.overlayPath, preflight.overlay);
145
+ const newPackagePath = node_path.join(options.workspaceRoot, shell.directory, 'package.json');
146
+ const newPackage = readRequiredJsonObject(newPackagePath);
147
+ newPackage.dependencies = {
148
+ ...newPackage.dependencies,
149
+ ...config.inheritedWorkspaceDependencies
150
+ };
151
+ writeJsonFile(newPackagePath, newPackage);
152
+ for (const app of previousApps)ownedIo.write(node_path.join(options.workspaceRoot, app.directory, 'modern.config.ts'), createAppModernConfig(scope, app, 'shell' === app.kind ? resolveRemoteRefs(app, existingVerticals) : existingVerticals, enableTailwind, configuredDevPorts));
153
+ updateRootWorkspaceScripts(options.workspaceRoot, scope, packageSource, existingVerticals, bridge, allAdditionalShells, existingVerticals, primaryShell, existingAdditionalShells);
154
+ ownedIo.write(node_path.join(options.workspaceRoot, 'tsconfig.json'), `${JSON.stringify(createRootTsConfig([
127
155
  primaryShell,
128
156
  ...existingVerticals,
129
157
  ...allAdditionalShells
130
- ]));
131
- writeGeneratedWorkspaceScripts(options.workspaceRoot, scope, enableTailwind, existingVerticals, void 0, allAdditionalShells, primaryShell);
132
- writeFileReplacing(options.workspaceRoot, 'zerops.yaml', `${createZeropsYaml(scope, [
158
+ ]), null, 2)}\n`);
159
+ writeGeneratedWorkspaceScripts(options.workspaceRoot, {
160
+ io: {
161
+ writeGenerated: ownedIo.write
162
+ }
163
+ });
164
+ ownedIo.write(node_path.join(options.workspaceRoot, 'zerops.yaml'), `${createZeropsYaml(scope, [
133
165
  primaryShell,
134
166
  ...existingVerticals,
135
167
  ...allAdditionalShells
@@ -155,70 +187,39 @@ function executeAddUltramodernShell(options, logicalWorkspaceRoot = options.work
155
187
  });
156
188
  }
157
189
  function planUltramodernShell(options) {
158
- prepareAddUltramodernShell(options);
159
- const tempRoot = node_fs.mkdtempSync(node_path.join(node_os.tmpdir(), 'um-shell-plan-'));
160
- const copiedWorkspaceRoot = node_path.join(tempRoot, 'workspace');
161
- const skippedDirectories = new Set([
162
- '.git',
163
- '.nx',
164
- '.output',
165
- 'coverage',
166
- 'dist',
167
- 'node_modules'
168
- ]);
169
- try {
170
- node_fs.cpSync(options.workspaceRoot, copiedWorkspaceRoot, {
171
- recursive: true,
172
- filter: (sourcePath)=>!skippedDirectories.has(node_path.basename(sourcePath))
173
- });
174
- const plannedResult = addUltramodernShell({
190
+ const preflight = prepareAddUltramodernShell(options);
191
+ let jsonMutations = [];
192
+ const plannedResult = runWorkspaceTransaction(options.workspaceRoot, (stagingRoot)=>executeAddUltramodernShell({
175
193
  ...options,
176
- workspaceRoot: copiedWorkspaceRoot
177
- });
178
- const shell = plannedResult.createdApps[0];
179
- return {
180
- ...plannedResult,
181
- workspaceRoot: options.workspaceRoot,
182
- dryRun: true,
183
- selectedPort: shell?.port ?? 0,
184
- moduleFederationRemote: {
185
- id: shell?.id ?? '',
186
- name: shell?.moduleFederationName ?? '',
187
- manifestUrl: `http://localhost:${shell?.port ?? 0}/mf-manifest.json`
188
- },
189
- jsonMutations: [
190
- {
191
- path: ULTRAMODERN_CONFIG_PATH,
192
- pointer: '/shells/-',
193
- description: `Register additional shell ${shell?.id}`
194
- },
195
- {
196
- path: 'package.json',
197
- pointer: "/scripts",
198
- description: "Enumerate all configured shells in workspace scripts"
199
- },
200
- {
201
- path: 'tsconfig.json',
202
- pointer: '/references',
203
- description: `Add ${shell?.id} to the root TS-Go build graph`
204
- }
205
- ],
206
- shellDependencyChanges: [],
207
- generatedContractChanges: [
208
- {
209
- path: ULTRAMODERN_CONFIG_PATH,
210
- addedAppIds: [
211
- shell?.id ?? ''
212
- ],
213
- shellVerticalRefs: options.verticals ?? []
214
- }
215
- ]
216
- };
217
- } finally{
218
- node_fs.rmSync(tempRoot, {
219
- recursive: true,
220
- force: true
221
- });
222
- }
194
+ workspaceRoot: stagingRoot
195
+ }, options.workspaceRoot), {
196
+ mode: 'preview',
197
+ inspectChanges: (changes)=>{
198
+ jsonMutations = describeJsonChanges(changes);
199
+ }
200
+ });
201
+ const shell = plannedResult.createdApps[0];
202
+ return {
203
+ ...plannedResult,
204
+ workspaceRoot: options.workspaceRoot,
205
+ dryRun: true,
206
+ selectedPort: shell?.port ?? 0,
207
+ moduleFederationRemote: {
208
+ id: shell?.id ?? '',
209
+ name: shell?.moduleFederationName ?? '',
210
+ manifestUrl: `http://localhost:${shell?.port ?? 0}/mf-manifest.json`
211
+ },
212
+ jsonMutations,
213
+ shellDependencyChanges: [],
214
+ generatedContractChanges: [
215
+ {
216
+ path: 'topology/reference-topology.json',
217
+ addedAppIds: [
218
+ shell?.id ?? ''
219
+ ],
220
+ shellVerticalRefs: preflight.shell.verticalRefs ?? []
221
+ }
222
+ ]
223
+ };
223
224
  }
224
225
  export { addUltramodernShell, planUltramodernShell };
@@ -1,21 +1,24 @@
1
+ import node_fs from "node:fs";
1
2
  import node_path from "node:path";
3
+ import { normalizeWorkspaceInputs, preserveUnknownProjectionFields, reconcileGeneratedOverlayUrls } from "../../ultramodern-tooling/config.js";
2
4
  import { rpcPath } from "../api/rpc.js";
3
5
  import { createServerExecutionOverlay } from "../backend-federation.js";
6
+ import { createDevelopmentOverlay } from "../contracts.js";
4
7
  import { createDeliveryUnitRecord, deliveryUnitContractBlock } from "../delivery-unit.js";
5
- import { ULTRAMODERN_CONFIG_PATH, appEmitsBrowserUi, appHasApi, createModuleFederationRemoteContracts, resolveApiPrefix, resolveApiProtocol, shellApp } from "../descriptors.js";
6
- import { formatGeneratedWorkspaceFiles, writeFileReplacing, writeJsonFile } from "../fs-io.js";
8
+ import { appEmitsBrowserUi, appHasApi, createModuleFederationRemoteContracts, resolveApiPrefix, resolveApiProtocol, resolveRemoteRefs } from "../descriptors.js";
9
+ import { formatGeneratedWorkspaceFiles, writeJsonFile } from "../fs-io.js";
7
10
  import { createFileSnapshot, createGenerationResult, diffFileSnapshots } from "../generation-result.js";
11
+ import { createAppModernConfig } from "../module-federation.js";
8
12
  import { runCodeSmithOverlays } from "../overlays.js";
9
13
  import { createRootTsConfig } from "../package-json.js";
14
+ import { preserveConsumerWorkspaceArtifacts, workspaceArtifactCandidates, workspaceDevelopmentPorts } from "../workspace-artifact-ownership.js";
10
15
  import { writeGeneratedWorkspaceScripts } from "../workspace-scripts.js";
11
- import { rewriteAppModernConfig } from "../write-app.js";
12
- import { createCompactUltramodernConfig, writeApp } from "../write-workspace.js";
16
+ import { writeApp } from "../write-workspace.js";
13
17
  import { createZeropsYaml } from "../zerops.js";
14
18
  import { prepareAddUltramodernVertical } from "./preflight.js";
15
19
  import { rewriteShellAppFiles, updateRootWorkspaceScripts } from "./shell-files.js";
16
20
  import { ownershipEntry, verticalTopologyEntry } from "./topology.js";
17
21
  import { runWorkspaceTransaction } from "./transaction.js";
18
- import { configuredDevelopmentPorts } from "./workspace-state.js";
19
22
  function addUltramodernVertical(options) {
20
23
  return runWorkspaceTransaction(options.workspaceRoot, (stagingRoot)=>executeAddUltramodernVertical({
21
24
  ...options,
@@ -24,7 +27,24 @@ function addUltramodernVertical(options) {
24
27
  }
25
28
  function executeAddUltramodernVertical(options, logicalWorkspaceRoot = options.workspaceRoot) {
26
29
  const beforeFiles = createFileSnapshot(options.workspaceRoot);
27
- const { scope, topologyPath, ownershipPath, overlayPath, topology, ownership, overlay, packageSource, enableTailwind, bridge, primaryShell, additionalShells, targetShell, targetVerticals, vertical, updatedVerticals } = prepareAddUltramodernVertical(options);
30
+ const { scope, config, topologyPath, ownershipPath, overlayPath, topology, ownership, overlay, packageSource, enableTailwind, bridge, primaryShell, additionalShells, targetShell, targetVerticals, vertical, updatedVerticals } = prepareAddUltramodernVertical(options);
31
+ const previousTailwind = config.features?.tailwind !== false;
32
+ const existingVerticals = updatedVerticals.filter((app)=>app.id !== vertical.id);
33
+ const existingIds = new Set(existingVerticals.map((app)=>app.id));
34
+ const previousProjection = (apps)=>apps.map((app)=>app.id === targetShell.id ? {
35
+ ...app,
36
+ verticalRefs: app.verticalRefs?.filter((id)=>existingIds.has(id))
37
+ } : app);
38
+ const previousApps = normalizeWorkspaceInputs(options.workspaceRoot, {
39
+ topology,
40
+ overlay
41
+ }).apps;
42
+ const previousDevPorts = workspaceDevelopmentPorts(previousApps);
43
+ const { io: ownedIo } = preserveConsumerWorkspaceArtifacts(options.workspaceRoot, workspaceArtifactCandidates(scope, previousProjection(previousApps), previousTailwind, previousProjection([
44
+ primaryShell,
45
+ ...existingVerticals,
46
+ ...additionalShells
47
+ ])));
28
48
  const nextTargetShell = {
29
49
  ...targetShell,
30
50
  verticalRefs: targetVerticals.filter(appEmitsBrowserUi).map((remote)=>remote.id)
@@ -34,27 +54,56 @@ function executeAddUltramodernVertical(options, logicalWorkspaceRoot = options.w
34
54
  verticalRefs: nextTargetShell.verticalRefs
35
55
  } : primaryShell;
36
56
  const nextAdditionalShells = additionalShells.map((shell)=>shell.id === nextTargetShell.id ? nextTargetShell : shell);
37
- const configuredDevPorts = nextAdditionalShells.length > 0 ? configuredDevelopmentPorts({
38
- ...overlay.ports,
39
- [primaryShell.id]: primaryShell.port,
40
- [vertical.id]: vertical.port
41
- }, nextAdditionalShells).toSorted((left, right)=>left - right) : void 0;
57
+ const configuredDevPorts = workspaceDevelopmentPorts([
58
+ nextPrimaryShell,
59
+ ...updatedVerticals,
60
+ ...nextAdditionalShells
61
+ ], overlay.ports);
42
62
  writeApp(options.workspaceRoot, scope, vertical, packageSource, enableTailwind, updatedVerticals, bridge, configuredDevPorts);
63
+ const newPackagePath = node_path.join(options.workspaceRoot, vertical.directory, 'package.json');
64
+ const newPackage = JSON.parse(node_fs.readFileSync(newPackagePath, 'utf-8'));
65
+ newPackage.dependencies = {
66
+ ...newPackage.dependencies,
67
+ ...config.inheritedWorkspaceDependencies
68
+ };
69
+ writeJsonFile(newPackagePath, newPackage);
43
70
  if (targetShell.id === primaryShell.id) {
44
71
  topology.shell ??= {};
45
- topology.shell.deliveryUnit = deliveryUnitContractBlock(createDeliveryUnitRecord(scope, shellApp));
72
+ topology.shell.deliveryUnit = {
73
+ ...deliveryUnitContractBlock(createDeliveryUnitRecord(scope, primaryShell)),
74
+ ...primaryShell.deliveryUnit,
75
+ ...topology.shell.deliveryUnit
76
+ };
46
77
  topology.shell.verticalRefs = nextTargetShell.verticalRefs;
47
78
  topology.shell.moduleFederation ??= {};
48
- topology.shell.moduleFederation.remotes = createModuleFederationRemoteContracts(nextPrimaryShell, updatedVerticals).map((remote)=>({
79
+ topology.shell.moduleFederation.remotes = preserveAuthoredRemoteUrls(topology.shell.moduleFederation.remotes, createModuleFederationRemoteContracts({
80
+ ...primaryShell,
81
+ verticalRefs: primaryShell.verticalRefs?.filter((id)=>existingIds.has(id))
82
+ }, existingVerticals), createModuleFederationRemoteContracts(nextPrimaryShell, updatedVerticals)).map((remote)=>({
49
83
  id: remote.id,
50
84
  name: remote.name,
51
85
  manifestUrl: remote.manifestUrl
52
86
  }));
53
87
  }
54
88
  topology.verticals ??= [];
89
+ topology.verticals = topology.verticals.map((entry)=>{
90
+ const app = existingVerticals.find((app)=>app.id === entry.id);
91
+ if (!app) return entry;
92
+ const projected = verticalTopologyEntry(scope, app, updatedVerticals);
93
+ return {
94
+ ...entry,
95
+ moduleFederation: preserveUnknownProjectionFields(entry.moduleFederation, projected.moduleFederation),
96
+ ...projected.backendFederation ? {
97
+ backendFederation: preserveUnknownProjectionFields(entry.backendFederation, projected.backendFederation)
98
+ } : {}
99
+ };
100
+ });
55
101
  topology.verticals.push(verticalTopologyEntry(scope, vertical));
56
102
  ownership.owners ??= [];
57
103
  ownership.owners.push(ownershipEntry(scope, vertical));
104
+ const projectedOverlay = createDevelopmentOverlay(scope, existingVerticals);
105
+ Object.assign(overlay, reconcileGeneratedOverlayUrls(overlay, createDevelopmentOverlay(scope, previousApps.filter((app)=>'shell' !== app.kind)), projectedOverlay));
106
+ overlay.serverExecution = preserveUnknownProjectionFields(overlay.serverExecution, projectedOverlay.serverExecution);
58
107
  overlay.ports[vertical.id] = vertical.port;
59
108
  overlay.manifests ??= {};
60
109
  if (appEmitsBrowserUi(vertical)) overlay.manifests[vertical.id] = `http://localhost:${vertical.port}/mf-manifest.json`;
@@ -68,13 +117,20 @@ function executeAddUltramodernVertical(options, logicalWorkspaceRoot = options.w
68
117
  writeJsonFile(topologyPath, topology);
69
118
  writeJsonFile(ownershipPath, ownership);
70
119
  writeJsonFile(overlayPath, overlay);
71
- writeJsonFile(node_path.join(options.workspaceRoot, ULTRAMODERN_CONFIG_PATH), createCompactUltramodernConfig(scope, options.modernVersion, packageSource, [
72
- {
73
- ...nextPrimaryShell
74
- },
75
- ...updatedVerticals
76
- ], enableTailwind, bridge, nextAdditionalShells, nextPrimaryShell));
77
- writeFileReplacing(options.workspaceRoot, 'zerops.yaml', `${createZeropsYaml(scope, [
120
+ if (targetShell.id !== primaryShell.id) {
121
+ topology.shells = (topology.shells ?? []).map((entry)=>entry.id === nextTargetShell.id ? updateShellComposition(entry, {
122
+ verticalRefs: nextTargetShell.verticalRefs,
123
+ moduleFederation: {
124
+ verticalRefs: nextTargetShell.verticalRefs,
125
+ remotes: preserveAuthoredRemoteUrls(entry.moduleFederation?.remotes, createModuleFederationRemoteContracts({
126
+ ...targetShell,
127
+ verticalRefs: targetShell.verticalRefs?.filter((id)=>existingIds.has(id))
128
+ }, existingVerticals), createModuleFederationRemoteContracts(nextTargetShell, updatedVerticals))
129
+ }
130
+ }) : entry);
131
+ writeJsonFile(topologyPath, topology);
132
+ }
133
+ ownedIo.write(node_path.join(options.workspaceRoot, 'zerops.yaml'), `${createZeropsYaml(scope, [
78
134
  nextPrimaryShell,
79
135
  ...updatedVerticals,
80
136
  ...nextAdditionalShells
@@ -82,20 +138,29 @@ function executeAddUltramodernVertical(options, logicalWorkspaceRoot = options.w
82
138
  for (const shellToRefresh of [
83
139
  nextPrimaryShell,
84
140
  ...nextAdditionalShells
85
- ])rewriteShellAppFiles(options.workspaceRoot, scope, packageSource, enableTailwind, updatedVerticals, bridge, shellToRefresh.id === nextTargetShell.id ? nextTargetShell : shellToRefresh, configuredDevPorts);
86
- writeGeneratedWorkspaceScripts(options.workspaceRoot, scope, enableTailwind, updatedVerticals, void 0, nextAdditionalShells, nextPrimaryShell);
87
- updateRootWorkspaceScripts(options.workspaceRoot, scope, packageSource, updatedVerticals, bridge, nextAdditionalShells);
88
- writeJsonFile(node_path.join(options.workspaceRoot, 'tsconfig.json'), createRootTsConfig([
141
+ ])rewriteShellAppFiles(options.workspaceRoot, scope, packageSource, enableTailwind, updatedVerticals, bridge, shellToRefresh.id === nextTargetShell.id ? nextTargetShell : shellToRefresh, configuredDevPorts, {
142
+ shell: previousProjection(previousApps).find((app)=>app.id === shellToRefresh.id),
143
+ remotes: existingVerticals,
144
+ devPorts: previousDevPorts,
145
+ enableTailwind: previousTailwind
146
+ });
147
+ writeGeneratedWorkspaceScripts(options.workspaceRoot, {
148
+ io: {
149
+ writeGenerated: ownedIo.write
150
+ }
151
+ });
152
+ updateRootWorkspaceScripts(options.workspaceRoot, scope, packageSource, updatedVerticals, bridge, nextAdditionalShells, existingVerticals, nextPrimaryShell);
153
+ ownedIo.write(node_path.join(options.workspaceRoot, 'tsconfig.json'), `${JSON.stringify(createRootTsConfig([
89
154
  nextPrimaryShell,
90
155
  ...updatedVerticals,
91
156
  ...nextAdditionalShells
92
- ]));
157
+ ]), null, 2)}\n`);
93
158
  if (configuredDevPorts) {
94
159
  for (const app of [
95
160
  nextPrimaryShell,
96
161
  ...updatedVerticals,
97
162
  ...nextAdditionalShells
98
- ])if (app.id !== vertical.id && app.id !== nextTargetShell.id) rewriteAppModernConfig(options.workspaceRoot, scope, app, updatedVerticals, enableTailwind, configuredDevPorts);
163
+ ])if (app.id !== vertical.id && app.id !== nextTargetShell.id) ownedIo.write(node_path.join(options.workspaceRoot, app.directory, 'modern.config.ts'), createAppModernConfig(scope, app, 'shell' === app.kind ? resolveRemoteRefs(app, updatedVerticals) : updatedVerticals, enableTailwind, configuredDevPorts));
99
164
  }
100
165
  const preliminaryAfterFiles = createFileSnapshot(options.workspaceRoot);
101
166
  const preliminaryDiff = diffFileSnapshots(beforeFiles, preliminaryAfterFiles);
@@ -135,4 +200,31 @@ function executeAddUltramodernVertical(options, logicalWorkspaceRoot = options.w
135
200
  rewrittenPaths
136
201
  });
137
202
  }
138
- export { addUltramodernVertical };
203
+ function updateShellComposition(current, generated) {
204
+ const previousRemotes = Array.isArray(current.moduleFederation?.remotes) ? current.moduleFederation.remotes : [];
205
+ return {
206
+ ...current,
207
+ ...Array.isArray(generated.verticalRefs) ? {
208
+ verticalRefs: generated.verticalRefs
209
+ } : {},
210
+ moduleFederation: {
211
+ ...current.moduleFederation,
212
+ verticalRefs: generated.moduleFederation.verticalRefs,
213
+ remotes: generated.moduleFederation.remotes.map((remote)=>({
214
+ ...previousRemotes.find((previous)=>previous.id === remote.id),
215
+ ...remote
216
+ }))
217
+ }
218
+ };
219
+ }
220
+ function preserveAuthoredRemoteUrls(current, previousGenerated, nextGenerated) {
221
+ return nextGenerated.map((remote)=>{
222
+ const previous = Array.isArray(current) ? current.find((entry)=>entry.id === remote.id) : void 0;
223
+ const generated = previousGenerated.find((entry)=>entry.id === remote.id);
224
+ return previous?.manifestUrl && previous.manifestUrl !== generated?.manifestUrl ? {
225
+ ...remote,
226
+ manifestUrl: previous.manifestUrl
227
+ } : remote;
228
+ });
229
+ }
230
+ export { addUltramodernVertical, executeAddUltramodernVertical };