@bleedingdev/modern-js-ultramodern-create 3.9.0-ultramodern.12 → 3.9.0-ultramodern.14

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 (201) hide show
  1. package/README.md +32 -36
  2. package/dist/cjs/ultramodern-release-cohort.cjs +6 -21
  3. package/dist/cjs/ultramodern-tooling/commands/context.cjs +2 -1
  4. package/dist/cjs/ultramodern-tooling/commands/validate.cjs +2 -57
  5. package/dist/cjs/ultramodern-tooling/commands.cjs +11 -1
  6. package/dist/cjs/ultramodern-tooling/config/index.cjs +11 -4
  7. package/dist/cjs/ultramodern-tooling/config/load.cjs +4 -17
  8. package/dist/cjs/ultramodern-tooling/config/metadata.cjs +41 -2
  9. package/dist/cjs/ultramodern-tooling/config/normalize.cjs +121 -208
  10. package/dist/cjs/ultramodern-workspace/add-shell.cjs +51 -18
  11. package/dist/cjs/ultramodern-workspace/add-vertical/execute.cjs +40 -39
  12. package/dist/cjs/ultramodern-workspace/add-vertical/plan.cjs +1 -1
  13. package/dist/cjs/ultramodern-workspace/add-vertical/preflight.cjs +2 -8
  14. package/dist/cjs/ultramodern-workspace/add-vertical/topology.cjs +0 -32
  15. package/dist/cjs/ultramodern-workspace/add-vertical/workspace-state.cjs +3 -10
  16. package/dist/cjs/ultramodern-workspace/api/contracts.cjs +2 -2
  17. package/dist/cjs/ultramodern-workspace/api/rpc.cjs +16 -14
  18. package/dist/cjs/ultramodern-workspace/api/service.cjs +4 -8
  19. package/dist/cjs/ultramodern-workspace/api/shared.cjs +1 -1
  20. package/dist/cjs/ultramodern-workspace/backend-federation.cjs +3 -3
  21. package/dist/cjs/ultramodern-workspace/contracts.cjs +14 -183
  22. package/dist/cjs/ultramodern-workspace/delivery-unit-stamp.cjs +10 -5
  23. package/dist/cjs/ultramodern-workspace/delivery-unit-sync.cjs +27 -17
  24. package/dist/cjs/ultramodern-workspace/delivery-unit.cjs +11 -6
  25. package/dist/cjs/ultramodern-workspace/descriptors.cjs +0 -4
  26. package/dist/cjs/ultramodern-workspace/generation-result.cjs +1 -1
  27. package/dist/cjs/ultramodern-workspace/index.cjs +2 -5
  28. package/dist/cjs/ultramodern-workspace/mf-validation/constants.cjs +0 -6
  29. package/dist/cjs/ultramodern-workspace/mf-validation/discovery.cjs +6 -6
  30. package/dist/cjs/ultramodern-workspace/mf-validation/path-utils.cjs +37 -38
  31. package/dist/cjs/ultramodern-workspace/module-federation/config.cjs +8 -15
  32. package/dist/cjs/ultramodern-workspace/package-json.cjs +47 -54
  33. package/dist/cjs/ultramodern-workspace/patch-inventory.cjs +23 -41
  34. package/dist/cjs/ultramodern-workspace/policy.cjs +6 -354
  35. package/dist/cjs/ultramodern-workspace/public-surface.cjs +2 -2
  36. package/dist/cjs/ultramodern-workspace/routes.cjs +11 -7
  37. package/dist/cjs/ultramodern-workspace/shells.cjs +0 -70
  38. package/dist/cjs/ultramodern-workspace/tooling-command-catalog.cjs +6 -43
  39. package/dist/cjs/ultramodern-workspace/tsconfigs.cjs +3 -1
  40. package/dist/cjs/ultramodern-workspace/validation/architecture.cjs +5 -5
  41. package/dist/cjs/ultramodern-workspace/validation/workspace.cjs +275 -1249
  42. package/dist/cjs/ultramodern-workspace/versions.cjs +25 -41
  43. package/dist/cjs/ultramodern-workspace/workspace-artifact-ownership.cjs +1 -6
  44. package/dist/cjs/ultramodern-workspace/workspace-script-plan.cjs +7 -7
  45. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +17 -112
  46. package/dist/cjs/ultramodern-workspace/workspace-validation-contract.cjs +62 -371
  47. package/dist/cjs/ultramodern-workspace/write-app.cjs +5 -4
  48. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +10 -50
  49. package/dist/esm/ultramodern-release-cohort.js +5 -14
  50. package/dist/esm/ultramodern-tooling/commands/context.js +2 -1
  51. package/dist/esm/ultramodern-tooling/commands/validate.js +3 -48
  52. package/dist/esm/ultramodern-tooling/commands.js +10 -1
  53. package/dist/esm/ultramodern-tooling/config/index.js +1 -0
  54. package/dist/esm/ultramodern-tooling/config/load.js +5 -17
  55. package/dist/esm/ultramodern-tooling/config/metadata.js +36 -1
  56. package/dist/esm/ultramodern-tooling/config/normalize.js +125 -201
  57. package/dist/esm/ultramodern-workspace/add-shell.js +55 -22
  58. package/dist/esm/ultramodern-workspace/add-vertical/execute.js +41 -41
  59. package/dist/esm/ultramodern-workspace/add-vertical/plan.js +2 -2
  60. package/dist/esm/ultramodern-workspace/add-vertical/preflight.js +3 -6
  61. package/dist/esm/ultramodern-workspace/add-vertical/topology.js +1 -30
  62. package/dist/esm/ultramodern-workspace/add-vertical/workspace-state.js +3 -10
  63. package/dist/esm/ultramodern-workspace/api/contracts.js +2 -2
  64. package/dist/esm/ultramodern-workspace/api/rpc.js +16 -14
  65. package/dist/esm/ultramodern-workspace/api/service.js +4 -8
  66. package/dist/esm/ultramodern-workspace/api/shared.js +1 -1
  67. package/dist/esm/ultramodern-workspace/backend-federation.js +3 -3
  68. package/dist/esm/ultramodern-workspace/contracts.js +14 -180
  69. package/dist/esm/ultramodern-workspace/delivery-unit-stamp.js +10 -5
  70. package/dist/esm/ultramodern-workspace/delivery-unit-sync.js +28 -18
  71. package/dist/esm/ultramodern-workspace/delivery-unit.js +11 -6
  72. package/dist/esm/ultramodern-workspace/descriptors.js +1 -2
  73. package/dist/esm/ultramodern-workspace/generation-result.js +2 -2
  74. package/dist/esm/ultramodern-workspace/index.js +1 -1
  75. package/dist/esm/ultramodern-workspace/mf-validation/constants.js +1 -4
  76. package/dist/esm/ultramodern-workspace/mf-validation/discovery.js +7 -7
  77. package/dist/esm/ultramodern-workspace/mf-validation/path-utils.js +36 -34
  78. package/dist/esm/ultramodern-workspace/module-federation/config.js +9 -16
  79. package/dist/esm/ultramodern-workspace/package-json.js +48 -55
  80. package/dist/esm/ultramodern-workspace/patch-inventory.js +23 -41
  81. package/dist/esm/ultramodern-workspace/policy.js +6 -335
  82. package/dist/esm/ultramodern-workspace/public-surface.js +2 -2
  83. package/dist/esm/ultramodern-workspace/routes.js +11 -7
  84. package/dist/esm/ultramodern-workspace/shells.js +3 -67
  85. package/dist/esm/ultramodern-workspace/tooling-command-catalog.js +7 -41
  86. package/dist/esm/ultramodern-workspace/tsconfigs.js +4 -2
  87. package/dist/esm/ultramodern-workspace/validation/architecture.js +5 -5
  88. package/dist/esm/ultramodern-workspace/validation/workspace.js +267 -1250
  89. package/dist/esm/ultramodern-workspace/versions.js +24 -28
  90. package/dist/esm/ultramodern-workspace/workspace-artifact-ownership.js +3 -8
  91. package/dist/esm/ultramodern-workspace/workspace-script-plan.js +7 -7
  92. package/dist/esm/ultramodern-workspace/workspace-scripts.js +18 -107
  93. package/dist/esm/ultramodern-workspace/workspace-validation-contract.js +64 -373
  94. package/dist/esm/ultramodern-workspace/write-app.js +4 -3
  95. package/dist/esm/ultramodern-workspace/write-workspace.js +16 -53
  96. package/dist/esm-node/ultramodern-release-cohort.js +5 -14
  97. package/dist/esm-node/ultramodern-tooling/commands/context.js +2 -1
  98. package/dist/esm-node/ultramodern-tooling/commands/validate.js +3 -48
  99. package/dist/esm-node/ultramodern-tooling/commands.js +10 -1
  100. package/dist/esm-node/ultramodern-tooling/config/index.js +1 -0
  101. package/dist/esm-node/ultramodern-tooling/config/load.js +5 -17
  102. package/dist/esm-node/ultramodern-tooling/config/metadata.js +36 -1
  103. package/dist/esm-node/ultramodern-tooling/config/normalize.js +125 -201
  104. package/dist/esm-node/ultramodern-workspace/add-shell.js +55 -22
  105. package/dist/esm-node/ultramodern-workspace/add-vertical/execute.js +41 -41
  106. package/dist/esm-node/ultramodern-workspace/add-vertical/plan.js +2 -2
  107. package/dist/esm-node/ultramodern-workspace/add-vertical/preflight.js +3 -6
  108. package/dist/esm-node/ultramodern-workspace/add-vertical/topology.js +1 -30
  109. package/dist/esm-node/ultramodern-workspace/add-vertical/workspace-state.js +3 -10
  110. package/dist/esm-node/ultramodern-workspace/api/contracts.js +2 -2
  111. package/dist/esm-node/ultramodern-workspace/api/rpc.js +16 -14
  112. package/dist/esm-node/ultramodern-workspace/api/service.js +4 -8
  113. package/dist/esm-node/ultramodern-workspace/api/shared.js +1 -1
  114. package/dist/esm-node/ultramodern-workspace/backend-federation.js +3 -3
  115. package/dist/esm-node/ultramodern-workspace/contracts.js +14 -180
  116. package/dist/esm-node/ultramodern-workspace/delivery-unit-stamp.js +10 -5
  117. package/dist/esm-node/ultramodern-workspace/delivery-unit-sync.js +28 -18
  118. package/dist/esm-node/ultramodern-workspace/delivery-unit.js +11 -6
  119. package/dist/esm-node/ultramodern-workspace/descriptors.js +1 -2
  120. package/dist/esm-node/ultramodern-workspace/generation-result.js +2 -2
  121. package/dist/esm-node/ultramodern-workspace/index.js +1 -1
  122. package/dist/esm-node/ultramodern-workspace/mf-validation/constants.js +1 -4
  123. package/dist/esm-node/ultramodern-workspace/mf-validation/discovery.js +7 -7
  124. package/dist/esm-node/ultramodern-workspace/mf-validation/path-utils.js +36 -34
  125. package/dist/esm-node/ultramodern-workspace/module-federation/config.js +9 -16
  126. package/dist/esm-node/ultramodern-workspace/package-json.js +48 -55
  127. package/dist/esm-node/ultramodern-workspace/patch-inventory.js +23 -41
  128. package/dist/esm-node/ultramodern-workspace/policy.js +6 -335
  129. package/dist/esm-node/ultramodern-workspace/public-surface.js +2 -2
  130. package/dist/esm-node/ultramodern-workspace/routes.js +11 -7
  131. package/dist/esm-node/ultramodern-workspace/shells.js +3 -67
  132. package/dist/esm-node/ultramodern-workspace/tooling-command-catalog.js +7 -41
  133. package/dist/esm-node/ultramodern-workspace/tsconfigs.js +4 -2
  134. package/dist/esm-node/ultramodern-workspace/validation/architecture.js +5 -5
  135. package/dist/esm-node/ultramodern-workspace/validation/workspace.js +267 -1250
  136. package/dist/esm-node/ultramodern-workspace/versions.js +24 -28
  137. package/dist/esm-node/ultramodern-workspace/workspace-artifact-ownership.js +3 -8
  138. package/dist/esm-node/ultramodern-workspace/workspace-script-plan.js +7 -7
  139. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +18 -107
  140. package/dist/esm-node/ultramodern-workspace/workspace-validation-contract.js +64 -373
  141. package/dist/esm-node/ultramodern-workspace/write-app.js +4 -3
  142. package/dist/esm-node/ultramodern-workspace/write-workspace.js +16 -53
  143. package/dist/types/ultramodern-release-cohort.d.ts +1 -3
  144. package/dist/types/ultramodern-tooling/commands/validate.d.ts +2 -2
  145. package/dist/types/ultramodern-tooling/config/index.d.ts +1 -0
  146. package/dist/types/ultramodern-tooling/config/load.d.ts +6 -58
  147. package/dist/types/ultramodern-tooling/config/metadata.d.ts +3 -0
  148. package/dist/types/ultramodern-tooling/config/normalize.d.ts +9 -90
  149. package/dist/types/ultramodern-tooling/config/types.d.ts +1 -9
  150. package/dist/types/ultramodern-workspace/add-vertical/preflight.d.ts +3 -3
  151. package/dist/types/ultramodern-workspace/add-vertical/topology.d.ts +0 -1
  152. package/dist/types/ultramodern-workspace/add-vertical/workspace-state.d.ts +1 -1
  153. package/dist/types/ultramodern-workspace/api/rpc.d.ts +1 -1
  154. package/dist/types/ultramodern-workspace/contracts.d.ts +1 -3
  155. package/dist/types/ultramodern-workspace/delivery-unit-stamp.d.ts +2 -2
  156. package/dist/types/ultramodern-workspace/delivery-unit.d.ts +2 -2
  157. package/dist/types/ultramodern-workspace/descriptors.d.ts +0 -1
  158. package/dist/types/ultramodern-workspace/index.d.ts +1 -1
  159. package/dist/types/ultramodern-workspace/mf-validation/constants.d.ts +0 -1
  160. package/dist/types/ultramodern-workspace/mf-validation/path-utils.d.ts +2 -3
  161. package/dist/types/ultramodern-workspace/module-federation/config.d.ts +1 -1
  162. package/dist/types/ultramodern-workspace/patch-inventory.d.ts +2 -10
  163. package/dist/types/ultramodern-workspace/policy.d.ts +60 -182
  164. package/dist/types/ultramodern-workspace/shells.d.ts +1 -14
  165. package/dist/types/ultramodern-workspace/tooling-command-catalog.d.ts +1 -6
  166. package/dist/types/ultramodern-workspace/validation/types.d.ts +1 -12
  167. package/dist/types/ultramodern-workspace/validation/workspace.d.ts +5 -2
  168. package/dist/types/ultramodern-workspace/versions.d.ts +23 -27
  169. package/dist/types/ultramodern-workspace/workspace-script-plan.d.ts +1 -1
  170. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +7 -14
  171. package/dist/types/ultramodern-workspace/workspace-validation-contract.d.ts +22 -188
  172. package/dist/types/ultramodern-workspace/write-workspace.d.ts +1 -3
  173. package/package.json +17 -16
  174. package/{template-workspace/.modernjs/release-cohort.json → release-cohort.json} +48 -48
  175. package/template-workspace/README.md.handlebars +9 -16
  176. package/template-workspace/pnpm-workspace.yaml.handlebars +0 -24
  177. package/templates/workspace/apps/modern.config.ts.handlebars +5 -5
  178. package/templates/workspace/apps/shared/src/routes/ultramodern-route-metadata.ts.handlebars +8 -21
  179. package/templates/workspace-scripts/generate-node-backend-federation.mjs +39 -49
  180. package/templates/workspace-scripts/generate-public-surface-assets.mjs +142 -206
  181. package/templates/workspace-scripts/materialize-zerops-runtime.mjs +3 -11
  182. package/templates/workspace-scripts/proof-cloudflare-version.mjs +53 -444
  183. package/templates/workspace-scripts/proof-node-backend-federation.mjs +193 -39
  184. package/templates/workspace-scripts/proof-workerd-ssr.mjs +434 -239
  185. package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +45 -147
  186. package/dist/cjs/ultramodern-workspace/cohort-parity.cjs +0 -129
  187. package/dist/cjs/ultramodern-workspace/patch-parity.cjs +0 -163
  188. package/dist/esm/ultramodern-workspace/cohort-parity.js +0 -74
  189. package/dist/esm/ultramodern-workspace/patch-parity.js +0 -99
  190. package/dist/esm-node/ultramodern-workspace/cohort-parity.js +0 -75
  191. package/dist/esm-node/ultramodern-workspace/patch-parity.js +0 -100
  192. package/dist/types/ultramodern-workspace/cohort-parity.d.ts +0 -31
  193. package/dist/types/ultramodern-workspace/patch-parity.d.ts +0 -39
  194. package/template-workspace/patches/@module-federation__bridge-react@2.9.0.patch +0 -47
  195. package/template-workspace/patches/@module-federation__dts-plugin@2.9.0.patch +0 -132
  196. package/template-workspace/patches/@module-federation__modern-js-v3@2.9.0.patch +0 -287
  197. package/template-workspace/patches/@module-federation__runtime-core@2.9.0.patch +0 -13
  198. package/template-workspace/patches/drizzle-orm-ts7-strict-declarations.patch +0 -471
  199. package/template-workspace/patches/msgpackr@2.1.0.patch +0 -30
  200. package/template-workspace/patches/zod@4.5.4.patch +0 -56
  201. package/templates/packages/effect-bff-runtime.ts +0 -2
package/README.md CHANGED
@@ -36,8 +36,8 @@ domains to delete. It generates:
36
36
  - `verticals/*` empty until a real domain is added with `--vertical`.
37
37
  - `packages/shared-*` placeholders for shared contracts, tokens, and Effect
38
38
  API support.
39
- - `.modernjs/ultramodern.json` as compact generator provenance, package-source
40
- config, app topology, bridge, deploy, Module Federation, and tooling config.
39
+ - `catalogs.ultramodern` in `pnpm-workspace.yaml` for published framework
40
+ dependency versions, referenced by application manifests.
41
41
  - `topology/*` as app-owned topology, ownership, and local development overlay
42
42
  JSON.
43
43
 
@@ -51,15 +51,15 @@ pnpm check
51
51
  pnpm build
52
52
  ```
53
53
 
54
- The generated toolchain pins Node `26.7.0`, pnpm `11.24.0`, and
55
- `@types/node@^26.4.1`; its engine baseline remains Node `>=26` with pnpm `11+`.
54
+ The generated toolchain pins Node `26.7.0`, pnpm `11.27.1`, and
55
+ `@types/node@^26.6.2`; its engine baseline remains Node `>=26` with pnpm `11+`.
56
56
  `packageManager`, `.mise.toml`, generated validation, and CI should all agree
57
57
  on those values; do not reintroduce Corepack or older pnpm aliases.
58
58
 
59
- The current generated dependency cohort also pins `@effect/tsgo@0.41.0`,
60
- `@tanstack/react-router@1.170.33`, `@tanstack/router-core@1.171.28`,
61
- `@tanstack/history@1.162.2`, and the Module Federation integration `2.9.0`
62
- cohort, `@module-federation/node@2.7.50`. Move these only through the
59
+ The current generated dependency cohort also pins `@effect/tsgo@0.45.0`,
60
+ `@tanstack/react-router@1.170.39`, `@tanstack/router-core@1.171.32`,
61
+ `@tanstack/history@1.162.4`, and the Module Federation integration `2.9.1`
62
+ cohort, `@module-federation/node@2.7.51`. Move these only through the
63
63
  generator-owned version policy so templates, validation, and the published
64
64
  workspace contract stay aligned.
65
65
 
@@ -169,38 +169,35 @@ contract so automation can stop safely:
169
169
  | --- | --- | --- |
170
170
  | Fresh input | Invalid or missing vertical name | Use `<name> --vertical`, `--vertical=<name>`, or `--vertical-name <name>` |
171
171
  | Existing topology | Duplicate app ID, package suffix, path, Module Federation name, port, API prefix, or manifest key | Choose a new vertical name or repair the existing topology/local overlay first |
172
- | Workspace files | Missing or non-object compact UltraModern config, topology, ownership, or local overlay JSON | Restore the generated config files from source control or rerun from a valid workspace |
172
+ | Workspace files | Missing or invalid topology, ownership, local overlay or app manifest | Repair the named authoritative file |
173
173
  | Tailwind prefix | Existing app already owns the generated CSS prefix | Rename the vertical before generation |
174
174
  | Output path | A generated path already exists | Treat it as an existing vertical and do not overwrite it |
175
175
 
176
- Package source is explicit and recorded in `.modernjs/ultramodern.json`.
176
+ Package source is selected by the installed generator dependency and native pnpm catalog.
177
+ Application manifests own package identity; the development overlay owns local ports.
177
178
 
178
179
  | Strategy | Use when | CLI |
179
180
  | --- | --- | --- |
180
181
  | `install` | Published BleedingDev package cohort or release proof | Default for the BleedingDev create package; optional `--ultramodern-package-version`, `--ultramodern-package-registry` (serves the cohort scope only; release-age metadata for every other dependency is validated against npmjs), `--ultramodern-package-scope`, and `--ultramodern-package-name-prefix` |
181
182
  | `workspace` | Local monorepo testing against unreleased packages | `--workspace` or `--ultramodern-package-source=workspace` |
182
183
 
183
- ## Framework Cohort
184
-
185
- Generated strict Effect workspaces pin the compatible Effect cohort through
186
- `pnpm-workspace.yaml` overrides: `effect@4.0.0-rc.112`,
187
- `@effect/opentelemetry@4.0.0-rc.112`, and
188
- `@effect/vitest@4.0.0-rc.112` (requiring `vitest >=4.1.0 <5`). The strict
189
- 24-hour release-age gate applies to the installed cohort; the current policy carries no Effect age exemption, and
190
- the override-only `@effect/vitest` entry is not an installed approval target.
191
- Separately, exact
192
- `trustPolicyExclude` entries for `effect` and `@effect/opentelemetry` cover the
193
- trusted-publisher to provenance transition. Trust exclusions are not
194
- release-age approvals. Do not override the cohort in app packages; update the
195
- framework cohort when the runtime moves.
196
-
197
- Use `--ultramodern-package-source=install` for published cohort proof and pin a
198
- specific release with `--ultramodern-package-version` when CI must prove an
199
- exact framework version. Keep `--workspace` only for local monorepo testing
200
- against unpublished packages. After install, run the generated
201
- `scripts/validate-ultramodern-workspace.mts` contract check and fix ownership
202
- conflicts in the owning JSON/config files instead of editing generated metadata
203
- by hand.
184
+ ## Framework dependencies
185
+
186
+ Published framework versions live in `catalogs.ultramodern` in
187
+ `pnpm-workspace.yaml`. Application manifests reference `catalog:ultramodern`;
188
+ the lockfile records resolved packages. Corrected third-party dependencies ship
189
+ as published packages. Applications do not install framework patches or carry
190
+ a copied release manifest.
191
+
192
+ Use `--ultramodern-package-source=install` for published package acceptance and
193
+ `--ultramodern-package-version` to select an exact release. Use `--workspace`
194
+ for local monorepo development. After installation, run `pnpm contract:check`,
195
+ which invokes the installed CLI directly. The installed generator owns its
196
+ release-integrity metadata.
197
+
198
+ Normal installs retain the generated release-age and trust policy. Release
199
+ acceptance uses exact, temporary exceptions for the artifacts being tested;
200
+ it does not add permanent exception lists to the application.
204
201
 
205
202
  ## CodeSmith Adapter And Overlays
206
203
 
@@ -379,13 +376,12 @@ Each generated workspace app has:
379
376
 
380
377
  - `cloudflare:build`, `cloudflare:deploy`, `cloudflare:preview`, and
381
378
  `cloudflare:proof` scripts.
382
- - Cloudflare Worker deploy config from Modern config plus
383
- `.modernjs/ultramodern.json`.
379
+ - Cloudflare Worker deploy config emitted from native Modern config.
384
380
  - `zephyr:dependencies` for any consumed verticals.
385
381
  - `zephyr-rspack-plugin` wired through the generated Modern.js Rspack bridge.
386
382
 
387
383
  Deploy first, then pass each deployed app's generated public URL env key into
388
- the proof step. The proof script reads the compact UltraModern config and checks the
384
+ the proof step. The installed proof command reads topology and deployment contracts and checks the
389
385
  Cloudflare Worker surface, including public-route sitemap/robots consistency,
390
386
  preview noindex behavior, unknown-route status, asset headers, byte budgets,
391
387
  and public sourcemap exposure. Shell-only workspaces only need the shell URL;
@@ -407,10 +403,10 @@ proven.
407
403
 
408
404
  | Symptom | Current check | Owner |
409
405
  | --- | --- | --- |
410
- | Package cohort mismatch | Regenerate with one package source strategy, run `mise install`, then rerun `pnpm install` from the activated shell. | Generated workspace package source metadata |
406
+ | Package version mismatch | Align the native framework catalog and regenerate the lockfile with `pnpm install`. | Workspace dependency manifests |
411
407
  | Install failure | Check the active Node/pnpm from `mise install`; rerun `pnpm install` after the shell sees the pinned versions. | Toolchain setup |
412
408
  | Build failure | Run the matching primitive gate (`pnpm lint`, `pnpm typecheck`, `pnpm i18n:boundaries`, `pnpm contract:check`) before `pnpm build`; fix the owning failure first. | Owning package or generated contract |
413
- | Missing public URL | Set the app public URL env key recorded in `.modernjs/ultramodern.json`, for example `ULTRAMODERN_PUBLIC_URL_SHELL_SUPER_APP`. | Deployment operator |
409
+ | Missing public URL | Set the app public URL env key declared in topology, for example `ULTRAMODERN_PUBLIC_URL_SHELL_SUPER_APP`. | Deployment operator |
414
410
  | Cloudflare credentials | Confirm Wrangler credentials before `pnpm cloudflare:deploy`; local checks do not prove live Worker access. | Deployment operator |
415
411
  | Asset or CSS 404 | Rebuild with `pnpm build` or `pnpm cloudflare:deploy` and inspect emitted Modern/Rspack asset paths instead of hardcoding CSS URLs. | Framework/runtime asset pipeline |
416
412
  | Federation manifest failure | Run the shell and vertical build scripts, then check each deployed `/mf-manifest.json` URL used by the shell. | Module Federation owner |
@@ -37,14 +37,12 @@ var __webpack_require__ = {};
37
37
  var __webpack_exports__ = {};
38
38
  __webpack_require__.r(__webpack_exports__);
39
39
  __webpack_require__.d(__webpack_exports__, {
40
- RELEASE_COHORT_PROJECTION_PATH: ()=>RELEASE_COHORT_PROJECTION_PATH,
40
+ RELEASE_COHORT_PATH: ()=>RELEASE_COHORT_PATH,
41
41
  assertReleaseCohortPackageSource: ()=>assertReleaseCohortPackageSource,
42
- copyCreateReleaseCohort: ()=>copyCreateReleaseCohort,
43
42
  hasCreateReleaseCohort: ()=>hasCreateReleaseCohort,
44
43
  isCreatePackageSourceCheckout: ()=>isCreatePackageSourceCheckout,
45
44
  parseUltramodernReleaseCohort: ()=>parseUltramodernReleaseCohort,
46
45
  readCreateReleaseCohort: ()=>readCreateReleaseCohort,
47
- readWorkspaceReleaseCohort: ()=>readWorkspaceReleaseCohort,
48
46
  releaseCohortSelectors: ()=>releaseCohortSelectors
49
47
  });
50
48
  const external_node_fs_namespaceObject = require("node:fs");
@@ -52,7 +50,7 @@ var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node
52
50
  const external_node_path_namespaceObject = require("node:path");
53
51
  var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
54
52
  const fs_io_cjs_namespaceObject = require("./ultramodern-workspace/fs-io.cjs");
55
- const RELEASE_COHORT_PROJECTION_PATH = '.modernjs/release-cohort.json';
53
+ const RELEASE_COHORT_PATH = 'release-cohort.json';
56
54
  const RELEASE_COHORT_PROJECTION_SCHEMA = 'bleedingdev.ultramodern.release-cohort';
57
55
  const RELEASE_COHORT_PROJECTION_SCHEMA_VERSION = 1;
58
56
  function assert(condition, message) {
@@ -149,23 +147,14 @@ function readCohortFile(filePath) {
149
147
  return parseUltramodernReleaseCohort(value);
150
148
  }
151
149
  function readCreateReleaseCohort() {
152
- return readCohortFile(external_node_path_default().join(fs_io_cjs_namespaceObject.createPackageRoot, 'template-workspace', RELEASE_COHORT_PROJECTION_PATH));
150
+ return readCohortFile(external_node_path_default().join(fs_io_cjs_namespaceObject.createPackageRoot, RELEASE_COHORT_PATH));
153
151
  }
154
152
  function hasCreateReleaseCohort() {
155
- return external_node_fs_default().existsSync(external_node_path_default().join(fs_io_cjs_namespaceObject.createPackageRoot, 'template-workspace', RELEASE_COHORT_PROJECTION_PATH));
153
+ return external_node_fs_default().existsSync(external_node_path_default().join(fs_io_cjs_namespaceObject.createPackageRoot, RELEASE_COHORT_PATH));
156
154
  }
157
155
  function isCreatePackageSourceCheckout() {
158
156
  return external_node_fs_default().existsSync(external_node_path_default().join(fs_io_cjs_namespaceObject.createPackageRoot, 'src'));
159
157
  }
160
- function readWorkspaceReleaseCohort(workspaceRoot) {
161
- return readCohortFile(external_node_path_default().join(workspaceRoot, RELEASE_COHORT_PROJECTION_PATH));
162
- }
163
- function copyCreateReleaseCohort(workspaceRoot) {
164
- const sourcePath = external_node_path_default().join(fs_io_cjs_namespaceObject.createPackageRoot, 'template-workspace', RELEASE_COHORT_PROJECTION_PATH);
165
- const cohort = readCohortFile(sourcePath);
166
- (0, fs_io_cjs_namespaceObject.writeFile)(workspaceRoot, RELEASE_COHORT_PROJECTION_PATH, external_node_fs_default().readFileSync(sourcePath, 'utf8'));
167
- return cohort;
168
- }
169
158
  function assertReleaseCohortPackageSource(cohort, packageSource) {
170
159
  if ('install' !== packageSource.strategy) return;
171
160
  assert(packageSource.modernPackageVersion === cohort.release.version, `Package source release ${packageSource.modernPackageVersion} does not match authenticated release cohort ${cohort.release.version}.`);
@@ -181,24 +170,20 @@ function assertReleaseCohortPackageSource(cohort, packageSource) {
181
170
  function releaseCohortSelectors(cohort) {
182
171
  return cohort.packages.map((item)=>`${item.targetName}@${item.version}`).sort();
183
172
  }
184
- exports.RELEASE_COHORT_PROJECTION_PATH = __webpack_exports__.RELEASE_COHORT_PROJECTION_PATH;
173
+ exports.RELEASE_COHORT_PATH = __webpack_exports__.RELEASE_COHORT_PATH;
185
174
  exports.assertReleaseCohortPackageSource = __webpack_exports__.assertReleaseCohortPackageSource;
186
- exports.copyCreateReleaseCohort = __webpack_exports__.copyCreateReleaseCohort;
187
175
  exports.hasCreateReleaseCohort = __webpack_exports__.hasCreateReleaseCohort;
188
176
  exports.isCreatePackageSourceCheckout = __webpack_exports__.isCreatePackageSourceCheckout;
189
177
  exports.parseUltramodernReleaseCohort = __webpack_exports__.parseUltramodernReleaseCohort;
190
178
  exports.readCreateReleaseCohort = __webpack_exports__.readCreateReleaseCohort;
191
- exports.readWorkspaceReleaseCohort = __webpack_exports__.readWorkspaceReleaseCohort;
192
179
  exports.releaseCohortSelectors = __webpack_exports__.releaseCohortSelectors;
193
180
  for(var __rspack_i in __webpack_exports__)if (-1 === [
194
- "RELEASE_COHORT_PROJECTION_PATH",
181
+ "RELEASE_COHORT_PATH",
195
182
  "assertReleaseCohortPackageSource",
196
- "copyCreateReleaseCohort",
197
183
  "hasCreateReleaseCohort",
198
184
  "isCreatePackageSourceCheckout",
199
185
  "parseUltramodernReleaseCohort",
200
186
  "readCreateReleaseCohort",
201
- "readWorkspaceReleaseCohort",
202
187
  "releaseCohortSelectors"
203
188
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
204
189
  Object.defineProperty(exports, '__esModule', {
@@ -47,6 +47,7 @@ __webpack_require__.d(__webpack_exports__, {
47
47
  spawnNodeScript: ()=>spawnNodeScript
48
48
  });
49
49
  const external_node_child_process_namespaceObject = require("node:child_process");
50
+ const external_node_os_namespaceObject = require("node:os");
50
51
  const external_node_path_namespaceObject = require("node:path");
51
52
  var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
52
53
  const external_node_url_namespaceObject = require("node:url");
@@ -86,7 +87,7 @@ function spawnNodeScript(relativeScriptPath, args, context, options = {}) {
86
87
  stdio: 'inherit'
87
88
  });
88
89
  if (result.error) throw result.error;
89
- return result.status ?? 1;
90
+ return result.status ?? (result.signal ? 128 + external_node_os_namespaceObject.constants.signals[result.signal] : 1);
90
91
  }
91
92
  function runTemplateBackedToolingCommand(command, args, context) {
92
93
  const toolingCommand = tooling_command_catalog_cjs_namespaceObject.generatedToolingCommands.find((candidate)=>candidate.command === command);
@@ -1,14 +1,5 @@
1
1
  "use strict";
2
2
  var __webpack_require__ = {};
3
- (()=>{
4
- __webpack_require__.n = (module)=>{
5
- var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
- __webpack_require__.d(getter, {
7
- a: getter
8
- });
9
- return getter;
10
- };
11
- })();
12
3
  (()=>{
13
4
  __webpack_require__.d = (exports1, getters, values)=>{
14
5
  var define = (defs, kind)=>{
@@ -39,58 +30,12 @@ __webpack_require__.r(__webpack_exports__);
39
30
  __webpack_require__.d(__webpack_exports__, {
40
31
  runValidate: ()=>runValidate
41
32
  });
42
- const external_node_path_namespaceObject = require("node:path");
43
- var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
44
- const external_ultramodern_release_cohort_cjs_namespaceObject = require("../../ultramodern-release-cohort.cjs");
45
- const cohort_parity_cjs_namespaceObject = require("../../ultramodern-workspace/cohort-parity.cjs");
46
- const contracts_cjs_namespaceObject = require("../../ultramodern-workspace/contracts.cjs");
47
- const descriptors_cjs_namespaceObject = require("../../ultramodern-workspace/descriptors.cjs");
48
- const patch_parity_cjs_namespaceObject = require("../../ultramodern-workspace/patch-parity.cjs");
49
33
  const workspace_cjs_namespaceObject = require("../../ultramodern-workspace/validation/workspace.cjs");
50
34
  const workspace_validation_contract_cjs_namespaceObject = require("../../ultramodern-workspace/workspace-validation-contract.cjs");
51
35
  const external_config_cjs_namespaceObject = require("../config.cjs");
52
- const external_context_cjs_namespaceObject = require("./context.cjs");
53
36
  function runValidate(context) {
54
- const patchProblems = (0, patch_parity_cjs_namespaceObject.checkPatchParity)({
55
- workspaceRoot: context.workspaceRoot,
56
- createPackageRoot: external_context_cjs_namespaceObject.createPackageRoot
57
- });
58
- if (patchProblems.length > 0) {
59
- process.stderr.write(`${(0, patch_parity_cjs_namespaceObject.formatPatchParityReport)(patchProblems)}\n`);
60
- return 1;
61
- }
62
- const workspace = (0, external_config_cjs_namespaceObject.readUltramodernWorkspaceInputs)(context.workspaceRoot, {
63
- overlay: (0, external_config_cjs_namespaceObject.readJsonObject)(external_node_path_default().join(context.workspaceRoot, 'topology/local-overlays/development.json'))
64
- });
65
- const { config, verticals: remotes, primaryShell, additionalShells } = workspace;
66
- const compactApps = (0, external_config_cjs_namespaceObject.workspaceAppsFromToolingConfig)(config, context.workspaceRoot);
67
- const compactPrimaryShell = compactApps.find((app)=>'shell' === app.kind) ?? (0, descriptors_cjs_namespaceObject.createShellHost)(remotes);
68
- const compactConfig = (0, contracts_cjs_namespaceObject.createUltramodernConfig)(config.workspace.packageScope, 'workspace-validation-contract', {
69
- strategy: 'workspace',
70
- modernPackageVersion: 'workspace:*'
71
- }, compactApps, config.features.tailwind, void 0, additionalShells, compactPrimaryShell, remotes);
72
- const declaredCompact = (0, external_config_cjs_namespaceObject.readJsonObject)(config.sourcePath);
73
- const compactTopology = compactConfig.topology;
74
- for (const app of compactTopology.apps){
75
- const declared = declaredCompact.topology?.apps?.find((entry)=>entry.id === app.id)?.deploy?.cloudflare;
76
- for (const key of [
77
- 'routes',
78
- 'distributedSsrProofRoutes',
79
- 'jsonSmokeChecks'
80
- ])if (declared && Object.hasOwn(declared, key)) app.deploy.cloudflare[key] = declared[key];
81
- }
82
- const cohortProblem = (0, cohort_parity_cjs_namespaceObject.checkReleaseCohortParity)({
83
- workspaceRoot: context.workspaceRoot,
84
- createPackageRoot: external_context_cjs_namespaceObject.createPackageRoot,
85
- requireTemplate: config.packageSource?.strategy === 'install'
86
- });
87
- if (cohortProblem) {
88
- process.stderr.write(`${(0, cohort_parity_cjs_namespaceObject.formatReleaseCohortParityReport)(cohortProblem)}\n`);
89
- return 1;
90
- }
91
- const releaseCohort = config.packageSource?.strategy === 'install' ? (0, external_ultramodern_release_cohort_cjs_namespaceObject.readWorkspaceReleaseCohort)(context.workspaceRoot) : void 0;
92
- const contract = (0, workspace_validation_contract_cjs_namespaceObject.createWorkspaceValidationContract)(config.workspace.packageScope, config.features.tailwind, remotes, releaseCohort, additionalShells, primaryShell, compactConfig, (0, external_config_cjs_namespaceObject.readJsonObject)(external_node_path_default().join(context.workspaceRoot, 'topology/ownership.json')), void 0, context.workspaceRoot);
93
- (0, workspace_cjs_namespaceObject.validateWorkspace)(context.workspaceRoot, contract);
37
+ const { config, raw, verticals, primaryShell, additionalShells } = (0, external_config_cjs_namespaceObject.readUltramodernWorkspaceInputs)(context.workspaceRoot);
38
+ (0, workspace_cjs_namespaceObject.validateWorkspace)(context.workspaceRoot, (0, workspace_validation_contract_cjs_namespaceObject.createWorkspaceValidationContract)(config.workspace.packageScope, config.features.tailwind, raw.topology.sharedPackages, verticals, additionalShells, primaryShell));
94
39
  return 0;
95
40
  }
96
41
  exports.runValidate = __webpack_exports__.runValidate;
@@ -39,6 +39,8 @@ __webpack_require__.r(__webpack_exports__);
39
39
  __webpack_require__.d(__webpack_exports__, {
40
40
  runUltramodernToolingCli: ()=>runUltramodernToolingCli
41
41
  });
42
+ const external_node_fs_namespaceObject = require("node:fs");
43
+ var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
42
44
  const external_node_path_namespaceObject = require("node:path");
43
45
  var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
44
46
  const tooling_command_catalog_cjs_namespaceObject = require("../ultramodern-workspace/tooling-command-catalog.cjs");
@@ -52,8 +54,16 @@ const validate_cjs_namespaceObject = require("./commands/validate.cjs");
52
54
  async function runUltramodernToolingCli(args, workspaceRoot = process.env.ULTRAMODERN_WORKSPACE_ROOT ?? process.cwd()) {
53
55
  try {
54
56
  const [command, ...rest] = args;
57
+ let discoveredRoot = external_node_path_default().resolve(workspaceRoot);
58
+ for(let candidate = discoveredRoot;; candidate = external_node_path_default().dirname(candidate)){
59
+ if (external_node_fs_default().existsSync(external_node_path_default().join(candidate, 'topology/reference-topology.json'))) {
60
+ discoveredRoot = candidate;
61
+ break;
62
+ }
63
+ if (external_node_path_default().dirname(candidate) === candidate) break;
64
+ }
55
65
  const context = {
56
- workspaceRoot: external_node_path_default().resolve(workspaceRoot),
66
+ workspaceRoot: discoveredRoot,
57
67
  invocationCwd: process.cwd()
58
68
  };
59
69
  switch(command){
@@ -6,6 +6,9 @@ var __webpack_modules__ = {
6
6
  "./load" (module) {
7
7
  module.exports = require("./load.cjs");
8
8
  },
9
+ "./metadata" (module) {
10
+ module.exports = require("./metadata.cjs");
11
+ },
9
12
  "./normalize" (module) {
10
13
  module.exports = require("./normalize.cjs");
11
14
  },
@@ -68,13 +71,17 @@ var __webpack_exports__ = {};
68
71
  var __rspack_reexport = {};
69
72
  for(const __rspack_import_key in _load__rspack_import_1)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_load__rspack_import_1[__rspack_import_key];
70
73
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
71
- var _normalize__rspack_import_2 = __webpack_require__("./normalize");
74
+ var _metadata__rspack_import_2 = __webpack_require__("./metadata");
75
+ var __rspack_reexport = {};
76
+ for(const __rspack_import_key in _metadata__rspack_import_2)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_metadata__rspack_import_2[__rspack_import_key];
77
+ __webpack_require__.d(__webpack_exports__, __rspack_reexport);
78
+ var _normalize__rspack_import_3 = __webpack_require__("./normalize");
72
79
  var __rspack_reexport = {};
73
- for(const __rspack_import_key in _normalize__rspack_import_2)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_normalize__rspack_import_2[__rspack_import_key];
80
+ for(const __rspack_import_key in _normalize__rspack_import_3)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_normalize__rspack_import_3[__rspack_import_key];
74
81
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
75
- var _types__rspack_import_3 = __webpack_require__("./types");
82
+ var _types__rspack_import_4 = __webpack_require__("./types");
76
83
  var __rspack_reexport = {};
77
- for(const __rspack_import_key in _types__rspack_import_3)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_types__rspack_import_3[__rspack_import_key];
84
+ for(const __rspack_import_key in _types__rspack_import_4)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_types__rspack_import_4[__rspack_import_key];
78
85
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
79
86
  })();
80
87
  for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
@@ -40,31 +40,18 @@ __webpack_require__.d(__webpack_exports__, {
40
40
  readUltramodernConfig: ()=>readUltramodernConfig,
41
41
  readUltramodernWorkspaceInputs: ()=>readUltramodernWorkspaceInputs
42
42
  });
43
- const external_node_fs_namespaceObject = require("node:fs");
44
- var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
45
43
  const external_node_path_namespaceObject = require("node:path");
46
44
  var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
47
- const descriptors_cjs_namespaceObject = require("../../ultramodern-workspace/descriptors.cjs");
48
45
  const external_json_cjs_namespaceObject = require("./json.cjs");
49
46
  const external_normalize_cjs_namespaceObject = require("./normalize.cjs");
50
47
  function readUltramodernConfig(workspaceRoot = process.cwd()) {
51
- const { sourcePath, config } = readCompactInputs(workspaceRoot);
52
- return (0, external_normalize_cjs_namespaceObject.normalizeCompactConfig)(workspaceRoot, sourcePath, config);
48
+ return readUltramodernWorkspaceInputs(workspaceRoot).config;
53
49
  }
54
50
  function readUltramodernWorkspaceInputs(workspaceRoot = process.cwd(), inputs = {}) {
55
- const { sourcePath, config } = readCompactInputs(workspaceRoot);
56
51
  return (0, external_normalize_cjs_namespaceObject.normalizeWorkspaceInputs)(workspaceRoot, {
57
- ...inputs,
58
- config
59
- }, sourcePath);
60
- }
61
- function readCompactInputs(workspaceRoot) {
62
- const compactPath = external_node_path_default().join(workspaceRoot, descriptors_cjs_namespaceObject.ULTRAMODERN_CONFIG_PATH);
63
- if (external_node_fs_default().existsSync(compactPath)) return {
64
- sourcePath: compactPath,
65
- config: (0, external_json_cjs_namespaceObject.readJsonObject)(compactPath)
66
- };
67
- throw new Error(`Missing UltraModern config. Expected ${descriptors_cjs_namespaceObject.ULTRAMODERN_CONFIG_PATH}.`);
52
+ topology: inputs.topology ?? (0, external_json_cjs_namespaceObject.readJsonObject)(external_node_path_default().join(workspaceRoot, 'topology/reference-topology.json')),
53
+ overlay: inputs.overlay ?? (0, external_json_cjs_namespaceObject.readJsonObject)(external_node_path_default().join(workspaceRoot, 'topology/local-overlays/development.json'))
54
+ });
68
55
  }
69
56
  exports.readUltramodernConfig = __webpack_exports__.readUltramodernConfig;
70
57
  exports.readUltramodernWorkspaceInputs = __webpack_exports__.readUltramodernWorkspaceInputs;
@@ -37,18 +37,57 @@ var __webpack_require__ = {};
37
37
  var __webpack_exports__ = {};
38
38
  __webpack_require__.r(__webpack_exports__);
39
39
  __webpack_require__.d(__webpack_exports__, {
40
- packageScopeFromRoot: ()=>packageScopeFromRoot
40
+ packageScopeFromRoot: ()=>packageScopeFromRoot,
41
+ readWorkspacePackageSource: ()=>readWorkspacePackageSource
41
42
  });
43
+ const external_node_fs_namespaceObject = require("node:fs");
44
+ var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
42
45
  const external_node_path_namespaceObject = require("node:path");
43
46
  var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
47
+ const utils_namespaceObject = require("@modern-js/utils");
44
48
  const external_json_cjs_namespaceObject = require("./json.cjs");
45
49
  function packageScopeFromRoot(workspaceRoot) {
46
50
  const rootPackage = (0, external_json_cjs_namespaceObject.readOptionalJsonObject)(external_node_path_default().join(workspaceRoot, 'package.json'));
47
51
  return 'string' == typeof rootPackage.name && rootPackage.name.length > 0 ? rootPackage.name : external_node_path_default().basename(workspaceRoot);
48
52
  }
53
+ function readWorkspacePackageSource(workspaceRoot) {
54
+ const manifest = (0, external_json_cjs_namespaceObject.readOptionalJsonObject)(external_node_path_default().join(workspaceRoot, 'package.json'));
55
+ const name = '@modern-js/ultramodern-create';
56
+ let request = manifest.devDependencies?.[name] ?? manifest.dependencies?.[name];
57
+ if ('string' != typeof request) throw new Error(`Missing ${name} dependency in package.json.`);
58
+ if (request.startsWith('catalog:')) {
59
+ const config = utils_namespaceObject.yaml.load(external_node_fs_default().readFileSync(external_node_path_default().join(workspaceRoot, 'pnpm-workspace.yaml'), 'utf8'));
60
+ const catalog = request.slice(8);
61
+ request = (catalog ? config.catalogs?.[catalog] : config.catalog)?.[name];
62
+ if ('string' != typeof request) throw new Error(`Missing ${name} in pnpm catalog ${catalog || 'default'}.`);
63
+ }
64
+ if (request.startsWith('workspace:')) return {
65
+ strategy: 'workspace',
66
+ modernPackageVersion: 'workspace:*'
67
+ };
68
+ const alias = /^npm:@([^/]+)\/([^@]+)@([^@]+)$/u.exec(request);
69
+ if (alias) {
70
+ const [, aliasScope, target, modernPackageVersion] = alias;
71
+ const suffix = 'ultramodern-create';
72
+ if (!target.endsWith(suffix)) throw new Error(`Unsupported framework package alias: ${request}.`);
73
+ return {
74
+ strategy: 'install',
75
+ modernPackageVersion,
76
+ aliasScope,
77
+ aliasPackageNamePrefix: target.slice(0, -suffix.length)
78
+ };
79
+ }
80
+ if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u.test(request)) throw new Error(`Framework dependency must use an exact version or workspace source: ${request}.`);
81
+ return {
82
+ strategy: 'install',
83
+ modernPackageVersion: request
84
+ };
85
+ }
49
86
  exports.packageScopeFromRoot = __webpack_exports__.packageScopeFromRoot;
87
+ exports.readWorkspacePackageSource = __webpack_exports__.readWorkspacePackageSource;
50
88
  for(var __rspack_i in __webpack_exports__)if (-1 === [
51
- "packageScopeFromRoot"
89
+ "packageScopeFromRoot",
90
+ "readWorkspacePackageSource"
52
91
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
53
92
  Object.defineProperty(exports, '__esModule', {
54
93
  value: true