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,144 @@
|
|
|
1
|
+
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
let node_fs = require("node:fs");
|
|
3
|
+
let node_path = require("node:path");
|
|
4
|
+
let effect = require("effect");
|
|
5
|
+
let node_crypto = require("node:crypto");
|
|
6
|
+
let node_process = require("node:process");
|
|
7
|
+
node_process = require_runtime.__toESM(node_process, 1);
|
|
8
|
+
let dotenv = require("dotenv");
|
|
9
|
+
let _clack_prompts = require("@clack/prompts");
|
|
10
|
+
_clack_prompts = require_runtime.__toESM(_clack_prompts, 1);
|
|
11
|
+
|
|
12
|
+
//#region src/env/project-env.ts
|
|
13
|
+
var EnvEnsureError = class extends effect.Data.TaggedError("EnvEnsureError") {};
|
|
14
|
+
var EnvLoadError = class extends effect.Data.TaggedError("EnvLoadError") {};
|
|
15
|
+
var EnvSyncError = class extends effect.Data.TaggedError("EnvSyncError") {};
|
|
16
|
+
/**
|
|
17
|
+
* The process environment as exported by the parent shell. Values present
|
|
18
|
+
* here were explicitly provided by the caller (shell, CI, the regression
|
|
19
|
+
* harness) and therefore outrank planner-generated values; values that only
|
|
20
|
+
* exist after `.env` loading do not. The bootstrap program captures this
|
|
21
|
+
* snapshot as its first step — before any `.env` loading — and provides it
|
|
22
|
+
* to the rest of the program as a service.
|
|
23
|
+
*/
|
|
24
|
+
var ShellEnv = class extends effect.Context.Service()("everything-dev/ShellEnv") {};
|
|
25
|
+
const captureShellEnv = effect.Effect.sync(() => Object.fromEntries(Object.entries(node_process.default.env).filter((entry) => entry[1] != null)));
|
|
26
|
+
const ShellEnvLive = (env) => effect.Layer.succeed(ShellEnv, env);
|
|
27
|
+
/**
|
|
28
|
+
* Align the bos-owned lines of `.env` with the generated infra env
|
|
29
|
+
* (ports/secrets derived from the resolved dev topology). Keys the caller
|
|
30
|
+
* explicitly exported (`shellEnv`) are skipped — a deliberate override must
|
|
31
|
+
* not be silently reverted on disk. Lines the user added outside the
|
|
32
|
+
* generated key set are untouched. Idempotent.
|
|
33
|
+
*/
|
|
34
|
+
const GENERATED_OWNED_KEYS = /* @__PURE__ */ new Set(["BASE_URL", "CORS_ORIGIN"]);
|
|
35
|
+
const maskValue = (key, value) => {
|
|
36
|
+
if (value === void 0) return "(absent)";
|
|
37
|
+
if (/_DATABASE_URL$|_REDIS_URL$|_SECRET$|_KEY$/.test(key)) return value.replace(/\/\/([^:/@]+):([^@]+)@/, "//***:***@");
|
|
38
|
+
return value;
|
|
39
|
+
};
|
|
40
|
+
const syncEnvFile = (configDir, generated, shellEnv = {}) => effect.Effect.gen(function* () {
|
|
41
|
+
if (Object.keys(generated).length === 0) return [];
|
|
42
|
+
const envPath = (0, node_path.join)(configDir, ".env");
|
|
43
|
+
if (!(0, node_fs.existsSync)(envPath)) return [];
|
|
44
|
+
const lines = yield* effect.Effect.try({
|
|
45
|
+
try: () => (0, node_fs.readFileSync)(envPath, "utf-8").split("\n"),
|
|
46
|
+
catch: (cause) => new EnvSyncError({ cause })
|
|
47
|
+
});
|
|
48
|
+
const drift = [];
|
|
49
|
+
const seen = /* @__PURE__ */ new Set();
|
|
50
|
+
const keyOf = (line) => {
|
|
51
|
+
return /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/.exec(line)?.[1] ?? null;
|
|
52
|
+
};
|
|
53
|
+
const updated = lines.map((line) => {
|
|
54
|
+
const key = keyOf(line);
|
|
55
|
+
if (!key || !(key in generated)) return line;
|
|
56
|
+
if (key in shellEnv && !GENERATED_OWNED_KEYS.has(key)) return line;
|
|
57
|
+
seen.add(key);
|
|
58
|
+
const value = line.slice(key.length + 1);
|
|
59
|
+
if (value === generated[key]) return line;
|
|
60
|
+
drift.push({
|
|
61
|
+
key,
|
|
62
|
+
from: value,
|
|
63
|
+
to: generated[key]
|
|
64
|
+
});
|
|
65
|
+
return `${key}=${generated[key]}`;
|
|
66
|
+
});
|
|
67
|
+
for (const [key, value] of Object.entries(generated)) {
|
|
68
|
+
if (seen.has(key)) continue;
|
|
69
|
+
if (key in shellEnv && !GENERATED_OWNED_KEYS.has(key)) continue;
|
|
70
|
+
drift.push({
|
|
71
|
+
key,
|
|
72
|
+
from: void 0,
|
|
73
|
+
to: value
|
|
74
|
+
});
|
|
75
|
+
updated.push(`${key}=${value}`);
|
|
76
|
+
}
|
|
77
|
+
if (drift.length > 0) {
|
|
78
|
+
yield* effect.Effect.try({
|
|
79
|
+
try: () => (0, node_fs.writeFileSync)(envPath, updated.join("\n")),
|
|
80
|
+
catch: (cause) => new EnvSyncError({ cause })
|
|
81
|
+
});
|
|
82
|
+
for (const { key, from, to } of drift) yield* effect.Effect.logInfo(`[env] ${key} updated: ${maskValue(key, from)} → ${maskValue(key, to)} (generated from resolved ports)`);
|
|
83
|
+
}
|
|
84
|
+
return drift;
|
|
85
|
+
});
|
|
86
|
+
var ProjectEnv = class extends effect.Context.Service()("everything-dev/ProjectEnv") {};
|
|
87
|
+
const makeProjectEnv = () => {
|
|
88
|
+
const loadedDirs = /* @__PURE__ */ new Set();
|
|
89
|
+
return {
|
|
90
|
+
ensureFile: (configDir) => effect.Effect.try({
|
|
91
|
+
try: () => {
|
|
92
|
+
const envPath = (0, node_path.join)(configDir, ".env");
|
|
93
|
+
const examplePath = (0, node_path.join)(configDir, ".env.example");
|
|
94
|
+
if ((0, node_fs.existsSync)(envPath) || !(0, node_fs.existsSync)(examplePath)) return false;
|
|
95
|
+
const lines = (0, node_fs.readFileSync)(examplePath, "utf-8").split("\n");
|
|
96
|
+
const secret = (0, node_crypto.randomBytes)(32).toString("base64url");
|
|
97
|
+
const updated = lines.map((line) => {
|
|
98
|
+
if (line.startsWith("BETTER_AUTH_SECRET=")) return `BETTER_AUTH_SECRET=${secret}`;
|
|
99
|
+
return line;
|
|
100
|
+
}).join("\n");
|
|
101
|
+
(0, node_fs.writeFileSync)(envPath, updated);
|
|
102
|
+
_clack_prompts.log.info("Created .env from generated .env.example with generated BETTER_AUTH_SECRET");
|
|
103
|
+
return true;
|
|
104
|
+
},
|
|
105
|
+
catch: (cause) => new EnvEnsureError({ cause })
|
|
106
|
+
}),
|
|
107
|
+
load: (configDir, options) => effect.Effect.gen(function* () {
|
|
108
|
+
if (!options?.force && loadedDirs.has(configDir)) return;
|
|
109
|
+
const envPath = (0, node_path.join)(configDir, ".env");
|
|
110
|
+
if (!(0, node_fs.existsSync)(envPath)) return;
|
|
111
|
+
yield* effect.Effect.try({
|
|
112
|
+
try: () => (0, dotenv.config)({
|
|
113
|
+
path: envPath,
|
|
114
|
+
processEnv: node_process.default.env,
|
|
115
|
+
quiet: true
|
|
116
|
+
}),
|
|
117
|
+
catch: (cause) => new EnvLoadError({ cause })
|
|
118
|
+
});
|
|
119
|
+
loadedDirs.add(configDir);
|
|
120
|
+
}),
|
|
121
|
+
sync: (configDir, generated, shellEnv) => syncEnvFile(configDir, generated, shellEnv)
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* One `ProjectEnv` implementation, installed in two scopes: the CLI provides
|
|
126
|
+
* `ProjectEnvLive` from `bootstrapLayers`, and the plugin runtime installs the
|
|
127
|
+
* same layer with `buildScoped` so it finalizes with the plugin. `makeProjectEnv`
|
|
128
|
+
* is that implementation; command and test callers that need a single shot use
|
|
129
|
+
* the factory and do not register another service.
|
|
130
|
+
*/
|
|
131
|
+
const ProjectEnvLive = effect.Layer.sync(ProjectEnv, () => makeProjectEnv());
|
|
132
|
+
|
|
133
|
+
//#endregion
|
|
134
|
+
exports.EnvEnsureError = EnvEnsureError;
|
|
135
|
+
exports.EnvLoadError = EnvLoadError;
|
|
136
|
+
exports.EnvSyncError = EnvSyncError;
|
|
137
|
+
exports.ProjectEnv = ProjectEnv;
|
|
138
|
+
exports.ProjectEnvLive = ProjectEnvLive;
|
|
139
|
+
exports.ShellEnv = ShellEnv;
|
|
140
|
+
exports.ShellEnvLive = ShellEnvLive;
|
|
141
|
+
exports.captureShellEnv = captureShellEnv;
|
|
142
|
+
exports.makeProjectEnv = makeProjectEnv;
|
|
143
|
+
exports.syncEnvFile = syncEnvFile;
|
|
144
|
+
//# sourceMappingURL=project-env.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-env.cjs","names":["Data","Context","Effect","process","Layer","join","existsSync","readFileSync","writeFileSync","randomBytes","loadDotenv"],"sources":["../../src/env/project-env.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport { config as loadDotenv } from \"dotenv\";\nimport { Context, Data, Effect, Layer } from \"effect\";\n\nexport class EnvEnsureError extends Data.TaggedError(\"EnvEnsureError\")<{ cause: unknown }> {}\n\nexport class EnvLoadError extends Data.TaggedError(\"EnvLoadError\")<{ cause: unknown }> {}\n\nexport interface EnvDrift {\n key: string;\n from: string | undefined;\n to: string;\n}\n\nexport class EnvSyncError extends Data.TaggedError(\"EnvSyncError\")<{ cause: unknown }> {}\n\n/**\n * The process environment as exported by the parent shell. Values present\n * here were explicitly provided by the caller (shell, CI, the regression\n * harness) and therefore outrank planner-generated values; values that only\n * exist after `.env` loading do not. The bootstrap program captures this\n * snapshot as its first step — before any `.env` loading — and provides it\n * to the rest of the program as a service.\n */\nexport class ShellEnv extends Context.Service<ShellEnv, Record<string, string>>()(\n \"everything-dev/ShellEnv\",\n) {}\n\nexport const captureShellEnv: Effect.Effect<Record<string, string>> = Effect.sync(() =>\n Object.fromEntries(\n Object.entries(process.env).filter((entry): entry is [string, string] => entry[1] != null),\n ),\n);\n\nexport const ShellEnvLive = (env: Record<string, string>) => Layer.succeed(ShellEnv, env);\n\n/**\n * Align the bos-owned lines of `.env` with the generated infra env\n * (ports/secrets derived from the resolved dev topology). Keys the caller\n * explicitly exported (`shellEnv`) are skipped — a deliberate override must\n * not be silently reverted on disk. Lines the user added outside the\n * generated key set are untouched. Idempotent.\n */\nconst GENERATED_OWNED_KEYS = new Set([\"BASE_URL\", \"CORS_ORIGIN\"]);\n\nconst maskValue = (key: string, value: string | undefined): string => {\n if (value === undefined) return \"(absent)\";\n if (/_DATABASE_URL$|_REDIS_URL$|_SECRET$|_KEY$/.test(key)) {\n return value.replace(/\\/\\/([^:/@]+):([^@]+)@/, \"//***:***@\");\n }\n return value;\n};\n\nexport const syncEnvFile = (\n configDir: string,\n generated: Record<string, string>,\n shellEnv: Record<string, string> = {},\n): Effect.Effect<EnvDrift[], EnvSyncError> =>\n Effect.gen(function* () {\n if (Object.keys(generated).length === 0) return [];\n\n const envPath = join(configDir, \".env\");\n if (!existsSync(envPath)) return [];\n\n const lines = yield* Effect.try({\n try: () => readFileSync(envPath, \"utf-8\").split(\"\\n\"),\n catch: (cause) => new EnvSyncError({ cause }),\n });\n\n const drift: EnvDrift[] = [];\n const seen = new Set<string>();\n const keyOf = (line: string): string | null => {\n const match = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/.exec(line);\n return match?.[1] ?? null;\n };\n\n const updated = lines.map((line) => {\n const key = keyOf(line);\n if (!key || !(key in generated)) return line;\n const shellOwned = key in shellEnv && !GENERATED_OWNED_KEYS.has(key);\n if (shellOwned) return line;\n seen.add(key);\n const value = line.slice(key.length + 1);\n if (value === generated[key]) return line;\n drift.push({ key, from: value, to: generated[key] });\n return `${key}=${generated[key]}`;\n });\n\n for (const [key, value] of Object.entries(generated)) {\n if (seen.has(key)) continue;\n const shellOwned = key in shellEnv && !GENERATED_OWNED_KEYS.has(key);\n if (shellOwned) continue;\n drift.push({ key, from: undefined, to: value });\n updated.push(`${key}=${value}`);\n }\n\n if (drift.length > 0) {\n yield* Effect.try({\n try: () => writeFileSync(envPath, updated.join(\"\\n\")),\n catch: (cause) => new EnvSyncError({ cause }),\n });\n for (const { key, from, to } of drift) {\n yield* Effect.logInfo(\n `[env] ${key} updated: ${maskValue(key, from)} → ${maskValue(key, to)} (generated from resolved ports)`,\n );\n }\n }\n return drift;\n });\n\nexport interface ProjectEnvService {\n readonly ensureFile: (configDir: string) => Effect.Effect<boolean, EnvEnsureError>;\n readonly load: (\n configDir: string,\n options?: { force?: boolean },\n ) => Effect.Effect<void, EnvLoadError>;\n readonly sync: (\n configDir: string,\n generated: Record<string, string>,\n shellEnv: Record<string, string>,\n ) => Effect.Effect<EnvDrift[], EnvSyncError>;\n}\n\nexport class ProjectEnv extends Context.Service<ProjectEnv, ProjectEnvService>()(\n \"everything-dev/ProjectEnv\",\n) {}\n\nexport const makeProjectEnv = (): ProjectEnvService => {\n const loadedDirs = new Set<string>();\n return {\n ensureFile: (configDir) =>\n Effect.try({\n try: () => {\n const envPath = join(configDir, \".env\");\n const examplePath = join(configDir, \".env.example\");\n if (existsSync(envPath) || !existsSync(examplePath)) return false;\n\n const content = readFileSync(examplePath, \"utf-8\");\n const lines = content.split(\"\\n\");\n const secret = randomBytes(32).toString(\"base64url\");\n const updated = lines\n .map((line) => {\n if (line.startsWith(\"BETTER_AUTH_SECRET=\")) {\n return `BETTER_AUTH_SECRET=${secret}`;\n }\n return line;\n })\n .join(\"\\n\");\n\n writeFileSync(envPath, updated);\n p.log.info(\"Created .env from generated .env.example with generated BETTER_AUTH_SECRET\");\n return true;\n },\n catch: (cause) => new EnvEnsureError({ cause }),\n }),\n load: (configDir, options) =>\n Effect.gen(function* () {\n if (!options?.force && loadedDirs.has(configDir)) return;\n const envPath = join(configDir, \".env\");\n if (!existsSync(envPath)) return;\n\n yield* Effect.try({\n try: () => loadDotenv({ path: envPath, processEnv: process.env, quiet: true }),\n catch: (cause) => new EnvLoadError({ cause }),\n });\n loadedDirs.add(configDir);\n }),\n sync: (configDir, generated, shellEnv) => syncEnvFile(configDir, generated, shellEnv),\n };\n};\n\n/**\n * One `ProjectEnv` implementation, installed in two scopes: the CLI provides\n * `ProjectEnvLive` from `bootstrapLayers`, and the plugin runtime installs the\n * same layer with `buildScoped` so it finalizes with the plugin. `makeProjectEnv`\n * is that implementation; command and test callers that need a single shot use\n * the factory and do not register another service.\n */\nexport const ProjectEnvLive: Layer.Layer<ProjectEnv> = Layer.sync(ProjectEnv, () =>\n makeProjectEnv(),\n);\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { Context, Data, Effect, Layer } from "effect";
|
|
4
|
+
import { randomBytes } from "node:crypto";
|
|
5
|
+
import process from "node:process";
|
|
6
|
+
import { config } from "dotenv";
|
|
7
|
+
import * as p from "@clack/prompts";
|
|
8
|
+
|
|
9
|
+
//#region src/env/project-env.ts
|
|
10
|
+
var EnvEnsureError = class extends Data.TaggedError("EnvEnsureError") {};
|
|
11
|
+
var EnvLoadError = class extends Data.TaggedError("EnvLoadError") {};
|
|
12
|
+
var EnvSyncError = class extends Data.TaggedError("EnvSyncError") {};
|
|
13
|
+
/**
|
|
14
|
+
* The process environment as exported by the parent shell. Values present
|
|
15
|
+
* here were explicitly provided by the caller (shell, CI, the regression
|
|
16
|
+
* harness) and therefore outrank planner-generated values; values that only
|
|
17
|
+
* exist after `.env` loading do not. The bootstrap program captures this
|
|
18
|
+
* snapshot as its first step — before any `.env` loading — and provides it
|
|
19
|
+
* to the rest of the program as a service.
|
|
20
|
+
*/
|
|
21
|
+
var ShellEnv = class extends Context.Service()("everything-dev/ShellEnv") {};
|
|
22
|
+
const captureShellEnv = Effect.sync(() => Object.fromEntries(Object.entries(process.env).filter((entry) => entry[1] != null)));
|
|
23
|
+
const ShellEnvLive = (env) => Layer.succeed(ShellEnv, env);
|
|
24
|
+
/**
|
|
25
|
+
* Align the bos-owned lines of `.env` with the generated infra env
|
|
26
|
+
* (ports/secrets derived from the resolved dev topology). Keys the caller
|
|
27
|
+
* explicitly exported (`shellEnv`) are skipped — a deliberate override must
|
|
28
|
+
* not be silently reverted on disk. Lines the user added outside the
|
|
29
|
+
* generated key set are untouched. Idempotent.
|
|
30
|
+
*/
|
|
31
|
+
const GENERATED_OWNED_KEYS = /* @__PURE__ */ new Set(["BASE_URL", "CORS_ORIGIN"]);
|
|
32
|
+
const maskValue = (key, value) => {
|
|
33
|
+
if (value === void 0) return "(absent)";
|
|
34
|
+
if (/_DATABASE_URL$|_REDIS_URL$|_SECRET$|_KEY$/.test(key)) return value.replace(/\/\/([^:/@]+):([^@]+)@/, "//***:***@");
|
|
35
|
+
return value;
|
|
36
|
+
};
|
|
37
|
+
const syncEnvFile = (configDir, generated, shellEnv = {}) => Effect.gen(function* () {
|
|
38
|
+
if (Object.keys(generated).length === 0) return [];
|
|
39
|
+
const envPath = join(configDir, ".env");
|
|
40
|
+
if (!existsSync(envPath)) return [];
|
|
41
|
+
const lines = yield* Effect.try({
|
|
42
|
+
try: () => readFileSync(envPath, "utf-8").split("\n"),
|
|
43
|
+
catch: (cause) => new EnvSyncError({ cause })
|
|
44
|
+
});
|
|
45
|
+
const drift = [];
|
|
46
|
+
const seen = /* @__PURE__ */ new Set();
|
|
47
|
+
const keyOf = (line) => {
|
|
48
|
+
return /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/.exec(line)?.[1] ?? null;
|
|
49
|
+
};
|
|
50
|
+
const updated = lines.map((line) => {
|
|
51
|
+
const key = keyOf(line);
|
|
52
|
+
if (!key || !(key in generated)) return line;
|
|
53
|
+
if (key in shellEnv && !GENERATED_OWNED_KEYS.has(key)) return line;
|
|
54
|
+
seen.add(key);
|
|
55
|
+
const value = line.slice(key.length + 1);
|
|
56
|
+
if (value === generated[key]) return line;
|
|
57
|
+
drift.push({
|
|
58
|
+
key,
|
|
59
|
+
from: value,
|
|
60
|
+
to: generated[key]
|
|
61
|
+
});
|
|
62
|
+
return `${key}=${generated[key]}`;
|
|
63
|
+
});
|
|
64
|
+
for (const [key, value] of Object.entries(generated)) {
|
|
65
|
+
if (seen.has(key)) continue;
|
|
66
|
+
if (key in shellEnv && !GENERATED_OWNED_KEYS.has(key)) continue;
|
|
67
|
+
drift.push({
|
|
68
|
+
key,
|
|
69
|
+
from: void 0,
|
|
70
|
+
to: value
|
|
71
|
+
});
|
|
72
|
+
updated.push(`${key}=${value}`);
|
|
73
|
+
}
|
|
74
|
+
if (drift.length > 0) {
|
|
75
|
+
yield* Effect.try({
|
|
76
|
+
try: () => writeFileSync(envPath, updated.join("\n")),
|
|
77
|
+
catch: (cause) => new EnvSyncError({ cause })
|
|
78
|
+
});
|
|
79
|
+
for (const { key, from, to } of drift) yield* Effect.logInfo(`[env] ${key} updated: ${maskValue(key, from)} → ${maskValue(key, to)} (generated from resolved ports)`);
|
|
80
|
+
}
|
|
81
|
+
return drift;
|
|
82
|
+
});
|
|
83
|
+
var ProjectEnv = class extends Context.Service()("everything-dev/ProjectEnv") {};
|
|
84
|
+
const makeProjectEnv = () => {
|
|
85
|
+
const loadedDirs = /* @__PURE__ */ new Set();
|
|
86
|
+
return {
|
|
87
|
+
ensureFile: (configDir) => Effect.try({
|
|
88
|
+
try: () => {
|
|
89
|
+
const envPath = join(configDir, ".env");
|
|
90
|
+
const examplePath = join(configDir, ".env.example");
|
|
91
|
+
if (existsSync(envPath) || !existsSync(examplePath)) return false;
|
|
92
|
+
const lines = readFileSync(examplePath, "utf-8").split("\n");
|
|
93
|
+
const secret = randomBytes(32).toString("base64url");
|
|
94
|
+
const updated = lines.map((line) => {
|
|
95
|
+
if (line.startsWith("BETTER_AUTH_SECRET=")) return `BETTER_AUTH_SECRET=${secret}`;
|
|
96
|
+
return line;
|
|
97
|
+
}).join("\n");
|
|
98
|
+
writeFileSync(envPath, updated);
|
|
99
|
+
p.log.info("Created .env from generated .env.example with generated BETTER_AUTH_SECRET");
|
|
100
|
+
return true;
|
|
101
|
+
},
|
|
102
|
+
catch: (cause) => new EnvEnsureError({ cause })
|
|
103
|
+
}),
|
|
104
|
+
load: (configDir, options) => Effect.gen(function* () {
|
|
105
|
+
if (!options?.force && loadedDirs.has(configDir)) return;
|
|
106
|
+
const envPath = join(configDir, ".env");
|
|
107
|
+
if (!existsSync(envPath)) return;
|
|
108
|
+
yield* Effect.try({
|
|
109
|
+
try: () => config({
|
|
110
|
+
path: envPath,
|
|
111
|
+
processEnv: process.env,
|
|
112
|
+
quiet: true
|
|
113
|
+
}),
|
|
114
|
+
catch: (cause) => new EnvLoadError({ cause })
|
|
115
|
+
});
|
|
116
|
+
loadedDirs.add(configDir);
|
|
117
|
+
}),
|
|
118
|
+
sync: (configDir, generated, shellEnv) => syncEnvFile(configDir, generated, shellEnv)
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* One `ProjectEnv` implementation, installed in two scopes: the CLI provides
|
|
123
|
+
* `ProjectEnvLive` from `bootstrapLayers`, and the plugin runtime installs the
|
|
124
|
+
* same layer with `buildScoped` so it finalizes with the plugin. `makeProjectEnv`
|
|
125
|
+
* is that implementation; command and test callers that need a single shot use
|
|
126
|
+
* the factory and do not register another service.
|
|
127
|
+
*/
|
|
128
|
+
const ProjectEnvLive = Layer.sync(ProjectEnv, () => makeProjectEnv());
|
|
129
|
+
|
|
130
|
+
//#endregion
|
|
131
|
+
export { EnvEnsureError, EnvLoadError, EnvSyncError, ProjectEnv, ProjectEnvLive, ShellEnv, ShellEnvLive, captureShellEnv, makeProjectEnv, syncEnvFile };
|
|
132
|
+
//# sourceMappingURL=project-env.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-env.mjs","names":["loadDotenv"],"sources":["../../src/env/project-env.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport * as p from \"@clack/prompts\";\nimport { config as loadDotenv } from \"dotenv\";\nimport { Context, Data, Effect, Layer } from \"effect\";\n\nexport class EnvEnsureError extends Data.TaggedError(\"EnvEnsureError\")<{ cause: unknown }> {}\n\nexport class EnvLoadError extends Data.TaggedError(\"EnvLoadError\")<{ cause: unknown }> {}\n\nexport interface EnvDrift {\n key: string;\n from: string | undefined;\n to: string;\n}\n\nexport class EnvSyncError extends Data.TaggedError(\"EnvSyncError\")<{ cause: unknown }> {}\n\n/**\n * The process environment as exported by the parent shell. Values present\n * here were explicitly provided by the caller (shell, CI, the regression\n * harness) and therefore outrank planner-generated values; values that only\n * exist after `.env` loading do not. The bootstrap program captures this\n * snapshot as its first step — before any `.env` loading — and provides it\n * to the rest of the program as a service.\n */\nexport class ShellEnv extends Context.Service<ShellEnv, Record<string, string>>()(\n \"everything-dev/ShellEnv\",\n) {}\n\nexport const captureShellEnv: Effect.Effect<Record<string, string>> = Effect.sync(() =>\n Object.fromEntries(\n Object.entries(process.env).filter((entry): entry is [string, string] => entry[1] != null),\n ),\n);\n\nexport const ShellEnvLive = (env: Record<string, string>) => Layer.succeed(ShellEnv, env);\n\n/**\n * Align the bos-owned lines of `.env` with the generated infra env\n * (ports/secrets derived from the resolved dev topology). Keys the caller\n * explicitly exported (`shellEnv`) are skipped — a deliberate override must\n * not be silently reverted on disk. Lines the user added outside the\n * generated key set are untouched. Idempotent.\n */\nconst GENERATED_OWNED_KEYS = new Set([\"BASE_URL\", \"CORS_ORIGIN\"]);\n\nconst maskValue = (key: string, value: string | undefined): string => {\n if (value === undefined) return \"(absent)\";\n if (/_DATABASE_URL$|_REDIS_URL$|_SECRET$|_KEY$/.test(key)) {\n return value.replace(/\\/\\/([^:/@]+):([^@]+)@/, \"//***:***@\");\n }\n return value;\n};\n\nexport const syncEnvFile = (\n configDir: string,\n generated: Record<string, string>,\n shellEnv: Record<string, string> = {},\n): Effect.Effect<EnvDrift[], EnvSyncError> =>\n Effect.gen(function* () {\n if (Object.keys(generated).length === 0) return [];\n\n const envPath = join(configDir, \".env\");\n if (!existsSync(envPath)) return [];\n\n const lines = yield* Effect.try({\n try: () => readFileSync(envPath, \"utf-8\").split(\"\\n\"),\n catch: (cause) => new EnvSyncError({ cause }),\n });\n\n const drift: EnvDrift[] = [];\n const seen = new Set<string>();\n const keyOf = (line: string): string | null => {\n const match = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/.exec(line);\n return match?.[1] ?? null;\n };\n\n const updated = lines.map((line) => {\n const key = keyOf(line);\n if (!key || !(key in generated)) return line;\n const shellOwned = key in shellEnv && !GENERATED_OWNED_KEYS.has(key);\n if (shellOwned) return line;\n seen.add(key);\n const value = line.slice(key.length + 1);\n if (value === generated[key]) return line;\n drift.push({ key, from: value, to: generated[key] });\n return `${key}=${generated[key]}`;\n });\n\n for (const [key, value] of Object.entries(generated)) {\n if (seen.has(key)) continue;\n const shellOwned = key in shellEnv && !GENERATED_OWNED_KEYS.has(key);\n if (shellOwned) continue;\n drift.push({ key, from: undefined, to: value });\n updated.push(`${key}=${value}`);\n }\n\n if (drift.length > 0) {\n yield* Effect.try({\n try: () => writeFileSync(envPath, updated.join(\"\\n\")),\n catch: (cause) => new EnvSyncError({ cause }),\n });\n for (const { key, from, to } of drift) {\n yield* Effect.logInfo(\n `[env] ${key} updated: ${maskValue(key, from)} → ${maskValue(key, to)} (generated from resolved ports)`,\n );\n }\n }\n return drift;\n });\n\nexport interface ProjectEnvService {\n readonly ensureFile: (configDir: string) => Effect.Effect<boolean, EnvEnsureError>;\n readonly load: (\n configDir: string,\n options?: { force?: boolean },\n ) => Effect.Effect<void, EnvLoadError>;\n readonly sync: (\n configDir: string,\n generated: Record<string, string>,\n shellEnv: Record<string, string>,\n ) => Effect.Effect<EnvDrift[], EnvSyncError>;\n}\n\nexport class ProjectEnv extends Context.Service<ProjectEnv, ProjectEnvService>()(\n \"everything-dev/ProjectEnv\",\n) {}\n\nexport const makeProjectEnv = (): ProjectEnvService => {\n const loadedDirs = new Set<string>();\n return {\n ensureFile: (configDir) =>\n Effect.try({\n try: () => {\n const envPath = join(configDir, \".env\");\n const examplePath = join(configDir, \".env.example\");\n if (existsSync(envPath) || !existsSync(examplePath)) return false;\n\n const content = readFileSync(examplePath, \"utf-8\");\n const lines = content.split(\"\\n\");\n const secret = randomBytes(32).toString(\"base64url\");\n const updated = lines\n .map((line) => {\n if (line.startsWith(\"BETTER_AUTH_SECRET=\")) {\n return `BETTER_AUTH_SECRET=${secret}`;\n }\n return line;\n })\n .join(\"\\n\");\n\n writeFileSync(envPath, updated);\n p.log.info(\"Created .env from generated .env.example with generated BETTER_AUTH_SECRET\");\n return true;\n },\n catch: (cause) => new EnvEnsureError({ cause }),\n }),\n load: (configDir, options) =>\n Effect.gen(function* () {\n if (!options?.force && loadedDirs.has(configDir)) return;\n const envPath = join(configDir, \".env\");\n if (!existsSync(envPath)) return;\n\n yield* Effect.try({\n try: () => loadDotenv({ path: envPath, processEnv: process.env, quiet: true }),\n catch: (cause) => new EnvLoadError({ cause }),\n });\n loadedDirs.add(configDir);\n }),\n sync: (configDir, generated, shellEnv) => syncEnvFile(configDir, generated, shellEnv),\n };\n};\n\n/**\n * One `ProjectEnv` implementation, installed in two scopes: the CLI provides\n * `ProjectEnvLive` from `bootstrapLayers`, and the plugin runtime installs the\n * same layer with `buildScoped` so it finalizes with the plugin. `makeProjectEnv`\n * is that implementation; command and test callers that need a single shot use\n * the factory and do not register another service.\n */\nexport const ProjectEnvLive: Layer.Layer<ProjectEnv> = Layer.sync(ProjectEnv, () =>\n makeProjectEnv(),\n);\n"],"mappings":"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"}
|
package/dist/fastkv.cjs
CHANGED
|
@@ -5,29 +5,34 @@ const require_http_client = require('./http-client.cjs');
|
|
|
5
5
|
function getNetworkIdForAccount(accountId) {
|
|
6
6
|
return accountId.endsWith(".testnet") ? "testnet" : "mainnet";
|
|
7
7
|
}
|
|
8
|
+
const FASTKV_TESTNET_URL = "https://kv.test.fastnear.com";
|
|
9
|
+
const FASTKV_MAINNET_URL = "https://kv.main.fastnear.com";
|
|
10
|
+
const REGISTRY_NAMESPACE_TESTNET = "dev.allthethings.testnet";
|
|
11
|
+
const REGISTRY_NAMESPACE_MAINNET = "dev.everything.near";
|
|
8
12
|
function getFastKvBaseUrlForNetwork(network) {
|
|
9
|
-
return network === "testnet" ?
|
|
13
|
+
return network === "testnet" ? FASTKV_TESTNET_URL : FASTKV_MAINNET_URL;
|
|
10
14
|
}
|
|
11
15
|
function getFastKvBaseUrlForAccount(accountId) {
|
|
12
16
|
return getNetworkIdForAccount(accountId) === "testnet" ? getFastKvBaseUrlForNetwork("testnet") : getFastKvBaseUrlForNetwork("mainnet");
|
|
13
17
|
}
|
|
14
|
-
function buildRegistryConfigUrl(accountId, gatewayId) {
|
|
18
|
+
function buildRegistryConfigUrl(accountId, gatewayId, registry) {
|
|
15
19
|
const baseUrl = getFastKvBaseUrlForAccount(accountId);
|
|
16
|
-
const namespace = getRegistryNamespaceForAccount(accountId);
|
|
20
|
+
const namespace = getRegistryNamespaceForAccount(accountId, registry);
|
|
17
21
|
const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));
|
|
18
22
|
return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;
|
|
19
23
|
}
|
|
20
|
-
function buildRegistryConfigUrlForNetwork(network, accountId, gatewayId) {
|
|
24
|
+
function buildRegistryConfigUrlForNetwork(network, accountId, gatewayId, registry) {
|
|
21
25
|
const baseUrl = getFastKvBaseUrlForNetwork(network);
|
|
22
|
-
const namespace = getRegistryNamespaceForNetwork(network);
|
|
26
|
+
const namespace = getRegistryNamespaceForNetwork(network, registry);
|
|
23
27
|
const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));
|
|
24
28
|
return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;
|
|
25
29
|
}
|
|
26
|
-
function getRegistryNamespaceForAccount(accountId) {
|
|
27
|
-
return accountId
|
|
30
|
+
function getRegistryNamespaceForAccount(accountId, registry) {
|
|
31
|
+
return registry ?? getRegistryNamespaceForNetwork(getNetworkIdForAccount(accountId));
|
|
28
32
|
}
|
|
29
|
-
function getRegistryNamespaceForNetwork(network) {
|
|
30
|
-
|
|
33
|
+
function getRegistryNamespaceForNetwork(network, registry) {
|
|
34
|
+
if (registry) return registry;
|
|
35
|
+
return network === "testnet" ? REGISTRY_NAMESPACE_TESTNET : REGISTRY_NAMESPACE_MAINNET;
|
|
31
36
|
}
|
|
32
37
|
function getRegistryConfigKey(accountId, gatewayId, pathSegments = []) {
|
|
33
38
|
return `apps/${accountId}/${gatewayId}${pathSegments.length > 0 ? `/${pathSegments.map((segment) => encodeURIComponent(segment)).join("/")}` : ""}/bos.config.json`;
|
|
@@ -45,17 +50,57 @@ function parseBosUrl(bosUrl) {
|
|
|
45
50
|
pathSegments: pathSegmentsTail
|
|
46
51
|
};
|
|
47
52
|
}
|
|
48
|
-
async function fetchBosConfigFromFastKv(bosUrl) {
|
|
53
|
+
async function fetchBosConfigFromFastKv(bosUrl, registry) {
|
|
49
54
|
const { accountId, gatewayId, pathSegments } = parseBosUrl(bosUrl);
|
|
50
55
|
const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId, pathSegments));
|
|
51
|
-
const value = (await fetchJson(`${getFastKvBaseUrlForAccount(accountId)}/v0/latest/${encodeURIComponent(getRegistryNamespaceForAccount(accountId))}/${encodeURIComponent(accountId)}/${key}`))?.entries?.find(Boolean)?.value;
|
|
56
|
+
const value = (await fetchJson(`${getFastKvBaseUrlForAccount(accountId)}/v0/latest/${encodeURIComponent(getRegistryNamespaceForAccount(accountId, registry))}/${encodeURIComponent(accountId)}/${key}`))?.entries?.find(Boolean)?.value;
|
|
52
57
|
if (!value) throw new Error(`No config found for ${bosUrl}`);
|
|
53
58
|
if (typeof value === "string") return JSON.parse(value);
|
|
54
59
|
if (typeof value !== "object") throw new Error(`Invalid config value for ${bosUrl}`);
|
|
55
60
|
return value;
|
|
56
61
|
}
|
|
62
|
+
const FASTKV_HISTORY_MAX_LIMIT = 200;
|
|
63
|
+
/**
|
|
64
|
+
* Publish history for the registry config key (atomic-deploys 11): the
|
|
65
|
+
* exact-key variant of FastData's history endpoint, newest-first. The API
|
|
66
|
+
* caps a page at 200 rows; a config key's write history fits well inside
|
|
67
|
+
* that, so a single request is the whole story (the limit param is clamped).
|
|
68
|
+
*/
|
|
69
|
+
async function fetchConfigHistory(opts) {
|
|
70
|
+
const key = encodeURIComponent(getRegistryConfigKey(opts.accountId, opts.gatewayId));
|
|
71
|
+
const limit = Math.max(1, Math.min(opts.limit ?? 20, FASTKV_HISTORY_MAX_LIMIT));
|
|
72
|
+
return ((await fetchJson(`${getFastKvBaseUrlForAccount(opts.accountId)}/v0/history/${encodeURIComponent(getRegistryNamespaceForAccount(opts.accountId, opts.registry))}/${encodeURIComponent(opts.accountId)}/${key}?limit=${limit}`))?.entries ?? []).filter(Boolean).map((entry) => ({
|
|
73
|
+
blockHeight: entry.block_height ?? 0,
|
|
74
|
+
blockTimestampNs: String(entry.block_timestamp ?? ""),
|
|
75
|
+
...entry.tx_hash ? { txHash: entry.tx_hash } : {},
|
|
76
|
+
value: typeof entry.value === "string" && entry.value.length > 0 ? JSON.parse(entry.value) : entry.value
|
|
77
|
+
})).sort((a, b) => b.blockHeight - a.blockHeight);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The per-deploy audit trail (atomic-deploys 03/12): every publish writes
|
|
81
|
+
* `apps/<account>/<gateway>/manifests/<ts>.json` atomically with the pointer
|
|
82
|
+
* swap — this lists that key family newest-first via the history-by-prefix
|
|
83
|
+
* endpoint.
|
|
84
|
+
*/
|
|
85
|
+
async function fetchDeployManifests(opts) {
|
|
86
|
+
const keyPrefix = encodeURIComponent(`${getRegistryConfigKey(opts.accountId, opts.gatewayId).replace(/bos\.config\.json$/, "")}manifests/`);
|
|
87
|
+
return ((await fetchJson(`${getFastKvBaseUrlForAccount(opts.accountId)}/v0/history/${encodeURIComponent(getRegistryNamespaceForAccount(opts.accountId, opts.registry))}/${encodeURIComponent(opts.accountId)}`, {
|
|
88
|
+
method: "POST",
|
|
89
|
+
body: JSON.stringify({
|
|
90
|
+
key_prefix: decodeURIComponent(keyPrefix),
|
|
91
|
+
asc: false,
|
|
92
|
+
limit: Math.max(1, Math.min(opts.limit ?? 20, FASTKV_HISTORY_MAX_LIMIT))
|
|
93
|
+
})
|
|
94
|
+
}))?.entries ?? []).filter(Boolean).map((entry) => ({
|
|
95
|
+
key: entry.key ?? "",
|
|
96
|
+
blockHeight: entry.block_height ?? 0,
|
|
97
|
+
blockTimestampNs: String(entry.block_timestamp ?? ""),
|
|
98
|
+
value: typeof entry.value === "string" && entry.value.length > 0 ? JSON.parse(entry.value) : entry.value
|
|
99
|
+
})).sort((a, b) => b.blockHeight - a.blockHeight);
|
|
100
|
+
}
|
|
57
101
|
async function fetchRemotePluginManifest(cdnUrl) {
|
|
58
|
-
|
|
102
|
+
const baseUrl = cdnUrl.replace(/\/$/, "");
|
|
103
|
+
return require_http_client.fetchJsonOrNull(`${baseUrl}/plugin.manifest.json`, { retries: 2 });
|
|
59
104
|
}
|
|
60
105
|
async function fetchJson(url, init) {
|
|
61
106
|
const headers = {
|
|
@@ -75,6 +120,8 @@ async function fetchJson(url, init) {
|
|
|
75
120
|
exports.buildRegistryConfigUrl = buildRegistryConfigUrl;
|
|
76
121
|
exports.buildRegistryConfigUrlForNetwork = buildRegistryConfigUrlForNetwork;
|
|
77
122
|
exports.fetchBosConfigFromFastKv = fetchBosConfigFromFastKv;
|
|
123
|
+
exports.fetchConfigHistory = fetchConfigHistory;
|
|
124
|
+
exports.fetchDeployManifests = fetchDeployManifests;
|
|
78
125
|
exports.fetchRemotePluginManifest = fetchRemotePluginManifest;
|
|
79
126
|
exports.getFastKvBaseUrlForNetwork = getFastKvBaseUrlForNetwork;
|
|
80
127
|
exports.getRegistryNamespaceForAccount = getRegistryNamespaceForAccount;
|
package/dist/fastkv.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastkv.cjs","names":["fetchJsonOrNull"],"sources":["../src/fastkv.ts"],"sourcesContent":["export type NetworkId = \"mainnet\" | \"testnet\";\n\ninterface FastKvEntry {\n value: unknown;\n}\n\ninterface FastKvListResponse {\n entries?: Array<FastKvEntry | null>;\n}\n\nimport { fetchJsonOrNull } from \"./http-client\";\n\nfunction getNetworkIdForAccount(accountId: string): NetworkId {\n return accountId.endsWith(\".testnet\") ? \"testnet\" : \"mainnet\";\n}\n\nexport function getFastKvBaseUrlForNetwork(network: NetworkId): string {\n return network === \"testnet\"\n ? process.env.REGISTRY_FASTKV_TESTNET_URL || \"https://kv.test.fastnear.com\"\n : process.env.REGISTRY_FASTKV_MAINNET_URL || \"https://kv.main.fastnear.com\";\n}\n\nfunction getFastKvBaseUrlForAccount(accountId: string): string {\n return getNetworkIdForAccount(accountId) === \"testnet\"\n ? getFastKvBaseUrlForNetwork(\"testnet\")\n : getFastKvBaseUrlForNetwork(\"mainnet\");\n}\n\nexport function buildRegistryConfigUrl(accountId: string, gatewayId: string): string {\n const baseUrl = getFastKvBaseUrlForAccount(accountId);\n const namespace = getRegistryNamespaceForAccount(accountId);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));\n return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;\n}\n\nexport function buildRegistryConfigUrlForNetwork(\n network: NetworkId,\n accountId: string,\n gatewayId: string,\n): string {\n const baseUrl = getFastKvBaseUrlForNetwork(network);\n const namespace = getRegistryNamespaceForNetwork(network);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));\n return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;\n}\n\nexport function getRegistryNamespaceForAccount(accountId: string): string {\n return accountId.endsWith(\".testnet\")\n ? process.env.REGISTRY_FASTKV_TESTNET_NAMESPACE || \"dev.everything.near\"\n : process.env.REGISTRY_FASTKV_MAINNET_NAMESPACE || \"dev.everything.near\";\n}\n\nexport function getRegistryNamespaceForNetwork(network: NetworkId): string {\n return network === \"testnet\"\n ? process.env.REGISTRY_FASTKV_TESTNET_NAMESPACE || \"dev.everything.near\"\n : process.env.REGISTRY_FASTKV_MAINNET_NAMESPACE || \"dev.everything.near\";\n}\n\nfunction getRegistryConfigKey(\n accountId: string,\n gatewayId: string,\n pathSegments: string[] = [],\n): string {\n const suffix =\n pathSegments.length > 0\n ? `/${pathSegments.map((segment) => encodeURIComponent(segment)).join(\"/\")}`\n : \"\";\n return `apps/${accountId}/${gatewayId}${suffix}/bos.config.json`;\n}\n\nexport function parseBosUrl(bosUrl: string): {\n accountId: string;\n gatewayId: string;\n pathSegments: string[];\n} {\n const strippedUrl = bosUrl.split(\"#\")[0];\n const match = strippedUrl.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n if (!match?.[1] || !match[2]) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n const pathSegments = match[2]\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => decodeURIComponent(segment));\n if (pathSegments.length === 0) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n const [gatewayId, ...pathSegmentsTail] = pathSegments;\n if (!gatewayId) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n return {\n accountId: match[1],\n gatewayId,\n pathSegments: pathSegmentsTail,\n };\n}\n\nexport async function fetchBosConfigFromFastKv<T>(bosUrl: string): Promise<T> {\n const { accountId, gatewayId, pathSegments } = parseBosUrl(bosUrl);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId, pathSegments));\n const payload = await fetchJson<FastKvListResponse>(\n `${getFastKvBaseUrlForAccount(accountId)}/v0/latest/${encodeURIComponent(getRegistryNamespaceForAccount(accountId))}/${encodeURIComponent(accountId)}/${key}`,\n );\n const value = payload?.entries?.find(Boolean)?.value;\n\n if (!value) {\n throw new Error(`No config found for ${bosUrl}`);\n }\n\n if (typeof value === \"string\") {\n return JSON.parse(value) as T;\n }\n\n if (typeof value !== \"object\") {\n throw new Error(`Invalid config value for ${bosUrl}`);\n }\n\n return value as T;\n}\n\nexport interface PluginManifest {\n schemaVersion: number;\n kind: string;\n plugin: { name: string; version: string };\n runtime: { remoteEntry: string };\n contract: {\n kind: string;\n types: { path: string; exportName: string; typeName: string; sha256: string };\n };\n additionalExports?: Array<{ path: string; exports: string[]; sha256: string }>;\n}\n\nexport async function fetchRemotePluginManifest(cdnUrl: string): Promise<PluginManifest | null> {\n const baseUrl = cdnUrl.replace(/\\/$/, \"\");\n return fetchJsonOrNull<PluginManifest>(`${baseUrl}/plugin.manifest.json`, { retries: 0 });\n}\n\nasync function fetchJson<T>(url: string, init?: RequestInit): Promise<T | null> {\n const headers: Record<string, string> = {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n ...(init?.headers as Record<string, string> | undefined),\n };\n return fetchJsonOrNull<T>(url, {\n method: init?.method,\n headers,\n body: init?.body ?? undefined,\n retries: 3,\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fastkv.cjs","names":["fetchJsonOrNull"],"sources":["../src/fastkv.ts"],"sourcesContent":["export type NetworkId = \"mainnet\" | \"testnet\";\n\ninterface FastKvEntry {\n value: unknown;\n}\n\ninterface FastKvListResponse {\n entries?: Array<FastKvEntry | null>;\n}\n\nimport { fetchJsonOrNull } from \"./http-client\";\n\nfunction getNetworkIdForAccount(accountId: string): NetworkId {\n return accountId.endsWith(\".testnet\") ? \"testnet\" : \"mainnet\";\n}\n\nconst FASTKV_TESTNET_URL = \"https://kv.test.fastnear.com\";\nconst FASTKV_MAINNET_URL = \"https://kv.main.fastnear.com\";\nconst REGISTRY_NAMESPACE_TESTNET = \"dev.allthethings.testnet\";\nconst REGISTRY_NAMESPACE_MAINNET = \"dev.everything.near\";\n\nexport function getFastKvBaseUrlForNetwork(network: NetworkId): string {\n return network === \"testnet\" ? FASTKV_TESTNET_URL : FASTKV_MAINNET_URL;\n}\n\nfunction getFastKvBaseUrlForAccount(accountId: string): string {\n return getNetworkIdForAccount(accountId) === \"testnet\"\n ? getFastKvBaseUrlForNetwork(\"testnet\")\n : getFastKvBaseUrlForNetwork(\"mainnet\");\n}\n\nexport function buildRegistryConfigUrl(\n accountId: string,\n gatewayId: string,\n registry?: string,\n): string {\n const baseUrl = getFastKvBaseUrlForAccount(accountId);\n const namespace = getRegistryNamespaceForAccount(accountId, registry);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));\n return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;\n}\n\nexport function buildRegistryConfigUrlForNetwork(\n network: NetworkId,\n accountId: string,\n gatewayId: string,\n registry?: string,\n): string {\n const baseUrl = getFastKvBaseUrlForNetwork(network);\n const namespace = getRegistryNamespaceForNetwork(network, registry);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId));\n return `${baseUrl}/v0/latest/${encodeURIComponent(namespace)}/${encodeURIComponent(accountId)}/${key}`;\n}\n\nexport function getRegistryNamespaceForAccount(accountId: string, registry?: string): string {\n return registry ?? getRegistryNamespaceForNetwork(getNetworkIdForAccount(accountId));\n}\n\nexport function getRegistryNamespaceForNetwork(network: NetworkId, registry?: string): string {\n if (registry) return registry;\n return network === \"testnet\" ? REGISTRY_NAMESPACE_TESTNET : REGISTRY_NAMESPACE_MAINNET;\n}\n\nfunction getRegistryConfigKey(\n accountId: string,\n gatewayId: string,\n pathSegments: string[] = [],\n): string {\n const suffix =\n pathSegments.length > 0\n ? `/${pathSegments.map((segment) => encodeURIComponent(segment)).join(\"/\")}`\n : \"\";\n return `apps/${accountId}/${gatewayId}${suffix}/bos.config.json`;\n}\n\nexport function parseBosUrl(bosUrl: string): {\n accountId: string;\n gatewayId: string;\n pathSegments: string[];\n} {\n const strippedUrl = bosUrl.split(\"#\")[0]!;\n const match = strippedUrl.match(/^bos:\\/\\/([^/]+)\\/(.+)$/);\n if (!match?.[1] || !match[2]) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n const pathSegments = match[2]\n .split(\"/\")\n .filter(Boolean)\n .map((segment) => decodeURIComponent(segment));\n if (pathSegments.length === 0) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n const [gatewayId, ...pathSegmentsTail] = pathSegments;\n if (!gatewayId) {\n throw new Error(`Invalid BOS URL: ${bosUrl}`);\n }\n\n return {\n accountId: match[1],\n gatewayId,\n pathSegments: pathSegmentsTail,\n };\n}\n\nexport async function fetchBosConfigFromFastKv<T>(bosUrl: string, registry?: string): Promise<T> {\n const { accountId, gatewayId, pathSegments } = parseBosUrl(bosUrl);\n const key = encodeURIComponent(getRegistryConfigKey(accountId, gatewayId, pathSegments));\n const payload = await fetchJson<FastKvListResponse>(\n `${getFastKvBaseUrlForAccount(accountId)}/v0/latest/${encodeURIComponent(getRegistryNamespaceForAccount(accountId, registry))}/${encodeURIComponent(accountId)}/${key}`,\n );\n const value = payload?.entries?.find(Boolean)?.value;\n\n if (!value) {\n throw new Error(`No config found for ${bosUrl}`);\n }\n\n if (typeof value === \"string\") {\n return JSON.parse(value) as T;\n }\n\n if (typeof value !== \"object\") {\n throw new Error(`Invalid config value for ${bosUrl}`);\n }\n\n return value as T;\n}\n\nexport interface ConfigHistoryEntry {\n blockHeight: number;\n blockTimestampNs: string;\n txHash?: string;\n value: unknown;\n}\n\ninterface FastKvHistoryEntry {\n block_height?: number;\n block_timestamp?: string | number;\n tx_hash?: string;\n value?: unknown;\n}\n\ninterface FastKvHistoryResponse {\n entries?: Array<FastKvHistoryEntry | null>;\n}\n\nconst FASTKV_HISTORY_MAX_LIMIT = 200;\n\n/**\n * Publish history for the registry config key (atomic-deploys 11): the\n * exact-key variant of FastData's history endpoint, newest-first. The API\n * caps a page at 200 rows; a config key's write history fits well inside\n * that, so a single request is the whole story (the limit param is clamped).\n */\nexport async function fetchConfigHistory(opts: {\n accountId: string;\n gatewayId: string;\n registry?: string;\n limit?: number;\n}): Promise<ConfigHistoryEntry[]> {\n const key = encodeURIComponent(getRegistryConfigKey(opts.accountId, opts.gatewayId));\n const limit = Math.max(1, Math.min(opts.limit ?? 20, FASTKV_HISTORY_MAX_LIMIT));\n const url = `${getFastKvBaseUrlForAccount(opts.accountId)}/v0/history/${encodeURIComponent(getRegistryNamespaceForAccount(opts.accountId, opts.registry))}/${encodeURIComponent(opts.accountId)}/${key}?limit=${limit}`;\n const payload = await fetchJson<FastKvHistoryResponse>(url);\n const entries = (payload?.entries ?? []).filter(Boolean) as FastKvHistoryEntry[];\n\n return entries\n .map((entry) => ({\n blockHeight: entry.block_height ?? 0,\n blockTimestampNs: String(entry.block_timestamp ?? \"\"),\n ...(entry.tx_hash ? { txHash: entry.tx_hash } : {}),\n value:\n typeof entry.value === \"string\" && entry.value.length > 0\n ? (JSON.parse(entry.value) as unknown)\n : entry.value,\n }))\n .sort((a, b) => b.blockHeight - a.blockHeight);\n}\n\nexport interface DeployManifestEntry {\n key: string;\n blockHeight: number;\n blockTimestampNs: string;\n value: unknown;\n}\n\n/**\n * The per-deploy audit trail (atomic-deploys 03/12): every publish writes\n * `apps/<account>/<gateway>/manifests/<ts>.json` atomically with the pointer\n * swap — this lists that key family newest-first via the history-by-prefix\n * endpoint.\n */\nexport async function fetchDeployManifests(opts: {\n accountId: string;\n gatewayId: string;\n registry?: string;\n limit?: number;\n}): Promise<DeployManifestEntry[]> {\n const keyPrefix = encodeURIComponent(\n `${getRegistryConfigKey(opts.accountId, opts.gatewayId).replace(/bos\\.config\\.json$/, \"\")}manifests/`,\n );\n const url = `${getFastKvBaseUrlForAccount(opts.accountId)}/v0/history/${encodeURIComponent(getRegistryNamespaceForAccount(opts.accountId, opts.registry))}/${encodeURIComponent(opts.accountId)}`;\n const payload = await fetchJson<FastKvHistoryResponse>(url, {\n method: \"POST\",\n body: JSON.stringify({\n key_prefix: decodeURIComponent(keyPrefix),\n asc: false,\n limit: Math.max(1, Math.min(opts.limit ?? 20, FASTKV_HISTORY_MAX_LIMIT)),\n }),\n });\n const entries = (payload?.entries ?? []).filter(Boolean) as Array<\n FastKvHistoryEntry & { key?: string }\n >;\n\n return entries\n .map((entry) => ({\n key: entry.key ?? \"\",\n blockHeight: entry.block_height ?? 0,\n blockTimestampNs: String(entry.block_timestamp ?? \"\"),\n value:\n typeof entry.value === \"string\" && entry.value.length > 0\n ? (JSON.parse(entry.value) as unknown)\n : entry.value,\n }))\n .sort((a, b) => b.blockHeight - a.blockHeight);\n}\n\nexport interface PluginManifest {\n schemaVersion: number;\n kind: string;\n plugin: { name: string; version: string };\n runtime: { remoteEntry: string };\n contract: {\n kind: string;\n types: { path: string; exportName: string; typeName: string; sha256: string };\n };\n additionalExports?: Array<{ path: string; exports: string[]; sha256: string }>;\n}\n\nexport async function fetchRemotePluginManifest(cdnUrl: string): Promise<PluginManifest | null> {\n const baseUrl = cdnUrl.replace(/\\/$/, \"\");\n return fetchJsonOrNull<PluginManifest>(`${baseUrl}/plugin.manifest.json`, { retries: 2 });\n}\n\nasync function fetchJson<T>(url: string, init?: RequestInit): Promise<T | null> {\n const headers: Record<string, string> = {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n ...(init?.headers as Record<string, string> | undefined),\n };\n return fetchJsonOrNull<T>(url, {\n method: init?.method,\n headers,\n body: init?.body ?? undefined,\n retries: 3,\n });\n}\n"],"mappings":"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"}
|
package/dist/fastkv.d.cts
CHANGED
|
@@ -1,16 +1,52 @@
|
|
|
1
1
|
//#region src/fastkv.d.ts
|
|
2
2
|
type NetworkId = "mainnet" | "testnet";
|
|
3
3
|
declare function getFastKvBaseUrlForNetwork(network: NetworkId): string;
|
|
4
|
-
declare function buildRegistryConfigUrl(accountId: string, gatewayId: string): string;
|
|
5
|
-
declare function buildRegistryConfigUrlForNetwork(network: NetworkId, accountId: string, gatewayId: string): string;
|
|
6
|
-
declare function getRegistryNamespaceForAccount(accountId: string): string;
|
|
7
|
-
declare function getRegistryNamespaceForNetwork(network: NetworkId): string;
|
|
4
|
+
declare function buildRegistryConfigUrl(accountId: string, gatewayId: string, registry?: string): string;
|
|
5
|
+
declare function buildRegistryConfigUrlForNetwork(network: NetworkId, accountId: string, gatewayId: string, registry?: string): string;
|
|
6
|
+
declare function getRegistryNamespaceForAccount(accountId: string, registry?: string): string;
|
|
7
|
+
declare function getRegistryNamespaceForNetwork(network: NetworkId, registry?: string): string;
|
|
8
8
|
declare function parseBosUrl(bosUrl: string): {
|
|
9
9
|
accountId: string;
|
|
10
10
|
gatewayId: string;
|
|
11
11
|
pathSegments: string[];
|
|
12
12
|
};
|
|
13
|
-
declare function fetchBosConfigFromFastKv<T>(bosUrl: string): Promise<T>;
|
|
13
|
+
declare function fetchBosConfigFromFastKv<T>(bosUrl: string, registry?: string): Promise<T>;
|
|
14
|
+
interface ConfigHistoryEntry {
|
|
15
|
+
blockHeight: number;
|
|
16
|
+
blockTimestampNs: string;
|
|
17
|
+
txHash?: string;
|
|
18
|
+
value: unknown;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Publish history for the registry config key (atomic-deploys 11): the
|
|
22
|
+
* exact-key variant of FastData's history endpoint, newest-first. The API
|
|
23
|
+
* caps a page at 200 rows; a config key's write history fits well inside
|
|
24
|
+
* that, so a single request is the whole story (the limit param is clamped).
|
|
25
|
+
*/
|
|
26
|
+
declare function fetchConfigHistory(opts: {
|
|
27
|
+
accountId: string;
|
|
28
|
+
gatewayId: string;
|
|
29
|
+
registry?: string;
|
|
30
|
+
limit?: number;
|
|
31
|
+
}): Promise<ConfigHistoryEntry[]>;
|
|
32
|
+
interface DeployManifestEntry {
|
|
33
|
+
key: string;
|
|
34
|
+
blockHeight: number;
|
|
35
|
+
blockTimestampNs: string;
|
|
36
|
+
value: unknown;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The per-deploy audit trail (atomic-deploys 03/12): every publish writes
|
|
40
|
+
* `apps/<account>/<gateway>/manifests/<ts>.json` atomically with the pointer
|
|
41
|
+
* swap — this lists that key family newest-first via the history-by-prefix
|
|
42
|
+
* endpoint.
|
|
43
|
+
*/
|
|
44
|
+
declare function fetchDeployManifests(opts: {
|
|
45
|
+
accountId: string;
|
|
46
|
+
gatewayId: string;
|
|
47
|
+
registry?: string;
|
|
48
|
+
limit?: number;
|
|
49
|
+
}): Promise<DeployManifestEntry[]>;
|
|
14
50
|
interface PluginManifest {
|
|
15
51
|
schemaVersion: number;
|
|
16
52
|
kind: string;
|
|
@@ -38,5 +74,5 @@ interface PluginManifest {
|
|
|
38
74
|
}
|
|
39
75
|
declare function fetchRemotePluginManifest(cdnUrl: string): Promise<PluginManifest | null>;
|
|
40
76
|
//#endregion
|
|
41
|
-
export { NetworkId, PluginManifest, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, fetchRemotePluginManifest, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, parseBosUrl };
|
|
77
|
+
export { ConfigHistoryEntry, DeployManifestEntry, NetworkId, PluginManifest, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, fetchConfigHistory, fetchDeployManifests, fetchRemotePluginManifest, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, parseBosUrl };
|
|
42
78
|
//# sourceMappingURL=fastkv.d.cts.map
|
package/dist/fastkv.d.mts
CHANGED
|
@@ -1,16 +1,52 @@
|
|
|
1
1
|
//#region src/fastkv.d.ts
|
|
2
2
|
type NetworkId = "mainnet" | "testnet";
|
|
3
3
|
declare function getFastKvBaseUrlForNetwork(network: NetworkId): string;
|
|
4
|
-
declare function buildRegistryConfigUrl(accountId: string, gatewayId: string): string;
|
|
5
|
-
declare function buildRegistryConfigUrlForNetwork(network: NetworkId, accountId: string, gatewayId: string): string;
|
|
6
|
-
declare function getRegistryNamespaceForAccount(accountId: string): string;
|
|
7
|
-
declare function getRegistryNamespaceForNetwork(network: NetworkId): string;
|
|
4
|
+
declare function buildRegistryConfigUrl(accountId: string, gatewayId: string, registry?: string): string;
|
|
5
|
+
declare function buildRegistryConfigUrlForNetwork(network: NetworkId, accountId: string, gatewayId: string, registry?: string): string;
|
|
6
|
+
declare function getRegistryNamespaceForAccount(accountId: string, registry?: string): string;
|
|
7
|
+
declare function getRegistryNamespaceForNetwork(network: NetworkId, registry?: string): string;
|
|
8
8
|
declare function parseBosUrl(bosUrl: string): {
|
|
9
9
|
accountId: string;
|
|
10
10
|
gatewayId: string;
|
|
11
11
|
pathSegments: string[];
|
|
12
12
|
};
|
|
13
|
-
declare function fetchBosConfigFromFastKv<T>(bosUrl: string): Promise<T>;
|
|
13
|
+
declare function fetchBosConfigFromFastKv<T>(bosUrl: string, registry?: string): Promise<T>;
|
|
14
|
+
interface ConfigHistoryEntry {
|
|
15
|
+
blockHeight: number;
|
|
16
|
+
blockTimestampNs: string;
|
|
17
|
+
txHash?: string;
|
|
18
|
+
value: unknown;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Publish history for the registry config key (atomic-deploys 11): the
|
|
22
|
+
* exact-key variant of FastData's history endpoint, newest-first. The API
|
|
23
|
+
* caps a page at 200 rows; a config key's write history fits well inside
|
|
24
|
+
* that, so a single request is the whole story (the limit param is clamped).
|
|
25
|
+
*/
|
|
26
|
+
declare function fetchConfigHistory(opts: {
|
|
27
|
+
accountId: string;
|
|
28
|
+
gatewayId: string;
|
|
29
|
+
registry?: string;
|
|
30
|
+
limit?: number;
|
|
31
|
+
}): Promise<ConfigHistoryEntry[]>;
|
|
32
|
+
interface DeployManifestEntry {
|
|
33
|
+
key: string;
|
|
34
|
+
blockHeight: number;
|
|
35
|
+
blockTimestampNs: string;
|
|
36
|
+
value: unknown;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The per-deploy audit trail (atomic-deploys 03/12): every publish writes
|
|
40
|
+
* `apps/<account>/<gateway>/manifests/<ts>.json` atomically with the pointer
|
|
41
|
+
* swap — this lists that key family newest-first via the history-by-prefix
|
|
42
|
+
* endpoint.
|
|
43
|
+
*/
|
|
44
|
+
declare function fetchDeployManifests(opts: {
|
|
45
|
+
accountId: string;
|
|
46
|
+
gatewayId: string;
|
|
47
|
+
registry?: string;
|
|
48
|
+
limit?: number;
|
|
49
|
+
}): Promise<DeployManifestEntry[]>;
|
|
14
50
|
interface PluginManifest {
|
|
15
51
|
schemaVersion: number;
|
|
16
52
|
kind: string;
|
|
@@ -38,5 +74,5 @@ interface PluginManifest {
|
|
|
38
74
|
}
|
|
39
75
|
declare function fetchRemotePluginManifest(cdnUrl: string): Promise<PluginManifest | null>;
|
|
40
76
|
//#endregion
|
|
41
|
-
export { NetworkId, PluginManifest, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, fetchRemotePluginManifest, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, parseBosUrl };
|
|
77
|
+
export { ConfigHistoryEntry, DeployManifestEntry, NetworkId, PluginManifest, buildRegistryConfigUrl, buildRegistryConfigUrlForNetwork, fetchBosConfigFromFastKv, fetchConfigHistory, fetchDeployManifests, fetchRemotePluginManifest, getFastKvBaseUrlForNetwork, getRegistryNamespaceForAccount, getRegistryNamespaceForNetwork, parseBosUrl };
|
|
42
78
|
//# sourceMappingURL=fastkv.d.mts.map
|