@bleedingdev/modern-js-ultramodern-create 3.9.0-ultramodern.2 → 3.9.0-ultramodern.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -74
- package/dist/cjs/cli/package-source.cjs +2 -2
- package/dist/cjs/cli/project-setup.cjs +2 -22
- package/dist/cjs/index.cjs +9 -1
- package/dist/cjs/locale/en.cjs +2 -1
- package/dist/cjs/locale/zh.cjs +2 -1
- package/dist/cjs/ultramodern-package-source.cjs +13 -9
- package/dist/cjs/ultramodern-release-cohort.cjs +6 -21
- package/dist/cjs/ultramodern-tooling/commands/cloudflare-output-verify.cjs +49 -56
- package/dist/cjs/ultramodern-tooling/commands/context.cjs +11 -29
- package/dist/cjs/ultramodern-tooling/commands/routes-generate-app.cjs +67 -0
- package/dist/cjs/ultramodern-tooling/commands/routes-generate.cjs +24 -53
- package/dist/cjs/ultramodern-tooling/commands/validate.cjs +5 -11
- package/dist/cjs/ultramodern-tooling/commands.cjs +15 -8
- package/dist/cjs/ultramodern-tooling/config/index.cjs +10 -24
- package/dist/cjs/ultramodern-tooling/config/load.cjs +12 -10
- package/dist/cjs/ultramodern-tooling/config/metadata.cjs +34 -32
- package/dist/cjs/ultramodern-tooling/config/normalize.cjs +165 -164
- package/dist/cjs/ultramodern-workspace/add-shell.cjs +118 -118
- package/dist/cjs/ultramodern-workspace/add-vertical/execute.cjs +121 -25
- package/dist/cjs/ultramodern-workspace/add-vertical/plan.cjs +14 -160
- package/dist/cjs/ultramodern-workspace/add-vertical/preflight.cjs +16 -48
- package/dist/cjs/ultramodern-workspace/add-vertical/preview.cjs +78 -0
- package/dist/cjs/ultramodern-workspace/add-vertical/shell-files.cjs +87 -24
- package/dist/cjs/ultramodern-workspace/add-vertical/topology.cjs +4 -1
- package/dist/cjs/ultramodern-workspace/add-vertical/transaction.cjs +378 -45
- package/dist/cjs/ultramodern-workspace/add-vertical/workspace-state.cjs +21 -44
- package/dist/cjs/ultramodern-workspace/add-vertical.cjs +0 -9
- package/dist/cjs/ultramodern-workspace/api/client.cjs +5 -5
- package/dist/cjs/ultramodern-workspace/api/contracts.cjs +2 -2
- package/dist/cjs/ultramodern-workspace/api/rpc.cjs +20 -18
- package/dist/cjs/ultramodern-workspace/api/service.cjs +49 -24
- package/dist/cjs/ultramodern-workspace/api/shared.cjs +28 -18
- package/dist/cjs/ultramodern-workspace/app-files.cjs +3 -23
- package/dist/cjs/ultramodern-workspace/backend-federation.cjs +27 -27
- package/dist/cjs/ultramodern-workspace/contracts.cjs +14 -183
- package/dist/cjs/ultramodern-workspace/delivery-unit-schema/surfaces.cjs +85 -0
- package/dist/cjs/ultramodern-workspace/delivery-unit-schema/types.cjs +8 -85
- package/dist/cjs/ultramodern-workspace/delivery-unit-stamp.cjs +16 -4
- package/dist/cjs/ultramodern-workspace/delivery-unit-sync.cjs +27 -17
- package/dist/cjs/ultramodern-workspace/delivery-unit.cjs +16 -10
- package/dist/cjs/ultramodern-workspace/demo-components.cjs +66 -433
- package/dist/cjs/ultramodern-workspace/descriptors.cjs +0 -4
- package/dist/cjs/ultramodern-workspace/fs-io.cjs +37 -2
- package/dist/cjs/ultramodern-workspace/generation-result.cjs +4 -4
- package/dist/cjs/ultramodern-workspace/index.cjs +2 -5
- package/dist/cjs/ultramodern-workspace/mf-validation/constants.cjs +0 -6
- package/dist/cjs/ultramodern-workspace/mf-validation/discovery.cjs +6 -6
- package/dist/cjs/{ultramodern-tooling/commands/migrate-strict-effect/generated-patches.cjs → ultramodern-workspace/mf-validation/exposes.cjs} +13 -17
- package/dist/cjs/ultramodern-workspace/mf-validation/inspect.cjs +26 -7
- package/dist/cjs/ultramodern-workspace/mf-validation/object-literal.cjs +21 -122
- package/dist/cjs/ultramodern-workspace/mf-validation/path-utils.cjs +37 -38
- package/dist/cjs/ultramodern-workspace/mf-validation/syntax.cjs +93 -153
- package/dist/cjs/ultramodern-workspace/mf-validation.cjs +4 -0
- package/dist/cjs/ultramodern-workspace/module-federation/config.cjs +24 -29
- package/dist/cjs/ultramodern-workspace/module-federation/reexport-module.cjs +39 -58
- package/dist/cjs/ultramodern-workspace/module-federation/remote-refs.cjs +1 -43
- package/dist/cjs/ultramodern-workspace/package-json.cjs +63 -37
- package/dist/cjs/ultramodern-workspace/patch-inventory.cjs +104 -0
- package/dist/cjs/ultramodern-workspace/policy.cjs +3 -577
- package/dist/cjs/ultramodern-workspace/public-surface.cjs +3 -3
- package/dist/cjs/ultramodern-workspace/routes.cjs +2 -11
- package/dist/cjs/ultramodern-workspace/shared-patches.cjs +12 -2
- package/dist/cjs/ultramodern-workspace/shells.cjs +0 -70
- package/dist/cjs/ultramodern-workspace/tooling-command-catalog.cjs +27 -41
- package/dist/cjs/ultramodern-workspace/tsconfigs.cjs +8 -2
- package/dist/cjs/ultramodern-workspace/validation/architecture.cjs +397 -0
- package/dist/cjs/ultramodern-workspace/validation/assertions.cjs +140 -0
- package/dist/cjs/ultramodern-workspace/validation/types.cjs +18 -0
- package/dist/cjs/ultramodern-workspace/validation/workspace.cjs +344 -0
- package/dist/cjs/ultramodern-workspace/versions.cjs +81 -45
- package/dist/cjs/ultramodern-workspace/workspace-artifact-ownership.cjs +183 -0
- package/dist/cjs/ultramodern-workspace/workspace-script-plan.cjs +36 -25
- package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +11 -200
- package/dist/cjs/ultramodern-workspace/workspace-validation-contract.cjs +62 -373
- package/dist/cjs/ultramodern-workspace/write-app.cjs +19 -11
- package/dist/cjs/ultramodern-workspace/write-workspace.cjs +20 -50
- package/dist/cjs/ultramodern-workspace/zerops.cjs +2 -0
- package/dist/esm/cli/package-source.js +3 -3
- package/dist/esm/cli/project-setup.js +2 -22
- package/dist/esm/index.js +10 -2
- package/dist/esm/locale/en.js +2 -1
- package/dist/esm/locale/zh.js +2 -1
- package/dist/esm/ultramodern-package-source.js +14 -4
- package/dist/esm/ultramodern-release-cohort.js +5 -14
- package/dist/esm/ultramodern-tooling/commands/cloudflare-output-verify.js +49 -56
- package/dist/esm/ultramodern-tooling/commands/context.js +10 -26
- package/dist/esm/ultramodern-tooling/commands/routes-generate-app.js +35 -0
- package/dist/esm/ultramodern-tooling/commands/routes-generate.js +25 -54
- package/dist/esm/ultramodern-tooling/commands/validate.js +6 -12
- package/dist/esm/ultramodern-tooling/commands.js +15 -9
- package/dist/esm/ultramodern-tooling/config/index.js +0 -2
- package/dist/esm/ultramodern-tooling/config/load.js +9 -9
- package/dist/esm/ultramodern-tooling/config/metadata.js +33 -28
- package/dist/esm/ultramodern-tooling/config/normalize.js +159 -156
- package/dist/esm/ultramodern-workspace/add-shell.js +124 -123
- package/dist/esm/ultramodern-workspace/add-vertical/execute.js +119 -27
- package/dist/esm/ultramodern-workspace/add-vertical/plan.js +16 -150
- package/dist/esm/ultramodern-workspace/add-vertical/preflight.js +15 -47
- package/dist/esm/ultramodern-workspace/add-vertical/preview.js +40 -0
- package/dist/esm/ultramodern-workspace/add-vertical/shell-files.js +87 -25
- package/dist/esm/ultramodern-workspace/add-vertical/topology.js +4 -1
- package/dist/esm/ultramodern-workspace/add-vertical/transaction.js +373 -46
- package/dist/esm/ultramodern-workspace/add-vertical/workspace-state.js +17 -34
- package/dist/esm/ultramodern-workspace/add-vertical.js +1 -1
- package/dist/esm/ultramodern-workspace/api/client.js +5 -5
- package/dist/esm/ultramodern-workspace/api/contracts.js +2 -2
- package/dist/esm/ultramodern-workspace/api/rpc.js +20 -18
- package/dist/esm/ultramodern-workspace/api/service.js +49 -24
- package/dist/esm/ultramodern-workspace/api/shared.js +28 -18
- package/dist/esm/ultramodern-workspace/app-files.js +3 -23
- package/dist/esm/ultramodern-workspace/backend-federation.js +5 -5
- package/dist/esm/ultramodern-workspace/contracts.js +14 -180
- package/dist/esm/ultramodern-workspace/delivery-unit-schema/surfaces.js +41 -0
- package/dist/esm/ultramodern-workspace/delivery-unit-schema/types.js +1 -75
- package/dist/esm/ultramodern-workspace/delivery-unit-stamp.js +16 -4
- package/dist/esm/ultramodern-workspace/delivery-unit-sync.js +28 -18
- package/dist/esm/ultramodern-workspace/delivery-unit.js +12 -6
- package/dist/esm/ultramodern-workspace/demo-components.js +67 -428
- package/dist/esm/ultramodern-workspace/descriptors.js +1 -2
- package/dist/esm/ultramodern-workspace/fs-io.js +37 -2
- package/dist/esm/ultramodern-workspace/generation-result.js +3 -3
- package/dist/esm/ultramodern-workspace/index.js +1 -1
- package/dist/esm/ultramodern-workspace/mf-validation/constants.js +1 -4
- package/dist/esm/ultramodern-workspace/mf-validation/discovery.js +7 -7
- package/dist/esm/ultramodern-workspace/mf-validation/exposes.js +14 -0
- package/dist/esm/ultramodern-workspace/mf-validation/inspect.js +27 -8
- package/dist/esm/ultramodern-workspace/mf-validation/object-literal.js +22 -123
- package/dist/esm/ultramodern-workspace/mf-validation/path-utils.js +36 -34
- package/dist/esm/ultramodern-workspace/mf-validation/syntax.js +83 -143
- package/dist/esm/ultramodern-workspace/mf-validation.js +1 -0
- package/dist/esm/ultramodern-workspace/module-federation/config.js +25 -30
- package/dist/esm/ultramodern-workspace/module-federation/reexport-module.js +39 -58
- package/dist/esm/ultramodern-workspace/module-federation/remote-refs.js +1 -43
- package/dist/esm/ultramodern-workspace/package-json.js +58 -32
- package/dist/esm/ultramodern-workspace/patch-inventory.js +66 -0
- package/dist/esm/ultramodern-workspace/policy.js +2 -564
- package/dist/esm/ultramodern-workspace/public-surface.js +3 -3
- package/dist/esm/ultramodern-workspace/routes.js +2 -11
- package/dist/esm/ultramodern-workspace/shared-patches.js +2 -2
- package/dist/esm/ultramodern-workspace/shells.js +3 -67
- package/dist/esm/ultramodern-workspace/tooling-command-catalog.js +22 -37
- package/dist/esm/ultramodern-workspace/tsconfigs.js +9 -3
- package/dist/esm/ultramodern-workspace/validation/architecture.js +348 -0
- package/dist/esm/ultramodern-workspace/validation/assertions.js +65 -0
- package/dist/esm/ultramodern-workspace/validation/types.js +0 -0
- package/dist/esm/ultramodern-workspace/validation/workspace.js +286 -0
- package/dist/esm/ultramodern-workspace/versions.js +74 -29
- package/dist/esm/ultramodern-workspace/workspace-artifact-ownership.js +128 -0
- package/dist/esm/ultramodern-workspace/workspace-script-plan.js +35 -27
- package/dist/esm/ultramodern-workspace/workspace-scripts.js +10 -190
- package/dist/esm/ultramodern-workspace/workspace-validation-contract.js +65 -376
- package/dist/esm/ultramodern-workspace/write-app.js +18 -10
- package/dist/esm/ultramodern-workspace/write-workspace.js +25 -52
- package/dist/esm/ultramodern-workspace/zerops.js +2 -0
- package/dist/esm-node/cli/package-source.js +3 -3
- package/dist/esm-node/cli/project-setup.js +2 -22
- package/dist/esm-node/index.js +10 -2
- package/dist/esm-node/locale/en.js +2 -1
- package/dist/esm-node/locale/zh.js +2 -1
- package/dist/esm-node/ultramodern-package-source.js +14 -4
- package/dist/esm-node/ultramodern-release-cohort.js +5 -14
- package/dist/esm-node/ultramodern-tooling/commands/cloudflare-output-verify.js +49 -56
- package/dist/esm-node/ultramodern-tooling/commands/context.js +10 -26
- package/dist/esm-node/ultramodern-tooling/commands/routes-generate-app.js +36 -0
- package/dist/esm-node/ultramodern-tooling/commands/routes-generate.js +25 -54
- package/dist/esm-node/ultramodern-tooling/commands/validate.js +6 -12
- package/dist/esm-node/ultramodern-tooling/commands.js +15 -9
- package/dist/esm-node/ultramodern-tooling/config/index.js +0 -2
- package/dist/esm-node/ultramodern-tooling/config/load.js +9 -9
- package/dist/esm-node/ultramodern-tooling/config/metadata.js +33 -28
- package/dist/esm-node/ultramodern-tooling/config/normalize.js +159 -156
- package/dist/esm-node/ultramodern-workspace/add-shell.js +124 -123
- package/dist/esm-node/ultramodern-workspace/add-vertical/execute.js +119 -27
- package/dist/esm-node/ultramodern-workspace/add-vertical/plan.js +16 -150
- package/dist/esm-node/ultramodern-workspace/add-vertical/preflight.js +15 -47
- package/dist/esm-node/ultramodern-workspace/add-vertical/preview.js +41 -0
- package/dist/esm-node/ultramodern-workspace/add-vertical/shell-files.js +87 -25
- package/dist/esm-node/ultramodern-workspace/add-vertical/topology.js +4 -1
- package/dist/esm-node/ultramodern-workspace/add-vertical/transaction.js +373 -46
- package/dist/esm-node/ultramodern-workspace/add-vertical/workspace-state.js +17 -34
- package/dist/esm-node/ultramodern-workspace/add-vertical.js +1 -1
- package/dist/esm-node/ultramodern-workspace/api/client.js +5 -5
- package/dist/esm-node/ultramodern-workspace/api/contracts.js +2 -2
- package/dist/esm-node/ultramodern-workspace/api/rpc.js +20 -18
- package/dist/esm-node/ultramodern-workspace/api/service.js +49 -24
- package/dist/esm-node/ultramodern-workspace/api/shared.js +28 -18
- package/dist/esm-node/ultramodern-workspace/app-files.js +3 -23
- package/dist/esm-node/ultramodern-workspace/backend-federation.js +5 -5
- package/dist/esm-node/ultramodern-workspace/contracts.js +14 -180
- package/dist/esm-node/ultramodern-workspace/delivery-unit-schema/surfaces.js +42 -0
- package/dist/esm-node/ultramodern-workspace/delivery-unit-schema/types.js +1 -75
- package/dist/esm-node/ultramodern-workspace/delivery-unit-stamp.js +16 -4
- package/dist/esm-node/ultramodern-workspace/delivery-unit-sync.js +28 -18
- package/dist/esm-node/ultramodern-workspace/delivery-unit.js +12 -6
- package/dist/esm-node/ultramodern-workspace/demo-components.js +67 -428
- package/dist/esm-node/ultramodern-workspace/descriptors.js +1 -2
- package/dist/esm-node/ultramodern-workspace/fs-io.js +37 -2
- package/dist/esm-node/ultramodern-workspace/generation-result.js +3 -3
- package/dist/esm-node/ultramodern-workspace/index.js +1 -1
- package/dist/esm-node/ultramodern-workspace/mf-validation/constants.js +1 -4
- package/dist/esm-node/ultramodern-workspace/mf-validation/discovery.js +7 -7
- package/dist/esm-node/ultramodern-workspace/mf-validation/exposes.js +15 -0
- package/dist/esm-node/ultramodern-workspace/mf-validation/inspect.js +27 -8
- package/dist/esm-node/ultramodern-workspace/mf-validation/object-literal.js +22 -123
- package/dist/esm-node/ultramodern-workspace/mf-validation/path-utils.js +36 -34
- package/dist/esm-node/ultramodern-workspace/mf-validation/syntax.js +83 -143
- package/dist/esm-node/ultramodern-workspace/mf-validation.js +1 -0
- package/dist/esm-node/ultramodern-workspace/module-federation/config.js +25 -30
- package/dist/esm-node/ultramodern-workspace/module-federation/reexport-module.js +39 -58
- package/dist/esm-node/ultramodern-workspace/module-federation/remote-refs.js +1 -43
- package/dist/esm-node/ultramodern-workspace/package-json.js +58 -32
- package/dist/esm-node/ultramodern-workspace/patch-inventory.js +67 -0
- package/dist/esm-node/ultramodern-workspace/policy.js +2 -564
- package/dist/esm-node/ultramodern-workspace/public-surface.js +3 -3
- package/dist/esm-node/ultramodern-workspace/routes.js +2 -11
- package/dist/esm-node/ultramodern-workspace/shared-patches.js +2 -2
- package/dist/esm-node/ultramodern-workspace/shells.js +3 -67
- package/dist/esm-node/ultramodern-workspace/tooling-command-catalog.js +22 -37
- package/dist/esm-node/ultramodern-workspace/tsconfigs.js +9 -3
- package/dist/esm-node/ultramodern-workspace/validation/architecture.js +349 -0
- package/dist/esm-node/ultramodern-workspace/validation/assertions.js +66 -0
- package/dist/esm-node/ultramodern-workspace/validation/types.js +1 -0
- package/dist/esm-node/ultramodern-workspace/validation/workspace.js +287 -0
- package/dist/esm-node/ultramodern-workspace/versions.js +74 -29
- package/dist/esm-node/ultramodern-workspace/workspace-artifact-ownership.js +129 -0
- package/dist/esm-node/ultramodern-workspace/workspace-script-plan.js +35 -27
- package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +10 -190
- package/dist/esm-node/ultramodern-workspace/workspace-validation-contract.js +65 -376
- package/dist/esm-node/ultramodern-workspace/write-app.js +18 -10
- package/dist/esm-node/ultramodern-workspace/write-workspace.js +25 -52
- package/dist/esm-node/ultramodern-workspace/zerops.js +2 -0
- package/dist/types/cli/project-setup.d.ts +1 -1
- package/dist/types/locale/en.d.ts +1 -0
- package/dist/types/locale/index.d.ts +2 -0
- package/dist/types/locale/zh.d.ts +1 -0
- package/dist/types/ultramodern-package-source.d.ts +2 -4
- package/dist/types/ultramodern-release-cohort.d.ts +1 -3
- package/dist/types/ultramodern-tooling/commands/cloudflare-output-verify.d.ts +2 -2
- package/dist/types/ultramodern-tooling/commands/context.d.ts +4 -1
- package/dist/types/ultramodern-tooling/commands/routes-generate-app.d.ts +1 -0
- package/dist/types/ultramodern-tooling/commands/routes-generate.d.ts +1 -1
- package/dist/types/ultramodern-tooling/commands/validate.d.ts +1 -1
- package/dist/types/ultramodern-tooling/config/index.d.ts +0 -2
- package/dist/types/ultramodern-tooling/config/load.d.ts +10 -2
- package/dist/types/ultramodern-tooling/config/metadata.d.ts +2 -2
- package/dist/types/ultramodern-tooling/config/normalize.d.ts +19 -19
- package/dist/types/ultramodern-tooling/config/types.d.ts +2 -9
- package/dist/types/ultramodern-workspace/add-shell.d.ts +1 -1
- package/dist/types/ultramodern-workspace/add-vertical/execute.d.ts +1 -0
- package/dist/types/ultramodern-workspace/add-vertical/preflight.d.ts +4 -3
- package/dist/types/ultramodern-workspace/add-vertical/preview.d.ts +4 -0
- package/dist/types/ultramodern-workspace/add-vertical/shell-files.d.ts +7 -2
- package/dist/types/ultramodern-workspace/add-vertical/transaction.d.ts +32 -6
- package/dist/types/ultramodern-workspace/add-vertical/workspace-state.d.ts +10 -7
- package/dist/types/ultramodern-workspace/add-vertical.d.ts +1 -1
- package/dist/types/ultramodern-workspace/api/client.d.ts +3 -1
- package/dist/types/ultramodern-workspace/api/rpc.d.ts +1 -1
- package/dist/types/ultramodern-workspace/api/service.d.ts +3 -1
- package/dist/types/ultramodern-workspace/api/shared.d.ts +2 -0
- package/dist/types/ultramodern-workspace/backend-federation.d.ts +1 -1
- package/dist/types/ultramodern-workspace/contracts.d.ts +1 -3
- package/dist/types/ultramodern-workspace/delivery-unit-schema/surfaces.d.ts +17 -0
- package/dist/types/ultramodern-workspace/delivery-unit-schema/types.d.ts +3 -68
- package/dist/types/ultramodern-workspace/delivery-unit-stamp.d.ts +2 -2
- package/dist/types/ultramodern-workspace/delivery-unit.d.ts +3 -3
- package/dist/types/ultramodern-workspace/demo-components.d.ts +0 -3
- package/dist/types/ultramodern-workspace/descriptors.d.ts +0 -1
- package/dist/types/ultramodern-workspace/fs-io.d.ts +1 -1
- package/dist/types/ultramodern-workspace/index.d.ts +1 -1
- package/dist/types/ultramodern-workspace/mf-validation/constants.d.ts +0 -1
- package/dist/types/ultramodern-workspace/mf-validation/exposes.d.ts +11 -0
- package/dist/types/ultramodern-workspace/mf-validation/path-utils.d.ts +2 -3
- package/dist/types/ultramodern-workspace/mf-validation/syntax.d.ts +4 -3
- package/dist/types/ultramodern-workspace/mf-validation/types.d.ts +1 -0
- package/dist/types/ultramodern-workspace/mf-validation.d.ts +1 -0
- package/dist/types/ultramodern-workspace/module-federation/config.d.ts +1 -1
- package/dist/types/ultramodern-workspace/module-federation/reexport-module.d.ts +2 -2
- package/dist/types/ultramodern-workspace/package-json.d.ts +1 -1
- package/dist/types/ultramodern-workspace/patch-inventory.d.ts +10 -0
- package/dist/types/ultramodern-workspace/policy.d.ts +31 -209
- package/dist/types/ultramodern-workspace/routes.d.ts +6 -1
- package/dist/types/ultramodern-workspace/shells.d.ts +2 -15
- package/dist/types/ultramodern-workspace/tooling-command-catalog.d.ts +8 -7
- package/dist/types/ultramodern-workspace/types.d.ts +9 -9
- package/dist/types/ultramodern-workspace/validation/architecture.d.ts +2 -0
- package/dist/types/ultramodern-workspace/validation/assertions.d.ts +14 -0
- package/dist/types/ultramodern-workspace/validation/types.d.ts +9 -0
- package/dist/types/ultramodern-workspace/validation/workspace.d.ts +6 -0
- package/dist/types/ultramodern-workspace/versions.d.ts +73 -28
- package/dist/types/ultramodern-workspace/workspace-artifact-ownership.d.ts +18 -0
- package/dist/types/ultramodern-workspace/workspace-script-plan.d.ts +4 -5
- package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +8 -13
- package/dist/types/ultramodern-workspace/workspace-validation-contract.d.ts +22 -188
- package/dist/types/ultramodern-workspace/write-workspace.d.ts +1 -3
- package/package.json +18 -11
- package/{template-workspace/.modernjs/release-cohort.json → release-cohort.json} +88 -40
- package/template-workspace/.codex/skills/rspack-tracing/scripts/analyze_trace.js +1 -1
- package/template-workspace/README.md.handlebars +20 -35
- package/template-workspace/oxfmt.config.ts +3 -0
- package/template-workspace/pnpm-workspace.yaml.handlebars +0 -24
- package/template-workspace/scripts/bootstrap-agent-skills.mjs +4 -4
- package/templates/packages/shared-contracts-index.ts +4 -332
- package/templates/workspace/apps/modern.config.shared-module-federation.ts.handlebars +10 -0
- package/templates/workspace/apps/modern.config.ts.handlebars +13 -27
- package/templates/workspace/apps/shared/src/routes/ultramodern-route-metadata.ts.handlebars +21 -11
- package/templates/workspace/apps/shell-super-app/src/routes/[lang]/page.tsx.handlebars +20 -20
- package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.helpers.tsx.handlebars +4 -6
- package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.imports.tsx.handlebars +2 -2
- package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.tsx.handlebars +11 -11
- package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.worker.helpers.tsx.handlebars +1 -1
- package/templates/workspace/apps/shell-super-app/src/routes/vertical-components.worker.imports.tsx.handlebars +1 -1
- package/templates/workspace-scripts/generate-node-backend-federation.mjs +68 -77
- package/templates/workspace-scripts/generate-public-surface-assets.mjs +107 -207
- package/templates/workspace-scripts/materialize-zerops-runtime.mjs +12 -19
- package/templates/workspace-scripts/proof-cloudflare-version.mjs +53 -444
- package/templates/workspace-scripts/proof-node-backend-federation.mjs +212 -91
- package/templates/workspace-scripts/{proof-workerd-ssr.mts → proof-workerd-ssr.mjs} +434 -239
- package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +25 -7
- package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +45 -147
- package/templates/workspace-scripts/ultramodern-typecheck.mjs +1 -1
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.cjs +0 -212
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.cjs +0 -47
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.cjs +0 -112
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.cjs +0 -55
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.cjs +0 -102
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.cjs +0 -195
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.cjs +0 -146
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.cjs +0 -110
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.cjs +0 -67
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.cjs +0 -307
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.cjs +0 -58
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.cjs +0 -71
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.cjs +0 -151
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/help.cjs +0 -67
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/install.cjs +0 -52
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/io.cjs +0 -447
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.cjs +0 -323
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/package-source.cjs +0 -87
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.cjs +0 -612
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.cjs +0 -376
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.cjs +0 -73
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.cjs +0 -215
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.cjs +0 -135
- package/dist/cjs/ultramodern-tooling/commands/migrate-strict-effect.cjs +0 -454
- package/dist/cjs/ultramodern-tooling/config/constants.cjs +0 -48
- package/dist/cjs/ultramodern-tooling/config/synthesize.cjs +0 -157
- package/dist/cjs/ultramodern-workspace/delivery-unit-schema/up-projection.cjs +0 -188
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.js +0 -154
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.js +0 -9
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.js +0 -63
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.js +0 -7
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +0 -47
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +0 -146
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.js +0 -97
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.js +0 -61
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.js +0 -16
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +0 -258
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.js +0 -10
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.js +0 -8
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.js +0 -15
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.js +0 -100
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/help.js +0 -29
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/install.js +0 -14
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/io.js +0 -385
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +0 -276
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/package-source.js +0 -49
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +0 -559
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +0 -329
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.js +0 -19
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.js +0 -148
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.js +0 -80
- package/dist/esm/ultramodern-tooling/commands/migrate-strict-effect.js +0 -405
- package/dist/esm/ultramodern-tooling/config/constants.js +0 -4
- package/dist/esm/ultramodern-tooling/config/synthesize.js +0 -108
- package/dist/esm/ultramodern-workspace/delivery-unit-schema/up-projection.js +0 -129
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.js +0 -155
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.js +0 -10
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.js +0 -64
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.js +0 -8
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.js +0 -48
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.js +0 -147
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.js +0 -98
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.js +0 -62
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.js +0 -17
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.js +0 -259
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.js +0 -11
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.js +0 -9
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.js +0 -16
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.js +0 -101
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/help.js +0 -30
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/install.js +0 -15
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/io.js +0 -386
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.js +0 -277
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/package-source.js +0 -50
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.js +0 -560
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.js +0 -330
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.js +0 -20
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.js +0 -149
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.js +0 -81
- package/dist/esm-node/ultramodern-tooling/commands/migrate-strict-effect.js +0 -406
- package/dist/esm-node/ultramodern-tooling/config/constants.js +0 -5
- package/dist/esm-node/ultramodern-tooling/config/synthesize.js +0 -109
- package/dist/esm-node/ultramodern-workspace/delivery-unit-schema/up-projection.js +0 -130
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/api-metadata.d.ts +0 -12
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/declaration-patches.d.ts +0 -4
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/dependency-usage.d.ts +0 -1
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-backend-federation.d.ts +0 -3
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-build-identity.d.ts +0 -5
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-modern-configs.d.ts +0 -3
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxfmt.d.ts +0 -2
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-oxlint.d.ts +0 -2
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-removal.d.ts +0 -4
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-typescript.d.ts +0 -3
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts-zerops.d.ts +0 -3
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-artifacts.d.ts +0 -8
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-patches.d.ts +0 -3
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/generated-ui-source.d.ts +0 -3
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/help.d.ts +0 -1
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/install.d.ts +0 -2
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/io.d.ts +0 -26
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-cohort.d.ts +0 -25
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/package-source.d.ts +0 -3
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-policy.d.ts +0 -26
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/pnpm-yaml.d.ts +0 -26
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/policy-constants.d.ts +0 -6
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/react-router-retirement.d.ts +0 -37
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect/toolchain-pins.d.ts +0 -4
- package/dist/types/ultramodern-tooling/commands/migrate-strict-effect.d.ts +0 -2
- package/dist/types/ultramodern-tooling/config/constants.d.ts +0 -3
- package/dist/types/ultramodern-tooling/config/synthesize.d.ts +0 -5
- package/dist/types/ultramodern-workspace/delivery-unit-schema/up-projection.d.ts +0 -189
- package/template-workspace/patches/@module-federation__bridge-react@2.9.0.patch +0 -47
- package/template-workspace/patches/@module-federation__dts-plugin@2.9.0.patch +0 -26
- package/template-workspace/patches/@module-federation__modern-js-v3@2.9.0.patch +0 -268
- package/template-workspace/patches/@module-federation__runtime-core@2.9.0.patch +0 -13
- package/template-workspace/patches/drizzle-orm-ts7-strict-declarations.patch +0 -471
- package/template-workspace/patches/msgpackr@2.1.0.patch +0 -30
- package/template-workspace/patches/zod@4.5.4.patch +0 -56
- package/templates/workspace-scripts/check-ultramodern-api-boundaries.mts +0 -779
- package/templates/workspace-scripts/check-ultramodern-i18n-boundaries.mts +0 -9
- package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +0 -4109
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
function assert(condition, message) {
|
|
3
|
+
if (!condition) throw new Error(message);
|
|
4
|
+
}
|
|
5
|
+
const canonicalizeJson = (value)=>{
|
|
6
|
+
if (Array.isArray(value)) {
|
|
7
|
+
const entries = value.map(canonicalizeJson);
|
|
8
|
+
const keyedEntries = entries.every((entry)=>null !== entry && 'object' == typeof entry && !Array.isArray(entry) && 'id' in entry && 'string' == typeof entry.id);
|
|
9
|
+
if (keyedEntries) {
|
|
10
|
+
const ids = entries.map((entry)=>entry.id);
|
|
11
|
+
if (new Set(ids).size === ids.length) return entries.toSorted((left, right)=>left.id.localeCompare(right.id));
|
|
12
|
+
}
|
|
13
|
+
return entries;
|
|
14
|
+
}
|
|
15
|
+
if (null !== value && 'object' == typeof value) return Object.fromEntries(Object.keys(value).toSorted().map((key)=>[
|
|
16
|
+
key,
|
|
17
|
+
canonicalizeJson(value[key])
|
|
18
|
+
]));
|
|
19
|
+
return value;
|
|
20
|
+
};
|
|
21
|
+
const sameJson = (actual, expected)=>JSON.stringify(canonicalizeJson(actual)) === JSON.stringify(canonicalizeJson(expected));
|
|
22
|
+
const formatJson = (value)=>void 0 === value ? 'undefined' : JSON.stringify(canonicalizeJson(value));
|
|
23
|
+
const selfCheckFailure = (contract, message, fixArea)=>`MicroVertical contract self-check failed: ${contract}. ${message}. Fix area: ${fixArea}.`;
|
|
24
|
+
function assertSelfCheck(condition, contract, message, fixArea) {
|
|
25
|
+
assert(condition, selfCheckFailure(contract, message, fixArea));
|
|
26
|
+
}
|
|
27
|
+
const assertSameJson = (actual, expected, contract, fixArea)=>{
|
|
28
|
+
assertSelfCheck(sameJson(actual, expected), contract, `Expected ${formatJson(expected)}, found ${formatJson(actual)}`, fixArea);
|
|
29
|
+
};
|
|
30
|
+
const assertIncludesJson = (actual, required, contract, fixArea)=>{
|
|
31
|
+
assertArray(actual, contract, fixArea);
|
|
32
|
+
for (const entry of required)assertSelfCheck(actual.some((value)=>sameJson(value, entry)), contract, `Missing required entry ${formatJson(entry)}`, fixArea);
|
|
33
|
+
};
|
|
34
|
+
function assertObject(value, contract, fixArea) {
|
|
35
|
+
assertSelfCheck(null !== value && 'object' == typeof value && !Array.isArray(value), contract, `Expected JSON object, found ${formatJson(value)}`, fixArea);
|
|
36
|
+
}
|
|
37
|
+
function assertArray(value, contract, fixArea) {
|
|
38
|
+
assertSelfCheck(Array.isArray(value), contract, `Expected JSON array, found ${formatJson(value)}`, fixArea);
|
|
39
|
+
}
|
|
40
|
+
const assertUniqueStrings = (values, contract)=>{
|
|
41
|
+
assert(Array.isArray(values), `${contract} must be an array`);
|
|
42
|
+
const seen = new Set();
|
|
43
|
+
for (const value of values){
|
|
44
|
+
assert('string' == typeof value && value.length > 0, `${contract} must contain non-empty strings`);
|
|
45
|
+
assert(!seen.has(value), `Duplicate value "${value}" in ${contract}`);
|
|
46
|
+
seen.add(value);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const assertUniqueIdEntries = (entries, contract)=>{
|
|
50
|
+
assert(Array.isArray(entries), `${contract} must be an array`);
|
|
51
|
+
const seen = new Set();
|
|
52
|
+
for (const entry of entries){
|
|
53
|
+
const id = entry?.id;
|
|
54
|
+
assert('string' == typeof id && id.length > 0, `${contract} entries must have non-empty string ids`);
|
|
55
|
+
assert(!seen.has(id), `Duplicate id "${id}" in ${contract}`);
|
|
56
|
+
seen.add(id);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const assertSameIdCohort = (entries, expectedIds, contract, fixArea)=>{
|
|
60
|
+
assert(entries && expectedIds, `${contract} must be an array`);
|
|
61
|
+
assertUniqueIdEntries(entries, contract);
|
|
62
|
+
assertSameJson(entries.map((entry)=>entry.id).toSorted(), [
|
|
63
|
+
...expectedIds
|
|
64
|
+
].toSorted(), `${contract} cohort`, fixArea);
|
|
65
|
+
};
|
|
66
|
+
export { assert, assertArray, assertIncludesJson, assertObject, assertSameIdCohort, assertSameJson, assertSelfCheck, assertUniqueIdEntries, assertUniqueStrings, canonicalizeJson, formatJson, sameJson, selfCheckFailure };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "node:module";
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import node_fs from "node:fs";
|
|
3
|
+
import node_path from "node:path";
|
|
4
|
+
import { yaml } from "@modern-js/utils";
|
|
5
|
+
import { hasCreateReleaseCohort, isCreatePackageSourceCheckout, readCreateReleaseCohort } from "../../ultramodern-release-cohort.js";
|
|
6
|
+
import { assertCompilerArchitecture } from "./architecture.js";
|
|
7
|
+
function assert(condition, message) {
|
|
8
|
+
if (!condition) throw new Error(message);
|
|
9
|
+
}
|
|
10
|
+
function record(value, label) {
|
|
11
|
+
assert(null !== value && 'object' == typeof value && !Array.isArray(value), `${label} must be an object`);
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
function entries(value, label) {
|
|
15
|
+
assert(Array.isArray(value), `${label} must be an array`);
|
|
16
|
+
return value.map((entry, index)=>record(entry, `${label}[${index}]`));
|
|
17
|
+
}
|
|
18
|
+
function distinct(values, label) {
|
|
19
|
+
assert(new Set(values).size === values.length, `${label} contains duplicate entries`);
|
|
20
|
+
}
|
|
21
|
+
function requiredFile(root, relative, label) {
|
|
22
|
+
assert(node_fs.existsSync(node_path.join(root, relative)), `${label} is missing: ${relative}`);
|
|
23
|
+
}
|
|
24
|
+
function developmentUrl(value, port, label, generatedPath) {
|
|
25
|
+
assert('string' == typeof value, `${label} must be a URL`);
|
|
26
|
+
let parsed;
|
|
27
|
+
try {
|
|
28
|
+
parsed = new URL(value);
|
|
29
|
+
} catch {
|
|
30
|
+
throw new Error(`${label} must be a URL`);
|
|
31
|
+
}
|
|
32
|
+
assert([
|
|
33
|
+
'http:',
|
|
34
|
+
'https:'
|
|
35
|
+
].includes(parsed.protocol) && parsed.hostname.length > 0, `${label} must be an HTTP URL`);
|
|
36
|
+
if (generatedPath && parsed.pathname === generatedPath && ('localhost' === parsed.hostname || '127.0.0.1' === parsed.hostname)) assert(Number(parsed.port) === port, `${label} must use the app development port ${port}`);
|
|
37
|
+
return parsed;
|
|
38
|
+
}
|
|
39
|
+
function safePath(root, relative, label) {
|
|
40
|
+
assert('string' == typeof relative && relative.length > 0 && !node_path.isAbsolute(relative), `${label} must be a relative path`);
|
|
41
|
+
const resolved = node_path.resolve(root, relative);
|
|
42
|
+
assert(resolved.startsWith(`${node_path.resolve(root)}${node_path.sep}`), `${label} leaves the workspace`);
|
|
43
|
+
const realRoot = node_fs.realpathSync(root);
|
|
44
|
+
const real = node_fs.realpathSync(resolved);
|
|
45
|
+
assert(real.startsWith(`${realRoot}${node_path.sep}`), `${label} resolves outside the workspace`);
|
|
46
|
+
return resolved;
|
|
47
|
+
}
|
|
48
|
+
function validateApiClientExports(root, appPath, appId, exports) {
|
|
49
|
+
const clients = [
|
|
50
|
+
'./api/client',
|
|
51
|
+
'./api/rpc-client'
|
|
52
|
+
].map((key)=>exports?.[key]).filter((value)=>void 0 !== value);
|
|
53
|
+
assert(clients.length > 0, `${appId} must export its API client`);
|
|
54
|
+
for (const client of clients){
|
|
55
|
+
assert('string' == typeof client && client.startsWith('./') && !client.split(/[\\/]/u).includes('..') && /\.[cm]?[jt]sx?$/u.test(client), `${appId} must export its API client from an app-owned source module`);
|
|
56
|
+
assert(node_fs.existsSync(node_path.join(root, appPath, client)), `${appId} API client is missing: ${client}`);
|
|
57
|
+
const clientFile = safePath(node_path.join(root, appPath), client, `${appId} API client`);
|
|
58
|
+
assert(node_fs.statSync(clientFile).isFile(), `${appId} API client must be a file`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function validateApiOnlySourceSurface(root, app) {
|
|
62
|
+
assert(!Object.hasOwn(app.backendFederation?.versionBoundary ?? {}, 'ui'), `topology/reference-topology.json verticals.${app.id}.backendFederation must omit the UI boundary for an api-only unit`);
|
|
63
|
+
for (const relative of [
|
|
64
|
+
'module-federation.config.ts',
|
|
65
|
+
'src/federation-entry.tsx',
|
|
66
|
+
`src/components/${app.id}-widget.tsx`,
|
|
67
|
+
'src/routes/layout.tsx',
|
|
68
|
+
'src/routes/[lang]/page.tsx',
|
|
69
|
+
'src/routes/[lang]/route.meta.ts',
|
|
70
|
+
'src/routes/ultramodern-route-metadata.ts',
|
|
71
|
+
'src/routes/ultramodern-route-head.tsx',
|
|
72
|
+
'src/routes/index.css'
|
|
73
|
+
])assert(!node_fs.existsSync(node_path.join(root, app.path, relative)), `Unexpected ${app.path}/${relative} for a api-only unit`);
|
|
74
|
+
const mfTypesPath = node_path.join(root, app.path, 'tsconfig.mf-types.json');
|
|
75
|
+
if (node_fs.existsSync(mfTypesPath)) {
|
|
76
|
+
const mfTypes = record(JSON.parse(node_fs.readFileSync(mfTypesPath, 'utf8')), `${app.id} tsconfig.mf-types.json`);
|
|
77
|
+
assert(!mfTypes.include?.includes('src/federation-entry.tsx'), `${app.id}: restore the generated MicroVertical Module Federation DTS boundary`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function validateBackendFederationEntrypoints(root, appPath, appId) {
|
|
81
|
+
for (const relative of [
|
|
82
|
+
'backend-federation.config.ts',
|
|
83
|
+
'api/index.ts',
|
|
84
|
+
'api/effect-api.ts'
|
|
85
|
+
])requiredFile(root, `${appPath}/${relative}`, `${appId} API surface`);
|
|
86
|
+
}
|
|
87
|
+
function validateWorkspace(root, expected) {
|
|
88
|
+
const readJson = (relative)=>record(JSON.parse(node_fs.readFileSync(safePath(root, relative, relative), 'utf8')), relative);
|
|
89
|
+
const topology = readJson('topology/reference-topology.json');
|
|
90
|
+
const ownership = readJson('topology/ownership.json');
|
|
91
|
+
const overlay = readJson('topology/local-overlays/development.json');
|
|
92
|
+
const rootManifest = readJson('package.json');
|
|
93
|
+
const workspace = record(yaml.load(node_fs.readFileSync(node_path.join(root, 'pnpm-workspace.yaml'), 'utf8')), 'pnpm-workspace.yaml');
|
|
94
|
+
for (const [label, value] of [
|
|
95
|
+
[
|
|
96
|
+
'topology',
|
|
97
|
+
topology
|
|
98
|
+
],
|
|
99
|
+
[
|
|
100
|
+
'ownership',
|
|
101
|
+
ownership
|
|
102
|
+
],
|
|
103
|
+
[
|
|
104
|
+
'overlay',
|
|
105
|
+
overlay
|
|
106
|
+
]
|
|
107
|
+
])assert(1 === value.schemaVersion, `${label} schemaVersion must be 1`);
|
|
108
|
+
assert(rootManifest.name === expected.packageScope, 'Root package name disagrees with the workspace scope');
|
|
109
|
+
const shell = record(topology.shell, 'topology.shell');
|
|
110
|
+
const verticals = entries(topology.verticals, 'topology.verticals');
|
|
111
|
+
const shells = [
|
|
112
|
+
shell,
|
|
113
|
+
...entries(topology.shells ?? [], 'topology.shells')
|
|
114
|
+
];
|
|
115
|
+
const apps = [
|
|
116
|
+
...shells,
|
|
117
|
+
...verticals
|
|
118
|
+
];
|
|
119
|
+
const shared = entries(topology.sharedPackages ?? [], 'topology.sharedPackages');
|
|
120
|
+
const owners = entries(ownership.owners, 'ownership.owners');
|
|
121
|
+
distinct(apps.map((app)=>app.id), 'topology app ids');
|
|
122
|
+
distinct([
|
|
123
|
+
...apps,
|
|
124
|
+
...shared
|
|
125
|
+
].map((app)=>app.path), 'topology package paths');
|
|
126
|
+
distinct(shared.map((pkg)=>pkg.id), 'topology shared package ids');
|
|
127
|
+
distinct(owners.map((owner)=>owner.id), 'ownership ids');
|
|
128
|
+
assert(shared.length === expected.sharedPackages.length, 'Shared package membership disagrees with canonical inputs');
|
|
129
|
+
for (const expectedShared of expected.sharedPackages){
|
|
130
|
+
const actual = shared.find((entry)=>entry.id === expectedShared.id);
|
|
131
|
+
assert(actual?.path === expectedShared.path && actual?.package === expectedShared.packageName, `${expectedShared.id} shared package identity disagrees with canonical inputs`);
|
|
132
|
+
}
|
|
133
|
+
const expectedApps = new Map(expected.apps.map((app)=>[
|
|
134
|
+
app.id,
|
|
135
|
+
app
|
|
136
|
+
]));
|
|
137
|
+
assert(apps.length === expectedApps.size, 'Topology app membership disagrees with canonical inputs');
|
|
138
|
+
const verticalIds = new Set(verticals.map((vertical)=>vertical.id));
|
|
139
|
+
const ids = new Set(apps.map((app)=>app.id));
|
|
140
|
+
for (const app of apps){
|
|
141
|
+
const input = expectedApps.get(app.id);
|
|
142
|
+
assert(input, `Unexpected topology app ${app.id}`);
|
|
143
|
+
assert(app.kind === input.kind, `${app.id} kind disagrees with canonical inputs`);
|
|
144
|
+
assert(app.path === input.path, `${app.id} path disagrees with canonical inputs`);
|
|
145
|
+
assert(app.package === input.packageName, `${app.id} package identity disagrees with canonical inputs`);
|
|
146
|
+
const manifest = readJson(`${app.path}/package.json`);
|
|
147
|
+
assert(manifest.name === app.package, `${app.id} package name contradicts topology`);
|
|
148
|
+
assert(manifest.modernjs?.appId === app.id, `${app.id} modernjs.appId contradicts topology`);
|
|
149
|
+
const owner = owners.find((candidate)=>candidate.id === app.id);
|
|
150
|
+
assert(owner?.path === app.path && owner?.package === manifest.name, `${app.id} ownership identity contradicts topology and package.json`);
|
|
151
|
+
const refs = app.moduleFederation?.verticalRefs ?? app.verticalRefs ?? [];
|
|
152
|
+
assert(Array.isArray(refs), `${app.id} verticalRefs must be an array`);
|
|
153
|
+
distinct(refs, `${app.id} verticalRefs`);
|
|
154
|
+
for (const ref of refs)assert(verticalIds.has(ref), `${app.id} references unknown vertical ${ref}`);
|
|
155
|
+
assert(JSON.stringify(refs) === JSON.stringify(input.verticalRefs), `${app.id} verticalRefs disagree with canonical inputs`);
|
|
156
|
+
const port = overlay.ports?.[app.id];
|
|
157
|
+
assert(Number.isInteger(port) && port > 0 && port < 65536, `${app.id} has no development port`);
|
|
158
|
+
requiredFile(root, `${app.path}/modern.config.ts`, `${app.id} Modern.js config`);
|
|
159
|
+
if (input.emitsUi) requiredFile(root, `${app.path}/src/modern.runtime.ts`, `${app.id} runtime`);
|
|
160
|
+
requiredFile(root, `${app.path}/shared/ultramodern-build.json`, `${app.id} build stamp`);
|
|
161
|
+
const cloudflare = record(app.cloudflare, `${app.id} cloudflare`);
|
|
162
|
+
for (const field of [
|
|
163
|
+
'workerName',
|
|
164
|
+
'publicUrlEnv'
|
|
165
|
+
])assert('string' == typeof cloudflare[field] && cloudflare[field].length > 0, `${app.id} cloudflare.${field} is required`);
|
|
166
|
+
const cloudflareRoutes = record(cloudflare.routes, `${app.id} cloudflare.routes`);
|
|
167
|
+
record(cloudflare.security, `${app.id} cloudflare.security`);
|
|
168
|
+
record(cloudflare.qualityGates, `${app.id} cloudflare.qualityGates`);
|
|
169
|
+
if ('shell' === app.kind) assert('string' == typeof cloudflareRoutes.ssr && cloudflareRoutes.ssr.startsWith('/'), `${app.id} cloudflare SSR route is required`);
|
|
170
|
+
if (input.emitsApi) {
|
|
171
|
+
const routeKey = app.api?.protocol === 'rpc' ? 'rpc' : 'apiReadiness';
|
|
172
|
+
assert('string' == typeof cloudflareRoutes[routeKey] && cloudflareRoutes[routeKey].startsWith('/'), `${app.id} cloudflare API ${routeKey} route is required`);
|
|
173
|
+
}
|
|
174
|
+
if (input.emitsUi && 'shell' !== app.kind) {
|
|
175
|
+
assert('string' == typeof overlay.manifests?.[app.id], `${app.id} has no development MF manifest URL`);
|
|
176
|
+
developmentUrl(overlay.manifests[app.id], port, `${app.id} MF manifest URL`, '/mf-manifest.json');
|
|
177
|
+
requiredFile(root, `${app.path}/module-federation.config.ts`, `${app.id} Module Federation config`);
|
|
178
|
+
for (const [expose, relative] of Object.entries(input.exposes)){
|
|
179
|
+
assert('string' == typeof relative && relative.startsWith('./src/'), `${app.id} ${expose} Module Federation expose must target a source file`);
|
|
180
|
+
assert(node_fs.existsSync(node_path.join(root, app.path, relative)), `${app.id} ${expose} Module Federation expose source ${relative} is missing`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (input.emitsApi) assert('string' == typeof overlay.apis?.[app.id], `${app.id} has no development API URL`);
|
|
184
|
+
if (input.emitsApi && 'vertical' === app.kind) {
|
|
185
|
+
const apiUrl = developmentUrl(overlay.apis[app.id], port, `${app.id} API URL`);
|
|
186
|
+
const serverExecution = record(overlay.serverExecution?.[app.id], `${app.id} server execution`);
|
|
187
|
+
assert(serverExecution.apiBaseUrl === apiUrl.href.replace(/\/$/, ''), `${app.id} server execution API URL disagrees with overlay`);
|
|
188
|
+
const backend = record(app.backendFederation, `${app.id} backendFederation`);
|
|
189
|
+
const node = record(backend.executionSurfaces?.node, `${app.id} backendFederation node`);
|
|
190
|
+
developmentUrl(node.manifestUrl, port, `${app.id} backend manifest URL`, '/backend-mf-manifest.json');
|
|
191
|
+
developmentUrl(node.containerEntry, port, `${app.id} backend container URL`, '/backendRemoteEntry.cjs');
|
|
192
|
+
validateBackendFederationEntrypoints(root, app.path, app.id);
|
|
193
|
+
const apiExport = manifest.exports?.['./api'];
|
|
194
|
+
assert('string' == typeof apiExport && apiExport.startsWith('./shared/'), `${app.id} must export its shared API contract`);
|
|
195
|
+
assert(node_fs.existsSync(node_path.join(root, app.path, apiExport)), `${app.id} shared API contract ${apiExport} is missing`);
|
|
196
|
+
validateApiClientExports(root, app.path, app.id, manifest.exports);
|
|
197
|
+
const backendDelivery = record(backend.deliveryUnit, `${app.id} backendFederation.deliveryUnit`);
|
|
198
|
+
assert(backendDelivery.unitId === app.deliveryUnit?.unitId && backendDelivery.packageName === manifest.name && backendDelivery.buildMarker === app.deliveryUnit?.buildMarker, `${app.id} backend federation delivery identity contradicts topology`);
|
|
199
|
+
assert(backend.versionBoundary?.identityRoot === 'deliveryUnit' && backend.versionBoundary?.packageName === manifest.name, `${app.id} backend federation version boundary contradicts topology`);
|
|
200
|
+
assert(node.expected?.unitId === app.deliveryUnit?.unitId && node.expected?.buildMarker === app.deliveryUnit?.buildMarker, `${app.id} backend federation node identity contradicts topology`);
|
|
201
|
+
assert(serverExecution.deliveryUnit?.unitId === app.deliveryUnit?.unitId && serverExecution.deliveryUnit?.buildMarker === app.deliveryUnit?.buildMarker, `${app.id} server execution identity contradicts topology`);
|
|
202
|
+
assert(serverExecution.node?.manifestUrl === node.manifestUrl && serverExecution.node?.containerEntry === node.containerEntry, `${app.id} server execution node endpoints contradict topology`);
|
|
203
|
+
}
|
|
204
|
+
if ('vertical' === app.kind && !input.emitsUi) validateApiOnlySourceSurface(root, app);
|
|
205
|
+
if ('vertical' === app.kind && !input.emitsApi) {
|
|
206
|
+
assert(!Object.hasOwn(overlay.apis ?? {}, app.id) && !Object.hasOwn(overlay.serverExecution ?? {}, app.id), `${app.id} UI-only vertical must not declare API endpoints`);
|
|
207
|
+
assert(!app.backendFederation && !app.api, `${app.id} UI-only vertical must not declare a backend API`);
|
|
208
|
+
for (const relative of [
|
|
209
|
+
'shared/api.ts',
|
|
210
|
+
'shared/rpc.ts',
|
|
211
|
+
'backend-federation.config.ts',
|
|
212
|
+
'api/index.ts',
|
|
213
|
+
'api/effect-api.ts',
|
|
214
|
+
'api/backend-federation.ts',
|
|
215
|
+
`src/api/${app.id}-client.ts`,
|
|
216
|
+
`src/api/${app.id}-rpc-client.ts`
|
|
217
|
+
])assert(!node_fs.existsSync(node_path.join(root, app.path, relative)), `Unexpected ${app.path}/${relative} for a ui-only unit`);
|
|
218
|
+
}
|
|
219
|
+
const delivery = record(app.deliveryUnit, `${app.id} deliveryUnit`);
|
|
220
|
+
assert('string' == typeof delivery.unitId && delivery.unitId.length > 0 && delivery.packageName === manifest.name, `${app.id} delivery unit identity contradicts package.json`);
|
|
221
|
+
const build = readJson(`${app.path}/shared/ultramodern-build.json`);
|
|
222
|
+
assert(build.deliveryUnit?.unitId === delivery.unitId && build.deliveryUnit?.packageName === manifest.name && build.deliveryUnit?.buildMarker === delivery.buildMarker, `${app.id} build identity contradicts topology`);
|
|
223
|
+
}
|
|
224
|
+
for (const pkg of shared){
|
|
225
|
+
const manifest = readJson(`${pkg.path}/package.json`);
|
|
226
|
+
assert(manifest.name === pkg.package, `${pkg.id} shared package identity contradicts topology`);
|
|
227
|
+
assert(owners.some((owner)=>owner.id === pkg.id && owner.path === pkg.path && owner.package === manifest.name), `${pkg.id} ownership identity contradicts package.json`);
|
|
228
|
+
}
|
|
229
|
+
for (const owner of owners)assert(ids.has(owner.id) || shared.some((pkg)=>pkg.id === owner.id), `Ownership names unknown package ${owner.id}`);
|
|
230
|
+
const catalogs = record(workspace.catalogs ?? {}, 'workspace catalogs');
|
|
231
|
+
const catalog = record(catalogs.ultramodern ?? {}, 'ultramodern catalog');
|
|
232
|
+
const producer = hasCreateReleaseCohort() ? readCreateReleaseCohort() : void 0;
|
|
233
|
+
const sourceCheckout = isCreatePackageSourceCheckout();
|
|
234
|
+
const cohort = new Map(producer?.packages.map((pkg)=>[
|
|
235
|
+
pkg.sourceName,
|
|
236
|
+
pkg
|
|
237
|
+
]) ?? []);
|
|
238
|
+
const members = [
|
|
239
|
+
...apps,
|
|
240
|
+
...shared
|
|
241
|
+
].map((app)=>`${app.path}/package.json`);
|
|
242
|
+
members.push('package.json');
|
|
243
|
+
for (const member of members){
|
|
244
|
+
const manifest = readJson(member);
|
|
245
|
+
for (const group of [
|
|
246
|
+
'dependencies',
|
|
247
|
+
'devDependencies',
|
|
248
|
+
'optionalDependencies',
|
|
249
|
+
'peerDependencies'
|
|
250
|
+
])for (const [name, request] of Object.entries(record(manifest[group] ?? {}, `${member} ${group}`))){
|
|
251
|
+
if (!expected.modernPackages.includes(name)) continue;
|
|
252
|
+
assert('string' == typeof request, `${member} ${name} dependency request must be a string`);
|
|
253
|
+
const catalogRequest = 'catalog:ultramodern' === request ? catalog[name] : void 0;
|
|
254
|
+
const effective = catalogRequest ?? request;
|
|
255
|
+
assert('string' == typeof effective && effective.length > 0, `${member} ${name} has no catalog entry`);
|
|
256
|
+
if ('workspace:*' !== request) assert('catalog:ultramodern' === request, `${member} ${name} must use the ultramodern catalog`);
|
|
257
|
+
assert(producer || sourceCheckout || 'workspace:*' === request, `${member} ${name} uses the ultramodern catalog, but the installed ultramodern-create package is missing release-cohort.json. Install a published ultramodern-create release, or generate with --ultramodern-package-source workspace.`);
|
|
258
|
+
if (producer && 'workspace:*' !== request) {
|
|
259
|
+
const release = cohort.get(name);
|
|
260
|
+
assert(release, `${member} ${name} is absent from the installed release cohort`);
|
|
261
|
+
assert(effective === `npm:${release.targetName}@${release.version}`, `${member} ${name} catalog request disagrees with the installed release cohort`);
|
|
262
|
+
}
|
|
263
|
+
let memberDir = node_path.dirname(node_path.join(root, member));
|
|
264
|
+
let installedPath;
|
|
265
|
+
while(memberDir.startsWith(node_path.resolve(root))){
|
|
266
|
+
const candidate = node_path.join(memberDir, 'node_modules', name, 'package.json');
|
|
267
|
+
if (node_fs.existsSync(candidate)) {
|
|
268
|
+
installedPath = candidate;
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
if (memberDir === node_path.resolve(root)) break;
|
|
272
|
+
memberDir = node_path.dirname(memberDir);
|
|
273
|
+
}
|
|
274
|
+
if ('workspace:*' !== request && node_fs.existsSync(node_path.join(root, 'node_modules'))) assert(installedPath, `${member} ${name} is not installed`);
|
|
275
|
+
if (installedPath && 'workspace:*' !== request) {
|
|
276
|
+
const installed = record(JSON.parse(node_fs.readFileSync(installedPath, 'utf8')), installedPath);
|
|
277
|
+
const aliasMatch = /^npm:(@[^/]+\/[^@]+)@(.+)$/u.exec(effective);
|
|
278
|
+
assert(aliasMatch, `${member} ${name} catalog entry must name an installed package and version`);
|
|
279
|
+
assert(installed.name === aliasMatch[1] && installed.version === aliasMatch[2], `${member} ${name} installed package identity/version disagrees with the catalog`);
|
|
280
|
+
if (producer) assert(installed.version === producer.release.version, `${member} ${name} installed version disagrees with the release cohort`);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
assertCompilerArchitecture(root, expected);
|
|
285
|
+
console.log('UltraModern workspace validated');
|
|
286
|
+
}
|
|
287
|
+
export { validateApiClientExports, validateApiOnlySourceSurface, validateBackendFederationEntrypoints, validateWorkspace };
|
|
@@ -1,39 +1,84 @@
|
|
|
1
1
|
import "node:module";
|
|
2
|
-
const TANSTACK_ROUTER_VERSION = '1.170.
|
|
3
|
-
const TANSTACK_ROUTER_CORE_VERSION = '1.171.
|
|
4
|
-
const TANSTACK_HISTORY_VERSION = '1.162.
|
|
5
|
-
const MODULE_FEDERATION_VERSION = '2.9.
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
2
|
+
const TANSTACK_ROUTER_VERSION = '1.170.39';
|
|
3
|
+
const TANSTACK_ROUTER_CORE_VERSION = '1.171.32';
|
|
4
|
+
const TANSTACK_HISTORY_VERSION = '1.162.4';
|
|
5
|
+
const MODULE_FEDERATION_VERSION = '2.9.2';
|
|
6
|
+
const MODULE_FEDERATION_MODERN_JS_V3_FORK_VERSION = '2.9.3';
|
|
7
|
+
const ZEPHYR_RSPACK_PLUGIN_VERSION = '1.4.0';
|
|
8
|
+
const ZEPHYR_AGENT_VERSION = '1.4.0';
|
|
9
|
+
const WRANGLER_VERSION = '4.137.0';
|
|
9
10
|
const CLOUDFLARE_COMPATIBILITY_DATE = '2026-06-02';
|
|
10
11
|
const TAILWIND_VERSION = '4.3.3';
|
|
11
12
|
const RSBUILD_PLUGIN_TAILWINDCSS_VERSION = '2.0.3';
|
|
12
|
-
const EFFECT_VERSION = '4.0.0-rc.
|
|
13
|
-
const
|
|
14
|
-
const EFFECT_TSGO_VERSION = '0.41.0';
|
|
15
|
-
const MSGPACKR_VERSION = '2.1.0';
|
|
16
|
-
const ZOD_VERSION = '4.5.4';
|
|
17
|
-
const DRIZZLE_ORM_VERSION = '1.0.0-rc.4';
|
|
13
|
+
const EFFECT_VERSION = '4.0.0-rc.117';
|
|
14
|
+
const EFFECT_TSGO_VERSION = '0.45.0';
|
|
18
15
|
const TYPESCRIPT_STABLE_VERSION = '7.0.2';
|
|
19
16
|
const TYPESCRIPT_VERSION = TYPESCRIPT_STABLE_VERSION;
|
|
20
17
|
const TYPESCRIPT_NATIVE_PREVIEW_VERSION = '7.0.0-dev.20260707.2';
|
|
21
|
-
const OXLINT_VERSION = '1.
|
|
22
|
-
const OXFMT_VERSION = '0.
|
|
23
|
-
const ULTRACITE_VERSION = '7.
|
|
24
|
-
const
|
|
25
|
-
const LEFTHOOK_VERSION = '^2.1.10';
|
|
18
|
+
const OXLINT_VERSION = '1.85.0';
|
|
19
|
+
const OXFMT_VERSION = '0.70.0';
|
|
20
|
+
const ULTRACITE_VERSION = '7.12.0';
|
|
21
|
+
const LEFTHOOK_VERSION = '^2.1.14';
|
|
26
22
|
const I18NEXT_VERSION = '26.4.2';
|
|
27
|
-
const MODULE_FEDERATION_NODE_VERSION = '2.7.
|
|
28
|
-
const MINIFLARE_VERSION = '
|
|
29
|
-
const WORKERD_VERSION = '1.
|
|
30
|
-
const CLOUDFLARE_WORKERS_TYPES_VERSION = '5.
|
|
23
|
+
const MODULE_FEDERATION_NODE_VERSION = '2.7.52';
|
|
24
|
+
const MINIFLARE_VERSION = '5.20260921.0-alpha';
|
|
25
|
+
const WORKERD_VERSION = '1.20260921.1';
|
|
26
|
+
const CLOUDFLARE_WORKERS_TYPES_VERSION = '5.20260923.1';
|
|
31
27
|
const NODE_FETCH_VERSION = '^3.3.2';
|
|
32
|
-
const REACT_VERSION = '19.
|
|
33
|
-
const REACT_DOM_VERSION = '19.
|
|
34
|
-
const TYPES_NODE_VERSION = '^26.
|
|
35
|
-
const TYPES_REACT_VERSION = '^19.
|
|
36
|
-
const TYPES_REACT_DOM_VERSION = '^19.
|
|
28
|
+
const REACT_VERSION = '19.3.0';
|
|
29
|
+
const REACT_DOM_VERSION = '19.3.0';
|
|
30
|
+
const TYPES_NODE_VERSION = '^26.6.2';
|
|
31
|
+
const TYPES_REACT_VERSION = '^19.3.0';
|
|
32
|
+
const TYPES_REACT_DOM_VERSION = '^19.3.0';
|
|
37
33
|
const NODE_VERSION = '26.7.0';
|
|
38
|
-
const PNPM_VERSION = '11.
|
|
39
|
-
|
|
34
|
+
const PNPM_VERSION = '11.27.1';
|
|
35
|
+
const ULTRAMODERN_PACKAGE_PINS = {
|
|
36
|
+
appDependencies: {
|
|
37
|
+
'@module-federation/bridge-react': `npm:@bleedingdev/mf-bridge-react@${MODULE_FEDERATION_VERSION}`,
|
|
38
|
+
'@module-federation/modern-js-v3': `npm:@bleedingdev/mf-modern-js-v3@${MODULE_FEDERATION_MODERN_JS_V3_FORK_VERSION}`,
|
|
39
|
+
'@module-federation/runtime': `npm:@bleedingdev/mf-runtime@${MODULE_FEDERATION_VERSION}`,
|
|
40
|
+
'@tanstack/react-router': TANSTACK_ROUTER_VERSION,
|
|
41
|
+
i18next: I18NEXT_VERSION,
|
|
42
|
+
'node-fetch': NODE_FETCH_VERSION,
|
|
43
|
+
react: REACT_VERSION,
|
|
44
|
+
'react-dom': REACT_DOM_VERSION
|
|
45
|
+
},
|
|
46
|
+
bffEffectDependencies: {
|
|
47
|
+
'@effect/opentelemetry': EFFECT_VERSION,
|
|
48
|
+
effect: EFFECT_VERSION
|
|
49
|
+
},
|
|
50
|
+
appDevDependencies: {
|
|
51
|
+
'@effect/tsgo': EFFECT_TSGO_VERSION,
|
|
52
|
+
'@rsbuild/plugin-tailwindcss': `^${RSBUILD_PLUGIN_TAILWINDCSS_VERSION}`,
|
|
53
|
+
"@typescript/native": `npm:typescript@${TYPESCRIPT_VERSION}`,
|
|
54
|
+
'@types/node': TYPES_NODE_VERSION,
|
|
55
|
+
'@types/react': TYPES_REACT_VERSION,
|
|
56
|
+
'@types/react-dom': TYPES_REACT_DOM_VERSION,
|
|
57
|
+
tailwindcss: `^${TAILWIND_VERSION}`,
|
|
58
|
+
typescript: TYPESCRIPT_VERSION,
|
|
59
|
+
wrangler: WRANGLER_VERSION,
|
|
60
|
+
'zephyr-rspack-plugin': ZEPHYR_RSPACK_PLUGIN_VERSION
|
|
61
|
+
},
|
|
62
|
+
rootDevDependencies: {
|
|
63
|
+
'@effect/tsgo': EFFECT_TSGO_VERSION,
|
|
64
|
+
"@typescript/native": `npm:typescript@${TYPESCRIPT_VERSION}`,
|
|
65
|
+
'@types/node': TYPES_NODE_VERSION,
|
|
66
|
+
lefthook: LEFTHOOK_VERSION,
|
|
67
|
+
miniflare: MINIFLARE_VERSION,
|
|
68
|
+
oxlint: OXLINT_VERSION,
|
|
69
|
+
oxfmt: OXFMT_VERSION,
|
|
70
|
+
ultracite: ULTRACITE_VERSION,
|
|
71
|
+
wrangler: WRANGLER_VERSION,
|
|
72
|
+
'zephyr-agent': ZEPHYR_AGENT_VERSION
|
|
73
|
+
},
|
|
74
|
+
transitiveDependencies: {
|
|
75
|
+
'@cloudflare/workers-types': CLOUDFLARE_WORKERS_TYPES_VERSION,
|
|
76
|
+
'@module-federation/node': MODULE_FEDERATION_NODE_VERSION,
|
|
77
|
+
'@tanstack/history': TANSTACK_HISTORY_VERSION,
|
|
78
|
+
'@tanstack/router-core': TANSTACK_ROUTER_CORE_VERSION,
|
|
79
|
+
"@typescript/native-preview": TYPESCRIPT_NATIVE_PREVIEW_VERSION,
|
|
80
|
+
miniflare: MINIFLARE_VERSION,
|
|
81
|
+
workerd: WORKERD_VERSION
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
export { CLOUDFLARE_COMPATIBILITY_DATE, CLOUDFLARE_WORKERS_TYPES_VERSION, EFFECT_TSGO_VERSION, EFFECT_VERSION, I18NEXT_VERSION, LEFTHOOK_VERSION, MINIFLARE_VERSION, MODULE_FEDERATION_MODERN_JS_V3_FORK_VERSION, MODULE_FEDERATION_NODE_VERSION, MODULE_FEDERATION_VERSION, NODE_FETCH_VERSION, NODE_VERSION, OXFMT_VERSION, OXLINT_VERSION, PNPM_VERSION, REACT_DOM_VERSION, REACT_VERSION, RSBUILD_PLUGIN_TAILWINDCSS_VERSION, TAILWIND_VERSION, TANSTACK_HISTORY_VERSION, TANSTACK_ROUTER_CORE_VERSION, TANSTACK_ROUTER_VERSION, TYPESCRIPT_NATIVE_PREVIEW_VERSION, TYPESCRIPT_STABLE_VERSION, TYPESCRIPT_VERSION, TYPES_NODE_VERSION, TYPES_REACT_DOM_VERSION, TYPES_REACT_VERSION, ULTRACITE_VERSION, ULTRAMODERN_PACKAGE_PINS, WORKERD_VERSION, WRANGLER_VERSION, ZEPHYR_AGENT_VERSION, ZEPHYR_RSPACK_PLUGIN_VERSION };
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import node_fs from "node:fs";
|
|
3
|
+
import node_path from "node:path";
|
|
4
|
+
import { parse } from "@babel/parser";
|
|
5
|
+
import { configuredDevelopmentPorts } from "./add-vertical/workspace-state.js";
|
|
6
|
+
import { resolveRemoteRefs } from "./descriptors.js";
|
|
7
|
+
import { formatGeneratedSourceCandidates, writeFileReplacing } from "./fs-io.js";
|
|
8
|
+
import { createAppModernConfig } from "./module-federation.js";
|
|
9
|
+
import { createRootTsConfig } from "./tsconfigs.js";
|
|
10
|
+
import { createWorkspaceScriptArtifacts } from "./workspace-scripts.js";
|
|
11
|
+
import { createZeropsYaml } from "./zerops.js";
|
|
12
|
+
function workspaceArtifactCandidates(scope, apps, enableTailwind, alternateApps = []) {
|
|
13
|
+
return [
|
|
14
|
+
...createWorkspaceScriptArtifacts(),
|
|
15
|
+
{
|
|
16
|
+
relativePath: 'tsconfig.json',
|
|
17
|
+
content: `${JSON.stringify(createRootTsConfig(apps), null, 2)}\n`
|
|
18
|
+
},
|
|
19
|
+
...[
|
|
20
|
+
apps,
|
|
21
|
+
...alternateApps.length ? [
|
|
22
|
+
alternateApps
|
|
23
|
+
] : []
|
|
24
|
+
].flatMap((projection)=>{
|
|
25
|
+
const verticals = projection.filter((app)=>'vertical' === app.kind);
|
|
26
|
+
const devPorts = workspaceDevelopmentPorts(projection);
|
|
27
|
+
return [
|
|
28
|
+
{
|
|
29
|
+
relativePath: 'zerops.yaml',
|
|
30
|
+
content: `${createZeropsYaml(scope, projection)}\n`
|
|
31
|
+
},
|
|
32
|
+
...projection.map((app)=>({
|
|
33
|
+
relativePath: `${app.directory}/modern.config.ts`,
|
|
34
|
+
content: createAppModernConfig(scope, app, 'shell' === app.kind ? resolveRemoteRefs(app, verticals) : verticals, enableTailwind, devPorts)
|
|
35
|
+
}))
|
|
36
|
+
];
|
|
37
|
+
})
|
|
38
|
+
];
|
|
39
|
+
}
|
|
40
|
+
function workspaceDevelopmentPorts(apps, ports = {}) {
|
|
41
|
+
return apps.filter((app)=>'shell' === app.kind).length > 1 ? configuredDevelopmentPorts({
|
|
42
|
+
...ports,
|
|
43
|
+
...Object.fromEntries(apps.map((app)=>[
|
|
44
|
+
app.id,
|
|
45
|
+
app.port
|
|
46
|
+
]))
|
|
47
|
+
}).toSorted((left, right)=>left - right) : void 0;
|
|
48
|
+
}
|
|
49
|
+
function isLiteralData(node, literalIdentifiers) {
|
|
50
|
+
if (!node) return false;
|
|
51
|
+
if ('Identifier' === node.type) return literalIdentifiers?.has(node.name) ?? false;
|
|
52
|
+
if ([
|
|
53
|
+
'StringLiteral',
|
|
54
|
+
'NumericLiteral',
|
|
55
|
+
'BooleanLiteral',
|
|
56
|
+
'NullLiteral'
|
|
57
|
+
].includes(node.type)) return true;
|
|
58
|
+
if ('UnaryExpression' === node.type) return '-' === node.operator && 'NumericLiteral' === node.argument.type;
|
|
59
|
+
if ('ArrayExpression' === node.type) return node.elements.every((element)=>isLiteralData(element, literalIdentifiers));
|
|
60
|
+
return 'ObjectExpression' === node.type && node.properties.every((property)=>'ObjectProperty' === property.type && !property.computed && !property.shorthand && [
|
|
61
|
+
'Identifier',
|
|
62
|
+
'StringLiteral',
|
|
63
|
+
'NumericLiteral'
|
|
64
|
+
].includes(property.key.type) && isLiteralData(property.value, literalIdentifiers));
|
|
65
|
+
}
|
|
66
|
+
function withoutGeneratedData(source, binding) {
|
|
67
|
+
if (!binding) return source;
|
|
68
|
+
const parsed = parse(source, {
|
|
69
|
+
sourceType: 'module',
|
|
70
|
+
plugins: [
|
|
71
|
+
"typescript"
|
|
72
|
+
]
|
|
73
|
+
});
|
|
74
|
+
for (const statement of parsed.program.body)if ('VariableDeclaration' === statement.type && 'const' === statement.kind) {
|
|
75
|
+
for (const declaration of statement.declarations)if ('Identifier' === declaration.id.type && declaration.id.name === binding && declaration.init && isLiteralData(declaration.init)) return source.slice(0, declaration.init.start) + '{}' + source.slice(declaration.init.end);
|
|
76
|
+
}
|
|
77
|
+
return source;
|
|
78
|
+
}
|
|
79
|
+
function preserveConsumerWorkspaceArtifacts(workspaceRoot, candidates) {
|
|
80
|
+
const preservedPaths = new Set();
|
|
81
|
+
const recognizedPaths = new Map();
|
|
82
|
+
const physicalRoot = node_fs.realpathSync(workspaceRoot);
|
|
83
|
+
const canonicalSources = formatGeneratedSourceCandidates(candidates.map((candidate, index)=>[
|
|
84
|
+
`canonical/${index}/${candidate.relativePath}`,
|
|
85
|
+
withoutGeneratedData(candidate.content, candidate.generatedDataBinding)
|
|
86
|
+
]));
|
|
87
|
+
for (const [index, candidate] of candidates.entries()){
|
|
88
|
+
const relativePath = candidate.relativePath;
|
|
89
|
+
const filePath = node_path.join(workspaceRoot, relativePath);
|
|
90
|
+
if (!node_fs.existsSync(filePath)) continue;
|
|
91
|
+
const physicalRelative = node_path.relative(physicalRoot, node_fs.realpathSync(filePath));
|
|
92
|
+
if ('..' === physicalRelative || physicalRelative.startsWith(`..${node_path.sep}`) || node_path.isAbsolute(physicalRelative)) throw new Error(`Refusing to inspect an artifact outside the workspace: ${relativePath}`);
|
|
93
|
+
const source = node_fs.readFileSync(filePath, 'utf8');
|
|
94
|
+
let recognized = source === candidate.content;
|
|
95
|
+
if (!recognized) try {
|
|
96
|
+
const normalized = withoutGeneratedData(source, candidate.generatedDataBinding);
|
|
97
|
+
const canonical = canonicalSources[index];
|
|
98
|
+
recognized = normalized === canonical || formatGeneratedSourceCandidates([
|
|
99
|
+
[
|
|
100
|
+
relativePath,
|
|
101
|
+
normalized
|
|
102
|
+
]
|
|
103
|
+
])[0] === canonical;
|
|
104
|
+
} catch {}
|
|
105
|
+
recognizedPaths.set(relativePath, true === recognizedPaths.get(relativePath) || recognized);
|
|
106
|
+
}
|
|
107
|
+
for (const [relativePath, recognized] of recognizedPaths)if (!recognized) preservedPaths.add(relativePath);
|
|
108
|
+
const reported = new Set();
|
|
109
|
+
const isPreserved = (filePath)=>{
|
|
110
|
+
const relativePath = node_path.relative(workspaceRoot, filePath).split(node_path.sep).join('/');
|
|
111
|
+
if (!preservedPaths.has(relativePath)) return false;
|
|
112
|
+
if (!reported.has(relativePath)) {
|
|
113
|
+
console.warn(`${relativePath} preserved consumer-owned artifact: its canonical generated source does not match.`);
|
|
114
|
+
reported.add(relativePath);
|
|
115
|
+
}
|
|
116
|
+
return true;
|
|
117
|
+
};
|
|
118
|
+
return {
|
|
119
|
+
preservedPaths,
|
|
120
|
+
io: {
|
|
121
|
+
write: (filePath, content)=>{
|
|
122
|
+
if (isPreserved(filePath)) return false;
|
|
123
|
+
writeFileReplacing(workspaceRoot, node_path.relative(workspaceRoot, filePath), content);
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
export { preserveConsumerWorkspaceArtifacts, workspaceArtifactCandidates, workspaceDevelopmentPorts };
|