everything-dev 1.53.2 → 2.0.0-rc.1
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 +627 -199
- 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 +616 -197
- 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
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
let node_crypto = require("node:crypto");
|
|
2
|
+
|
|
3
|
+
//#region src/rollback.ts
|
|
4
|
+
function collectPinnedSlots(config) {
|
|
5
|
+
const slots = [];
|
|
6
|
+
const app = config.app;
|
|
7
|
+
const plugins = config.plugins;
|
|
8
|
+
const push = (slot, ref) => {
|
|
9
|
+
if (ref && typeof ref === "object") slots.push({
|
|
10
|
+
slot,
|
|
11
|
+
ref
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
if (app) {
|
|
15
|
+
for (const key of [
|
|
16
|
+
"host",
|
|
17
|
+
"ui",
|
|
18
|
+
"api",
|
|
19
|
+
"auth"
|
|
20
|
+
]) push(`app.${key}`, app[key]);
|
|
21
|
+
const auth = app.auth;
|
|
22
|
+
if (auth?.ui) push("app.auth.ui", auth.ui);
|
|
23
|
+
}
|
|
24
|
+
if (plugins) for (const [key, plugin] of Object.entries(plugins)) {
|
|
25
|
+
if (typeof plugin !== "object" || plugin === null) continue;
|
|
26
|
+
push(key, plugin);
|
|
27
|
+
const ui = plugin.ui;
|
|
28
|
+
if (ui) push(`${key}.ui`, ui);
|
|
29
|
+
}
|
|
30
|
+
return slots;
|
|
31
|
+
}
|
|
32
|
+
function pinOf(ref) {
|
|
33
|
+
const manifest = typeof ref.pin?.manifest === "string" ? ref.pin.manifest : void 0;
|
|
34
|
+
const integrity = typeof ref.pin?.integrity === "string" ? ref.pin.integrity : void 0;
|
|
35
|
+
return manifest && integrity ? {
|
|
36
|
+
manifest,
|
|
37
|
+
integrity
|
|
38
|
+
} : null;
|
|
39
|
+
}
|
|
40
|
+
/** Every pinned slot with both a production base and a verifiable pin. */
|
|
41
|
+
function collectSlotPinRefs(config) {
|
|
42
|
+
return collectPinnedSlots(config).map(({ slot, ref }) => {
|
|
43
|
+
const pin = pinOf(ref);
|
|
44
|
+
const base = typeof ref.production === "string" ? ref.production : void 0;
|
|
45
|
+
return pin && base ? {
|
|
46
|
+
slot,
|
|
47
|
+
base,
|
|
48
|
+
pin
|
|
49
|
+
} : null;
|
|
50
|
+
}).filter((entry) => entry !== null);
|
|
51
|
+
}
|
|
52
|
+
async function verifySlot(slot, ref, fetchImpl) {
|
|
53
|
+
const base = typeof ref.production === "string" ? ref.production : void 0;
|
|
54
|
+
const pin = pinOf(ref);
|
|
55
|
+
if (!pin) return {
|
|
56
|
+
slot,
|
|
57
|
+
ok: true
|
|
58
|
+
};
|
|
59
|
+
const { manifest, integrity } = pin;
|
|
60
|
+
if (!base) return {
|
|
61
|
+
slot,
|
|
62
|
+
manifest,
|
|
63
|
+
ok: false,
|
|
64
|
+
reason: "no production URL to fetch the manifest from"
|
|
65
|
+
};
|
|
66
|
+
const manifestUrl = `${base.replace(/\/$/, "")}/${manifest.replace(/^\//, "")}`;
|
|
67
|
+
try {
|
|
68
|
+
const response = await fetchImpl(manifestUrl);
|
|
69
|
+
if (!response.ok) return {
|
|
70
|
+
slot,
|
|
71
|
+
manifest,
|
|
72
|
+
ok: false,
|
|
73
|
+
reason: `manifest fetch failed: ${response.status}`
|
|
74
|
+
};
|
|
75
|
+
const body = await response.text();
|
|
76
|
+
const computed = `sha384-${(0, node_crypto.createHash)("sha384").update(body).digest("base64")}`;
|
|
77
|
+
if (computed !== integrity) return {
|
|
78
|
+
slot,
|
|
79
|
+
manifest,
|
|
80
|
+
ok: false,
|
|
81
|
+
reason: `integrity mismatch for ${manifestUrl} (expected ${integrity}, computed ${computed})`
|
|
82
|
+
};
|
|
83
|
+
return {
|
|
84
|
+
slot,
|
|
85
|
+
manifest,
|
|
86
|
+
ok: true
|
|
87
|
+
};
|
|
88
|
+
} catch (error) {
|
|
89
|
+
return {
|
|
90
|
+
slot,
|
|
91
|
+
manifest,
|
|
92
|
+
ok: false,
|
|
93
|
+
reason: `manifest fetch failed: ${error instanceof Error ? error.message : String(error)}`
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async function verifyRollbackSnapshot(config, opts) {
|
|
98
|
+
const fetchImpl = opts?.fetchImpl ?? fetch;
|
|
99
|
+
const pinned = collectPinnedSlots(config).filter((entry) => pinOf(entry.ref) !== null);
|
|
100
|
+
if (pinned.length === 0) return {
|
|
101
|
+
verifiable: false,
|
|
102
|
+
ok: false,
|
|
103
|
+
slots: []
|
|
104
|
+
};
|
|
105
|
+
const slots = await Promise.all(pinned.map((entry) => verifySlot(entry.slot, entry.ref, fetchImpl)));
|
|
106
|
+
return {
|
|
107
|
+
verifiable: true,
|
|
108
|
+
ok: slots.every((check) => check.ok),
|
|
109
|
+
slots
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function summarizeSlotPins(config) {
|
|
113
|
+
const pinned = collectPinnedSlots(config).map((entry) => {
|
|
114
|
+
const pin = pinOf(entry.ref);
|
|
115
|
+
return pin ? `${entry.slot}=${pin.manifest}` : null;
|
|
116
|
+
}).filter(Boolean);
|
|
117
|
+
return pinned.length > 0 ? pinned.join(" ") : "no version pins (pre-pin snapshot)";
|
|
118
|
+
}
|
|
119
|
+
function buildRollbackPayload(targetConfig, rolledBackFrom) {
|
|
120
|
+
return {
|
|
121
|
+
...targetConfig,
|
|
122
|
+
rolledBackFrom
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
//#endregion
|
|
127
|
+
exports.buildRollbackPayload = buildRollbackPayload;
|
|
128
|
+
exports.collectSlotPinRefs = collectSlotPinRefs;
|
|
129
|
+
exports.summarizeSlotPins = summarizeSlotPins;
|
|
130
|
+
exports.verifyRollbackSnapshot = verifyRollbackSnapshot;
|
|
131
|
+
//# sourceMappingURL=rollback.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollback.cjs","names":["createHash"],"sources":["../src/rollback.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { BosConfigInput } from \"./types\";\n\n/**\n * Rollback safety gate (atomic-deploys 11): before republishing a historical\n * snapshot, every pinned slot's version manifest must still serve and match\n * its SRI — Phase A made bytes additive and retention is keep-everything, so\n * a verify failure means the pointer is broken, never publishable. Snapshots\n * from before the pin existed cannot be verified this way; they are allowed\n * only with an explicit force (their bytes were overwritten in place), with\n * the caller expected to warn loudly.\n */\n\nexport interface RollbackSlotCheck {\n slot: string;\n manifest?: string;\n ok: boolean;\n reason?: string;\n}\n\nexport interface RollbackVerification {\n /** false = pre-pin snapshot with no verifiable pins (force required) */\n verifiable: boolean;\n ok: boolean;\n slots: RollbackSlotCheck[];\n}\n\ninterface PinnedSlotRef {\n production?: unknown;\n pin?: { manifest?: unknown; integrity?: unknown };\n}\n\nfunction collectPinnedSlots(config: BosConfigInput): Array<{ slot: string; ref: PinnedSlotRef }> {\n const slots: Array<{ slot: string; ref: PinnedSlotRef }> = [];\n const app = config.app as Record<string, PinnedSlotRef | undefined> | undefined;\n const plugins = config.plugins as Record<string, unknown> | undefined;\n\n const push = (slot: string, ref: unknown): void => {\n if (ref && typeof ref === \"object\") slots.push({ slot, ref: ref as PinnedSlotRef });\n };\n\n if (app) {\n for (const key of [\"host\", \"ui\", \"api\", \"auth\"] as const) push(`app.${key}`, app[key]);\n const auth = app.auth as { ui?: unknown } | undefined;\n if (auth?.ui) push(\"app.auth.ui\", auth.ui);\n }\n if (plugins) {\n for (const [key, plugin] of Object.entries(plugins)) {\n if (typeof plugin !== \"object\" || plugin === null) continue;\n push(key, plugin);\n const ui = (plugin as { ui?: unknown }).ui;\n if (ui) push(`${key}.ui`, ui);\n }\n }\n return slots;\n}\n\nfunction pinOf(ref: PinnedSlotRef): { manifest: string; integrity: string } | null {\n const manifest = typeof ref.pin?.manifest === \"string\" ? ref.pin.manifest : undefined;\n const integrity = typeof ref.pin?.integrity === \"string\" ? ref.pin.integrity : undefined;\n return manifest && integrity ? { manifest, integrity } : null;\n}\n\nexport interface SlotPinRef {\n slot: string;\n /** the slot's production base URL (…/bundles/<account>/<gateway>/<workspace>/) */\n base: string;\n pin: { manifest: string; integrity: string };\n}\n\n/** Every pinned slot with both a production base and a verifiable pin. */\nexport function collectSlotPinRefs(config: BosConfigInput): SlotPinRef[] {\n return collectPinnedSlots(config)\n .map(({ slot, ref }) => {\n const pin = pinOf(ref);\n const base = typeof ref.production === \"string\" ? ref.production : undefined;\n return pin && base ? { slot, base, pin } : null;\n })\n .filter((entry): entry is SlotPinRef => entry !== null);\n}\n\nasync function verifySlot(\n slot: string,\n ref: PinnedSlotRef,\n fetchImpl: typeof fetch,\n): Promise<RollbackSlotCheck> {\n const base = typeof ref.production === \"string\" ? ref.production : undefined;\n const pin = pinOf(ref);\n if (!pin) return { slot, ok: true };\n const { manifest, integrity } = pin;\n\n if (!base)\n return { slot, manifest, ok: false, reason: \"no production URL to fetch the manifest from\" };\n\n const manifestUrl = `${base.replace(/\\/$/, \"\")}/${manifest.replace(/^\\//, \"\")}`;\n try {\n const response = await fetchImpl(manifestUrl);\n if (!response.ok) {\n return { slot, manifest, ok: false, reason: `manifest fetch failed: ${response.status}` };\n }\n const body = await response.text();\n const computed = `sha384-${createHash(\"sha384\").update(body).digest(\"base64\")}`;\n if (computed !== integrity) {\n return {\n slot,\n manifest,\n ok: false,\n reason: `integrity mismatch for ${manifestUrl} (expected ${integrity}, computed ${computed})`,\n };\n }\n return { slot, manifest, ok: true };\n } catch (error) {\n return {\n slot,\n manifest,\n ok: false,\n reason: `manifest fetch failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\nexport async function verifyRollbackSnapshot(\n config: BosConfigInput,\n opts?: { fetchImpl?: typeof fetch },\n): Promise<RollbackVerification> {\n const fetchImpl = opts?.fetchImpl ?? fetch;\n const pinned = collectPinnedSlots(config).filter((entry) => pinOf(entry.ref) !== null);\n\n if (pinned.length === 0) {\n return { verifiable: false, ok: false, slots: [] };\n }\n\n const slots = await Promise.all(\n pinned.map((entry) => verifySlot(entry.slot, entry.ref, fetchImpl)),\n );\n return { verifiable: true, ok: slots.every((check) => check.ok), slots };\n}\n\nexport function summarizeSlotPins(config: BosConfigInput): string {\n const pinned = collectPinnedSlots(config)\n .map((entry) => {\n const pin = pinOf(entry.ref);\n return pin ? `${entry.slot}=${pin.manifest}` : null;\n })\n .filter(Boolean) as string[];\n return pinned.length > 0 ? pinned.join(\" \") : \"no version pins (pre-pin snapshot)\";\n}\n\nexport function buildRollbackPayload<T extends Record<string, unknown>>(\n targetConfig: T,\n rolledBackFrom: string,\n): T {\n return { ...targetConfig, rolledBackFrom } as T;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
|
|
3
|
+
//#region src/rollback.ts
|
|
4
|
+
function collectPinnedSlots(config) {
|
|
5
|
+
const slots = [];
|
|
6
|
+
const app = config.app;
|
|
7
|
+
const plugins = config.plugins;
|
|
8
|
+
const push = (slot, ref) => {
|
|
9
|
+
if (ref && typeof ref === "object") slots.push({
|
|
10
|
+
slot,
|
|
11
|
+
ref
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
if (app) {
|
|
15
|
+
for (const key of [
|
|
16
|
+
"host",
|
|
17
|
+
"ui",
|
|
18
|
+
"api",
|
|
19
|
+
"auth"
|
|
20
|
+
]) push(`app.${key}`, app[key]);
|
|
21
|
+
const auth = app.auth;
|
|
22
|
+
if (auth?.ui) push("app.auth.ui", auth.ui);
|
|
23
|
+
}
|
|
24
|
+
if (plugins) for (const [key, plugin] of Object.entries(plugins)) {
|
|
25
|
+
if (typeof plugin !== "object" || plugin === null) continue;
|
|
26
|
+
push(key, plugin);
|
|
27
|
+
const ui = plugin.ui;
|
|
28
|
+
if (ui) push(`${key}.ui`, ui);
|
|
29
|
+
}
|
|
30
|
+
return slots;
|
|
31
|
+
}
|
|
32
|
+
function pinOf(ref) {
|
|
33
|
+
const manifest = typeof ref.pin?.manifest === "string" ? ref.pin.manifest : void 0;
|
|
34
|
+
const integrity = typeof ref.pin?.integrity === "string" ? ref.pin.integrity : void 0;
|
|
35
|
+
return manifest && integrity ? {
|
|
36
|
+
manifest,
|
|
37
|
+
integrity
|
|
38
|
+
} : null;
|
|
39
|
+
}
|
|
40
|
+
/** Every pinned slot with both a production base and a verifiable pin. */
|
|
41
|
+
function collectSlotPinRefs(config) {
|
|
42
|
+
return collectPinnedSlots(config).map(({ slot, ref }) => {
|
|
43
|
+
const pin = pinOf(ref);
|
|
44
|
+
const base = typeof ref.production === "string" ? ref.production : void 0;
|
|
45
|
+
return pin && base ? {
|
|
46
|
+
slot,
|
|
47
|
+
base,
|
|
48
|
+
pin
|
|
49
|
+
} : null;
|
|
50
|
+
}).filter((entry) => entry !== null);
|
|
51
|
+
}
|
|
52
|
+
async function verifySlot(slot, ref, fetchImpl) {
|
|
53
|
+
const base = typeof ref.production === "string" ? ref.production : void 0;
|
|
54
|
+
const pin = pinOf(ref);
|
|
55
|
+
if (!pin) return {
|
|
56
|
+
slot,
|
|
57
|
+
ok: true
|
|
58
|
+
};
|
|
59
|
+
const { manifest, integrity } = pin;
|
|
60
|
+
if (!base) return {
|
|
61
|
+
slot,
|
|
62
|
+
manifest,
|
|
63
|
+
ok: false,
|
|
64
|
+
reason: "no production URL to fetch the manifest from"
|
|
65
|
+
};
|
|
66
|
+
const manifestUrl = `${base.replace(/\/$/, "")}/${manifest.replace(/^\//, "")}`;
|
|
67
|
+
try {
|
|
68
|
+
const response = await fetchImpl(manifestUrl);
|
|
69
|
+
if (!response.ok) return {
|
|
70
|
+
slot,
|
|
71
|
+
manifest,
|
|
72
|
+
ok: false,
|
|
73
|
+
reason: `manifest fetch failed: ${response.status}`
|
|
74
|
+
};
|
|
75
|
+
const body = await response.text();
|
|
76
|
+
const computed = `sha384-${createHash("sha384").update(body).digest("base64")}`;
|
|
77
|
+
if (computed !== integrity) return {
|
|
78
|
+
slot,
|
|
79
|
+
manifest,
|
|
80
|
+
ok: false,
|
|
81
|
+
reason: `integrity mismatch for ${manifestUrl} (expected ${integrity}, computed ${computed})`
|
|
82
|
+
};
|
|
83
|
+
return {
|
|
84
|
+
slot,
|
|
85
|
+
manifest,
|
|
86
|
+
ok: true
|
|
87
|
+
};
|
|
88
|
+
} catch (error) {
|
|
89
|
+
return {
|
|
90
|
+
slot,
|
|
91
|
+
manifest,
|
|
92
|
+
ok: false,
|
|
93
|
+
reason: `manifest fetch failed: ${error instanceof Error ? error.message : String(error)}`
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async function verifyRollbackSnapshot(config, opts) {
|
|
98
|
+
const fetchImpl = opts?.fetchImpl ?? fetch;
|
|
99
|
+
const pinned = collectPinnedSlots(config).filter((entry) => pinOf(entry.ref) !== null);
|
|
100
|
+
if (pinned.length === 0) return {
|
|
101
|
+
verifiable: false,
|
|
102
|
+
ok: false,
|
|
103
|
+
slots: []
|
|
104
|
+
};
|
|
105
|
+
const slots = await Promise.all(pinned.map((entry) => verifySlot(entry.slot, entry.ref, fetchImpl)));
|
|
106
|
+
return {
|
|
107
|
+
verifiable: true,
|
|
108
|
+
ok: slots.every((check) => check.ok),
|
|
109
|
+
slots
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function summarizeSlotPins(config) {
|
|
113
|
+
const pinned = collectPinnedSlots(config).map((entry) => {
|
|
114
|
+
const pin = pinOf(entry.ref);
|
|
115
|
+
return pin ? `${entry.slot}=${pin.manifest}` : null;
|
|
116
|
+
}).filter(Boolean);
|
|
117
|
+
return pinned.length > 0 ? pinned.join(" ") : "no version pins (pre-pin snapshot)";
|
|
118
|
+
}
|
|
119
|
+
function buildRollbackPayload(targetConfig, rolledBackFrom) {
|
|
120
|
+
return {
|
|
121
|
+
...targetConfig,
|
|
122
|
+
rolledBackFrom
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
//#endregion
|
|
127
|
+
export { buildRollbackPayload, collectSlotPinRefs, summarizeSlotPins, verifyRollbackSnapshot };
|
|
128
|
+
//# sourceMappingURL=rollback.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollback.mjs","names":[],"sources":["../src/rollback.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { BosConfigInput } from \"./types\";\n\n/**\n * Rollback safety gate (atomic-deploys 11): before republishing a historical\n * snapshot, every pinned slot's version manifest must still serve and match\n * its SRI — Phase A made bytes additive and retention is keep-everything, so\n * a verify failure means the pointer is broken, never publishable. Snapshots\n * from before the pin existed cannot be verified this way; they are allowed\n * only with an explicit force (their bytes were overwritten in place), with\n * the caller expected to warn loudly.\n */\n\nexport interface RollbackSlotCheck {\n slot: string;\n manifest?: string;\n ok: boolean;\n reason?: string;\n}\n\nexport interface RollbackVerification {\n /** false = pre-pin snapshot with no verifiable pins (force required) */\n verifiable: boolean;\n ok: boolean;\n slots: RollbackSlotCheck[];\n}\n\ninterface PinnedSlotRef {\n production?: unknown;\n pin?: { manifest?: unknown; integrity?: unknown };\n}\n\nfunction collectPinnedSlots(config: BosConfigInput): Array<{ slot: string; ref: PinnedSlotRef }> {\n const slots: Array<{ slot: string; ref: PinnedSlotRef }> = [];\n const app = config.app as Record<string, PinnedSlotRef | undefined> | undefined;\n const plugins = config.plugins as Record<string, unknown> | undefined;\n\n const push = (slot: string, ref: unknown): void => {\n if (ref && typeof ref === \"object\") slots.push({ slot, ref: ref as PinnedSlotRef });\n };\n\n if (app) {\n for (const key of [\"host\", \"ui\", \"api\", \"auth\"] as const) push(`app.${key}`, app[key]);\n const auth = app.auth as { ui?: unknown } | undefined;\n if (auth?.ui) push(\"app.auth.ui\", auth.ui);\n }\n if (plugins) {\n for (const [key, plugin] of Object.entries(plugins)) {\n if (typeof plugin !== \"object\" || plugin === null) continue;\n push(key, plugin);\n const ui = (plugin as { ui?: unknown }).ui;\n if (ui) push(`${key}.ui`, ui);\n }\n }\n return slots;\n}\n\nfunction pinOf(ref: PinnedSlotRef): { manifest: string; integrity: string } | null {\n const manifest = typeof ref.pin?.manifest === \"string\" ? ref.pin.manifest : undefined;\n const integrity = typeof ref.pin?.integrity === \"string\" ? ref.pin.integrity : undefined;\n return manifest && integrity ? { manifest, integrity } : null;\n}\n\nexport interface SlotPinRef {\n slot: string;\n /** the slot's production base URL (…/bundles/<account>/<gateway>/<workspace>/) */\n base: string;\n pin: { manifest: string; integrity: string };\n}\n\n/** Every pinned slot with both a production base and a verifiable pin. */\nexport function collectSlotPinRefs(config: BosConfigInput): SlotPinRef[] {\n return collectPinnedSlots(config)\n .map(({ slot, ref }) => {\n const pin = pinOf(ref);\n const base = typeof ref.production === \"string\" ? ref.production : undefined;\n return pin && base ? { slot, base, pin } : null;\n })\n .filter((entry): entry is SlotPinRef => entry !== null);\n}\n\nasync function verifySlot(\n slot: string,\n ref: PinnedSlotRef,\n fetchImpl: typeof fetch,\n): Promise<RollbackSlotCheck> {\n const base = typeof ref.production === \"string\" ? ref.production : undefined;\n const pin = pinOf(ref);\n if (!pin) return { slot, ok: true };\n const { manifest, integrity } = pin;\n\n if (!base)\n return { slot, manifest, ok: false, reason: \"no production URL to fetch the manifest from\" };\n\n const manifestUrl = `${base.replace(/\\/$/, \"\")}/${manifest.replace(/^\\//, \"\")}`;\n try {\n const response = await fetchImpl(manifestUrl);\n if (!response.ok) {\n return { slot, manifest, ok: false, reason: `manifest fetch failed: ${response.status}` };\n }\n const body = await response.text();\n const computed = `sha384-${createHash(\"sha384\").update(body).digest(\"base64\")}`;\n if (computed !== integrity) {\n return {\n slot,\n manifest,\n ok: false,\n reason: `integrity mismatch for ${manifestUrl} (expected ${integrity}, computed ${computed})`,\n };\n }\n return { slot, manifest, ok: true };\n } catch (error) {\n return {\n slot,\n manifest,\n ok: false,\n reason: `manifest fetch failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\nexport async function verifyRollbackSnapshot(\n config: BosConfigInput,\n opts?: { fetchImpl?: typeof fetch },\n): Promise<RollbackVerification> {\n const fetchImpl = opts?.fetchImpl ?? fetch;\n const pinned = collectPinnedSlots(config).filter((entry) => pinOf(entry.ref) !== null);\n\n if (pinned.length === 0) {\n return { verifiable: false, ok: false, slots: [] };\n }\n\n const slots = await Promise.all(\n pinned.map((entry) => verifySlot(entry.slot, entry.ref, fetchImpl)),\n );\n return { verifiable: true, ok: slots.every((check) => check.ok), slots };\n}\n\nexport function summarizeSlotPins(config: BosConfigInput): string {\n const pinned = collectPinnedSlots(config)\n .map((entry) => {\n const pin = pinOf(entry.ref);\n return pin ? `${entry.slot}=${pin.manifest}` : null;\n })\n .filter(Boolean) as string[];\n return pinned.length > 0 ? pinned.join(\" \") : \"no version pins (pre-pin snapshot)\";\n}\n\nexport function buildRollbackPayload<T extends Record<string, unknown>>(\n targetConfig: T,\n rolledBackFrom: string,\n): T {\n return { ...targetConfig, rolledBackFrom } as T;\n}\n"],"mappings":";;;AAgCA,SAAS,mBAAmB,QAAqE;CAC/F,MAAM,QAAqD,CAAC;CAC5D,MAAM,MAAM,OAAO;CACnB,MAAM,UAAU,OAAO;CAEvB,MAAM,QAAQ,MAAc,QAAuB;EACjD,IAAI,OAAO,OAAO,QAAQ,UAAU,MAAM,KAAK;GAAE;GAAW;EAAqB,CAAC;CACpF;CAEA,IAAI,KAAK;EACP,KAAK,MAAM,OAAO;GAAC;GAAQ;GAAM;GAAO;EAAM,GAAY,KAAK,OAAO,OAAO,IAAI,IAAI;EACrF,MAAM,OAAO,IAAI;EACjB,IAAI,MAAM,IAAI,KAAK,eAAe,KAAK,EAAE;CAC3C;CACA,IAAI,SACF,KAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,OAAO,GAAG;EACnD,IAAI,OAAO,WAAW,YAAY,WAAW,MAAM;EACnD,KAAK,KAAK,MAAM;EAChB,MAAM,KAAM,OAA4B;EACxC,IAAI,IAAI,KAAK,GAAG,IAAI,MAAM,EAAE;CAC9B;CAEF,OAAO;AACT;AAEA,SAAS,MAAM,KAAoE;CACjF,MAAM,WAAW,OAAO,IAAI,KAAK,aAAa,WAAW,IAAI,IAAI,WAAW;CAC5E,MAAM,YAAY,OAAO,IAAI,KAAK,cAAc,WAAW,IAAI,IAAI,YAAY;CAC/E,OAAO,YAAY,YAAY;EAAE;EAAU;CAAU,IAAI;AAC3D;;AAUA,SAAgB,mBAAmB,QAAsC;CACvE,OAAO,mBAAmB,MAAM,CAAC,CAC9B,KAAK,EAAE,MAAM,UAAU;EACtB,MAAM,MAAM,MAAM,GAAG;EACrB,MAAM,OAAO,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;EACnE,OAAO,OAAO,OAAO;GAAE;GAAM;GAAM;EAAI,IAAI;CAC7C,CAAC,CAAC,CACD,QAAQ,UAA+B,UAAU,IAAI;AAC1D;AAEA,eAAe,WACb,MACA,KACA,WAC4B;CAC5B,MAAM,OAAO,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa;CACnE,MAAM,MAAM,MAAM,GAAG;CACrB,IAAI,CAAC,KAAK,OAAO;EAAE;EAAM,IAAI;CAAK;CAClC,MAAM,EAAE,UAAU,cAAc;CAEhC,IAAI,CAAC,MACH,OAAO;EAAE;EAAM;EAAU,IAAI;EAAO,QAAQ;CAA+C;CAE7F,MAAM,cAAc,GAAG,KAAK,QAAQ,OAAO,EAAE,EAAE,GAAG,SAAS,QAAQ,OAAO,EAAE;CAC5E,IAAI;EACF,MAAM,WAAW,MAAM,UAAU,WAAW;EAC5C,IAAI,CAAC,SAAS,IACZ,OAAO;GAAE;GAAM;GAAU,IAAI;GAAO,QAAQ,0BAA0B,SAAS;EAAS;EAE1F,MAAM,OAAO,MAAM,SAAS,KAAK;EACjC,MAAM,WAAW,UAAU,WAAW,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,QAAQ;EAC5E,IAAI,aAAa,WACf,OAAO;GACL;GACA;GACA,IAAI;GACJ,QAAQ,0BAA0B,YAAY,aAAa,UAAU,aAAa,SAAS;EAC7F;EAEF,OAAO;GAAE;GAAM;GAAU,IAAI;EAAK;CACpC,SAAS,OAAO;EACd,OAAO;GACL;GACA;GACA,IAAI;GACJ,QAAQ,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EACzF;CACF;AACF;AAEA,eAAsB,uBACpB,QACA,MAC+B;CAC/B,MAAM,YAAY,MAAM,aAAa;CACrC,MAAM,SAAS,mBAAmB,MAAM,CAAC,CAAC,QAAQ,UAAU,MAAM,MAAM,GAAG,MAAM,IAAI;CAErF,IAAI,OAAO,WAAW,GACpB,OAAO;EAAE,YAAY;EAAO,IAAI;EAAO,OAAO,CAAC;CAAE;CAGnD,MAAM,QAAQ,MAAM,QAAQ,IAC1B,OAAO,KAAK,UAAU,WAAW,MAAM,MAAM,MAAM,KAAK,SAAS,CAAC,CACpE;CACA,OAAO;EAAE,YAAY;EAAM,IAAI,MAAM,OAAO,UAAU,MAAM,EAAE;EAAG;CAAM;AACzE;AAEA,SAAgB,kBAAkB,QAAgC;CAChE,MAAM,SAAS,mBAAmB,MAAM,CAAC,CACtC,KAAK,UAAU;EACd,MAAM,MAAM,MAAM,MAAM,GAAG;EAC3B,OAAO,MAAM,GAAG,MAAM,KAAK,GAAG,IAAI,aAAa;CACjD,CAAC,CAAC,CACD,OAAO,OAAO;CACjB,OAAO,OAAO,SAAS,IAAI,OAAO,KAAK,GAAG,IAAI;AAChD;AAEA,SAAgB,qBACd,cACA,gBACG;CACH,OAAO;EAAE,GAAG;EAAc;CAAe;AAC3C"}
|
package/dist/sdk.cjs
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
let effect = require("effect");
|
|
2
3
|
let zod = require("zod");
|
|
4
|
+
let _orpc_contract = require("@orpc/contract");
|
|
3
5
|
let every_plugin = require("every-plugin");
|
|
4
|
-
let every_plugin_effect = require("every-plugin/effect");
|
|
5
|
-
let every_plugin_orpc = require("every-plugin/orpc");
|
|
6
6
|
|
|
7
7
|
Object.defineProperty(exports, 'Context', {
|
|
8
8
|
enumerable: true,
|
|
9
9
|
get: function () {
|
|
10
|
-
return
|
|
10
|
+
return effect.Context;
|
|
11
11
|
}
|
|
12
12
|
});
|
|
13
13
|
Object.defineProperty(exports, 'Effect', {
|
|
14
14
|
enumerable: true,
|
|
15
15
|
get: function () {
|
|
16
|
-
return
|
|
16
|
+
return effect.Effect;
|
|
17
17
|
}
|
|
18
18
|
});
|
|
19
19
|
Object.defineProperty(exports, 'Layer', {
|
|
20
20
|
enumerable: true,
|
|
21
21
|
get: function () {
|
|
22
|
-
return
|
|
22
|
+
return effect.Layer;
|
|
23
23
|
}
|
|
24
24
|
});
|
|
25
25
|
Object.defineProperty(exports, 'PluginRuntime', {
|
|
@@ -31,7 +31,7 @@ Object.defineProperty(exports, 'PluginRuntime', {
|
|
|
31
31
|
Object.defineProperty(exports, 'Scope', {
|
|
32
32
|
enumerable: true,
|
|
33
33
|
get: function () {
|
|
34
|
-
return
|
|
34
|
+
return effect.Scope;
|
|
35
35
|
}
|
|
36
36
|
});
|
|
37
37
|
Object.defineProperty(exports, 'createPlugin', {
|
|
@@ -49,7 +49,7 @@ Object.defineProperty(exports, 'createPluginRuntime', {
|
|
|
49
49
|
Object.defineProperty(exports, 'oc', {
|
|
50
50
|
enumerable: true,
|
|
51
51
|
get: function () {
|
|
52
|
-
return
|
|
52
|
+
return _orpc_contract.oc;
|
|
53
53
|
}
|
|
54
54
|
});
|
|
55
55
|
Object.defineProperty(exports, 'z', {
|
package/dist/sdk.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { Context, Effect, Layer, Scope } from "effect";
|
|
3
|
+
import { AnySchema, RouterContract, oc } from "@orpc/contract";
|
|
2
4
|
import { LoadedPluginWithBinding, Plugin, PluginRuntime, createPlugin, createPluginRuntime } from "every-plugin";
|
|
3
|
-
|
|
4
|
-
import { AnyContractRouter, AnySchema, oc } from "every-plugin/orpc";
|
|
5
|
-
export { type AnyContractRouter, type AnySchema, Context, Effect, Layer, type LoadedPluginWithBinding, type Plugin, PluginRuntime, Scope, createPlugin, createPluginRuntime, oc, z };
|
|
5
|
+
export { type AnySchema, Context, Effect, Layer, type LoadedPluginWithBinding, type Plugin, PluginRuntime, type RouterContract, Scope, createPlugin, createPluginRuntime, oc, z };
|
package/dist/sdk.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { Context, Effect, Layer, Scope } from "effect";
|
|
1
2
|
import { z } from "zod";
|
|
3
|
+
import { AnySchema, RouterContract, oc } from "@orpc/contract";
|
|
2
4
|
import { LoadedPluginWithBinding, Plugin, PluginRuntime, createPlugin, createPluginRuntime } from "every-plugin";
|
|
3
|
-
|
|
4
|
-
import { AnyContractRouter, AnySchema, oc } from "every-plugin/orpc";
|
|
5
|
-
export { type AnyContractRouter, type AnySchema, Context, Effect, Layer, type LoadedPluginWithBinding, type Plugin, PluginRuntime, Scope, createPlugin, createPluginRuntime, oc, z };
|
|
5
|
+
export { type AnySchema, Context, Effect, Layer, type LoadedPluginWithBinding, type Plugin, PluginRuntime, type RouterContract, Scope, createPlugin, createPluginRuntime, oc, z };
|
package/dist/sdk.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { Context, Effect, Layer, Scope } from "effect";
|
|
1
2
|
import { z } from "zod";
|
|
3
|
+
import { oc } from "@orpc/contract";
|
|
2
4
|
import { PluginRuntime, createPlugin, createPluginRuntime } from "every-plugin";
|
|
3
|
-
import { Context, Effect, Layer, Scope } from "every-plugin/effect";
|
|
4
|
-
import { oc } from "every-plugin/orpc";
|
|
5
5
|
|
|
6
6
|
export { Context, Effect, Layer, PluginRuntime, Scope, createPlugin, createPluginRuntime, oc, z };
|
|
@@ -1,30 +1,57 @@
|
|
|
1
|
+
const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
let node_fs = require("node:fs");
|
|
3
|
+
let node_path = require("node:path");
|
|
4
|
+
node_path = require_runtime.__toESM(node_path, 1);
|
|
1
5
|
let effect = require("effect");
|
|
2
6
|
|
|
3
7
|
//#region src/service-descriptor.ts
|
|
4
|
-
|
|
5
|
-
|
|
8
|
+
/**
|
|
9
|
+
* True when a `plugins.<id>` entry is the runtime-config mirror of the
|
|
10
|
+
* app-slot auth plugin (same backend target) — the `auth` service already
|
|
11
|
+
* spawns that backend, so the mirror contributes only its `ui` surface.
|
|
12
|
+
* The single implementation; consumed by the service descriptors, the DAG,
|
|
13
|
+
* the infra planner, and the dev session.
|
|
14
|
+
*/
|
|
15
|
+
function isAuthMirrorPluginEntry(authEntry, pluginId, pluginConfig) {
|
|
16
|
+
if (pluginId !== "auth" || !authEntry) return false;
|
|
17
|
+
if (pluginConfig === authEntry) return true;
|
|
18
|
+
if (pluginConfig.localPath && pluginConfig.localPath === authEntry.localPath) return true;
|
|
19
|
+
if (!pluginConfig.localPath && pluginConfig.source === "remote" && pluginConfig.url && pluginConfig.url === authEntry.url) return true;
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
var ServiceDescriptorMap = class extends effect.Context.Service()("ServiceDescriptorMap") {};
|
|
23
|
+
var DevRuntimeConfig = class extends effect.Context.Service()("DevRuntimeConfig") {};
|
|
24
|
+
var DevGeneratedEnv = class extends effect.Context.Service()("DevGeneratedEnv") {};
|
|
25
|
+
const DevGeneratedEnvLive = (env) => effect.Layer.succeed(DevGeneratedEnv, env);
|
|
6
26
|
const PLUGIN_READY_PATTERNS = [
|
|
7
27
|
/ready in/i,
|
|
8
28
|
/compiled.*successfully/i,
|
|
9
29
|
/listening/i,
|
|
10
30
|
/started/i
|
|
11
31
|
];
|
|
12
|
-
const PLUGIN_ERROR_PATTERNS = [
|
|
32
|
+
const PLUGIN_ERROR_PATTERNS = [
|
|
33
|
+
/\bERROR in\b/,
|
|
34
|
+
/failed to compile/i,
|
|
35
|
+
/Module not found/i,
|
|
36
|
+
/Cannot find module/i
|
|
37
|
+
];
|
|
13
38
|
const SERVICE_CONFIGS = {
|
|
14
39
|
host: {
|
|
15
|
-
command: "
|
|
40
|
+
command: "pnpm",
|
|
16
41
|
args: ["run", "dev"],
|
|
42
|
+
env: { NODE_OPTIONS: "--conditions=development" },
|
|
17
43
|
readyPatterns: [/Host (dev|production) server running at/i, /Server running at/i],
|
|
18
44
|
errorPatterns: [
|
|
19
|
-
/
|
|
20
|
-
/
|
|
45
|
+
/\berror\b(?!s)/i,
|
|
46
|
+
/\bfailed to\b/i,
|
|
47
|
+
/\bbuild failed\b/i,
|
|
21
48
|
/exception/i
|
|
22
49
|
],
|
|
23
50
|
defaultPort: 3e3,
|
|
24
51
|
readinessPath: "/health"
|
|
25
52
|
},
|
|
26
53
|
auth: {
|
|
27
|
-
command: "
|
|
54
|
+
command: "pnpm",
|
|
28
55
|
args: ["run", "dev"],
|
|
29
56
|
readyPatterns: PLUGIN_READY_PATTERNS,
|
|
30
57
|
errorPatterns: PLUGIN_ERROR_PATTERNS,
|
|
@@ -32,27 +59,23 @@ const SERVICE_CONFIGS = {
|
|
|
32
59
|
readinessPath: "/remoteEntry.js"
|
|
33
60
|
},
|
|
34
61
|
ui: {
|
|
35
|
-
command: "
|
|
62
|
+
command: "pnpm",
|
|
36
63
|
args: ["run", "dev"],
|
|
37
64
|
readyPatterns: [
|
|
38
65
|
/\bready\s+built in\b/i,
|
|
39
66
|
/\bLocal:\b/i,
|
|
40
67
|
/\bcompiled\b.*successfully/i
|
|
41
68
|
],
|
|
42
|
-
errorPatterns: [
|
|
69
|
+
errorPatterns: [
|
|
70
|
+
/\berror\b(?!s)/i,
|
|
71
|
+
/\bfailed to\b/i,
|
|
72
|
+
/\bbuild failed\b/i
|
|
73
|
+
],
|
|
43
74
|
defaultPort: 3003,
|
|
44
75
|
readinessPath: "/remoteEntry.js"
|
|
45
76
|
},
|
|
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
77
|
api: {
|
|
55
|
-
command: "
|
|
78
|
+
command: "pnpm",
|
|
56
79
|
args: ["run", "dev"],
|
|
57
80
|
readyPatterns: PLUGIN_READY_PATTERNS,
|
|
58
81
|
errorPatterns: PLUGIN_ERROR_PATTERNS,
|
|
@@ -89,17 +112,9 @@ function buildServiceDescriptorMap(runtimeConfig, options) {
|
|
|
89
112
|
port: runtimeConfig.ui.port,
|
|
90
113
|
integrity: runtimeConfig.ui.integrity,
|
|
91
114
|
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"]
|
|
115
|
+
...SERVICE_CONFIGS.ui,
|
|
116
|
+
env: { BOS_DEV_SERVER: "1" },
|
|
117
|
+
args: process.env.BOS_NO_WATCH === "1" ? ["run", "dev:built"] : SERVICE_CONFIGS.ui.args
|
|
103
118
|
});
|
|
104
119
|
map.set("api", {
|
|
105
120
|
key: "api",
|
|
@@ -134,10 +149,15 @@ function buildServiceDescriptorMap(runtimeConfig, options) {
|
|
|
134
149
|
if (runtimeConfig.plugins) {
|
|
135
150
|
let pluginBasePort = 3010;
|
|
136
151
|
for (const [pluginId, pluginConfig] of Object.entries(runtimeConfig.plugins)) {
|
|
152
|
+
const isAuthMirror = isAuthMirrorPluginEntry(runtimeConfig.auth, pluginId, pluginConfig);
|
|
137
153
|
const pluginKey = `plugin:${pluginId}`;
|
|
138
154
|
const resolvedPort = pluginConfig.port ?? pluginBasePort;
|
|
139
155
|
pluginBasePort = resolvedPort + 1;
|
|
140
|
-
|
|
156
|
+
const uiLocalPath = pluginConfig.ui?.localPath;
|
|
157
|
+
const isFolderFormUi = Boolean(uiLocalPath && pluginConfig.ui?.source === "local" && (0, node_fs.existsSync)(node_path.default.join(uiLocalPath, "src", "routes")) && !(0, node_fs.existsSync)(node_path.default.join(uiLocalPath, "package.json")));
|
|
158
|
+
const folderUiPort = pluginConfig.ui?.port ?? pluginBasePort;
|
|
159
|
+
if (isFolderFormUi) pluginBasePort = folderUiPort + 1;
|
|
160
|
+
if (!isAuthMirror) map.set(pluginKey, {
|
|
141
161
|
key: pluginKey,
|
|
142
162
|
source: pluginConfig.source,
|
|
143
163
|
url: pluginConfig.url,
|
|
@@ -150,14 +170,24 @@ function buildServiceDescriptorMap(runtimeConfig, options) {
|
|
|
150
170
|
proxy: pluginConfig.proxy,
|
|
151
171
|
variables: pluginConfig.variables,
|
|
152
172
|
secrets: pluginConfig.secrets,
|
|
153
|
-
command: "
|
|
173
|
+
command: "pnpm",
|
|
154
174
|
args: ["run", "dev"],
|
|
175
|
+
env: isFolderFormUi ? { BOS_UI_PORT: String(folderUiPort) } : void 0,
|
|
176
|
+
uiPort: isFolderFormUi ? folderUiPort : void 0,
|
|
155
177
|
readyPatterns: PLUGIN_READY_PATTERNS,
|
|
156
178
|
errorPatterns: PLUGIN_ERROR_PATTERNS,
|
|
157
179
|
defaultPort: resolvedPort,
|
|
158
180
|
readinessPath: "/remoteEntry.js"
|
|
159
181
|
});
|
|
160
|
-
if (
|
|
182
|
+
else if (isFolderFormUi) {
|
|
183
|
+
const authDescriptor = map.get("auth");
|
|
184
|
+
if (authDescriptor) map.set("auth", {
|
|
185
|
+
...authDescriptor,
|
|
186
|
+
env: { BOS_UI_PORT: String(folderUiPort) },
|
|
187
|
+
uiPort: folderUiPort
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
if (pluginConfig.ui?.localPath && pluginConfig.ui.source === "local" && !isFolderFormUi) {
|
|
161
191
|
const uiKey = `plugin-ui:${pluginId}`;
|
|
162
192
|
const uiPort = pluginConfig.ui.port ?? pluginBasePort;
|
|
163
193
|
pluginBasePort = uiPort + 1;
|
|
@@ -170,7 +200,7 @@ function buildServiceDescriptorMap(runtimeConfig, options) {
|
|
|
170
200
|
localPath: pluginConfig.ui.localPath,
|
|
171
201
|
port: uiPort,
|
|
172
202
|
integrity: pluginConfig.ui.integrity,
|
|
173
|
-
command: "
|
|
203
|
+
command: "pnpm",
|
|
174
204
|
args: ["run", "dev"],
|
|
175
205
|
readyPatterns: PLUGIN_READY_PATTERNS,
|
|
176
206
|
errorPatterns: PLUGIN_ERROR_PATTERNS,
|
|
@@ -188,7 +218,7 @@ function buildServiceDescriptorMapFromPlan(plan, options) {
|
|
|
188
218
|
return buildServiceDescriptorMap(plan.runtimeConfig, options);
|
|
189
219
|
}
|
|
190
220
|
function buildDescription(map) {
|
|
191
|
-
const descriptors = [...map.values()].filter((d) =>
|
|
221
|
+
const descriptors = [...map.values()].filter((d) => !d.key.startsWith("plugin:"));
|
|
192
222
|
const allLocal = descriptors.every((d) => d.source === "local");
|
|
193
223
|
const hasProxy = [...map.values()].some((d) => d.proxy && d.source === "local");
|
|
194
224
|
if (allLocal && !hasProxy) return "Full Local Development";
|
|
@@ -202,6 +232,8 @@ function buildDescription(map) {
|
|
|
202
232
|
}
|
|
203
233
|
|
|
204
234
|
//#endregion
|
|
235
|
+
exports.DevGeneratedEnv = DevGeneratedEnv;
|
|
236
|
+
exports.DevGeneratedEnvLive = DevGeneratedEnvLive;
|
|
205
237
|
exports.DevRuntimeConfig = DevRuntimeConfig;
|
|
206
238
|
exports.DevRuntimeConfigLive = DevRuntimeConfigLive;
|
|
207
239
|
exports.ServiceDescriptorMap = ServiceDescriptorMap;
|
|
@@ -209,4 +241,5 @@ exports.ServiceDescriptorMapLive = ServiceDescriptorMapLive;
|
|
|
209
241
|
exports.buildDescription = buildDescription;
|
|
210
242
|
exports.buildServiceDescriptorMap = buildServiceDescriptorMap;
|
|
211
243
|
exports.buildServiceDescriptorMapFromPlan = buildServiceDescriptorMapFromPlan;
|
|
244
|
+
exports.isAuthMirrorPluginEntry = isAuthMirrorPluginEntry;
|
|
212
245
|
//# sourceMappingURL=service-descriptor.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-descriptor.cjs","names":["Context","Layer"],"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.cjs","names":["Context","Layer","existsSync","path"],"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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"}
|