everything-dev 1.53.1 → 2.0.0-rc.0
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 +2 -11
- package/dist/_virtual/_rolldown/runtime.cjs +17 -2
- package/dist/_virtual/_rolldown/runtime.mjs +36 -0
- package/dist/api/auth-middleware.cjs +161 -0
- package/dist/api/auth-middleware.cjs.map +1 -0
- package/dist/api/auth-middleware.d.cts +69 -0
- package/dist/api/auth-middleware.d.mts +69 -0
- package/dist/api/auth-middleware.mjs +160 -0
- package/dist/api/auth-middleware.mjs.map +1 -0
- package/dist/api-contract.cjs +250 -62
- package/dist/api-contract.cjs.map +1 -1
- package/dist/api-contract.mjs +246 -65
- package/dist/api-contract.mjs.map +1 -1
- package/dist/app.cjs +99 -26
- package/dist/app.cjs.map +1 -1
- package/dist/app.d.cts +3 -0
- package/dist/app.d.mts +3 -0
- package/dist/app.mjs +100 -27
- package/dist/app.mjs.map +1 -1
- package/dist/auth-login.cjs +163 -0
- package/dist/auth-login.cjs.map +1 -0
- package/dist/auth-login.mjs +162 -0
- package/dist/auth-login.mjs.map +1 -0
- package/dist/auth-session.cjs +64 -0
- package/dist/auth-session.cjs.map +1 -0
- package/dist/auth-session.mjs +58 -0
- package/dist/auth-session.mjs.map +1 -0
- package/dist/auth-types-gen.cjs +0 -1
- package/dist/auth-types-gen.cjs.map +1 -1
- package/dist/build.cjs +37 -173
- package/dist/build.cjs.map +1 -1
- package/dist/build.mjs +37 -171
- package/dist/build.mjs.map +1 -1
- package/dist/bundle-cache.cjs +74 -0
- package/dist/bundle-cache.cjs.map +1 -0
- package/dist/bundle-cache.d.cts +27 -0
- package/dist/bundle-cache.d.mts +27 -0
- package/dist/bundle-cache.mjs +68 -0
- package/dist/bundle-cache.mjs.map +1 -0
- package/dist/bundle-fs-resolve.cjs +209 -0
- package/dist/bundle-fs-resolve.cjs.map +1 -0
- package/dist/bundle-fs-resolve.d.cts +76 -0
- package/dist/bundle-fs-resolve.d.mts +76 -0
- package/dist/bundle-fs-resolve.mjs +202 -0
- package/dist/bundle-fs-resolve.mjs.map +1 -0
- package/dist/cdn-deploy.cjs +126 -0
- package/dist/cdn-deploy.cjs.map +1 -0
- package/dist/cdn-deploy.mjs +124 -0
- package/dist/cdn-deploy.mjs.map +1 -0
- package/dist/cli/db-doctor.cjs +19 -19
- package/dist/cli/db-doctor.cjs.map +1 -1
- package/dist/cli/db-doctor.mjs +18 -18
- package/dist/cli/db-doctor.mjs.map +1 -1
- package/dist/cli/db-repair.cjs +9 -32
- package/dist/cli/db-repair.cjs.map +1 -1
- package/dist/cli/db-repair.mjs +9 -32
- package/dist/cli/db-repair.mjs.map +1 -1
- package/dist/cli/framework-version.cjs +7 -3
- package/dist/cli/framework-version.cjs.map +1 -1
- package/dist/cli/framework-version.mjs +7 -3
- package/dist/cli/framework-version.mjs.map +1 -1
- package/dist/cli/infra.cjs +159 -251
- package/dist/cli/infra.cjs.map +1 -1
- package/dist/cli/infra.mjs +154 -242
- package/dist/cli/infra.mjs.map +1 -1
- package/dist/cli/init.cjs +624 -196
- package/dist/cli/init.cjs.map +1 -1
- package/dist/cli/init.d.cts +61 -8
- package/dist/cli/init.d.mts +61 -8
- package/dist/cli/init.mjs +613 -194
- package/dist/cli/init.mjs.map +1 -1
- package/dist/cli/parse.cjs +8 -7
- package/dist/cli/parse.cjs.map +1 -1
- package/dist/cli/parse.mjs +9 -7
- package/dist/cli/parse.mjs.map +1 -1
- package/dist/cli/prompts.cjs +14 -1
- package/dist/cli/prompts.cjs.map +1 -1
- package/dist/cli/prompts.mjs +14 -1
- package/dist/cli/prompts.mjs.map +1 -1
- package/dist/cli/prune.cjs +220 -0
- package/dist/cli/prune.cjs.map +1 -0
- package/dist/cli/prune.mjs +220 -0
- package/dist/cli/prune.mjs.map +1 -0
- package/dist/cli/snapshot.cjs +2 -1
- package/dist/cli/snapshot.cjs.map +1 -1
- package/dist/cli/snapshot.mjs +2 -1
- package/dist/cli/snapshot.mjs.map +1 -1
- package/dist/cli/status.cjs +5 -4
- package/dist/cli/status.cjs.map +1 -1
- package/dist/cli/status.mjs +6 -5
- package/dist/cli/status.mjs.map +1 -1
- package/dist/cli/sync.cjs +156 -58
- package/dist/cli/sync.cjs.map +1 -1
- package/dist/cli/sync.mjs +158 -63
- package/dist/cli/sync.mjs.map +1 -1
- package/dist/cli/timing.cjs +0 -1
- package/dist/cli/timing.cjs.map +1 -1
- package/dist/cli/upgrade.cjs +95 -69
- package/dist/cli/upgrade.cjs.map +1 -1
- package/dist/cli/upgrade.mjs +97 -72
- package/dist/cli/upgrade.mjs.map +1 -1
- package/dist/cli/utils/helpers.cjs.map +1 -1
- package/dist/cli.cjs +320 -72
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.mjs +316 -68
- package/dist/cli.mjs.map +1 -1
- package/dist/code-artifacts.cjs +76 -8
- package/dist/code-artifacts.cjs.map +1 -1
- package/dist/code-artifacts.mjs +76 -10
- package/dist/code-artifacts.mjs.map +1 -1
- package/dist/commands/build.cjs +65 -0
- package/dist/commands/build.cjs.map +1 -0
- package/dist/commands/build.mjs +65 -0
- package/dist/commands/build.mjs.map +1 -0
- package/dist/commands/config.cjs +77 -0
- package/dist/commands/config.cjs.map +1 -0
- package/dist/commands/config.d.cts +8 -0
- package/dist/commands/config.d.mts +8 -0
- package/dist/commands/config.mjs +74 -0
- package/dist/commands/config.mjs.map +1 -0
- package/dist/commands/db.cjs +107 -0
- package/dist/commands/db.cjs.map +1 -0
- package/dist/commands/db.mjs +107 -0
- package/dist/commands/db.mjs.map +1 -0
- package/dist/commands/deploy.cjs +336 -0
- package/dist/commands/deploy.cjs.map +1 -0
- package/dist/commands/deploy.mjs +334 -0
- package/dist/commands/deploy.mjs.map +1 -0
- package/dist/commands/dev.cjs +75 -0
- package/dist/commands/dev.cjs.map +1 -0
- package/dist/commands/dev.mjs +73 -0
- package/dist/commands/dev.mjs.map +1 -0
- package/dist/commands/init.cjs +234 -0
- package/dist/commands/init.cjs.map +1 -0
- package/dist/commands/init.mjs +231 -0
- package/dist/commands/init.mjs.map +1 -0
- package/dist/commands/keys.cjs +255 -0
- package/dist/commands/keys.cjs.map +1 -0
- package/dist/commands/keys.mjs +253 -0
- package/dist/commands/keys.mjs.map +1 -0
- package/dist/commands/ops.cjs +199 -0
- package/dist/commands/ops.cjs.map +1 -0
- package/dist/commands/ops.mjs +197 -0
- package/dist/commands/ops.mjs.map +1 -0
- package/dist/commands/plugins.cjs +211 -0
- package/dist/commands/plugins.cjs.map +1 -0
- package/dist/commands/plugins.mjs +211 -0
- package/dist/commands/plugins.mjs.map +1 -0
- package/dist/commands/shared.cjs +8 -0
- package/dist/commands/shared.cjs.map +1 -0
- package/dist/commands/shared.d.cts +6 -0
- package/dist/commands/shared.d.mts +6 -0
- package/dist/commands/shared.mjs +8 -0
- package/dist/commands/shared.mjs.map +1 -0
- package/dist/commands/upgrade.cjs +325 -0
- package/dist/commands/upgrade.cjs.map +1 -0
- package/dist/commands/upgrade.mjs +323 -0
- package/dist/commands/upgrade.mjs.map +1 -0
- package/dist/components/dev-render.cjs +340 -0
- package/dist/components/dev-render.cjs.map +1 -0
- package/dist/components/dev-render.mjs +332 -0
- package/dist/components/dev-render.mjs.map +1 -0
- package/dist/config.cjs +460 -221
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.cts +491 -48
- package/dist/config.d.mts +491 -48
- package/dist/config.mjs +439 -212
- package/dist/config.mjs.map +1 -1
- package/dist/contract.cjs +327 -50
- package/dist/contract.cjs.map +1 -1
- package/dist/contract.d.cts +1951 -1062
- package/dist/contract.d.mts +1951 -1062
- package/dist/contract.meta.cjs +107 -12
- package/dist/contract.meta.cjs.map +1 -1
- package/dist/contract.meta.d.cts +166 -8
- package/dist/contract.meta.d.mts +166 -8
- package/dist/contract.meta.mjs +107 -11
- package/dist/contract.meta.mjs.map +1 -1
- package/dist/contract.mjs +580 -327
- package/dist/contract.mjs.map +1 -1
- package/dist/dag.cjs +5 -3
- package/dist/dag.cjs.map +1 -1
- package/dist/dag.mjs +6 -3
- package/dist/dag.mjs.map +1 -1
- package/dist/db/binding.cjs +80 -0
- package/dist/db/binding.cjs.map +1 -0
- package/dist/db/binding.d.cts +39 -0
- package/dist/db/binding.d.mts +39 -0
- package/dist/db/binding.mjs +78 -0
- package/dist/db/binding.mjs.map +1 -0
- package/dist/db/bindings.cjs +78 -0
- package/dist/db/bindings.cjs.map +1 -0
- package/dist/db/bindings.d.cts +34 -0
- package/dist/db/bindings.d.mts +34 -0
- package/dist/db/bindings.mjs +76 -0
- package/dist/db/bindings.mjs.map +1 -0
- package/dist/db/core.cjs +204 -0
- package/dist/db/core.cjs.map +1 -0
- package/dist/db/core.d.cts +69 -0
- package/dist/db/core.d.mts +69 -0
- package/dist/db/core.mjs +192 -0
- package/dist/db/core.mjs.map +1 -0
- package/dist/db/driver.cjs +167 -0
- package/dist/db/driver.cjs.map +1 -0
- package/dist/db/driver.d.cts +50 -0
- package/dist/db/driver.d.mts +50 -0
- package/dist/db/driver.mjs +165 -0
- package/dist/db/driver.mjs.map +1 -0
- package/dist/db/drizzle-kit.cjs +177 -0
- package/dist/db/drizzle-kit.cjs.map +1 -0
- package/dist/db/drizzle-kit.d.cts +25 -0
- package/dist/db/drizzle-kit.d.mts +25 -0
- package/dist/db/drizzle-kit.mjs +175 -0
- package/dist/db/drizzle-kit.mjs.map +1 -0
- package/dist/db/errors.cjs +27 -0
- package/dist/db/errors.cjs.map +1 -0
- package/dist/db/errors.d.cts +16 -0
- package/dist/db/errors.d.mts +16 -0
- package/dist/db/errors.mjs +26 -0
- package/dist/db/errors.mjs.map +1 -0
- package/dist/db/identity.cjs +55 -0
- package/dist/db/identity.cjs.map +1 -0
- package/dist/db/identity.d.cts +40 -0
- package/dist/db/identity.d.mts +40 -0
- package/dist/db/identity.mjs +53 -0
- package/dist/db/identity.mjs.map +1 -0
- package/dist/db/index.cjs +43 -0
- package/dist/db/index.d.cts +9 -0
- package/dist/db/index.d.mts +9 -0
- package/dist/db/index.mjs +10 -0
- package/dist/db/run-migrations.cjs +343 -0
- package/dist/db/run-migrations.cjs.map +1 -0
- package/dist/db/run-migrations.d.cts +87 -0
- package/dist/db/run-migrations.d.mts +87 -0
- package/dist/db/run-migrations.mjs +341 -0
- package/dist/db/run-migrations.mjs.map +1 -0
- package/dist/delegate-signer.cjs +85 -0
- package/dist/delegate-signer.cjs.map +1 -0
- package/dist/delegate-signer.mjs +84 -0
- package/dist/delegate-signer.mjs.map +1 -0
- package/dist/deploy-diff.cjs +119 -0
- package/dist/deploy-diff.cjs.map +1 -0
- package/dist/deploy-diff.mjs +109 -0
- package/dist/deploy-diff.mjs.map +1 -0
- package/dist/descriptor/constructors.cjs +49 -0
- package/dist/descriptor/constructors.cjs.map +1 -0
- package/dist/descriptor/constructors.d.cts +27 -0
- package/dist/descriptor/constructors.d.mts +27 -0
- package/dist/descriptor/constructors.mjs +45 -0
- package/dist/descriptor/constructors.mjs.map +1 -0
- package/dist/descriptor/index.cjs +24 -0
- package/dist/descriptor/index.d.cts +5 -0
- package/dist/descriptor/index.d.mts +5 -0
- package/dist/descriptor/index.mjs +6 -0
- package/dist/descriptor/resolve.cjs +258 -0
- package/dist/descriptor/resolve.cjs.map +1 -0
- package/dist/descriptor/resolve.d.cts +50 -0
- package/dist/descriptor/resolve.d.mts +50 -0
- package/dist/descriptor/resolve.mjs +252 -0
- package/dist/descriptor/resolve.mjs.map +1 -0
- package/dist/descriptor/schema.cjs +109 -0
- package/dist/descriptor/schema.cjs.map +1 -0
- package/dist/descriptor/schema.d.cts +217 -0
- package/dist/descriptor/schema.d.mts +217 -0
- package/dist/descriptor/schema.mjs +102 -0
- package/dist/descriptor/schema.mjs.map +1 -0
- package/dist/descriptor/serialize.cjs +45 -0
- package/dist/descriptor/serialize.cjs.map +1 -0
- package/dist/descriptor/serialize.d.cts +7 -0
- package/dist/descriptor/serialize.d.mts +7 -0
- package/dist/descriptor/serialize.mjs +45 -0
- package/dist/descriptor/serialize.mjs.map +1 -0
- package/dist/dev-log-pipeline.cjs +273 -0
- package/dist/dev-log-pipeline.cjs.map +1 -0
- package/dist/dev-log-pipeline.mjs +267 -0
- package/dist/dev-log-pipeline.mjs.map +1 -0
- package/dist/dev-logs.cjs +39 -8
- package/dist/dev-logs.cjs.map +1 -1
- package/dist/dev-logs.mjs +37 -9
- package/dist/dev-logs.mjs.map +1 -1
- package/dist/dev-program.cjs +405 -0
- package/dist/dev-program.cjs.map +1 -0
- package/dist/dev-program.d.cts +10 -0
- package/dist/dev-program.d.mts +10 -0
- package/dist/dev-program.mjs +395 -0
- package/dist/dev-program.mjs.map +1 -0
- package/dist/dev-session-data.d.cts +27 -0
- package/dist/dev-session-data.d.mts +27 -0
- package/dist/dev-session.cjs +178 -105
- package/dist/dev-session.cjs.map +1 -1
- package/dist/dev-session.mjs +180 -105
- package/dist/dev-session.mjs.map +1 -1
- package/dist/env/process-env.cjs +16 -0
- package/dist/env/process-env.cjs.map +1 -0
- package/dist/env/process-env.mjs +13 -0
- package/dist/env/process-env.mjs.map +1 -0
- package/dist/env/project-env.cjs +144 -0
- package/dist/env/project-env.cjs.map +1 -0
- package/dist/env/project-env.d.cts +1 -0
- package/dist/env/project-env.d.mts +1 -0
- package/dist/env/project-env.mjs +132 -0
- package/dist/env/project-env.mjs.map +1 -0
- package/dist/fastkv.cjs +59 -12
- package/dist/fastkv.cjs.map +1 -1
- package/dist/fastkv.d.cts +42 -6
- package/dist/fastkv.d.mts +42 -6
- package/dist/fastkv.mjs +58 -13
- package/dist/fastkv.mjs.map +1 -1
- package/dist/fingerprint.cjs +57 -0
- package/dist/fingerprint.cjs.map +1 -0
- package/dist/fingerprint.d.cts +14 -0
- package/dist/fingerprint.d.mts +14 -0
- package/dist/fingerprint.mjs +55 -0
- package/dist/fingerprint.mjs.map +1 -0
- package/dist/http-client.cjs +17 -17
- package/dist/http-client.cjs.map +1 -1
- package/dist/http-client.mjs +17 -17
- package/dist/http-client.mjs.map +1 -1
- package/dist/image-deploy.cjs +186 -0
- package/dist/image-deploy.cjs.map +1 -0
- package/dist/image-deploy.mjs +182 -0
- package/dist/image-deploy.mjs.map +1 -0
- package/dist/index.cjs +66 -18
- package/dist/index.d.cts +8 -7
- package/dist/index.d.mts +8 -7
- package/dist/index.mjs +6 -5
- package/dist/infra/docker.cjs +77 -0
- package/dist/infra/docker.cjs.map +1 -0
- package/dist/infra/docker.d.cts +10 -0
- package/dist/infra/docker.d.mts +10 -0
- package/dist/infra/docker.mjs +69 -0
- package/dist/infra/docker.mjs.map +1 -0
- package/dist/infra/materializer.cjs +74 -0
- package/dist/infra/materializer.cjs.map +1 -0
- package/dist/infra/materializer.mjs +70 -0
- package/dist/infra/materializer.mjs.map +1 -0
- package/dist/infra/planner.cjs +135 -103
- package/dist/infra/planner.cjs.map +1 -1
- package/dist/infra/planner.mjs +137 -104
- package/dist/infra/planner.mjs.map +1 -1
- package/dist/infra/port-ownership.cjs +57 -0
- package/dist/infra/port-ownership.cjs.map +1 -0
- package/dist/infra/port-ownership.mjs +57 -0
- package/dist/infra/port-ownership.mjs.map +1 -0
- package/dist/infra/preflight.cjs +45 -33
- package/dist/infra/preflight.cjs.map +1 -1
- package/dist/infra/preflight.d.cts +1 -0
- package/dist/infra/preflight.d.mts +1 -0
- package/dist/infra/preflight.mjs +46 -34
- package/dist/infra/preflight.mjs.map +1 -1
- package/dist/infra/types.cjs.map +1 -1
- package/dist/infra/types.d.cts +2 -0
- package/dist/infra/types.d.mts +2 -0
- package/dist/infra/types.mjs.map +1 -1
- package/dist/integrity.cjs +50 -61
- package/dist/integrity.cjs.map +1 -1
- package/dist/integrity.d.cts +16 -10
- package/dist/integrity.d.mts +16 -10
- package/dist/integrity.mjs +50 -59
- package/dist/integrity.mjs.map +1 -1
- package/dist/internal/manifest-normalizer.cjs +8 -2
- package/dist/internal/manifest-normalizer.cjs.map +1 -1
- package/dist/internal/manifest-normalizer.mjs +9 -3
- package/dist/internal/manifest-normalizer.mjs.map +1 -1
- package/dist/merge.cjs +19 -1
- package/dist/merge.cjs.map +1 -1
- package/dist/merge.d.cts +1 -1
- package/dist/merge.d.mts +1 -1
- package/dist/merge.mjs +19 -2
- package/dist/merge.mjs.map +1 -1
- package/dist/mf.cjs +190 -3
- package/dist/mf.cjs.map +1 -1
- package/dist/mf.d.cts +24 -2
- package/dist/mf.d.mts +24 -2
- package/dist/mf.mjs +189 -4
- package/dist/mf.mjs.map +1 -1
- package/dist/near-cli.cjs +59 -91
- package/dist/near-cli.cjs.map +1 -1
- package/dist/near-cli.mjs +58 -90
- package/dist/near-cli.mjs.map +1 -1
- package/dist/near-signer.cjs +73 -0
- package/dist/near-signer.cjs.map +1 -0
- package/dist/near-signer.mjs +70 -0
- package/dist/near-signer.mjs.map +1 -0
- package/dist/network.cjs +0 -1
- package/dist/network.cjs.map +1 -1
- package/dist/orchestrator.cjs +256 -87
- package/dist/orchestrator.cjs.map +1 -1
- package/dist/orchestrator.mjs +248 -87
- package/dist/orchestrator.mjs.map +1 -1
- package/dist/platform-deploy.cjs +81 -0
- package/dist/platform-deploy.cjs.map +1 -0
- package/dist/platform-deploy.mjs +80 -0
- package/dist/platform-deploy.mjs.map +1 -0
- package/dist/plugin.cjs +54 -1389
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +6 -896
- package/dist/plugin.d.mts +6 -896
- package/dist/plugin.mjs +53 -1387
- package/dist/plugin.mjs.map +1 -1
- package/dist/process-kill.cjs +44 -0
- package/dist/process-kill.cjs.map +1 -0
- package/dist/process-kill.mjs +43 -0
- package/dist/process-kill.mjs.map +1 -0
- package/dist/process-registry.cjs +64 -9
- package/dist/process-registry.cjs.map +1 -1
- package/dist/process-registry.mjs +61 -10
- package/dist/process-registry.mjs.map +1 -1
- package/dist/progress.cjs +45 -0
- package/dist/progress.cjs.map +1 -0
- package/dist/progress.d.cts +13 -0
- package/dist/progress.d.mts +13 -0
- package/dist/progress.mjs +42 -0
- package/dist/progress.mjs.map +1 -0
- package/dist/publish.cjs +513 -79
- package/dist/publish.cjs.map +1 -1
- package/dist/publish.mjs +515 -82
- package/dist/publish.mjs.map +1 -1
- package/dist/registry-use.cjs +41 -0
- package/dist/registry-use.cjs.map +1 -0
- package/dist/registry-use.mjs +40 -0
- package/dist/registry-use.mjs.map +1 -0
- package/dist/resolution/session.cjs +335 -0
- package/dist/resolution/session.cjs.map +1 -0
- package/dist/resolution/session.d.cts +105 -0
- package/dist/resolution/session.d.mts +105 -0
- package/dist/resolution/session.mjs +331 -0
- package/dist/resolution/session.mjs.map +1 -0
- package/dist/rollback.cjs +131 -0
- package/dist/rollback.cjs.map +1 -0
- package/dist/rollback.mjs +128 -0
- package/dist/rollback.mjs.map +1 -0
- package/dist/sdk.cjs +7 -7
- package/dist/sdk.d.cts +3 -3
- package/dist/sdk.d.mts +3 -3
- package/dist/sdk.mjs +2 -2
- package/dist/service-descriptor.cjs +67 -34
- package/dist/service-descriptor.cjs.map +1 -1
- package/dist/service-descriptor.d.cts +4 -1
- package/dist/service-descriptor.d.mts +3 -0
- package/dist/service-descriptor.mjs +63 -35
- package/dist/service-descriptor.mjs.map +1 -1
- package/dist/shared-deps.cjs +17 -16
- package/dist/shared-deps.cjs.map +1 -1
- package/dist/shared-deps.mjs +17 -16
- package/dist/shared-deps.mjs.map +1 -1
- package/dist/start-config-source.cjs +24 -0
- package/dist/start-config-source.cjs.map +1 -0
- package/dist/start-config-source.d.cts +29 -0
- package/dist/start-config-source.d.mts +29 -0
- package/dist/start-config-source.mjs +22 -0
- package/dist/start-config-source.mjs.map +1 -0
- package/dist/storage-upload.cjs +145 -0
- package/dist/storage-upload.cjs.map +1 -0
- package/dist/storage-upload.mjs +143 -0
- package/dist/storage-upload.mjs.map +1 -0
- package/dist/types.cjs +126 -20
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +867 -585
- package/dist/types.d.mts +867 -585
- package/dist/types.mjs +307 -208
- package/dist/types.mjs.map +1 -1
- package/dist/ui/api.cjs +105 -0
- package/dist/ui/api.cjs.map +1 -0
- package/dist/ui/api.d.cts +31 -0
- package/dist/ui/api.d.mts +31 -0
- package/dist/ui/api.mjs +99 -0
- package/dist/ui/api.mjs.map +1 -0
- package/dist/ui/auth-guards.cjs +50 -0
- package/dist/ui/auth-guards.cjs.map +1 -0
- package/dist/ui/auth-guards.d.cts +39 -0
- package/dist/ui/auth-guards.d.mts +39 -0
- package/dist/ui/auth-guards.mjs +48 -0
- package/dist/ui/auth-guards.mjs.map +1 -0
- package/dist/ui/auth.cjs +197 -0
- package/dist/ui/auth.cjs.map +1 -0
- package/dist/ui/auth.d.cts +56 -0
- package/dist/ui/auth.d.mts +56 -0
- package/dist/ui/auth.mjs +179 -0
- package/dist/ui/auth.mjs.map +1 -0
- package/dist/ui/entry.cjs +16 -0
- package/dist/ui/entry.cjs.map +1 -0
- package/dist/ui/entry.d.cts +12 -0
- package/dist/ui/entry.d.mts +12 -0
- package/dist/ui/entry.mjs +15 -0
- package/dist/ui/entry.mjs.map +1 -0
- package/dist/ui/head.cjs +14 -7
- package/dist/ui/head.cjs.map +1 -1
- package/dist/ui/head.mjs +15 -7
- package/dist/ui/head.mjs.map +1 -1
- package/dist/ui/hydrate.cjs +265 -0
- package/dist/ui/hydrate.cjs.map +1 -0
- package/dist/ui/hydrate.d.cts +48 -0
- package/dist/ui/hydrate.d.mts +48 -0
- package/dist/ui/hydrate.mjs +263 -0
- package/dist/ui/hydrate.mjs.map +1 -0
- package/dist/ui/i18n.cjs +153 -0
- package/dist/ui/i18n.cjs.map +1 -0
- package/dist/ui/i18n.d.cts +29 -0
- package/dist/ui/i18n.d.mts +29 -0
- package/dist/ui/i18n.mjs +140 -0
- package/dist/ui/i18n.mjs.map +1 -0
- package/dist/ui/index.cjs +19 -1
- package/dist/ui/index.d.cts +6 -3
- package/dist/ui/index.d.mts +6 -3
- package/dist/ui/index.mjs +5 -2
- package/dist/ui/locale.cjs +53 -0
- package/dist/ui/locale.cjs.map +1 -0
- package/dist/ui/locale.d.cts +18 -0
- package/dist/ui/locale.d.mts +18 -0
- package/dist/ui/locale.mjs +49 -0
- package/dist/ui/locale.mjs.map +1 -0
- package/dist/ui/manifest/index.cjs +25 -0
- package/dist/ui/manifest/index.cjs.map +1 -0
- package/dist/ui/manifest/index.d.cts +9 -0
- package/dist/ui/manifest/index.d.mts +9 -0
- package/dist/ui/manifest/index.mjs +13 -0
- package/dist/ui/manifest/index.mjs.map +1 -0
- package/dist/ui/manifest-generator.cjs +8 -0
- package/dist/ui/manifest-generator.d.cts +1 -0
- package/dist/ui/manifest-generator.d.mts +1 -0
- package/dist/ui/manifest-generator.mjs +3 -0
- package/dist/ui/message-catalogs.cjs +8 -0
- package/dist/ui/message-catalogs.cjs.map +1 -0
- package/dist/ui/message-catalogs.d.cts +5 -0
- package/dist/ui/message-catalogs.d.mts +5 -0
- package/dist/ui/message-catalogs.mjs +8 -0
- package/dist/ui/message-catalogs.mjs.map +1 -0
- package/dist/ui/metadata.cjs +0 -1
- package/dist/ui/metadata.cjs.map +1 -1
- package/dist/ui/metadata.d.cts +1 -1
- package/dist/ui/metadata.d.mts +1 -1
- package/dist/ui/plugin-path.cjs +37 -0
- package/dist/ui/plugin-path.cjs.map +1 -0
- package/dist/ui/plugin-path.d.cts +25 -0
- package/dist/ui/plugin-path.d.mts +25 -0
- package/dist/ui/plugin-path.mjs +35 -0
- package/dist/ui/plugin-path.mjs.map +1 -0
- package/dist/ui/router-client.cjs +61 -0
- package/dist/ui/router-client.cjs.map +1 -0
- package/dist/ui/router-client.d.cts +20 -0
- package/dist/ui/router-client.d.mts +20 -0
- package/dist/ui/router-client.mjs +60 -0
- package/dist/ui/router-client.mjs.map +1 -0
- package/dist/ui/router-defaults.cjs +48 -0
- package/dist/ui/router-defaults.cjs.map +1 -0
- package/dist/ui/router-defaults.d.cts +8 -0
- package/dist/ui/router-defaults.d.mts +8 -0
- package/dist/ui/router-defaults.mjs +45 -0
- package/dist/ui/router-defaults.mjs.map +1 -0
- package/dist/ui/router-error.cjs +70 -0
- package/dist/ui/router-error.cjs.map +1 -0
- package/dist/ui/router-error.d.cts +19 -0
- package/dist/ui/router-error.d.mts +19 -0
- package/dist/ui/router-error.mjs +69 -0
- package/dist/ui/router-error.mjs.map +1 -0
- package/dist/ui/router-server.cjs +153 -0
- package/dist/ui/router-server.cjs.map +1 -0
- package/dist/ui/router-server.d.cts +38 -0
- package/dist/ui/router-server.d.mts +38 -0
- package/dist/ui/router-server.mjs +152 -0
- package/dist/ui/router-server.mjs.map +1 -0
- package/dist/ui/router.cjs +4 -16
- package/dist/ui/router.cjs.map +1 -1
- package/dist/ui/router.mjs +4 -15
- package/dist/ui/router.mjs.map +1 -1
- package/dist/ui/runtime.cjs +5 -1
- package/dist/ui/runtime.cjs.map +1 -1
- package/dist/ui/runtime.d.cts +2 -1
- package/dist/ui/runtime.d.mts +2 -1
- package/dist/ui/runtime.mjs +5 -1
- package/dist/ui/runtime.mjs.map +1 -1
- package/dist/ui/slot.cjs +34 -0
- package/dist/ui/slot.cjs.map +1 -0
- package/dist/ui/slot.d.cts +43 -0
- package/dist/ui/slot.d.mts +43 -0
- package/dist/ui/slot.mjs +34 -0
- package/dist/ui/slot.mjs.map +1 -0
- package/dist/ui/tenant.cjs +300 -0
- package/dist/ui/tenant.cjs.map +1 -0
- package/dist/ui/tenant.d.cts +122 -0
- package/dist/ui/tenant.d.mts +122 -0
- package/dist/ui/tenant.mjs +279 -0
- package/dist/ui/tenant.mjs.map +1 -0
- package/dist/ui/types.d.cts +32 -2
- package/dist/ui/types.d.mts +32 -2
- package/dist/ui/version-check.cjs +47 -0
- package/dist/ui/version-check.cjs.map +1 -0
- package/dist/ui/version-check.d.cts +23 -0
- package/dist/ui/version-check.d.mts +23 -0
- package/dist/ui/version-check.mjs +46 -0
- package/dist/ui/version-check.mjs.map +1 -0
- package/dist/utils/banner.cjs +2 -2
- package/dist/utils/banner.cjs.map +1 -1
- package/dist/utils/banner.mjs +2 -2
- package/dist/utils/banner.mjs.map +1 -1
- package/dist/utils/linkify.cjs +1 -1
- package/dist/utils/linkify.cjs.map +1 -1
- package/dist/utils/linkify.mjs +1 -0
- package/dist/utils/linkify.mjs.map +1 -1
- package/dist/utils/run.cjs +6 -6
- package/dist/utils/run.cjs.map +1 -1
- package/dist/utils/run.mjs +6 -6
- package/dist/utils/run.mjs.map +1 -1
- package/dist/utils/save-config.cjs +12 -0
- package/dist/utils/save-config.cjs.map +1 -1
- package/dist/utils/save-config.mjs +12 -0
- package/dist/utils/save-config.mjs.map +1 -1
- package/dist/utils/snapshot-hash.cjs +10 -0
- package/dist/utils/snapshot-hash.cjs.map +1 -0
- package/dist/utils/snapshot-hash.mjs +10 -0
- package/dist/utils/snapshot-hash.mjs.map +1 -0
- package/dist/utils/string.cjs +0 -1
- package/dist/utils/string.cjs.map +1 -1
- package/dist/utils/theme.cjs +30 -12
- package/dist/utils/theme.cjs.map +1 -1
- package/dist/utils/theme.mjs +30 -11
- package/dist/utils/theme.mjs.map +1 -1
- package/dist/version-manifest-deploy.cjs +50 -0
- package/dist/version-manifest-deploy.cjs.map +1 -0
- package/dist/version-manifest-deploy.mjs +49 -0
- package/dist/version-manifest-deploy.mjs.map +1 -0
- package/dist/version-manifest-resolve.cjs +42 -0
- package/dist/version-manifest-resolve.cjs.map +1 -0
- package/dist/version-manifest-resolve.d.cts +38 -0
- package/dist/version-manifest-resolve.d.mts +38 -0
- package/dist/version-manifest-resolve.mjs +40 -0
- package/dist/version-manifest-resolve.mjs.map +1 -0
- package/dist/version-status.cjs +18 -0
- package/dist/version-status.cjs.map +1 -0
- package/dist/version-status.d.cts +22 -0
- package/dist/version-status.d.mts +22 -0
- package/dist/version-status.mjs +17 -0
- package/dist/version-status.mjs.map +1 -0
- package/dist/workspace-catalog.cjs +53 -0
- package/dist/workspace-catalog.cjs.map +1 -0
- package/dist/workspace-catalog.mjs +51 -0
- package/dist/workspace-catalog.mjs.map +1 -0
- package/dist/workspace.cjs +237 -0
- package/dist/workspace.cjs.map +1 -0
- package/dist/workspace.mjs +233 -0
- package/dist/workspace.mjs.map +1 -0
- package/package.json +179 -27
- package/skills/add-a-route/SKILL.md +132 -0
- package/skills/api-and-auth/SKILL.md +87 -21
- package/skills/api-and-auth/references/middleware.md +1 -1
- package/skills/cli-reference/SKILL.md +48 -21
- package/skills/code-style/SKILL.md +8 -0
- package/skills/dev-workflow/SKILL.md +50 -26
- package/skills/extends-config/SKILL.md +31 -19
- package/skills/init-upgrade/SKILL.md +29 -16
- package/skills/plugin-development/SKILL.md +46 -112
- package/skills/plugin-development/references/database.md +82 -0
- package/skills/plugin-development/references/request-context.md +67 -0
- package/skills/publish-sync/SKILL.md +99 -22
- package/skills/registry/SKILL.md +82 -0
- package/skills/super-app/SKILL.md +25 -15
- package/skills/talk-to-the-app/SKILL.md +138 -0
- package/skills/ui-integration/SKILL.md +93 -11
- package/dist/cli/db-studio.cjs +0 -131
- package/dist/cli/db-studio.cjs.map +0 -1
- package/dist/cli/db-studio.mjs +0 -127
- package/dist/cli/db-studio.mjs.map +0 -1
- package/dist/cli/init.d.cts.map +0 -1
- package/dist/cli/init.d.mts.map +0 -1
- package/dist/components/dev-view.cjs +0 -309
- package/dist/components/dev-view.cjs.map +0 -1
- package/dist/components/dev-view.mjs +0 -309
- package/dist/components/dev-view.mjs.map +0 -1
- package/dist/components/streaming-view.cjs +0 -134
- package/dist/components/streaming-view.cjs.map +0 -1
- package/dist/components/streaming-view.mjs +0 -132
- package/dist/components/streaming-view.mjs.map +0 -1
- package/dist/config.d.cts.map +0 -1
- package/dist/config.d.mts.map +0 -1
- package/dist/contract.d.cts.map +0 -1
- package/dist/contract.d.mts.map +0 -1
- package/dist/contract.meta.d.cts.map +0 -1
- package/dist/contract.meta.d.mts.map +0 -1
- package/dist/dag.d.cts.map +0 -1
- package/dist/dag.d.mts.map +0 -1
- package/dist/db.cjs +0 -81
- package/dist/db.cjs.map +0 -1
- package/dist/db.d.cts +0 -30
- package/dist/db.d.cts.map +0 -1
- package/dist/db.d.mts +0 -30
- package/dist/db.d.mts.map +0 -1
- package/dist/db.mjs +0 -75
- package/dist/db.mjs.map +0 -1
- package/dist/fastkv.d.cts.map +0 -1
- package/dist/fastkv.d.mts.map +0 -1
- package/dist/integrity.d.cts.map +0 -1
- package/dist/integrity.d.mts.map +0 -1
- package/dist/merge.d.cts.map +0 -1
- package/dist/merge.d.mts.map +0 -1
- package/dist/mf.d.cts.map +0 -1
- package/dist/mf.d.mts.map +0 -1
- package/dist/plugin.d.cts.map +0 -1
- package/dist/plugin.d.mts.map +0 -1
- package/dist/service-descriptor.d.cts.map +0 -1
- package/dist/service-descriptor.d.mts.map +0 -1
- package/dist/types.d.cts.map +0 -1
- package/dist/types.d.mts.map +0 -1
- package/dist/ui/head.d.cts.map +0 -1
- package/dist/ui/head.d.mts.map +0 -1
- package/dist/ui/metadata.d.cts.map +0 -1
- package/dist/ui/metadata.d.mts.map +0 -1
- package/dist/ui/router.d.cts.map +0 -1
- package/dist/ui/router.d.mts.map +0 -1
- package/dist/ui/runtime.d.cts.map +0 -1
- package/dist/ui/runtime.d.mts.map +0 -1
- package/dist/ui/types.d.cts.map +0 -1
- package/dist/ui/types.d.mts.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { JsonObject, SourceMode } from "./types.cjs";
|
|
2
|
-
import "effect";
|
|
2
|
+
import { Context, Layer } from "effect";
|
|
3
3
|
//#region src/service-descriptor.d.ts
|
|
4
4
|
interface ServiceDescriptor {
|
|
5
5
|
key: string;
|
|
@@ -19,8 +19,11 @@ interface ServiceDescriptor {
|
|
|
19
19
|
ssr?: boolean;
|
|
20
20
|
command?: string;
|
|
21
21
|
args?: string[];
|
|
22
|
+
env?: Record<string, string>;
|
|
22
23
|
readyPatterns?: RegExp[];
|
|
23
24
|
errorPatterns?: RegExp[];
|
|
25
|
+
/** folder-form plugin UI port — the UI build is a child of this dev process (BOS_UI_PORT) */
|
|
26
|
+
uiPort?: number;
|
|
24
27
|
}
|
|
25
28
|
interface AppOrchestrator {
|
|
26
29
|
packages: string[];
|
|
@@ -19,8 +19,11 @@ interface ServiceDescriptor {
|
|
|
19
19
|
ssr?: boolean;
|
|
20
20
|
command?: string;
|
|
21
21
|
args?: string[];
|
|
22
|
+
env?: Record<string, string>;
|
|
22
23
|
readyPatterns?: RegExp[];
|
|
23
24
|
errorPatterns?: RegExp[];
|
|
25
|
+
/** folder-form plugin UI port — the UI build is a child of this dev process (BOS_UI_PORT) */
|
|
26
|
+
uiPort?: number;
|
|
24
27
|
}
|
|
25
28
|
interface AppOrchestrator {
|
|
26
29
|
packages: string[];
|
|
@@ -1,30 +1,55 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
1
3
|
import { Context, Layer } from "effect";
|
|
2
4
|
|
|
3
5
|
//#region src/service-descriptor.ts
|
|
4
|
-
|
|
5
|
-
|
|
6
|
+
/**
|
|
7
|
+
* True when a `plugins.<id>` entry is the runtime-config mirror of the
|
|
8
|
+
* app-slot auth plugin (same backend target) — the `auth` service already
|
|
9
|
+
* spawns that backend, so the mirror contributes only its `ui` surface.
|
|
10
|
+
* The single implementation; consumed by the service descriptors, the DAG,
|
|
11
|
+
* the infra planner, and the dev session.
|
|
12
|
+
*/
|
|
13
|
+
function isAuthMirrorPluginEntry(authEntry, pluginId, pluginConfig) {
|
|
14
|
+
if (pluginId !== "auth" || !authEntry) return false;
|
|
15
|
+
if (pluginConfig === authEntry) return true;
|
|
16
|
+
if (pluginConfig.localPath && pluginConfig.localPath === authEntry.localPath) return true;
|
|
17
|
+
if (!pluginConfig.localPath && pluginConfig.source === "remote" && pluginConfig.url && pluginConfig.url === authEntry.url) return true;
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
var ServiceDescriptorMap = class extends Context.Service()("ServiceDescriptorMap") {};
|
|
21
|
+
var DevRuntimeConfig = class extends Context.Service()("DevRuntimeConfig") {};
|
|
22
|
+
var DevGeneratedEnv = class extends Context.Service()("DevGeneratedEnv") {};
|
|
23
|
+
const DevGeneratedEnvLive = (env) => Layer.succeed(DevGeneratedEnv, env);
|
|
6
24
|
const PLUGIN_READY_PATTERNS = [
|
|
7
25
|
/ready in/i,
|
|
8
26
|
/compiled.*successfully/i,
|
|
9
27
|
/listening/i,
|
|
10
28
|
/started/i
|
|
11
29
|
];
|
|
12
|
-
const PLUGIN_ERROR_PATTERNS = [
|
|
30
|
+
const PLUGIN_ERROR_PATTERNS = [
|
|
31
|
+
/\bERROR in\b/,
|
|
32
|
+
/failed to compile/i,
|
|
33
|
+
/Module not found/i,
|
|
34
|
+
/Cannot find module/i
|
|
35
|
+
];
|
|
13
36
|
const SERVICE_CONFIGS = {
|
|
14
37
|
host: {
|
|
15
|
-
command: "
|
|
38
|
+
command: "pnpm",
|
|
16
39
|
args: ["run", "dev"],
|
|
40
|
+
env: { NODE_OPTIONS: "--conditions=development" },
|
|
17
41
|
readyPatterns: [/Host (dev|production) server running at/i, /Server running at/i],
|
|
18
42
|
errorPatterns: [
|
|
19
|
-
/
|
|
20
|
-
/
|
|
43
|
+
/\berror\b(?!s)/i,
|
|
44
|
+
/\bfailed to\b/i,
|
|
45
|
+
/\bbuild failed\b/i,
|
|
21
46
|
/exception/i
|
|
22
47
|
],
|
|
23
48
|
defaultPort: 3e3,
|
|
24
49
|
readinessPath: "/health"
|
|
25
50
|
},
|
|
26
51
|
auth: {
|
|
27
|
-
command: "
|
|
52
|
+
command: "pnpm",
|
|
28
53
|
args: ["run", "dev"],
|
|
29
54
|
readyPatterns: PLUGIN_READY_PATTERNS,
|
|
30
55
|
errorPatterns: PLUGIN_ERROR_PATTERNS,
|
|
@@ -32,27 +57,23 @@ const SERVICE_CONFIGS = {
|
|
|
32
57
|
readinessPath: "/remoteEntry.js"
|
|
33
58
|
},
|
|
34
59
|
ui: {
|
|
35
|
-
command: "
|
|
60
|
+
command: "pnpm",
|
|
36
61
|
args: ["run", "dev"],
|
|
37
62
|
readyPatterns: [
|
|
38
63
|
/\bready\s+built in\b/i,
|
|
39
64
|
/\bLocal:\b/i,
|
|
40
65
|
/\bcompiled\b.*successfully/i
|
|
41
66
|
],
|
|
42
|
-
errorPatterns: [
|
|
67
|
+
errorPatterns: [
|
|
68
|
+
/\berror\b(?!s)/i,
|
|
69
|
+
/\bfailed to\b/i,
|
|
70
|
+
/\bbuild failed\b/i
|
|
71
|
+
],
|
|
43
72
|
defaultPort: 3003,
|
|
44
73
|
readinessPath: "/remoteEntry.js"
|
|
45
74
|
},
|
|
46
|
-
"ui-ssr": {
|
|
47
|
-
command: "bun",
|
|
48
|
-
args: ["run", "dev:ssr"],
|
|
49
|
-
readyPatterns: [/\bready\s+built in\b/i, /\bcompiled\b.*successfully/i],
|
|
50
|
-
errorPatterns: [/error/i, /failed/i],
|
|
51
|
-
defaultPort: 3004,
|
|
52
|
-
readinessPath: "/"
|
|
53
|
-
},
|
|
54
75
|
api: {
|
|
55
|
-
command: "
|
|
76
|
+
command: "pnpm",
|
|
56
77
|
args: ["run", "dev"],
|
|
57
78
|
readyPatterns: PLUGIN_READY_PATTERNS,
|
|
58
79
|
errorPatterns: PLUGIN_ERROR_PATTERNS,
|
|
@@ -89,17 +110,9 @@ function buildServiceDescriptorMap(runtimeConfig, options) {
|
|
|
89
110
|
port: runtimeConfig.ui.port,
|
|
90
111
|
integrity: runtimeConfig.ui.integrity,
|
|
91
112
|
ssr,
|
|
92
|
-
...SERVICE_CONFIGS.ui
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
key: "ui-ssr",
|
|
96
|
-
source: runtimeConfig.ui.source,
|
|
97
|
-
url: runtimeConfig.ui.ssrUrl ?? "",
|
|
98
|
-
entry: "",
|
|
99
|
-
name: "ui-ssr",
|
|
100
|
-
localPath: runtimeConfig.ui.localPath,
|
|
101
|
-
port: runtimeConfig.ui.ssrUrl ? Number.parseInt(new URL(runtimeConfig.ui.ssrUrl).port, 10) : (runtimeConfig.ui.port ?? 3003) + 1,
|
|
102
|
-
...SERVICE_CONFIGS["ui-ssr"]
|
|
113
|
+
...SERVICE_CONFIGS.ui,
|
|
114
|
+
env: { BOS_DEV_SERVER: "1" },
|
|
115
|
+
args: process.env.BOS_NO_WATCH === "1" ? ["run", "dev:built"] : SERVICE_CONFIGS.ui.args
|
|
103
116
|
});
|
|
104
117
|
map.set("api", {
|
|
105
118
|
key: "api",
|
|
@@ -134,10 +147,15 @@ function buildServiceDescriptorMap(runtimeConfig, options) {
|
|
|
134
147
|
if (runtimeConfig.plugins) {
|
|
135
148
|
let pluginBasePort = 3010;
|
|
136
149
|
for (const [pluginId, pluginConfig] of Object.entries(runtimeConfig.plugins)) {
|
|
150
|
+
const isAuthMirror = isAuthMirrorPluginEntry(runtimeConfig.auth, pluginId, pluginConfig);
|
|
137
151
|
const pluginKey = `plugin:${pluginId}`;
|
|
138
152
|
const resolvedPort = pluginConfig.port ?? pluginBasePort;
|
|
139
153
|
pluginBasePort = resolvedPort + 1;
|
|
140
|
-
|
|
154
|
+
const uiLocalPath = pluginConfig.ui?.localPath;
|
|
155
|
+
const isFolderFormUi = Boolean(uiLocalPath && pluginConfig.ui?.source === "local" && existsSync(path.join(uiLocalPath, "src", "routes")) && !existsSync(path.join(uiLocalPath, "package.json")));
|
|
156
|
+
const folderUiPort = pluginConfig.ui?.port ?? pluginBasePort;
|
|
157
|
+
if (isFolderFormUi) pluginBasePort = folderUiPort + 1;
|
|
158
|
+
if (!isAuthMirror) map.set(pluginKey, {
|
|
141
159
|
key: pluginKey,
|
|
142
160
|
source: pluginConfig.source,
|
|
143
161
|
url: pluginConfig.url,
|
|
@@ -150,14 +168,24 @@ function buildServiceDescriptorMap(runtimeConfig, options) {
|
|
|
150
168
|
proxy: pluginConfig.proxy,
|
|
151
169
|
variables: pluginConfig.variables,
|
|
152
170
|
secrets: pluginConfig.secrets,
|
|
153
|
-
command: "
|
|
171
|
+
command: "pnpm",
|
|
154
172
|
args: ["run", "dev"],
|
|
173
|
+
env: isFolderFormUi ? { BOS_UI_PORT: String(folderUiPort) } : void 0,
|
|
174
|
+
uiPort: isFolderFormUi ? folderUiPort : void 0,
|
|
155
175
|
readyPatterns: PLUGIN_READY_PATTERNS,
|
|
156
176
|
errorPatterns: PLUGIN_ERROR_PATTERNS,
|
|
157
177
|
defaultPort: resolvedPort,
|
|
158
178
|
readinessPath: "/remoteEntry.js"
|
|
159
179
|
});
|
|
160
|
-
if (
|
|
180
|
+
else if (isFolderFormUi) {
|
|
181
|
+
const authDescriptor = map.get("auth");
|
|
182
|
+
if (authDescriptor) map.set("auth", {
|
|
183
|
+
...authDescriptor,
|
|
184
|
+
env: { BOS_UI_PORT: String(folderUiPort) },
|
|
185
|
+
uiPort: folderUiPort
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
if (pluginConfig.ui?.localPath && pluginConfig.ui.source === "local" && !isFolderFormUi) {
|
|
161
189
|
const uiKey = `plugin-ui:${pluginId}`;
|
|
162
190
|
const uiPort = pluginConfig.ui.port ?? pluginBasePort;
|
|
163
191
|
pluginBasePort = uiPort + 1;
|
|
@@ -170,7 +198,7 @@ function buildServiceDescriptorMap(runtimeConfig, options) {
|
|
|
170
198
|
localPath: pluginConfig.ui.localPath,
|
|
171
199
|
port: uiPort,
|
|
172
200
|
integrity: pluginConfig.ui.integrity,
|
|
173
|
-
command: "
|
|
201
|
+
command: "pnpm",
|
|
174
202
|
args: ["run", "dev"],
|
|
175
203
|
readyPatterns: PLUGIN_READY_PATTERNS,
|
|
176
204
|
errorPatterns: PLUGIN_ERROR_PATTERNS,
|
|
@@ -188,7 +216,7 @@ function buildServiceDescriptorMapFromPlan(plan, options) {
|
|
|
188
216
|
return buildServiceDescriptorMap(plan.runtimeConfig, options);
|
|
189
217
|
}
|
|
190
218
|
function buildDescription(map) {
|
|
191
|
-
const descriptors = [...map.values()].filter((d) =>
|
|
219
|
+
const descriptors = [...map.values()].filter((d) => !d.key.startsWith("plugin:"));
|
|
192
220
|
const allLocal = descriptors.every((d) => d.source === "local");
|
|
193
221
|
const hasProxy = [...map.values()].some((d) => d.proxy && d.source === "local");
|
|
194
222
|
if (allLocal && !hasProxy) return "Full Local Development";
|
|
@@ -202,5 +230,5 @@ function buildDescription(map) {
|
|
|
202
230
|
}
|
|
203
231
|
|
|
204
232
|
//#endregion
|
|
205
|
-
export { DevRuntimeConfig, DevRuntimeConfigLive, ServiceDescriptorMap, ServiceDescriptorMapLive, buildDescription, buildServiceDescriptorMap, buildServiceDescriptorMapFromPlan };
|
|
233
|
+
export { DevGeneratedEnv, DevGeneratedEnvLive, DevRuntimeConfig, DevRuntimeConfigLive, ServiceDescriptorMap, ServiceDescriptorMapLive, buildDescription, buildServiceDescriptorMap, buildServiceDescriptorMapFromPlan, isAuthMirrorPluginEntry };
|
|
206
234
|
//# sourceMappingURL=service-descriptor.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-descriptor.mjs","names":[],"sources":["../src/service-descriptor.ts"],"sourcesContent":["import { Context, Layer } from \"effect\";\nimport type { JsonObject, RuntimeConfig, SourceMode } from \"./types\";\n\nexport interface ServiceDescriptor {\n key: string;\n source: SourceMode;\n url: string;\n remoteUrl?: string;\n entry: string;\n name: string;\n localPath?: string;\n port?: number;\n readinessPath: string;\n defaultPort: number;\n integrity?: string;\n proxy?: string;\n variables?: JsonObject;\n secrets?: string[];\n ssr?: boolean;\n command?: string;\n args?: string[];\n readyPatterns?: RegExp[];\n errorPatterns?: RegExp[];\n}\n\nexport class ServiceDescriptorMap extends Context.Tag(\"ServiceDescriptorMap\")<\n ServiceDescriptorMap,\n Map<string, ServiceDescriptor>\n>() {}\n\nexport class DevRuntimeConfig extends Context.Tag(\"DevRuntimeConfig\")<\n DevRuntimeConfig,\n RuntimeConfig\n>() {}\n\nconst PLUGIN_READY_PATTERNS = [/ready in/i, /compiled.*successfully/i, /listening/i, /started/i];\n\nconst PLUGIN_ERROR_PATTERNS = [/error/i, /failed/i];\n\nconst SERVICE_CONFIGS: Record<\n string,\n Pick<\n ServiceDescriptor,\n \"command\" | \"args\" | \"readyPatterns\" | \"errorPatterns\" | \"defaultPort\" | \"readinessPath\"\n >\n> = {\n host: {\n command: \"bun\",\n args: [\"run\", \"dev\"],\n readyPatterns: [/Host (dev|production) server running at/i, /Server running at/i],\n errorPatterns: [/error:/i, /failed/i, /exception/i],\n defaultPort: 3000,\n readinessPath: \"/health\",\n },\n auth: {\n command: \"bun\",\n args: [\"run\", \"dev\"],\n readyPatterns: PLUGIN_READY_PATTERNS,\n errorPatterns: PLUGIN_ERROR_PATTERNS,\n defaultPort: 3002,\n readinessPath: \"/remoteEntry.js\",\n },\n ui: {\n command: \"bun\",\n args: [\"run\", \"dev\"],\n readyPatterns: [/\\bready\\s+built in\\b/i, /\\bLocal:\\b/i, /\\bcompiled\\b.*successfully/i],\n errorPatterns: [/error/i, /failed to compile/i],\n defaultPort: 3003,\n readinessPath: \"/remoteEntry.js\",\n },\n \"ui-ssr\": {\n command: \"bun\",\n args: [\"run\", \"dev:ssr\"],\n readyPatterns: [/\\bready\\s+built in\\b/i, /\\bcompiled\\b.*successfully/i],\n errorPatterns: [/error/i, /failed/i],\n defaultPort: 3004,\n readinessPath: \"/\",\n },\n api: {\n command: \"bun\",\n args: [\"run\", \"dev\"],\n readyPatterns: PLUGIN_READY_PATTERNS,\n errorPatterns: PLUGIN_ERROR_PATTERNS,\n defaultPort: 3001,\n readinessPath: \"/remoteEntry.js\",\n },\n};\n\nexport function buildServiceDescriptorMap(\n runtimeConfig: RuntimeConfig,\n options?: { ssr?: boolean; proxy?: boolean },\n): Map<string, ServiceDescriptor> {\n const map = new Map<string, ServiceDescriptor>();\n const ssr = options?.ssr ?? false;\n\n const hostIsRemote = runtimeConfig.host.source === \"remote\";\n const hostProbeUrl = hostIsRemote\n ? (runtimeConfig.host.remoteUrl ?? runtimeConfig.host.url)\n : runtimeConfig.host.url;\n map.set(\"host\", {\n key: \"host\",\n source: runtimeConfig.host.source,\n url: hostProbeUrl,\n remoteUrl: runtimeConfig.host.remoteUrl,\n entry: hostIsRemote\n ? hostProbeUrl\n ? `${hostProbeUrl}/mf-manifest.json`\n : \"/mf-manifest.json\"\n : runtimeConfig.host.entry,\n name: runtimeConfig.host.name,\n localPath: runtimeConfig.host.localPath,\n port: runtimeConfig.host.port,\n integrity: runtimeConfig.host.integrity,\n secrets: runtimeConfig.host.secrets,\n ...SERVICE_CONFIGS.host,\n });\n\n map.set(\"ui\", {\n key: \"ui\",\n source: runtimeConfig.ui.source,\n url: runtimeConfig.ui.url,\n remoteUrl: runtimeConfig.ui.source === \"remote\" ? runtimeConfig.ui.url : undefined,\n entry: runtimeConfig.ui.entry,\n name: runtimeConfig.ui.name,\n localPath: runtimeConfig.ui.localPath,\n port: runtimeConfig.ui.port,\n integrity: runtimeConfig.ui.integrity,\n ssr,\n ...SERVICE_CONFIGS.ui,\n });\n\n if (ssr && runtimeConfig.ui.source === \"local\") {\n map.set(\"ui-ssr\", {\n key: \"ui-ssr\",\n source: runtimeConfig.ui.source,\n url: runtimeConfig.ui.ssrUrl ?? \"\",\n entry: \"\",\n name: \"ui-ssr\",\n localPath: runtimeConfig.ui.localPath,\n port: runtimeConfig.ui.ssrUrl\n ? Number.parseInt(new URL(runtimeConfig.ui.ssrUrl).port, 10)\n : (runtimeConfig.ui.port ?? 3003) + 1,\n ...SERVICE_CONFIGS[\"ui-ssr\"],\n });\n }\n\n map.set(\"api\", {\n key: \"api\",\n source: runtimeConfig.api.source,\n url: runtimeConfig.api.url,\n remoteUrl: runtimeConfig.api.source === \"remote\" ? runtimeConfig.api.url : undefined,\n entry: runtimeConfig.api.entry,\n name: runtimeConfig.api.name,\n localPath: runtimeConfig.api.localPath,\n port: runtimeConfig.api.port,\n integrity: runtimeConfig.api.integrity,\n proxy: runtimeConfig.api.proxy,\n variables: runtimeConfig.api.variables,\n secrets: runtimeConfig.api.secrets,\n ...SERVICE_CONFIGS.api,\n });\n\n if (runtimeConfig.auth) {\n map.set(\"auth\", {\n key: \"auth\",\n source: runtimeConfig.auth.source,\n url: runtimeConfig.auth.url,\n remoteUrl: runtimeConfig.auth.source === \"remote\" ? runtimeConfig.auth.url : undefined,\n entry: runtimeConfig.auth.entry,\n name: runtimeConfig.auth.name,\n localPath: runtimeConfig.auth.localPath,\n port: runtimeConfig.auth.port,\n integrity: runtimeConfig.auth.integrity,\n proxy: runtimeConfig.auth.proxy,\n variables: runtimeConfig.auth.variables,\n secrets: runtimeConfig.auth.secrets,\n ...SERVICE_CONFIGS.auth,\n });\n }\n\n if (runtimeConfig.plugins) {\n let pluginBasePort = 3010;\n for (const [pluginId, pluginConfig] of Object.entries(runtimeConfig.plugins)) {\n const pluginKey = `plugin:${pluginId}`;\n const resolvedPort = pluginConfig.port ?? pluginBasePort;\n pluginBasePort = resolvedPort + 1;\n\n map.set(pluginKey, {\n key: pluginKey,\n source: pluginConfig.source,\n url: pluginConfig.url,\n remoteUrl: pluginConfig.source === \"remote\" ? pluginConfig.url : undefined,\n entry: pluginConfig.entry,\n name: pluginConfig.name,\n localPath: pluginConfig.localPath,\n port: resolvedPort,\n integrity: pluginConfig.integrity,\n proxy: pluginConfig.proxy,\n variables: pluginConfig.variables,\n secrets: pluginConfig.secrets,\n command: \"bun\",\n args: [\"run\", \"dev\"],\n readyPatterns: PLUGIN_READY_PATTERNS,\n errorPatterns: PLUGIN_ERROR_PATTERNS,\n defaultPort: resolvedPort,\n readinessPath: \"/remoteEntry.js\",\n });\n\n if (pluginConfig.ui?.localPath && pluginConfig.ui.source === \"local\") {\n const uiKey = `plugin-ui:${pluginId}`;\n const uiPort = pluginConfig.ui.port ?? pluginBasePort;\n pluginBasePort = uiPort + 1;\n\n map.set(uiKey, {\n key: uiKey,\n source: pluginConfig.ui.source,\n url: pluginConfig.ui.url,\n entry: pluginConfig.ui.entry,\n name: pluginConfig.ui.name,\n localPath: pluginConfig.ui.localPath,\n port: uiPort,\n integrity: pluginConfig.ui.integrity,\n command: \"bun\",\n args: [\"run\", \"dev\"],\n readyPatterns: PLUGIN_READY_PATTERNS,\n errorPatterns: PLUGIN_ERROR_PATTERNS,\n defaultPort: uiPort,\n readinessPath: \"/remoteEntry.js\",\n });\n }\n }\n }\n\n return map;\n}\n\nexport interface AppOrchestrator {\n packages: string[];\n description: string;\n env: Record<string, string>;\n port?: number;\n interactive?: boolean;\n noLogs?: boolean;\n}\n\nexport const ServiceDescriptorMapLive = (map: Map<string, ServiceDescriptor>) =>\n Layer.succeed(ServiceDescriptorMap, map);\n\nexport const DevRuntimeConfigLive = (config: RuntimeConfig) =>\n Layer.succeed(DevRuntimeConfig, config);\n\nexport function buildServiceDescriptorMapFromPlan(\n plan: {\n runtimeConfig: RuntimeConfig;\n resolvedPorts: { host?: number; api?: number; auth?: number; ui?: number; uiSsr?: number };\n },\n options?: { ssr?: boolean; proxy?: boolean },\n): Map<string, ServiceDescriptor> {\n return buildServiceDescriptorMap(plan.runtimeConfig, options);\n}\n\ninterface ServiceDescriptorInfo {\n key: string;\n source: string;\n proxy?: string;\n}\n\nexport function buildDescription(map: Map<string, ServiceDescriptorInfo>): string {\n const descriptors = [...map.values()].filter(\n (d) => d.key !== \"ui-ssr\" && !d.key.startsWith(\"plugin:\"),\n );\n\n const allLocal = descriptors.every((d) => d.source === \"local\");\n const hasProxy = [...map.values()].some((d) => d.proxy && d.source === \"local\");\n if (allLocal && !hasProxy) return \"Full Local Development\";\n\n const parts: string[] = [];\n for (const d of descriptors) {\n if (d.source === \"remote\") {\n const label =\n d.key === \"host\"\n ? \"Remote Host\"\n : d.key === \"ui\"\n ? \"Remote UI\"\n : d.key === \"api\"\n ? hasProxy\n ? undefined\n : \"Remote API\"\n : d.key === \"auth\"\n ? \"Remote Auth\"\n : undefined;\n if (label) parts.push(label);\n }\n }\n if (hasProxy) parts.push(\"Proxy API → Production\");\n return parts.join(\" + \") || \"Remote Mode\";\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"service-descriptor.mjs","names":[],"sources":["../src/service-descriptor.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { Context, Layer } from \"effect\";\nimport type { JsonObject, RuntimeConfig, SourceMode } from \"./types\";\n\nexport interface AuthSlotShape {\n source: string;\n localPath?: string;\n url?: string;\n}\n\n/**\n * True when a `plugins.<id>` entry is the runtime-config mirror of the\n * app-slot auth plugin (same backend target) — the `auth` service already\n * spawns that backend, so the mirror contributes only its `ui` surface.\n * The single implementation; consumed by the service descriptors, the DAG,\n * the infra planner, and the dev session.\n */\nexport function isAuthMirrorPluginEntry(\n authEntry: AuthSlotShape | undefined,\n pluginId: string,\n pluginConfig: AuthSlotShape,\n): boolean {\n if (pluginId !== \"auth\" || !authEntry) return false;\n if (pluginConfig === authEntry) return true;\n if (pluginConfig.localPath && pluginConfig.localPath === authEntry.localPath) return true;\n if (\n !pluginConfig.localPath &&\n pluginConfig.source === \"remote\" &&\n pluginConfig.url &&\n pluginConfig.url === authEntry.url\n ) {\n return true;\n }\n return false;\n}\n\nexport interface ServiceDescriptor {\n key: string;\n source: SourceMode;\n url: string;\n remoteUrl?: string;\n entry: string;\n name: string;\n localPath?: string;\n port?: number;\n readinessPath: string;\n defaultPort: number;\n integrity?: string;\n proxy?: string;\n variables?: JsonObject;\n secrets?: string[];\n ssr?: boolean;\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n readyPatterns?: RegExp[];\n errorPatterns?: RegExp[];\n /** folder-form plugin UI port — the UI build is a child of this dev process (BOS_UI_PORT) */\n uiPort?: number;\n}\n\nexport class ServiceDescriptorMap extends Context.Service<\n ServiceDescriptorMap,\n Map<string, ServiceDescriptor>\n>()(\"ServiceDescriptorMap\") {}\n\nexport class DevRuntimeConfig extends Context.Service<DevRuntimeConfig, RuntimeConfig>()(\n \"DevRuntimeConfig\",\n) {}\n\nexport class DevGeneratedEnv extends Context.Service<DevGeneratedEnv, Record<string, string>>()(\n \"DevGeneratedEnv\",\n) {}\n\nexport const DevGeneratedEnvLive = (env: Record<string, string>) =>\n Layer.succeed(DevGeneratedEnv, env);\n\nconst PLUGIN_READY_PATTERNS = [/ready in/i, /compiled.*successfully/i, /listening/i, /started/i];\n\nconst PLUGIN_ERROR_PATTERNS = [\n /\\bERROR in\\b/,\n /failed to compile/i,\n /Module not found/i,\n /Cannot find module/i,\n];\n\nconst SERVICE_CONFIGS = {\n host: {\n command: \"pnpm\",\n args: [\"run\", \"dev\"],\n // The host dev server runs on tsx (TS-capable node), so it can consume\n // framework package sources directly — NODE_OPTIONS makes node's\n // resolver pick the `development` export condition. The env var rides\n // the spawn environment (ADR 0026 §2) and is inherited by the host's\n // tsx children. rsbuild/rspack config loaders must NOT rely on it:\n // their .mjs config evaluation resolves dist (freshness is the\n // prerequisite train's job, ADR 0022).\n env: { NODE_OPTIONS: \"--conditions=development\" },\n readyPatterns: [/Host (dev|production) server running at/i, /Server running at/i],\n errorPatterns: [/\\berror\\b(?!s)/i, /\\bfailed to\\b/i, /\\bbuild failed\\b/i, /exception/i],\n defaultPort: 3000,\n readinessPath: \"/health\",\n },\n auth: {\n command: \"pnpm\",\n args: [\"run\", \"dev\"],\n readyPatterns: PLUGIN_READY_PATTERNS,\n errorPatterns: PLUGIN_ERROR_PATTERNS,\n defaultPort: 3002,\n readinessPath: \"/remoteEntry.js\",\n },\n ui: {\n command: \"pnpm\",\n args: [\"run\", \"dev\"],\n readyPatterns: [/\\bready\\s+built in\\b/i, /\\bLocal:\\b/i, /\\bcompiled\\b.*successfully/i],\n errorPatterns: [/\\berror\\b(?!s)/i, /\\bfailed to\\b/i, /\\bbuild failed\\b/i],\n defaultPort: 3003,\n readinessPath: \"/remoteEntry.js\",\n },\n api: {\n command: \"pnpm\",\n args: [\"run\", \"dev\"],\n readyPatterns: PLUGIN_READY_PATTERNS,\n errorPatterns: PLUGIN_ERROR_PATTERNS,\n defaultPort: 3001,\n readinessPath: \"/remoteEntry.js\",\n },\n} as const satisfies Record<\n string,\n Pick<\n ServiceDescriptor,\n \"command\" | \"args\" | \"env\" | \"readyPatterns\" | \"errorPatterns\" | \"defaultPort\" | \"readinessPath\"\n >\n>;\n\nexport function buildServiceDescriptorMap(\n runtimeConfig: RuntimeConfig,\n options?: { ssr?: boolean; proxy?: boolean },\n): Map<string, ServiceDescriptor> {\n const map = new Map<string, ServiceDescriptor>();\n const ssr = options?.ssr ?? false;\n\n const hostIsRemote = runtimeConfig.host.source === \"remote\";\n const hostProbeUrl = hostIsRemote\n ? (runtimeConfig.host.remoteUrl ?? runtimeConfig.host.url)\n : runtimeConfig.host.url;\n map.set(\"host\", {\n key: \"host\",\n source: runtimeConfig.host.source,\n url: hostProbeUrl,\n remoteUrl: runtimeConfig.host.remoteUrl,\n entry: hostIsRemote\n ? hostProbeUrl\n ? `${hostProbeUrl}/mf-manifest.json`\n : \"/mf-manifest.json\"\n : runtimeConfig.host.entry,\n name: runtimeConfig.host.name,\n localPath: runtimeConfig.host.localPath,\n port: runtimeConfig.host.port,\n integrity: runtimeConfig.host.integrity,\n secrets: runtimeConfig.host.secrets,\n ...SERVICE_CONFIGS.host,\n });\n\n map.set(\"ui\", {\n key: \"ui\",\n source: runtimeConfig.ui.source,\n url: runtimeConfig.ui.url,\n remoteUrl: runtimeConfig.ui.source === \"remote\" ? runtimeConfig.ui.url : undefined,\n entry: runtimeConfig.ui.entry,\n name: runtimeConfig.ui.name,\n localPath: runtimeConfig.ui.localPath,\n port: runtimeConfig.ui.port,\n integrity: runtimeConfig.ui.integrity,\n ssr,\n ...SERVICE_CONFIGS.ui,\n env: { BOS_DEV_SERVER: \"1\" },\n // BOS_NO_WATCH stacks (regression/CI) build once and serve the built dist\n // via rsbuild preview — no watcher, no HMR.\n args: process.env.BOS_NO_WATCH === \"1\" ? [\"run\", \"dev:built\"] : SERVICE_CONFIGS.ui.args,\n });\n\n map.set(\"api\", {\n key: \"api\",\n source: runtimeConfig.api.source,\n url: runtimeConfig.api.url,\n remoteUrl: runtimeConfig.api.source === \"remote\" ? runtimeConfig.api.url : undefined,\n entry: runtimeConfig.api.entry,\n name: runtimeConfig.api.name,\n localPath: runtimeConfig.api.localPath,\n port: runtimeConfig.api.port,\n integrity: runtimeConfig.api.integrity,\n proxy: runtimeConfig.api.proxy,\n variables: runtimeConfig.api.variables,\n secrets: runtimeConfig.api.secrets,\n ...SERVICE_CONFIGS.api,\n });\n\n if (runtimeConfig.auth) {\n map.set(\"auth\", {\n key: \"auth\",\n source: runtimeConfig.auth.source,\n url: runtimeConfig.auth.url,\n remoteUrl: runtimeConfig.auth.source === \"remote\" ? runtimeConfig.auth.url : undefined,\n entry: runtimeConfig.auth.entry,\n name: runtimeConfig.auth.name,\n localPath: runtimeConfig.auth.localPath,\n port: runtimeConfig.auth.port,\n integrity: runtimeConfig.auth.integrity,\n proxy: runtimeConfig.auth.proxy,\n variables: runtimeConfig.auth.variables,\n secrets: runtimeConfig.auth.secrets,\n ...SERVICE_CONFIGS.auth,\n });\n }\n\n if (runtimeConfig.plugins) {\n let pluginBasePort = 3010;\n for (const [pluginId, pluginConfig] of Object.entries(runtimeConfig.plugins)) {\n const isAuthMirror = isAuthMirrorPluginEntry(runtimeConfig.auth, pluginId, pluginConfig);\n const pluginKey = `plugin:${pluginId}`;\n const resolvedPort = pluginConfig.port ?? pluginBasePort;\n pluginBasePort = resolvedPort + 1;\n\n // Folder-form ui source: the ui dir lives inside the plugin workspace\n // (no own package.json) — `every-plugin dev` spawns its UI build as a\n // child (BOS_UI_PORT), so no separate plugin-ui service is spawned.\n const uiLocalPath = pluginConfig.ui?.localPath;\n const isFolderFormUi = Boolean(\n uiLocalPath &&\n pluginConfig.ui?.source === \"local\" &&\n existsSync(path.join(uiLocalPath, \"src\", \"routes\")) &&\n !existsSync(path.join(uiLocalPath, \"package.json\")),\n );\n const folderUiPort = pluginConfig.ui?.port ?? pluginBasePort;\n if (isFolderFormUi) pluginBasePort = folderUiPort + 1;\n\n if (!isAuthMirror) {\n map.set(pluginKey, {\n key: pluginKey,\n source: pluginConfig.source,\n url: pluginConfig.url,\n remoteUrl: pluginConfig.source === \"remote\" ? pluginConfig.url : undefined,\n entry: pluginConfig.entry,\n name: pluginConfig.name,\n localPath: pluginConfig.localPath,\n port: resolvedPort,\n integrity: pluginConfig.integrity,\n proxy: pluginConfig.proxy,\n variables: pluginConfig.variables,\n secrets: pluginConfig.secrets,\n command: \"pnpm\",\n args: [\"run\", \"dev\"],\n env: isFolderFormUi ? { BOS_UI_PORT: String(folderUiPort) } : undefined,\n uiPort: isFolderFormUi ? folderUiPort : undefined,\n readyPatterns: PLUGIN_READY_PATTERNS,\n errorPatterns: PLUGIN_ERROR_PATTERNS,\n defaultPort: resolvedPort,\n readinessPath: \"/remoteEntry.js\",\n });\n } else if (isFolderFormUi) {\n // Folder-form ui for the auth mirror: the `auth` app slot owns the\n // dev process (plugin:auth is not spawned), so BOS_UI_PORT rides on\n // the auth descriptor. folderUiPort is the same port the runtime\n // config wired into the mirror's ui.url (withLocalRuntimeUrl).\n const authDescriptor = map.get(\"auth\");\n if (authDescriptor) {\n map.set(\"auth\", {\n ...authDescriptor,\n env: { BOS_UI_PORT: String(folderUiPort) },\n uiPort: folderUiPort,\n });\n }\n }\n\n if (pluginConfig.ui?.localPath && pluginConfig.ui.source === \"local\" && !isFolderFormUi) {\n const uiKey = `plugin-ui:${pluginId}`;\n const uiPort = pluginConfig.ui.port ?? pluginBasePort;\n pluginBasePort = uiPort + 1;\n\n map.set(uiKey, {\n key: uiKey,\n source: pluginConfig.ui.source,\n url: pluginConfig.ui.url,\n entry: pluginConfig.ui.entry,\n name: pluginConfig.ui.name,\n localPath: pluginConfig.ui.localPath,\n port: uiPort,\n integrity: pluginConfig.ui.integrity,\n command: \"pnpm\",\n args: [\"run\", \"dev\"],\n readyPatterns: PLUGIN_READY_PATTERNS,\n errorPatterns: PLUGIN_ERROR_PATTERNS,\n defaultPort: uiPort,\n readinessPath: \"/remoteEntry.js\",\n });\n }\n }\n }\n\n return map;\n}\n\nexport interface AppOrchestrator {\n packages: string[];\n description: string;\n env: Record<string, string>;\n port?: number;\n interactive?: boolean;\n noLogs?: boolean;\n}\n\nexport const ServiceDescriptorMapLive = (map: Map<string, ServiceDescriptor>) =>\n Layer.succeed(ServiceDescriptorMap, map);\n\nexport const DevRuntimeConfigLive = (config: RuntimeConfig) =>\n Layer.succeed(DevRuntimeConfig, config);\n\nexport function buildServiceDescriptorMapFromPlan(\n plan: {\n runtimeConfig: RuntimeConfig;\n resolvedPorts: { host?: number; api?: number; auth?: number; ui?: number; uiSsr?: number };\n },\n options?: { ssr?: boolean; proxy?: boolean },\n): Map<string, ServiceDescriptor> {\n return buildServiceDescriptorMap(plan.runtimeConfig, options);\n}\n\ninterface ServiceDescriptorInfo {\n key: string;\n source: string;\n proxy?: string;\n}\n\nexport function buildDescription(map: Map<string, ServiceDescriptorInfo>): string {\n const descriptors = [...map.values()].filter((d) => !d.key.startsWith(\"plugin:\"));\n\n const allLocal = descriptors.every((d) => d.source === \"local\");\n const hasProxy = [...map.values()].some((d) => d.proxy && d.source === \"local\");\n if (allLocal && !hasProxy) return \"Full Local Development\";\n\n const parts: string[] = [];\n for (const d of descriptors) {\n if (d.source === \"remote\") {\n const label =\n d.key === \"host\"\n ? \"Remote Host\"\n : d.key === \"ui\"\n ? \"Remote UI\"\n : d.key === \"api\"\n ? hasProxy\n ? undefined\n : \"Remote API\"\n : d.key === \"auth\"\n ? \"Remote Auth\"\n : undefined;\n if (label) parts.push(label);\n }\n }\n if (hasProxy) parts.push(\"Proxy API → Production\");\n return parts.join(\" + \") || \"Remote Mode\";\n}\n"],"mappings":"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"}
|
package/dist/shared-deps.cjs
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
const require_merge = require('./merge.cjs');
|
|
2
2
|
const require_types = require('./types.cjs');
|
|
3
|
+
const require_config = require('./config.cjs');
|
|
4
|
+
const require_workspace_catalog = require('./workspace-catalog.cjs');
|
|
5
|
+
const require_workspace = require('./workspace.cjs');
|
|
3
6
|
let node_fs = require("node:fs");
|
|
4
7
|
let node_path = require("node:path");
|
|
5
8
|
let node_crypto = require("node:crypto");
|
|
6
9
|
|
|
7
10
|
//#region src/shared-deps.ts
|
|
11
|
+
async function loadBosConfigForSharedDeps(configDir, bosConfigPath) {
|
|
12
|
+
const appDescriptorPath = (0, node_path.join)(configDir, "bos.app.ts");
|
|
13
|
+
if ((0, node_fs.existsSync)(appDescriptorPath)) return require_config.loadAppDescriptorConfig(appDescriptorPath);
|
|
14
|
+
if ((0, node_fs.existsSync)(bosConfigPath)) return JSON.parse((0, node_fs.readFileSync)(bosConfigPath, "utf-8"));
|
|
15
|
+
return JSON.parse((0, node_fs.readFileSync)(bosConfigPath, "utf-8"));
|
|
16
|
+
}
|
|
8
17
|
function sha256(input) {
|
|
9
18
|
return (0, node_crypto.createHash)("sha256").update(input).digest("hex");
|
|
10
19
|
}
|
|
@@ -98,16 +107,15 @@ function collectSharedDepRefs(bosConfig) {
|
|
|
98
107
|
async function syncResolvedSharedDeps(opts) {
|
|
99
108
|
const bosConfigPath = (0, node_path.join)(opts.configDir, "bos.config.json");
|
|
100
109
|
const resolvedConfigPath = (0, node_path.join)(opts.configDir, ".bos", "bos.resolved-config.json");
|
|
101
|
-
const
|
|
110
|
+
const workspaceRoot = require_workspace.findWorkspaceRoot(opts.configDir)?.dir ?? opts.configDir;
|
|
102
111
|
const generatedPath = (0, node_path.join)(opts.configDir, ".bos", "generated", "shared-deps.json");
|
|
103
|
-
const bosConfig = opts.bosConfig ??
|
|
104
|
-
if (!require_merge.isPlainObject(bosConfig)) throw new Error("
|
|
105
|
-
const pkgJson = (0, node_fs.existsSync)(packageJsonPath) ? JSON.parse((0, node_fs.readFileSync)(packageJsonPath, "utf-8")) : {};
|
|
112
|
+
const bosConfig = opts.bosConfig ?? await loadBosConfigForSharedDeps(opts.configDir, bosConfigPath);
|
|
113
|
+
if (!require_merge.isPlainObject(bosConfig)) throw new Error("the authored config must be an object");
|
|
106
114
|
const originalBos = JSON.stringify(bosConfig);
|
|
107
|
-
const
|
|
115
|
+
const catalog = require_workspace_catalog.readWorkspaceCatalog(workspaceRoot);
|
|
116
|
+
const originalCatalog = JSON.stringify(catalog);
|
|
108
117
|
const mode = opts.hostMode === "local" ? "catalog->bos" : "bos->catalog";
|
|
109
118
|
const refsByName = collectSharedDepRefs(bosConfig);
|
|
110
|
-
const catalog = pkgJson.workspaces?.catalog ?? {};
|
|
111
119
|
const resolvedDeps = {};
|
|
112
120
|
for (const [name, refs] of Object.entries(refsByName)) {
|
|
113
121
|
const first = refs[0];
|
|
@@ -137,15 +145,8 @@ async function syncResolvedSharedDeps(opts) {
|
|
|
137
145
|
sources: refs.map((ref) => ref.source).sort((a, b) => a.localeCompare(b))
|
|
138
146
|
};
|
|
139
147
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
catalog: {}
|
|
143
|
-
};
|
|
144
|
-
pkgJson.workspaces.catalog = catalog;
|
|
145
|
-
const nextBos = JSON.stringify(bosConfig);
|
|
146
|
-
const nextPkg = JSON.stringify(pkgJson);
|
|
147
|
-
const bosConfigChanged = nextBos !== originalBos;
|
|
148
|
-
const catalogChanged = nextPkg !== originalPkg;
|
|
148
|
+
const bosConfigChanged = JSON.stringify(bosConfig) !== originalBos;
|
|
149
|
+
const catalogChanged = JSON.stringify(catalog) !== originalCatalog;
|
|
149
150
|
if (bosConfigChanged) {
|
|
150
151
|
const resolvedDir = (0, node_path.dirname)(resolvedConfigPath);
|
|
151
152
|
if (!(0, node_fs.existsSync)(resolvedDir)) (0, node_fs.mkdirSync)(resolvedDir, { recursive: true });
|
|
@@ -161,7 +162,7 @@ async function syncResolvedSharedDeps(opts) {
|
|
|
161
162
|
};
|
|
162
163
|
writeFileIfChanged(resolvedConfigPath, `${JSON.stringify(resolvedOutput, null, 2)}\n`);
|
|
163
164
|
}
|
|
164
|
-
if (catalogChanged)
|
|
165
|
+
if (catalogChanged) require_workspace_catalog.writeWorkspaceCatalog(workspaceRoot, catalog);
|
|
165
166
|
const stableResolvedDeps = stableDepsObject(resolvedDeps);
|
|
166
167
|
const resolved = {
|
|
167
168
|
deps: stableResolvedDeps,
|
package/dist/shared-deps.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-deps.cjs","names":["isPlainObject","SharedDepMapSchema","rebuildOrderedConfig"],"sources":["../src/shared-deps.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { type BosEnv, isPlainObject, type ResolvedConfigMeta, rebuildOrderedConfig } from \"./merge\";\nimport { type SharedDepConfig, SharedDepMapSchema } from \"./types\";\n\ninterface PackageJson {\n workspaces?: {\n packages?: string[];\n catalog?: Record<string, string>;\n };\n}\n\ninterface SharedDepRef {\n source: string;\n config: SharedDepConfig;\n}\n\ntype SharedDepsConfig = Record<string, unknown>;\n\ninterface NormalizedSharedDepConfig {\n version: string;\n requiredVersion: string | false;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n shareScope: string;\n}\n\nexport interface ResolvedSharedDep {\n name: string;\n version: string;\n requiredVersion: string;\n shareScope: string;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n sources: string[];\n}\n\nexport interface ResolvedSharedDeps {\n deps: Record<string, ResolvedSharedDep>;\n fingerprintSha256: string;\n}\n\nexport interface SharedDepsSyncResult {\n mode: \"catalog->bos\" | \"bos->catalog\";\n hostMode: \"local\" | \"remote\";\n bosConfigChanged: boolean;\n catalogChanged: boolean;\n generatedChanged: boolean;\n resolved: ResolvedSharedDeps;\n}\n\nfunction sha256(input: string): string {\n return createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nfunction extractSemverExact(input: unknown): string | null {\n if (typeof input !== \"string\") return null;\n const match = input.match(/\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?/);\n return match ? match[0] : null;\n}\n\nfunction caretRange(version: string): string {\n return `^${version}`;\n}\n\nfunction stableDepsObject(\n deps: Record<string, ResolvedSharedDep>,\n): Record<string, ResolvedSharedDep> {\n const keys = Object.keys(deps).sort((a, b) => a.localeCompare(b));\n const out: Record<string, ResolvedSharedDep> = {};\n for (const key of keys) {\n out[key] = deps[key]!;\n }\n return out;\n}\n\nfunction normalizeSharedDepConfig(config: SharedDepConfig): NormalizedSharedDepConfig {\n return {\n version: config.version,\n requiredVersion: config.requiredVersion ?? false,\n singleton: config.singleton ?? false,\n eager: config.eager ?? false,\n strictVersion: config.strictVersion ?? false,\n shareScope: config.shareScope ?? \"default\",\n };\n}\n\nfunction getObject(value: unknown): Record<string, unknown> | undefined {\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction getSharedDepsMap(\n value: unknown,\n source: string,\n): Record<string, SharedDepConfig> | undefined {\n if (value === undefined) return undefined;\n const parsed = SharedDepMapSchema.safeParse(value);\n if (!parsed.success) {\n throw new Error(`Invalid shared dependency map at ${source}`);\n }\n return value as Record<string, SharedDepConfig>;\n}\n\nfunction writeFileIfChanged(filePath: string, nextContent: string): boolean {\n try {\n const current = readFileSync(filePath, \"utf-8\");\n if (current === nextContent) return false;\n } catch {\n // file does not exist yet\n }\n\n writeFileSync(filePath, nextContent);\n return true;\n}\n\nfunction fingerprintResolved(deps: Record<string, ResolvedSharedDep>): string {\n return sha256(JSON.stringify(stableDepsObject(deps)));\n}\n\nfunction isSameSharedDepConfig(a: SharedDepConfig, b: SharedDepConfig): boolean {\n const left = normalizeSharedDepConfig(a);\n const right = normalizeSharedDepConfig(b);\n\n return (\n left.version === right.version &&\n left.requiredVersion === right.requiredVersion &&\n left.singleton === right.singleton &&\n left.eager === right.eager &&\n left.strictVersion === right.strictVersion &&\n left.shareScope === right.shareScope\n );\n}\n\nfunction collectSharedDepRefs(bosConfig: SharedDepsConfig): Record<string, SharedDepRef[]> {\n const refs = new Map<string, SharedDepRef[]>();\n\n const app = getObject(bosConfig.app);\n const appUi = getObject(app?.ui);\n const appApi = getObject(app?.api);\n const appAuth = getObject(app?.auth);\n const plugins = getObject(bosConfig.plugins);\n\n if (appUi && \"shared\" in appUi) {\n throw new Error(\n \"app.ui.shared is no longer supported. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.\",\n );\n }\n\n const append = (source: string, shared: Record<string, SharedDepConfig> | undefined) => {\n if (!shared) return;\n\n for (const [name, config] of Object.entries(shared)) {\n const existing = refs.get(name);\n if (!existing) {\n refs.set(name, [{ source, config }]);\n continue;\n }\n\n if (!isSameSharedDepConfig(existing[0]!.config, config)) {\n const previous = existing.map((ref) => ref.source).join(\", \");\n throw new Error(\n `Conflicting shared dependency \"${name}\" between ${previous} and ${source}`,\n );\n }\n\n existing.push({ source, config });\n }\n };\n\n append(\"app.api\", getSharedDepsMap(appApi?.shared, \"app.api.shared\"));\n append(\"app.auth\", getSharedDepsMap(appAuth?.shared, \"app.auth.shared\"));\n\n for (const [pluginId, plugin] of Object.entries(plugins ?? {})) {\n const pluginRecord = getObject(plugin);\n if (!pluginRecord) continue;\n\n const pluginApp = getObject(pluginRecord.app);\n const pluginUi = getObject(pluginApp?.ui);\n if (pluginUi && \"shared\" in pluginUi) {\n throw new Error(\n `app.ui.shared is no longer supported in plugins.${pluginId}. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.`,\n );\n }\n append(\n `plugins.${pluginId}`,\n getSharedDepsMap(pluginRecord.shared, `plugins.${pluginId}.shared`),\n );\n }\n\n return Object.fromEntries(refs);\n}\n\nexport async function syncResolvedSharedDeps(opts: {\n configDir: string;\n hostMode: \"local\" | \"remote\";\n bosConfig?: SharedDepsConfig;\n env?: BosEnv;\n extendsChain?: string[];\n}): Promise<SharedDepsSyncResult> {\n const bosConfigPath = join(opts.configDir, \"bos.config.json\");\n const resolvedConfigPath = join(opts.configDir, \".bos\", \"bos.resolved-config.json\");\n const packageJsonPath = join(opts.configDir, \"package.json\");\n const generatedPath = join(opts.configDir, \".bos\", \"generated\", \"shared-deps.json\");\n\n const bosConfig: unknown = opts.bosConfig ?? JSON.parse(readFileSync(bosConfigPath, \"utf-8\"));\n if (!isPlainObject(bosConfig)) {\n throw new Error(\"bos.config.json must be an object\");\n }\n\n const pkgJson = existsSync(packageJsonPath)\n ? (JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as PackageJson)\n : {};\n\n const originalBos = JSON.stringify(bosConfig);\n const originalPkg = JSON.stringify(pkgJson);\n\n const mode = opts.hostMode === \"local\" ? \"catalog->bos\" : \"bos->catalog\";\n const refsByName = collectSharedDepRefs(bosConfig);\n const catalog = pkgJson.workspaces?.catalog ?? {};\n\n const resolvedDeps: Record<string, ResolvedSharedDep> = {};\n\n for (const [name, refs] of Object.entries(refsByName)) {\n const first = refs[0];\n if (!first) continue;\n\n const exactFromConfig =\n extractSemverExact(first.config.version) ?? extractSemverExact(first.config.requiredVersion);\n const exactFromCatalog = extractSemverExact(catalog[name]);\n const version =\n mode === \"catalog->bos\"\n ? (exactFromCatalog ?? exactFromConfig)\n : (exactFromConfig ?? exactFromCatalog);\n\n if (!version) {\n const sources = refs.map((ref) => ref.source).join(\", \");\n throw new Error(\n `Could not resolve exact version for shared dependency \"${name}\" from ${sources}`,\n );\n }\n\n if (mode === \"catalog->bos\" && exactFromCatalog === null && exactFromConfig) {\n catalog[name] = exactFromConfig;\n }\n\n if (mode === \"bos->catalog\" && catalog[name] !== version) {\n catalog[name] = version;\n }\n\n for (const ref of refs) {\n ref.config.version = version;\n ref.config.requiredVersion = caretRange(version);\n ref.config.shareScope = ref.config.shareScope ?? \"default\";\n }\n\n resolvedDeps[name] = {\n name,\n version,\n requiredVersion: caretRange(version),\n shareScope: first.config.shareScope ?? \"default\",\n singleton: first.config.singleton ?? false,\n eager: first.config.eager ?? false,\n strictVersion: first.config.strictVersion ?? false,\n sources: refs.map((ref) => ref.source).sort((a, b) => a.localeCompare(b)),\n };\n }\n\n if (!pkgJson.workspaces) {\n pkgJson.workspaces = { packages: [], catalog: {} };\n }\n pkgJson.workspaces.catalog = catalog;\n\n const nextBos = JSON.stringify(bosConfig);\n const nextPkg = JSON.stringify(pkgJson);\n const bosConfigChanged = nextBos !== originalBos;\n const catalogChanged = nextPkg !== originalPkg;\n\n if (bosConfigChanged) {\n const resolvedDir = dirname(resolvedConfigPath);\n if (!existsSync(resolvedDir)) {\n mkdirSync(resolvedDir, { recursive: true });\n }\n\n const ordered = rebuildOrderedConfig(bosConfig);\n const meta: ResolvedConfigMeta = {\n env: opts.env ?? \"development\",\n resolvedAt: new Date().toISOString(),\n extendsChain: opts.extendsChain ?? [],\n source: \"shared-sync\",\n };\n const resolvedOutput = {\n _resolved: meta,\n ...ordered,\n };\n\n writeFileIfChanged(resolvedConfigPath, `${JSON.stringify(resolvedOutput, null, 2)}\\n`);\n }\n\n if (catalogChanged) {\n writeFileIfChanged(packageJsonPath, `${JSON.stringify(pkgJson, null, 2)}\\n`);\n }\n\n const stableResolvedDeps = stableDepsObject(resolvedDeps);\n const resolved: ResolvedSharedDeps = {\n deps: stableResolvedDeps,\n fingerprintSha256: fingerprintResolved(stableResolvedDeps),\n };\n\n const nextGenerated = {\n schemaVersion: 1,\n kind: \"everything-dev/shared-deps\",\n generatedAt: new Date().toISOString(),\n deps: stableResolvedDeps,\n fingerprintSha256: resolved.fingerprintSha256,\n inputs: {\n mode,\n hostMode: opts.hostMode,\n },\n };\n\n let prevFingerprint: string | null = null;\n try {\n const prev = JSON.parse(readFileSync(generatedPath, \"utf-8\"));\n prevFingerprint = prev?.fingerprintSha256 ?? null;\n } catch {\n // ignore\n }\n\n mkdirSync(dirname(generatedPath), { recursive: true });\n writeFileIfChanged(generatedPath, `${JSON.stringify(nextGenerated, null, 2)}\\n`);\n\n const generatedChanged = prevFingerprint !== nextGenerated.fingerprintSha256;\n\n return {\n mode,\n hostMode: opts.hostMode,\n bosConfigChanged,\n catalogChanged,\n generatedChanged,\n resolved,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared-deps.cjs","names":["join","existsSync","loadAppDescriptorConfig","readFileSync","createHash","isPlainObject","SharedDepMapSchema","findWorkspaceRoot","readWorkspaceCatalog","dirname","rebuildOrderedConfig"],"sources":["../src/shared-deps.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { loadAppDescriptorConfig } from \"./config\";\nimport { type BosEnv, isPlainObject, type ResolvedConfigMeta, rebuildOrderedConfig } from \"./merge\";\nimport { type SharedDepConfig, SharedDepMapSchema } from \"./types\";\nimport { findWorkspaceRoot } from \"./workspace\";\nimport { readWorkspaceCatalog, writeWorkspaceCatalog } from \"./workspace-catalog\";\n\nasync function loadBosConfigForSharedDeps(\n configDir: string,\n bosConfigPath: string,\n): Promise<unknown> {\n const appDescriptorPath = join(configDir, \"bos.app.ts\");\n if (existsSync(appDescriptorPath)) {\n return loadAppDescriptorConfig(appDescriptorPath);\n }\n if (existsSync(bosConfigPath)) {\n return JSON.parse(readFileSync(bosConfigPath, \"utf-8\"));\n }\n\n return JSON.parse(readFileSync(bosConfigPath, \"utf-8\"));\n}\n\ninterface SharedDepRef {\n source: string;\n config: SharedDepConfig;\n}\n\ntype SharedDepsConfig = Record<string, unknown>;\n\ninterface NormalizedSharedDepConfig {\n version: string;\n requiredVersion: string | false;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n shareScope: string;\n}\n\nexport interface ResolvedSharedDep {\n name: string;\n version: string;\n requiredVersion: string;\n shareScope: string;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n sources: string[];\n}\n\nexport interface ResolvedSharedDeps {\n deps: Record<string, ResolvedSharedDep>;\n fingerprintSha256: string;\n}\n\nexport interface SharedDepsSyncResult {\n mode: \"catalog->bos\" | \"bos->catalog\";\n hostMode: \"local\" | \"remote\";\n bosConfigChanged: boolean;\n catalogChanged: boolean;\n generatedChanged: boolean;\n resolved: ResolvedSharedDeps;\n}\n\nfunction sha256(input: string): string {\n return createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nfunction extractSemverExact(input: unknown): string | null {\n if (typeof input !== \"string\") return null;\n const match = input.match(/\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?/);\n return match ? match[0] : null;\n}\n\nfunction caretRange(version: string): string {\n return `^${version}`;\n}\n\nfunction stableDepsObject(\n deps: Record<string, ResolvedSharedDep>,\n): Record<string, ResolvedSharedDep> {\n const keys = Object.keys(deps).sort((a, b) => a.localeCompare(b));\n const out: Record<string, ResolvedSharedDep> = {};\n for (const key of keys) {\n out[key] = deps[key]!;\n }\n return out;\n}\n\nfunction normalizeSharedDepConfig(config: SharedDepConfig): NormalizedSharedDepConfig {\n return {\n version: config.version,\n requiredVersion: config.requiredVersion ?? false,\n singleton: config.singleton ?? false,\n eager: config.eager ?? false,\n strictVersion: config.strictVersion ?? false,\n shareScope: config.shareScope ?? \"default\",\n };\n}\n\nfunction getObject(value: unknown): Record<string, unknown> | undefined {\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction getSharedDepsMap(\n value: unknown,\n source: string,\n): Record<string, SharedDepConfig> | undefined {\n if (value === undefined) return undefined;\n const parsed = SharedDepMapSchema.safeParse(value);\n if (!parsed.success) {\n throw new Error(`Invalid shared dependency map at ${source}`);\n }\n return value as Record<string, SharedDepConfig>;\n}\n\nfunction writeFileIfChanged(filePath: string, nextContent: string): boolean {\n try {\n const current = readFileSync(filePath, \"utf-8\");\n if (current === nextContent) return false;\n } catch {\n // file does not exist yet\n }\n\n writeFileSync(filePath, nextContent);\n return true;\n}\n\nfunction fingerprintResolved(deps: Record<string, ResolvedSharedDep>): string {\n return sha256(JSON.stringify(stableDepsObject(deps)));\n}\n\nfunction isSameSharedDepConfig(a: SharedDepConfig, b: SharedDepConfig): boolean {\n const left = normalizeSharedDepConfig(a);\n const right = normalizeSharedDepConfig(b);\n\n return (\n left.version === right.version &&\n left.requiredVersion === right.requiredVersion &&\n left.singleton === right.singleton &&\n left.eager === right.eager &&\n left.strictVersion === right.strictVersion &&\n left.shareScope === right.shareScope\n );\n}\n\nfunction collectSharedDepRefs(bosConfig: SharedDepsConfig): Record<string, SharedDepRef[]> {\n const refs = new Map<string, SharedDepRef[]>();\n\n const app = getObject(bosConfig.app);\n const appUi = getObject(app?.ui);\n const appApi = getObject(app?.api);\n const appAuth = getObject(app?.auth);\n const plugins = getObject(bosConfig.plugins);\n\n if (appUi && \"shared\" in appUi) {\n throw new Error(\n \"app.ui.shared is no longer supported. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.\",\n );\n }\n\n const append = (source: string, shared: Record<string, SharedDepConfig> | undefined) => {\n if (!shared) return;\n\n for (const [name, config] of Object.entries(shared)) {\n const existing = refs.get(name);\n if (!existing) {\n refs.set(name, [{ source, config }]);\n continue;\n }\n\n if (!isSameSharedDepConfig(existing[0]!.config, config)) {\n const previous = existing.map((ref) => ref.source).join(\", \");\n throw new Error(\n `Conflicting shared dependency \"${name}\" between ${previous} and ${source}`,\n );\n }\n\n existing.push({ source, config });\n }\n };\n\n append(\"app.api\", getSharedDepsMap(appApi?.shared, \"app.api.shared\"));\n append(\"app.auth\", getSharedDepsMap(appAuth?.shared, \"app.auth.shared\"));\n\n for (const [pluginId, plugin] of Object.entries(plugins ?? {})) {\n const pluginRecord = getObject(plugin);\n if (!pluginRecord) continue;\n\n const pluginApp = getObject(pluginRecord.app);\n const pluginUi = getObject(pluginApp?.ui);\n if (pluginUi && \"shared\" in pluginUi) {\n throw new Error(\n `app.ui.shared is no longer supported in plugins.${pluginId}. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.`,\n );\n }\n append(\n `plugins.${pluginId}`,\n getSharedDepsMap(pluginRecord.shared, `plugins.${pluginId}.shared`),\n );\n }\n\n return Object.fromEntries(refs);\n}\n\nexport async function syncResolvedSharedDeps(opts: {\n configDir: string;\n hostMode: \"local\" | \"remote\";\n bosConfig?: SharedDepsConfig;\n env?: BosEnv;\n extendsChain?: string[];\n}): Promise<SharedDepsSyncResult> {\n const bosConfigPath = join(opts.configDir, \"bos.config.json\");\n const resolvedConfigPath = join(opts.configDir, \".bos\", \"bos.resolved-config.json\");\n const workspaceRoot = findWorkspaceRoot(opts.configDir)?.dir ?? opts.configDir;\n const generatedPath = join(opts.configDir, \".bos\", \"generated\", \"shared-deps.json\");\n\n const bosConfig: unknown =\n opts.bosConfig ?? (await loadBosConfigForSharedDeps(opts.configDir, bosConfigPath));\n if (!isPlainObject(bosConfig)) {\n throw new Error(\"the authored config must be an object\");\n }\n\n const originalBos = JSON.stringify(bosConfig);\n const catalog = readWorkspaceCatalog(workspaceRoot);\n const originalCatalog = JSON.stringify(catalog);\n\n const mode = opts.hostMode === \"local\" ? \"catalog->bos\" : \"bos->catalog\";\n const refsByName = collectSharedDepRefs(bosConfig);\n\n const resolvedDeps: Record<string, ResolvedSharedDep> = {};\n\n for (const [name, refs] of Object.entries(refsByName)) {\n const first = refs[0];\n if (!first) continue;\n\n const exactFromConfig =\n extractSemverExact(first.config.version) ?? extractSemverExact(first.config.requiredVersion);\n const exactFromCatalog = extractSemverExact(catalog[name]);\n const version =\n mode === \"catalog->bos\"\n ? (exactFromCatalog ?? exactFromConfig)\n : (exactFromConfig ?? exactFromCatalog);\n\n if (!version) {\n const sources = refs.map((ref) => ref.source).join(\", \");\n throw new Error(\n `Could not resolve exact version for shared dependency \"${name}\" from ${sources}`,\n );\n }\n\n if (mode === \"catalog->bos\" && exactFromCatalog === null && exactFromConfig) {\n catalog[name] = exactFromConfig;\n }\n\n if (mode === \"bos->catalog\" && catalog[name] !== version) {\n catalog[name] = version;\n }\n\n for (const ref of refs) {\n ref.config.version = version;\n ref.config.requiredVersion = caretRange(version);\n ref.config.shareScope = ref.config.shareScope ?? \"default\";\n }\n\n resolvedDeps[name] = {\n name,\n version,\n requiredVersion: caretRange(version),\n shareScope: first.config.shareScope ?? \"default\",\n singleton: first.config.singleton ?? false,\n eager: first.config.eager ?? false,\n strictVersion: first.config.strictVersion ?? false,\n sources: refs.map((ref) => ref.source).sort((a, b) => a.localeCompare(b)),\n };\n }\n\n const nextBos = JSON.stringify(bosConfig);\n const bosConfigChanged = nextBos !== originalBos;\n const catalogChanged = JSON.stringify(catalog) !== originalCatalog;\n\n if (bosConfigChanged) {\n const resolvedDir = dirname(resolvedConfigPath);\n if (!existsSync(resolvedDir)) {\n mkdirSync(resolvedDir, { recursive: true });\n }\n\n const ordered = rebuildOrderedConfig(bosConfig);\n const meta: ResolvedConfigMeta = {\n env: opts.env ?? \"development\",\n resolvedAt: new Date().toISOString(),\n extendsChain: opts.extendsChain ?? [],\n source: \"shared-sync\",\n };\n const resolvedOutput = {\n _resolved: meta,\n ...ordered,\n };\n\n writeFileIfChanged(resolvedConfigPath, `${JSON.stringify(resolvedOutput, null, 2)}\\n`);\n }\n\n if (catalogChanged) {\n writeWorkspaceCatalog(workspaceRoot, catalog);\n }\n\n const stableResolvedDeps = stableDepsObject(resolvedDeps);\n const resolved: ResolvedSharedDeps = {\n deps: stableResolvedDeps,\n fingerprintSha256: fingerprintResolved(stableResolvedDeps),\n };\n\n const nextGenerated = {\n schemaVersion: 1,\n kind: \"everything-dev/shared-deps\",\n generatedAt: new Date().toISOString(),\n deps: stableResolvedDeps,\n fingerprintSha256: resolved.fingerprintSha256,\n inputs: {\n mode,\n hostMode: opts.hostMode,\n },\n };\n\n let prevFingerprint: string | null = null;\n try {\n const prev = JSON.parse(readFileSync(generatedPath, \"utf-8\"));\n prevFingerprint = prev?.fingerprintSha256 ?? null;\n } catch {\n // ignore\n }\n\n mkdirSync(dirname(generatedPath), { recursive: true });\n writeFileIfChanged(generatedPath, `${JSON.stringify(nextGenerated, null, 2)}\\n`);\n\n const generatedChanged = prevFingerprint !== nextGenerated.fingerprintSha256;\n\n return {\n mode,\n hostMode: opts.hostMode,\n bosConfigChanged,\n catalogChanged,\n generatedChanged,\n resolved,\n };\n}\n"],"mappings":"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"}
|
package/dist/shared-deps.mjs
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
import { isPlainObject, rebuildOrderedConfig } from "./merge.mjs";
|
|
2
2
|
import { SharedDepMapSchema } from "./types.mjs";
|
|
3
|
+
import { loadAppDescriptorConfig } from "./config.mjs";
|
|
4
|
+
import { readWorkspaceCatalog, writeWorkspaceCatalog } from "./workspace-catalog.mjs";
|
|
5
|
+
import { findWorkspaceRoot } from "./workspace.mjs";
|
|
3
6
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
7
|
import { dirname, join } from "node:path";
|
|
5
8
|
import { createHash } from "node:crypto";
|
|
6
9
|
|
|
7
10
|
//#region src/shared-deps.ts
|
|
11
|
+
async function loadBosConfigForSharedDeps(configDir, bosConfigPath) {
|
|
12
|
+
const appDescriptorPath = join(configDir, "bos.app.ts");
|
|
13
|
+
if (existsSync(appDescriptorPath)) return loadAppDescriptorConfig(appDescriptorPath);
|
|
14
|
+
if (existsSync(bosConfigPath)) return JSON.parse(readFileSync(bosConfigPath, "utf-8"));
|
|
15
|
+
return JSON.parse(readFileSync(bosConfigPath, "utf-8"));
|
|
16
|
+
}
|
|
8
17
|
function sha256(input) {
|
|
9
18
|
return createHash("sha256").update(input).digest("hex");
|
|
10
19
|
}
|
|
@@ -98,16 +107,15 @@ function collectSharedDepRefs(bosConfig) {
|
|
|
98
107
|
async function syncResolvedSharedDeps(opts) {
|
|
99
108
|
const bosConfigPath = join(opts.configDir, "bos.config.json");
|
|
100
109
|
const resolvedConfigPath = join(opts.configDir, ".bos", "bos.resolved-config.json");
|
|
101
|
-
const
|
|
110
|
+
const workspaceRoot = findWorkspaceRoot(opts.configDir)?.dir ?? opts.configDir;
|
|
102
111
|
const generatedPath = join(opts.configDir, ".bos", "generated", "shared-deps.json");
|
|
103
|
-
const bosConfig = opts.bosConfig ??
|
|
104
|
-
if (!isPlainObject(bosConfig)) throw new Error("
|
|
105
|
-
const pkgJson = existsSync(packageJsonPath) ? JSON.parse(readFileSync(packageJsonPath, "utf-8")) : {};
|
|
112
|
+
const bosConfig = opts.bosConfig ?? await loadBosConfigForSharedDeps(opts.configDir, bosConfigPath);
|
|
113
|
+
if (!isPlainObject(bosConfig)) throw new Error("the authored config must be an object");
|
|
106
114
|
const originalBos = JSON.stringify(bosConfig);
|
|
107
|
-
const
|
|
115
|
+
const catalog = readWorkspaceCatalog(workspaceRoot);
|
|
116
|
+
const originalCatalog = JSON.stringify(catalog);
|
|
108
117
|
const mode = opts.hostMode === "local" ? "catalog->bos" : "bos->catalog";
|
|
109
118
|
const refsByName = collectSharedDepRefs(bosConfig);
|
|
110
|
-
const catalog = pkgJson.workspaces?.catalog ?? {};
|
|
111
119
|
const resolvedDeps = {};
|
|
112
120
|
for (const [name, refs] of Object.entries(refsByName)) {
|
|
113
121
|
const first = refs[0];
|
|
@@ -137,15 +145,8 @@ async function syncResolvedSharedDeps(opts) {
|
|
|
137
145
|
sources: refs.map((ref) => ref.source).sort((a, b) => a.localeCompare(b))
|
|
138
146
|
};
|
|
139
147
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
catalog: {}
|
|
143
|
-
};
|
|
144
|
-
pkgJson.workspaces.catalog = catalog;
|
|
145
|
-
const nextBos = JSON.stringify(bosConfig);
|
|
146
|
-
const nextPkg = JSON.stringify(pkgJson);
|
|
147
|
-
const bosConfigChanged = nextBos !== originalBos;
|
|
148
|
-
const catalogChanged = nextPkg !== originalPkg;
|
|
148
|
+
const bosConfigChanged = JSON.stringify(bosConfig) !== originalBos;
|
|
149
|
+
const catalogChanged = JSON.stringify(catalog) !== originalCatalog;
|
|
149
150
|
if (bosConfigChanged) {
|
|
150
151
|
const resolvedDir = dirname(resolvedConfigPath);
|
|
151
152
|
if (!existsSync(resolvedDir)) mkdirSync(resolvedDir, { recursive: true });
|
|
@@ -161,7 +162,7 @@ async function syncResolvedSharedDeps(opts) {
|
|
|
161
162
|
};
|
|
162
163
|
writeFileIfChanged(resolvedConfigPath, `${JSON.stringify(resolvedOutput, null, 2)}\n`);
|
|
163
164
|
}
|
|
164
|
-
if (catalogChanged)
|
|
165
|
+
if (catalogChanged) writeWorkspaceCatalog(workspaceRoot, catalog);
|
|
165
166
|
const stableResolvedDeps = stableDepsObject(resolvedDeps);
|
|
166
167
|
const resolved = {
|
|
167
168
|
deps: stableResolvedDeps,
|
package/dist/shared-deps.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-deps.mjs","names":[],"sources":["../src/shared-deps.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { type BosEnv, isPlainObject, type ResolvedConfigMeta, rebuildOrderedConfig } from \"./merge\";\nimport { type SharedDepConfig, SharedDepMapSchema } from \"./types\";\n\ninterface PackageJson {\n workspaces?: {\n packages?: string[];\n catalog?: Record<string, string>;\n };\n}\n\ninterface SharedDepRef {\n source: string;\n config: SharedDepConfig;\n}\n\ntype SharedDepsConfig = Record<string, unknown>;\n\ninterface NormalizedSharedDepConfig {\n version: string;\n requiredVersion: string | false;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n shareScope: string;\n}\n\nexport interface ResolvedSharedDep {\n name: string;\n version: string;\n requiredVersion: string;\n shareScope: string;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n sources: string[];\n}\n\nexport interface ResolvedSharedDeps {\n deps: Record<string, ResolvedSharedDep>;\n fingerprintSha256: string;\n}\n\nexport interface SharedDepsSyncResult {\n mode: \"catalog->bos\" | \"bos->catalog\";\n hostMode: \"local\" | \"remote\";\n bosConfigChanged: boolean;\n catalogChanged: boolean;\n generatedChanged: boolean;\n resolved: ResolvedSharedDeps;\n}\n\nfunction sha256(input: string): string {\n return createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nfunction extractSemverExact(input: unknown): string | null {\n if (typeof input !== \"string\") return null;\n const match = input.match(/\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?/);\n return match ? match[0] : null;\n}\n\nfunction caretRange(version: string): string {\n return `^${version}`;\n}\n\nfunction stableDepsObject(\n deps: Record<string, ResolvedSharedDep>,\n): Record<string, ResolvedSharedDep> {\n const keys = Object.keys(deps).sort((a, b) => a.localeCompare(b));\n const out: Record<string, ResolvedSharedDep> = {};\n for (const key of keys) {\n out[key] = deps[key]!;\n }\n return out;\n}\n\nfunction normalizeSharedDepConfig(config: SharedDepConfig): NormalizedSharedDepConfig {\n return {\n version: config.version,\n requiredVersion: config.requiredVersion ?? false,\n singleton: config.singleton ?? false,\n eager: config.eager ?? false,\n strictVersion: config.strictVersion ?? false,\n shareScope: config.shareScope ?? \"default\",\n };\n}\n\nfunction getObject(value: unknown): Record<string, unknown> | undefined {\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction getSharedDepsMap(\n value: unknown,\n source: string,\n): Record<string, SharedDepConfig> | undefined {\n if (value === undefined) return undefined;\n const parsed = SharedDepMapSchema.safeParse(value);\n if (!parsed.success) {\n throw new Error(`Invalid shared dependency map at ${source}`);\n }\n return value as Record<string, SharedDepConfig>;\n}\n\nfunction writeFileIfChanged(filePath: string, nextContent: string): boolean {\n try {\n const current = readFileSync(filePath, \"utf-8\");\n if (current === nextContent) return false;\n } catch {\n // file does not exist yet\n }\n\n writeFileSync(filePath, nextContent);\n return true;\n}\n\nfunction fingerprintResolved(deps: Record<string, ResolvedSharedDep>): string {\n return sha256(JSON.stringify(stableDepsObject(deps)));\n}\n\nfunction isSameSharedDepConfig(a: SharedDepConfig, b: SharedDepConfig): boolean {\n const left = normalizeSharedDepConfig(a);\n const right = normalizeSharedDepConfig(b);\n\n return (\n left.version === right.version &&\n left.requiredVersion === right.requiredVersion &&\n left.singleton === right.singleton &&\n left.eager === right.eager &&\n left.strictVersion === right.strictVersion &&\n left.shareScope === right.shareScope\n );\n}\n\nfunction collectSharedDepRefs(bosConfig: SharedDepsConfig): Record<string, SharedDepRef[]> {\n const refs = new Map<string, SharedDepRef[]>();\n\n const app = getObject(bosConfig.app);\n const appUi = getObject(app?.ui);\n const appApi = getObject(app?.api);\n const appAuth = getObject(app?.auth);\n const plugins = getObject(bosConfig.plugins);\n\n if (appUi && \"shared\" in appUi) {\n throw new Error(\n \"app.ui.shared is no longer supported. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.\",\n );\n }\n\n const append = (source: string, shared: Record<string, SharedDepConfig> | undefined) => {\n if (!shared) return;\n\n for (const [name, config] of Object.entries(shared)) {\n const existing = refs.get(name);\n if (!existing) {\n refs.set(name, [{ source, config }]);\n continue;\n }\n\n if (!isSameSharedDepConfig(existing[0]!.config, config)) {\n const previous = existing.map((ref) => ref.source).join(\", \");\n throw new Error(\n `Conflicting shared dependency \"${name}\" between ${previous} and ${source}`,\n );\n }\n\n existing.push({ source, config });\n }\n };\n\n append(\"app.api\", getSharedDepsMap(appApi?.shared, \"app.api.shared\"));\n append(\"app.auth\", getSharedDepsMap(appAuth?.shared, \"app.auth.shared\"));\n\n for (const [pluginId, plugin] of Object.entries(plugins ?? {})) {\n const pluginRecord = getObject(plugin);\n if (!pluginRecord) continue;\n\n const pluginApp = getObject(pluginRecord.app);\n const pluginUi = getObject(pluginApp?.ui);\n if (pluginUi && \"shared\" in pluginUi) {\n throw new Error(\n `app.ui.shared is no longer supported in plugins.${pluginId}. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.`,\n );\n }\n append(\n `plugins.${pluginId}`,\n getSharedDepsMap(pluginRecord.shared, `plugins.${pluginId}.shared`),\n );\n }\n\n return Object.fromEntries(refs);\n}\n\nexport async function syncResolvedSharedDeps(opts: {\n configDir: string;\n hostMode: \"local\" | \"remote\";\n bosConfig?: SharedDepsConfig;\n env?: BosEnv;\n extendsChain?: string[];\n}): Promise<SharedDepsSyncResult> {\n const bosConfigPath = join(opts.configDir, \"bos.config.json\");\n const resolvedConfigPath = join(opts.configDir, \".bos\", \"bos.resolved-config.json\");\n const packageJsonPath = join(opts.configDir, \"package.json\");\n const generatedPath = join(opts.configDir, \".bos\", \"generated\", \"shared-deps.json\");\n\n const bosConfig: unknown = opts.bosConfig ?? JSON.parse(readFileSync(bosConfigPath, \"utf-8\"));\n if (!isPlainObject(bosConfig)) {\n throw new Error(\"bos.config.json must be an object\");\n }\n\n const pkgJson = existsSync(packageJsonPath)\n ? (JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as PackageJson)\n : {};\n\n const originalBos = JSON.stringify(bosConfig);\n const originalPkg = JSON.stringify(pkgJson);\n\n const mode = opts.hostMode === \"local\" ? \"catalog->bos\" : \"bos->catalog\";\n const refsByName = collectSharedDepRefs(bosConfig);\n const catalog = pkgJson.workspaces?.catalog ?? {};\n\n const resolvedDeps: Record<string, ResolvedSharedDep> = {};\n\n for (const [name, refs] of Object.entries(refsByName)) {\n const first = refs[0];\n if (!first) continue;\n\n const exactFromConfig =\n extractSemverExact(first.config.version) ?? extractSemverExact(first.config.requiredVersion);\n const exactFromCatalog = extractSemverExact(catalog[name]);\n const version =\n mode === \"catalog->bos\"\n ? (exactFromCatalog ?? exactFromConfig)\n : (exactFromConfig ?? exactFromCatalog);\n\n if (!version) {\n const sources = refs.map((ref) => ref.source).join(\", \");\n throw new Error(\n `Could not resolve exact version for shared dependency \"${name}\" from ${sources}`,\n );\n }\n\n if (mode === \"catalog->bos\" && exactFromCatalog === null && exactFromConfig) {\n catalog[name] = exactFromConfig;\n }\n\n if (mode === \"bos->catalog\" && catalog[name] !== version) {\n catalog[name] = version;\n }\n\n for (const ref of refs) {\n ref.config.version = version;\n ref.config.requiredVersion = caretRange(version);\n ref.config.shareScope = ref.config.shareScope ?? \"default\";\n }\n\n resolvedDeps[name] = {\n name,\n version,\n requiredVersion: caretRange(version),\n shareScope: first.config.shareScope ?? \"default\",\n singleton: first.config.singleton ?? false,\n eager: first.config.eager ?? false,\n strictVersion: first.config.strictVersion ?? false,\n sources: refs.map((ref) => ref.source).sort((a, b) => a.localeCompare(b)),\n };\n }\n\n if (!pkgJson.workspaces) {\n pkgJson.workspaces = { packages: [], catalog: {} };\n }\n pkgJson.workspaces.catalog = catalog;\n\n const nextBos = JSON.stringify(bosConfig);\n const nextPkg = JSON.stringify(pkgJson);\n const bosConfigChanged = nextBos !== originalBos;\n const catalogChanged = nextPkg !== originalPkg;\n\n if (bosConfigChanged) {\n const resolvedDir = dirname(resolvedConfigPath);\n if (!existsSync(resolvedDir)) {\n mkdirSync(resolvedDir, { recursive: true });\n }\n\n const ordered = rebuildOrderedConfig(bosConfig);\n const meta: ResolvedConfigMeta = {\n env: opts.env ?? \"development\",\n resolvedAt: new Date().toISOString(),\n extendsChain: opts.extendsChain ?? [],\n source: \"shared-sync\",\n };\n const resolvedOutput = {\n _resolved: meta,\n ...ordered,\n };\n\n writeFileIfChanged(resolvedConfigPath, `${JSON.stringify(resolvedOutput, null, 2)}\\n`);\n }\n\n if (catalogChanged) {\n writeFileIfChanged(packageJsonPath, `${JSON.stringify(pkgJson, null, 2)}\\n`);\n }\n\n const stableResolvedDeps = stableDepsObject(resolvedDeps);\n const resolved: ResolvedSharedDeps = {\n deps: stableResolvedDeps,\n fingerprintSha256: fingerprintResolved(stableResolvedDeps),\n };\n\n const nextGenerated = {\n schemaVersion: 1,\n kind: \"everything-dev/shared-deps\",\n generatedAt: new Date().toISOString(),\n deps: stableResolvedDeps,\n fingerprintSha256: resolved.fingerprintSha256,\n inputs: {\n mode,\n hostMode: opts.hostMode,\n },\n };\n\n let prevFingerprint: string | null = null;\n try {\n const prev = JSON.parse(readFileSync(generatedPath, \"utf-8\"));\n prevFingerprint = prev?.fingerprintSha256 ?? null;\n } catch {\n // ignore\n }\n\n mkdirSync(dirname(generatedPath), { recursive: true });\n writeFileIfChanged(generatedPath, `${JSON.stringify(nextGenerated, null, 2)}\\n`);\n\n const generatedChanged = prevFingerprint !== nextGenerated.fingerprintSha256;\n\n return {\n mode,\n hostMode: opts.hostMode,\n bosConfigChanged,\n catalogChanged,\n generatedChanged,\n resolved,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared-deps.mjs","names":[],"sources":["../src/shared-deps.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { loadAppDescriptorConfig } from \"./config\";\nimport { type BosEnv, isPlainObject, type ResolvedConfigMeta, rebuildOrderedConfig } from \"./merge\";\nimport { type SharedDepConfig, SharedDepMapSchema } from \"./types\";\nimport { findWorkspaceRoot } from \"./workspace\";\nimport { readWorkspaceCatalog, writeWorkspaceCatalog } from \"./workspace-catalog\";\n\nasync function loadBosConfigForSharedDeps(\n configDir: string,\n bosConfigPath: string,\n): Promise<unknown> {\n const appDescriptorPath = join(configDir, \"bos.app.ts\");\n if (existsSync(appDescriptorPath)) {\n return loadAppDescriptorConfig(appDescriptorPath);\n }\n if (existsSync(bosConfigPath)) {\n return JSON.parse(readFileSync(bosConfigPath, \"utf-8\"));\n }\n\n return JSON.parse(readFileSync(bosConfigPath, \"utf-8\"));\n}\n\ninterface SharedDepRef {\n source: string;\n config: SharedDepConfig;\n}\n\ntype SharedDepsConfig = Record<string, unknown>;\n\ninterface NormalizedSharedDepConfig {\n version: string;\n requiredVersion: string | false;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n shareScope: string;\n}\n\nexport interface ResolvedSharedDep {\n name: string;\n version: string;\n requiredVersion: string;\n shareScope: string;\n singleton: boolean;\n eager: boolean;\n strictVersion: boolean;\n sources: string[];\n}\n\nexport interface ResolvedSharedDeps {\n deps: Record<string, ResolvedSharedDep>;\n fingerprintSha256: string;\n}\n\nexport interface SharedDepsSyncResult {\n mode: \"catalog->bos\" | \"bos->catalog\";\n hostMode: \"local\" | \"remote\";\n bosConfigChanged: boolean;\n catalogChanged: boolean;\n generatedChanged: boolean;\n resolved: ResolvedSharedDeps;\n}\n\nfunction sha256(input: string): string {\n return createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nfunction extractSemverExact(input: unknown): string | null {\n if (typeof input !== \"string\") return null;\n const match = input.match(/\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?/);\n return match ? match[0] : null;\n}\n\nfunction caretRange(version: string): string {\n return `^${version}`;\n}\n\nfunction stableDepsObject(\n deps: Record<string, ResolvedSharedDep>,\n): Record<string, ResolvedSharedDep> {\n const keys = Object.keys(deps).sort((a, b) => a.localeCompare(b));\n const out: Record<string, ResolvedSharedDep> = {};\n for (const key of keys) {\n out[key] = deps[key]!;\n }\n return out;\n}\n\nfunction normalizeSharedDepConfig(config: SharedDepConfig): NormalizedSharedDepConfig {\n return {\n version: config.version,\n requiredVersion: config.requiredVersion ?? false,\n singleton: config.singleton ?? false,\n eager: config.eager ?? false,\n strictVersion: config.strictVersion ?? false,\n shareScope: config.shareScope ?? \"default\",\n };\n}\n\nfunction getObject(value: unknown): Record<string, unknown> | undefined {\n return isPlainObject(value) ? value : undefined;\n}\n\nfunction getSharedDepsMap(\n value: unknown,\n source: string,\n): Record<string, SharedDepConfig> | undefined {\n if (value === undefined) return undefined;\n const parsed = SharedDepMapSchema.safeParse(value);\n if (!parsed.success) {\n throw new Error(`Invalid shared dependency map at ${source}`);\n }\n return value as Record<string, SharedDepConfig>;\n}\n\nfunction writeFileIfChanged(filePath: string, nextContent: string): boolean {\n try {\n const current = readFileSync(filePath, \"utf-8\");\n if (current === nextContent) return false;\n } catch {\n // file does not exist yet\n }\n\n writeFileSync(filePath, nextContent);\n return true;\n}\n\nfunction fingerprintResolved(deps: Record<string, ResolvedSharedDep>): string {\n return sha256(JSON.stringify(stableDepsObject(deps)));\n}\n\nfunction isSameSharedDepConfig(a: SharedDepConfig, b: SharedDepConfig): boolean {\n const left = normalizeSharedDepConfig(a);\n const right = normalizeSharedDepConfig(b);\n\n return (\n left.version === right.version &&\n left.requiredVersion === right.requiredVersion &&\n left.singleton === right.singleton &&\n left.eager === right.eager &&\n left.strictVersion === right.strictVersion &&\n left.shareScope === right.shareScope\n );\n}\n\nfunction collectSharedDepRefs(bosConfig: SharedDepsConfig): Record<string, SharedDepRef[]> {\n const refs = new Map<string, SharedDepRef[]>();\n\n const app = getObject(bosConfig.app);\n const appUi = getObject(app?.ui);\n const appApi = getObject(app?.api);\n const appAuth = getObject(app?.auth);\n const plugins = getObject(bosConfig.plugins);\n\n if (appUi && \"shared\" in appUi) {\n throw new Error(\n \"app.ui.shared is no longer supported. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.\",\n );\n }\n\n const append = (source: string, shared: Record<string, SharedDepConfig> | undefined) => {\n if (!shared) return;\n\n for (const [name, config] of Object.entries(shared)) {\n const existing = refs.get(name);\n if (!existing) {\n refs.set(name, [{ source, config }]);\n continue;\n }\n\n if (!isSameSharedDepConfig(existing[0]!.config, config)) {\n const previous = existing.map((ref) => ref.source).join(\", \");\n throw new Error(\n `Conflicting shared dependency \"${name}\" between ${previous} and ${source}`,\n );\n }\n\n existing.push({ source, config });\n }\n };\n\n append(\"app.api\", getSharedDepsMap(appApi?.shared, \"app.api.shared\"));\n append(\"app.auth\", getSharedDepsMap(appAuth?.shared, \"app.auth.shared\"));\n\n for (const [pluginId, plugin] of Object.entries(plugins ?? {})) {\n const pluginRecord = getObject(plugin);\n if (!pluginRecord) continue;\n\n const pluginApp = getObject(pluginRecord.app);\n const pluginUi = getObject(pluginApp?.ui);\n if (pluginUi && \"shared\" in pluginUi) {\n throw new Error(\n `app.ui.shared is no longer supported in plugins.${pluginId}. Move shared deps to app.api.shared, app.auth.shared, or plugins.*.shared.`,\n );\n }\n append(\n `plugins.${pluginId}`,\n getSharedDepsMap(pluginRecord.shared, `plugins.${pluginId}.shared`),\n );\n }\n\n return Object.fromEntries(refs);\n}\n\nexport async function syncResolvedSharedDeps(opts: {\n configDir: string;\n hostMode: \"local\" | \"remote\";\n bosConfig?: SharedDepsConfig;\n env?: BosEnv;\n extendsChain?: string[];\n}): Promise<SharedDepsSyncResult> {\n const bosConfigPath = join(opts.configDir, \"bos.config.json\");\n const resolvedConfigPath = join(opts.configDir, \".bos\", \"bos.resolved-config.json\");\n const workspaceRoot = findWorkspaceRoot(opts.configDir)?.dir ?? opts.configDir;\n const generatedPath = join(opts.configDir, \".bos\", \"generated\", \"shared-deps.json\");\n\n const bosConfig: unknown =\n opts.bosConfig ?? (await loadBosConfigForSharedDeps(opts.configDir, bosConfigPath));\n if (!isPlainObject(bosConfig)) {\n throw new Error(\"the authored config must be an object\");\n }\n\n const originalBos = JSON.stringify(bosConfig);\n const catalog = readWorkspaceCatalog(workspaceRoot);\n const originalCatalog = JSON.stringify(catalog);\n\n const mode = opts.hostMode === \"local\" ? \"catalog->bos\" : \"bos->catalog\";\n const refsByName = collectSharedDepRefs(bosConfig);\n\n const resolvedDeps: Record<string, ResolvedSharedDep> = {};\n\n for (const [name, refs] of Object.entries(refsByName)) {\n const first = refs[0];\n if (!first) continue;\n\n const exactFromConfig =\n extractSemverExact(first.config.version) ?? extractSemverExact(first.config.requiredVersion);\n const exactFromCatalog = extractSemverExact(catalog[name]);\n const version =\n mode === \"catalog->bos\"\n ? (exactFromCatalog ?? exactFromConfig)\n : (exactFromConfig ?? exactFromCatalog);\n\n if (!version) {\n const sources = refs.map((ref) => ref.source).join(\", \");\n throw new Error(\n `Could not resolve exact version for shared dependency \"${name}\" from ${sources}`,\n );\n }\n\n if (mode === \"catalog->bos\" && exactFromCatalog === null && exactFromConfig) {\n catalog[name] = exactFromConfig;\n }\n\n if (mode === \"bos->catalog\" && catalog[name] !== version) {\n catalog[name] = version;\n }\n\n for (const ref of refs) {\n ref.config.version = version;\n ref.config.requiredVersion = caretRange(version);\n ref.config.shareScope = ref.config.shareScope ?? \"default\";\n }\n\n resolvedDeps[name] = {\n name,\n version,\n requiredVersion: caretRange(version),\n shareScope: first.config.shareScope ?? \"default\",\n singleton: first.config.singleton ?? false,\n eager: first.config.eager ?? false,\n strictVersion: first.config.strictVersion ?? false,\n sources: refs.map((ref) => ref.source).sort((a, b) => a.localeCompare(b)),\n };\n }\n\n const nextBos = JSON.stringify(bosConfig);\n const bosConfigChanged = nextBos !== originalBos;\n const catalogChanged = JSON.stringify(catalog) !== originalCatalog;\n\n if (bosConfigChanged) {\n const resolvedDir = dirname(resolvedConfigPath);\n if (!existsSync(resolvedDir)) {\n mkdirSync(resolvedDir, { recursive: true });\n }\n\n const ordered = rebuildOrderedConfig(bosConfig);\n const meta: ResolvedConfigMeta = {\n env: opts.env ?? \"development\",\n resolvedAt: new Date().toISOString(),\n extendsChain: opts.extendsChain ?? [],\n source: \"shared-sync\",\n };\n const resolvedOutput = {\n _resolved: meta,\n ...ordered,\n };\n\n writeFileIfChanged(resolvedConfigPath, `${JSON.stringify(resolvedOutput, null, 2)}\\n`);\n }\n\n if (catalogChanged) {\n writeWorkspaceCatalog(workspaceRoot, catalog);\n }\n\n const stableResolvedDeps = stableDepsObject(resolvedDeps);\n const resolved: ResolvedSharedDeps = {\n deps: stableResolvedDeps,\n fingerprintSha256: fingerprintResolved(stableResolvedDeps),\n };\n\n const nextGenerated = {\n schemaVersion: 1,\n kind: \"everything-dev/shared-deps\",\n generatedAt: new Date().toISOString(),\n deps: stableResolvedDeps,\n fingerprintSha256: resolved.fingerprintSha256,\n inputs: {\n mode,\n hostMode: opts.hostMode,\n },\n };\n\n let prevFingerprint: string | null = null;\n try {\n const prev = JSON.parse(readFileSync(generatedPath, \"utf-8\"));\n prevFingerprint = prev?.fingerprintSha256 ?? null;\n } catch {\n // ignore\n }\n\n mkdirSync(dirname(generatedPath), { recursive: true });\n writeFileIfChanged(generatedPath, `${JSON.stringify(nextGenerated, null, 2)}\\n`);\n\n const generatedChanged = prevFingerprint !== nextGenerated.fingerprintSha256;\n\n return {\n mode,\n hostMode: opts.hostMode,\n bosConfigChanged,\n catalogChanged,\n generatedChanged,\n resolved,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
//#region src/start-config-source.ts
|
|
3
|
+
function resolveStartConfigSource(input, env) {
|
|
4
|
+
if (input.configPath) return { configPath: input.configPath };
|
|
5
|
+
const account = input.account ?? env.BOS_ACCOUNT;
|
|
6
|
+
const domain = input.domain ?? env.BOS_GATEWAY;
|
|
7
|
+
if (account && domain) return { registry: {
|
|
8
|
+
account,
|
|
9
|
+
domain
|
|
10
|
+
} };
|
|
11
|
+
return {};
|
|
12
|
+
}
|
|
13
|
+
/** A registry-fetched start is a real deployment — a localhost origin there is
|
|
14
|
+
* a stray dev leftover. Local starts (explicit --config-path, bare `bos start`)
|
|
15
|
+
* keep the operator's environment: their localhost origin IS the reachable
|
|
16
|
+
* deployment context the in-process host's auth seam reads. */
|
|
17
|
+
function isRegistryStart(source) {
|
|
18
|
+
return source.registry !== void 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
22
|
+
exports.isRegistryStart = isRegistryStart;
|
|
23
|
+
exports.resolveStartConfigSource = resolveStartConfigSource;
|
|
24
|
+
//# sourceMappingURL=start-config-source.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-config-source.cjs","names":[],"sources":["../src/start-config-source.ts"],"sourcesContent":["/**\n * The `bos start --config` decision: an explicit local config outranks the\n * registry identity (BOS_ACCOUNT/BOS_GATEWAY) — FastKV is fetched only when\n * no local config was given.\n */\n\nexport interface StartConfigSource {\n configPath?: string;\n registry?: { account: string; domain: string };\n}\n\nexport function resolveStartConfigSource(\n input: { configPath?: string; account?: string; domain?: string },\n env: { BOS_ACCOUNT?: string; BOS_GATEWAY?: string },\n): StartConfigSource {\n if (input.configPath) {\n return { configPath: input.configPath };\n }\n const account = input.account ?? env.BOS_ACCOUNT;\n const domain = input.domain ?? env.BOS_GATEWAY;\n if (account && domain) {\n return { registry: { account, domain } };\n }\n return {};\n}\n\n/** A registry-fetched start is a real deployment — a localhost origin there is\n * a stray dev leftover. Local starts (explicit --config-path, bare `bos start`)\n * keep the operator's environment: their localhost origin IS the reachable\n * deployment context the in-process host's auth seam reads. */\nexport function isRegistryStart(source: StartConfigSource): boolean {\n return source.registry !== undefined;\n}\n"],"mappings":";;AAWA,SAAgB,yBACd,OACA,KACmB;CACnB,IAAI,MAAM,YACR,OAAO,EAAE,YAAY,MAAM,WAAW;CAExC,MAAM,UAAU,MAAM,WAAW,IAAI;CACrC,MAAM,SAAS,MAAM,UAAU,IAAI;CACnC,IAAI,WAAW,QACb,OAAO,EAAE,UAAU;EAAE;EAAS;CAAO,EAAE;CAEzC,OAAO,CAAC;AACV;;;;;AAMA,SAAgB,gBAAgB,QAAoC;CAClE,OAAO,OAAO,aAAa;AAC7B"}
|