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,165 @@
|
|
|
1
|
+
import { pluginMigrationSlug } from "./core.mjs";
|
|
2
|
+
import { mkdirSync } from "node:fs";
|
|
3
|
+
import { dirname } from "node:path";
|
|
4
|
+
|
|
5
|
+
//#region src/db/driver.ts
|
|
6
|
+
/**
|
|
7
|
+
* Resolve a plugin id to its data-schema name on a shared database.
|
|
8
|
+
*
|
|
9
|
+
* Schema names are unconditional `plugin_<slug>` for every workspace on the
|
|
10
|
+
* shared API database. The `pluginId === "api" ? undefined` special case found
|
|
11
|
+
* in older plugin copies is dead code (a plugin is never `api`); api's own
|
|
12
|
+
* tables already live in `plugin_api`.
|
|
13
|
+
*/
|
|
14
|
+
function pluginSchemaName(pluginId) {
|
|
15
|
+
return `plugin_${pluginMigrationSlug(pluginId)}`;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Connection-level guardrails. `ALTER DATABASE ... SET` only reaches sessions
|
|
19
|
+
* opened after it runs — pooled connections that already exist never inherit
|
|
20
|
+
* it, so any bound must ride on every connection's startup options. Defaults:
|
|
21
|
+
* a lock wait fails after 10s (unbounded waits wedge the whole pool silently),
|
|
22
|
+
* a session idle inside a transaction is reaped after 30s, and statement
|
|
23
|
+
* timeout stays off unless DB_STATEMENT_TIMEOUT_MS is set (long migrations and
|
|
24
|
+
* analytical queries must not break).
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Parses a millisecond env value for a Postgres `-c` timeout setting.
|
|
28
|
+
* A explicit `0` disables the timeout (Postgres semantics); garbage throws —
|
|
29
|
+
* a typo must fail the boot loudly, never silently become the default.
|
|
30
|
+
*/
|
|
31
|
+
function timeoutMsEnv(name, fallbackMs) {
|
|
32
|
+
const raw = process.env[name];
|
|
33
|
+
if (raw === void 0 || raw.trim() === "") return fallbackMs;
|
|
34
|
+
const parsed = Number(raw);
|
|
35
|
+
if (!Number.isFinite(parsed) || parsed < 0) throw new Error(`[db] Invalid ${name}="${raw}" — must be a non-negative number of milliseconds (0 disables the timeout).`);
|
|
36
|
+
return parsed;
|
|
37
|
+
}
|
|
38
|
+
function connectionOptions(namespace) {
|
|
39
|
+
return [
|
|
40
|
+
...namespace ? [`-c search_path="${namespace}",public`] : [],
|
|
41
|
+
`-c lock_timeout=${timeoutMsEnv("DB_LOCK_TIMEOUT_MS", 1e4)}`,
|
|
42
|
+
`-c idle_in_transaction_session_timeout=${timeoutMsEnv("DB_IDLE_TX_TIMEOUT_MS", 3e4)}`,
|
|
43
|
+
...process.env.DB_STATEMENT_TIMEOUT_MS ? [`-c statement_timeout=${timeoutMsEnv("DB_STATEMENT_TIMEOUT_MS", 0)}`] : []
|
|
44
|
+
].join(" ");
|
|
45
|
+
}
|
|
46
|
+
const isLocalDbUrl = (url) => url.includes("localhost") || url.includes("127.0.0.1") || url.includes("host.docker.internal") || url.includes(".railway.internal");
|
|
47
|
+
/**
|
|
48
|
+
* TLS behavior for a non-local Postgres URL, following libpq `sslmode`
|
|
49
|
+
* semantics from the connection string itself:
|
|
50
|
+
*
|
|
51
|
+
* - `disable` → no TLS
|
|
52
|
+
* - `prefer`/`allow`/`require` → TLS, but the server's certificate is NOT
|
|
53
|
+
* verified (libpq: `require` encrypts, it does not trust). Managed
|
|
54
|
+
* providers (Railway, Neon, Supabase poolers…) hand out `sslmode=require`
|
|
55
|
+
* URLs backed by certificates no client CA bundle can verify.
|
|
56
|
+
* - `verify-ca`/`verify-full` → TLS + certificate verification.
|
|
57
|
+
* - absent → verification ON (secure default for bare URLs).
|
|
58
|
+
*
|
|
59
|
+
* `DB_SSL_REJECT_UNAUTHORIZED` stays as an explicit operator override: it
|
|
60
|
+
* wins over whatever the URL says (`"false"` disables verification, `"true"`
|
|
61
|
+
* forces it).
|
|
62
|
+
*/
|
|
63
|
+
function resolvePoolSsl(url) {
|
|
64
|
+
if (isLocalDbUrl(url)) return false;
|
|
65
|
+
let mode = null;
|
|
66
|
+
try {
|
|
67
|
+
mode = new URL(url).searchParams.get("sslmode");
|
|
68
|
+
} catch {
|
|
69
|
+
mode = null;
|
|
70
|
+
}
|
|
71
|
+
if (process.env.DB_SSL_REJECT_UNAUTHORIZED === "false") return { rejectUnauthorized: false };
|
|
72
|
+
if (process.env.DB_SSL_REJECT_UNAUTHORIZED === "true") return { rejectUnauthorized: true };
|
|
73
|
+
switch (mode) {
|
|
74
|
+
case "disable": return false;
|
|
75
|
+
case "verify-ca":
|
|
76
|
+
case "verify-full": return { rejectUnauthorized: true };
|
|
77
|
+
case "prefer":
|
|
78
|
+
case "allow":
|
|
79
|
+
case "require": return { rejectUnauthorized: false };
|
|
80
|
+
default: return { rejectUnauthorized: true };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function buildPoolConfig(url, namespace) {
|
|
84
|
+
return {
|
|
85
|
+
connectionString: url,
|
|
86
|
+
ssl: resolvePoolSsl(url),
|
|
87
|
+
max: Number(process.env.DB_POOL_MAX) || 10,
|
|
88
|
+
connectionTimeoutMillis: Number(process.env.DB_CONNECTION_TIMEOUT_MS) || 3e4,
|
|
89
|
+
idleTimeoutMillis: Number(process.env.DB_IDLE_TIMEOUT_MS) || 3e4,
|
|
90
|
+
options: connectionOptions(namespace)
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
async function ensureNamespaceExists(pool, namespace) {
|
|
94
|
+
const client = await pool.connect();
|
|
95
|
+
try {
|
|
96
|
+
await client.query("BEGIN");
|
|
97
|
+
try {
|
|
98
|
+
await client.query("SELECT pg_advisory_xact_lock(hashtextextended($1, 0))", ["drizzle.__drizzle_migrations"]);
|
|
99
|
+
await client.query(`CREATE SCHEMA IF NOT EXISTS "${namespace}"`);
|
|
100
|
+
await client.query("COMMIT");
|
|
101
|
+
} catch (error) {
|
|
102
|
+
await client.query("ROLLBACK");
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
} finally {
|
|
106
|
+
client.release();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function createCloseHandler(pool) {
|
|
110
|
+
let closed = false;
|
|
111
|
+
return async () => {
|
|
112
|
+
if (closed) return;
|
|
113
|
+
closed = true;
|
|
114
|
+
pool.removeAllListeners("error");
|
|
115
|
+
pool.removeAllListeners("connect");
|
|
116
|
+
await pool.end();
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Create a drizzle database driver for a plugin, choosing the engine by URL
|
|
121
|
+
* scheme: `pglite:` / `:memory:` → embedded PGlite, anything else → postgres
|
|
122
|
+
* (`pg.Pool`).
|
|
123
|
+
*
|
|
124
|
+
* Drivers stay externalized (never statically imported, never in the Module
|
|
125
|
+
* Federation singleton share set) — they are loaded here via dynamic `import()`
|
|
126
|
+
* only, and `drizzle-orm` appears as a runtime import for the `drizzle` entry
|
|
127
|
+
* points. The `namespace` option expresses every topology the platform needs:
|
|
128
|
+
* `plugin_<slug>` on a shared database, undefined for public-schema (api) or
|
|
129
|
+
* dedicated-database (auth) workloads.
|
|
130
|
+
*/
|
|
131
|
+
async function createDatabaseDriver(url, schema, namespace) {
|
|
132
|
+
if (url.startsWith("pglite:") || url === ":memory:") {
|
|
133
|
+
const { drizzle } = await import("drizzle-orm/pglite");
|
|
134
|
+
const { PGlite } = await import("@electric-sql/pglite");
|
|
135
|
+
const rawDir = url === ":memory:" ? ":memory:" : url.replace("pglite:", "");
|
|
136
|
+
const dataDir = rawDir.endsWith("/:memory:") || rawDir === ":memory:" ? "memory://" : rawDir;
|
|
137
|
+
if (dataDir !== "memory://") mkdirSync(dirname(dataDir), { recursive: true });
|
|
138
|
+
const pglite = new PGlite(dataDir);
|
|
139
|
+
if (namespace) {
|
|
140
|
+
await pglite.exec(`CREATE SCHEMA IF NOT EXISTS "${namespace}"`);
|
|
141
|
+
await pglite.exec(`SET search_path TO "${namespace}", public`);
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
db: drizzle(pglite, { schema }),
|
|
145
|
+
close: async () => {
|
|
146
|
+
await pglite.close();
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
const { Pool } = await import("pg");
|
|
151
|
+
const { drizzle } = await import("drizzle-orm/node-postgres");
|
|
152
|
+
const pool = new Pool(buildPoolConfig(url, namespace));
|
|
153
|
+
pool.on("error", (err) => {
|
|
154
|
+
console.error("[Database] Unexpected pool error:", err.message);
|
|
155
|
+
});
|
|
156
|
+
if (namespace) await ensureNamespaceExists(pool, namespace);
|
|
157
|
+
return {
|
|
158
|
+
db: drizzle(pool, { schema }),
|
|
159
|
+
close: createCloseHandler(pool)
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
//#endregion
|
|
164
|
+
export { createDatabaseDriver, pluginSchemaName, resolvePoolSsl };
|
|
165
|
+
//# sourceMappingURL=driver.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.mjs","names":[],"sources":["../../src/db/driver.ts"],"sourcesContent":["import { mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { PgDatabase, PgQueryResultHKT } from \"drizzle-orm/pg-core\";\nimport { pluginMigrationSlug } from \"./core\";\n\nexport interface DatabaseDriver<TSchema extends Record<string, unknown>> {\n readonly db: PgDatabase<PgQueryResultHKT, TSchema>;\n close(): Promise<void>;\n}\n\n/**\n * Resolve a plugin id to its data-schema name on a shared database.\n *\n * Schema names are unconditional `plugin_<slug>` for every workspace on the\n * shared API database. The `pluginId === \"api\" ? undefined` special case found\n * in older plugin copies is dead code (a plugin is never `api`); api's own\n * tables already live in `plugin_api`.\n */\nexport function pluginSchemaName(pluginId: string): string {\n return `plugin_${pluginMigrationSlug(pluginId)}`;\n}\n\ninterface PoolLike {\n on(event: \"error\", listener: (err: Error) => void): unknown;\n connect(): Promise<{\n query: (sql: string, params?: unknown[]) => Promise<unknown>;\n release: () => void;\n }>;\n removeAllListeners(event?: string | symbol): unknown;\n end(): Promise<void>;\n}\n\n/**\n * Connection-level guardrails. `ALTER DATABASE ... SET` only reaches sessions\n * opened after it runs — pooled connections that already exist never inherit\n * it, so any bound must ride on every connection's startup options. Defaults:\n * a lock wait fails after 10s (unbounded waits wedge the whole pool silently),\n * a session idle inside a transaction is reaped after 30s, and statement\n * timeout stays off unless DB_STATEMENT_TIMEOUT_MS is set (long migrations and\n * analytical queries must not break).\n */\n/**\n * Parses a millisecond env value for a Postgres `-c` timeout setting.\n * A explicit `0` disables the timeout (Postgres semantics); garbage throws —\n * a typo must fail the boot loudly, never silently become the default.\n */\nfunction timeoutMsEnv(name: string, fallbackMs: number): number {\n const raw = process.env[name];\n if (raw === undefined || raw.trim() === \"\") return fallbackMs;\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed < 0) {\n throw new Error(\n `[db] Invalid ${name}=\"${raw}\" — must be a non-negative number of milliseconds (0 disables the timeout).`,\n );\n }\n return parsed;\n}\n\nfunction connectionOptions(namespace: string | undefined): string {\n const settings = [\n ...(namespace ? [`-c search_path=\"${namespace}\",public`] : []),\n `-c lock_timeout=${timeoutMsEnv(\"DB_LOCK_TIMEOUT_MS\", 10_000)}`,\n `-c idle_in_transaction_session_timeout=${timeoutMsEnv(\"DB_IDLE_TX_TIMEOUT_MS\", 30_000)}`,\n ...(process.env.DB_STATEMENT_TIMEOUT_MS\n ? [`-c statement_timeout=${timeoutMsEnv(\"DB_STATEMENT_TIMEOUT_MS\", 0)}`]\n : []),\n ];\n return settings.join(\" \");\n}\n\n// host.docker.internal is docker-local development networking — the test\n// databases a container reaches through the host gateway, which do not\n// terminate TLS. `*.railway.internal` is Railway private-network traffic\n// (VPC-scoped, no public egress) whose Postgres presents a self-signed\n// certificate chain no client CA bundle can verify.\nconst isLocalDbUrl = (url: string): boolean =>\n url.includes(\"localhost\") ||\n url.includes(\"127.0.0.1\") ||\n url.includes(\"host.docker.internal\") ||\n url.includes(\".railway.internal\");\n\n/**\n * TLS behavior for a non-local Postgres URL, following libpq `sslmode`\n * semantics from the connection string itself:\n *\n * - `disable` → no TLS\n * - `prefer`/`allow`/`require` → TLS, but the server's certificate is NOT\n * verified (libpq: `require` encrypts, it does not trust). Managed\n * providers (Railway, Neon, Supabase poolers…) hand out `sslmode=require`\n * URLs backed by certificates no client CA bundle can verify.\n * - `verify-ca`/`verify-full` → TLS + certificate verification.\n * - absent → verification ON (secure default for bare URLs).\n *\n * `DB_SSL_REJECT_UNAUTHORIZED` stays as an explicit operator override: it\n * wins over whatever the URL says (`\"false\"` disables verification, `\"true\"`\n * forces it).\n */\nexport function resolvePoolSsl(url: string): false | { rejectUnauthorized: boolean } {\n if (isLocalDbUrl(url)) return false;\n\n let mode: string | null = null;\n try {\n mode = new URL(url).searchParams.get(\"sslmode\");\n } catch {\n mode = null;\n }\n\n if (process.env.DB_SSL_REJECT_UNAUTHORIZED === \"false\") return { rejectUnauthorized: false };\n if (process.env.DB_SSL_REJECT_UNAUTHORIZED === \"true\") return { rejectUnauthorized: true };\n\n switch (mode) {\n case \"disable\":\n return false;\n case \"verify-ca\":\n case \"verify-full\":\n return { rejectUnauthorized: true };\n case \"prefer\":\n case \"allow\":\n case \"require\":\n return { rejectUnauthorized: false };\n default:\n return { rejectUnauthorized: true };\n }\n}\n\nfunction buildPoolConfig(url: string, namespace: string | undefined) {\n return {\n connectionString: url,\n ssl: resolvePoolSsl(url),\n max: Number(process.env.DB_POOL_MAX) || 10,\n connectionTimeoutMillis: Number(process.env.DB_CONNECTION_TIMEOUT_MS) || 30_000,\n idleTimeoutMillis: Number(process.env.DB_IDLE_TIMEOUT_MS) || 30_000,\n options: connectionOptions(namespace),\n };\n}\n\nasync function ensureNamespaceExists(pool: PoolLike, namespace: string): Promise<void> {\n const client = await pool.connect();\n try {\n await client.query(\"BEGIN\");\n try {\n // Same journal-scoped advisory lock the migration runner holds, so this\n // CREATE SCHEMA cannot race a concurrent migration run (the runner also\n // creates the schema inside its locked transaction). Xact-scoped: the\n // lock releases at COMMIT/ROLLBACK or on connection death.\n await client.query(\"SELECT pg_advisory_xact_lock(hashtextextended($1, 0))\", [\n \"drizzle.__drizzle_migrations\",\n ]);\n await client.query(`CREATE SCHEMA IF NOT EXISTS \"${namespace}\"`);\n await client.query(\"COMMIT\");\n } catch (error) {\n await client.query(\"ROLLBACK\");\n throw error;\n }\n } finally {\n client.release();\n }\n}\n\nfunction createCloseHandler(pool: PoolLike): () => Promise<void> {\n let closed = false;\n return async () => {\n if (closed) return;\n closed = true;\n pool.removeAllListeners(\"error\");\n pool.removeAllListeners(\"connect\");\n await pool.end();\n };\n}\n\n/**\n * Create a drizzle database driver for a plugin, choosing the engine by URL\n * scheme: `pglite:` / `:memory:` → embedded PGlite, anything else → postgres\n * (`pg.Pool`).\n *\n * Drivers stay externalized (never statically imported, never in the Module\n * Federation singleton share set) — they are loaded here via dynamic `import()`\n * only, and `drizzle-orm` appears as a runtime import for the `drizzle` entry\n * points. The `namespace` option expresses every topology the platform needs:\n * `plugin_<slug>` on a shared database, undefined for public-schema (api) or\n * dedicated-database (auth) workloads.\n */\nexport async function createDatabaseDriver<TSchema extends Record<string, unknown>>(\n url: string,\n schema: TSchema,\n namespace?: string,\n): Promise<DatabaseDriver<TSchema>> {\n if (url.startsWith(\"pglite:\") || url === \":memory:\") {\n const { drizzle } = await import(\"drizzle-orm/pglite\");\n const { PGlite } = await import(\"@electric-sql/pglite\");\n const rawDir = url === \":memory:\" ? \":memory:\" : url.replace(\"pglite:\", \"\");\n const dataDir = rawDir.endsWith(\"/:memory:\") || rawDir === \":memory:\" ? \"memory://\" : rawDir;\n if (dataDir !== \"memory://\") {\n mkdirSync(dirname(dataDir), { recursive: true });\n }\n const pglite = new PGlite(dataDir);\n if (namespace) {\n await pglite.exec(`CREATE SCHEMA IF NOT EXISTS \"${namespace}\"`);\n await pglite.exec(`SET search_path TO \"${namespace}\", public`);\n }\n const db = drizzle(pglite, { schema: schema as never }) as unknown as PgDatabase<\n PgQueryResultHKT,\n TSchema\n >;\n return {\n db,\n close: async () => {\n await pglite.close();\n },\n };\n }\n\n const { Pool } = await import(\"pg\");\n const { drizzle } = await import(\"drizzle-orm/node-postgres\");\n const pool = new Pool(buildPoolConfig(url, namespace) as never) as unknown as PoolLike;\n pool.on(\"error\", (err: Error) => {\n console.error(\"[Database] Unexpected pool error:\", err.message);\n });\n\n if (namespace) {\n await ensureNamespaceExists(pool, namespace);\n }\n\n const db = drizzle(pool as never, { schema: schema as never }) as unknown as PgDatabase<\n PgQueryResultHKT,\n TSchema\n >;\n\n return {\n db,\n close: createCloseHandler(pool),\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAkBA,SAAgB,iBAAiB,UAA0B;CACzD,OAAO,UAAU,oBAAoB,QAAQ;AAC/C;;;;;;;;;;;;;;;AA0BA,SAAS,aAAa,MAAc,YAA4B;CAC9D,MAAM,MAAM,QAAQ,IAAI;CACxB,IAAI,QAAQ,UAAa,IAAI,KAAK,MAAM,IAAI,OAAO;CACnD,MAAM,SAAS,OAAO,GAAG;CACzB,IAAI,CAAC,OAAO,SAAS,MAAM,KAAK,SAAS,GACvC,MAAM,IAAI,MACR,gBAAgB,KAAK,IAAI,IAAI,4EAC/B;CAEF,OAAO;AACT;AAEA,SAAS,kBAAkB,WAAuC;CAShE,OAAO;EAPL,GAAI,YAAY,CAAC,mBAAmB,UAAU,SAAS,IAAI,CAAC;EAC5D,mBAAmB,aAAa,sBAAsB,GAAM;EAC5D,0CAA0C,aAAa,yBAAyB,GAAM;EACtF,GAAI,QAAQ,IAAI,0BACZ,CAAC,wBAAwB,aAAa,2BAA2B,CAAC,GAAG,IACrE,CAAC;CAEO,CAAC,CAAC,KAAK,GAAG;AAC1B;AAOA,MAAM,gBAAgB,QACpB,IAAI,SAAS,WAAW,KACxB,IAAI,SAAS,WAAW,KACxB,IAAI,SAAS,sBAAsB,KACnC,IAAI,SAAS,mBAAmB;;;;;;;;;;;;;;;;;AAkBlC,SAAgB,eAAe,KAAsD;CACnF,IAAI,aAAa,GAAG,GAAG,OAAO;CAE9B,IAAI,OAAsB;CAC1B,IAAI;EACF,OAAO,IAAI,IAAI,GAAG,CAAC,CAAC,aAAa,IAAI,SAAS;CAChD,QAAQ;EACN,OAAO;CACT;CAEA,IAAI,QAAQ,IAAI,+BAA+B,SAAS,OAAO,EAAE,oBAAoB,MAAM;CAC3F,IAAI,QAAQ,IAAI,+BAA+B,QAAQ,OAAO,EAAE,oBAAoB,KAAK;CAEzF,QAAQ,MAAR;EACE,KAAK,WACH,OAAO;EACT,KAAK;EACL,KAAK,eACH,OAAO,EAAE,oBAAoB,KAAK;EACpC,KAAK;EACL,KAAK;EACL,KAAK,WACH,OAAO,EAAE,oBAAoB,MAAM;EACrC,SACE,OAAO,EAAE,oBAAoB,KAAK;CACtC;AACF;AAEA,SAAS,gBAAgB,KAAa,WAA+B;CACnE,OAAO;EACL,kBAAkB;EAClB,KAAK,eAAe,GAAG;EACvB,KAAK,OAAO,QAAQ,IAAI,WAAW,KAAK;EACxC,yBAAyB,OAAO,QAAQ,IAAI,wBAAwB,KAAK;EACzE,mBAAmB,OAAO,QAAQ,IAAI,kBAAkB,KAAK;EAC7D,SAAS,kBAAkB,SAAS;CACtC;AACF;AAEA,eAAe,sBAAsB,MAAgB,WAAkC;CACrF,MAAM,SAAS,MAAM,KAAK,QAAQ;CAClC,IAAI;EACF,MAAM,OAAO,MAAM,OAAO;EAC1B,IAAI;GAKF,MAAM,OAAO,MAAM,yDAAyD,CAC1E,8BACF,CAAC;GACD,MAAM,OAAO,MAAM,gCAAgC,UAAU,EAAE;GAC/D,MAAM,OAAO,MAAM,QAAQ;EAC7B,SAAS,OAAO;GACd,MAAM,OAAO,MAAM,UAAU;GAC7B,MAAM;EACR;CACF,UAAU;EACR,OAAO,QAAQ;CACjB;AACF;AAEA,SAAS,mBAAmB,MAAqC;CAC/D,IAAI,SAAS;CACb,OAAO,YAAY;EACjB,IAAI,QAAQ;EACZ,SAAS;EACT,KAAK,mBAAmB,OAAO;EAC/B,KAAK,mBAAmB,SAAS;EACjC,MAAM,KAAK,IAAI;CACjB;AACF;;;;;;;;;;;;;AAcA,eAAsB,qBACpB,KACA,QACA,WACkC;CAClC,IAAI,IAAI,WAAW,SAAS,KAAK,QAAQ,YAAY;EACnD,MAAM,EAAE,YAAY,MAAM,OAAO;EACjC,MAAM,EAAE,WAAW,MAAM,OAAO;EAChC,MAAM,SAAS,QAAQ,aAAa,aAAa,IAAI,QAAQ,WAAW,EAAE;EAC1E,MAAM,UAAU,OAAO,SAAS,WAAW,KAAK,WAAW,aAAa,cAAc;EACtF,IAAI,YAAY,aACd,UAAU,QAAQ,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;EAEjD,MAAM,SAAS,IAAI,OAAO,OAAO;EACjC,IAAI,WAAW;GACb,MAAM,OAAO,KAAK,gCAAgC,UAAU,EAAE;GAC9D,MAAM,OAAO,KAAK,uBAAuB,UAAU,UAAU;EAC/D;EAKA,OAAO;GACL,IALS,QAAQ,QAAQ,EAAU,OAAgB,CAKlD;GACD,OAAO,YAAY;IACjB,MAAM,OAAO,MAAM;GACrB;EACF;CACF;CAEA,MAAM,EAAE,SAAS,MAAM,OAAO;CAC9B,MAAM,EAAE,YAAY,MAAM,OAAO;CACjC,MAAM,OAAO,IAAI,KAAK,gBAAgB,KAAK,SAAS,CAAU;CAC9D,KAAK,GAAG,UAAU,QAAe;EAC/B,QAAQ,MAAM,qCAAqC,IAAI,OAAO;CAChE,CAAC;CAED,IAAI,WACF,MAAM,sBAAsB,MAAM,SAAS;CAQ7C,OAAO;EACL,IANS,QAAQ,MAAe,EAAU,OAAgB,CAMzD;EACD,OAAO,mBAAmB,IAAI;CAChC;AACF"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
const require_binding = require('./binding.cjs');
|
|
2
|
+
let node_fs = require("node:fs");
|
|
3
|
+
let node_path = require("node:path");
|
|
4
|
+
let effect = require("effect");
|
|
5
|
+
let node_child_process = require("node:child_process");
|
|
6
|
+
|
|
7
|
+
//#region src/db/drizzle-kit.ts
|
|
8
|
+
var DrizzleKitError = class extends effect.Data.TaggedError("DrizzleKitError") {};
|
|
9
|
+
var DrizzleKit = class extends effect.Context.Service()("everything-dev/DrizzleKit") {};
|
|
10
|
+
/**
|
|
11
|
+
* The single choke point for invoking drizzle-kit. Every child receives the
|
|
12
|
+
* composition root's materialized environment (`bindingEnv`) so the config it
|
|
13
|
+
* evaluates never has to re-derive credentials from ambient state.
|
|
14
|
+
*/
|
|
15
|
+
function spawnDrizzleKit(spec) {
|
|
16
|
+
return effect.Effect.callback((resume) => {
|
|
17
|
+
let stderr = "";
|
|
18
|
+
let settled = false;
|
|
19
|
+
const settle = (effect$1) => {
|
|
20
|
+
if (settled) return;
|
|
21
|
+
settled = true;
|
|
22
|
+
resume(effect$1);
|
|
23
|
+
};
|
|
24
|
+
const child = (0, node_child_process.spawn)(process.platform === "win32" ? "npx.cmd" : "npx", [...spec.args], {
|
|
25
|
+
cwd: spec.cwd,
|
|
26
|
+
env: spec.env,
|
|
27
|
+
stdio: spec.stdio
|
|
28
|
+
});
|
|
29
|
+
if (spec.stdio === "pipe") child.stderr?.on("data", (data) => {
|
|
30
|
+
stderr += data.toString();
|
|
31
|
+
});
|
|
32
|
+
child.on("error", (err) => {
|
|
33
|
+
const hint = err.code === "ENOENT" ? "\"npx\" not found. Ensure Node.js is installed." : err.message;
|
|
34
|
+
settle(effect.Effect.fail(new DrizzleKitError({
|
|
35
|
+
command: spec.command,
|
|
36
|
+
message: hint,
|
|
37
|
+
exitCode: void 0
|
|
38
|
+
})));
|
|
39
|
+
});
|
|
40
|
+
child.on("exit", (code) => {
|
|
41
|
+
if (code === 0 || code === null) {
|
|
42
|
+
settle(effect.Effect.void);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
settle(effect.Effect.fail(new DrizzleKitError({
|
|
46
|
+
command: spec.command,
|
|
47
|
+
message: `drizzle-kit ${spec.command} exited with code ${code}${stderr.trim() ? `: ${stderr.trim()}` : ""}`,
|
|
48
|
+
exitCode: code
|
|
49
|
+
})));
|
|
50
|
+
});
|
|
51
|
+
return effect.Effect.sync(() => {
|
|
52
|
+
if (child.exitCode === null && !child.killed) child.kill();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function childEnv(binding) {
|
|
57
|
+
return {
|
|
58
|
+
...process.env,
|
|
59
|
+
...require_binding.bindingEnv({
|
|
60
|
+
secretName: binding.identity.secretName,
|
|
61
|
+
url: binding.url
|
|
62
|
+
})
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function workspaceConfigPath(binding) {
|
|
66
|
+
const workspaceDir = binding.identity.workspaceDir;
|
|
67
|
+
if (!workspaceDir) return void 0;
|
|
68
|
+
const configPath = (0, node_path.join)(workspaceDir, "drizzle.config.ts");
|
|
69
|
+
return (0, node_fs.existsSync)(configPath) ? configPath : void 0;
|
|
70
|
+
}
|
|
71
|
+
function writeGeneratedConfig(binding, projectDir) {
|
|
72
|
+
const dbDir = (0, node_path.resolve)(projectDir, ".bos", "db", binding.key);
|
|
73
|
+
(0, node_fs.mkdirSync)(dbDir, { recursive: true });
|
|
74
|
+
const configPath = (0, node_path.join)(dbDir, "drizzle.config.ts");
|
|
75
|
+
const configContent = `import { defineConfig } from "drizzle-kit";
|
|
76
|
+
|
|
77
|
+
export default defineConfig({
|
|
78
|
+
schema: "./drizzle/schema.ts",
|
|
79
|
+
out: "./drizzle",
|
|
80
|
+
dialect: "postgresql",
|
|
81
|
+
dbCredentials: {
|
|
82
|
+
url: "${binding.url}",
|
|
83
|
+
},
|
|
84
|
+
migrations: {
|
|
85
|
+
schema: "${binding.identity.journal.schema}",
|
|
86
|
+
table: "${binding.identity.journal.table}",
|
|
87
|
+
},
|
|
88
|
+
verbose: true,
|
|
89
|
+
strict: true,
|
|
90
|
+
});
|
|
91
|
+
`;
|
|
92
|
+
(0, node_fs.writeFileSync)(configPath, configContent);
|
|
93
|
+
return dbDir;
|
|
94
|
+
}
|
|
95
|
+
const makeDrizzleKitLive = (options) => effect.Layer.succeed(DrizzleKit, {
|
|
96
|
+
studio: (binding) => effect.Effect.gen(function* () {
|
|
97
|
+
const localConfig = workspaceConfigPath(binding);
|
|
98
|
+
if (localConfig && binding.identity.workspaceDir) {
|
|
99
|
+
options.onLog?.(`Starting Drizzle Studio for ${binding.key} (local)...`);
|
|
100
|
+
yield* spawnDrizzleKit({
|
|
101
|
+
args: [
|
|
102
|
+
"drizzle-kit",
|
|
103
|
+
"studio",
|
|
104
|
+
"--config",
|
|
105
|
+
localConfig
|
|
106
|
+
],
|
|
107
|
+
cwd: binding.identity.workspaceDir,
|
|
108
|
+
env: childEnv(binding),
|
|
109
|
+
command: "studio",
|
|
110
|
+
stdio: "inherit"
|
|
111
|
+
});
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (binding.source === "local") return yield* new DrizzleKitError({
|
|
115
|
+
command: "studio",
|
|
116
|
+
message: `No drizzle.config.ts found in ${binding.identity.workspaceDir ?? binding.key}. Run 'drizzle-kit init' first in the plugin workspace.`,
|
|
117
|
+
exitCode: void 0
|
|
118
|
+
});
|
|
119
|
+
options.onLog?.(`Introspecting database schema for ${binding.key}...`);
|
|
120
|
+
const dbDir = writeGeneratedConfig(binding, options.projectDir);
|
|
121
|
+
yield* spawnDrizzleKit({
|
|
122
|
+
args: [
|
|
123
|
+
"drizzle-kit",
|
|
124
|
+
"pull",
|
|
125
|
+
"--config",
|
|
126
|
+
(0, node_path.join)(dbDir, "drizzle.config.ts")
|
|
127
|
+
],
|
|
128
|
+
cwd: dbDir,
|
|
129
|
+
env: childEnv(binding),
|
|
130
|
+
command: "pull",
|
|
131
|
+
stdio: "inherit"
|
|
132
|
+
}).pipe(effect.Effect.mapError((error) => new DrizzleKitError({
|
|
133
|
+
command: "pull",
|
|
134
|
+
exitCode: error.exitCode,
|
|
135
|
+
message: `Failed to introspect database for "${binding.key}". Check that ${binding.identity.secretName} is correct and the database is reachable. ` + error.message
|
|
136
|
+
})));
|
|
137
|
+
options.onLog?.(`Starting Drizzle Studio for ${binding.key}...`);
|
|
138
|
+
yield* spawnDrizzleKit({
|
|
139
|
+
args: [
|
|
140
|
+
"drizzle-kit",
|
|
141
|
+
"studio",
|
|
142
|
+
"--config",
|
|
143
|
+
(0, node_path.join)(dbDir, "drizzle.config.ts")
|
|
144
|
+
],
|
|
145
|
+
cwd: dbDir,
|
|
146
|
+
env: childEnv(binding),
|
|
147
|
+
command: "studio",
|
|
148
|
+
stdio: "inherit"
|
|
149
|
+
});
|
|
150
|
+
}),
|
|
151
|
+
migrate: (binding) => {
|
|
152
|
+
const configPath = workspaceConfigPath(binding);
|
|
153
|
+
if (!configPath || !binding.identity.workspaceDir) return effect.Effect.fail(new DrizzleKitError({
|
|
154
|
+
command: "migrate",
|
|
155
|
+
message: `No drizzle.config.ts found in ${binding.identity.workspaceDir ?? binding.key}.`,
|
|
156
|
+
exitCode: void 0
|
|
157
|
+
}));
|
|
158
|
+
return spawnDrizzleKit({
|
|
159
|
+
args: [
|
|
160
|
+
"drizzle-kit",
|
|
161
|
+
"migrate",
|
|
162
|
+
"--config",
|
|
163
|
+
configPath
|
|
164
|
+
],
|
|
165
|
+
cwd: binding.identity.workspaceDir,
|
|
166
|
+
env: childEnv(binding),
|
|
167
|
+
command: "migrate",
|
|
168
|
+
stdio: "pipe"
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
//#endregion
|
|
174
|
+
exports.DrizzleKit = DrizzleKit;
|
|
175
|
+
exports.DrizzleKitError = DrizzleKitError;
|
|
176
|
+
exports.makeDrizzleKitLive = makeDrizzleKitLive;
|
|
177
|
+
//# sourceMappingURL=drizzle-kit.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle-kit.cjs","names":["Data","Context","Effect","effect","spawn","bindingEnv","join","existsSync","resolve","Layer"],"sources":["../../src/db/drizzle-kit.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { Context, Data, Effect, Layer } from \"effect\";\nimport { bindingEnv } from \"./binding\";\nimport type { DatabaseBinding } from \"./bindings\";\n\nexport class DrizzleKitError extends Data.TaggedError(\"DrizzleKitError\")<{\n readonly command: string;\n readonly message: string;\n readonly exitCode: number | undefined;\n}> {}\n\nexport interface DrizzleKitService {\n readonly studio: (binding: DatabaseBinding) => Effect.Effect<void, DrizzleKitError>;\n readonly migrate: (binding: DatabaseBinding) => Effect.Effect<void, DrizzleKitError>;\n}\n\nexport class DrizzleKit extends Context.Service<DrizzleKit, DrizzleKitService>()(\n \"everything-dev/DrizzleKit\",\n) {}\n\ninterface SpawnSpec {\n readonly args: readonly string[];\n readonly cwd: string;\n readonly env: Record<string, string | undefined>;\n readonly command: string;\n readonly stdio: \"inherit\" | \"pipe\";\n}\n\n/**\n * The single choke point for invoking drizzle-kit. Every child receives the\n * composition root's materialized environment (`bindingEnv`) so the config it\n * evaluates never has to re-derive credentials from ambient state.\n */\nfunction spawnDrizzleKit(spec: SpawnSpec): Effect.Effect<void, DrizzleKitError> {\n return Effect.callback((resume) => {\n let stderr = \"\";\n let settled = false;\n const settle = (effect: Effect.Effect<void, DrizzleKitError>) => {\n if (settled) return;\n settled = true;\n resume(effect);\n };\n\n const child = spawn(process.platform === \"win32\" ? \"npx.cmd\" : \"npx\", [...spec.args], {\n cwd: spec.cwd,\n env: spec.env,\n stdio: spec.stdio,\n });\n\n if (spec.stdio === \"pipe\") {\n child.stderr?.on(\"data\", (data: Buffer) => {\n stderr += data.toString();\n });\n }\n\n child.on(\"error\", (err) => {\n const hint =\n (err as NodeJS.ErrnoException).code === \"ENOENT\"\n ? '\"npx\" not found. Ensure Node.js is installed.'\n : err.message;\n settle(\n Effect.fail(\n new DrizzleKitError({ command: spec.command, message: hint, exitCode: undefined }),\n ),\n );\n });\n\n child.on(\"exit\", (code) => {\n if (code === 0 || code === null) {\n settle(Effect.void);\n return;\n }\n settle(\n Effect.fail(\n new DrizzleKitError({\n command: spec.command,\n message: `drizzle-kit ${spec.command} exited with code ${code}${\n stderr.trim() ? `: ${stderr.trim()}` : \"\"\n }`,\n exitCode: code,\n }),\n ),\n );\n });\n\n return Effect.sync(() => {\n if (child.exitCode === null && !child.killed) child.kill();\n });\n });\n}\n\nfunction childEnv(binding: DatabaseBinding): Record<string, string | undefined> {\n return {\n ...process.env,\n ...bindingEnv({ secretName: binding.identity.secretName, url: binding.url }),\n };\n}\n\nfunction workspaceConfigPath(binding: DatabaseBinding): string | undefined {\n const workspaceDir = binding.identity.workspaceDir;\n if (!workspaceDir) return undefined;\n const configPath = join(workspaceDir, \"drizzle.config.ts\");\n return existsSync(configPath) ? configPath : undefined;\n}\n\nfunction writeGeneratedConfig(binding: DatabaseBinding, projectDir: string): string {\n const dbDir = resolve(projectDir, \".bos\", \"db\", binding.key);\n mkdirSync(dbDir, { recursive: true });\n\n const configPath = join(dbDir, \"drizzle.config.ts\");\n const configContent = `import { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n schema: \"./drizzle/schema.ts\",\n out: \"./drizzle\",\n dialect: \"postgresql\",\n dbCredentials: {\n url: \"${binding.url}\",\n },\n migrations: {\n schema: \"${binding.identity.journal.schema}\",\n table: \"${binding.identity.journal.table}\",\n },\n verbose: true,\n strict: true,\n});\n`;\n\n writeFileSync(configPath, configContent);\n return dbDir;\n}\n\nexport interface DrizzleKitOptions {\n readonly projectDir: string;\n readonly onLog?: (message: string) => void;\n}\n\nexport const makeDrizzleKitLive = (options: DrizzleKitOptions): Layer.Layer<DrizzleKit> =>\n Layer.succeed(DrizzleKit, {\n studio: (binding) =>\n Effect.gen(function* () {\n const localConfig = workspaceConfigPath(binding);\n\n if (localConfig && binding.identity.workspaceDir) {\n options.onLog?.(`Starting Drizzle Studio for ${binding.key} (local)...`);\n yield* spawnDrizzleKit({\n args: [\"drizzle-kit\", \"studio\", \"--config\", localConfig],\n cwd: binding.identity.workspaceDir,\n env: childEnv(binding),\n command: \"studio\",\n stdio: \"inherit\",\n });\n return;\n }\n\n if (binding.source === \"local\") {\n return yield* new DrizzleKitError({\n command: \"studio\",\n message:\n `No drizzle.config.ts found in ${binding.identity.workspaceDir ?? binding.key}. ` +\n `Run 'drizzle-kit init' first in the plugin workspace.`,\n exitCode: undefined,\n });\n }\n\n options.onLog?.(`Introspecting database schema for ${binding.key}...`);\n const dbDir = writeGeneratedConfig(binding, options.projectDir);\n yield* spawnDrizzleKit({\n args: [\"drizzle-kit\", \"pull\", \"--config\", join(dbDir, \"drizzle.config.ts\")],\n cwd: dbDir,\n env: childEnv(binding),\n command: \"pull\",\n stdio: \"inherit\",\n }).pipe(\n Effect.mapError(\n (error) =>\n new DrizzleKitError({\n command: \"pull\",\n exitCode: error.exitCode,\n message:\n `Failed to introspect database for \"${binding.key}\". ` +\n `Check that ${binding.identity.secretName} is correct and the database is reachable. ` +\n error.message,\n }),\n ),\n );\n\n options.onLog?.(`Starting Drizzle Studio for ${binding.key}...`);\n yield* spawnDrizzleKit({\n args: [\"drizzle-kit\", \"studio\", \"--config\", join(dbDir, \"drizzle.config.ts\")],\n cwd: dbDir,\n env: childEnv(binding),\n command: \"studio\",\n stdio: \"inherit\",\n });\n }),\n\n migrate: (binding) => {\n const configPath = workspaceConfigPath(binding);\n if (!configPath || !binding.identity.workspaceDir) {\n return Effect.fail(\n new DrizzleKitError({\n command: \"migrate\",\n message: `No drizzle.config.ts found in ${binding.identity.workspaceDir ?? binding.key}.`,\n exitCode: undefined,\n }),\n );\n }\n return spawnDrizzleKit({\n args: [\"drizzle-kit\", \"migrate\", \"--config\", configPath],\n cwd: binding.identity.workspaceDir,\n env: childEnv(binding),\n command: \"migrate\",\n stdio: \"pipe\",\n });\n },\n });\n"],"mappings":";;;;;;;AAOA,IAAa,kBAAb,cAAqCA,YAAK,YAAY,iBAAiB,CAAC,CAIrE,CAAC;AAOJ,IAAa,aAAb,cAAgCC,eAAQ,QAAuC,CAAC,CAC9E,2BACF,CAAC,CAAC,CAAC;;;;;;AAeH,SAAS,gBAAgB,MAAuD;CAC9E,OAAOC,cAAO,UAAU,WAAW;EACjC,IAAI,SAAS;EACb,IAAI,UAAU;EACd,MAAM,UAAU,aAAiD;GAC/D,IAAI,SAAS;GACb,UAAU;GACV,OAAOC,QAAM;EACf;EAEA,MAAM,YAAQC,0BAAM,QAAQ,aAAa,UAAU,YAAY,OAAO,CAAC,GAAG,KAAK,IAAI,GAAG;GACpF,KAAK,KAAK;GACV,KAAK,KAAK;GACV,OAAO,KAAK;EACd,CAAC;EAED,IAAI,KAAK,UAAU,QACjB,MAAM,QAAQ,GAAG,SAAS,SAAiB;GACzC,UAAU,KAAK,SAAS;EAC1B,CAAC;EAGH,MAAM,GAAG,UAAU,QAAQ;GACzB,MAAM,OACH,IAA8B,SAAS,WACpC,oDACA,IAAI;GACV,OACEF,cAAO,KACL,IAAI,gBAAgB;IAAE,SAAS,KAAK;IAAS,SAAS;IAAM,UAAU;GAAU,CAAC,CACnF,CACF;EACF,CAAC;EAED,MAAM,GAAG,SAAS,SAAS;GACzB,IAAI,SAAS,KAAK,SAAS,MAAM;IAC/B,OAAOA,cAAO,IAAI;IAClB;GACF;GACA,OACEA,cAAO,KACL,IAAI,gBAAgB;IAClB,SAAS,KAAK;IACd,SAAS,eAAe,KAAK,QAAQ,oBAAoB,OACvD,OAAO,KAAK,IAAI,KAAK,OAAO,KAAK,MAAM;IAEzC,UAAU;GACZ,CAAC,CACH,CACF;EACF,CAAC;EAED,OAAOA,cAAO,WAAW;GACvB,IAAI,MAAM,aAAa,QAAQ,CAAC,MAAM,QAAQ,MAAM,KAAK;EAC3D,CAAC;CACH,CAAC;AACH;AAEA,SAAS,SAAS,SAA8D;CAC9E,OAAO;EACL,GAAG,QAAQ;EACX,GAAGG,2BAAW;GAAE,YAAY,QAAQ,SAAS;GAAY,KAAK,QAAQ;EAAI,CAAC;CAC7E;AACF;AAEA,SAAS,oBAAoB,SAA8C;CACzE,MAAM,eAAe,QAAQ,SAAS;CACtC,IAAI,CAAC,cAAc,OAAO;CAC1B,MAAM,iBAAaC,gBAAK,cAAc,mBAAmB;CACzD,WAAOC,oBAAW,UAAU,IAAI,aAAa;AAC/C;AAEA,SAAS,qBAAqB,SAA0B,YAA4B;CAClF,MAAM,YAAQC,mBAAQ,YAAY,QAAQ,MAAM,QAAQ,GAAG;CAC3D,uBAAU,OAAO,EAAE,WAAW,KAAK,CAAC;CAEpC,MAAM,iBAAaF,gBAAK,OAAO,mBAAmB;CAClD,MAAM,gBAAgB;;;;;;;YAOZ,QAAQ,IAAI;;;eAGT,QAAQ,SAAS,QAAQ,OAAO;cACjC,QAAQ,SAAS,QAAQ,MAAM;;;;;;CAO3C,2BAAc,YAAY,aAAa;CACvC,OAAO;AACT;AAOA,MAAa,sBAAsB,YACjCG,aAAM,QAAQ,YAAY;CACxB,SAAS,YACPP,cAAO,IAAI,aAAa;EACtB,MAAM,cAAc,oBAAoB,OAAO;EAE/C,IAAI,eAAe,QAAQ,SAAS,cAAc;GAChD,QAAQ,QAAQ,+BAA+B,QAAQ,IAAI,YAAY;GACvE,OAAO,gBAAgB;IACrB,MAAM;KAAC;KAAe;KAAU;KAAY;IAAW;IACvD,KAAK,QAAQ,SAAS;IACtB,KAAK,SAAS,OAAO;IACrB,SAAS;IACT,OAAO;GACT,CAAC;GACD;EACF;EAEA,IAAI,QAAQ,WAAW,SACrB,OAAO,OAAO,IAAI,gBAAgB;GAChC,SAAS;GACT,SACE,iCAAiC,QAAQ,SAAS,gBAAgB,QAAQ,IAAI;GAEhF,UAAU;EACZ,CAAC;EAGH,QAAQ,QAAQ,qCAAqC,QAAQ,IAAI,IAAI;EACrE,MAAM,QAAQ,qBAAqB,SAAS,QAAQ,UAAU;EAC9D,OAAO,gBAAgB;GACrB,MAAM;IAAC;IAAe;IAAQ;QAAYI,gBAAK,OAAO,mBAAmB;GAAC;GAC1E,KAAK;GACL,KAAK,SAAS,OAAO;GACrB,SAAS;GACT,OAAO;EACT,CAAC,CAAC,CAAC,KACDJ,cAAO,UACJ,UACC,IAAI,gBAAgB;GAClB,SAAS;GACT,UAAU,MAAM;GAChB,SACE,sCAAsC,QAAQ,IAAI,gBACpC,QAAQ,SAAS,WAAW,+CAC1C,MAAM;EACV,CAAC,CACL,CACF;EAEA,QAAQ,QAAQ,+BAA+B,QAAQ,IAAI,IAAI;EAC/D,OAAO,gBAAgB;GACrB,MAAM;IAAC;IAAe;IAAU;QAAYI,gBAAK,OAAO,mBAAmB;GAAC;GAC5E,KAAK;GACL,KAAK,SAAS,OAAO;GACrB,SAAS;GACT,OAAO;EACT,CAAC;CACH,CAAC;CAEH,UAAU,YAAY;EACpB,MAAM,aAAa,oBAAoB,OAAO;EAC9C,IAAI,CAAC,cAAc,CAAC,QAAQ,SAAS,cACnC,OAAOJ,cAAO,KACZ,IAAI,gBAAgB;GAClB,SAAS;GACT,SAAS,iCAAiC,QAAQ,SAAS,gBAAgB,QAAQ,IAAI;GACvF,UAAU;EACZ,CAAC,CACH;EAEF,OAAO,gBAAgB;GACrB,MAAM;IAAC;IAAe;IAAW;IAAY;GAAU;GACvD,KAAK,QAAQ,SAAS;GACtB,KAAK,SAAS,OAAO;GACrB,SAAS;GACT,OAAO;EACT,CAAC;CACH;AACF,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { DatabaseBinding } from "./bindings.cjs";
|
|
2
|
+
import { Context, Effect, Layer } from "effect";
|
|
3
|
+
//#region src/db/drizzle-kit.d.ts
|
|
4
|
+
declare const DrizzleKitError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
5
|
+
readonly _tag: "DrizzleKitError";
|
|
6
|
+
} & Readonly<A>;
|
|
7
|
+
declare class DrizzleKitError extends DrizzleKitError_base<{
|
|
8
|
+
readonly command: string;
|
|
9
|
+
readonly message: string;
|
|
10
|
+
readonly exitCode: number | undefined;
|
|
11
|
+
}> {}
|
|
12
|
+
interface DrizzleKitService {
|
|
13
|
+
readonly studio: (binding: DatabaseBinding) => Effect.Effect<void, DrizzleKitError>;
|
|
14
|
+
readonly migrate: (binding: DatabaseBinding) => Effect.Effect<void, DrizzleKitError>;
|
|
15
|
+
}
|
|
16
|
+
declare const DrizzleKit_base: Context.ServiceClass<DrizzleKit, "everything-dev/DrizzleKit", DrizzleKitService>;
|
|
17
|
+
declare class DrizzleKit extends DrizzleKit_base {}
|
|
18
|
+
interface DrizzleKitOptions {
|
|
19
|
+
readonly projectDir: string;
|
|
20
|
+
readonly onLog?: (message: string) => void;
|
|
21
|
+
}
|
|
22
|
+
declare const makeDrizzleKitLive: (options: DrizzleKitOptions) => Layer.Layer<DrizzleKit>;
|
|
23
|
+
//#endregion
|
|
24
|
+
export { DrizzleKit, DrizzleKitError, DrizzleKitOptions, DrizzleKitService, makeDrizzleKitLive };
|
|
25
|
+
//# sourceMappingURL=drizzle-kit.d.cts.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { DatabaseBinding } from "./bindings.mjs";
|
|
2
|
+
import { Context, Effect, Layer } from "effect";
|
|
3
|
+
//#region src/db/drizzle-kit.d.ts
|
|
4
|
+
declare const DrizzleKitError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
5
|
+
readonly _tag: "DrizzleKitError";
|
|
6
|
+
} & Readonly<A>;
|
|
7
|
+
declare class DrizzleKitError extends DrizzleKitError_base<{
|
|
8
|
+
readonly command: string;
|
|
9
|
+
readonly message: string;
|
|
10
|
+
readonly exitCode: number | undefined;
|
|
11
|
+
}> {}
|
|
12
|
+
interface DrizzleKitService {
|
|
13
|
+
readonly studio: (binding: DatabaseBinding) => Effect.Effect<void, DrizzleKitError>;
|
|
14
|
+
readonly migrate: (binding: DatabaseBinding) => Effect.Effect<void, DrizzleKitError>;
|
|
15
|
+
}
|
|
16
|
+
declare const DrizzleKit_base: Context.ServiceClass<DrizzleKit, "everything-dev/DrizzleKit", DrizzleKitService>;
|
|
17
|
+
declare class DrizzleKit extends DrizzleKit_base {}
|
|
18
|
+
interface DrizzleKitOptions {
|
|
19
|
+
readonly projectDir: string;
|
|
20
|
+
readonly onLog?: (message: string) => void;
|
|
21
|
+
}
|
|
22
|
+
declare const makeDrizzleKitLive: (options: DrizzleKitOptions) => Layer.Layer<DrizzleKit>;
|
|
23
|
+
//#endregion
|
|
24
|
+
export { DrizzleKit, DrizzleKitError, DrizzleKitOptions, DrizzleKitService, makeDrizzleKitLive };
|
|
25
|
+
//# sourceMappingURL=drizzle-kit.d.mts.map
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { bindingEnv } from "./binding.mjs";
|
|
2
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { Context, Data, Effect, Layer } from "effect";
|
|
5
|
+
import { spawn } from "node:child_process";
|
|
6
|
+
|
|
7
|
+
//#region src/db/drizzle-kit.ts
|
|
8
|
+
var DrizzleKitError = class extends Data.TaggedError("DrizzleKitError") {};
|
|
9
|
+
var DrizzleKit = class extends Context.Service()("everything-dev/DrizzleKit") {};
|
|
10
|
+
/**
|
|
11
|
+
* The single choke point for invoking drizzle-kit. Every child receives the
|
|
12
|
+
* composition root's materialized environment (`bindingEnv`) so the config it
|
|
13
|
+
* evaluates never has to re-derive credentials from ambient state.
|
|
14
|
+
*/
|
|
15
|
+
function spawnDrizzleKit(spec) {
|
|
16
|
+
return Effect.callback((resume) => {
|
|
17
|
+
let stderr = "";
|
|
18
|
+
let settled = false;
|
|
19
|
+
const settle = (effect) => {
|
|
20
|
+
if (settled) return;
|
|
21
|
+
settled = true;
|
|
22
|
+
resume(effect);
|
|
23
|
+
};
|
|
24
|
+
const child = spawn(process.platform === "win32" ? "npx.cmd" : "npx", [...spec.args], {
|
|
25
|
+
cwd: spec.cwd,
|
|
26
|
+
env: spec.env,
|
|
27
|
+
stdio: spec.stdio
|
|
28
|
+
});
|
|
29
|
+
if (spec.stdio === "pipe") child.stderr?.on("data", (data) => {
|
|
30
|
+
stderr += data.toString();
|
|
31
|
+
});
|
|
32
|
+
child.on("error", (err) => {
|
|
33
|
+
const hint = err.code === "ENOENT" ? "\"npx\" not found. Ensure Node.js is installed." : err.message;
|
|
34
|
+
settle(Effect.fail(new DrizzleKitError({
|
|
35
|
+
command: spec.command,
|
|
36
|
+
message: hint,
|
|
37
|
+
exitCode: void 0
|
|
38
|
+
})));
|
|
39
|
+
});
|
|
40
|
+
child.on("exit", (code) => {
|
|
41
|
+
if (code === 0 || code === null) {
|
|
42
|
+
settle(Effect.void);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
settle(Effect.fail(new DrizzleKitError({
|
|
46
|
+
command: spec.command,
|
|
47
|
+
message: `drizzle-kit ${spec.command} exited with code ${code}${stderr.trim() ? `: ${stderr.trim()}` : ""}`,
|
|
48
|
+
exitCode: code
|
|
49
|
+
})));
|
|
50
|
+
});
|
|
51
|
+
return Effect.sync(() => {
|
|
52
|
+
if (child.exitCode === null && !child.killed) child.kill();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function childEnv(binding) {
|
|
57
|
+
return {
|
|
58
|
+
...process.env,
|
|
59
|
+
...bindingEnv({
|
|
60
|
+
secretName: binding.identity.secretName,
|
|
61
|
+
url: binding.url
|
|
62
|
+
})
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function workspaceConfigPath(binding) {
|
|
66
|
+
const workspaceDir = binding.identity.workspaceDir;
|
|
67
|
+
if (!workspaceDir) return void 0;
|
|
68
|
+
const configPath = join(workspaceDir, "drizzle.config.ts");
|
|
69
|
+
return existsSync(configPath) ? configPath : void 0;
|
|
70
|
+
}
|
|
71
|
+
function writeGeneratedConfig(binding, projectDir) {
|
|
72
|
+
const dbDir = resolve(projectDir, ".bos", "db", binding.key);
|
|
73
|
+
mkdirSync(dbDir, { recursive: true });
|
|
74
|
+
const configPath = join(dbDir, "drizzle.config.ts");
|
|
75
|
+
const configContent = `import { defineConfig } from "drizzle-kit";
|
|
76
|
+
|
|
77
|
+
export default defineConfig({
|
|
78
|
+
schema: "./drizzle/schema.ts",
|
|
79
|
+
out: "./drizzle",
|
|
80
|
+
dialect: "postgresql",
|
|
81
|
+
dbCredentials: {
|
|
82
|
+
url: "${binding.url}",
|
|
83
|
+
},
|
|
84
|
+
migrations: {
|
|
85
|
+
schema: "${binding.identity.journal.schema}",
|
|
86
|
+
table: "${binding.identity.journal.table}",
|
|
87
|
+
},
|
|
88
|
+
verbose: true,
|
|
89
|
+
strict: true,
|
|
90
|
+
});
|
|
91
|
+
`;
|
|
92
|
+
writeFileSync(configPath, configContent);
|
|
93
|
+
return dbDir;
|
|
94
|
+
}
|
|
95
|
+
const makeDrizzleKitLive = (options) => Layer.succeed(DrizzleKit, {
|
|
96
|
+
studio: (binding) => Effect.gen(function* () {
|
|
97
|
+
const localConfig = workspaceConfigPath(binding);
|
|
98
|
+
if (localConfig && binding.identity.workspaceDir) {
|
|
99
|
+
options.onLog?.(`Starting Drizzle Studio for ${binding.key} (local)...`);
|
|
100
|
+
yield* spawnDrizzleKit({
|
|
101
|
+
args: [
|
|
102
|
+
"drizzle-kit",
|
|
103
|
+
"studio",
|
|
104
|
+
"--config",
|
|
105
|
+
localConfig
|
|
106
|
+
],
|
|
107
|
+
cwd: binding.identity.workspaceDir,
|
|
108
|
+
env: childEnv(binding),
|
|
109
|
+
command: "studio",
|
|
110
|
+
stdio: "inherit"
|
|
111
|
+
});
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (binding.source === "local") return yield* new DrizzleKitError({
|
|
115
|
+
command: "studio",
|
|
116
|
+
message: `No drizzle.config.ts found in ${binding.identity.workspaceDir ?? binding.key}. Run 'drizzle-kit init' first in the plugin workspace.`,
|
|
117
|
+
exitCode: void 0
|
|
118
|
+
});
|
|
119
|
+
options.onLog?.(`Introspecting database schema for ${binding.key}...`);
|
|
120
|
+
const dbDir = writeGeneratedConfig(binding, options.projectDir);
|
|
121
|
+
yield* spawnDrizzleKit({
|
|
122
|
+
args: [
|
|
123
|
+
"drizzle-kit",
|
|
124
|
+
"pull",
|
|
125
|
+
"--config",
|
|
126
|
+
join(dbDir, "drizzle.config.ts")
|
|
127
|
+
],
|
|
128
|
+
cwd: dbDir,
|
|
129
|
+
env: childEnv(binding),
|
|
130
|
+
command: "pull",
|
|
131
|
+
stdio: "inherit"
|
|
132
|
+
}).pipe(Effect.mapError((error) => new DrizzleKitError({
|
|
133
|
+
command: "pull",
|
|
134
|
+
exitCode: error.exitCode,
|
|
135
|
+
message: `Failed to introspect database for "${binding.key}". Check that ${binding.identity.secretName} is correct and the database is reachable. ` + error.message
|
|
136
|
+
})));
|
|
137
|
+
options.onLog?.(`Starting Drizzle Studio for ${binding.key}...`);
|
|
138
|
+
yield* spawnDrizzleKit({
|
|
139
|
+
args: [
|
|
140
|
+
"drizzle-kit",
|
|
141
|
+
"studio",
|
|
142
|
+
"--config",
|
|
143
|
+
join(dbDir, "drizzle.config.ts")
|
|
144
|
+
],
|
|
145
|
+
cwd: dbDir,
|
|
146
|
+
env: childEnv(binding),
|
|
147
|
+
command: "studio",
|
|
148
|
+
stdio: "inherit"
|
|
149
|
+
});
|
|
150
|
+
}),
|
|
151
|
+
migrate: (binding) => {
|
|
152
|
+
const configPath = workspaceConfigPath(binding);
|
|
153
|
+
if (!configPath || !binding.identity.workspaceDir) return Effect.fail(new DrizzleKitError({
|
|
154
|
+
command: "migrate",
|
|
155
|
+
message: `No drizzle.config.ts found in ${binding.identity.workspaceDir ?? binding.key}.`,
|
|
156
|
+
exitCode: void 0
|
|
157
|
+
}));
|
|
158
|
+
return spawnDrizzleKit({
|
|
159
|
+
args: [
|
|
160
|
+
"drizzle-kit",
|
|
161
|
+
"migrate",
|
|
162
|
+
"--config",
|
|
163
|
+
configPath
|
|
164
|
+
],
|
|
165
|
+
cwd: binding.identity.workspaceDir,
|
|
166
|
+
env: childEnv(binding),
|
|
167
|
+
command: "migrate",
|
|
168
|
+
stdio: "pipe"
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
//#endregion
|
|
174
|
+
export { DrizzleKit, DrizzleKitError, makeDrizzleKitLive };
|
|
175
|
+
//# sourceMappingURL=drizzle-kit.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle-kit.mjs","names":[],"sources":["../../src/db/drizzle-kit.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { Context, Data, Effect, Layer } from \"effect\";\nimport { bindingEnv } from \"./binding\";\nimport type { DatabaseBinding } from \"./bindings\";\n\nexport class DrizzleKitError extends Data.TaggedError(\"DrizzleKitError\")<{\n readonly command: string;\n readonly message: string;\n readonly exitCode: number | undefined;\n}> {}\n\nexport interface DrizzleKitService {\n readonly studio: (binding: DatabaseBinding) => Effect.Effect<void, DrizzleKitError>;\n readonly migrate: (binding: DatabaseBinding) => Effect.Effect<void, DrizzleKitError>;\n}\n\nexport class DrizzleKit extends Context.Service<DrizzleKit, DrizzleKitService>()(\n \"everything-dev/DrizzleKit\",\n) {}\n\ninterface SpawnSpec {\n readonly args: readonly string[];\n readonly cwd: string;\n readonly env: Record<string, string | undefined>;\n readonly command: string;\n readonly stdio: \"inherit\" | \"pipe\";\n}\n\n/**\n * The single choke point for invoking drizzle-kit. Every child receives the\n * composition root's materialized environment (`bindingEnv`) so the config it\n * evaluates never has to re-derive credentials from ambient state.\n */\nfunction spawnDrizzleKit(spec: SpawnSpec): Effect.Effect<void, DrizzleKitError> {\n return Effect.callback((resume) => {\n let stderr = \"\";\n let settled = false;\n const settle = (effect: Effect.Effect<void, DrizzleKitError>) => {\n if (settled) return;\n settled = true;\n resume(effect);\n };\n\n const child = spawn(process.platform === \"win32\" ? \"npx.cmd\" : \"npx\", [...spec.args], {\n cwd: spec.cwd,\n env: spec.env,\n stdio: spec.stdio,\n });\n\n if (spec.stdio === \"pipe\") {\n child.stderr?.on(\"data\", (data: Buffer) => {\n stderr += data.toString();\n });\n }\n\n child.on(\"error\", (err) => {\n const hint =\n (err as NodeJS.ErrnoException).code === \"ENOENT\"\n ? '\"npx\" not found. Ensure Node.js is installed.'\n : err.message;\n settle(\n Effect.fail(\n new DrizzleKitError({ command: spec.command, message: hint, exitCode: undefined }),\n ),\n );\n });\n\n child.on(\"exit\", (code) => {\n if (code === 0 || code === null) {\n settle(Effect.void);\n return;\n }\n settle(\n Effect.fail(\n new DrizzleKitError({\n command: spec.command,\n message: `drizzle-kit ${spec.command} exited with code ${code}${\n stderr.trim() ? `: ${stderr.trim()}` : \"\"\n }`,\n exitCode: code,\n }),\n ),\n );\n });\n\n return Effect.sync(() => {\n if (child.exitCode === null && !child.killed) child.kill();\n });\n });\n}\n\nfunction childEnv(binding: DatabaseBinding): Record<string, string | undefined> {\n return {\n ...process.env,\n ...bindingEnv({ secretName: binding.identity.secretName, url: binding.url }),\n };\n}\n\nfunction workspaceConfigPath(binding: DatabaseBinding): string | undefined {\n const workspaceDir = binding.identity.workspaceDir;\n if (!workspaceDir) return undefined;\n const configPath = join(workspaceDir, \"drizzle.config.ts\");\n return existsSync(configPath) ? configPath : undefined;\n}\n\nfunction writeGeneratedConfig(binding: DatabaseBinding, projectDir: string): string {\n const dbDir = resolve(projectDir, \".bos\", \"db\", binding.key);\n mkdirSync(dbDir, { recursive: true });\n\n const configPath = join(dbDir, \"drizzle.config.ts\");\n const configContent = `import { defineConfig } from \"drizzle-kit\";\n\nexport default defineConfig({\n schema: \"./drizzle/schema.ts\",\n out: \"./drizzle\",\n dialect: \"postgresql\",\n dbCredentials: {\n url: \"${binding.url}\",\n },\n migrations: {\n schema: \"${binding.identity.journal.schema}\",\n table: \"${binding.identity.journal.table}\",\n },\n verbose: true,\n strict: true,\n});\n`;\n\n writeFileSync(configPath, configContent);\n return dbDir;\n}\n\nexport interface DrizzleKitOptions {\n readonly projectDir: string;\n readonly onLog?: (message: string) => void;\n}\n\nexport const makeDrizzleKitLive = (options: DrizzleKitOptions): Layer.Layer<DrizzleKit> =>\n Layer.succeed(DrizzleKit, {\n studio: (binding) =>\n Effect.gen(function* () {\n const localConfig = workspaceConfigPath(binding);\n\n if (localConfig && binding.identity.workspaceDir) {\n options.onLog?.(`Starting Drizzle Studio for ${binding.key} (local)...`);\n yield* spawnDrizzleKit({\n args: [\"drizzle-kit\", \"studio\", \"--config\", localConfig],\n cwd: binding.identity.workspaceDir,\n env: childEnv(binding),\n command: \"studio\",\n stdio: \"inherit\",\n });\n return;\n }\n\n if (binding.source === \"local\") {\n return yield* new DrizzleKitError({\n command: \"studio\",\n message:\n `No drizzle.config.ts found in ${binding.identity.workspaceDir ?? binding.key}. ` +\n `Run 'drizzle-kit init' first in the plugin workspace.`,\n exitCode: undefined,\n });\n }\n\n options.onLog?.(`Introspecting database schema for ${binding.key}...`);\n const dbDir = writeGeneratedConfig(binding, options.projectDir);\n yield* spawnDrizzleKit({\n args: [\"drizzle-kit\", \"pull\", \"--config\", join(dbDir, \"drizzle.config.ts\")],\n cwd: dbDir,\n env: childEnv(binding),\n command: \"pull\",\n stdio: \"inherit\",\n }).pipe(\n Effect.mapError(\n (error) =>\n new DrizzleKitError({\n command: \"pull\",\n exitCode: error.exitCode,\n message:\n `Failed to introspect database for \"${binding.key}\". ` +\n `Check that ${binding.identity.secretName} is correct and the database is reachable. ` +\n error.message,\n }),\n ),\n );\n\n options.onLog?.(`Starting Drizzle Studio for ${binding.key}...`);\n yield* spawnDrizzleKit({\n args: [\"drizzle-kit\", \"studio\", \"--config\", join(dbDir, \"drizzle.config.ts\")],\n cwd: dbDir,\n env: childEnv(binding),\n command: \"studio\",\n stdio: \"inherit\",\n });\n }),\n\n migrate: (binding) => {\n const configPath = workspaceConfigPath(binding);\n if (!configPath || !binding.identity.workspaceDir) {\n return Effect.fail(\n new DrizzleKitError({\n command: \"migrate\",\n message: `No drizzle.config.ts found in ${binding.identity.workspaceDir ?? binding.key}.`,\n exitCode: undefined,\n }),\n );\n }\n return spawnDrizzleKit({\n args: [\"drizzle-kit\", \"migrate\", \"--config\", configPath],\n cwd: binding.identity.workspaceDir,\n env: childEnv(binding),\n command: \"migrate\",\n stdio: \"pipe\",\n });\n },\n });\n"],"mappings":";;;;;;;AAOA,IAAa,kBAAb,cAAqC,KAAK,YAAY,iBAAiB,CAAC,CAIrE,CAAC;AAOJ,IAAa,aAAb,cAAgC,QAAQ,QAAuC,CAAC,CAC9E,2BACF,CAAC,CAAC,CAAC;;;;;;AAeH,SAAS,gBAAgB,MAAuD;CAC9E,OAAO,OAAO,UAAU,WAAW;EACjC,IAAI,SAAS;EACb,IAAI,UAAU;EACd,MAAM,UAAU,WAAiD;GAC/D,IAAI,SAAS;GACb,UAAU;GACV,OAAO,MAAM;EACf;EAEA,MAAM,QAAQ,MAAM,QAAQ,aAAa,UAAU,YAAY,OAAO,CAAC,GAAG,KAAK,IAAI,GAAG;GACpF,KAAK,KAAK;GACV,KAAK,KAAK;GACV,OAAO,KAAK;EACd,CAAC;EAED,IAAI,KAAK,UAAU,QACjB,MAAM,QAAQ,GAAG,SAAS,SAAiB;GACzC,UAAU,KAAK,SAAS;EAC1B,CAAC;EAGH,MAAM,GAAG,UAAU,QAAQ;GACzB,MAAM,OACH,IAA8B,SAAS,WACpC,oDACA,IAAI;GACV,OACE,OAAO,KACL,IAAI,gBAAgB;IAAE,SAAS,KAAK;IAAS,SAAS;IAAM,UAAU;GAAU,CAAC,CACnF,CACF;EACF,CAAC;EAED,MAAM,GAAG,SAAS,SAAS;GACzB,IAAI,SAAS,KAAK,SAAS,MAAM;IAC/B,OAAO,OAAO,IAAI;IAClB;GACF;GACA,OACE,OAAO,KACL,IAAI,gBAAgB;IAClB,SAAS,KAAK;IACd,SAAS,eAAe,KAAK,QAAQ,oBAAoB,OACvD,OAAO,KAAK,IAAI,KAAK,OAAO,KAAK,MAAM;IAEzC,UAAU;GACZ,CAAC,CACH,CACF;EACF,CAAC;EAED,OAAO,OAAO,WAAW;GACvB,IAAI,MAAM,aAAa,QAAQ,CAAC,MAAM,QAAQ,MAAM,KAAK;EAC3D,CAAC;CACH,CAAC;AACH;AAEA,SAAS,SAAS,SAA8D;CAC9E,OAAO;EACL,GAAG,QAAQ;EACX,GAAG,WAAW;GAAE,YAAY,QAAQ,SAAS;GAAY,KAAK,QAAQ;EAAI,CAAC;CAC7E;AACF;AAEA,SAAS,oBAAoB,SAA8C;CACzE,MAAM,eAAe,QAAQ,SAAS;CACtC,IAAI,CAAC,cAAc,OAAO;CAC1B,MAAM,aAAa,KAAK,cAAc,mBAAmB;CACzD,OAAO,WAAW,UAAU,IAAI,aAAa;AAC/C;AAEA,SAAS,qBAAqB,SAA0B,YAA4B;CAClF,MAAM,QAAQ,QAAQ,YAAY,QAAQ,MAAM,QAAQ,GAAG;CAC3D,UAAU,OAAO,EAAE,WAAW,KAAK,CAAC;CAEpC,MAAM,aAAa,KAAK,OAAO,mBAAmB;CAClD,MAAM,gBAAgB;;;;;;;YAOZ,QAAQ,IAAI;;;eAGT,QAAQ,SAAS,QAAQ,OAAO;cACjC,QAAQ,SAAS,QAAQ,MAAM;;;;;;CAO3C,cAAc,YAAY,aAAa;CACvC,OAAO;AACT;AAOA,MAAa,sBAAsB,YACjC,MAAM,QAAQ,YAAY;CACxB,SAAS,YACP,OAAO,IAAI,aAAa;EACtB,MAAM,cAAc,oBAAoB,OAAO;EAE/C,IAAI,eAAe,QAAQ,SAAS,cAAc;GAChD,QAAQ,QAAQ,+BAA+B,QAAQ,IAAI,YAAY;GACvE,OAAO,gBAAgB;IACrB,MAAM;KAAC;KAAe;KAAU;KAAY;IAAW;IACvD,KAAK,QAAQ,SAAS;IACtB,KAAK,SAAS,OAAO;IACrB,SAAS;IACT,OAAO;GACT,CAAC;GACD;EACF;EAEA,IAAI,QAAQ,WAAW,SACrB,OAAO,OAAO,IAAI,gBAAgB;GAChC,SAAS;GACT,SACE,iCAAiC,QAAQ,SAAS,gBAAgB,QAAQ,IAAI;GAEhF,UAAU;EACZ,CAAC;EAGH,QAAQ,QAAQ,qCAAqC,QAAQ,IAAI,IAAI;EACrE,MAAM,QAAQ,qBAAqB,SAAS,QAAQ,UAAU;EAC9D,OAAO,gBAAgB;GACrB,MAAM;IAAC;IAAe;IAAQ;IAAY,KAAK,OAAO,mBAAmB;GAAC;GAC1E,KAAK;GACL,KAAK,SAAS,OAAO;GACrB,SAAS;GACT,OAAO;EACT,CAAC,CAAC,CAAC,KACD,OAAO,UACJ,UACC,IAAI,gBAAgB;GAClB,SAAS;GACT,UAAU,MAAM;GAChB,SACE,sCAAsC,QAAQ,IAAI,gBACpC,QAAQ,SAAS,WAAW,+CAC1C,MAAM;EACV,CAAC,CACL,CACF;EAEA,QAAQ,QAAQ,+BAA+B,QAAQ,IAAI,IAAI;EAC/D,OAAO,gBAAgB;GACrB,MAAM;IAAC;IAAe;IAAU;IAAY,KAAK,OAAO,mBAAmB;GAAC;GAC5E,KAAK;GACL,KAAK,SAAS,OAAO;GACrB,SAAS;GACT,OAAO;EACT,CAAC;CACH,CAAC;CAEH,UAAU,YAAY;EACpB,MAAM,aAAa,oBAAoB,OAAO;EAC9C,IAAI,CAAC,cAAc,CAAC,QAAQ,SAAS,cACnC,OAAO,OAAO,KACZ,IAAI,gBAAgB;GAClB,SAAS;GACT,SAAS,iCAAiC,QAAQ,SAAS,gBAAgB,QAAQ,IAAI;GACvF,UAAU;EACZ,CAAC,CACH;EAEF,OAAO,gBAAgB;GACrB,MAAM;IAAC;IAAe;IAAW;IAAY;GAAU;GACvD,KAAK,QAAQ,SAAS;GACtB,KAAK,SAAS,OAAO;GACrB,SAAS;GACT,OAAO;EACT,CAAC;CACH;AACF,CAAC"}
|