@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,52 +1,26 @@
1
- import node_fs from "node:fs";
2
- import node_os from "node:os";
3
- import node_path from "node:path";
4
1
  import { WORKSPACE_PACKAGE_VERSION } from "../../ultramodern-package-source.js";
5
- import { rpcPath } from "../api/rpc.js";
6
- import { createServerExecutionOverlay } from "../backend-federation.js";
7
- import { ULTRAMODERN_CONFIG_PATH, appEmitsBrowserUi, appHasApi, remoteDependencyAlias, resolveApiPrefix, resolveApiProtocol, shellApp, zephyrRemoteDependency } from "../descriptors.js";
2
+ import { appEmitsBrowserUi, appHasApi, remoteDependencyAlias, resolveApiPrefix, zephyrRemoteDependency } from "../descriptors.js";
8
3
  import { packageName } from "../naming.js";
9
- import { DEVELOPMENT_OVERLAY_PATH, OWNERSHIP_PATH, TOPOLOGY_PATH } from "./constants.js";
10
- import { addUltramodernVertical } from "./execute.js";
4
+ import { executeAddUltramodernVertical } from "./execute.js";
11
5
  import { prepareAddUltramodernVertical } from "./preflight.js";
12
- import { ownershipEntry, verticalTopologyEntry } from "./topology.js";
6
+ import { describeJsonChanges } from "./preview.js";
7
+ import { runWorkspaceTransaction } from "./transaction.js";
13
8
  function planUltramodernVertical(options) {
14
9
  const preflight = prepareAddUltramodernVertical(options);
15
- const tempRoot = node_fs.mkdtempSync(node_path.join(node_os.tmpdir(), 'um-vertical-plan-'));
16
- const copiedWorkspaceRoot = node_path.join(tempRoot, 'workspace');
17
- try {
18
- copyWorkspaceForPlan(options.workspaceRoot, copiedWorkspaceRoot);
19
- const plannedResult = addUltramodernVertical({
10
+ let jsonMutations = [];
11
+ const result = runWorkspaceTransaction(options.workspaceRoot, (stagingRoot)=>executeAddUltramodernVertical({
20
12
  ...options,
21
- workspaceRoot: copiedWorkspaceRoot,
13
+ workspaceRoot: stagingRoot,
22
14
  overlays: void 0
23
- });
24
- return createVerticalPlan(preflight, {
25
- ...plannedResult,
26
- workspaceRoot: options.workspaceRoot
27
- });
28
- } finally{
29
- node_fs.rmSync(tempRoot, {
30
- recursive: true,
31
- force: true
32
- });
33
- }
34
- }
35
- function copyWorkspaceForPlan(workspaceRoot, copiedWorkspaceRoot) {
36
- const skippedDirectories = new Set([
37
- '.git',
38
- '.nx',
39
- '.output',
40
- 'coverage',
41
- 'dist',
42
- 'node_modules'
43
- ]);
44
- node_fs.cpSync(workspaceRoot, copiedWorkspaceRoot, {
45
- recursive: true,
46
- filter: (sourcePath)=>!skippedDirectories.has(node_path.basename(sourcePath))
15
+ }, options.workspaceRoot), {
16
+ mode: 'preview',
17
+ inspectChanges: (changes)=>{
18
+ jsonMutations = describeJsonChanges(changes);
19
+ }
47
20
  });
21
+ return createVerticalPlan(preflight, result, jsonMutations);
48
22
  }
49
- function createVerticalPlan(preflight, result) {
23
+ function createVerticalPlan(preflight, result, jsonMutations) {
50
24
  const { scope, vertical, targetShell, targetVerticals } = preflight;
51
25
  const manifestUrl = `http://localhost:${vertical.port}/mf-manifest.json`;
52
26
  return {
@@ -61,11 +35,11 @@ function createVerticalPlan(preflight, result) {
61
35
  ...vertical.api ? {
62
36
  apiPrefix: resolveApiPrefix(vertical)
63
37
  } : {},
64
- jsonMutations: createDryRunJsonMutations(preflight, manifestUrl),
38
+ jsonMutations,
65
39
  shellDependencyChanges: createShellDependencyChanges(scope, vertical, targetShell),
66
40
  generatedContractChanges: [
67
41
  {
68
- path: ULTRAMODERN_CONFIG_PATH,
42
+ path: 'topology/reference-topology.json',
69
43
  addedAppIds: [
70
44
  vertical.id
71
45
  ],
@@ -74,114 +48,6 @@ function createVerticalPlan(preflight, result) {
74
48
  ]
75
49
  };
76
50
  }
77
- function createDryRunJsonMutations(preflight, manifestUrl) {
78
- const { scope, vertical, targetShell, additionalShells } = preflight;
79
- const additionalShellIndex = additionalShells.findIndex((shell)=>shell.id === targetShell.id);
80
- const apiMutation = appHasApi(vertical) ? [
81
- {
82
- path: DEVELOPMENT_OVERLAY_PATH,
83
- pointer: `/apis/${vertical.id}`,
84
- description: `Add local API URL for ${vertical.id}`,
85
- value: `http://localhost:${vertical.port}${'rpc' === resolveApiProtocol(vertical) ? rpcPath(vertical) : resolveApiPrefix(vertical)}`
86
- },
87
- {
88
- path: DEVELOPMENT_OVERLAY_PATH,
89
- pointer: `/serverExecution/${vertical.id}`,
90
- description: `Add local MicroVertical server execution metadata for ${vertical.id}`,
91
- value: createServerExecutionOverlay(scope, vertical)
92
- }
93
- ] : [];
94
- const shellMutations = targetShell.id === shellApp.id ? [
95
- {
96
- path: TOPOLOGY_PATH,
97
- pointer: '/shell/verticalRefs/-',
98
- description: `Add ${vertical.id} to the ${targetShell.id} vertical references`,
99
- value: vertical.id
100
- },
101
- {
102
- path: TOPOLOGY_PATH,
103
- pointer: '/shell/moduleFederation/remotes/-',
104
- description: `Register ${vertical.id} as a Module Federation remote`,
105
- value: {
106
- id: vertical.id,
107
- name: vertical.mfName,
108
- manifestUrl
109
- }
110
- }
111
- ] : [
112
- {
113
- path: ULTRAMODERN_CONFIG_PATH,
114
- pointer: `/shells/${additionalShellIndex}/verticalRefs/-`,
115
- description: `Add ${vertical.id} to the ${targetShell.id} vertical references`,
116
- value: vertical.id
117
- },
118
- {
119
- path: ULTRAMODERN_CONFIG_PATH,
120
- pointer: `/shells/${additionalShellIndex}/moduleFederation/remotes`,
121
- description: `Regenerate ${targetShell.id} Module Federation remotes for ${vertical.id}`
122
- }
123
- ];
124
- return [
125
- ...appEmitsBrowserUi(vertical) ? shellMutations : [],
126
- {
127
- path: TOPOLOGY_PATH,
128
- pointer: '/verticals/-',
129
- description: `Add topology entry for ${vertical.id}`,
130
- value: verticalTopologyEntry(scope, vertical)
131
- },
132
- {
133
- path: OWNERSHIP_PATH,
134
- pointer: '/owners/-',
135
- description: `Add ownership entry for ${vertical.id}`,
136
- value: ownershipEntry(scope, vertical)
137
- },
138
- {
139
- path: DEVELOPMENT_OVERLAY_PATH,
140
- pointer: `/ports/${vertical.id}`,
141
- description: `Reserve development port ${vertical.port}`,
142
- value: vertical.port
143
- },
144
- ...appEmitsBrowserUi(vertical) ? [
145
- {
146
- path: DEVELOPMENT_OVERLAY_PATH,
147
- pointer: `/manifests/${vertical.id}`,
148
- description: `Add local Module Federation manifest URL for ${vertical.id}`,
149
- value: manifestUrl
150
- }
151
- ] : [],
152
- ...apiMutation,
153
- {
154
- path: 'package.json',
155
- pointer: "/scripts",
156
- description: "Regenerate workspace scripts for the new vertical set"
157
- },
158
- {
159
- path: `${targetShell.directory}/package.json`,
160
- pointer: '/dependencies',
161
- description: `Wire shell dependencies for ${vertical.id}`
162
- },
163
- {
164
- path: 'tsconfig.json',
165
- pointer: '/references',
166
- description: `Add ${vertical.id} to the root TS-Go build graph`
167
- },
168
- {
169
- path: `${targetShell.directory}/tsconfig.json`,
170
- pointer: '/references',
171
- description: `Add ${vertical.id} to the shell TS-Go project references`
172
- },
173
- {
174
- path: `${targetShell.directory}/tsconfig.mf-types.json`,
175
- pointer: '/include',
176
- description: 'Keep shell Module Federation DTS compilation scoped'
177
- },
178
- {
179
- path: ULTRAMODERN_CONFIG_PATH,
180
- pointer: '/topology/apps',
181
- description: `Regenerate compact config with ${vertical.id}`
182
- }
183
- ];
184
- }
185
51
  function createShellDependencyChanges(scope, vertical, shell) {
186
52
  return [
187
53
  ...appEmitsBrowserUi(vertical) ? [
@@ -1,14 +1,12 @@
1
1
  import node_fs from "node:fs";
2
2
  import node_path from "node:path";
3
- import { normalizeCompactConfig } from "../../ultramodern-tooling/config.js";
4
- import { ULTRAMODERN_CONFIG_PATH, createRemoteManifestEnv, createVerticalDescriptor, shellApp } from "../descriptors.js";
3
+ import { normalizeWorkspaceInputs } from "../../ultramodern-tooling/config.js";
4
+ import { createRemoteManifestEnv, createVerticalDescriptor } from "../descriptors.js";
5
5
  import { readJsonFile } from "../fs-io.js";
6
6
  import { assertUniqueTailwindPrefixes, normalizePath, toPackageScope } from "../naming.js";
7
- import { resolveConfiguredAdditionalShells } from "../shells.js";
8
7
  import { isRecord } from "../types.js";
9
8
  import { DEVELOPMENT_OVERLAY_PATH, OWNERSHIP_PATH, TOPOLOGY_PATH } from "./constants.js";
10
- import { verticalsFromTopology } from "./topology.js";
11
- import { assertCanCreate, assertGlobalPortUniqueness, assertValidVerticalName, existingBridgeConfig, existingPackageSource, existingTailwindEnabled, nextAvailablePort } from "./workspace-state.js";
9
+ import { assertCanCreate, assertGlobalPortUniqueness, assertValidVerticalName, nextAvailablePort, workspaceOperationSettings } from "./workspace-state.js";
12
10
  class UnknownUltramodernShellError extends Error {
13
11
  constructor(sourcePath, requestedShellId, available){
14
12
  const issue = {
@@ -31,30 +29,26 @@ function prepareAddUltramodernVertical(options) {
31
29
  const topology = readRequiredJsonObject(topologyPath);
32
30
  const ownership = readRequiredJsonObject(ownershipPath);
33
31
  const overlay = readRequiredJsonObject(overlayPath);
34
- const config = readRequiredWorkspaceConfig(options.workspaceRoot);
35
32
  assertOptionalJsonObject(topology.shell, 'topology.shell', topologyPath);
36
33
  assertOptionalJsonArray(topology.verticals, 'topology.verticals', topologyPath);
37
34
  assertOptionalJsonArray(ownership.owners, 'ownership.owners', ownershipPath);
38
35
  assertOptionalJsonObject(overlay.ports, 'overlay.ports', overlayPath);
39
36
  assertOptionalJsonObject(overlay.manifests, 'overlay.manifests', overlayPath);
40
37
  assertOptionalJsonObject(overlay.apis, 'overlay.apis', overlayPath);
38
+ const workspace = normalizeWorkspaceInputs(options.workspaceRoot, {
39
+ topology,
40
+ overlay
41
+ });
42
+ const { packageSource, enableTailwind, bridge } = workspaceOperationSettings(options, workspace.config);
41
43
  overlay.ports ??= {};
42
44
  const scope = toPackageScope(String(rootPackage.name ?? node_path.basename(options.workspaceRoot)));
43
- const packageSource = existingPackageSource(options.workspaceRoot, options.modernVersion, options.packageSource);
44
- const enableTailwind = options.enableTailwind ?? existingTailwindEnabled(options.workspaceRoot);
45
- const bridge = existingBridgeConfig(options.workspaceRoot);
46
- const existingVerticals = verticalsFromTopology(topology, overlay.ports);
47
- const additionalShells = resolveConfiguredAdditionalShells(config);
48
- const primaryShell = createPrimaryShellDescriptor(topology, config);
49
- const primaryShellPort = 'number' == typeof overlay.ports[primaryShell.id] ? overlay.ports[primaryShell.id] : primaryShell.port;
50
- const resolvedPrimaryShell = {
51
- ...primaryShell,
52
- port: primaryShellPort
53
- };
54
- const targetShell = resolveTargetShell(options.shell, resolvedPrimaryShell, additionalShells, node_path.join(options.workspaceRoot, ULTRAMODERN_CONFIG_PATH));
45
+ const existingVerticals = workspace.verticals;
46
+ const additionalShells = workspace.additionalShells;
47
+ const resolvedPrimaryShell = workspace.primaryShell;
48
+ const targetShell = resolveTargetShell(options.shell, resolvedPrimaryShell, additionalShells, topologyPath);
55
49
  const portsWithPrimary = {
56
50
  ...overlay.ports,
57
- [primaryShell.id]: primaryShellPort
51
+ [resolvedPrimaryShell.id]: resolvedPrimaryShell.port
58
52
  };
59
53
  assertGlobalPortUniqueness(portsWithPrimary, additionalShells);
60
54
  const port = nextAvailablePort(portsWithPrimary, additionalShells);
@@ -87,7 +81,7 @@ function prepareAddUltramodernVertical(options) {
87
81
  ownershipPath,
88
82
  overlayPath,
89
83
  rootPackage,
90
- config,
84
+ config: workspace.config,
91
85
  topology,
92
86
  ownership,
93
87
  overlay,
@@ -108,32 +102,6 @@ function readRequiredJsonObject(filePath) {
108
102
  if (!isRecord(value)) throw new Error(`UltraModern workspace file must contain a JSON object: ${filePath}`);
109
103
  return value;
110
104
  }
111
- function readRequiredWorkspaceConfig(workspaceRoot) {
112
- const compactPath = node_path.join(workspaceRoot, ULTRAMODERN_CONFIG_PATH);
113
- const config = readRequiredJsonObject(compactPath);
114
- normalizeCompactConfig(workspaceRoot, compactPath, config);
115
- return config;
116
- }
117
- function createPrimaryShellDescriptor(topology, config) {
118
- const compactShell = config.topology?.apps?.find((app)=>app?.id === shellApp.id);
119
- const verticalRefs = Array.isArray(topology.shell?.verticalRefs) ? topology.shell.verticalRefs.filter((id)=>'string' == typeof id) : Array.isArray(compactShell?.moduleFederation?.verticalRefs) ? compactShell.moduleFederation.verticalRefs.filter((id)=>'string' == typeof id) : [];
120
- return {
121
- ...shellApp,
122
- verticalRefs,
123
- ...'string' == typeof compactShell?.path ? {
124
- directory: compactShell.path
125
- } : {},
126
- ...'number' == typeof compactShell?.port ? {
127
- port: compactShell.port
128
- } : {},
129
- ...'string' == typeof compactShell?.portEnv ? {
130
- portEnv: compactShell.portEnv
131
- } : {},
132
- ...'string' == typeof compactShell?.moduleFederation?.name ? {
133
- mfName: compactShell.moduleFederation.name
134
- } : {}
135
- };
136
- }
137
105
  function resolveTargetShell(requestedShellId, primaryShell, additionalShells, sourcePath) {
138
106
  if (void 0 === requestedShellId || requestedShellId === primaryShell.id) return primaryShell;
139
107
  const targetShell = additionalShells.find((shell)=>shell.id === requestedShellId);
@@ -195,4 +163,4 @@ function assertNonEmptyString(value, label) {
195
163
  function assertSafeOutputPath(relativePath, appId) {
196
164
  if (node_path.isAbsolute(relativePath) || relativePath.split(/[\\/]+/u).includes('..')) throw new Error(`Unsafe output path for ${appId}: ${relativePath}`);
197
165
  }
198
- export { UnknownUltramodernShellError, assertNonEmptyString, createPrimaryShellDescriptor, prepareAddUltramodernVertical };
166
+ export { UnknownUltramodernShellError, assertNonEmptyString, prepareAddUltramodernVertical, readRequiredJsonObject };
@@ -0,0 +1,40 @@
1
+ import { isDeepStrictEqual } from "node:util";
2
+ function describeJsonChanges(changes) {
3
+ const mutations = [];
4
+ for (const change of changes){
5
+ if (!change.relativePath.endsWith('.json') || change.before?.symlink || change.after?.symlink) continue;
6
+ let before;
7
+ let after;
8
+ try {
9
+ before = change.before && JSON.parse(change.before.content.toString());
10
+ after = change.after && JSON.parse(change.after.content.toString());
11
+ } catch {
12
+ continue;
13
+ }
14
+ const visit = (previous, next, pointer)=>{
15
+ if (isDeepStrictEqual(previous, next)) return;
16
+ if (Array.isArray(previous) && Array.isArray(next) && previous.every((value, index)=>isDeepStrictEqual(value, next[index])) && next.length >= previous.length) {
17
+ for (const value of next.slice(previous.length))visit(void 0, value, `${pointer}/-`);
18
+ return;
19
+ }
20
+ if (previous && next && 'object' == typeof previous && 'object' == typeof next && !Array.isArray(previous) && !Array.isArray(next)) {
21
+ for (const key of new Set([
22
+ ...Object.keys(previous),
23
+ ...Object.keys(next)
24
+ ]))visit(previous[key], next[key], `${pointer}/${key.replaceAll('~', '~0').replaceAll('/', '~1')}`);
25
+ return;
26
+ }
27
+ mutations.push({
28
+ path: change.relativePath,
29
+ pointer,
30
+ description: `${void 0 === next ? 'Remove' : void 0 === previous ? 'Add' : 'Update'} ${pointer || 'document'}`,
31
+ ...void 0 === next ? {} : {
32
+ value: next
33
+ }
34
+ });
35
+ };
36
+ visit(before, after, '');
37
+ }
38
+ return mutations;
39
+ }
40
+ export { describeJsonChanges };
@@ -1,21 +1,30 @@
1
+ import node_fs from "node:fs";
1
2
  import node_path from "node:path";
2
3
  import { createShellApiClient } from "../api.js";
3
4
  import { createAppEnvDts, createAppRuntimeConfig, createShellFrameComponent } from "../app-files.js";
4
5
  import { createShellPage, createShellRemoteComponents, createShellWorkerRemoteComponents } from "../demo-components.js";
5
6
  import { appEmitsBrowserUi, appI18nNamespace, resolveRemoteRefs, shellApp } from "../descriptors.js";
6
- import { readJsonFile, writeFileReplacing, writeJsonFile } from "../fs-io.js";
7
+ import { readJsonFile, writeJsonFile } from "../fs-io.js";
7
8
  import { createAppPublicLocaleMessages } from "../locales.js";
8
9
  import { createAppModernConfig, createShellModuleFederationConfig } from "../module-federation.js";
9
10
  import { createAppMfTypesTsConfig, createAppPackage, createAppTsConfig, createRootPackageJson } from "../package-json.js";
10
11
  import { createPublicWebAppArtifacts, rewriteWorkspaceAssetsForApp } from "../public-surface.js";
11
- function updateRootWorkspaceScripts(workspaceRoot, scope, packageSource, remotes, bridge, additionalShells = []) {
12
+ import { preserveConsumerWorkspaceArtifacts } from "../workspace-artifact-ownership.js";
13
+ function updateRootWorkspaceScripts(workspaceRoot, scope, packageSource, remotes, bridge, additionalShells = [], previousRemotes = remotes, _primaryShell = shellApp, previousAdditionalShells = additionalShells) {
12
14
  const packagePath = node_path.join(workspaceRoot, 'package.json');
13
15
  const rootPackage = readJsonFile(packagePath);
14
16
  const generatedRootPackage = createRootPackageJson(scope, packageSource, remotes, bridge, additionalShells);
15
- rootPackage.scripts = generatedRootPackage.scripts;
17
+ const previousRootPackage = createRootPackageJson(scope, packageSource, previousRemotes, bridge, previousAdditionalShells);
18
+ const existingScripts = rootPackage.scripts ?? {};
19
+ rootPackage.scripts = {
20
+ ...generatedRootPackage.scripts,
21
+ ...existingScripts
22
+ };
23
+ if (existingScripts.dev === previousRootPackage.scripts.dev) rootPackage.scripts.dev = generatedRootPackage.scripts.dev;
24
+ for (const [name, command] of Object.entries(generatedRootPackage.scripts))if (void 0 === existingScripts[name] || existingScripts[name] === previousRootPackage.scripts[name]) rootPackage.scripts[name] = command;
16
25
  writeJsonFile(packagePath, rootPackage);
17
26
  }
18
- function rewriteShellAppFiles(workspaceRoot, scope, packageSource, enableTailwind, remotes, bridge, shell = shellApp, devPorts) {
27
+ function shellAppArtifacts(scope, packageSource, enableTailwind, remotes, bridge, shell, devPorts) {
19
28
  const shellHost = {
20
29
  ...shell,
21
30
  verticalRefs: shell.verticalRefs ?? remotes.filter(appEmitsBrowserUi).map((remote)=>remote.id)
@@ -23,26 +32,79 @@ function rewriteShellAppFiles(workspaceRoot, scope, packageSource, enableTailwin
23
32
  const shellRemotes = resolveRemoteRefs(shellHost, remotes);
24
33
  const uiRemotes = shellRemotes.filter(appEmitsBrowserUi);
25
34
  const publicWeb = createPublicWebAppArtifacts(shellHost);
26
- writeJsonFile(node_path.join(workspaceRoot, `${shellHost.directory}/package.json`), createAppPackage(scope, shellHost, packageSource, enableTailwind, remotes, bridge));
27
- writeJsonFile(node_path.join(workspaceRoot, `${shellHost.directory}/tsconfig.json`), createAppTsConfig(shellHost, shellRemotes));
28
- writeJsonFile(node_path.join(workspaceRoot, `${shellHost.directory}/tsconfig.mf-types.json`), createAppMfTypesTsConfig(shellHost));
29
- writeFileReplacing(workspaceRoot, `${shellHost.directory}/src/modern-app-env.d.ts`, createAppEnvDts(shellHost, shellRemotes, scope));
30
- writeFileReplacing(workspaceRoot, `${shellHost.directory}/modern.config.ts`, createAppModernConfig(scope, shellHost, shellRemotes, enableTailwind, devPorts));
31
- writeFileReplacing(workspaceRoot, publicWeb.jsonLdHelperFile.path, publicWeb.jsonLdHelperFile.content);
32
- writeFileReplacing(workspaceRoot, publicWeb.routeMetadataFile.path, publicWeb.routeMetadataFile.content);
33
- writeFileReplacing(workspaceRoot, publicWeb.routeHeadFile.path, publicWeb.routeHeadFile.content);
34
- for (const generatedFile of publicWeb.routeMetaFiles)writeFileReplacing(workspaceRoot, generatedFile.path, generatedFile.content);
35
- rewriteWorkspaceAssetsForApp(workspaceRoot, shellHost);
36
- writeFileReplacing(workspaceRoot, `${shellHost.directory}/src/modern.runtime.ts`, createAppRuntimeConfig(shellHost, scope, shellRemotes));
37
- writeJsonFile(node_path.join(workspaceRoot, `${shellHost.directory}/locales/en/translation.json`), createAppPublicLocaleMessages(shellHost, 'en', shellRemotes));
38
- writeJsonFile(node_path.join(workspaceRoot, `${shellHost.directory}/locales/en/${appI18nNamespace(shellHost)}.json`), createAppPublicLocaleMessages(shellHost, 'en', shellRemotes));
39
- writeJsonFile(node_path.join(workspaceRoot, `${shellHost.directory}/locales/cs/translation.json`), createAppPublicLocaleMessages(shellHost, 'cs', shellRemotes));
40
- writeJsonFile(node_path.join(workspaceRoot, `${shellHost.directory}/locales/cs/${appI18nNamespace(shellHost)}.json`), createAppPublicLocaleMessages(shellHost, 'cs', shellRemotes));
41
- writeFileReplacing(workspaceRoot, `${shellHost.directory}/module-federation.config.ts`, createShellModuleFederationConfig(scope, shellHost, shellRemotes));
42
- writeFileReplacing(workspaceRoot, `${shellHost.directory}/src/routes/[lang]/page.tsx`, createShellPage(shellHost, uiRemotes));
43
- writeFileReplacing(workspaceRoot, `${shellHost.directory}/src/routes/vertical-components.tsx`, createShellRemoteComponents(shellHost, uiRemotes));
44
- writeFileReplacing(workspaceRoot, `${shellHost.directory}/src/routes/vertical-components.worker.tsx`, createShellWorkerRemoteComponents(shellHost, uiRemotes));
45
- writeFileReplacing(workspaceRoot, `${shellHost.directory}/src/routes/shell-frame.tsx`, createShellFrameComponent(shellHost));
46
- writeFileReplacing(workspaceRoot, `${shellHost.directory}/src/api/vertical-clients.ts`, createShellApiClient(scope, remotes));
35
+ const json = (value)=>`${JSON.stringify(value, null, 2)}\n`;
36
+ const files = {
37
+ [`${shellHost.directory}/tsconfig.json`]: json(createAppTsConfig(shellHost, shellRemotes)),
38
+ [`${shellHost.directory}/tsconfig.mf-types.json`]: json(createAppMfTypesTsConfig(shellHost)),
39
+ [`${shellHost.directory}/src/modern-app-env.d.ts`]: createAppEnvDts(shellHost, shellRemotes, scope),
40
+ [`${shellHost.directory}/modern.config.ts`]: createAppModernConfig(scope, shellHost, shellRemotes, enableTailwind, devPorts),
41
+ [publicWeb.jsonLdHelperFile.path]: publicWeb.jsonLdHelperFile.content,
42
+ [publicWeb.routeMetadataFile.path]: publicWeb.routeMetadataFile.content,
43
+ [publicWeb.routeHeadFile.path]: publicWeb.routeHeadFile.content,
44
+ ...Object.fromEntries(publicWeb.routeMetaFiles.map((file)=>[
45
+ file.path,
46
+ file.content
47
+ ])),
48
+ [`${shellHost.directory}/src/modern.runtime.ts`]: createAppRuntimeConfig(shellHost, scope, shellRemotes),
49
+ ...Object.fromEntries([
50
+ 'en',
51
+ 'cs'
52
+ ].flatMap((language)=>[
53
+ 'translation',
54
+ appI18nNamespace(shellHost)
55
+ ].map((namespace)=>[
56
+ `${shellHost.directory}/locales/${language}/${namespace}.json`,
57
+ json(createAppPublicLocaleMessages(shellHost, language, shellRemotes))
58
+ ]))),
59
+ [`${shellHost.directory}/module-federation.config.ts`]: createShellModuleFederationConfig(scope, shellHost, shellRemotes),
60
+ [`${shellHost.directory}/src/routes/[lang]/page.tsx`]: createShellPage(shellHost, uiRemotes),
61
+ [`${shellHost.directory}/src/routes/vertical-components.tsx`]: createShellRemoteComponents(shellHost, uiRemotes),
62
+ [`${shellHost.directory}/src/routes/vertical-components.worker.tsx`]: createShellWorkerRemoteComponents(shellHost, uiRemotes),
63
+ [`${shellHost.directory}/src/routes/shell-frame.tsx`]: createShellFrameComponent(shellHost),
64
+ [`${shellHost.directory}/src/api/vertical-clients.ts`]: createShellApiClient(scope, remotes)
65
+ };
66
+ return {
67
+ shellHost,
68
+ packageJson: createAppPackage(scope, shellHost, packageSource, enableTailwind, remotes, bridge),
69
+ artifacts: Object.entries(files).map(([relativePath, content])=>({
70
+ relativePath,
71
+ content
72
+ }))
73
+ };
74
+ }
75
+ function rewriteShellAppFiles(workspaceRoot, scope, packageSource, enableTailwind, remotes, bridge, shell = shellApp, devPorts, previous = {
76
+ shell,
77
+ remotes,
78
+ devPorts
79
+ }) {
80
+ const before = shellAppArtifacts(scope, packageSource, previous.enableTailwind ?? enableTailwind, previous.remotes, bridge, previous.shell, previous.devPorts);
81
+ const next = shellAppArtifacts(scope, packageSource, enableTailwind, remotes, bridge, shell, devPorts);
82
+ const { io } = preserveConsumerWorkspaceArtifacts(workspaceRoot, before.artifacts);
83
+ for (const artifact of next.artifacts)io.write(node_path.join(workspaceRoot, artifact.relativePath), artifact.content);
84
+ const packagePath = node_path.join(workspaceRoot, shell.directory, 'package.json');
85
+ const existing = node_fs.existsSync(packagePath) ? readJsonFile(packagePath) : {};
86
+ const packageJson = {
87
+ ...next.packageJson,
88
+ ...existing,
89
+ 'zephyr:dependencies': {
90
+ ...next.packageJson['zephyr:dependencies'],
91
+ ...Object.fromEntries(Object.entries(existing['zephyr:dependencies'] ?? {}).filter(([key, value])=>before.packageJson['zephyr:dependencies']?.[key] !== value))
92
+ },
93
+ dependencies: {
94
+ ...next.packageJson.dependencies,
95
+ ...existing.dependencies
96
+ },
97
+ devDependencies: {
98
+ ...next.packageJson.devDependencies,
99
+ ...existing.devDependencies
100
+ },
101
+ scripts: {
102
+ ...next.packageJson.scripts,
103
+ ...existing.scripts
104
+ }
105
+ };
106
+ for (const [name, command] of Object.entries(next.packageJson.scripts))if (existing.scripts?.[name] === void 0 || existing.scripts[name] === before.packageJson.scripts?.[name]) packageJson.scripts[name] = command;
107
+ writeJsonFile(packagePath, packageJson);
108
+ rewriteWorkspaceAssetsForApp(workspaceRoot, next.shellHost);
47
109
  }
48
110
  export { rewriteShellAppFiles, updateRootWorkspaceScripts };
@@ -81,6 +81,9 @@ function verticalsFromTopology(topology, ports) {
81
81
  portEnv: `VERTICAL_${toEnvSegment(domain)}_PORT`,
82
82
  port: 'number' == typeof ports[vertical.id] ? ports[vertical.id] : 0,
83
83
  mfName: vertical.moduleFederation?.name ?? `vertical${toPascalCase(domain)}`,
84
+ ...vertical.deliveryUnit ? {
85
+ deliveryUnit: vertical.deliveryUnit
86
+ } : {},
84
87
  ...void 0 === surfaceProfile ? {} : {
85
88
  surfaceProfile
86
89
  },
@@ -90,7 +93,7 @@ function verticalsFromTopology(topology, ports) {
90
93
  ...Array.isArray(vertical.moduleFederation?.exposes) ? {
91
94
  exposes: Object.fromEntries(vertical.moduleFederation.exposes.map((expose)=>[
92
95
  expose,
93
- './Route' === expose ? './src/federation-entry.tsx' : './Widget' === expose ? `./src/components/${domain}-widget.tsx` : ''
96
+ vertical.moduleFederation?.exposePaths?.[expose] ?? ('./Route' === expose ? './src/federation-entry.tsx' : './Widget' === expose ? `./src/components/${domain}-widget.tsx` : '')
94
97
  ]))
95
98
  } : {},
96
99
  ...Array.isArray(vertical.moduleFederation?.verticalRefs) ? {