@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,779 +0,0 @@
1
- #!/usr/bin/env node
2
- import fs from 'node:fs';
3
- import path from 'node:path';
4
-
5
- const workspaceRoot = process.env.ULTRAMODERN_WORKSPACE_ROOT ?? process.cwd();
6
- const failures = [];
7
-
8
- const ignoredDirectories = new Set([
9
- '.git',
10
- '.modern',
11
- '.output',
12
- 'coverage',
13
- 'dist',
14
- 'node_modules',
15
- 'repos',
16
- ]);
17
-
18
- function normalize(filePath) {
19
- return filePath.split(path.sep).join('/');
20
- }
21
-
22
- function relative(filePath) {
23
- return normalize(path.relative(workspaceRoot, filePath));
24
- }
25
-
26
- function exists(relativePath) {
27
- return fs.existsSync(path.join(workspaceRoot, relativePath));
28
- }
29
-
30
- function readText(relativePath) {
31
- return fs.readFileSync(path.join(workspaceRoot, relativePath), 'utf8');
32
- }
33
-
34
- function fail(message) {
35
- failures.push(message);
36
- }
37
-
38
- function assert(condition, message) {
39
- if (!condition) {
40
- fail(message);
41
- }
42
- }
43
-
44
- function listFiles(startDirectory) {
45
- const absoluteStart = path.join(workspaceRoot, startDirectory);
46
- if (!fs.existsSync(absoluteStart)) {
47
- return [];
48
- }
49
-
50
- const files = [];
51
- const visit = directory => {
52
- for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
53
- if (ignoredDirectories.has(entry.name)) {
54
- continue;
55
- }
56
-
57
- const absoluteEntry = path.join(directory, entry.name);
58
- if (entry.isDirectory()) {
59
- visit(absoluteEntry);
60
- continue;
61
- }
62
-
63
- if (entry.isFile()) {
64
- files.push(relative(absoluteEntry));
65
- }
66
- }
67
- };
68
-
69
- visit(absoluteStart);
70
- return files;
71
- }
72
-
73
- function listDirectories(startDirectory) {
74
- const absoluteStart = path.join(workspaceRoot, startDirectory);
75
- if (!fs.existsSync(absoluteStart)) {
76
- return [];
77
- }
78
-
79
- return fs
80
- .readdirSync(absoluteStart, { withFileTypes: true })
81
- .filter(entry => entry.isDirectory() && !ignoredDirectories.has(entry.name))
82
- .map(entry => path.posix.join(startDirectory, entry.name));
83
- }
84
-
85
- function assertNoPath(relativePath, message) {
86
- if (exists(relativePath)) {
87
- fail(message);
88
- }
89
- }
90
-
91
- function assertNotContains(relativePath, content, pattern, message) {
92
- assert(!pattern.test(content), `${relativePath}: ${message}`);
93
- }
94
-
95
- function stripComments(source, { maskStrings = false } = {}) {
96
- let output = '';
97
- let state = 'code';
98
-
99
- for (let index = 0; index < source.length; index += 1) {
100
- const current = source[index];
101
- const next = source[index + 1];
102
-
103
- if (state === 'line-comment') {
104
- if (current === '\n') {
105
- state = 'code';
106
- output += current;
107
- } else {
108
- output += ' ';
109
- }
110
- continue;
111
- }
112
-
113
- if (state === 'block-comment') {
114
- if (current === '*' && next === '/') {
115
- output += ' ';
116
- index += 1;
117
- state = 'code';
118
- } else {
119
- output += current === '\n' ? '\n' : ' ';
120
- }
121
- continue;
122
- }
123
-
124
- if (state !== 'code') {
125
- output += maskStrings ? (current === '\n' ? '\n' : ' ') : current;
126
- if (current === '\\') {
127
- output += maskStrings
128
- ? next === '\n'
129
- ? '\n'
130
- : ' '
131
- : (next ?? '');
132
- index += 1;
133
- } else if (
134
- (state === 'single-quote' && current === "'") ||
135
- (state === 'double-quote' && current === '"') ||
136
- (state === 'template' && current === '`')
137
- ) {
138
- state = 'code';
139
- }
140
- continue;
141
- }
142
-
143
- if (current === '/' && next === '/') {
144
- output += ' ';
145
- index += 1;
146
- state = 'line-comment';
147
- } else if (current === '/' && next === '*') {
148
- output += ' ';
149
- index += 1;
150
- state = 'block-comment';
151
- } else {
152
- if (current === "'") {
153
- output += maskStrings ? ' ' : current;
154
- state = 'single-quote';
155
- } else if (current === '"') {
156
- output += maskStrings ? ' ' : current;
157
- state = 'double-quote';
158
- } else if (current === '`') {
159
- output += maskStrings ? ' ' : current;
160
- state = 'template';
161
- } else {
162
- output += current;
163
- }
164
- }
165
- }
166
-
167
- return output;
168
- }
169
-
170
- function analyzeModule(relativePath) {
171
- const content = readText(relativePath);
172
- const source = stripComments(content);
173
- const code = stripComments(content, { maskStrings: true });
174
- const imports = new Map();
175
- const reexports = new Set();
176
- const importPattern =
177
- /\bimport\s+(?:type\s+)?([\s\S]*?)\s+from\s+(['"])([^'"]+)\2\s*;?/gu;
178
-
179
- for (const match of source.matchAll(importPattern)) {
180
- if (code.slice(match.index, match.index + 6) !== 'import') {
181
- continue;
182
- }
183
- const bindingClause = match[1];
184
- const namedBindings = bindingClause.match(/\{([\s\S]*?)\}/u)?.[1] ?? '';
185
- const names = new Set(
186
- namedBindings
187
- .split(',')
188
- .map(binding => binding.trim().split(/\s+as\s+/u)[1] ?? binding.trim())
189
- .filter(Boolean),
190
- );
191
- const existing = imports.get(match[3]) ?? new Set();
192
- for (const name of names) {
193
- existing.add(name);
194
- }
195
- imports.set(match[3], existing);
196
- }
197
-
198
- const reexportPattern =
199
- /\bexport\s*\{[\s\S]*?\}\s*from\s*(['"])([^'"]+)\1\s*;?/gu;
200
- for (const match of source.matchAll(reexportPattern)) {
201
- if (code.slice(match.index, match.index + 6) === 'export') {
202
- reexports.add(match[2]);
203
- }
204
- }
205
-
206
- return { imports, reexports, source: code };
207
- }
208
-
209
- function assertNamedImports(relativePath, analysis, moduleName, names) {
210
- assert(
211
- analysis.imports.has(moduleName),
212
- `${relativePath}: must import from ${moduleName}.`,
213
- );
214
- const importedNames = analysis.imports.get(moduleName) ?? new Set();
215
- for (const name of names) {
216
- assert(
217
- importedNames.has(name),
218
- `${relativePath}: must import ${name} from ${moduleName}.`,
219
- );
220
- }
221
- }
222
-
223
- function assertCallExpression(relativePath, analysis, callee, message) {
224
- const escapedCallee = callee.replaceAll('.', '\\s*\\.\\s*');
225
- assert(
226
- new RegExp(`\\b${escapedCallee}\\s*\\(`, 'u').test(analysis.source),
227
- `${relativePath}: ${message}`,
228
- );
229
- }
230
-
231
- function assertDefaultExport(relativePath, analysis, identifier) {
232
- assert(
233
- new RegExp(`\\bexport\\s+default\\s+${identifier}\\s*;`, 'u').test(
234
- analysis.source,
235
- ),
236
- `${relativePath}: must default-export ${identifier}.`,
237
- );
238
- }
239
-
240
- function assertModuleShape(
241
- relativePath,
242
- { imports = [], calls = [], patterns = [], defaultExport },
243
- ) {
244
- if (!exists(relativePath)) {
245
- return;
246
- }
247
-
248
- const analysis = analyzeModule(relativePath);
249
- for (const [moduleName, names] of imports) {
250
- assertNamedImports(relativePath, analysis, moduleName, names);
251
- }
252
- for (const [callee, message] of calls) {
253
- assertCallExpression(relativePath, analysis, callee, message);
254
- }
255
- for (const [pattern, message] of patterns) {
256
- assert(pattern.test(analysis.source), `${relativePath}: ${message}`);
257
- }
258
- if (defaultExport !== undefined) {
259
- assertDefaultExport(relativePath, analysis, defaultExport);
260
- }
261
- }
262
-
263
- function readConfiguredApps() {
264
- const configPath = '.modernjs/ultramodern.json';
265
- if (!exists(configPath)) {
266
- fail(`${configPath} is required to classify generated API surfaces.`);
267
- return [];
268
- }
269
-
270
- try {
271
- const config = JSON.parse(readText(configPath));
272
- if (!Array.isArray(config.topology?.apps)) {
273
- fail(`${configPath}: topology.apps must be an array.`);
274
- return [];
275
- }
276
- return config.topology.apps;
277
- } catch (error) {
278
- fail(
279
- `${configPath}: must contain valid JSON (${error instanceof Error ? error.message : String(error)}).`,
280
- );
281
- return [];
282
- }
283
- }
284
-
285
- const configuredApps = readConfiguredApps();
286
- const configuredAppsByPath = new Map(
287
- configuredApps
288
- .filter(app => typeof app?.path === 'string')
289
- .map(app => [normalize(app.path).replace(/^\.\//u, ''), app]),
290
- );
291
-
292
- function configuredApp(appPath) {
293
- return configuredAppsByPath.get(normalize(appPath).replace(/^\.\//u, ''));
294
- }
295
-
296
- function appShouldEmitApi(app) {
297
- return (
298
- app?.kind === 'vertical' &&
299
- app.surfaceProfile !== 'ui-only' &&
300
- app.deliveryUnitKind !== 'horizontal-remote'
301
- );
302
- }
303
-
304
- function assertNoApiSurface(appPath, profile) {
305
- for (const relativePath of [
306
- `${appPath}/api/index.ts`,
307
- `${appPath}/api/effect-api.ts`,
308
- `${appPath}/shared/api.ts`,
309
- `${appPath}/shared/rpc.ts`,
310
- `${appPath}/src/api`,
311
- ]) {
312
- assertNoPath(
313
- relativePath,
314
- `Unexpected ${relativePath} for a ${profile} unit with no API surface.`,
315
- );
316
- }
317
- }
318
-
319
- for (const forbiddenPath of [
320
- ...listDirectories('apps').flatMap(appPath => [
321
- `${appPath}/api/effect`,
322
- `${appPath}/api/lambda`,
323
- `${appPath}/shared/effect`,
324
- `${appPath}/src/effect`,
325
- ]),
326
- ...listDirectories('verticals').flatMap(verticalPath => [
327
- `${verticalPath}/api/effect`,
328
- `${verticalPath}/api/lambda`,
329
- `${verticalPath}/shared/effect`,
330
- `${verticalPath}/src/effect`,
331
- ]),
332
- ]) {
333
- assertNoPath(
334
- forbiddenPath,
335
- `${forbiddenPath} is forbidden in UltraModern strictEffectApproach workspaces; use api/index.ts, shared/api.ts and src/api/* instead.`,
336
- );
337
- }
338
-
339
- const generatedFiles = [
340
- ...listFiles('apps'),
341
- ...listFiles('verticals'),
342
- ...listFiles('packages'),
343
- ];
344
- const textFiles = generatedFiles.filter(file =>
345
- /\.(?:[cm]?[jt]sx?|json|md|mjs|mts|cts)$/u.test(file),
346
- );
347
-
348
- for (const file of textFiles) {
349
- const content = readText(file);
350
-
351
- if (/\/api\//u.test(file)) {
352
- assertNotContains(
353
- file,
354
- content,
355
- /\bnew\s+Response\s*\(|\bResponse\.json\s*\(/u,
356
- 'API modules must not hand-build Response objects; model endpoints through Effect HttpApi and schemas.',
357
- );
358
- assertNotContains(
359
- file,
360
- content,
361
- /\b(?:request|req)\.(?:json|text|formData|arrayBuffer)\s*\(/u,
362
- 'API modules must not manually parse request bodies; use HttpApiEndpoint payload/query/params schemas.',
363
- );
364
- assertNotContains(
365
- file,
366
- content,
367
- /\bexport\s+const\s+handler\b|\bexport\s+default\s+async\b/u,
368
- 'API modules must not export raw request handlers; export defineEffectBff(...) from api/index.ts.',
369
- );
370
- assertNotContains(
371
- file,
372
- content,
373
- /\bcreateHandler\s*[:=]\s*(?!defineEffectBff\b)/u,
374
- 'API modules must not define unbranded handler factories; use defineEffectBff(...).',
375
- );
376
- assertNotContains(
377
- file,
378
- content,
379
- /\bSchema\.(?:UnknownFromJsonString|Unknown|Any)\b/u,
380
- 'API modules must use concrete request, response and error schemas; Schema.UnknownFromJsonString, Schema.Unknown and Schema.Any are forbidden in UltraModern API code.',
381
- );
382
- }
383
-
384
- assertNotContains(
385
- file,
386
- content,
387
- /@modern-js\/plugin-bff\/hono-server/u,
388
- 'UltraModern API workspaces must not import Hono server helpers; use @modern-js/plugin-bff/effect-edge and HttpApi.',
389
- );
390
- assertNotContains(
391
- file,
392
- content,
393
- /\bruntimeFramework\s*(?::|=)\s*['"]hono['"]/u,
394
- 'Generated UltraModern API apps must use the Effect runtime.',
395
- );
396
- assertNotContains(
397
- file,
398
- content,
399
- /\bstrictEffectApproach\s*(?::|=)\s*false\b/u,
400
- 'Generated UltraModern API apps must keep strictEffectApproach enabled.',
401
- );
402
- }
403
-
404
- const verticalDirectories = listDirectories('verticals');
405
- const shellClient = 'apps/shell-super-app/src/api/vertical-clients.ts';
406
- const apiVerticalDirectories = verticalDirectories.filter(
407
- verticalPath => appShouldEmitApi(configuredApp(verticalPath)),
408
- );
409
- if (exists('apps/shell-super-app') && apiVerticalDirectories.length > 0) {
410
- assert(exists(shellClient), `${shellClient} must aggregate vertical API clients.`);
411
- if (exists(shellClient)) {
412
- const shellApi = analyzeModule(shellClient);
413
- for (const verticalPath of apiVerticalDirectories) {
414
- const vertical = configuredApp(verticalPath);
415
- const clientExport = `${vertical.package}/api/${
416
- (vertical.api?.protocol ?? 'rest') === 'rpc' ? 'rpc-client' : 'client'
417
- }`;
418
- assert(
419
- shellApi.reexports.has(clientExport),
420
- `${shellClient} must re-export ${clientExport}.`,
421
- );
422
- }
423
- }
424
- }
425
-
426
- function assertBackendEffectSurface(appPath) {
427
- const relativePath = `${appPath}/api/effect-api.ts`;
428
- if (!exists(relativePath)) {
429
- return;
430
- }
431
-
432
- const content = stripComments(readText(relativePath));
433
- for (const [pattern, message] of [
434
- [/\bbackendFederationContract\b/u, 'must export backendFederationContract metadata.'],
435
- [/role:\s*['"]microvertical-server['"]/u, 'must describe the MicroVertical server role.'],
436
- [/strictEffectApproach:\s*true/u, 'must preserve strict Effect backend execution.'],
437
- [
438
- /contractVersion:\s*['"]microvertical-server-effect-v1['"]/u,
439
- 'must preserve the MicroVertical server contract version.',
440
- ],
441
- [
442
- /export\s*\{\s*default\s*,\s*default\s+as\s+runtime\s*\}\s+from\s+['"]\.\/index\.ts['"]/u,
443
- 'must re-export the generated Effect BFF runtime as both default and runtime.',
444
- ],
445
- ]) {
446
- assert(pattern.test(content), `${relativePath}: ${message}`);
447
- }
448
- assert(
449
- !/\b(request|handler)\s*:\s*async\s*\(/u.test(content),
450
- `${relativePath}: must not expose raw request handlers.`,
451
- );
452
- }
453
-
454
- function assertEffectConfig(appPath) {
455
- const relativePath = `${appPath}/modern.config.ts`;
456
- if (!exists(relativePath)) {
457
- return;
458
- }
459
-
460
- const content = stripComments(readText(relativePath));
461
- for (const [pattern, message] of [
462
- [/runtimeFramework:\s*['"]effect['"]/u, 'must use bff.runtimeFramework: effect.'],
463
- [/entry:\s*['"]\.\/api\/index['"]/u, 'must point bff.effect.entry at ./api/index.'],
464
- [/strictEffectApproach:\s*true/u, 'must enable strictEffectApproach explicitly.'],
465
- ]) {
466
- assert(pattern.test(content), `${relativePath}: ${message}`);
467
- }
468
- }
469
-
470
- function assertRpcSurface(appPath, app) {
471
- const stem = app?.api?.stem ?? path.posix.basename(appPath);
472
- const apiEntry = `${appPath}/api/index.ts`;
473
- const sharedRpc = `${appPath}/shared/rpc.ts`;
474
- const rpcClient = `${appPath}/src/api/${stem}-rpc-client.ts`;
475
- const restContract = `${appPath}/shared/api.ts`;
476
- const restClient = `${appPath}/src/api/${stem}-client.ts`;
477
- const packageJsonPath = `${appPath}/package.json`;
478
-
479
- assert(exists(apiEntry), `${apiEntry} is required.`);
480
- assert(exists(sharedRpc), `${sharedRpc} is required.`);
481
- assert(exists(rpcClient), `Missing ${rpcClient}.`);
482
- assertNoPath(restContract, `${appPath} RPC unit must not emit ${restContract}.`);
483
- assertNoPath(restClient, `${appPath} RPC unit must not emit the REST API client.`);
484
-
485
- assertModuleShape(apiEntry, {
486
- imports: [
487
- [
488
- '@modern-js/plugin-bff/effect-edge',
489
- ['defineEffectBff', 'Effect', 'HttpApi', 'Layer'],
490
- ],
491
- ['../shared/rpc.ts', []],
492
- ],
493
- calls: [
494
- [
495
- 'defineEffectBff',
496
- 'must create the strict Effect runtime through defineEffectBff(...).',
497
- ],
498
- [
499
- 'HttpApi.make',
500
- 'must create the empty HttpApi transport marker for RPC discovery.',
501
- ],
502
- ],
503
- patterns: [
504
- [
505
- /\bconst\s+\w+RpcLayer\s*=\s*\w+RpcGroup\s*\.\s*toLayer\s*\(/u,
506
- 'must implement the RPC group through RpcGroup.toLayer(...).',
507
- ],
508
- [
509
- /\brpc\s*:\s*\{[\s\S]*?\bgroup\s*:[\s\S]*?\blayer\s*:[\s\S]*?\bpath\s*:[\s\S]*?\bserialization\s*:/u,
510
- 'defineEffectBff(...) must register the RPC group, layer, path and JSON serialization.',
511
- ],
512
- ],
513
- defaultExport: 'apiRuntime',
514
- });
515
- assertModuleShape(sharedRpc, {
516
- imports: [
517
- ['effect/unstable/rpc', ['Rpc', 'RpcGroup']],
518
- ['@modern-js/plugin-bff/effect-client', ['Schema']],
519
- ],
520
- calls: [
521
- ['RpcGroup.make', 'must declare the RPC group through RpcGroup.make(...).'],
522
- ['Rpc.make', 'must declare callable operations through Rpc.make(...).'],
523
- [
524
- 'Schema.Struct',
525
- 'must use concrete Schema.Struct request and response shapes.',
526
- ],
527
- ],
528
- });
529
- assertModuleShape(rpcClient, {
530
- imports: [
531
- [
532
- '@modern-js/plugin-bff/effect-client',
533
- ['Effect', 'makeEffectRpcClient'],
534
- ],
535
- ['../../shared/rpc.ts', []],
536
- ],
537
- calls: [
538
- [
539
- 'makeEffectRpcClient',
540
- 'must create the client from the generated RpcGroup contract.',
541
- ],
542
- ],
543
- });
544
-
545
- assertBackendEffectSurface(appPath);
546
- assertEffectConfig(appPath);
547
-
548
- if (exists(packageJsonPath)) {
549
- const packageJson = JSON.parse(readText(packageJsonPath));
550
- assert(
551
- packageJson.exports?.['./api'] === './shared/rpc.ts',
552
- `${packageJsonPath}: RPC package must export ./api from shared/rpc.ts.`,
553
- );
554
- assert(
555
- packageJson.exports?.['./api/rpc-client'] ===
556
- `./src/api/${stem}-rpc-client.ts`,
557
- `${packageJsonPath}: RPC package must export ./api/rpc-client from ${stem}-rpc-client.ts.`,
558
- );
559
- assert(
560
- packageJson.exports?.['./api/client'] === undefined,
561
- `${packageJsonPath}: RPC package must not expose the REST ./api/client export.`,
562
- );
563
- }
564
- }
565
-
566
- function assertApiSurface(appPath, app) {
567
- if ((app?.api?.protocol ?? 'rest') === 'rpc') {
568
- assertRpcSurface(appPath, app);
569
- return;
570
- }
571
-
572
- const apiEntry = `${appPath}/api/index.ts`;
573
- const sharedApi = `${appPath}/shared/api.ts`;
574
- const srcApiDirectory = `${appPath}/src/api`;
575
- const stem = app?.api?.stem ?? path.posix.basename(appPath);
576
- const clientPath = `${srcApiDirectory}/${stem}-client.ts`;
577
- const rpcContract = `${appPath}/shared/rpc.ts`;
578
- const rpcClient = `${srcApiDirectory}/${stem}-rpc-client.ts`;
579
- const packageJsonPath = `${appPath}/package.json`;
580
-
581
- assert(exists(apiEntry), `${apiEntry} is required.`);
582
- assert(exists(sharedApi), `${sharedApi} is required.`);
583
- assert(exists(srcApiDirectory), `${srcApiDirectory} is required.`);
584
- assert(exists(clientPath), `${clientPath} is required.`);
585
- assertNoPath(rpcContract, `${appPath} REST unit must not emit ${rpcContract}.`);
586
- assertNoPath(rpcClient, `${appPath} REST unit must not emit the RPC API client.`);
587
-
588
- assertModuleShape(apiEntry, {
589
- imports: [
590
- [
591
- '@modern-js/plugin-bff/effect-edge',
592
- ['defineEffectBff', 'Effect', 'HttpApiBuilder', 'Layer'],
593
- ],
594
- ['../shared/api.ts', []],
595
- ],
596
- calls: [
597
- [
598
- 'defineEffectBff',
599
- 'must create the strict Effect runtime through defineEffectBff(...).',
600
- ],
601
- [
602
- 'HttpApiBuilder.group',
603
- 'must implement handlers through HttpApiBuilder.group(...).',
604
- ],
605
- [
606
- 'HttpApiBuilder.layer',
607
- 'must assemble the HttpApi runtime through HttpApiBuilder.layer(...).',
608
- ],
609
- [
610
- 'Layer.provide',
611
- 'must compose the handler group through Effect Layer.provide(...).',
612
- ],
613
- ],
614
- defaultExport: 'apiRuntime',
615
- });
616
- assertBackendEffectSurface(appPath);
617
-
618
- assertModuleShape(sharedApi, {
619
- imports: [
620
- [
621
- '@modern-js/plugin-bff/effect-client',
622
- ['HttpApi', 'HttpApiEndpoint', 'HttpApiGroup', 'HttpApiSchema', 'Schema'],
623
- ],
624
- ],
625
- calls: [
626
- [
627
- 'HttpApi.make',
628
- 'must declare the HttpApi contract through HttpApi.make(...).',
629
- ],
630
- ['HttpApiGroup.make', 'must declare groups through HttpApiGroup.make(...).'],
631
- [
632
- 'HttpApiEndpoint.get',
633
- 'must declare GET endpoints through HttpApiEndpoint.get(...).',
634
- ],
635
- [
636
- 'HttpApiEndpoint.post',
637
- 'must declare POST endpoints through HttpApiEndpoint.post(...).',
638
- ],
639
- [
640
- 'Schema.Struct',
641
- 'must use concrete Schema.Struct request and response shapes.',
642
- ],
643
- ],
644
- });
645
- assertModuleShape(clientPath, {
646
- imports: [
647
- [
648
- '@modern-js/plugin-bff/effect-client',
649
- ['Effect', 'makeEffectHttpApiClient'],
650
- ],
651
- ['../../shared/api', []],
652
- ],
653
- calls: [
654
- [
655
- 'makeEffectHttpApiClient',
656
- 'must create the generated Effect HttpApi client.',
657
- ],
658
- ],
659
- });
660
-
661
- assertEffectConfig(appPath);
662
-
663
- if (exists(packageJsonPath)) {
664
- const packageJson = JSON.parse(readText(packageJsonPath));
665
- assert(
666
- packageJson.exports?.['./api'] === './shared/api.ts',
667
- `${packageJsonPath}: package must export ./api from shared/api.ts.`,
668
- );
669
- assert(
670
- packageJson.exports?.['./api/client'] === `./src/api/${stem}-client.ts`,
671
- `${packageJsonPath}: package must export ./api/client from ${stem}-client.ts.`,
672
- );
673
- assert(
674
- packageJson.exports?.['./api/rpc-client'] === undefined,
675
- `${packageJsonPath}: REST package must not expose the RPC ./api/rpc-client export.`,
676
- );
677
- }
678
- }
679
-
680
- for (const appPath of listDirectories('apps')) {
681
- const app = configuredApp(appPath);
682
- if (app?.kind === 'vertical' && appShouldEmitApi(app)) {
683
- assert(
684
- app.api !== undefined,
685
- `${appPath}: ${app.surfaceProfile ?? 'full-stack'} vertical must declare its Effect API in .modernjs/ultramodern.json.`,
686
- );
687
- assertApiSurface(appPath, app);
688
- } else if (app?.kind === 'vertical') {
689
- assert(
690
- app.api === undefined,
691
- `${appPath}: ${app.surfaceProfile ?? app.deliveryUnitKind ?? 'UI'} vertical must not declare an API.`,
692
- );
693
- assertNoApiSurface(appPath, app.surfaceProfile ?? app.deliveryUnitKind ?? 'UI');
694
- } else if (app?.api !== undefined) {
695
- assertApiSurface(appPath, app);
696
- } else if (
697
- app === undefined &&
698
- (exists(`${appPath}/api/index.ts`) || exists(`${appPath}/shared/api.ts`))
699
- ) {
700
- assertApiSurface(appPath, app);
701
- }
702
- }
703
-
704
- for (const verticalPath of verticalDirectories) {
705
- const app = configuredApp(verticalPath);
706
- if (app !== undefined && appShouldEmitApi(app)) {
707
- assert(
708
- app.api !== undefined,
709
- `${verticalPath}: ${app.surfaceProfile ?? 'full-stack'} vertical must declare its Effect API in .modernjs/ultramodern.json.`,
710
- );
711
- assertApiSurface(verticalPath, app);
712
- } else if (app !== undefined) {
713
- assert(
714
- app.api === undefined,
715
- `${verticalPath}: ${app.surfaceProfile ?? app.deliveryUnitKind ?? 'UI'} vertical must not declare an API.`,
716
- );
717
- assertNoApiSurface(
718
- verticalPath,
719
- app.surfaceProfile ?? app.deliveryUnitKind ?? 'UI',
720
- );
721
- } else {
722
- assertApiSurface(verticalPath, undefined);
723
- }
724
- }
725
-
726
- if (exists('apps/shell-super-app/package.json')) {
727
- const shellPackageJson = JSON.parse(
728
- readText('apps/shell-super-app/package.json'),
729
- );
730
- assert(
731
- shellPackageJson.exports?.['./api/clients'] ===
732
- './src/api/vertical-clients.ts',
733
- 'apps/shell-super-app/package.json must export ./api/clients.',
734
- );
735
- }
736
-
737
- if (exists('package.json')) {
738
- const rootPackageJson = JSON.parse(readText('package.json'));
739
- assert(
740
- rootPackageJson.scripts?.['api:check'] ===
741
- 'node ./scripts/check-ultramodern-api-boundaries.mts',
742
- 'Root package.json must expose api:check.',
743
- );
744
- assert(
745
- rootPackageJson.scripts?.check?.includes('pnpm api:check'),
746
- 'Root check script must include pnpm api:check.',
747
- );
748
- }
749
-
750
- if (exists('topology/reference-topology.json')) {
751
- const topology = JSON.parse(readText('topology/reference-topology.json'));
752
- for (const vertical of topology.verticals ?? []) {
753
- if (vertical.api?.runtime === 'effect') {
754
- assert(
755
- vertical.api.bff?.strictEffectApproach === true,
756
- `${vertical.id} topology must mark strictEffectApproach as true.`,
757
- );
758
- assert(
759
- typeof vertical.api.serverEntry === 'string' &&
760
- vertical.api.serverEntry.endsWith('/api/index.ts'),
761
- `${vertical.id} topology must use api/index.ts as the server entry.`,
762
- );
763
- }
764
- assert(
765
- !vertical.api?.effect,
766
- `${vertical.id} topology must describe the API directly, not under api.effect.`,
767
- );
768
- }
769
- }
770
-
771
- if (failures.length > 0) {
772
- console.error('UltraModern API boundary check failed:');
773
- for (const failure of failures) {
774
- console.error(`- ${failure}`);
775
- }
776
- process.exit(1);
777
- }
778
-
779
- console.log('UltraModern API boundary check passed.');