@voltro/cli 0.23.0 → 0.24.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/CHANGELOG.md +111 -0
- package/bin/voltro.mjs +39 -4
- package/dist/{apiBuild-JQtIhZPy.js → apiBuild-B2m4XK_8.js} +44 -22
- package/dist/apiBuild-UEM3QBke.js +2 -0
- package/dist/bin.js +2 -2
- package/dist/{commands-Bsu9Buln.js → commands-CaIhTsC2.js} +2565 -2444
- package/dist/{dbCommand-GI7-BVZt.js → dbCommand-CC61CsAc.js} +248 -218
- package/dist/dbCommand-Cr__4ATv.js +2 -0
- package/dist/{dev-DRxF_qOB.js → dev-DPkQVUTP.js} +1 -1
- package/dist/{dev-jM07kq_D.js → dev-NCuEhNxs.js} +1039 -1021
- package/dist/index.js +1 -1
- package/dist/{serveCommand-Cl8sicD5.js → serveCommand-C4gzDZzc.js} +349 -336
- package/dist/serveEntry.js +1 -1
- package/package.json +17 -17
- package/templates/agent-docs/authentication.md +21 -0
- package/templates/agent-docs/cli.md +17 -0
- package/templates/agent-docs/data.md +185 -165
- package/templates/agent-docs/database/migrations.md +92 -63
- package/templates/agent-docs/database/seedsdialects.md +12 -0
- package/templates/agent-docs/deployment.md +66 -1
- package/templates/agent-docs/workflows.md +30 -0
- package/templates/apps/api-ai/package.json +8 -7
- package/templates/apps/api-auth/package.json +9 -8
- package/templates/apps/api-backend/package.json +8 -7
- package/templates/apps/api-backend-deactivation/package.json +8 -7
- package/templates/apps/api-backend-mail/package.json +9 -8
- package/templates/apps/api-backend-mariadb/package.json +10 -9
- package/templates/apps/api-backend-storage/package.json +9 -8
- package/templates/apps/api-data-advanced/package.json +9 -8
- package/templates/apps/api-durable/package.json +9 -8
- package/templates/apps/api-feature-flags/package.json +10 -9
- package/templates/apps/api-governance/package.json +9 -8
- package/templates/apps/api-kv/package.json +9 -8
- package/templates/apps/api-moderation/package.json +9 -8
- package/templates/apps/api-observability/package.json +9 -8
- package/templates/apps/api-ratelimit/package.json +9 -8
- package/templates/apps/api-rbac/package.json +9 -8
- package/templates/apps/api-rest/package.json +8 -7
- package/templates/apps/api-saas/package.json +12 -11
- package/templates/apps/api-search/package.json +9 -8
- package/templates/apps/api-versioning/package.json +9 -8
- package/templates/apps/api-webhooks/package.json +10 -9
- package/templates/apps/changelog/package.json +7 -6
- package/templates/apps/edge-functions/package.json +3 -2
- package/templates/apps/frontend-admin/package.json +9 -8
- package/templates/apps/frontend-app/package.json +9 -8
- package/templates/apps/frontend-blank/package.json +8 -7
- package/templates/apps/frontend-contact/package.json +8 -7
- package/templates/apps/frontend-contact/src/globals.d.ts +6 -0
- package/templates/apps/frontend-dashboard/package.json +8 -7
- package/templates/apps/frontend-docs/package.json +8 -7
- package/templates/apps/frontend-docs/src/globals.d.ts +6 -0
- package/templates/apps/frontend-i18n/package.json +7 -6
- package/templates/apps/frontend-landing/package.json +8 -7
- package/templates/apps/frontend-landing/src/globals.d.ts +6 -0
- package/templates/apps/frontend-spa/package.json +8 -7
- package/templates/apps/frontend-spa/src/globals.d.ts +6 -0
- package/templates/apps/frontend-ssr/package.json +8 -7
- package/templates/apps/frontend-ssr/src/globals.d.ts +6 -0
- package/templates/apps/frontend-ssr-api/package.json +9 -8
- package/templates/apps/frontend-static-blog/package.json +7 -6
- package/templates/apps/frontend-static-blog/src/globals.d.ts +6 -0
- package/dist/apiBuild-CD-4JLLA.js +0 -2
- package/dist/dbCommand-CSguuUQn.js +0 -2
|
@@ -225,6 +225,18 @@ DB_URL=file:./db.sqlite # or `:memory:` for ephemeral
|
|
|
225
225
|
|
|
226
226
|
The `app.config.ts` `store:` field stays as the dev-friendly shortcut (`store: 'postgres'`, `store: 'memory'`) — env always wins.
|
|
227
227
|
|
|
228
|
+
### Query timeout — bound a runaway query
|
|
229
|
+
|
|
230
|
+
```sh
|
|
231
|
+
DB_STATEMENT_TIMEOUT_MS=30000 # cancel any single query after 30s
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
A missing index or an accidental cartesian join can run for minutes, and while it does it **pins a pooled connection**. Enough of them under load and the pool is exhausted — every other request now waits on a connection that will never free, and the whole app stalls. `DB_STATEMENT_TIMEOUT_MS` puts a ceiling on it: a query that outlasts the deadline is cancelled, its connection returns to the pool, and the caller gets a normal error instead of a hang.
|
|
235
|
+
|
|
236
|
+
It applies to the **runtime query path only**. Migrations (`voltro db apply`) run legitimately long statements — backfills, index builds — and are **never** cancelled by it. (Caveat: `voltro dev`'s boot auto-migrate shares the app connection, so a very slow dev migration under a low timeout would trip it — raise the value, or run `voltro db apply` first.)
|
|
237
|
+
|
|
238
|
+
**Wired for postgres today** (the default dialect), where it maps to the server-side `statement_timeout` — a real, server-enforced cancel (SQLSTATE `57014`), not a client-side disconnect that leaves the query running. Other dialects accept the variable but currently ignore it, and the reasons are honest rather than incidental: `@effect/sql-mssql` exposes only a connection-establishment timeout, not a per-request one; MySQL/MariaDB's `max_execution_time` bounds `SELECT`s only (writes stay unbounded), which would be a misleading half-guarantee; and SQLite is in-process with a single connection, so there is no pool to protect. Unset (or any non-postgres dialect) = no timeout.
|
|
239
|
+
|
|
228
240
|
## Local development — bring up all five
|
|
229
241
|
|
|
230
242
|
The framework ships a docker-compose at `voltro/test/docker-compose.yml` that brings up postgres + mysql + mariadb + mssql on distinct ports so per-dialect tests can run side-by-side and the dev fixture never clashes with your starter postgres on `:5432`:
|
|
@@ -918,6 +918,44 @@ under `NODE_ENV=production` (it refuses unless both fingerprints still match the
|
|
|
918
918
|
reviewed plan). A Job runs **once per release** vs an `initContainer`'s once per
|
|
919
919
|
replica, so it's the better fit for a multi-replica rollout.
|
|
920
920
|
|
|
921
|
+
### Expand/contract — the migration that's safe while old pods still serve
|
|
922
|
+
|
|
923
|
+
The pre-deploy Job applies the schema **before the new pods roll** — so during a
|
|
924
|
+
rolling update, old pods (old code) run against the already-migrated schema for
|
|
925
|
+
the length of the rollout. A migration that DROPS or RENAMES a column, NARROWS a
|
|
926
|
+
type, or ADDS a constraint breaks those old pods mid-rollout: they 500 reading a
|
|
927
|
+
column that's gone, or their writes are rejected by the new constraint. The
|
|
928
|
+
migration "succeeded" and the app served errors anyway.
|
|
929
|
+
|
|
930
|
+
`voltro db plan` flags these — the operations unsafe under a rolling deploy are
|
|
931
|
+
listed with a `⚠`, separately from the data-safety (lossy / blocked) gate, since
|
|
932
|
+
the two are orthogonal: a `dropped()` column is blessed for data loss and *still*
|
|
933
|
+
breaks an old reader.
|
|
934
|
+
|
|
935
|
+
```text
|
|
936
|
+
⚠ 1 operation(s) UNSAFE under a rolling deploy
|
|
937
|
+
(old + new instances overlap → old code breaks against the new schema):
|
|
938
|
+
• drop-column: old instances still SELECT/INSERT "orders"."legacy_total"; …
|
|
939
|
+
→ stop reading the column in code and deploy that first; drop it in a LATER deploy
|
|
940
|
+
```
|
|
941
|
+
|
|
942
|
+
Two ways to handle it:
|
|
943
|
+
|
|
944
|
+
1. **No overlap window** — a maintenance-window or **scale-to-zero** deploy (old
|
|
945
|
+
pods gone before new ones start) has no simultaneous old code, so a single-step
|
|
946
|
+
drop/rename is fine. The advisory doesn't apply; ignore it.
|
|
947
|
+
2. **Zero-downtime rollout** — split the breaking change into two releases, each
|
|
948
|
+
of which keeps *both* code versions working (**expand/contract**):
|
|
949
|
+
- **Expand** (release N): add the new shape — a nullable column, a new table,
|
|
950
|
+
a backfill, dual-write from the new code. Old code ignores it.
|
|
951
|
+
- **Cut over**: the new code reads/writes the new shape; deploy it.
|
|
952
|
+
- **Contract** (release N+1): once no pod runs the old code, drop/rename/narrow
|
|
953
|
+
the now-unused old shape. This step's `db plan` is clean.
|
|
954
|
+
|
|
955
|
+
Renaming `orders.total` → `orders.amount` under zero downtime is: add `amount`
|
|
956
|
+
(expand) → backfill + dual-write → cut reads over → drop `total` (contract) — three
|
|
957
|
+
releases, never one, so no in-flight pod ever references a column that isn't there.
|
|
958
|
+
|
|
921
959
|
### If you DO run `voltro dev` in a cluster (dev / staging only)
|
|
922
960
|
|
|
923
961
|
`voltro dev` binds a small **boot-health surface** on its own port so a probe can
|
|
@@ -1059,6 +1097,33 @@ that route to a terminating pod before k8s finishes removing it from the Service
|
|
|
1059
1097
|
endpoints. With it, that window is drained. `terminationGracePeriodSeconds` must
|
|
1060
1098
|
be larger than the sleep plus the app's own teardown, or k8s SIGKILLs mid-drain.
|
|
1061
1099
|
|
|
1100
|
+
**Bound the app's own teardown with `VOLTRO_SHUTDOWN_GRACE_MS`.** After
|
|
1101
|
+
`SIGTERM`, the runtime runs its finalizers (pool close, plugin `onDeactivate`,
|
|
1102
|
+
analytics flush, trace persist) and then exits — but installing the signal
|
|
1103
|
+
handler removes node's default kill, so a finalizer that *never* completes (a
|
|
1104
|
+
pool drain against a database that is already gone, a wedged `onDeactivate`)
|
|
1105
|
+
would otherwise hang the process forever. A hard deadline caps that: teardown
|
|
1106
|
+
gets until the deadline, then the process exits regardless. It defaults to
|
|
1107
|
+
**10s**; set `VOLTRO_SHUTDOWN_GRACE_MS` (clamped to 1s–5min) to sit JUST UNDER
|
|
1108
|
+
your `terminationGracePeriodSeconds` minus the preStop sleep — so the app drains
|
|
1109
|
+
and exits *cleanly on its own* before k8s SIGKILLs it mid-drain:
|
|
1110
|
+
|
|
1111
|
+
```yaml
|
|
1112
|
+
spec:
|
|
1113
|
+
terminationGracePeriodSeconds: 30
|
|
1114
|
+
containers:
|
|
1115
|
+
- name: api
|
|
1116
|
+
env:
|
|
1117
|
+
# preStop sleep (5s) + app teardown (≤22s) < 30s grace, with headroom.
|
|
1118
|
+
- name: VOLTRO_SHUTDOWN_GRACE_MS
|
|
1119
|
+
value: "22000"
|
|
1120
|
+
```
|
|
1121
|
+
|
|
1122
|
+
The close is clean on the client side too: on shutdown each live WebSocket is
|
|
1123
|
+
closed with a proper close frame (not an abrupt socket drop), and the web
|
|
1124
|
+
client's supervisor reconnects on any close — so an open dashboard re-attaches
|
|
1125
|
+
to a healthy replica across a rolling deploy without a page reload.
|
|
1126
|
+
|
|
1062
1127
|
## 8. Multiple replicas
|
|
1063
1128
|
|
|
1064
1129
|
Cache and KV default to **in-process** (per-replica). For a shared backend across replicas:
|
|
@@ -1087,7 +1152,7 @@ Schedules and aggregates auto-coordinate via an advisory lock on SQL stores —
|
|
|
1087
1152
|
- [ ] `auth.anonymousTenantRequired: true` (unless the app serves anonymous public data)
|
|
1088
1153
|
- [ ] `OTEL_EXPORTER_OTLP_ENDPOINT` + `OTEL_SERVICE_NAME` pointed at your collector
|
|
1089
1154
|
- [ ] `VOLTRO_LOG_FORMAT=json`; `sentryPlugin()` + `SENTRY_DSN` for errors
|
|
1090
|
-
- [ ] `terminationGracePeriodSeconds` generous for graceful drain
|
|
1155
|
+
- [ ] `terminationGracePeriodSeconds` generous for graceful drain; `VOLTRO_SHUTDOWN_GRACE_MS` set just under it (minus the preStop sleep)
|
|
1091
1156
|
- [ ] `CACHE_BACKEND` / `KV_BACKEND` + a cross-replica change bus when running >1 replica
|
|
1092
1157
|
|
|
1093
1158
|
|
|
@@ -474,6 +474,36 @@ Workflow starts persist the starter subject, trace id, source, parent execution
|
|
|
474
474
|
|
|
475
475
|
Still include tenant/user ids that the business process must enforce in `payload`, validate them in the first step, and scope store reads/writes deliberately. Payload data is replay-safe and makes authorization decisions auditable across retries and deploys.
|
|
476
476
|
|
|
477
|
+
## Calling an HTTP API from a step
|
|
478
|
+
|
|
479
|
+
The framework's `HttpClient` is available inside a workflow executor — the same one handlers `yield*`, with the same SSRF allowlist and the same automatic `traceparent` propagation. `yield*` it in a step:
|
|
480
|
+
|
|
481
|
+
```ts
|
|
482
|
+
import { HttpClient, HttpClientRequest } from '@effect/platform'
|
|
483
|
+
|
|
484
|
+
export const executor = defineWorkflowExecutor(syncInvoice, (payload) =>
|
|
485
|
+
Effect.gen(function* () {
|
|
486
|
+
const remote = yield* step({ name: 'fetch-invoice' }, () =>
|
|
487
|
+
Effect.gen(function* () {
|
|
488
|
+
const client = yield* HttpClient.HttpClient
|
|
489
|
+
const res = yield* client.execute(
|
|
490
|
+
HttpClientRequest.get(`https://billing.example.com/invoices/${payload.invoiceId}`),
|
|
491
|
+
)
|
|
492
|
+
return yield* res.json
|
|
493
|
+
}),
|
|
494
|
+
)
|
|
495
|
+
yield* step({ name: 'persist' }, () => database.invoices.update(payload.invoiceId, remote))
|
|
496
|
+
}),
|
|
497
|
+
)
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
Two things follow from where it sits:
|
|
501
|
+
|
|
502
|
+
- **Wrap the call in a `step`.** The result is then checkpointed, so a retry or a resume after a deploy replays the recorded response instead of calling the remote again. A bare `yield*` outside a step re-issues the request on every replay — which for a payment capture or an email send is the difference between once and several times.
|
|
503
|
+
- **It is the SSRF-guarded client.** Requests to internal targets are refused by the same policy handlers get; a workflow is not a way around it. Configure the allowlist once in `app.config.ts` under `http` — dev and serve read the same key, so the policy cannot differ between them.
|
|
504
|
+
|
|
505
|
+
Reaching for `fetch` instead loses both: no allowlist, no trace propagation, and nothing tying the call to the step that made it.
|
|
506
|
+
|
|
477
507
|
## Anti-patterns
|
|
478
508
|
|
|
479
509
|
- **Using `input` in `workflow({...})`.** The current API is `payload`.
|
|
@@ -5,22 +5,23 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "voltro dev .",
|
|
8
|
+
"lint": "voltro doctor .",
|
|
8
9
|
"test": "voltro test",
|
|
9
10
|
"typecheck": "tsc --noEmit"
|
|
10
11
|
},
|
|
11
12
|
"dependencies": {
|
|
12
13
|
"@effect/platform": "^0.97.0",
|
|
13
14
|
"@effect/rpc": "^0.76.0",
|
|
14
|
-
"@voltro/ai": "0.
|
|
15
|
-
"@voltro/cli": "0.
|
|
16
|
-
"@voltro/database": "0.
|
|
17
|
-
"@voltro/env": "0.
|
|
18
|
-
"@voltro/protocol": "0.
|
|
19
|
-
"@voltro/runtime": "0.
|
|
15
|
+
"@voltro/ai": "0.24.0",
|
|
16
|
+
"@voltro/cli": "0.24.0",
|
|
17
|
+
"@voltro/database": "0.24.0",
|
|
18
|
+
"@voltro/env": "0.24.0",
|
|
19
|
+
"@voltro/protocol": "0.24.0",
|
|
20
|
+
"@voltro/runtime": "0.24.0",
|
|
20
21
|
"effect": "^3.22.0"
|
|
21
22
|
},
|
|
22
23
|
"devDependencies": {
|
|
23
|
-
"@voltro/testing": "0.
|
|
24
|
+
"@voltro/testing": "0.24.0",
|
|
24
25
|
"typescript": "^6.0.3",
|
|
25
26
|
"vitest": "^4.1.10"
|
|
26
27
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "voltro dev .",
|
|
8
|
+
"lint": "voltro doctor .",
|
|
8
9
|
"migrate": "voltro migrate",
|
|
9
10
|
"test": "voltro test",
|
|
10
11
|
"typecheck": "tsc --noEmit"
|
|
@@ -12,17 +13,17 @@
|
|
|
12
13
|
"dependencies": {
|
|
13
14
|
"@effect/platform": "^0.97.0",
|
|
14
15
|
"@effect/rpc": "^0.76.0",
|
|
15
|
-
"@voltro/cli": "0.
|
|
16
|
-
"@voltro/database": "0.
|
|
17
|
-
"@voltro/env": "0.
|
|
18
|
-
"@voltro/plugin-auth": "0.
|
|
19
|
-
"@voltro/protocol": "0.
|
|
20
|
-
"@voltro/runtime": "0.
|
|
21
|
-
"@voltro/sql-postgres": "0.
|
|
16
|
+
"@voltro/cli": "0.24.0",
|
|
17
|
+
"@voltro/database": "0.24.0",
|
|
18
|
+
"@voltro/env": "0.24.0",
|
|
19
|
+
"@voltro/plugin-auth": "0.24.0",
|
|
20
|
+
"@voltro/protocol": "0.24.0",
|
|
21
|
+
"@voltro/runtime": "0.24.0",
|
|
22
|
+
"@voltro/sql-postgres": "0.24.0",
|
|
22
23
|
"effect": "^3.22.0"
|
|
23
24
|
},
|
|
24
25
|
"devDependencies": {
|
|
25
|
-
"@voltro/testing": "0.
|
|
26
|
+
"@voltro/testing": "0.24.0",
|
|
26
27
|
"typescript": "^6.0.3",
|
|
27
28
|
"vitest": "^4.1.10"
|
|
28
29
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "voltro dev .",
|
|
8
|
+
"lint": "voltro doctor .",
|
|
8
9
|
"migrate": "voltro migrate",
|
|
9
10
|
"test": "voltro test",
|
|
10
11
|
"typecheck": "tsc --noEmit"
|
|
@@ -12,16 +13,16 @@
|
|
|
12
13
|
"dependencies": {
|
|
13
14
|
"@effect/platform": "^0.97.0",
|
|
14
15
|
"@effect/rpc": "^0.76.0",
|
|
15
|
-
"@voltro/cli": "0.
|
|
16
|
-
"@voltro/database": "0.
|
|
17
|
-
"@voltro/env": "0.
|
|
18
|
-
"@voltro/plugin-multitenancy": "0.
|
|
19
|
-
"@voltro/protocol": "0.
|
|
20
|
-
"@voltro/runtime": "0.
|
|
16
|
+
"@voltro/cli": "0.24.0",
|
|
17
|
+
"@voltro/database": "0.24.0",
|
|
18
|
+
"@voltro/env": "0.24.0",
|
|
19
|
+
"@voltro/plugin-multitenancy": "0.24.0",
|
|
20
|
+
"@voltro/protocol": "0.24.0",
|
|
21
|
+
"@voltro/runtime": "0.24.0",
|
|
21
22
|
"effect": "^3.22.0"
|
|
22
23
|
},
|
|
23
24
|
"devDependencies": {
|
|
24
|
-
"@voltro/testing": "0.
|
|
25
|
+
"@voltro/testing": "0.24.0",
|
|
25
26
|
"typescript": "^6.0.3",
|
|
26
27
|
"vitest": "^4.1.10"
|
|
27
28
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "voltro dev .",
|
|
8
|
+
"lint": "voltro doctor .",
|
|
8
9
|
"migrate": "voltro migrate",
|
|
9
10
|
"test": "voltro test",
|
|
10
11
|
"typecheck": "tsc --noEmit"
|
|
@@ -12,16 +13,16 @@
|
|
|
12
13
|
"dependencies": {
|
|
13
14
|
"@effect/platform": "^0.97.0",
|
|
14
15
|
"@effect/rpc": "^0.76.0",
|
|
15
|
-
"@voltro/cli": "0.
|
|
16
|
-
"@voltro/database": "0.
|
|
17
|
-
"@voltro/env": "0.
|
|
18
|
-
"@voltro/plugin-deactivation": "0.
|
|
19
|
-
"@voltro/protocol": "0.
|
|
20
|
-
"@voltro/runtime": "0.
|
|
16
|
+
"@voltro/cli": "0.24.0",
|
|
17
|
+
"@voltro/database": "0.24.0",
|
|
18
|
+
"@voltro/env": "0.24.0",
|
|
19
|
+
"@voltro/plugin-deactivation": "0.24.0",
|
|
20
|
+
"@voltro/protocol": "0.24.0",
|
|
21
|
+
"@voltro/runtime": "0.24.0",
|
|
21
22
|
"effect": "^3.22.0"
|
|
22
23
|
},
|
|
23
24
|
"devDependencies": {
|
|
24
|
-
"@voltro/testing": "0.
|
|
25
|
+
"@voltro/testing": "0.24.0",
|
|
25
26
|
"typescript": "^6.0.3",
|
|
26
27
|
"vitest": "^4.1.10"
|
|
27
28
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "voltro dev .",
|
|
8
|
+
"lint": "voltro doctor .",
|
|
8
9
|
"migrate": "voltro migrate",
|
|
9
10
|
"typecheck": "tsc --noEmit",
|
|
10
11
|
"test": "voltro test"
|
|
@@ -12,18 +13,18 @@
|
|
|
12
13
|
"dependencies": {
|
|
13
14
|
"@react-email/components": "^1.0.12",
|
|
14
15
|
"@react-email/render": "^1.4.0",
|
|
15
|
-
"@voltro/cli": "0.
|
|
16
|
-
"@voltro/database": "0.
|
|
17
|
-
"@voltro/env": "0.
|
|
18
|
-
"@voltro/plugin-mail": "0.
|
|
19
|
-
"@voltro/plugin-multitenancy": "0.
|
|
20
|
-
"@voltro/protocol": "0.
|
|
21
|
-
"@voltro/runtime": "0.
|
|
16
|
+
"@voltro/cli": "0.24.0",
|
|
17
|
+
"@voltro/database": "0.24.0",
|
|
18
|
+
"@voltro/env": "0.24.0",
|
|
19
|
+
"@voltro/plugin-mail": "0.24.0",
|
|
20
|
+
"@voltro/plugin-multitenancy": "0.24.0",
|
|
21
|
+
"@voltro/protocol": "0.24.0",
|
|
22
|
+
"@voltro/runtime": "0.24.0",
|
|
22
23
|
"effect": "^3.22.0",
|
|
23
24
|
"react": "^19.0.0"
|
|
24
25
|
},
|
|
25
26
|
"devDependencies": {
|
|
26
|
-
"@voltro/testing": "0.
|
|
27
|
+
"@voltro/testing": "0.24.0",
|
|
27
28
|
"typescript": "^6.0.3",
|
|
28
29
|
"vitest": "^4.1.10"
|
|
29
30
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "voltro dev .",
|
|
8
|
+
"lint": "voltro doctor .",
|
|
8
9
|
"migrate": "voltro migrate",
|
|
9
10
|
"test": "voltro test",
|
|
10
11
|
"typecheck": "tsc --noEmit"
|
|
@@ -12,18 +13,18 @@
|
|
|
12
13
|
"dependencies": {
|
|
13
14
|
"@effect/platform": "^0.97.0",
|
|
14
15
|
"@effect/rpc": "^0.76.0",
|
|
15
|
-
"@voltro/cli": "0.
|
|
16
|
-
"@voltro/database": "0.
|
|
17
|
-
"@voltro/env": "0.
|
|
18
|
-
"@voltro/plugin-multitenancy": "0.
|
|
19
|
-
"@voltro/plugin-storage": "0.
|
|
20
|
-
"@voltro/protocol": "0.
|
|
21
|
-
"@voltro/runtime": "0.
|
|
22
|
-
"@voltro/sql-mysql": "0.
|
|
16
|
+
"@voltro/cli": "0.24.0",
|
|
17
|
+
"@voltro/database": "0.24.0",
|
|
18
|
+
"@voltro/env": "0.24.0",
|
|
19
|
+
"@voltro/plugin-multitenancy": "0.24.0",
|
|
20
|
+
"@voltro/plugin-storage": "0.24.0",
|
|
21
|
+
"@voltro/protocol": "0.24.0",
|
|
22
|
+
"@voltro/runtime": "0.24.0",
|
|
23
|
+
"@voltro/sql-mysql": "0.24.0",
|
|
23
24
|
"effect": "^3.22.0"
|
|
24
25
|
},
|
|
25
26
|
"devDependencies": {
|
|
26
|
-
"@voltro/testing": "0.
|
|
27
|
+
"@voltro/testing": "0.24.0",
|
|
27
28
|
"typescript": "^6.0.3",
|
|
28
29
|
"vitest": "^4.1.10"
|
|
29
30
|
}
|
|
@@ -5,22 +5,23 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "voltro dev .",
|
|
8
|
+
"lint": "voltro doctor .",
|
|
8
9
|
"migrate": "voltro migrate",
|
|
9
10
|
"typecheck": "tsc --noEmit",
|
|
10
11
|
"test": "voltro test"
|
|
11
12
|
},
|
|
12
13
|
"dependencies": {
|
|
13
|
-
"@voltro/cli": "0.
|
|
14
|
-
"@voltro/database": "0.
|
|
15
|
-
"@voltro/env": "0.
|
|
16
|
-
"@voltro/plugin-multitenancy": "0.
|
|
17
|
-
"@voltro/plugin-storage": "0.
|
|
18
|
-
"@voltro/protocol": "0.
|
|
19
|
-
"@voltro/runtime": "0.
|
|
14
|
+
"@voltro/cli": "0.24.0",
|
|
15
|
+
"@voltro/database": "0.24.0",
|
|
16
|
+
"@voltro/env": "0.24.0",
|
|
17
|
+
"@voltro/plugin-multitenancy": "0.24.0",
|
|
18
|
+
"@voltro/plugin-storage": "0.24.0",
|
|
19
|
+
"@voltro/protocol": "0.24.0",
|
|
20
|
+
"@voltro/runtime": "0.24.0",
|
|
20
21
|
"effect": "^3.22.0"
|
|
21
22
|
},
|
|
22
23
|
"devDependencies": {
|
|
23
|
-
"@voltro/testing": "0.
|
|
24
|
+
"@voltro/testing": "0.24.0",
|
|
24
25
|
"typescript": "^6.0.3",
|
|
25
26
|
"vitest": "^4.1.10"
|
|
26
27
|
}
|
|
@@ -5,23 +5,24 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "voltro dev .",
|
|
8
|
+
"lint": "voltro doctor .",
|
|
8
9
|
"test": "voltro test",
|
|
9
10
|
"typecheck": "tsc --noEmit"
|
|
10
11
|
},
|
|
11
12
|
"dependencies": {
|
|
12
13
|
"@effect/platform": "^0.97.0",
|
|
13
14
|
"@effect/rpc": "^0.76.0",
|
|
14
|
-
"@voltro/cli": "0.
|
|
15
|
-
"@voltro/database": "0.
|
|
16
|
-
"@voltro/env": "0.
|
|
17
|
-
"@voltro/plugin-governance": "0.
|
|
18
|
-
"@voltro/plugin-multitenancy": "0.
|
|
19
|
-
"@voltro/protocol": "0.
|
|
20
|
-
"@voltro/runtime": "0.
|
|
15
|
+
"@voltro/cli": "0.24.0",
|
|
16
|
+
"@voltro/database": "0.24.0",
|
|
17
|
+
"@voltro/env": "0.24.0",
|
|
18
|
+
"@voltro/plugin-governance": "0.24.0",
|
|
19
|
+
"@voltro/plugin-multitenancy": "0.24.0",
|
|
20
|
+
"@voltro/protocol": "0.24.0",
|
|
21
|
+
"@voltro/runtime": "0.24.0",
|
|
21
22
|
"effect": "^3.22.0"
|
|
22
23
|
},
|
|
23
24
|
"devDependencies": {
|
|
24
|
-
"@voltro/testing": "0.
|
|
25
|
+
"@voltro/testing": "0.24.0",
|
|
25
26
|
"typescript": "^6.0.3",
|
|
26
27
|
"vitest": "^4.1.10"
|
|
27
28
|
}
|
|
@@ -5,23 +5,24 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "voltro dev .",
|
|
8
|
+
"lint": "voltro doctor .",
|
|
8
9
|
"test": "voltro test",
|
|
9
10
|
"typecheck": "tsc --noEmit"
|
|
10
11
|
},
|
|
11
12
|
"dependencies": {
|
|
12
13
|
"@effect/platform": "^0.97.0",
|
|
13
14
|
"@effect/rpc": "^0.76.0",
|
|
14
|
-
"@voltro/cli": "0.
|
|
15
|
-
"@voltro/database": "0.
|
|
16
|
-
"@voltro/env": "0.
|
|
17
|
-
"@voltro/plugin-multitenancy": "0.
|
|
18
|
-
"@voltro/protocol": "0.
|
|
19
|
-
"@voltro/runtime": "0.
|
|
20
|
-
"@voltro/workflow": "0.
|
|
15
|
+
"@voltro/cli": "0.24.0",
|
|
16
|
+
"@voltro/database": "0.24.0",
|
|
17
|
+
"@voltro/env": "0.24.0",
|
|
18
|
+
"@voltro/plugin-multitenancy": "0.24.0",
|
|
19
|
+
"@voltro/protocol": "0.24.0",
|
|
20
|
+
"@voltro/runtime": "0.24.0",
|
|
21
|
+
"@voltro/workflow": "0.24.0",
|
|
21
22
|
"effect": "^3.22.0"
|
|
22
23
|
},
|
|
23
24
|
"devDependencies": {
|
|
24
|
-
"@voltro/testing": "0.
|
|
25
|
+
"@voltro/testing": "0.24.0",
|
|
25
26
|
"typescript": "^6.0.3",
|
|
26
27
|
"vitest": "^4.1.10"
|
|
27
28
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "voltro dev .",
|
|
8
|
+
"lint": "voltro doctor .",
|
|
8
9
|
"migrate": "voltro migrate",
|
|
9
10
|
"test": "voltro test",
|
|
10
11
|
"typecheck": "tsc --noEmit"
|
|
@@ -12,18 +13,18 @@
|
|
|
12
13
|
"dependencies": {
|
|
13
14
|
"@effect/platform": "^0.97.0",
|
|
14
15
|
"@effect/rpc": "^0.76.0",
|
|
15
|
-
"@voltro/cli": "0.
|
|
16
|
-
"@voltro/database": "0.
|
|
17
|
-
"@voltro/env": "0.
|
|
18
|
-
"@voltro/plugin-flags": "0.
|
|
19
|
-
"@voltro/plugin-multitenancy": "0.
|
|
20
|
-
"@voltro/protocol": "0.
|
|
21
|
-
"@voltro/runtime": "0.
|
|
22
|
-
"@voltro/sql-postgres": "0.
|
|
16
|
+
"@voltro/cli": "0.24.0",
|
|
17
|
+
"@voltro/database": "0.24.0",
|
|
18
|
+
"@voltro/env": "0.24.0",
|
|
19
|
+
"@voltro/plugin-flags": "0.24.0",
|
|
20
|
+
"@voltro/plugin-multitenancy": "0.24.0",
|
|
21
|
+
"@voltro/protocol": "0.24.0",
|
|
22
|
+
"@voltro/runtime": "0.24.0",
|
|
23
|
+
"@voltro/sql-postgres": "0.24.0",
|
|
23
24
|
"effect": "^3.22.0"
|
|
24
25
|
},
|
|
25
26
|
"devDependencies": {
|
|
26
|
-
"@voltro/testing": "0.
|
|
27
|
+
"@voltro/testing": "0.24.0",
|
|
27
28
|
"typescript": "^6.0.3",
|
|
28
29
|
"vitest": "^4.1.10"
|
|
29
30
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "voltro dev .",
|
|
8
|
+
"lint": "voltro doctor .",
|
|
8
9
|
"migrate": "voltro migrate",
|
|
9
10
|
"test": "voltro test",
|
|
10
11
|
"typecheck": "tsc --noEmit"
|
|
@@ -12,17 +13,17 @@
|
|
|
12
13
|
"dependencies": {
|
|
13
14
|
"@effect/platform": "^0.97.0",
|
|
14
15
|
"@effect/rpc": "^0.76.0",
|
|
15
|
-
"@voltro/cli": "0.
|
|
16
|
-
"@voltro/database": "0.
|
|
17
|
-
"@voltro/env": "0.
|
|
18
|
-
"@voltro/plugin-audit": "0.
|
|
19
|
-
"@voltro/plugin-governance": "0.
|
|
20
|
-
"@voltro/protocol": "0.
|
|
21
|
-
"@voltro/runtime": "0.
|
|
16
|
+
"@voltro/cli": "0.24.0",
|
|
17
|
+
"@voltro/database": "0.24.0",
|
|
18
|
+
"@voltro/env": "0.24.0",
|
|
19
|
+
"@voltro/plugin-audit": "0.24.0",
|
|
20
|
+
"@voltro/plugin-governance": "0.24.0",
|
|
21
|
+
"@voltro/protocol": "0.24.0",
|
|
22
|
+
"@voltro/runtime": "0.24.0",
|
|
22
23
|
"effect": "^3.22.0"
|
|
23
24
|
},
|
|
24
25
|
"devDependencies": {
|
|
25
|
-
"@voltro/testing": "0.
|
|
26
|
+
"@voltro/testing": "0.24.0",
|
|
26
27
|
"typescript": "^6.0.3",
|
|
27
28
|
"vitest": "^4.1.10"
|
|
28
29
|
}
|
|
@@ -5,23 +5,24 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "voltro dev .",
|
|
8
|
+
"lint": "voltro doctor .",
|
|
8
9
|
"test": "voltro test",
|
|
9
10
|
"typecheck": "tsc --noEmit"
|
|
10
11
|
},
|
|
11
12
|
"dependencies": {
|
|
12
13
|
"@effect/platform": "^0.97.0",
|
|
13
14
|
"@effect/rpc": "^0.76.0",
|
|
14
|
-
"@voltro/cli": "0.
|
|
15
|
-
"@voltro/database": "0.
|
|
16
|
-
"@voltro/env": "0.
|
|
17
|
-
"@voltro/kv": "0.
|
|
18
|
-
"@voltro/plugin-multitenancy": "0.
|
|
19
|
-
"@voltro/protocol": "0.
|
|
20
|
-
"@voltro/runtime": "0.
|
|
15
|
+
"@voltro/cli": "0.24.0",
|
|
16
|
+
"@voltro/database": "0.24.0",
|
|
17
|
+
"@voltro/env": "0.24.0",
|
|
18
|
+
"@voltro/kv": "0.24.0",
|
|
19
|
+
"@voltro/plugin-multitenancy": "0.24.0",
|
|
20
|
+
"@voltro/protocol": "0.24.0",
|
|
21
|
+
"@voltro/runtime": "0.24.0",
|
|
21
22
|
"effect": "^3.22.0"
|
|
22
23
|
},
|
|
23
24
|
"devDependencies": {
|
|
24
|
-
"@voltro/testing": "0.
|
|
25
|
+
"@voltro/testing": "0.24.0",
|
|
25
26
|
"typescript": "^6.0.3",
|
|
26
27
|
"vitest": "^4.1.10"
|
|
27
28
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "voltro dev .",
|
|
8
|
+
"lint": "voltro doctor .",
|
|
8
9
|
"migrate": "voltro migrate",
|
|
9
10
|
"test": "voltro test",
|
|
10
11
|
"typecheck": "tsc --noEmit"
|
|
@@ -12,17 +13,17 @@
|
|
|
12
13
|
"dependencies": {
|
|
13
14
|
"@effect/platform": "^0.97.0",
|
|
14
15
|
"@effect/rpc": "^0.76.0",
|
|
15
|
-
"@voltro/cli": "0.
|
|
16
|
-
"@voltro/database": "0.
|
|
17
|
-
"@voltro/env": "0.
|
|
18
|
-
"@voltro/plugin-moderation": "0.
|
|
19
|
-
"@voltro/plugin-multitenancy": "0.
|
|
20
|
-
"@voltro/protocol": "0.
|
|
21
|
-
"@voltro/runtime": "0.
|
|
16
|
+
"@voltro/cli": "0.24.0",
|
|
17
|
+
"@voltro/database": "0.24.0",
|
|
18
|
+
"@voltro/env": "0.24.0",
|
|
19
|
+
"@voltro/plugin-moderation": "0.24.0",
|
|
20
|
+
"@voltro/plugin-multitenancy": "0.24.0",
|
|
21
|
+
"@voltro/protocol": "0.24.0",
|
|
22
|
+
"@voltro/runtime": "0.24.0",
|
|
22
23
|
"effect": "^3.22.0"
|
|
23
24
|
},
|
|
24
25
|
"devDependencies": {
|
|
25
|
-
"@voltro/testing": "0.
|
|
26
|
+
"@voltro/testing": "0.24.0",
|
|
26
27
|
"typescript": "^6.0.3",
|
|
27
28
|
"vitest": "^4.1.10"
|
|
28
29
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "voltro dev .",
|
|
8
|
+
"lint": "voltro doctor .",
|
|
8
9
|
"migrate": "voltro migrate",
|
|
9
10
|
"test": "voltro test",
|
|
10
11
|
"typecheck": "tsc --noEmit"
|
|
@@ -12,17 +13,17 @@
|
|
|
12
13
|
"dependencies": {
|
|
13
14
|
"@effect/platform": "^0.97.0",
|
|
14
15
|
"@effect/rpc": "^0.76.0",
|
|
15
|
-
"@voltro/cli": "0.
|
|
16
|
-
"@voltro/database": "0.
|
|
17
|
-
"@voltro/plugin-multitenancy": "0.
|
|
18
|
-
"@voltro/plugin-prometheus": "0.
|
|
19
|
-
"@voltro/plugin-sentry": "0.
|
|
20
|
-
"@voltro/protocol": "0.
|
|
21
|
-
"@voltro/runtime": "0.
|
|
16
|
+
"@voltro/cli": "0.24.0",
|
|
17
|
+
"@voltro/database": "0.24.0",
|
|
18
|
+
"@voltro/plugin-multitenancy": "0.24.0",
|
|
19
|
+
"@voltro/plugin-prometheus": "0.24.0",
|
|
20
|
+
"@voltro/plugin-sentry": "0.24.0",
|
|
21
|
+
"@voltro/protocol": "0.24.0",
|
|
22
|
+
"@voltro/runtime": "0.24.0",
|
|
22
23
|
"effect": "^3.22.0"
|
|
23
24
|
},
|
|
24
25
|
"devDependencies": {
|
|
25
|
-
"@voltro/testing": "0.
|
|
26
|
+
"@voltro/testing": "0.24.0",
|
|
26
27
|
"typescript": "^6.0.3",
|
|
27
28
|
"vitest": "^4.1.10"
|
|
28
29
|
}
|