okengine 0.10.2 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +76 -10
- package/site/content/docs/ai/mcp.mdx +0 -1
- package/site/content/docs/deployment/docker-swarm.mdx +48 -111
- package/site/content/docs/deployment/docker.mdx +43 -36
- package/site/content/docs/deployment/index.mdx +9 -9
- package/site/content/docs/deployment/kubernetes.mdx +4 -4
- package/site/content/docs/elements/ai.mdx +7 -13
- package/site/content/docs/elements/channel.mdx +9 -13
- package/site/content/docs/elements/clock.mdx +8 -14
- package/site/content/docs/elements/flow.mdx +46 -54
- package/site/content/docs/elements/gate.mdx +6 -11
- package/site/content/docs/elements/signal.mdx +2 -8
- package/site/content/docs/elements/store.mdx +79 -93
- package/site/content/docs/elements/vault.mdx +89 -76
- package/site/content/docs/get-started/basic-usage.mdx +8 -14
- package/site/content/docs/get-started/installation.mdx +36 -36
- package/site/content/docs/get-started/introduction.mdx +11 -0
- package/site/content/docs/get-started/why.mdx +3 -4
- package/site/content/docs/index.mdx +0 -1
- package/site/content/docs/meta.json +0 -1
- package/site/content/docs/plugins/anonymous.mdx +1 -1
- package/site/content/docs/plugins/magic-link.mdx +11 -11
- package/site/content/docs/plugins/otp.mdx +2 -2
- package/site/content/docs/plugins/passkey.mdx +1 -1
- package/site/content/docs/plugins/two-factor.mdx +1 -1
- package/site/content/docs/plugins/username.mdx +1 -1
- package/site/content/docs/recipes/caddy.mdx +1 -1
- package/site/content/docs/recipes/cockroachdb.mdx +2 -2
- package/site/content/docs/recipes/dragonfly.mdx +1 -1
- package/site/content/docs/recipes/index.mdx +1 -2
- package/site/content/docs/recipes/llama-cpp.mdx +21 -23
- package/site/content/docs/recipes/mailpit.mdx +11 -11
- package/site/content/docs/recipes/meilisearch.mdx +10 -10
- package/site/content/docs/recipes/meta.json +0 -1
- package/site/content/docs/recipes/ollama.mdx +1 -1
- package/site/content/docs/recipes/pgdog.mdx +12 -9
- package/site/content/docs/recipes/postgres.mdx +3 -3
- package/site/content/docs/recipes/redis.mdx +2 -2
- package/site/content/docs/recipes/rustfs.mdx +10 -7
- package/site/content/docs/recipes/sglang.mdx +1 -1
- package/site/content/docs/recipes/supabase-docker.mdx +1 -1
- package/site/content/docs/recipes/timescale.mdx +2 -2
- package/site/content/docs/recipes/valkey.mdx +1 -1
- package/site/content/docs/recipes/vllm.mdx +1 -1
- package/site/content/docs/recipes/yugabytedb.mdx +2 -2
- package/site/content/docs/reference/cli.md +61 -38
- package/site/content/docs/reference/configuration.mdx +145 -70
- package/site/content/docs/reference/environment-variables.mdx +36 -28
- package/site/content/docs/reference/errors.mdx +28 -29
- package/site/content/docs/reference/fx.mdx +14 -7
- package/site/content/docs/reference/i18n.mdx +17 -6
- package/site/content/docs/reference/index.mdx +5 -0
- package/site/content/docs/reference/meta.json +1 -0
- package/site/content/docs/reference/migrating-environments.mdx +158 -0
- package/site/content/docs/reference/plugins.mdx +2 -2
- package/src/auth/gate-auth.test.ts +12 -10
- package/src/cli/ai-setup/ai-setup.test.ts +30 -16
- package/src/cli/ai-setup/apply.ts +111 -15
- package/src/cli/ai-setup/catalog.ts +3 -3
- package/src/cli/ai-setup/index.ts +1 -1
- package/src/cli/ai-setup/prompts.ts +1 -1
- package/src/cli/ai-setup/recommend.test.ts +1 -1
- package/src/cli/ask-seed.test.ts +3 -3
- package/src/cli/build.ts +8 -9
- package/src/cli/db-auto-push.test.ts +6 -3
- package/src/cli/db-auto-push.ts +7 -5
- package/src/cli/db-seed.ts +7 -8
- package/src/cli/db.test.ts +70 -71
- package/src/cli/db.ts +86 -12
- package/src/cli/dev-controller.test.ts +35 -0
- package/src/cli/dev-controller.ts +298 -0
- package/src/cli/dev-controls.ts +11 -65
- package/src/cli/dev-db-push.test.ts +47 -15
- package/src/cli/dev-schema-sync.test.ts +11 -11
- package/src/cli/dev-schema-sync.ts +10 -10
- package/src/cli/dev-session-lock.test.ts +106 -0
- package/src/cli/dev-session-lock.ts +209 -0
- package/src/cli/dev.test.ts +246 -114
- package/src/cli/dev.ts +153 -205
- package/src/cli/doc-staleness.test.ts +3 -6
- package/src/cli/docker-clean.test.ts +33 -1
- package/src/cli/docker-clean.ts +28 -33
- package/src/cli/docker-cli.test.ts +12 -11
- package/src/cli/docker.ts +95 -20
- package/src/cli/doctor.test.ts +40 -0
- package/src/cli/doctor.ts +142 -9
- package/src/cli/drizzle-env.test.ts +11 -13
- package/src/cli/drizzle-env.ts +18 -11
- package/src/cli/ensure-drizzle-config.ts +11 -14
- package/src/cli/hero-meta.test.ts +15 -15
- package/src/cli/hero-meta.ts +10 -9
- package/src/cli/index.ts +36 -6
- package/src/cli/load-config.images.test.ts +44 -10
- package/src/cli/load-config.source.test.ts +50 -0
- package/src/cli/load-config.ts +35 -29
- package/src/cli/meilisearch-local.ts +1 -2
- package/src/cli/mode.ts +7 -58
- package/src/cli/registry.ts +175 -19
- package/src/cli/resolve-dev-sql-env.test.ts +8 -16
- package/src/cli/resolve-dev-sql-env.ts +13 -15
- package/src/cli/safe-defaults.test.ts +29 -11
- package/src/cli/schema.ts +65 -16
- package/src/cli/test.ts +58 -0
- package/src/cli/tui/App.tsx +252 -0
- package/src/cli/tui/DevLive.tsx +116 -0
- package/src/cli/tui/components/ConfirmDialog.tsx +48 -0
- package/src/cli/tui/components/HeaderBar.tsx +67 -0
- package/src/cli/tui/components/LogStream.tsx +47 -0
- package/src/cli/tui/components/PanelCard.tsx +39 -0
- package/src/cli/tui/components/SelectRow.tsx +37 -0
- package/src/cli/tui/components/SlashPalette.tsx +172 -0
- package/src/cli/tui/components/Spinner.tsx +32 -0
- package/src/cli/tui/components/StatusBar.tsx +51 -0
- package/src/cli/tui/components/StatusDot.tsx +37 -0
- package/src/cli/tui/components/TabBar.tsx +49 -0
- package/src/cli/tui/components/Wordmark.tsx +43 -0
- package/src/cli/tui/format.ts +38 -0
- package/src/cli/tui/keys.test.ts +18 -0
- package/src/cli/tui/keys.ts +26 -0
- package/src/cli/tui/launch.test.ts +18 -0
- package/src/cli/tui/launch.ts +57 -0
- package/src/cli/tui/panels/Dashboard.tsx +201 -0
- package/src/cli/tui/panels/Database.tsx +198 -0
- package/src/cli/tui/panels/Dev.tsx +257 -0
- package/src/cli/tui/panels/Docker.tsx +357 -0
- package/src/cli/tui/panels/Navigator.test.ts +22 -0
- package/src/cli/tui/panels/Navigator.tsx +213 -0
- package/src/cli/tui/slash-catalog.test.ts +31 -0
- package/src/cli/tui/slash-catalog.ts +184 -0
- package/src/cli/tui/slash-run.ts +54 -0
- package/src/cli/tui/state/ports.ts +95 -0
- package/src/cli/tui/theme.ts +24 -0
- package/src/cli/vault-cmd.test.ts +402 -0
- package/src/cli/vault-cmd.ts +727 -69
- package/src/cli/vault-secure-input.test.ts +56 -0
- package/src/cli/vault-secure-input.ts +124 -0
- package/src/compiler/effects-infer.ts +7 -0
- package/src/compiler/extract.ts +12 -0
- package/src/compiler/fixtures/skyport/oke.config.ts +7 -5
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -1
- package/src/compiler/fixtures/skyport.expected.json +1 -1
- package/src/compiler/generate-adopt.ts +27 -1
- package/src/compiler-entry.ts +7 -0
- package/src/config/define-config.test.ts +111 -47
- package/src/config/driver-defaults.test.ts +115 -0
- package/src/config/driver-defaults.ts +156 -0
- package/src/config/index.ts +246 -131
- package/src/config/resolve-driver.test.ts +14 -19
- package/src/console/server/app.ts +4 -2
- package/src/console/server/console.test.ts +58 -1
- package/src/console/server/flows.ts +22 -2
- package/src/console/server/index.ts +3 -0
- package/src/console/server/operator-db.test.ts +55 -13
- package/src/console/server/operator-db.ts +305 -263
- package/src/console/server/serve.ts +16 -7
- package/src/console/server/state.ts +31 -9
- package/src/console/server/vault.test.ts +120 -5
- package/src/console/server/vault.ts +208 -12
- package/src/console/ui/dist/assets/{index-D-9KFce5.js → index--Y0Uaz-m.js} +2 -2
- package/src/console/ui/dist/assets/panel-vault-BkZdJPX8.js +1 -0
- package/src/console/ui/dist/assets/style-C3L349iZ.css +3 -0
- package/src/console/ui/dist/index.html +2 -2
- package/src/console/ui/shell/client.ts +16 -0
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +54 -1
- package/src/console/ui/vault/VaultA11yView.tsx +33 -1
- package/src/console/ui/vault/backend.test.ts +75 -0
- package/src/console/ui/vault/backend.ts +117 -0
- package/src/console/ui/vault/fixture.ts +21 -2
- package/src/console/ui/vault/index.ts +11 -1
- package/src/console/ui/vault/types.ts +26 -0
- package/src/docker/compose.ts +164 -61
- package/src/docker/derive.ts +106 -12
- package/src/docker/docker.test.ts +156 -110
- package/src/docker/helpers.ts +98 -0
- package/src/docker/images-config.test.ts +163 -0
- package/src/docker/index.ts +30 -5
- package/src/docker/recipes/index.ts +0 -3
- package/src/docker/recipes/llama-cpp.ts +4 -4
- package/src/docker/recipes/pgdog.ts +9 -2
- package/src/docker/resources.test.ts +71 -0
- package/src/docker/resources.ts +176 -0
- package/src/docker/stack-id.test.ts +11 -4
- package/src/docker/stack-id.ts +42 -32
- package/src/docker/stack.integration.test.ts +4 -15
- package/src/docker/types.ts +35 -3
- package/src/drivers/ai-ollama.integration.test.ts +2 -2
- package/src/drivers/conformance.test.ts +11 -12
- package/src/drivers/drizzle-dialect.test.ts +0 -4
- package/src/drivers/drizzle-dialect.ts +7 -13
- package/src/drivers/index.ts +24 -7
- package/src/drivers/journal-postgres.test.ts +3 -1
- package/src/drivers/journal-postgres.ts +4 -2
- package/src/drivers/meilisearch.ts +1 -1
- package/src/drivers/pglite.ts +28 -5
- package/src/drivers/types.ts +9 -11
- package/src/drivers/vault-aws-secrets-manager.test.ts +159 -0
- package/src/drivers/vault-aws-secrets-manager.ts +333 -0
- package/src/drivers/vault-builtin.test.ts +110 -0
- package/src/drivers/vault-builtin.ts +184 -0
- package/src/drivers/vault-driver-removal.test.ts +13 -0
- package/src/drivers/vault-managed.test.ts +95 -0
- package/src/drivers/vault-managed.ts +101 -25
- package/src/drivers/vault-types.ts +25 -5
- package/src/elements/ai/runtime.ts +1 -1
- package/src/elements/clock/chaos.test.ts +4 -1
- package/src/elements/clock/durable.ts +57 -4
- package/src/elements/clock.test.ts +13 -14
- package/src/elements/gate/constants.ts +18 -0
- package/src/elements/gate.test.ts +1 -1
- package/src/elements/gate.ts +2 -2
- package/src/elements/store/domain-ddl.test.ts +5 -12
- package/src/elements/store/emit-drizzle.ts +44 -19
- package/src/elements/store/index-boot.test.ts +15 -116
- package/src/elements/store/load-plugin-tables.ts +1 -1
- package/src/elements/store/resource-list-docs.fixture.ts +12 -6
- package/src/elements/store/resource-list-docs.test.ts +64 -44
- package/src/elements/store/resource.test.ts +17 -10
- package/src/elements/store/runtime.ts +9 -12
- package/src/elements/store/schema-decl.test.ts +16 -32
- package/src/elements/store/seed.test.ts +1 -2
- package/src/elements/store/seed.ts +7 -8
- package/src/elements/store/sql-condition.test.ts +2 -2
- package/src/elements/store/sql-session.test.ts +8 -10
- package/src/elements/store/sql-session.ts +10 -2
- package/src/elements/store.test.ts +13 -13
- package/src/elements/vault/audit.ts +233 -0
- package/src/elements/vault/boot-chain.test.ts +78 -0
- package/src/elements/vault/boot-chain.ts +43 -39
- package/src/elements/vault/builtin-adapter.test.ts +479 -0
- package/src/elements/vault/builtin-adapter.ts +1184 -0
- package/src/elements/vault/crypto.test.ts +237 -0
- package/src/elements/vault/crypto.ts +431 -0
- package/src/elements/vault/declare.ts +164 -3
- package/src/elements/vault/errors.ts +56 -0
- package/src/elements/vault/kms-unseal.test.ts +76 -0
- package/src/elements/vault/kms-unseal.ts +181 -0
- package/src/elements/vault/path.ts +90 -0
- package/src/elements/vault/resilience.test.ts +102 -0
- package/src/elements/vault/resilience.ts +107 -0
- package/src/elements/vault/runtime.ts +36 -4
- package/src/elements/vault/security-checklist.test.ts +130 -0
- package/src/elements/vault/storage.ts +448 -0
- package/src/elements/vault/types.ts +288 -0
- package/src/elements/vault/unseal.ts +150 -0
- package/src/elements/vault.test.ts +72 -4
- package/src/elements/vault.ts +91 -2
- package/src/full.ts +248 -0
- package/src/http.ts +41 -0
- package/src/i18n/interpolate-simple.ts +37 -0
- package/src/i18n/messages.ts +51 -4
- package/src/i18n-entry.ts +7 -0
- package/src/index.ts +35 -145
- package/src/journal-entry.ts +20 -0
- package/src/kernel/adopt-barrel-fresh.test.ts +25 -10
- package/src/kernel/app.ts +40 -42
- package/src/kernel/auto-registry.test.ts +2 -2
- package/src/kernel/boot-bind/ai.test.ts +5 -5
- package/src/kernel/boot-bind/ai.ts +2 -1
- package/src/kernel/boot-bind/channel.test.ts +6 -6
- package/src/kernel/boot-bind/channel.ts +5 -4
- package/src/kernel/boot-bind/clock.ts +5 -5
- package/src/kernel/boot-bind/gate.ts +6 -7
- package/src/kernel/boot-bind/honor-config.test.ts +42 -42
- package/src/kernel/boot-bind/journal.ts +5 -5
- package/src/kernel/boot-bind/signal.ts +3 -1
- package/src/kernel/boot-bind/store.test.ts +55 -37
- package/src/kernel/boot-bind/store.ts +24 -34
- package/src/kernel/boot-bind/vault.ts +19 -4
- package/src/kernel/boot.test.ts +12 -4
- package/src/kernel/boot.ts +31 -19
- package/src/kernel/budget-entry.ts +1 -1
- package/src/kernel/compensate.test.ts +288 -1
- package/src/kernel/compensate.ts +126 -0
- package/src/kernel/concurrency.test.ts +10 -9
- package/src/kernel/effects-stamping.test.ts +27 -2
- package/src/kernel/element-registries.ts +5 -3
- package/src/kernel/flow.ts +4 -2
- package/src/kernel/fx.test.ts +119 -3
- package/src/kernel/fx.ts +215 -40
- package/src/kernel/index.ts +14 -0
- package/src/kernel/journal.ts +130 -7
- package/src/kernel/pipeline.test.ts +20 -6
- package/src/kernel/redacted.test.ts +35 -0
- package/src/kernel/redacted.ts +24 -2
- package/src/kernel/router/create-default.ts +16 -0
- package/src/kernel/router/create-edge.ts +18 -0
- package/src/kernel/router/create.ts +23 -0
- package/src/kernel/router/index.ts +23 -0
- package/src/kernel/router/linear.ts +88 -0
- package/src/kernel/router/regexp.ts +188 -0
- package/src/kernel/router/smart.ts +120 -0
- package/src/kernel/router/trie.ts +108 -0
- package/src/kernel/router/types.ts +56 -0
- package/src/kernel/router.ts +18 -532
- package/src/kernel-entry.ts +43 -0
- package/src/manifest/fixtures/skyport.excerpt.json +1 -1
- package/src/manifest/fixtures/skyport.manifest.json +1 -1
- package/src/plugins/config-source.test.ts +7 -7
- package/src/release/build-lib.ts +58 -0
- package/src/release/exports.test.ts +4 -2
- package/src/release/exports.ts +30 -4
- package/src/release/measure.ts +101 -22
- package/src/runs/duckdb.ts +7 -2
- package/src/shared/optional-peer.ts +41 -0
- package/src/term.test.ts +3 -44
- package/src/test/create-test-app.ts +12 -0
- package/src/test/provisions.integration.test.ts +1 -1
- package/src/test/reset-element-registries.ts +2 -0
- package/src/upgrade/codemods.test.ts +7 -20
- package/src/upgrade/codemods.ts +93 -60
- package/site/content/docs/console/access.mdx +0 -29
- package/site/content/docs/console/ai.mdx +0 -35
- package/site/content/docs/console/architecture.mdx +0 -35
- package/site/content/docs/console/channels.mdx +0 -37
- package/site/content/docs/console/clock.mdx +0 -51
- package/site/content/docs/console/flows.mdx +0 -31
- package/site/content/docs/console/gates.mdx +0 -73
- package/site/content/docs/console/index.mdx +0 -54
- package/site/content/docs/console/manifest-diff.mdx +0 -34
- package/site/content/docs/console/meta.json +0 -24
- package/site/content/docs/console/overview.mdx +0 -40
- package/site/content/docs/console/plugins.mdx +0 -41
- package/site/content/docs/console/privacy.mdx +0 -32
- package/site/content/docs/console/runs.mdx +0 -50
- package/site/content/docs/console/signals.mdx +0 -40
- package/site/content/docs/console/store.mdx +0 -32
- package/site/content/docs/console/tenancy.mdx +0 -32
- package/site/content/docs/console/traces.mdx +0 -38
- package/site/content/docs/console/vault.mdx +0 -41
- package/site/content/docs/recipes/openbao.mdx +0 -141
- package/src/cli/ask-dev-mode.ts +0 -40
- package/src/cli/dev-mode.test.ts +0 -45
- package/src/cli/dev-mode.ts +0 -78
- package/src/cli/openbao-bootstrap.test.ts +0 -150
- package/src/cli/openbao-bootstrap.ts +0 -321
- package/src/cli/openbao-restart.integration.test.ts +0 -145
- package/src/console/ui/dist/assets/panel-vault-Za1GyJfM.js +0 -1
- package/src/console/ui/dist/assets/style-C8MxEWPd.css +0 -3
- package/src/docker/recipes/openbao.ts +0 -47
- package/src/drivers/libsql.ts +0 -179
- package/src/drivers/sqlite.ts +0 -44
- package/src/drivers/vault-openbao.test.ts +0 -97
- package/src/drivers/vault-openbao.ts +0 -143
|
@@ -37,11 +37,11 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
37
37
|
process.env.APP_NAME = "honor-config";
|
|
38
38
|
try {
|
|
39
39
|
const result = await bootApplication({
|
|
40
|
-
env: "
|
|
40
|
+
env: "test",
|
|
41
41
|
secrets: [vault.config("APP_NAME", { description: "app" })],
|
|
42
42
|
config: {
|
|
43
43
|
drivers: {
|
|
44
|
-
vault: {
|
|
44
|
+
vault: { test: "env" },
|
|
45
45
|
},
|
|
46
46
|
},
|
|
47
47
|
});
|
|
@@ -58,21 +58,17 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
58
58
|
}
|
|
59
59
|
});
|
|
60
60
|
|
|
61
|
-
test("vault: drivers.vault
|
|
62
|
-
process.env.OKE_VAULT_URL = "http://127.0.0.1:8200";
|
|
63
|
-
process.env.OKE_VAULT_TOKEN = "test-token";
|
|
61
|
+
test("vault: drivers.vault vault selects built-in layer behind env", () => {
|
|
64
62
|
const chain = buildVaultBootChain({
|
|
65
|
-
driverId: "
|
|
66
|
-
env: "
|
|
67
|
-
missingOpenbao: "throw",
|
|
63
|
+
driverId: "vault",
|
|
64
|
+
env: "test",
|
|
68
65
|
});
|
|
69
|
-
expect(chain.map((l) => l.driver.id)).toContain("
|
|
66
|
+
expect(chain.map((l) => l.driver.id)).toContain("vault");
|
|
70
67
|
expect(chain.map((l) => l.driver.id)).toContain("env");
|
|
71
68
|
});
|
|
72
69
|
|
|
73
|
-
test("vault:
|
|
74
|
-
|
|
75
|
-
delete process.env.OKE_VAULT_TOKEN;
|
|
70
|
+
test("vault: unknown driver id fails loud at boot", async () => {
|
|
71
|
+
const removed = ["open", "bao"].join("");
|
|
76
72
|
await expect(
|
|
77
73
|
bootApplication({
|
|
78
74
|
env: "prod",
|
|
@@ -80,21 +76,23 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
80
76
|
vault: { allowDevFallbacks: true },
|
|
81
77
|
config: {
|
|
82
78
|
drivers: {
|
|
83
|
-
vault: { prod:
|
|
79
|
+
vault: { prod: removed },
|
|
84
80
|
},
|
|
85
81
|
},
|
|
86
82
|
}),
|
|
87
|
-
).rejects.toThrow(/
|
|
83
|
+
).rejects.toThrow(/unknown vault driver/);
|
|
88
84
|
});
|
|
89
85
|
|
|
90
86
|
test("clock: drivers.clock memory binds memory CronStore", async () => {
|
|
87
|
+
// `test` env always forces frozen — pin under `dev` to honour memory.
|
|
91
88
|
const result = await bootApplication({
|
|
92
|
-
env: "
|
|
89
|
+
env: "dev",
|
|
93
90
|
startScheduler: false,
|
|
94
91
|
clocks: [clock("tick", { every: "1h" })],
|
|
95
92
|
config: {
|
|
96
93
|
drivers: {
|
|
97
|
-
clock: {
|
|
94
|
+
clock: { dev: "memory" },
|
|
95
|
+
store: { sql: { dev: "memory" }, kv: { dev: "memory" } },
|
|
98
96
|
},
|
|
99
97
|
},
|
|
100
98
|
});
|
|
@@ -110,12 +108,13 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
110
108
|
tmp = await mkdtemp(join(tmpdir(), "oke-clock-file-"));
|
|
111
109
|
process.chdir(tmp);
|
|
112
110
|
const result = await bootApplication({
|
|
113
|
-
env: "
|
|
111
|
+
env: "dev",
|
|
114
112
|
startScheduler: false,
|
|
115
113
|
clocks: [clock("tick", { every: "1h" })],
|
|
116
114
|
config: {
|
|
117
115
|
drivers: {
|
|
118
|
-
clock: {
|
|
116
|
+
clock: { dev: "file" },
|
|
117
|
+
store: { sql: { dev: "memory" }, kv: { dev: "memory" } },
|
|
119
118
|
},
|
|
120
119
|
},
|
|
121
120
|
});
|
|
@@ -135,12 +134,13 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
135
134
|
try {
|
|
136
135
|
await expect(
|
|
137
136
|
bootApplication({
|
|
138
|
-
env: "
|
|
137
|
+
env: "dev",
|
|
139
138
|
startScheduler: false,
|
|
140
139
|
clocks: [clock("tick", { every: "1h" })],
|
|
141
140
|
config: {
|
|
142
141
|
drivers: {
|
|
143
|
-
clock: {
|
|
142
|
+
clock: { dev: "postgres" },
|
|
143
|
+
store: { sql: { dev: "memory" }, kv: { dev: "memory" } },
|
|
144
144
|
},
|
|
145
145
|
},
|
|
146
146
|
}),
|
|
@@ -155,7 +155,7 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
155
155
|
|
|
156
156
|
test("journal: durable flow binds memory journal by default", async () => {
|
|
157
157
|
const result = await bootApplication({
|
|
158
|
-
env: "
|
|
158
|
+
env: "test",
|
|
159
159
|
startScheduler: false,
|
|
160
160
|
flows: [flow("charge", { durable: true, do: () => ({ ok: true }) })],
|
|
161
161
|
});
|
|
@@ -170,7 +170,7 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
170
170
|
|
|
171
171
|
test("journal: no durable flow → no journal runtime", async () => {
|
|
172
172
|
const result = await bootApplication({
|
|
173
|
-
env: "
|
|
173
|
+
env: "test",
|
|
174
174
|
startScheduler: false,
|
|
175
175
|
flows: [flow("plain", { do: () => ({ ok: true }) })],
|
|
176
176
|
});
|
|
@@ -185,12 +185,12 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
185
185
|
tmp = await mkdtemp(join(tmpdir(), "oke-journal-file-"));
|
|
186
186
|
process.chdir(tmp);
|
|
187
187
|
const result = await bootApplication({
|
|
188
|
-
env: "
|
|
188
|
+
env: "test",
|
|
189
189
|
startScheduler: false,
|
|
190
190
|
flows: [flow("charge", { durable: true, do: () => ({ ok: true }) })],
|
|
191
191
|
config: {
|
|
192
192
|
drivers: {
|
|
193
|
-
journal: {
|
|
193
|
+
journal: { test: "file" },
|
|
194
194
|
},
|
|
195
195
|
},
|
|
196
196
|
});
|
|
@@ -209,12 +209,12 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
209
209
|
try {
|
|
210
210
|
await expect(
|
|
211
211
|
bootApplication({
|
|
212
|
-
env: "
|
|
212
|
+
env: "test",
|
|
213
213
|
startScheduler: false,
|
|
214
214
|
flows: [flow("charge", { durable: true, do: () => ({ ok: true }) })],
|
|
215
215
|
config: {
|
|
216
216
|
drivers: {
|
|
217
|
-
journal: {
|
|
217
|
+
journal: { test: "postgres" },
|
|
218
218
|
},
|
|
219
219
|
},
|
|
220
220
|
}),
|
|
@@ -230,12 +230,12 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
230
230
|
test("journal: unknown driver fails loud", async () => {
|
|
231
231
|
await expect(
|
|
232
232
|
bootApplication({
|
|
233
|
-
env: "
|
|
233
|
+
env: "test",
|
|
234
234
|
startScheduler: false,
|
|
235
235
|
flows: [flow("charge", { durable: true, do: () => ({ ok: true }) })],
|
|
236
236
|
config: {
|
|
237
237
|
drivers: {
|
|
238
|
-
journal: {
|
|
238
|
+
journal: { test: "neon" },
|
|
239
239
|
},
|
|
240
240
|
},
|
|
241
241
|
}),
|
|
@@ -245,13 +245,13 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
245
245
|
test("gate: drivers.store.kv redis opens redis-backed oke:gates", async () => {
|
|
246
246
|
const fake = createRedisFakeClient();
|
|
247
247
|
const result = await bootApplication({
|
|
248
|
-
env: "
|
|
248
|
+
env: "test",
|
|
249
249
|
gates: [gate.rate({ max: 10, per: "1m" })],
|
|
250
250
|
clients: { kv: fake },
|
|
251
251
|
config: {
|
|
252
252
|
drivers: {
|
|
253
253
|
store: {
|
|
254
|
-
kv: {
|
|
254
|
+
kv: { test: "redis", dev: "redis", prod: "redis" },
|
|
255
255
|
},
|
|
256
256
|
},
|
|
257
257
|
},
|
|
@@ -268,12 +268,12 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
268
268
|
delete process.env.OKE_STORE_KV_URL;
|
|
269
269
|
await expect(
|
|
270
270
|
bootApplication({
|
|
271
|
-
env: "
|
|
271
|
+
env: "test",
|
|
272
272
|
gates: [gate.rate({ max: 10, per: "1m" })],
|
|
273
273
|
config: {
|
|
274
274
|
drivers: {
|
|
275
275
|
store: {
|
|
276
|
-
kv: {
|
|
276
|
+
kv: { test: "redis", dev: "redis", prod: "redis" },
|
|
277
277
|
},
|
|
278
278
|
},
|
|
279
279
|
},
|
|
@@ -283,12 +283,12 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
283
283
|
|
|
284
284
|
test("gate: drivers.store.kv memory keeps memory oke:gates", async () => {
|
|
285
285
|
const result = await bootApplication({
|
|
286
|
-
env: "
|
|
286
|
+
env: "test",
|
|
287
287
|
gates: [gate.rate({ max: 10, per: "1m" })],
|
|
288
288
|
config: {
|
|
289
289
|
drivers: {
|
|
290
290
|
store: {
|
|
291
|
-
kv: {
|
|
291
|
+
kv: { dev: "redis", test: "memory", prod: "redis" },
|
|
292
292
|
},
|
|
293
293
|
},
|
|
294
294
|
},
|
|
@@ -302,11 +302,11 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
302
302
|
|
|
303
303
|
test("signal: drivers.signal memory binds memory", async () => {
|
|
304
304
|
const result = await bootApplication({
|
|
305
|
-
env: "
|
|
305
|
+
env: "test",
|
|
306
306
|
signals: [signal("ping", { delivery: "once" })],
|
|
307
307
|
config: {
|
|
308
308
|
drivers: {
|
|
309
|
-
signal: {
|
|
309
|
+
signal: { dev: "redis", test: "memory", prod: "redis" },
|
|
310
310
|
},
|
|
311
311
|
},
|
|
312
312
|
});
|
|
@@ -320,12 +320,12 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
320
320
|
test("signal: drivers.signal redis binds redis", async () => {
|
|
321
321
|
const fake = createSignalRedisFake();
|
|
322
322
|
const result = await bootApplication({
|
|
323
|
-
env: "
|
|
323
|
+
env: "test",
|
|
324
324
|
signals: [signal("ping", { delivery: "once" })],
|
|
325
325
|
clients: { signalRedis: fake },
|
|
326
326
|
config: {
|
|
327
327
|
drivers: {
|
|
328
|
-
signal: {
|
|
328
|
+
signal: { test: "redis", dev: "redis", prod: "redis" },
|
|
329
329
|
},
|
|
330
330
|
},
|
|
331
331
|
});
|
|
@@ -339,11 +339,11 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
339
339
|
test("signal: drivers.signal postgres fails loud (never silent memory)", async () => {
|
|
340
340
|
await expect(
|
|
341
341
|
bootApplication({
|
|
342
|
-
env: "
|
|
342
|
+
env: "test",
|
|
343
343
|
signals: [signal("ping", { delivery: "once" })],
|
|
344
344
|
config: {
|
|
345
345
|
drivers: {
|
|
346
|
-
signal: {
|
|
346
|
+
signal: { test: "postgres" },
|
|
347
347
|
},
|
|
348
348
|
},
|
|
349
349
|
}),
|
|
@@ -353,11 +353,11 @@ describe("boot binders honour drivers.* config", () => {
|
|
|
353
353
|
test("signal: drivers.signal nats fails loud", async () => {
|
|
354
354
|
await expect(
|
|
355
355
|
bootApplication({
|
|
356
|
-
env: "
|
|
356
|
+
env: "test",
|
|
357
357
|
signals: [signal("ping", { delivery: "once" })],
|
|
358
358
|
config: {
|
|
359
359
|
drivers: {
|
|
360
|
-
signal: {
|
|
360
|
+
signal: { test: "nats" },
|
|
361
361
|
},
|
|
362
362
|
},
|
|
363
363
|
}),
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
} from "../journal.ts";
|
|
13
13
|
import { createPostgresJournalStore } from "../../drivers/journal-postgres.ts";
|
|
14
14
|
import { resolveDriverId, type ConfigEnv } from "../../config/index.ts";
|
|
15
|
+
import { JOURNAL_DEFAULTS } from "../../config/driver-defaults.ts";
|
|
15
16
|
import type { BootOptions } from "../boot.ts";
|
|
16
17
|
|
|
17
18
|
/** Bound journal runtime — store + this instance's lease identity. */
|
|
@@ -37,9 +38,8 @@ export const DEFAULT_FILE_JOURNAL_PATH = ".oke/journal.json";
|
|
|
37
38
|
* @param env - Active environment
|
|
38
39
|
*/
|
|
39
40
|
export function resolveJournalDriverId(options: BootOptions, env: ConfigEnv): string {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
return "memory";
|
|
41
|
+
// Defaults cover every ConfigEnv key, so this is never undefined.
|
|
42
|
+
return resolveDriverId(options.config?.drivers?.journal, env, JOURNAL_DEFAULTS)!;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
/**
|
|
@@ -66,8 +66,8 @@ export async function bindJournal(
|
|
|
66
66
|
const url = process.env.DATABASE_URL ?? process.env.OKE_STORE_SQL_URL ?? undefined;
|
|
67
67
|
if (!url) {
|
|
68
68
|
throw new Error(
|
|
69
|
-
env === "
|
|
70
|
-
? 'oke boot: journal driver "postgres" needs DATABASE_URL (did `oke dev
|
|
69
|
+
env === "dev"
|
|
70
|
+
? 'oke boot: journal driver "postgres" needs DATABASE_URL (did `oke dev` write docker/.env.docker?)'
|
|
71
71
|
: 'oke boot: journal driver "postgres" needs DATABASE_URL',
|
|
72
72
|
);
|
|
73
73
|
}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { resolveDriverId, type ConfigEnv } from "../../config/index.ts";
|
|
6
|
+
import { SIGNAL_DEFAULTS } from "../../config/driver-defaults.ts";
|
|
6
7
|
import { memorySignalDriver } from "../../drivers/signal-memory.ts";
|
|
7
8
|
import { createBunSignalRedisClient, redisSignalDriver } from "../../drivers/signal-redis.ts";
|
|
8
9
|
import type { SignalRedisClientLike } from "../../drivers/signal-types.ts";
|
|
@@ -17,7 +18,8 @@ import type { BootOptions } from "../boot.ts";
|
|
|
17
18
|
* @param env - Active environment
|
|
18
19
|
*/
|
|
19
20
|
export function resolveSignalDriverId(options: BootOptions, env: ConfigEnv): string {
|
|
20
|
-
|
|
21
|
+
// Defaults cover every ConfigEnv key, so this is never undefined.
|
|
22
|
+
return resolveDriverId(options.config?.drivers?.signal, env, SIGNAL_DEFAULTS)!;
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
function redisUrlFor(docker: boolean): string | undefined {
|
|
@@ -36,47 +36,65 @@ describe("bindStore driver resolution", () => {
|
|
|
36
36
|
else process.env.OKE_INDEX_DRIVER = prev.index;
|
|
37
37
|
});
|
|
38
38
|
|
|
39
|
-
test("
|
|
39
|
+
test("test env keeps pglite / memory / fs from config", () => {
|
|
40
40
|
const options = {
|
|
41
41
|
config: {
|
|
42
42
|
drivers: {
|
|
43
43
|
store: {
|
|
44
|
-
sql: {
|
|
45
|
-
kv: {
|
|
46
|
-
files: {
|
|
44
|
+
sql: { dev: "postgres", test: "pglite", prod: "postgres" },
|
|
45
|
+
kv: { dev: "redis", test: "memory", prod: "redis" },
|
|
46
|
+
files: { dev: "s3", test: "fs", prod: "s3" },
|
|
47
47
|
},
|
|
48
48
|
},
|
|
49
49
|
},
|
|
50
50
|
};
|
|
51
|
-
expect(resolveSqlDriverId(options, "
|
|
52
|
-
expect(resolveKvDriverId(options, "
|
|
53
|
-
expect(resolveFilesDriverId(options, "
|
|
51
|
+
expect(resolveSqlDriverId(options, "test", false)).toBe("pglite");
|
|
52
|
+
expect(resolveKvDriverId(options, "test", false)).toBe("memory");
|
|
53
|
+
expect(resolveFilesDriverId(options, "test", false)).toBe("fs");
|
|
54
54
|
});
|
|
55
55
|
|
|
56
|
-
test("
|
|
56
|
+
test("dev env uses compose profile (falls back to prod)", () => {
|
|
57
57
|
const options = {
|
|
58
58
|
config: {
|
|
59
59
|
drivers: {
|
|
60
60
|
store: {
|
|
61
|
-
sql: {
|
|
62
|
-
kv: {
|
|
63
|
-
files: {
|
|
61
|
+
sql: { dev: "postgres", test: "pglite", prod: "postgres" },
|
|
62
|
+
kv: { dev: "redis", test: "memory", prod: "redis" },
|
|
63
|
+
files: { dev: "s3", test: "fs", prod: "s3" },
|
|
64
64
|
},
|
|
65
65
|
},
|
|
66
66
|
},
|
|
67
67
|
};
|
|
68
|
-
expect(resolveSqlDriverId(options, "
|
|
69
|
-
expect(resolveKvDriverId(options, "
|
|
70
|
-
expect(resolveFilesDriverId(options, "
|
|
68
|
+
expect(resolveSqlDriverId(options, "dev", true)).toBe("postgres");
|
|
69
|
+
expect(resolveKvDriverId(options, "dev", true)).toBe("redis");
|
|
70
|
+
expect(resolveFilesDriverId(options, "dev", true)).toBe("s3");
|
|
71
71
|
});
|
|
72
72
|
|
|
73
73
|
test("docker mode honours OKE_*_DRIVER overrides", () => {
|
|
74
74
|
process.env.OKE_SQL_DRIVER = "postgres";
|
|
75
75
|
process.env.OKE_KV_DRIVER = "redis";
|
|
76
76
|
process.env.OKE_FILES_DRIVER = "s3";
|
|
77
|
-
expect(resolveSqlDriverId({}, "
|
|
78
|
-
expect(resolveKvDriverId({}, "
|
|
79
|
-
expect(resolveFilesDriverId({}, "
|
|
77
|
+
expect(resolveSqlDriverId({}, "dev", true)).toBe("postgres");
|
|
78
|
+
expect(resolveKvDriverId({}, "dev", true)).toBe("redis");
|
|
79
|
+
expect(resolveFilesDriverId({}, "dev", true)).toBe("s3");
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
test("pinning only `test` never leaks into dev/prod — each keeps its real default", () => {
|
|
83
|
+
const options = {
|
|
84
|
+
config: {
|
|
85
|
+
drivers: {
|
|
86
|
+
store: {
|
|
87
|
+
sql: { test: "pglite" },
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
expect(resolveSqlDriverId(options, "test", false)).toBe("pglite");
|
|
93
|
+
expect(resolveSqlDriverId(options, "dev", true)).toBe("postgres");
|
|
94
|
+
expect(resolveSqlDriverId(options, "prod", true)).toBe("postgres");
|
|
95
|
+
// kv / files are untouched by the sql-only override.
|
|
96
|
+
expect(resolveKvDriverId(options, "test", false)).toBe("memory");
|
|
97
|
+
expect(resolveKvDriverId(options, "dev", true)).toBe("redis");
|
|
80
98
|
});
|
|
81
99
|
});
|
|
82
100
|
|
|
@@ -99,12 +117,12 @@ describe("bindStore files fs multi-instance warn", () => {
|
|
|
99
117
|
config: {
|
|
100
118
|
drivers: {
|
|
101
119
|
store: {
|
|
102
|
-
files: {
|
|
120
|
+
files: { dev: "s3", test: "fs", prod: "s3" },
|
|
103
121
|
},
|
|
104
122
|
},
|
|
105
123
|
},
|
|
106
124
|
},
|
|
107
|
-
"
|
|
125
|
+
"test",
|
|
108
126
|
() => Date.now(),
|
|
109
127
|
false,
|
|
110
128
|
);
|
|
@@ -114,12 +132,12 @@ describe("bindStore files fs multi-instance warn", () => {
|
|
|
114
132
|
config: {
|
|
115
133
|
drivers: {
|
|
116
134
|
store: {
|
|
117
|
-
files: {
|
|
135
|
+
files: { dev: "s3", test: "fs", prod: "s3" },
|
|
118
136
|
},
|
|
119
137
|
},
|
|
120
138
|
},
|
|
121
139
|
},
|
|
122
|
-
"
|
|
140
|
+
"test",
|
|
123
141
|
() => Date.now(),
|
|
124
142
|
false,
|
|
125
143
|
);
|
|
@@ -143,12 +161,12 @@ describe("bindStore files fs multi-instance warn", () => {
|
|
|
143
161
|
config: {
|
|
144
162
|
drivers: {
|
|
145
163
|
store: {
|
|
146
|
-
files: {
|
|
164
|
+
files: { dev: "s3", test: "memory", prod: "s3" },
|
|
147
165
|
},
|
|
148
166
|
},
|
|
149
167
|
},
|
|
150
168
|
},
|
|
151
|
-
"
|
|
169
|
+
"test",
|
|
152
170
|
() => Date.now(),
|
|
153
171
|
false,
|
|
154
172
|
);
|
|
@@ -168,8 +186,8 @@ describe("bindStore index driver resolution", () => {
|
|
|
168
186
|
});
|
|
169
187
|
|
|
170
188
|
test("defaults to memory when no index driver is configured", () => {
|
|
171
|
-
expect(resolveIndexDriverId({}, "
|
|
172
|
-
expect(resolveIndexDriverId({}, "
|
|
189
|
+
expect(resolveIndexDriverId({}, "test", false)).toBe("memory");
|
|
190
|
+
expect(resolveIndexDriverId({}, "dev", true)).toBe("memory");
|
|
173
191
|
expect(indexDriverFor("memory").id).toBe("memory");
|
|
174
192
|
});
|
|
175
193
|
|
|
@@ -178,37 +196,37 @@ describe("bindStore index driver resolution", () => {
|
|
|
178
196
|
config: {
|
|
179
197
|
drivers: {
|
|
180
198
|
store: {
|
|
181
|
-
index: {
|
|
199
|
+
index: { dev: "pgvector", test: "memory", prod: "pgvector" },
|
|
182
200
|
},
|
|
183
201
|
},
|
|
184
202
|
},
|
|
185
203
|
};
|
|
186
|
-
expect(resolveIndexDriverId(options, "
|
|
187
|
-
expect(resolveIndexDriverId(options, "
|
|
204
|
+
expect(resolveIndexDriverId(options, "test", false)).toBe("memory");
|
|
205
|
+
expect(resolveIndexDriverId(options, "dev", true)).toBe("pgvector");
|
|
188
206
|
expect(resolveIndexDriverId(options, "prod", false)).toBe("pgvector");
|
|
189
207
|
});
|
|
190
208
|
|
|
191
|
-
test("
|
|
209
|
+
test("pgvector resolves from config", () => {
|
|
192
210
|
const options = {
|
|
193
|
-
config: { drivers: { store: { index: {
|
|
211
|
+
config: { drivers: { store: { index: { test: "pgvector" } } } },
|
|
194
212
|
};
|
|
195
|
-
expect(resolveIndexDriverId(options, "
|
|
196
|
-
expect(indexDriverFor("
|
|
213
|
+
expect(resolveIndexDriverId(options, "test", false)).toBe("pgvector");
|
|
214
|
+
expect(indexDriverFor("pgvector").id).toBe("pgvector");
|
|
197
215
|
});
|
|
198
216
|
|
|
199
217
|
test("meilisearch resolves from config as a fourth id", () => {
|
|
200
218
|
const options = {
|
|
201
|
-
config: { drivers: { store: { index: {
|
|
219
|
+
config: { drivers: { store: { index: { dev: "meilisearch", test: "meilisearch" } } } },
|
|
202
220
|
};
|
|
203
|
-
expect(resolveIndexDriverId(options, "
|
|
204
|
-
expect(resolveIndexDriverId(options, "
|
|
221
|
+
expect(resolveIndexDriverId(options, "test", false)).toBe("meilisearch");
|
|
222
|
+
expect(resolveIndexDriverId(options, "dev", true)).toBe("meilisearch");
|
|
205
223
|
expect(indexDriverFor("meilisearch").id).toBe("meilisearch");
|
|
206
224
|
});
|
|
207
225
|
|
|
208
226
|
test("docker mode honours OKE_INDEX_DRIVER override", () => {
|
|
209
227
|
process.env.OKE_INDEX_DRIVER = "pgvector";
|
|
210
|
-
expect(resolveIndexDriverId({}, "
|
|
211
|
-
expect(resolveIndexDriverId({}, "
|
|
228
|
+
expect(resolveIndexDriverId({}, "dev", true)).toBe("pgvector");
|
|
229
|
+
expect(resolveIndexDriverId({}, "test", false)).toBe("memory");
|
|
212
230
|
});
|
|
213
231
|
|
|
214
232
|
test("indexDriverFor returns the configured driver and throws on unknown ids", () => {
|
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { resolveDomainDdlMode, resolveDriverId, type ConfigEnv } from "../../config/index.ts";
|
|
6
|
+
import {
|
|
7
|
+
STORE_FILES_DEFAULTS,
|
|
8
|
+
STORE_KV_DEFAULTS,
|
|
9
|
+
STORE_SQL_DEFAULTS,
|
|
10
|
+
} from "../../config/driver-defaults.ts";
|
|
6
11
|
import { fsDriver } from "../../drivers/fs.ts";
|
|
7
|
-
import { libsqlDriver, libsqlIndexDriver } from "../../drivers/libsql.ts";
|
|
8
12
|
import { meilisearchDriver } from "../../drivers/meilisearch.ts";
|
|
9
13
|
import { memoryDrivers } from "../../drivers/memory.ts";
|
|
10
14
|
import { pgliteDriver } from "../../drivers/pglite.ts";
|
|
@@ -12,7 +16,6 @@ import { pgvectorDriver } from "../../drivers/pgvector.ts";
|
|
|
12
16
|
import { postgresDriver } from "../../drivers/postgres.ts";
|
|
13
17
|
import { redisDriver } from "../../drivers/redis.ts";
|
|
14
18
|
import { s3Driver } from "../../drivers/s3.ts";
|
|
15
|
-
import { sqliteDriver } from "../../drivers/sqlite.ts";
|
|
16
19
|
import type { FilesDriver, IndexDriver, KvDriver, SqlDriver } from "../../drivers/types.ts";
|
|
17
20
|
import { createStoreRuntime, type StoreRuntime } from "../../elements/store.ts";
|
|
18
21
|
import type { StoreDecl } from "../../elements/store/declare.ts";
|
|
@@ -22,8 +25,8 @@ import type { BootOptions } from "../boot.ts"; // type-only — no cycle at runt
|
|
|
22
25
|
/**
|
|
23
26
|
* Construct a Store runtime and register facet declarations.
|
|
24
27
|
*
|
|
25
|
-
*
|
|
26
|
-
* `docker`
|
|
28
|
+
* With compose infra (`OKE_DOCKER=1` / `oke dev`), SQL/KV URLs come from
|
|
29
|
+
* `docker/.env.docker`. `env: "test"` uses PGLite (`memory://` by default).
|
|
27
30
|
*
|
|
28
31
|
* @param options - Boot options
|
|
29
32
|
* @param env - Active environment
|
|
@@ -62,7 +65,7 @@ export function bindStore(
|
|
|
62
65
|
const filesId = resolveFilesDriverId(options, env, docker);
|
|
63
66
|
const indexId = resolveIndexDriverId(options, env, docker);
|
|
64
67
|
if (filesId === "fs") warnFilesFsMultiInstance();
|
|
65
|
-
const sqlUrl = sqlUrlFor(sqlId, docker);
|
|
68
|
+
const sqlUrl = sqlUrlFor(sqlId, docker, env);
|
|
66
69
|
const kvUrl = kvUrlFor(kvId, docker);
|
|
67
70
|
const filesRoot = filesRootFor(filesId);
|
|
68
71
|
|
|
@@ -138,9 +141,8 @@ function resolveAutoPush(options: BootOptions): boolean {
|
|
|
138
141
|
export function resolveSqlDriverId(options: BootOptions, env: ConfigEnv, docker: boolean): string {
|
|
139
142
|
const fromEnv = process.env.OKE_SQL_DRIVER?.trim();
|
|
140
143
|
if (docker && fromEnv) return fromEnv;
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
return docker ? "postgres" : "memory";
|
|
144
|
+
// Defaults cover every ConfigEnv key, so this is never undefined.
|
|
145
|
+
return resolveDriverId(options.config?.drivers?.store?.sql, env, STORE_SQL_DEFAULTS)!;
|
|
144
146
|
}
|
|
145
147
|
|
|
146
148
|
/**
|
|
@@ -151,9 +153,8 @@ export function resolveSqlDriverId(options: BootOptions, env: ConfigEnv, docker:
|
|
|
151
153
|
export function resolveKvDriverId(options: BootOptions, env: ConfigEnv, docker: boolean): string {
|
|
152
154
|
const fromEnv = process.env.OKE_KV_DRIVER?.trim();
|
|
153
155
|
if (docker && fromEnv) return fromEnv;
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
return docker ? "redis" : "memory";
|
|
156
|
+
// Defaults cover every ConfigEnv key, so this is never undefined.
|
|
157
|
+
return resolveDriverId(options.config?.drivers?.store?.kv, env, STORE_KV_DEFAULTS)!;
|
|
157
158
|
}
|
|
158
159
|
|
|
159
160
|
/**
|
|
@@ -168,15 +169,14 @@ export function resolveFilesDriverId(
|
|
|
168
169
|
): string {
|
|
169
170
|
const fromEnv = process.env.OKE_FILES_DRIVER?.trim();
|
|
170
171
|
if (docker && fromEnv) return fromEnv;
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
return docker ? "s3" : "memory";
|
|
172
|
+
// Defaults cover every ConfigEnv key, so this is never undefined.
|
|
173
|
+
return resolveDriverId(options.config?.drivers?.store?.files, env, STORE_FILES_DEFAULTS)!;
|
|
174
174
|
}
|
|
175
175
|
|
|
176
176
|
/**
|
|
177
177
|
* Index driver — same resolution chain as sql/kv/files. Defaults to `memory`;
|
|
178
|
-
* a configured `pgvector`
|
|
179
|
-
*
|
|
178
|
+
* a configured `pgvector` is honoured at real boot (and fails loud if its
|
|
179
|
+
* SQL engine or peer is missing — never silently back to memory).
|
|
180
180
|
*
|
|
181
181
|
* @param options - Boot options
|
|
182
182
|
* @param env - Active env
|
|
@@ -198,10 +198,6 @@ function sqlDriverFor(id: string): SqlDriver {
|
|
|
198
198
|
switch (id) {
|
|
199
199
|
case "postgres":
|
|
200
200
|
return postgresDriver;
|
|
201
|
-
case "sqlite":
|
|
202
|
-
return sqliteDriver;
|
|
203
|
-
case "libsql":
|
|
204
|
-
return libsqlDriver;
|
|
205
201
|
case "pglite":
|
|
206
202
|
return pgliteDriver;
|
|
207
203
|
case "memory":
|
|
@@ -245,8 +241,6 @@ export function indexDriverFor(id: string): IndexDriver {
|
|
|
245
241
|
return memoryDrivers.index;
|
|
246
242
|
case "pgvector":
|
|
247
243
|
return pgvectorDriver;
|
|
248
|
-
case "libsql":
|
|
249
|
-
return libsqlIndexDriver;
|
|
250
244
|
case "meilisearch":
|
|
251
245
|
return meilisearchDriver;
|
|
252
246
|
default:
|
|
@@ -254,28 +248,24 @@ export function indexDriverFor(id: string): IndexDriver {
|
|
|
254
248
|
}
|
|
255
249
|
}
|
|
256
250
|
|
|
257
|
-
function sqlUrlFor(sqlId: string, docker: boolean): string {
|
|
251
|
+
function sqlUrlFor(sqlId: string, docker: boolean, env: ConfigEnv): string {
|
|
258
252
|
if (sqlId === "postgres") {
|
|
259
253
|
const url = process.env.DATABASE_URL ?? process.env.OKE_STORE_SQL_URL ?? undefined;
|
|
260
254
|
if (!url) {
|
|
261
255
|
throw new Error(
|
|
262
256
|
docker
|
|
263
|
-
? "oke boot: postgres driver needs DATABASE_URL (did `oke dev
|
|
257
|
+
? "oke boot: postgres driver needs DATABASE_URL (did `oke dev` write docker/.env.docker?)"
|
|
264
258
|
: "oke boot: postgres driver needs DATABASE_URL",
|
|
265
259
|
);
|
|
266
260
|
}
|
|
267
261
|
return url;
|
|
268
262
|
}
|
|
269
|
-
if (sqlId === "sqlite") {
|
|
270
|
-
return process.env.OKE_SQLITE_URL ?? ".oke/app.sqlite";
|
|
271
|
-
}
|
|
272
|
-
if (sqlId === "libsql") {
|
|
273
|
-
return process.env.OKE_LIBSQL_URL ?? ".oke/app.libsql";
|
|
274
|
-
}
|
|
275
263
|
if (sqlId === "pglite") {
|
|
276
|
-
return process.env.OKE_PGLITE_URL ?? ".oke/pgdata";
|
|
264
|
+
return process.env.OKE_PGLITE_URL ?? (env === "test" ? "memory://" : ".oke/pgdata");
|
|
277
265
|
}
|
|
278
|
-
|
|
266
|
+
// In-process `memory` SQL driver ignores URL; keep a non-path token so a
|
|
267
|
+
// mis-wired pglite connect never creates a literal `./:memory:` datadir.
|
|
268
|
+
return "memory://";
|
|
279
269
|
}
|
|
280
270
|
|
|
281
271
|
function kvUrlFor(kvId: string, docker: boolean): string | undefined {
|
|
@@ -284,7 +274,7 @@ function kvUrlFor(kvId: string, docker: boolean): string | undefined {
|
|
|
284
274
|
if (!url) {
|
|
285
275
|
throw new Error(
|
|
286
276
|
docker
|
|
287
|
-
? "oke boot: redis driver needs REDIS_URL (did `oke dev
|
|
277
|
+
? "oke boot: redis driver needs REDIS_URL (did `oke dev` write docker/.env.docker?)"
|
|
288
278
|
: "oke boot: redis driver needs REDIS_URL",
|
|
289
279
|
);
|
|
290
280
|
}
|
|
@@ -302,7 +292,7 @@ function indexUrlFor(docker: boolean): string {
|
|
|
302
292
|
if (!url) {
|
|
303
293
|
throw new Error(
|
|
304
294
|
docker
|
|
305
|
-
? "oke boot: meilisearch index needs OKE_STORE_INDEX_URL (did `oke dev
|
|
295
|
+
? "oke boot: meilisearch index needs OKE_STORE_INDEX_URL (did `oke dev` write docker/.env.docker?)"
|
|
306
296
|
: "oke boot: meilisearch index needs OKE_STORE_INDEX_URL",
|
|
307
297
|
);
|
|
308
298
|
}
|