@bleedingdev/modern-js-create 3.5.0-ultramodern.4 → 3.5.0-ultramodern.40
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.
- package/README.md +28 -28
- package/dist/cjs/cli/flags.cjs +295 -0
- package/dist/cjs/cli/help.cjs +105 -0
- package/dist/cjs/cli/package-source.cjs +183 -0
- package/dist/cjs/cli/project-setup.cjs +138 -0
- package/dist/cjs/cli/prompts.cjs +100 -0
- package/dist/cjs/index.cjs +22 -584
- package/dist/cjs/locale/en.cjs +2 -6
- package/dist/cjs/locale/zh.cjs +2 -6
- package/dist/cjs/ultramodern-package-source.cjs +0 -32
- package/dist/cjs/ultramodern-tooling/commands/cloudflare-output-verify.cjs +132 -0
- package/dist/cjs/ultramodern-tooling/commands/context.cjs +131 -0
- package/dist/cjs/ultramodern-tooling/commands/mf-types.cjs +55 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.cjs +158 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.cjs +50 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.cjs +87 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.cjs +58 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.cjs +62 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.cjs +60 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.cjs +132 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.cjs +67 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.cjs +93 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.cjs +60 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.cjs +67 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.cjs +67 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/help.cjs +54 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/install.cjs +52 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/io.cjs +133 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.cjs +245 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-source.cjs +76 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.cjs +142 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.cjs +155 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.cjs +155 -0
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect.cjs +149 -0
- package/dist/cjs/ultramodern-tooling/commands/options.cjs +59 -0
- package/dist/cjs/ultramodern-tooling/commands/routes-generate.cjs +122 -0
- package/dist/cjs/ultramodern-tooling/commands/skills.cjs +49 -0
- package/dist/cjs/ultramodern-tooling/commands/sync-delivery-unit.cjs +40 -0
- package/dist/cjs/ultramodern-tooling/commands/validate.cjs +49 -0
- package/dist/cjs/ultramodern-tooling/commands.cjs +27 -485
- package/dist/cjs/ultramodern-tooling/config/constants.cjs +48 -0
- package/dist/cjs/ultramodern-tooling/config/index.cjs +104 -0
- package/dist/cjs/ultramodern-tooling/config/json.cjs +61 -0
- package/dist/cjs/ultramodern-tooling/config/load.cjs +62 -0
- package/dist/cjs/ultramodern-tooling/config/metadata.cjs +92 -0
- package/dist/cjs/ultramodern-tooling/config/normalize.cjs +160 -0
- package/dist/cjs/ultramodern-tooling/config/synthesize.cjs +157 -0
- package/dist/cjs/ultramodern-tooling/config/types.cjs +18 -0
- package/dist/cjs/ultramodern-tooling/config.cjs +23 -133
- package/dist/cjs/ultramodern-workspace/add-vertical/constants.cjs +52 -0
- package/dist/cjs/ultramodern-workspace/add-vertical/execute.cjs +156 -0
- package/dist/cjs/ultramodern-workspace/add-vertical/plan.cjs +234 -0
- package/dist/cjs/ultramodern-workspace/add-vertical/preflight.cjs +174 -0
- package/dist/cjs/ultramodern-workspace/add-vertical/shell-files.cjs +116 -0
- package/dist/cjs/ultramodern-workspace/add-vertical/topology.cjs +135 -0
- package/dist/cjs/ultramodern-workspace/add-vertical/workspace-state.cjs +107 -0
- package/dist/cjs/ultramodern-workspace/add-vertical.cjs +22 -571
- package/dist/cjs/ultramodern-workspace/api/checkout-cart.cjs +145 -0
- package/dist/cjs/ultramodern-workspace/api/client.cjs +218 -0
- package/dist/cjs/ultramodern-workspace/api/contracts.cjs +222 -0
- package/dist/cjs/ultramodern-workspace/api/names.cjs +98 -0
- package/dist/cjs/ultramodern-workspace/api/service.cjs +220 -0
- package/dist/cjs/ultramodern-workspace/api/shared.cjs +252 -0
- package/dist/cjs/ultramodern-workspace/api.cjs +29 -1004
- package/dist/cjs/ultramodern-workspace/app-files.cjs +12 -51
- package/dist/cjs/ultramodern-workspace/backend-federation.cjs +296 -0
- package/dist/cjs/ultramodern-workspace/bridge-config/cli.cjs +71 -0
- package/dist/cjs/ultramodern-workspace/bridge-config/defaults.cjs +43 -0
- package/dist/cjs/ultramodern-workspace/bridge-config/gates.cjs +93 -0
- package/dist/cjs/ultramodern-workspace/bridge-config/index.cjs +60 -0
- package/dist/cjs/ultramodern-workspace/bridge-config/normalize.cjs +68 -0
- package/dist/cjs/ultramodern-workspace/bridge-config/schema.cjs +78 -0
- package/dist/cjs/ultramodern-workspace/bridge-config/shared.cjs +110 -0
- package/dist/cjs/ultramodern-workspace/bridge-config/validation.cjs +68 -0
- package/dist/cjs/ultramodern-workspace/bridge-config/workspace-packages.cjs +108 -0
- package/dist/cjs/ultramodern-workspace/bridge-config.cjs +32 -297
- package/dist/cjs/ultramodern-workspace/contracts.cjs +40 -15
- package/dist/cjs/ultramodern-workspace/delivery-unit-sync.cjs +159 -0
- package/dist/cjs/ultramodern-workspace/delivery-unit.cjs +75 -0
- package/dist/cjs/ultramodern-workspace/demo-components.cjs +47 -192
- package/dist/cjs/ultramodern-workspace/descriptors.cjs +36 -1
- package/dist/cjs/ultramodern-workspace/effect-diagnostics.cjs +114 -0
- package/dist/cjs/ultramodern-workspace/fs-io.cjs +24 -35
- package/dist/cjs/ultramodern-workspace/index.cjs +4 -0
- package/dist/cjs/ultramodern-workspace/locales.cjs +1 -14
- package/dist/cjs/ultramodern-workspace/mf-validation/constants.cjs +69 -0
- package/dist/cjs/ultramodern-workspace/mf-validation/discovery.cjs +77 -0
- package/dist/cjs/ultramodern-workspace/mf-validation/inspect.cjs +84 -0
- package/dist/cjs/ultramodern-workspace/mf-validation/object-literal.cjs +188 -0
- package/dist/cjs/ultramodern-workspace/mf-validation/path-utils.cjs +165 -0
- package/dist/cjs/ultramodern-workspace/mf-validation/syntax.cjs +201 -0
- package/dist/cjs/ultramodern-workspace/mf-validation/types.cjs +18 -0
- package/dist/cjs/ultramodern-workspace/mf-validation/validate.cjs +112 -0
- package/dist/cjs/ultramodern-workspace/mf-validation.cjs +6 -529
- package/dist/cjs/ultramodern-workspace/module-federation/config.cjs +262 -0
- package/dist/cjs/ultramodern-workspace/module-federation/index.cjs +73 -0
- package/dist/cjs/ultramodern-workspace/module-federation/reexport-module.cjs +74 -0
- package/dist/cjs/ultramodern-workspace/module-federation/remote-refs.cjs +105 -0
- package/dist/cjs/ultramodern-workspace/module-federation/shared-config.cjs +53 -0
- package/dist/cjs/ultramodern-workspace/module-federation.cjs +18 -477
- package/dist/cjs/ultramodern-workspace/naming.cjs +0 -6
- package/dist/cjs/ultramodern-workspace/package-json.cjs +27 -269
- package/dist/cjs/ultramodern-workspace/policy.cjs +0 -21
- package/dist/cjs/ultramodern-workspace/public-surface.cjs +0 -21
- package/dist/cjs/ultramodern-workspace/routes.cjs +8 -157
- package/dist/cjs/ultramodern-workspace/shared-patches.cjs +45 -0
- package/dist/cjs/ultramodern-workspace/tooling-command-catalog.cjs +147 -0
- package/dist/cjs/ultramodern-workspace/tsconfigs.cjs +199 -0
- package/dist/cjs/ultramodern-workspace/versions.cjs +31 -38
- package/dist/cjs/ultramodern-workspace/workspace-script-plan.cjs +163 -0
- package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +96 -73
- package/dist/cjs/ultramodern-workspace/workspace-validation-contract.cjs +97 -0
- package/dist/cjs/ultramodern-workspace/write-app.cjs +125 -0
- package/dist/cjs/ultramodern-workspace/write-workspace.cjs +13 -63
- package/dist/cjs/ultramodern-workspace/zerops.cjs +103 -0
- package/dist/esm/cli/flags.js +218 -0
- package/dist/esm/cli/help.js +64 -0
- package/dist/esm/cli/package-source.js +119 -0
- package/dist/esm/cli/project-setup.js +81 -0
- package/dist/esm/cli/prompts.js +51 -0
- package/dist/esm/index.js +6 -564
- package/dist/esm/locale/en.js +2 -6
- package/dist/esm/locale/zh.js +2 -6
- package/dist/esm/ultramodern-package-source.js +1 -24
- package/dist/esm/ultramodern-tooling/commands/cloudflare-output-verify.js +84 -0
- package/dist/esm/ultramodern-tooling/commands/context.js +66 -0
- package/dist/esm/ultramodern-tooling/commands/mf-types.js +17 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.js +106 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.js +12 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.js +38 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.js +10 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +14 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +12 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.js +83 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.js +16 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +44 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.js +12 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.js +7 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.js +15 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/help.js +16 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/install.js +14 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/io.js +69 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +201 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-source.js +38 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +87 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +105 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.js +71 -0
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect.js +100 -0
- package/dist/esm/ultramodern-tooling/commands/options.js +18 -0
- package/dist/esm/ultramodern-tooling/commands/routes-generate.js +74 -0
- package/dist/esm/ultramodern-tooling/commands/skills.js +11 -0
- package/dist/esm/ultramodern-tooling/commands/sync-delivery-unit.js +1 -0
- package/dist/esm/ultramodern-tooling/commands/validate.js +11 -0
- package/dist/esm/ultramodern-tooling/commands.js +22 -475
- package/dist/esm/ultramodern-tooling/config/constants.js +4 -0
- package/dist/esm/ultramodern-tooling/config/index.js +7 -0
- package/dist/esm/ultramodern-tooling/config/json.js +10 -0
- package/dist/esm/ultramodern-tooling/config/load.js +13 -0
- package/dist/esm/ultramodern-tooling/config/metadata.js +37 -0
- package/dist/esm/ultramodern-tooling/config/normalize.js +106 -0
- package/dist/esm/ultramodern-tooling/config/synthesize.js +108 -0
- package/dist/esm/ultramodern-tooling/config/types.js +0 -0
- package/dist/esm/ultramodern-tooling/config.js +1 -120
- package/dist/esm/ultramodern-workspace/add-vertical/constants.js +5 -0
- package/dist/esm/ultramodern-workspace/add-vertical/execute.js +108 -0
- package/dist/esm/ultramodern-workspace/add-vertical/plan.js +184 -0
- package/dist/esm/ultramodern-workspace/add-vertical/preflight.js +122 -0
- package/dist/esm/ultramodern-workspace/add-vertical/shell-files.js +59 -0
- package/dist/esm/ultramodern-workspace/add-vertical/topology.js +91 -0
- package/dist/esm/ultramodern-workspace/add-vertical/workspace-state.js +43 -0
- package/dist/esm/ultramodern-workspace/add-vertical.js +6 -544
- package/dist/esm/ultramodern-workspace/api/checkout-cart.js +86 -0
- package/dist/esm/ultramodern-workspace/api/client.js +177 -0
- package/dist/esm/ultramodern-workspace/api/contracts.js +172 -0
- package/dist/esm/ultramodern-workspace/api/names.js +33 -0
- package/dist/esm/ultramodern-workspace/api/service.js +179 -0
- package/dist/esm/ultramodern-workspace/api/shared.js +208 -0
- package/dist/esm/ultramodern-workspace/api.js +5 -984
- package/dist/esm/ultramodern-workspace/app-files.js +11 -32
- package/dist/esm/ultramodern-workspace/backend-federation.js +231 -0
- package/dist/esm/ultramodern-workspace/bridge-config/cli.js +30 -0
- package/dist/esm/ultramodern-workspace/bridge-config/defaults.js +5 -0
- package/dist/esm/ultramodern-workspace/bridge-config/gates.js +52 -0
- package/dist/esm/ultramodern-workspace/bridge-config/index.js +3 -0
- package/dist/esm/ultramodern-workspace/bridge-config/normalize.js +30 -0
- package/dist/esm/ultramodern-workspace/bridge-config/schema.js +31 -0
- package/dist/esm/ultramodern-workspace/bridge-config/shared.js +51 -0
- package/dist/esm/ultramodern-workspace/bridge-config/validation.js +27 -0
- package/dist/esm/ultramodern-workspace/bridge-config/workspace-packages.js +67 -0
- package/dist/esm/ultramodern-workspace/bridge-config.js +1 -270
- package/dist/esm/ultramodern-workspace/contracts.js +40 -15
- package/dist/esm/ultramodern-workspace/delivery-unit-sync.js +110 -0
- package/dist/esm/ultramodern-workspace/delivery-unit.js +21 -0
- package/dist/esm/ultramodern-workspace/demo-components.js +48 -190
- package/dist/esm/ultramodern-workspace/descriptors.js +25 -2
- package/dist/esm/ultramodern-workspace/effect-diagnostics.js +76 -0
- package/dist/esm/ultramodern-workspace/fs-io.js +25 -17
- package/dist/esm/ultramodern-workspace/index.js +1 -0
- package/dist/esm/ultramodern-workspace/locales.js +1 -1
- package/dist/esm/ultramodern-workspace/mf-validation/constants.js +19 -0
- package/dist/esm/ultramodern-workspace/mf-validation/discovery.js +28 -0
- package/dist/esm/ultramodern-workspace/mf-validation/inspect.js +46 -0
- package/dist/esm/ultramodern-workspace/mf-validation/object-literal.js +144 -0
- package/dist/esm/ultramodern-workspace/mf-validation/path-utils.js +89 -0
- package/dist/esm/ultramodern-workspace/mf-validation/syntax.js +154 -0
- package/dist/esm/ultramodern-workspace/mf-validation/types.js +0 -0
- package/dist/esm/ultramodern-workspace/mf-validation/validate.js +57 -0
- package/dist/esm/ultramodern-workspace/mf-validation.js +3 -516
- package/dist/esm/ultramodern-workspace/module-federation/config.js +215 -0
- package/dist/esm/ultramodern-workspace/module-federation/index.js +4 -0
- package/dist/esm/ultramodern-workspace/module-federation/reexport-module.js +30 -0
- package/dist/esm/ultramodern-workspace/module-federation/remote-refs.js +64 -0
- package/dist/esm/ultramodern-workspace/module-federation/shared-config.js +12 -0
- package/dist/esm/ultramodern-workspace/module-federation.js +2 -458
- package/dist/esm/ultramodern-workspace/naming.js +1 -1
- package/dist/esm/ultramodern-workspace/package-json.js +22 -252
- package/dist/esm/ultramodern-workspace/policy.js +1 -7
- package/dist/esm/ultramodern-workspace/public-surface.js +1 -1
- package/dist/esm/ultramodern-workspace/routes.js +9 -143
- package/dist/esm/ultramodern-workspace/shared-patches.js +7 -0
- package/dist/esm/ultramodern-workspace/tooling-command-catalog.js +100 -0
- package/dist/esm/ultramodern-workspace/tsconfigs.js +136 -0
- package/dist/esm/ultramodern-workspace/versions.js +23 -24
- package/dist/esm/ultramodern-workspace/workspace-script-plan.js +116 -0
- package/dist/esm/ultramodern-workspace/workspace-scripts.js +92 -69
- package/dist/esm/ultramodern-workspace/workspace-validation-contract.js +59 -0
- package/dist/esm/ultramodern-workspace/write-app.js +87 -0
- package/dist/esm/ultramodern-workspace/write-workspace.js +14 -61
- package/dist/esm/ultramodern-workspace/zerops.js +65 -0
- package/dist/esm-node/cli/flags.js +219 -0
- package/dist/esm-node/cli/help.js +65 -0
- package/dist/esm-node/cli/package-source.js +120 -0
- package/dist/esm-node/cli/project-setup.js +82 -0
- package/dist/esm-node/cli/prompts.js +52 -0
- package/dist/esm-node/index.js +6 -564
- package/dist/esm-node/locale/en.js +2 -6
- package/dist/esm-node/locale/zh.js +2 -6
- package/dist/esm-node/ultramodern-package-source.js +1 -24
- package/dist/esm-node/ultramodern-tooling/commands/cloudflare-output-verify.js +85 -0
- package/dist/esm-node/ultramodern-tooling/commands/context.js +67 -0
- package/dist/esm-node/ultramodern-tooling/commands/mf-types.js +18 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.js +107 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.js +13 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.js +39 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.js +11 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +15 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +13 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.js +84 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.js +17 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +45 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.js +13 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.js +8 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.js +16 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/help.js +17 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/install.js +15 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/io.js +70 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +202 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-source.js +39 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +88 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +106 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.js +72 -0
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect.js +101 -0
- package/dist/esm-node/ultramodern-tooling/commands/options.js +19 -0
- package/dist/esm-node/ultramodern-tooling/commands/routes-generate.js +75 -0
- package/dist/esm-node/ultramodern-tooling/commands/skills.js +12 -0
- package/dist/esm-node/ultramodern-tooling/commands/sync-delivery-unit.js +2 -0
- package/dist/esm-node/ultramodern-tooling/commands/validate.js +12 -0
- package/dist/esm-node/ultramodern-tooling/commands.js +22 -475
- package/dist/esm-node/ultramodern-tooling/config/constants.js +5 -0
- package/dist/esm-node/ultramodern-tooling/config/index.js +8 -0
- package/dist/esm-node/ultramodern-tooling/config/json.js +11 -0
- package/dist/esm-node/ultramodern-tooling/config/load.js +14 -0
- package/dist/esm-node/ultramodern-tooling/config/metadata.js +38 -0
- package/dist/esm-node/ultramodern-tooling/config/normalize.js +107 -0
- package/dist/esm-node/ultramodern-tooling/config/synthesize.js +109 -0
- package/dist/esm-node/ultramodern-tooling/config/types.js +1 -0
- package/dist/esm-node/ultramodern-tooling/config.js +1 -120
- package/dist/esm-node/ultramodern-workspace/add-vertical/constants.js +6 -0
- package/dist/esm-node/ultramodern-workspace/add-vertical/execute.js +109 -0
- package/dist/esm-node/ultramodern-workspace/add-vertical/plan.js +185 -0
- package/dist/esm-node/ultramodern-workspace/add-vertical/preflight.js +123 -0
- package/dist/esm-node/ultramodern-workspace/add-vertical/shell-files.js +60 -0
- package/dist/esm-node/ultramodern-workspace/add-vertical/topology.js +92 -0
- package/dist/esm-node/ultramodern-workspace/add-vertical/workspace-state.js +44 -0
- package/dist/esm-node/ultramodern-workspace/add-vertical.js +6 -544
- package/dist/esm-node/ultramodern-workspace/api/checkout-cart.js +87 -0
- package/dist/esm-node/ultramodern-workspace/api/client.js +178 -0
- package/dist/esm-node/ultramodern-workspace/api/contracts.js +173 -0
- package/dist/esm-node/ultramodern-workspace/api/names.js +34 -0
- package/dist/esm-node/ultramodern-workspace/api/service.js +180 -0
- package/dist/esm-node/ultramodern-workspace/api/shared.js +209 -0
- package/dist/esm-node/ultramodern-workspace/api.js +5 -984
- package/dist/esm-node/ultramodern-workspace/app-files.js +11 -32
- package/dist/esm-node/ultramodern-workspace/backend-federation.js +232 -0
- package/dist/esm-node/ultramodern-workspace/bridge-config/cli.js +31 -0
- package/dist/esm-node/ultramodern-workspace/bridge-config/defaults.js +6 -0
- package/dist/esm-node/ultramodern-workspace/bridge-config/gates.js +53 -0
- package/dist/esm-node/ultramodern-workspace/bridge-config/index.js +4 -0
- package/dist/esm-node/ultramodern-workspace/bridge-config/normalize.js +31 -0
- package/dist/esm-node/ultramodern-workspace/bridge-config/schema.js +32 -0
- package/dist/esm-node/ultramodern-workspace/bridge-config/shared.js +52 -0
- package/dist/esm-node/ultramodern-workspace/bridge-config/validation.js +28 -0
- package/dist/esm-node/ultramodern-workspace/bridge-config/workspace-packages.js +68 -0
- package/dist/esm-node/ultramodern-workspace/bridge-config.js +1 -270
- package/dist/esm-node/ultramodern-workspace/contracts.js +40 -15
- package/dist/esm-node/ultramodern-workspace/delivery-unit-sync.js +111 -0
- package/dist/esm-node/ultramodern-workspace/delivery-unit.js +22 -0
- package/dist/esm-node/ultramodern-workspace/demo-components.js +48 -190
- package/dist/esm-node/ultramodern-workspace/descriptors.js +25 -2
- package/dist/esm-node/ultramodern-workspace/effect-diagnostics.js +77 -0
- package/dist/esm-node/ultramodern-workspace/fs-io.js +25 -17
- package/dist/esm-node/ultramodern-workspace/index.js +1 -0
- package/dist/esm-node/ultramodern-workspace/locales.js +1 -1
- package/dist/esm-node/ultramodern-workspace/mf-validation/constants.js +20 -0
- package/dist/esm-node/ultramodern-workspace/mf-validation/discovery.js +29 -0
- package/dist/esm-node/ultramodern-workspace/mf-validation/inspect.js +47 -0
- package/dist/esm-node/ultramodern-workspace/mf-validation/object-literal.js +145 -0
- package/dist/esm-node/ultramodern-workspace/mf-validation/path-utils.js +90 -0
- package/dist/esm-node/ultramodern-workspace/mf-validation/syntax.js +155 -0
- package/dist/esm-node/ultramodern-workspace/mf-validation/types.js +1 -0
- package/dist/esm-node/ultramodern-workspace/mf-validation/validate.js +58 -0
- package/dist/esm-node/ultramodern-workspace/mf-validation.js +3 -516
- package/dist/esm-node/ultramodern-workspace/module-federation/config.js +216 -0
- package/dist/esm-node/ultramodern-workspace/module-federation/index.js +5 -0
- package/dist/esm-node/ultramodern-workspace/module-federation/reexport-module.js +31 -0
- package/dist/esm-node/ultramodern-workspace/module-federation/remote-refs.js +65 -0
- package/dist/esm-node/ultramodern-workspace/module-federation/shared-config.js +13 -0
- package/dist/esm-node/ultramodern-workspace/module-federation.js +2 -458
- package/dist/esm-node/ultramodern-workspace/naming.js +1 -1
- package/dist/esm-node/ultramodern-workspace/package-json.js +22 -252
- package/dist/esm-node/ultramodern-workspace/policy.js +1 -7
- package/dist/esm-node/ultramodern-workspace/public-surface.js +1 -1
- package/dist/esm-node/ultramodern-workspace/routes.js +9 -143
- package/dist/esm-node/ultramodern-workspace/shared-patches.js +8 -0
- package/dist/esm-node/ultramodern-workspace/tooling-command-catalog.js +101 -0
- package/dist/esm-node/ultramodern-workspace/tsconfigs.js +137 -0
- package/dist/esm-node/ultramodern-workspace/versions.js +23 -24
- package/dist/esm-node/ultramodern-workspace/workspace-script-plan.js +117 -0
- package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +92 -69
- package/dist/esm-node/ultramodern-workspace/workspace-validation-contract.js +60 -0
- package/dist/esm-node/ultramodern-workspace/write-app.js +88 -0
- package/dist/esm-node/ultramodern-workspace/write-workspace.js +14 -61
- package/dist/esm-node/ultramodern-workspace/zerops.js +66 -0
- package/dist/types/cli/flags.d.ts +25 -0
- package/dist/types/cli/help.d.ts +2 -0
- package/dist/types/cli/package-source.d.ts +15 -0
- package/dist/types/cli/project-setup.d.ts +8 -0
- package/dist/types/cli/prompts.d.ts +4 -0
- package/dist/types/locale/en.d.ts +0 -4
- package/dist/types/locale/index.d.ts +0 -8
- package/dist/types/locale/zh.d.ts +0 -4
- package/dist/types/ultramodern-package-source.d.ts +0 -11
- package/dist/types/ultramodern-tooling/commands/cloudflare-output-verify.d.ts +2 -0
- package/dist/types/ultramodern-tooling/commands/context.d.ts +11 -0
- package/dist/types/ultramodern-tooling/commands/mf-types.d.ts +2 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.d.ts +4 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.d.ts +4 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.d.ts +1 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.d.ts +3 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.d.ts +3 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.d.ts +3 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.d.ts +2 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.d.ts +4 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.d.ts +3 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.d.ts +3 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.d.ts +7 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.d.ts +3 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/help.d.ts +1 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/install.d.ts +2 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/io.d.ts +14 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.d.ts +9 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-source.d.ts +3 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.d.ts +4 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.d.ts +20 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.d.ts +13 -0
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect.d.ts +2 -0
- package/dist/types/ultramodern-tooling/commands/options.d.ts +2 -0
- package/dist/types/ultramodern-tooling/commands/routes-generate.d.ts +2 -0
- package/dist/types/ultramodern-tooling/commands/skills.d.ts +2 -0
- package/dist/types/ultramodern-tooling/commands/sync-delivery-unit.d.ts +1 -0
- package/dist/types/ultramodern-tooling/commands/validate.d.ts +2 -0
- package/dist/types/ultramodern-tooling/commands.d.ts +1 -1
- package/dist/types/ultramodern-tooling/config/constants.d.ts +3 -0
- package/dist/types/ultramodern-tooling/config/index.d.ts +7 -0
- package/dist/types/ultramodern-tooling/config/json.d.ts +2 -0
- package/dist/types/ultramodern-tooling/config/load.d.ts +2 -0
- package/dist/types/ultramodern-tooling/config/metadata.d.ts +4 -0
- package/dist/types/ultramodern-tooling/config/normalize.d.ts +5 -0
- package/dist/types/ultramodern-tooling/config/synthesize.d.ts +5 -0
- package/dist/types/ultramodern-tooling/config/types.d.ts +41 -0
- package/dist/types/ultramodern-tooling/config.d.ts +1 -43
- package/dist/types/ultramodern-workspace/add-vertical/constants.d.ts +4 -0
- package/dist/types/ultramodern-workspace/add-vertical/execute.d.ts +2 -0
- package/dist/types/ultramodern-workspace/add-vertical/plan.d.ts +2 -0
- package/dist/types/ultramodern-workspace/add-vertical/preflight.d.ts +20 -0
- package/dist/types/ultramodern-workspace/add-vertical/shell-files.d.ts +6 -0
- package/dist/types/ultramodern-workspace/add-vertical/topology.d.ts +9 -0
- package/dist/types/ultramodern-workspace/add-vertical/workspace-state.d.ts +8 -0
- package/dist/types/ultramodern-workspace/add-vertical.d.ts +7 -39
- package/dist/types/ultramodern-workspace/api/checkout-cart.d.ts +33 -0
- package/dist/types/ultramodern-workspace/api/client.d.ts +6 -0
- package/dist/types/ultramodern-workspace/api/contracts.d.ts +15 -0
- package/dist/types/ultramodern-workspace/api/names.d.ts +41 -0
- package/dist/types/ultramodern-workspace/api/service.d.ts +6 -0
- package/dist/types/ultramodern-workspace/api/shared.d.ts +10 -0
- package/dist/types/ultramodern-workspace/api.d.ts +5 -73
- package/dist/types/ultramodern-workspace/app-files.d.ts +1 -7
- package/dist/types/ultramodern-workspace/backend-federation.d.ts +11 -0
- package/dist/types/ultramodern-workspace/bridge-config/cli.d.ts +3 -0
- package/dist/types/ultramodern-workspace/bridge-config/defaults.d.ts +1 -0
- package/dist/types/ultramodern-workspace/bridge-config/gates.d.ts +3 -0
- package/dist/types/ultramodern-workspace/bridge-config/index.d.ts +4 -0
- package/dist/types/ultramodern-workspace/bridge-config/normalize.d.ts +2 -0
- package/dist/types/ultramodern-workspace/bridge-config/schema.d.ts +61 -0
- package/dist/types/ultramodern-workspace/bridge-config/shared.d.ts +12 -0
- package/dist/types/ultramodern-workspace/bridge-config/validation.d.ts +3 -0
- package/dist/types/ultramodern-workspace/bridge-config/workspace-packages.d.ts +3 -0
- package/dist/types/ultramodern-workspace/bridge-config.d.ts +1 -64
- package/dist/types/ultramodern-workspace/codesmith.d.ts +5 -5
- package/dist/types/ultramodern-workspace/contracts.d.ts +1 -1
- package/dist/types/ultramodern-workspace/delivery-unit-sync.d.ts +6 -0
- package/dist/types/ultramodern-workspace/delivery-unit.d.ts +8 -0
- package/dist/types/ultramodern-workspace/demo-components.d.ts +0 -1
- package/dist/types/ultramodern-workspace/descriptors.d.ts +4 -0
- package/dist/types/ultramodern-workspace/effect-diagnostics.d.ts +1 -0
- package/dist/types/ultramodern-workspace/fs-io.d.ts +1 -7
- package/dist/types/ultramodern-workspace/generation-result.d.ts +2 -1
- package/dist/types/ultramodern-workspace/index.d.ts +1 -0
- package/dist/types/ultramodern-workspace/locales.d.ts +0 -181
- package/dist/types/ultramodern-workspace/mf-validation/constants.d.ts +5 -0
- package/dist/types/ultramodern-workspace/mf-validation/discovery.d.ts +2 -0
- package/dist/types/ultramodern-workspace/mf-validation/inspect.d.ts +2 -0
- package/dist/types/ultramodern-workspace/mf-validation/object-literal.d.ts +4 -0
- package/dist/types/ultramodern-workspace/mf-validation/path-utils.d.ts +11 -0
- package/dist/types/ultramodern-workspace/mf-validation/syntax.d.ts +5 -0
- package/dist/types/ultramodern-workspace/mf-validation/types.d.ts +33 -0
- package/dist/types/ultramodern-workspace/mf-validation/validate.d.ts +4 -0
- package/dist/types/ultramodern-workspace/mf-validation.d.ts +4 -27
- package/dist/types/ultramodern-workspace/module-federation/config.d.ts +5 -0
- package/dist/types/ultramodern-workspace/module-federation/index.d.ts +4 -0
- package/dist/types/ultramodern-workspace/module-federation/reexport-module.d.ts +4 -0
- package/dist/types/ultramodern-workspace/module-federation/remote-refs.d.ts +3 -0
- package/dist/types/ultramodern-workspace/module-federation/shared-config.d.ts +2 -0
- package/dist/types/ultramodern-workspace/module-federation.d.ts +2 -17
- package/dist/types/ultramodern-workspace/naming.d.ts +0 -2
- package/dist/types/ultramodern-workspace/package-json.d.ts +1 -16
- package/dist/types/ultramodern-workspace/policy.d.ts +0 -47
- package/dist/types/ultramodern-workspace/public-surface.d.ts +5 -15
- package/dist/types/ultramodern-workspace/routes.d.ts +0 -9
- package/dist/types/ultramodern-workspace/shared-patches.d.ts +1 -0
- package/dist/types/ultramodern-workspace/tooling-command-catalog.d.ts +18 -0
- package/dist/types/ultramodern-workspace/tsconfigs.d.ts +13 -0
- package/dist/types/ultramodern-workspace/types.d.ts +3 -2
- package/dist/types/ultramodern-workspace/versions.d.ts +23 -24
- package/dist/types/ultramodern-workspace/workspace-script-plan.d.ts +58 -0
- package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +12 -4
- package/dist/types/ultramodern-workspace/workspace-validation-contract.d.ts +41 -0
- package/dist/types/ultramodern-workspace/write-app.d.ts +3 -0
- package/dist/types/ultramodern-workspace/write-workspace.d.ts +2 -2
- package/dist/types/ultramodern-workspace/zerops.d.ts +2 -0
- package/package.json +14 -11
- package/template-workspace/.gitignore.handlebars +4 -0
- package/template-workspace/AGENTS.md.handlebars +2 -2
- package/template-workspace/README.md.handlebars +21 -20
- package/template-workspace/patches/@module-federation__bridge-react@2.7.0.patch +140 -0
- package/template-workspace/patches/@module-federation__dts-plugin@2.7.0.patch +37 -0
- package/template-workspace/patches/@module-federation__modern-js-v3@2.7.0.patch +57 -0
- package/template-workspace/patches/@tanstack__router-core@1.171.14.patch +123 -0
- package/template-workspace/patches/drizzle-orm-ts7-strict-declarations.patch +452 -0
- package/template-workspace/patches/effect-schema-error-type-id.patch +18 -0
- package/template-workspace/pnpm-workspace.yaml.handlebars +80 -2
- package/template-workspace/scripts/bootstrap-agent-skills.mjs +11 -3
- package/templates/workspace/apps/modern.config.shared-module-federation.ts.handlebars +37 -0
- package/templates/workspace/apps/modern.config.ts.handlebars +252 -0
- package/templates/workspace/apps/shared/src/routes/ultramodern-jsonld.ts.handlebars +119 -0
- package/templates/workspace/apps/shared/src/routes/ultramodern-route-metadata.ts.handlebars +21 -0
- package/templates/workspace/apps/shell-super-app/src/routes/[lang]/page.tsx.handlebars +49 -0
- package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.helpers.tsx.handlebars +79 -0
- package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.imports.tsx.handlebars +11 -0
- package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.tsx.handlebars +46 -0
- package/templates/workspace/packages/shared-design-tokens/tokens.css.handlebars +7 -0
- package/templates/workspace/tailwind.config.ts.handlebars +3 -0
- package/templates/workspace/verticals/server/checkout-cart-handlers.ts.handlebars +49 -0
- package/templates/workspace/verticals/server/checkout-cart-state.ts.handlebars +23 -0
- package/templates/workspace/verticals/shared/api.checkout-cart-contract-fields.ts.handlebars +1 -0
- package/templates/workspace/verticals/shared/api.checkout-cart-endpoints.ts.handlebars +23 -0
- package/templates/workspace/verticals/shared/api.checkout-cart-operation-contexts.ts.handlebars +25 -0
- package/templates/workspace/verticals/shared/api.checkout-cart-schemas.ts.handlebars +48 -0
- package/templates/workspace/verticals/src/api/checkout-cart-client-exports.ts.handlebars +70 -0
- package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +4 -4
- package/templates/workspace-scripts/check-ultramodern-api-boundaries.mts +40 -2
- package/templates/workspace-scripts/generate-node-backend-federation.mjs +299 -0
- package/templates/workspace-scripts/materialize-zerops-runtime.mjs +448 -0
- package/templates/workspace-scripts/proof-cloudflare-version.mjs +237 -9
- package/templates/workspace-scripts/proof-node-backend-federation.mjs +760 -0
- package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +188 -2
- package/templates/workspace-scripts/ultramodern-typecheck.mjs +1 -1
- package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +479 -31
- package/template-workspace/patches/@tanstack__router-core@1.171.13.patch +0 -51
|
@@ -8,6 +8,10 @@ const packageScope = '{{packageScope}}';
|
|
|
8
8
|
const expectedNodeVersion = '{{nodeVersion}}';
|
|
9
9
|
const tailwindEnabled = {{tailwindEnabledJson}};
|
|
10
10
|
const fullStackVerticals = {{fullStackVerticalsJson}};
|
|
11
|
+
// Backend-federation and Zerops runtime surfaces only exist when the workspace
|
|
12
|
+
// exposes API-bearing verticals. Shell-only workspaces skip their
|
|
13
|
+
// materialization during migrate, so the contract must not require them.
|
|
14
|
+
const hasBackendSurfaces = fullStackVerticals.length > 0;
|
|
11
15
|
const shellNamespace = {{shellNamespaceJson}};
|
|
12
16
|
const oldRemotePaths = {{oldRemotePathsJson}};
|
|
13
17
|
const expectedBuildScript = {{expectedBuildScriptJson}};
|
|
@@ -53,8 +57,18 @@ const assertExists = relativePath => {
|
|
|
53
57
|
const assertNotExists = relativePath => {
|
|
54
58
|
assert(!fs.existsSync(path.join(root, relativePath)), `Unexpected ${relativePath}`);
|
|
55
59
|
};
|
|
60
|
+
const assertAnyOf = relativePaths => {
|
|
61
|
+
assert(
|
|
62
|
+
relativePaths.some(relativePath =>
|
|
63
|
+
fs.existsSync(path.join(root, relativePath)),
|
|
64
|
+
),
|
|
65
|
+
`Missing one of: ${relativePaths.join(', ')}`,
|
|
66
|
+
);
|
|
67
|
+
};
|
|
56
68
|
const formatJson = value =>
|
|
57
69
|
value === undefined ? 'undefined' : JSON.stringify(value);
|
|
70
|
+
const quoteYamlString = value => `'${String(value).replace(/'/gu, "''")}'`;
|
|
71
|
+
const quoteShellValue = value => `'${String(value).replace(/'/gu, "'\\''")}'`;
|
|
58
72
|
const selfCheckFailure = (contract, message, fixArea) =>
|
|
59
73
|
`MicroVertical contract self-check failed: ${contract}. ${message}. Fix area: ${fixArea}.`;
|
|
60
74
|
const assertSelfCheck = (condition, contract, message, fixArea) => {
|
|
@@ -136,6 +150,41 @@ const buildMarkerFor = app =>
|
|
|
136
150
|
.update(`${packageScope}:${app.packageSuffix}:${app.id}:0.1.0`)
|
|
137
151
|
.digest('hex')
|
|
138
152
|
.slice(0, 16);
|
|
153
|
+
const deliveryUnitIdentityFixArea =
|
|
154
|
+
'regenerate vertical identity from delivery-unit record; do not hand-edit surface markers';
|
|
155
|
+
const deliveryUnitBlock = record => ({
|
|
156
|
+
schemaVersion: record?.schemaVersion,
|
|
157
|
+
kind: record?.kind,
|
|
158
|
+
unitId: record?.unitId,
|
|
159
|
+
packageName: record?.packageName,
|
|
160
|
+
version: record?.version,
|
|
161
|
+
buildMarker: record?.buildMarker,
|
|
162
|
+
sourceRevision: record?.sourceRevision,
|
|
163
|
+
});
|
|
164
|
+
const compactDeliveryUnitFor = id => {
|
|
165
|
+
const compactApp = ultramodernConfig.topology?.apps?.find(
|
|
166
|
+
entry => entry?.id === id,
|
|
167
|
+
);
|
|
168
|
+
return (
|
|
169
|
+
compactApp?.backendFederation?.deliveryUnit ?? compactApp?.deliveryUnit
|
|
170
|
+
);
|
|
171
|
+
};
|
|
172
|
+
const expectedDeliveryUnitFor = (vertical, topologyEntry) =>
|
|
173
|
+
compactDeliveryUnitFor(vertical.id) ??
|
|
174
|
+
topologyEntry?.backendFederation?.deliveryUnit ??
|
|
175
|
+
topologyEntry?.deliveryUnit ??
|
|
176
|
+
vertical.deliveryUnit;
|
|
177
|
+
const assertBuildFacadeExport = (source, exportName, sourcePath, contract) => {
|
|
178
|
+
const exportPattern = new RegExp(
|
|
179
|
+
`export const ${exportName} = ${sourcePath.replace(/\./gu, '\\.')};`,
|
|
180
|
+
);
|
|
181
|
+
assertSelfCheck(
|
|
182
|
+
exportPattern.test(source),
|
|
183
|
+
contract,
|
|
184
|
+
`${exportName} must re-export the canonical ultramodern-build.json artifact rather than hand-forking fields`,
|
|
185
|
+
deliveryUnitIdentityFixArea,
|
|
186
|
+
);
|
|
187
|
+
};
|
|
139
188
|
const normalizeCompactApp = rawApp => {
|
|
140
189
|
const id = String(rawApp.id);
|
|
141
190
|
const kind = rawApp.kind === 'vertical' ? 'vertical' : 'shell';
|
|
@@ -210,6 +259,14 @@ const normalizeCompactApp = rawApp => {
|
|
|
210
259
|
verticalRefs: Array.isArray(moduleFederation.verticalRefs)
|
|
211
260
|
? moduleFederation.verticalRefs.filter(ref => typeof ref === 'string')
|
|
212
261
|
: [],
|
|
262
|
+
deliveryUnit:
|
|
263
|
+
rawApp.deliveryUnit && typeof rawApp.deliveryUnit === 'object'
|
|
264
|
+
? rawApp.deliveryUnit
|
|
265
|
+
: undefined,
|
|
266
|
+
backendFederation:
|
|
267
|
+
rawApp.backendFederation && typeof rawApp.backendFederation === 'object'
|
|
268
|
+
? rawApp.backendFederation
|
|
269
|
+
: undefined,
|
|
213
270
|
api,
|
|
214
271
|
};
|
|
215
272
|
};
|
|
@@ -486,7 +543,7 @@ const createAppConfigContract = app => ({
|
|
|
486
543
|
'zephyrRspackPlugin',
|
|
487
544
|
],
|
|
488
545
|
dev: {
|
|
489
|
-
assetPrefix: '/',
|
|
546
|
+
assetPrefix: app.kind === 'shell' ? '/' : 'app-public-origin',
|
|
490
547
|
},
|
|
491
548
|
output: {
|
|
492
549
|
assetPrefix: {
|
|
@@ -625,20 +682,20 @@ const createAppContract = (app, apps) => ({
|
|
|
625
682
|
: {}),
|
|
626
683
|
exposes: app.exposes,
|
|
627
684
|
dts: {
|
|
628
|
-
compilerInstance: 'tsgo',
|
|
685
|
+
compilerInstance: 'effect-tsgo',
|
|
629
686
|
displayErrorInTerminal: true,
|
|
630
687
|
tsConfigPath: './tsconfig.mf-types.json',
|
|
631
688
|
},
|
|
632
689
|
browserSafeExposesOnly: true,
|
|
633
690
|
},
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
691
|
+
marker: {
|
|
692
|
+
appId: app.id,
|
|
693
|
+
packageName: app.package ?? packageNameFor(packageScope, app.packageSuffix),
|
|
694
|
+
version: '0.1.0',
|
|
695
|
+
build: app.deliveryUnit?.buildMarker ?? buildMarkerFor(app),
|
|
696
|
+
deployProfile: 'cloudflare-ssr-mf-effect-v1',
|
|
697
|
+
uiSurface: 'ui',
|
|
698
|
+
...(app.api ? { apiSurface: 'api' } : {}),
|
|
642
699
|
},
|
|
643
700
|
...(app.api
|
|
644
701
|
? {
|
|
@@ -772,6 +829,107 @@ const expectedManifestUrl = vertical =>
|
|
|
772
829
|
`http://localhost:${vertical.port}/mf-manifest.json`;
|
|
773
830
|
const expectedApiUrl = vertical =>
|
|
774
831
|
`http://localhost:${vertical.port}${vertical.apiPrefix}`;
|
|
832
|
+
const expectedBackendFederationName = vertical => `${vertical.mfName}Backend`;
|
|
833
|
+
const expectedBackendManifestUrl = vertical =>
|
|
834
|
+
`http://localhost:${vertical.port}/backend-mf-manifest.json`;
|
|
835
|
+
const expectedBackendContainerEntry = vertical =>
|
|
836
|
+
`http://localhost:${vertical.port}/backendRemoteEntry.mjs`;
|
|
837
|
+
const expectedBackendManifestEnv = vertical =>
|
|
838
|
+
`VERTICAL_${toEnvSegment(vertical.domain ?? vertical.id)}_BACKEND_MF_MANIFEST`;
|
|
839
|
+
const expectedPublicUrlEnv = vertical =>
|
|
840
|
+
`ULTRAMODERN_PUBLIC_URL_${toEnvSegment(vertical.id)}`;
|
|
841
|
+
const expectedCloudflareWorkerName = vertical =>
|
|
842
|
+
toKebabCase(`${packageScope}-${vertical.packageSuffix ?? vertical.id}`).slice(
|
|
843
|
+
0,
|
|
844
|
+
63,
|
|
845
|
+
);
|
|
846
|
+
const backendFederationSubset = backendFederation => ({
|
|
847
|
+
role: backendFederation?.role,
|
|
848
|
+
name: backendFederation?.name,
|
|
849
|
+
runtimeFramework: backendFederation?.runtimeFramework,
|
|
850
|
+
strictEffectApproach: backendFederation?.strictEffectApproach,
|
|
851
|
+
exposeRuntime: backendFederation?.exposes?.['./effect-api']?.runtime,
|
|
852
|
+
exposeReadiness: backendFederation?.exposes?.['./effect-api']?.readiness,
|
|
853
|
+
versionBoundary: {
|
|
854
|
+
invariant: backendFederation?.versionBoundary?.invariant,
|
|
855
|
+
uiManifestUrl: backendFederation?.versionBoundary?.ui?.manifestUrl,
|
|
856
|
+
apiReadiness: backendFederation?.versionBoundary?.api?.readiness,
|
|
857
|
+
},
|
|
858
|
+
cloudflare: {
|
|
859
|
+
kind: backendFederation?.executionSurfaces?.cloudflare?.kind,
|
|
860
|
+
workerName: backendFederation?.executionSurfaces?.cloudflare?.workerName,
|
|
861
|
+
publicUrlEnv:
|
|
862
|
+
backendFederation?.executionSurfaces?.cloudflare?.publicUrlEnv,
|
|
863
|
+
zephyrRuntime:
|
|
864
|
+
backendFederation?.executionSurfaces?.cloudflare?.zephyr?.runtime,
|
|
865
|
+
},
|
|
866
|
+
node: {
|
|
867
|
+
kind: backendFederation?.executionSurfaces?.node?.kind,
|
|
868
|
+
remoteName: backendFederation?.executionSurfaces?.node?.remoteName,
|
|
869
|
+
manifestEnv: backendFederation?.executionSurfaces?.node?.manifestEnv,
|
|
870
|
+
manifestUrl: backendFederation?.executionSurfaces?.node?.manifestUrl,
|
|
871
|
+
containerEntry:
|
|
872
|
+
backendFederation?.executionSurfaces?.node?.containerEntry,
|
|
873
|
+
remoteType: backendFederation?.executionSurfaces?.node?.remoteType,
|
|
874
|
+
expose: backendFederation?.executionSurfaces?.node?.expose,
|
|
875
|
+
},
|
|
876
|
+
compatibility: {
|
|
877
|
+
contractVersion: backendFederation?.compatibility?.contractVersion,
|
|
878
|
+
},
|
|
879
|
+
topLevelManifestUrl: backendFederation?.manifestUrl,
|
|
880
|
+
topLevelContainerEntry: backendFederation?.containerEntry,
|
|
881
|
+
});
|
|
882
|
+
const expectedBackendFederationSubset = vertical => ({
|
|
883
|
+
role: 'microvertical-server',
|
|
884
|
+
name: expectedBackendFederationName(vertical),
|
|
885
|
+
runtimeFramework: 'effect',
|
|
886
|
+
strictEffectApproach: true,
|
|
887
|
+
exposeRuntime: `${vertical.path}/api/index.ts`,
|
|
888
|
+
exposeReadiness: `${vertical.apiPrefix}/${vertical.stem}/readiness`,
|
|
889
|
+
versionBoundary: {
|
|
890
|
+
invariant: 'web-and-api-same-build',
|
|
891
|
+
uiManifestUrl: expectedManifestUrl(vertical),
|
|
892
|
+
apiReadiness: `${vertical.apiPrefix}/${vertical.stem}/readiness`,
|
|
893
|
+
},
|
|
894
|
+
cloudflare: {
|
|
895
|
+
kind: 'cloudflare-worker-snapshot',
|
|
896
|
+
workerName: expectedCloudflareWorkerName(vertical),
|
|
897
|
+
publicUrlEnv: expectedPublicUrlEnv(vertical),
|
|
898
|
+
zephyrRuntime: 'ssr-worker',
|
|
899
|
+
},
|
|
900
|
+
node: {
|
|
901
|
+
kind: 'node-mf-runtime',
|
|
902
|
+
remoteName: expectedBackendFederationName(vertical),
|
|
903
|
+
manifestEnv: expectedBackendManifestEnv(vertical),
|
|
904
|
+
manifestUrl: expectedBackendManifestUrl(vertical),
|
|
905
|
+
containerEntry: expectedBackendContainerEntry(vertical),
|
|
906
|
+
remoteType: 'module',
|
|
907
|
+
expose: './effect-api',
|
|
908
|
+
},
|
|
909
|
+
compatibility: {
|
|
910
|
+
contractVersion: 'microvertical-server-effect-v1',
|
|
911
|
+
},
|
|
912
|
+
topLevelManifestUrl: undefined,
|
|
913
|
+
topLevelContainerEntry: undefined,
|
|
914
|
+
});
|
|
915
|
+
const serverExecutionSubset = serverExecution => ({
|
|
916
|
+
apiBaseUrl: serverExecution?.apiBaseUrl,
|
|
917
|
+
versionBoundary: serverExecution?.versionBoundary,
|
|
918
|
+
cloudflareKind: serverExecution?.cloudflare?.kind,
|
|
919
|
+
cloudflareWorkerName: serverExecution?.cloudflare?.workerName,
|
|
920
|
+
nodeKind: serverExecution?.node?.kind,
|
|
921
|
+
nodeManifestUrl: serverExecution?.node?.manifestUrl,
|
|
922
|
+
nodeContainerEntry: serverExecution?.node?.containerEntry,
|
|
923
|
+
});
|
|
924
|
+
const expectedServerExecutionSubset = vertical => ({
|
|
925
|
+
apiBaseUrl: expectedApiUrl(vertical),
|
|
926
|
+
versionBoundary: 'web-and-api-same-build',
|
|
927
|
+
cloudflareKind: 'cloudflare-worker-snapshot',
|
|
928
|
+
cloudflareWorkerName: expectedCloudflareWorkerName(vertical),
|
|
929
|
+
nodeKind: 'node-mf-runtime',
|
|
930
|
+
nodeManifestUrl: expectedBackendManifestUrl(vertical),
|
|
931
|
+
nodeContainerEntry: expectedBackendContainerEntry(vertical),
|
|
932
|
+
});
|
|
775
933
|
const remoteContractSubset = remote => ({
|
|
776
934
|
id: remote?.id,
|
|
777
935
|
name: remote?.name,
|
|
@@ -791,9 +949,11 @@ const requiredMicroVerticalPaths = vertical => [
|
|
|
791
949
|
`${vertical.path}/package.json`,
|
|
792
950
|
`${vertical.path}/tsconfig.json`,
|
|
793
951
|
`${vertical.path}/tsconfig.mf-types.json`,
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
952
|
+
`${vertical.path}/modern.config.ts`,
|
|
953
|
+
`${vertical.path}/module-federation.config.ts`,
|
|
954
|
+
`${vertical.path}/backend-federation.config.ts`,
|
|
955
|
+
`${vertical.path}/api/effect-api.ts`,
|
|
956
|
+
`${vertical.path}/api/index.ts`,
|
|
797
957
|
`${vertical.path}/shared/api.ts`,
|
|
798
958
|
`${vertical.path}/src/api/${vertical.stem}-client.ts`,
|
|
799
959
|
`${vertical.path}/src/modern-app-env.d.ts`,
|
|
@@ -988,6 +1148,36 @@ const assertMicroVerticalContractGraph = ({
|
|
|
988
1148
|
`topology/reference-topology.json verticals.${vertical.id}`,
|
|
989
1149
|
'restore generated topology vertical entries',
|
|
990
1150
|
);
|
|
1151
|
+
assertSameJson(
|
|
1152
|
+
backendFederationSubset(topologyEntry.backendFederation),
|
|
1153
|
+
expectedBackendFederationSubset(vertical),
|
|
1154
|
+
`topology/reference-topology.json verticals.${vertical.id}.backendFederation`,
|
|
1155
|
+
'restore generated MicroVertical server execution contract',
|
|
1156
|
+
);
|
|
1157
|
+
|
|
1158
|
+
if (vertical.deliveryUnit) {
|
|
1159
|
+
const expectedDeliveryUnit = deliveryUnitBlock(
|
|
1160
|
+
expectedDeliveryUnitFor(vertical, topologyEntry),
|
|
1161
|
+
);
|
|
1162
|
+
assertSameJson(
|
|
1163
|
+
deliveryUnitBlock(topologyEntry.deliveryUnit),
|
|
1164
|
+
expectedDeliveryUnit,
|
|
1165
|
+
`topology/reference-topology.json verticals.${vertical.id}.deliveryUnit`,
|
|
1166
|
+
deliveryUnitIdentityFixArea,
|
|
1167
|
+
);
|
|
1168
|
+
assertSameJson(
|
|
1169
|
+
deliveryUnitBlock(topologyEntry.backendFederation?.deliveryUnit),
|
|
1170
|
+
expectedDeliveryUnit,
|
|
1171
|
+
`topology/reference-topology.json verticals.${vertical.id}.backendFederation.deliveryUnit`,
|
|
1172
|
+
deliveryUnitIdentityFixArea,
|
|
1173
|
+
);
|
|
1174
|
+
assertSelfCheck(
|
|
1175
|
+
topologyEntry.backendFederation?.versionBoundary?.identityRoot === 'deliveryUnit',
|
|
1176
|
+
`topology/reference-topology.json verticals.${vertical.id}.backendFederation.versionBoundary.identityRoot`,
|
|
1177
|
+
`Expected "deliveryUnit", found ${formatJson(topologyEntry.backendFederation?.versionBoundary?.identityRoot)}`,
|
|
1178
|
+
deliveryUnitIdentityFixArea,
|
|
1179
|
+
);
|
|
1180
|
+
}
|
|
991
1181
|
|
|
992
1182
|
assertObject(
|
|
993
1183
|
ownershipEntry,
|
|
@@ -1025,6 +1215,13 @@ const assertMicroVerticalContractGraph = ({
|
|
|
1025
1215
|
`topology/local-overlays/development.json apis.${vertical.id}`,
|
|
1026
1216
|
'restore generated local API overlay',
|
|
1027
1217
|
);
|
|
1218
|
+
assertSameJson(
|
|
1219
|
+
serverExecutionSubset(overlay.serverExecution?.[vertical.id]),
|
|
1220
|
+
expectedServerExecutionSubset(vertical),
|
|
1221
|
+
`topology/local-overlays/development.json serverExecution.${vertical.id}`,
|
|
1222
|
+
'restore generated local MicroVertical server execution overlay',
|
|
1223
|
+
);
|
|
1224
|
+
|
|
1028
1225
|
|
|
1029
1226
|
assertSameJson(
|
|
1030
1227
|
shellPackage.dependencies?.[vertical.packageName],
|
|
@@ -1116,6 +1313,7 @@ const assertProjectReferenceEmitConfig = (tsConfig, packagePath) => {
|
|
|
1116
1313
|
);
|
|
1117
1314
|
};
|
|
1118
1315
|
const assertTsConfigReferenceGraph = () => {
|
|
1316
|
+
const baseTsConfig = readJson('tsconfig.base.json');
|
|
1119
1317
|
const rootTsConfig = readJson('tsconfig.json');
|
|
1120
1318
|
const shellTsConfig = readJson('apps/shell-super-app/tsconfig.json');
|
|
1121
1319
|
const shellMfTypesTsConfig = readJson(
|
|
@@ -1151,6 +1349,13 @@ const assertTsConfigReferenceGraph = () => {
|
|
|
1151
1349
|
'apps/shell-super-app/tsconfig.json references',
|
|
1152
1350
|
'restore the generated shell project-reference graph',
|
|
1153
1351
|
);
|
|
1352
|
+
assert(baseTsConfig.compilerOptions?.skipLibCheck !== true, 'tsconfig.base.json must not use skipLibCheck');
|
|
1353
|
+
assertSameJson(
|
|
1354
|
+
shellTsConfig.include ?? [],
|
|
1355
|
+
['src', 'locales/**/*.json', 'package.json', 'shared'],
|
|
1356
|
+
'apps/shell-super-app/tsconfig.json include',
|
|
1357
|
+
'restore the generated shell typecheck boundary',
|
|
1358
|
+
);
|
|
1154
1359
|
assertProjectReferenceEmitConfig(
|
|
1155
1360
|
shellTsConfig,
|
|
1156
1361
|
'apps/shell-super-app',
|
|
@@ -1158,7 +1363,7 @@ const assertTsConfigReferenceGraph = () => {
|
|
|
1158
1363
|
assertSameJson(
|
|
1159
1364
|
shellMfTypesTsConfig,
|
|
1160
1365
|
{
|
|
1161
|
-
extends: '
|
|
1366
|
+
extends: '../../tsconfig.base.json',
|
|
1162
1367
|
include: ['src/modern-app-env.d.ts'],
|
|
1163
1368
|
},
|
|
1164
1369
|
'apps/shell-super-app/tsconfig.mf-types.json',
|
|
@@ -1191,11 +1396,17 @@ const assertTsConfigReferenceGraph = () => {
|
|
|
1191
1396
|
`${vertical.path}/tsconfig.json references`,
|
|
1192
1397
|
'restore the generated MicroVertical project-reference graph',
|
|
1193
1398
|
);
|
|
1399
|
+
assertSameJson(
|
|
1400
|
+
verticalTsConfig.include ?? [],
|
|
1401
|
+
['src', 'locales/**/*.json', 'package.json', 'shared', 'api'],
|
|
1402
|
+
`${vertical.path}/tsconfig.json include`,
|
|
1403
|
+
'restore the generated MicroVertical typecheck boundary',
|
|
1404
|
+
);
|
|
1194
1405
|
assertProjectReferenceEmitConfig(verticalTsConfig, vertical.path);
|
|
1195
1406
|
assertSameJson(
|
|
1196
1407
|
verticalMfTypesTsConfig,
|
|
1197
1408
|
{
|
|
1198
|
-
extends: '
|
|
1409
|
+
extends: '../../tsconfig.base.json',
|
|
1199
1410
|
include: [
|
|
1200
1411
|
'src/federation-entry.tsx',
|
|
1201
1412
|
...vertical.componentPaths.map(componentPath =>
|
|
@@ -1216,7 +1427,7 @@ const packageJsonFiles = startDir => {
|
|
|
1216
1427
|
const current = queue.shift();
|
|
1217
1428
|
for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
|
|
1218
1429
|
if (
|
|
1219
|
-
|
|
1430
|
+
['.git', '.output', '.zerops', 'dist', 'node_modules', 'repos'].includes(
|
|
1220
1431
|
entry.name,
|
|
1221
1432
|
)
|
|
1222
1433
|
) {
|
|
@@ -1349,6 +1560,33 @@ const extractAssetPrefixExpression = modernConfig => {
|
|
|
1349
1560
|
assert(match?.groups?.expression, 'modern.config.ts must assign assetPrefix');
|
|
1350
1561
|
return match.groups.expression;
|
|
1351
1562
|
};
|
|
1563
|
+
const assertTargetIsolatedBuildArtifacts = (appId, modernConfig) => {
|
|
1564
|
+
assert(
|
|
1565
|
+
modernConfig.includes("const buildTarget = cloudflareDeployEnabled ? 'cloudflare' : 'web';") &&
|
|
1566
|
+
modernConfig.includes("const buildOutputRoot = cloudflareDeployEnabled ? 'dist-cloudflare' : 'dist';") &&
|
|
1567
|
+
modernConfig.includes('const buildTempDirectory = `node_modules/.modern-js-${appId}-${buildTarget}`;') &&
|
|
1568
|
+
modernConfig.includes('const buildCacheDirectory = `node_modules/.cache/rspack-${appId}-${buildTarget}`;') &&
|
|
1569
|
+
modernConfig.includes('root: buildOutputRoot,') &&
|
|
1570
|
+
modernConfig.includes('tempDir: buildTempDirectory,') &&
|
|
1571
|
+
modernConfig.includes('cacheDigest: [appId, buildTarget],') &&
|
|
1572
|
+
modernConfig.includes('cacheDirectory: buildCacheDirectory,'),
|
|
1573
|
+
`${appId} must isolate build output, Modern temp files, and Rspack cache by app and build target`,
|
|
1574
|
+
);
|
|
1575
|
+
};
|
|
1576
|
+
const assertCloudflareBuildSkipsDeployRebuild = (appId, packageJson) => {
|
|
1577
|
+
assert(
|
|
1578
|
+
packageJson.scripts?.['cloudflare:build']?.includes(
|
|
1579
|
+
'ULTRAMODERN_ZEPHYR=false MODERNJS_DEPLOY=cloudflare modern deploy --skip-build',
|
|
1580
|
+
),
|
|
1581
|
+
`${appId} cloudflare:build must deploy with --skip-build after the explicit Cloudflare build`,
|
|
1582
|
+
);
|
|
1583
|
+
assert(
|
|
1584
|
+
!packageJson.scripts?.['cloudflare:build']?.includes(
|
|
1585
|
+
'--target dist && ULTRAMODERN_ZEPHYR=false MODERNJS_DEPLOY=cloudflare modern deploy',
|
|
1586
|
+
),
|
|
1587
|
+
`${appId} cloudflare:build must not write public-surface assets into the normal web dist before deploy`,
|
|
1588
|
+
);
|
|
1589
|
+
};
|
|
1352
1590
|
const stripYamlInlineComment = value => {
|
|
1353
1591
|
let quote = undefined;
|
|
1354
1592
|
for (let index = 0; index < value.length; index += 1) {
|
|
@@ -1462,6 +1700,9 @@ const requiredPaths = [
|
|
|
1462
1700
|
'.gitignore',
|
|
1463
1701
|
'package.json',
|
|
1464
1702
|
'pnpm-workspace.yaml',
|
|
1703
|
+
'patches/@module-federation__modern-js-v3@{{moduleFederationVersion}}.patch',
|
|
1704
|
+
'patches/@module-federation__bridge-react@{{moduleFederationVersion}}.patch',
|
|
1705
|
+
'patches/effect-schema-error-type-id.patch',
|
|
1465
1706
|
'tsconfig.json',
|
|
1466
1707
|
'tsconfig.base.json',
|
|
1467
1708
|
'oxlint.config.ts',
|
|
@@ -1469,8 +1710,6 @@ const requiredPaths = [
|
|
|
1469
1710
|
'.github/renovate.json',
|
|
1470
1711
|
'.github/workflows/ultramodern-workspace-gates.yml',
|
|
1471
1712
|
'.agents/agent-reference-repos.json',
|
|
1472
|
-
'.codex/skills-lock.json',
|
|
1473
|
-
'.codex/rstackjs-agent-skills-LICENSE',
|
|
1474
1713
|
'topology/reference-topology.json',
|
|
1475
1714
|
'topology/ownership.json',
|
|
1476
1715
|
'topology/local-overlays/development.json',
|
|
@@ -1478,13 +1717,17 @@ const requiredPaths = [
|
|
|
1478
1717
|
'scripts/bootstrap-agent-skills.mts',
|
|
1479
1718
|
'scripts/check-ultramodern-api-boundaries.mts',
|
|
1480
1719
|
'scripts/check-ultramodern-i18n-boundaries.mts',
|
|
1720
|
+
...(hasBackendSurfaces ? ['scripts/generate-node-backend-federation.mts'] : []),
|
|
1481
1721
|
'scripts/generate-public-surface-assets.mts',
|
|
1722
|
+
'scripts/generate-tanstack-routes.mts',
|
|
1482
1723
|
'scripts/proof-cloudflare-version.mts',
|
|
1724
|
+
...(hasBackendSurfaces ? ['scripts/proof-node-backend-federation.mts'] : []),
|
|
1483
1725
|
'scripts/setup-agent-reference-repos.mts',
|
|
1484
1726
|
'scripts/ultramodern-performance-readiness.config.mjs',
|
|
1485
1727
|
'scripts/ultramodern-performance-readiness.mts',
|
|
1486
1728
|
'scripts/ultramodern-typecheck.mts',
|
|
1487
1729
|
'scripts/validate-ultramodern-workspace.mts',
|
|
1730
|
+
'scripts/verify-cloudflare-output.mts',
|
|
1488
1731
|
'apps/shell-super-app/package.json',
|
|
1489
1732
|
'apps/shell-super-app/tsconfig.json',
|
|
1490
1733
|
'apps/shell-super-app/tsconfig.mf-types.json',
|
|
@@ -1518,10 +1761,8 @@ for (const vertical of fullStackVerticals) {
|
|
|
1518
1761
|
|
|
1519
1762
|
if (tailwindEnabled) {
|
|
1520
1763
|
requiredPaths.push(
|
|
1521
|
-
'apps/shell-super-app/postcss.config.mjs',
|
|
1522
1764
|
'apps/shell-super-app/tailwind.config.ts',
|
|
1523
1765
|
...fullStackVerticals.flatMap(vertical => [
|
|
1524
|
-
`${vertical.path}/postcss.config.mjs`,
|
|
1525
1766
|
`${vertical.path}/tailwind.config.ts`,
|
|
1526
1767
|
]),
|
|
1527
1768
|
);
|
|
@@ -1537,6 +1778,40 @@ for (const vertical of fullStackVerticals) {
|
|
|
1537
1778
|
for (const requiredPath of requiredPaths) {
|
|
1538
1779
|
assertExists(requiredPath);
|
|
1539
1780
|
}
|
|
1781
|
+
// Agent skills metadata may live under .agents/ (agents-standard layout) or
|
|
1782
|
+
// .codex/ (legacy scaffold default).
|
|
1783
|
+
assertAnyOf(['.agents/skills-lock.json', '.codex/skills-lock.json']);
|
|
1784
|
+
assertAnyOf([
|
|
1785
|
+
'.agents/rstackjs-agent-skills-LICENSE',
|
|
1786
|
+
'.codex/rstackjs-agent-skills-LICENSE',
|
|
1787
|
+
]);
|
|
1788
|
+
const pnpmWorkspace = readText('pnpm-workspace.yaml');
|
|
1789
|
+
assert(
|
|
1790
|
+
pnpmWorkspace.includes("'@effect/opentelemetry': {{effectVersion}}"),
|
|
1791
|
+
'pnpm-workspace.yaml must override @effect/opentelemetry to the generated Effect cohort',
|
|
1792
|
+
);
|
|
1793
|
+
assert(
|
|
1794
|
+
pnpmWorkspace.includes('effect: {{effectVersion}}'),
|
|
1795
|
+
'pnpm-workspace.yaml must override effect to the generated Effect cohort',
|
|
1796
|
+
);
|
|
1797
|
+
assert(
|
|
1798
|
+
pnpmWorkspace.includes(
|
|
1799
|
+
"'@module-federation/modern-js-v3@{{moduleFederationVersion}}': patches/@module-federation__modern-js-v3@{{moduleFederationVersion}}.patch",
|
|
1800
|
+
),
|
|
1801
|
+
'pnpm-workspace.yaml must patch the generated Module Federation Modern.js integration cohort',
|
|
1802
|
+
);
|
|
1803
|
+
assert(
|
|
1804
|
+
pnpmWorkspace.includes(
|
|
1805
|
+
"'@module-federation/bridge-react@{{moduleFederationVersion}}': patches/@module-federation__bridge-react@{{moduleFederationVersion}}.patch",
|
|
1806
|
+
),
|
|
1807
|
+
'pnpm-workspace.yaml must patch the generated Module Federation React bridge cohort',
|
|
1808
|
+
);
|
|
1809
|
+
assert(
|
|
1810
|
+
pnpmWorkspace.includes(
|
|
1811
|
+
"'effect@{{effectVersion}}': patches/effect-schema-error-type-id.patch",
|
|
1812
|
+
),
|
|
1813
|
+
'pnpm-workspace.yaml must patch the generated Effect declaration cohort',
|
|
1814
|
+
);
|
|
1540
1815
|
for (const oldRemotePath of oldRemotePaths) {
|
|
1541
1816
|
assertNotExists(oldRemotePath);
|
|
1542
1817
|
}
|
|
@@ -1605,6 +1880,11 @@ assert(
|
|
|
1605
1880
|
expectedModernPackageSpecifier('@modern-js/code-tools'),
|
|
1606
1881
|
'Root must depend on @modern-js/code-tools through package source metadata',
|
|
1607
1882
|
);
|
|
1883
|
+
assert(
|
|
1884
|
+
rootPackage.devDependencies?.['@modern-js/plugin-bff'] ===
|
|
1885
|
+
expectedModernPackageSpecifier('@modern-js/plugin-bff'),
|
|
1886
|
+
'Root must depend on @modern-js/plugin-bff for Node backend federation proof',
|
|
1887
|
+
);
|
|
1608
1888
|
if (packageSource.strategy === 'install') {
|
|
1609
1889
|
const installSpecifier = packageSource.modernPackages?.specifier;
|
|
1610
1890
|
assert(
|
|
@@ -1664,20 +1944,75 @@ if (bridgeConfig) {
|
|
|
1664
1944
|
}
|
|
1665
1945
|
assert(rootPackage.scripts?.['bridge:check'], 'Bridge workspaces must expose bridge:check');
|
|
1666
1946
|
} else {
|
|
1667
|
-
assert(rootPackage.scripts?.typecheck === 'node ./scripts/ultramodern-typecheck.mts --
|
|
1947
|
+
assert(rootPackage.scripts?.typecheck === 'node ./scripts/ultramodern-typecheck.mts --project tsconfig.json', 'Root typecheck must run TS-Go across the root project reference graph');
|
|
1668
1948
|
}
|
|
1669
1949
|
assert(rootPackage.scripts?.['contract:check'] === 'node ./scripts/validate-ultramodern-workspace.mts', 'Root must expose contract:check');
|
|
1670
1950
|
assert(rootPackage.scripts?.['api:check'] === 'node ./scripts/check-ultramodern-api-boundaries.mts', 'Root must expose api:check');
|
|
1671
1951
|
assert(rootPackage.scripts?.['i18n:boundaries'] === 'node ./scripts/check-ultramodern-i18n-boundaries.mts', 'Root must expose i18n:boundaries');
|
|
1672
1952
|
assert(rootPackage.scripts?.['performance:readiness'] === 'node ./scripts/ultramodern-performance-readiness.mts', 'Root must expose default-on performance readiness diagnostics');
|
|
1953
|
+
if (hasBackendSurfaces) {
|
|
1954
|
+
assert(rootPackage.scripts?.['node:backend-federation:generate'] === 'node ./scripts/generate-node-backend-federation.mts', 'Root must expose local Node backend federation artifact generation');
|
|
1955
|
+
assert(rootPackage.scripts?.['zerops:materialize'] === 'node ./scripts/materialize-zerops-runtime.mjs', 'Root must expose Zerops runtime materialization script');
|
|
1956
|
+
assert(
|
|
1957
|
+
rootPackage.scripts?.['node:proof'] ===
|
|
1958
|
+
'pnpm node:backend-federation:generate && node ./scripts/proof-node-backend-federation.mts',
|
|
1959
|
+
'Root must expose node:proof for backend federation Effect modules',
|
|
1960
|
+
);
|
|
1961
|
+
}
|
|
1962
|
+
assertNotExists('scripts/generate-node-backend-federation.mjs');
|
|
1963
|
+
assertNotExists('scripts/proof-node-backend-federation.mjs');
|
|
1964
|
+
assertNotExists('scripts/verify-cloudflare-output.mjs');
|
|
1965
|
+
assertNotExists('scripts/generate-tanstack-routes.mjs');
|
|
1673
1966
|
assert(
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1967
|
+
rootPackage.scripts?.check?.includes('pnpm api:check') &&
|
|
1968
|
+
(hasBackendSurfaces
|
|
1969
|
+
? rootPackage.scripts.check.includes('pnpm node:proof')
|
|
1970
|
+
: !rootPackage.scripts.check.includes('pnpm node:proof')) &&
|
|
1971
|
+
rootPackage.scripts.check.endsWith(
|
|
1972
|
+
bridgeConfig
|
|
1973
|
+
? '&& pnpm performance:readiness && pnpm bridge:check'
|
|
1974
|
+
: '&& pnpm performance:readiness',
|
|
1975
|
+
),
|
|
1976
|
+
'Root check must run Node backend federation proof when backend surfaces exist, default-on performance readiness diagnostics, and bridge gates when configured',
|
|
1680
1977
|
);
|
|
1978
|
+
if (hasBackendSurfaces) {
|
|
1979
|
+
const zeropsYaml = readText('zerops.yaml');
|
|
1980
|
+
assert(zeropsYaml.includes('zerops:'), 'Zerops manifest must include zerops services');
|
|
1981
|
+
assert(zeropsYaml.includes(`setup: ${quoteYamlString('shell-super-app')}`), 'Zerops manifest must include shell service');
|
|
1982
|
+
assert(zeropsYaml.includes(`base: ${quoteYamlString('nodejs@26')}`), 'Zerops manifest must use generated Node runtime major');
|
|
1983
|
+
assert(zeropsYaml.includes('deployFiles:'), 'Zerops manifest must deploy package-pruned runtime directories');
|
|
1984
|
+
assert(
|
|
1985
|
+
zeropsYaml.includes(`start: cd ${quoteShellValue('.zerops/runtime/shell-super-app')} && npm run serve`),
|
|
1986
|
+
'Zerops shell service must start from materialized runtime package',
|
|
1987
|
+
);
|
|
1988
|
+
assert(
|
|
1989
|
+
zeropsYaml.includes('SHELL_SUPER_APP_PORT:') &&
|
|
1990
|
+
zeropsYaml.includes('ULTRAMODERN_ZEROPS_SERVICE:'),
|
|
1991
|
+
'Zerops manifest must expose service identity and ports',
|
|
1992
|
+
);
|
|
1993
|
+
for (const vertical of fullStackVerticals) {
|
|
1994
|
+
assert(zeropsYaml.includes(`setup: ${quoteYamlString(vertical.id)}`), `${vertical.id} must have a Zerops service`);
|
|
1995
|
+
assert(
|
|
1996
|
+
zeropsYaml.includes(`~/.local/bin/mise exec -- pnpm run zerops:materialize -- --app ${quoteShellValue(vertical.id)} --package ${quoteShellValue(vertical.packageName)} --package-dir ${quoteShellValue(vertical.path)}`),
|
|
1997
|
+
`${vertical.id} Zerops service must materialize its runtime package`,
|
|
1998
|
+
);
|
|
1999
|
+
assert(
|
|
2000
|
+
zeropsYaml.includes(`path: ${quoteYamlString(`${vertical.apiPrefix}/${vertical.stem}/readiness`)}`),
|
|
2001
|
+
`${vertical.id} BFF readiness path must use generated API prefix`,
|
|
2002
|
+
);
|
|
2003
|
+
}
|
|
2004
|
+
const zeropsMaterializer = readText('scripts/materialize-zerops-runtime.mjs');
|
|
2005
|
+
assert(zeropsMaterializer.includes("MODERNJS_DEPLOY: 'node'"), 'Zerops materializer must use Modern.js Node deploy target');
|
|
2006
|
+
assert(/'deploy',\s*'--skip-build'/.test(zeropsMaterializer), 'Zerops materializer must pass --skip-build directly to Modern deploy');
|
|
2007
|
+
assert(zeropsMaterializer.includes('normalizeRuntimePackageDependencies'), 'Zerops materializer must normalize generated Modern package aliases before installing dependencies');
|
|
2008
|
+
assert(zeropsMaterializer.includes('officialPackageName'), 'Zerops materializer must add official Modern.js npm aliases for generated runtime imports');
|
|
2009
|
+
assert(zeropsMaterializer.includes('installRuntimeDependencies'), 'Zerops materializer must install dependencies outside the workspace copy runtime node_modules');
|
|
2010
|
+
assert(zeropsMaterializer.includes('copyWorkspacePackage'), 'Zerops materializer must preserve generated local workspace package dependencies');
|
|
2011
|
+
assert(zeropsMaterializer.includes('makeWorkspacePackageRuntimeSafe'), 'Zerops materializer must rewrite copied workspace packages to runtime-safe JavaScript exports');
|
|
2012
|
+
assert(zeropsMaterializer.includes("serve: runtimePackage.scripts?.serve ?? 'node index.js'"), 'Zerops materializer must preserve runtime serve script fallback');
|
|
2013
|
+
assert(/'install',\s*'--omit=dev'/.test(zeropsMaterializer), 'Zerops materializer must omit dev dependencies from runtime installs');
|
|
2014
|
+
assert(zeropsMaterializer.includes("'--legacy-peer-deps'"), 'Zerops materializer must tolerate generated-workspace peer dependency ranges in npm runtime install');
|
|
2015
|
+
}
|
|
1681
2016
|
const performanceReadinessConfig = readText('scripts/ultramodern-performance-readiness.config.mjs');
|
|
1682
2017
|
const assertToolWrapper = (scriptPath, command) => {
|
|
1683
2018
|
const source = readText(scriptPath);
|
|
@@ -1708,8 +2043,14 @@ assert(rootPackage.scripts?.postinstall === "oxfmt . '!repos/**' && node ./scrip
|
|
|
1708
2043
|
assert(rootPackage.scripts?.['agents:refs:install'] === 'node ./scripts/setup-agent-reference-repos.mts', 'Root must expose agents:refs:install as the explicit reference repo installer');
|
|
1709
2044
|
const agentSkillsBootstrap = readText('scripts/bootstrap-agent-skills.mts');
|
|
1710
2045
|
assertToolWrapper('scripts/assert-mf-types.mts', 'mf-types');
|
|
2046
|
+
if (hasBackendSurfaces) {
|
|
2047
|
+
assertToolWrapper('scripts/generate-node-backend-federation.mts', 'backend-federation-generate');
|
|
2048
|
+
assertToolWrapper('scripts/proof-node-backend-federation.mts', 'backend-federation-proof');
|
|
2049
|
+
}
|
|
1711
2050
|
assertToolWrapper('scripts/generate-public-surface-assets.mts', 'public-surface');
|
|
2051
|
+
assertToolWrapper('scripts/generate-tanstack-routes.mts', 'routes-generate');
|
|
1712
2052
|
assertToolWrapper('scripts/proof-cloudflare-version.mts', 'cloudflare-proof');
|
|
2053
|
+
assertToolWrapper('scripts/verify-cloudflare-output.mts', 'cloudflare-output-verify');
|
|
1713
2054
|
assertToolWrapper('scripts/migrate-strict-effect.mts', 'migrate-strict-effect');
|
|
1714
2055
|
assertToolWrapper('scripts/bootstrap-agent-skills.mts', 'skills');
|
|
1715
2056
|
assert(!agentSkillsBootstrap.includes("run('brew'") && !agentSkillsBootstrap.includes('runShell('), 'Agent skills bootstrap must never invoke system package managers');
|
|
@@ -1751,8 +2092,17 @@ assert(JSON.stringify(generatedContract.performanceReadiness?.signals?.map(signa
|
|
|
1751
2092
|
|
|
1752
2093
|
const shellModernConfig = readText('apps/shell-super-app/modern.config.ts');
|
|
1753
2094
|
const shellModuleFederationConfig = readText('apps/shell-super-app/module-federation.config.ts');
|
|
2095
|
+
const shellModernAppEnv = readText('apps/shell-super-app/src/modern-app-env.d.ts');
|
|
2096
|
+
const gitignore = readText('.gitignore');
|
|
1754
2097
|
const shellRouteHead = readText('apps/shell-super-app/src/routes/ultramodern-route-head.tsx');
|
|
1755
2098
|
const shellRouteMetadata = readText('apps/shell-super-app/src/routes/ultramodern-route-metadata.ts');
|
|
2099
|
+
assert(/^\.mf\/$/mu.test(gitignore), 'Generated .gitignore must ignore root Module Federation diagnostics');
|
|
2100
|
+
assert(/^\*\*\/\.mf\/$/mu.test(gitignore), 'Generated .gitignore must ignore per-app Module Federation diagnostics');
|
|
2101
|
+
assert(/^dist-cloudflare\/$/mu.test(gitignore), 'Generated .gitignore must ignore Cloudflare build output');
|
|
2102
|
+
assert(shellModernAppEnv.includes("import '@modern-js/app-tools/types';"), 'Shell app env must import the framework-owned app ambient type bundle through module resolution');
|
|
2103
|
+
assert(/declare global \{\s*const ULTRAMODERN_SITE_URL: string;\s*\}/u.test(shellModernAppEnv), 'Shell app env must keep generated globals explicit after importing app ambient types');
|
|
2104
|
+
assert(!shellModernAppEnv.includes("declare module '*.svg'"), 'Shell app env must not redeclare framework-owned svg asset modules');
|
|
2105
|
+
assert(!shellModernAppEnv.includes("declare module '*.css'"), 'Shell app env must not redeclare framework-owned css asset modules');
|
|
1756
2106
|
assert(shellRouteMetadata.includes('@generated by @modern-js/create'), 'Shell route metadata compatibility manifest must be marked generated');
|
|
1757
2107
|
assert(shellRouteMetadata.includes("authoring: 'colocated-route-meta'"), 'Shell route metadata manifest must advertise colocated authoring');
|
|
1758
2108
|
const expectedZephyrDependencies = Object.fromEntries(
|
|
@@ -1771,6 +2121,9 @@ assert(shellPackage.dependencies?.['@modern-js/plugin-bff'] === expectedModernPa
|
|
|
1771
2121
|
assert(shellPackage.dependencies?.['@modern-js/plugin-i18n'] === expectedModernPackageSpecifier('@modern-js/plugin-i18n'), 'Shell plugin-i18n dependency must match package source metadata');
|
|
1772
2122
|
assert(shellPackage.dependencies?.['@modern-js/plugin-tanstack'] === expectedModernPackageSpecifier('@modern-js/plugin-tanstack'), 'Shell plugin-tanstack dependency must match package source metadata');
|
|
1773
2123
|
assert(shellPackage.dependencies?.['@modern-js/runtime'] === expectedModernPackageSpecifier('@modern-js/runtime'), 'Shell runtime dependency must match package source metadata');
|
|
2124
|
+
assert(shellPackage.scripts?.['cloudflare:deploy'] === 'ULTRAMODERN_CLOUDFLARE_REQUIRE_PUBLIC_URLS=true pnpm run cloudflare:build && wrangler deploy --config .output/wrangler.json', 'Shell must expose cloudflare:deploy');
|
|
2125
|
+
assertTargetIsolatedBuildArtifacts('shell-super-app', shellModernConfig);
|
|
2126
|
+
assertCloudflareBuildSkipsDeployRebuild('shell-super-app', shellPackage);
|
|
1774
2127
|
const shellContract = generatedContract.apps?.find(app => app.id === 'shell-super-app');
|
|
1775
2128
|
assert(shellContract?.deploy?.cloudflare?.workerName === expectedWorkerName('shell-super-app'), 'Shell Cloudflare workerName is incorrect');
|
|
1776
2129
|
assert(shellContract?.deploy?.cloudflare?.publicUrlEnv === 'ULTRAMODERN_PUBLIC_URL_SHELL_SUPER_APP', 'Shell Cloudflare public URL env is incorrect');
|
|
@@ -1803,7 +2156,7 @@ assert(shellContract?.config?.performance?.readinessDiagnostics?.optOut?.env ===
|
|
|
1803
2156
|
assert(JSON.stringify(shellContract?.config?.source?.siteUrl?.envFallbackOrder) === JSON.stringify(['MODERN_PUBLIC_SITE_URL', 'ULTRAMODERN_PUBLIC_URL_SHELL_SUPER_APP', 'ULTRAMODERN_CLOUDFLARE_WORKERS_DEV_SUBDOMAIN', 'SHELL_SUPER_APP_PORT']), 'Shell site URL env fallback order is incorrect');
|
|
1804
2157
|
assert(shellContract?.config?.rspack?.output?.uniqueName === 'shellSuperApp', 'Shell Rspack uniqueName is incorrect');
|
|
1805
2158
|
assert(shellContract?.config?.rspack?.output?.chunkLoadingGlobal === expectedChunkLoadingGlobal('shellSuperApp'), 'Shell Rspack chunkLoadingGlobal is incorrect');
|
|
1806
|
-
assert(shellContract?.moduleFederation?.dts?.compilerInstance === 'tsgo', 'Shell must keep mandatory DTS compiler');
|
|
2159
|
+
assert(shellContract?.moduleFederation?.dts?.compilerInstance === 'effect-tsgo', 'Shell must keep mandatory DTS compiler');
|
|
1807
2160
|
assert(shellContract?.moduleFederation?.dts?.tsConfigPath === './tsconfig.mf-types.json', 'Shell must keep dedicated Module Federation DTS tsconfig');
|
|
1808
2161
|
assert(shellModuleFederationConfig.includes("tsConfigPath: './tsconfig.mf-types.json'"), 'Shell Module Federation config must use the dedicated DTS tsconfig');
|
|
1809
2162
|
assert(topology.shell?.cloudflare?.workerName === expectedWorkerName('shell-super-app'), 'Shell topology Cloudflare workerName is incorrect');
|
|
@@ -1841,12 +2194,71 @@ for (const vertical of fullStackVerticals) {
|
|
|
1841
2194
|
const packageJson = readJson(`${vertical.path}/package.json`);
|
|
1842
2195
|
const modernConfig = readText(`${vertical.path}/modern.config.ts`);
|
|
1843
2196
|
const moduleFederationConfig = readText(`${vertical.path}/module-federation.config.ts`);
|
|
2197
|
+
const modernAppEnv = readText(`${vertical.path}/src/modern-app-env.d.ts`);
|
|
1844
2198
|
const routeHead = readText(`${vertical.path}/src/routes/ultramodern-route-head.tsx`);
|
|
1845
2199
|
const routeMetadata = readText(`${vertical.path}/src/routes/ultramodern-route-metadata.ts`);
|
|
2200
|
+
const ultramodernBuildSource = readText(`${vertical.path}/shared/ultramodern-build.ts`);
|
|
2201
|
+
const ultramodernBuildArtifact = readJson(`${vertical.path}/shared/ultramodern-build.json`);
|
|
2202
|
+
if (vertical.deliveryUnit) {
|
|
2203
|
+
const topologyEntry = findById(topology.verticals, vertical.id);
|
|
2204
|
+
const expectedDeliveryUnit = deliveryUnitBlock(
|
|
2205
|
+
expectedDeliveryUnitFor(vertical, topologyEntry),
|
|
2206
|
+
);
|
|
2207
|
+
const buildLabel = `${vertical.path}/shared/ultramodern-build.json deliveryUnit`;
|
|
2208
|
+
assertSelfCheck(
|
|
2209
|
+
ultramodernBuildSource.includes('export const ultramodernDeliveryUnit'),
|
|
2210
|
+
buildLabel,
|
|
2211
|
+
'Missing ultramodernDeliveryUnit export',
|
|
2212
|
+
deliveryUnitIdentityFixArea,
|
|
2213
|
+
);
|
|
2214
|
+
const buildIdentity = ultramodernBuildArtifact.deliveryUnit ?? {};
|
|
2215
|
+
assertSelfCheck(
|
|
2216
|
+
buildIdentity.buildMarker === expectedDeliveryUnit.buildMarker,
|
|
2217
|
+
buildLabel,
|
|
2218
|
+
`Expected build "${expectedDeliveryUnit.buildMarker}", found ${formatJson(buildIdentity.buildMarker)}`,
|
|
2219
|
+
deliveryUnitIdentityFixArea,
|
|
2220
|
+
);
|
|
2221
|
+
assertSelfCheck(
|
|
2222
|
+
buildIdentity.unitId === expectedDeliveryUnit.unitId,
|
|
2223
|
+
buildLabel,
|
|
2224
|
+
`Expected unitId "${expectedDeliveryUnit.unitId}", found ${formatJson(buildIdentity.unitId)}`,
|
|
2225
|
+
deliveryUnitIdentityFixArea,
|
|
2226
|
+
);
|
|
2227
|
+
assertSelfCheck(
|
|
2228
|
+
buildIdentity.packageName === expectedDeliveryUnit.packageName,
|
|
2229
|
+
buildLabel,
|
|
2230
|
+
`Expected packageName "${expectedDeliveryUnit.packageName}", found ${formatJson(buildIdentity.packageName)}`,
|
|
2231
|
+
deliveryUnitIdentityFixArea,
|
|
2232
|
+
);
|
|
2233
|
+
assertSelfCheck(
|
|
2234
|
+
buildIdentity.version === expectedDeliveryUnit.version,
|
|
2235
|
+
buildLabel,
|
|
2236
|
+
`Expected version "${expectedDeliveryUnit.version}", found ${formatJson(buildIdentity.version)}`,
|
|
2237
|
+
deliveryUnitIdentityFixArea,
|
|
2238
|
+
);
|
|
2239
|
+
assertBuildFacadeExport(
|
|
2240
|
+
ultramodernBuildSource,
|
|
2241
|
+
'ultramodernUiMarker',
|
|
2242
|
+
'ultramodernBuildArtifact.surfaces.ui',
|
|
2243
|
+
`${vertical.path}/shared/ultramodern-build.ts ultramodernUiMarker`,
|
|
2244
|
+
);
|
|
2245
|
+
assertBuildFacadeExport(
|
|
2246
|
+
ultramodernBuildSource,
|
|
2247
|
+
'ultramodernApiMarker',
|
|
2248
|
+
'ultramodernBuildArtifact.surfaces.api',
|
|
2249
|
+
`${vertical.path}/shared/ultramodern-build.ts ultramodernApiMarker`,
|
|
2250
|
+
);
|
|
2251
|
+
}
|
|
2252
|
+
assert(modernAppEnv.includes("import '@modern-js/app-tools/types';"), `${vertical.id} app env must import the framework-owned app ambient type bundle through module resolution`);
|
|
2253
|
+
assert(/declare global \{\s*const ULTRAMODERN_SITE_URL: string;\s*\}/u.test(modernAppEnv), `${vertical.id} app env must keep generated globals explicit after importing app ambient types`);
|
|
2254
|
+
assert(!modernAppEnv.includes("declare module '*.svg'"), `${vertical.id} app env must not redeclare framework-owned svg asset modules`);
|
|
2255
|
+
assert(!modernAppEnv.includes("declare module '*.css'"), `${vertical.id} app env must not redeclare framework-owned css asset modules`);
|
|
1846
2256
|
assert(routeMetadata.includes('@generated by @modern-js/create'), `${vertical.id} route metadata compatibility manifest must be marked generated`);
|
|
1847
2257
|
assert(routeMetadata.includes("authoring: 'colocated-route-meta'"), `${vertical.id} route metadata manifest must advertise colocated authoring`);
|
|
1848
2258
|
assert(packageJson.name === vertical.packageName, `${vertical.id} package name is incorrect`);
|
|
1849
2259
|
assert(packageJson.scripts?.['cloudflare:deploy'] === 'ULTRAMODERN_CLOUDFLARE_REQUIRE_PUBLIC_URLS=true pnpm run cloudflare:build && wrangler deploy --config .output/wrangler.json', `${vertical.id} must expose cloudflare:deploy`);
|
|
2260
|
+
assertTargetIsolatedBuildArtifacts(vertical.id, modernConfig);
|
|
2261
|
+
assertCloudflareBuildSkipsDeployRebuild(vertical.id, packageJson);
|
|
1850
2262
|
assert(packageJson.scripts?.['cloudflare:proof']?.includes(`--app ${vertical.id}`), `${vertical.id} must expose cloudflare:proof`);
|
|
1851
2263
|
assert(packageJson.devDependencies?.['@modern-js/app-tools'] === expectedModernPackageSpecifier('@modern-js/app-tools'), `${vertical.id} app-tools dependency must match package source metadata`);
|
|
1852
2264
|
assert(packageJson.dependencies?.['@modern-js/plugin-bff'] === expectedModernPackageSpecifier('@modern-js/plugin-bff'), `${vertical.id} plugin-bff dependency must match package source metadata`);
|
|
@@ -1892,9 +2304,9 @@ for (const vertical of fullStackVerticals) {
|
|
|
1892
2304
|
assert(!verticalAssetPrefixExpression.includes('configuredSiteUrl') && !verticalAssetPrefixExpression.includes('MODERN_PUBLIC_SITE_URL'), `${vertical.id} asset prefix must not fall back to MODERN_PUBLIC_SITE_URL`);
|
|
1893
2305
|
assert(modernConfig.includes(`envValue('ULTRAMODERN_PUBLIC_URL_${vertical.id.replace(/-/g, '_').toUpperCase()}')`), `${vertical.id} asset prefix must read its per-app public URL`);
|
|
1894
2306
|
assert(modernConfig.includes('inferredCloudflareUrl'), `${vertical.id} asset prefix must support workers.dev origin inference`);
|
|
1895
|
-
assert(
|
|
2307
|
+
assert(/dev:\s*\{\s*\/\/ Remote dev manifests must publish an absolute publicPath[\s\S]*?assetPrefix,\s*\}/u.test(modernConfig), `${vertical.id} modern.config.ts must publish dev assets from its own remote origin`);
|
|
1896
2308
|
assert(modernConfig.includes('assetPrefix,'), `${vertical.id} modern.config.ts must wire output.assetPrefix to the derived asset prefix`);
|
|
1897
|
-
assert(contractEntry?.config?.dev?.assetPrefix === '
|
|
2309
|
+
assert(contractEntry?.config?.dev?.assetPrefix === 'app-public-origin', `${vertical.id} dev asset prefix must default to its app public origin`);
|
|
1898
2310
|
assert(contractEntry?.config?.output?.assetPrefix?.default === 'app-public-origin', `${vertical.id} asset prefix must default to its app public origin`);
|
|
1899
2311
|
assert(JSON.stringify(contractEntry?.config?.output?.assetPrefix?.envFallbackOrder) === JSON.stringify(['MODERN_ASSET_PREFIX', 'ULTRAMODERN_ASSET_PREFIX']), `${vertical.id} asset prefix env fallback order is incorrect`);
|
|
1900
2312
|
assert(contractEntry?.config?.output?.disableTsChecker === false, `${vertical.id} must keep the framework TypeScript checker enabled`);
|
|
@@ -1906,7 +2318,7 @@ for (const vertical of fullStackVerticals) {
|
|
|
1906
2318
|
assert(contractEntry?.config?.rspack?.output?.chunkLoadingGlobal === expectedChunkLoadingGlobal(vertical.mfName), `${vertical.id} Rspack chunkLoadingGlobal is incorrect`);
|
|
1907
2319
|
assert(contractEntry?.moduleFederation?.name === vertical.mfName, `${vertical.id} MF name is incorrect`);
|
|
1908
2320
|
assert(JSON.stringify(contractEntry?.moduleFederation?.exposes) === JSON.stringify(vertical.exposes), `${vertical.id} MF exposes are incorrect`);
|
|
1909
|
-
assert(contractEntry?.moduleFederation?.dts?.compilerInstance === 'tsgo', `${vertical.id} must keep mandatory DTS compiler`);
|
|
2321
|
+
assert(contractEntry?.moduleFederation?.dts?.compilerInstance === 'effect-tsgo', `${vertical.id} must keep mandatory DTS compiler`);
|
|
1910
2322
|
assert(contractEntry?.moduleFederation?.dts?.tsConfigPath === './tsconfig.mf-types.json', `${vertical.id} must keep dedicated Module Federation DTS tsconfig`);
|
|
1911
2323
|
assert(moduleFederationConfig.includes("tsConfigPath: './tsconfig.mf-types.json'"), `${vertical.id} Module Federation config must use the dedicated DTS tsconfig`);
|
|
1912
2324
|
assert(JSON.stringify(contractEntry?.moduleFederation?.verticalRefs ?? []) === JSON.stringify(vertical.verticalRefs), `${vertical.id} MF verticalRefs are incorrect`);
|
|
@@ -1967,6 +2379,42 @@ for (const vertical of fullStackVerticals) {
|
|
|
1967
2379
|
assert(topologyEntry?.api?.readiness?.endpoint === `/${vertical.stem}/readiness`, `${vertical.id} topology readiness endpoint is incorrect`);
|
|
1968
2380
|
assert(Object.keys(topologyEntry?.api?.domainOperations ?? {}).length >= 3, `${vertical.id} topology domain operations are missing`);
|
|
1969
2381
|
|
|
2382
|
+
if (vertical.deliveryUnit) {
|
|
2383
|
+
const expectedDeliveryUnit = deliveryUnitBlock(
|
|
2384
|
+
expectedDeliveryUnitFor(vertical, topologyEntry),
|
|
2385
|
+
);
|
|
2386
|
+
const compactAppEntry = ultramodernConfig.topology?.apps?.find(
|
|
2387
|
+
entry => entry?.id === vertical.id,
|
|
2388
|
+
);
|
|
2389
|
+
const compactBackendDeliveryUnit = deliveryUnitBlock(
|
|
2390
|
+
compactAppEntry?.backendFederation?.deliveryUnit,
|
|
2391
|
+
);
|
|
2392
|
+
assertSameJson(
|
|
2393
|
+
deliveryUnitBlock(compactAppEntry?.deliveryUnit),
|
|
2394
|
+
compactBackendDeliveryUnit,
|
|
2395
|
+
`${compactConfigPath} topology.apps.${vertical.id}.deliveryUnit`,
|
|
2396
|
+
deliveryUnitIdentityFixArea,
|
|
2397
|
+
);
|
|
2398
|
+
assertSameJson(
|
|
2399
|
+
compactBackendDeliveryUnit,
|
|
2400
|
+
expectedDeliveryUnit,
|
|
2401
|
+
`${compactConfigPath} topology.apps.${vertical.id}.backendFederation.deliveryUnit`,
|
|
2402
|
+
deliveryUnitIdentityFixArea,
|
|
2403
|
+
);
|
|
2404
|
+
assertSelfCheck(
|
|
2405
|
+
compactAppEntry?.backendFederation?.versionBoundary?.identityRoot === 'deliveryUnit',
|
|
2406
|
+
`${compactConfigPath} topology.apps.${vertical.id}.backendFederation.versionBoundary.identityRoot`,
|
|
2407
|
+
`Expected "deliveryUnit", found ${formatJson(compactAppEntry?.backendFederation?.versionBoundary?.identityRoot)}`,
|
|
2408
|
+
deliveryUnitIdentityFixArea,
|
|
2409
|
+
);
|
|
2410
|
+
assertSameJson(
|
|
2411
|
+
deliveryUnitBlock(compactAppEntry?.deliveryUnit),
|
|
2412
|
+
deliveryUnitBlock(topologyEntry?.deliveryUnit),
|
|
2413
|
+
`${compactConfigPath} vs topology/reference-topology.json verticals.${vertical.id}.deliveryUnit`,
|
|
2414
|
+
deliveryUnitIdentityFixArea,
|
|
2415
|
+
);
|
|
2416
|
+
}
|
|
2417
|
+
|
|
1970
2418
|
assert(ownership.owners?.some(owner => owner.id === vertical.id && owner.path === vertical.path), `${vertical.id} ownership entry is missing`);
|
|
1971
2419
|
assert(overlay.ports?.[vertical.id], `${vertical.id} development port is missing`);
|
|
1972
2420
|
assert(overlay.manifests?.[vertical.id]?.includes('/mf-manifest.json'), `${vertical.id} development manifest is missing`);
|