diff --git a/.changeset/effect-foldkit-411.md b/.changeset/effect-foldkit-411.md new file mode 100644 index 0000000..5910696 --- /dev/null +++ b/.changeset/effect-foldkit-411.md @@ -0,0 +1,19 @@ +--- +"@triplex-build/triplex": minor +"@triplex-build/triplex-sql": minor +"@triplex-build/triplex-sqlite": minor +"@triplex-build/triplex-postgres": minor +"@triplex-build/triplex-testkit": minor +"@triplex-build/triplex-cli": minor +"@triplex-build/triplex-http": minor +--- + +Require the tested Effect 4.1.1 peer and align the platform, SQL, and Vitest +companions. Upgrade the dashboard and embedded documentation explorer to Foldkit +0.170.0 and its Vite plugin to 0.29.0, removing the previous adapter overrides and +peer exceptions now that Foldkit accepts Effect 4.1. + +Require Node.js 22.19.0 or newer for the CLI to match the Node platform adapters. + +Refresh served OpenAPI snapshots for Effect 4.1 schema deduplication and encoded +query-parameter schema generation. diff --git a/AGENTS.md b/AGENTS.md index e6d9726..3a87961 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -7,7 +7,7 @@ Triplex is a pre-1.0, Effect-native fact database for TypeScript. Read ## Setup and checks -Use Node.js 22 or newer and the pinned pnpm 10.11.0: +Use Node.js 22.19.0 or newer and the pinned pnpm 10.11.0: ```sh corepack enable diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4351a7e..086cd38 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing -Triplex uses Node.js 22 or newer and pnpm 10.11. +Triplex uses Node.js 22.19.0 or newer and pnpm 10.11. ```bash pnpm install --frozen-lockfile @@ -51,15 +51,24 @@ when a Changeset mixes private and publishable packages. ## Dependency compatibility -The workspace tests Effect 4.0.3 with Foldkit and `@foldkit/ui` 0.168.0 and -`@foldkit/vite-plugin` 0.27.1. These Foldkit releases declare exact Effect 4.0.0 peers; -the plugin also pins the Node adapters to 4.0.0. `pnpm-workspace.yaml` allows only -4.0.3 for those specific package peers and overrides only the plugin's two adapter -dependencies. The browser adapter is an explicit catalog dependency of both the -dashboard and the documentation workspace. Remove these exceptions when upstream -peer ranges accept the tested patch. Peer checking remains enabled. +The workspace tests Effect and its platform, SQL, and Vitest companions at 4.1.1, +with Foldkit and `@foldkit/ui` 0.170.0 and `@foldkit/vite-plugin` 0.29.0. +These Foldkit releases accept Effect `~4.1.0`, including the tested 4.1.1 patch; +no adapter overrides or peer exceptions are needed. The browser adapter is an +explicit catalog dependency of both the dashboard and the documentation workspace. +The Node platform adapters and Foldkit Vite plugin require Node.js 22.19.0 or +newer. Public packages use the same catalog for their exact Effect peer. Peer checking +remains enabled. Alchemy 2.0.0-beta.80 and its Distilled dependencies declare Effect +`^4.0.0`, which includes 4.1.1. Alchemy still imports the removed `effect/Crypto` +module, including in beta.84. A pnpm patch migrates its OAuth state and PKCE +generation and service types to `SecureRandom` and `Digest` from `effect/crypto`, +and provides both services in its platform layer. `scripts/check-alchemy.mjs` +checks provider imports and PKCE generation without credentials or network calls +as part of `pnpm check`. Remove the patch when upstream supports these APIs. +Scoped catalog overrides pin Alchemy's D1 and Durable Object SQL companions to +4.1.1 within those supported ranges. -Effect 4.0.3's test adapter requires Vitest 5, so the catalog also uses Vitest 5.0.4 +Effect 4.1.1's test adapter requires Vitest 5, so the catalog uses Vitest 5.0.4 and the compatible Cloudflare test plugin 1.4.0 and Workers types 5.20261006.1. The two workerd test configs disable Vitest's host filesystem module cache because those paths are unavailable inside the worker. Node test configs keep the default cache. diff --git a/README.md b/README.md index 1bf7307..d8f3169 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ # Triplex > [!WARNING] -> Triplex is pre-1.0. The published `@triplex-build` packages require `effect@4.0.3`; +> Triplex is pre-1.0. The published `@triplex-build` packages require `effect@4.1.1`; > Effect 3 is not compatible. KV > and SQLite are the supported baseline, PostgreSQL is a production candidate, and Cloudflare and > FoundationDB are experimental. See [Current state](docs/current-state.md) for the exact maturity @@ -75,7 +75,7 @@ and never ask about history or provenance. Triplex is a system of record, not a Install the core package and its Effect peer dependency from npm: ```sh -npm install @triplex-build/triplex effect@4.0.3 +npm install @triplex-build/triplex effect@4.1.1 ``` To run the checked repository examples from a source checkout: @@ -89,7 +89,7 @@ pnpm exec tsx --tsconfig docs/snippets/tsconfig.json docs/snippets/getting-start ``` Do not use the superseded `@bjacobso` canaries for new work. Triplex is ESM-only, targets Node.js -22+, and is aligned to `effect@4.0.3`. The browser-safe core also runs in modern browsers and +22+, and is aligned to `effect@4.1.1`. The browser-safe core also runs in modern browsers and edge runtimes. The [website quickstart](docs/getting-started.md) includes expected output, Effect layer lifetime, and SQLite persistence. The coordinated package publication process is documented in [Releasing Triplex](docs/releasing.md). diff --git a/docs/agents.md b/docs/agents.md index 6f44450..4989ff1 100644 --- a/docs/agents.md +++ b/docs/agents.md @@ -33,7 +33,7 @@ Check these constraints with the people you work for before adopting it: | Constraint | Current contract | | -------------- | ---------------------------------------------------------------------------- | | Maturity | Pre-1.0. See [Current state](/current-state) | -| Effect | Requires `effect@4.0.3`. Effect 3 is not compatible | +| Effect | Requires `effect@4.1.1`. Effect 3 is not compatible | | Runtime | ESM-only, Node.js 22+, modern browsers and edge runtimes for the core | | Durable stores | SQLite is supported. PostgreSQL is a production candidate | | Host duties | Authentication, authorization, task lifecycle, timers, and retries are yours | diff --git a/docs/getting-started.md b/docs/getting-started.md index ed9c998..8d229ec 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -4,20 +4,20 @@ This guide writes three facts to an in-memory Triplex database, joins them with the result. It is the shortest complete path to a running program. ::: warning Pre-1.0 packages -The `@triplex-build` packages are available from npm and require `effect@4.0.3`. +The `@triplex-build` packages are available from npm and require `effect@4.1.1`. Effect 3 is incompatible. Do not use the superseded `@bjacobso` package names for new work. ::: ## Prerequisites - Git -- Node.js 22 or newer +- Node.js 22.19.0 or newer - Corepack and pnpm 10.11.0 (the repository declares the exact package-manager version) For an application, install the published core package and its Effect peer dependency: ```sh -npm install @triplex-build/triplex effect@4.0.3 +npm install @triplex-build/triplex effect@4.1.1 ``` ## Run the example diff --git a/docs/index.md b/docs/index.md index 47010f5..9e1645e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -31,7 +31,7 @@ pageClass: triplex-index Start in your process ```sh -npm install @triplex-build/triplex effect@4.0.3 +npm install @triplex-build/triplex effect@4.1.1 ``` Effect 4 required · First program → diff --git a/docs/releasing.md b/docs/releasing.md index 5b28f3d..3030973 100644 --- a/docs/releasing.md +++ b/docs/releasing.md @@ -103,7 +103,7 @@ Install from the registry in a clean directory outside this monorepo: ```sh pnpm init -pnpm add effect@4.0.3 \ +pnpm add effect@4.1.1 \ @triplex-build/triplex@next \ @triplex-build/triplex-sqlite@next \ @triplex-build/triplex-cli@next diff --git a/docs/sqlite.md b/docs/sqlite.md index 742951c..85bd844 100644 --- a/docs/sqlite.md +++ b/docs/sqlite.md @@ -27,7 +27,7 @@ default shared conformance suite. Triplex remains pre-1.0; see [current state](/ Install the SQLite adapter with the compatible Effect version on Node.js 22 or newer: ```sh -npm install @triplex-build/triplex @triplex-build/triplex-sqlite effect@4.0.3 +npm install @triplex-build/triplex @triplex-build/triplex-sqlite effect@4.1.1 ``` This writes a training fact and reads it through the same `Triples` service used by other backends: diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 7352817..fd97eeb 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -12,7 +12,7 @@ private workspace packages. Do not switch new examples back to the superseded `@ Keep every Triplex package on one coordinated release and use the exact Effect peer version declared by that release. The current source tree targets Node.js 22+ and -`effect@4.0.3`; Effect 3 is incompatible. Multiple Effect copies or a version mismatch can make +`effect@4.1.1`; Effect 3 is incompatible. Multiple Effect copies or a version mismatch can make service tags and runtime types disagree even when imports look correct. ## Why is `Triples` (or another service) missing? diff --git a/examples/http-api/package.json b/examples/http-api/package.json index 67e87e7..ab52edd 100644 --- a/examples/http-api/package.json +++ b/examples/http-api/package.json @@ -25,6 +25,6 @@ "vitest": "catalog:" }, "engines": { - "node": ">=22" + "node": ">=22.19.0" } } diff --git a/examples/http-api/test/openapi/latest.json b/examples/http-api/test/openapi/latest.json index de037b2..51b0ba6 100644 --- a/examples/http-api/test/openapi/latest.json +++ b/examples/http-api/test/openapi/latest.json @@ -36,9 +36,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -47,9 +45,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -58,9 +54,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -69,9 +63,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -81,9 +73,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -92,9 +82,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -129,9 +117,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -140,9 +126,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -151,9 +135,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -162,9 +144,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -174,9 +154,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -185,9 +163,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -222,9 +198,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -233,9 +207,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -244,9 +216,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -255,9 +225,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -267,9 +235,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -278,9 +244,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -298,31 +262,22 @@ "name": "limit", "in": "query", "schema": { - "anyOf": [ - { "type": "string", "pattern": "^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$" }, - { "type": "null" } - ] + "type": "string", + "pattern": "^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[Ee][+-]?\\d+)?$" }, "required": false }, - { - "name": "cursor", - "in": "query", - "schema": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, - "required": false - }, + { "name": "cursor", "in": "query", "schema": { "type": "string" }, "required": false }, { "name": "recordedAt", "in": "query", "schema": { "anyOf": [ { - "anyOf": [ - { "type": "string", "pattern": "^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$" }, - { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } - ] + "type": "string", + "pattern": "^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[Ee][+-]?\\d+)?$" }, - { "type": "null" } + { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } ] }, "required": false @@ -333,12 +288,10 @@ "schema": { "anyOf": [ { - "anyOf": [ - { "type": "string", "pattern": "^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$" }, - { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } - ] + "type": "string", + "pattern": "^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[Ee][+-]?\\d+)?$" }, - { "type": "null" } + { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } ] }, "required": false @@ -380,9 +333,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -391,9 +342,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -402,9 +351,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -413,9 +360,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -425,9 +370,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -436,9 +379,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -455,7 +396,7 @@ "201": { "description": "Employee", "content": { - "application/json": { "schema": { "$ref": "#/components/schemas/Employee_1" } } + "application/json": { "schema": { "$ref": "#/components/schemas/Employee" } } }, "headers": { "location": { "schema": { "type": "string" }, "required": true }, @@ -474,9 +415,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -485,9 +424,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -496,9 +433,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -507,9 +442,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -519,9 +452,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -530,9 +461,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -559,12 +488,10 @@ "schema": { "anyOf": [ { - "anyOf": [ - { "type": "string", "pattern": "^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$" }, - { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } - ] + "type": "string", + "pattern": "^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[Ee][+-]?\\d+)?$" }, - { "type": "null" } + { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } ] }, "required": false @@ -575,12 +502,10 @@ "schema": { "anyOf": [ { - "anyOf": [ - { "type": "string", "pattern": "^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$" }, - { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } - ] + "type": "string", + "pattern": "^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[Ee][+-]?\\d+)?$" }, - { "type": "null" } + { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } ] }, "required": false @@ -609,9 +534,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -620,9 +543,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -631,9 +552,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -642,9 +561,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -654,9 +571,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -665,9 +580,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -704,9 +617,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -715,9 +626,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -726,9 +635,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -737,9 +644,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -749,9 +654,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -760,9 +663,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -802,9 +703,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -813,9 +712,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -824,9 +721,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -835,9 +730,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -847,9 +740,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -858,9 +749,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -872,66 +761,6 @@ }, "components": { "schemas": { - "TriplexHttpError_6": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, - "TriplexHttpError_5": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, - "TriplexHttpError_4": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, - "TriplexHttpError_3": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, - "TriplexHttpError_2": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, - "TriplexHttpError_1": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, "TriplexHttpError": { "type": "object", "properties": { @@ -982,16 +811,6 @@ "allOf": [{ "type": "object", "additionalProperties": {} }], "propertyNames": { "type": "string", "enum": [":employee/email", ":employee/name"] } }, - "Employee_1": { - "type": "object", - "properties": { - "id": { "type": "string" }, - "type": { "type": "string", "enum": ["Employee"] }, - "attributes": { "$ref": "#/components/schemas/EmployeeAttributes" } - }, - "required": ["id", "type", "attributes"], - "additionalProperties": false - }, "EmployeeInput": { "type": "object", "properties": { "attributes": { "$ref": "#/components/schemas/EmployeeAttributes_1" } }, diff --git a/examples/http-api/test/openapi/v1.json b/examples/http-api/test/openapi/v1.json index 3b8da8b..ed83cd0 100644 --- a/examples/http-api/test/openapi/v1.json +++ b/examples/http-api/test/openapi/v1.json @@ -36,9 +36,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -47,9 +45,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -58,9 +54,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -69,9 +63,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -81,9 +73,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -92,9 +82,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -129,9 +117,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -140,9 +126,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -151,9 +135,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -162,9 +144,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -174,9 +154,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -185,9 +163,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -222,9 +198,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -233,9 +207,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -244,9 +216,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -255,9 +225,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -267,9 +235,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -278,9 +244,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -298,31 +262,22 @@ "name": "limit", "in": "query", "schema": { - "anyOf": [ - { "type": "string", "pattern": "^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$" }, - { "type": "null" } - ] + "type": "string", + "pattern": "^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[Ee][+-]?\\d+)?$" }, "required": false }, - { - "name": "cursor", - "in": "query", - "schema": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, - "required": false - }, + { "name": "cursor", "in": "query", "schema": { "type": "string" }, "required": false }, { "name": "recordedAt", "in": "query", "schema": { "anyOf": [ { - "anyOf": [ - { "type": "string", "pattern": "^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$" }, - { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } - ] + "type": "string", + "pattern": "^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[Ee][+-]?\\d+)?$" }, - { "type": "null" } + { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } ] }, "required": false @@ -333,12 +288,10 @@ "schema": { "anyOf": [ { - "anyOf": [ - { "type": "string", "pattern": "^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$" }, - { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } - ] + "type": "string", + "pattern": "^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[Ee][+-]?\\d+)?$" }, - { "type": "null" } + { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } ] }, "required": false @@ -380,9 +333,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -391,9 +342,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -402,9 +351,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -413,9 +360,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -425,9 +370,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -436,9 +379,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -459,12 +400,10 @@ "schema": { "anyOf": [ { - "anyOf": [ - { "type": "string", "pattern": "^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$" }, - { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } - ] + "type": "string", + "pattern": "^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[Ee][+-]?\\d+)?$" }, - { "type": "null" } + { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } ] }, "required": false @@ -475,12 +414,10 @@ "schema": { "anyOf": [ { - "anyOf": [ - { "type": "string", "pattern": "^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$" }, - { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } - ] + "type": "string", + "pattern": "^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[Ee][+-]?\\d+)?$" }, - { "type": "null" } + { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } ] }, "required": false @@ -509,9 +446,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -520,9 +455,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -531,9 +464,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -542,9 +473,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -554,9 +483,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -565,9 +492,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -579,66 +504,6 @@ }, "components": { "schemas": { - "TriplexHttpError_6": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, - "TriplexHttpError_5": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, - "TriplexHttpError_4": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, - "TriplexHttpError_3": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, - "TriplexHttpError_2": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, - "TriplexHttpError_1": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, "TriplexHttpError": { "type": "object", "properties": { diff --git a/examples/http-api/test/openapi/v2.json b/examples/http-api/test/openapi/v2.json index 8b07cdc..436757c 100644 --- a/examples/http-api/test/openapi/v2.json +++ b/examples/http-api/test/openapi/v2.json @@ -36,9 +36,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -47,9 +45,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -58,9 +54,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -69,9 +63,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -81,9 +73,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -92,9 +82,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -129,9 +117,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -140,9 +126,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -151,9 +135,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -162,9 +144,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -174,9 +154,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -185,9 +163,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -222,9 +198,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -233,9 +207,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -244,9 +216,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -255,9 +225,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -267,9 +235,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -278,9 +244,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -298,31 +262,22 @@ "name": "limit", "in": "query", "schema": { - "anyOf": [ - { "type": "string", "pattern": "^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$" }, - { "type": "null" } - ] + "type": "string", + "pattern": "^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[Ee][+-]?\\d+)?$" }, "required": false }, - { - "name": "cursor", - "in": "query", - "schema": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, - "required": false - }, + { "name": "cursor", "in": "query", "schema": { "type": "string" }, "required": false }, { "name": "recordedAt", "in": "query", "schema": { "anyOf": [ { - "anyOf": [ - { "type": "string", "pattern": "^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$" }, - { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } - ] + "type": "string", + "pattern": "^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[Ee][+-]?\\d+)?$" }, - { "type": "null" } + { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } ] }, "required": false @@ -333,12 +288,10 @@ "schema": { "anyOf": [ { - "anyOf": [ - { "type": "string", "pattern": "^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$" }, - { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } - ] + "type": "string", + "pattern": "^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[Ee][+-]?\\d+)?$" }, - { "type": "null" } + { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } ] }, "required": false @@ -380,9 +333,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -391,9 +342,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -402,9 +351,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -413,9 +360,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -425,9 +370,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -436,9 +379,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -459,12 +400,10 @@ "schema": { "anyOf": [ { - "anyOf": [ - { "type": "string", "pattern": "^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$" }, - { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } - ] + "type": "string", + "pattern": "^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[Ee][+-]?\\d+)?$" }, - { "type": "null" } + { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } ] }, "required": false @@ -475,12 +414,10 @@ "schema": { "anyOf": [ { - "anyOf": [ - { "type": "string", "pattern": "^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$" }, - { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } - ] + "type": "string", + "pattern": "^[+-]?(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:[Ee][+-]?\\d+)?$" }, - { "type": "null" } + { "type": "string", "enum": ["Infinity", "-Infinity", "NaN"] } ] }, "required": false @@ -509,9 +446,7 @@ "401": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_1" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -520,9 +455,7 @@ "403": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_2" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -531,9 +464,7 @@ "404": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_3" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -542,9 +473,7 @@ "405": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_4" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true }, @@ -554,9 +483,7 @@ "409": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_5" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -565,9 +492,7 @@ "500": { "description": "TriplexHttpError", "content": { - "application/json": { - "schema": { "$ref": "#/components/schemas/TriplexHttpError_6" } - } + "application/json": { "schema": { "$ref": "#/components/schemas/TriplexHttpError" } } }, "headers": { "x-triplex-config-snapshot": { "schema": { "type": "string" }, "required": true } @@ -579,66 +504,6 @@ }, "components": { "schemas": { - "TriplexHttpError_6": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, - "TriplexHttpError_5": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, - "TriplexHttpError_4": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, - "TriplexHttpError_3": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, - "TriplexHttpError_2": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, - "TriplexHttpError_1": { - "type": "object", - "properties": { - "code": { "type": "string" }, - "message": { "type": "string" }, - "path": { "anyOf": [{ "type": "string" }, { "type": "null" }] } - }, - "required": ["code", "message"], - "additionalProperties": false - }, "TriplexHttpError": { "type": "object", "properties": { diff --git a/package.json b/package.json index ef1d82d..3afe21c 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "build": "turbo run build && pnpm docs:build", "changeset": "changeset", "clean": "turbo run clean", - "check": "pnpm format:check && pnpm lint && pnpm typecheck && pnpm docs:check && pnpm test && pnpm build", + "check": "pnpm format:check && pnpm lint && node scripts/check-alchemy.mjs && pnpm typecheck && pnpm docs:check && pnpm test && pnpm build", "dev": "turbo watch build", "docs:build": "vitepress build docs && node scripts/check-llms.mjs", "docs:check": "node scripts/check-markdown-code.mjs && tsc --noEmit -p docs/snippets/tsconfig.json && pnpm docs:outputs --check", @@ -66,7 +66,7 @@ "vue": "catalog:" }, "engines": { - "node": ">=22" + "node": ">=22.19.0" }, "packageManager": "pnpm@10.11.0" } diff --git a/packages/cli/package.json b/packages/cli/package.json index 23e6a56..eeac463 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -68,6 +68,6 @@ "effect": "catalog:" }, "engines": { - "node": ">=22" + "node": ">=22.19.0" } } diff --git a/packages/core/README.md b/packages/core/README.md index cebd4f3..d590274 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -14,7 +14,7 @@ and Effect services. ## Availability -Install `@triplex-build/triplex` from npm with Node.js 22+ and its `effect@4.0.3` peer +Install `@triplex-build/triplex` from npm with Node.js 22+ and its `effect@4.1.1` peer dependency. See the [quickstart](../../docs/getting-started.md). Do not use the superseded `@bjacobso` canaries for new work. diff --git a/packages/http/README.md b/packages/http/README.md index 1875f70..fd75116 100644 --- a/packages/http/README.md +++ b/packages/http/README.md @@ -1,6 +1,6 @@ # @triplex-build/triplex-http -> **Pre-1.0:** install `@triplex-build/triplex-http` from npm with `effect@4.0.3`; +> **Pre-1.0:** install `@triplex-build/triplex-http` from npm with `effect@4.1.1`; > Effect 3 is not compatible. Configuration-derived REST and OpenAPI contracts for Triplex. The package is backend-neutral and diff --git a/patches/alchemy@2.0.0-beta.80.patch b/patches/alchemy@2.0.0-beta.80.patch new file mode 100644 index 0000000..1e1d13c --- /dev/null +++ b/patches/alchemy@2.0.0-beta.80.patch @@ -0,0 +1,724 @@ +diff --git a/lib/Alchemist/Session.d.ts b/lib/Alchemist/Session.d.ts +index c51dff8e9ff1915bcf7fe357f86633e4bd550a33..58292157644376485ae7626d15043cb8bdef5303 100644 +--- a/lib/Alchemist/Session.d.ts ++++ b/lib/Alchemist/Session.d.ts +@@ -80,7 +80,7 @@ declare const openUncached: (target: Target, options?: OpenOptions | undefined) + * and state store over this session's services. + */ + context: Context.Context; +-}, unknown, AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | FileSystem.FileSystem | import("effect/http/HttpClient").HttpClient | import("../Interaction.ts").Interaction | Path.Path | import("../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++}, unknown, AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | FileSystem.FileSystem | import("effect/http/HttpClient").HttpClient | import("../Interaction.ts").Interaction | Path.Path | import("../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + /** An imported, fully-configured stack instance. */ + export type Session = Effect.Success>; + export declare const open: (target: Target, options?: OpenOptions | undefined) => Effect.Effect<{ +@@ -90,7 +90,7 @@ export declare const open: (target: Target, options?: OpenOptions | undefined) = + * and state store over this session's services. + */ + context: Context.Context; +-}, unknown, AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | FileSystem.FileSystem | import("effect/http/HttpClient").HttpClient | import("../Interaction.ts").Interaction | Path.Path | import("../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++}, unknown, AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | FileSystem.FileSystem | import("effect/http/HttpClient").HttpClient | import("../Interaction.ts").Interaction | Path.Path | import("../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + export interface BuildStackProvidersOptions { + readonly main: string; + readonly envFile: Option.Option; +@@ -107,10 +107,10 @@ export declare const buildStackProviders: (options: BuildStackProvidersOptions) + }; + context: Context.Context; + stackEffect: StackModule; +-}, import("effect/Config").ConfigError | import("effect/PlatformError").PlatformError | StackEntrypointError, AlchemyContext | ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | FileSystem.FileSystem | import("effect/http/HttpClient").HttpClient | import("../Interaction.ts").Interaction | Path.Path | import("../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++}, import("effect/Config").ConfigError | import("effect/PlatformError").PlatformError | StackEntrypointError, AlchemyContext | ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | FileSystem.FileSystem | import("effect/http/HttpClient").HttpClient | import("../Interaction.ts").Interaction | Path.Path | import("../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + export declare const collectAuthProviders: (options: CollectAuthProvidersOptions) => Effect.Effect<{ + [providerName: string]: import("../Auth/AuthProvider.ts").AuthProvider<{ + method: string; + }, unknown>; +-}, AuthError | import("effect/PlatformError").PlatformError, AlchemyContext | ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | FileSystem.FileSystem | import("effect/http/HttpClient").HttpClient | import("../Interaction.ts").Interaction | Path.Path | import("../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++}, AuthError | import("effect/PlatformError").PlatformError, AlchemyContext | ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | FileSystem.FileSystem | import("effect/http/HttpClient").HttpClient | import("../Interaction.ts").Interaction | Path.Path | import("../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + //# sourceMappingURL=Session.d.ts.map +\ No newline at end of file +diff --git a/lib/Alchemist/routes/cloudflare.d.ts b/lib/Alchemist/routes/cloudflare.d.ts +index 23040241e62df1ab279a63b1fa5d5ee68eb7e00d..cbcf0f98201ec8aa626523294d85b8959eb38abc 100644 +--- a/lib/Alchemist/routes/cloudflare.d.ts ++++ b/lib/Alchemist/routes/cloudflare.d.ts +@@ -24,11 +24,11 @@ export interface StateLogsInput extends StateTarget { + * state-store route (`bootstrap`, `teardown`, logs) is scoped to. + */ + export declare const resolveStateStoreScope: (target: StateTarget) => Effect.Effect<{ +- layer: Layer.Layer; ++ layer: Layer.Layer; + profile: string; + accountId: string; + workerName: string; +-}, import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore>; ++}, import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore>; + /** Provision (or adopt) the Cloudflare-hosted state-store worker. */ + export declare const bootstrap: (input: BootstrapInput) => Effect.Effect<{ + accountId: string; +@@ -49,15 +49,15 @@ export declare const bootstrap: (input: BootstrapInput) => Effect.Effect<{ + readonly "~effect/ErrorReporter/ignore"?: boolean; + readonly "~effect/ErrorReporter/severity"?: import("effect/LogLevel").Severity; + readonly "~effect/ErrorReporter/attributes"?: import("effect/Record").ReadonlyRecord; +-} | workers.SubdomainNotFound | import("@distilled.cloud/cloudflare/Errors").UnknownCloudflareError | import("@distilled.cloud/doppler").DefaultErrors, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore>; ++} | workers.SubdomainNotFound | import("@distilled.cloud/cloudflare/Errors").UnknownCloudflareError | import("@distilled.cloud/doppler").DefaultErrors, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore>; + /** Tear down the Cloudflare-hosted state store. */ + export declare const teardown: (input: StateTarget) => Effect.Effect<{ + accountId: string; + workerName: string; + deleted: string[]; +-}, import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError | workers.QueueConsumerConflict | workers.ServiceBindingConflict | workers.CloudflareOpError, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore>; ++}, import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError | workers.QueueConsumerConflict | workers.ServiceBindingConflict | workers.CloudflareOpError, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore>; + /** Query past log entries from the state-store worker, oldest first. */ +-export declare const stateLogs: (input: StateLogsInput) => Effect.Effect; ++export declare const stateLogs: (input: StateLogsInput) => Effect.Effect; + /** Live-stream log entries from the state-store worker. */ +-export declare const tailStateLogs: (input: StateTarget) => Stream.Stream; ++export declare const tailStateLogs: (input: StateTarget) => Stream.Stream; + //# sourceMappingURL=cloudflare.d.ts.map +\ No newline at end of file +diff --git a/lib/Alchemist/routes/drift.d.ts b/lib/Alchemist/routes/drift.d.ts +index 8a24e4ea5bd93e267d8d94de1929d765cdf01a71..5781f7512a971063c2fafb3289ae1d431c4d05ba 100644 +--- a/lib/Alchemist/routes/drift.d.ts ++++ b/lib/Alchemist/routes/drift.d.ts +@@ -46,7 +46,7 @@ export declare const inspect: (target: StackTarget) => Effect.Effect<{ + stack: import("../../Stack.ts").CompiledStack; + context: import("effect/Context").Context; + }; +-}, any, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++}, any, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + /** + * Converge state back to the cloud's actual shape. Engine apply events are + * reported through {@link Progress}. +diff --git a/lib/Alchemist/routes/logs.d.ts b/lib/Alchemist/routes/logs.d.ts +index ff74f4ddaa70b24e008d71de79339cf41752008a..a90055d31feb87a8eeb5570edeb3740354a8cf20 100644 +--- a/lib/Alchemist/routes/logs.d.ts ++++ b/lib/Alchemist/routes/logs.d.ts +@@ -25,7 +25,7 @@ export interface QueryInput extends LogInput { + readonly since?: Date; + } + /** Every deployed resource, with the log capabilities its provider offers. */ +-export declare const resources: (target: StackTarget) => Effect.Effect; ++export declare const resources: (target: StackTarget) => Effect.Effect; + /** Query past log entries across the selected resources, oldest first. */ + export declare const entries: (input: QueryInput) => Effect.Effect<{ + resource: { +@@ -35,7 +35,7 @@ export declare const entries: (input: QueryInput) => Effect.Effect<{ + }; + timestamp: Date; + message: string; +-}[], any, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++}[], any, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + /** Live-stream log entries from every selected resource that supports it. */ +-export declare const tail: (input: LogInput) => Stream.Stream; ++export declare const tail: (input: LogInput) => Stream.Stream; + //# sourceMappingURL=logs.d.ts.map +\ No newline at end of file +diff --git a/lib/Alchemist/routes/nuke.d.ts b/lib/Alchemist/routes/nuke.d.ts +index dad47ddf30b68e1eff196eb5fb08de5d32178f7c..a134687d33bb6874e42dbeaed46e20f602eb008a 100644 +--- a/lib/Alchemist/routes/nuke.d.ts ++++ b/lib/Alchemist/routes/nuke.d.ts +@@ -37,7 +37,7 @@ export declare const scan: (input: ScanInput) => Effect.Effect<{ + resources: readonly Nuke.Target[]; + failures: readonly Nuke.ProviderFailure[]; + context: Context.Context; +-}, Config.ConfigError | import("effect/PlatformError").PlatformError | import("../Entrypoint.ts").StackEntrypointError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++}, Config.ConfigError | import("effect/PlatformError").PlatformError | import("../Entrypoint.ts").StackEntrypointError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + /** + * Permanently delete the selected resources. Each confirmed deletion is + * reported through {@link Progress} as `NukeResourceDeleted`. +diff --git a/lib/Alchemist/routes/profile.d.ts b/lib/Alchemist/routes/profile.d.ts +index a3c56d37d3e38a9bedf44d3c3503a3d5d5f724f8..4aff10538a9c88ebd5799b00cffa24683d7ce31f 100644 +--- a/lib/Alchemist/routes/profile.d.ts ++++ b/lib/Alchemist/routes/profile.d.ts +@@ -65,14 +65,14 @@ export declare const get: (input: { + name: string; + active: boolean; + providers: ProviderConnection[]; +-}, AlchemistNotFound | AuthError | import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | Interaction | import("effect/Path").Path | ProfileStore | import("effect/Scope").Scope>; ++}, AlchemistNotFound | AuthError | import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | Interaction | import("effect/Path").Path | ProfileStore | import("effect/Scope").Scope>; + export declare const create: (input: { + readonly name: string; + }) => Effect.Effect<{ + name: string; + active: boolean; + providers: ProviderConnection[]; +-}, AlchemistNotFound | AuthError | import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | Interaction | import("effect/Path").Path | ProfileStore | import("effect/Scope").Scope>; ++}, AlchemistNotFound | AuthError | import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | Interaction | import("effect/Path").Path | ProfileStore | import("effect/Scope").Scope>; + export declare const rename: (input: { + readonly name: string; + readonly newName: string; +@@ -80,7 +80,7 @@ export declare const rename: (input: { + name: string; + active: boolean; + providers: ProviderConnection[]; +-}, AlchemistNotFound | AuthError | import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | Interaction | import("effect/Path").Path | ProfileStore | import("effect/Scope").Scope>; ++}, AlchemistNotFound | AuthError | import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | Interaction | import("effect/Path").Path | ProfileStore | import("effect/Scope").Scope>; + /** Delete a profile and every credential stored for it. */ + export declare const deleteProfile: (input: { + readonly name: string; +@@ -93,13 +93,13 @@ export declare const providers: (input: { + readonly profile?: string; + readonly entrypoint?: string; + readonly envFile?: string; +-}) => Effect.Effect; ++}) => Effect.Effect; + /** The configure methods (and fields) one provider accepts. */ + export declare const configureForm: (input: { + readonly profile: string; + readonly provider: string; + readonly method?: string; +-}) => Effect.Effect; ++}) => Effect.Effect; + /** + * Connect or reconfigure a provider in a profile. Reported through + * {@link Progress} as `ProviderConfigureStarted`; interactive providers drive +@@ -109,7 +109,7 @@ export declare const configure: (input: ConfigureInput) => Effect.Effect<{ + name: string; + active: boolean; + providers: ProviderConnection[]; +-}, AlchemistInvalidInput | AlchemistNotFound | AuthError | import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | Interaction | import("effect/Path").Path | ProfileStore | import("effect/Scope").Scope>; ++}, AlchemistInvalidInput | AlchemistNotFound | AuthError | import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | Interaction | import("effect/Path").Path | ProfileStore | import("effect/Scope").Scope>; + /** Log a provider out and disconnect it from the profile. */ + export declare const removeProvider: (input: ProviderContext & { + readonly provider: string; +@@ -118,7 +118,7 @@ export declare const removeProvider: (input: ProviderContext & { + profile: string; + provider: string; + logout: "completed" | "skipped-invalid-config" | "unavailable"; +-}, AlchemistNotFound | AuthError | import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | Interaction | import("effect/Path").Path | ProfileStore | import("effect/Scope").Scope>; ++}, AlchemistNotFound | AuthError | import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | Interaction | import("effect/Path").Path | ProfileStore | import("effect/Scope").Scope>; + /** + * Re-run login for connected providers without reconfiguring them. Each + * provider is reported through {@link Progress} as `ProviderRefreshStarted`. +@@ -129,5 +129,5 @@ export declare const refresh: (input: ProviderContext & { + name: string; + active: boolean; + providers: ProviderConnection[]; +-}, AlchemistInvalidInput | AlchemistNotFound | AuthError | import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | Interaction | import("effect/Path").Path | ProfileStore | import("effect/Scope").Scope>; ++}, AlchemistInvalidInput | AlchemistNotFound | AuthError | import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | Interaction | import("effect/Path").Path | ProfileStore | import("effect/Scope").Scope>; + //# sourceMappingURL=profile.d.ts.map +\ No newline at end of file +diff --git a/lib/Alchemist/routes/provider.d.ts b/lib/Alchemist/routes/provider.d.ts +index cbdcfccf3f74bceb476f091fe607ee9a6ba470a0..8a7b1e24bc411bea694269432f69c15140b1e4ae 100644 +--- a/lib/Alchemist/routes/provider.d.ts ++++ b/lib/Alchemist/routes/provider.d.ts +@@ -29,5 +29,5 @@ export declare const checkEnvironment: (input: CheckEnvironmentInput) => Effect. + }[]; + }[]; + satisfied: boolean; +-}, AlchemistInvalidInput | import("../../Auth/AuthProvider.ts").AuthError | import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++}, AlchemistInvalidInput | import("../../Auth/AuthProvider.ts").AuthError | import("effect/PlatformError").PlatformError | import("../../Auth/Profile.ts").ProfileError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + //# sourceMappingURL=provider.d.ts.map +\ No newline at end of file +diff --git a/lib/Alchemist/routes/stack.d.ts b/lib/Alchemist/routes/stack.d.ts +index d3bf9b23bf2f47b69ec848f1bf5586e2097e33e5..f8f2f787e481d0c955442581a04806cec762131e 100644 +--- a/lib/Alchemist/routes/stack.d.ts ++++ b/lib/Alchemist/routes/stack.d.ts +@@ -86,7 +86,7 @@ declare const planStack: (input: FilteredPlanInput) => Effect. + stack: import("../../Stack.ts").CompiledStack; + context: import("effect/Context").Context; + }; +-}, unknown, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++}, unknown, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + /** + * Apply a computed plan. Engine apply events are reported through + * {@link Progress} as `ApplyEvent`. +diff --git a/lib/Alchemist/routes/state.d.ts b/lib/Alchemist/routes/state.d.ts +index 54c779bfdaaeb02500c09899f9e063e3f43da4af..8a24c796520ef429690360ef6b7d79c2d65d042d 100644 +--- a/lib/Alchemist/routes/state.d.ts ++++ b/lib/Alchemist/routes/state.d.ts +@@ -29,7 +29,7 @@ export type StateSource = + * ); + * ``` + */ +-export declare const store: (source: StateSource) => Effect.Effect; ++export declare const store: (source: StateSource) => Effect.Effect; + /** The chosen store as a `State` layer. */ +-export declare const layer: (source: StateSource) => Layer.Layer; ++export declare const layer: (source: StateSource) => Layer.Layer; + //# sourceMappingURL=state.d.ts.map +\ No newline at end of file +diff --git a/lib/Auth/OAuthFlow.d.ts b/lib/Auth/OAuthFlow.d.ts +index 7aeee3d7df0cfb62becf46a7d36f52dcafc2991f..acdefbc476aa10d4aedcec916b63fb38ff4f855d 100644 +--- a/lib/Auth/OAuthFlow.d.ts ++++ b/lib/Auth/OAuthFlow.d.ts +@@ -1,4 +1,4 @@ +-import * as Crypto from "effect/Crypto"; ++import { Digest, SecureRandom } from "effect/crypto"; + import * as Effect from "effect/Effect"; + import * as Redacted from "effect/Redacted"; + import * as Schema from "effect/Schema"; +@@ -92,7 +92,7 @@ export interface OAuthClient { + * take them per-authorization; omit for providers whose scopes are + * configured on the application. + */ +- readonly authorize: (scopes?: ReadonlyArray) => Effect.Effect; ++ readonly authorize: (scopes?: ReadonlyArray) => Effect.Effect; + /** + * Exchange an authorization code directly. `authorization` supplies the + * PKCE verifier; omit for non-PKCE clients (tests, relay-less flows). +diff --git a/lib/Auth/OAuthFlow.js b/lib/Auth/OAuthFlow.js +index be74a9d93a72e1198f2c8d675b59ed6dc1e85b50..73954de91fa4467ce9e47bc8a388dbb6b060ebaf 100644 +--- a/lib/Auth/OAuthFlow.js ++++ b/lib/Auth/OAuthFlow.js +@@ -1,6 +1,6 @@ + import * as Data from "effect/Data"; + import * as Clock from "effect/Clock"; +-import * as Crypto from "effect/Crypto"; ++import { Digest, SecureRandom } from "effect/crypto"; + import { Base64Url } from "effect/encoding"; + import * as Effect from "effect/Effect"; + import * as Redacted from "effect/Redacted"; +@@ -38,24 +38,16 @@ export const OAuthCredentials = Schema.Struct({ + scopes: Schema.mutable(Schema.Array(Schema.String)), + }); + const randomText = Effect.fn(function* (length) { +- const crypto = yield* Crypto.Crypto; +- const bytes = yield* crypto.randomBytes(length).pipe(Effect.mapError((cause) => new OAuthError({ +- error: "crypto_error", +- errorDescription: `Secure random generation failed: ${cause}`, +- }))); +- return Base64Url.encode(bytes); ++ const random = yield* SecureRandom.SecureRandom; ++ return Base64Url.encode(yield* random.randomBytes(length)); + }); + const generatePKCE = Effect.fn(function* (length = 96) { +- const crypto = yield* Crypto.Crypto; +- const verifier = yield* randomText(length); +- const challenge = yield* crypto +- .digest("SHA-256", new TextEncoder().encode(verifier)) +- .pipe(Effect.mapError((cause) => new OAuthError({ +- error: "crypto_error", +- errorDescription: `PKCE digest failed: ${cause}`, +- }))); +- return { verifier, challenge: Base64Url.encode(challenge) }; ++ const digest = yield* Digest.Digest; ++ const verifier = yield* randomText(length); ++ const challenge = yield* digest.digest(Digest.sha256, new TextEncoder().encode(verifier)); ++ return { verifier, challenge: Base64Url.encode(challenge) }; + }); ++ + const TokenResponse = Schema.Struct({ + access_token: Schema.String, + refresh_token: Schema.optional(Schema.String), +diff --git a/lib/Cli/commands/cloudflare.d.ts b/lib/Cli/commands/cloudflare.d.ts +index 61d06af1ada704962f0f02eb7b7ed46e3d8afba6..87bd71faee67fb2a603e08414c4c5b7667acd0e4 100644 +--- a/lib/Cli/commands/cloudflare.d.ts ++++ b/lib/Cli/commands/cloudflare.d.ts +@@ -17,5 +17,5 @@ export declare const cloudflareCommand: Command.Command<"cloudflare", {} | {}, { + readonly "~effect/ErrorReporter/ignore"?: boolean; + readonly "~effect/ErrorReporter/severity"?: import("effect/LogLevel").Severity; + readonly "~effect/ErrorReporter/attributes"?: import("effect/Record").ReadonlyRecord; +-} | import("@distilled.cloud/cloudflare/workers").SubdomainNotFound | CliKit.TerminalCancelled | import("@distilled.cloud/acme").TooManyRequests | import("@distilled.cloud/acme").Unauthorized | import("@distilled.cloud/cloudflare/Errors").UnknownCloudflareError | import("./errors.ts").UserInputError | import("@distilled.cloud/cloudflare/workers").WorkerNotFound, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CliKit.CliKit | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/socket/Socket").WebSocketConstructor>; ++} | import("@distilled.cloud/cloudflare/workers").SubdomainNotFound | CliKit.TerminalCancelled | import("@distilled.cloud/acme").TooManyRequests | import("@distilled.cloud/acme").Unauthorized | import("@distilled.cloud/cloudflare/Errors").UnknownCloudflareError | import("./errors.ts").UserInputError | import("@distilled.cloud/cloudflare/workers").WorkerNotFound, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CliKit.CliKit | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/socket/Socket").WebSocketConstructor>; + //# sourceMappingURL=cloudflare.d.ts.map +\ No newline at end of file +diff --git a/lib/Cli/commands/deploy.d.ts b/lib/Cli/commands/deploy.d.ts +index d8b13de2a09e2d9f9d9b74e9c50d863f4663a080..526f55422911bb2b2d51a8145b1aed989abc5171 100644 +--- a/lib/Cli/commands/deploy.d.ts ++++ b/lib/Cli/commands/deploy.d.ts +@@ -16,7 +16,7 @@ export declare const deployCommand: Command.Command<"deploy", { + readonly adopt: boolean; + readonly detailed: boolean; + readonly detectDrift: boolean; +-}, {}, any, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | Cli | CliKit.CliKit | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++}, {}, any, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | Cli | CliKit.CliKit | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + export declare const destroyCommand: Command.Command<"destroy", { + readonly include: readonly string[] | undefined; + readonly exclude: readonly string[] | undefined; +@@ -27,7 +27,7 @@ export declare const destroyCommand: Command.Command<"destroy", { + readonly stage: string | undefined; + readonly yes: boolean; + readonly profile: string | undefined; +-}, {}, any, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | Cli | CliKit.CliKit | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++}, {}, any, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | Cli | CliKit.CliKit | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + export declare const planCommand: Command.Command<"plan", { + readonly include: readonly string[] | undefined; + readonly exclude: readonly string[] | undefined; +@@ -38,5 +38,5 @@ export declare const planCommand: Command.Command<"plan", { + readonly profile: string | undefined; + readonly adopt: boolean; + readonly detailed: boolean; +-}, {}, any, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | Cli | CliKit.CliKit | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++}, {}, any, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | Cli | CliKit.CliKit | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + //# sourceMappingURL=deploy.d.ts.map +\ No newline at end of file +diff --git a/lib/Cli/commands/drift.d.ts b/lib/Cli/commands/drift.d.ts +index 47e319bb571cad5a2a7a3c8d3eb7ae112bd49114..242645b5b9799e138a8b99144b6c51c562795422 100644 +--- a/lib/Cli/commands/drift.d.ts ++++ b/lib/Cli/commands/drift.d.ts +@@ -8,5 +8,5 @@ export declare const driftCommand: Command.Command<"drift", { + readonly envFile: Option.Option; + readonly stage: string | undefined; + readonly profile: string | undefined; +-}, {}, any, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | Cli | CliKit.CliKit | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++}, {}, any, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | Cli | CliKit.CliKit | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + //# sourceMappingURL=drift.d.ts.map +\ No newline at end of file +diff --git a/lib/Cli/commands/logs.d.ts b/lib/Cli/commands/logs.d.ts +index 8c6b371ef4730719d7236783bcd558547204743a..34fca904754edf5970eb97d5c6ce3eda312aa885 100644 +--- a/lib/Cli/commands/logs.d.ts ++++ b/lib/Cli/commands/logs.d.ts +@@ -9,5 +9,5 @@ export declare const logsCommand: Command.Command<"logs", { + readonly limit: number; + readonly since: string | undefined; + readonly tail: boolean; +-}, {}, any, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++}, {}, any, import("../../AlchemyContext.ts").AlchemyContext | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + //# sourceMappingURL=logs.d.ts.map +\ No newline at end of file +diff --git a/lib/Cli/commands/nuke.d.ts b/lib/Cli/commands/nuke.d.ts +index 4b401acb49d0e33ebce920e8dddc86a32c415fea..5f3da42ad4a2c31a3e175f155a36656efef66bbb 100644 +--- a/lib/Cli/commands/nuke.d.ts ++++ b/lib/Cli/commands/nuke.d.ts +@@ -1,5 +1,5 @@ + import { Command } from "effect/cli"; + import * as CliKit from "../../Cli/CliKit/index.ts"; + import { UserInputError } from "./errors.ts"; +-export declare const unsafeCommand: Command.Command<"unsafe", {} | {}, {}, import("effect/Config").ConfigError | import("effect/PlatformError").PlatformError | import("../../Alchemist/Entrypoint.ts").StackEntrypointError | UserInputError | CliKit.InteractionError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CliKit.CliKit | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++export declare const unsafeCommand: Command.Command<"unsafe", {} | {}, {}, import("effect/Config").ConfigError | import("effect/PlatformError").PlatformError | import("../../Alchemist/Entrypoint.ts").StackEntrypointError | UserInputError | CliKit.InteractionError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CliKit.CliKit | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + //# sourceMappingURL=nuke.d.ts.map +\ No newline at end of file +diff --git a/lib/Cli/commands/profile/commands.d.ts b/lib/Cli/commands/profile/commands.d.ts +index 739ce2b414d41ffbe4c35d3737ccd497696dd0b7..868836fb3f6b6559139d50987593888506d1d0ba 100644 +--- a/lib/Cli/commands/profile/commands.d.ts ++++ b/lib/Cli/commands/profile/commands.d.ts +@@ -5,5 +5,5 @@ import { UserInputError } from "../errors.ts"; + export declare const profileCommand: Command.Command<"profile", { + readonly envFile: Option.Option; + readonly main: string; +-} | {}, {}, import("../../../Alchemist/Errors.ts").AlchemistInvalidInput | import("../../../Alchemist/Errors.ts").AlchemistNotFound | import("../../../Auth/AuthProvider.ts").AuthError | import("../confirm.ts").ConfirmationDeclined | import("effect/PlatformError").PlatformError | import("../../../Auth/Profile.ts").ProfileError | import("effect/cli/CliError").ShowHelp | UserInputError | CliKit.InteractionError, import("../../../AlchemyContext.ts").AlchemyContext | import("../../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CliKit.CliKit | import("../../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++} | {}, {}, import("../../../Alchemist/Errors.ts").AlchemistInvalidInput | import("../../../Alchemist/Errors.ts").AlchemistNotFound | import("../../../Auth/AuthProvider.ts").AuthError | import("../confirm.ts").ConfirmationDeclined | import("effect/PlatformError").PlatformError | import("../../../Auth/Profile.ts").ProfileError | import("effect/cli/CliError").ShowHelp | UserInputError | CliKit.InteractionError, import("../../../AlchemyContext.ts").AlchemyContext | import("../../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CliKit.CliKit | import("../../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + //# sourceMappingURL=commands.d.ts.map +\ No newline at end of file +diff --git a/lib/Cli/commands/profile/flows.d.ts b/lib/Cli/commands/profile/flows.d.ts +index 3434c88b42b7dea41f322e06ebbe4b2232e60b98..b33dac6e0405ff38de8488a127c5593045dbab74 100644 +--- a/lib/Cli/commands/profile/flows.d.ts ++++ b/lib/Cli/commands/profile/flows.d.ts +@@ -13,14 +13,14 @@ export declare const showProfileFlow: (options: { + activeProfile: string; + envFile: Option.Option; + main: string; +-}) => Effect.Effect; +-export declare const renameProfileFlow: (name: string, suppliedNewName: string | undefined) => Effect.Effect; ++}) => Effect.Effect; ++export declare const renameProfileFlow: (name: string, suppliedNewName: string | undefined) => Effect.Effect; + export declare const deleteProfileFlow: (options: { + name: string; + envFile: Option.Option; + main: string; + yes: boolean; +-}) => Effect.Effect; ++}) => Effect.Effect; + export declare const editProfileFlow: (options: { + selectedProfile: string; + add: ReadonlyArray; +@@ -32,5 +32,5 @@ export declare const editProfileFlow: (options: { + method?: string; + values: Record; + }; +-}) => Effect.Effect; ++}) => Effect.Effect; + //# sourceMappingURL=flows.d.ts.map +\ No newline at end of file +diff --git a/lib/Cli/commands/profile/hub.d.ts b/lib/Cli/commands/profile/hub.d.ts +index b43f60059dcb76d5ffa77522084e61123468aea6..b8629a4496c8a9da5473487f2bdda05dc80958af 100644 +--- a/lib/Cli/commands/profile/hub.d.ts ++++ b/lib/Cli/commands/profile/hub.d.ts +@@ -4,5 +4,5 @@ import { CliKit } from "../../CliKit/index.ts"; + export declare const profileHub: (options: { + envFile: Option.Option; + main: string; +-}) => Effect.Effect; ++}) => Effect.Effect; + //# sourceMappingURL=hub.d.ts.map +\ No newline at end of file +diff --git a/lib/Cli/commands/provider.d.ts b/lib/Cli/commands/provider.d.ts +index 472ab2d2b2b30a5c5312be329479d0a8b3eda193..31e2f6b5f1a6ef9abdb3155212ce338c24c62234 100644 +--- a/lib/Cli/commands/provider.d.ts ++++ b/lib/Cli/commands/provider.d.ts +@@ -13,5 +13,5 @@ export declare const providerCommand: Command.Command<"provider", {} | {}, {}, i + readonly "~effect/ErrorReporter/ignore"?: boolean; + readonly "~effect/ErrorReporter/severity"?: import("effect/LogLevel").Severity; + readonly "~effect/ErrorReporter/attributes"?: import("effect/Record").ReadonlyRecord; +-} | import("@distilled.cloud/cloudflare/workers").SubdomainNotFound | import("@distilled.cloud/aws/Errors").ThrottlingException | import("@distilled.cloud/acme").TooManyRequests | import("@distilled.cloud/acme").Unauthorized | import("@distilled.cloud/aws/Errors").UnknownAwsError | import("@distilled.cloud/cloudflare/Errors").UnknownCloudflareError | import("@distilled.cloud/aws/Errors").UnknownOperationException | import("@distilled.cloud/aws/Errors").UnrecognizedClientException | import("./errors.ts").UserInputError | import("@distilled.cloud/aws/Errors").ValidationError | import("@distilled.cloud/aws/Errors").ValidationException | import("@distilled.cloud/cloudflare/workers").WorkerNotFound | import("@distilled.cloud/aws/Credentials").CredentialsError | import("../../Interaction.ts").InteractionError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CliKit | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope | import("effect/socket/Socket").WebSocketConstructor>; ++} | import("@distilled.cloud/cloudflare/workers").SubdomainNotFound | import("@distilled.cloud/aws/Errors").ThrottlingException | import("@distilled.cloud/acme").TooManyRequests | import("@distilled.cloud/acme").Unauthorized | import("@distilled.cloud/aws/Errors").UnknownAwsError | import("@distilled.cloud/cloudflare/Errors").UnknownCloudflareError | import("@distilled.cloud/aws/Errors").UnknownOperationException | import("@distilled.cloud/aws/Errors").UnrecognizedClientException | import("./errors.ts").UserInputError | import("@distilled.cloud/aws/Errors").ValidationError | import("@distilled.cloud/aws/Errors").ValidationException | import("@distilled.cloud/cloudflare/workers").WorkerNotFound | import("@distilled.cloud/aws/Credentials").CredentialsError | import("../../Interaction.ts").InteractionError, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CliKit | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope | import("effect/socket/Socket").WebSocketConstructor>; + //# sourceMappingURL=provider.d.ts.map +\ No newline at end of file +diff --git a/lib/Cli/commands/state.d.ts b/lib/Cli/commands/state.d.ts +index 6a46924a2696884235a58f127ed194ff1e1a7798..723111f7b9049a7c45b1a118a5ff25eea5d7aa69 100644 +--- a/lib/Cli/commands/state.d.ts ++++ b/lib/Cli/commands/state.d.ts +@@ -6,5 +6,5 @@ export declare const stateCommand: Command.Command<"state", {} | { + readonly envFile: Option.Option; + readonly profile: string | undefined; + readonly backend: "aws" | "cloudflare" | "configured" | "local"; +-}, {}, unknown, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CliKit.CliKit | import("../../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; ++}, {}, unknown, import("../../AlchemyContext.ts").AlchemyContext | import("../../Artifacts.ts").ArtifactStore | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CliKit.CliKit | import("../../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("../../Interaction.ts").Interaction | import("effect/Path").Path | import("../../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope>; + //# sourceMappingURL=state.d.ts.map +\ No newline at end of file +diff --git a/lib/Cloudflare/Auth/AuthProvider.d.ts b/lib/Cloudflare/Auth/AuthProvider.d.ts +index 064fd9bf6c68b21c9b8406528071a38fba45b81e..a02a27637840b1913325c1c60c5d3579e1763c47 100644 +--- a/lib/Cloudflare/Auth/AuthProvider.d.ts ++++ b/lib/Cloudflare/Auth/AuthProvider.d.ts +@@ -5,5 +5,5 @@ import { CredentialsStore } from "../../Auth/Credentials.ts"; + * {@link AuthProviders} registry when built. Include this in the Cloudflare + * `providers()` layer so the alchemy CLI can discover it. + */ +-export declare const CloudflareAuth: Layer.Layer; ++export declare const CloudflareAuth: Layer.Layer; + //# sourceMappingURL=AuthProvider.d.ts.map +\ No newline at end of file +diff --git a/lib/Cloudflare/Auth/OAuthClient.d.ts b/lib/Cloudflare/Auth/OAuthClient.d.ts +index 1f5d4860f4f5752c533b55cc25727f75eaba83a2..1c78664ad5e710359c6aa48a0be40726d8f6b93f 100644 +--- a/lib/Cloudflare/Auth/OAuthClient.d.ts ++++ b/lib/Cloudflare/Auth/OAuthClient.d.ts +@@ -13,7 +13,7 @@ export declare const OAUTH_ENDPOINTS: { + revoke: string; + }; + export { OAuthCredentials, OAuthError, type Authorization, } from "../../Auth/OAuthFlow.ts"; +-export declare const authorize: (scopes?: ReadonlyArray) => import("effect/Effect").Effect, callback: (authorization: import("./OAuthClient.ts").Authorization) => import("effect/Effect").Effect, exchange: (code: string, authorization?: import("./OAuthClient.ts").Authorization) => import("effect/Effect").Effect, exchangeCallbackInput: (input: string, authorization: import("./OAuthClient.ts").Authorization) => import("effect/Effect").Effect, refresh: (credentials: import("./OAuthClient.ts").OAuthCredentials) => import("effect/Effect").Effect, revoke: (credentials: import("./OAuthClient.ts").OAuthCredentials) => import("effect/Effect").Effect, usesCurrentClient: (credentials: { ++export declare const authorize: (scopes?: ReadonlyArray) => import("effect/Effect").Effect, callback: (authorization: import("./OAuthClient.ts").Authorization) => import("effect/Effect").Effect, exchange: (code: string, authorization?: import("./OAuthClient.ts").Authorization) => import("effect/Effect").Effect, exchangeCallbackInput: (input: string, authorization: import("./OAuthClient.ts").Authorization) => import("effect/Effect").Effect, refresh: (credentials: import("./OAuthClient.ts").OAuthCredentials) => import("effect/Effect").Effect, revoke: (credentials: import("./OAuthClient.ts").OAuthCredentials) => import("effect/Effect").Effect, usesCurrentClient: (credentials: { + readonly clientId?: unknown; + }) => boolean; + //# sourceMappingURL=OAuthClient.d.ts.map +\ No newline at end of file +diff --git a/lib/Cloudflare/Local.d.ts b/lib/Cloudflare/Local.d.ts +index c72423f07745831e9d2a9dc1c4a7c3e5a2d8c91b..6e299b1eafb2b370dd7285b3cb292c809a23052b 100644 +--- a/lib/Cloudflare/Local.d.ts ++++ b/lib/Cloudflare/Local.d.ts +@@ -4,6 +4,6 @@ + * session the first time a stack asks for one of their types. + */ + import * as Layer from "effect/Layer"; +-declare const _default: Layer.Layer> | import("../Provider.ts").Provider | import("../Provider.ts").Provider | import("../Provider.ts").Provider | import("../Provider.ts").Provider | import("../Provider.ts").Provider>, import("effect/Config").ConfigError | import("@alchemy.run/cloudflare-runtime/core").ConfigError | import("effect/PlatformError").PlatformError | import("@alchemy.run/cloudflare-runtime/core").SystemError, import("../AlchemyContext.ts").AlchemyContext | import("../Artifacts.ts").ArtifactStore | import("../index.ts").AuthProviders | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../Auth/Credentials.ts").CredentialsStore | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("effect/Path").Path | import("../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope | import("../Stack.ts").Stack | import("../Stage.ts").Stage>; ++declare const _default: Layer.Layer> | import("../Provider.ts").Provider | import("../Provider.ts").Provider | import("../Provider.ts").Provider | import("../Provider.ts").Provider | import("../Provider.ts").Provider>, import("effect/Config").ConfigError | import("@alchemy.run/cloudflare-runtime/core").ConfigError | import("effect/PlatformError").PlatformError | import("@alchemy.run/cloudflare-runtime/core").SystemError, import("../AlchemyContext.ts").AlchemyContext | import("../Artifacts.ts").ArtifactStore | import("../index.ts").AuthProviders | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("../Auth/Credentials.ts").CredentialsStore | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("effect/Path").Path | import("../Auth/Profile.ts").ProfileStore | import("effect/Scope").Scope | import("../Stack.ts").Stack | import("../Stage.ts").Stage>; + export default _default; + //# sourceMappingURL=Local.d.ts.map +\ No newline at end of file +diff --git a/lib/Cloudflare/Providers.d.ts b/lib/Cloudflare/Providers.d.ts +index f3e7aacfc9f0a9effecdd5db82ed93ed80e933ce..ef1d24d3bc7bc6da2a8637a41e1fc2b0799e45f6 100644 +--- a/lib/Cloudflare/Providers.d.ts ++++ b/lib/Cloudflare/Providers.d.ts +@@ -15,7 +15,7 @@ export type ProviderRequirements = Layer.Services>; + /** + * Cloudflare providers, bindings, and credentials for Worker-based stacks. + */ +-export declare const providers: () => Layer.Layer | Provider.Provider | Provider.Provider | Provider.Provider | Provider.Provider | Provider.Provider | Provider.Provider | Provider.Provider | Provider.Provider | Providers, never, import("../AlchemyContext.ts").AlchemyContext | import("../Artifacts.ts").ArtifactStore | import("../index.ts").AuthProviders | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("effect/Crypto").Crypto | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("effect/Path").Path | import("effect/Scope").Scope | import("../Stack.ts").Stack | import("../Stage.ts").Stage>; ++export declare const providers: () => Layer.Layer | Provider.Provider | Provider.Provider | Provider.Provider | Provider.Provider | Provider.Provider | Provider.Provider | Provider.Provider | Provider.Provider | Providers, never, import("../AlchemyContext.ts").AlchemyContext | import("../Artifacts.ts").ArtifactStore | import("../index.ts").AuthProviders | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | (import("effect/crypto").Digest.Digest | import("effect/crypto").SecureRandom.SecureRandom) | import("effect/FileSystem").FileSystem | import("effect/http/HttpClient").HttpClient | import("effect/Path").Path | import("effect/Scope").Scope | import("../Stack.ts").Stack | import("../Stage.ts").Stage>; + /** + * The foundation every effect tree that talks to the Cloudflare API + * shares — credentials resolved through the Alchemy auth provider, +@@ -34,5 +34,5 @@ export declare const providers: () => Layer.Layer Layer.Layer; ++export declare const CloudflareApiLive: () => Layer.Layer; + //# sourceMappingURL=Providers.d.ts.map +\ No newline at end of file +diff --git a/lib/Cloudflare/StateStore/State.d.ts b/lib/Cloudflare/StateStore/State.d.ts +index 83db6fea1adf670b705cd817276a55d4e4ddb9fd..4d6ecbf300ade862df9dd516f2da494f7099c232 100644 +--- a/lib/Cloudflare/StateStore/State.d.ts ++++ b/lib/Cloudflare/StateStore/State.d.ts +@@ -12,7 +12,7 @@ import { State, type StateService, type StateStoreError } from "../../State/Stat + import * as Interaction from "../../Interaction.ts"; + import * as Access from "../Access.ts"; + import * as CloudflareEnvironment from "../CloudflareEnvironment.ts"; +-export declare const state: () => Layer.Layer; ++export declare const state: () => Layer.Layer; + export interface BootstrapOptions { + /** @default "alchemy-state-store" */ + workerName?: string; +diff --git a/lib/Planetscale/AuthProvider.d.ts b/lib/Planetscale/AuthProvider.d.ts +index 94ebca2ba1148115ff516eb05205b91a2d5ae088..0764accdbf1ded88ca86b96c1ffa0c11ac844cf6 100644 +--- a/lib/Planetscale/AuthProvider.d.ts ++++ b/lib/Planetscale/AuthProvider.d.ts +@@ -60,5 +60,5 @@ export type PlanetscaleResolvedCredentials = { + * - `stored`: prompts for a service token and stores it inline. + * - `oauth`: browser-based login storing access/refresh values inline. + */ +-export declare const PlanetscaleAuth: Layer.Layer; ++export declare const PlanetscaleAuth: Layer.Layer; + //# sourceMappingURL=AuthProvider.d.ts.map +\ No newline at end of file +diff --git a/lib/Planetscale/OAuthClient.d.ts b/lib/Planetscale/OAuthClient.d.ts +index e5675bf527b8eb1e900635d554baf6eb72bb9c9a..e92b5da45bdb6916484231196208f1918c0e8857 100644 +--- a/lib/Planetscale/OAuthClient.d.ts ++++ b/lib/Planetscale/OAuthClient.d.ts +@@ -28,7 +28,7 @@ export declare const OAUTH_ENDPOINTS: { + authorize: string; + token: string; + }; +-export declare const authorize: (scopes?: ReadonlyArray) => import("effect/Effect").Effect, callback: (authorization: import("./OAuthClient.ts").Authorization) => import("effect/Effect").Effect, exchange: (code: string, authorization?: import("./OAuthClient.ts").Authorization) => import("effect/Effect").Effect, exchangeCallbackInput: (input: string, authorization: import("./OAuthClient.ts").Authorization) => import("effect/Effect").Effect, refresh: (credentials: import("./OAuthClient.ts").OAuthCredentials) => import("effect/Effect").Effect, usesCurrentClient: (credentials: { ++export declare const authorize: (scopes?: ReadonlyArray) => import("effect/Effect").Effect, callback: (authorization: import("./OAuthClient.ts").Authorization) => import("effect/Effect").Effect, exchange: (code: string, authorization?: import("./OAuthClient.ts").Authorization) => import("effect/Effect").Effect, exchangeCallbackInput: (input: string, authorization: import("./OAuthClient.ts").Authorization) => import("effect/Effect").Effect, refresh: (credentials: import("./OAuthClient.ts").OAuthCredentials) => import("effect/Effect").Effect, usesCurrentClient: (credentials: { + readonly clientId?: unknown; + }) => boolean; + //# sourceMappingURL=OAuthClient.d.ts.map +\ No newline at end of file +diff --git a/lib/Planetscale/Providers.d.ts b/lib/Planetscale/Providers.d.ts +index 2525d858be5b0ac0b86a62347555f5baccbd52e1..0aa7655df59fea351ac3e93adab882388c8d0767 100644 +--- a/lib/Planetscale/Providers.d.ts ++++ b/lib/Planetscale/Providers.d.ts +@@ -19,6 +19,6 @@ export type ProviderRequirements = Layer.Services>; + * Effect.provide(Planetscale.providers()) + * ``` + */ +-export declare const providers: () => Layer.Layer; ++export declare const providers: () => Layer.Layer; + export {}; + //# sourceMappingURL=Providers.d.ts.map +\ No newline at end of file +diff --git a/lib/Stack.d.ts b/lib/Stack.d.ts +index b24da995d896babf7a4c8306fb6cb6c7f5377b35..fbb2e4386af5215f3bdcfab3bd257406ec276a70 100644 +--- a/lib/Stack.d.ts ++++ b/lib/Stack.d.ts +@@ -1,6 +1,7 @@ + import type { ConfigError } from "effect/Config"; + import * as Context from "effect/Context"; +-import type { Crypto } from "effect/Crypto"; ++import type { Digest, SecureRandom } from "effect/crypto"; ++type Crypto = Digest.Digest | SecureRandom.SecureRandom; + import * as Effect from "effect/Effect"; + import { FileSystem } from "effect/FileSystem"; + import * as Layer from "effect/Layer"; +diff --git a/lib/Util/PlatformServices.d.ts b/lib/Util/PlatformServices.d.ts +index a7291675df1893f4f322f84c60f1d2f78385bfcd..5142a22ec81a44a50af3fc3c1d896d570731bb2c 100644 +--- a/lib/Util/PlatformServices.d.ts ++++ b/lib/Util/PlatformServices.d.ts +@@ -1,4 +1,5 @@ +-import type { Crypto } from "effect/Crypto"; ++import type { Digest, SecureRandom } from "effect/crypto"; ++type Crypto = Digest.Digest | SecureRandom.SecureRandom; + import type { Input as DurationInput } from "effect/Duration"; + import * as Effect from "effect/Effect"; + import type { FileSystem } from "effect/FileSystem"; +diff --git a/lib/Util/PlatformServices.js b/lib/Util/PlatformServices.js +index 7a31f1e6d78159e4f619f14ca5ecffc2d41ee911..c08453c0074cce3279127eee9c8c7bb45fd15ca1 100644 +--- a/lib/Util/PlatformServices.js ++++ b/lib/Util/PlatformServices.js +@@ -1,3 +1,4 @@ ++import { Digest, SecureRandom } from "effect/crypto"; + import * as Effect from "effect/Effect"; + import * as Layer from "effect/Layer"; + import { defaultTeardown } from "effect/Runtime"; +@@ -28,14 +29,14 @@ export const PlatformServices = platformLayer({ + importPlatformPeer("@effect/platform-bun", () => import("@effect/platform-bun/BunServices")), + importPlatformPeer("@effect/platform-bun", () => import("@effect/platform-bun/BunSocket")), + ]); +- return Layer.merge(BunServices.layer, BunSocket.layerWebSocketConstructor); ++ return Layer.mergeAll(BunServices.layer, BunSocket.layerWebSocketConstructor, Digest.layerWebCrypto, SecureRandom.layerWebCrypto); + }, + node: async () => { + const [NodeServices, NodeSocket] = await Promise.all([ + importPlatformPeer("@effect/platform-node", () => import("@effect/platform-node/NodeServices")), + importPlatformPeer("@effect/platform-node", () => import("@effect/platform-node/NodeSocket")), + ]); +- return Layer.merge(NodeServices.layer, NodeSocket.layerWebSocketConstructor); ++ return Layer.mergeAll(NodeServices.layer, NodeSocket.layerWebSocketConstructor, Digest.layerWebCrypto, SecureRandom.layerWebCrypto); + }, + }); + /** +diff --git a/src/Auth/OAuthFlow.ts b/src/Auth/OAuthFlow.ts +index acb924f05aa667c11cf7c89f8f7c3cc1ec443c06..4125786aecd1193bd5bb051d33b39d151b9fc827 100644 +--- a/src/Auth/OAuthFlow.ts ++++ b/src/Auth/OAuthFlow.ts +@@ -1,6 +1,6 @@ + import * as Data from "effect/Data"; + import * as Clock from "effect/Clock"; +-import * as Crypto from "effect/Crypto"; ++import { Digest, SecureRandom } from "effect/crypto"; + import { Base64Url } from "effect/encoding"; + import * as Effect from "effect/Effect"; + import * as Redacted from "effect/Redacted"; +@@ -103,7 +103,7 @@ export interface OAuthClient { + */ + readonly authorize: ( + scopes?: ReadonlyArray, +- ) => Effect.Effect; ++ ) => Effect.Effect; + /** + * Exchange an authorization code directly. `authorization` supplies the + * PKCE verifier; omit for non-PKCE clients (tests, relay-less flows). +@@ -143,33 +143,13 @@ export interface OAuthClient { + } + + const randomText = Effect.fn(function* (length: number) { +- const crypto = yield* Crypto.Crypto; +- const bytes = yield* crypto.randomBytes(length).pipe( +- Effect.mapError( +- (cause) => +- new OAuthError({ +- error: "crypto_error", +- errorDescription: `Secure random generation failed: ${cause}`, +- }), +- ), +- ); +- return Base64Url.encode(bytes); ++ const random = yield* SecureRandom.SecureRandom; ++ return Base64Url.encode(yield* random.randomBytes(length)); + }); +- + const generatePKCE = Effect.fn(function* (length = 96) { +- const crypto = yield* Crypto.Crypto; ++ const digest = yield* Digest.Digest; + const verifier = yield* randomText(length); +- const challenge = yield* crypto +- .digest("SHA-256", new TextEncoder().encode(verifier)) +- .pipe( +- Effect.mapError( +- (cause) => +- new OAuthError({ +- error: "crypto_error", +- errorDescription: `PKCE digest failed: ${cause}`, +- }), +- ), +- ); ++ const challenge = yield* digest.digest(Digest.sha256, new TextEncoder().encode(verifier)); + return { verifier, challenge: Base64Url.encode(challenge) }; + }); + +diff --git a/src/Stack.ts b/src/Stack.ts +index bcfd49c4a227dcad699d9964a2f76c2c09bf4f2c..350f5041f33e46de5162b63fc3babae7a05a995c 100644 +--- a/src/Stack.ts ++++ b/src/Stack.ts +@@ -1,7 +1,8 @@ + import type { ConfigError } from "effect/Config"; + import { ConfigProvider } from "effect/ConfigProvider"; + import * as Context from "effect/Context"; +-import type { Crypto } from "effect/Crypto"; ++import type { Digest, SecureRandom } from "effect/crypto"; ++type Crypto = Digest.Digest | SecureRandom.SecureRandom; + import * as Effect from "effect/Effect"; + import { FileSystem } from "effect/FileSystem"; + import * as Layer from "effect/Layer"; +diff --git a/src/Util/PlatformServices.ts b/src/Util/PlatformServices.ts +index 28f7818b7fb4620eba5b763d032d15ada65937b0..270ec7e7daab336f76d4a3872c34e0486d7ee026 100644 +--- a/src/Util/PlatformServices.ts ++++ b/src/Util/PlatformServices.ts +@@ -1,4 +1,5 @@ +-import type { Crypto } from "effect/Crypto"; ++import { Digest, SecureRandom } from "effect/crypto"; ++type Crypto = Digest.Digest | SecureRandom.SecureRandom; + import type { Input as DurationInput } from "effect/Duration"; + import * as Effect from "effect/Effect"; + import type { FileSystem } from "effect/FileSystem"; +@@ -69,7 +70,7 @@ export const PlatformServices: Layer.Layer = platformLayer({ + () => import("@effect/platform-bun/BunSocket"), + ), + ]); +- return Layer.merge(BunServices.layer, BunSocket.layerWebSocketConstructor); ++ return Layer.mergeAll(BunServices.layer, BunSocket.layerWebSocketConstructor, Digest.layerWebCrypto, SecureRandom.layerWebCrypto); + }, + node: async () => { + const [NodeServices, NodeSocket] = await Promise.all([ +@@ -82,9 +83,11 @@ export const PlatformServices: Layer.Layer = platformLayer({ + () => import("@effect/platform-node/NodeSocket"), + ), + ]); +- return Layer.merge( ++ return Layer.mergeAll( + NodeServices.layer, + NodeSocket.layerWebSocketConstructor, ++ Digest.layerWebCrypto, ++ SecureRandom.layerWebCrypto, + ); + }, + }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dc79ac5..a043b8c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,29 +16,29 @@ catalogs: specifier: 5.20261006.1 version: 5.20261006.1 '@effect/platform-browser': - specifier: 4.0.3 - version: 4.0.3 + specifier: 4.1.1 + version: 4.1.1 '@effect/platform-node': - specifier: 4.0.3 - version: 4.0.3 + specifier: 4.1.1 + version: 4.1.1 '@effect/platform-node-shared': - specifier: 4.0.3 - version: 4.0.3 + specifier: 4.1.1 + version: 4.1.1 '@effect/sql-pg': - specifier: 4.0.3 - version: 4.0.3 + specifier: 4.1.1 + version: 4.1.1 '@effect/sql-sqlite-node': - specifier: 4.0.3 - version: 4.0.3 + specifier: 4.1.1 + version: 4.1.1 '@effect/vitest': - specifier: 4.0.3 - version: 4.0.3 + specifier: 4.1.1 + version: 4.1.1 '@foldkit/ui': - specifier: 0.168.0 - version: 0.168.0 + specifier: 0.170.0 + version: 0.170.0 '@foldkit/vite-plugin': - specifier: 0.27.1 - version: 0.27.1 + specifier: 0.29.0 + version: 0.29.0 '@fontsource-variable/ibm-plex-sans': specifier: 5.3.0 version: 5.3.0 @@ -61,11 +61,11 @@ catalogs: specifier: 2.0.0-beta.80 version: 2.0.0-beta.80 effect: - specifier: 4.0.3 - version: 4.0.3 + specifier: 4.1.1 + version: 4.1.1 foldkit: - specifier: 0.168.0 - version: 0.168.0 + specifier: 0.170.0 + version: 0.170.0 foundationdb: specifier: 2.0.1 version: 2.0.1 @@ -110,10 +110,15 @@ catalogs: version: 3.5.40 overrides: - '@foldkit/vite-plugin@0.27.1>@effect/platform-node': 4.0.3 - '@foldkit/vite-plugin@0.27.1>@effect/platform-node-shared': 4.0.3 + alchemy@2.0.0-beta.80>@effect/sql-d1: 4.1.1 + alchemy@2.0.0-beta.80>@effect/sql-sqlite-do: 4.1.1 better-sqlite3: 12.10.0 +patchedDependencies: + alchemy@2.0.0-beta.80: + hash: acbf496095aeadb234ef016be76548f99584714ea2702ea4b954eb118d31b428 + path: patches/alchemy@2.0.0-beta.80.patch + importers: .: @@ -123,13 +128,13 @@ importers: version: 3.0.1 '@effect/platform-browser': specifier: 'catalog:' - version: 4.0.3(effect@4.0.3) + version: 4.1.1(effect@4.1.1) '@effect/platform-node': specifier: 'catalog:' - version: 4.0.3(effect@4.0.3)(redis@6.2.1) + version: 4.1.1(effect@4.1.1)(redis@6.2.1) '@foldkit/ui': specifier: 'catalog:' - version: 0.168.0(effect@4.0.3)(foldkit@0.168.0(@effect/platform-browser@4.0.3(effect@4.0.3))(effect@4.0.3)) + version: 0.170.0(effect@4.1.1)(foldkit@0.170.0(@effect/platform-browser@4.1.1(effect@4.1.1))(effect@4.1.1)) '@fontsource-variable/ibm-plex-sans': specifier: 'catalog:' version: 5.3.0 @@ -147,13 +152,13 @@ importers: version: 25.9.1 alchemy: specifier: 'catalog:' - version: 2.0.0-beta.80(@effect/platform-node@4.0.3(effect@4.0.3)(redis@6.2.1))(@effect/sql-pg@4.0.3(effect@4.0.3))(@effect/vitest@4.0.3(effect@4.0.3)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))))(@types/node@25.9.1)(effect@4.0.3)(hono@4.11.4)(pg@8.23.0)(typescript@6.0.2)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))(ws@8.22.0) + version: 2.0.0-beta.80(patch_hash=acbf496095aeadb234ef016be76548f99584714ea2702ea4b954eb118d31b428)(@effect/platform-node@4.1.1(effect@4.1.1)(redis@6.2.1))(@effect/sql-pg@4.1.1(effect@4.1.1))(@effect/vitest@4.1.1(effect@4.1.1)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))))(@types/node@25.9.1)(effect@4.1.1)(hono@4.11.4)(pg@8.23.0)(typescript@6.0.2)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))(ws@8.22.0) effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 foldkit: specifier: 'catalog:' - version: 0.168.0(@effect/platform-browser@4.0.3(effect@4.0.3))(effect@4.0.3) + version: 0.170.0(@effect/platform-browser@4.1.1(effect@4.1.1))(effect@4.1.1) oxfmt: specifier: 'catalog:' version: 0.44.0 @@ -192,7 +197,7 @@ importers: version: link:../../packages/core effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 devDependencies: '@types/node': specifier: 'catalog:' @@ -211,7 +216,7 @@ importers: version: link:../../packages/core effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 devDependencies: '@types/node': specifier: 'catalog:' @@ -230,7 +235,7 @@ importers: version: link:../../packages/core effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 devDependencies: '@types/node': specifier: 'catalog:' @@ -246,7 +251,7 @@ importers: dependencies: '@effect/platform-node': specifier: 'catalog:' - version: 4.0.3(effect@4.0.3)(redis@6.2.1) + version: 4.1.1(effect@4.1.1)(redis@6.2.1) '@triplex-build/triplex': specifier: workspace:^ version: link:../../packages/core @@ -258,7 +263,7 @@ importers: version: link:../../packages/sqlite effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 devDependencies: '@types/node': specifier: 'catalog:' @@ -286,7 +291,7 @@ importers: version: link:../../packages/host effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 devDependencies: '@cloudflare/vitest-plugin': specifier: 'catalog:' @@ -299,7 +304,7 @@ importers: version: 25.9.1 alchemy: specifier: 'catalog:' - version: 2.0.0-beta.80(@effect/platform-node@4.0.3(effect@4.0.3)(redis@6.2.1))(@effect/sql-pg@4.0.3(effect@4.0.3))(@effect/vitest@4.0.3(effect@4.0.3)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))))(@types/node@25.9.1)(effect@4.0.3)(hono@4.11.4)(pg@8.23.0)(typescript@6.0.2)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))(ws@8.22.0) + version: 2.0.0-beta.80(patch_hash=acbf496095aeadb234ef016be76548f99584714ea2702ea4b954eb118d31b428)(@effect/platform-node@4.1.1(effect@4.1.1)(redis@6.2.1))(@effect/sql-pg@4.1.1(effect@4.1.1))(@effect/vitest@4.1.1(effect@4.1.1)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))))(@types/node@25.9.1)(effect@4.1.1)(hono@4.11.4)(pg@8.23.0)(typescript@6.0.2)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))(ws@8.22.0) tsdown: specifier: 'catalog:' version: 0.21.7(@emnapi/core@1.10.0)(@emnapi/runtime@1.11.3)(typescript@6.0.2) @@ -314,10 +319,10 @@ importers: dependencies: '@effect/platform-node': specifier: 'catalog:' - version: 4.0.3(effect@4.0.3)(redis@6.2.1) + version: 4.1.1(effect@4.1.1)(redis@6.2.1) '@effect/platform-node-shared': specifier: 'catalog:' - version: 4.0.3(effect@4.0.3) + version: 4.1.1(effect@4.1.1) '@triplex-build/triplex': specifier: workspace:^ version: link:../core @@ -336,7 +341,7 @@ importers: version: 25.9.1 effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 tsx: specifier: 'catalog:' version: 4.19.0 @@ -355,7 +360,7 @@ importers: devDependencies: '@cloudflare/vitest-plugin': specifier: 'catalog:' - version: 1.4.0(@cloudflare/workers-types@5.20261012.1)(@types/node@25.9.1)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))) + version: 1.4.0(@cloudflare/workers-types@5.20261101.1)(@types/node@25.9.1)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))) '@triplex-build/triplex-testkit': specifier: workspace:^ version: link:../testkit @@ -370,7 +375,7 @@ importers: version: 12.10.0 effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 vitest: specifier: 'catalog:' version: 5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)) @@ -383,13 +388,13 @@ importers: devDependencies: '@effect/vitest': specifier: 'catalog:' - version: 4.0.3(effect@4.0.3)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))) + version: 4.1.1(effect@4.1.1)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))) '@types/node': specifier: 'catalog:' version: 25.9.1 effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 vitest: specifier: 'catalog:' version: 5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)) @@ -398,13 +403,13 @@ importers: dependencies: '@effect/platform-browser': specifier: 'catalog:' - version: 4.0.3(effect@4.0.3) + version: 4.1.1(effect@4.1.1) '@effect/platform-node': specifier: 'catalog:' - version: 4.0.3(effect@4.0.3)(redis@6.2.1) + version: 4.1.1(effect@4.1.1)(redis@6.2.1) '@foldkit/ui': specifier: 'catalog:' - version: 0.168.0(effect@4.0.3)(foldkit@0.168.0(@effect/platform-browser@4.0.3(effect@4.0.3))(effect@4.0.3)) + version: 0.170.0(effect@4.1.1)(foldkit@0.170.0(@effect/platform-browser@4.1.1(effect@4.1.1))(effect@4.1.1)) '@fontsource-variable/ibm-plex-sans': specifier: 'catalog:' version: 5.3.0 @@ -422,14 +427,14 @@ importers: version: link:../sqlite effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 foldkit: specifier: 'catalog:' - version: 0.168.0(@effect/platform-browser@4.0.3(effect@4.0.3))(effect@4.0.3) + version: 0.170.0(@effect/platform-browser@4.1.1(effect@4.1.1))(effect@4.1.1) devDependencies: '@foldkit/vite-plugin': specifier: 'catalog:' - version: 0.27.1(effect@4.0.3)(foldkit@0.168.0(@effect/platform-browser@4.0.3(effect@4.0.3))(effect@4.0.3))(redis@6.2.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)) + version: 0.29.0(effect@4.1.1)(foldkit@0.170.0(@effect/platform-browser@4.1.1(effect@4.1.1))(effect@4.1.1))(redis@6.2.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)) '@tailwindcss/vite': specifier: 'catalog:' version: 4.3.3(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)) @@ -463,13 +468,13 @@ importers: devDependencies: '@effect/vitest': specifier: 'catalog:' - version: 4.0.3(effect@4.0.3)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))) + version: 4.1.1(effect@4.1.1)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))) '@types/node': specifier: 'catalog:' version: 25.9.1 effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 testcontainers: specifier: 'catalog:' version: 11.14.0 @@ -491,7 +496,7 @@ importers: version: 25.9.1 effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 vitest: specifier: 'catalog:' version: 5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)) @@ -510,7 +515,7 @@ importers: version: 25.9.1 effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 vitest: specifier: 'catalog:' version: 5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)) @@ -519,7 +524,7 @@ importers: dependencies: '@effect/sql-pg': specifier: 'catalog:' - version: 4.0.3(effect@4.0.3) + version: 4.1.1(effect@4.1.1) '@triplex-build/triplex': specifier: workspace:^ version: link:../core @@ -535,7 +540,7 @@ importers: version: 25.9.1 effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 testcontainers: specifier: 'catalog:' version: 11.14.0 @@ -554,7 +559,7 @@ importers: version: 25.9.1 effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 vitest: specifier: 'catalog:' version: 5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)) @@ -563,7 +568,7 @@ importers: dependencies: '@effect/sql-sqlite-node': specifier: 'catalog:' - version: 4.0.3(effect@4.0.3) + version: 4.1.1(effect@4.1.1) '@triplex-build/triplex': specifier: workspace:^ version: link:../core @@ -579,7 +584,7 @@ importers: version: 25.9.1 effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 vitest: specifier: 'catalog:' version: 5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)) @@ -595,7 +600,7 @@ importers: version: 25.9.1 effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 vitest: specifier: 'catalog:' version: 5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)) @@ -604,7 +609,7 @@ importers: dependencies: '@effect/sql-sqlite-node': specifier: 'catalog:' - version: 4.0.3(effect@4.0.3) + version: 4.1.1(effect@4.1.1) '@triplex-build/triplex': specifier: workspace:^ version: link:../../packages/core @@ -625,7 +630,7 @@ importers: version: link:../../packages/testkit effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 devDependencies: '@types/node': specifier: 'catalog:' @@ -638,13 +643,13 @@ importers: dependencies: '@effect/platform-node': specifier: 'catalog:' - version: 4.0.3(effect@4.0.3)(redis@6.2.1) + version: 4.1.1(effect@4.1.1)(redis@6.2.1) '@effect/sql-pg': specifier: 'catalog:' - version: 4.0.3(effect@4.0.3) + version: 4.1.1(effect@4.1.1) '@effect/sql-sqlite-node': specifier: 'catalog:' - version: 4.0.3(effect@4.0.3) + version: 4.1.1(effect@4.1.1) '@triplex-build/triplex': specifier: workspace:^ version: link:../../packages/core @@ -662,7 +667,7 @@ importers: version: link:../../packages/sqlite effect: specifier: 'catalog:' - version: 4.0.3 + version: 4.1.1 devDependencies: '@types/node': specifier: 'catalog:' @@ -943,8 +948,8 @@ packages: '@cloudflare/workers-types@5.20261006.1': resolution: {integrity: sha512-5OclwQK1d8f5LCPvOlyldC3ryKLUa4nLXegcgPZeUxAPudczQ9xujJDdpS2Tenp7JqbBLW3OgGciHJmuc7QShg==} - '@cloudflare/workers-types@5.20261012.1': - resolution: {integrity: sha512-5Y0NrKXG9CZaNUZ6Dt3TLRE4UQe2/DGuxIhTEVYHUl0jAlv1TpQtI59YBAszRpSaZAMzbM8nqGc1n9Z2q4TVyA==} + '@cloudflare/workers-types@5.20261101.1': + resolution: {integrity: sha512-malJEW9V9x+MygAc9RDGiWF0I8HFYfMzY5CXMn3tbzCxUiQBHtHWUTG5aFmO9oaFenc2z5OyT7e+a46ZaGs3cQ==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -1039,48 +1044,48 @@ packages: '@docsearch/sidepanel-js@4.7.0': resolution: {integrity: sha512-A8r34jCU8kcIk2viECEn2msA28ojUF1BLi/3v5OWWc5G2N3jOuuumBXoeYjfr8dA0UxgFSy5R2bt12dnFJQSyA==} - '@effect/platform-browser@4.0.3': - resolution: {integrity: sha512-1heMTrwHkghTN2DWRb+Os+YdeowMFaxTbBqPzmqJDGU8DlBCKPGr+f4BIjWmnANxlnsIlKUqzr3gKqfR1ueicw==} + '@effect/platform-browser@4.1.1': + resolution: {integrity: sha512-bfJuCUX0qPv0fqVWq65cLNWoSFHt2vPDMn0m2cpaxz51/gaCclT3yBAk3JxN/7aEBvcKVXMui9G8uz4a9uoDgA==} peerDependencies: - effect: ^4.0.3 + effect: ^4.1.1 - '@effect/platform-node-shared@4.0.3': - resolution: {integrity: sha512-5srkJfmWklWSgwZwlkMeTXobfNtxuwuTCvY9JWdPXRv/PBXAe5kKSptzRxT778oFFsaE9IMI8X61pvkifT9Eug==} - engines: {node: '>=18.0.0'} + '@effect/platform-node-shared@4.1.1': + resolution: {integrity: sha512-29zdEDs3i5W+t92+mWTFNSfzSHsTpZMcFZ9k4lkkz4tETlC1m4lRwjdjieJtvQ/bKHMnYrCtZwizsBFSf3L5Yg==} + engines: {node: '>=22.19.0'} peerDependencies: - effect: ^4.0.3 + effect: ^4.1.1 - '@effect/platform-node@4.0.3': - resolution: {integrity: sha512-ctvREpC1EzRVsOm0JyIzYHajAQScFaec6Gl+M7TEIpEqdmmx6Ju11Um92EA/CE2KBfY5Fp1QWlqTkK6lOL7tqg==} - engines: {node: '>=18.0.0'} + '@effect/platform-node@4.1.1': + resolution: {integrity: sha512-Oy3eP27XeipUgejftptHy0zf2W75HU8/yPKwBqdz8uYxAvWdf4c48OFYs6KJX/+uIEKdMjnF6mXYgbauWgIcVA==} + engines: {node: '>=22.19.0'} peerDependencies: - effect: ^4.0.3 - redis: '>=5.0.0 <7.0.0' + effect: ^4.1.1 + redis: '>=5.1.0 <7.0.0' - '@effect/sql-d1@4.0.3': - resolution: {integrity: sha512-PPItxp9aAmJTRIfZtyJMuQCB7d1ExFvIRkGWnfQuWZlPxjtYfQT+V2kS9AUqf0OC1/nZnAFwLlFKCDgumLmy6A==} + '@effect/sql-d1@4.1.1': + resolution: {integrity: sha512-CQMOiw9bmj4ifsUA4KLwIgBJBMpPHaF3OYdXnA9oOxeEmD61+XDLkJUSA2mG7BWCIEZc7MquGxl3HuUVOeqtSA==} peerDependencies: - effect: ^4.0.3 + effect: ^4.1.1 - '@effect/sql-pg@4.0.3': - resolution: {integrity: sha512-pHrR3FGUIoqwkn/0X1yB5Gr1HkPMwzDt/9+cFv2e3eLlpVJwkgYUDeL+IRaO9fXTrKGwQw+y3948lv3x1nLOaQ==} + '@effect/sql-pg@4.1.1': + resolution: {integrity: sha512-NiCzHPTFyI85/fbRdGhQgSa3QpuvByqVv8QaENSBuCFavvuWemIdSbWpKPQXESXU3yYq6PUR0KHY8fFfmWrXlA==} peerDependencies: - effect: ^4.0.3 + effect: ^4.1.1 - '@effect/sql-sqlite-do@4.0.3': - resolution: {integrity: sha512-q3DeEnsmAbD2jQX9g3+U0iij7VFVgzPtSLoOwbB9oegeBkzzBXVDrblAvw2NgEfs0OctkaIkJhiYJROqSafQKA==} + '@effect/sql-sqlite-do@4.1.1': + resolution: {integrity: sha512-9U5xF0vFo/48n0cSeFPOEnUAM4sQ9Tdajk8fF3+I/0YQJ8ce5UH4VDeTAr+wkhXULB7hvAE/ZUJrEgaAl0Jjfw==} peerDependencies: - effect: ^4.0.3 + effect: ^4.1.1 - '@effect/sql-sqlite-node@4.0.3': - resolution: {integrity: sha512-u+b0X/yt8vATwUscXKHdWF75LRMQKBIkx9DsNw8tdgF9xxPOTfx+e30gdwBjd1kY1GmQYkzD7/cP+9mys2b0pg==} + '@effect/sql-sqlite-node@4.1.1': + resolution: {integrity: sha512-vg4ZuqrVN2no19hQnueU0APEbzpSeJ58TMMcqZUek9k2LtfVVhmSOsAgPnkNS37NmQnfXoAHkMY1ZjZBt48D8A==} peerDependencies: - effect: ^4.0.3 + effect: ^4.1.1 - '@effect/vitest@4.0.3': - resolution: {integrity: sha512-jsIkpssf0CFuOeycW2sQZkWx0qzlsRv+JIkzd9qQpoFDcHC9JZFSdIjEBAhsdp20pDy4Y/b2vT/ew7wXZxvEig==} + '@effect/vitest@4.1.1': + resolution: {integrity: sha512-VkE9EUXE4G7mXMmV3X3Iu+6k3pZswWjOf7PB2qiaHMoFAZAPtHp+eUZo9oJM4Ip5z+ghQ9K0IDAQM2iG6+w5MA==} peerDependencies: - effect: ^4.0.3 + effect: ^4.1.1 vitest: '>=5.0.0 <6.0.0' '@electric-sql/pglite-socket@0.0.20': @@ -1418,18 +1423,18 @@ packages: '@floating-ui/utils@0.2.12': resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} - '@foldkit/ui@0.168.0': - resolution: {integrity: sha512-PZNtVorDO6O45txndwouI8fOFHYcdZ3OP9amJKIR9gWJ13+rx+HaDRHYVnBHNp7fom/7qPEWd25wAJCpQF5i6w==} + '@foldkit/ui@0.170.0': + resolution: {integrity: sha512-OU6eDVwweFCUA8wsURIBoUptvohD1J7Xs+n+kRJT7h1vmqwajf8h6yu5PljntNrpi6QiRohjqR/sZt3fWSC65A==} engines: {node: '>=18.0.0'} peerDependencies: - effect: 4.0.0 + effect: ~4.1.0 foldkit: '>=0.167.0' - '@foldkit/vite-plugin@0.27.1': - resolution: {integrity: sha512-sQ8y2v7w21wTwm+NGxboGokbZULmH0kuAg2EV6JH+1rXDBATOCcXIToUmw9ZmaVR14/4SlZIygVnNCRRcDtfQQ==} - engines: {node: '>=20.19.0'} + '@foldkit/vite-plugin@0.29.0': + resolution: {integrity: sha512-nLRScsxd7qzFI0omrkBsP9HtF+B0qhJ+wBEDhWSix+6yy2pmo8GXInq/Cdwu1OnaNkvo2+K4BOC/ZaV+/U7q0Q==} + engines: {node: '>=22.19.0'} peerDependencies: - effect: 4.0.0 + effect: ~4.1.0 foldkit: '>=0.167.0' vite: ^8.0.0 @@ -3378,8 +3383,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - effect@4.0.3: - resolution: {integrity: sha512-LoWn/Uwwx0JjHSDmBAAahx8sB+klzM6vsZovnbYowBNw6B4QScJLRLBByO61plvNiycx7HPN8FnsWUCu0eXW5w==} + effect@4.1.1: + resolution: {integrity: sha512-XYu65BrcmNqu5i7PPvP4dqL+R5ma37zIsfuSPjcn78mog+6e5PkilNg7Xo+pBpjXJYlWEIpH4j91tMrfW05CMw==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -3487,12 +3492,12 @@ packages: focus-trap@8.2.2: resolution: {integrity: sha512-qV0g8hRYBqgACcFOH3f9wXc4zPKhr/0z9RI2a6ZijZ72EeBi4g8oBy8zAWuUR1TsMpOzwpUMFvjdasrC41Joug==} - foldkit@0.168.0: - resolution: {integrity: sha512-FyAY34MdmF1JwdKiPq12uKHBmLny3QxAJ6WdakbXCBh8KR1lQfvdKEygQ/XAlxb2ICSmpVaFga5RgDSnxZsFiw==} + foldkit@0.170.0: + resolution: {integrity: sha512-H/MRQe/IZ/LqpgPi+Zy1S1OXQ8o12e2S/6U+phQu3WmoHSm7Vase/dEnOvrq9YZfqxK44/oVq6wE9oqXzEIaig==} engines: {node: '>=20.19.0'} peerDependencies: - '@effect/platform-browser': 4.0.0 - effect: 4.0.0 + '@effect/platform-browser': ~4.1.0 + effect: ~4.1.0 foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} @@ -3970,11 +3975,11 @@ packages: perfect-debounce@2.1.0: resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} - pg-cloudflare@1.4.0: - resolution: {integrity: sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==} + pg-cloudflare@1.4.1: + resolution: {integrity: sha512-6PQbsFWZcp9EmJEwy5cGQ2La+AMWpP46lgbb8X+U/XsHIUweYDNCpeuKck5RxL2MdVFi7krbbEi5nX4Zh7JhrQ==} - pg-connection-string@2.14.0: - resolution: {integrity: sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==} + pg-connection-string@2.14.1: + resolution: {integrity: sha512-qR3kGNPBLpCNtz0evbKA0Y/MRFXwSSdT+pTJvYp/bXTcReZbvX1kzF0IyTc1QnxqF7AZbOeBhNL8R5mYQZV/MA==} pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} @@ -3985,8 +3990,8 @@ packages: peerDependencies: pg: '>=8.0' - pg-protocol@1.16.0: - resolution: {integrity: sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==} + pg-protocol@1.16.1: + resolution: {integrity: sha512-p9VOFMiHB/ZbJATetbg+99PxssTVSQRnyuPSQ67mN1+1KBOjZaZ83ZQzltnxPhJwSsC3nwVjJ10DVJlerbFzLg==} pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} @@ -4442,8 +4447,8 @@ packages: resolution: {integrity: sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==} engines: {node: '>=20.18.1'} - undici@8.11.2: - resolution: {integrity: sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==} + undici@8.12.3: + resolution: {integrity: sha512-+fdndUTwBP86cVjihTp21hZHo7d6oj1c/47XPA3lL8mM0XHs+C4EkcjmgRsFnFk2f/UONGDy9ItBItmXsLOQHw==} engines: {node: '>=22.19.0'} unenv@2.0.0-rc.24: @@ -4668,18 +4673,6 @@ packages: utf-8-validate: optional: true - ws@8.21.3: - resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.22.0: resolution: {integrity: sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==} engines: {node: '>=10.0.0'} @@ -4746,14 +4739,14 @@ packages: snapshots: - '@alchemy.run/cloudflare-runtime@2.0.0-beta.80(@distilled.cloud/cloudflare@1.0.0-rc.13(effect@4.0.3))(@effect/platform-node@4.0.3(effect@4.0.3)(redis@6.2.1))(@types/node@25.9.1)(effect@4.0.3)(rolldown@1.2.5)(typescript@6.0.2)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))': + '@alchemy.run/cloudflare-runtime@2.0.0-beta.80(@distilled.cloud/cloudflare@1.0.0-rc.13(effect@4.1.1))(@effect/platform-node@4.1.1(effect@4.1.1)(redis@6.2.1))(@types/node@25.9.1)(effect@4.1.1)(rolldown@1.2.5)(typescript@6.0.2)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))': dependencies: '@alchemy.run/node-utils': 2.0.0-beta.80 '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260918.1) - '@distilled.cloud/cloudflare': 1.0.0-rc.13(effect@4.0.3) + '@distilled.cloud/cloudflare': 1.0.0-rc.13(effect@4.1.1) '@puppeteer/browsers': 3.2.2(yauzl@3.4.0) capnp-es: 0.0.16(typescript@6.0.2) - effect: 4.0.3 + effect: 4.1.1 magic-string: 0.30.21 mime: 4.1.1 sharp: 0.35.4(@types/node@25.9.1) @@ -4761,7 +4754,7 @@ snapshots: workerd: 1.20260918.1 yauzl: 3.4.0 optionalDependencies: - '@effect/platform-node': 4.0.3(effect@4.0.3)(redis@6.2.1) + '@effect/platform-node': 4.1.1(effect@4.1.1)(redis@6.2.1) rolldown: 1.2.5 vite: 8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0) transitivePeerDependencies: @@ -4769,9 +4762,9 @@ snapshots: - proxy-agent - typescript - '@alchemy.run/floci@2.0.0-beta.80(effect@4.0.3)': + '@alchemy.run/floci@2.0.0-beta.80(effect@4.1.1)': dependencies: - effect: 4.0.3 + effect: 4.1.1 '@alchemy.run/node-utils@2.0.0-beta.80': dependencies: @@ -4987,13 +4980,13 @@ snapshots: - bufferutil - utf-8-validate - '@cloudflare/vitest-plugin@1.4.0(@cloudflare/workers-types@5.20261012.1)(@types/node@25.9.1)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)))': + '@cloudflare/vitest-plugin@1.4.0(@cloudflare/workers-types@5.20261101.1)(@types/node@25.9.1)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)))': dependencies: cjs-module-lexer: 1.2.3 esbuild: 0.28.2 miniflare: 5.20261006.1-alpha(@types/node@25.9.1) vitest: 5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)) - wrangler: 4.149.0(@cloudflare/workers-types@5.20261012.1)(@types/node@25.9.1) + wrangler: 4.149.0(@cloudflare/workers-types@5.20261101.1)(@types/node@25.9.1) zod: 4.6.5 transitivePeerDependencies: - '@cloudflare/workers-types' @@ -5033,92 +5026,92 @@ snapshots: '@cloudflare/workers-types@5.20261006.1': {} - '@cloudflare/workers-types@5.20261012.1': {} + '@cloudflare/workers-types@5.20261101.1': {} '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@distilled.cloud/acme@1.0.0-rc.13(effect@4.0.3)': + '@distilled.cloud/acme@1.0.0-rc.13(effect@4.1.1)': dependencies: - '@distilled.cloud/core': 1.0.0-rc.13(effect@4.0.3) - effect: 4.0.3 + '@distilled.cloud/core': 1.0.0-rc.13(effect@4.1.1) + effect: 4.1.1 - '@distilled.cloud/aws@1.0.0-rc.13(effect@4.0.3)': + '@distilled.cloud/aws@1.0.0-rc.13(effect@4.1.1)': dependencies: - '@distilled.cloud/core': 1.0.0-rc.13(effect@4.0.3) + '@distilled.cloud/core': 1.0.0-rc.13(effect@4.1.1) '@smithy/types': 4.18.0 - effect: 4.0.3 + effect: 4.1.1 - '@distilled.cloud/axiom@1.0.0-rc.13(effect@4.0.3)': + '@distilled.cloud/axiom@1.0.0-rc.13(effect@4.1.1)': dependencies: - '@distilled.cloud/core': 1.0.0-rc.13(effect@4.0.3) - effect: 4.0.3 + '@distilled.cloud/core': 1.0.0-rc.13(effect@4.1.1) + effect: 4.1.1 - '@distilled.cloud/cloudflare@1.0.0-rc.13(effect@4.0.3)': + '@distilled.cloud/cloudflare@1.0.0-rc.13(effect@4.1.1)': dependencies: - '@distilled.cloud/core': 1.0.0-rc.13(effect@4.0.3) - effect: 4.0.3 + '@distilled.cloud/core': 1.0.0-rc.13(effect@4.1.1) + effect: 4.1.1 - '@distilled.cloud/core@1.0.0-rc.13(effect@4.0.3)': + '@distilled.cloud/core@1.0.0-rc.13(effect@4.1.1)': dependencies: - effect: 4.0.3 + effect: 4.1.1 graphql: 16.11.0 - '@distilled.cloud/doppler@1.0.0-rc.13(effect@4.0.3)': + '@distilled.cloud/doppler@1.0.0-rc.13(effect@4.1.1)': dependencies: - '@distilled.cloud/core': 1.0.0-rc.13(effect@4.0.3) - effect: 4.0.3 + '@distilled.cloud/core': 1.0.0-rc.13(effect@4.1.1) + effect: 4.1.1 - '@distilled.cloud/fly-io@1.0.0-rc.13(effect@4.0.3)': + '@distilled.cloud/fly-io@1.0.0-rc.13(effect@4.1.1)': dependencies: - '@distilled.cloud/core': 1.0.0-rc.13(effect@4.0.3) - effect: 4.0.3 + '@distilled.cloud/core': 1.0.0-rc.13(effect@4.1.1) + effect: 4.1.1 - '@distilled.cloud/gcp@1.0.0-rc.13(effect@4.0.3)': + '@distilled.cloud/gcp@1.0.0-rc.13(effect@4.1.1)': dependencies: - '@distilled.cloud/core': 1.0.0-rc.13(effect@4.0.3) - effect: 4.0.3 + '@distilled.cloud/core': 1.0.0-rc.13(effect@4.1.1) + effect: 4.1.1 - '@distilled.cloud/hetzner@1.0.0-rc.13(effect@4.0.3)': + '@distilled.cloud/hetzner@1.0.0-rc.13(effect@4.1.1)': dependencies: - '@distilled.cloud/core': 1.0.0-rc.13(effect@4.0.3) - effect: 4.0.3 + '@distilled.cloud/core': 1.0.0-rc.13(effect@4.1.1) + effect: 4.1.1 - '@distilled.cloud/infisical@1.0.0-rc.13(effect@4.0.3)': + '@distilled.cloud/infisical@1.0.0-rc.13(effect@4.1.1)': dependencies: - '@distilled.cloud/core': 1.0.0-rc.13(effect@4.0.3) - effect: 4.0.3 + '@distilled.cloud/core': 1.0.0-rc.13(effect@4.1.1) + effect: 4.1.1 - '@distilled.cloud/neon@1.0.0-rc.13(effect@4.0.3)': + '@distilled.cloud/neon@1.0.0-rc.13(effect@4.1.1)': dependencies: - '@distilled.cloud/core': 1.0.0-rc.13(effect@4.0.3) - effect: 4.0.3 + '@distilled.cloud/core': 1.0.0-rc.13(effect@4.1.1) + effect: 4.1.1 - '@distilled.cloud/planetscale@1.0.0-rc.13(effect@4.0.3)': + '@distilled.cloud/planetscale@1.0.0-rc.13(effect@4.1.1)': dependencies: - '@distilled.cloud/core': 1.0.0-rc.13(effect@4.0.3) - effect: 4.0.3 + '@distilled.cloud/core': 1.0.0-rc.13(effect@4.1.1) + effect: 4.1.1 - '@distilled.cloud/prisma@1.0.0-rc.13(effect@4.0.3)': + '@distilled.cloud/prisma@1.0.0-rc.13(effect@4.1.1)': dependencies: - '@distilled.cloud/core': 1.0.0-rc.13(effect@4.0.3) - effect: 4.0.3 + '@distilled.cloud/core': 1.0.0-rc.13(effect@4.1.1) + effect: 4.1.1 - '@distilled.cloud/railway@1.0.0-rc.13(effect@4.0.3)': + '@distilled.cloud/railway@1.0.0-rc.13(effect@4.1.1)': dependencies: - '@distilled.cloud/core': 1.0.0-rc.13(effect@4.0.3) - effect: 4.0.3 + '@distilled.cloud/core': 1.0.0-rc.13(effect@4.1.1) + effect: 4.1.1 - '@distilled.cloud/stripe@1.0.0-rc.13(effect@4.0.3)': + '@distilled.cloud/stripe@1.0.0-rc.13(effect@4.1.1)': dependencies: - '@distilled.cloud/core': 1.0.0-rc.13(effect@4.0.3) - effect: 4.0.3 + '@distilled.cloud/core': 1.0.0-rc.13(effect@4.1.1) + effect: 4.1.1 - '@distilled.cloud/zerossl@1.0.0-rc.13(effect@4.0.3)': + '@distilled.cloud/zerossl@1.0.0-rc.13(effect@4.1.1)': dependencies: - '@distilled.cloud/core': 1.0.0-rc.13(effect@4.0.3) - effect: 4.0.3 + '@distilled.cloud/core': 1.0.0-rc.13(effect@4.1.1) + effect: 4.1.1 '@docsearch/css@4.7.0': {} @@ -5126,49 +5119,49 @@ snapshots: '@docsearch/sidepanel-js@4.7.0': {} - '@effect/platform-browser@4.0.3(effect@4.0.3)': + '@effect/platform-browser@4.1.1(effect@4.1.1)': dependencies: - effect: 4.0.3 + effect: 4.1.1 - '@effect/platform-node-shared@4.0.3(effect@4.0.3)': + '@effect/platform-node-shared@4.1.1(effect@4.1.1)': dependencies: '@types/ws': 8.18.2 - effect: 4.0.3 + effect: 4.1.1 ws: 8.22.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node@4.0.3(effect@4.0.3)(redis@6.2.1)': + '@effect/platform-node@4.1.1(effect@4.1.1)(redis@6.2.1)': dependencies: - '@effect/platform-node-shared': 4.0.3(effect@4.0.3) - effect: 4.0.3 + '@effect/platform-node-shared': 4.1.1(effect@4.1.1) + effect: 4.1.1 redis: 6.2.1 - undici: 8.11.2 + undici: 8.12.3 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/sql-d1@4.0.3(effect@4.0.3)': + '@effect/sql-d1@4.1.1(effect@4.1.1)': dependencies: - '@cloudflare/workers-types': 5.20261012.1 - effect: 4.0.3 + '@cloudflare/workers-types': 5.20261101.1 + effect: 4.1.1 - '@effect/sql-pg@4.0.3(effect@4.0.3)': + '@effect/sql-pg@4.1.1(effect@4.1.1)': dependencies: - effect: 4.0.3 + effect: 4.1.1 - '@effect/sql-sqlite-do@4.0.3(effect@4.0.3)': + '@effect/sql-sqlite-do@4.1.1(effect@4.1.1)': dependencies: - effect: 4.0.3 + effect: 4.1.1 - '@effect/sql-sqlite-node@4.0.3(effect@4.0.3)': + '@effect/sql-sqlite-node@4.1.1(effect@4.1.1)': dependencies: - effect: 4.0.3 + effect: 4.1.1 - '@effect/vitest@4.0.3(effect@4.0.3)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)))': + '@effect/vitest@4.1.1(effect@4.1.1)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)))': dependencies: - effect: 4.0.3 + effect: 4.1.1 vitest: 5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)) '@electric-sql/pglite-socket@0.0.20(@electric-sql/pglite@0.3.15)': @@ -5363,22 +5356,22 @@ snapshots: '@floating-ui/utils@0.2.12': {} - '@foldkit/ui@0.168.0(effect@4.0.3)(foldkit@0.168.0(@effect/platform-browser@4.0.3(effect@4.0.3))(effect@4.0.3))': + '@foldkit/ui@0.170.0(effect@4.1.1)(foldkit@0.170.0(@effect/platform-browser@4.1.1(effect@4.1.1))(effect@4.1.1))': dependencies: '@floating-ui/dom': 1.8.0 - effect: 4.0.3 - foldkit: 0.168.0(@effect/platform-browser@4.0.3(effect@4.0.3))(effect@4.0.3) + effect: 4.1.1 + foldkit: 0.170.0(@effect/platform-browser@4.1.1(effect@4.1.1))(effect@4.1.1) - '@foldkit/vite-plugin@0.27.1(effect@4.0.3)(foldkit@0.168.0(@effect/platform-browser@4.0.3(effect@4.0.3))(effect@4.0.3))(redis@6.2.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))': + '@foldkit/vite-plugin@0.29.0(effect@4.1.1)(foldkit@0.170.0(@effect/platform-browser@4.1.1(effect@4.1.1))(effect@4.1.1))(redis@6.2.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))': dependencies: - '@effect/platform-node': 4.0.3(effect@4.0.3)(redis@6.2.1) - '@effect/platform-node-shared': 4.0.3(effect@4.0.3) - effect: 4.0.3 - foldkit: 0.168.0(@effect/platform-browser@4.0.3(effect@4.0.3))(effect@4.0.3) + '@effect/platform-node': 4.1.1(effect@4.1.1)(redis@6.2.1) + '@effect/platform-node-shared': 4.1.1(effect@4.1.1) + effect: 4.1.1 + foldkit: 0.170.0(@effect/platform-browser@4.1.1(effect@4.1.1))(effect@4.1.1) magic-string: 1.4.3 vite: 8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0) vitefu: 1.1.3(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)) - ws: 8.21.3 + ws: 8.22.0 transitivePeerDependencies: - bufferutil - redis @@ -6605,30 +6598,30 @@ snapshots: dependencies: event-target-shim: 5.0.1 - alchemy@2.0.0-beta.80(@effect/platform-node@4.0.3(effect@4.0.3)(redis@6.2.1))(@effect/sql-pg@4.0.3(effect@4.0.3))(@effect/vitest@4.0.3(effect@4.0.3)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))))(@types/node@25.9.1)(effect@4.0.3)(hono@4.11.4)(pg@8.23.0)(typescript@6.0.2)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))(ws@8.22.0): + alchemy@2.0.0-beta.80(patch_hash=acbf496095aeadb234ef016be76548f99584714ea2702ea4b954eb118d31b428)(@effect/platform-node@4.1.1(effect@4.1.1)(redis@6.2.1))(@effect/sql-pg@4.1.1(effect@4.1.1))(@effect/vitest@4.1.1(effect@4.1.1)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))))(@types/node@25.9.1)(effect@4.1.1)(hono@4.11.4)(pg@8.23.0)(typescript@6.0.2)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))(ws@8.22.0): dependencies: - '@alchemy.run/cloudflare-runtime': 2.0.0-beta.80(@distilled.cloud/cloudflare@1.0.0-rc.13(effect@4.0.3))(@effect/platform-node@4.0.3(effect@4.0.3)(redis@6.2.1))(@types/node@25.9.1)(effect@4.0.3)(rolldown@1.2.5)(typescript@6.0.2)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)) - '@alchemy.run/floci': 2.0.0-beta.80(effect@4.0.3) + '@alchemy.run/cloudflare-runtime': 2.0.0-beta.80(@distilled.cloud/cloudflare@1.0.0-rc.13(effect@4.1.1))(@effect/platform-node@4.1.1(effect@4.1.1)(redis@6.2.1))(@types/node@25.9.1)(effect@4.1.1)(rolldown@1.2.5)(typescript@6.0.2)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0)) + '@alchemy.run/floci': 2.0.0-beta.80(effect@4.1.1) '@alchemy.run/node-utils': 2.0.0-beta.80 '@alchemy.run/sigil': 0.1.0-alpha.1 - '@distilled.cloud/acme': 1.0.0-rc.13(effect@4.0.3) - '@distilled.cloud/aws': 1.0.0-rc.13(effect@4.0.3) - '@distilled.cloud/axiom': 1.0.0-rc.13(effect@4.0.3) - '@distilled.cloud/cloudflare': 1.0.0-rc.13(effect@4.0.3) - '@distilled.cloud/core': 1.0.0-rc.13(effect@4.0.3) - '@distilled.cloud/doppler': 1.0.0-rc.13(effect@4.0.3) - '@distilled.cloud/fly-io': 1.0.0-rc.13(effect@4.0.3) - '@distilled.cloud/gcp': 1.0.0-rc.13(effect@4.0.3) - '@distilled.cloud/hetzner': 1.0.0-rc.13(effect@4.0.3) - '@distilled.cloud/infisical': 1.0.0-rc.13(effect@4.0.3) - '@distilled.cloud/neon': 1.0.0-rc.13(effect@4.0.3) - '@distilled.cloud/planetscale': 1.0.0-rc.13(effect@4.0.3) - '@distilled.cloud/prisma': 1.0.0-rc.13(effect@4.0.3) - '@distilled.cloud/railway': 1.0.0-rc.13(effect@4.0.3) - '@distilled.cloud/stripe': 1.0.0-rc.13(effect@4.0.3) - '@distilled.cloud/zerossl': 1.0.0-rc.13(effect@4.0.3) - '@effect/sql-d1': 4.0.3(effect@4.0.3) - '@effect/sql-sqlite-do': 4.0.3(effect@4.0.3) + '@distilled.cloud/acme': 1.0.0-rc.13(effect@4.1.1) + '@distilled.cloud/aws': 1.0.0-rc.13(effect@4.1.1) + '@distilled.cloud/axiom': 1.0.0-rc.13(effect@4.1.1) + '@distilled.cloud/cloudflare': 1.0.0-rc.13(effect@4.1.1) + '@distilled.cloud/core': 1.0.0-rc.13(effect@4.1.1) + '@distilled.cloud/doppler': 1.0.0-rc.13(effect@4.1.1) + '@distilled.cloud/fly-io': 1.0.0-rc.13(effect@4.1.1) + '@distilled.cloud/gcp': 1.0.0-rc.13(effect@4.1.1) + '@distilled.cloud/hetzner': 1.0.0-rc.13(effect@4.1.1) + '@distilled.cloud/infisical': 1.0.0-rc.13(effect@4.1.1) + '@distilled.cloud/neon': 1.0.0-rc.13(effect@4.1.1) + '@distilled.cloud/planetscale': 1.0.0-rc.13(effect@4.1.1) + '@distilled.cloud/prisma': 1.0.0-rc.13(effect@4.1.1) + '@distilled.cloud/railway': 1.0.0-rc.13(effect@4.1.1) + '@distilled.cloud/stripe': 1.0.0-rc.13(effect@4.1.1) + '@distilled.cloud/zerossl': 1.0.0-rc.13(effect@4.1.1) + '@effect/sql-d1': 4.1.1(effect@4.1.1) + '@effect/sql-sqlite-do': 4.1.1(effect@4.1.1) '@libsql/client': 0.17.4 '@neon/functions': 0.11.0(hono@4.11.4) '@octokit/rest': 22.0.1 @@ -6636,7 +6629,7 @@ snapshots: '@prisma/dev': 0.20.0(typescript@6.0.2) '@types/aws-lambda': 8.10.163 capnweb: 0.12.0 - effect: 4.0.3 + effect: 4.1.1 fflate: 0.8.3 libsodium-wrappers: 0.8.4 pathe: 2.0.3 @@ -6645,9 +6638,9 @@ snapshots: tinyglobby: 0.2.17 yaml: 2.9.0 optionalDependencies: - '@effect/platform-node': 4.0.3(effect@4.0.3)(redis@6.2.1) - '@effect/sql-pg': 4.0.3(effect@4.0.3) - '@effect/vitest': 4.0.3(effect@4.0.3)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))) + '@effect/platform-node': 4.1.1(effect@4.1.1)(redis@6.2.1) + '@effect/sql-pg': 4.1.1(effect@4.1.1) + '@effect/vitest': 4.1.1(effect@4.1.1)(vitest@5.0.4(@types/node@25.9.1)(vite@8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0))) pg: 8.23.0 vite: 8.2.2(@types/node@25.9.1)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.19.0)(yaml@2.9.0) ws: 8.22.0 @@ -6937,7 +6930,7 @@ snapshots: eastasianwidth@0.2.0: {} - effect@4.0.3: {} + effect@4.1.1: {} emoji-regex@10.6.0: {} @@ -7068,10 +7061,10 @@ snapshots: dependencies: tabbable: 6.5.0 - foldkit@0.168.0(@effect/platform-browser@4.0.3(effect@4.0.3))(effect@4.0.3): + foldkit@0.170.0(@effect/platform-browser@4.1.1(effect@4.1.1))(effect@4.1.1): dependencies: - '@effect/platform-browser': 4.0.3(effect@4.0.3) - effect: 4.0.3 + '@effect/platform-browser': 4.1.1(effect@4.1.1) + effect: 4.1.1 parse5: 8.0.1 foreground-child@3.3.1: @@ -7508,10 +7501,10 @@ snapshots: perfect-debounce@2.1.0: {} - pg-cloudflare@1.4.0: + pg-cloudflare@1.4.1: optional: true - pg-connection-string@2.14.0: + pg-connection-string@2.14.1: optional: true pg-int8@1.0.1: @@ -7522,7 +7515,7 @@ snapshots: pg: 8.23.0 optional: true - pg-protocol@1.16.0: + pg-protocol@1.16.1: optional: true pg-types@2.2.0: @@ -7536,13 +7529,13 @@ snapshots: pg@8.23.0: dependencies: - pg-connection-string: 2.14.0 + pg-connection-string: 2.14.1 pg-pool: 3.14.0(pg@8.23.0) - pg-protocol: 1.16.0 + pg-protocol: 1.16.1 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: - pg-cloudflare: 1.4.0 + pg-cloudflare: 1.4.1 optional: true pgpass@1.0.5: @@ -8226,7 +8219,7 @@ snapshots: undici@7.29.1: {} - undici@8.11.2: {} + undici@8.12.3: {} unenv@2.0.0-rc.24: dependencies: @@ -8418,7 +8411,7 @@ snapshots: - bufferutil - utf-8-validate - wrangler@4.149.0(@cloudflare/workers-types@5.20261012.1)(@types/node@25.9.1): + wrangler@4.149.0(@cloudflare/workers-types@5.20261101.1)(@types/node@25.9.1): dependencies: '@cloudflare/kv-asset-handler': 0.5.0 '@cloudflare/unenv-preset': 2.16.2(unenv@2.0.0-rc.24)(workerd@1.20261006.1) @@ -8429,7 +8422,7 @@ snapshots: unenv: 2.0.0-rc.24 workerd: 1.20261006.1 optionalDependencies: - '@cloudflare/workers-types': 5.20261012.1 + '@cloudflare/workers-types': 5.20261101.1 fsevents: 2.3.3 transitivePeerDependencies: - '@types/node' @@ -8458,8 +8451,6 @@ snapshots: ws@8.21.0: {} - ws@8.21.3: {} - ws@8.22.0: {} xtend@4.0.2: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1d59709..59dabbf 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -9,35 +9,35 @@ onlyBuiltDependencies: - "workerd" overrides: - # Foldkit's plugin pins 4.0.0 adapters; keep its tested Effect runtime aligned. - "@foldkit/vite-plugin@0.27.1>@effect/platform-node": "4.0.3" - "@foldkit/vite-plugin@0.27.1>@effect/platform-node-shared": "4.0.3" + # Alchemy accepts ^4.0.0; pin its SQL companions to the tested catalog. + "alchemy@2.0.0-beta.80>@effect/sql-d1": "catalog:" + "alchemy@2.0.0-beta.80>@effect/sql-sqlite-do": "catalog:" "better-sqlite3": "12.10.0" catalog: "@changesets/cli": 3.0.1 "@cloudflare/vitest-plugin": 1.4.0 "@cloudflare/workers-types": 5.20261006.1 - "@effect/platform-browser": 4.0.3 - "@effect/platform-node": 4.0.3 - "@effect/platform-node-shared": 4.0.3 - "@effect/sql-d1": 4.0.3 - "@effect/sql-pg": 4.0.3 - "@effect/sql-sqlite-do": 4.0.3 - "@effect/sql-sqlite-node": 4.0.3 - "@effect/vitest": 4.0.3 + "@effect/platform-browser": 4.1.1 + "@effect/platform-node": 4.1.1 + "@effect/platform-node-shared": 4.1.1 + "@effect/sql-d1": 4.1.1 + "@effect/sql-pg": 4.1.1 + "@effect/sql-sqlite-do": 4.1.1 + "@effect/sql-sqlite-node": 4.1.1 + "@effect/vitest": 4.1.1 "@fontsource-variable/ibm-plex-sans": 5.3.0 "@fontsource/ibm-plex-mono": 5.3.0 "@playwright/test": 1.63.0 - "@foldkit/ui": 0.168.0 - "@foldkit/vite-plugin": 0.27.1 + "@foldkit/ui": 0.170.0 + "@foldkit/vite-plugin": 0.29.0 "@tailwindcss/vite": 4.3.3 "@types/node": 25.9.1 "@types/better-sqlite3": 7.6.13 alchemy: 2.0.0-beta.80 better-sqlite3: 12.10.0 - effect: 4.0.3 - foldkit: 0.168.0 + effect: 4.1.1 + foldkit: 0.170.0 foundationdb: 2.0.1 oxfmt: 0.44.0 oxlint: 1.59.0 @@ -53,10 +53,6 @@ catalog: vue: 3.5.40 tailwindcss: 4.3.3 -# Exact exceptions for Foldkit's 4.0.0 peers, validated by check and test:e2e. -peerDependencyRules: - allowedVersions: - "foldkit@0.168.0>effect": "4.0.3" - "foldkit@0.168.0>@effect/platform-browser": "4.0.3" - "@foldkit/ui@0.168.0>effect": "4.0.3" - "@foldkit/vite-plugin@0.27.1>effect": "4.0.3" +# Effect 4.1 removed Crypto; migrate Alchemy until upstream adopts effect/crypto. +patchedDependencies: + "alchemy@2.0.0-beta.80": patches/alchemy@2.0.0-beta.80.patch diff --git a/scripts/check-alchemy.mjs b/scripts/check-alchemy.mjs new file mode 100644 index 0000000..1d8da34 --- /dev/null +++ b/scripts/check-alchemy.mjs @@ -0,0 +1,39 @@ +import assert from "node:assert/strict"; +import { createHash } from "node:crypto"; +import { Effect } from "effect"; +import { makeOAuthClient } from "alchemy/Auth/OAuthFlow"; +import { PlatformServices } from "alchemy/Util/PlatformServices"; + +// Import the provider used by both stacks without planning or deploying resources. +await import("alchemy/Cloudflare"); + +const client = makeOAuthClient({ + clientId: "triplex-compatibility-check", + endpoints: { + authorize: "https://example.com/authorize", + token: "https://example.com/token", + }, + redirectUri: "https://example.com/callback", + localCallbackUri: "http://127.0.0.1/callback", + auth: { kind: "pkce" }, +}); +const [first, second] = await Effect.runPromise( + Effect.all([client.authorize(["read"]), client.authorize(["read"])]).pipe( + Effect.provide(PlatformServices), + Effect.scoped, + ), +); +for (const authorization of [first, second]) { + const url = new URL(authorization.url); + assert.match(authorization.state, /^[A-Za-z0-9_-]{43}$/); + assert.match(authorization.verifier, /^[A-Za-z0-9_-]{128}$/); + assert.equal(url.searchParams.get("state"), authorization.state); + assert.equal(url.searchParams.get("code_challenge_method"), "S256"); + assert.equal( + url.searchParams.get("code_challenge"), + createHash("sha256").update(authorization.verifier).digest("base64url"), + ); +} +assert.notEqual(first.state, second.state); +assert.notEqual(first.verifier, second.verifier); +console.log("Verified Alchemy provider imports and OAuth PKCE with Effect 4.1 crypto services.");