From 4ab36364a6a84f456138b38ed92662d65691e95a Mon Sep 17 00:00:00 2001 From: "omegent-app[bot]" <306514130+omegent-app[bot]@users.noreply.github.com> Date: Sat, 12 Sep 2026 11:00:48 +0000 Subject: [PATCH 1/3] chore: pin effect packages to npm 4.0.0-rc.115 Resolve effect and @effect/* from npm. Drop the pkg.pr.new override used while 4.0.0-rc.114 was unpublished. Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com> --- package.json | 6 +- packages/cli/package.json | 4 +- packages/e2e/package.json | 8 +- packages/effect-app/package.json | 2 +- packages/infra/package.json | 6 +- packages/vue-components/package.json | 2 +- packages/vue/package.json | 8 +- pnpm-lock.yaml | 326 +++++++++++++++++++-------- pnpm-workspace.yaml | 15 +- 9 files changed, 263 insertions(+), 114 deletions(-) diff --git a/package.json b/package.json index 4e2764527..9f20a3d54 100644 --- a/package.json +++ b/package.json @@ -50,15 +50,15 @@ "@effect-app/infra": "workspace:*", "@effect/language-service": "0.87.2", "@effect/tsgo": "^0.45.0", - "@effect/platform-node": "4.0.0-rc.114", - "@effect/vitest": "4.0.0-rc.114", + "@effect/platform-node": "4.0.0-rc.115", + "@effect/vitest": "4.0.0-rc.115", "@tsconfig/strictest": "^2.0.8", "@types/node": "25.9.1", "@typescript-eslint/eslint-plugin": "8.60.0", "@typescript-eslint/parser": "8.60.0", "@typescript/native-preview": "7.0.0-dev.20260626.1", "dprint": "^0.54.0", - "effect": "4.0.0-rc.114", + "effect": "4.0.0-rc.115", "effect-app": "workspace:*", "eslint": "^10.4.1", "json5": "^2.2.3", diff --git a/packages/cli/package.json b/packages/cli/package.json index 15b1c95d6..043ec0c14 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -14,8 +14,8 @@ "effect-app-cli": "./bin.js" }, "dependencies": { - "@effect/platform-node": "4.0.0-rc.114", - "effect": "4.0.0-rc.114", + "@effect/platform-node": "4.0.0-rc.115", + "effect": "4.0.0-rc.115", "js-yaml": "4.2.0" }, "devDependencies": { diff --git a/packages/e2e/package.json b/packages/e2e/package.json index d5c6483fb..e90cb88a3 100644 --- a/packages/e2e/package.json +++ b/packages/e2e/package.json @@ -10,13 +10,13 @@ "effect-app": "workspace:*" }, "devDependencies": { - "@effect/atom-vue": "^4.0.0-rc.114", - "@effect/platform-node": "4.0.0-rc.114", - "@effect/vitest": "4.0.0-rc.114", + "@effect/atom-vue": "^4.0.0-rc.115", + "@effect/platform-node": "4.0.0-rc.115", + "@effect/vitest": "4.0.0-rc.115", "@tanstack/vue-query": "5.96.2", "@types/node": "25.9.1", "@vitejs/plugin-vue": "^6.0.7", - "effect": "^4.0.0-rc.114", + "effect": "^4.0.0-rc.115", "typescript": "~6.0.3", "vitest": "^4.1.7", "vue": "^3.5.35" diff --git a/packages/effect-app/package.json b/packages/effect-app/package.json index 1ad7c0881..351073f89 100644 --- a/packages/effect-app/package.json +++ b/packages/effect-app/package.json @@ -26,7 +26,7 @@ "vitest": "^4.1.7" }, "peerDependencies": { - "effect": "^4.0.0-rc.114" + "effect": "^4.0.0-rc.115" }, "typesVersions": { "*": { diff --git a/packages/infra/package.json b/packages/infra/package.json index 8757c3c3f..a2b65d755 100644 --- a/packages/infra/package.json +++ b/packages/infra/package.json @@ -21,7 +21,7 @@ "devDependencies": { "@azure/cosmos": "^4.9.3", "@azure/service-bus": "^7.9.5", - "@effect/sql-sqlite-node": "4.0.0-rc.114", + "@effect/sql-sqlite-node": "4.0.0-rc.115", "@sentry/opentelemetry": "10.55.0", "@types/better-sqlite3": "^7.6.13", "@types/node": "25.9.1", @@ -39,12 +39,12 @@ "peerDependencies": { "@azure/cosmos": "^4.9.3", "@azure/service-bus": "^7.9.5", - "@effect/vitest": "^4.0.0-rc.114", + "@effect/vitest": "^4.0.0-rc.115", "@sendgrid/helpers": "^8.0.0", "@sendgrid/mail": "^8.1.6", "@sentry/node": "10.55.0", "@sentry/opentelemetry": "10.55.0", - "effect": "^4.0.0-rc.114", + "effect": "^4.0.0-rc.115", "jwt-decode": "^4.0.0", "redis": "^3.1.2", "redlock": "^4.2.0" diff --git a/packages/vue-components/package.json b/packages/vue-components/package.json index 2504ee19a..1b6172664 100644 --- a/packages/vue-components/package.json +++ b/packages/vue-components/package.json @@ -25,7 +25,7 @@ }, "peerDependencies": { "@mdi/js": "^7.4.47", - "effect": "^4.0.0-rc.114", + "effect": "^4.0.0-rc.115", "intl-messageformat": "^11.2.7", "mdi-js": "^1.0.1", "primeflex": "^4.0.0", diff --git a/packages/vue/package.json b/packages/vue/package.json index 20f75b64f..89290446c 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -18,14 +18,14 @@ "query-string": "^9.4.0" }, "peerDependencies": { - "@effect/atom-vue": "^4.0.0-rc.114", - "@effect/platform-browser": "^4.0.0-rc.114", + "@effect/atom-vue": "^4.0.0-rc.115", + "@effect/platform-browser": "^4.0.0-rc.115", "@sentry/browser": "^10.55.0", - "effect": "^4.0.0-rc.114", + "effect": "^4.0.0-rc.115", "vue": "^3.5.35" }, "devDependencies": { - "@effect/vitest": "4.0.0-rc.114", + "@effect/vitest": "4.0.0-rc.115", "@formatjs/icu-messageformat-parser": "^3.5.10", "@types/node": "25.9.1", "@vitejs/plugin-vue": "^6.0.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1fc8b5b29..d968a10dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,7 +6,6 @@ settings: overrides: date-fns: ^4.4.0 - effect: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 fast-check: ^4.9.0 vue: ^3.5.35 @@ -46,14 +45,14 @@ importers: specifier: 0.87.2 version: 0.87.2 "@effect/platform-node": - specifier: 4.0.0-rc.114 - version: 4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)(redis@6.2.1(@opentelemetry/api@1.9.1)) + specifier: 4.0.0-rc.115 + version: 4.0.0-rc.115(effect@4.0.0-rc.115)(redis@6.2.1(@opentelemetry/api@1.9.1)) "@effect/tsgo": specifier: ^0.45.0 version: 0.45.0 "@effect/vitest": - specifier: 4.0.0-rc.114 - version: 4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.15(@types/node@25.9.1)(esbuild@0.28.0)(sass@1.100.0)(terser@5.45.0)(tsx@4.22.4)(yaml@2.9.0))) + specifier: 4.0.0-rc.115 + version: 4.0.0-rc.115(effect@4.0.0-rc.115)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.15(@types/node@25.9.1)(esbuild@0.28.0)(sass@1.100.0)(terser@5.45.0)(tsx@4.22.4)(yaml@2.9.0))) "@tsconfig/strictest": specifier: ^2.0.8 version: 2.0.8 @@ -73,8 +72,8 @@ importers: specifier: ^0.54.0 version: 0.54.0 effect: - specifier: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 - version: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 + specifier: 4.0.0-rc.115 + version: 4.0.0-rc.115 effect-app: specifier: workspace:* version: link:packages/effect-app @@ -118,11 +117,11 @@ importers: packages/cli: dependencies: "@effect/platform-node": - specifier: 4.0.0-rc.114 - version: 4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)(redis@6.2.1(@opentelemetry/api@1.9.1)) + specifier: 4.0.0-rc.115 + version: 4.0.0-rc.115(effect@4.0.0-rc.115)(redis@6.2.1(@opentelemetry/api@1.9.1)) effect: - specifier: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 - version: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 + specifier: 4.0.0-rc.115 + version: 4.0.0-rc.115 js-yaml: specifier: 4.2.0 version: 4.2.0 @@ -154,14 +153,14 @@ importers: version: link:../effect-app devDependencies: "@effect/atom-vue": - specifier: ^4.0.0-rc.114 - version: 4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)(vue@3.5.35(typescript@6.0.3(patch_hash=6a20b8df080eb8a9c34008e1802ecfd839f4e90e07f1ee97f78694dbd95a520e))) + specifier: ^4.0.0-rc.115 + version: 4.0.0-rc.115(effect@4.0.0-rc.115)(vue@3.5.35(typescript@6.0.3(patch_hash=6a20b8df080eb8a9c34008e1802ecfd839f4e90e07f1ee97f78694dbd95a520e))) "@effect/platform-node": - specifier: 4.0.0-rc.114 - version: 4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)(redis@6.2.1(@opentelemetry/api@1.9.1)) + specifier: 4.0.0-rc.115 + version: 4.0.0-rc.115(effect@4.0.0-rc.115)(redis@6.2.1(@opentelemetry/api@1.9.1)) "@effect/vitest": - specifier: 4.0.0-rc.114 - version: 4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.15(@types/node@25.9.1)(esbuild@0.28.0)(sass@1.100.0)(terser@5.45.0)(tsx@4.22.4)(yaml@2.9.0))) + specifier: 4.0.0-rc.115 + version: 4.0.0-rc.115(effect@4.0.0-rc.115)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.15(@types/node@25.9.1)(esbuild@0.28.0)(sass@1.100.0)(terser@5.45.0)(tsx@4.22.4)(yaml@2.9.0))) "@tanstack/vue-query": specifier: 5.96.2 version: 5.96.2(vue@3.5.35(typescript@6.0.3(patch_hash=6a20b8df080eb8a9c34008e1802ecfd839f4e90e07f1ee97f78694dbd95a520e))) @@ -172,8 +171,8 @@ importers: specifier: ^6.0.7 version: 6.0.7(vite@8.0.15(@types/node@25.9.1)(esbuild@0.28.0)(sass@1.100.0)(terser@5.45.0)(tsx@4.22.4)(yaml@2.9.0))(vue@3.5.35(typescript@6.0.3(patch_hash=6a20b8df080eb8a9c34008e1802ecfd839f4e90e07f1ee97f78694dbd95a520e))) effect: - specifier: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 - version: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 + specifier: ^4.0.0-rc.115 + version: 4.0.0-rc.115 typescript: specifier: ~6.0.3 version: 6.0.3(patch_hash=6a20b8df080eb8a9c34008e1802ecfd839f4e90e07f1ee97f78694dbd95a520e) @@ -193,8 +192,8 @@ importers: specifier: ^4.4.0 version: 4.4.0 effect: - specifier: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 - version: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 + specifier: ^4.0.0-rc.115 + version: 4.0.0-rc.115 nanoid: specifier: ^5.1.11 version: 5.1.11 @@ -332,8 +331,8 @@ importers: packages/infra: dependencies: "@effect/vitest": - specifier: ^4.0.0-rc.114 - version: 4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.15(@types/node@25.9.1)(esbuild@0.28.0)(sass@1.100.0)(terser@5.45.0)(tsx@4.22.4)(yaml@2.9.0))) + specifier: ^4.0.0-rc.115 + version: 4.0.0-rc.115(effect@4.0.0-rc.115)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.15(@types/node@25.9.1)(esbuild@0.28.0)(sass@1.100.0)(terser@5.45.0)(tsx@4.22.4)(yaml@2.9.0))) "@faker-js/faker": specifier: ^8.4.1 version: 8.4.1 @@ -347,8 +346,8 @@ importers: specifier: 10.55.0 version: 10.55.0(supports-color@8.1.1) effect: - specifier: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 - version: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 + specifier: ^4.0.0-rc.115 + version: 4.0.0-rc.115 effect-app: specifier: workspace:* version: link:../effect-app @@ -375,8 +374,8 @@ importers: specifier: ^7.9.5 version: 7.9.5(supports-color@8.1.1) "@effect/sql-sqlite-node": - specifier: 4.0.0-rc.114 - version: 4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4) + specifier: 4.0.0-rc.115 + version: 4.0.0-rc.115(effect@4.0.0-rc.115) "@sentry/opentelemetry": specifier: 10.55.0 version: 10.55.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0) @@ -421,11 +420,11 @@ importers: packages/vue: dependencies: "@effect/atom-vue": - specifier: ^4.0.0-rc.114 - version: 4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)(vue@3.5.35(typescript@6.0.3(patch_hash=6a20b8df080eb8a9c34008e1802ecfd839f4e90e07f1ee97f78694dbd95a520e))) + specifier: ^4.0.0-rc.115 + version: 4.0.0-rc.115(effect@4.0.0-rc.115)(vue@3.5.35(typescript@6.0.3(patch_hash=6a20b8df080eb8a9c34008e1802ecfd839f4e90e07f1ee97f78694dbd95a520e))) "@effect/platform-browser": - specifier: ^4.0.0-rc.114 - version: 4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4) + specifier: ^4.0.0-rc.115 + version: 4.0.0-rc.115(effect@4.0.0-rc.115) "@formatjs/intl": specifier: ^4.1.12 version: 4.1.12 @@ -442,8 +441,8 @@ importers: specifier: ^5.4.4 version: 5.4.4 effect: - specifier: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 - version: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 + specifier: ^4.0.0-rc.115 + version: 4.0.0-rc.115 effect-app: specifier: workspace:* version: link:../effect-app @@ -455,8 +454,8 @@ importers: version: 3.5.35(typescript@6.0.3(patch_hash=6a20b8df080eb8a9c34008e1802ecfd839f4e90e07f1ee97f78694dbd95a520e)) devDependencies: "@effect/vitest": - specifier: 4.0.0-rc.114 - version: 4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.15(@types/node@25.9.1)(esbuild@0.28.0)(sass@1.100.0)(terser@5.45.0)(tsx@4.22.4)(yaml@2.9.0))) + specifier: 4.0.0-rc.115 + version: 4.0.0-rc.115(effect@4.0.0-rc.115)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.15(@types/node@25.9.1)(esbuild@0.28.0)(sass@1.100.0)(terser@5.45.0)(tsx@4.22.4)(yaml@2.9.0))) "@formatjs/icu-messageformat-parser": specifier: ^3.5.10 version: 3.5.10 @@ -495,8 +494,8 @@ importers: specifier: ^1.32.0 version: 1.32.0(vue@3.5.35(typescript@6.0.3(patch_hash=6a20b8df080eb8a9c34008e1802ecfd839f4e90e07f1ee97f78694dbd95a520e))) effect: - specifier: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 - version: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 + specifier: ^4.0.0-rc.115 + version: 4.0.0-rc.115 effect-app: specifier: workspace:* version: link:../effect-app @@ -1189,13 +1188,12 @@ packages: } hasBin: true - "@effect/atom-vue@4.0.0-rc.114": + "@effect/atom-vue@4.0.0-rc.115": resolution: { - integrity: sha512-nVsD7QnJL1/zOXxIlAwBrjAeGp9ik47it43VXOgURRkXK+25rz+MJ0bM0QSZZGtdIOpEET610Hmrh1uIQOVE2A==, + integrity: sha512-1750Ozq5zxliHP78hbw80ynant7IuB6V1MKS+6dnhATZ5I1oViM1Y10ZsSdU9/aGnbnMfpN3SG2URwqhzorXmA==, } - version: 4.0.0-rc.114 peerDependencies: - effect: ^4.0.0-rc.114 + effect: ^4.0.0-rc.115 vue: ^3.5.35 "@effect/language-service@0.87.2": @@ -1204,59 +1202,53 @@ packages: } hasBin: true - "@effect/platform-browser@4.0.0-rc.114": + "@effect/platform-browser@4.0.0-rc.115": resolution: { - integrity: sha512-QlE2aKZyjg6Rn7OYs3hZ2k+2ei+CI/wtsZ1eZQr5SR4b06Vqb/At0v/sliGGMkp3S8zII3Y87dkmENWrxSqlRw==, + integrity: sha512-RwpnxRYSBHBL1HYYlRwIrwz0+1hwmn5RvgqkKI0Tb+ChOIR9UCMpXsAhnwQcGP+mBidrC7dlloL42poGHZW4yw==, } - version: 4.0.0-rc.114 peerDependencies: - effect: ^4.0.0-rc.114 + effect: ^4.0.0-rc.115 "@effect/platform-node-shared@4.0.0-beta.86": resolution: { integrity: sha512-QNixdacCFZ001duRVZTIRUa6BS1YkU9cbC8yN7NnAMc0upUiIuLI6YO9jKMG3HetW1MjZ3PeSOzMM6nneUYPow==, } - version: 4.0.0-beta.86 engines: { node: ">=18.0.0" } peerDependencies: effect: ^4.0.0-beta.86 - "@effect/platform-node-shared@4.0.0-rc.114": + "@effect/platform-node-shared@4.0.0-rc.115": resolution: { - integrity: sha512-YVoL71bJpa8HmAZl63nvVgOI4UBg61Z+6U0qnNN2ZlUktxG7eu26Y/puRxEtMxivxEUHR5vKJsuqQ3PRK4fLQA==, + integrity: sha512-rcBwhDIfb82akJoTv7Vwh8K5x9vC/XfuePS7JjOr+z+dORXzsmKqI1BUQF27ARCN9fTAbDh7I6YvBlWhLjnqNg==, } - version: 4.0.0-rc.114 engines: { node: ">=18.0.0" } peerDependencies: - effect: ^4.0.0-rc.114 + effect: ^4.0.0-rc.115 "@effect/platform-node@4.0.0-beta.86": resolution: { integrity: sha512-K9omw3cICZAHV4caMD9ZVixmnMYZ97+5A8d11orza0VcJiSLoHmwiC9X9nxL+mAcFIUTMvKt4EVR7mCk5hbUzg==, } - version: 4.0.0-beta.86 engines: { node: ">=18.0.0" } peerDependencies: effect: ^4.0.0-beta.86 ioredis: ^5.7.0 - "@effect/platform-node@4.0.0-rc.114": + "@effect/platform-node@4.0.0-rc.115": resolution: { - integrity: sha512-eqPvK8XswUw+FVe7CVqiyYUz4NHPz/1DiNsXi8GwIrsMOLT2wLteaAUID4grjDX7XWK1ONUVy4gS9IwBvp+EjA==, + integrity: sha512-mW03Wjq2FiTL5oi9yOkaKpCyUNBaduKgTk7qMHNELvC21Jq2qOAfdsfH+p+s2zmpB9w2RSa+ApODv4WjO9wQfw==, } - version: 4.0.0-rc.114 engines: { node: ">=18.0.0" } peerDependencies: - effect: ^4.0.0-rc.114 + effect: ^4.0.0-rc.115 redis: ">=5.0.0 <7.0.0" - "@effect/sql-sqlite-node@4.0.0-rc.114": + "@effect/sql-sqlite-node@4.0.0-rc.115": resolution: { - integrity: sha512-2E2kWKi1dJxg87o5FqbhKfVJGs9qSmBAXC4riUJvPa+gNgGa38k9MmpAYJyJUw933Shh1sBE8urpsiZi4mt0sQ==, + integrity: sha512-53n3Kbwush7K/8/G1CDz638ClEoMvnUOT5BltCxMZ8TqcxeNoMv+nty08ZdrJ7P6m1q1RIeWlqdy5J9ZDICpbw==, } - version: 4.0.0-rc.114 peerDependencies: - effect: ^4.0.0-rc.114 + effect: ^4.0.0-rc.115 "@effect/tsgo-darwin-arm64@0.45.0": resolution: { @@ -1313,13 +1305,12 @@ packages: } hasBin: true - "@effect/vitest@4.0.0-rc.114": + "@effect/vitest@4.0.0-rc.115": resolution: { - integrity: sha512-UQcfWdp7akz7EUp/lqb9UPFG3cgb3yQHhBV77QvzvxuxjwX5gK658X+TjDvgP+7LHl2lAgj3aOCBbnaSapfe6g==, + integrity: sha512-DJR0hfdr3HNXAkzW8AzfvUz6VmrNFLrKk9tZGDURi33faMyxkc7ZewxELMMZwGpOTGN4mfqYVbX2CXgI+ZJBeQ==, } - version: 4.0.0-rc.114 peerDependencies: - effect: ^4.0.0-rc.114 + effect: ^4.0.0-rc.115 vitest: ">=5.0.0 <6.0.0" "@emnapi/core@1.10.0": @@ -2169,6 +2160,48 @@ packages: integrity: sha512-p7X/ytJDIdwUfFL/CLOhKgdfJe1Fa8uw9seJYvdOmnP9JBWGWHW69HkOixXS6Wy9yvGf1MbhcS6lVmrhy4jm2g==, } + "@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4": + resolution: { + integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==, + } + cpu: [arm64] + os: [darwin] + + "@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4": + resolution: { + integrity: sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==, + } + cpu: [x64] + os: [darwin] + + "@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4": + resolution: { + integrity: sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==, + } + cpu: [arm64] + os: [linux] + + "@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4": + resolution: { + integrity: sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==, + } + cpu: [arm] + os: [linux] + + "@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4": + resolution: { + integrity: sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==, + } + cpu: [x64] + os: [linux] + + "@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4": + resolution: { + integrity: sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==, + } + cpu: [x64] + os: [win32] + "@napi-rs/wasm-runtime@1.1.4": resolution: { integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==, @@ -5701,12 +5734,15 @@ packages: engines: { node: ">=14" } hasBin: true - effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4: + effect@4.0.0-beta.86: resolution: { - integrity: sha512-3mUudXofhydQQAPOvd0w+N9HxQN2kLjjBfl0SXKRh9dMYBsayyO5z1W+CiB+gzuUAmtU8ppV/W5QRiHPGwV98A==, - tarball: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4, + integrity: sha512-+Y16hy3LhAju/FM3dz3Xp+aGi8dw9AtEzswcvwxREpeEPq+rL8TFS1PgWAO1+/3kKKH4bq9NdBGtfhHzM2K7Ow==, + } + + effect@4.0.0-rc.115: + resolution: { + integrity: sha512-ogYulZ5ffeOzrJqQrG0XOkDO5lKn2s9KNHhoxJy/6wKUkF0i12dlVXWA9TgsgQ+zV/JzizyG0+XMPepZEQX6vw==, } - version: 4.0.0-rc.114 electron-to-chromium@1.5.267: resolution: { @@ -6144,6 +6180,11 @@ packages: } engines: { node: ">=14.16" } + find-my-way-ts@0.1.6: + resolution: { + integrity: sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA==, + } + find-up@4.1.0: resolution: { integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, @@ -6547,6 +6588,12 @@ packages: integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, } + ini@7.0.0: + resolution: { + integrity: sha512-ifK0CgjALofS5bkrcTy4RaQ9Vx2Knf/eLeIO+NaswQEpH1UblrtTSCIvN71qQDMq0PeQ/SSPojvEJp9vvvfr+w==, + } + engines: { node: ^22.22.2 || ^24.15.0 || >=26.0.0 } + internal-slot@1.1.0: resolution: { integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==, @@ -6985,6 +7032,11 @@ packages: integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, } + kubernetes-types@1.30.0: + resolution: { + integrity: sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q==, + } + levn@0.4.1: resolution: { integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, @@ -7432,11 +7484,27 @@ packages: integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, } + msgpackr-extract@3.0.4: + resolution: { + integrity: sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==, + } + hasBin: true + + msgpackr@2.1.0: + resolution: { + integrity: sha512-p/pBCVO63CsvvpkomUnNNag6+n38rULuDA6HHe70o2gtC8ODI52foF/4ko2qQcp6OiErJXTmrZeXmsGGHsIQNQ==, + } + muggle-string@0.4.1: resolution: { integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==, } + multipasta@0.2.8: + resolution: { + integrity: sha512-ZPWuMKyv0cSO29f7hozp+k6+crZbQijV8ipMvxNxRf2SwtYGTX1ZX89Kd20VV4H9Znonx+EQn+iy1wGQsJ+b+Q==, + } + nanoid@3.3.12: resolution: { integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==, @@ -7482,6 +7550,12 @@ packages: integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==, } + node-gyp-build-optional-packages@5.2.2: + resolution: { + integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==, + } + hasBin: true + node-releases@2.0.27: resolution: { integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==, @@ -8861,6 +8935,12 @@ packages: integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==, } + toml@4.3.0: + resolution: { + integrity: sha512-lVb8X9BsPVuH0M4BKeS91tXAmJvCjQ5UIyAbQFaxkKGyUFK2RPkhwaFSQH8vbpl1d23eu/IBH+dwVMHWaq9A5A==, + } + engines: { node: ">=20" } + tough-cookie@6.0.1: resolution: { integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==, @@ -9120,6 +9200,12 @@ packages: integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==, } + uuid@14.0.2: + resolution: { + integrity: sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==, + } + hasBin: true + validator@13.15.35: resolution: { integrity: sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==, @@ -10225,47 +10311,47 @@ snapshots: "@effect-app/cli@2.1.0-beta.35(ioredis@5.9.3(supports-color@8.1.1))": dependencies: - "@effect/platform-node": 4.0.0-beta.86(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)(ioredis@5.9.3(supports-color@8.1.1)) - effect: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 + "@effect/platform-node": 4.0.0-beta.86(effect@4.0.0-beta.86)(ioredis@5.9.3(supports-color@8.1.1)) + effect: 4.0.0-beta.86 js-yaml: 4.2.0 transitivePeerDependencies: - bufferutil - ioredis - utf-8-validate - "@effect/atom-vue@4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)(vue@3.5.35(typescript@6.0.3(patch_hash=6a20b8df080eb8a9c34008e1802ecfd839f4e90e07f1ee97f78694dbd95a520e)))": + "@effect/atom-vue@4.0.0-rc.115(effect@4.0.0-rc.115)(vue@3.5.35(typescript@6.0.3(patch_hash=6a20b8df080eb8a9c34008e1802ecfd839f4e90e07f1ee97f78694dbd95a520e)))": dependencies: - effect: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 + effect: 4.0.0-rc.115 vue: 3.5.35(typescript@6.0.3(patch_hash=6a20b8df080eb8a9c34008e1802ecfd839f4e90e07f1ee97f78694dbd95a520e)) "@effect/language-service@0.87.2": {} - "@effect/platform-browser@4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)": + "@effect/platform-browser@4.0.0-rc.115(effect@4.0.0-rc.115)": dependencies: - effect: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 + effect: 4.0.0-rc.115 - "@effect/platform-node-shared@4.0.0-beta.86(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)": + "@effect/platform-node-shared@4.0.0-beta.86(effect@4.0.0-beta.86)": dependencies: "@types/ws": 8.18.1 - effect: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 + effect: 4.0.0-beta.86 ws: 8.21.3 transitivePeerDependencies: - bufferutil - utf-8-validate - "@effect/platform-node-shared@4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)": + "@effect/platform-node-shared@4.0.0-rc.115(effect@4.0.0-rc.115)": dependencies: "@types/ws": 8.18.1 - effect: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 + effect: 4.0.0-rc.115 ws: 8.21.3 transitivePeerDependencies: - bufferutil - utf-8-validate - "@effect/platform-node@4.0.0-beta.86(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)(ioredis@5.9.3(supports-color@8.1.1))": + "@effect/platform-node@4.0.0-beta.86(effect@4.0.0-beta.86)(ioredis@5.9.3(supports-color@8.1.1))": dependencies: - "@effect/platform-node-shared": 4.0.0-beta.86(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4) - effect: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 + "@effect/platform-node-shared": 4.0.0-beta.86(effect@4.0.0-beta.86) + effect: 4.0.0-beta.86 ioredis: 5.9.3(supports-color@8.1.1) mime: 4.1.0 undici: 8.3.0 @@ -10273,19 +10359,19 @@ snapshots: - bufferutil - utf-8-validate - "@effect/platform-node@4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)(redis@6.2.1(@opentelemetry/api@1.9.1))": + "@effect/platform-node@4.0.0-rc.115(effect@4.0.0-rc.115)(redis@6.2.1(@opentelemetry/api@1.9.1))": dependencies: - "@effect/platform-node-shared": 4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4) - effect: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 + "@effect/platform-node-shared": 4.0.0-rc.115(effect@4.0.0-rc.115) + effect: 4.0.0-rc.115 redis: 6.2.1(@opentelemetry/api@1.9.1) undici: 8.10.2 transitivePeerDependencies: - bufferutil - utf-8-validate - "@effect/sql-sqlite-node@4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)": + "@effect/sql-sqlite-node@4.0.0-rc.115(effect@4.0.0-rc.115)": dependencies: - effect: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 + effect: 4.0.0-rc.115 "@effect/tsgo-darwin-arm64@0.45.0": optional: true @@ -10318,9 +10404,9 @@ snapshots: "@effect/tsgo-win32-arm64": 0.45.0 "@effect/tsgo-win32-x64": 0.45.0 - "@effect/vitest@4.0.0-rc.114(effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.15(@types/node@25.9.1)(esbuild@0.28.0)(sass@1.100.0)(terser@5.45.0)(tsx@4.22.4)(yaml@2.9.0)))": + "@effect/vitest@4.0.0-rc.115(effect@4.0.0-rc.115)(vitest@4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.15(@types/node@25.9.1)(esbuild@0.28.0)(sass@1.100.0)(terser@5.45.0)(tsx@4.22.4)(yaml@2.9.0)))": dependencies: - effect: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 + effect: 4.0.0-rc.115 vitest: 4.1.7(@opentelemetry/api@1.9.1)(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.15(@types/node@25.9.1)(esbuild@0.28.0)(sass@1.100.0)(terser@5.45.0)(tsx@4.22.4)(yaml@2.9.0)) "@emnapi/core@1.10.0": @@ -10732,6 +10818,24 @@ snapshots: dependencies: sparse-bitfield: 3.0.3 + "@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4": + optional: true + + "@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4": + optional: true + + "@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4": + optional: true + + "@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4": + optional: true + + "@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4": + optional: true + + "@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4": + optional: true + "@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)": dependencies: "@emnapi/core": 1.10.0 @@ -12935,7 +13039,20 @@ snapshots: minimatch: 9.0.1 semver: 7.7.3 - effect@https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4: {} + effect@4.0.0-beta.86: + dependencies: + "@standard-schema/spec": 1.1.0 + fast-check: 4.9.0 + find-my-way-ts: 0.1.6 + ini: 7.0.0 + kubernetes-types: 1.30.0 + msgpackr: 2.1.0 + multipasta: 0.2.8 + toml: 4.3.0 + uuid: 14.0.2 + yaml: 2.9.0 + + effect@4.0.0-rc.115: {} electron-to-chromium@1.5.267: optional: true @@ -13389,6 +13506,8 @@ snapshots: filter-obj@5.1.0: {} + find-my-way-ts@0.1.6: {} + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -13679,6 +13798,8 @@ snapshots: ini@1.3.8: {} + ini@7.0.0: {} + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -13981,6 +14102,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + kubernetes-types@1.30.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -14239,8 +14362,26 @@ snapshots: ms@2.1.3: {} + msgpackr-extract@3.0.4: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + "@msgpackr-extract/msgpackr-extract-darwin-arm64": 3.0.4 + "@msgpackr-extract/msgpackr-extract-darwin-x64": 3.0.4 + "@msgpackr-extract/msgpackr-extract-linux-arm": 3.0.4 + "@msgpackr-extract/msgpackr-extract-linux-arm64": 3.0.4 + "@msgpackr-extract/msgpackr-extract-linux-x64": 3.0.4 + "@msgpackr-extract/msgpackr-extract-win32-x64": 3.0.4 + optional: true + + msgpackr@2.1.0: + optionalDependencies: + msgpackr-extract: 3.0.4 + muggle-string@0.4.1: {} + multipasta@0.2.8: {} + nanoid@3.3.12: {} nanoid@5.1.11: {} @@ -14261,6 +14402,11 @@ snapshots: node-addon-api@7.1.1: optional: true + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.1.2 + optional: true + node-releases@2.0.27: optional: true @@ -15417,6 +15563,8 @@ snapshots: token-stream@1.0.0: {} + toml@4.3.0: {} + tough-cookie@6.0.1: dependencies: tldts: 7.0.19 @@ -15612,6 +15760,8 @@ snapshots: is-typed-array: 1.1.15 which-typed-array: 1.1.20 + uuid@14.0.2: {} + validator@13.15.35: {} vfile-message@4.0.3: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 701b1417e..f6bfcf271 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,5 @@ packages: - packages/* -blockExoticSubdeps: false allowBuilds: "@parcel/watcher": false better-sqlite3: true @@ -17,15 +16,15 @@ minimumReleaseAgeExclude: - "@effect/tsgo-win32-arm64@0.45.0" - "@effect/tsgo-win32-x64@0.45.0" - "@effect/tsgo@0.45.0" - - "@effect/atom-vue@4.0.0-rc.114" - - "@effect/platform-browser@4.0.0-rc.114" - - "@effect/platform-node-shared@4.0.0-rc.114" - - "@effect/platform-node@4.0.0-rc.114" - - "@effect/sql-sqlite-node@4.0.0-rc.114" - - "@effect/vitest@4.0.0-rc.114" + - "@effect/atom-vue@4.0.0-rc.115" + - "@effect/platform-browser@4.0.0-rc.115" + - "@effect/platform-node-shared@4.0.0-rc.115" + - "@effect/platform-node@4.0.0-rc.115" + - "@effect/sql-sqlite-node@4.0.0-rc.115" + - "@effect/vitest@4.0.0-rc.115" + - effect@4.0.0-rc.115 overrides: date-fns: ^4.4.0 - effect: https://pkg.pr.new/Effect-TS/effect/effect@cdb3ac9171c63fade3e70d12d6d0de52ae164bc4 fast-check: ^4.9.0 vue: ^3.5.35 patchedDependencies: From 678172f8fd2466577a19b4992991c4b2abb818cd Mon Sep 17 00:00:00 2001 From: "omegent-app[bot]" <306514130+omegent-app[bot]@users.noreply.github.com> Date: Sat, 12 Sep 2026 11:00:57 +0000 Subject: [PATCH 2/3] Squashed 'repos/effect/' changes from cdb3ac9171..4a05d4914f 4a05d4914f Version Packages (rc) (#8192) 657254b821 Optimize Schema initialization (#8196) f9ef0e9702 fix(http): omit body in toWeb for 204, 205, and 304 (#8190) ccad0fe130 Fix generated HTTP client path handling (#8188) 4f73f9e0bd fix(persistence): parameterize persistence lookup keys (#8187) git-subtree-dir: repos/effect git-subtree-split: 4a05d4914fa2327a42bd75fe77c22c188becf3b4 --- {repos/effect/.agents => .agents}/AGENTS.md | 0 .../skills/ai-docs/SKILL.md | 0 .../skills/bundle-analysis/SKILL.md | 0 .../skills/changesets/SKILL.md | 0 .../skills/changesets/authoring.md | 0 .../skills/ci-maintenance/SKILL.md | 0 .../ci-maintenance/privileged-workflows.md | 0 .../skills/dependency-maintenance/SKILL.md | 0 .../coordinated-upgrades.md | 0 .../dependency-maintenance/manifest-roles.md | 0 .../skills/effect-development/SKILL.md | 0 .../skills/jsdocs/SKILL.md | 0 .../skills/jsdocs/categories.md | 0 .../skills/jsdocs/declarations.md | 0 .../skills/jsdocs/examples.md | 0 .../skills/migration-guidance/SKILL.md | 0 .../skills/migration-guidance/annotations.md | 0 .../skills/migration-guidance/generation.md | 0 .../skills/package-development/SKILL.md | 0 .../package-development/dependencies.md | 0 .../skills/package-development/publishing.md | 0 .../package-development/registration.md | 0 .../skills/performance-analysis/SKILL.md | 0 .../skills/performance-analysis/runtime.md | 0 .../skills/performance-analysis/types.md | 0 .../skills/test-development/SKILL.md | 0 .../test-development/displayed-types.md | 0 .../skills/test-development/runtime.md | 0 .../skills/test-development/types.md | 0 .../skills/vendored-assets/SKILL.md | 0 .../skills/vendored-assets/browser-assets.md | 0 .changeset/README.md | 8 - .changeset/active-query-invalidation.md | 5 - .changeset/add-oxlint-integration.md | 5 - .changeset/add-stream-mutation.md | 13 - .changeset/adopt-module-system.md | 8 - .changeset/align-invalidation-entry-types.md | 12 - .changeset/align-schema-void-ts-semantics.md | 12 - .changeset/all-phones-dream.md | 5 - .changeset/amber-garlics-sing.md | 5 - .changeset/api-client-isolate-layers.md | 20 - .changeset/atom-query-vue.md | 6 - .changeset/batch-cosmos-acks.md | 5 - .changeset/batch-dual-options.md | 5 - .changeset/big-teams-wash.md | 5 - .changeset/blue-rats-admire.md | 5 - .changeset/bold-berries-change.md | 5 - .changeset/brave-animals-like.md | 5 - .changeset/brave-bushes-fold.md | 5 - .changeset/brave-laws-add.md | 5 - .changeset/brave-oranges-try.md | 5 - .changeset/brave-years-fry.md | 5 - .changeset/bright-camels-grin.md | 5 - .changeset/bright-lions-share.md | 5 - .changeset/bright-mugs-paint.md | 5 - .changeset/bright-peaches-wave.md | 5 - .changeset/bright-trees-count.md | 5 - .changeset/builtin-map-union-receiver.md | 5 - .changeset/cached-per-request-helper.md | 5 - .changeset/calm-clocks-observe.md | 6 - .changeset/calm-cosmos-cluster.md | 5 - .changeset/calm-filter-cycle.md | 5 - .changeset/calm-pallets-listen.md | 5 - .changeset/calm-pets-float.md | 10 - .changeset/calm-picks-refresh.md | 6 - .changeset/chilly-colts-attack.md | 5 - .changeset/chilly-steaks-rule.md | 5 - .changeset/chubby-dolls-yell.md | 6 - .changeset/class-facade-encode-keys.md | 6 - .changeset/clean-atom-suspense.md | 5 - .changeset/clean-sql-data-column.md | 5 - .changeset/clean-unused-dependencies.md | 8 - .changeset/cleanup-tsgolint-codegen.md | 15 - .changeset/clear-cycles-enjoy.md | 9 - .changeset/clever-breads-enter.md | 6 - .changeset/clever-pets-follow.md | 6 - .changeset/cli-preserve-trailing-newline.md | 5 - .changeset/cli-sync-no-tags.md | 5 - .changeset/cli-ue-semver-target.md | 5 - .changeset/client-fetch-property.md | 7 - .../cluster-servicebus-notifications.md | 5 - .changeset/codegen-rule-options.md | 5 - .changeset/cold-brooms-ski.md | 5 - .changeset/cold-rabbits-pay.md | 5 - .changeset/command-button-optional-input.md | 5 - .changeset/commander-state-toast-types.md | 8 - .changeset/commander-stream-fn.md | 23 - .changeset/common-schools-stop.md | 5 - .changeset/computed-projections-extensions.md | 12 - .changeset/computed-projections-infra.md | 5 - .changeset/concurrent-decode-helpers.md | 14 - .changeset/config-nested-native.md | 5 - .changeset/config.json | 56 +- .../configurable-barrel-import-extension.md | 5 - .../configurable-mutation-invalidation.md | 21 - .changeset/context-map-resolver-cache.md | 5 - .changeset/cool-needles-wash.md | 5 - .changeset/core-boundary-split.md | 9 - .changeset/cosmos-cluster-occ-tests.md | 5 - .changeset/cosmos-every-param-shift.md | 5 - .changeset/cosmos-filter-seed.md | 5 - .changeset/cosmos-namespace-spans.md | 5 - .changeset/cosmos-namespace-support.md | 5 - .changeset/cosmos-span-response-size.md | 7 - .changeset/cosmos-workflow-engine.md | 5 - .changeset/cozy-cats-lie.md | 5 - .changeset/crisp-seals-care.md | 11 - .changeset/crisp-trees-smash.md | 5 - .changeset/ctxmap-per-request-memomap.md | 24 - .changeset/cuddly-laws-smell.md | 5 - .changeset/cups-error-tagged.md | 9 - .changeset/curly-beds-sing.md | 5 - .changeset/curly-dolls-double.md | 5 - .changeset/curvy-files-share.md | 5 - .changeset/curvy-pugs-rush.md | 5 - .changeset/cyan-experts-smoke.md | 5 - .changeset/cyan-pianos-peel.md | 6 - .changeset/cyan-things-train.md | 5 - .changeset/date-defaults-pipe-self.md | 7 - .changeset/date-identifier-split.md | 8 - .changeset/delay-waiting-toast.md | 5 - .changeset/disable-query-invalidation.md | 19 - .changeset/document-query-project-modes.md | 5 - .changeset/drop-constructor-default.md | 7 - .changeset/easy-aliens-peel.md | 11 - .changeset/easy-spiders-study.md | 5 - .changeset/effa-sync-shared.md | 20 - .changeset/effa-sync-update-flag.md | 5 - .changeset/effect-app-prefer-fn-untraced.md | 5 - .changeset/effect-main-rc-apis.md | 17 - .changeset/eighty-aliens-hide.md | 5 - .changeset/eighty-signs-smile.md | 5 - .changeset/eleven-eyes-lie.md | 5 - .changeset/empty-queens-begin.md | 5 - .changeset/empty-rules-check.md | 5 - .changeset/eslint-codegen-glob-11.md | 5 - .changeset/expose-make-on-query-command.md | 5 - .../extract-fixed-nuxt-error-boundary.md | 5 - .changeset/facade-hardening-error-facade.md | 22 - .changeset/fair-baboons-marry.md | 5 - .changeset/fair-oranges-wave.md | 5 - .changeset/fair-tables-march.md | 5 - .changeset/famous-plums-watch.md | 5 - .changeset/fancy-ducks-run.md | 5 - .changeset/fast-loops-scream.md | 5 - .changeset/fiery-feet-sleep.md | 5 - .changeset/fiery-suits-kneel.md | 5 - .changeset/five-trams-repeat.md | 5 - .changeset/fix-class-type-export.md | 5 - .changeset/fix-cli-gist-cache-id.md | 5 - .changeset/fix-client-input-stream.md | 5 - .changeset/fix-contextmap-leak.md | 9 - .changeset/fix-cosmos-cluster-deferred.md | 5 - .changeset/fix-cosmos-cluster-machineid.md | 7 - .changeset/fix-cosmos-workflow-engine.md | 10 - .changeset/fix-is-generator-function.md | 6 - .changeset/fix-json-schema-annotations.md | 5 - .changeset/fix-jsonschema-postprocess.md | 5 - .changeset/fix-onedsl-r-inference.md | 5 - .changeset/fix-pascalcase-barrel.md | 5 - .../fix-path-recursive-index-signature.md | 9 - .../fix-project-encodekeys-selection.md | 5 - .changeset/fix-projection-union-adapter.md | 5 - .changeset/fix-repo-transformed-id-union.md | 5 - .changeset/fix-repo-transformed-id.md | 5 - .changeset/fix-resolver-cache-precheck.md | 5 - .changeset/fix-schema-interface-widening.md | 11 - .../fix-seed-marker-and-circular-dep.md | 5 - .changeset/fix-sql-array-relation-queries.md | 5 - .changeset/fix-sql-in-null-handling.md | 5 - .changeset/fix-sql-includes-serialize.md | 5 - .changeset/fix-sql-json-from-string-codec.md | 5 - .changeset/fix-sql-namespace-params.md | 5 - .../fix-sql-pg-seed-migrations-table.md | 5 - .changeset/fix-sql-select-etag-column.md | 5 - .../fix-sql-select-types-and-defaults.md | 5 - .changeset/fix-sql-whereevery-flip.md | 5 - ...fix-sqlite-per-ns-seed-migrations-table.md | 5 - .changeset/fix-transformed-struct-defaults.md | 5 - .../fix-vue-form-numeric-type-detection.md | 5 - .changeset/fix-vue-interrupt-tests.md | 5 - .changeset/fix-vue-lint-typescript-version.md | 5 - .changeset/flat-turkeys-invent.md | 5 - .changeset/flatten-nested-anyof.md | 5 - .changeset/forty-bottles-tease.md | 6 - .changeset/frank-ends-switch.md | 5 - .changeset/frank-memes-sin.md | 5 - .changeset/frank-papayas-design.md | 5 - .changeset/fresh-buckets-pump.md | 5 - .changeset/fresh-candles-shake.md | 11 - .changeset/fresh-indexed-fields.md | 5 - .changeset/fresh-mails-visit.md | 6 - .changeset/fresh-paths-say.md | 6 - .changeset/fresh-pianos-argue.md | 5 - .changeset/friendly-points-drum.md | 5 - .changeset/fruity-meteors-fix.md | 11 - .changeset/full-oranges-heal.md | 6 - .changeset/full-pugs-fall.md | 5 - .changeset/funky-guests-switch.md | 5 - .changeset/funny-webs-clap.md | 5 - .changeset/fuzzy-eels-decide.md | 5 - .changeset/fuzzy-eggs-jump.md | 5 - .changeset/gentle-bats-leave.md | 5 - .changeset/gentle-donkeys-tease.md | 5 - .changeset/gold-ghosts-laugh.md | 5 - .changeset/gold-wolves-shake.md | 8 - .changeset/green-coins-talk.md | 5 - .changeset/green-frogs-check.md | 5 - .changeset/green-snakes-poke.md | 5 - .changeset/green-taxis-project-hash.md | 5 - .changeset/green-taxis-rule.md | 5 - .../handle-mutate-request-always-functions.md | 5 - .changeset/handler-input-make-aligned.md | 6 - .changeset/heavy-bears-appear.md | 5 - .changeset/heavy-ducks-show.md | 12 - .changeset/honest-planets-fry.md | 5 - .changeset/http-span-name.md | 5 - .changeset/huge-carrots-deny.md | 8 - .changeset/humble-walls-fail.md | 5 - .changeset/icy-paws-return.md | 5 - .changeset/indefinite-waiting-toast.md | 5 - .changeset/infra-prefer-fn-untraced.md | 5 - .changeset/infra-sentry-node-dep.md | 5 - ...invalidation-set-add-shortcut-and-batch.md | 13 - .changeset/itchy-mangos-find.md | 5 - .changeset/khaki-frogs-wave.md | 5 - .changeset/kind-lizards-bathe.md | 9 - .changeset/large-pugs-strive.md | 5 - .changeset/late-forks-obey.md | 6 - .changeset/lazy-boats-lay.md | 5 - .changeset/lazy-model-facades.md | 6 - .changeset/legal-weeks-raise.md | 7 - .changeset/lemon-emus-behave.md | 6 - .changeset/little-berries-sip.md | 9 - .changeset/little-planets-bake.md | 5 - .changeset/live-query-dependencies.md | 5 - .changeset/long-regions-change.md | 5 - .changeset/loud-planets-cheer.md | 5 - .changeset/lucky-papayas-fetch.md | 9 - .changeset/lucky-streets-add.md | 9 - .changeset/lucky-zebras-invent.md | 5 - .changeset/major-drinks-stop.md | 5 - .changeset/major-planets-lie.md | 5 - .changeset/many-ideas-report.md | 5 - .changeset/meta-codegen-no-export.md | 5 - .changeset/meta-module-name-override.md | 6 - .changeset/metal-mammals-smell.md | 6 - .../middleware-error-from-dynamic-rcm.md | 12 - .changeset/middleware-errors-via-rpc-tag.md | 29 - .changeset/mighty-hoops-help.md | 6 - .changeset/migrate-tsgolint.md | 10 - .changeset/modern-humans-chew.md | 5 - .changeset/moody-peas-smoke.md | 6 - .changeset/mutate-invalidation-shorthands.md | 30 - .changeset/mutate-wrap-stream-no-args.md | 5 - .changeset/namespaced-change-feed.md | 5 - .changeset/native-encoded-query-json.md | 9 - .changeset/neat-brooms-wave.md | 5 - .changeset/neat-dingos-tease.md | 5 - .changeset/neat-pumpkins-juggle.md | 5 - .changeset/new-badgers-wait.md | 9 - .changeset/new-berries-march.md | 7 - .changeset/nice-jars-grow.md | 5 - .changeset/nice-needles-film.md | 5 - .changeset/nice-shrimps-fold.md | 6 - .changeset/ninety-stamps-end.md | 11 - .changeset/no-await-effect.md | 5 - .changeset/number-input-dual-separator.md | 5 - .changeset/odd-deers-work.md | 7 - .changeset/odd-tigers-scope.md | 5 - .changeset/old-snakes-film.md | 5 - .changeset/old-suns-kneel.md | 5 - .changeset/olive-onions-lose.md | 9 - .changeset/omega-native-input-types.md | 5 - .changeset/omega-nullable-nested-struct.md | 5 - .changeset/omegaform-between-localization.md | 5 - .../omegaform-decodeto-meta-from-encoded.md | 5 - .changeset/omegaform-enter-submit-repro.md | 5 - .changeset/omegaform-input-registry.md | 5 - .changeset/omegaform-module-split.md | 9 - .changeset/omegaform-typecheck-stories.md | 5 - .changeset/omegaform-vnumber-input.md | 5 - .changeset/optimize-codegen-barrel-model.md | 15 - .changeset/otel-semconv-spans.md | 50 - .changeset/payload-summary-recurse.md | 17 - .changeset/per-namespace-seeding.md | 5 - .changeset/petite-tables-cover.md | 5 - .changeset/polite-chefs-drum.md | 6 - .changeset/pre.json | 481 +- .../pre/add-adaptive-rate-limiter-store.md | 0 .../pre/add-atom-equality.md | 0 .../pre/add-bigdecimal-sumall-multiplyall.md | 0 .../pre/add-chunk-schema.md | 0 .../pre/add-command-hidden.md | 0 .../pre/add-config-nested.md | 0 .../pre/add-deno-file-system.md | 0 .../pre/add-deno-http-client.md | 0 .../pre/add-deno-multipart.md | 0 .../pre/add-deno-socket-server.md | 0 .../pre/add-deno-socket.md | 0 .../pre/add-flag-hidden.md | 0 .../pre/add-from-string-schemas.md | 0 .../pre/add-headers-remove-many.md | 0 .../add-http-client-request-update-headers.md | 0 .../add-http-client-tracer-header-filter.md | 0 .../pre/add-httpapi-with-headers.md | 0 .../pre/add-indexeddb-kvs-layer.md | 0 .../pre/add-json-schema-draft-04.md | 0 .../pre/add-make-msgpack.md | 0 .../pre/add-make-option.md | 0 .../pre/add-mcp-2025-11-25-protocol.md | 0 .../pre/add-mcp-icons.md | 0 .../pre/add-missing-tx-modules.md | 0 .../pre/add-newtype-module.md | 0 .../pre/add-otlp-manual-flush.md | 0 .../pre/add-platform-deno.md | 0 .../pre/add-scalar-show-operation-id.md | 0 .../pre/add-schedule-tap.md | 0 .../pre/add-schema-annotate-encoded.md | 0 .../pre/add-schema-array-ensure.md | 0 .../pre/add-schema-bigdecimal.md | 0 .../pre/add-schema-datetime.md | 0 .../pre/add-schema-error-module.md | 0 .../add-schema-option-from-optional-nullor.md | 0 ...dd-schema-option-from-undefined-nullish.md | 0 .../pre/add-schema-string-encoding.md | 0 .../add-schema-tagged-union-discriminants.md | 0 .../pre/add-semaphore-take-if-available.md | 0 .../pre/add-sql-pglite.md | 0 .../pre/add-standard-jsdoc-rule.md | 0 .../pre/add-stream-broadcastn.md | 0 .../pre/add-tool-set-needs-approval.md | 0 .../pre/add-unstable-encoding-export.md | 0 .../pre/add-update-service-scoped.md | 0 .../pre/add-values-unprepared.md | 0 .../pre/afraid-cobras-like.md | 0 .../pre/ai-approved-tool-results.md | 0 .../pre/ai-openai-config-field-leak.md | 0 .../pre/ai-openai-file-nullable-fields.md | 0 .../pre/align-type-id-paths.md | 0 .../pre/all-union-record-channels.md | 0 .../pre/anthropic-4-6-structured-output.md | 0 .../pre/anthropic-claude-5-capabilities.md | 0 .../pre/anthropic-image-strings.md | 0 .../pre/anthropic-open-model-enum.md | 0 .../pre/anthropic-stale-max-output-tokens.md | 0 .../pre/anthropic-strict-json-schema.md | 0 .../anthropic-structured-output-fallback.md | 0 ...apply-httpapi-endpoint-client-transform.md | 0 .../pre/arbitrary-index-constraints.md | 0 .../pre/array-ensure-array-elements.md | 0 .../pre/asyncresult-exhaustive.md | 0 .../pre/atom-rpc-query-requires.md | 0 .../pre/atom-solid-idle-ttl.md | 0 .../pre/atom-stream-error-type.md | 0 .../pre/atomic-optional-rc-map.md | 0 .../pre/authentication-error-description.md | 0 .../pre/autocomplete-jk-filter.md | 0 .../batch-persistence-expiration-cleanup.md | 0 .../pre/beige-goats-sin.md | 0 .../pre/beige-paths-sort.md | 0 .../pre/better-apples-nail.md | 0 .../pre/better-rocks-arrive.md | 0 .../pre/better-shrimps-follow.md | 0 .../pre/big-masks-care.md | 0 .../pre/big-pans-look.md | 0 .../pre/blue-dingos-greet.md | 0 .../pre/blue-ligers-cheat.md | 0 .../pre/blue-onions-smile.md | 0 .../pre/blue-pigs-push.md | 0 .../pre/blue-ravens-type.md | 0 .../pre/blue-trams-kiss.md | 0 .../pre/bold-chairs-yawn.md | 0 .../pre/bold-planets-shout.md | 0 .../pre/brave-keys-commit.md | 0 .../pre/brave-rings-update.md | 0 .../pre/breezy-meals-see.md | 0 .../pre/bright-bugs-bow.md | 0 .../pre/bright-canyons-clean.md | 0 .../pre/bright-clocks-count.md | 0 .../pre/bright-docs-teach.md | 0 .../pre/bright-dogs-fail.md | 0 .../pre/bright-flags-stand.md | 0 .../pre/bright-graphs-calculate.md | 0 .../pre/bright-graphs-trace.md | 0 .../pre/bright-journals-commit.md | 0 .../pre/bright-laws-teach.md | 0 .../pre/bright-lemons-dance.md | 0 .../pre/bright-mimes-leave.md | 0 .../pre/bright-planes-smash.md | 0 .../pre/bright-rats-attend.md | 0 .../pre/bright-sockets-connect.md | 0 .../pre/bright-tags-recognize.md | 0 .../pre/bright-toes-rush.md | 0 .../pre/brown-glasses-thank.md | 0 .../pre/brown-peas-enter.md | 0 .../pre/browser-crypto-missing-subtle.md | 0 .../browser-indexeddb-binary-key-existence.md | 0 .../pre/browser-runtime-custom-teardown.md | 0 .../pre/bumpy-boxes-teach.md | 0 .../pre/bun-http-server-unix-address.md | 0 .../pre/bun-stream-preserve-failure.md | 0 .../pre/bun-websocket-outgoing-compression.md | 0 .../pre/busy-lions-sneeze.md | 0 .../pre/busy-maps-attend.md | 0 .../pre/cache-invalidate-when-replacement.md | 0 .../cache-refresh-cancellation-ownership.md | 0 .../pre/cache-refresh-capacity.md | 0 .../pre/cache-refresh-zero-ttl-ownership.md | 0 .../pre/cache-synchronous-interruption.md | 0 .../pre/cached-with-ttl-callback.md | 0 .../pre/calm-atoms-relax.md | 0 .../pre/calm-bash-completions.md | 0 .../pre/calm-buckets-own.md | 0 .../pre/calm-buses-smile.md | 0 .../pre/calm-carrots-march.md | 0 .../pre/calm-cars-rest.md | 0 .../pre/calm-coins-smile.md | 0 .../pre/calm-contexts-rest.md | 0 .../pre/calm-dates-view.md | 0 .../pre/calm-dragons-command.md | 0 .../pre/calm-ducks-fail.md | 0 .../pre/calm-graphs-span.md | 0 .../pre/calm-graphs-travel.md | 0 .../pre/calm-headers-hide.md | 0 .../pre/calm-heads-close.md | 0 .../pre/calm-hounds-smile.md | 0 .../pre/calm-keys-repeat.md | 0 .../pre/calm-masks-count.md | 0 .../pre/calm-pages-hide.md | 0 .../pre/calm-pandas-retry.md | 0 .../pre/calm-panthers-nail.md | 0 .../pre/calm-pears-smile.md | 0 .../pre/calm-queues-await.md | 0 .../pre/calm-ravens-reflect.md | 0 .../pre/calm-readers-transact.md | 0 .../pre/calm-redis-clear.md | 0 .../pre/calm-results-align.md | 0 .../pre/calm-schemas-encode.md | 0 .../pre/calm-seas-smile.md | 0 .../pre/calm-servers-share.md | 0 .../pre/calm-services-rest.md | 0 .../pre/calm-squids-hug.md | 0 .../pre/calm-tools-parse.md | 0 .../pre/calm-tools-remember.md | 0 .../pre/calm-tracers-sample.md | 0 .../pre/calm-trees-generate.md | 0 .../pre/calm-tuples-align.md | 0 .../pre/calm-tuples-pick.md | 0 .../pre/calm-wolves-reduce.md | 0 .../pre/cancel-tedious-requests.md | 0 .../pre/canonical-number-schemas.md | 0 .../pre/cap-rpc-streaming-buffers.md | 0 .../pre/catch-stream-channel-defects.md | 0 .../pre/channel-rundone-completion.md | 0 .../pre/chatty-poets-type.md | 0 .../child-process-astral-escape-arguments.md | 0 .../pre/childprocess-process-group-wait.md | 0 .../pre/chilled-mice-wash.md | 0 .../pre/chilly-pumas-rule.md | 0 .../pre/chubby-buckets-feel.md | 0 .../pre/chubby-parents-flow.md | 0 .../pre/chubby-planets-fall.md | 0 .../pre/chunk-slice-concatenation.md | 0 .../pre/clean-balloons-tan.md | 0 .../pre/clean-bulldogs-care.md | 0 .../pre/clean-cats-document.md | 0 .../pre/clean-config-names.md | 0 .../pre/clean-dryers-sneeze.md | 0 .../pre/clean-formatters-agree.md | 0 .../pre/clean-geese-work.md | 0 .../pre/clean-goats-wave.md | 0 .../pre/clean-lions-cancel.md | 0 .../pre/clean-needles-shake.md | 0 .../pre/clean-tires-guess.md | 0 .../pre/clean-yaks-parse.md | 0 .../pre/cleanup-before-use-callbacks.md | 0 .../pre/clear-graphs-reduce.md | 0 .../pre/clear-hairs-pump.md | 0 .../pre/clear-spies-boil.md | 0 .../pre/clear-wings-relax.md | 0 .../pre/clever-maps-care.md | 0 .../pre/cli-completion-command-aliases.md | 0 .../pre/cli-completion-shared-flags.md | 0 .../pre/cli-config-built-ins.md | 0 .../pre/cli-help-choices.md | 0 .../pre/cli-key-value-pair-first-separator.md | 0 .../pre/cli-no-color-values.md | 0 .../pre/cli-optional-alternative-flags.md | 0 .../pre/cli-scalar-constructor-names.md | 0 .../pre/cli-variadic-absence-defaults.md | 0 .../pre/cli-wizard-mode.md | 0 .../pre/cli-wizard-option-looking-values.md | 0 .../pre/close-failed-resource-map-scopes.md | 0 .../pre/cluster-active-teardowns.md | 0 .../pre/cluster-reply-codec-services.md | 0 .../pre/cold-knives-lie.md | 0 .../pre/cold-rooms-show.md | 0 .../pre/cold-shards-continue.md | 0 .../pre/cold-sloths-wave.md | 0 .../pre/common-mammals-tickle.md | 0 .../pre/compact-json-schema-checks.md | 0 .../pre/compact-json-schema-enum.md | 0 .../pre/compatible-dependency-refresh.md | 0 .../pre/config-provider-option-lookup.md | 0 .../pre/config-withdefault-eager.md | 0 .../configurable-schema-reference-policy.md | 0 .../configure-cluster-rpc-buffer-limits.md | 0 .../pre/consolidate-encoding.md | 0 .../pre/consolidate-sql-error.md | 0 .../pre/context-saved-getter-inference.md | 0 .../pre/cookies-error-tag.md | 0 .../pre/cozy-geese-remain.md | 0 .../pre/crisp-seas-warn.md | 0 .../pre/cron-locale-independent-aliases.md | 0 .../pre/cron-single-value-step.md | 0 .../pre/cron-testclock-infinity.md | 0 .../pre/cuddly-rooms-bet.md | 0 .../pre/curly-files-range.md | 0 .../pre/curly-graphs-connect.md | 0 .../pre/curly-graphs-snapshot.md | 0 .../pre/curly-poems-talk.md | 0 .../pre/curly-ravens-decode.md | 0 .../pre/curly-spies-relax.md | 0 .../pre/curly-streams-stop.md | 0 .../pre/curvy-apples-float.md | 0 .../pre/curvy-birds-float.md | 0 .../pre/curvy-graphs-code.md | 0 .../pre/curvy-melons-stare.md | 0 .../pre/curvy-otters-sync.md | 0 .../pre/custom-cli-prompt-prefix.md | 0 .../custom-http-security-openapi-generator.md | 0 .../pre/cute-heads-thank.md | 0 .../pre/cyan-loops-grow.md | 0 .../pre/cyan-radios-switch.md | 0 .../pre/cyan-shirts-grin.md | 0 .../pre/d1-batch-statements.md | 0 .../pre/d1-raw-native-results.md | 0 .../pre/dark-dancers-rule.md | 0 .../pre/datetime-calendar-parts.md | 0 .../pre/deduplicate-json-schema-fallbacks.md | 0 .../pre/deep-rivers-spend.md | 0 .../pre/deferred-cleanup-after-completion.md | 0 .../pre/deferred-resume-starvation.md | 0 .../pre/deno-redis-url-credentials.md | 0 .../pre/deno-write-copy-errors.md | 0 .../pre/deno-writefile-existing-mode.md | 0 .../pre/dirty-lamps-trade.md | 0 .../pre/dirty-laws-wear.md | 0 .../pre/docgen-alias-signature.md | 0 .../pre/docgen-class-property-examples.md | 0 .../docgen-source-relative-module-pages.md | 0 .../pre/docgen-unique-example-files.md | 0 .../pre/doctest-console-output.md | 0 .../pre/doctest-markdown-typescript.md | 0 .../pre/doctest-statement-boundary.md | 0 .../pre/document-child-process-env.md | 0 .../pre/dotenv-literal-substitution.md | 0 .../pre/dry-bugs-hug.md | 0 .../pre/durable-clock-zero-threshold.md | 0 ...durable-deferred-into-encoding-services.md | 0 .../pre/duration-temporal-object-input.md | 0 .../pre/dynamic-tool-parameter-schema.md | 0 .../pre/eager-coats-cheat.md | 0 .../pre/early-birds-dream.md | 0 .../pre/early-donuts-argue.md | 0 .../pre/early-jobs-bow.md | 0 .../pre/early-peaches-check.md | 0 .../pre/eff-1004-cli-display-width.md | 0 .../pre/eff-1008-tool-param-failure-mode.md | 0 .../pre/eff-1036-fiber-allocations.md | 0 .../pre/eff-1038-http-server-allocations.md | 0 .../pre/eff-1039-rpc-server-allocations.md | 0 .../pre/eff-1042-http-server-performance.md | 0 .../pre/eff-115-sync-scheduler-microtask.md | 0 .../pre/eff-117-hydration-reactivity.md | 0 .../pre/eff-1201-http-overhead.md | 0 .../pre/eff-121-http-router-web-handler.md | 0 .../eff-123-openai-compat-unknown-events.md | 0 .../pre/eff-137-web-stream-interop.md | 0 .../pre/eff-140-deno-crypto.md | 0 .../pre/eff-141-deno-child-process.md | 0 .../pre/eff-142-deno-terminal.md | 0 .../pre/eff-143-deno-stdio.md | 0 .../pre/eff-145-deno-services.md | 0 .../pre/eff-148-deno-http-platform.md | 0 .../pre/eff-151-deno-redis.md | 0 .../pre/eff-153-deno-http-server.md | 0 .../pre/eff-153-websocket-initial-frames.md | 0 .../pre/eff-154-deno-cluster-http.md | 0 .../pre/eff-155-deno-cluster-socket.md | 0 .../pre/eff-162-browser-crypto-chunks.md | 0 .../pre/eff-170-bun-multipart-stream.md | 0 .../pre/eff-210-cookie-validation.md | 0 .../pre/eff-212-secure-mssql-transport.md | 0 .../pre/eff-216-secure-http-redirects.md | 0 .../pre/eff-218-bound-sse-pending-state.md | 0 .../pre/eff-219-key-value-store-file-keys.md | 0 .../pre/eff-220-cli-control-characters.md | 0 .../pre/eff-332-http-response-compression.md | 0 .../pre/eff-337-preserve-mssql-parameters.md | 0 .../pre/eff-342-clickhouse-number-binding.md | 0 .../pre/eff-389-execution-plan-attempts.md | 0 .../pre/eff-428-pg-transaction-permit.md | 0 .../pre/eff-467-execution-plan-events.md | 0 .../pre/eff-477-schedule-concat.md | 0 .../pre/eff-487-web-tracer-shutdown.md | 0 ...f-51-partitioned-semaphore-interruption.md | 0 .../eff-523-registry-scoped-atom-runtime.md | 0 .../pre/eff-532-stdio-terminal.md | 0 .../pre/eff-537-preserve-response-metadata.md | 0 .../pre/eff-542-rc-ref-generation.md | 0 .../pre/eff-547-node-tracer-timeout.md | 0 .../pre/eff-548-bun-serve-scope.md | 0 .../pre/eff-549-worker-send-error.md | 0 .../pre/eff-552-txqueue-shutdown.md | 0 .../pre/eff-554-sql-resolver.md | 0 .../pre/eff-558-deno-file-web-range.md | 0 .../pre/eff-691-default-logger-ordering.md | 0 .../pre/eff-693-rpcgroup-handler-deps.md | 0 .../pre/eff-694-cli-completions-module.md | 0 .../pre/eff-695-layer-mock-dual-api.md | 0 ...-697-rpcserialization-json-array-decode.md | 0 ...698-rpcserialization-unreachable-branch.md | 0 .../pre/eff-700-httpapi-middleware-errors.md | 0 .../pre/eff-701-httpapierror-respondable.md | 0 .../pre/eff-704-stream-merge-predicate.md | 0 .../pre/eff-705-layer-tap-apis.md | 0 .../pre/eff-706-servicemap-mutate.md | 0 .../pre/eff-716-response-id-tracker-map.md | 0 .../pre/eff-717-openai-socket-cancel.md | 0 .../pre/eff-718-embedding-model-surface.md | 0 .../pre/eff-725-fix-catch-jsdoc.md | 0 .../pre/eff-726-model-dimensions.md | 0 .../pre/eff-727-cli-help-alignment.md | 0 ...730-language-model-incremental-fallback.md | 0 .../pre/eff-736-cached-with-ttl.md | 0 .../pre/eff-738-cron-prev.md | 0 .../pre/eff-739-openai-function-call-done.md | 0 .../pre/eff-740-missing-summary-parts.md | 0 .../pre/eff-742-http-client-request-web.md | 0 .../pre/eff-744-sqlite-migrator-lock.md | 0 .../pre/eff-746-fixed-iteration-catchup.md | 0 .../pre/eff-747-unify-effect.md | 0 .../pre/eff-754-url-builder-any.md | 0 .../pre/eff-755-references-core.md | 0 .../pre/eff-769-select-text-highlight.md | 0 ...774-mutable-list-append-all-empty-array.md | 0 .../pre/eff-777-schema-make-effect.md | 0 .../eff-778-http-middleware-path-logger.md | 0 .../pre/eff-779-keyvaluestore-layer-sql.md | 0 .../pre/eff-780-layer-unify.md | 0 .../pre/eff-781-fix-stream-toqueue-types.md | 0 .../pre/eff-782-httpapi-status-literals.md | 0 .../pre/eff-783-atom-http-api-errors.md | 0 .../pre/eff-798-schema-parser.md | 0 .../pre/eff-802-tagged-union-match-or-else.md | 0 .../pre/eff-806-schema-error-stack.md | 0 .../eff-819-cluster-workflow-shard-groups.md | 0 .../pre/eff-825-pool-performance.md | 0 .../pre/eff-825-pool-use.md | 0 .../pre/eff-825-scope-single-finalizer.md | 0 .../pre/eff-837-dependency-updates.md | 0 .../pre/eff-849-transpose-option.md | 0 .../pre/eff-851-skip-empty-remote-write.md | 0 .../pre/eff-854-pg-connection-startup.md | 0 .../pre/eff-861-indexeddb-equals.md | 0 .../eff-946-concurrent-traversal-cleanup.md | 0 .../pre/eff-952-terminal-failure-stack.md | 0 .../pre/eff-953-interruptor-stack-trace.md | 0 .../pre/eff-955-run-sync-dispatcher.md | 0 .../pre/eff-956-await-all-children.md | 0 .../pre/eff-961-node-socket-tls.md | 0 .../pre/eff-963-node-socket-server-tls.md | 0 .../pre/eff-965-socket-upgrade.md | 0 .../pre/eff-969-dependency-updates.md | 0 .../pre/eff-972-deno-socket-server.md | 0 .../pre/eff-997-service-keys.md | 0 .../pre/effect-eager-transform-arguments.md | 0 .../pre/effect-scoped-service-restoration.md | 0 .../effect-unmatched-reason-preservation.md | 0 .../effectable-class-override-delegation.md | 0 .../pre/effectable-mixin.md | 0 .../pre/effectify-mapper-input-tuples.md | 0 .../pre/eight-turkeys-own.md | 0 .../pre/eighty-lies-deny.md | 0 .../pre/eighty-poets-draw.md | 0 .../pre/eighty-swans-scream.md | 0 .../pre/eighty-teeth-sniff.md | 0 .../pre/eleven-apes-share.md | 0 .../pre/eleven-numbers-bake.md | 0 .../pre/empty-env-values-missing.md | 0 .../pre/empty-geckos-dispatch.md | 0 .../pre/empty-gifts-beg.md | 0 .../pre/empty-http-rpc-client.md | 0 .../pre/empty-snakes-return.md | 0 .../pre/entity-proxy-client-codec-services.md | 0 .../entity-test-client-fatal-defect-option.md | 0 .../pre/escape-completion-choice-values.md | 0 ...eventlog-authentication-forbidden-retry.md | 0 .../pre/eventlog-empty-chunk-framing.md | 0 .../pre/eventlog-unencrypted.md | 0 .../pre/every-olives-burn.md | 0 .../pre/exact-byte-size.md | 0 .../pre/exact-http-file-body-length.md | 0 .../pre/execution-plan-captured-predicate.md | 0 .../pre/expand-schema-filter-output.md | 0 .../pre/explicit-env-record.md | 0 .../pre/explicit-otel-service-identity.md | 0 .../export-schema-encode-keys-interface.md | 0 .../pre/expose-ai-prompt-part-schemas.md | 0 .../pre/extract-semaphore-latch.md | 0 .../pre/failed-otlp-checkpoints.md | 0 .../pre/fair-bees-relax.md | 0 .../pre/fair-birds-limit.md | 0 .../pre/fair-buttons-share.md | 0 .../pre/fair-citations-stream.md | 0 .../pre/fair-cooks-stop.md | 0 .../pre/fair-cups-train.md | 0 .../pre/fair-dryers-speak.md | 0 .../pre/fair-forks-shake.md | 0 .../pre/fair-jobs-like.md | 0 .../pre/fair-logs-correlate.md | 0 .../pre/fair-logs-listen.md | 0 .../pre/fair-matches-infer.md | 0 .../pre/fair-pandas-prove.md | 0 .../pre/fair-pants-float.md | 0 .../pre/fair-poems-visit.md | 0 .../pre/fair-sampling-content.md | 0 .../pre/fair-sinks-catch.md | 0 .../pre/fair-workflows-suspend.md | 0 .../pre/famous-loops-flow.md | 0 .../pre/famous-wolves-lead.md | 0 .../pre/fancy-glasses-grow.md | 0 .../pre/fast-graph-path-queues.md | 0 .../pre/fast-times-camp.md | 0 .changeset/pre/faster-schema-construction.md | 5 + .../pre/fetch-raw-stream-duplex.md | 0 .../pre/few-birds-matter.md | 0 .../pre/few-cougars-dig.md | 0 .../pre/few-foxes-grin.md | 0 .../pre/few-mirrors-pull.md | 0 .../pre/few-socks-poke.md | 0 .../pre/fiber-join-all-errors.md | 0 .../pre/fiber-map-reentrant-replacement.md | 0 .../pre/fiber-registration-same-fiber.md | 0 .../pre/fiber-runtime-start-metrics.md | 0 .../pre/fiery-jokes-care.md | 0 .../pre/fiery-mammals-call.md | 0 .../pre/fifty-carrots-punch.md | 0 .../pre/file-prompt-jk-filter.md | 0 .../pre/filesystem-sink-undefined-flag.md | 0 .../pre/filesystem-stat-optional-inode.md | 0 .../pre/fine-walls-decide.md | 0 .../pre/first-success-of.md | 0 .../pre/five-parents-relax.md | 0 .../pre/five-spoons-visit.md | 0 .../pre/five-worms-rhyme.md | 0 .../.changeset => .changeset}/pre/fix-1332.md | 0 .../.changeset => .changeset}/pre/fix-1917.md | 0 .../.changeset => .changeset}/pre/fix-1927.md | 0 .../.changeset => .changeset}/pre/fix-1940.md | 0 .../.changeset => .changeset}/pre/fix-1947.md | 0 .../.changeset => .changeset}/pre/fix-2002.md | 0 .../.changeset => .changeset}/pre/fix-2012.md | 0 .../.changeset => .changeset}/pre/fix-2015.md | 0 .../.changeset => .changeset}/pre/fix-2260.md | 0 .../.changeset => .changeset}/pre/fix-2268.md | 0 .../.changeset => .changeset}/pre/fix-2271.md | 0 .../.changeset => .changeset}/pre/fix-2384.md | 0 .../.changeset => .changeset}/pre/fix-2414.md | 0 .../.changeset => .changeset}/pre/fix-2419.md | 0 .../.changeset => .changeset}/pre/fix-2497.md | 0 .../.changeset => .changeset}/pre/fix-2499.md | 0 .../.changeset => .changeset}/pre/fix-6464.md | 0 .../.changeset => .changeset}/pre/fix-6491.md | 0 .../.changeset => .changeset}/pre/fix-6521.md | 0 .../fix-ai-empty-params-structured-output.md | 0 .../pre/fix-ai-text-toolkit-typing.md | 0 .../pre/fix-ai-tool-call-id.md | 0 .../pre/fix-ansi-cursor-to.md | 0 .../pre/fix-anthropic-caller-toolid.md | 0 .../fix-anthropic-code-execution-deltas.md | 0 .../pre/fix-anthropic-header-redaction.md | 0 ...-anthropic-memory-tool-requires-handler.md | 0 .../pre/fix-anthropic-memory-tool.md | 0 .../pre/fix-anthropic-plaintext-bytes.md | 0 .../pre/fix-array-non-finite-indexes.md | 0 .../pre/fix-atom-batch-dependencies.md | 0 .../pre/fix-atom-http-stream-success-types.md | 0 .../pre/fix-atom-http-top-level-dispatch.md | 0 .../pre/fix-atom-kvs-async-write.md | 0 .../pre/fix-atom-query-zero-ttl.md | 0 .../fix-atom-rpc-client-middleware-errors.md | 0 .../pre/fix-atom-suspense-registry-cache.md | 0 .../pre/fix-atom-writable-fallback.md | 0 .../pre/fix-bash-subcommand-dispatch.md | 0 .../pre/fix-bigint-gcd-lcm.md | 0 .../pre/fix-bun-http-default-hostname.md | 0 .../pre/fix-cache-set-race.md | 0 .../pre/fix-catch-orelse-error-erasure.md | 0 .../pre/fix-cause-map-annotations.md | 0 .../pre/fix-channel-effects-finalizer.md | 0 .../pre/fix-channel-schema-decode-unknown.md | 0 .../pre/fix-chunk-fractional-counts.md | 0 .../pre/fix-class-constructor-defaults.md | 0 .../pre/fix-cli-help-table-spacing.md | 0 .../pre/fix-cli-missing-flag-values.md | 0 .../pre/fix-cli-mixed-global-flag-context.md | 0 .../pre/fix-cli-subcommands-requirements.md | 0 .../pre/fix-cli-unexpected-arguments.md | 0 .../pre/fix-clickhouse-connect-timeout.md | 0 .../pre/fix-cluster-entity-context-bleed.md | 0 .../pre/fix-cluster-reply-defect-isolation.md | 0 .../pre/fix-cluster-shutdown-deadlock.md | 0 .../fix-cluster-strand-request-shutdown.md | 0 .../pre/fix-cluster-stream-recovery.md | 0 .../pre/fix-config-array-default.md | 0 .../pre/fix-config-or-else-evidence.md | 0 .../pre/fix-config-withDefault.md | 0 .../pre/fix-config-withdefault-filter.md | 0 .../pre/fix-context-add-or-omit-types.md | 0 .../pre/fix-cors-vary.md | 0 .../pre/fix-cron-and-representations.md | 0 .../pre/fix-cron-make-validation.md | 0 .../pre/fix-cron-next-missing-day-overflow.md | 0 .../pre/fix-cron-parser-semantics.md | 0 .../pre/fix-cron-prev-month-rollover.md | 0 .../pre/fix-cron-prev-weekday-wrap.md | 0 .../pre/fix-cron-timezone-hash.md | 0 .../pre/fix-dangling-internal-declarations.md | 0 .../pre/fix-datetime-gmt.md | 0 .../pre/fix-deep-mutable-opaque-types.md | 0 .../pre/fix-devtools-flush-on-teardown.md | 0 .../pre/fix-devtools-span-snapshot.md | 0 .../fix-durable-clock-fractional-wakeup.md | 0 .../pre/fix-durable-deferred-race.md | 0 .../pre/fix-durable-race-replay.md | 0 .../pre/fix-duration-decimal-precision.md | 0 .../pre/fix-duration-symmetric-rounding.md | 0 .../pre/fix-effect-fn-self.md | 0 .../pre/fix-effect-schedule-errors.md | 0 .../pre/fix-encoded-header-metadata.md | 0 .../pre/fix-entity-manager-defect-replay.md | 0 .../fix-entity-proxy-rpc-handler-context.md | 0 .../fix-entity-proxy-server-path-params.md | 0 .../pre/fix-eventlog-duplicate-chunks.md | 0 .../pre/fix-fiber-exit-observers.md | 0 .../pre/fix-fiberhandle-clear-race.md | 0 .../pre/fix-fiberset-json-id.md | 0 .../pre/fix-fiberset-runtime-interruption.md | 0 .../pre/fix-filesystem-integer-precision.md | 0 .../pre/fix-fish-command-path.md | 0 .../pre/fix-formatter-output-contracts.md | 0 .../pre/fix-from-json-string-identifier.md | 0 .../pre/fix-from-option-inline-inference.md | 0 .../fix-from-readable-stream-cancel-defect.md | 0 .../pre/fix-graph-allocator-equality.md | 0 .../pre/fix-graph-bellman-ford-self-cycle.md | 0 .../pre/fix-graph-curried-getters.md | 0 .../pre/fix-graph-dfs-astar-edge-cases.md | 0 .../pre/fix-graph-edge-transforms.md | 0 .../pre/fix-graph-finite-edge-weights.md | 0 .../pre/fix-graph-mutable-hash.md | 0 .../pre/fix-graph-mutable-topo.md | 0 .../pre/fix-graph-mutation-errors.md | 0 .../pre/fix-graph-topo-types.md | 0 .../pre/fix-graph-undirected-traversal.md | 0 .../pre/fix-graph-walker-repeatability.md | 0 .../pre/fix-graphviz-dot-escaping.md | 0 .../pre/fix-group-by-key-types.md | 0 .../pre/fix-has-interrupts-only-empty.md | 0 .../pre/fix-hashmap-bit31-ordering.md | 0 .../pre/fix-hashmap-modify-hash.md | 0 .../pre/fix-headers-proto-enumerability.md | 0 .../fix-http-client-request-content-length.md | 0 ...fix-http-incoming-message-parse-options.md | 0 .../pre/fix-http-platform-file-ranges.md | 0 .../fix-http-pre-response-handler-types.md | 0 .../pre/fix-http-server-request-raw-body.md | 0 .../fix-http-server-response-body-headers.md | 0 .../pre/fix-http-toweb-null-body-status.md | 7 + .../pre/fix-http-tracer-response-cause.md | 0 .../pre/fix-httpapi-authorization-decoding.md | 0 .../fix-httpapi-client-error-content-type.md | 0 .../fix-httpapi-endpoint-error-inference.md | 0 .../pre/fix-httpapi-form-responses.md | 0 .../pre/fix-httpapi-malformed-json-400.md | 0 .../pre/fix-httpapi-runtime-shape.md | 0 .../pre/fix-httpapi-schema-types.md | 0 .../fix-httpapi-security-middleware-cache.md | 0 .../pre/fix-httpapi-single-array-query.md | 0 .../fix-httpapi-test-pre-response-handlers.md | 0 .../pre/fix-httpapi-url-builder-base-path.md | 0 .../pre/fix-invalid-openapi-examples.md | 0 .../pre/fix-invalid-value-doubled-expected.md | 0 .../pre/fix-is-json-dag.md | 0 .../pre/fix-iterable-flatten-stack-safety.md | 0 .../fix-json-schema-anyof-oneof-siblings.md | 0 .../pre/fix-json-schema-import-json.md | 0 .../pre/fix-json-schema-percent-references.md | 0 .../fix-json-schema-reference-resolution.md | 0 .../pre/fix-json-schema-unique-items-false.md | 0 .../pre/fix-keepalive-blocked-timers.md | 0 .../fix-language-model-stream-concurrency.md | 0 .../pre/fix-latch-stale-flush.md | 0 .../pre/fix-layermap-preload.md | 0 .../pre/fix-mcp-call-tool-arguments.md | 0 .../pre/fix-mcp-completion-context.md | 0 .../pre/fix-mcp-param-name-resolution.md | 0 .../pre/fix-mcp-request-errors.md | 0 .../pre/fix-memory-journal-conflicts.md | 0 .../pre/fix-memory-journal-next-sequence.md | 0 .../pre/fix-memory-journal-relay.md | 0 .../pre/fix-memory-runner-health.md | 0 .../pre/fix-memory-workflow-interrupt.md | 0 .../pre/fix-mermaid-escape-special-chars.md | 0 ...fix-message-storage-clear-address-dedup.md | 0 .../fix-metric-attribute-key-collisions.md | 0 .../pre/fix-metric-is-metric.md | 0 .../pre/fix-metric-linear-boundaries.md | 0 .../pre/fix-metric-negative-max.md | 0 .../pre/fix-mime-parameter-normalization.md | 0 ...fix-mssql-multitable-persistence-upsert.md | 0 .../pre/fix-multipart-file-stream-limits.md | 0 .../pre/fix-mutable-list-bounds.md | 0 .../pre/fix-mutable-list-empty-filter.md | 0 .../pre/fix-mutable-list-filter-length.md | 0 .../pre/fix-ndjson-split-utf8.md | 0 .../pre/fix-negative-file-seek.md | 0 .../pre/fix-node-compression-content-type.md | 0 .../pre/fix-node-http-stream-failure.md | 0 .../pre/fix-node-path-file-url-flavor.md | 0 .../pre/fix-node-pipeline-kill.md | 0 ...ix-number-remainder-scientific-notation.md | 0 .../pre/fix-object-keyword-json-schema.md | 0 .../pre/fix-one-shot-iterables.md | 0 .../pre/fix-openai-header-redaction.md | 0 .../pre/fix-openai-mcp-tool-names.md | 0 .../pre/fix-openai-response-failure.md | 0 .../pre/fix-openai-specialized-tool-output.md | 0 .../pre/fix-openai-system-input-text.md | 0 ...fix-openai-telemetry-response-namespace.md | 0 .../pre/fix-openai-web-search-action.md | 0 .../fix-openapi-client-form-url-encoding.md | 0 .../fix-openapi-client-multipart-records.md | 0 .changeset/pre/fix-openapi-client-paths.md | 5 + .../fix-openapi-endpoint-transform-order.md | 0 .../pre/fix-openapi-from-api-cache-copy.md | 0 .../fix-openapi-generator-form-urlencoded.md | 0 .../fix-openapi-generator-swagger2openapi.md | 0 ...reserve-multiple-response-content-types.md | 0 .../fix-openapi-stream-transform-client.md | 0 .../pre/fix-openrouter-sparse-array.md | 0 .../pre/fix-otel-logger-clock-skew.md | 0 .../pre/fix-otel-logger-severity-number.md | 0 .../pre/fix-otel-logger-shutdown.md | 0 .../pre/fix-otlp-exporter-shutdown.md | 0 .../pre/fix-otlp-resource-attributes.md | 0 .../pre/fix-pending-interruptible-mask.md | 0 .../pre/fix-persisted-cluster-reply-hang.md | 0 .../fix-persisted-queue-attempt-accounting.md | 0 .../pre/fix-pg-tls-servername.md | 0 .../pre/fix-prompt-all-iterables.md | 0 .../pre/fix-prompt-date-tab-buffer.md | 0 .../pre/fix-proto-record-assignment.md | 0 .../pre/fix-pubsub-replay-retention.md | 0 .../pre/fix-queue-collect-duplication.md | 0 .../pre/fix-random-string-seeds.md | 0 .../pre/fix-rate-limiter-sleep.md | 0 .../fix-ratelimiter-tokenbucket-redis-ttl.md | 0 .../pre/fix-react-native-sqlite-values.md | 0 .../pre/fix-react-ref-switch.md | 0 .../pre/fix-reactive-query-metadata.md | 0 .../pre/fix-reactivity-duplicate-keys.md | 0 .../pre/fix-read-alloc-invalid-sizes.md | 0 .../pre/fix-redis-persisted-queue.md | 0 .../pre/fix-remainder-scientific-notation.md | 0 ...x-request-resolver-pending-batches-leak.md | 0 .../pre/fix-retry-transient-autocomplete.md | 0 .../pre/fix-rpc-http-requestids-finalizer.md | 0 .../pre/fix-rpc-json-id-edges.md | 0 .../pre/fix-rpc-unknown-tag-isolation.md | 0 .../pre/fix-runner-stream-completion.md | 0 .../pre/fix-schedule-during.md | 0 .../pre/fix-schedule-fixed-double-exec.md | 0 .../pre/fix-schedule-reduce-sync-state.md | 0 .../fix-schema-arbitrary-exclusive-bounds.md | 0 .../fix-schema-bracket-prototype-pollution.md | 0 .../pre/fix-schema-codegen-optional-tuples.md | 0 .../pre/fix-schema-codegen-proto.md | 0 .../pre/fix-schema-defect-message.md | 0 .../fix-schema-encode-keys-property-keys.md | 0 .../pre/fix-schema-encodekeys-class.md | 0 .../pre/fix-schema-encodekeys-struct.md | 0 .../pre/fix-schema-encoding-checks.md | 0 .../fix-schema-identifier-expected-message.md | 0 .../pre/fix-schema-is-json-records.md | 0 .../pre/fix-schema-is-uuid.md | 0 .../pre/fix-schema-json-tuple-allof.md | 0 .../pre/fix-schema-make-nested-class-union.md | 0 .../fix-schema-option-non-schema-failures.md | 0 .../pre/fix-schema-parser-checks.md | 0 .../pre/fix-schema-pattern-state.md | 0 .../fix-schema-representation-identifiers.md | 0 .../pre/fix-schema-sentinel-declaration.md | 0 .../fix-schema-tuple-post-rest-indexing.md | 0 .../pre/fix-schema-union-dispatch-order.md | 0 .../pre/fix-schema-union-pruning.md | 0 .../pre/fix-scoped-ref-failed-replacement.md | 0 .../pre/fix-searchparam-initial-decode.md | 0 ...x-semaphore-with-permits-interrupt-leak.md | 0 .../pre/fix-serializable-wire-transfer.md | 0 .../pre/fix-sink-flatmap-leftovers.md | 0 .../pre/fix-sliding-size-chunks.md | 0 .../fix-sql-persisted-queue-lock-refresh.md | 0 .../pre/fix-sqlite-persisted-queue.md | 0 .../pre/fix-sse-last-event-id.md | 0 .../pre/fix-sse-leading-bom.md | 0 .../pre/fix-sse-mixed-line-endings.md | 0 .../pre/fix-sse-retry-directives.md | 0 .../pre/fix-static-head-range.md | 0 .../pre/fix-static-oversized-ranges.md | 0 .../pre/fix-stream-aggregate-within-idle.md | 0 .../pre/fix-stream-execution-plan-retries.md | 0 .../pre/fix-stream-grouped-within-flush.md | 0 .../pre/fix-stream-haltwhen.md | 0 .../pre/fix-stream-map-accum-array-effect.md | 0 .../pre/fix-stream-range-zero-chunk.md | 0 .../pre/fix-stream-run-for-each-while.md | 0 .../pre/fix-stream-scan-effect.md | 0 .../pre/fix-stream-scoped-scope.md | 0 .../pre/fix-stream-wrapper-status.md | 0 .../pre/fix-string-case-digits.md | 0 ...ix-strip-approval-artifacts-multi-round.md | 0 .../pre/fix-struct-utility-types-simplify.md | 0 .../pre/fix-structural-proto-equality.md | 0 .../fix-structwithrest-index-signatures.md | 0 ...ix-subscription-ref-get-and-update-some.md | 0 .../fix-subscriptionref-getandupdateeffect.md | 0 .../pre/fix-tagged-union-class-sentinels.md | 0 .../pre/fix-tagged-union-match-unify.md | 0 ...fix-to-tagged-union-isanyof-custom-tags.md | 0 .../pre/fix-toml-array-subtables.md | 0 .../pre/fix-tool-provider-defined-clone.md | 0 .../pre/fix-tool-result-serialization.md | 0 .../pre/fix-trie-key-replacement.md | 0 .../pre/fix-trie-longest-prefix.md | 0 .../pre/fix-trie-undefined-values.md | 0 ...x-tuple-with-rest-post-rest-index-drift.md | 0 ...ix-tuple-with-rest-post-rest-validation.md | 0 .../pre/fix-txpubsub-publish-all-iterables.md | 0 .../pre/fix-txqueue-closing-drain.md | 0 .../pre/fix-txqueue-offer-all-iterables.md | 0 .../pre/fix-types-voidifempty.md | 0 .../pre/fix-variant-schema-default-cache.md | 0 .../pre/fix-vitest-proxy-chained-helpers.md | 0 .../pre/fix-vitest-record-schema-arbitrary.md | 0 .../pre/fix-vitest-runner-import.md | 0 .../pre/fix-vitest-throws-assertions.md | 0 .../pre/fix-void-mcp-tool-results.md | 0 .../pre/fix-void-response-encoding.md | 0 .../pre/fix-vue-ref-switch.md | 0 .../pre/fix-worker-runner-cleanup.md | 0 .../pre/fix-workflow-activity-interruption.md | 0 ...fix-workflow-defect-reply-serialization.md | 0 .../fix-workflow-entity-client-collision.md | 0 .../fix-workflow-proxy-rpc-handler-context.md | 0 .../pre/fix-workflow-trace-context.md | 0 .../pre/fix-xhr-form-data.md | 0 .../pre/fix-yaml-folded-scalars.md | 0 .../pre/fix-zero-max-bytes.md | 0 .../pre/fix-zsh-mixed-command-completions.md | 0 .../pre/flat-chicken-remain.md | 0 .../pre/flat-graphs-agree.md | 0 .../pre/flat-pipelines-share.md | 0 .../pre/floppy-cows-spend.md | 0 .../pre/floppy-frogs-juggle.md | 0 .../pre/floppy-items-admire.md | 0 .../pre/floppy-pigs-kiss.md | 0 .../pre/floppy-rats-leave.md | 0 .../pre/floyd-warshall-null-edge-data.md | 0 .../pre/fluffy-meals-matter.md | 0 .../pre/fluffy-pumas-push.md | 0 .../pre/forked-memo-maps.md | 0 .../pre/formatter-defined-error-causes.md | 0 .../pre/forty-hounds-cheer.md | 0 .../pre/forty-otters-cry.md | 0 .../pre/forty-rings-film.md | 0 .../pre/forty-signs-stay.md | 0 .../pre/forty-swans-divide.md | 0 .../pre/forty-trees-pay.md | 0 .../pre/four-papayas-bow.md | 0 .../pre/four-points-repeat.md | 0 .../pre/frank-apes-vanish.md | 0 .../pre/fresh-cats-smash.md | 0 .../pre/fresh-cycles-wait.md | 0 .../pre/fresh-deps-update.md | 0 .../pre/fresh-emus-cheat.md | 0 .../pre/fresh-files-seek.md | 0 .../pre/fresh-forms-travel.md | 0 .../pre/fresh-graphs-cycle.md | 0 .../pre/fresh-images-generate.md | 0 .../pre/fresh-lines-wait.md | 0 .../pre/fresh-monkeys-smoke.md | 0 .../pre/fresh-pools-rotate.md | 0 .../pre/fresh-rivers-report.md | 0 .../frozen-intrinsics-stack-trace-limit.md | 0 .../pre/fruity-houses-learn.md | 0 .../pre/fruity-sloths-walk.md | 0 .../pre/full-adults-double.md | 0 .../pre/funny-crabs-hang.md | 0 .../pre/funny-ears-beam.md | 0 .../pre/funny-forks-move.md | 0 .../pre/fuzzy-batches-stop.md | 0 .../pre/fuzzy-caches-expire.md | 0 .../pre/fuzzy-camels-hunt.md | 0 .../pre/fuzzy-cats-kill.md | 0 .../pre/fuzzy-cats-listen.md | 0 .../pre/fuzzy-classes-compare.md | 0 .../pre/fuzzy-crews-fold.md | 0 .../pre/fuzzy-databases-abort.md | 0 .../pre/fuzzy-dodos-help.md | 0 .../pre/fuzzy-files-slice.md | 0 .../pre/fuzzy-graphs-transform.md | 0 .../pre/fuzzy-hornets-wish.md | 0 .../pre/fuzzy-lions-perform.md | 0 .../pre/fuzzy-lions-study.md | 0 .../pre/fuzzy-pandas-smile.md | 0 .../pre/fuzzy-planets-sneeze.md | 0 .../pre/fuzzy-rabbits-cancel.md | 0 .../pre/fuzzy-ravens-reason.md | 0 .../pre/fuzzy-routers-smile.md | 0 .../pre/fuzzy-stamps-care.md | 0 .../pre/fuzzy-timers-smile.md | 0 .../pre/general-json-schema-converters.md | 0 .../pre/giant-jeans-float.md | 0 .../pre/gold-meteors-move.md | 0 .../pre/gold-readers-hug.md | 0 .../pre/gold-rings-start.md | 0 .../pre/good-cups-reply.md | 0 .../pre/good-tools-work.md | 0 .../pre/good-trees-pull.md | 0 ...graph-acyclic-parallel-undirected-edges.md | 0 .../pre/graph-algorithm-fixes.md | 0 ...ph-bellman-ford-infinite-cycle-barriers.md | 0 .../pre/graph-finalized-mutation-handle.md | 0 .../pre/graph-guard-predicates.md | 0 .../pre/graph-sync-mutation-callbacks.md | 0 .../pre/graph-undirected-edge-equality.md | 0 .../pre/graph-walker-iterator-receiver.md | 0 .../pre/great-trains-mate.md | 0 .../pre/great-trams-report.md | 0 .../pre/green-ads-camp.md | 0 .../pre/green-beds-unref.md | 0 .../pre/green-birds-close.md | 0 .../pre/green-chips-wash.md | 0 .../pre/green-moons-smile.md | 0 .../pre/green-pugs-play.md | 0 .../pre/green-rings-prove.md | 0 .../pre/happy-mirrors-dream.md | 0 .../pre/harden-httpapi-documentation-html.md | 0 .../pre/hash-sql-message-dedupe-keys.md | 0 .../pre/hashmap-collision-entries.md | 0 .../pre/hashring-exclusion-endpoint.md | 0 .../pre/headers-redacted-name-case.md | 0 .../pre/headers-stateful-patterns.md | 0 .../pre/heavy-loops-cut.md | 0 .../pre/heavy-trams-fix.md | 0 .../pre/hip-friends-kiss.md | 0 .../pre/hip-socks-travel.md | 0 .../pre/honest-pens-thank.md | 0 .../pre/honest-rivers-notice.md | 0 .../pre/hot-taxis-fry.md | 0 .../pre/hot-teeth-clean.md | 0 .../pre/http-client-catch-response-result.md | 0 ...-client-redirect-preprocessing-recovery.md | 0 ...ttp-client-response-schema-json-options.md | 0 .../pre/http-head-stream-scope.md | 0 .../pre/http-json-reviver.md | 0 .../pre/http-response-content-length.md | 0 .../pre/http-router-normalized-prefix.md | 0 .../pre/http-runner-path-boundary.md | 0 .../pre/http-server-websocket-options.md | 0 .../pre/http-status-from-literal.md | 0 .../pre/http-web-handler-cold-start.md | 0 .../pre/httpapi-endpoint-relax-constraints.md | 0 .../pre/httpapi-middleware-error-dedupe.md | 0 .../pre/httpapi-schema-service-types.md | 0 .../pre/httpapi-sse-decode-options.md | 0 .../pre/huge-moons-rhyme.md | 0 .../pre/humble-pigs-dig.md | 0 .../pre/hungry-kings-look.md | 0 .../pre/icy-flies-cross.md | 0 .../pre/improve-json-schema-import.md | 0 .../pre/indexeddb-out-of-line-primary-keys.md | 0 .../pre/indexeddb-stream-query-limits.md | 0 .../pre/internal-json-string-schema.md | 0 .../pre/isolate-sql-compiler-cache.md | 0 .../pre/isolate-unencodable-hydration.md | 0 .../pre/itchy-radios-poke.md | 0 .../pre/itchy-results-bet.md | 0 .../pre/itchy-shrimps-deny.md | 0 .../pre/itchy-toes-promise.md | 0 .../pre/k8s-last-transition-null.md | 0 .../pre/keep-httpapi-composition-immutable.md | 0 .../pre/khaki-cats-learn.md | 0 .../pre/khaki-melons-appear.md | 0 .../pre/kind-flags-help.md | 0 .../pre/kind-hounds-float.md | 0 .../pre/kind-windows-fall.md | 0 .../pre/large-postgres-messages.md | 0 .../pre/late-hotels-rule.md | 0 .../pre/late-lamps-care.md | 0 .../pre/late-rivers-applaud.md | 0 .../pre/late-sockets-rest.md | 0 .../pre/layer-error-observer-types.md | 0 .../pre/layer-map-dynamic-idle-ttl.md | 0 .../pre/layer-span-trace-options.md | 0 .../pre/layered-context-storage.md | 0 .../layermap-preloaded-acquisition-errors.md | 0 .../pre/lazy-bun-redis-import.md | 0 .../pre/lazy-openapi-initialization.md | 0 .../pre/lazy-queens-rush.md | 0 .../pre/lazy-recursive-forward-refs.md | 0 .../pre/lazy-timers-exist.md | 0 .../pre/lazy-undici-loading.md | 0 .../pre/legal-pants-drop.md | 0 .../pre/lemon-taxis-sin.md | 0 .../libsql-transaction-client-isolation.md | 0 .../pre/light-kids-sneeze.md | 0 .../pre/little-dryers-allow.md | 0 .../pre/logger-complete-file-writes.md | 0 .../pre/long-cameras-think.md | 0 .../pre/loose-wings-lie.md | 0 .../pre/lovely-cobras-change.md | 0 .../pre/lovely-frogs-rescue.md | 0 .../pre/lucky-buttons-jump.md | 0 .../pre/lucky-dingos-smile.md | 0 .../pre/lucky-phones-listen.md | 0 .../pre/lucky-worms-type.md | 0 .../pre/major-chairs-design.md | 0 .../pre/managed-runtime-async-dispose.md | 0 .../pre/many-badgers-obey.md | 0 .../pre/match-generic-value-terminals.md | 0 .../pre/mcp-http-initialize-version-header.md | 0 .../pre/mcp-http-resource-template-origins.md | 0 .../pre/mcp-prompt-decoded-parameter-types.md | 0 .../pre/mcp-protocol-versions.md | 0 .../pre/mcp-structured-content-object.md | 0 .../pre/mcp-tool-output-schema.md | 0 .../pre/mean-dingos-share.md | 0 .../pre/mean-trains-smash.md | 0 .../pre/memoize-idempotent-asts.md | 0 .../memory-message-storage-clear-controls.md | 0 .../pre/merge-resource-failures.md | 0 .../pre/metal-nails-sneeze.md | 0 .../pre/metal-parts-yell.md | 0 .../pre/metric-attribute-order-identity.md | 0 .../pre/metric-registry-isolation.md | 0 .../pre/mighty-games-matter.md | 0 .../pre/migrate-persisted-queues.md | 0 .../pre/migrator-windows-file-url.md | 0 .../pre/model-field-option-undefined.md | 0 .../pre/modern-carrots-see.md | 0 .../pre/modern-uuid-guid-filter.md | 0 .../pre/mssql-binary-parameters.md | 0 .../pre/mssql-ntlm-domain.md | 0 .../pre/multipart-collect-linear.md | 0 .../pre/multipart-onDone-clobbers-error.md | 0 .../pre/multipart-parser-limits.md | 0 .../pre/multipart-streamed-part-guard.md | 0 .../pre/mutable-arrays-preserve.md | 0 .../pre/mutable-list-bulk-prepend-tail.md | 0 .../pre/mysql2-disable-prepared-statements.md | 0 .../pre/name-random-services.md | 0 .../pre/narrow-schedule-while.md | 0 .../pre/nasty-geese-grow.md | 0 .../pre/neat-goats-wave.md | 0 .../pre/neat-graphs-induced.md | 0 .../pre/neat-kings-chew.md | 0 .../pre/neat-lions-rest.md | 0 .../pre/neat-pandas-query.md | 0 .../pre/neat-snails-wash.md | 0 .../pre/neat-taxis-notice.md | 0 .../pre/neat-tuples-remember.md | 0 .../pre/neat-windows-buy.md | 0 .../pre/nested-union-sentinels.md | 0 .../pre/net-address-values.md | 0 .../pre/new-dogs-swim.md | 0 .../pre/new-toes-stop.md | 0 .../pre/ninety-books-sit.md | 0 .../pre/ninety-geese-exist.md | 0 .../pre/node-http-status-text.md | 0 .../pre/node-redis-client.md | 0 .../pre/node-response-preserve-bytes.md | 0 .../pre/node-sink-cancel-drain.md | 0 .../pre/node-sink-finalization-errors.md | 0 .../pre/node-stream-buffer-size.md | 0 .../pre/node-terminal-idle-ttl.md | 0 .../pre/node-terminal-stdin-eof.md | 0 .../pre/node-watch-relative.md | 0 .../pre/node-worker-unsafe-send-envelope.md | 0 .../pre/node-writeall-empty.md | 0 .../pre/normalize-collection-counts.md | 0 .../normalize-httpapi-payload-media-types.md | 0 .../pre/normalize-unbounded-pubsub-replay.md | 0 ...number-remainder-negative-zero-dividend.md | 0 .../pre/o8drprcu-sqlite-node-node-sqlite.md | 0 .../pre/odd-boats-think.md | 0 .../pre/odd-bulldogs-sleep.md | 0 .../pre/odd-fans-glow.md | 0 .../pre/odd-forks-talk.md | 0 .../pre/odd-laws-draw.md | 0 .../pre/odd-owls-smoke.md | 0 .../pre/odd-socks-boil.md | 0 .../pre/odd-suns-dance.md | 0 .../pre/old-brooms-cry.md | 0 .../pre/old-facts-stand.md | 0 .../pre/old-mirrors-float.md | 0 .../pre/olive-poems-visit.md | 0 .../pre/olive-queues-persist.md | 0 .../pre/opaque-graph-interface.md | 0 .../pre/open-hotels-remain.md | 0 .../pre/open-objects-intersect.md | 0 .../pre/openai-compat-decode-tool-params.md | 0 .../openai-compat-empty-assistant-content.md | 0 .../pre/openai-compat-null-tool-calls.md | 0 .../pre/openai-compat-nullable-tool-name.md | 0 .../pre/openai-compat-parallel-tool-calls.md | 0 .../pre/openai-compat-reasoning.md | 0 .../pre/openai-compatible-quota-errors.md | 0 .../pre/openai-image-strings.md | 0 .../pre/openai-optional-sequence-number.md | 0 .../pre/openai-telemetry-response.md | 0 .../pre/openai-text-prompt-cache.md | 0 .../pre/openai-tolerant-error-stream-event.md | 0 .../pre/openai-web-search-outcomes.md | 0 ...penapi-generator-sse-constraint-decoder.md | 0 .../openapi-omitted-additional-properties.md | 0 .../pre/openapi-path-parameters.md | 0 .../pre/openapi-pointer-references.md | 0 .../pre/openapi-response-variants.md | 0 .../pre/openrouter-disjoint-usage-details.md | 0 .../pre/openrouter-encrypted-tool-finish.md | 0 .../pre/openrouter-generation-usage-schema.md | 0 .../pre/openrouter-input-audio.md | 0 .../pre/openrouter-strict-json-schema.md | 0 .../pre/openrouter-tool-parameter-deltas.md | 0 .../opentelemetry-delta-interval-starts.md | 0 .../pre/opentelemetry-render-causes.md | 0 .../pre/optic-projection-replacement.md | 0 .../pre/optic-standalone-functions.md | 0 .../pre/optic-string-index-delete.md | 0 .../pre/optimize-array-equality.md | 0 .../pre/optimize-httpapi-handler-types.md | 0 .../pre/optimize-node-http-server-response.md | 0 .../pre/optimize-schema-class-decoding.md | 0 .../pre/optional-ai-embedding-usage.md | 0 .../pre/optional-ai-response-fields.md | 0 .../pre/order-consumed-criteria.md | 0 .../pre/otel-resource-env-precedence.md | 0 .../pre/otlp-disabled-batch-flush.md | 0 .../pre/otlp-tracer-span-performance.md | 0 .../parameterize-persistence-lookup-keys.md | 5 + .../partitioned-semaphore-stale-cleanup.md | 0 .../pre/perfect-buckets-tickle.md | 0 .../pre/persisted-cache-lookup-throw.md | 0 .../pre/petite-months-allow.md | 0 .../pre/pg-client-connect-error-handler.md | 0 .../pre/pg-explicit-ssl-precedence.md | 0 .../pre/pglite-json-string-values.md | 0 .../pre/pipeline-root-stdin.md | 0 .../pre/plain-tool-results.md | 0 .../pre/plain-variant-unions.md | 0 .../pre/platform-crypto-service.md | 0 .../pre/platform-node-shared-barrel.md | 0 .../pre/plenty-moons-pull.md | 0 .../pre/polite-brooms-tickle.md | 0 .../pre/polite-cameras-rest.md | 0 .../pre/polite-dingos-unite.md | 0 .../pre/polite-pigs-speak.md | 0 .../pre/polite-tables-kneel.md | 0 .../pre/pool-preserve-reservations.md | 0 .../pre/port-effect-reduce.md | 0 .../pre/port-http-api-builder-handler.md | 0 .../pre/port-react-hydration.md | 0 .../pre/postgres-channel-names.md | 0 .../pre/precise-clocks-rest.md | 0 .../pre/precise-test-clock-nanos.md | 0 .../pre/preserve-command-hidden-metadata.md | 0 .../pre/preserve-config-all-input-evidence.md | 0 .../pre/preserve-default-variant-class.md | 0 .../pre/preserve-negative-counter-deltas.md | 0 .../pre/preserve-openapi-raw-json.md | 0 .../pre/preserve-otel-parent-context.md | 0 .../preserve-unsafe-workflow-interrupts.md | 0 .../pre/pretty-moments-clap.md | 0 .../pre/principled-collection-counts.md | 0 .../pre/prompt-buffer-render.md | 0 .../pre/prompt-lossless-text-serialization.md | 0 .../pre/prompt-response-files.md | 0 .../pre/protect-schema-issue-actuals.md | 0 .../pre/proud-ears-say.md | 0 .../pre/provider-executed-tool-results.md | 0 .../pre/public-deer-ring.md | 0 .../pre/public-jeans-stop.md | 0 .../pre/pubsub-publish-false.md | 0 .../pre/pubsub-sliding-single-subscriber.md | 0 .../pre/pull-based-socket.md | 0 .../pre/puny-pens-clap.md | 0 .../pre/purple-bars-prove.md | 0 .../pre/purple-schools-float.md | 0 .../pre/purple-turtles-draw.md | 0 .../pre/queue-manual-flush.md | 0 .../pre/queue-reentrant-producers.md | 0 .../pre/quick-dragons-fix.md | 0 .../pre/quick-falcons-travel.md | 0 .../pre/quick-geese-relax.md | 0 .../pre/quick-graphs-paths.md | 0 .../pre/quick-kiwis-remember.md | 0 .../pre/quick-lamps-dig.md | 0 .../pre/quick-lizards-fall.md | 0 .../pre/quick-schedulers-promise.md | 0 .../pre/quick-trees-join.md | 0 .../pre/quiet-buffers-decode.md | 0 .../pre/quiet-buns-route.md | 0 .../pre/quiet-carpets-grin.md | 0 .../pre/quiet-clis-parse.md | 0 .../pre/quiet-crons-report.md | 0 .../pre/quiet-fibers-settle.md | 0 .../pre/quiet-files-hunt.md | 0 .../pre/quiet-files-write.md | 0 .../pre/quiet-graphs-guard.md | 0 .../pre/quiet-graphs-search.md | 0 .../pre/quiet-graphs-simplify.md | 0 .../pre/quiet-lamps-jam.md | 0 .../pre/quiet-mice-negotiate.md | 0 .../pre/quiet-observers-report.md | 0 .../pre/quiet-otters-retry.md | 0 .../pre/quiet-owls-validate.md | 0 .../pre/quiet-pandas-listen.md | 0 .../pre/quiet-pandas-rebuild.md | 0 .../pre/quiet-pandas-respond.md | 0 .../pre/quiet-radios-wave.md | 0 .../pre/quiet-redis-scripts.md | 0 .../pre/quiet-rpcs-buffer.md | 0 .../pre/quiet-savepoints-wait.md | 0 .../pre/quiet-sockets-close.md | 0 .../pre/quiet-spans-rest.md | 0 .../pre/quiet-streams-take.md | 0 .../pre/quiet-tigers-yell.md | 0 .../pre/quiet-tools-smile.md | 0 .../pre/quiet-turtles-smile.md | 0 .../pre/random-choice.md | 0 .../pre/random-exclusive-upper-endpoint.md | 0 .../pre/random-hex-encoding.md | 0 .../pre/rate-limiter-reset-lifetime.md | 0 .../pre/rcmap-invalidation-release.md | 0 .../pre/rcmap-throwing-lookup.md | 0 .../pre/rcref-acquisition-shutdown.md | 0 .../pre/rcref-release-ownership.md | 0 .../pre/read-only-bun-sqlite.md | 0 .../pre/ready-olives-divide.md | 0 .../pre/real-trains-ring.md | 0 .../pre/reason-annotate-context-only.md | 0 .../pre/record-from-iterable-by-dual.md | 0 .../pre/red-pigs-repair.md | 0 .../pre/redact-cli-wizard-values.md | 0 .../pre/redacted-representation-options.md | 0 .../pre/redis-subscribe-api.md | 0 .../pre/refactor-cli-global-flags.md | 0 .../pre/refactor-config-provider.md | 0 .../pre/refactor-representation-references.md | 0 .../pre/refine-config-absence.md | 0 .../pre/refresh-mcp-roots.md | 0 .../pre/register-param-alternate-flags.md | 0 .../pre/release-rpc-worker-pool-entries.md | 0 .../pre/remove-context-mutate.md | 0 .../pre/remove-effect-transactionwith.md | 0 .../pre/remove-http-span-counter.md | 0 .../pre/remove-kubernetes-types.md | 0 .../pre/remove-msgpack.md | 0 .../pre/remove-nullor.md | 0 .../pre/remove-openapi-fromapi-options.md | 0 .../pre/remove-schedule-apis.md | 0 .../pre/remove-schedule-either.md | 0 .../pre/remove-schedule-elapsed.md | 0 .../pre/remove-schedule-taps.md | 0 .../pre/remove-schema-key-value-combiner.md | 0 ...ove-schema-stringtree-keep-declarations.md | 0 .../pre/remove-schema-utils.md | 0 .../pre/remove-types-mergerecord.md | 0 .../pre/remove-unused-utils-apis.md | 0 .../pre/remove-with-concurrency.md | 0 .../pre/rename-rebuild-out.md | 0 ...name-schema-arbitrary-filter-constraint.md | 0 .../pre/rename-schema-error-constructors.md | 0 .../pre/rename-schema-transform-effect.md | 0 .../pre/render-cli-user-errors.md | 0 .../pre/repeat-or-else-metadata-argument.md | 0 .../pre/report-mcp-tool-failures.md | 0 .../pre/report-schema-input.md | 0 .../pre/report-transient-rpc-socket-errors.md | 0 .../pre/request-cache-cancellation.md | 0 .../request-persisted-resolver-failures.md | 0 .../pre/request-race-cache.md | 0 .../pre/request-resolver-failure-causes.md | 0 .../pre/request-resolver-iterable-results.md | 0 .../pre/required-boolean-flags.md | 0 .../pre/required-keys-index-signatures.md | 0 .../pre/resolved-client-urls.md | 0 .../pre/resource-subscriptions.md | 0 .../pre/restore-effect-head.md | 0 .../pre/restore-schema-parse-options.md | 0 .../pre/result-map-error-success-identity.md | 0 .../pre/retry-redis-script-load.md | 0 .../pre/reuse-httpapi-response-schemas.md | 0 .../pre/rich-dots-push.md | 0 .../pre/rich-hoops-nail.md | 0 .../pre/rich-sloths-draw.md | 0 .../pre/ripe-lies-battle.md | 0 .../pre/rpc-client-http-early-close.md | 0 .../pre/rpc-falsy-control-ids.md | 0 .../pre/rpc-middleware-provides-fix.md | 0 .../pre/rpc-server-notifications.md | 0 .../pre/safe-json-schema-patterns.md | 0 .../pre/scalar-custom-fetch.md | 0 .../pre/scheduler-global-scope-timers.md | 0 .../pre/schema-api-cleanup.md | 0 .../pre/schema-arbitrary-factory.md | 0 .../pre/schema-array-leaf-aggregation.md | 0 .../pre/schema-as-class.md | 0 .../pre/schema-asserts-signature.md | 0 .../pre/schema-aware-rpc-serialization.md | 0 .../pre/schema-binary-codec.md | 0 .../pre/schema-binary-preserve-bom.md | 0 .../schema-clean-up-additionalProperties.md | 0 .../pre/schema-codec-narrowing.md | 0 .../pre/schema-date-valid.md | 0 .../pre/schema-datetime-utc-from-string.md | 0 .../pre/schema-decoding-defaults-services.md | 0 .../pre/schema-defaults-issue-channel.md | 0 .../pre/schema-direct-class-extension.md | 0 .../pre/schema-dollar-prefix.md | 0 .../pre/schema-interpreter-backports.md | 0 .../pre/schema-json-schema-options.md | 0 .../pre/schema-lazy-bottom.md | 0 .../pre/schema-missing-self-generic.md | 0 .../schema-ordered-arbitrary-constraints.md | 0 .../pre/schema-parser-adapter-errors.md | 0 .../pre/schema-refactor-toCodecJson.md | 0 .../pre/schema-remove-annotate-in.md | 0 .../pre/schema-rename-makeUnsafe-to-make.md | 0 .../pre/schema-rename-parser-makeUnsafe.md | 0 .../pre/schema-representation-refactoring.md | 0 .../pre/schema-result-combinators.md | 0 .../pre/schema-runtime-performance.md | 0 .../pre/schema-struct-simplify.md | 0 .../pre/schema-union-type-derivation.md | 0 .../pre/scope-persisted-queue-ids.md | 0 .../scoped-cache-invalidate-all-reentrancy.md | 0 .../scoped-cache-refresh-lookup-defects.md | 0 .../pre/scoped-log-nan-restoration.md | 0 .../pre/secure-eventlog-identities.md | 0 .../pre/select-prompt-optional-message.md | 0 .../pre/semantic-matching.md | 0 .../pre/service-interface-const.md | 0 .../pre/seven-mugs-marry.md | 0 .../pre/seven-poems-divide.md | 0 .../pre/shaggy-birds-stay.md | 0 .../pre/shaggy-cities-push.md | 0 .../pre/shaggy-numbers-accept.md | 0 .../pre/shaky-beans-throw.md | 0 .../pre/shaky-terms-push.md | 0 ...sharding-registration-context-overrides.md | 0 .../pre/sharp-emus-applaud.md | 0 .../pre/sharp-goats-wink.md | 0 .../pre/sharp-pandas-care.md | 0 .../pre/sharp-peas-march.md | 0 .../pre/sharp-rules-draw.md | 0 .../pre/sharp-singers-sort.md | 0 .../pre/shiny-trains-hug.md | 0 .../pre/short-cows-relate.md | 0 .../pre/short-foxes-admire.md | 0 .../pre/short-stamps-throw.md | 0 .../pre/shy-cycles-flow.md | 0 .../pre/shy-geckos-sniff.md | 0 .../pre/shy-seals-smile.md | 0 .../pre/silent-geckos-matter.md | 0 .../pre/silent-needles-design.md | 0 .../pre/silent-plants-matter.md | 0 .../pre/silent-spoons-stare.md | 0 .../pre/silly-dodos-update.md | 0 .../pre/silly-loops-tickle.md | 0 .../pre/silver-bulk-indexeddb.md | 0 .../pre/silver-emus-smoke.md | 0 .../pre/silver-kings-poke.md | 0 .../pre/silver-snails-sqlite.md | 0 .../pre/silver-wings-watch.md | 0 .../pre/simplify-optic-composition.md | 0 .../pre/six-cups-taste.md | 0 .../pre/six-pumas-take.md | 0 .../pre/sixty-mails-shout.md | 0 .../pre/sixty-socks-yell.md | 0 .../pre/skip-disabled-stack-capture.md | 0 .../pre/slick-signs-wish.md | 0 .../pre/slick-toes-rush.md | 0 .../pre/slimy-melons-admire.md | 0 .../pre/slimy-planets-divide.md | 0 .../pre/slimy-turtles-juggle.md | 0 .../pre/slow-beans-battle.md | 0 .../pre/slow-berries-enjoy.md | 0 .../pre/slow-entities-register.md | 0 .../pre/slow-spiders-refresh.md | 0 .../pre/small-basic-bundle.md | 0 .../pre/small-bugs-hunt.md | 0 .../pre/small-crabs-care.md | 0 .../pre/small-pandas-cache.md | 0 .../pre/small-pets-sit.md | 0 .../pre/smart-ducks-jump.md | 0 .../pre/smart-pillows-buy.md | 0 .../pre/smart-timers-fly.md | 0 .../pre/smart-tips-sort.md | 0 .../pre/social-hoops-knock.md | 0 .../pre/social-pumas-prove.md | 0 .../pre/socket-paused-websocket-handoff.md | 0 .../socket-websocket-text-byte-watermark.md | 0 .../pre/soft-comics-wink.md | 0 .../pre/soft-delete-sqlmodel.md | 0 .../pre/soft-seals-allow.md | 0 .../pre/soft-sockets-write.md | 0 .../pre/solid-cougars-attack.md | 0 .../pre/solid-doors-ring.md | 0 .../pre/solid-items-tease.md | 0 .../pre/solid-towns-smoke.md | 0 .../pre/sour-bees-sleep.md | 0 .../pre/sour-canyons-rescue.md | 0 .../pre/sparkly-bears-act.md | 0 .../pre/sparkly-coins-sit.md | 0 .../pre/spicy-doors-unlist.md | 0 .../pre/split-clock-semantics.md | 0 .../pre/split-lines-completed-cr.md | 0 .../pre/spotty-comics-fry.md | 0 .../pre/spotty-masks-own.md | 0 .../pre/sql-begin-failure-typed.md | 0 .../pre/sql-event-journal-callback-errors.md | 0 .../sql-message-storage-joined-reply-id.md | 0 .../pre/sql-migrator-mjs-mts.md | 0 .../pre/sql-nested-placeholder-cache.md | 0 .../pre/sql-optional-span-propagation.md | 0 .../pre/sql-returning-identifier.md | 0 .../pre/sql-runner-requested-shard-results.md | 0 .../pre/sqlite-bun-prepare-error-channel.md | 0 .../pre/sqlite-bun-transaction-export.md | 0 .../pre/sqlite-client-locking-defaults.md | 0 .../sqlite-do-durable-object-transactions.md | 0 .../pre/sqlite-do-stream-errors.md | 0 .../pre/sqlite-node-unprepared-errors.md | 0 .../pre/sqlite-wasm-messageport-startup.md | 0 .../pre/sqlite-wasm-statement-columns.md | 0 .../pre/sqlite-wasm-worker-error-metadata.md | 0 .../pre/sqlmodel-insert-decoding-services.md | 0 .../pre/stable-graph-traversal-config.md | 0 .../pre/stale-dots-tell.md | 0 .../pre/stale-graph-traversal-skips.md | 0 .../pre/stale-laws-do.md | 0 .../pre/stale-snakes-know.md | 0 .../pre/standard-schema-module.md | 0 .../pre/stream-rechunk-large-source.md | 0 .../pre/strict-areas-end.md | 0 .../pre/strict-buckets-hug.md | 0 .../pre/strict-content-length.md | 0 .../pre/strict-cookie-names.md | 0 .../pre/strip-resolved-approvals.md | 0 .../pre/strong-balloons-tickle.md | 0 .../pre/strong-bees-queue.md | 0 .../pre/strong-insects-film.md | 0 .../pre/struct-numeric-selection.md | 0 .../pre/struct-record.md | 0 .../pre/structural-schema-nodes.md | 0 .../pre/sunny-ads-hang.md | 0 .../pre/sunny-bikes-sleep.md | 0 .../pre/sunny-rooms-invent.md | 0 .../pre/sweet-donuts-bet.md | 0 .../pre/sweet-hotels-give.md | 0 .../pre/sweet-lizards-sing.md | 0 .../pre/sweet-schedules-matter.md | 0 .../pre/sweet-views-learn.md | 0 .../pre/swift-geese-count.md | 0 .../pre/swift-pandas-parse.md | 0 .../pre/swift-spiders-unpack.md | 0 .../pre/swift-symbols-stand.md | 0 ...ronized-ref-modify-some-effect-currying.md | 0 .../pre/synchronized-ref-not-ref.md | 0 ...tagged-error-class-optional-empty-props.md | 0 .../pre/tall-hairs-return.md | 0 .../pre/tall-ideas-fix.md | 0 .../pre/tall-mails-listen.md | 0 .../pre/tall-melons-shave.md | 0 .../pre/tall-queens-cheer.md | 0 .../pre/tall-wombats-wave.md | 0 .../pre/tame-json-schema-intersections.md | 0 .../pre/tangy-colts-lose.md | 0 .../pre/tangy-plants-run.md | 0 .../pre/tap-defect-saved-error-inference.md | 0 .../pre/tasty-comics-send.md | 0 .../pre/tasty-moments-post.md | 0 .../pre/tcp-schema-binary-default.md | 0 ...template-literal-parts-without-encoding.md | 0 .../pre/ten-kings-fry.md | 0 .../pre/tender-deserts-pull.md | 0 .../pre/tender-files-complete.md | 0 .../pre/tender-points-sleep.md | 0 .../pre/terminate-openai-failed-streams.md | 0 .../pre/testschema-own-field-asts.md | 0 .../pre/theme-cli-prompts.md | 0 .../pre/thick-pandas-wait.md | 0 .../pre/thin-ducks-wonder.md | 0 .../pre/thin-ends-hug.md | 0 .../pre/thirty-ducks-go.md | 0 .../pre/thirty-forks-march.md | 0 .../pre/thirty-pans-love.md | 0 .../pre/three-corners-sort.md | 0 .../pre/three-ravens-jam.md | 0 .../pre/three-tomatoes-wave.md | 0 .../pre/tidy-apples-rest.md | 0 .../pre/tidy-carpets-smile.md | 0 .../pre/tidy-cats-smile.md | 0 .../pre/tidy-cats-stream.md | 0 .../pre/tidy-codecs-inherit.md | 0 .../pre/tidy-dates-smile.md | 0 .../pre/tidy-floats-edit.md | 0 .../pre/tidy-foxes-own.md | 0 .../pre/tidy-geese-release.md | 0 .../pre/tidy-graphs-cycle.md | 0 .../pre/tidy-icons-glow.md | 0 .../pre/tidy-int32-annotations.md | 0 .../pre/tidy-json-objects.md | 0 .../pre/tidy-json-schema-object-scopes.md | 0 .../pre/tidy-lions-smile.md | 0 .../pre/tidy-matches-select.md | 0 .../pre/tidy-mice-grin.md | 0 .../pre/tidy-pandas-smile.md | 0 .../pre/tidy-parts-narrow.md | 0 .../pre/tidy-plums-remember.md | 0 .../pre/tidy-ravens-import.md | 0 .../pre/tidy-schema-errors.md | 0 .../pre/tidy-scoped-refs-close.md | 0 .../pre/tidy-spans-rest.md | 0 .../pre/tidy-sse-events.md | 0 .../pre/tidy-stacks-encode.md | 0 .../pre/tidy-stars-drive.md | 0 .../pre/tidy-tools-finish.md | 0 .../pre/tidy-tools-handle.md | 0 .../pre/tidy-tools-juggle.md | 0 .../pre/tidy-tuples-rest.md | 0 .../pre/tidy-wasps-wait.md | 0 .../pre/timeout-error-message.md | 0 ...timeout-or-else-cleanup-before-fallback.md | 0 .../pre/tiny-buckets-wave.md | 0 .../pre/tiny-dodos-juggle.md | 0 .../pre/tiny-files-flow.md | 0 .../pre/tiny-lilies-flash.md | 0 .../pre/tiny-lizards-correct.md | 0 .../pre/tiny-rabbits-smile.md | 0 .../pre/to-codec-json-schema.md | 0 .../pre/tocodecjson-return-json-type.md | 0 .../pre/token-bucket-elapsed-refill.md | 0 .../pre/tokenizer-whole-prompt-truncation.md | 0 .../pre/tool-get-json-schema-tests.md | 0 .../pre/tool-result-branch-encoding.md | 0 .../pre/tough-graphs-cache.md | 0 .../pre/tough-rooms-camp.md | 0 .../pre/tough-taxis-own.md | 0 .../pre/tracer-disabled-timing.md | 0 .../pre/tracer-perf.md | 0 .../pre/track-mapped-error-domain.md | 0 .../pre/trie-remove-valued-prefix.md | 0 .../pre/true-actors-battle.md | 0 .../pre/try-direct-error-types.md | 0 .../pre/try-promise-catch-defect.md | 0 .../pre/tuple-optional-evolve-result-types.md | 0 .../pre/twelve-dragons-move.md | 0 .../pre/twenty-buttons-cheer.md | 0 .../pre/twenty-facts-laugh.md | 0 .../pre/twenty-garlics-marry.md | 0 .../pre/two-roses-double.md | 0 .../pre/undici-response-form-data.md | 0 .../pre/unify-error-defect-stack-options.md | 0 .../pre/unique-directed-neighbors.md | 0 .../pre/unstable-http-schemas.md | 0 .../pre/update-schema-arbitrary-report.md | 0 .../pre/upgrade-socket-error-listener.md | 0 ...raded-request-skips-http-response-write.md | 0 .../pre/upset-colts-stick.md | 0 .../pre/urlparams-null-input.md | 0 .../pre/urlparams-setall-immutable.md | 0 .../pre/use-canonical-array-indices.md | 0 .../pre/use-url-can-parse.md | 0 .../pre/valid-owls-rest.md | 0 .../validate-httpapi-handler-registration.md | 0 .../pre/validate-openapi-global-conflicts.md | 0 .../pre/vast-bananas-send.md | 0 .../pre/vast-deserts-travel.md | 0 .../pre/violet-peaches-feel.md | 0 .../pre/violet-pugs-tickle.md | 0 .../pre/violet-tips-open.md | 0 .../pre/vitest-await-timeout-finalizers.md | 0 .../pre/vitest-five-migration.md | 0 .../pre/vitest-layer-concurrency.md | 0 .../pre/vitest-layer-top-level-options.md | 0 .../pre/wacky-grapes-poke.md | 0 .../pre/wacky-rice-add.md | 0 .../pre/warm-clocks-format.md | 0 .../pre/warm-dolls-brake.md | 0 .../pre/warm-friends-tie.md | 0 .../pre/warm-graphs-degree.md | 0 .../pre/warm-rivers-cache.md | 0 .../pre/warm-snails-shop.md | 0 .../pre/wet-news-invent.md | 0 .../pre/whole-pets-build.md | 0 .../pre/wild-donuts-brake.md | 0 .../pre/wild-readers-clean.md | 0 .../pre/wild-suns-bearer-space.md | 0 .../pre/windows-hide-child-process-console.md | 0 .../pre/wise-ants-wave.md | 0 .../pre/wise-bats-encrypt.md | 0 .../pre/wise-files-watch.md | 0 .../pre/wise-flags-shift.md | 0 .../pre/wise-graphs-connect.md | 0 .../pre/wise-oranges-stay.md | 0 .../pre/wise-pandas-lock.md | 0 .../pre/with-error-reporting-effect-result.md | 0 .../pre/witty-lobsters-share.md | 0 .../pre/worker-run-early-exit.md | 0 .../pre/worker-runner-multi-disconnect.md | 0 .../workflow-proxy-discard-execution-id.md | 0 .../pre/xhr-arraybuffer-readers.md | 0 .../pre/yellow-adults-study.md | 0 .../pre/yellow-clocks-dance.md | 0 .../pre/yellow-dingos-jump.md | 0 .../pre/young-doors-change.md | 0 .../pre/zero-node-socket-timeout.md | 0 .changeset/project-computed-type-safety.md | 5 - .changeset/project-encoded-type-constraint.md | 5 - .changeset/project-union-schema.md | 5 - .changeset/project-union-subsets.md | 5 - .changeset/projectable-from-domain.md | 8 - .changeset/projectable-key-guard-project.md | 8 - .changeset/provide-dual.md | 5 - .changeset/publish-tsconfig-postpack.md | 9 - .changeset/pure-usesync-cleanup.md | 5 - .changeset/query-aggregate-support.md | 11 - .changeset/query-map-has-ops.md | 8 - .changeset/query-optional-mode.md | 5 - .changeset/query-span-propagation.md | 5 - .changeset/quick-seals-relate.md | 9 - .changeset/quick-wolves-yawn.md | 5 - .changeset/quiet-shrimps-juggle.md | 7 - .changeset/quiet-tigers-reply.md | 5 - .changeset/quiet-tools-rest.md | 5 - .changeset/rare-llamas-begin.md | 5 - .changeset/rare-rules-help.md | 5 - .changeset/ready-bags-wave.md | 5 - .changeset/ready-bananas-scream.md | 11 - .changeset/real-lilies-design.md | 5 - .changeset/real-suits-clean.md | 5 - .changeset/recover-stuck-query-interrupts.md | 9 - .changeset/red-pillows-repeat.md | 5 - .changeset/relation-collect-fields.md | 11 - .changeset/remove-by-id-array.md | 5 - .changeset/remove-class-struct-pick-omit.md | 6 - .changeset/remove-legacy-from-make-client.md | 5 - .changeset/remove-legacy-mutate-result-2.md | 5 - .changeset/remove-lodash-from-effect-app.md | 5 - .changeset/remove-operations.md | 7 - .changeset/remove-queue-machinery.md | 6 - .changeset/remove-tagged-error-compat.md | 5 - .changeset/remove-tagged-request.md | 7 - .changeset/remove-void-schema-override.md | 5 - .changeset/remove-withDefaultConstructor.md | 7 - .changeset/rename-mutate-stream.md | 6 - ...e-withdefault-to-withconstructordefault.md | 9 - .changeset/replace-proxify-with-accessors.md | 6 - .changeset/repo-derived-query-invalidation.md | 7 - .../repo-mutations-accept-empty-arrays.md | 5 - .changeset/repo-span-topology.md | 5 - .changeset/repo-spans-itemtype.md | 5 - .changeset/repository-registry.md | 9 - .changeset/request-scoped-dependencies.md | 7 - .changeset/require-middleware-layers.md | 30 - .changeset/resolver-cache-use-official.md | 5 - .changeset/restore-tight-project-guard.md | 16 - .changeset/router-no-meta.md | 5 - .changeset/rpc-stream-support.md | 11 - .changeset/salty-weeks-walk.md | 5 - .changeset/schema-concurrency-unbounded.md | 5 - .changeset/schema-encode-slow-metrics.md | 9 - .../schema-facade-identifier-structfacade.md | 8 - .changeset/schema-json-collections.md | 5 - .changeset/secret-url-tests.md | 5 - .../select-delayed-cache-invalidation.md | 16 - .../sendgrid-configurable-fake-address.md | 5 - .../server-driven-cache-invalidation.md | 13 - .../server-invalidation-handler-shorthand.md | 17 - .changeset/servicebus-log-only-spans.md | 5 - .changeset/shaggy-terms-show.md | 5 - .changeset/shaggy-waves-slide.md | 5 - .changeset/shaggy-wolves-grow.md | 5 - .changeset/share-oxlintrc-config.md | 5 - .changeset/sharp-buses-bow.md | 5 - .changeset/sharp-seals-clean.md | 6 - .changeset/short-cats-march.md | 5 - .changeset/short-frogs-add.md | 5 - .changeset/short-suns-travel.md | 5 - .changeset/shy-squids-make.md | 5 - .changeset/silent-results-shave.md | 6 - .changeset/silent-rooms-throw.md | 5 - .changeset/silly-eggs-roll.md | 5 - .changeset/single-invalidate-query-call.md | 5 - .changeset/six-regions-start.md | 5 - .changeset/six-yaks-stop.md | 5 - .changeset/sixty-meals-sin.md | 5 - .changeset/slimy-apes-film.md | 6 - .changeset/slimy-lions-laugh.md | 5 - .changeset/slimy-schools-fold.md | 9 - .changeset/slow-readers-wave.md | 6 - .changeset/small-papers-sneeze.md | 5 - .changeset/small-wolves-knock.md | 5 - .changeset/smart-beers-listen.md | 6 - .changeset/smart-candles-rest.md | 6 - .changeset/soft-books-win.md | 5 - .changeset/soft-guests-relax.md | 5 - .changeset/soft-mails-brush.md | 5 - .changeset/soft-work-invalidations.md | 5 - .changeset/sour-turtles-smash.md | 5 - .changeset/source-first-package-exports.md | 7 - .changeset/sparkly-cars-press.md | 5 - .changeset/spicy-falcons-rush.md | 5 - .changeset/spicy-lights-trade.md | 5 - .changeset/sql-namespace-support.md | 5 - .changeset/sql-store-adapter.md | 5 - .changeset/sql-transaction-middleware.md | 5 - .changeset/sqlite-per-namespace-layermap.md | 5 - .changeset/sqlite-workflow-engine.md | 5 - .changeset/sse-context-map-scope.md | 5 - .changeset/sse-filter-namespace-by-storeid.md | 5 - .changeset/staged-publish-directory.md | 9 - .changeset/stale-actors-remain.md | 5 - .changeset/stale-emus-see.md | 5 - .changeset/stale-papers-join.md | 5 - .changeset/store-effect-cached.md | 5 - .changeset/store-json-values.md | 8 - .changeset/store-seed-uninterruptible.md | 5 - .changeset/stream-callable-progress.md | 12 - .changeset/stream-drain-data-dependencies.md | 11 - .changeset/stream-effect-fail.md | 5 - .changeset/stream-final-default-success.md | 8 - .changeset/stream-final-type.md | 15 - .changeset/stream-first-write-flush.md | 5 - .changeset/stream-fn-enhancements.md | 12 - .changeset/stream-metadata-v1.md | 24 - .changeset/stream-on-command-query.md | 29 - .changeset/stream-withdefaulttoast.md | 8 - .changeset/strict-stream-handlers.md | 12 - .changeset/strong-dots-sin.md | 5 - .changeset/struct-pick-omit.md | 5 - .changeset/structfacade-effect-app-struct.md | 7 - .changeset/suspense-keep-previous-value.md | 7 - .changeset/sweet-humans-ring.md | 5 - .changeset/sweet-moments-see.md | 5 - .changeset/swift-owls-knit.md | 5 - .changeset/swift-tables-turn.md | 11 - .changeset/sync-effect-app-command.md | 6 - .changeset/sync-effect-subtree.md | 5 - .changeset/sync-effect-url.md | 5 - .changeset/sync-push-deletions.md | 5 - .changeset/synchronous-change-feed.md | 5 - .../tagged-request-command-query-split.md | 8 - .changeset/tagged-request-for.md | 6 - .../tagged-union-drop-fields-constraint.md | 5 - .changeset/tagged-union-generate-guards.md | 10 - .changeset/tagged-union-generate-guards2.md | 10 - .changeset/tall-boxes-relax.md | 5 - .changeset/tall-hats-reflect.md | 6 - ...anstack-effect-equal-structural-sharing.md | 5 - .changeset/tanstack-suspense-seed.md | 5 - .changeset/tasty-eggs-stare.md | 5 - .changeset/tasty-fans-accept.md | 8 - .changeset/ten-crews-like.md | 5 - .changeset/ten-suns-shine.md | 6 - .changeset/tender-bars-ring.md | 5 - .changeset/tender-donkeys-pick.md | 8 - .changeset/thin-zebras-press.md | 5 - .changeset/thirty-cooks-pump.md | 5 - .changeset/thirty-experts-taste.md | 5 - .changeset/three-hotels-roll.md | 7 - .changeset/tidy-caches-reflect.md | 5 - .changeset/tidy-cosmos-batches.md | 5 - .changeset/tidy-derived-dependencies.md | 6 - .changeset/tidy-dprint-oxlint-config.md | 5 - .changeset/tidy-effects-diagnose.md | 5 - .changeset/tidy-forms-report.md | 5 - .changeset/tidy-pans-rule.md | 9 - .changeset/tidy-poets-think.md | 9 - .changeset/tidy-remaining-formatting.md | 6 - .changeset/tidy-rivers-identify.md | 5 - .changeset/tidy-titles-remove.md | 5 - .changeset/tiny-cows-repair.md | 5 - .changeset/tiny-gorillas-jump.md | 7 - .changeset/tired-insects-stand.md | 5 - .changeset/toast-group-request-id.md | 9 - .changeset/tough-apes-whisper.md | 6 - .../tsgo-decodingservices-workaround.md | 6 - .../tsgo-direct-schema-property-access.md | 9 - .changeset/twenty-seas-grab.md | 8 - .changeset/two-clocks-wash.md | 11 - .changeset/typed-database-error.md | 8 - .changeset/typed-query-builders.md | 12 - .changeset/unify-emailer-spans.md | 5 - .changeset/unify-parsemany-spans.md | 5 - .changeset/update-effect-beta-107.md | 24 - .changeset/update-effect-beta-36.md | 9 - .changeset/update-effect-beta-52.md | 9 - .../update-effect-beta-60-rpc-custom.md | 6 - .changeset/update-effect-beta-66.md | 7 - .changeset/update-effect-beta-67.md | 7 - .changeset/update-effect-beta-83.md | 14 - .changeset/update-effect-beta-84.md | 9 - .changeset/update-effect-beta-86.md | 9 - .changeset/update-effect-beta-88.md | 9 - .changeset/update-effect-beta-90.md | 9 - .changeset/update-effect-pkgprnew.md | 7 - .changeset/update-effect-rc-112.md | 17 - .changeset/upset-aliens-bathe.md | 5 - .changeset/upset-bugs-roll.md | 5 - .changeset/version-independent-snapshot.md | 5 - .changeset/vue-components-src-exports.md | 5 - .../vue-components-vuetify-typecheck.md | 7 - .changeset/vue-placeholder-data-fallback.md | 5 - .changeset/vue-prefer-fn-untraced.md | 5 - .changeset/vue-stream-query.md | 5 - .changeset/vue-suspense-result-race.md | 5 - .../vue-unified-invalidation-foreach.md | 5 - .changeset/wacky-deer-decide.md | 5 - .changeset/warm-maps-reflect.md | 5 - .changeset/warm-streets-smell.md | 5 - .changeset/wet-roses-press.md | 5 - .changeset/wet-sites-fall.md | 8 - .changeset/wild-olives-bathe.md | 5 - .changeset/wild-wombats-nail.md | 5 - .changeset/wise-items-warn.md | 5 - .changeset/wise-stamps-crash.md | 5 - .changeset/withdefaulttoaststream-progress.md | 5 - .changeset/witty-bats-return.md | 9 - .changeset/wrap-stream-command.md | 43 - .claude/settings.json | 18 - .devcontainer/Dockerfile | 42 - .devcontainer/devcontainer.json | 14 - .devcontainer/humanlog.sh | 2 - .devcontainer/usepnpm.sh | 26 - .envrc | 4 - .githooks/README.md | 49 - .githooks/post-checkout | 98 - .githooks/pre-commit | 12 - .githooks/pre-push | 17 - .github/FUNDING.yml | 3 - .../actions/deploy-website/action.yml | 0 .../actions/setup/action.yaml | 0 .github/npm-trusted-publishing.md | 85 - .../workflows/ai-codegen.yml | 0 .../workflows/bundle-comment.yml | 0 .../.github => .github}/workflows/check.yml | 0 .github/workflows/ci.yml | 179 - .github/workflows/claude.yml | 49 - .../.github => .github}/workflows/cluster.yml | 0 .github/workflows/publish-snapshot.yml | 105 - .github/workflows/publish-wiki.yml | 18 - .../workflows/release-queue.yml | 0 .github/workflows/release.yaml | 94 - .../.github => .github}/workflows/release.yml | 0 .../workflows/snapshot.yml | 0 .gitignore | 89 +- .ncurc.json | 20 - .npmrc | 1 - .nvmrc | 1 - .oxlintrc.json | 65 +- .specs/Update-to-latest-Effect.md | 23 - .specs/changeset-publishing.md | 138 - .vscode/extensions.json | 5 +- .vscode/launch.json | 22 - .vscode/model.code-snippets | 77 - .vscode/service.code-snippets | 14 - .vscode/settings.json | 84 +- .vscode/tasks.json | 38 - AGENTS.md | 217 - CLAUDE.md | 3 - repos/effect/LICENSE => LICENSE | 0 repos/effect/LLMS.md => LLMS.md | 0 repos/effect/MIGRATION.md => MIGRATION.md | 0 README.md | 186 +- {repos/effect/ai-docs => ai-docs}/README.md | 0 .../effect/ai-docs => ai-docs}/package.json | 0 .../src/01_effect/01_basics/01_effect-gen.ts | 0 .../src/01_effect/01_basics/02_effect-fn.ts | 0 .../01_basics/10_creating-effects.ts | 0 .../src/01_effect/01_basics/index.md | 0 .../01_effect/02_schema/10_schema-basics.ts | 0 .../src/01_effect/02_schema/index.md | 0 .../src/01_effect/03_services/01_service.ts | 0 .../src/01_effect/03_services/10_reference.ts | 0 .../03_services/20_layer-composition.ts | 0 .../01_effect/03_services/20_layer-unwrap.ts | 0 .../src/01_effect/03_services/index.md | 0 .../01_effect/04_errors/01_error-handling.ts | 0 .../src/01_effect/04_errors/10_catch-tags.ts | 0 .../01_effect/04_errors/20_reason-errors.ts | 0 .../src/01_effect/04_errors/index.md | 0 .../05_resources/10_acquire-release.ts | 0 .../05_resources/20_layer-side-effects.ts | 0 .../01_effect/05_resources/30_layer-map.ts | 0 .../src/01_effect/05_resources/index.md | 0 .../src/01_effect/06_running/10_run-main.ts | 0 .../01_effect/06_running/20_layer-launch.ts | 0 .../src/01_effect/06_running/index.md | 0 .../src/01_effect/07_pubsub/10_pubsub.ts | 0 .../src/01_effect/07_pubsub/index.md | 0 .../src/03_stream/10_creating-streams.ts | 0 .../src/03_stream/20_consuming-streams.ts | 0 .../src/03_stream/30_encoding.ts | 0 .../src/03_stream/index.md | 0 .../src/04_integration/10_managed-runtime.ts | 0 .../src/04_integration/index.md | 0 .../src/05_batching/10_request-resolver.ts | 0 .../src/05_batching/index.md | 0 .../src/06_schedule/10_schedules.ts | 0 .../src/06_schedule/index.md | 0 .../07_datetime/10_creating-and-formatting.ts | 0 .../src/07_datetime/20_time-zones.ts | 0 .../src/07_datetime/index.md | 0 .../src/08_observability/10_logging.ts | 0 .../src/08_observability/20_otlp-tracing.ts | 0 .../src/08_observability/index.md | 0 .../src/09_testing/10_effect-tests.ts | 0 .../src/09_testing/20_layer-tests.ts | 0 .../src/09_testing/index.md | 0 .../src/10_predicate/01_basics.ts | 0 .../src/10_predicate/index.md | 0 .../src/40_sql/10_basics.ts | 0 .../ai-docs => ai-docs}/src/40_sql/index.md | 0 .../src/50_http-client/10_basics.ts | 0 .../src/50_http-client/index.md | 0 .../src/51_http-server/10_basics.ts | 0 .../src/51_http-server/20_testing.ts | 0 .../src/51_http-server/fixtures/api/Api.ts | 0 .../fixtures/api/Authorization.ts | 0 .../src/51_http-server/fixtures/api/System.ts | 0 .../src/51_http-server/fixtures/api/Users.ts | 0 .../51_http-server/fixtures/domain/User.ts | 0 .../fixtures/domain/UserErrors.ts | 0 .../fixtures/server/Authorization.ts | 0 .../51_http-server/fixtures/server/Users.ts | 0 .../fixtures/server/Users/http.ts | 0 .../src/51_http-server/index.md | 0 .../10_working-with-child-processes.ts | 0 .../src/60_child-process/index.md | 0 .../src/70_cli/10_basics.ts | 0 .../ai-docs => ai-docs}/src/70_cli/index.md | 0 .../src/71_ai/10_language-model.ts | 0 .../ai-docs => ai-docs}/src/71_ai/20_tools.ts | 0 .../ai-docs => ai-docs}/src/71_ai/30_chat.ts | 0 .../src/71_ai/fixtures/domain/LaunchPlan.ts | 0 .../ai-docs => ai-docs}/src/71_ai/index.md | 0 .../src/80_cluster/10_entities.ts | 0 .../src/80_cluster/index.md | 0 .../effect/ai-docs => ai-docs}/src/index.md | 0 .../effect/ai-docs => ai-docs}/tsconfig.json | 0 assets/dev/effect-app-apple-touch-180.png | Bin 11603 -> 0 bytes repos/effect/deno.json => deno.json | 0 repos/effect/dprint.json => dprint.json | 0 dprint.jsonc | 6 - flake.lock | 46 +- flake.nix | 47 +- .../jsdocs.config.json => jsdocs.config.json | 0 lint-staged.config.js | 29 - .../annotations/README.md | 0 .../annotations/effect__Arbitrary.yaml | 0 .../annotations/effect__Array.yaml | 0 .../annotations/effect__BigDecimal.yaml | 0 .../annotations/effect__BigInt.yaml | 0 .../annotations/effect__Brand.yaml | 0 .../annotations/effect__Cache.yaml | 0 .../annotations/effect__Cause.yaml | 0 .../annotations/effect__Channel.yaml | 0 .../effect__ChildExecutorDecision.yaml | 0 .../annotations/effect__Chunk.yaml | 0 .../annotations/effect__Clock.yaml | 0 .../annotations/effect__Config.yaml | 0 .../annotations/effect__ConfigError.yaml | 0 .../annotations/effect__ConfigProvider.yaml | 0 .../effect__ConfigProviderPathPatch.yaml | 0 .../annotations/effect__Console.yaml | 0 .../annotations/effect__Context.yaml | 0 .../annotations/effect__Cron.yaml | 0 .../annotations/effect__Data.yaml | 0 .../annotations/effect__DateTime.yaml | 0 .../annotations/effect__DefaultServices.yaml | 0 .../annotations/effect__Deferred.yaml | 0 .../annotations/effect__Differ.yaml | 0 .../annotations/effect__Duration.yaml | 0 .../annotations/effect__Effect.yaml | 0 .../annotations/effect__Effectable.yaml | 0 .../annotations/effect__Either.yaml | 0 .../annotations/effect__Encoding.yaml | 0 .../annotations/effect__Equal.yaml | 0 .../annotations/effect__Equivalence.yaml | 0 .../annotations/effect__ExecutionPlan.yaml | 0 .../effect__ExecutionStrategy.yaml | 0 .../annotations/effect__Exit.yaml | 0 .../annotations/effect__FastCheck.yaml | 0 .../annotations/effect__Fiber.yaml | 0 .../annotations/effect__FiberHandle.yaml | 0 .../annotations/effect__FiberId.yaml | 0 .../annotations/effect__FiberMap.yaml | 0 .../annotations/effect__FiberRef.yaml | 0 .../annotations/effect__FiberRefs.yaml | 0 .../annotations/effect__FiberRefsPatch.yaml | 0 .../annotations/effect__FiberSet.yaml | 0 .../annotations/effect__FiberStatus.yaml | 0 .../annotations/effect__Function.yaml | 0 .../annotations/effect__GlobalValue.yaml | 0 .../annotations/effect__Graph.yaml | 0 .../annotations/effect__GroupBy.yaml | 0 .../annotations/effect__Hash.yaml | 0 .../annotations/effect__HashMap.yaml | 0 .../annotations/effect__HashSet.yaml | 0 .../annotations/effect__Inspectable.yaml | 0 .../annotations/effect__Iterable.yaml | 0 .../annotations/effect__JSONSchema.yaml | 0 .../annotations/effect__KeyedPool.yaml | 0 .../annotations/effect__Layer.yaml | 0 .../annotations/effect__LayerMap.yaml | 0 .../annotations/effect__List.yaml | 0 .../annotations/effect__LogLevel.yaml | 0 .../annotations/effect__LogSpan.yaml | 0 .../annotations/effect__Logger.yaml | 0 .../annotations/effect__Mailbox.yaml | 0 .../annotations/effect__ManagedRuntime.yaml | 0 .../annotations/effect__Match.yaml | 0 .../annotations/effect__MergeDecision.yaml | 0 .../annotations/effect__MergeState.yaml | 0 .../annotations/effect__MergeStrategy.yaml | 0 .../annotations/effect__Metric.yaml | 0 .../annotations/effect__MetricBoundaries.yaml | 0 .../annotations/effect__MetricHook.yaml | 0 .../annotations/effect__MetricKey.yaml | 0 .../annotations/effect__MetricKeyType.yaml | 0 .../annotations/effect__MetricLabel.yaml | 0 .../annotations/effect__MetricPair.yaml | 0 .../annotations/effect__MetricPolling.yaml | 0 .../annotations/effect__MetricRegistry.yaml | 0 .../annotations/effect__MetricState.yaml | 0 .../annotations/effect__Micro.yaml | 0 .../annotations/effect__ModuleVersion.yaml | 0 .../annotations/effect__MutableHashMap.yaml | 0 .../annotations/effect__MutableHashSet.yaml | 0 .../annotations/effect__MutableList.yaml | 0 .../annotations/effect__MutableQueue.yaml | 0 .../annotations/effect__MutableRef.yaml | 0 .../annotations/effect__Number.yaml | 0 .../annotations/effect__Option.yaml | 0 .../annotations/effect__Order.yaml | 0 .../annotations/effect__Ordering.yaml | 0 .../annotations/effect__ParseResult.yaml | 0 .../effect__PartitionedSemaphore.yaml | 0 .../annotations/effect__Pipeable.yaml | 0 .../annotations/effect__Pool.yaml | 0 .../annotations/effect__Predicate.yaml | 0 .../annotations/effect__Pretty.yaml | 0 .../annotations/effect__PubSub.yaml | 0 .../annotations/effect__Queue.yaml | 0 .../annotations/effect__Random.yaml | 0 .../annotations/effect__RateLimiter.yaml | 0 .../annotations/effect__RcMap.yaml | 0 .../annotations/effect__RcRef.yaml | 0 .../annotations/effect__Readable.yaml | 0 .../annotations/effect__Record.yaml | 0 .../annotations/effect__RedBlackTree.yaml | 0 .../annotations/effect__Redacted.yaml | 0 .../annotations/effect__Ref.yaml | 0 .../annotations/effect__Reloadable.yaml | 0 .../annotations/effect__Request.yaml | 0 .../annotations/effect__RequestBlock.yaml | 0 .../annotations/effect__RequestResolver.yaml | 0 .../annotations/effect__Resource.yaml | 0 .../annotations/effect__Runtime.yaml | 0 .../annotations/effect__RuntimeFlags.yaml | 0 .../effect__RuntimeFlagsPatch.yaml | 0 .../annotations/effect__STM.yaml | 0 .../annotations/effect__Schedule.yaml | 0 .../annotations/effect__ScheduleDecision.yaml | 0 .../annotations/effect__ScheduleInterval.yaml | 0 .../effect__ScheduleIntervals.yaml | 0 .../annotations/effect__Scheduler.yaml | 0 .../annotations/effect__Schema.yaml | 0 .../annotations/effect__SchemaAST.yaml | 0 .../annotations/effect__Scope.yaml | 0 .../annotations/effect__ScopedCache.yaml | 0 .../annotations/effect__ScopedRef.yaml | 0 .../annotations/effect__Secret.yaml | 0 .../effect__SingleProducerAsyncInput.yaml | 0 .../annotations/effect__Sink.yaml | 0 .../annotations/effect__SortedMap.yaml | 0 .../annotations/effect__SortedSet.yaml | 0 .../annotations/effect__Stream.yaml | 0 .../annotations/effect__StreamEmit.yaml | 0 .../effect__StreamHaltStrategy.yaml | 0 .../annotations/effect__Streamable.yaml | 0 .../annotations/effect__Struct.yaml | 0 .../annotations/effect__Subscribable.yaml | 0 .../annotations/effect__SubscriptionRef.yaml | 0 .../annotations/effect__Supervisor.yaml | 0 .../annotations/effect__Symbol.yaml | 0 .../annotations/effect__SynchronizedRef.yaml | 0 .../annotations/effect__TArray.yaml | 0 .../annotations/effect__TDeferred.yaml | 0 .../annotations/effect__TMap.yaml | 0 .../annotations/effect__TPriorityQueue.yaml | 0 .../annotations/effect__TPubSub.yaml | 0 .../annotations/effect__TQueue.yaml | 0 .../annotations/effect__TRandom.yaml | 0 .../annotations/effect__TReentrantLock.yaml | 0 .../annotations/effect__TRef.yaml | 0 .../annotations/effect__TSemaphore.yaml | 0 .../annotations/effect__TSet.yaml | 0 .../annotations/effect__TSubscriptionRef.yaml | 0 .../annotations/effect__Take.yaml | 0 .../annotations/effect__TestAnnotation.yaml | 0 .../effect__TestAnnotationMap.yaml | 0 .../annotations/effect__TestAnnotations.yaml | 0 .../annotations/effect__TestClock.yaml | 0 .../annotations/effect__TestConfig.yaml | 0 .../annotations/effect__TestContext.yaml | 0 .../annotations/effect__TestLive.yaml | 0 .../annotations/effect__TestServices.yaml | 0 .../annotations/effect__TestSized.yaml | 0 .../annotations/effect__Tracer.yaml | 0 .../annotations/effect__Trie.yaml | 0 .../annotations/effect__Tuple.yaml | 0 .../annotations/effect__Types.yaml | 0 .../effect__UpstreamPullRequest.yaml | 0 .../effect__UpstreamPullStrategy.yaml | 0 .../annotations/effect__Utils.yaml | 0 .../effect__ai-amazon-bedrock.yaml | 0 ...i-amazon-bedrock__AmazonBedrockClient.yaml | 0 ...i-amazon-bedrock__AmazonBedrockConfig.yaml | 0 ...n-bedrock__AmazonBedrockLanguageModel.yaml | 0 ...i-amazon-bedrock__AmazonBedrockSchema.yaml | 0 ..._ai-amazon-bedrock__AmazonBedrockTool.yaml | 0 ...i-amazon-bedrock__EventStreamEncoding.yaml | 0 .../effect__ai-amazon-bedrock__index.yaml | 0 ...effect__ai-anthropic__AnthropicClient.yaml | 0 ...effect__ai-anthropic__AnthropicConfig.yaml | 0 ..._ai-anthropic__AnthropicLanguageModel.yaml | 0 ...ect__ai-anthropic__AnthropicTokenizer.yaml | 0 .../effect__ai-anthropic__AnthropicTool.yaml | 0 .../effect__ai-anthropic__Generated.yaml | 0 .../effect__ai-anthropic__index.yaml | 0 .../annotations/effect__ai-google.yaml | 0 .../effect__ai-google__Generated.yaml | 0 .../effect__ai-google__GoogleClient.yaml | 0 .../effect__ai-google__GoogleConfig.yaml | 0 ...ffect__ai-google__GoogleLanguageModel.yaml | 0 .../effect__ai-google__GoogleTool.yaml | 0 .../annotations/effect__ai-google__index.yaml | 0 .../effect__ai-openai__Generated.yaml | 0 .../effect__ai-openai__OpenAiClient.yaml | 0 .../effect__ai-openai__OpenAiConfig.yaml | 0 ...fect__ai-openai__OpenAiEmbeddingModel.yaml | 0 ...ffect__ai-openai__OpenAiLanguageModel.yaml | 0 .../effect__ai-openai__OpenAiTelemetry.yaml | 0 .../effect__ai-openai__OpenAiTokenizer.yaml | 0 .../annotations/effect__ai-openai__index.yaml | 0 .../effect__ai-openrouter__Generated.yaml | 0 ...fect__ai-openrouter__OpenRouterClient.yaml | 0 ...fect__ai-openrouter__OpenRouterConfig.yaml | 0 ...i-openrouter__OpenRouterLanguageModel.yaml | 0 .../effect__ai-openrouter__index.yaml | 0 .../annotations/effect__ai.yaml | 0 .../annotations/effect__ai__AiError.yaml | 0 .../annotations/effect__ai__Chat.yaml | 0 .../effect__ai__EmbeddingModel.yaml | 0 .../annotations/effect__ai__IdGenerator.yaml | 0 .../effect__ai__LanguageModel.yaml | 0 .../annotations/effect__ai__McpSchema.yaml | 0 .../annotations/effect__ai__McpServer.yaml | 0 .../annotations/effect__ai__Model.yaml | 0 .../annotations/effect__ai__Prompt.yaml | 0 .../annotations/effect__ai__Response.yaml | 0 .../annotations/effect__ai__Tool.yaml | 0 .../annotations/effect__ai__Toolkit.yaml | 0 .../annotations/effect__ai__index.yaml | 0 .../annotations/effect__cli.yaml | 0 .../annotations/effect__cli__Args.yaml | 0 .../annotations/effect__cli__AutoCorrect.yaml | 0 .../effect__cli__BuiltInOptions.yaml | 0 .../annotations/effect__cli__CliApp.yaml | 0 .../annotations/effect__cli__CliConfig.yaml | 0 .../annotations/effect__cli__Command.yaml | 0 .../effect__cli__CommandDescriptor.yaml | 0 .../effect__cli__CommandDirective.yaml | 0 .../annotations/effect__cli__ConfigFile.yaml | 0 .../annotations/effect__cli__HelpDoc.yaml | 0 .../effect__cli__HelpDoc__Span.yaml | 0 .../annotations/effect__cli__Options.yaml | 0 .../annotations/effect__cli__Primitive.yaml | 0 .../annotations/effect__cli__Prompt.yaml | 0 .../annotations/effect__cli__Usage.yaml | 0 .../effect__cli__ValidationError.yaml | 0 .../annotations/effect__cli__index.yaml | 0 .../annotations/effect__cluster.yaml | 0 .../effect__cluster__ClusterCron.yaml | 0 .../effect__cluster__ClusterError.yaml | 0 .../effect__cluster__ClusterSchema.yaml | 0 ...ffect__cluster__ClusterWorkflowEngine.yaml | 0 .../effect__cluster__DeliverAt.yaml | 0 .../annotations/effect__cluster__Entity.yaml | 0 .../effect__cluster__EntityAddress.yaml | 0 .../effect__cluster__EntityId.yaml | 0 .../effect__cluster__EntityProxy.yaml | 0 .../effect__cluster__EntityProxyServer.yaml | 0 .../effect__cluster__EntityResource.yaml | 0 .../effect__cluster__Envelope.yaml | 0 .../effect__cluster__HttpRunner.yaml | 0 .../effect__cluster__K8sHttpClient.yaml | 0 .../effect__cluster__MachineId.yaml | 0 .../annotations/effect__cluster__Message.yaml | 0 .../effect__cluster__MessageStorage.yaml | 0 .../annotations/effect__cluster__Reply.yaml | 0 .../annotations/effect__cluster__Runner.yaml | 0 .../effect__cluster__RunnerAddress.yaml | 0 .../effect__cluster__RunnerHealth.yaml | 0 .../effect__cluster__RunnerServer.yaml | 0 .../effect__cluster__RunnerStorage.yaml | 0 .../annotations/effect__cluster__Runners.yaml | 0 .../annotations/effect__cluster__ShardId.yaml | 0 .../effect__cluster__Sharding.yaml | 0 .../effect__cluster__ShardingConfig.yaml | 0 ...t__cluster__ShardingRegistrationEvent.yaml | 0 .../effect__cluster__SingleRunner.yaml | 0 .../effect__cluster__Singleton.yaml | 0 .../effect__cluster__SingletonAddress.yaml | 0 .../effect__cluster__Snowflake.yaml | 0 .../effect__cluster__SocketRunner.yaml | 0 .../effect__cluster__SqlMessageStorage.yaml | 0 .../effect__cluster__SqlRunnerStorage.yaml | 0 .../effect__cluster__TestRunner.yaml | 0 .../annotations/effect__cluster__index.yaml | 0 .../annotations/effect__experimental.yaml | 0 .../effect__experimental__DevTools.yaml | 0 ...ffect__experimental__DevTools__Client.yaml | 0 ...ffect__experimental__DevTools__Domain.yaml | 0 ...ffect__experimental__DevTools__Server.yaml | 0 .../effect__experimental__Event.yaml | 0 .../effect__experimental__EventGroup.yaml | 0 .../effect__experimental__EventJournal.yaml | 0 .../effect__experimental__EventLog.yaml | 0 .../effect__experimental__EventLogRemote.yaml | 0 .../effect__experimental__EventLogServer.yaml | 0 ...erimental__EventLogServer__Cloudflare.yaml | 0 .../effect__experimental__Machine.yaml | 0 ...ect__experimental__Machine__Procedure.yaml | 0 ..._experimental__Machine__ProcedureList.yaml | 0 ...l__Machine__SerializableProcedureList.yaml | 0 .../effect__experimental__PersistedCache.yaml | 0 .../effect__experimental__PersistedQueue.yaml | 0 ...__experimental__PersistedQueue__Redis.yaml | 0 .../effect__experimental__Persistence.yaml | 0 ...fect__experimental__Persistence__Lmdb.yaml | 0 ...ect__experimental__Persistence__Redis.yaml | 0 .../effect__experimental__RateLimiter.yaml | 0 ...ect__experimental__RateLimiter__Redis.yaml | 0 .../effect__experimental__Reactivity.yaml | 0 ...effect__experimental__RequestResolver.yaml | 0 .../effect__experimental__Sse.yaml | 0 .../effect__experimental__VariantSchema.yaml | 0 .../effect__experimental__index.yaml | 0 .../annotations/effect__index.yaml | 0 .../effect__opentelemetry__Logger.yaml | 0 .../effect__opentelemetry__Metrics.yaml | 0 .../effect__opentelemetry__NodeSdk.yaml | 0 .../effect__opentelemetry__Otlp.yaml | 0 .../effect__opentelemetry__OtlpLogger.yaml | 0 .../effect__opentelemetry__OtlpMetrics.yaml | 0 .../effect__opentelemetry__OtlpResource.yaml | 0 .../effect__opentelemetry__OtlpTracer.yaml | 0 .../effect__opentelemetry__Resource.yaml | 0 .../effect__opentelemetry__Tracer.yaml | 0 .../effect__opentelemetry__WebSdk.yaml | 0 .../effect__opentelemetry__index.yaml | 0 ...__platform-browser__BrowserHttpClient.yaml | 0 ...fect__platform-browser__BrowserWorker.yaml | 0 ...platform-browser__BrowserWorkerRunner.yaml | 0 .../effect__platform-browser__Clipboard.yaml | 0 ...effect__platform-browser__Geolocation.yaml | 0 ...effect__platform-browser__Permissions.yaml | 0 .../effect__platform-browser__index.yaml | 0 ...ect__platform-bun__BunCommandExecutor.yaml | 0 .../effect__platform-bun__BunContext.yaml | 0 ...orm-bun__BunFileSystem__ParcelWatcher.yaml | 0 ...effect__platform-bun__BunHttpPlatform.yaml | 0 .../effect__platform-bun__BunHttpServer.yaml | 0 ...t__platform-bun__BunHttpServerRequest.yaml | 0 ...ffect__platform-bun__BunKeyValueStore.yaml | 0 .../effect__platform-bun__BunSink.yaml | 0 .../effect__platform-bun__BunSocket.yaml | 0 ...effect__platform-bun__BunSocketServer.yaml | 0 .../effect__platform-bun__BunStream.yaml | 0 .../effect__platform-bun__BunWorker.yaml | 0 .../effect__platform-bun__index.yaml | 0 ...form-node-shared__NodeCommandExecutor.yaml | 0 ...shared__NodeFileSystem__ParcelWatcher.yaml | 0 ...atform-node-shared__NodeKeyValueStore.yaml | 0 ...__platform-node-shared__NodeMultipart.yaml | 0 ...ffect__platform-node-shared__NodeSink.yaml | 0 ...ect__platform-node-shared__NodeSocket.yaml | 0 ...ect__platform-node-shared__NodeStream.yaml | 0 ...t__platform-node__NodeCommandExecutor.yaml | 0 .../effect__platform-node__NodeContext.yaml | 0 ...m-node__NodeFileSystem__ParcelWatcher.yaml | 0 ...effect__platform-node__NodeHttpClient.yaml | 0 ...effect__platform-node__NodeHttpServer.yaml | 0 ...ect__platform-node__NodeKeyValueStore.yaml | 0 .../effect__platform-node__NodeWorker.yaml | 0 .../effect__platform-node__Undici.yaml | 0 .../effect__platform-node__index.yaml | 0 .../annotations/effect__platform.yaml | 0 .../effect__platform__ChannelSchema.yaml | 0 .../effect__platform__Command.yaml | 0 .../effect__platform__CommandExecutor.yaml | 0 .../effect__platform__Cookies.yaml | 0 .../effect__platform__Effectify.yaml | 0 .../annotations/effect__platform__Error.yaml | 0 .../annotations/effect__platform__Etag.yaml | 0 .../effect__platform__FetchHttpClient.yaml | 0 .../effect__platform__FileSystem.yaml | 0 .../effect__platform__Headers.yaml | 0 .../effect__platform__HttpApi.yaml | 0 .../effect__platform__HttpApiBuilder.yaml | 0 .../effect__platform__HttpApiClient.yaml | 0 .../effect__platform__HttpApiEndpoint.yaml | 0 .../effect__platform__HttpApiError.yaml | 0 .../effect__platform__HttpApiGroup.yaml | 0 .../effect__platform__HttpApiMiddleware.yaml | 0 .../effect__platform__HttpApiScalar.yaml | 0 .../effect__platform__HttpApiSchema.yaml | 0 .../effect__platform__HttpApiSecurity.yaml | 0 .../effect__platform__HttpApiSwagger.yaml | 0 .../effect__platform__HttpApp.yaml | 0 .../effect__platform__HttpBody.yaml | 0 .../effect__platform__HttpClient.yaml | 0 .../effect__platform__HttpClientError.yaml | 0 .../effect__platform__HttpClientRequest.yaml | 0 .../effect__platform__HttpClientResponse.yaml | 0 ...effect__platform__HttpIncomingMessage.yaml | 0 .../effect__platform__HttpLayerRouter.yaml | 0 .../effect__platform__HttpMethod.yaml | 0 .../effect__platform__HttpMiddleware.yaml | 0 .../effect__platform__HttpMultiplex.yaml | 0 .../effect__platform__HttpPlatform.yaml | 0 .../effect__platform__HttpRouter.yaml | 0 .../effect__platform__HttpServer.yaml | 0 .../effect__platform__HttpServerError.yaml | 0 .../effect__platform__HttpServerRequest.yaml | 0 ...fect__platform__HttpServerRespondable.yaml | 0 .../effect__platform__HttpServerResponse.yaml | 0 .../effect__platform__KeyValueStore.yaml | 0 .../effect__platform__MsgPack.yaml | 0 .../effect__platform__Multipart.yaml | 0 .../annotations/effect__platform__Ndjson.yaml | 0 .../effect__platform__OpenApi.yaml | 0 .../effect__platform__OpenApiJsonSchema.yaml | 0 .../annotations/effect__platform__Path.yaml | 0 ...ect__platform__PlatformConfigProvider.yaml | 0 .../effect__platform__PlatformLogger.yaml | 0 .../effect__platform__Runtime.yaml | 0 .../annotations/effect__platform__Socket.yaml | 0 .../effect__platform__SocketServer.yaml | 0 .../effect__platform__Template.yaml | 0 .../effect__platform__Terminal.yaml | 0 .../effect__platform__Transferable.yaml | 0 .../annotations/effect__platform__Url.yaml | 0 .../effect__platform__UrlParams.yaml | 0 .../annotations/effect__platform__Worker.yaml | 0 .../effect__platform__WorkerError.yaml | 0 .../effect__platform__WorkerRunner.yaml | 0 .../annotations/effect__platform__index.yaml | 0 .../annotations/effect__printer-ansi.yaml | 0 .../effect__printer-ansi__Ansi.yaml | 0 .../effect__printer-ansi__AnsiDoc.yaml | 0 .../effect__printer-ansi__Color.yaml | 0 .../effect__printer-ansi__index.yaml | 0 .../annotations/effect__printer.yaml | 0 .../annotations/effect__printer__Doc.yaml | 0 .../effect__printer__DocStream.yaml | 0 .../annotations/effect__printer__DocTree.yaml | 0 .../annotations/effect__printer__Flatten.yaml | 0 .../annotations/effect__printer__Layout.yaml | 0 .../effect__printer__Optimize.yaml | 0 .../effect__printer__PageWidth.yaml | 0 .../annotations/effect__printer__index.yaml | 0 .../annotations/effect__rpc.yaml | 0 .../annotations/effect__rpc__Rpc.yaml | 0 .../annotations/effect__rpc__RpcClient.yaml | 0 .../effect__rpc__RpcClientError.yaml | 0 .../annotations/effect__rpc__RpcGroup.yaml | 0 .../annotations/effect__rpc__RpcMessage.yaml | 0 .../effect__rpc__RpcMiddleware.yaml | 0 .../annotations/effect__rpc__RpcSchema.yaml | 0 .../effect__rpc__RpcSerialization.yaml | 0 .../annotations/effect__rpc__RpcServer.yaml | 0 .../annotations/effect__rpc__RpcTest.yaml | 0 .../annotations/effect__rpc__index.yaml | 0 ...ect__sql-clickhouse__ClickhouseClient.yaml | 0 ...t__sql-clickhouse__ClickhouseMigrator.yaml | 0 .../effect__sql-clickhouse__index.yaml | 0 .../annotations/effect__sql-d1__D1Client.yaml | 0 .../annotations/effect__sql-d1__index.yaml | 0 .../effect__sql-drizzle__Mysql.yaml | 0 .../annotations/effect__sql-drizzle__Pg.yaml | 0 .../effect__sql-drizzle__Sqlite.yaml | 0 .../effect__sql-kysely__Kysely.yaml | 0 .../effect__sql-kysely__Mssql.yaml | 0 .../effect__sql-kysely__Mysql.yaml | 0 .../annotations/effect__sql-kysely__Pg.yaml | 0 .../effect__sql-kysely__Sqlite.yaml | 0 .../effect__sql-kysely__patch.types.yaml | 0 .../effect__sql-libsql__index.yaml | 0 .../effect__sql-mssql__MssqlClient.yaml | 0 .../effect__sql-mssql__Parameter.yaml | 0 .../effect__sql-mssql__Procedure.yaml | 0 .../annotations/effect__sql-mssql__index.yaml | 0 .../effect__sql-mysql2__MysqlClient.yaml | 0 .../effect__sql-mysql2__index.yaml | 0 .../annotations/effect__sql-pg__PgClient.yaml | 0 .../annotations/effect__sql-pg__index.yaml | 0 .../effect__sql-sqlite-bun__SqliteClient.yaml | 0 .../effect__sql-sqlite-bun__index.yaml | 0 .../effect__sql-sqlite-do__SqliteClient.yaml | 0 .../effect__sql-sqlite-do__index.yaml | 0 ...effect__sql-sqlite-node__SqliteClient.yaml | 0 .../effect__sql-sqlite-node__index.yaml | 0 ...sql-sqlite-react-native__SqliteClient.yaml | 0 ...ffect__sql-sqlite-react-native__index.yaml | 0 ...effect__sql-sqlite-wasm__SqliteClient.yaml | 0 .../effect__sql-sqlite-wasm__index.yaml | 0 .../annotations/effect__sql.yaml | 0 .../annotations/effect__sql__Migrator.yaml | 0 .../effect__sql__Migrator__FileSystem.yaml | 0 .../annotations/effect__sql__Model.yaml | 0 .../annotations/effect__sql__SqlClient.yaml | 0 .../effect__sql__SqlConnection.yaml | 0 .../annotations/effect__sql__SqlError.yaml | 0 .../effect__sql__SqlEventJournal.yaml | 0 .../effect__sql__SqlEventLogServer.yaml | 0 .../effect__sql__SqlPersistedQueue.yaml | 0 .../annotations/effect__sql__SqlResolver.yaml | 0 .../annotations/effect__sql__SqlSchema.yaml | 0 .../annotations/effect__sql__Statement.yaml | 0 .../annotations/effect__sql__index.yaml | 0 .../annotations/effect__typeclass.yaml | 0 .../effect__typeclass__Alternative.yaml | 0 .../effect__typeclass__Applicative.yaml | 0 .../effect__typeclass__Bicovariant.yaml | 0 .../effect__typeclass__Bounded.yaml | 0 .../effect__typeclass__Chainable.yaml | 0 .../effect__typeclass__Contravariant.yaml | 0 .../effect__typeclass__Coproduct.yaml | 0 .../effect__typeclass__Covariant.yaml | 0 .../effect__typeclass__Filterable.yaml | 0 .../effect__typeclass__FlatMap.yaml | 0 .../effect__typeclass__Foldable.yaml | 0 .../effect__typeclass__Invariant.yaml | 0 .../annotations/effect__typeclass__Monad.yaml | 0 .../effect__typeclass__Monoid.yaml | 0 .../annotations/effect__typeclass__Of.yaml | 0 .../effect__typeclass__Pointed.yaml | 0 .../effect__typeclass__Product.yaml | 0 .../effect__typeclass__SemiAlternative.yaml | 0 .../effect__typeclass__SemiApplicative.yaml | 0 .../effect__typeclass__SemiCoproduct.yaml | 0 .../effect__typeclass__SemiProduct.yaml | 0 .../effect__typeclass__Semigroup.yaml | 0 .../effect__typeclass__Traversable.yaml | 0 ...ect__typeclass__TraversableFilterable.yaml | 0 .../effect__typeclass__data__Array.yaml | 0 .../effect__typeclass__data__BigInt.yaml | 0 .../effect__typeclass__data__Boolean.yaml | 0 .../effect__typeclass__data__Duration.yaml | 0 .../effect__typeclass__data__Effect.yaml | 0 .../effect__typeclass__data__Either.yaml | 0 .../effect__typeclass__data__Identity.yaml | 0 .../effect__typeclass__data__Micro.yaml | 0 .../effect__typeclass__data__Number.yaml | 0 .../effect__typeclass__data__Option.yaml | 0 .../effect__typeclass__data__Ordering.yaml | 0 .../effect__typeclass__data__Predicate.yaml | 0 .../effect__typeclass__data__Record.yaml | 0 .../effect__typeclass__data__String.yaml | 0 .../effect__typeclass__data__Tuple.yaml | 0 .../annotations/effect__typeclass__index.yaml | 0 .../annotations/effect__vitest__index.yaml | 0 .../annotations/effect__vitest__utils.yaml | 0 .../annotations/effect__workflow.yaml | 0 .../effect__workflow__Activity.yaml | 0 .../effect__workflow__DurableClock.yaml | 0 .../effect__workflow__DurableDeferred.yaml | 0 .../effect__workflow__DurableQueue.yaml | 0 .../effect__workflow__DurableRateLimiter.yaml | 0 .../effect__workflow__Workflow.yaml | 0 .../effect__workflow__WorkflowEngine.yaml | 0 .../effect__workflow__WorkflowProxy.yaml | 0 ...effect__workflow__WorkflowProxyServer.yaml | 0 .../effect/migration => migration}/cause.md | 0 .../migration => migration}/equality.md | 0 .../migration => migration}/error-handling.md | 0 .../fiber-keep-alive.md | 0 .../migration => migration}/fiberref.md | 0 .../effect/migration => migration}/forking.md | 0 .../migration => migration}/generators.md | 0 .../layer-memoization.md | 0 .../effect/migration => migration}/runtime.md | 0 .../effect/migration => migration}/schema.md | 0 .../effect/migration => migration}/scope.md | 0 .../migration => migration}/services.md | 0 .../migration => migration}/v3-to-v4.md | 0 .../migration => migration}/yieldable.md | 0 old.patch | 0 package.json | 144 +- .../ai/anthropic/CHANGELOG.md | 7 + .../ai/anthropic/README.md | 0 .../ai/anthropic/codegen.yml | 0 .../ai/anthropic/package.json | 2 +- .../ai/anthropic/src/AnthropicClient.ts | 0 .../ai/anthropic/src/AnthropicConfig.ts | 0 .../ai/anthropic/src/AnthropicError.ts | 0 .../anthropic/src/AnthropicLanguageModel.ts | 0 .../ai/anthropic/src/AnthropicTelemetry.ts | 0 .../ai/anthropic/src/AnthropicTool.ts | 0 .../ai/anthropic/src/Generated.ts | 0 .../ai/anthropic/src/index.ts | 0 .../ai/anthropic/src/internal/errors.ts | 0 .../ai/anthropic/src/internal/utilities.ts | 0 .../ai/anthropic/test/AnthropicClient.test.ts | 0 .../test/AnthropicLanguageModel.test.ts | 0 .../ai/anthropic/tsconfig.json | 0 .../typetest/AnthropicLanguageModel.tst.ts | 0 .../ai/openai-compat/CHANGELOG.md | 7 + .../ai/openai-compat/README.md | 0 .../ai/openai-compat/package.json | 2 +- .../ai/openai-compat/src/OpenAiClient.ts | 0 .../ai/openai-compat/src/OpenAiConfig.ts | 0 .../openai-compat/src/OpenAiEmbeddingModel.ts | 0 .../ai/openai-compat/src/OpenAiError.ts | 0 .../openai-compat/src/OpenAiLanguageModel.ts | 0 .../ai/openai-compat/src/OpenAiTelemetry.ts | 0 .../ai/openai-compat/src/index.ts | 0 .../ai/openai-compat/src/internal/errors.ts | 0 .../openai-compat/src/internal/utilities.ts | 0 .../openai-compat/test/OpenAiClient.test.ts | 0 .../test/OpenAiEmbeddingModel.test.ts | 0 .../test/OpenAiLanguageModel.test.ts | 0 .../ai/openai-compat/tsconfig.json | 0 .../typetest/OpenAiConfig.tst.ts | 0 .../ai/openai/CHANGELOG.md | 7 + .../packages => packages}/ai/openai/README.md | 0 .../ai/openai/codegen.yaml | 0 .../ai/openai/package.json | 2 +- .../ai/openai/src/Generated.ts | 0 .../ai/openai/src/OpenAiClient.ts | 0 .../ai/openai/src/OpenAiClientGenerated.ts | 0 .../ai/openai/src/OpenAiConfig.ts | 0 .../ai/openai/src/OpenAiEmbeddingModel.ts | 0 .../ai/openai/src/OpenAiError.ts | 0 .../ai/openai/src/OpenAiLanguageModel.ts | 0 .../ai/openai/src/OpenAiSchema.ts | 0 .../ai/openai/src/OpenAiTelemetry.ts | 0 .../ai/openai/src/OpenAiTool.ts | 0 .../ai/openai/src/index.ts | 0 .../ai/openai/src/internal/errors.ts | 0 .../ai/openai/src/internal/utilities.ts | 0 .../ai/openai/test/OpenAiClient.test.ts | 0 .../openai/test/OpenAiEmbeddingModel.test.ts | 0 .../openai/test/OpenAiLanguageModel.test.ts | 0 .../ai/openai/test/OpenAiSchema.test.ts | 0 .../ai/openai/tsconfig.json | 0 .../ai/openai/typetest/OpenAiTool.tst.ts | 0 .../ai/openrouter/CHANGELOG.md | 7 + .../ai/openrouter/README.md | 0 .../ai/openrouter/codegen.yml | 0 .../ai/openrouter/package.json | 2 +- .../ai/openrouter/src/Generated.ts | 0 .../ai/openrouter/src/OpenRouterClient.ts | 0 .../ai/openrouter/src/OpenRouterConfig.ts | 0 .../ai/openrouter/src/OpenRouterError.ts | 0 .../openrouter/src/OpenRouterLanguageModel.ts | 0 .../ai/openrouter/src/index.ts | 0 .../ai/openrouter/src/internal/errors.ts | 0 .../ai/openrouter/src/internal/utilities.ts | 0 .../ai/openrouter/test/Generated.test.ts | 0 .../openrouter/test/OpenRouterClient.test.ts | 0 .../test/OpenRouterLanguageModel.test.ts | 0 .../ai/openrouter/tsconfig.json | 0 .../atom/react/CHANGELOG.md | 7 + .../packages => packages}/atom/react/LICENSE | 0 .../atom/react/README.md | 0 .../atom/react/package.json | 2 +- .../atom/react/src/Hooks.ts | 0 .../atom/react/src/ReactHydration.ts | 0 .../atom/react/src/RegistryContext.ts | 0 .../atom/react/src/ScopedAtom.ts | 0 .../atom/react/src/index.ts | 0 .../atom/react/test/index.test.tsx | 0 .../atom/react/tsconfig.json | 0 .../atom/react/vitest.setup.ts | 0 .../atom/solid/CHANGELOG.md | 7 + .../packages => packages}/atom/solid/LICENSE | 0 .../atom/solid/README.md | 0 .../atom/solid/package.json | 2 +- .../atom/solid/src/Hooks.ts | 0 .../atom/solid/src/RegistryContext.ts | 0 .../atom/solid/src/index.ts | 0 .../atom/solid/test/index.test.tsx | 0 .../atom/solid/tsconfig.json | 0 .../atom/solid/vitest.setup.ts | 0 .../atom/vue/CHANGELOG.md | 7 + .../packages => packages}/atom/vue/LICENSE | 0 .../packages => packages}/atom/vue/README.md | 0 .../atom/vue/package.json | 2 +- .../atom/vue/src/index.ts | 0 .../atom/vue/test/index.test.ts | 0 .../atom/vue/tsconfig.json | 0 packages/cli/.gitignore | 0 packages/cli/.madgerc | 7 - packages/cli/.npmignore | 14 - packages/cli/CHANGELOG.md | 1628 -- packages/cli/bin.js | 2 - packages/cli/package.json | 108 - packages/cli/src/argv-patch.ts | 16 - packages/cli/src/extract.ts | 75 - packages/cli/src/gist.ts | 748 - packages/cli/src/index.ts | 903 - packages/cli/src/os-command.ts | 54 - packages/cli/src/shared.ts | 3 - packages/cli/src/sync-effect-app-subtree.ts | 307 - packages/cli/src/sync-effect-subtree.ts | 140 - packages/cli/src/sync-shared.ts | 349 - packages/cli/src/update-packages.ts | 4 - packages/cli/test.gists.yaml | 27 - packages/cli/test/argv-patch.test.ts | 198 - packages/cli/test/gist-cache.test.ts | 92 - packages/cli/test/update-packages.test.ts | 13 - packages/cli/tsconfig.json | 16 - packages/cli/vitest.config.ts | 5 - packages/e2e/CHANGELOG.md | 346 - packages/e2e/package.json | 34 - .../e2e/test/repoInvalidation.e2e.test.ts | 270 - packages/e2e/tsconfig.json | 28 - packages/e2e/vitest.config.ts | 13 - packages/effect-app/.madgerc | 7 - packages/effect-app/.npmignore | 14 - packages/effect-app/CHANGELOG.md | 9018 ------- packages/effect-app/package.json | 98 - packages/effect-app/src/Array.ts | 110 - packages/effect-app/src/Chunk.ts | 81 - packages/effect-app/src/Config.ts | 7 - packages/effect-app/src/Config/SecretURL.ts | 80 - .../src/Config/internal/configSecretURL.ts | 68 - packages/effect-app/src/ConfigProvider.ts | 5 - packages/effect-app/src/Context.ts | 181 - packages/effect-app/src/DataDependencies.ts | 171 - packages/effect-app/src/Effect.ts | 202 - packages/effect-app/src/Emailer.ts | 51 - packages/effect-app/src/Function.ts | 175 - packages/effect-app/src/Inputify.type.ts | 12 - packages/effect-app/src/Layer.ts | 69 - packages/effect-app/src/Model.ts | 5 - packages/effect-app/src/Model/Repository.ts | 7 - .../src/Model/Repository/Registry.ts | 35 - .../src/Model/Repository/dependency.ts | 32 - .../effect-app/src/Model/Repository/ext.ts | 374 - .../src/Model/Repository/internal/internal.ts | 950 - .../effect-app/src/Model/Repository/legacy.ts | 29 - .../src/Model/Repository/makeRepo.ts | 156 - .../src/Model/Repository/service.ts | 676 - .../src/Model/Repository/validation.ts | 31 - packages/effect-app/src/Model/dsl.ts | 129 - .../effect-app/src/Model/filter/filterApi.ts | 78 - packages/effect-app/src/Model/filter/types.ts | 6 - .../src/Model/filter/types/errors.ts | 47 - .../src/Model/filter/types/fields.ts | 50 - .../src/Model/filter/types/path/common.ts | 404 - .../src/Model/filter/types/path/eager.ts | 329 - .../src/Model/filter/types/path/index.ts | 4 - .../src/Model/filter/types/utils.ts | 128 - .../src/Model/filter/types/validator.ts | 46 - packages/effect-app/src/Model/query.ts | 13 - packages/effect-app/src/Model/query/dsl.ts | 3092 --- .../src/Model/query/new-kid-interpreter.ts | 532 - packages/effect-app/src/NonEmptySet.ts | 92 - packages/effect-app/src/Option.ts | 70 - packages/effect-app/src/Pure.ts | 450 - packages/effect-app/src/QueueMaker.ts | 11 - packages/effect-app/src/RequestContext.ts | 48 - .../src/RequestScopedDependencies.ts | 45 - packages/effect-app/src/Schema.ts | 499 - packages/effect-app/src/Schema/Class.ts | 683 - packages/effect-app/src/Schema/FastCheck.ts | 23 - packages/effect-app/src/Schema/Methods.ts | 8 - .../effect-app/src/Schema/SchemaParser.ts | 12 - .../src/Schema/SpecialJsonSchema.ts | 137 - .../effect-app/src/Schema/SpecialOpenApi.ts | 130 - packages/effect-app/src/Schema/brand.ts | 71 - packages/effect-app/src/Schema/email.ts | 26 - packages/effect-app/src/Schema/ext.ts | 680 - packages/effect-app/src/Schema/moreStrings.ts | 321 - packages/effect-app/src/Schema/numbers.ts | 152 - packages/effect-app/src/Schema/phoneNumber.ts | 26 - packages/effect-app/src/Schema/schema.ts | 5 - packages/effect-app/src/Schema/strings.ts | 69 - packages/effect-app/src/SchemaAST.ts | 1 - packages/effect-app/src/Set.ts | 665 - packages/effect-app/src/Store.ts | 280 - packages/effect-app/src/TypeTest.ts | 7 - packages/effect-app/src/Types.ts | 16 - packages/effect-app/src/Widen.type.ts | 26 - packages/effect-app/src/_ext/Array.ts | 36 - packages/effect-app/src/_ext/date.ts | 27 - packages/effect-app/src/_ext/misc.ts | 49 - packages/effect-app/src/_ext/ord.ext.ts | 40 - packages/effect-app/src/builtin-json.d.ts | 24 - packages/effect-app/src/builtin.ts | 53 - packages/effect-app/src/client.ts | 8 - .../effect-app/src/client/InvalidationKeys.ts | 55 - .../effect-app/src/client/apiClientFactory.ts | 464 - packages/effect-app/src/client/clientFor.ts | 186 - packages/effect-app/src/client/errors.ts | 310 - packages/effect-app/src/client/makeClient.ts | 629 - packages/effect-app/src/faker.ts | 32 - packages/effect-app/src/http.ts | 1 - packages/effect-app/src/http/Request.ts | 42 - packages/effect-app/src/http/internal/lib.ts | 13 - packages/effect-app/src/ids.ts | 55 - packages/effect-app/src/index.ts | 27 - packages/effect-app/src/logger.ts | 3 - packages/effect-app/src/middleware.ts | 28 - packages/effect-app/src/rpc.ts | 4 - packages/effect-app/src/rpc/Invalidation.ts | 278 - .../effect-app/src/rpc/MiddlewareMaker.ts | 492 - packages/effect-app/src/rpc/README.md | 41 - packages/effect-app/src/rpc/RpcContextMap.ts | 156 - packages/effect-app/src/rpc/RpcMiddleware.ts | 244 - packages/effect-app/src/runtime.ts | 57 - packages/effect-app/src/setupRequest.ts | 138 - packages/effect-app/src/toast.ts | 54 - packages/effect-app/src/transform.ts | 80 - packages/effect-app/src/utils.ts | 901 - packages/effect-app/src/utils/effectify.ts | 260 - packages/effect-app/src/utils/extend.ts | 9 - packages/effect-app/src/utils/gen.ts | 24 - packages/effect-app/src/utils/logLevel.ts | 17 - packages/effect-app/src/utils/logger.ts | 36 - packages/effect-app/src/validation.ts | 18 - .../effect-app/src/validation/validators.ts | 31 - packages/effect-app/src/withToast.ts | 133 - packages/effect-app/test/moreStrings.test.ts | 15 - packages/effect-app/test/rpc.test.ts | 62 - .../test/rpcMiddlewareContext.test.ts | 63 - packages/effect-app/test/schema.test.ts | 681 - packages/effect-app/test/secretURL.test.ts | 160 - packages/effect-app/test/special.test.ts | 1261 - packages/effect-app/test/utils.test.ts | 209 - packages/effect-app/tsconfig.base.json | 61 - packages/effect-app/tsconfig.json | 12 - packages/effect-app/tsconfig.src.json | 31 - packages/effect-app/tsconfig.test.json | 33 - packages/effect-app/vitest.config.ts | 5 - .../effect/ARBITRARY-FOLLOW-UPS.md | 0 .../effect/ARBITRARY-MIGRATION.md | 0 .../packages => packages}/effect/ARBITRARY.md | 0 .../packages => packages}/effect/CHANGELOG.md | 10 + .../packages => packages}/effect/CONFIG.md | 0 .../packages => packages}/effect/HTTPAPI.md | 0 .../packages => packages}/effect/LICENSE | 0 .../packages => packages}/effect/MCP.md | 0 .../packages => packages}/effect/OPTIC.md | 0 .../packages => packages}/effect/README.md | 0 .../packages => packages}/effect/SCHEMA.md | 0 .../effect/benchmark/Pool.ts | 0 .../effect/benchmark/http/multipart.ts | 0 .../benchmark/http/serverAllocations.ts | 0 .../effect/benchmark/http/tracer.ts | 0 .../benchmark/httpapi/sseClientDecoder.ts | 0 .../effect/benchmark/rpc/RpcSerialization.ts | 0 .../effect/benchmark/schema/Optic.ts | 0 .../effect/benchmark/schema/SchemaBinary.md | 0 .../effect/benchmark/schema/SchemaBinary.ts | 0 .../effect/benchmark/schema/SchemaError.ts | 0 .../effect/benchmark/stream/splitLines.ts | 0 .../packages => packages}/effect/package.json | 4 +- .../effect/runtimeperf/README.md | 0 .../effect/runtimeperf/compare.mts | 0 .../effect/runtimeperf/config.json | 56 + .../effect/runtimeperf/materialize.mts | 0 .../effect/runtimeperf/run.mts | 0 .../effect/runtimeperf/stats.mts | 0 .../arbitrary/fixtures/fast-check-v4.ts | 0 .../suites/arbitrary/fixtures/native.ts | 0 .../suites/arbitrary/fixtures/schema.ts | 0 .../suites/schema-benchmarks/fixtures/data.ts | 0 .../schema-benchmarks/fixtures/effect-beta.ts | 0 .../schema-benchmarks/fixtures/valibot.ts | 0 .../suites/schema-benchmarks/fixtures/zod.ts | 0 .../suites/schema/fixtures/adapters.ts | 5 + .../suites/schema/fixtures/behavior.ts | 0 .../suites/schema/fixtures/cold.ts | 55 + .../suites/schema/fixtures/comparison.ts | 0 .../runtimeperf/test/materialize.test.mts | 0 .../effect/runtimeperf/test/registry.test.mts | 0 .../effect/runtimeperf/test/stats.test.mts | 0 .../effect/runtimeperf/test/worker.test.mts | 0 .../effect/runtimeperf/utils.mts | 0 .../effect/runtimeperf/worker.mts | 0 .../packages => packages}/effect/src/Array.ts | 0 .../effect/src/BigDecimal.ts | 0 .../effect/src/BigInt.ts | 0 .../effect/src/Boolean.ts | 0 .../packages => packages}/effect/src/Brand.ts | 0 .../effect/src/ByteSize.ts | 0 .../packages => packages}/effect/src/Cache.ts | 0 .../packages => packages}/effect/src/Cause.ts | 0 .../effect/src/Channel.ts | 0 .../effect/src/ChannelSchema.ts | 0 .../packages => packages}/effect/src/Chunk.ts | 0 .../packages => packages}/effect/src/Clock.ts | 0 .../effect/src/Combiner.ts | 0 .../effect/src/Config.ts | 0 .../effect/src/ConfigProvider.ts | 0 .../effect/src/Console.ts | 0 .../effect/src/Context.ts | 0 .../packages => packages}/effect/src/Cron.ts | 0 .../effect/src/Crypto.ts | 0 .../packages => packages}/effect/src/Data.ts | 0 .../effect/src/DateTime.ts | 0 .../effect/src/Deferred.ts | 0 .../effect/src/Differ.ts | 0 .../effect/src/Duration.ts | 0 .../effect/src/Effect.ts | 0 .../effect/src/Effectable.ts | 0 .../effect/src/Encoding.ts | 0 .../packages => packages}/effect/src/Equal.ts | 0 .../effect/src/Equivalence.ts | 0 .../effect/src/ErrorReporter.ts | 0 .../effect/src/ExecutionPlan.ts | 0 .../packages => packages}/effect/src/Exit.ts | 0 .../packages => packages}/effect/src/Fiber.ts | 0 .../effect/src/FiberHandle.ts | 0 .../effect/src/FiberMap.ts | 0 .../effect/src/FiberSet.ts | 0 .../effect/src/FileSystem.ts | 0 .../effect/src/Filter.ts | 0 .../effect/src/Formatter.ts | 0 .../effect/src/Function.ts | 0 .../packages => packages}/effect/src/Graph.ts | 0 .../packages => packages}/effect/src/HKT.ts | 0 .../packages => packages}/effect/src/Hash.ts | 0 .../effect/src/HashMap.ts | 0 .../effect/src/HashRing.ts | 0 .../effect/src/HashSet.ts | 0 .../effect/src/Inspectable.ts | 0 .../effect/src/Iterable.ts | 0 .../effect/src/JsonPatch.ts | 0 .../effect/src/JsonPointer.ts | 0 .../effect/src/JsonSchema.ts | 0 .../packages => packages}/effect/src/Latch.ts | 0 .../packages => packages}/effect/src/Layer.ts | 0 .../effect/src/LayerMap.ts | 0 .../effect/src/LayerRef.ts | 0 .../effect/src/LogLevel.ts | 0 .../effect/src/Logger.ts | 0 .../effect/src/ManagedRuntime.ts | 0 .../packages => packages}/effect/src/Match.ts | 0 .../effect/src/Metric.ts | 0 .../effect/src/MutableHashMap.ts | 0 .../effect/src/MutableHashSet.ts | 0 .../effect/src/MutableList.ts | 0 .../effect/src/MutableRef.ts | 0 .../effect/src/Newtype.ts | 0 .../effect/src/NonEmptyIterable.ts | 0 .../effect/src/Number.ts | 0 .../packages => packages}/effect/src/Optic.ts | 0 .../effect/src/Option.ts | 0 .../packages => packages}/effect/src/Order.ts | 0 .../effect/src/Ordering.ts | 0 .../effect/src/PartitionedSemaphore.ts | 0 .../packages => packages}/effect/src/Path.ts | 0 .../effect/src/Pipeable.ts | 0 .../effect/src/PlatformError.ts | 0 .../packages => packages}/effect/src/Pool.ts | 0 .../effect/src/Predicate.ts | 0 .../effect/src/PrimaryKey.ts | 0 .../effect/src/PubSub.ts | 0 .../packages => packages}/effect/src/Pull.ts | 0 .../packages => packages}/effect/src/Queue.ts | 0 .../effect/src/Random.ts | 0 .../packages => packages}/effect/src/RcMap.ts | 0 .../packages => packages}/effect/src/RcRef.ts | 0 .../effect/src/Record.ts | 0 .../effect/src/Redactable.ts | 0 .../effect/src/Redacted.ts | 0 .../effect/src/Reducer.ts | 0 .../packages => packages}/effect/src/Ref.ts | 0 .../effect/src/References.ts | 0 .../effect/src/RegExp.ts | 0 .../effect/src/Request.ts | 0 .../effect/src/RequestResolver.ts | 0 .../effect/src/Resource.ts | 0 .../effect/src/Result.ts | 0 .../effect/src/Runtime.ts | 0 .../effect/src/Schedule.ts | 0 .../effect/src/Scheduler.ts | 0 .../effect/src/Schema.ts | 0 .../effect/src/SchemaAST.ts | 73 +- .../effect/src/SchemaGetter.ts | 0 .../effect/src/SchemaIssue.ts | 0 .../effect/src/SchemaParser.ts | 5 +- .../effect/src/SchemaRepresentation.ts | 0 .../effect/src/SchemaTransformation.ts | 0 .../packages => packages}/effect/src/Scope.ts | 0 .../effect/src/ScopedCache.ts | 0 .../effect/src/ScopedRef.ts | 0 .../effect/src/Semaphore.ts | 0 .../packages => packages}/effect/src/Sink.ts | 0 .../effect/src/StandardSchema.ts | 0 .../packages => packages}/effect/src/Stdio.ts | 0 .../effect/src/Stream.ts | 0 .../effect/src/String.ts | 0 .../effect/src/Struct.ts | 0 .../effect/src/SubscriptionRef.ts | 0 .../effect/src/Symbol.ts | 0 .../effect/src/SynchronizedRef.ts | 0 .../packages => packages}/effect/src/Take.ts | 0 .../effect/src/Terminal.ts | 0 .../effect/src/Tracer.ts | 0 .../packages => packages}/effect/src/Trie.ts | 0 .../packages => packages}/effect/src/Tuple.ts | 0 .../effect/src/TxChunk.ts | 0 .../effect/src/TxDeferred.ts | 0 .../effect/src/TxHashMap.ts | 0 .../effect/src/TxHashSet.ts | 0 .../effect/src/TxPriorityQueue.ts | 0 .../effect/src/TxPubSub.ts | 0 .../effect/src/TxQueue.ts | 0 .../effect/src/TxReentrantLock.ts | 0 .../packages => packages}/effect/src/TxRef.ts | 0 .../effect/src/TxSemaphore.ts | 0 .../effect/src/TxSubscriptionRef.ts | 0 .../packages => packages}/effect/src/Types.ts | 0 .../effect/src/UndefinedOr.ts | 0 .../packages => packages}/effect/src/Unify.ts | 0 .../packages => packages}/effect/src/Utils.ts | 0 .../packages => packages}/effect/src/index.ts | 0 .../effect/src/internal/arbitrary/model.ts | 0 .../effect/src/internal/arbitrary/regexp.ts | 0 .../effect/src/internal/arbitrary/runner.ts | 0 .../effect/src/internal/arbitrary/schema.ts | 0 .../effect/src/internal/array.ts | 0 .../effect/src/internal/core.ts | 0 .../effect/src/internal/count.ts | 0 .../effect/src/internal/dateTime.ts | 0 .../effect/src/internal/doNotation.ts | 0 .../effect/src/internal/effect.ts | 0 .../effect/src/internal/equal.ts | 0 .../effect/src/internal/errors.ts | 0 .../effect/src/internal/executionPlan.ts | 0 .../effect/src/internal/graph.ts | 0 .../effect/src/internal/graphCsr.ts | 0 .../effect/src/internal/hashMap.ts | 0 .../effect/src/internal/hashSet.ts | 0 .../effect/src/internal/layer.ts | 0 .../effect/src/internal/matcher.ts | 0 .../effect/src/internal/metric.ts | 0 .../effect/src/internal/option.ts | 0 .../effect/src/internal/persistence.ts | 0 .../effect/src/internal/random.ts | 0 .../effect/src/internal/rcRef.ts | 0 .../effect/src/internal/record.ts | 0 .../effect/src/internal/redacted.ts | 0 .../effect/src/internal/references.ts | 0 .../effect/src/internal/request.ts | 0 .../effect/src/internal/result.ts | 0 .../effect/src/internal/schedule.ts | 0 .../effect/src/internal/schema/annotations.ts | 0 .../effect/src/internal/schema/cause.ts | 0 .../internal/schema/fromJsonSchemaDocument.ts | 0 .../src/internal/schema/fromRepresentation.ts | 0 .../effect/src/internal/schema/make.ts | 13 +- .../effect/src/internal/schema/parser.ts | 0 .../src/internal/schema/standardSchema.ts | 0 .../src/internal/schema/toCodeDocument.ts | 0 .../effect/src/internal/schema/toCodec.ts | 0 .../src/internal/schema/toDifferJsonPatch.ts | 0 .../src/internal/schema/toEncoderXml.ts | 0 .../src/internal/schema/toEquivalence.ts | 4 +- .../effect/src/internal/schema/toFormatter.ts | 4 +- .../effect/src/internal/schema/toIso.ts | 0 .../internal/schema/toJsonSchemaDocument.ts | 0 .../src/internal/schema/toRepresentation.ts | 0 .../effect/src/internal/schemaError.ts | 0 .../effect/src/internal/stackTraceLimit.ts | 0 .../effect/src/internal/stream.ts | 0 .../effect/src/internal/tracer.ts | 0 .../effect/src/internal/trie.ts | 0 .../effect/src/internal/uuid.ts | 0 .../effect/src/testing/TestClock.ts | 0 .../effect/src/testing/TestConsole.ts | 0 .../effect/src/testing/TestSchema.ts | 0 .../effect/src/testing/index.ts | 0 .../effect/src/unstable/ai/AiError.ts | 0 .../unstable/ai/AnthropicStructuredOutput.ts | 0 .../effect/src/unstable/ai/Chat.ts | 0 .../effect/src/unstable/ai/EmbeddingModel.ts | 0 .../effect/src/unstable/ai/IdGenerator.ts | 0 .../effect/src/unstable/ai/LanguageModel.ts | 0 .../effect/src/unstable/ai/McpProtocol.ts | 0 .../effect/src/unstable/ai/McpSchema.ts | 0 .../effect/src/unstable/ai/McpServer.ts | 0 .../effect/src/unstable/ai/Model.ts | 0 .../src/unstable/ai/OpenAiStructuredOutput.ts | 0 .../effect/src/unstable/ai/Prompt.ts | 0 .../effect/src/unstable/ai/Response.ts | 0 .../src/unstable/ai/ResponseIdTracker.ts | 0 .../effect/src/unstable/ai/Telemetry.ts | 0 .../effect/src/unstable/ai/Tokenizer.ts | 0 .../effect/src/unstable/ai/Tool.ts | 0 .../effect/src/unstable/ai/Toolkit.ts | 0 .../effect/src/unstable/ai/index.ts | 0 .../unstable/ai/internal/codec-transformer.ts | 0 .../src/unstable/ai/internal/mcpCore.ts | 0 .../src/unstable/ai/internal/mcpProtocol.ts | 0 .../ai/internal/mcpProtocol/v2024_11_05.ts | 0 .../ai/internal/mcpProtocol/v2025_03_26.ts | 0 .../ai/internal/mcpProtocol/v2025_06_18.ts | 0 .../ai/internal/mcpProtocol/v2025_11_25.ts | 0 .../ai/internal/mcpProtocolRegistry.ts | 0 .../ai/internal/mcpSchema/v2024_11_05.ts | 0 .../ai/internal/mcpSchema/v2025_03_26.ts | 0 .../ai/internal/mcpSchema/v2025_06_18.ts | 0 .../ai/internal/mcpSchema/v2025_11_25.ts | 0 .../unstable/ai/internal/structured-output.ts | 0 .../src/unstable/arbitrary/Arbitrary.ts | 0 .../effect/src/unstable/arbitrary/index.ts | 0 .../effect/src/unstable/cli/Argument.ts | 0 .../effect/src/unstable/cli/CliConfig.ts | 0 .../effect/src/unstable/cli/CliError.ts | 0 .../effect/src/unstable/cli/CliOutput.ts | 0 .../effect/src/unstable/cli/Command.ts | 0 .../effect/src/unstable/cli/Completions.ts | 0 .../effect/src/unstable/cli/Flag.ts | 0 .../effect/src/unstable/cli/GlobalFlag.ts | 0 .../effect/src/unstable/cli/HelpDoc.ts | 0 .../effect/src/unstable/cli/Param.ts | 0 .../effect/src/unstable/cli/Primitive.ts | 0 .../effect/src/unstable/cli/Prompt.ts | 0 .../effect/src/unstable/cli/index.ts | 0 .../effect/src/unstable/cli/internal/ansi.ts | 0 .../src/unstable/cli/internal/auto-suggest.ts | 0 .../src/unstable/cli/internal/command.ts | 0 .../unstable/cli/internal/completions/bash.ts | 0 .../cli/internal/completions/descriptor.ts | 0 .../unstable/cli/internal/completions/fish.ts | 0 .../unstable/cli/internal/completions/zsh.ts | 0 .../src/unstable/cli/internal/config.ts | 0 .../effect/src/unstable/cli/internal/help.ts | 0 .../effect/src/unstable/cli/internal/lexer.ts | 0 .../src/unstable/cli/internal/parser.ts | 0 .../src/unstable/cli/internal/wizard.ts | 0 .../src/unstable/cluster/ClusterCron.ts | 0 .../src/unstable/cluster/ClusterError.ts | 0 .../src/unstable/cluster/ClusterMetrics.ts | 0 .../src/unstable/cluster/ClusterSchema.ts | 0 .../unstable/cluster/ClusterWorkflowEngine.ts | 0 .../effect/src/unstable/cluster/DeliverAt.ts | 0 .../effect/src/unstable/cluster/Entity.ts | 0 .../src/unstable/cluster/EntityAddress.ts | 0 .../effect/src/unstable/cluster/EntityId.ts | 0 .../src/unstable/cluster/EntityProxy.ts | 0 .../src/unstable/cluster/EntityProxyServer.ts | 0 .../src/unstable/cluster/EntityResource.ts | 0 .../effect/src/unstable/cluster/EntityType.ts | 0 .../effect/src/unstable/cluster/Envelope.ts | 0 .../effect/src/unstable/cluster/HttpRunner.ts | 0 .../src/unstable/cluster/K8sHttpClient.ts | 0 .../effect/src/unstable/cluster/K8sTypes.ts | 0 .../effect/src/unstable/cluster/MachineId.ts | 0 .../effect/src/unstable/cluster/Message.ts | 0 .../src/unstable/cluster/MessageStorage.ts | 0 .../effect/src/unstable/cluster/Reply.ts | 0 .../effect/src/unstable/cluster/Runner.ts | 0 .../src/unstable/cluster/RunnerAddress.ts | 0 .../src/unstable/cluster/RunnerHealth.ts | 0 .../src/unstable/cluster/RunnerServer.ts | 0 .../src/unstable/cluster/RunnerStorage.ts | 0 .../effect/src/unstable/cluster/Runners.ts | 0 .../effect/src/unstable/cluster/ShardId.ts | 0 .../effect/src/unstable/cluster/Sharding.ts | 0 .../src/unstable/cluster/ShardingConfig.ts | 0 .../cluster/ShardingRegistrationEvent.ts | 0 .../src/unstable/cluster/SingleRunner.ts | 0 .../effect/src/unstable/cluster/Singleton.ts | 0 .../src/unstable/cluster/SingletonAddress.ts | 0 .../effect/src/unstable/cluster/Snowflake.ts | 0 .../src/unstable/cluster/SocketRunner.ts | 0 .../src/unstable/cluster/SqlMessageStorage.ts | 0 .../src/unstable/cluster/SqlRunnerStorage.ts | 0 .../effect/src/unstable/cluster/TestRunner.ts | 0 .../effect/src/unstable/cluster/index.ts | 0 .../cluster/internal/clusterAbandon.ts | 0 .../cluster/internal/entityManager.ts | 0 .../unstable/cluster/internal/entityReaper.ts | 0 .../src/unstable/cluster/internal/hash.ts | 0 .../unstable/cluster/internal/interruptors.ts | 0 .../unstable/cluster/internal/resourceMap.ts | 0 .../unstable/cluster/internal/resourceRef.ts | 0 .../unstable/cluster/internal/shardLock.ts | 0 .../effect/src/unstable/devtools/DevTools.ts | 0 .../src/unstable/devtools/DevToolsClient.ts | 0 .../src/unstable/devtools/DevToolsSchema.ts | 0 .../src/unstable/devtools/DevToolsServer.ts | 0 .../effect/src/unstable/devtools/index.ts | 0 .../effect/src/unstable/encoding/Ini.ts | 0 .../effect/src/unstable/encoding/Ndjson.ts | 0 .../src/unstable/encoding/SchemaBinary.ts | 0 .../effect/src/unstable/encoding/Sse.ts | 0 .../effect/src/unstable/encoding/Toml.ts | 0 .../effect/src/unstable/encoding/Yaml.ts | 0 .../effect/src/unstable/encoding/index.ts | 0 .../effect/src/unstable/eventlog/Event.ts | 0 .../src/unstable/eventlog/EventGroup.ts | 0 .../src/unstable/eventlog/EventJournal.ts | 0 .../effect/src/unstable/eventlog/EventLog.ts | 0 .../unstable/eventlog/EventLogEncryption.ts | 0 .../src/unstable/eventlog/EventLogMessage.ts | 0 .../src/unstable/eventlog/EventLogRemote.ts | 0 .../src/unstable/eventlog/EventLogServer.ts | 0 .../eventlog/EventLogServerEncrypted.ts | 0 .../eventlog/EventLogServerUnencrypted.ts | 0 .../unstable/eventlog/EventLogSessionAuth.ts | 0 .../src/unstable/eventlog/SqlEventJournal.ts | 0 .../eventlog/SqlEventLogServerEncrypted.ts | 0 .../eventlog/SqlEventLogServerUnencrypted.ts | 0 .../effect/src/unstable/eventlog/index.ts | 0 .../internal/identityRootSecretDerivation.ts | 0 .../effect/src/unstable/http/Cookies.ts | 0 .../effect/src/unstable/http/Etag.ts | 0 .../src/unstable/http/FetchHttpClient.ts | 0 .../effect/src/unstable/http/FindMyWay.ts | 0 .../http/FindMyWay/internal/queryString.ts | 0 .../http/FindMyWay/internal/router.ts | 0 .../effect/src/unstable/http/Headers.ts | 0 .../effect/src/unstable/http/HttpBody.ts | 0 .../effect/src/unstable/http/HttpClient.ts | 0 .../src/unstable/http/HttpClientError.ts | 0 .../src/unstable/http/HttpClientRequest.ts | 0 .../src/unstable/http/HttpClientResponse.ts | 0 .../effect/src/unstable/http/HttpEffect.ts | 7 +- .../src/unstable/http/HttpIncomingMessage.ts | 0 .../effect/src/unstable/http/HttpMethod.ts | 0 .../src/unstable/http/HttpMiddleware.ts | 0 .../effect/src/unstable/http/HttpPlatform.ts | 0 .../effect/src/unstable/http/HttpRouter.ts | 0 .../effect/src/unstable/http/HttpServer.ts | 0 .../src/unstable/http/HttpServerError.ts | 0 .../src/unstable/http/HttpServerRequest.ts | 0 .../unstable/http/HttpServerRespondable.ts | 0 .../src/unstable/http/HttpServerResponse.ts | 26 +- .../src/unstable/http/HttpStaticServer.ts | 0 .../effect/src/unstable/http/HttpStatus.ts | 0 .../src/unstable/http/HttpTraceContext.ts | 0 .../effect/src/unstable/http/Mime.ts | 0 .../effect/src/unstable/http/Multipart.ts | 0 .../src/unstable/http/MultipartParser.ts | 0 .../http/MultipartParser/HeadersParser.ts | 0 .../unstable/http/MultipartParser/Search.ts | 0 .../MultipartParser/internal/contentType.ts | 0 .../http/MultipartParser/internal/headers.ts | 0 .../MultipartParser/internal/multipart.ts | 0 .../http/MultipartParser/internal/search.ts | 0 .../effect/src/unstable/http/Template.ts | 0 .../effect/src/unstable/http/Url.ts | 0 .../effect/src/unstable/http/UrlParams.ts | 0 .../effect/src/unstable/http/index.ts | 0 .../src/unstable/http/internal/compression.ts | 0 .../src/unstable/http/internal/headers.ts | 0 .../src/unstable/http/internal/httpBody.ts | 0 .../src/unstable/http/internal/mimeTypes.ts | 0 .../http/internal/preResponseHandler.ts | 0 .../effect/src/unstable/httpapi/HttpApi.ts | 0 .../src/unstable/httpapi/HttpApiBuilder.ts | 0 .../src/unstable/httpapi/HttpApiClient.ts | 0 .../src/unstable/httpapi/HttpApiEndpoint.ts | 0 .../src/unstable/httpapi/HttpApiError.ts | 0 .../src/unstable/httpapi/HttpApiGroup.ts | 0 .../src/unstable/httpapi/HttpApiMiddleware.ts | 0 .../src/unstable/httpapi/HttpApiScalar.ts | 0 .../src/unstable/httpapi/HttpApiSchema.ts | 0 .../src/unstable/httpapi/HttpApiSecurity.ts | 0 .../src/unstable/httpapi/HttpApiSwagger.ts | 0 .../src/unstable/httpapi/HttpApiTest.ts | 0 .../effect/src/unstable/httpapi/OpenApi.ts | 0 .../effect/src/unstable/httpapi/index.ts | 0 .../src/unstable/httpapi/internal/html.ts | 0 .../httpapi/internal/httpApiScalar.ts | 0 .../httpapi/internal/httpApiSwagger.ts | 0 .../unstable/httpapi/internal/mediaType.ts | 0 .../effect/src/unstable/net/IpInterface.ts | 0 .../effect/src/unstable/net/IpNetwork.ts | 0 .../effect/src/unstable/net/NetAddress.ts | 0 .../effect/src/unstable/net/index.ts | 0 .../effect/src/unstable/observability/Otlp.ts | 0 .../unstable/observability/OtlpExporter.ts | 0 .../src/unstable/observability/OtlpLogger.ts | 0 .../src/unstable/observability/OtlpMetrics.ts | 0 .../unstable/observability/OtlpResource.ts | 0 .../observability/OtlpSerialization.ts | 0 .../src/unstable/observability/OtlpTracer.ts | 0 .../observability/PrometheusMetrics.ts | 0 .../src/unstable/observability/index.ts | 0 .../observability/internal/otlpEnv.ts | 0 .../observability/internal/otlpProtobuf.ts | 0 .../observability/internal/protobuf.ts | 0 .../src/unstable/persistence/KeyValueStore.ts | 0 .../src/unstable/persistence/Persistable.ts | 0 .../unstable/persistence/PersistedCache.ts | 0 .../unstable/persistence/PersistedQueue.ts | 0 .../src/unstable/persistence/Persistence.ts | 22 +- .../src/unstable/persistence/RateLimiter.ts | 0 .../effect/src/unstable/persistence/Redis.ts | 0 .../effect/src/unstable/persistence/index.ts | 0 .../src/unstable/process/ChildProcess.ts | 0 .../unstable/process/ChildProcessSpawner.ts | 0 .../effect/src/unstable/process/index.ts | 0 .../src/unstable/reactivity/AsyncResult.ts | 0 .../effect/src/unstable/reactivity/Atom.ts | 0 .../src/unstable/reactivity/AtomHttpApi.ts | 0 .../effect/src/unstable/reactivity/AtomRef.ts | 0 .../src/unstable/reactivity/AtomRegistry.ts | 0 .../effect/src/unstable/reactivity/AtomRpc.ts | 0 .../src/unstable/reactivity/Hydration.ts | 0 .../src/unstable/reactivity/Reactivity.ts | 0 .../effect/src/unstable/reactivity/index.ts | 0 .../effect/src/unstable/rpc/Rpc.ts | 0 .../effect/src/unstable/rpc/RpcClient.ts | 0 .../effect/src/unstable/rpc/RpcClientError.ts | 0 .../effect/src/unstable/rpc/RpcGroup.ts | 0 .../effect/src/unstable/rpc/RpcMessage.ts | 0 .../effect/src/unstable/rpc/RpcMiddleware.ts | 0 .../effect/src/unstable/rpc/RpcSchema.ts | 0 .../src/unstable/rpc/RpcSerialization.ts | 0 .../effect/src/unstable/rpc/RpcServer.ts | 0 .../effect/src/unstable/rpc/RpcTest.ts | 0 .../effect/src/unstable/rpc/RpcWorker.ts | 0 .../effect/src/unstable/rpc/Utils.ts | 0 .../effect/src/unstable/rpc/index.ts | 0 .../effect/src/unstable/schema/Model.ts | 0 .../src/unstable/schema/VariantSchema.ts | 0 .../effect/src/unstable/schema/index.ts | 0 .../effect/src/unstable/socket/Socket.ts | 0 .../src/unstable/socket/SocketServer.ts | 0 .../effect/src/unstable/socket/index.ts | 0 .../effect/src/unstable/sql/Migrator.ts | 0 .../effect/src/unstable/sql/SqlClient.ts | 0 .../effect/src/unstable/sql/SqlConnection.ts | 0 .../effect/src/unstable/sql/SqlError.ts | 0 .../effect/src/unstable/sql/SqlModel.ts | 0 .../effect/src/unstable/sql/SqlResolver.ts | 0 .../effect/src/unstable/sql/SqlSchema.ts | 0 .../effect/src/unstable/sql/SqlStream.ts | 0 .../effect/src/unstable/sql/Statement.ts | 0 .../effect/src/unstable/sql/index.ts | 0 .../src/unstable/workers/Transferable.ts | 0 .../effect/src/unstable/workers/Worker.ts | 0 .../src/unstable/workers/WorkerError.ts | 0 .../src/unstable/workers/WorkerRunner.ts | 0 .../effect/src/unstable/workers/index.ts | 0 .../effect/src/unstable/workflow/Activity.ts | 0 .../src/unstable/workflow/DurableClock.ts | 0 .../src/unstable/workflow/DurableDeferred.ts | 0 .../src/unstable/workflow/DurableQueue.ts | 0 .../effect/src/unstable/workflow/Workflow.ts | 0 .../src/unstable/workflow/WorkflowEngine.ts | 0 .../src/unstable/workflow/WorkflowProxy.ts | 0 .../unstable/workflow/WorkflowProxyServer.ts | 0 .../effect/src/unstable/workflow/index.ts | 0 .../src/unstable/workflow/internal/crypto.ts | 0 .../effect/test/Array.test.ts | 0 .../effect/test/ArrayNaNIndex.test.ts | 0 .../effect/test/AtomRef.test.ts | 0 .../effect/test/BigDecimal.test.ts | 0 .../effect/test/BigInt.test.ts | 0 .../effect/test/Boolean.test.ts | 0 .../effect/test/Brand.test.ts | 0 .../effect/test/ByteSize.test.ts | 0 .../effect/test/Cache.test.ts | 0 .../effect/test/Cause.test.ts | 0 .../effect/test/CauseMapAnnotations.test.ts | 0 .../effect/test/Channel.test.ts | 0 .../effect/test/Chunk.test.ts | 0 .../effect/test/Clock.test.ts | 0 .../effect/test/Combiner.test.ts | 0 .../effect/test/Config.test.ts | 0 .../effect/test/ConfigProvider.test.ts | 0 .../effect/test/Context.test.ts | 0 .../effect/test/Cron.test.ts | 0 .../effect/test/Crypto.test.ts | 0 .../effect/test/Data.test.ts | 0 .../effect/test/DateTime.test.ts | 0 .../effect/test/Deferred.test.ts | 0 .../effect/test/Duration.test.ts | 0 .../effect/test/Effect.test.ts | 0 .../effect/test/EffectEager.test.ts | 0 .../effect/test/EffectKeepAlive.test.ts | 0 .../effect/test/Effectable.test.ts | 0 .../effect/test/Encoding.test.ts | 0 .../effect/test/Equal.test.ts | 0 .../effect/test/Equivalence.test.ts | 0 .../effect/test/ExecutionPlan.test.ts | 0 .../effect/test/Exit.test.ts | 0 .../effect/test/Fiber.test.ts | 0 .../effect/test/FiberHandle.test.ts | 0 .../effect/test/FiberMap.test.ts | 0 .../effect/test/FiberSet.test.ts | 0 .../test/FiberSetRuntimePropagation.test.ts | 0 .../effect/test/FileSystem.test-utils.ts | 0 .../effect/test/Formatter.test.ts | 0 .../effect/test/Function.test.ts | 0 .../effect/test/Graph.test.ts | 0 .../effect/test/HashMap.test.ts | 0 .../effect/test/HashRing.test.ts | 0 .../effect/test/HashSet.test.ts | 0 .../effect/test/HttpClient.test.ts | 0 .../effect/test/Iterable.test.ts | 0 .../effect/test/JsonPatch.test.ts | 0 .../effect/test/JsonPointer.test.ts | 0 .../effect/test/JsonSchema.test.ts | 0 .../effect/test/Latch.test.ts | 0 .../effect/test/Layer.test.ts | 0 .../effect/test/LayerMap.test.ts | 0 .../effect/test/LayerRef.test.ts | 0 .../effect/test/LogLevel.test.ts | 0 .../effect/test/Logger.test.ts | 0 .../effect/test/ManagedRuntime.test.ts | 0 .../effect/test/Match.test.ts | 0 .../effect/test/Metric.test.ts | 0 .../effect/test/Migrator.test.ts | 0 .../effect/test/MutableHashMap.test.ts | 0 .../effect/test/MutableHashSet.test.ts | 0 .../effect/test/MutableList.test.ts | 0 .../effect/test/Newtype.test.ts | 0 .../effect/test/Number.test.ts | 0 .../effect/test/Optic.test.ts | 0 .../effect/test/Option.test.ts | 0 .../effect/test/Order.test.ts | 0 .../effect/test/Ordering.test.ts | 0 .../effect/test/PartitionedSemaphore.test.ts | 0 .../effect/test/Pathfinding.test.ts | 0 .../effect/test/Pool.test.ts | 0 .../effect/test/Predicate.test.ts | 0 .../effect/test/PubSub.test.ts | 0 .../effect/test/Pull.test.ts | 0 .../effect/test/Queue.test.ts | 0 .../effect/test/Random.test.ts | 0 .../effect/test/RcMap.test.ts | 0 .../effect/test/RcRef.test.ts | 0 .../effect/test/Record.test.ts | 0 .../effect/test/Redacted.test.ts | 0 .../effect/test/Reducer.test.ts | 0 .../effect/test/Ref.test.ts | 0 .../effect/test/Request.test.ts | 0 .../effect/test/Resource.test.ts | 0 .../effect/test/Result.test.ts | 0 .../effect/test/Schedule.test.ts | 0 .../effect/test/Scheduler.test.ts | 0 .../effect/test/Scope.test.ts | 0 .../effect/test/ScopedCache.test.ts | 0 .../effect/test/ScopedRef.test.ts | 0 .../effect/test/Semaphore.test.ts | 0 .../effect/test/Sink.test.ts | 0 .../effect/test/StackCapture.test.ts | 0 .../effect/test/StackTraceLimit.test.ts | 0 .../effect/test/Stdio.test.ts | 0 .../effect/test/Stream.test.ts | 0 .../effect/test/String.test.ts | 0 .../effect/test/Struct.test.ts | 0 .../effect/test/SubscriptionRef.test.ts | 0 .../effect/test/Symbol.test.ts | 0 .../SynchronizedRef.modifySomeEffect.test.ts | 0 .../effect/test/SynchronizedRef.test.ts | 0 .../effect/test/TestClock.test.ts | 0 .../effect/test/Tracer.test.ts | 0 .../effect/test/Trie.test.ts | 0 .../effect/test/Tuple.test.ts | 0 .../effect/test/TxChunk.test.ts | 0 .../effect/test/TxDeferred.test.ts | 0 .../effect/test/TxHashMap.test.ts | 0 .../effect/test/TxHashSet.test.ts | 0 .../effect/test/TxPriorityQueue.test.ts | 0 .../effect/test/TxPubSub.test.ts | 0 .../effect/test/TxQueue.test.ts | 0 .../effect/test/TxReentrantLock.test.ts | 0 .../effect/test/TxSemaphore.test.ts | 0 .../effect/test/TxSubscriptionRef.test.ts | 0 .../effect/test/UndefinedOr.test.ts | 0 .../cluster/ClusterWorkflowEngine.test.ts | 0 .../effect/test/cluster/Entity.test.ts | 0 .../effect/test/cluster/Envelope.test.ts | 0 .../effect/test/cluster/K8sHttpClient.test.ts | 0 .../test/cluster/MessageStorage.test.ts | 0 .../effect/test/cluster/ResourceMap.test.ts | 0 .../effect/test/cluster/ResourceRef.test.ts | 0 .../effect/test/cluster/RunnerServer.test.ts | 0 .../effect/test/cluster/RunnerStorage.test.ts | 0 .../effect/test/cluster/Runners.test.ts | 0 .../effect/test/cluster/Sharding.test.ts | 0 .../test/cluster/ShardingConfig.test.ts | 0 .../effect/test/cluster/TestEntity.ts | 0 .../effect/test/cluster/interruptors.test.ts | 0 .../test/fixtures/migrator/0001_first.js | 0 .../effect/test/fixtures/text.txt | 0 .../effect/test/internal/Uuid.test.ts | 0 .../test/reactivity/AsyncResult.test.ts | 0 .../effect/test/reactivity/Atom.test.ts | 0 .../test/reactivity/AtomHttpApi.test.ts | 0 .../effect/test/reactivity/AtomRpc.test.ts | 0 .../effect/test/rpc/Rpc.test.ts | 0 .../effect/test/rpc/RpcClient.test.ts | 0 .../effect/test/rpc/RpcSerialization.test.ts | 0 .../effect/test/rpc/RpcServer.test.ts | 0 .../effect/test/schema/Graph.test.ts | 0 .../effect/test/schema/HMR.test.ts | 0 .../effect/test/schema/Schema.test.ts | 27 + .../effect/test/schema/SchemaAST.test.ts | 34 + .../effect/test/schema/SchemaGetter.test.ts | 0 .../effect/test/schema/SchemaIssue.test.ts | 0 .../effect/test/schema/SchemaParser.test.ts | 27 + .../test/schema/SchemaTransformation.test.ts | 0 .../test/schema/TemplateLiteral.test.ts | 0 .../effect/test/schema/fixtures/HMR-Class.ts | 0 .../test/schema/fixtures/HMR-sanity-check.ts | 0 .../test/schema/jsonSchemaRoundTrip.test.ts | 0 .../representation/builtInRevivers.test.ts | 0 .../schema/representation/fromJson.test.ts | 0 .../fromJsonMultiDocument.test.ts | 0 .../fromJsonSchemaDocument.test.ts | 0 .../fromJsonSchemaMultiDocument.test.ts | 0 .../representation/fromRepresentation.test.ts | 0 .../fromRepresentations.test.ts | 0 .../schema/representation/makeCode.test.ts | 0 .../schemaToJsonSchemaDocument.test.ts | 0 .../stringTreeRoundtrip.test.ts | 0 .../toCodeDocument.annotations.test.ts | 0 .../representation/toCodeDocument.test.ts | 0 .../test/schema/representation/toJson.test.ts | 0 .../toJsonMultiDocument.test.ts | 0 .../toJsonSchemaDocument.test.ts | 0 .../toJsonSchemaMultiDocument.test.ts | 0 .../representation/toMultiDocument.test.ts | 0 .../representation/toRepresentation.test.ts | 0 .../representation/toRepresentations.test.ts | 0 .../effect/test/schema/toCodec.test.ts | 0 .../test/schema/toDifferJsonPatch.test.ts | 0 .../effect/test/schema/toEquivalence.test.ts | 0 .../effect/test/schema/toFormatter.test.ts | 0 .../effect/test/schema/toIso.test.ts | 0 .../test/schema/toJsonSchemaDocument.test.ts | 0 .../schema/toStandardJSONSchemaV1.test.ts | 0 .../test/schema/toStandardSchemaV1.test.ts | 0 .../effect/test/schema/v3-v4.test.ts | 0 .../effect/test/testing/TestSchema.test.ts | 0 .../effect/test/unstable/ai/AiError.test.ts | 0 .../ai/AnthropicStructuredOutput.test.ts | 0 ...opicStructuredOutputRepresentation.test.ts | 0 .../effect/test/unstable/ai/Chat.test.ts | 0 .../test/unstable/ai/EmbeddingModel.test.ts | 0 .../test/unstable/ai/LanguageModel.test.ts | 0 .../ai/LanguageModelRepresentation.test.ts | 0 .../ai/LanguageModelTrackerLifecycle.test.ts | 0 .../effect/test/unstable/ai/McpSchema.test.ts | 0 .../McpConformance/BaseProtocolTest.ts | 0 .../McpConformance/CompletionTest.ts | 0 .../McpConformance/ElicitationTest.ts | 0 .../McpServer/McpConformance/LifecycleTest.ts | 0 .../McpServer/McpConformance/LoggingTest.ts | 0 .../McpConformance/McpConformance.ts | 0 .../McpConformance/McpConformanceFixtures.ts | 0 .../McpServer/McpConformance/McpTestPeer.ts | 0 .../McpServer/McpConformance/PromptsTest.ts | 0 .../McpServer/McpConformance/ResourcesTest.ts | 0 .../ai/McpServer/McpConformance/RootsTest.ts | 0 .../McpServer/McpConformance/SamplingTest.ts | 0 .../ai/McpServer/McpConformance/ToolsTest.ts | 0 .../McpConformance/TransportsTest.ts | 0 .../McpServer/McpConformance/UtilitiesTest.ts | 0 .../unstable/ai/McpServer/McpProtocol.test.ts | 0 .../unstable/ai/McpServer/McpServer.test.ts | 0 .../ai/McpServer/ProtocolAdapters.test.ts | 0 .../ai/McpServer/TestUtils/McpHttpHarness.ts | 0 .../ai/McpServer/TestUtils/McpServerLayer.ts | 0 .../ai/McpServer/TestUtils/McpStdioHarness.ts | 0 .../unstable/ai/McpServer/v2024_11_05.test.ts | 0 .../unstable/ai/McpServer/v2025_03_26.test.ts | 0 .../unstable/ai/McpServer/v2025_06_18.test.ts | 0 .../unstable/ai/McpServer/v2025_11_25.test.ts | 0 .../effect/test/unstable/ai/Model.test.ts | 0 .../ai/OpenAiStructuredOutput.test.ts | 0 ...enAiStructuredOutputRepresentation.test.ts | 0 .../effect/test/unstable/ai/Prompt.test.ts | 0 .../effect/test/unstable/ai/Response.test.ts | 0 .../unstable/ai/ResponseIdTracker.test.ts | 0 .../effect/test/unstable/ai/Tokenizer.test.ts | 0 .../effect/test/unstable/ai/Tool.test.ts | 0 .../unstable/ai/ToolRepresentation.test.ts | 0 .../effect/test/unstable/ai/utils.ts | 0 .../test/unstable/arbitrary/Arbitrary.test.ts | 0 .../effect/test/unstable/cli/Ansi.test.ts | 0 .../test/unstable/cli/Arguments.test.ts | 0 .../effect/test/unstable/cli/Command.test.ts | 0 .../effect/test/unstable/cli/Errors.test.ts | 0 .../effect/test/unstable/cli/Help.test.ts | 0 .../effect/test/unstable/cli/Lexer.test.ts | 0 .../effect/test/unstable/cli/LogLevel.test.ts | 0 .../effect/test/unstable/cli/Param.test.ts | 0 .../test/unstable/cli/Primitive.test.ts | 0 .../effect/test/unstable/cli/Prompt.test.ts | 0 .../cli/completions/completions.test.ts | 0 .../cli/completions/descriptor.test.ts | 0 .../unstable/cli/fixtures/ComprehensiveCli.ts | 0 .../unstable/cli/services/MockTerminal.ts | 0 .../test/unstable/cli/services/TestActions.ts | 0 .../unstable/devtools/DevToolsClient.test.ts | 0 .../effect/test/unstable/encoding/Ini.test.ts | 0 .../test/unstable/encoding/Ndjson.test.ts | 0 .../unstable/encoding/SchemaBinary.test.ts | 0 .../effect/test/unstable/encoding/Sse.test.ts | 0 .../test/unstable/encoding/Toml.test.ts | 0 .../test/unstable/encoding/Yaml.test.ts | 0 .../unstable/eventlog/EventJournal.test.ts | 0 .../test/unstable/eventlog/EventLog.test.ts | 0 .../EventLogIdentityDerivation.test.ts | 0 .../unstable/eventlog/EventLogMessage.test.ts | 0 .../unstable/eventlog/EventLogRemote.test.ts | 0 .../EventLogServerUnencrypted.test.ts | 0 .../eventlog/EventLogSessionAuth.test.ts | 0 ...SqlEventLogServerUnencryptedStorageTest.ts | 0 .../effect/test/unstable/http/Cookies.test.ts | 0 .../unstable/http/FetchHttpClient.test.ts | 0 .../http/FindMyWay/case-insensitive.test.ts | 0 .../http/FindMyWay/matching-order.test.ts | 0 .../unstable/http/FindMyWay/methods.test.ts | 0 .../http/FindMyWay/optional-params.test.ts | 0 .../http/FindMyWay/params-collisions.test.ts | 0 .../http/FindMyWay/path-params-match.test.ts | 0 .../http/FindMyWay/querystring.test.ts | 0 .../unstable/http/FindMyWay/regex.test.ts | 0 .../effect/test/unstable/http/Headers.test.ts | 0 .../test/unstable/http/HttpBody.test.ts | 0 .../test/unstable/http/HttpClient.test.ts | 0 .../unstable/http/HttpClientRequest.test.ts | 0 .../unstable/http/HttpCompression.test.ts | 0 .../test/unstable/http/HttpEffect.test.ts | 26 + .../test/unstable/http/HttpMiddleware.test.ts | 0 .../test/unstable/http/HttpPlatform.test.ts | 0 .../test/unstable/http/HttpRouter.test.ts | 0 .../test/unstable/http/HttpServer.test.ts | 0 .../unstable/http/HttpServerError.test.ts | 0 .../unstable/http/HttpServerRequest.test.ts | 0 .../http/HttpServerRespondable.test.ts | 0 .../unstable/http/HttpServerResponse.test.ts | 55 + .../unstable/http/HttpStaticServer.test.ts | 0 .../test/unstable/http/HttpStatus.test.ts | 0 .../effect/test/unstable/http/Mime.test.ts | 0 .../test/unstable/http/Multipart.test.ts | 0 .../http/SchemaRepresentation.test.ts | 0 .../test/unstable/http/Template.test.ts | 0 .../effect/test/unstable/http/Url.test.ts | 0 .../test/unstable/http/UrlParams.test.ts | 0 .../test/unstable/httpapi/HttpApi.test.ts | 0 .../unstable/httpapi/HttpApiBuilder.test.ts | 0 .../unstable/httpapi/HttpApiClient.test.ts | 0 .../httpapi/HttpApiDocumentation.test.ts | 0 .../unstable/httpapi/HttpApiEndpoint.test.ts | 0 .../unstable/httpapi/HttpApiSchema.test.ts | 0 .../unstable/httpapi/HttpApiSecurity.test.ts | 0 .../test/unstable/httpapi/OpenApi.test.ts | 0 .../httpapi/OpenApiRepresentation.test.ts | 0 .../test/unstable/net/IpInterface.test.ts | 0 .../test/unstable/net/IpNetwork.test.ts | 0 .../test/unstable/net/NetAddress.test.ts | 0 .../unstable/observability/OtlpConfig.test.ts | 0 .../observability/OtlpEnvHeaders.test.ts | 0 .../observability/OtlpExporter.test.ts | 0 .../observability/OtlpMetrics.test.ts | 0 .../observability/OtlpResource.test.ts | 0 .../observability/OtlpSerialization.test.ts | 0 .../observability/PrometheusMetrics.test.ts | 0 .../persistence/KeyValueStore.test.ts | 0 .../unstable/persistence/KeyValueStoreTest.ts | 0 .../persistence/PersistedCache.test.ts | 0 .../persistence/PersistedCacheTest.ts | 0 .../persistence/PersistedQueue.test.ts | 0 .../persistence/PersistedQueueTest.ts | 0 .../unstable/persistence/RateLimiter.test.ts | 0 .../unstable/persistence/RateLimiterTest.ts | 0 .../test/unstable/persistence/Redis.test.ts | 0 .../unstable/persistence/SqlCleanupTest.ts | 0 .../unstable/process/ChildProcess.test.ts | 0 .../process/ChildProcessSpawnerTest.ts | 0 .../process/fixtures/bash/no-permissions.sh | 0 .../fixtures/bash/parent-exits-early.sh | 0 .../process/fixtures/bash/spawn-children.sh | 0 .../unstable/process/fixtures/config/SHOUTING | 0 .../unstable/process/fixtures/config/integer | 0 .../process/fixtures/config/nested/config | 0 .../unstable/process/fixtures/config/secret | 0 .../unstable/schema/VariantSchema.test.ts | 0 .../test/unstable/socket/Socket.test.ts | 0 .../test/unstable/sql/SqlClient.test.ts | 0 .../effect/test/unstable/sql/SqlError.test.ts | 0 .../test/unstable/sql/SqlResolver.test.ts | 0 .../test/unstable/sql/SqlSchema.test.ts | 0 .../test/unstable/sql/Statement.test.ts | 0 .../test/unstable/workers/Worker.test.ts | 0 .../test/unstable/workers/WorkerError.test.ts | 0 .../unstable/workflow/DurableQueue.test.ts | 0 .../test/unstable/workflow/Workflow.test.ts | 0 .../unstable/workflow/WorkflowEngine.test.ts | 0 .../effect/test/utils/assert.ts | 0 .../effect/test/utils/chunkCoordination.ts | 0 .../effect/test/utils/counter.ts | 0 .../effect/tsconfig.json | 0 .../effect/typeperf/README.md | 0 .../effect/typeperf/compare.mjs | 0 .../effect/typeperf/compare/httpapi.mjs | 0 .../effect/typeperf/config.json | 0 .../effect/typeperf/run.mjs | 0 .../typeperf/suites/httpapi/baseline.ts | 0 .../fixtures/_endpoint-selection-types.ts | 0 .../httpapi/fixtures/_grouped-api-500.ts | 0 .../httpapi/fixtures/_grouped-api-types.ts | 0 .../fixtures/builder-endpoint-count-500.ts | 0 .../fixtures/builder-handle-all-count-500.ts | 0 ...uilder-handle-all-two-batches-count-500.ts | 0 .../fixtures/builder-handlers-count-100.ts | 0 .../builder-raw-handlers-count-100.ts | 0 .../fixtures/client-endpoint-count-500.ts | 0 .../fixtures/client-group-count-500.ts | 0 .../fixtures/client-groups-100x5-count-500.ts | 0 .../fixtures/client-methods-count-500.ts | 0 .../fixtures/client-top-level-count-500.ts | 0 .../fixtures/endpoint-class-count-500.ts | 0 .../httpapi/fixtures/endpoint-count-500.ts | 0 .../fixtures/group-endpoints-count-500.ts | 0 .../httpapi/fixtures/url-builder-count-500.ts | 0 .../url-builder-top-level-count-500.ts | 0 .../typeperf/suites/httpapi/thresholds.json | 0 .../effect/typeperf/suites/schema/baseline.ts | 0 .../typeperf/suites/schema/fixtures/array.ts | 0 .../typeperf/suites/schema/fixtures/brand.ts | 0 .../schema/fixtures/decode-unknown-effect.ts | 0 .../schema/fixtures/encode-unknown-effect.ts | 0 .../typeperf/suites/schema/fixtures/exit.ts | 0 .../suites/schema/fixtures/non-empty-array.ts | 0 .../typeperf/suites/schema/fixtures/record.ts | 0 .../suites/schema/fixtures/struct-mixed.ts | 0 .../schema/fixtures/struct-mutable-only.ts | 0 .../schema/fixtures/struct-optional-only.ts | 0 .../suites/schema/fixtures/struct-required.ts | 0 .../schema/fixtures/struct-with-rest.ts | 0 .../suites/schema/fixtures/tagged-union.ts | 0 .../fixtures/to-codec-array-from-single.ts | 0 .../suites/schema/fixtures/to-codec-json.ts | 0 .../schema/fixtures/to-codec-string-tree.ts | 0 .../suites/schema/fixtures/to-encoded.ts | 0 .../fixtures/to-standard-json-schema.ts | 0 .../suites/schema/fixtures/to-type.ts | 0 .../suites/schema/fixtures/tuple-with-rest.ts | 0 .../typeperf/suites/schema/fixtures/tuple.ts | 0 .../typeperf/suites/schema/fixtures/union.ts | 0 .../typeperf/suites/schema/thresholds.json | 0 .../effect/typetest/AiError.tst.ts | 0 .../effect/typetest/Array.tst.ts | 0 .../effect/typetest/Brand.tst.ts | 0 .../effect/typetest/ByteSize.tst.ts | 0 .../effect/typetest/Channel.tst.ts | 0 .../effect/typetest/ChannelSchema.tst.ts | 0 .../effect/typetest/Clock.tst.ts | 0 .../effect/typetest/Config.tst.ts | 0 .../effect/typetest/ConfigProvider.tst.ts | 0 .../effect/typetest/Context.tst.ts | 0 .../effect/typetest/Data.tst.ts | 0 .../effect/typetest/Effect.tst.ts | 0 .../effect/typetest/Effectable.tst.ts | 0 .../effect/typetest/Equivalence.tst.ts | 0 .../effect/typetest/Fiber.tst.ts | 0 .../effect/typetest/FileSystem.tst.ts | 0 .../effect/typetest/Function.tst.ts | 0 .../effect/typetest/Graph.tst.ts | 0 .../effect/typetest/Iterable.tst.ts | 0 .../effect/typetest/Layer.tst.ts | 0 .../effect/typetest/Match.tst.ts | 0 .../effect/typetest/Newtype.tst.ts | 0 .../effect/typetest/Optic.tst.ts | 0 .../effect/typetest/Option.tst.ts | 0 .../effect/typetest/Order.tst.ts | 0 .../effect/typetest/Predicate.tst.ts | 0 .../effect/typetest/Random.tst.ts | 0 .../effect/typetest/Record.tst.ts | 0 .../effect/typetest/Result.tst.ts | 0 .../effect/typetest/Schedule.tst.ts | 0 .../effect/typetest/Sink.tst.ts | 0 .../effect/typetest/Stream.tst.ts | 0 .../effect/typetest/Struct.tst.ts | 0 .../effect/typetest/SynchronizedRef.tst.ts | 0 .../effect/typetest/TestSchema.tst.ts | 0 .../effect/typetest/Tuple.tst.ts | 0 .../effect/typetest/Types.tst.ts | 0 .../effect/typetest/VariantSchema.tst.ts | 0 .../effect/typetest/schema/Array.tst.ts | 0 .../typetest/schema/FromJsonSchema.tst.ts | 0 .../effect/typetest/schema/Graph.tst.ts | 0 .../effect/typetest/schema/Literals.tst.ts | 0 .../effect/typetest/schema/Record.tst.ts | 0 .../effect/typetest/schema/Schema.tst.ts | 0 .../schema/SchemaBuiltInRevivers.tst.ts | 0 .../schema/SchemaJsonSchemaConsumer.tst.ts | 0 .../schema/SchemaRepresentation.tst.ts | 0 .../SchemaRepresentationCompilers.tst.ts | 0 .../schema/SchemaRepresentationReviver.tst.ts | 0 .../effect/typetest/schema/Struct.tst.ts | 0 .../effect/typetest/schema/Tuple.tst.ts | 0 .../effect/typetest/schema/Union.tst.ts | 0 .../effect/typetest/schema/api.tst.ts | 0 .../effect/typetest/schema/options.tst.ts | 0 .../effect/typetest/schema/toIso.tst.ts | 0 .../typetest/unstable/ai/LanguageModel.tst.ts | 0 .../typetest/unstable/ai/McpServer.tst.ts | 0 .../typetest/unstable/ai/Response.tst.ts | 0 .../effect/typetest/unstable/ai/Tool.tst.ts | 0 .../unstable/arbitrary/Arbitrary.tst.ts | 0 .../typetest/unstable/cli/Command.tst.ts | 0 .../effect/typetest/unstable/cli/Param.tst.ts | 0 .../typetest/unstable/cli/Prompt.tst.ts | 0 .../unstable/cluster/EntityProxyServer.tst.ts | 0 .../unstable/cluster/K8sHttpClient.tst.ts | 0 .../typetest/unstable/cluster/Reply.tst.ts | 0 .../typetest/unstable/encoding/Ndjson.tst.ts | 0 .../typetest/unstable/http/HttpClient.tst.ts | 0 .../unstable/http/HttpPlatform.tst.ts | 0 .../typetest/unstable/http/HttpRouter.tst.ts | 0 .../typetest/unstable/httpapi/HttpApi.tst.ts | 0 .../unstable/httpapi/HttpApiBuilder.tst.ts | 0 .../unstable/httpapi/HttpApiClient.tst.ts | 0 .../unstable/httpapi/HttpApiEndpoint.tst.ts | 0 .../unstable/httpapi/HttpApiGroup.tst.ts | 0 .../unstable/httpapi/HttpApiMiddleware.tst.ts | 0 .../unstable/httpapi/HttpApiSchema.tst.ts | 0 .../httpapi/OpenApiRepresentation.tst.ts | 0 .../typetest/unstable/net/IpInterface.tst.ts | 0 .../typetest/unstable/net/IpNetwork.tst.ts | 0 .../typetest/unstable/net/NetAddress.tst.ts | 0 .../unstable/reactivity/AsyncResult.tst.ts | 0 .../typetest/unstable/reactivity/Atom.tst.ts | 0 .../unstable/reactivity/AtomHttpApi.tst.ts | 0 .../unstable/reactivity/AtomRpc.tst.ts | 0 .../effect/typetest/unstable/rpc/Rpc.tst.ts | 0 .../typetest/unstable/rpc/RpcGroup.tst.ts | 0 .../unstable/rpc/RpcMiddleware.tst.ts | 0 .../typetest/unstable/rpc/RpcServer.tst.ts | 0 .../typetest/unstable/socket/Socket.tst.ts | 0 .../typetest/unstable/sql/SqlSchema.tst.ts | 0 .../unstable/workflow/Workflow.tst.ts | 0 packages/eslint-codegen-model/CHANGELOG.md | 1354 - .../examples/model-facades.ts | 318 - .../examples/workflow-facades.ts | 184 - packages/eslint-codegen-model/index.js | 3 - packages/eslint-codegen-model/package.json | 75 - packages/eslint-codegen-model/src/cli.ts | 638 - packages/eslint-codegen-model/src/index.ts | 4 - .../eslint-codegen-model/src/js-yaml.d.ts | 3 - .../eslint-codegen-model/src/normalise.ts | 38 - .../eslint-codegen-model/src/oxlint/index.ts | 8 - .../src/oxlint/rules/codegen.ts | 142 - .../src/presets/barrel.ts | 219 - .../eslint-codegen-model/src/presets/index.ts | 6 - .../eslint-codegen-model/src/presets/meta.ts | 48 - .../src/presets/model-facade.ts | 48 - .../eslint-codegen-model/src/presets/model.ts | 194 - .../src/shared/codegen-block.ts | 101 - .../src/shared/native-type-resolver.ts | 110 - .../src/shared/type-resolver.ts | 631 - packages/eslint-codegen-model/tsconfig.json | 14 - packages/eslint-shared-config/CHANGELOG.md | 535 - packages/eslint-shared-config/package.json | 59 - .../eslint-shared-config/src/dprint.jsonc | 36 - .../src/eslint.base.config.mjs | 114 - .../src/eslint.vue.config.mjs | 79 - .../eslint-shared-config/src/oxlintrc.json | 136 - .../src/plugin-effect-app.mjs | 91 - .../test/no-await-effect.test.mts | 204 - .../eslint-shared-config/vitest.config.ts | 9 - packages/infra/.madgerc | 7 - packages/infra/.npmignore | 14 - packages/infra/CHANGELOG.md | 15296 ----------- packages/infra/_check.sh | 3 - packages/infra/docs/cluster-storage.md | 26 - packages/infra/docs/workflow-engine.md | 262 - packages/infra/examples/query.ts | 138 - packages/infra/package.json | 111 - packages/infra/src/CUPS.ts | 196 - packages/infra/src/ClusterCosmos.ts | 1154 - packages/infra/src/ClusterServiceBus.ts | 244 - packages/infra/src/ContextProvider.ts | 165 - packages/infra/src/Emailer/Sendgrid.ts | 161 - packages/infra/src/Emailer/fake.ts | 18 - packages/infra/src/MainFiberSet.ts | 95 - packages/infra/src/QueueMaker/errors.ts | 32 - packages/infra/src/SQL.ts | 1 - packages/infra/src/SQL/Model.ts | 932 - packages/infra/src/Store/Cosmos.ts | 646 - packages/infra/src/Store/Cosmos/query.ts | 531 - packages/infra/src/Store/Disk.ts | 260 - packages/infra/src/Store/Memory.ts | 594 - packages/infra/src/Store/SQL.ts | 786 - packages/infra/src/Store/SQL/Pg.ts | 402 - packages/infra/src/Store/SQL/query.ts | 748 - packages/infra/src/Store/codeFilter.ts | 244 - packages/infra/src/Store/index.test.ts.bak | 112 - packages/infra/src/Store/index.ts | 48 - packages/infra/src/Store/jsonDocument.ts | 43 - packages/infra/src/Store/utils.ts | 345 - packages/infra/src/WorkflowEngineCosmos.ts | 749 - packages/infra/src/WorkflowEngineSqlite.ts | 813 - packages/infra/src/arbs.ts | 35 - packages/infra/src/codec.ts | 9 - packages/infra/src/cosmos-client.ts | 18 - packages/infra/src/errorReporter.ts | 100 - packages/infra/src/errors.ts | 1 - packages/infra/src/fileUtil.ts | 130 - packages/infra/src/index.ts | 2 - .../src/internal/RequestContextMiddleware.ts | 59 - packages/infra/src/internal/auth.ts | 272 - packages/infra/src/internal/events.ts | 77 - packages/infra/src/internal/health.ts | 5 - packages/infra/src/layerUtils.ts | 68 - packages/infra/src/logger.ts | 3 - packages/infra/src/logger/jsonLogger.ts | 35 - packages/infra/src/logger/logFmtLogger.ts | 18 - packages/infra/src/logger/shared.ts | 19 - packages/infra/src/middlewares.ts | 10 - packages/infra/src/mongo-client.ts | 25 - packages/infra/src/otel.ts | 177 - packages/infra/src/rateLimit.ts | 126 - packages/infra/src/redis-client.ts | 133 - packages/infra/src/reportError.ts | 30 - packages/infra/src/routing.ts | 823 - packages/infra/src/routing/middleware.ts | 4 - .../routing/middleware/RouterMiddleware.ts | 27 - .../src/routing/middleware/middleware.ts | 196 - packages/infra/src/routing/schema/jwt.ts | 21 - packages/infra/src/routing/tsort.ts | 56 - packages/infra/src/routing/utils.ts | 48 - packages/infra/src/test.ts | 30 - packages/infra/src/util.ts | 14 - packages/infra/src/vitest.ts | 2 - packages/infra/test/auth.test.ts | 101 - packages/infra/test/cluster-cosmos.test.ts | 612 - .../infra/test/cluster-servicebus.test.ts | 180 - packages/infra/test/cluster-sqlite.test.ts | 207 - packages/infra/test/contextProvider.test.ts | 161 - packages/infra/test/controller.test.ts | 425 - packages/infra/test/cosmos-query.test.ts | 323 - packages/infra/test/fixtures.ts | 139 - packages/infra/test/json-lower.test.ts | 115 - packages/infra/test/layerUtils.test.ts | 21 - packages/infra/test/query.test.ts | 2436 -- packages/infra/test/rawQuery.test.ts | 742 - packages/infra/test/repository-ext.test.ts | 456 - packages/infra/test/requires.test.ts | 182 - packages/infra/test/router-generator.test.ts | 187 - .../test/routing-interruptibility.test.ts | 66 - .../test/rpc-context-map-streaming.test.ts | 265 - .../infra/test/rpc-e2e-invalidation.test.ts | 421 - .../infra/test/rpc-multi-middleware.test.ts | 213 - .../infra/test/rpc-stream-fullstack.test.ts | 307 - packages/infra/test/sql-store.test.ts | 1905 -- packages/infra/test/validateSample.test.ts | 249 - .../infra/test/workflow-engine-cosmos.test.ts | 345 - .../infra/test/workflow-engine-sqlite.test.ts | 297 - packages/infra/tsconfig.examples.json | 15 - packages/infra/tsconfig.json | 12 - packages/infra/tsconfig.src.json | 38 - packages/infra/tsconfig.test.json | 33 - packages/infra/types/modules.d.ts | 0 packages/infra/vitest.config.ts | 5 - .../opentelemetry/CHANGELOG.md | 7 + .../opentelemetry/LICENSE | 0 .../opentelemetry/README.md | 0 .../opentelemetry/package.json | 2 +- .../opentelemetry/src/NodeSdk.ts | 0 .../opentelemetry/src/OtelLogger.ts | 0 .../opentelemetry/src/OtelMetrics.ts | 0 .../opentelemetry/src/OtelTracer.ts | 0 .../opentelemetry/src/Resource.ts | 0 .../opentelemetry/src/WebSdk.ts | 0 .../opentelemetry/src/index.ts | 0 .../opentelemetry/src/internal/attributes.ts | 0 .../opentelemetry/src/internal/metrics.ts | 0 .../opentelemetry/src/internal/utilities.ts | 0 .../opentelemetry/test/OtelLogger.test.ts | 0 .../opentelemetry/test/OtelMetrics.test.ts | 0 .../opentelemetry/test/OtelTracer.test.ts | 0 .../opentelemetry/tsconfig.json | 0 .../platform/browser/CHANGELOG.md | 7 + .../platform/browser/LICENSE | 0 .../platform/browser/README.md | 0 .../platform/browser/package.json | 2 +- .../platform/browser/src/BrowserCrypto.ts | 0 .../platform/browser/src/BrowserHttpClient.ts | 0 .../browser/src/BrowserKeyValueStore.ts | 0 .../browser/src/BrowserPersistence.ts | 0 .../platform/browser/src/BrowserRuntime.ts | 0 .../platform/browser/src/BrowserSocket.ts | 0 .../platform/browser/src/BrowserStream.ts | 0 .../platform/browser/src/BrowserWorker.ts | 0 .../browser/src/BrowserWorkerRunner.ts | 0 .../platform/browser/src/Clipboard.ts | 0 .../platform/browser/src/Geolocation.ts | 0 .../platform/browser/src/IndexedDb.ts | 0 .../platform/browser/src/IndexedDbDatabase.ts | 0 .../browser/src/IndexedDbQueryBuilder.ts | 0 .../platform/browser/src/IndexedDbTable.ts | 0 .../platform/browser/src/IndexedDbVersion.ts | 0 .../platform/browser/src/Permissions.ts | 0 .../platform/browser/src/index.ts | 0 .../browser/test/BrowserCrypto.test.ts | 0 .../browser/test/BrowserHttpClient.test.ts | 0 .../browser/test/BrowserKeyValueStore.test.ts | 0 .../browser/test/BrowserPersistence.test.ts | 0 .../BrowserPersistencePersistedCache.test.ts | 0 .../browser/test/BrowserWorkerRunner.test.ts | 0 .../browser/test/IndexedDbDatabase.test.ts | 0 .../test/IndexedDbQueryBuilder.test.ts | 0 .../browser/test/IndexedDbTable.test.ts | 0 .../browser/test/IndexedDbVersion.test.ts | 0 .../platform/browser/test/Permissions.test.ts | 0 .../platform/browser/test/RpcWorker.test.ts | 0 .../platform/browser/test/fixtures/rpc-e2e.ts | 0 .../browser/test/fixtures/rpc-schemas.ts | 0 .../browser/test/fixtures/rpc-worker.ts | 0 .../platform/browser/tsconfig.json | 0 .../platform/browser/vitest.setup.ts | 0 .../platform/bun/CHANGELOG.md | 9 + .../platform/bun/LICENSE | 0 .../platform/bun/README.md | 0 .../platform/bun/package.json | 2 +- .../bun/src/BunChildProcessSpawner.ts | 0 .../platform/bun/src/BunClusterHttp.ts | 0 .../platform/bun/src/BunClusterSocket.ts | 0 .../platform/bun/src/BunCrypto.ts | 0 .../platform/bun/src/BunFileSystem.ts | 0 .../platform/bun/src/BunHttpClient.ts | 0 .../platform/bun/src/BunHttpPlatform.ts | 0 .../platform/bun/src/BunHttpServer.ts | 8 +- .../platform/bun/src/BunHttpServerRequest.ts | 0 .../platform/bun/src/BunMultipart.ts | 0 .../platform/bun/src/BunPath.ts | 0 .../platform/bun/src/BunRedis.ts | 0 .../platform/bun/src/BunRuntime.ts | 0 .../platform/bun/src/BunServices.ts | 0 .../platform/bun/src/BunSink.ts | 0 .../platform/bun/src/BunSocket.ts | 0 .../platform/bun/src/BunSocketServer.ts | 0 .../platform/bun/src/BunStdio.ts | 0 .../platform/bun/src/BunStream.ts | 0 .../platform/bun/src/BunTerminal.ts | 0 .../platform/bun/src/BunWorker.ts | 0 .../platform/bun/src/BunWorkerRunner.ts | 0 .../platform/bun/src/index.ts | 0 .../platform/bun/test/BunClusterHttp.test.ts | 0 .../bun/test/BunHttpCompression.test.ts | 0 .../platform/bun/test/BunHttpPlatform.test.ts | 0 .../platform/bun/test/BunHttpServer.test.ts | 77 + .../platform/bun/test/BunStream.test.ts | 0 .../platform/bun/tsconfig.json | 0 .../platform/deno/CHANGELOG.md | 9 + .../platform/deno/LICENSE | 0 .../platform/deno/README.md | 0 .../platform/deno/package.json | 2 +- .../deno/src/DenoChildProcessSpawner.ts | 0 .../platform/deno/src/DenoClusterHttp.ts | 0 .../platform/deno/src/DenoClusterSocket.ts | 0 .../platform/deno/src/DenoCrypto.ts | 0 .../platform/deno/src/DenoFileSystem.ts | 0 .../platform/deno/src/DenoHttpClient.ts | 0 .../platform/deno/src/DenoHttpPlatform.ts | 0 .../platform/deno/src/DenoHttpServer.ts | 8 +- .../deno/src/DenoHttpServerRequest.ts | 0 .../platform/deno/src/DenoKeyValueStore.ts | 0 .../platform/deno/src/DenoMultipart.ts | 0 .../platform/deno/src/DenoPath.ts | 0 .../platform/deno/src/DenoRedis.ts | 0 .../platform/deno/src/DenoRuntime.ts | 0 .../platform/deno/src/DenoServices.ts | 0 .../platform/deno/src/DenoSocket.ts | 0 .../platform/deno/src/DenoSocketServer.ts | 0 .../platform/deno/src/DenoStdio.ts | 0 .../platform/deno/src/DenoTerminal.ts | 0 .../platform/deno/src/DenoWorker.ts | 0 .../platform/deno/src/DenoWorkerRunner.ts | 0 .../platform/deno/src/index.ts | 0 .../platform/deno/src/internal/error.ts | 0 .../deno/test/DenoChildProcessSpawner.test.ts | 0 .../platform/deno/test/DenoCrypto.test.ts | 0 .../platform/deno/test/DenoFileSystem.test.ts | 0 .../deno/test/DenoHttpCompression.test.ts | 0 .../deno/test/DenoHttpPlatform.test.ts | 0 .../platform/deno/test/DenoHttpServer.test.ts | 75 + .../deno/test/DenoKeyValueStore.test.ts | 0 .../platform/deno/test/DenoPath.test.ts | 0 .../deno/test/DenoRedis.integration.test.ts | 0 .../platform/deno/test/DenoSocket.test.ts | 0 .../deno/test/DenoSocketServer.test.ts | 0 .../platform/deno/test/DenoStdio.test.ts | 0 .../platform/deno/test/DenoTerminal.test.ts | 0 .../deno/test/DenoWorkerRunner.test.ts | 0 .../platform/deno/test/RpcWorker.test.ts | 0 .../deno/test/cluster/SocketRunner.test.ts | 0 .../deno/test/fixtures/deno-terminal.ts | 0 .../platform/deno/test/fixtures/rpc-e2e.ts | 0 .../deno/test/fixtures/rpc-schemas.ts | 0 .../platform/deno/test/fixtures/rpc-worker.ts | 0 .../platform/deno/test/fixtures/text.txt | 0 .../platform/deno/test/fixtures/tls/ca.pem | 0 .../platform/deno/test/fixtures/tls/cert.pem | 0 .../platform/deno/test/fixtures/tls/key.pem | 0 .../platform/deno/test/internal/error.test.ts | 0 .../platform/deno/tsconfig.json | 0 .../platform/node-shared/CHANGELOG.md | 7 + .../platform/node-shared/LICENSE | 0 .../platform/node-shared/README.md | 0 .../platform/node-shared/benchmark/Socket.ts | 0 .../platform/node-shared/package.json | 2 +- .../src/NodeChildProcessSpawner.ts | 0 .../node-shared/src/NodeClusterSocket.ts | 0 .../platform/node-shared/src/NodeCrypto.ts | 0 .../node-shared/src/NodeFileSystem.ts | 0 .../node-shared/src/NodeHttpCompression.ts | 0 .../platform/node-shared/src/NodePath.ts | 0 .../platform/node-shared/src/NodeRuntime.ts | 0 .../platform/node-shared/src/NodeSink.ts | 0 .../platform/node-shared/src/NodeSocket.ts | 0 .../node-shared/src/NodeSocketServer.ts | 0 .../platform/node-shared/src/NodeStdio.ts | 0 .../platform/node-shared/src/NodeStream.ts | 0 .../platform/node-shared/src/NodeTerminal.ts | 0 .../platform/node-shared/src/index.ts | 0 .../src/internal/nodeChildProcessSpawner.ts | 0 .../node-shared/src/internal/utils.ts | 0 .../test/HttpPlatform.test-utils.ts | 0 .../test/NodeChildProcessSpawner.test.ts | 0 .../node-shared/test/NodeFileSystem.test.ts | 0 .../node-shared/test/NodePath.test.ts | 0 .../node-shared/test/NodeSink.test.ts | 0 .../node-shared/test/NodeStdio.test.ts | 0 .../node-shared/test/NodeStream.test.ts | 0 .../node-shared/test/NodeTerminal.test.ts | 0 .../test/fixtures/helloworld.tar.gz | Bin .../test/fixtures/node-terminal.ts | 0 .../test/fixtures/process-group.ts | 0 .../platform/node-shared/tsconfig.json | 0 .../platform/node/CHANGELOG.md | 8 + .../platform/node/LICENSE | 0 .../platform/node/README.md | 0 .../platform/node/package.json | 2 +- .../node/src/NodeChildProcessSpawner.ts | 0 .../platform/node/src/NodeClusterHttp.ts | 0 .../platform/node/src/NodeClusterSocket.ts | 0 .../platform/node/src/NodeCrypto.ts | 0 .../platform/node/src/NodeFileSystem.ts | 0 .../platform/node/src/NodeHttpClient.ts | 0 .../node/src/NodeHttpIncomingMessage.ts | 0 .../platform/node/src/NodeHttpPlatform.ts | 0 .../platform/node/src/NodeHttpServer.ts | 0 .../node/src/NodeHttpServerRequest.ts | 0 .../platform/node/src/NodeMultipart.ts | 0 .../platform/node/src/NodeMultipartParser.ts | 0 .../platform/node/src/NodePath.ts | 0 .../platform/node/src/NodeRedis.ts | 0 .../platform/node/src/NodeRuntime.ts | 0 .../platform/node/src/NodeServices.ts | 0 .../platform/node/src/NodeSink.ts | 0 .../platform/node/src/NodeSocket.ts | 0 .../platform/node/src/NodeSocketServer.ts | 0 .../platform/node/src/NodeStdio.ts | 0 .../platform/node/src/NodeStream.ts | 0 .../platform/node/src/NodeTerminal.ts | 0 .../platform/node/src/NodeWorker.ts | 0 .../platform/node/src/NodeWorkerRunner.ts | 0 .../platform/node/src/Undici.ts | 0 .../platform/node/src/index.ts | 0 .../platform/node/test/HttpApi.test.ts | 0 .../node/test/HttpStaticServer.test.ts | 0 .../test/HttpStaticServerConditional.test.ts | 0 .../platform/node/test/KeyValueStore.test.ts | 0 .../node/test/MultipartParser.test.ts | 0 .../platform/node/test/NodeCrypto.test.ts | 0 .../platform/node/test/NodeHttpClient.test.ts | 0 .../node/test/NodeHttpCompression.test.ts | 0 .../node/test/NodeHttpPlatform.test.ts | 0 .../platform/node/test/NodeHttpServer.test.ts | 0 .../node/test/NodeRedis.integration.test.ts | 0 .../platform/node/test/NodeSocket.test.ts | 0 .../node/test/NodeWorkerRunner.test.ts | 0 .../platform/node/test/OpenApi.test.ts | 0 .../platform/node/test/RpcServer.test.ts | 0 .../test/__snapshots__/HttpApi.test.ts.snap | 0 .../cluster-integration/ClusterCron.test.ts | 0 .../test/cluster-integration/Entity.test.ts | 0 .../test/cluster-integration/Locks.test.ts | 0 .../cluster-integration/Persistence.test.ts | 0 .../node/test/cluster-integration/README.md | 0 .../cluster-integration/Residency.test.ts | 0 .../test/cluster-integration/Smoke.test.ts | 0 .../cluster-integration/Transport.test.ts | 0 .../test/cluster-integration/Workflow.test.ts | 0 .../test/cluster-integration/globalSetup.ts | 0 .../node/test/cluster-integration/harness.ts | 0 .../node/test/cluster/MessageStorageTest.ts | 0 .../node/test/cluster/SocketRunner.test.ts | 0 .../SqlMessageStorage.integration.test.ts | 0 .../SqlRunnerStorage.integration.test.ts | 0 .../fixtures/http-static-server-outside.txt | 0 .../http-static-server/conditional.txt | 0 .../http-static-server/custom/home.html | 0 .../fixtures/http-static-server/file.binx | 0 .../http-static-server/guide/index.html | 0 .../fixtures/http-static-server/hello.txt | 0 .../fixtures/http-static-server/index.html | 0 .../fixtures/http-static-server/range.txt | 0 .../node/test/fixtures/mysql2-utils.ts | 0 .../platform/node/test/fixtures/pg-utils.ts | 0 .../platform/node/test/fixtures/rpc-e2e.ts | 0 .../node/test/fixtures/rpc-schemas.ts | 0 .../platform/node/test/fixtures/text.txt | 0 .../platform/node/test/fixtures/tls/cert.pem | 0 .../platform/node/test/fixtures/tls/key.pem | 0 .../node/test/fixtures/worker-runner.ts | 0 .../platform/node/tsconfig.json | 0 .../sql/clickhouse/CHANGELOG.md | 8 + .../sql/clickhouse/LICENSE | 0 .../sql/clickhouse/README.md | 0 .../sql/clickhouse/package.json | 2 +- .../sql/clickhouse/src/ClickhouseClient.ts | 0 .../sql/clickhouse/src/ClickhouseMigrator.ts | 0 .../sql/clickhouse/src/index.ts | 0 .../sql/clickhouse/test/Client.test.ts | 0 .../test/SqlErrorClassification.test.ts | 0 .../sql/clickhouse/tsconfig.json | 0 .../packages => packages}/sql/d1/CHANGELOG.md | 7 + .../packages => packages}/sql/d1/LICENSE | 0 .../packages => packages}/sql/d1/README.md | 0 .../packages => packages}/sql/d1/package.json | 2 +- .../sql/d1/src/D1Client.ts | 0 .../packages => packages}/sql/d1/src/index.ts | 0 .../sql/d1/test/Client.test.ts | 0 .../sql/d1/test/Resolver.test.ts | 0 .../sql/d1/test/utils.ts | 0 .../sql/d1/tsconfig.json | 0 .../sql/libsql/CHANGELOG.md | 7 + .../packages => packages}/sql/libsql/LICENSE | 0 .../sql/libsql/README.md | 0 .../sql/libsql/package.json | 2 +- .../sql/libsql/src/LibsqlClient.ts | 0 .../sql/libsql/src/LibsqlMigrator.ts | 0 .../sql/libsql/src/index.ts | 0 .../libsql/test/Client.integration.test.ts | 0 .../libsql/test/Resolver.integration.test.ts | 0 .../sql/libsql/test/util.ts | 0 .../sql/libsql/tsconfig.json | 0 .../sql/mssql/CHANGELOG.md | 7 + .../packages => packages}/sql/mssql/LICENSE | 0 .../packages => packages}/sql/mssql/README.md | 0 .../sql/mssql/package.json | 2 +- .../sql/mssql/src/MssqlClient.ts | 0 .../sql/mssql/src/MssqlMigrator.ts | 0 .../sql/mssql/src/Parameter.ts | 0 .../sql/mssql/src/Procedure.ts | 0 .../sql/mssql/src/index.ts | 0 .../sql/mssql/test/Binary.test.ts | 0 .../sql/mssql/test/Client.test.ts | 0 .../test/Persistence.integration.test.ts | 0 .../mssql/test/SqlErrorClassification.test.ts | 0 .../sql/mssql/test/utils.ts | 0 .../sql/mssql/tsconfig.json | 0 .../sql/mysql2/CHANGELOG.md | 7 + .../packages => packages}/sql/mysql2/LICENSE | 0 .../sql/mysql2/README.md | 0 .../sql/mysql2/package.json | 2 +- .../sql/mysql2/src/MysqlClient.ts | 0 .../sql/mysql2/src/MysqlMigrator.ts | 0 .../sql/mysql2/src/index.ts | 0 .../mysql2/test/Client.integration.test.ts | 0 .../test/KeyValueStore.integration.test.ts | 0 .../sql/mysql2/test/Model.integration.test.ts | 0 .../test/MysqlClient.integration.test.ts | 0 .../test/Persistence.integration.test.ts | 0 .../test/SqlErrorClassification.test.ts | 0 ...ntLogServerUnencrypted.integration.test.ts | 0 .../sql/mysql2/test/utils.ts | 0 .../sql/mysql2/tsconfig.json | 0 .../packages => packages}/sql/pg/CHANGELOG.md | 7 + .../packages => packages}/sql/pg/LICENSE | 0 .../packages => packages}/sql/pg/README.md | 0 .../sql/pg/benchmark/PgClient.ts | 0 .../sql/pg/benchmark/PgCodec.ts | 0 .../sql/pg/benchmark/README.md | 0 .../packages => packages}/sql/pg/package.json | 2 +- .../sql/pg/src/PgAuth.ts | 0 .../sql/pg/src/PgClient.ts | 0 .../sql/pg/src/PgConnection.ts | 0 .../sql/pg/src/PgMigrator.ts | 0 .../sql/pg/src/PgPool.ts | 0 .../sql/pg/src/PgProtocol.ts | 0 .../sql/pg/src/PgTypes.ts | 0 .../packages => packages}/sql/pg/src/index.ts | 0 .../sql/pg/src/internal/connection.ts | 0 .../sql/pg/src/internal/sqlError.ts | 0 .../sql/pg/test/Client.integration.test.ts | 0 .../pg/test/KeyValueStore.integration.test.ts | 0 .../pg/test/Persistence.integration.test.ts | 0 .../sql/pg/test/PgAuth.test.ts | 0 .../pg/test/PgConnection.in-process.test.ts | 0 .../pg/test/PgConnection.integration.test.ts | 0 .../sql/pg/test/PgConnection.test.ts | 0 .../sql/pg/test/PgPool.integration.test.ts | 0 .../sql/pg/test/PgProtocol.test.ts | 0 .../sql/pg/test/PgTypes.test.ts | 0 .../pg/test/SqlErrorClassification.test.ts | 0 ...ntLogServerUnencrypted.integration.test.ts | 0 .../sql/pg/test/TransactionAcquire.test.ts | 0 .../sql/pg/test/fixtures/goldens.ts | 0 .../sql/pg/test/fixtures/regenerate.ts | 0 .../sql/pg/test/utils.ts | 0 .../sql/pg/tsconfig.json | 0 .../sql/pglite/CHANGELOG.md | 7 + .../packages => packages}/sql/pglite/LICENSE | 0 .../sql/pglite/README.md | 0 .../sql/pglite/package.json | 2 +- .../sql/pglite/src/PgliteClient.ts | 0 .../sql/pglite/src/PgliteMigrator.ts | 0 .../sql/pglite/src/index.ts | 0 .../sql/pglite/test/Client.test.ts | 0 .../sql/pglite/test/Json.test.ts | 0 .../sql/pglite/test/Migrator.test.ts | 0 .../sql/pglite/test/PersistedQueue.test.ts | 0 .../test/SqlErrorClassification.test.ts | 0 .../sql/pglite/test/Transaction.test.ts | 0 .../sql/pglite/tsconfig.json | 0 .../sql/sqlite-bun/CHANGELOG.md | 7 + .../sql/sqlite-bun/LICENSE | 0 .../sql/sqlite-bun/README.md | 0 .../sql/sqlite-bun/package.json | 2 +- .../sql/sqlite-bun/src/SqliteClient.ts | 0 .../sql/sqlite-bun/src/SqliteMigrator.ts | 0 .../sql/sqlite-bun/src/index.ts | 0 .../sql/sqlite-bun/test/Client.test.ts | 0 .../sql/sqlite-bun/tsconfig.json | 0 .../sql/sqlite-do/CHANGELOG.md | 7 + .../sql/sqlite-do/LICENSE | 0 .../sql/sqlite-do/README.md | 0 .../sql/sqlite-do/package.json | 2 +- .../sql/sqlite-do/src/SqliteClient.ts | 0 .../sql/sqlite-do/src/SqliteMigrator.ts | 0 .../sql/sqlite-do/src/index.ts | 0 .../sql/sqlite-do/test/Client.test.ts | 0 .../sql/sqlite-do/tsconfig.json | 0 .../sql/sqlite-node/CHANGELOG.md | 7 + .../sql/sqlite-node/LICENSE | 0 .../sql/sqlite-node/README.md | 0 .../sql/sqlite-node/package.json | 2 +- .../sql/sqlite-node/src/SqliteClient.ts | 0 .../sql/sqlite-node/src/SqliteMigrator.ts | 0 .../sql/sqlite-node/src/index.ts | 0 .../sql/sqlite-node/test/Client.test.ts | 0 .../sqlite-node/test/KeyValueStore.test.ts | 0 .../sql/sqlite-node/test/Persistence.test.ts | 56 +- .../sql/sqlite-node/test/Resolver.test.ts | 0 .../sqlite-node/test/SqlEventJournal.test.ts | 0 .../test/SqlEventLogServerEncrypted.test.ts | 0 .../test/SqlEventLogServerUnencrypted.test.ts | 0 .../sqlite-node/test/SqlModelServices.test.ts | 0 .../sqlite-node/test/SqliteMigrator.test.ts | 0 .../sql/sqlite-node/tsconfig.json | 0 .../sql/sqlite-react-native/CHANGELOG.md | 7 + .../sql/sqlite-react-native/LICENSE | 0 .../sql/sqlite-react-native/README.md | 0 .../sql/sqlite-react-native/package.json | 2 +- .../sqlite-react-native/src/SqliteClient.ts | 0 .../sqlite-react-native/src/SqliteMigrator.ts | 0 .../sql/sqlite-react-native/src/index.ts | 0 .../sqlite-react-native/test/Client.test.ts | 0 .../sql/sqlite-react-native/tsconfig.json | 0 .../sql/sqlite-wasm/CHANGELOG.md | 7 + .../sql/sqlite-wasm/LICENSE | 0 .../sql/sqlite-wasm/README.md | 0 .../sql/sqlite-wasm/package.json | 2 +- .../sql/sqlite-wasm/src/OpfsWorker.ts | 0 .../sql/sqlite-wasm/src/SqliteClient.ts | 0 .../sql/sqlite-wasm/src/SqliteMigrator.ts | 0 .../sql/sqlite-wasm/src/index.ts | 0 .../sqlite-wasm/src/internal/opfsWorker.ts | 0 .../sql/sqlite-wasm/src/sqlite-wasm.d.ts | 0 .../sql/sqlite-wasm/test/Client.test.ts | 0 .../sql/sqlite-wasm/tsconfig.json | 0 .../tools/ai-codegen/codegen.schema.json | 0 .../tools/ai-codegen/package.json | 0 .../tools/ai-codegen/src/Config.ts | 0 .../tools/ai-codegen/src/Discovery.ts | 0 .../tools/ai-codegen/src/Generator.ts | 0 .../tools/ai-codegen/src/Glob.ts | 0 .../tools/ai-codegen/src/PostProcess.ts | 0 .../tools/ai-codegen/src/SpecFetcher.ts | 0 .../tools/ai-codegen/src/bin.ts | 0 .../tools/ai-codegen/src/main.ts | 0 .../tools/ai-codegen/test/Generator.test.ts | 0 .../tools/ai-codegen/tsconfig.json | 0 .../tools/ai-docgen/package.json | 0 .../tools/ai-docgen/src/Glob.ts | 0 .../tools/ai-docgen/src/main.ts | 0 .../tools/ai-docgen/tsconfig.json | 0 .../tools/api-diff/README.md | 0 .../tools/api-diff/package.json | 0 .../tools/api-diff/src/Annotations.ts | 0 .../tools/api-diff/src/ApiDiff.ts | 0 .../tools/api-diff/src/Cli.ts | 0 .../tools/api-diff/src/Diff.ts | 0 .../tools/api-diff/src/Discovery.ts | 0 .../tools/api-diff/src/Error.ts | 0 .../tools/api-diff/src/Json.ts | 0 .../tools/api-diff/src/MigrationDoc.ts | 0 .../tools/api-diff/src/Model.ts | 0 .../tools/api-diff/src/Report.ts | 0 .../tools/api-diff/src/Snapshot.ts | 0 .../tools/api-diff/src/Worktrees.ts | 0 .../tools/api-diff/src/bin.ts | 0 .../tools/api-diff/test/Annotations.test.ts | 0 .../tools/api-diff/test/Cli.test.ts | 0 .../tools/api-diff/test/Diff.test.ts | 0 .../tools/api-diff/test/Discovery.test.ts | 0 .../tools/api-diff/test/Error.test.ts | 0 .../tools/api-diff/test/MigrationDoc.test.ts | 0 .../tools/api-diff/test/Snapshot.test.ts | 0 .../tools/api-diff/test/Worktrees.test.ts | 0 .../tools/api-diff/test/utils.ts | 0 .../tools/api-diff/tsconfig.json | 0 .../tools/bundle/README.md | 0 .../bundle/fixtures/arbitrary-combinators.ts | 0 .../tools/bundle/fixtures/basic.ts | 0 .../tools/bundle/fixtures/batching.ts | 0 .../tools/bundle/fixtures/brand.ts | 0 .../tools/bundle/fixtures/cache.ts | 0 .../tools/bundle/fixtures/config.ts | 0 .../tools/bundle/fixtures/differ.ts | 0 .../tools/bundle/fixtures/http-client.ts | 0 .../tools/bundle/fixtures/http-router.ts | 0 .../tools/bundle/fixtures/logger.ts | 0 .../tools/bundle/fixtures/metric.ts | 0 .../tools/bundle/fixtures/optic.ts | 0 .../tools/bundle/fixtures/pubsub.ts | 0 .../tools/bundle/fixtures/queue.ts | 0 .../tools/bundle/fixtures/schedule.ts | 0 .../tools/bundle/fixtures/schema-binary.ts | 0 .../tools/bundle/fixtures/schema-class.ts | 0 .../fixtures/schema-fromJsonSchemaDocument.ts | 0 .../schema-representation-roundtrip.ts | 0 .../fixtures/schema-string-transformation.ts | 0 .../tools/bundle/fixtures/schema-string.ts | 0 .../fixtures/schema-template-literal.ts | 0 .../bundle/fixtures/schema-toArbitrary.ts | 0 .../bundle/fixtures/schema-toCodeDocument.ts | 0 .../bundle/fixtures/schema-toCodecJson.ts | 0 .../bundle/fixtures/schema-toEquivalence.ts | 0 .../bundle/fixtures/schema-toFormatter.ts | 0 .../fixtures/schema-toJsonSchemaDocument.ts | 0 .../fixtures/schema-toRepresentation.ts | 0 .../tools/bundle/fixtures/schema.ts | 0 .../tools/bundle/fixtures/stm.ts | 0 .../tools/bundle/fixtures/stream.ts | 0 .../tools/bundle/package.json | 0 .../tools/bundle/src/Cli.ts | 0 .../tools/bundle/src/Fixtures.ts | 0 .../tools/bundle/src/Plugins.ts | 0 .../tools/bundle/src/Reporter.ts | 0 .../tools/bundle/src/Rollup.ts | 0 .../tools/bundle/src/bin.ts | 0 .../bundle/test/HttpRouterEsbuild.test.ts | 0 .../tools/bundle/test/Plugins.test.ts | 0 .../tools/bundle/tsconfig.fixtures.json | 0 .../tools/bundle/tsconfig.json | 0 .../tools/bundle/tsconfig.src.json | 0 .../tools/docgen/CHANGELOG.md | 8 + .../tools/docgen/LICENSE | 0 .../tools/docgen/README.md | 0 .../tools/docgen/package.json | 2 +- .../tools/docgen/schema.json | 0 .../tools/docgen/src/CLI.ts | 0 .../tools/docgen/src/Checker.ts | 0 .../tools/docgen/src/Configuration.ts | 0 .../tools/docgen/src/Core.ts | 0 .../tools/docgen/src/Domain.ts | 0 .../tools/docgen/src/Parser.ts | 0 .../tools/docgen/src/Printer.ts | 0 .../tools/docgen/src/bin.ts | 0 .../tools/docgen/src/index.ts | 0 .../docgen/src/internal/markdown-toc.d.ts | 0 .../tools/docgen/test/Checker.test.ts | 0 .../tools/docgen/test/Configuration.test.ts | 0 .../tools/docgen/test/Core.test.ts | 0 .../tools/docgen/test/Parser.test.ts | 0 .../docgen/test/fixtures/invalid-json.txt | 0 .../tools/docgen/tsconfig.json | 0 .../tools/doctest/CHANGELOG.md | 7 + .../tools/doctest/README.md | 0 .../tools/doctest/package.json | 2 +- .../tools/doctest/src/Plugin.ts | 0 .../tools/doctest/src/Protocol.ts | 0 .../tools/doctest/src/Runner.ts | 0 .../tools/doctest/src/Runtime.ts | 0 .../tools/doctest/src/Source.ts | 0 .../tools/doctest/src/Transform.ts | 0 .../tools/doctest/src/index.ts | 0 .../tools/doctest/test/Plugin.test.ts | 0 .../tools/doctest/test/Protocol.test.ts | 0 .../tools/doctest/test/Runtime.test.ts | 0 .../tools/doctest/test/Source.test.ts | 0 .../tools/doctest/test/Transform.test.ts | 0 .../test/fixtures/markdown/docs/helper.ts | 0 .../test/fixtures/markdown/docs/typed.md | 0 .../test/fixtures/markdown/docs/typed.mdx | 0 .../test/fixtures/markdown/src/typed.ts | 0 .../test/fixtures/markdown/vitest.config.ts | 0 .../tools/doctest/tsconfig.json | 0 .../tools/jsdocs/package.json | 0 .../tools/jsdocs/src/Jsdocs.ts | 0 .../tools/jsdocs/src/bin.ts | 0 .../tools/jsdocs/test/jsdocs.test.ts | 0 .../tools/jsdocs/tsconfig.json | 0 .../tools/openapi-generator/CHANGELOG.md | 9 + .../tools/openapi-generator/LICENSE | 0 .../tools/openapi-generator/README.md | 0 .../tools/openapi-generator/package.json | 2 +- .../src/HttpApiTransformer.ts | 0 .../src/JsonSchemaGenerator.ts | 0 .../openapi-generator/src/OpenApiGenerator.ts | 15 +- .../openapi-generator/src/OpenApiPatch.ts | 0 .../src/OpenApiTransformer.ts | 68 +- .../openapi-generator/src/ParsedOperation.ts | 0 .../tools/openapi-generator/src/Utils.ts | 0 .../tools/openapi-generator/src/bin.ts | 0 .../tools/openapi-generator/src/main.ts | 0 .../test/JsonSchemaGenerator.test.ts | 0 .../JsonSchemaGeneratorRepresentation.test.ts | 0 .../test/OpenApiGenerator.test.ts | 114 +- .../test/OpenApiGeneratorCli.test.ts | 0 .../test/OpenApiPatch.test.ts | 0 .../test/OpenApiTransformer.test.ts | 104 +- .../openapi-generator/test/Utils.test.ts | 0 .../test/fixtures/cli-basic-spec.json | 0 .../test/fixtures/cli-warning-spec.json | 0 .../test/fixtures/patches/invalid-op.json | 0 .../test/fixtures/patches/missing-path.json | 0 .../test/fixtures/patches/missing-value.json | 0 .../test/fixtures/patches/valid-add.json | 0 .../test/fixtures/patches/valid-multiple.json | 0 .../test/fixtures/patches/valid-patch.yaml | 0 .../test/fixtures/patches/valid-remove.json | 0 .../test/fixtures/patches/valid-replace.json | 0 .../tools/openapi-generator/tsconfig.json | 0 .../tools/oxc/oxlintrc.json | 0 .../tools/oxc/package.json | 0 .../tools/oxc/src/oxlint/index.ts | 0 .../src/oxlint/rules/no-bigint-literals.ts | 0 .../rules/no-import-from-barrel-package.ts | 0 .../oxlint/rules/no-js-extension-imports.ts | 0 .../oxlint/rules/no-opaque-instance-fields.ts | 0 .../src/oxlint/rules/no-unused-internal.ts | 0 .../no-import-from-barrel-package.test.ts | 0 .../oxc/test/no-js-extension-imports.test.ts | 0 .../test/no-opaque-instance-fields.test.ts | 0 .../tools/oxc/test/no-unused-internal.test.ts | 0 .../tools/oxc/test/utils.ts | 0 .../tools/oxc/tsconfig.json | 0 .../tools/utils/package.json | 0 .../tools/utils/src/Codegen.ts | 0 .../tools/utils/src/Glob.ts | 0 .../tools/utils/src/bin.ts | 0 .../tools/utils/src/commands/codegen.ts | 0 .../tools/utils/test/Codegen.test.ts | 0 .../tools/utils/tsconfig.json | 0 .../packages => packages}/vitest/CHANGELOG.md | 7 + .../packages => packages}/vitest/LICENSE | 0 .../packages => packages}/vitest/README.md | 0 .../packages => packages}/vitest/package.json | 2 +- .../packages => packages}/vitest/src/index.ts | 0 .../vitest/src/internal/internal.ts | 0 .../packages => packages}/vitest/src/utils.ts | 0 .../vitest/test/index.test.ts | 0 .../vitest/test/isolation.test.ts | 0 .../vitest/test/layer-concurrency.test.ts | 0 .../vitest/test/nested-isolation.test.ts | 0 .../vitest/test/timeout.test.ts | 0 .../vitest/tsconfig.json | 0 .../vitest/typetest/index.tst.ts | 0 packages/vue-components/.prettierrc | 7 - packages/vue-components/.storybook/main.ts | 14 - packages/vue-components/.storybook/preview.ts | 52 - .../vue-components/.storybook/tsconfig.json | 9 - .../vue-components/.vscode/extensions.json | 7 - packages/vue-components/CHANGELOG.md | 5988 ----- packages/vue-components/README.md | 233 - .../__tests__/FixedNuxtErrorBoundary.test.ts | 213 - .../__tests__/IntegerValidation.test.ts | 49 - .../__tests__/OmegaForm.test.ts | 205 - .../OmegaForm/CustomFilterFieldSchema.test.ts | 37 - .../OmegaForm/DateValidation.test.ts | 68 - .../OmegaForm/DecimalSeparatorInput.test.ts | 115 - .../OmegaForm/DecodeTransformFallback.test.ts | 151 - .../OmegaForm/DefaultValuesPriority.test.ts | 23 - .../__tests__/OmegaForm/Defaults.test.ts | 551 - .../OmegaForm/Defaults.values.test.ts | 114 - .../OmegaForm/DialogBlockingI18n.test.ts | 82 - .../OmegaForm/EmailFormatDetection.test.ts | 11 - .../OmegaForm/EmptyStringValidation.test.ts | 77 - .../__tests__/OmegaForm/GeneralErrors.test.ts | 59 - .../OmegaForm/IndexedInputErrors.test.ts | 82 - .../OmegaForm/InputAttributes.test.ts | 221 - .../OmegaForm/InputReactivity.test.ts | 49 - .../__tests__/OmegaForm/InputRegistry.test.ts | 95 - .../OmegaForm/IntersectionError.test.ts | 223 - .../__tests__/OmegaForm/Meta.test.ts | 40 - .../NullableFieldInitialization.test.ts | 184 - .../NullableNestedStructValidation.test.ts | 148 - .../__tests__/OmegaForm/OmegaAutoGen.test.ts | 331 - .../__tests__/OmegaForm/OptionalKey.test.ts | 62 - .../__tests__/OmegaForm/RedactedMeta.test.ts | 181 - .../SelectMultipleLocalization.test.ts | 123 - .../__tests__/OmegaForm/SubmitEffect.test.ts | 142 - .../OmegaForm/SubmitErrorClear.test.ts | 59 - .../OmegaForm/TaggedUnionBehavior.test.ts | 251 - .../TaggedUnionLegacyWarning.test.ts | 31 - .../OmegaForm/TaggedUnionNested.test.ts | 54 - .../OmegaForm/TaggedUnionRequired.test.ts | 81 - .../OmegaForm/TaggedUnionRoot.test.ts | 77 - .../OmegaForm/TransformationSchema.test.ts | 84 - .../OmegaForm/TransformedStruct.test.ts | 174 - .../OmegaForm/UnregisteredFieldError.test.ts | 94 - .../WithDefaultConstructorPersistency.test.ts | 107 - .../createUseFormWithCustomInput.test.ts | 374 - .../__tests__/OmegaFormTest.vue | 62 - .../__tests__/OmegaIntlProvider.vue | 12 - .../migration/schema-v4-migration.test.ts | 703 - packages/vue-components/__tests__/setup.ts | 16 - .../__tests__/test-array-meta.test.ts | 55 - .../__tests__/test-nullor-duplicate.test.ts | 42 - .../__tests__/test-union-meta.test.ts | 17 - .../vue-components/__tests__/tsconfig.json | 9 - .../plans/2026-04-27-omegaform-refactor.md | 2655 -- .../2026-04-27-omegaform-refactor-design.md | 242 - packages/vue-components/env.d.ts | 8 - packages/vue-components/eslint.config.mjs | 20 - packages/vue-components/package.json | 95 - packages/vue-components/src/assets/.keep | 0 .../src/components/CommandButton.vue | 161 - .../vue-components/src/components/Dialog.vue | 58 - .../src/components/FixedNuxtErrorBoundary.vue | 112 - .../src/components/OmegaForm/InputProps.ts | 100 - .../src/components/OmegaForm/OmegaArray.vue | 76 - .../src/components/OmegaForm/OmegaAutoGen.vue | 105 - .../OmegaForm/OmegaErrorsInternal.vue | 238 - .../components/OmegaForm/OmegaFormInput.vue | 41 - .../src/components/OmegaForm/OmegaInput.vue | 95 - .../OmegaForm/OmegaInputVuetify.vue | 370 - .../OmegaForm/OmegaInternalInput.vue | 207 - .../components/OmegaForm/OmegaTaggedUnion.vue | 106 - .../OmegaForm/OmegaTaggedUnionInternal.vue | 41 - .../src/components/OmegaForm/OmegaWrapper.vue | 73 - .../src/components/OmegaForm/blockDialog.ts | 73 - .../OmegaForm/createUseFormWithCustomInput.ts | 70 - .../OmegaForm/decimalSeparatorInput.ts | 38 - .../src/components/OmegaForm/errors.ts | 139 - .../src/components/OmegaForm/getOmegaStore.ts | 31 - .../src/components/OmegaForm/hocs.ts | 19 - .../src/components/OmegaForm/index.ts | 27 - .../src/components/OmegaForm/inputs.ts | 22 - .../src/components/OmegaForm/meta/checks.ts | 107 - .../components/OmegaForm/meta/createMeta.ts | 140 - .../src/components/OmegaForm/meta/defaults.ts | 263 - .../src/components/OmegaForm/meta/redacted.ts | 71 - .../src/components/OmegaForm/meta/types.ts | 78 - .../src/components/OmegaForm/meta/walker.ts | 248 - .../OmegaForm/onMountedWithCleanup.ts | 22 - .../src/components/OmegaForm/persistency.ts | 247 - .../src/components/OmegaForm/submit.ts | 131 - .../src/components/OmegaForm/types.ts | 801 - .../src/components/OmegaForm/useOmegaForm.ts | 200 - .../components/OmegaForm/useRegisterField.ts | 17 - .../OmegaForm/validation/localized.ts | 242 - .../vue-components/src/components/index.ts | 4 - .../vue-components/src/components/style.css | 3 - packages/vue-components/src/index.ts | 20 - packages/vue-components/src/reset.css | 52 - packages/vue-components/src/utils/index.ts | 31 - .../stories/Commands.stories.ts | 46 - .../vue-components/stories/Commands/One.vue | 122 - .../stories/Commands/components.ts | 1 - .../stories/Commands/helpers.ts | 82 - .../stories/Commands/useEffectRouter.ts | 73 - .../vue-components/stories/Dialog.stories.ts | 34 - .../stories/Dialog/AsyncBlocking.vue | 47 - .../stories/Dialog/AsyncBlockingContent.vue | 91 - .../stories/Dialog/SimpleBlocking.vue | 49 - .../stories/Dialog/SimpleBlockingContent.vue | 30 - .../stories/Dialog/UploadBlocking.vue | 47 - .../stories/Dialog/UploadBlockingContent.vue | 105 - .../stories/FixedNuxtErrorBoundary.stories.ts | 18 - .../stories/FixedNuxtErrorBoundary/Demo.vue | 92 - .../stories/OmegaForm.stories.ts | 448 - .../stories/OmegaForm/Array.vue | 118 - .../stories/OmegaForm/AutoGeneration.vue | 74 - .../stories/OmegaForm/Booleans.vue | 42 - .../stories/OmegaForm/Clearable.vue | 25 - .../stories/OmegaForm/ComplexForm.vue | 147 - .../stories/OmegaForm/CustomInput.vue | 62 - .../OmegaForm/CustomInputClassName.vue | 53 - .../stories/OmegaForm/CustomLabelSlot.vue | 146 - .../vue-components/stories/OmegaForm/Date.vue | 35 - .../OmegaForm/DecodeTransformFallback.vue | 48 - .../stories/OmegaForm/Defaults.vue | 208 - .../OmegaForm/DialogBlockingExamples.vue | 76 - .../stories/OmegaForm/EmailForm.vue | 46 - .../stories/OmegaForm/EnterSubmitRepro.vue | 78 - .../stories/OmegaForm/FormTaggedUnion.vue | 116 - .../stories/OmegaForm/IndexedTable.vue | 79 - .../stories/OmegaForm/InputRegistry.vue | 109 - .../OmegaForm/IntegerValidationGerman.vue | 83 - .../stories/OmegaForm/IntersectionExample.vue | 55 - .../vue-components/stories/OmegaForm/Meta.vue | 92 - .../vue-components/stories/OmegaForm/Null.vue | 75 - .../stories/OmegaForm/Nullable.vue | 85 - .../OmegaForm/NullableNestedStruct.vue | 69 - .../stories/OmegaForm/NumberInput.vue | 68 - .../OmegaForm/OmitConstructorDefaults.vue | 131 - .../stories/OmegaForm/OptionalKey.vue | 142 - .../stories/OmegaForm/PersistencyForm.vue | 74 - ...rogrammaticallyHandleSubmitCheckErrors.vue | 39 - .../stories/OmegaForm/RatingInput.vue | 49 - .../stories/OmegaForm/Redacted.vue | 80 - .../OmegaForm/RootLevelTaggedUnion.vue | 127 - .../OmegaForm/RootLevelTaggedUnionLegacy.vue | 118 - .../stories/OmegaForm/SetErrorOnSubmit.vue | 35 - .../stories/OmegaForm/SimpleForm.vue | 43 - .../OmegaForm/SimpleFormVuetifyDefault.vue | 37 - .../stories/OmegaForm/SumExample.vue | 43 - .../stories/OmegaForm/Tanstack.vue | 210 - .../stories/OmegaForm/Union.vue | 77 - .../stories/OmegaForm/UsingOmegaForm.vue | 284 - .../OmegaForm/WindowExitPrevention.vue | 280 - .../OmegaForm/WithDefaultConstructor.vue | 53 - .../createUseFormWIthCustomInput.vue | 45 - .../stories/OmegaForm/form.Input.vue | 129 - packages/vue-components/stories/README.md | 29 - packages/vue-components/stories/tsconfig.json | 9 - packages/vue-components/tsconfig.build.json | 11 - packages/vue-components/tsconfig.json | 35 - .../vue-components/types/vuetify-shims.d.ts | 6 - packages/vue-components/vite.config.mts | 89 - packages/vue-components/vitest.config.mts | 19 - packages/vue/.madgerc | 7 - packages/vue/.npmignore | 14 - packages/vue/.prettierignore | 6 - packages/vue/CHANGELOG.md | 13652 ---------- packages/vue/docs/atom-query-api-redesign.md | 207 - packages/vue/docs/mutation-command-atoms.md | 40 - packages/vue/docs/query-key-invalidation.md | 107 - packages/vue/examples/streamMutation.ts | 72 - packages/vue/package.json | 102 - packages/vue/src/atomQuery.ts | 600 - packages/vue/src/commander.ts | 3408 --- packages/vue/src/confirm.ts | 34 - packages/vue/src/dependencyMetadata.ts | 84 - packages/vue/src/errorReporter.ts | 106 - packages/vue/src/form.ts | 501 - packages/vue/src/index.ts | 8 - packages/vue/src/internal/tanstackQuery.ts | 308 - packages/vue/src/intl.ts | 12 - packages/vue/src/lib.ts | 115 - packages/vue/src/liveQueryInvalidation.ts | 138 - packages/vue/src/makeClient.ts | 1314 - packages/vue/src/makeContext.ts | 34 - packages/vue/src/makeIntl.ts | 77 - packages/vue/src/makeUseCommand.ts | 29 - packages/vue/src/mutate.ts | 516 - packages/vue/src/query.ts | 940 - packages/vue/src/queryLifetime.ts | 74 - packages/vue/src/routeParams.ts | 55 - packages/vue/src/runtime.ts | 1 - packages/vue/src/suspense.ts | 43 - packages/vue/src/toast.ts | 1 - packages/vue/src/withToast.ts | 1 - packages/vue/test/Mutation.test.ts | 917 - .../vue/test/dependencyInvalidation.test.ts | 444 - .../vue/test/form-validation-errors.test.ts | 163 - packages/vue/test/form.test.ts | 280 - .../vue/test/inactiveInvalidation.test.ts | 172 - .../vue/test/interrupt-refetch-repro.test.ts | 625 - packages/vue/test/lib.test.ts | 240 - .../vue/test/liveQueryInvalidation.test.ts | 108 - packages/vue/test/makeClient.test.ts | 494 - packages/vue/test/query-span.test.ts | 92 - packages/vue/test/queryOptions.test.ts | 88 - packages/vue/test/streamFinal.test.ts | 64 - packages/vue/test/streamFn.test.ts | 457 - packages/vue/test/stubs.ts | 310 - packages/vue/test/suspense-regression.test.ts | 168 - packages/vue/test/suspense.test.ts | 160 - packages/vue/tsconfig.examples.json | 20 - packages/vue/tsconfig.json | 15 - packages/vue/tsconfig.src.json | 36 - packages/vue/tsconfig.test.json | 33 - packages/vue/vitest.config.ts | 18 - patches/.gitkeep | 0 patches/@ben_12__eslint-plugin-dprint.patch | 14 - patches/@changesets__cli@2.31.0.patch | 22 - .../@changesets__get-github-info@1.0.1.patch | 0 patches/@sendgrid__mail.patch | 23 - patches/@tanstack__query-core.patch | 203 - .../ts-plugin-sort-import-suggestions.patch | 45 - patches/typescript.patch | 159 - pnpm-lock.yaml | 21514 +++++++--------- pnpm-workspace.yaml | 54 +- repos/effect/.changeset/config.json | 53 - repos/effect/.changeset/pre.json | 4 - repos/effect/.envrc | 1 - repos/effect/.gitignore | 41 - repos/effect/.oxlintrc.json | 36 - repos/effect/.vscode/extensions.json | 6 - repos/effect/.vscode/settings.json | 51 - repos/effect/README.md | 73 - repos/effect/flake.lock | 27 - repos/effect/flake.nix | 24 - repos/effect/package.json | 84 - repos/effect/pnpm-lock.yaml | 12335 --------- repos/effect/pnpm-workspace.yaml | 30 - repos/effect/tsconfig.base.json | 45 - repos/effect/vitest.config.ts | 213 - repos/effect/vitest.setup.ts | 4 - .../effect/scratchpad => scratchpad}/index.ts | 0 .../scratchpad => scratchpad}/package.json | 0 .../scratchpad => scratchpad}/tsconfig.json | 0 scripts/agent-gh.mjs | 60 - scripts/agent-pr-ready.mjs | 65 - scripts/agent-pre-push.mjs | 140 - .../scripts => scripts}/bundle-analyze.sh | 0 .../bundle-compare-selected.sh | 0 .../scripts => scripts}/bundle-compare.sh | 0 .../scripts => scripts}/check-dist-types.mjs | 0 .../effect/scripts => scripts}/circular.mjs | 0 scripts/clean-dist.sh | 41 - {repos/effect/scripts => scripts}/clean.mjs | 0 {repos/effect/scripts => scripts}/codemod.mjs | 0 .../scripts => scripts}/codemods/jsdoc.ts | 0 scripts/convert_patch.js | 16 - .../scripts => scripts}/copy-ai-docs.mjs | 0 scripts/extract.sh | 26 - scripts/hooks/post-checkout.test.sh | 84 - scripts/install-git-hooks.mjs | 71 - scripts/lib/agent-env.mjs | 26 - scripts/lib/agent-gh-policy.mjs | 155 - scripts/lib/agent-pr-state.mjs | 119 - scripts/lib/agent-ship-gate-cache.mjs | 121 - scripts/mergeTsConfig.mjs | 49 - .../scripts => scripts}/package-scalar.mjs | 0 .../scripts => scripts}/package-swagger.mjs | 0 .../effect/scripts => scripts}/package.json | 0 scripts/rewrite-dist-declaration-imports.mjs | 37 - .../set-strip-internal.mjs | 0 .../scripts => scripts}/setup-agents.mjs | 0 scripts/sort.js | 31 - scripts/stagePublishPackage.mjs | 157 - scripts/sync-effect-subtree.js | 8 - .../effect/scripts => scripts}/tsconfig.json | 0 .../scripts => scripts}/worktree-setup.sh | 0 t3.json | 11 - tsconfig.all.json | 29 - tsconfig.base.json | 102 +- repos/effect/tsconfig.json => tsconfig.json | 0 tsconfig.lib.json | 14 - ...ig.packages.json => tsconfig.packages.json | 0 tsconfig.plugins.json | 27 - ...tsconfig.tests.json => tsconfig.tests.json | 0 repos/effect/tstyche.json => tstyche.json | 0 vite.config.base.ts | 40 - vitest.config.ts | 208 +- repos/effect/vitest.docs.ts => vitest.docs.ts | 0 vitest.setup.ts | 1 + wiki/Home.md | 3 - wiki/ResourceClients.md | 41 - wiki/bag-of-tricks.md | 95 - .../effect\342\200\220app\342\200\220cli.md" | 344 - wiki/error-reporter-migration.md | 174 - wiki/repository-derived-query-invalidation.md | 291 - 5032 files changed, 10638 insertions(+), 165984 deletions(-) rename {repos/effect/.agents => .agents}/AGENTS.md (100%) rename {repos/effect/.agents => .agents}/skills/ai-docs/SKILL.md (100%) rename {repos/effect/.agents => .agents}/skills/bundle-analysis/SKILL.md (100%) rename {repos/effect/.agents => .agents}/skills/changesets/SKILL.md (100%) rename {repos/effect/.agents => .agents}/skills/changesets/authoring.md (100%) rename {repos/effect/.agents => .agents}/skills/ci-maintenance/SKILL.md (100%) rename {repos/effect/.agents => .agents}/skills/ci-maintenance/privileged-workflows.md (100%) rename {repos/effect/.agents => .agents}/skills/dependency-maintenance/SKILL.md (100%) rename {repos/effect/.agents => .agents}/skills/dependency-maintenance/coordinated-upgrades.md (100%) rename {repos/effect/.agents => .agents}/skills/dependency-maintenance/manifest-roles.md (100%) rename {repos/effect/.agents => .agents}/skills/effect-development/SKILL.md (100%) rename {repos/effect/.agents => .agents}/skills/jsdocs/SKILL.md (100%) rename {repos/effect/.agents => .agents}/skills/jsdocs/categories.md (100%) rename {repos/effect/.agents => .agents}/skills/jsdocs/declarations.md (100%) rename {repos/effect/.agents => .agents}/skills/jsdocs/examples.md (100%) rename {repos/effect/.agents => .agents}/skills/migration-guidance/SKILL.md (100%) rename {repos/effect/.agents => .agents}/skills/migration-guidance/annotations.md (100%) rename {repos/effect/.agents => .agents}/skills/migration-guidance/generation.md (100%) rename {repos/effect/.agents => .agents}/skills/package-development/SKILL.md (100%) rename {repos/effect/.agents => .agents}/skills/package-development/dependencies.md (100%) rename {repos/effect/.agents => .agents}/skills/package-development/publishing.md (100%) rename {repos/effect/.agents => .agents}/skills/package-development/registration.md (100%) rename {repos/effect/.agents => .agents}/skills/performance-analysis/SKILL.md (100%) rename {repos/effect/.agents => .agents}/skills/performance-analysis/runtime.md (100%) rename {repos/effect/.agents => .agents}/skills/performance-analysis/types.md (100%) rename {repos/effect/.agents => .agents}/skills/test-development/SKILL.md (100%) rename {repos/effect/.agents => .agents}/skills/test-development/displayed-types.md (100%) rename {repos/effect/.agents => .agents}/skills/test-development/runtime.md (100%) rename {repos/effect/.agents => .agents}/skills/test-development/types.md (100%) rename {repos/effect/.agents => .agents}/skills/vendored-assets/SKILL.md (100%) rename {repos/effect/.agents => .agents}/skills/vendored-assets/browser-assets.md (100%) delete mode 100644 .changeset/README.md delete mode 100644 .changeset/active-query-invalidation.md delete mode 100644 .changeset/add-oxlint-integration.md delete mode 100644 .changeset/add-stream-mutation.md delete mode 100644 .changeset/adopt-module-system.md delete mode 100644 .changeset/align-invalidation-entry-types.md delete mode 100644 .changeset/align-schema-void-ts-semantics.md delete mode 100644 .changeset/all-phones-dream.md delete mode 100644 .changeset/amber-garlics-sing.md delete mode 100644 .changeset/api-client-isolate-layers.md delete mode 100644 .changeset/atom-query-vue.md delete mode 100644 .changeset/batch-cosmos-acks.md delete mode 100644 .changeset/batch-dual-options.md delete mode 100644 .changeset/big-teams-wash.md delete mode 100644 .changeset/blue-rats-admire.md delete mode 100644 .changeset/bold-berries-change.md delete mode 100644 .changeset/brave-animals-like.md delete mode 100644 .changeset/brave-bushes-fold.md delete mode 100644 .changeset/brave-laws-add.md delete mode 100644 .changeset/brave-oranges-try.md delete mode 100644 .changeset/brave-years-fry.md delete mode 100644 .changeset/bright-camels-grin.md delete mode 100644 .changeset/bright-lions-share.md delete mode 100644 .changeset/bright-mugs-paint.md delete mode 100644 .changeset/bright-peaches-wave.md delete mode 100644 .changeset/bright-trees-count.md delete mode 100644 .changeset/builtin-map-union-receiver.md delete mode 100644 .changeset/cached-per-request-helper.md delete mode 100644 .changeset/calm-clocks-observe.md delete mode 100644 .changeset/calm-cosmos-cluster.md delete mode 100644 .changeset/calm-filter-cycle.md delete mode 100644 .changeset/calm-pallets-listen.md delete mode 100644 .changeset/calm-pets-float.md delete mode 100644 .changeset/calm-picks-refresh.md delete mode 100644 .changeset/chilly-colts-attack.md delete mode 100644 .changeset/chilly-steaks-rule.md delete mode 100644 .changeset/chubby-dolls-yell.md delete mode 100644 .changeset/class-facade-encode-keys.md delete mode 100644 .changeset/clean-atom-suspense.md delete mode 100644 .changeset/clean-sql-data-column.md delete mode 100644 .changeset/clean-unused-dependencies.md delete mode 100644 .changeset/cleanup-tsgolint-codegen.md delete mode 100644 .changeset/clear-cycles-enjoy.md delete mode 100644 .changeset/clever-breads-enter.md delete mode 100644 .changeset/clever-pets-follow.md delete mode 100644 .changeset/cli-preserve-trailing-newline.md delete mode 100644 .changeset/cli-sync-no-tags.md delete mode 100644 .changeset/cli-ue-semver-target.md delete mode 100644 .changeset/client-fetch-property.md delete mode 100644 .changeset/cluster-servicebus-notifications.md delete mode 100644 .changeset/codegen-rule-options.md delete mode 100644 .changeset/cold-brooms-ski.md delete mode 100644 .changeset/cold-rabbits-pay.md delete mode 100644 .changeset/command-button-optional-input.md delete mode 100644 .changeset/commander-state-toast-types.md delete mode 100644 .changeset/commander-stream-fn.md delete mode 100644 .changeset/common-schools-stop.md delete mode 100644 .changeset/computed-projections-extensions.md delete mode 100644 .changeset/computed-projections-infra.md delete mode 100644 .changeset/concurrent-decode-helpers.md delete mode 100644 .changeset/config-nested-native.md delete mode 100644 .changeset/configurable-barrel-import-extension.md delete mode 100644 .changeset/configurable-mutation-invalidation.md delete mode 100644 .changeset/context-map-resolver-cache.md delete mode 100644 .changeset/cool-needles-wash.md delete mode 100644 .changeset/core-boundary-split.md delete mode 100644 .changeset/cosmos-cluster-occ-tests.md delete mode 100644 .changeset/cosmos-every-param-shift.md delete mode 100644 .changeset/cosmos-filter-seed.md delete mode 100644 .changeset/cosmos-namespace-spans.md delete mode 100644 .changeset/cosmos-namespace-support.md delete mode 100644 .changeset/cosmos-span-response-size.md delete mode 100644 .changeset/cosmos-workflow-engine.md delete mode 100644 .changeset/cozy-cats-lie.md delete mode 100644 .changeset/crisp-seals-care.md delete mode 100644 .changeset/crisp-trees-smash.md delete mode 100644 .changeset/ctxmap-per-request-memomap.md delete mode 100644 .changeset/cuddly-laws-smell.md delete mode 100644 .changeset/cups-error-tagged.md delete mode 100644 .changeset/curly-beds-sing.md delete mode 100644 .changeset/curly-dolls-double.md delete mode 100644 .changeset/curvy-files-share.md delete mode 100644 .changeset/curvy-pugs-rush.md delete mode 100644 .changeset/cyan-experts-smoke.md delete mode 100644 .changeset/cyan-pianos-peel.md delete mode 100644 .changeset/cyan-things-train.md delete mode 100644 .changeset/date-defaults-pipe-self.md delete mode 100644 .changeset/date-identifier-split.md delete mode 100644 .changeset/delay-waiting-toast.md delete mode 100644 .changeset/disable-query-invalidation.md delete mode 100644 .changeset/document-query-project-modes.md delete mode 100644 .changeset/drop-constructor-default.md delete mode 100644 .changeset/easy-aliens-peel.md delete mode 100644 .changeset/easy-spiders-study.md delete mode 100644 .changeset/effa-sync-shared.md delete mode 100644 .changeset/effa-sync-update-flag.md delete mode 100644 .changeset/effect-app-prefer-fn-untraced.md delete mode 100644 .changeset/effect-main-rc-apis.md delete mode 100644 .changeset/eighty-aliens-hide.md delete mode 100644 .changeset/eighty-signs-smile.md delete mode 100644 .changeset/eleven-eyes-lie.md delete mode 100644 .changeset/empty-queens-begin.md delete mode 100644 .changeset/empty-rules-check.md delete mode 100644 .changeset/eslint-codegen-glob-11.md delete mode 100644 .changeset/expose-make-on-query-command.md delete mode 100644 .changeset/extract-fixed-nuxt-error-boundary.md delete mode 100644 .changeset/facade-hardening-error-facade.md delete mode 100644 .changeset/fair-baboons-marry.md delete mode 100644 .changeset/fair-oranges-wave.md delete mode 100644 .changeset/fair-tables-march.md delete mode 100644 .changeset/famous-plums-watch.md delete mode 100644 .changeset/fancy-ducks-run.md delete mode 100644 .changeset/fast-loops-scream.md delete mode 100644 .changeset/fiery-feet-sleep.md delete mode 100644 .changeset/fiery-suits-kneel.md delete mode 100644 .changeset/five-trams-repeat.md delete mode 100644 .changeset/fix-class-type-export.md delete mode 100644 .changeset/fix-cli-gist-cache-id.md delete mode 100644 .changeset/fix-client-input-stream.md delete mode 100644 .changeset/fix-contextmap-leak.md delete mode 100644 .changeset/fix-cosmos-cluster-deferred.md delete mode 100644 .changeset/fix-cosmos-cluster-machineid.md delete mode 100644 .changeset/fix-cosmos-workflow-engine.md delete mode 100644 .changeset/fix-is-generator-function.md delete mode 100644 .changeset/fix-json-schema-annotations.md delete mode 100644 .changeset/fix-jsonschema-postprocess.md delete mode 100644 .changeset/fix-onedsl-r-inference.md delete mode 100644 .changeset/fix-pascalcase-barrel.md delete mode 100644 .changeset/fix-path-recursive-index-signature.md delete mode 100644 .changeset/fix-project-encodekeys-selection.md delete mode 100644 .changeset/fix-projection-union-adapter.md delete mode 100644 .changeset/fix-repo-transformed-id-union.md delete mode 100644 .changeset/fix-repo-transformed-id.md delete mode 100644 .changeset/fix-resolver-cache-precheck.md delete mode 100644 .changeset/fix-schema-interface-widening.md delete mode 100644 .changeset/fix-seed-marker-and-circular-dep.md delete mode 100644 .changeset/fix-sql-array-relation-queries.md delete mode 100644 .changeset/fix-sql-in-null-handling.md delete mode 100644 .changeset/fix-sql-includes-serialize.md delete mode 100644 .changeset/fix-sql-json-from-string-codec.md delete mode 100644 .changeset/fix-sql-namespace-params.md delete mode 100644 .changeset/fix-sql-pg-seed-migrations-table.md delete mode 100644 .changeset/fix-sql-select-etag-column.md delete mode 100644 .changeset/fix-sql-select-types-and-defaults.md delete mode 100644 .changeset/fix-sql-whereevery-flip.md delete mode 100644 .changeset/fix-sqlite-per-ns-seed-migrations-table.md delete mode 100644 .changeset/fix-transformed-struct-defaults.md delete mode 100644 .changeset/fix-vue-form-numeric-type-detection.md delete mode 100644 .changeset/fix-vue-interrupt-tests.md delete mode 100644 .changeset/fix-vue-lint-typescript-version.md delete mode 100644 .changeset/flat-turkeys-invent.md delete mode 100644 .changeset/flatten-nested-anyof.md delete mode 100644 .changeset/forty-bottles-tease.md delete mode 100644 .changeset/frank-ends-switch.md delete mode 100644 .changeset/frank-memes-sin.md delete mode 100644 .changeset/frank-papayas-design.md delete mode 100644 .changeset/fresh-buckets-pump.md delete mode 100644 .changeset/fresh-candles-shake.md delete mode 100644 .changeset/fresh-indexed-fields.md delete mode 100644 .changeset/fresh-mails-visit.md delete mode 100644 .changeset/fresh-paths-say.md delete mode 100644 .changeset/fresh-pianos-argue.md delete mode 100644 .changeset/friendly-points-drum.md delete mode 100644 .changeset/fruity-meteors-fix.md delete mode 100644 .changeset/full-oranges-heal.md delete mode 100644 .changeset/full-pugs-fall.md delete mode 100644 .changeset/funky-guests-switch.md delete mode 100644 .changeset/funny-webs-clap.md delete mode 100644 .changeset/fuzzy-eels-decide.md delete mode 100644 .changeset/fuzzy-eggs-jump.md delete mode 100644 .changeset/gentle-bats-leave.md delete mode 100644 .changeset/gentle-donkeys-tease.md delete mode 100644 .changeset/gold-ghosts-laugh.md delete mode 100644 .changeset/gold-wolves-shake.md delete mode 100644 .changeset/green-coins-talk.md delete mode 100644 .changeset/green-frogs-check.md delete mode 100644 .changeset/green-snakes-poke.md delete mode 100644 .changeset/green-taxis-project-hash.md delete mode 100644 .changeset/green-taxis-rule.md delete mode 100644 .changeset/handle-mutate-request-always-functions.md delete mode 100644 .changeset/handler-input-make-aligned.md delete mode 100644 .changeset/heavy-bears-appear.md delete mode 100644 .changeset/heavy-ducks-show.md delete mode 100644 .changeset/honest-planets-fry.md delete mode 100644 .changeset/http-span-name.md delete mode 100644 .changeset/huge-carrots-deny.md delete mode 100644 .changeset/humble-walls-fail.md delete mode 100644 .changeset/icy-paws-return.md delete mode 100644 .changeset/indefinite-waiting-toast.md delete mode 100644 .changeset/infra-prefer-fn-untraced.md delete mode 100644 .changeset/infra-sentry-node-dep.md delete mode 100644 .changeset/invalidation-set-add-shortcut-and-batch.md delete mode 100644 .changeset/itchy-mangos-find.md delete mode 100644 .changeset/khaki-frogs-wave.md delete mode 100644 .changeset/kind-lizards-bathe.md delete mode 100644 .changeset/large-pugs-strive.md delete mode 100644 .changeset/late-forks-obey.md delete mode 100644 .changeset/lazy-boats-lay.md delete mode 100644 .changeset/lazy-model-facades.md delete mode 100644 .changeset/legal-weeks-raise.md delete mode 100644 .changeset/lemon-emus-behave.md delete mode 100644 .changeset/little-berries-sip.md delete mode 100644 .changeset/little-planets-bake.md delete mode 100644 .changeset/live-query-dependencies.md delete mode 100644 .changeset/long-regions-change.md delete mode 100644 .changeset/loud-planets-cheer.md delete mode 100644 .changeset/lucky-papayas-fetch.md delete mode 100644 .changeset/lucky-streets-add.md delete mode 100644 .changeset/lucky-zebras-invent.md delete mode 100644 .changeset/major-drinks-stop.md delete mode 100644 .changeset/major-planets-lie.md delete mode 100644 .changeset/many-ideas-report.md delete mode 100644 .changeset/meta-codegen-no-export.md delete mode 100644 .changeset/meta-module-name-override.md delete mode 100644 .changeset/metal-mammals-smell.md delete mode 100644 .changeset/middleware-error-from-dynamic-rcm.md delete mode 100644 .changeset/middleware-errors-via-rpc-tag.md delete mode 100644 .changeset/mighty-hoops-help.md delete mode 100644 .changeset/migrate-tsgolint.md delete mode 100644 .changeset/modern-humans-chew.md delete mode 100644 .changeset/moody-peas-smoke.md delete mode 100644 .changeset/mutate-invalidation-shorthands.md delete mode 100644 .changeset/mutate-wrap-stream-no-args.md delete mode 100644 .changeset/namespaced-change-feed.md delete mode 100644 .changeset/native-encoded-query-json.md delete mode 100644 .changeset/neat-brooms-wave.md delete mode 100644 .changeset/neat-dingos-tease.md delete mode 100644 .changeset/neat-pumpkins-juggle.md delete mode 100644 .changeset/new-badgers-wait.md delete mode 100644 .changeset/new-berries-march.md delete mode 100644 .changeset/nice-jars-grow.md delete mode 100644 .changeset/nice-needles-film.md delete mode 100644 .changeset/nice-shrimps-fold.md delete mode 100644 .changeset/ninety-stamps-end.md delete mode 100644 .changeset/no-await-effect.md delete mode 100644 .changeset/number-input-dual-separator.md delete mode 100644 .changeset/odd-deers-work.md delete mode 100644 .changeset/odd-tigers-scope.md delete mode 100644 .changeset/old-snakes-film.md delete mode 100644 .changeset/old-suns-kneel.md delete mode 100644 .changeset/olive-onions-lose.md delete mode 100644 .changeset/omega-native-input-types.md delete mode 100644 .changeset/omega-nullable-nested-struct.md delete mode 100644 .changeset/omegaform-between-localization.md delete mode 100644 .changeset/omegaform-decodeto-meta-from-encoded.md delete mode 100644 .changeset/omegaform-enter-submit-repro.md delete mode 100644 .changeset/omegaform-input-registry.md delete mode 100644 .changeset/omegaform-module-split.md delete mode 100644 .changeset/omegaform-typecheck-stories.md delete mode 100644 .changeset/omegaform-vnumber-input.md delete mode 100644 .changeset/optimize-codegen-barrel-model.md delete mode 100644 .changeset/otel-semconv-spans.md delete mode 100644 .changeset/payload-summary-recurse.md delete mode 100644 .changeset/per-namespace-seeding.md delete mode 100644 .changeset/petite-tables-cover.md delete mode 100644 .changeset/polite-chefs-drum.md rename {repos/effect/.changeset => .changeset}/pre/add-adaptive-rate-limiter-store.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-atom-equality.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-bigdecimal-sumall-multiplyall.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-chunk-schema.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-command-hidden.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-config-nested.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-deno-file-system.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-deno-http-client.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-deno-multipart.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-deno-socket-server.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-deno-socket.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-flag-hidden.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-from-string-schemas.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-headers-remove-many.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-http-client-request-update-headers.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-http-client-tracer-header-filter.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-httpapi-with-headers.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-indexeddb-kvs-layer.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-json-schema-draft-04.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-make-msgpack.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-make-option.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-mcp-2025-11-25-protocol.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-mcp-icons.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-missing-tx-modules.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-newtype-module.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-otlp-manual-flush.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-platform-deno.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-scalar-show-operation-id.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-schedule-tap.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-schema-annotate-encoded.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-schema-array-ensure.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-schema-bigdecimal.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-schema-datetime.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-schema-error-module.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-schema-option-from-optional-nullor.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-schema-option-from-undefined-nullish.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-schema-string-encoding.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-schema-tagged-union-discriminants.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-semaphore-take-if-available.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-sql-pglite.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-standard-jsdoc-rule.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-stream-broadcastn.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-tool-set-needs-approval.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-unstable-encoding-export.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-update-service-scoped.md (100%) rename {repos/effect/.changeset => .changeset}/pre/add-values-unprepared.md (100%) rename {repos/effect/.changeset => .changeset}/pre/afraid-cobras-like.md (100%) rename {repos/effect/.changeset => .changeset}/pre/ai-approved-tool-results.md (100%) rename {repos/effect/.changeset => .changeset}/pre/ai-openai-config-field-leak.md (100%) rename {repos/effect/.changeset => .changeset}/pre/ai-openai-file-nullable-fields.md (100%) rename {repos/effect/.changeset => .changeset}/pre/align-type-id-paths.md (100%) rename {repos/effect/.changeset => .changeset}/pre/all-union-record-channels.md (100%) rename {repos/effect/.changeset => .changeset}/pre/anthropic-4-6-structured-output.md (100%) rename {repos/effect/.changeset => .changeset}/pre/anthropic-claude-5-capabilities.md (100%) rename {repos/effect/.changeset => .changeset}/pre/anthropic-image-strings.md (100%) rename {repos/effect/.changeset => .changeset}/pre/anthropic-open-model-enum.md (100%) rename {repos/effect/.changeset => .changeset}/pre/anthropic-stale-max-output-tokens.md (100%) rename {repos/effect/.changeset => .changeset}/pre/anthropic-strict-json-schema.md (100%) rename {repos/effect/.changeset => .changeset}/pre/anthropic-structured-output-fallback.md (100%) rename {repos/effect/.changeset => .changeset}/pre/apply-httpapi-endpoint-client-transform.md (100%) rename {repos/effect/.changeset => .changeset}/pre/arbitrary-index-constraints.md (100%) rename {repos/effect/.changeset => .changeset}/pre/array-ensure-array-elements.md (100%) rename {repos/effect/.changeset => .changeset}/pre/asyncresult-exhaustive.md (100%) rename {repos/effect/.changeset => .changeset}/pre/atom-rpc-query-requires.md (100%) rename {repos/effect/.changeset => .changeset}/pre/atom-solid-idle-ttl.md (100%) rename {repos/effect/.changeset => .changeset}/pre/atom-stream-error-type.md (100%) rename {repos/effect/.changeset => .changeset}/pre/atomic-optional-rc-map.md (100%) rename {repos/effect/.changeset => .changeset}/pre/authentication-error-description.md (100%) rename {repos/effect/.changeset => .changeset}/pre/autocomplete-jk-filter.md (100%) rename {repos/effect/.changeset => .changeset}/pre/batch-persistence-expiration-cleanup.md (100%) rename {repos/effect/.changeset => .changeset}/pre/beige-goats-sin.md (100%) rename {repos/effect/.changeset => .changeset}/pre/beige-paths-sort.md (100%) rename {repos/effect/.changeset => .changeset}/pre/better-apples-nail.md (100%) rename {repos/effect/.changeset => .changeset}/pre/better-rocks-arrive.md (100%) rename {repos/effect/.changeset => .changeset}/pre/better-shrimps-follow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/big-masks-care.md (100%) rename {repos/effect/.changeset => .changeset}/pre/big-pans-look.md (100%) rename {repos/effect/.changeset => .changeset}/pre/blue-dingos-greet.md (100%) rename {repos/effect/.changeset => .changeset}/pre/blue-ligers-cheat.md (100%) rename {repos/effect/.changeset => .changeset}/pre/blue-onions-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/blue-pigs-push.md (100%) rename {repos/effect/.changeset => .changeset}/pre/blue-ravens-type.md (100%) rename {repos/effect/.changeset => .changeset}/pre/blue-trams-kiss.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bold-chairs-yawn.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bold-planets-shout.md (100%) rename {repos/effect/.changeset => .changeset}/pre/brave-keys-commit.md (100%) rename {repos/effect/.changeset => .changeset}/pre/brave-rings-update.md (100%) rename {repos/effect/.changeset => .changeset}/pre/breezy-meals-see.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-bugs-bow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-canyons-clean.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-clocks-count.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-docs-teach.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-dogs-fail.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-flags-stand.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-graphs-calculate.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-graphs-trace.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-journals-commit.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-laws-teach.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-lemons-dance.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-mimes-leave.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-planes-smash.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-rats-attend.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-sockets-connect.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-tags-recognize.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bright-toes-rush.md (100%) rename {repos/effect/.changeset => .changeset}/pre/brown-glasses-thank.md (100%) rename {repos/effect/.changeset => .changeset}/pre/brown-peas-enter.md (100%) rename {repos/effect/.changeset => .changeset}/pre/browser-crypto-missing-subtle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/browser-indexeddb-binary-key-existence.md (100%) rename {repos/effect/.changeset => .changeset}/pre/browser-runtime-custom-teardown.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bumpy-boxes-teach.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bun-http-server-unix-address.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bun-stream-preserve-failure.md (100%) rename {repos/effect/.changeset => .changeset}/pre/bun-websocket-outgoing-compression.md (100%) rename {repos/effect/.changeset => .changeset}/pre/busy-lions-sneeze.md (100%) rename {repos/effect/.changeset => .changeset}/pre/busy-maps-attend.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cache-invalidate-when-replacement.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cache-refresh-cancellation-ownership.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cache-refresh-capacity.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cache-refresh-zero-ttl-ownership.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cache-synchronous-interruption.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cached-with-ttl-callback.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-atoms-relax.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-bash-completions.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-buckets-own.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-buses-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-carrots-march.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-cars-rest.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-coins-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-contexts-rest.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-dates-view.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-dragons-command.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-ducks-fail.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-graphs-span.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-graphs-travel.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-headers-hide.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-heads-close.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-hounds-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-keys-repeat.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-masks-count.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-pages-hide.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-pandas-retry.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-panthers-nail.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-pears-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-queues-await.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-ravens-reflect.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-readers-transact.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-redis-clear.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-results-align.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-schemas-encode.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-seas-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-servers-share.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-services-rest.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-squids-hug.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-tools-parse.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-tools-remember.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-tracers-sample.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-trees-generate.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-tuples-align.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-tuples-pick.md (100%) rename {repos/effect/.changeset => .changeset}/pre/calm-wolves-reduce.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cancel-tedious-requests.md (100%) rename {repos/effect/.changeset => .changeset}/pre/canonical-number-schemas.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cap-rpc-streaming-buffers.md (100%) rename {repos/effect/.changeset => .changeset}/pre/catch-stream-channel-defects.md (100%) rename {repos/effect/.changeset => .changeset}/pre/channel-rundone-completion.md (100%) rename {repos/effect/.changeset => .changeset}/pre/chatty-poets-type.md (100%) rename {repos/effect/.changeset => .changeset}/pre/child-process-astral-escape-arguments.md (100%) rename {repos/effect/.changeset => .changeset}/pre/childprocess-process-group-wait.md (100%) rename {repos/effect/.changeset => .changeset}/pre/chilled-mice-wash.md (100%) rename {repos/effect/.changeset => .changeset}/pre/chilly-pumas-rule.md (100%) rename {repos/effect/.changeset => .changeset}/pre/chubby-buckets-feel.md (100%) rename {repos/effect/.changeset => .changeset}/pre/chubby-parents-flow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/chubby-planets-fall.md (100%) rename {repos/effect/.changeset => .changeset}/pre/chunk-slice-concatenation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clean-balloons-tan.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clean-bulldogs-care.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clean-cats-document.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clean-config-names.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clean-dryers-sneeze.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clean-formatters-agree.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clean-geese-work.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clean-goats-wave.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clean-lions-cancel.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clean-needles-shake.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clean-tires-guess.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clean-yaks-parse.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cleanup-before-use-callbacks.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clear-graphs-reduce.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clear-hairs-pump.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clear-spies-boil.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clear-wings-relax.md (100%) rename {repos/effect/.changeset => .changeset}/pre/clever-maps-care.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cli-completion-command-aliases.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cli-completion-shared-flags.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cli-config-built-ins.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cli-help-choices.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cli-key-value-pair-first-separator.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cli-no-color-values.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cli-optional-alternative-flags.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cli-scalar-constructor-names.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cli-variadic-absence-defaults.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cli-wizard-mode.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cli-wizard-option-looking-values.md (100%) rename {repos/effect/.changeset => .changeset}/pre/close-failed-resource-map-scopes.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cluster-active-teardowns.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cluster-reply-codec-services.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cold-knives-lie.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cold-rooms-show.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cold-shards-continue.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cold-sloths-wave.md (100%) rename {repos/effect/.changeset => .changeset}/pre/common-mammals-tickle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/compact-json-schema-checks.md (100%) rename {repos/effect/.changeset => .changeset}/pre/compact-json-schema-enum.md (100%) rename {repos/effect/.changeset => .changeset}/pre/compatible-dependency-refresh.md (100%) rename {repos/effect/.changeset => .changeset}/pre/config-provider-option-lookup.md (100%) rename {repos/effect/.changeset => .changeset}/pre/config-withdefault-eager.md (100%) rename {repos/effect/.changeset => .changeset}/pre/configurable-schema-reference-policy.md (100%) rename {repos/effect/.changeset => .changeset}/pre/configure-cluster-rpc-buffer-limits.md (100%) rename {repos/effect/.changeset => .changeset}/pre/consolidate-encoding.md (100%) rename {repos/effect/.changeset => .changeset}/pre/consolidate-sql-error.md (100%) rename {repos/effect/.changeset => .changeset}/pre/context-saved-getter-inference.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cookies-error-tag.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cozy-geese-remain.md (100%) rename {repos/effect/.changeset => .changeset}/pre/crisp-seas-warn.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cron-locale-independent-aliases.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cron-single-value-step.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cron-testclock-infinity.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cuddly-rooms-bet.md (100%) rename {repos/effect/.changeset => .changeset}/pre/curly-files-range.md (100%) rename {repos/effect/.changeset => .changeset}/pre/curly-graphs-connect.md (100%) rename {repos/effect/.changeset => .changeset}/pre/curly-graphs-snapshot.md (100%) rename {repos/effect/.changeset => .changeset}/pre/curly-poems-talk.md (100%) rename {repos/effect/.changeset => .changeset}/pre/curly-ravens-decode.md (100%) rename {repos/effect/.changeset => .changeset}/pre/curly-spies-relax.md (100%) rename {repos/effect/.changeset => .changeset}/pre/curly-streams-stop.md (100%) rename {repos/effect/.changeset => .changeset}/pre/curvy-apples-float.md (100%) rename {repos/effect/.changeset => .changeset}/pre/curvy-birds-float.md (100%) rename {repos/effect/.changeset => .changeset}/pre/curvy-graphs-code.md (100%) rename {repos/effect/.changeset => .changeset}/pre/curvy-melons-stare.md (100%) rename {repos/effect/.changeset => .changeset}/pre/curvy-otters-sync.md (100%) rename {repos/effect/.changeset => .changeset}/pre/custom-cli-prompt-prefix.md (100%) rename {repos/effect/.changeset => .changeset}/pre/custom-http-security-openapi-generator.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cute-heads-thank.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cyan-loops-grow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cyan-radios-switch.md (100%) rename {repos/effect/.changeset => .changeset}/pre/cyan-shirts-grin.md (100%) rename {repos/effect/.changeset => .changeset}/pre/d1-batch-statements.md (100%) rename {repos/effect/.changeset => .changeset}/pre/d1-raw-native-results.md (100%) rename {repos/effect/.changeset => .changeset}/pre/dark-dancers-rule.md (100%) rename {repos/effect/.changeset => .changeset}/pre/datetime-calendar-parts.md (100%) rename {repos/effect/.changeset => .changeset}/pre/deduplicate-json-schema-fallbacks.md (100%) rename {repos/effect/.changeset => .changeset}/pre/deep-rivers-spend.md (100%) rename {repos/effect/.changeset => .changeset}/pre/deferred-cleanup-after-completion.md (100%) rename {repos/effect/.changeset => .changeset}/pre/deferred-resume-starvation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/deno-redis-url-credentials.md (100%) rename {repos/effect/.changeset => .changeset}/pre/deno-write-copy-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/deno-writefile-existing-mode.md (100%) rename {repos/effect/.changeset => .changeset}/pre/dirty-lamps-trade.md (100%) rename {repos/effect/.changeset => .changeset}/pre/dirty-laws-wear.md (100%) rename {repos/effect/.changeset => .changeset}/pre/docgen-alias-signature.md (100%) rename {repos/effect/.changeset => .changeset}/pre/docgen-class-property-examples.md (100%) rename {repos/effect/.changeset => .changeset}/pre/docgen-source-relative-module-pages.md (100%) rename {repos/effect/.changeset => .changeset}/pre/docgen-unique-example-files.md (100%) rename {repos/effect/.changeset => .changeset}/pre/doctest-console-output.md (100%) rename {repos/effect/.changeset => .changeset}/pre/doctest-markdown-typescript.md (100%) rename {repos/effect/.changeset => .changeset}/pre/doctest-statement-boundary.md (100%) rename {repos/effect/.changeset => .changeset}/pre/document-child-process-env.md (100%) rename {repos/effect/.changeset => .changeset}/pre/dotenv-literal-substitution.md (100%) rename {repos/effect/.changeset => .changeset}/pre/dry-bugs-hug.md (100%) rename {repos/effect/.changeset => .changeset}/pre/durable-clock-zero-threshold.md (100%) rename {repos/effect/.changeset => .changeset}/pre/durable-deferred-into-encoding-services.md (100%) rename {repos/effect/.changeset => .changeset}/pre/duration-temporal-object-input.md (100%) rename {repos/effect/.changeset => .changeset}/pre/dynamic-tool-parameter-schema.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eager-coats-cheat.md (100%) rename {repos/effect/.changeset => .changeset}/pre/early-birds-dream.md (100%) rename {repos/effect/.changeset => .changeset}/pre/early-donuts-argue.md (100%) rename {repos/effect/.changeset => .changeset}/pre/early-jobs-bow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/early-peaches-check.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-1004-cli-display-width.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-1008-tool-param-failure-mode.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-1036-fiber-allocations.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-1038-http-server-allocations.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-1039-rpc-server-allocations.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-1042-http-server-performance.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-115-sync-scheduler-microtask.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-117-hydration-reactivity.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-1201-http-overhead.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-121-http-router-web-handler.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-123-openai-compat-unknown-events.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-137-web-stream-interop.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-140-deno-crypto.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-141-deno-child-process.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-142-deno-terminal.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-143-deno-stdio.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-145-deno-services.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-148-deno-http-platform.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-151-deno-redis.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-153-deno-http-server.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-153-websocket-initial-frames.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-154-deno-cluster-http.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-155-deno-cluster-socket.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-162-browser-crypto-chunks.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-170-bun-multipart-stream.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-210-cookie-validation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-212-secure-mssql-transport.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-216-secure-http-redirects.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-218-bound-sse-pending-state.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-219-key-value-store-file-keys.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-220-cli-control-characters.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-332-http-response-compression.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-337-preserve-mssql-parameters.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-342-clickhouse-number-binding.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-389-execution-plan-attempts.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-428-pg-transaction-permit.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-467-execution-plan-events.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-477-schedule-concat.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-487-web-tracer-shutdown.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-51-partitioned-semaphore-interruption.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-523-registry-scoped-atom-runtime.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-532-stdio-terminal.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-537-preserve-response-metadata.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-542-rc-ref-generation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-547-node-tracer-timeout.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-548-bun-serve-scope.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-549-worker-send-error.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-552-txqueue-shutdown.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-554-sql-resolver.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-558-deno-file-web-range.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-691-default-logger-ordering.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-693-rpcgroup-handler-deps.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-694-cli-completions-module.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-695-layer-mock-dual-api.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-697-rpcserialization-json-array-decode.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-698-rpcserialization-unreachable-branch.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-700-httpapi-middleware-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-701-httpapierror-respondable.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-704-stream-merge-predicate.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-705-layer-tap-apis.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-706-servicemap-mutate.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-716-response-id-tracker-map.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-717-openai-socket-cancel.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-718-embedding-model-surface.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-725-fix-catch-jsdoc.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-726-model-dimensions.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-727-cli-help-alignment.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-730-language-model-incremental-fallback.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-736-cached-with-ttl.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-738-cron-prev.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-739-openai-function-call-done.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-740-missing-summary-parts.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-742-http-client-request-web.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-744-sqlite-migrator-lock.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-746-fixed-iteration-catchup.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-747-unify-effect.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-754-url-builder-any.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-755-references-core.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-769-select-text-highlight.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-774-mutable-list-append-all-empty-array.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-777-schema-make-effect.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-778-http-middleware-path-logger.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-779-keyvaluestore-layer-sql.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-780-layer-unify.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-781-fix-stream-toqueue-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-782-httpapi-status-literals.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-783-atom-http-api-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-798-schema-parser.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-802-tagged-union-match-or-else.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-806-schema-error-stack.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-819-cluster-workflow-shard-groups.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-825-pool-performance.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-825-pool-use.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-825-scope-single-finalizer.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-837-dependency-updates.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-849-transpose-option.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-851-skip-empty-remote-write.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-854-pg-connection-startup.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-861-indexeddb-equals.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-946-concurrent-traversal-cleanup.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-952-terminal-failure-stack.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-953-interruptor-stack-trace.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-955-run-sync-dispatcher.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-956-await-all-children.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-961-node-socket-tls.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-963-node-socket-server-tls.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-965-socket-upgrade.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-969-dependency-updates.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-972-deno-socket-server.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eff-997-service-keys.md (100%) rename {repos/effect/.changeset => .changeset}/pre/effect-eager-transform-arguments.md (100%) rename {repos/effect/.changeset => .changeset}/pre/effect-scoped-service-restoration.md (100%) rename {repos/effect/.changeset => .changeset}/pre/effect-unmatched-reason-preservation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/effectable-class-override-delegation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/effectable-mixin.md (100%) rename {repos/effect/.changeset => .changeset}/pre/effectify-mapper-input-tuples.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eight-turkeys-own.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eighty-lies-deny.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eighty-poets-draw.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eighty-swans-scream.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eighty-teeth-sniff.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eleven-apes-share.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eleven-numbers-bake.md (100%) rename {repos/effect/.changeset => .changeset}/pre/empty-env-values-missing.md (100%) rename {repos/effect/.changeset => .changeset}/pre/empty-geckos-dispatch.md (100%) rename {repos/effect/.changeset => .changeset}/pre/empty-gifts-beg.md (100%) rename {repos/effect/.changeset => .changeset}/pre/empty-http-rpc-client.md (100%) rename {repos/effect/.changeset => .changeset}/pre/empty-snakes-return.md (100%) rename {repos/effect/.changeset => .changeset}/pre/entity-proxy-client-codec-services.md (100%) rename {repos/effect/.changeset => .changeset}/pre/entity-test-client-fatal-defect-option.md (100%) rename {repos/effect/.changeset => .changeset}/pre/escape-completion-choice-values.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eventlog-authentication-forbidden-retry.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eventlog-empty-chunk-framing.md (100%) rename {repos/effect/.changeset => .changeset}/pre/eventlog-unencrypted.md (100%) rename {repos/effect/.changeset => .changeset}/pre/every-olives-burn.md (100%) rename {repos/effect/.changeset => .changeset}/pre/exact-byte-size.md (100%) rename {repos/effect/.changeset => .changeset}/pre/exact-http-file-body-length.md (100%) rename {repos/effect/.changeset => .changeset}/pre/execution-plan-captured-predicate.md (100%) rename {repos/effect/.changeset => .changeset}/pre/expand-schema-filter-output.md (100%) rename {repos/effect/.changeset => .changeset}/pre/explicit-env-record.md (100%) rename {repos/effect/.changeset => .changeset}/pre/explicit-otel-service-identity.md (100%) rename {repos/effect/.changeset => .changeset}/pre/export-schema-encode-keys-interface.md (100%) rename {repos/effect/.changeset => .changeset}/pre/expose-ai-prompt-part-schemas.md (100%) rename {repos/effect/.changeset => .changeset}/pre/extract-semaphore-latch.md (100%) rename {repos/effect/.changeset => .changeset}/pre/failed-otlp-checkpoints.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-bees-relax.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-birds-limit.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-buttons-share.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-citations-stream.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-cooks-stop.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-cups-train.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-dryers-speak.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-forks-shake.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-jobs-like.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-logs-correlate.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-logs-listen.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-matches-infer.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-pandas-prove.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-pants-float.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-poems-visit.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-sampling-content.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-sinks-catch.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fair-workflows-suspend.md (100%) rename {repos/effect/.changeset => .changeset}/pre/famous-loops-flow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/famous-wolves-lead.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fancy-glasses-grow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fast-graph-path-queues.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fast-times-camp.md (100%) create mode 100644 .changeset/pre/faster-schema-construction.md rename {repos/effect/.changeset => .changeset}/pre/fetch-raw-stream-duplex.md (100%) rename {repos/effect/.changeset => .changeset}/pre/few-birds-matter.md (100%) rename {repos/effect/.changeset => .changeset}/pre/few-cougars-dig.md (100%) rename {repos/effect/.changeset => .changeset}/pre/few-foxes-grin.md (100%) rename {repos/effect/.changeset => .changeset}/pre/few-mirrors-pull.md (100%) rename {repos/effect/.changeset => .changeset}/pre/few-socks-poke.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fiber-join-all-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fiber-map-reentrant-replacement.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fiber-registration-same-fiber.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fiber-runtime-start-metrics.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fiery-jokes-care.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fiery-mammals-call.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fifty-carrots-punch.md (100%) rename {repos/effect/.changeset => .changeset}/pre/file-prompt-jk-filter.md (100%) rename {repos/effect/.changeset => .changeset}/pre/filesystem-sink-undefined-flag.md (100%) rename {repos/effect/.changeset => .changeset}/pre/filesystem-stat-optional-inode.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fine-walls-decide.md (100%) rename {repos/effect/.changeset => .changeset}/pre/first-success-of.md (100%) rename {repos/effect/.changeset => .changeset}/pre/five-parents-relax.md (100%) rename {repos/effect/.changeset => .changeset}/pre/five-spoons-visit.md (100%) rename {repos/effect/.changeset => .changeset}/pre/five-worms-rhyme.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-1332.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-1917.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-1927.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-1940.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-1947.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-2002.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-2012.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-2015.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-2260.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-2268.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-2271.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-2384.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-2414.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-2419.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-2497.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-2499.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-6464.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-6491.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-6521.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-ai-empty-params-structured-output.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-ai-text-toolkit-typing.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-ai-tool-call-id.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-ansi-cursor-to.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-anthropic-caller-toolid.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-anthropic-code-execution-deltas.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-anthropic-header-redaction.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-anthropic-memory-tool-requires-handler.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-anthropic-memory-tool.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-anthropic-plaintext-bytes.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-array-non-finite-indexes.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-atom-batch-dependencies.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-atom-http-stream-success-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-atom-http-top-level-dispatch.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-atom-kvs-async-write.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-atom-query-zero-ttl.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-atom-rpc-client-middleware-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-atom-suspense-registry-cache.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-atom-writable-fallback.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-bash-subcommand-dispatch.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-bigint-gcd-lcm.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-bun-http-default-hostname.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cache-set-race.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-catch-orelse-error-erasure.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cause-map-annotations.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-channel-effects-finalizer.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-channel-schema-decode-unknown.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-chunk-fractional-counts.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-class-constructor-defaults.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cli-help-table-spacing.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cli-missing-flag-values.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cli-mixed-global-flag-context.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cli-subcommands-requirements.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cli-unexpected-arguments.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-clickhouse-connect-timeout.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cluster-entity-context-bleed.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cluster-reply-defect-isolation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cluster-shutdown-deadlock.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cluster-strand-request-shutdown.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cluster-stream-recovery.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-config-array-default.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-config-or-else-evidence.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-config-withDefault.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-config-withdefault-filter.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-context-add-or-omit-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cors-vary.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cron-and-representations.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cron-make-validation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cron-next-missing-day-overflow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cron-parser-semantics.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cron-prev-month-rollover.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cron-prev-weekday-wrap.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-cron-timezone-hash.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-dangling-internal-declarations.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-datetime-gmt.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-deep-mutable-opaque-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-devtools-flush-on-teardown.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-devtools-span-snapshot.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-durable-clock-fractional-wakeup.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-durable-deferred-race.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-durable-race-replay.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-duration-decimal-precision.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-duration-symmetric-rounding.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-effect-fn-self.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-effect-schedule-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-encoded-header-metadata.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-entity-manager-defect-replay.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-entity-proxy-rpc-handler-context.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-entity-proxy-server-path-params.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-eventlog-duplicate-chunks.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-fiber-exit-observers.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-fiberhandle-clear-race.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-fiberset-json-id.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-fiberset-runtime-interruption.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-filesystem-integer-precision.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-fish-command-path.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-formatter-output-contracts.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-from-json-string-identifier.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-from-option-inline-inference.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-from-readable-stream-cancel-defect.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-graph-allocator-equality.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-graph-bellman-ford-self-cycle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-graph-curried-getters.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-graph-dfs-astar-edge-cases.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-graph-edge-transforms.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-graph-finite-edge-weights.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-graph-mutable-hash.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-graph-mutable-topo.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-graph-mutation-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-graph-topo-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-graph-undirected-traversal.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-graph-walker-repeatability.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-graphviz-dot-escaping.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-group-by-key-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-has-interrupts-only-empty.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-hashmap-bit31-ordering.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-hashmap-modify-hash.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-headers-proto-enumerability.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-http-client-request-content-length.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-http-incoming-message-parse-options.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-http-platform-file-ranges.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-http-pre-response-handler-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-http-server-request-raw-body.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-http-server-response-body-headers.md (100%) create mode 100644 .changeset/pre/fix-http-toweb-null-body-status.md rename {repos/effect/.changeset => .changeset}/pre/fix-http-tracer-response-cause.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-httpapi-authorization-decoding.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-httpapi-client-error-content-type.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-httpapi-endpoint-error-inference.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-httpapi-form-responses.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-httpapi-malformed-json-400.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-httpapi-runtime-shape.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-httpapi-schema-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-httpapi-security-middleware-cache.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-httpapi-single-array-query.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-httpapi-test-pre-response-handlers.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-httpapi-url-builder-base-path.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-invalid-openapi-examples.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-invalid-value-doubled-expected.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-is-json-dag.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-iterable-flatten-stack-safety.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-json-schema-anyof-oneof-siblings.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-json-schema-import-json.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-json-schema-percent-references.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-json-schema-reference-resolution.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-json-schema-unique-items-false.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-keepalive-blocked-timers.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-language-model-stream-concurrency.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-latch-stale-flush.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-layermap-preload.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-mcp-call-tool-arguments.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-mcp-completion-context.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-mcp-param-name-resolution.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-mcp-request-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-memory-journal-conflicts.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-memory-journal-next-sequence.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-memory-journal-relay.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-memory-runner-health.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-memory-workflow-interrupt.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-mermaid-escape-special-chars.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-message-storage-clear-address-dedup.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-metric-attribute-key-collisions.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-metric-is-metric.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-metric-linear-boundaries.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-metric-negative-max.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-mime-parameter-normalization.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-mssql-multitable-persistence-upsert.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-multipart-file-stream-limits.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-mutable-list-bounds.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-mutable-list-empty-filter.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-mutable-list-filter-length.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-ndjson-split-utf8.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-negative-file-seek.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-node-compression-content-type.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-node-http-stream-failure.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-node-path-file-url-flavor.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-node-pipeline-kill.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-number-remainder-scientific-notation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-object-keyword-json-schema.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-one-shot-iterables.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-openai-header-redaction.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-openai-mcp-tool-names.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-openai-response-failure.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-openai-specialized-tool-output.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-openai-system-input-text.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-openai-telemetry-response-namespace.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-openai-web-search-action.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-openapi-client-form-url-encoding.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-openapi-client-multipart-records.md (100%) create mode 100644 .changeset/pre/fix-openapi-client-paths.md rename {repos/effect/.changeset => .changeset}/pre/fix-openapi-endpoint-transform-order.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-openapi-from-api-cache-copy.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-openapi-generator-form-urlencoded.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-openapi-generator-swagger2openapi.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-openapi-preserve-multiple-response-content-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-openapi-stream-transform-client.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-openrouter-sparse-array.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-otel-logger-clock-skew.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-otel-logger-severity-number.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-otel-logger-shutdown.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-otlp-exporter-shutdown.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-otlp-resource-attributes.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-pending-interruptible-mask.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-persisted-cluster-reply-hang.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-persisted-queue-attempt-accounting.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-pg-tls-servername.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-prompt-all-iterables.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-prompt-date-tab-buffer.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-proto-record-assignment.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-pubsub-replay-retention.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-queue-collect-duplication.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-random-string-seeds.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-rate-limiter-sleep.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-ratelimiter-tokenbucket-redis-ttl.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-react-native-sqlite-values.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-react-ref-switch.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-reactive-query-metadata.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-reactivity-duplicate-keys.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-read-alloc-invalid-sizes.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-redis-persisted-queue.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-remainder-scientific-notation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-request-resolver-pending-batches-leak.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-retry-transient-autocomplete.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-rpc-http-requestids-finalizer.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-rpc-json-id-edges.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-rpc-unknown-tag-isolation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-runner-stream-completion.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schedule-during.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schedule-fixed-double-exec.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schedule-reduce-sync-state.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-arbitrary-exclusive-bounds.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-bracket-prototype-pollution.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-codegen-optional-tuples.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-codegen-proto.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-defect-message.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-encode-keys-property-keys.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-encodekeys-class.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-encodekeys-struct.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-encoding-checks.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-identifier-expected-message.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-is-json-records.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-is-uuid.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-json-tuple-allof.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-make-nested-class-union.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-option-non-schema-failures.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-parser-checks.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-pattern-state.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-representation-identifiers.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-sentinel-declaration.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-tuple-post-rest-indexing.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-union-dispatch-order.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-schema-union-pruning.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-scoped-ref-failed-replacement.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-searchparam-initial-decode.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-semaphore-with-permits-interrupt-leak.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-serializable-wire-transfer.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-sink-flatmap-leftovers.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-sliding-size-chunks.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-sql-persisted-queue-lock-refresh.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-sqlite-persisted-queue.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-sse-last-event-id.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-sse-leading-bom.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-sse-mixed-line-endings.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-sse-retry-directives.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-static-head-range.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-static-oversized-ranges.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-stream-aggregate-within-idle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-stream-execution-plan-retries.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-stream-grouped-within-flush.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-stream-haltwhen.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-stream-map-accum-array-effect.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-stream-range-zero-chunk.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-stream-run-for-each-while.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-stream-scan-effect.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-stream-scoped-scope.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-stream-wrapper-status.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-string-case-digits.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-strip-approval-artifacts-multi-round.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-struct-utility-types-simplify.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-structural-proto-equality.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-structwithrest-index-signatures.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-subscription-ref-get-and-update-some.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-subscriptionref-getandupdateeffect.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-tagged-union-class-sentinels.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-tagged-union-match-unify.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-to-tagged-union-isanyof-custom-tags.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-toml-array-subtables.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-tool-provider-defined-clone.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-tool-result-serialization.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-trie-key-replacement.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-trie-longest-prefix.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-trie-undefined-values.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-tuple-with-rest-post-rest-index-drift.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-tuple-with-rest-post-rest-validation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-txpubsub-publish-all-iterables.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-txqueue-closing-drain.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-txqueue-offer-all-iterables.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-types-voidifempty.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-variant-schema-default-cache.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-vitest-proxy-chained-helpers.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-vitest-record-schema-arbitrary.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-vitest-runner-import.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-vitest-throws-assertions.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-void-mcp-tool-results.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-void-response-encoding.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-vue-ref-switch.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-worker-runner-cleanup.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-workflow-activity-interruption.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-workflow-defect-reply-serialization.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-workflow-entity-client-collision.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-workflow-proxy-rpc-handler-context.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-workflow-trace-context.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-xhr-form-data.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-yaml-folded-scalars.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-zero-max-bytes.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fix-zsh-mixed-command-completions.md (100%) rename {repos/effect/.changeset => .changeset}/pre/flat-chicken-remain.md (100%) rename {repos/effect/.changeset => .changeset}/pre/flat-graphs-agree.md (100%) rename {repos/effect/.changeset => .changeset}/pre/flat-pipelines-share.md (100%) rename {repos/effect/.changeset => .changeset}/pre/floppy-cows-spend.md (100%) rename {repos/effect/.changeset => .changeset}/pre/floppy-frogs-juggle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/floppy-items-admire.md (100%) rename {repos/effect/.changeset => .changeset}/pre/floppy-pigs-kiss.md (100%) rename {repos/effect/.changeset => .changeset}/pre/floppy-rats-leave.md (100%) rename {repos/effect/.changeset => .changeset}/pre/floyd-warshall-null-edge-data.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fluffy-meals-matter.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fluffy-pumas-push.md (100%) rename {repos/effect/.changeset => .changeset}/pre/forked-memo-maps.md (100%) rename {repos/effect/.changeset => .changeset}/pre/formatter-defined-error-causes.md (100%) rename {repos/effect/.changeset => .changeset}/pre/forty-hounds-cheer.md (100%) rename {repos/effect/.changeset => .changeset}/pre/forty-otters-cry.md (100%) rename {repos/effect/.changeset => .changeset}/pre/forty-rings-film.md (100%) rename {repos/effect/.changeset => .changeset}/pre/forty-signs-stay.md (100%) rename {repos/effect/.changeset => .changeset}/pre/forty-swans-divide.md (100%) rename {repos/effect/.changeset => .changeset}/pre/forty-trees-pay.md (100%) rename {repos/effect/.changeset => .changeset}/pre/four-papayas-bow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/four-points-repeat.md (100%) rename {repos/effect/.changeset => .changeset}/pre/frank-apes-vanish.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fresh-cats-smash.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fresh-cycles-wait.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fresh-deps-update.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fresh-emus-cheat.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fresh-files-seek.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fresh-forms-travel.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fresh-graphs-cycle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fresh-images-generate.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fresh-lines-wait.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fresh-monkeys-smoke.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fresh-pools-rotate.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fresh-rivers-report.md (100%) rename {repos/effect/.changeset => .changeset}/pre/frozen-intrinsics-stack-trace-limit.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fruity-houses-learn.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fruity-sloths-walk.md (100%) rename {repos/effect/.changeset => .changeset}/pre/full-adults-double.md (100%) rename {repos/effect/.changeset => .changeset}/pre/funny-crabs-hang.md (100%) rename {repos/effect/.changeset => .changeset}/pre/funny-ears-beam.md (100%) rename {repos/effect/.changeset => .changeset}/pre/funny-forks-move.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-batches-stop.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-caches-expire.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-camels-hunt.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-cats-kill.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-cats-listen.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-classes-compare.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-crews-fold.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-databases-abort.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-dodos-help.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-files-slice.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-graphs-transform.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-hornets-wish.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-lions-perform.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-lions-study.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-pandas-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-planets-sneeze.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-rabbits-cancel.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-ravens-reason.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-routers-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-stamps-care.md (100%) rename {repos/effect/.changeset => .changeset}/pre/fuzzy-timers-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/general-json-schema-converters.md (100%) rename {repos/effect/.changeset => .changeset}/pre/giant-jeans-float.md (100%) rename {repos/effect/.changeset => .changeset}/pre/gold-meteors-move.md (100%) rename {repos/effect/.changeset => .changeset}/pre/gold-readers-hug.md (100%) rename {repos/effect/.changeset => .changeset}/pre/gold-rings-start.md (100%) rename {repos/effect/.changeset => .changeset}/pre/good-cups-reply.md (100%) rename {repos/effect/.changeset => .changeset}/pre/good-tools-work.md (100%) rename {repos/effect/.changeset => .changeset}/pre/good-trees-pull.md (100%) rename {repos/effect/.changeset => .changeset}/pre/graph-acyclic-parallel-undirected-edges.md (100%) rename {repos/effect/.changeset => .changeset}/pre/graph-algorithm-fixes.md (100%) rename {repos/effect/.changeset => .changeset}/pre/graph-bellman-ford-infinite-cycle-barriers.md (100%) rename {repos/effect/.changeset => .changeset}/pre/graph-finalized-mutation-handle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/graph-guard-predicates.md (100%) rename {repos/effect/.changeset => .changeset}/pre/graph-sync-mutation-callbacks.md (100%) rename {repos/effect/.changeset => .changeset}/pre/graph-undirected-edge-equality.md (100%) rename {repos/effect/.changeset => .changeset}/pre/graph-walker-iterator-receiver.md (100%) rename {repos/effect/.changeset => .changeset}/pre/great-trains-mate.md (100%) rename {repos/effect/.changeset => .changeset}/pre/great-trams-report.md (100%) rename {repos/effect/.changeset => .changeset}/pre/green-ads-camp.md (100%) rename {repos/effect/.changeset => .changeset}/pre/green-beds-unref.md (100%) rename {repos/effect/.changeset => .changeset}/pre/green-birds-close.md (100%) rename {repos/effect/.changeset => .changeset}/pre/green-chips-wash.md (100%) rename {repos/effect/.changeset => .changeset}/pre/green-moons-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/green-pugs-play.md (100%) rename {repos/effect/.changeset => .changeset}/pre/green-rings-prove.md (100%) rename {repos/effect/.changeset => .changeset}/pre/happy-mirrors-dream.md (100%) rename {repos/effect/.changeset => .changeset}/pre/harden-httpapi-documentation-html.md (100%) rename {repos/effect/.changeset => .changeset}/pre/hash-sql-message-dedupe-keys.md (100%) rename {repos/effect/.changeset => .changeset}/pre/hashmap-collision-entries.md (100%) rename {repos/effect/.changeset => .changeset}/pre/hashring-exclusion-endpoint.md (100%) rename {repos/effect/.changeset => .changeset}/pre/headers-redacted-name-case.md (100%) rename {repos/effect/.changeset => .changeset}/pre/headers-stateful-patterns.md (100%) rename {repos/effect/.changeset => .changeset}/pre/heavy-loops-cut.md (100%) rename {repos/effect/.changeset => .changeset}/pre/heavy-trams-fix.md (100%) rename {repos/effect/.changeset => .changeset}/pre/hip-friends-kiss.md (100%) rename {repos/effect/.changeset => .changeset}/pre/hip-socks-travel.md (100%) rename {repos/effect/.changeset => .changeset}/pre/honest-pens-thank.md (100%) rename {repos/effect/.changeset => .changeset}/pre/honest-rivers-notice.md (100%) rename {repos/effect/.changeset => .changeset}/pre/hot-taxis-fry.md (100%) rename {repos/effect/.changeset => .changeset}/pre/hot-teeth-clean.md (100%) rename {repos/effect/.changeset => .changeset}/pre/http-client-catch-response-result.md (100%) rename {repos/effect/.changeset => .changeset}/pre/http-client-redirect-preprocessing-recovery.md (100%) rename {repos/effect/.changeset => .changeset}/pre/http-client-response-schema-json-options.md (100%) rename {repos/effect/.changeset => .changeset}/pre/http-head-stream-scope.md (100%) rename {repos/effect/.changeset => .changeset}/pre/http-json-reviver.md (100%) rename {repos/effect/.changeset => .changeset}/pre/http-response-content-length.md (100%) rename {repos/effect/.changeset => .changeset}/pre/http-router-normalized-prefix.md (100%) rename {repos/effect/.changeset => .changeset}/pre/http-runner-path-boundary.md (100%) rename {repos/effect/.changeset => .changeset}/pre/http-server-websocket-options.md (100%) rename {repos/effect/.changeset => .changeset}/pre/http-status-from-literal.md (100%) rename {repos/effect/.changeset => .changeset}/pre/http-web-handler-cold-start.md (100%) rename {repos/effect/.changeset => .changeset}/pre/httpapi-endpoint-relax-constraints.md (100%) rename {repos/effect/.changeset => .changeset}/pre/httpapi-middleware-error-dedupe.md (100%) rename {repos/effect/.changeset => .changeset}/pre/httpapi-schema-service-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/httpapi-sse-decode-options.md (100%) rename {repos/effect/.changeset => .changeset}/pre/huge-moons-rhyme.md (100%) rename {repos/effect/.changeset => .changeset}/pre/humble-pigs-dig.md (100%) rename {repos/effect/.changeset => .changeset}/pre/hungry-kings-look.md (100%) rename {repos/effect/.changeset => .changeset}/pre/icy-flies-cross.md (100%) rename {repos/effect/.changeset => .changeset}/pre/improve-json-schema-import.md (100%) rename {repos/effect/.changeset => .changeset}/pre/indexeddb-out-of-line-primary-keys.md (100%) rename {repos/effect/.changeset => .changeset}/pre/indexeddb-stream-query-limits.md (100%) rename {repos/effect/.changeset => .changeset}/pre/internal-json-string-schema.md (100%) rename {repos/effect/.changeset => .changeset}/pre/isolate-sql-compiler-cache.md (100%) rename {repos/effect/.changeset => .changeset}/pre/isolate-unencodable-hydration.md (100%) rename {repos/effect/.changeset => .changeset}/pre/itchy-radios-poke.md (100%) rename {repos/effect/.changeset => .changeset}/pre/itchy-results-bet.md (100%) rename {repos/effect/.changeset => .changeset}/pre/itchy-shrimps-deny.md (100%) rename {repos/effect/.changeset => .changeset}/pre/itchy-toes-promise.md (100%) rename {repos/effect/.changeset => .changeset}/pre/k8s-last-transition-null.md (100%) rename {repos/effect/.changeset => .changeset}/pre/keep-httpapi-composition-immutable.md (100%) rename {repos/effect/.changeset => .changeset}/pre/khaki-cats-learn.md (100%) rename {repos/effect/.changeset => .changeset}/pre/khaki-melons-appear.md (100%) rename {repos/effect/.changeset => .changeset}/pre/kind-flags-help.md (100%) rename {repos/effect/.changeset => .changeset}/pre/kind-hounds-float.md (100%) rename {repos/effect/.changeset => .changeset}/pre/kind-windows-fall.md (100%) rename {repos/effect/.changeset => .changeset}/pre/large-postgres-messages.md (100%) rename {repos/effect/.changeset => .changeset}/pre/late-hotels-rule.md (100%) rename {repos/effect/.changeset => .changeset}/pre/late-lamps-care.md (100%) rename {repos/effect/.changeset => .changeset}/pre/late-rivers-applaud.md (100%) rename {repos/effect/.changeset => .changeset}/pre/late-sockets-rest.md (100%) rename {repos/effect/.changeset => .changeset}/pre/layer-error-observer-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/layer-map-dynamic-idle-ttl.md (100%) rename {repos/effect/.changeset => .changeset}/pre/layer-span-trace-options.md (100%) rename {repos/effect/.changeset => .changeset}/pre/layered-context-storage.md (100%) rename {repos/effect/.changeset => .changeset}/pre/layermap-preloaded-acquisition-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/lazy-bun-redis-import.md (100%) rename {repos/effect/.changeset => .changeset}/pre/lazy-openapi-initialization.md (100%) rename {repos/effect/.changeset => .changeset}/pre/lazy-queens-rush.md (100%) rename {repos/effect/.changeset => .changeset}/pre/lazy-recursive-forward-refs.md (100%) rename {repos/effect/.changeset => .changeset}/pre/lazy-timers-exist.md (100%) rename {repos/effect/.changeset => .changeset}/pre/lazy-undici-loading.md (100%) rename {repos/effect/.changeset => .changeset}/pre/legal-pants-drop.md (100%) rename {repos/effect/.changeset => .changeset}/pre/lemon-taxis-sin.md (100%) rename {repos/effect/.changeset => .changeset}/pre/libsql-transaction-client-isolation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/light-kids-sneeze.md (100%) rename {repos/effect/.changeset => .changeset}/pre/little-dryers-allow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/logger-complete-file-writes.md (100%) rename {repos/effect/.changeset => .changeset}/pre/long-cameras-think.md (100%) rename {repos/effect/.changeset => .changeset}/pre/loose-wings-lie.md (100%) rename {repos/effect/.changeset => .changeset}/pre/lovely-cobras-change.md (100%) rename {repos/effect/.changeset => .changeset}/pre/lovely-frogs-rescue.md (100%) rename {repos/effect/.changeset => .changeset}/pre/lucky-buttons-jump.md (100%) rename {repos/effect/.changeset => .changeset}/pre/lucky-dingos-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/lucky-phones-listen.md (100%) rename {repos/effect/.changeset => .changeset}/pre/lucky-worms-type.md (100%) rename {repos/effect/.changeset => .changeset}/pre/major-chairs-design.md (100%) rename {repos/effect/.changeset => .changeset}/pre/managed-runtime-async-dispose.md (100%) rename {repos/effect/.changeset => .changeset}/pre/many-badgers-obey.md (100%) rename {repos/effect/.changeset => .changeset}/pre/match-generic-value-terminals.md (100%) rename {repos/effect/.changeset => .changeset}/pre/mcp-http-initialize-version-header.md (100%) rename {repos/effect/.changeset => .changeset}/pre/mcp-http-resource-template-origins.md (100%) rename {repos/effect/.changeset => .changeset}/pre/mcp-prompt-decoded-parameter-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/mcp-protocol-versions.md (100%) rename {repos/effect/.changeset => .changeset}/pre/mcp-structured-content-object.md (100%) rename {repos/effect/.changeset => .changeset}/pre/mcp-tool-output-schema.md (100%) rename {repos/effect/.changeset => .changeset}/pre/mean-dingos-share.md (100%) rename {repos/effect/.changeset => .changeset}/pre/mean-trains-smash.md (100%) rename {repos/effect/.changeset => .changeset}/pre/memoize-idempotent-asts.md (100%) rename {repos/effect/.changeset => .changeset}/pre/memory-message-storage-clear-controls.md (100%) rename {repos/effect/.changeset => .changeset}/pre/merge-resource-failures.md (100%) rename {repos/effect/.changeset => .changeset}/pre/metal-nails-sneeze.md (100%) rename {repos/effect/.changeset => .changeset}/pre/metal-parts-yell.md (100%) rename {repos/effect/.changeset => .changeset}/pre/metric-attribute-order-identity.md (100%) rename {repos/effect/.changeset => .changeset}/pre/metric-registry-isolation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/mighty-games-matter.md (100%) rename {repos/effect/.changeset => .changeset}/pre/migrate-persisted-queues.md (100%) rename {repos/effect/.changeset => .changeset}/pre/migrator-windows-file-url.md (100%) rename {repos/effect/.changeset => .changeset}/pre/model-field-option-undefined.md (100%) rename {repos/effect/.changeset => .changeset}/pre/modern-carrots-see.md (100%) rename {repos/effect/.changeset => .changeset}/pre/modern-uuid-guid-filter.md (100%) rename {repos/effect/.changeset => .changeset}/pre/mssql-binary-parameters.md (100%) rename {repos/effect/.changeset => .changeset}/pre/mssql-ntlm-domain.md (100%) rename {repos/effect/.changeset => .changeset}/pre/multipart-collect-linear.md (100%) rename {repos/effect/.changeset => .changeset}/pre/multipart-onDone-clobbers-error.md (100%) rename {repos/effect/.changeset => .changeset}/pre/multipart-parser-limits.md (100%) rename {repos/effect/.changeset => .changeset}/pre/multipart-streamed-part-guard.md (100%) rename {repos/effect/.changeset => .changeset}/pre/mutable-arrays-preserve.md (100%) rename {repos/effect/.changeset => .changeset}/pre/mutable-list-bulk-prepend-tail.md (100%) rename {repos/effect/.changeset => .changeset}/pre/mysql2-disable-prepared-statements.md (100%) rename {repos/effect/.changeset => .changeset}/pre/name-random-services.md (100%) rename {repos/effect/.changeset => .changeset}/pre/narrow-schedule-while.md (100%) rename {repos/effect/.changeset => .changeset}/pre/nasty-geese-grow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/neat-goats-wave.md (100%) rename {repos/effect/.changeset => .changeset}/pre/neat-graphs-induced.md (100%) rename {repos/effect/.changeset => .changeset}/pre/neat-kings-chew.md (100%) rename {repos/effect/.changeset => .changeset}/pre/neat-lions-rest.md (100%) rename {repos/effect/.changeset => .changeset}/pre/neat-pandas-query.md (100%) rename {repos/effect/.changeset => .changeset}/pre/neat-snails-wash.md (100%) rename {repos/effect/.changeset => .changeset}/pre/neat-taxis-notice.md (100%) rename {repos/effect/.changeset => .changeset}/pre/neat-tuples-remember.md (100%) rename {repos/effect/.changeset => .changeset}/pre/neat-windows-buy.md (100%) rename {repos/effect/.changeset => .changeset}/pre/nested-union-sentinels.md (100%) rename {repos/effect/.changeset => .changeset}/pre/net-address-values.md (100%) rename {repos/effect/.changeset => .changeset}/pre/new-dogs-swim.md (100%) rename {repos/effect/.changeset => .changeset}/pre/new-toes-stop.md (100%) rename {repos/effect/.changeset => .changeset}/pre/ninety-books-sit.md (100%) rename {repos/effect/.changeset => .changeset}/pre/ninety-geese-exist.md (100%) rename {repos/effect/.changeset => .changeset}/pre/node-http-status-text.md (100%) rename {repos/effect/.changeset => .changeset}/pre/node-redis-client.md (100%) rename {repos/effect/.changeset => .changeset}/pre/node-response-preserve-bytes.md (100%) rename {repos/effect/.changeset => .changeset}/pre/node-sink-cancel-drain.md (100%) rename {repos/effect/.changeset => .changeset}/pre/node-sink-finalization-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/node-stream-buffer-size.md (100%) rename {repos/effect/.changeset => .changeset}/pre/node-terminal-idle-ttl.md (100%) rename {repos/effect/.changeset => .changeset}/pre/node-terminal-stdin-eof.md (100%) rename {repos/effect/.changeset => .changeset}/pre/node-watch-relative.md (100%) rename {repos/effect/.changeset => .changeset}/pre/node-worker-unsafe-send-envelope.md (100%) rename {repos/effect/.changeset => .changeset}/pre/node-writeall-empty.md (100%) rename {repos/effect/.changeset => .changeset}/pre/normalize-collection-counts.md (100%) rename {repos/effect/.changeset => .changeset}/pre/normalize-httpapi-payload-media-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/normalize-unbounded-pubsub-replay.md (100%) rename {repos/effect/.changeset => .changeset}/pre/number-remainder-negative-zero-dividend.md (100%) rename {repos/effect/.changeset => .changeset}/pre/o8drprcu-sqlite-node-node-sqlite.md (100%) rename {repos/effect/.changeset => .changeset}/pre/odd-boats-think.md (100%) rename {repos/effect/.changeset => .changeset}/pre/odd-bulldogs-sleep.md (100%) rename {repos/effect/.changeset => .changeset}/pre/odd-fans-glow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/odd-forks-talk.md (100%) rename {repos/effect/.changeset => .changeset}/pre/odd-laws-draw.md (100%) rename {repos/effect/.changeset => .changeset}/pre/odd-owls-smoke.md (100%) rename {repos/effect/.changeset => .changeset}/pre/odd-socks-boil.md (100%) rename {repos/effect/.changeset => .changeset}/pre/odd-suns-dance.md (100%) rename {repos/effect/.changeset => .changeset}/pre/old-brooms-cry.md (100%) rename {repos/effect/.changeset => .changeset}/pre/old-facts-stand.md (100%) rename {repos/effect/.changeset => .changeset}/pre/old-mirrors-float.md (100%) rename {repos/effect/.changeset => .changeset}/pre/olive-poems-visit.md (100%) rename {repos/effect/.changeset => .changeset}/pre/olive-queues-persist.md (100%) rename {repos/effect/.changeset => .changeset}/pre/opaque-graph-interface.md (100%) rename {repos/effect/.changeset => .changeset}/pre/open-hotels-remain.md (100%) rename {repos/effect/.changeset => .changeset}/pre/open-objects-intersect.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openai-compat-decode-tool-params.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openai-compat-empty-assistant-content.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openai-compat-null-tool-calls.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openai-compat-nullable-tool-name.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openai-compat-parallel-tool-calls.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openai-compat-reasoning.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openai-compatible-quota-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openai-image-strings.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openai-optional-sequence-number.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openai-telemetry-response.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openai-text-prompt-cache.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openai-tolerant-error-stream-event.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openai-web-search-outcomes.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openapi-generator-sse-constraint-decoder.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openapi-omitted-additional-properties.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openapi-path-parameters.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openapi-pointer-references.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openapi-response-variants.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openrouter-disjoint-usage-details.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openrouter-encrypted-tool-finish.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openrouter-generation-usage-schema.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openrouter-input-audio.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openrouter-strict-json-schema.md (100%) rename {repos/effect/.changeset => .changeset}/pre/openrouter-tool-parameter-deltas.md (100%) rename {repos/effect/.changeset => .changeset}/pre/opentelemetry-delta-interval-starts.md (100%) rename {repos/effect/.changeset => .changeset}/pre/opentelemetry-render-causes.md (100%) rename {repos/effect/.changeset => .changeset}/pre/optic-projection-replacement.md (100%) rename {repos/effect/.changeset => .changeset}/pre/optic-standalone-functions.md (100%) rename {repos/effect/.changeset => .changeset}/pre/optic-string-index-delete.md (100%) rename {repos/effect/.changeset => .changeset}/pre/optimize-array-equality.md (100%) rename {repos/effect/.changeset => .changeset}/pre/optimize-httpapi-handler-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/optimize-node-http-server-response.md (100%) rename {repos/effect/.changeset => .changeset}/pre/optimize-schema-class-decoding.md (100%) rename {repos/effect/.changeset => .changeset}/pre/optional-ai-embedding-usage.md (100%) rename {repos/effect/.changeset => .changeset}/pre/optional-ai-response-fields.md (100%) rename {repos/effect/.changeset => .changeset}/pre/order-consumed-criteria.md (100%) rename {repos/effect/.changeset => .changeset}/pre/otel-resource-env-precedence.md (100%) rename {repos/effect/.changeset => .changeset}/pre/otlp-disabled-batch-flush.md (100%) rename {repos/effect/.changeset => .changeset}/pre/otlp-tracer-span-performance.md (100%) create mode 100644 .changeset/pre/parameterize-persistence-lookup-keys.md rename {repos/effect/.changeset => .changeset}/pre/partitioned-semaphore-stale-cleanup.md (100%) rename {repos/effect/.changeset => .changeset}/pre/perfect-buckets-tickle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/persisted-cache-lookup-throw.md (100%) rename {repos/effect/.changeset => .changeset}/pre/petite-months-allow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/pg-client-connect-error-handler.md (100%) rename {repos/effect/.changeset => .changeset}/pre/pg-explicit-ssl-precedence.md (100%) rename {repos/effect/.changeset => .changeset}/pre/pglite-json-string-values.md (100%) rename {repos/effect/.changeset => .changeset}/pre/pipeline-root-stdin.md (100%) rename {repos/effect/.changeset => .changeset}/pre/plain-tool-results.md (100%) rename {repos/effect/.changeset => .changeset}/pre/plain-variant-unions.md (100%) rename {repos/effect/.changeset => .changeset}/pre/platform-crypto-service.md (100%) rename {repos/effect/.changeset => .changeset}/pre/platform-node-shared-barrel.md (100%) rename {repos/effect/.changeset => .changeset}/pre/plenty-moons-pull.md (100%) rename {repos/effect/.changeset => .changeset}/pre/polite-brooms-tickle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/polite-cameras-rest.md (100%) rename {repos/effect/.changeset => .changeset}/pre/polite-dingos-unite.md (100%) rename {repos/effect/.changeset => .changeset}/pre/polite-pigs-speak.md (100%) rename {repos/effect/.changeset => .changeset}/pre/polite-tables-kneel.md (100%) rename {repos/effect/.changeset => .changeset}/pre/pool-preserve-reservations.md (100%) rename {repos/effect/.changeset => .changeset}/pre/port-effect-reduce.md (100%) rename {repos/effect/.changeset => .changeset}/pre/port-http-api-builder-handler.md (100%) rename {repos/effect/.changeset => .changeset}/pre/port-react-hydration.md (100%) rename {repos/effect/.changeset => .changeset}/pre/postgres-channel-names.md (100%) rename {repos/effect/.changeset => .changeset}/pre/precise-clocks-rest.md (100%) rename {repos/effect/.changeset => .changeset}/pre/precise-test-clock-nanos.md (100%) rename {repos/effect/.changeset => .changeset}/pre/preserve-command-hidden-metadata.md (100%) rename {repos/effect/.changeset => .changeset}/pre/preserve-config-all-input-evidence.md (100%) rename {repos/effect/.changeset => .changeset}/pre/preserve-default-variant-class.md (100%) rename {repos/effect/.changeset => .changeset}/pre/preserve-negative-counter-deltas.md (100%) rename {repos/effect/.changeset => .changeset}/pre/preserve-openapi-raw-json.md (100%) rename {repos/effect/.changeset => .changeset}/pre/preserve-otel-parent-context.md (100%) rename {repos/effect/.changeset => .changeset}/pre/preserve-unsafe-workflow-interrupts.md (100%) rename {repos/effect/.changeset => .changeset}/pre/pretty-moments-clap.md (100%) rename {repos/effect/.changeset => .changeset}/pre/principled-collection-counts.md (100%) rename {repos/effect/.changeset => .changeset}/pre/prompt-buffer-render.md (100%) rename {repos/effect/.changeset => .changeset}/pre/prompt-lossless-text-serialization.md (100%) rename {repos/effect/.changeset => .changeset}/pre/prompt-response-files.md (100%) rename {repos/effect/.changeset => .changeset}/pre/protect-schema-issue-actuals.md (100%) rename {repos/effect/.changeset => .changeset}/pre/proud-ears-say.md (100%) rename {repos/effect/.changeset => .changeset}/pre/provider-executed-tool-results.md (100%) rename {repos/effect/.changeset => .changeset}/pre/public-deer-ring.md (100%) rename {repos/effect/.changeset => .changeset}/pre/public-jeans-stop.md (100%) rename {repos/effect/.changeset => .changeset}/pre/pubsub-publish-false.md (100%) rename {repos/effect/.changeset => .changeset}/pre/pubsub-sliding-single-subscriber.md (100%) rename {repos/effect/.changeset => .changeset}/pre/pull-based-socket.md (100%) rename {repos/effect/.changeset => .changeset}/pre/puny-pens-clap.md (100%) rename {repos/effect/.changeset => .changeset}/pre/purple-bars-prove.md (100%) rename {repos/effect/.changeset => .changeset}/pre/purple-schools-float.md (100%) rename {repos/effect/.changeset => .changeset}/pre/purple-turtles-draw.md (100%) rename {repos/effect/.changeset => .changeset}/pre/queue-manual-flush.md (100%) rename {repos/effect/.changeset => .changeset}/pre/queue-reentrant-producers.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quick-dragons-fix.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quick-falcons-travel.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quick-geese-relax.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quick-graphs-paths.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quick-kiwis-remember.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quick-lamps-dig.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quick-lizards-fall.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quick-schedulers-promise.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quick-trees-join.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-buffers-decode.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-buns-route.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-carpets-grin.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-clis-parse.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-crons-report.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-fibers-settle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-files-hunt.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-files-write.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-graphs-guard.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-graphs-search.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-graphs-simplify.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-lamps-jam.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-mice-negotiate.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-observers-report.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-otters-retry.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-owls-validate.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-pandas-listen.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-pandas-rebuild.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-pandas-respond.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-radios-wave.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-redis-scripts.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-rpcs-buffer.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-savepoints-wait.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-sockets-close.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-spans-rest.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-streams-take.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-tigers-yell.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-tools-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/quiet-turtles-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/random-choice.md (100%) rename {repos/effect/.changeset => .changeset}/pre/random-exclusive-upper-endpoint.md (100%) rename {repos/effect/.changeset => .changeset}/pre/random-hex-encoding.md (100%) rename {repos/effect/.changeset => .changeset}/pre/rate-limiter-reset-lifetime.md (100%) rename {repos/effect/.changeset => .changeset}/pre/rcmap-invalidation-release.md (100%) rename {repos/effect/.changeset => .changeset}/pre/rcmap-throwing-lookup.md (100%) rename {repos/effect/.changeset => .changeset}/pre/rcref-acquisition-shutdown.md (100%) rename {repos/effect/.changeset => .changeset}/pre/rcref-release-ownership.md (100%) rename {repos/effect/.changeset => .changeset}/pre/read-only-bun-sqlite.md (100%) rename {repos/effect/.changeset => .changeset}/pre/ready-olives-divide.md (100%) rename {repos/effect/.changeset => .changeset}/pre/real-trains-ring.md (100%) rename {repos/effect/.changeset => .changeset}/pre/reason-annotate-context-only.md (100%) rename {repos/effect/.changeset => .changeset}/pre/record-from-iterable-by-dual.md (100%) rename {repos/effect/.changeset => .changeset}/pre/red-pigs-repair.md (100%) rename {repos/effect/.changeset => .changeset}/pre/redact-cli-wizard-values.md (100%) rename {repos/effect/.changeset => .changeset}/pre/redacted-representation-options.md (100%) rename {repos/effect/.changeset => .changeset}/pre/redis-subscribe-api.md (100%) rename {repos/effect/.changeset => .changeset}/pre/refactor-cli-global-flags.md (100%) rename {repos/effect/.changeset => .changeset}/pre/refactor-config-provider.md (100%) rename {repos/effect/.changeset => .changeset}/pre/refactor-representation-references.md (100%) rename {repos/effect/.changeset => .changeset}/pre/refine-config-absence.md (100%) rename {repos/effect/.changeset => .changeset}/pre/refresh-mcp-roots.md (100%) rename {repos/effect/.changeset => .changeset}/pre/register-param-alternate-flags.md (100%) rename {repos/effect/.changeset => .changeset}/pre/release-rpc-worker-pool-entries.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-context-mutate.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-effect-transactionwith.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-http-span-counter.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-kubernetes-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-msgpack.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-nullor.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-openapi-fromapi-options.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-schedule-apis.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-schedule-either.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-schedule-elapsed.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-schedule-taps.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-schema-key-value-combiner.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-schema-stringtree-keep-declarations.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-schema-utils.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-types-mergerecord.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-unused-utils-apis.md (100%) rename {repos/effect/.changeset => .changeset}/pre/remove-with-concurrency.md (100%) rename {repos/effect/.changeset => .changeset}/pre/rename-rebuild-out.md (100%) rename {repos/effect/.changeset => .changeset}/pre/rename-schema-arbitrary-filter-constraint.md (100%) rename {repos/effect/.changeset => .changeset}/pre/rename-schema-error-constructors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/rename-schema-transform-effect.md (100%) rename {repos/effect/.changeset => .changeset}/pre/render-cli-user-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/repeat-or-else-metadata-argument.md (100%) rename {repos/effect/.changeset => .changeset}/pre/report-mcp-tool-failures.md (100%) rename {repos/effect/.changeset => .changeset}/pre/report-schema-input.md (100%) rename {repos/effect/.changeset => .changeset}/pre/report-transient-rpc-socket-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/request-cache-cancellation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/request-persisted-resolver-failures.md (100%) rename {repos/effect/.changeset => .changeset}/pre/request-race-cache.md (100%) rename {repos/effect/.changeset => .changeset}/pre/request-resolver-failure-causes.md (100%) rename {repos/effect/.changeset => .changeset}/pre/request-resolver-iterable-results.md (100%) rename {repos/effect/.changeset => .changeset}/pre/required-boolean-flags.md (100%) rename {repos/effect/.changeset => .changeset}/pre/required-keys-index-signatures.md (100%) rename {repos/effect/.changeset => .changeset}/pre/resolved-client-urls.md (100%) rename {repos/effect/.changeset => .changeset}/pre/resource-subscriptions.md (100%) rename {repos/effect/.changeset => .changeset}/pre/restore-effect-head.md (100%) rename {repos/effect/.changeset => .changeset}/pre/restore-schema-parse-options.md (100%) rename {repos/effect/.changeset => .changeset}/pre/result-map-error-success-identity.md (100%) rename {repos/effect/.changeset => .changeset}/pre/retry-redis-script-load.md (100%) rename {repos/effect/.changeset => .changeset}/pre/reuse-httpapi-response-schemas.md (100%) rename {repos/effect/.changeset => .changeset}/pre/rich-dots-push.md (100%) rename {repos/effect/.changeset => .changeset}/pre/rich-hoops-nail.md (100%) rename {repos/effect/.changeset => .changeset}/pre/rich-sloths-draw.md (100%) rename {repos/effect/.changeset => .changeset}/pre/ripe-lies-battle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/rpc-client-http-early-close.md (100%) rename {repos/effect/.changeset => .changeset}/pre/rpc-falsy-control-ids.md (100%) rename {repos/effect/.changeset => .changeset}/pre/rpc-middleware-provides-fix.md (100%) rename {repos/effect/.changeset => .changeset}/pre/rpc-server-notifications.md (100%) rename {repos/effect/.changeset => .changeset}/pre/safe-json-schema-patterns.md (100%) rename {repos/effect/.changeset => .changeset}/pre/scalar-custom-fetch.md (100%) rename {repos/effect/.changeset => .changeset}/pre/scheduler-global-scope-timers.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-api-cleanup.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-arbitrary-factory.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-array-leaf-aggregation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-as-class.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-asserts-signature.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-aware-rpc-serialization.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-binary-codec.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-binary-preserve-bom.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-clean-up-additionalProperties.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-codec-narrowing.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-date-valid.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-datetime-utc-from-string.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-decoding-defaults-services.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-defaults-issue-channel.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-direct-class-extension.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-dollar-prefix.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-interpreter-backports.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-json-schema-options.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-lazy-bottom.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-missing-self-generic.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-ordered-arbitrary-constraints.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-parser-adapter-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-refactor-toCodecJson.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-remove-annotate-in.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-rename-makeUnsafe-to-make.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-rename-parser-makeUnsafe.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-representation-refactoring.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-result-combinators.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-runtime-performance.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-struct-simplify.md (100%) rename {repos/effect/.changeset => .changeset}/pre/schema-union-type-derivation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/scope-persisted-queue-ids.md (100%) rename {repos/effect/.changeset => .changeset}/pre/scoped-cache-invalidate-all-reentrancy.md (100%) rename {repos/effect/.changeset => .changeset}/pre/scoped-cache-refresh-lookup-defects.md (100%) rename {repos/effect/.changeset => .changeset}/pre/scoped-log-nan-restoration.md (100%) rename {repos/effect/.changeset => .changeset}/pre/secure-eventlog-identities.md (100%) rename {repos/effect/.changeset => .changeset}/pre/select-prompt-optional-message.md (100%) rename {repos/effect/.changeset => .changeset}/pre/semantic-matching.md (100%) rename {repos/effect/.changeset => .changeset}/pre/service-interface-const.md (100%) rename {repos/effect/.changeset => .changeset}/pre/seven-mugs-marry.md (100%) rename {repos/effect/.changeset => .changeset}/pre/seven-poems-divide.md (100%) rename {repos/effect/.changeset => .changeset}/pre/shaggy-birds-stay.md (100%) rename {repos/effect/.changeset => .changeset}/pre/shaggy-cities-push.md (100%) rename {repos/effect/.changeset => .changeset}/pre/shaggy-numbers-accept.md (100%) rename {repos/effect/.changeset => .changeset}/pre/shaky-beans-throw.md (100%) rename {repos/effect/.changeset => .changeset}/pre/shaky-terms-push.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sharding-registration-context-overrides.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sharp-emus-applaud.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sharp-goats-wink.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sharp-pandas-care.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sharp-peas-march.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sharp-rules-draw.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sharp-singers-sort.md (100%) rename {repos/effect/.changeset => .changeset}/pre/shiny-trains-hug.md (100%) rename {repos/effect/.changeset => .changeset}/pre/short-cows-relate.md (100%) rename {repos/effect/.changeset => .changeset}/pre/short-foxes-admire.md (100%) rename {repos/effect/.changeset => .changeset}/pre/short-stamps-throw.md (100%) rename {repos/effect/.changeset => .changeset}/pre/shy-cycles-flow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/shy-geckos-sniff.md (100%) rename {repos/effect/.changeset => .changeset}/pre/shy-seals-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/silent-geckos-matter.md (100%) rename {repos/effect/.changeset => .changeset}/pre/silent-needles-design.md (100%) rename {repos/effect/.changeset => .changeset}/pre/silent-plants-matter.md (100%) rename {repos/effect/.changeset => .changeset}/pre/silent-spoons-stare.md (100%) rename {repos/effect/.changeset => .changeset}/pre/silly-dodos-update.md (100%) rename {repos/effect/.changeset => .changeset}/pre/silly-loops-tickle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/silver-bulk-indexeddb.md (100%) rename {repos/effect/.changeset => .changeset}/pre/silver-emus-smoke.md (100%) rename {repos/effect/.changeset => .changeset}/pre/silver-kings-poke.md (100%) rename {repos/effect/.changeset => .changeset}/pre/silver-snails-sqlite.md (100%) rename {repos/effect/.changeset => .changeset}/pre/silver-wings-watch.md (100%) rename {repos/effect/.changeset => .changeset}/pre/simplify-optic-composition.md (100%) rename {repos/effect/.changeset => .changeset}/pre/six-cups-taste.md (100%) rename {repos/effect/.changeset => .changeset}/pre/six-pumas-take.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sixty-mails-shout.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sixty-socks-yell.md (100%) rename {repos/effect/.changeset => .changeset}/pre/skip-disabled-stack-capture.md (100%) rename {repos/effect/.changeset => .changeset}/pre/slick-signs-wish.md (100%) rename {repos/effect/.changeset => .changeset}/pre/slick-toes-rush.md (100%) rename {repos/effect/.changeset => .changeset}/pre/slimy-melons-admire.md (100%) rename {repos/effect/.changeset => .changeset}/pre/slimy-planets-divide.md (100%) rename {repos/effect/.changeset => .changeset}/pre/slimy-turtles-juggle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/slow-beans-battle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/slow-berries-enjoy.md (100%) rename {repos/effect/.changeset => .changeset}/pre/slow-entities-register.md (100%) rename {repos/effect/.changeset => .changeset}/pre/slow-spiders-refresh.md (100%) rename {repos/effect/.changeset => .changeset}/pre/small-basic-bundle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/small-bugs-hunt.md (100%) rename {repos/effect/.changeset => .changeset}/pre/small-crabs-care.md (100%) rename {repos/effect/.changeset => .changeset}/pre/small-pandas-cache.md (100%) rename {repos/effect/.changeset => .changeset}/pre/small-pets-sit.md (100%) rename {repos/effect/.changeset => .changeset}/pre/smart-ducks-jump.md (100%) rename {repos/effect/.changeset => .changeset}/pre/smart-pillows-buy.md (100%) rename {repos/effect/.changeset => .changeset}/pre/smart-timers-fly.md (100%) rename {repos/effect/.changeset => .changeset}/pre/smart-tips-sort.md (100%) rename {repos/effect/.changeset => .changeset}/pre/social-hoops-knock.md (100%) rename {repos/effect/.changeset => .changeset}/pre/social-pumas-prove.md (100%) rename {repos/effect/.changeset => .changeset}/pre/socket-paused-websocket-handoff.md (100%) rename {repos/effect/.changeset => .changeset}/pre/socket-websocket-text-byte-watermark.md (100%) rename {repos/effect/.changeset => .changeset}/pre/soft-comics-wink.md (100%) rename {repos/effect/.changeset => .changeset}/pre/soft-delete-sqlmodel.md (100%) rename {repos/effect/.changeset => .changeset}/pre/soft-seals-allow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/soft-sockets-write.md (100%) rename {repos/effect/.changeset => .changeset}/pre/solid-cougars-attack.md (100%) rename {repos/effect/.changeset => .changeset}/pre/solid-doors-ring.md (100%) rename {repos/effect/.changeset => .changeset}/pre/solid-items-tease.md (100%) rename {repos/effect/.changeset => .changeset}/pre/solid-towns-smoke.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sour-bees-sleep.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sour-canyons-rescue.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sparkly-bears-act.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sparkly-coins-sit.md (100%) rename {repos/effect/.changeset => .changeset}/pre/spicy-doors-unlist.md (100%) rename {repos/effect/.changeset => .changeset}/pre/split-clock-semantics.md (100%) rename {repos/effect/.changeset => .changeset}/pre/split-lines-completed-cr.md (100%) rename {repos/effect/.changeset => .changeset}/pre/spotty-comics-fry.md (100%) rename {repos/effect/.changeset => .changeset}/pre/spotty-masks-own.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sql-begin-failure-typed.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sql-event-journal-callback-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sql-message-storage-joined-reply-id.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sql-migrator-mjs-mts.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sql-nested-placeholder-cache.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sql-optional-span-propagation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sql-returning-identifier.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sql-runner-requested-shard-results.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sqlite-bun-prepare-error-channel.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sqlite-bun-transaction-export.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sqlite-client-locking-defaults.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sqlite-do-durable-object-transactions.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sqlite-do-stream-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sqlite-node-unprepared-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sqlite-wasm-messageport-startup.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sqlite-wasm-statement-columns.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sqlite-wasm-worker-error-metadata.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sqlmodel-insert-decoding-services.md (100%) rename {repos/effect/.changeset => .changeset}/pre/stable-graph-traversal-config.md (100%) rename {repos/effect/.changeset => .changeset}/pre/stale-dots-tell.md (100%) rename {repos/effect/.changeset => .changeset}/pre/stale-graph-traversal-skips.md (100%) rename {repos/effect/.changeset => .changeset}/pre/stale-laws-do.md (100%) rename {repos/effect/.changeset => .changeset}/pre/stale-snakes-know.md (100%) rename {repos/effect/.changeset => .changeset}/pre/standard-schema-module.md (100%) rename {repos/effect/.changeset => .changeset}/pre/stream-rechunk-large-source.md (100%) rename {repos/effect/.changeset => .changeset}/pre/strict-areas-end.md (100%) rename {repos/effect/.changeset => .changeset}/pre/strict-buckets-hug.md (100%) rename {repos/effect/.changeset => .changeset}/pre/strict-content-length.md (100%) rename {repos/effect/.changeset => .changeset}/pre/strict-cookie-names.md (100%) rename {repos/effect/.changeset => .changeset}/pre/strip-resolved-approvals.md (100%) rename {repos/effect/.changeset => .changeset}/pre/strong-balloons-tickle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/strong-bees-queue.md (100%) rename {repos/effect/.changeset => .changeset}/pre/strong-insects-film.md (100%) rename {repos/effect/.changeset => .changeset}/pre/struct-numeric-selection.md (100%) rename {repos/effect/.changeset => .changeset}/pre/struct-record.md (100%) rename {repos/effect/.changeset => .changeset}/pre/structural-schema-nodes.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sunny-ads-hang.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sunny-bikes-sleep.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sunny-rooms-invent.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sweet-donuts-bet.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sweet-hotels-give.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sweet-lizards-sing.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sweet-schedules-matter.md (100%) rename {repos/effect/.changeset => .changeset}/pre/sweet-views-learn.md (100%) rename {repos/effect/.changeset => .changeset}/pre/swift-geese-count.md (100%) rename {repos/effect/.changeset => .changeset}/pre/swift-pandas-parse.md (100%) rename {repos/effect/.changeset => .changeset}/pre/swift-spiders-unpack.md (100%) rename {repos/effect/.changeset => .changeset}/pre/swift-symbols-stand.md (100%) rename {repos/effect/.changeset => .changeset}/pre/synchronized-ref-modify-some-effect-currying.md (100%) rename {repos/effect/.changeset => .changeset}/pre/synchronized-ref-not-ref.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tagged-error-class-optional-empty-props.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tall-hairs-return.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tall-ideas-fix.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tall-mails-listen.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tall-melons-shave.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tall-queens-cheer.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tall-wombats-wave.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tame-json-schema-intersections.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tangy-colts-lose.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tangy-plants-run.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tap-defect-saved-error-inference.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tasty-comics-send.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tasty-moments-post.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tcp-schema-binary-default.md (100%) rename {repos/effect/.changeset => .changeset}/pre/template-literal-parts-without-encoding.md (100%) rename {repos/effect/.changeset => .changeset}/pre/ten-kings-fry.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tender-deserts-pull.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tender-files-complete.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tender-points-sleep.md (100%) rename {repos/effect/.changeset => .changeset}/pre/terminate-openai-failed-streams.md (100%) rename {repos/effect/.changeset => .changeset}/pre/testschema-own-field-asts.md (100%) rename {repos/effect/.changeset => .changeset}/pre/theme-cli-prompts.md (100%) rename {repos/effect/.changeset => .changeset}/pre/thick-pandas-wait.md (100%) rename {repos/effect/.changeset => .changeset}/pre/thin-ducks-wonder.md (100%) rename {repos/effect/.changeset => .changeset}/pre/thin-ends-hug.md (100%) rename {repos/effect/.changeset => .changeset}/pre/thirty-ducks-go.md (100%) rename {repos/effect/.changeset => .changeset}/pre/thirty-forks-march.md (100%) rename {repos/effect/.changeset => .changeset}/pre/thirty-pans-love.md (100%) rename {repos/effect/.changeset => .changeset}/pre/three-corners-sort.md (100%) rename {repos/effect/.changeset => .changeset}/pre/three-ravens-jam.md (100%) rename {repos/effect/.changeset => .changeset}/pre/three-tomatoes-wave.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-apples-rest.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-carpets-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-cats-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-cats-stream.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-codecs-inherit.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-dates-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-floats-edit.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-foxes-own.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-geese-release.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-graphs-cycle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-icons-glow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-int32-annotations.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-json-objects.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-json-schema-object-scopes.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-lions-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-matches-select.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-mice-grin.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-pandas-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-parts-narrow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-plums-remember.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-ravens-import.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-schema-errors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-scoped-refs-close.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-spans-rest.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-sse-events.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-stacks-encode.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-stars-drive.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-tools-finish.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-tools-handle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-tools-juggle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-tuples-rest.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tidy-wasps-wait.md (100%) rename {repos/effect/.changeset => .changeset}/pre/timeout-error-message.md (100%) rename {repos/effect/.changeset => .changeset}/pre/timeout-or-else-cleanup-before-fallback.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tiny-buckets-wave.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tiny-dodos-juggle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tiny-files-flow.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tiny-lilies-flash.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tiny-lizards-correct.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tiny-rabbits-smile.md (100%) rename {repos/effect/.changeset => .changeset}/pre/to-codec-json-schema.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tocodecjson-return-json-type.md (100%) rename {repos/effect/.changeset => .changeset}/pre/token-bucket-elapsed-refill.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tokenizer-whole-prompt-truncation.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tool-get-json-schema-tests.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tool-result-branch-encoding.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tough-graphs-cache.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tough-rooms-camp.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tough-taxis-own.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tracer-disabled-timing.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tracer-perf.md (100%) rename {repos/effect/.changeset => .changeset}/pre/track-mapped-error-domain.md (100%) rename {repos/effect/.changeset => .changeset}/pre/trie-remove-valued-prefix.md (100%) rename {repos/effect/.changeset => .changeset}/pre/true-actors-battle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/try-direct-error-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/try-promise-catch-defect.md (100%) rename {repos/effect/.changeset => .changeset}/pre/tuple-optional-evolve-result-types.md (100%) rename {repos/effect/.changeset => .changeset}/pre/twelve-dragons-move.md (100%) rename {repos/effect/.changeset => .changeset}/pre/twenty-buttons-cheer.md (100%) rename {repos/effect/.changeset => .changeset}/pre/twenty-facts-laugh.md (100%) rename {repos/effect/.changeset => .changeset}/pre/twenty-garlics-marry.md (100%) rename {repos/effect/.changeset => .changeset}/pre/two-roses-double.md (100%) rename {repos/effect/.changeset => .changeset}/pre/undici-response-form-data.md (100%) rename {repos/effect/.changeset => .changeset}/pre/unify-error-defect-stack-options.md (100%) rename {repos/effect/.changeset => .changeset}/pre/unique-directed-neighbors.md (100%) rename {repos/effect/.changeset => .changeset}/pre/unstable-http-schemas.md (100%) rename {repos/effect/.changeset => .changeset}/pre/update-schema-arbitrary-report.md (100%) rename {repos/effect/.changeset => .changeset}/pre/upgrade-socket-error-listener.md (100%) rename {repos/effect/.changeset => .changeset}/pre/upgraded-request-skips-http-response-write.md (100%) rename {repos/effect/.changeset => .changeset}/pre/upset-colts-stick.md (100%) rename {repos/effect/.changeset => .changeset}/pre/urlparams-null-input.md (100%) rename {repos/effect/.changeset => .changeset}/pre/urlparams-setall-immutable.md (100%) rename {repos/effect/.changeset => .changeset}/pre/use-canonical-array-indices.md (100%) rename {repos/effect/.changeset => .changeset}/pre/use-url-can-parse.md (100%) rename {repos/effect/.changeset => .changeset}/pre/valid-owls-rest.md (100%) rename {repos/effect/.changeset => .changeset}/pre/validate-httpapi-handler-registration.md (100%) rename {repos/effect/.changeset => .changeset}/pre/validate-openapi-global-conflicts.md (100%) rename {repos/effect/.changeset => .changeset}/pre/vast-bananas-send.md (100%) rename {repos/effect/.changeset => .changeset}/pre/vast-deserts-travel.md (100%) rename {repos/effect/.changeset => .changeset}/pre/violet-peaches-feel.md (100%) rename {repos/effect/.changeset => .changeset}/pre/violet-pugs-tickle.md (100%) rename {repos/effect/.changeset => .changeset}/pre/violet-tips-open.md (100%) rename {repos/effect/.changeset => .changeset}/pre/vitest-await-timeout-finalizers.md (100%) rename {repos/effect/.changeset => .changeset}/pre/vitest-five-migration.md (100%) rename {repos/effect/.changeset => .changeset}/pre/vitest-layer-concurrency.md (100%) rename {repos/effect/.changeset => .changeset}/pre/vitest-layer-top-level-options.md (100%) rename {repos/effect/.changeset => .changeset}/pre/wacky-grapes-poke.md (100%) rename {repos/effect/.changeset => .changeset}/pre/wacky-rice-add.md (100%) rename {repos/effect/.changeset => .changeset}/pre/warm-clocks-format.md (100%) rename {repos/effect/.changeset => .changeset}/pre/warm-dolls-brake.md (100%) rename {repos/effect/.changeset => .changeset}/pre/warm-friends-tie.md (100%) rename {repos/effect/.changeset => .changeset}/pre/warm-graphs-degree.md (100%) rename {repos/effect/.changeset => .changeset}/pre/warm-rivers-cache.md (100%) rename {repos/effect/.changeset => .changeset}/pre/warm-snails-shop.md (100%) rename {repos/effect/.changeset => .changeset}/pre/wet-news-invent.md (100%) rename {repos/effect/.changeset => .changeset}/pre/whole-pets-build.md (100%) rename {repos/effect/.changeset => .changeset}/pre/wild-donuts-brake.md (100%) rename {repos/effect/.changeset => .changeset}/pre/wild-readers-clean.md (100%) rename {repos/effect/.changeset => .changeset}/pre/wild-suns-bearer-space.md (100%) rename {repos/effect/.changeset => .changeset}/pre/windows-hide-child-process-console.md (100%) rename {repos/effect/.changeset => .changeset}/pre/wise-ants-wave.md (100%) rename {repos/effect/.changeset => .changeset}/pre/wise-bats-encrypt.md (100%) rename {repos/effect/.changeset => .changeset}/pre/wise-files-watch.md (100%) rename {repos/effect/.changeset => .changeset}/pre/wise-flags-shift.md (100%) rename {repos/effect/.changeset => .changeset}/pre/wise-graphs-connect.md (100%) rename {repos/effect/.changeset => .changeset}/pre/wise-oranges-stay.md (100%) rename {repos/effect/.changeset => .changeset}/pre/wise-pandas-lock.md (100%) rename {repos/effect/.changeset => .changeset}/pre/with-error-reporting-effect-result.md (100%) rename {repos/effect/.changeset => .changeset}/pre/witty-lobsters-share.md (100%) rename {repos/effect/.changeset => .changeset}/pre/worker-run-early-exit.md (100%) rename {repos/effect/.changeset => .changeset}/pre/worker-runner-multi-disconnect.md (100%) rename {repos/effect/.changeset => .changeset}/pre/workflow-proxy-discard-execution-id.md (100%) rename {repos/effect/.changeset => .changeset}/pre/xhr-arraybuffer-readers.md (100%) rename {repos/effect/.changeset => .changeset}/pre/yellow-adults-study.md (100%) rename {repos/effect/.changeset => .changeset}/pre/yellow-clocks-dance.md (100%) rename {repos/effect/.changeset => .changeset}/pre/yellow-dingos-jump.md (100%) rename {repos/effect/.changeset => .changeset}/pre/young-doors-change.md (100%) rename {repos/effect/.changeset => .changeset}/pre/zero-node-socket-timeout.md (100%) delete mode 100644 .changeset/project-computed-type-safety.md delete mode 100644 .changeset/project-encoded-type-constraint.md delete mode 100644 .changeset/project-union-schema.md delete mode 100644 .changeset/project-union-subsets.md delete mode 100644 .changeset/projectable-from-domain.md delete mode 100644 .changeset/projectable-key-guard-project.md delete mode 100644 .changeset/provide-dual.md delete mode 100644 .changeset/publish-tsconfig-postpack.md delete mode 100644 .changeset/pure-usesync-cleanup.md delete mode 100644 .changeset/query-aggregate-support.md delete mode 100644 .changeset/query-map-has-ops.md delete mode 100644 .changeset/query-optional-mode.md delete mode 100644 .changeset/query-span-propagation.md delete mode 100644 .changeset/quick-seals-relate.md delete mode 100644 .changeset/quick-wolves-yawn.md delete mode 100644 .changeset/quiet-shrimps-juggle.md delete mode 100644 .changeset/quiet-tigers-reply.md delete mode 100644 .changeset/quiet-tools-rest.md delete mode 100644 .changeset/rare-llamas-begin.md delete mode 100644 .changeset/rare-rules-help.md delete mode 100644 .changeset/ready-bags-wave.md delete mode 100644 .changeset/ready-bananas-scream.md delete mode 100644 .changeset/real-lilies-design.md delete mode 100644 .changeset/real-suits-clean.md delete mode 100644 .changeset/recover-stuck-query-interrupts.md delete mode 100644 .changeset/red-pillows-repeat.md delete mode 100644 .changeset/relation-collect-fields.md delete mode 100644 .changeset/remove-by-id-array.md delete mode 100644 .changeset/remove-class-struct-pick-omit.md delete mode 100644 .changeset/remove-legacy-from-make-client.md delete mode 100644 .changeset/remove-legacy-mutate-result-2.md delete mode 100644 .changeset/remove-lodash-from-effect-app.md delete mode 100644 .changeset/remove-operations.md delete mode 100644 .changeset/remove-queue-machinery.md delete mode 100644 .changeset/remove-tagged-error-compat.md delete mode 100644 .changeset/remove-tagged-request.md delete mode 100644 .changeset/remove-void-schema-override.md delete mode 100644 .changeset/remove-withDefaultConstructor.md delete mode 100644 .changeset/rename-mutate-stream.md delete mode 100644 .changeset/rename-withdefault-to-withconstructordefault.md delete mode 100644 .changeset/replace-proxify-with-accessors.md delete mode 100644 .changeset/repo-derived-query-invalidation.md delete mode 100644 .changeset/repo-mutations-accept-empty-arrays.md delete mode 100644 .changeset/repo-span-topology.md delete mode 100644 .changeset/repo-spans-itemtype.md delete mode 100644 .changeset/repository-registry.md delete mode 100644 .changeset/request-scoped-dependencies.md delete mode 100644 .changeset/require-middleware-layers.md delete mode 100644 .changeset/resolver-cache-use-official.md delete mode 100644 .changeset/restore-tight-project-guard.md delete mode 100644 .changeset/router-no-meta.md delete mode 100644 .changeset/rpc-stream-support.md delete mode 100644 .changeset/salty-weeks-walk.md delete mode 100644 .changeset/schema-concurrency-unbounded.md delete mode 100644 .changeset/schema-encode-slow-metrics.md delete mode 100644 .changeset/schema-facade-identifier-structfacade.md delete mode 100644 .changeset/schema-json-collections.md delete mode 100644 .changeset/secret-url-tests.md delete mode 100644 .changeset/select-delayed-cache-invalidation.md delete mode 100644 .changeset/sendgrid-configurable-fake-address.md delete mode 100644 .changeset/server-driven-cache-invalidation.md delete mode 100644 .changeset/server-invalidation-handler-shorthand.md delete mode 100644 .changeset/servicebus-log-only-spans.md delete mode 100644 .changeset/shaggy-terms-show.md delete mode 100644 .changeset/shaggy-waves-slide.md delete mode 100644 .changeset/shaggy-wolves-grow.md delete mode 100644 .changeset/share-oxlintrc-config.md delete mode 100644 .changeset/sharp-buses-bow.md delete mode 100644 .changeset/sharp-seals-clean.md delete mode 100644 .changeset/short-cats-march.md delete mode 100644 .changeset/short-frogs-add.md delete mode 100644 .changeset/short-suns-travel.md delete mode 100644 .changeset/shy-squids-make.md delete mode 100644 .changeset/silent-results-shave.md delete mode 100644 .changeset/silent-rooms-throw.md delete mode 100644 .changeset/silly-eggs-roll.md delete mode 100644 .changeset/single-invalidate-query-call.md delete mode 100644 .changeset/six-regions-start.md delete mode 100644 .changeset/six-yaks-stop.md delete mode 100644 .changeset/sixty-meals-sin.md delete mode 100644 .changeset/slimy-apes-film.md delete mode 100644 .changeset/slimy-lions-laugh.md delete mode 100644 .changeset/slimy-schools-fold.md delete mode 100644 .changeset/slow-readers-wave.md delete mode 100644 .changeset/small-papers-sneeze.md delete mode 100644 .changeset/small-wolves-knock.md delete mode 100644 .changeset/smart-beers-listen.md delete mode 100644 .changeset/smart-candles-rest.md delete mode 100644 .changeset/soft-books-win.md delete mode 100644 .changeset/soft-guests-relax.md delete mode 100644 .changeset/soft-mails-brush.md delete mode 100644 .changeset/soft-work-invalidations.md delete mode 100644 .changeset/sour-turtles-smash.md delete mode 100644 .changeset/source-first-package-exports.md delete mode 100644 .changeset/sparkly-cars-press.md delete mode 100644 .changeset/spicy-falcons-rush.md delete mode 100644 .changeset/spicy-lights-trade.md delete mode 100644 .changeset/sql-namespace-support.md delete mode 100644 .changeset/sql-store-adapter.md delete mode 100644 .changeset/sql-transaction-middleware.md delete mode 100644 .changeset/sqlite-per-namespace-layermap.md delete mode 100644 .changeset/sqlite-workflow-engine.md delete mode 100644 .changeset/sse-context-map-scope.md delete mode 100644 .changeset/sse-filter-namespace-by-storeid.md delete mode 100644 .changeset/staged-publish-directory.md delete mode 100644 .changeset/stale-actors-remain.md delete mode 100644 .changeset/stale-emus-see.md delete mode 100644 .changeset/stale-papers-join.md delete mode 100644 .changeset/store-effect-cached.md delete mode 100644 .changeset/store-json-values.md delete mode 100644 .changeset/store-seed-uninterruptible.md delete mode 100644 .changeset/stream-callable-progress.md delete mode 100644 .changeset/stream-drain-data-dependencies.md delete mode 100644 .changeset/stream-effect-fail.md delete mode 100644 .changeset/stream-final-default-success.md delete mode 100644 .changeset/stream-final-type.md delete mode 100644 .changeset/stream-first-write-flush.md delete mode 100644 .changeset/stream-fn-enhancements.md delete mode 100644 .changeset/stream-metadata-v1.md delete mode 100644 .changeset/stream-on-command-query.md delete mode 100644 .changeset/stream-withdefaulttoast.md delete mode 100644 .changeset/strict-stream-handlers.md delete mode 100644 .changeset/strong-dots-sin.md delete mode 100644 .changeset/struct-pick-omit.md delete mode 100644 .changeset/structfacade-effect-app-struct.md delete mode 100644 .changeset/suspense-keep-previous-value.md delete mode 100644 .changeset/sweet-humans-ring.md delete mode 100644 .changeset/sweet-moments-see.md delete mode 100644 .changeset/swift-owls-knit.md delete mode 100644 .changeset/swift-tables-turn.md delete mode 100644 .changeset/sync-effect-app-command.md delete mode 100644 .changeset/sync-effect-subtree.md delete mode 100644 .changeset/sync-effect-url.md delete mode 100644 .changeset/sync-push-deletions.md delete mode 100644 .changeset/synchronous-change-feed.md delete mode 100644 .changeset/tagged-request-command-query-split.md delete mode 100644 .changeset/tagged-request-for.md delete mode 100644 .changeset/tagged-union-drop-fields-constraint.md delete mode 100644 .changeset/tagged-union-generate-guards.md delete mode 100644 .changeset/tagged-union-generate-guards2.md delete mode 100644 .changeset/tall-boxes-relax.md delete mode 100644 .changeset/tall-hats-reflect.md delete mode 100644 .changeset/tanstack-effect-equal-structural-sharing.md delete mode 100644 .changeset/tanstack-suspense-seed.md delete mode 100644 .changeset/tasty-eggs-stare.md delete mode 100644 .changeset/tasty-fans-accept.md delete mode 100644 .changeset/ten-crews-like.md delete mode 100644 .changeset/ten-suns-shine.md delete mode 100644 .changeset/tender-bars-ring.md delete mode 100644 .changeset/tender-donkeys-pick.md delete mode 100644 .changeset/thin-zebras-press.md delete mode 100644 .changeset/thirty-cooks-pump.md delete mode 100644 .changeset/thirty-experts-taste.md delete mode 100644 .changeset/three-hotels-roll.md delete mode 100644 .changeset/tidy-caches-reflect.md delete mode 100644 .changeset/tidy-cosmos-batches.md delete mode 100644 .changeset/tidy-derived-dependencies.md delete mode 100644 .changeset/tidy-dprint-oxlint-config.md delete mode 100644 .changeset/tidy-effects-diagnose.md delete mode 100644 .changeset/tidy-forms-report.md delete mode 100644 .changeset/tidy-pans-rule.md delete mode 100644 .changeset/tidy-poets-think.md delete mode 100644 .changeset/tidy-remaining-formatting.md delete mode 100644 .changeset/tidy-rivers-identify.md delete mode 100644 .changeset/tidy-titles-remove.md delete mode 100644 .changeset/tiny-cows-repair.md delete mode 100644 .changeset/tiny-gorillas-jump.md delete mode 100644 .changeset/tired-insects-stand.md delete mode 100644 .changeset/toast-group-request-id.md delete mode 100644 .changeset/tough-apes-whisper.md delete mode 100644 .changeset/tsgo-decodingservices-workaround.md delete mode 100644 .changeset/tsgo-direct-schema-property-access.md delete mode 100644 .changeset/twenty-seas-grab.md delete mode 100644 .changeset/two-clocks-wash.md delete mode 100644 .changeset/typed-database-error.md delete mode 100644 .changeset/typed-query-builders.md delete mode 100644 .changeset/unify-emailer-spans.md delete mode 100644 .changeset/unify-parsemany-spans.md delete mode 100644 .changeset/update-effect-beta-107.md delete mode 100644 .changeset/update-effect-beta-36.md delete mode 100644 .changeset/update-effect-beta-52.md delete mode 100644 .changeset/update-effect-beta-60-rpc-custom.md delete mode 100644 .changeset/update-effect-beta-66.md delete mode 100644 .changeset/update-effect-beta-67.md delete mode 100644 .changeset/update-effect-beta-83.md delete mode 100644 .changeset/update-effect-beta-84.md delete mode 100644 .changeset/update-effect-beta-86.md delete mode 100644 .changeset/update-effect-beta-88.md delete mode 100644 .changeset/update-effect-beta-90.md delete mode 100644 .changeset/update-effect-pkgprnew.md delete mode 100644 .changeset/update-effect-rc-112.md delete mode 100644 .changeset/upset-aliens-bathe.md delete mode 100644 .changeset/upset-bugs-roll.md delete mode 100644 .changeset/version-independent-snapshot.md delete mode 100644 .changeset/vue-components-src-exports.md delete mode 100644 .changeset/vue-components-vuetify-typecheck.md delete mode 100644 .changeset/vue-placeholder-data-fallback.md delete mode 100644 .changeset/vue-prefer-fn-untraced.md delete mode 100644 .changeset/vue-stream-query.md delete mode 100644 .changeset/vue-suspense-result-race.md delete mode 100644 .changeset/vue-unified-invalidation-foreach.md delete mode 100644 .changeset/wacky-deer-decide.md delete mode 100644 .changeset/warm-maps-reflect.md delete mode 100644 .changeset/warm-streets-smell.md delete mode 100644 .changeset/wet-roses-press.md delete mode 100644 .changeset/wet-sites-fall.md delete mode 100644 .changeset/wild-olives-bathe.md delete mode 100644 .changeset/wild-wombats-nail.md delete mode 100644 .changeset/wise-items-warn.md delete mode 100644 .changeset/wise-stamps-crash.md delete mode 100644 .changeset/withdefaulttoaststream-progress.md delete mode 100644 .changeset/witty-bats-return.md delete mode 100644 .changeset/wrap-stream-command.md delete mode 100644 .claude/settings.json delete mode 100644 .devcontainer/Dockerfile delete mode 100644 .devcontainer/devcontainer.json delete mode 100644 .devcontainer/humanlog.sh delete mode 100644 .devcontainer/usepnpm.sh delete mode 100644 .githooks/README.md delete mode 100755 .githooks/post-checkout delete mode 100755 .githooks/pre-commit delete mode 100755 .githooks/pre-push delete mode 100644 .github/FUNDING.yml rename {repos/effect/.github => .github}/actions/deploy-website/action.yml (100%) rename {repos/effect/.github => .github}/actions/setup/action.yaml (100%) delete mode 100644 .github/npm-trusted-publishing.md rename {repos/effect/.github => .github}/workflows/ai-codegen.yml (100%) rename {repos/effect/.github => .github}/workflows/bundle-comment.yml (100%) rename {repos/effect/.github => .github}/workflows/check.yml (100%) delete mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/claude.yml rename {repos/effect/.github => .github}/workflows/cluster.yml (100%) delete mode 100644 .github/workflows/publish-snapshot.yml delete mode 100644 .github/workflows/publish-wiki.yml rename {repos/effect/.github => .github}/workflows/release-queue.yml (100%) delete mode 100644 .github/workflows/release.yaml rename {repos/effect/.github => .github}/workflows/release.yml (100%) rename {repos/effect/.github => .github}/workflows/snapshot.yml (100%) delete mode 100644 .ncurc.json delete mode 100644 .npmrc delete mode 100644 .nvmrc delete mode 100644 .specs/Update-to-latest-Effect.md delete mode 100644 .specs/changeset-publishing.md delete mode 100644 .vscode/launch.json delete mode 100644 .vscode/model.code-snippets delete mode 100644 .vscode/service.code-snippets delete mode 100644 .vscode/tasks.json delete mode 100644 AGENTS.md delete mode 100644 CLAUDE.md rename repos/effect/LICENSE => LICENSE (100%) rename repos/effect/LLMS.md => LLMS.md (100%) rename repos/effect/MIGRATION.md => MIGRATION.md (100%) rename {repos/effect/ai-docs => ai-docs}/README.md (100%) rename {repos/effect/ai-docs => ai-docs}/package.json (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/01_basics/01_effect-gen.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/01_basics/02_effect-fn.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/01_basics/10_creating-effects.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/01_basics/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/02_schema/10_schema-basics.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/02_schema/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/03_services/01_service.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/03_services/10_reference.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/03_services/20_layer-composition.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/03_services/20_layer-unwrap.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/03_services/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/04_errors/01_error-handling.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/04_errors/10_catch-tags.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/04_errors/20_reason-errors.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/04_errors/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/05_resources/10_acquire-release.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/05_resources/20_layer-side-effects.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/05_resources/30_layer-map.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/05_resources/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/06_running/10_run-main.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/06_running/20_layer-launch.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/06_running/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/07_pubsub/10_pubsub.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/01_effect/07_pubsub/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/03_stream/10_creating-streams.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/03_stream/20_consuming-streams.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/03_stream/30_encoding.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/03_stream/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/04_integration/10_managed-runtime.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/04_integration/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/05_batching/10_request-resolver.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/05_batching/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/06_schedule/10_schedules.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/06_schedule/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/07_datetime/10_creating-and-formatting.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/07_datetime/20_time-zones.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/07_datetime/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/08_observability/10_logging.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/08_observability/20_otlp-tracing.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/08_observability/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/09_testing/10_effect-tests.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/09_testing/20_layer-tests.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/09_testing/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/10_predicate/01_basics.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/10_predicate/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/40_sql/10_basics.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/40_sql/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/50_http-client/10_basics.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/50_http-client/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/51_http-server/10_basics.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/51_http-server/20_testing.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/51_http-server/fixtures/api/Api.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/51_http-server/fixtures/api/Authorization.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/51_http-server/fixtures/api/System.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/51_http-server/fixtures/api/Users.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/51_http-server/fixtures/domain/User.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/51_http-server/fixtures/domain/UserErrors.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/51_http-server/fixtures/server/Authorization.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/51_http-server/fixtures/server/Users.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/51_http-server/fixtures/server/Users/http.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/51_http-server/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/60_child-process/10_working-with-child-processes.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/60_child-process/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/70_cli/10_basics.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/70_cli/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/71_ai/10_language-model.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/71_ai/20_tools.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/71_ai/30_chat.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/71_ai/fixtures/domain/LaunchPlan.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/71_ai/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/80_cluster/10_entities.ts (100%) rename {repos/effect/ai-docs => ai-docs}/src/80_cluster/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/src/index.md (100%) rename {repos/effect/ai-docs => ai-docs}/tsconfig.json (100%) delete mode 100644 assets/dev/effect-app-apple-touch-180.png rename repos/effect/deno.json => deno.json (100%) rename repos/effect/dprint.json => dprint.json (100%) delete mode 100644 dprint.jsonc rename repos/effect/jsdocs.config.json => jsdocs.config.json (100%) delete mode 100644 lint-staged.config.js rename {repos/effect/migration => migration}/annotations/README.md (100%) rename {repos/effect/migration => migration}/annotations/effect__Arbitrary.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Array.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__BigDecimal.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__BigInt.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Brand.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Cache.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Cause.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Channel.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ChildExecutorDecision.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Chunk.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Clock.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Config.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ConfigError.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ConfigProvider.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ConfigProviderPathPatch.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Console.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Context.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Cron.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Data.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__DateTime.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__DefaultServices.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Deferred.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Differ.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Duration.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Effect.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Effectable.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Either.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Encoding.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Equal.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Equivalence.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ExecutionPlan.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ExecutionStrategy.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Exit.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__FastCheck.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Fiber.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__FiberHandle.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__FiberId.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__FiberMap.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__FiberRef.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__FiberRefs.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__FiberRefsPatch.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__FiberSet.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__FiberStatus.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Function.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__GlobalValue.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Graph.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__GroupBy.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Hash.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__HashMap.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__HashSet.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Inspectable.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Iterable.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__JSONSchema.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__KeyedPool.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Layer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__LayerMap.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__List.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__LogLevel.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__LogSpan.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Logger.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Mailbox.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ManagedRuntime.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Match.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MergeDecision.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MergeState.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MergeStrategy.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Metric.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MetricBoundaries.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MetricHook.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MetricKey.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MetricKeyType.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MetricLabel.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MetricPair.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MetricPolling.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MetricRegistry.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MetricState.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Micro.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ModuleVersion.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MutableHashMap.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MutableHashSet.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MutableList.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MutableQueue.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__MutableRef.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Number.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Option.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Order.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Ordering.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ParseResult.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__PartitionedSemaphore.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Pipeable.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Pool.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Predicate.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Pretty.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__PubSub.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Queue.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Random.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__RateLimiter.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__RcMap.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__RcRef.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Readable.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Record.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__RedBlackTree.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Redacted.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Ref.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Reloadable.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Request.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__RequestBlock.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__RequestResolver.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Resource.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Runtime.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__RuntimeFlags.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__RuntimeFlagsPatch.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__STM.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Schedule.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ScheduleDecision.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ScheduleInterval.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ScheduleIntervals.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Scheduler.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Schema.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__SchemaAST.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Scope.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ScopedCache.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ScopedRef.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Secret.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__SingleProducerAsyncInput.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Sink.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__SortedMap.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__SortedSet.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Stream.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__StreamEmit.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__StreamHaltStrategy.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Streamable.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Struct.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Subscribable.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__SubscriptionRef.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Supervisor.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Symbol.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__SynchronizedRef.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TArray.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TDeferred.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TMap.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TPriorityQueue.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TPubSub.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TQueue.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TRandom.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TReentrantLock.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TRef.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TSemaphore.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TSet.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TSubscriptionRef.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Take.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TestAnnotation.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TestAnnotationMap.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TestAnnotations.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TestClock.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TestConfig.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TestContext.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TestLive.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TestServices.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__TestSized.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Tracer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Trie.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Tuple.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Types.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__UpstreamPullRequest.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__UpstreamPullStrategy.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__Utils.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-amazon-bedrock.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-amazon-bedrock__AmazonBedrockClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-amazon-bedrock__AmazonBedrockConfig.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-amazon-bedrock__AmazonBedrockLanguageModel.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-amazon-bedrock__AmazonBedrockSchema.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-amazon-bedrock__AmazonBedrockTool.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-amazon-bedrock__EventStreamEncoding.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-amazon-bedrock__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-anthropic__AnthropicClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-anthropic__AnthropicConfig.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-anthropic__AnthropicLanguageModel.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-anthropic__AnthropicTokenizer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-anthropic__AnthropicTool.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-anthropic__Generated.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-anthropic__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-google.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-google__Generated.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-google__GoogleClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-google__GoogleConfig.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-google__GoogleLanguageModel.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-google__GoogleTool.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-google__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-openai__Generated.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-openai__OpenAiClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-openai__OpenAiConfig.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-openai__OpenAiEmbeddingModel.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-openai__OpenAiLanguageModel.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-openai__OpenAiTelemetry.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-openai__OpenAiTokenizer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-openai__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-openrouter__Generated.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-openrouter__OpenRouterClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-openrouter__OpenRouterConfig.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-openrouter__OpenRouterLanguageModel.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai-openrouter__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai__AiError.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai__Chat.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai__EmbeddingModel.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai__IdGenerator.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai__LanguageModel.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai__McpSchema.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai__McpServer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai__Model.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai__Prompt.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai__Response.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai__Tool.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai__Toolkit.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__ai__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__Args.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__AutoCorrect.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__BuiltInOptions.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__CliApp.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__CliConfig.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__Command.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__CommandDescriptor.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__CommandDirective.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__ConfigFile.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__HelpDoc.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__HelpDoc__Span.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__Options.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__Primitive.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__Prompt.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__Usage.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__ValidationError.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cli__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__ClusterCron.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__ClusterError.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__ClusterSchema.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__ClusterWorkflowEngine.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__DeliverAt.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__Entity.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__EntityAddress.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__EntityId.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__EntityProxy.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__EntityProxyServer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__EntityResource.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__Envelope.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__HttpRunner.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__K8sHttpClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__MachineId.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__Message.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__MessageStorage.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__Reply.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__Runner.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__RunnerAddress.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__RunnerHealth.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__RunnerServer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__RunnerStorage.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__Runners.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__ShardId.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__Sharding.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__ShardingConfig.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__ShardingRegistrationEvent.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__SingleRunner.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__Singleton.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__SingletonAddress.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__Snowflake.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__SocketRunner.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__SqlMessageStorage.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__SqlRunnerStorage.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__TestRunner.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__cluster__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__DevTools.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__DevTools__Client.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__DevTools__Domain.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__DevTools__Server.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__Event.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__EventGroup.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__EventJournal.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__EventLog.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__EventLogRemote.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__EventLogServer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__EventLogServer__Cloudflare.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__Machine.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__Machine__Procedure.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__Machine__ProcedureList.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__Machine__SerializableProcedureList.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__PersistedCache.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__PersistedQueue.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__PersistedQueue__Redis.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__Persistence.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__Persistence__Lmdb.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__Persistence__Redis.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__RateLimiter.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__RateLimiter__Redis.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__Reactivity.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__RequestResolver.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__Sse.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__VariantSchema.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__experimental__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__opentelemetry__Logger.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__opentelemetry__Metrics.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__opentelemetry__NodeSdk.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__opentelemetry__Otlp.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__opentelemetry__OtlpLogger.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__opentelemetry__OtlpMetrics.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__opentelemetry__OtlpResource.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__opentelemetry__OtlpTracer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__opentelemetry__Resource.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__opentelemetry__Tracer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__opentelemetry__WebSdk.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__opentelemetry__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-browser__BrowserHttpClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-browser__BrowserWorker.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-browser__BrowserWorkerRunner.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-browser__Clipboard.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-browser__Geolocation.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-browser__Permissions.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-browser__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-bun__BunCommandExecutor.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-bun__BunContext.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-bun__BunFileSystem__ParcelWatcher.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-bun__BunHttpPlatform.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-bun__BunHttpServer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-bun__BunHttpServerRequest.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-bun__BunKeyValueStore.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-bun__BunSink.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-bun__BunSocket.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-bun__BunSocketServer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-bun__BunStream.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-bun__BunWorker.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-bun__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-node-shared__NodeCommandExecutor.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-node-shared__NodeFileSystem__ParcelWatcher.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-node-shared__NodeKeyValueStore.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-node-shared__NodeMultipart.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-node-shared__NodeSink.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-node-shared__NodeSocket.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-node-shared__NodeStream.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-node__NodeCommandExecutor.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-node__NodeContext.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-node__NodeFileSystem__ParcelWatcher.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-node__NodeHttpClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-node__NodeHttpServer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-node__NodeKeyValueStore.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-node__NodeWorker.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-node__Undici.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform-node__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__ChannelSchema.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__Command.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__CommandExecutor.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__Cookies.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__Effectify.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__Error.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__Etag.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__FetchHttpClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__FileSystem.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__Headers.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpApi.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpApiBuilder.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpApiClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpApiEndpoint.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpApiError.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpApiGroup.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpApiMiddleware.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpApiScalar.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpApiSchema.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpApiSecurity.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpApiSwagger.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpApp.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpBody.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpClientError.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpClientRequest.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpClientResponse.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpIncomingMessage.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpLayerRouter.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpMethod.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpMiddleware.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpMultiplex.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpPlatform.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpRouter.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpServer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpServerError.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpServerRequest.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpServerRespondable.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__HttpServerResponse.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__KeyValueStore.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__MsgPack.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__Multipart.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__Ndjson.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__OpenApi.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__OpenApiJsonSchema.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__Path.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__PlatformConfigProvider.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__PlatformLogger.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__Runtime.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__Socket.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__SocketServer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__Template.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__Terminal.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__Transferable.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__Url.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__UrlParams.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__Worker.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__WorkerError.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__WorkerRunner.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__platform__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__printer-ansi.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__printer-ansi__Ansi.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__printer-ansi__AnsiDoc.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__printer-ansi__Color.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__printer-ansi__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__printer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__printer__Doc.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__printer__DocStream.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__printer__DocTree.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__printer__Flatten.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__printer__Layout.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__printer__Optimize.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__printer__PageWidth.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__printer__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__rpc.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__rpc__Rpc.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__rpc__RpcClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__rpc__RpcClientError.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__rpc__RpcGroup.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__rpc__RpcMessage.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__rpc__RpcMiddleware.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__rpc__RpcSchema.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__rpc__RpcSerialization.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__rpc__RpcServer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__rpc__RpcTest.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__rpc__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-clickhouse__ClickhouseClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-clickhouse__ClickhouseMigrator.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-clickhouse__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-d1__D1Client.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-d1__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-drizzle__Mysql.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-drizzle__Pg.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-drizzle__Sqlite.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-kysely__Kysely.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-kysely__Mssql.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-kysely__Mysql.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-kysely__Pg.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-kysely__Sqlite.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-kysely__patch.types.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-libsql__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-mssql__MssqlClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-mssql__Parameter.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-mssql__Procedure.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-mssql__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-mysql2__MysqlClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-mysql2__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-pg__PgClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-pg__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-sqlite-bun__SqliteClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-sqlite-bun__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-sqlite-do__SqliteClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-sqlite-do__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-sqlite-node__SqliteClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-sqlite-node__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-sqlite-react-native__SqliteClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-sqlite-react-native__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-sqlite-wasm__SqliteClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql-sqlite-wasm__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql__Migrator.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql__Migrator__FileSystem.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql__Model.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql__SqlClient.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql__SqlConnection.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql__SqlError.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql__SqlEventJournal.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql__SqlEventLogServer.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql__SqlPersistedQueue.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql__SqlResolver.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql__SqlSchema.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql__Statement.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__sql__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Alternative.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Applicative.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Bicovariant.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Bounded.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Chainable.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Contravariant.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Coproduct.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Covariant.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Filterable.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__FlatMap.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Foldable.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Invariant.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Monad.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Monoid.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Of.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Pointed.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Product.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__SemiAlternative.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__SemiApplicative.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__SemiCoproduct.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__SemiProduct.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Semigroup.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__Traversable.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__TraversableFilterable.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__data__Array.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__data__BigInt.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__data__Boolean.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__data__Duration.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__data__Effect.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__data__Either.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__data__Identity.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__data__Micro.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__data__Number.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__data__Option.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__data__Ordering.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__data__Predicate.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__data__Record.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__data__String.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__data__Tuple.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__typeclass__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__vitest__index.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__vitest__utils.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__workflow.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__workflow__Activity.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__workflow__DurableClock.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__workflow__DurableDeferred.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__workflow__DurableQueue.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__workflow__DurableRateLimiter.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__workflow__Workflow.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__workflow__WorkflowEngine.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__workflow__WorkflowProxy.yaml (100%) rename {repos/effect/migration => migration}/annotations/effect__workflow__WorkflowProxyServer.yaml (100%) rename {repos/effect/migration => migration}/cause.md (100%) rename {repos/effect/migration => migration}/equality.md (100%) rename {repos/effect/migration => migration}/error-handling.md (100%) rename {repos/effect/migration => migration}/fiber-keep-alive.md (100%) rename {repos/effect/migration => migration}/fiberref.md (100%) rename {repos/effect/migration => migration}/forking.md (100%) rename {repos/effect/migration => migration}/generators.md (100%) rename {repos/effect/migration => migration}/layer-memoization.md (100%) rename {repos/effect/migration => migration}/runtime.md (100%) rename {repos/effect/migration => migration}/schema.md (100%) rename {repos/effect/migration => migration}/scope.md (100%) rename {repos/effect/migration => migration}/services.md (100%) rename {repos/effect/migration => migration}/v3-to-v4.md (100%) rename {repos/effect/migration => migration}/yieldable.md (100%) delete mode 100644 old.patch rename {repos/effect/packages => packages}/ai/anthropic/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/ai/anthropic/README.md (100%) rename {repos/effect/packages => packages}/ai/anthropic/codegen.yml (100%) rename {repos/effect/packages => packages}/ai/anthropic/package.json (98%) rename {repos/effect/packages => packages}/ai/anthropic/src/AnthropicClient.ts (100%) rename {repos/effect/packages => packages}/ai/anthropic/src/AnthropicConfig.ts (100%) rename {repos/effect/packages => packages}/ai/anthropic/src/AnthropicError.ts (100%) rename {repos/effect/packages => packages}/ai/anthropic/src/AnthropicLanguageModel.ts (100%) rename {repos/effect/packages => packages}/ai/anthropic/src/AnthropicTelemetry.ts (100%) rename {repos/effect/packages => packages}/ai/anthropic/src/AnthropicTool.ts (100%) rename {repos/effect/packages => packages}/ai/anthropic/src/Generated.ts (100%) rename {repos/effect/packages => packages}/ai/anthropic/src/index.ts (100%) rename {repos/effect/packages => packages}/ai/anthropic/src/internal/errors.ts (100%) rename {repos/effect/packages => packages}/ai/anthropic/src/internal/utilities.ts (100%) rename {repos/effect/packages => packages}/ai/anthropic/test/AnthropicClient.test.ts (100%) rename {repos/effect/packages => packages}/ai/anthropic/test/AnthropicLanguageModel.test.ts (100%) rename {repos/effect/packages => packages}/ai/anthropic/tsconfig.json (100%) rename {repos/effect/packages => packages}/ai/anthropic/typetest/AnthropicLanguageModel.tst.ts (100%) rename {repos/effect/packages => packages}/ai/openai-compat/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/ai/openai-compat/README.md (100%) rename {repos/effect/packages => packages}/ai/openai-compat/package.json (98%) rename {repos/effect/packages => packages}/ai/openai-compat/src/OpenAiClient.ts (100%) rename {repos/effect/packages => packages}/ai/openai-compat/src/OpenAiConfig.ts (100%) rename {repos/effect/packages => packages}/ai/openai-compat/src/OpenAiEmbeddingModel.ts (100%) rename {repos/effect/packages => packages}/ai/openai-compat/src/OpenAiError.ts (100%) rename {repos/effect/packages => packages}/ai/openai-compat/src/OpenAiLanguageModel.ts (100%) rename {repos/effect/packages => packages}/ai/openai-compat/src/OpenAiTelemetry.ts (100%) rename {repos/effect/packages => packages}/ai/openai-compat/src/index.ts (100%) rename {repos/effect/packages => packages}/ai/openai-compat/src/internal/errors.ts (100%) rename {repos/effect/packages => packages}/ai/openai-compat/src/internal/utilities.ts (100%) rename {repos/effect/packages => packages}/ai/openai-compat/test/OpenAiClient.test.ts (100%) rename {repos/effect/packages => packages}/ai/openai-compat/test/OpenAiEmbeddingModel.test.ts (100%) rename {repos/effect/packages => packages}/ai/openai-compat/test/OpenAiLanguageModel.test.ts (100%) rename {repos/effect/packages => packages}/ai/openai-compat/tsconfig.json (100%) rename {repos/effect/packages => packages}/ai/openai-compat/typetest/OpenAiConfig.tst.ts (100%) rename {repos/effect/packages => packages}/ai/openai/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/ai/openai/README.md (100%) rename {repos/effect/packages => packages}/ai/openai/codegen.yaml (100%) rename {repos/effect/packages => packages}/ai/openai/package.json (98%) rename {repos/effect/packages => packages}/ai/openai/src/Generated.ts (100%) rename {repos/effect/packages => packages}/ai/openai/src/OpenAiClient.ts (100%) rename {repos/effect/packages => packages}/ai/openai/src/OpenAiClientGenerated.ts (100%) rename {repos/effect/packages => packages}/ai/openai/src/OpenAiConfig.ts (100%) rename {repos/effect/packages => packages}/ai/openai/src/OpenAiEmbeddingModel.ts (100%) rename {repos/effect/packages => packages}/ai/openai/src/OpenAiError.ts (100%) rename {repos/effect/packages => packages}/ai/openai/src/OpenAiLanguageModel.ts (100%) rename {repos/effect/packages => packages}/ai/openai/src/OpenAiSchema.ts (100%) rename {repos/effect/packages => packages}/ai/openai/src/OpenAiTelemetry.ts (100%) rename {repos/effect/packages => packages}/ai/openai/src/OpenAiTool.ts (100%) rename {repos/effect/packages => packages}/ai/openai/src/index.ts (100%) rename {repos/effect/packages => packages}/ai/openai/src/internal/errors.ts (100%) rename {repos/effect/packages => packages}/ai/openai/src/internal/utilities.ts (100%) rename {repos/effect/packages => packages}/ai/openai/test/OpenAiClient.test.ts (100%) rename {repos/effect/packages => packages}/ai/openai/test/OpenAiEmbeddingModel.test.ts (100%) rename {repos/effect/packages => packages}/ai/openai/test/OpenAiLanguageModel.test.ts (100%) rename {repos/effect/packages => packages}/ai/openai/test/OpenAiSchema.test.ts (100%) rename {repos/effect/packages => packages}/ai/openai/tsconfig.json (100%) rename {repos/effect/packages => packages}/ai/openai/typetest/OpenAiTool.tst.ts (100%) rename {repos/effect/packages => packages}/ai/openrouter/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/ai/openrouter/README.md (100%) rename {repos/effect/packages => packages}/ai/openrouter/codegen.yml (100%) rename {repos/effect/packages => packages}/ai/openrouter/package.json (98%) rename {repos/effect/packages => packages}/ai/openrouter/src/Generated.ts (100%) rename {repos/effect/packages => packages}/ai/openrouter/src/OpenRouterClient.ts (100%) rename {repos/effect/packages => packages}/ai/openrouter/src/OpenRouterConfig.ts (100%) rename {repos/effect/packages => packages}/ai/openrouter/src/OpenRouterError.ts (100%) rename {repos/effect/packages => packages}/ai/openrouter/src/OpenRouterLanguageModel.ts (100%) rename {repos/effect/packages => packages}/ai/openrouter/src/index.ts (100%) rename {repos/effect/packages => packages}/ai/openrouter/src/internal/errors.ts (100%) rename {repos/effect/packages => packages}/ai/openrouter/src/internal/utilities.ts (100%) rename {repos/effect/packages => packages}/ai/openrouter/test/Generated.test.ts (100%) rename {repos/effect/packages => packages}/ai/openrouter/test/OpenRouterClient.test.ts (100%) rename {repos/effect/packages => packages}/ai/openrouter/test/OpenRouterLanguageModel.test.ts (100%) rename {repos/effect/packages => packages}/ai/openrouter/tsconfig.json (100%) rename {repos/effect/packages => packages}/atom/react/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/atom/react/LICENSE (100%) rename {repos/effect/packages => packages}/atom/react/README.md (100%) rename {repos/effect/packages => packages}/atom/react/package.json (98%) rename {repos/effect/packages => packages}/atom/react/src/Hooks.ts (100%) rename {repos/effect/packages => packages}/atom/react/src/ReactHydration.ts (100%) rename {repos/effect/packages => packages}/atom/react/src/RegistryContext.ts (100%) rename {repos/effect/packages => packages}/atom/react/src/ScopedAtom.ts (100%) rename {repos/effect/packages => packages}/atom/react/src/index.ts (100%) rename {repos/effect/packages => packages}/atom/react/test/index.test.tsx (100%) rename {repos/effect/packages => packages}/atom/react/tsconfig.json (100%) rename {repos/effect/packages => packages}/atom/react/vitest.setup.ts (100%) rename {repos/effect/packages => packages}/atom/solid/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/atom/solid/LICENSE (100%) rename {repos/effect/packages => packages}/atom/solid/README.md (100%) rename {repos/effect/packages => packages}/atom/solid/package.json (98%) rename {repos/effect/packages => packages}/atom/solid/src/Hooks.ts (100%) rename {repos/effect/packages => packages}/atom/solid/src/RegistryContext.ts (100%) rename {repos/effect/packages => packages}/atom/solid/src/index.ts (100%) rename {repos/effect/packages => packages}/atom/solid/test/index.test.tsx (100%) rename {repos/effect/packages => packages}/atom/solid/tsconfig.json (100%) rename {repos/effect/packages => packages}/atom/solid/vitest.setup.ts (100%) rename {repos/effect/packages => packages}/atom/vue/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/atom/vue/LICENSE (100%) rename {repos/effect/packages => packages}/atom/vue/README.md (100%) rename {repos/effect/packages => packages}/atom/vue/package.json (98%) rename {repos/effect/packages => packages}/atom/vue/src/index.ts (100%) rename {repos/effect/packages => packages}/atom/vue/test/index.test.ts (100%) rename {repos/effect/packages => packages}/atom/vue/tsconfig.json (100%) delete mode 100644 packages/cli/.gitignore delete mode 100644 packages/cli/.madgerc delete mode 100644 packages/cli/.npmignore delete mode 100644 packages/cli/CHANGELOG.md delete mode 100755 packages/cli/bin.js delete mode 100644 packages/cli/package.json delete mode 100644 packages/cli/src/argv-patch.ts delete mode 100644 packages/cli/src/extract.ts delete mode 100644 packages/cli/src/gist.ts delete mode 100644 packages/cli/src/index.ts delete mode 100644 packages/cli/src/os-command.ts delete mode 100644 packages/cli/src/shared.ts delete mode 100644 packages/cli/src/sync-effect-app-subtree.ts delete mode 100644 packages/cli/src/sync-effect-subtree.ts delete mode 100644 packages/cli/src/sync-shared.ts delete mode 100644 packages/cli/src/update-packages.ts delete mode 100644 packages/cli/test.gists.yaml delete mode 100644 packages/cli/test/argv-patch.test.ts delete mode 100644 packages/cli/test/gist-cache.test.ts delete mode 100644 packages/cli/test/update-packages.test.ts delete mode 100644 packages/cli/tsconfig.json delete mode 100644 packages/cli/vitest.config.ts delete mode 100644 packages/e2e/CHANGELOG.md delete mode 100644 packages/e2e/package.json delete mode 100644 packages/e2e/test/repoInvalidation.e2e.test.ts delete mode 100644 packages/e2e/tsconfig.json delete mode 100644 packages/e2e/vitest.config.ts delete mode 100644 packages/effect-app/.madgerc delete mode 100644 packages/effect-app/.npmignore delete mode 100644 packages/effect-app/CHANGELOG.md delete mode 100644 packages/effect-app/package.json delete mode 100644 packages/effect-app/src/Array.ts delete mode 100644 packages/effect-app/src/Chunk.ts delete mode 100644 packages/effect-app/src/Config.ts delete mode 100644 packages/effect-app/src/Config/SecretURL.ts delete mode 100644 packages/effect-app/src/Config/internal/configSecretURL.ts delete mode 100644 packages/effect-app/src/ConfigProvider.ts delete mode 100644 packages/effect-app/src/Context.ts delete mode 100644 packages/effect-app/src/DataDependencies.ts delete mode 100644 packages/effect-app/src/Effect.ts delete mode 100644 packages/effect-app/src/Emailer.ts delete mode 100644 packages/effect-app/src/Function.ts delete mode 100644 packages/effect-app/src/Inputify.type.ts delete mode 100644 packages/effect-app/src/Layer.ts delete mode 100644 packages/effect-app/src/Model.ts delete mode 100644 packages/effect-app/src/Model/Repository.ts delete mode 100644 packages/effect-app/src/Model/Repository/Registry.ts delete mode 100644 packages/effect-app/src/Model/Repository/dependency.ts delete mode 100644 packages/effect-app/src/Model/Repository/ext.ts delete mode 100644 packages/effect-app/src/Model/Repository/internal/internal.ts delete mode 100644 packages/effect-app/src/Model/Repository/legacy.ts delete mode 100644 packages/effect-app/src/Model/Repository/makeRepo.ts delete mode 100644 packages/effect-app/src/Model/Repository/service.ts delete mode 100644 packages/effect-app/src/Model/Repository/validation.ts delete mode 100644 packages/effect-app/src/Model/dsl.ts delete mode 100644 packages/effect-app/src/Model/filter/filterApi.ts delete mode 100644 packages/effect-app/src/Model/filter/types.ts delete mode 100644 packages/effect-app/src/Model/filter/types/errors.ts delete mode 100644 packages/effect-app/src/Model/filter/types/fields.ts delete mode 100644 packages/effect-app/src/Model/filter/types/path/common.ts delete mode 100644 packages/effect-app/src/Model/filter/types/path/eager.ts delete mode 100644 packages/effect-app/src/Model/filter/types/path/index.ts delete mode 100644 packages/effect-app/src/Model/filter/types/utils.ts delete mode 100644 packages/effect-app/src/Model/filter/types/validator.ts delete mode 100644 packages/effect-app/src/Model/query.ts delete mode 100644 packages/effect-app/src/Model/query/dsl.ts delete mode 100644 packages/effect-app/src/Model/query/new-kid-interpreter.ts delete mode 100644 packages/effect-app/src/NonEmptySet.ts delete mode 100644 packages/effect-app/src/Option.ts delete mode 100644 packages/effect-app/src/Pure.ts delete mode 100644 packages/effect-app/src/QueueMaker.ts delete mode 100644 packages/effect-app/src/RequestContext.ts delete mode 100644 packages/effect-app/src/RequestScopedDependencies.ts delete mode 100644 packages/effect-app/src/Schema.ts delete mode 100644 packages/effect-app/src/Schema/Class.ts delete mode 100644 packages/effect-app/src/Schema/FastCheck.ts delete mode 100644 packages/effect-app/src/Schema/Methods.ts delete mode 100644 packages/effect-app/src/Schema/SchemaParser.ts delete mode 100644 packages/effect-app/src/Schema/SpecialJsonSchema.ts delete mode 100644 packages/effect-app/src/Schema/SpecialOpenApi.ts delete mode 100644 packages/effect-app/src/Schema/brand.ts delete mode 100644 packages/effect-app/src/Schema/email.ts delete mode 100644 packages/effect-app/src/Schema/ext.ts delete mode 100644 packages/effect-app/src/Schema/moreStrings.ts delete mode 100644 packages/effect-app/src/Schema/numbers.ts delete mode 100644 packages/effect-app/src/Schema/phoneNumber.ts delete mode 100644 packages/effect-app/src/Schema/schema.ts delete mode 100644 packages/effect-app/src/Schema/strings.ts delete mode 100644 packages/effect-app/src/SchemaAST.ts delete mode 100644 packages/effect-app/src/Set.ts delete mode 100644 packages/effect-app/src/Store.ts delete mode 100644 packages/effect-app/src/TypeTest.ts delete mode 100644 packages/effect-app/src/Types.ts delete mode 100644 packages/effect-app/src/Widen.type.ts delete mode 100644 packages/effect-app/src/_ext/Array.ts delete mode 100644 packages/effect-app/src/_ext/date.ts delete mode 100644 packages/effect-app/src/_ext/misc.ts delete mode 100644 packages/effect-app/src/_ext/ord.ext.ts delete mode 100644 packages/effect-app/src/builtin-json.d.ts delete mode 100644 packages/effect-app/src/builtin.ts delete mode 100644 packages/effect-app/src/client.ts delete mode 100644 packages/effect-app/src/client/InvalidationKeys.ts delete mode 100644 packages/effect-app/src/client/apiClientFactory.ts delete mode 100644 packages/effect-app/src/client/clientFor.ts delete mode 100644 packages/effect-app/src/client/errors.ts delete mode 100644 packages/effect-app/src/client/makeClient.ts delete mode 100644 packages/effect-app/src/faker.ts delete mode 100644 packages/effect-app/src/http.ts delete mode 100644 packages/effect-app/src/http/Request.ts delete mode 100644 packages/effect-app/src/http/internal/lib.ts delete mode 100644 packages/effect-app/src/ids.ts delete mode 100644 packages/effect-app/src/index.ts delete mode 100644 packages/effect-app/src/logger.ts delete mode 100644 packages/effect-app/src/middleware.ts delete mode 100644 packages/effect-app/src/rpc.ts delete mode 100644 packages/effect-app/src/rpc/Invalidation.ts delete mode 100644 packages/effect-app/src/rpc/MiddlewareMaker.ts delete mode 100644 packages/effect-app/src/rpc/README.md delete mode 100644 packages/effect-app/src/rpc/RpcContextMap.ts delete mode 100644 packages/effect-app/src/rpc/RpcMiddleware.ts delete mode 100644 packages/effect-app/src/runtime.ts delete mode 100644 packages/effect-app/src/setupRequest.ts delete mode 100644 packages/effect-app/src/toast.ts delete mode 100644 packages/effect-app/src/transform.ts delete mode 100644 packages/effect-app/src/utils.ts delete mode 100644 packages/effect-app/src/utils/effectify.ts delete mode 100644 packages/effect-app/src/utils/extend.ts delete mode 100644 packages/effect-app/src/utils/gen.ts delete mode 100644 packages/effect-app/src/utils/logLevel.ts delete mode 100644 packages/effect-app/src/utils/logger.ts delete mode 100644 packages/effect-app/src/validation.ts delete mode 100644 packages/effect-app/src/validation/validators.ts delete mode 100644 packages/effect-app/src/withToast.ts delete mode 100644 packages/effect-app/test/moreStrings.test.ts delete mode 100644 packages/effect-app/test/rpc.test.ts delete mode 100644 packages/effect-app/test/rpcMiddlewareContext.test.ts delete mode 100644 packages/effect-app/test/schema.test.ts delete mode 100644 packages/effect-app/test/secretURL.test.ts delete mode 100644 packages/effect-app/test/special.test.ts delete mode 100644 packages/effect-app/test/utils.test.ts delete mode 100644 packages/effect-app/tsconfig.base.json delete mode 100644 packages/effect-app/tsconfig.json delete mode 100644 packages/effect-app/tsconfig.src.json delete mode 100644 packages/effect-app/tsconfig.test.json delete mode 100644 packages/effect-app/vitest.config.ts rename {repos/effect/packages => packages}/effect/ARBITRARY-FOLLOW-UPS.md (100%) rename {repos/effect/packages => packages}/effect/ARBITRARY-MIGRATION.md (100%) rename {repos/effect/packages => packages}/effect/ARBITRARY.md (100%) rename {repos/effect/packages => packages}/effect/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/effect/CONFIG.md (100%) rename {repos/effect/packages => packages}/effect/HTTPAPI.md (100%) rename {repos/effect/packages => packages}/effect/LICENSE (100%) rename {repos/effect/packages => packages}/effect/MCP.md (100%) rename {repos/effect/packages => packages}/effect/OPTIC.md (100%) rename {repos/effect/packages => packages}/effect/README.md (100%) rename {repos/effect/packages => packages}/effect/SCHEMA.md (100%) rename {repos/effect/packages => packages}/effect/benchmark/Pool.ts (100%) rename {repos/effect/packages => packages}/effect/benchmark/http/multipart.ts (100%) rename {repos/effect/packages => packages}/effect/benchmark/http/serverAllocations.ts (100%) rename {repos/effect/packages => packages}/effect/benchmark/http/tracer.ts (100%) rename {repos/effect/packages => packages}/effect/benchmark/httpapi/sseClientDecoder.ts (100%) rename {repos/effect/packages => packages}/effect/benchmark/rpc/RpcSerialization.ts (100%) rename {repos/effect/packages => packages}/effect/benchmark/schema/Optic.ts (100%) rename {repos/effect/packages => packages}/effect/benchmark/schema/SchemaBinary.md (100%) rename {repos/effect/packages => packages}/effect/benchmark/schema/SchemaBinary.ts (100%) rename {repos/effect/packages => packages}/effect/benchmark/schema/SchemaError.ts (100%) rename {repos/effect/packages => packages}/effect/benchmark/stream/splitLines.ts (100%) rename {repos/effect/packages => packages}/effect/package.json (98%) rename {repos/effect/packages => packages}/effect/runtimeperf/README.md (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/compare.mts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/config.json (96%) rename {repos/effect/packages => packages}/effect/runtimeperf/materialize.mts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/run.mts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/stats.mts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/suites/arbitrary/fixtures/fast-check-v4.ts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/suites/arbitrary/fixtures/native.ts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/suites/arbitrary/fixtures/schema.ts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/suites/schema-benchmarks/fixtures/data.ts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/suites/schema-benchmarks/fixtures/effect-beta.ts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/suites/schema-benchmarks/fixtures/valibot.ts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/suites/schema-benchmarks/fixtures/zod.ts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/suites/schema/fixtures/adapters.ts (94%) rename {repos/effect/packages => packages}/effect/runtimeperf/suites/schema/fixtures/behavior.ts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/suites/schema/fixtures/cold.ts (60%) rename {repos/effect/packages => packages}/effect/runtimeperf/suites/schema/fixtures/comparison.ts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/test/materialize.test.mts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/test/registry.test.mts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/test/stats.test.mts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/test/worker.test.mts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/utils.mts (100%) rename {repos/effect/packages => packages}/effect/runtimeperf/worker.mts (100%) rename {repos/effect/packages => packages}/effect/src/Array.ts (100%) rename {repos/effect/packages => packages}/effect/src/BigDecimal.ts (100%) rename {repos/effect/packages => packages}/effect/src/BigInt.ts (100%) rename {repos/effect/packages => packages}/effect/src/Boolean.ts (100%) rename {repos/effect/packages => packages}/effect/src/Brand.ts (100%) rename {repos/effect/packages => packages}/effect/src/ByteSize.ts (100%) rename {repos/effect/packages => packages}/effect/src/Cache.ts (100%) rename {repos/effect/packages => packages}/effect/src/Cause.ts (100%) rename {repos/effect/packages => packages}/effect/src/Channel.ts (100%) rename {repos/effect/packages => packages}/effect/src/ChannelSchema.ts (100%) rename {repos/effect/packages => packages}/effect/src/Chunk.ts (100%) rename {repos/effect/packages => packages}/effect/src/Clock.ts (100%) rename {repos/effect/packages => packages}/effect/src/Combiner.ts (100%) rename {repos/effect/packages => packages}/effect/src/Config.ts (100%) rename {repos/effect/packages => packages}/effect/src/ConfigProvider.ts (100%) rename {repos/effect/packages => packages}/effect/src/Console.ts (100%) rename {repos/effect/packages => packages}/effect/src/Context.ts (100%) rename {repos/effect/packages => packages}/effect/src/Cron.ts (100%) rename {repos/effect/packages => packages}/effect/src/Crypto.ts (100%) rename {repos/effect/packages => packages}/effect/src/Data.ts (100%) rename {repos/effect/packages => packages}/effect/src/DateTime.ts (100%) rename {repos/effect/packages => packages}/effect/src/Deferred.ts (100%) rename {repos/effect/packages => packages}/effect/src/Differ.ts (100%) rename {repos/effect/packages => packages}/effect/src/Duration.ts (100%) rename {repos/effect/packages => packages}/effect/src/Effect.ts (100%) rename {repos/effect/packages => packages}/effect/src/Effectable.ts (100%) rename {repos/effect/packages => packages}/effect/src/Encoding.ts (100%) rename {repos/effect/packages => packages}/effect/src/Equal.ts (100%) rename {repos/effect/packages => packages}/effect/src/Equivalence.ts (100%) rename {repos/effect/packages => packages}/effect/src/ErrorReporter.ts (100%) rename {repos/effect/packages => packages}/effect/src/ExecutionPlan.ts (100%) rename {repos/effect/packages => packages}/effect/src/Exit.ts (100%) rename {repos/effect/packages => packages}/effect/src/Fiber.ts (100%) rename {repos/effect/packages => packages}/effect/src/FiberHandle.ts (100%) rename {repos/effect/packages => packages}/effect/src/FiberMap.ts (100%) rename {repos/effect/packages => packages}/effect/src/FiberSet.ts (100%) rename {repos/effect/packages => packages}/effect/src/FileSystem.ts (100%) rename {repos/effect/packages => packages}/effect/src/Filter.ts (100%) rename {repos/effect/packages => packages}/effect/src/Formatter.ts (100%) rename {repos/effect/packages => packages}/effect/src/Function.ts (100%) rename {repos/effect/packages => packages}/effect/src/Graph.ts (100%) rename {repos/effect/packages => packages}/effect/src/HKT.ts (100%) rename {repos/effect/packages => packages}/effect/src/Hash.ts (100%) rename {repos/effect/packages => packages}/effect/src/HashMap.ts (100%) rename {repos/effect/packages => packages}/effect/src/HashRing.ts (100%) rename {repos/effect/packages => packages}/effect/src/HashSet.ts (100%) rename {repos/effect/packages => packages}/effect/src/Inspectable.ts (100%) rename {repos/effect/packages => packages}/effect/src/Iterable.ts (100%) rename {repos/effect/packages => packages}/effect/src/JsonPatch.ts (100%) rename {repos/effect/packages => packages}/effect/src/JsonPointer.ts (100%) rename {repos/effect/packages => packages}/effect/src/JsonSchema.ts (100%) rename {repos/effect/packages => packages}/effect/src/Latch.ts (100%) rename {repos/effect/packages => packages}/effect/src/Layer.ts (100%) rename {repos/effect/packages => packages}/effect/src/LayerMap.ts (100%) rename {repos/effect/packages => packages}/effect/src/LayerRef.ts (100%) rename {repos/effect/packages => packages}/effect/src/LogLevel.ts (100%) rename {repos/effect/packages => packages}/effect/src/Logger.ts (100%) rename {repos/effect/packages => packages}/effect/src/ManagedRuntime.ts (100%) rename {repos/effect/packages => packages}/effect/src/Match.ts (100%) rename {repos/effect/packages => packages}/effect/src/Metric.ts (100%) rename {repos/effect/packages => packages}/effect/src/MutableHashMap.ts (100%) rename {repos/effect/packages => packages}/effect/src/MutableHashSet.ts (100%) rename {repos/effect/packages => packages}/effect/src/MutableList.ts (100%) rename {repos/effect/packages => packages}/effect/src/MutableRef.ts (100%) rename {repos/effect/packages => packages}/effect/src/Newtype.ts (100%) rename {repos/effect/packages => packages}/effect/src/NonEmptyIterable.ts (100%) rename {repos/effect/packages => packages}/effect/src/Number.ts (100%) rename {repos/effect/packages => packages}/effect/src/Optic.ts (100%) rename {repos/effect/packages => packages}/effect/src/Option.ts (100%) rename {repos/effect/packages => packages}/effect/src/Order.ts (100%) rename {repos/effect/packages => packages}/effect/src/Ordering.ts (100%) rename {repos/effect/packages => packages}/effect/src/PartitionedSemaphore.ts (100%) rename {repos/effect/packages => packages}/effect/src/Path.ts (100%) rename {repos/effect/packages => packages}/effect/src/Pipeable.ts (100%) rename {repos/effect/packages => packages}/effect/src/PlatformError.ts (100%) rename {repos/effect/packages => packages}/effect/src/Pool.ts (100%) rename {repos/effect/packages => packages}/effect/src/Predicate.ts (100%) rename {repos/effect/packages => packages}/effect/src/PrimaryKey.ts (100%) rename {repos/effect/packages => packages}/effect/src/PubSub.ts (100%) rename {repos/effect/packages => packages}/effect/src/Pull.ts (100%) rename {repos/effect/packages => packages}/effect/src/Queue.ts (100%) rename {repos/effect/packages => packages}/effect/src/Random.ts (100%) rename {repos/effect/packages => packages}/effect/src/RcMap.ts (100%) rename {repos/effect/packages => packages}/effect/src/RcRef.ts (100%) rename {repos/effect/packages => packages}/effect/src/Record.ts (100%) rename {repos/effect/packages => packages}/effect/src/Redactable.ts (100%) rename {repos/effect/packages => packages}/effect/src/Redacted.ts (100%) rename {repos/effect/packages => packages}/effect/src/Reducer.ts (100%) rename {repos/effect/packages => packages}/effect/src/Ref.ts (100%) rename {repos/effect/packages => packages}/effect/src/References.ts (100%) rename {repos/effect/packages => packages}/effect/src/RegExp.ts (100%) rename {repos/effect/packages => packages}/effect/src/Request.ts (100%) rename {repos/effect/packages => packages}/effect/src/RequestResolver.ts (100%) rename {repos/effect/packages => packages}/effect/src/Resource.ts (100%) rename {repos/effect/packages => packages}/effect/src/Result.ts (100%) rename {repos/effect/packages => packages}/effect/src/Runtime.ts (100%) rename {repos/effect/packages => packages}/effect/src/Schedule.ts (100%) rename {repos/effect/packages => packages}/effect/src/Scheduler.ts (100%) rename {repos/effect/packages => packages}/effect/src/Schema.ts (100%) rename {repos/effect/packages => packages}/effect/src/SchemaAST.ts (99%) rename {repos/effect/packages => packages}/effect/src/SchemaGetter.ts (100%) rename {repos/effect/packages => packages}/effect/src/SchemaIssue.ts (100%) rename {repos/effect/packages => packages}/effect/src/SchemaParser.ts (99%) rename {repos/effect/packages => packages}/effect/src/SchemaRepresentation.ts (100%) rename {repos/effect/packages => packages}/effect/src/SchemaTransformation.ts (100%) rename {repos/effect/packages => packages}/effect/src/Scope.ts (100%) rename {repos/effect/packages => packages}/effect/src/ScopedCache.ts (100%) rename {repos/effect/packages => packages}/effect/src/ScopedRef.ts (100%) rename {repos/effect/packages => packages}/effect/src/Semaphore.ts (100%) rename {repos/effect/packages => packages}/effect/src/Sink.ts (100%) rename {repos/effect/packages => packages}/effect/src/StandardSchema.ts (100%) rename {repos/effect/packages => packages}/effect/src/Stdio.ts (100%) rename {repos/effect/packages => packages}/effect/src/Stream.ts (100%) rename {repos/effect/packages => packages}/effect/src/String.ts (100%) rename {repos/effect/packages => packages}/effect/src/Struct.ts (100%) rename {repos/effect/packages => packages}/effect/src/SubscriptionRef.ts (100%) rename {repos/effect/packages => packages}/effect/src/Symbol.ts (100%) rename {repos/effect/packages => packages}/effect/src/SynchronizedRef.ts (100%) rename {repos/effect/packages => packages}/effect/src/Take.ts (100%) rename {repos/effect/packages => packages}/effect/src/Terminal.ts (100%) rename {repos/effect/packages => packages}/effect/src/Tracer.ts (100%) rename {repos/effect/packages => packages}/effect/src/Trie.ts (100%) rename {repos/effect/packages => packages}/effect/src/Tuple.ts (100%) rename {repos/effect/packages => packages}/effect/src/TxChunk.ts (100%) rename {repos/effect/packages => packages}/effect/src/TxDeferred.ts (100%) rename {repos/effect/packages => packages}/effect/src/TxHashMap.ts (100%) rename {repos/effect/packages => packages}/effect/src/TxHashSet.ts (100%) rename {repos/effect/packages => packages}/effect/src/TxPriorityQueue.ts (100%) rename {repos/effect/packages => packages}/effect/src/TxPubSub.ts (100%) rename {repos/effect/packages => packages}/effect/src/TxQueue.ts (100%) rename {repos/effect/packages => packages}/effect/src/TxReentrantLock.ts (100%) rename {repos/effect/packages => packages}/effect/src/TxRef.ts (100%) rename {repos/effect/packages => packages}/effect/src/TxSemaphore.ts (100%) rename {repos/effect/packages => packages}/effect/src/TxSubscriptionRef.ts (100%) rename {repos/effect/packages => packages}/effect/src/Types.ts (100%) rename {repos/effect/packages => packages}/effect/src/UndefinedOr.ts (100%) rename {repos/effect/packages => packages}/effect/src/Unify.ts (100%) rename {repos/effect/packages => packages}/effect/src/Utils.ts (100%) rename {repos/effect/packages => packages}/effect/src/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/arbitrary/model.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/arbitrary/regexp.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/arbitrary/runner.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/arbitrary/schema.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/array.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/core.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/count.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/dateTime.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/doNotation.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/effect.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/equal.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/errors.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/executionPlan.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/graph.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/graphCsr.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/hashMap.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/hashSet.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/layer.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/matcher.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/metric.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/option.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/persistence.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/random.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/rcRef.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/record.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/redacted.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/references.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/request.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/result.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/schedule.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/schema/annotations.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/schema/cause.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/schema/fromJsonSchemaDocument.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/schema/fromRepresentation.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/schema/make.ts (78%) rename {repos/effect/packages => packages}/effect/src/internal/schema/parser.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/schema/standardSchema.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/schema/toCodeDocument.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/schema/toCodec.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/schema/toDifferJsonPatch.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/schema/toEncoderXml.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/schema/toEquivalence.ts (98%) rename {repos/effect/packages => packages}/effect/src/internal/schema/toFormatter.ts (98%) rename {repos/effect/packages => packages}/effect/src/internal/schema/toIso.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/schema/toJsonSchemaDocument.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/schema/toRepresentation.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/schemaError.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/stackTraceLimit.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/stream.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/tracer.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/trie.ts (100%) rename {repos/effect/packages => packages}/effect/src/internal/uuid.ts (100%) rename {repos/effect/packages => packages}/effect/src/testing/TestClock.ts (100%) rename {repos/effect/packages => packages}/effect/src/testing/TestConsole.ts (100%) rename {repos/effect/packages => packages}/effect/src/testing/TestSchema.ts (100%) rename {repos/effect/packages => packages}/effect/src/testing/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/AiError.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/AnthropicStructuredOutput.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/Chat.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/EmbeddingModel.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/IdGenerator.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/LanguageModel.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/McpProtocol.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/McpSchema.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/McpServer.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/Model.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/OpenAiStructuredOutput.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/Prompt.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/Response.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/ResponseIdTracker.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/Telemetry.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/Tokenizer.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/Tool.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/Toolkit.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/internal/codec-transformer.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/internal/mcpCore.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/internal/mcpProtocol.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/internal/mcpProtocol/v2024_11_05.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/internal/mcpProtocol/v2025_03_26.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/internal/mcpProtocol/v2025_06_18.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/internal/mcpProtocol/v2025_11_25.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/internal/mcpProtocolRegistry.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/internal/mcpSchema/v2024_11_05.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/internal/mcpSchema/v2025_03_26.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/internal/mcpSchema/v2025_06_18.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/internal/mcpSchema/v2025_11_25.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/ai/internal/structured-output.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/arbitrary/Arbitrary.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/arbitrary/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/Argument.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/CliConfig.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/CliError.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/CliOutput.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/Command.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/Completions.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/Flag.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/GlobalFlag.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/HelpDoc.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/Param.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/Primitive.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/Prompt.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/internal/ansi.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/internal/auto-suggest.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/internal/command.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/internal/completions/bash.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/internal/completions/descriptor.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/internal/completions/fish.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/internal/completions/zsh.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/internal/config.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/internal/help.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/internal/lexer.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/internal/parser.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cli/internal/wizard.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/ClusterCron.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/ClusterError.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/ClusterMetrics.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/ClusterSchema.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/ClusterWorkflowEngine.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/DeliverAt.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/Entity.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/EntityAddress.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/EntityId.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/EntityProxy.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/EntityProxyServer.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/EntityResource.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/EntityType.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/Envelope.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/HttpRunner.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/K8sHttpClient.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/K8sTypes.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/MachineId.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/Message.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/MessageStorage.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/Reply.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/Runner.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/RunnerAddress.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/RunnerHealth.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/RunnerServer.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/RunnerStorage.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/Runners.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/ShardId.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/Sharding.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/ShardingConfig.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/ShardingRegistrationEvent.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/SingleRunner.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/Singleton.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/SingletonAddress.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/Snowflake.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/SocketRunner.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/SqlMessageStorage.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/SqlRunnerStorage.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/TestRunner.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/internal/clusterAbandon.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/internal/entityManager.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/internal/entityReaper.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/internal/hash.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/internal/interruptors.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/internal/resourceMap.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/internal/resourceRef.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/cluster/internal/shardLock.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/devtools/DevTools.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/devtools/DevToolsClient.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/devtools/DevToolsSchema.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/devtools/DevToolsServer.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/devtools/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/encoding/Ini.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/encoding/Ndjson.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/encoding/SchemaBinary.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/encoding/Sse.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/encoding/Toml.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/encoding/Yaml.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/encoding/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/eventlog/Event.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/eventlog/EventGroup.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/eventlog/EventJournal.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/eventlog/EventLog.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/eventlog/EventLogEncryption.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/eventlog/EventLogMessage.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/eventlog/EventLogRemote.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/eventlog/EventLogServer.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/eventlog/EventLogServerEncrypted.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/eventlog/EventLogServerUnencrypted.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/eventlog/EventLogSessionAuth.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/eventlog/SqlEventJournal.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/eventlog/SqlEventLogServerEncrypted.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/eventlog/SqlEventLogServerUnencrypted.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/eventlog/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/eventlog/internal/identityRootSecretDerivation.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/Cookies.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/Etag.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/FetchHttpClient.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/FindMyWay.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/FindMyWay/internal/queryString.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/FindMyWay/internal/router.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/Headers.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpBody.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpClient.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpClientError.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpClientRequest.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpClientResponse.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpEffect.ts (98%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpIncomingMessage.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpMethod.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpMiddleware.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpPlatform.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpRouter.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpServer.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpServerError.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpServerRequest.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpServerRespondable.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpServerResponse.ts (97%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpStaticServer.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpStatus.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/HttpTraceContext.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/Mime.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/Multipart.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/MultipartParser.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/MultipartParser/HeadersParser.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/MultipartParser/Search.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/MultipartParser/internal/contentType.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/MultipartParser/internal/headers.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/MultipartParser/internal/multipart.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/MultipartParser/internal/search.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/Template.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/Url.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/UrlParams.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/internal/compression.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/internal/headers.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/internal/httpBody.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/internal/mimeTypes.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/http/internal/preResponseHandler.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/HttpApi.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/HttpApiBuilder.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/HttpApiClient.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/HttpApiEndpoint.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/HttpApiError.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/HttpApiGroup.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/HttpApiMiddleware.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/HttpApiScalar.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/HttpApiSchema.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/HttpApiSecurity.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/HttpApiSwagger.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/HttpApiTest.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/OpenApi.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/internal/html.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/internal/httpApiScalar.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/internal/httpApiSwagger.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/httpapi/internal/mediaType.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/net/IpInterface.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/net/IpNetwork.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/net/NetAddress.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/net/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/observability/Otlp.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/observability/OtlpExporter.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/observability/OtlpLogger.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/observability/OtlpMetrics.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/observability/OtlpResource.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/observability/OtlpSerialization.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/observability/OtlpTracer.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/observability/PrometheusMetrics.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/observability/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/observability/internal/otlpEnv.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/observability/internal/otlpProtobuf.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/observability/internal/protobuf.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/persistence/KeyValueStore.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/persistence/Persistable.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/persistence/PersistedCache.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/persistence/PersistedQueue.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/persistence/Persistence.ts (98%) rename {repos/effect/packages => packages}/effect/src/unstable/persistence/RateLimiter.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/persistence/Redis.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/persistence/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/process/ChildProcess.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/process/ChildProcessSpawner.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/process/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/reactivity/AsyncResult.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/reactivity/Atom.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/reactivity/AtomHttpApi.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/reactivity/AtomRef.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/reactivity/AtomRegistry.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/reactivity/AtomRpc.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/reactivity/Hydration.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/reactivity/Reactivity.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/reactivity/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/rpc/Rpc.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/rpc/RpcClient.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/rpc/RpcClientError.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/rpc/RpcGroup.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/rpc/RpcMessage.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/rpc/RpcMiddleware.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/rpc/RpcSchema.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/rpc/RpcSerialization.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/rpc/RpcServer.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/rpc/RpcTest.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/rpc/RpcWorker.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/rpc/Utils.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/rpc/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/schema/Model.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/schema/VariantSchema.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/schema/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/socket/Socket.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/socket/SocketServer.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/socket/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/sql/Migrator.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/sql/SqlClient.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/sql/SqlConnection.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/sql/SqlError.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/sql/SqlModel.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/sql/SqlResolver.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/sql/SqlSchema.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/sql/SqlStream.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/sql/Statement.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/sql/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/workers/Transferable.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/workers/Worker.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/workers/WorkerError.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/workers/WorkerRunner.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/workers/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/workflow/Activity.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/workflow/DurableClock.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/workflow/DurableDeferred.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/workflow/DurableQueue.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/workflow/Workflow.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/workflow/WorkflowEngine.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/workflow/WorkflowProxy.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/workflow/WorkflowProxyServer.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/workflow/index.ts (100%) rename {repos/effect/packages => packages}/effect/src/unstable/workflow/internal/crypto.ts (100%) rename {repos/effect/packages => packages}/effect/test/Array.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/ArrayNaNIndex.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/AtomRef.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/BigDecimal.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/BigInt.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Boolean.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Brand.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/ByteSize.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Cache.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Cause.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/CauseMapAnnotations.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Channel.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Chunk.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Clock.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Combiner.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Config.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/ConfigProvider.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Context.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Cron.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Crypto.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Data.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/DateTime.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Deferred.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Duration.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Effect.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/EffectEager.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/EffectKeepAlive.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Effectable.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Encoding.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Equal.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Equivalence.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/ExecutionPlan.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Exit.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Fiber.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/FiberHandle.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/FiberMap.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/FiberSet.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/FiberSetRuntimePropagation.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/FileSystem.test-utils.ts (100%) rename {repos/effect/packages => packages}/effect/test/Formatter.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Function.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Graph.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/HashMap.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/HashRing.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/HashSet.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/HttpClient.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Iterable.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/JsonPatch.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/JsonPointer.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/JsonSchema.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Latch.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Layer.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/LayerMap.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/LayerRef.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/LogLevel.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Logger.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/ManagedRuntime.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Match.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Metric.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Migrator.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/MutableHashMap.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/MutableHashSet.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/MutableList.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Newtype.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Number.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Optic.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Option.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Order.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Ordering.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/PartitionedSemaphore.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Pathfinding.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Pool.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Predicate.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/PubSub.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Pull.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Queue.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Random.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/RcMap.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/RcRef.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Record.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Redacted.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Reducer.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Ref.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Request.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Resource.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Result.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Schedule.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Scheduler.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Scope.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/ScopedCache.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/ScopedRef.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Semaphore.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Sink.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/StackCapture.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/StackTraceLimit.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Stdio.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Stream.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/String.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Struct.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/SubscriptionRef.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Symbol.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/SynchronizedRef.modifySomeEffect.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/SynchronizedRef.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/TestClock.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Tracer.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Trie.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/Tuple.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/TxChunk.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/TxDeferred.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/TxHashMap.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/TxHashSet.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/TxPriorityQueue.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/TxPubSub.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/TxQueue.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/TxReentrantLock.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/TxSemaphore.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/TxSubscriptionRef.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/UndefinedOr.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/cluster/ClusterWorkflowEngine.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/cluster/Entity.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/cluster/Envelope.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/cluster/K8sHttpClient.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/cluster/MessageStorage.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/cluster/ResourceMap.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/cluster/ResourceRef.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/cluster/RunnerServer.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/cluster/RunnerStorage.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/cluster/Runners.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/cluster/Sharding.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/cluster/ShardingConfig.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/cluster/TestEntity.ts (100%) rename {repos/effect/packages => packages}/effect/test/cluster/interruptors.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/fixtures/migrator/0001_first.js (100%) rename {repos/effect/packages => packages}/effect/test/fixtures/text.txt (100%) rename {repos/effect/packages => packages}/effect/test/internal/Uuid.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/reactivity/AsyncResult.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/reactivity/Atom.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/reactivity/AtomHttpApi.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/reactivity/AtomRpc.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/rpc/Rpc.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/rpc/RpcClient.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/rpc/RpcSerialization.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/rpc/RpcServer.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/Graph.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/HMR.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/Schema.test.ts (99%) rename {repos/effect/packages => packages}/effect/test/schema/SchemaAST.test.ts (96%) rename {repos/effect/packages => packages}/effect/test/schema/SchemaGetter.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/SchemaIssue.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/SchemaParser.test.ts (97%) rename {repos/effect/packages => packages}/effect/test/schema/SchemaTransformation.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/TemplateLiteral.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/fixtures/HMR-Class.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/fixtures/HMR-sanity-check.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/jsonSchemaRoundTrip.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/builtInRevivers.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/fromJson.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/fromJsonMultiDocument.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/fromJsonSchemaDocument.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/fromJsonSchemaMultiDocument.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/fromRepresentation.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/fromRepresentations.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/makeCode.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/schemaToJsonSchemaDocument.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/stringTreeRoundtrip.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/toCodeDocument.annotations.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/toCodeDocument.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/toJson.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/toJsonMultiDocument.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/toJsonSchemaDocument.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/toJsonSchemaMultiDocument.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/toMultiDocument.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/toRepresentation.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/representation/toRepresentations.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/toCodec.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/toDifferJsonPatch.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/toEquivalence.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/toFormatter.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/toIso.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/toJsonSchemaDocument.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/toStandardJSONSchemaV1.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/toStandardSchemaV1.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/schema/v3-v4.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/testing/TestSchema.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/AiError.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/AnthropicStructuredOutput.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/AnthropicStructuredOutputRepresentation.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/Chat.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/EmbeddingModel.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/LanguageModel.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/LanguageModelRepresentation.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/LanguageModelTrackerLifecycle.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpSchema.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpConformance/BaseProtocolTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpConformance/CompletionTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpConformance/ElicitationTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpConformance/LifecycleTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpConformance/LoggingTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpConformance/McpConformance.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpConformance/McpConformanceFixtures.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpConformance/McpTestPeer.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpConformance/PromptsTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpConformance/ResourcesTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpConformance/RootsTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpConformance/SamplingTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpConformance/ToolsTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpConformance/TransportsTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpConformance/UtilitiesTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpProtocol.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/McpServer.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/ProtocolAdapters.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/TestUtils/McpHttpHarness.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/TestUtils/McpServerLayer.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/TestUtils/McpStdioHarness.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/v2024_11_05.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/v2025_03_26.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/v2025_06_18.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/McpServer/v2025_11_25.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/Model.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/OpenAiStructuredOutput.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/OpenAiStructuredOutputRepresentation.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/Prompt.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/Response.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/ResponseIdTracker.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/Tokenizer.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/Tool.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/ToolRepresentation.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/ai/utils.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/arbitrary/Arbitrary.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/cli/Ansi.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/cli/Arguments.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/cli/Command.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/cli/Errors.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/cli/Help.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/cli/Lexer.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/cli/LogLevel.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/cli/Param.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/cli/Primitive.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/cli/Prompt.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/cli/completions/completions.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/cli/completions/descriptor.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/cli/fixtures/ComprehensiveCli.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/cli/services/MockTerminal.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/cli/services/TestActions.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/devtools/DevToolsClient.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/encoding/Ini.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/encoding/Ndjson.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/encoding/SchemaBinary.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/encoding/Sse.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/encoding/Toml.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/encoding/Yaml.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/eventlog/EventJournal.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/eventlog/EventLog.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/eventlog/EventLogIdentityDerivation.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/eventlog/EventLogMessage.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/eventlog/EventLogRemote.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/eventlog/EventLogServerUnencrypted.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/eventlog/EventLogSessionAuth.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/eventlog/SqlEventLogServerUnencryptedStorageTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/Cookies.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/FetchHttpClient.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/FindMyWay/case-insensitive.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/FindMyWay/matching-order.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/FindMyWay/methods.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/FindMyWay/optional-params.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/FindMyWay/params-collisions.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/FindMyWay/path-params-match.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/FindMyWay/querystring.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/FindMyWay/regex.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/Headers.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/HttpBody.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/HttpClient.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/HttpClientRequest.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/HttpCompression.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/HttpEffect.test.ts (94%) rename {repos/effect/packages => packages}/effect/test/unstable/http/HttpMiddleware.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/HttpPlatform.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/HttpRouter.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/HttpServer.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/HttpServerError.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/HttpServerRequest.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/HttpServerRespondable.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/HttpServerResponse.test.ts (72%) rename {repos/effect/packages => packages}/effect/test/unstable/http/HttpStaticServer.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/HttpStatus.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/Mime.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/Multipart.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/SchemaRepresentation.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/Template.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/Url.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/http/UrlParams.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/httpapi/HttpApi.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/httpapi/HttpApiBuilder.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/httpapi/HttpApiClient.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/httpapi/HttpApiDocumentation.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/httpapi/HttpApiEndpoint.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/httpapi/HttpApiSchema.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/httpapi/HttpApiSecurity.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/httpapi/OpenApi.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/httpapi/OpenApiRepresentation.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/net/IpInterface.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/net/IpNetwork.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/net/NetAddress.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/observability/OtlpConfig.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/observability/OtlpEnvHeaders.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/observability/OtlpExporter.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/observability/OtlpMetrics.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/observability/OtlpResource.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/observability/OtlpSerialization.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/observability/PrometheusMetrics.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/persistence/KeyValueStore.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/persistence/KeyValueStoreTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/persistence/PersistedCache.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/persistence/PersistedCacheTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/persistence/PersistedQueue.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/persistence/PersistedQueueTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/persistence/RateLimiter.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/persistence/RateLimiterTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/persistence/Redis.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/persistence/SqlCleanupTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/process/ChildProcess.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/process/ChildProcessSpawnerTest.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/process/fixtures/bash/no-permissions.sh (100%) rename {repos/effect/packages => packages}/effect/test/unstable/process/fixtures/bash/parent-exits-early.sh (100%) rename {repos/effect/packages => packages}/effect/test/unstable/process/fixtures/bash/spawn-children.sh (100%) rename {repos/effect/packages => packages}/effect/test/unstable/process/fixtures/config/SHOUTING (100%) rename {repos/effect/packages => packages}/effect/test/unstable/process/fixtures/config/integer (100%) rename {repos/effect/packages => packages}/effect/test/unstable/process/fixtures/config/nested/config (100%) rename {repos/effect/packages => packages}/effect/test/unstable/process/fixtures/config/secret (100%) rename {repos/effect/packages => packages}/effect/test/unstable/schema/VariantSchema.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/socket/Socket.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/sql/SqlClient.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/sql/SqlError.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/sql/SqlResolver.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/sql/SqlSchema.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/sql/Statement.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/workers/Worker.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/workers/WorkerError.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/workflow/DurableQueue.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/workflow/Workflow.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/unstable/workflow/WorkflowEngine.test.ts (100%) rename {repos/effect/packages => packages}/effect/test/utils/assert.ts (100%) rename {repos/effect/packages => packages}/effect/test/utils/chunkCoordination.ts (100%) rename {repos/effect/packages => packages}/effect/test/utils/counter.ts (100%) rename {repos/effect/packages => packages}/effect/tsconfig.json (100%) rename {repos/effect/packages => packages}/effect/typeperf/README.md (100%) rename {repos/effect/packages => packages}/effect/typeperf/compare.mjs (100%) rename {repos/effect/packages => packages}/effect/typeperf/compare/httpapi.mjs (100%) rename {repos/effect/packages => packages}/effect/typeperf/config.json (100%) rename {repos/effect/packages => packages}/effect/typeperf/run.mjs (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/baseline.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/_endpoint-selection-types.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/_grouped-api-500.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/_grouped-api-types.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/builder-endpoint-count-500.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/builder-handle-all-count-500.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/builder-handle-all-two-batches-count-500.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/builder-handlers-count-100.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/builder-raw-handlers-count-100.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/client-endpoint-count-500.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/client-group-count-500.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/client-groups-100x5-count-500.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/client-methods-count-500.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/client-top-level-count-500.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/endpoint-class-count-500.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/endpoint-count-500.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/group-endpoints-count-500.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/url-builder-count-500.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/fixtures/url-builder-top-level-count-500.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/httpapi/thresholds.json (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/baseline.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/array.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/brand.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/decode-unknown-effect.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/encode-unknown-effect.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/exit.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/non-empty-array.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/record.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/struct-mixed.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/struct-mutable-only.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/struct-optional-only.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/struct-required.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/struct-with-rest.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/tagged-union.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/to-codec-array-from-single.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/to-codec-json.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/to-codec-string-tree.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/to-encoded.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/to-standard-json-schema.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/to-type.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/tuple-with-rest.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/tuple.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/fixtures/union.ts (100%) rename {repos/effect/packages => packages}/effect/typeperf/suites/schema/thresholds.json (100%) rename {repos/effect/packages => packages}/effect/typetest/AiError.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Array.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Brand.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/ByteSize.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Channel.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/ChannelSchema.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Clock.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Config.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/ConfigProvider.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Context.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Data.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Effect.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Effectable.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Equivalence.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Fiber.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/FileSystem.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Function.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Graph.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Iterable.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Layer.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Match.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Newtype.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Optic.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Option.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Order.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Predicate.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Random.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Record.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Result.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Schedule.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Sink.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Stream.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Struct.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/SynchronizedRef.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/TestSchema.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Tuple.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/Types.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/VariantSchema.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/Array.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/FromJsonSchema.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/Graph.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/Literals.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/Record.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/Schema.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/SchemaBuiltInRevivers.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/SchemaJsonSchemaConsumer.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/SchemaRepresentation.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/SchemaRepresentationCompilers.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/SchemaRepresentationReviver.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/Struct.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/Tuple.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/Union.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/api.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/options.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/schema/toIso.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/ai/LanguageModel.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/ai/McpServer.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/ai/Response.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/ai/Tool.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/arbitrary/Arbitrary.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/cli/Command.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/cli/Param.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/cli/Prompt.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/cluster/EntityProxyServer.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/cluster/K8sHttpClient.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/cluster/Reply.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/encoding/Ndjson.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/http/HttpClient.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/http/HttpPlatform.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/http/HttpRouter.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/httpapi/HttpApi.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/httpapi/HttpApiBuilder.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/httpapi/HttpApiClient.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/httpapi/HttpApiEndpoint.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/httpapi/HttpApiGroup.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/httpapi/HttpApiMiddleware.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/httpapi/HttpApiSchema.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/httpapi/OpenApiRepresentation.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/net/IpInterface.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/net/IpNetwork.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/net/NetAddress.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/reactivity/AsyncResult.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/reactivity/Atom.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/reactivity/AtomHttpApi.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/reactivity/AtomRpc.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/rpc/Rpc.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/rpc/RpcGroup.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/rpc/RpcMiddleware.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/rpc/RpcServer.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/socket/Socket.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/sql/SqlSchema.tst.ts (100%) rename {repos/effect/packages => packages}/effect/typetest/unstable/workflow/Workflow.tst.ts (100%) delete mode 100644 packages/eslint-codegen-model/CHANGELOG.md delete mode 100644 packages/eslint-codegen-model/examples/model-facades.ts delete mode 100644 packages/eslint-codegen-model/examples/workflow-facades.ts delete mode 100644 packages/eslint-codegen-model/index.js delete mode 100644 packages/eslint-codegen-model/package.json delete mode 100644 packages/eslint-codegen-model/src/cli.ts delete mode 100644 packages/eslint-codegen-model/src/index.ts delete mode 100644 packages/eslint-codegen-model/src/js-yaml.d.ts delete mode 100644 packages/eslint-codegen-model/src/normalise.ts delete mode 100644 packages/eslint-codegen-model/src/oxlint/index.ts delete mode 100644 packages/eslint-codegen-model/src/oxlint/rules/codegen.ts delete mode 100644 packages/eslint-codegen-model/src/presets/barrel.ts delete mode 100644 packages/eslint-codegen-model/src/presets/index.ts delete mode 100644 packages/eslint-codegen-model/src/presets/meta.ts delete mode 100644 packages/eslint-codegen-model/src/presets/model-facade.ts delete mode 100644 packages/eslint-codegen-model/src/presets/model.ts delete mode 100644 packages/eslint-codegen-model/src/shared/codegen-block.ts delete mode 100644 packages/eslint-codegen-model/src/shared/native-type-resolver.ts delete mode 100644 packages/eslint-codegen-model/src/shared/type-resolver.ts delete mode 100644 packages/eslint-codegen-model/tsconfig.json delete mode 100644 packages/eslint-shared-config/CHANGELOG.md delete mode 100644 packages/eslint-shared-config/package.json delete mode 100644 packages/eslint-shared-config/src/dprint.jsonc delete mode 100644 packages/eslint-shared-config/src/eslint.base.config.mjs delete mode 100644 packages/eslint-shared-config/src/eslint.vue.config.mjs delete mode 100644 packages/eslint-shared-config/src/oxlintrc.json delete mode 100644 packages/eslint-shared-config/src/plugin-effect-app.mjs delete mode 100644 packages/eslint-shared-config/test/no-await-effect.test.mts delete mode 100644 packages/eslint-shared-config/vitest.config.ts delete mode 100644 packages/infra/.madgerc delete mode 100644 packages/infra/.npmignore delete mode 100644 packages/infra/CHANGELOG.md delete mode 100644 packages/infra/_check.sh delete mode 100644 packages/infra/docs/cluster-storage.md delete mode 100644 packages/infra/docs/workflow-engine.md delete mode 100644 packages/infra/examples/query.ts delete mode 100644 packages/infra/package.json delete mode 100644 packages/infra/src/CUPS.ts delete mode 100644 packages/infra/src/ClusterCosmos.ts delete mode 100644 packages/infra/src/ClusterServiceBus.ts delete mode 100644 packages/infra/src/ContextProvider.ts delete mode 100644 packages/infra/src/Emailer/Sendgrid.ts delete mode 100644 packages/infra/src/Emailer/fake.ts delete mode 100644 packages/infra/src/MainFiberSet.ts delete mode 100644 packages/infra/src/QueueMaker/errors.ts delete mode 100644 packages/infra/src/SQL.ts delete mode 100644 packages/infra/src/SQL/Model.ts delete mode 100644 packages/infra/src/Store/Cosmos.ts delete mode 100644 packages/infra/src/Store/Cosmos/query.ts delete mode 100644 packages/infra/src/Store/Disk.ts delete mode 100644 packages/infra/src/Store/Memory.ts delete mode 100644 packages/infra/src/Store/SQL.ts delete mode 100644 packages/infra/src/Store/SQL/Pg.ts delete mode 100644 packages/infra/src/Store/SQL/query.ts delete mode 100644 packages/infra/src/Store/codeFilter.ts delete mode 100644 packages/infra/src/Store/index.test.ts.bak delete mode 100644 packages/infra/src/Store/index.ts delete mode 100644 packages/infra/src/Store/jsonDocument.ts delete mode 100644 packages/infra/src/Store/utils.ts delete mode 100644 packages/infra/src/WorkflowEngineCosmos.ts delete mode 100644 packages/infra/src/WorkflowEngineSqlite.ts delete mode 100644 packages/infra/src/arbs.ts delete mode 100644 packages/infra/src/codec.ts delete mode 100644 packages/infra/src/cosmos-client.ts delete mode 100644 packages/infra/src/errorReporter.ts delete mode 100644 packages/infra/src/errors.ts delete mode 100644 packages/infra/src/fileUtil.ts delete mode 100644 packages/infra/src/index.ts delete mode 100644 packages/infra/src/internal/RequestContextMiddleware.ts delete mode 100644 packages/infra/src/internal/auth.ts delete mode 100644 packages/infra/src/internal/events.ts delete mode 100644 packages/infra/src/internal/health.ts delete mode 100644 packages/infra/src/layerUtils.ts delete mode 100644 packages/infra/src/logger.ts delete mode 100644 packages/infra/src/logger/jsonLogger.ts delete mode 100644 packages/infra/src/logger/logFmtLogger.ts delete mode 100644 packages/infra/src/logger/shared.ts delete mode 100644 packages/infra/src/middlewares.ts delete mode 100644 packages/infra/src/mongo-client.ts delete mode 100644 packages/infra/src/otel.ts delete mode 100644 packages/infra/src/rateLimit.ts delete mode 100644 packages/infra/src/redis-client.ts delete mode 100644 packages/infra/src/reportError.ts delete mode 100644 packages/infra/src/routing.ts delete mode 100644 packages/infra/src/routing/middleware.ts delete mode 100644 packages/infra/src/routing/middleware/RouterMiddleware.ts delete mode 100644 packages/infra/src/routing/middleware/middleware.ts delete mode 100644 packages/infra/src/routing/schema/jwt.ts delete mode 100644 packages/infra/src/routing/tsort.ts delete mode 100644 packages/infra/src/routing/utils.ts delete mode 100644 packages/infra/src/test.ts delete mode 100644 packages/infra/src/util.ts delete mode 100644 packages/infra/src/vitest.ts delete mode 100644 packages/infra/test/auth.test.ts delete mode 100644 packages/infra/test/cluster-cosmos.test.ts delete mode 100644 packages/infra/test/cluster-servicebus.test.ts delete mode 100644 packages/infra/test/cluster-sqlite.test.ts delete mode 100644 packages/infra/test/contextProvider.test.ts delete mode 100644 packages/infra/test/controller.test.ts delete mode 100644 packages/infra/test/cosmos-query.test.ts delete mode 100644 packages/infra/test/fixtures.ts delete mode 100644 packages/infra/test/json-lower.test.ts delete mode 100644 packages/infra/test/layerUtils.test.ts delete mode 100644 packages/infra/test/query.test.ts delete mode 100644 packages/infra/test/rawQuery.test.ts delete mode 100644 packages/infra/test/repository-ext.test.ts delete mode 100644 packages/infra/test/requires.test.ts delete mode 100644 packages/infra/test/router-generator.test.ts delete mode 100644 packages/infra/test/routing-interruptibility.test.ts delete mode 100644 packages/infra/test/rpc-context-map-streaming.test.ts delete mode 100644 packages/infra/test/rpc-e2e-invalidation.test.ts delete mode 100644 packages/infra/test/rpc-multi-middleware.test.ts delete mode 100644 packages/infra/test/rpc-stream-fullstack.test.ts delete mode 100644 packages/infra/test/sql-store.test.ts delete mode 100644 packages/infra/test/validateSample.test.ts delete mode 100644 packages/infra/test/workflow-engine-cosmos.test.ts delete mode 100644 packages/infra/test/workflow-engine-sqlite.test.ts delete mode 100644 packages/infra/tsconfig.examples.json delete mode 100644 packages/infra/tsconfig.json delete mode 100644 packages/infra/tsconfig.src.json delete mode 100644 packages/infra/tsconfig.test.json delete mode 100644 packages/infra/types/modules.d.ts delete mode 100644 packages/infra/vitest.config.ts rename {repos/effect/packages => packages}/opentelemetry/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/opentelemetry/LICENSE (100%) rename {repos/effect/packages => packages}/opentelemetry/README.md (100%) rename {repos/effect/packages => packages}/opentelemetry/package.json (99%) rename {repos/effect/packages => packages}/opentelemetry/src/NodeSdk.ts (100%) rename {repos/effect/packages => packages}/opentelemetry/src/OtelLogger.ts (100%) rename {repos/effect/packages => packages}/opentelemetry/src/OtelMetrics.ts (100%) rename {repos/effect/packages => packages}/opentelemetry/src/OtelTracer.ts (100%) rename {repos/effect/packages => packages}/opentelemetry/src/Resource.ts (100%) rename {repos/effect/packages => packages}/opentelemetry/src/WebSdk.ts (100%) rename {repos/effect/packages => packages}/opentelemetry/src/index.ts (100%) rename {repos/effect/packages => packages}/opentelemetry/src/internal/attributes.ts (100%) rename {repos/effect/packages => packages}/opentelemetry/src/internal/metrics.ts (100%) rename {repos/effect/packages => packages}/opentelemetry/src/internal/utilities.ts (100%) rename {repos/effect/packages => packages}/opentelemetry/test/OtelLogger.test.ts (100%) rename {repos/effect/packages => packages}/opentelemetry/test/OtelMetrics.test.ts (100%) rename {repos/effect/packages => packages}/opentelemetry/test/OtelTracer.test.ts (100%) rename {repos/effect/packages => packages}/opentelemetry/tsconfig.json (100%) rename {repos/effect/packages => packages}/platform/browser/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/platform/browser/LICENSE (100%) rename {repos/effect/packages => packages}/platform/browser/README.md (100%) rename {repos/effect/packages => packages}/platform/browser/package.json (98%) rename {repos/effect/packages => packages}/platform/browser/src/BrowserCrypto.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/BrowserHttpClient.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/BrowserKeyValueStore.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/BrowserPersistence.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/BrowserRuntime.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/BrowserSocket.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/BrowserStream.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/BrowserWorker.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/BrowserWorkerRunner.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/Clipboard.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/Geolocation.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/IndexedDb.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/IndexedDbDatabase.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/IndexedDbQueryBuilder.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/IndexedDbTable.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/IndexedDbVersion.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/Permissions.ts (100%) rename {repos/effect/packages => packages}/platform/browser/src/index.ts (100%) rename {repos/effect/packages => packages}/platform/browser/test/BrowserCrypto.test.ts (100%) rename {repos/effect/packages => packages}/platform/browser/test/BrowserHttpClient.test.ts (100%) rename {repos/effect/packages => packages}/platform/browser/test/BrowserKeyValueStore.test.ts (100%) rename {repos/effect/packages => packages}/platform/browser/test/BrowserPersistence.test.ts (100%) rename {repos/effect/packages => packages}/platform/browser/test/BrowserPersistencePersistedCache.test.ts (100%) rename {repos/effect/packages => packages}/platform/browser/test/BrowserWorkerRunner.test.ts (100%) rename {repos/effect/packages => packages}/platform/browser/test/IndexedDbDatabase.test.ts (100%) rename {repos/effect/packages => packages}/platform/browser/test/IndexedDbQueryBuilder.test.ts (100%) rename {repos/effect/packages => packages}/platform/browser/test/IndexedDbTable.test.ts (100%) rename {repos/effect/packages => packages}/platform/browser/test/IndexedDbVersion.test.ts (100%) rename {repos/effect/packages => packages}/platform/browser/test/Permissions.test.ts (100%) rename {repos/effect/packages => packages}/platform/browser/test/RpcWorker.test.ts (100%) rename {repos/effect/packages => packages}/platform/browser/test/fixtures/rpc-e2e.ts (100%) rename {repos/effect/packages => packages}/platform/browser/test/fixtures/rpc-schemas.ts (100%) rename {repos/effect/packages => packages}/platform/browser/test/fixtures/rpc-worker.ts (100%) rename {repos/effect/packages => packages}/platform/browser/tsconfig.json (100%) rename {repos/effect/packages => packages}/platform/browser/vitest.setup.ts (100%) rename {repos/effect/packages => packages}/platform/bun/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/platform/bun/LICENSE (100%) rename {repos/effect/packages => packages}/platform/bun/README.md (100%) rename {repos/effect/packages => packages}/platform/bun/package.json (98%) rename {repos/effect/packages => packages}/platform/bun/src/BunChildProcessSpawner.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunClusterHttp.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunClusterSocket.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunCrypto.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunFileSystem.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunHttpClient.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunHttpPlatform.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunHttpServer.ts (99%) rename {repos/effect/packages => packages}/platform/bun/src/BunHttpServerRequest.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunMultipart.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunPath.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunRedis.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunRuntime.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunServices.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunSink.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunSocket.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunSocketServer.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunStdio.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunStream.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunTerminal.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunWorker.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/BunWorkerRunner.ts (100%) rename {repos/effect/packages => packages}/platform/bun/src/index.ts (100%) rename {repos/effect/packages => packages}/platform/bun/test/BunClusterHttp.test.ts (100%) rename {repos/effect/packages => packages}/platform/bun/test/BunHttpCompression.test.ts (100%) rename {repos/effect/packages => packages}/platform/bun/test/BunHttpPlatform.test.ts (100%) rename {repos/effect/packages => packages}/platform/bun/test/BunHttpServer.test.ts (81%) rename {repos/effect/packages => packages}/platform/bun/test/BunStream.test.ts (100%) rename {repos/effect/packages => packages}/platform/bun/tsconfig.json (100%) rename {repos/effect/packages => packages}/platform/deno/CHANGELOG.md (98%) rename {repos/effect/packages => packages}/platform/deno/LICENSE (100%) rename {repos/effect/packages => packages}/platform/deno/README.md (100%) rename {repos/effect/packages => packages}/platform/deno/package.json (98%) rename {repos/effect/packages => packages}/platform/deno/src/DenoChildProcessSpawner.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoClusterHttp.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoClusterSocket.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoCrypto.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoFileSystem.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoHttpClient.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoHttpPlatform.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoHttpServer.ts (98%) rename {repos/effect/packages => packages}/platform/deno/src/DenoHttpServerRequest.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoKeyValueStore.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoMultipart.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoPath.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoRedis.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoRuntime.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoServices.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoSocket.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoSocketServer.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoStdio.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoTerminal.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoWorker.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/DenoWorkerRunner.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/index.ts (100%) rename {repos/effect/packages => packages}/platform/deno/src/internal/error.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/DenoChildProcessSpawner.test.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/DenoCrypto.test.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/DenoFileSystem.test.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/DenoHttpCompression.test.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/DenoHttpPlatform.test.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/DenoHttpServer.test.ts (90%) rename {repos/effect/packages => packages}/platform/deno/test/DenoKeyValueStore.test.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/DenoPath.test.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/DenoRedis.integration.test.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/DenoSocket.test.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/DenoSocketServer.test.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/DenoStdio.test.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/DenoTerminal.test.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/DenoWorkerRunner.test.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/RpcWorker.test.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/cluster/SocketRunner.test.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/fixtures/deno-terminal.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/fixtures/rpc-e2e.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/fixtures/rpc-schemas.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/fixtures/rpc-worker.ts (100%) rename {repos/effect/packages => packages}/platform/deno/test/fixtures/text.txt (100%) rename {repos/effect/packages => packages}/platform/deno/test/fixtures/tls/ca.pem (100%) rename {repos/effect/packages => packages}/platform/deno/test/fixtures/tls/cert.pem (100%) rename {repos/effect/packages => packages}/platform/deno/test/fixtures/tls/key.pem (100%) rename {repos/effect/packages => packages}/platform/deno/test/internal/error.test.ts (100%) rename {repos/effect/packages => packages}/platform/deno/tsconfig.json (100%) rename {repos/effect/packages => packages}/platform/node-shared/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/platform/node-shared/LICENSE (100%) rename {repos/effect/packages => packages}/platform/node-shared/README.md (100%) rename {repos/effect/packages => packages}/platform/node-shared/benchmark/Socket.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/package.json (98%) rename {repos/effect/packages => packages}/platform/node-shared/src/NodeChildProcessSpawner.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/src/NodeClusterSocket.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/src/NodeCrypto.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/src/NodeFileSystem.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/src/NodeHttpCompression.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/src/NodePath.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/src/NodeRuntime.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/src/NodeSink.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/src/NodeSocket.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/src/NodeSocketServer.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/src/NodeStdio.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/src/NodeStream.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/src/NodeTerminal.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/src/index.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/src/internal/nodeChildProcessSpawner.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/src/internal/utils.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/test/HttpPlatform.test-utils.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/test/NodeChildProcessSpawner.test.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/test/NodeFileSystem.test.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/test/NodePath.test.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/test/NodeSink.test.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/test/NodeStdio.test.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/test/NodeStream.test.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/test/NodeTerminal.test.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/test/fixtures/helloworld.tar.gz (100%) rename {repos/effect/packages => packages}/platform/node-shared/test/fixtures/node-terminal.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/test/fixtures/process-group.ts (100%) rename {repos/effect/packages => packages}/platform/node-shared/tsconfig.json (100%) rename {repos/effect/packages => packages}/platform/node/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/platform/node/LICENSE (100%) rename {repos/effect/packages => packages}/platform/node/README.md (100%) rename {repos/effect/packages => packages}/platform/node/package.json (98%) rename {repos/effect/packages => packages}/platform/node/src/NodeChildProcessSpawner.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeClusterHttp.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeClusterSocket.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeCrypto.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeFileSystem.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeHttpClient.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeHttpIncomingMessage.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeHttpPlatform.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeHttpServer.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeHttpServerRequest.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeMultipart.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeMultipartParser.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodePath.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeRedis.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeRuntime.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeServices.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeSink.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeSocket.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeSocketServer.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeStdio.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeStream.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeTerminal.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeWorker.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/NodeWorkerRunner.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/Undici.ts (100%) rename {repos/effect/packages => packages}/platform/node/src/index.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/HttpApi.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/HttpStaticServer.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/HttpStaticServerConditional.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/KeyValueStore.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/MultipartParser.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/NodeCrypto.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/NodeHttpClient.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/NodeHttpCompression.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/NodeHttpPlatform.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/NodeHttpServer.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/NodeRedis.integration.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/NodeSocket.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/NodeWorkerRunner.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/OpenApi.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/RpcServer.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/__snapshots__/HttpApi.test.ts.snap (100%) rename {repos/effect/packages => packages}/platform/node/test/cluster-integration/ClusterCron.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/cluster-integration/Entity.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/cluster-integration/Locks.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/cluster-integration/Persistence.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/cluster-integration/README.md (100%) rename {repos/effect/packages => packages}/platform/node/test/cluster-integration/Residency.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/cluster-integration/Smoke.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/cluster-integration/Transport.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/cluster-integration/Workflow.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/cluster-integration/globalSetup.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/cluster-integration/harness.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/cluster/MessageStorageTest.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/cluster/SocketRunner.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/cluster/SqlMessageStorage.integration.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/cluster/SqlRunnerStorage.integration.test.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/fixtures/http-static-server-outside.txt (100%) rename {repos/effect/packages => packages}/platform/node/test/fixtures/http-static-server/conditional.txt (100%) rename {repos/effect/packages => packages}/platform/node/test/fixtures/http-static-server/custom/home.html (100%) rename {repos/effect/packages => packages}/platform/node/test/fixtures/http-static-server/file.binx (100%) rename {repos/effect/packages => packages}/platform/node/test/fixtures/http-static-server/guide/index.html (100%) rename {repos/effect/packages => packages}/platform/node/test/fixtures/http-static-server/hello.txt (100%) rename {repos/effect/packages => packages}/platform/node/test/fixtures/http-static-server/index.html (100%) rename {repos/effect/packages => packages}/platform/node/test/fixtures/http-static-server/range.txt (100%) rename {repos/effect/packages => packages}/platform/node/test/fixtures/mysql2-utils.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/fixtures/pg-utils.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/fixtures/rpc-e2e.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/fixtures/rpc-schemas.ts (100%) rename {repos/effect/packages => packages}/platform/node/test/fixtures/text.txt (100%) rename {repos/effect/packages => packages}/platform/node/test/fixtures/tls/cert.pem (100%) rename {repos/effect/packages => packages}/platform/node/test/fixtures/tls/key.pem (100%) rename {repos/effect/packages => packages}/platform/node/test/fixtures/worker-runner.ts (100%) rename {repos/effect/packages => packages}/platform/node/tsconfig.json (100%) rename {repos/effect/packages => packages}/sql/clickhouse/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/sql/clickhouse/LICENSE (100%) rename {repos/effect/packages => packages}/sql/clickhouse/README.md (100%) rename {repos/effect/packages => packages}/sql/clickhouse/package.json (98%) rename {repos/effect/packages => packages}/sql/clickhouse/src/ClickhouseClient.ts (100%) rename {repos/effect/packages => packages}/sql/clickhouse/src/ClickhouseMigrator.ts (100%) rename {repos/effect/packages => packages}/sql/clickhouse/src/index.ts (100%) rename {repos/effect/packages => packages}/sql/clickhouse/test/Client.test.ts (100%) rename {repos/effect/packages => packages}/sql/clickhouse/test/SqlErrorClassification.test.ts (100%) rename {repos/effect/packages => packages}/sql/clickhouse/tsconfig.json (100%) rename {repos/effect/packages => packages}/sql/d1/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/sql/d1/LICENSE (100%) rename {repos/effect/packages => packages}/sql/d1/README.md (100%) rename {repos/effect/packages => packages}/sql/d1/package.json (98%) rename {repos/effect/packages => packages}/sql/d1/src/D1Client.ts (100%) rename {repos/effect/packages => packages}/sql/d1/src/index.ts (100%) rename {repos/effect/packages => packages}/sql/d1/test/Client.test.ts (100%) rename {repos/effect/packages => packages}/sql/d1/test/Resolver.test.ts (100%) rename {repos/effect/packages => packages}/sql/d1/test/utils.ts (100%) rename {repos/effect/packages => packages}/sql/d1/tsconfig.json (100%) rename {repos/effect/packages => packages}/sql/libsql/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/sql/libsql/LICENSE (100%) rename {repos/effect/packages => packages}/sql/libsql/README.md (100%) rename {repos/effect/packages => packages}/sql/libsql/package.json (98%) rename {repos/effect/packages => packages}/sql/libsql/src/LibsqlClient.ts (100%) rename {repos/effect/packages => packages}/sql/libsql/src/LibsqlMigrator.ts (100%) rename {repos/effect/packages => packages}/sql/libsql/src/index.ts (100%) rename {repos/effect/packages => packages}/sql/libsql/test/Client.integration.test.ts (100%) rename {repos/effect/packages => packages}/sql/libsql/test/Resolver.integration.test.ts (100%) rename {repos/effect/packages => packages}/sql/libsql/test/util.ts (100%) rename {repos/effect/packages => packages}/sql/libsql/tsconfig.json (100%) rename {repos/effect/packages => packages}/sql/mssql/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/sql/mssql/LICENSE (100%) rename {repos/effect/packages => packages}/sql/mssql/README.md (100%) rename {repos/effect/packages => packages}/sql/mssql/package.json (98%) rename {repos/effect/packages => packages}/sql/mssql/src/MssqlClient.ts (100%) rename {repos/effect/packages => packages}/sql/mssql/src/MssqlMigrator.ts (100%) rename {repos/effect/packages => packages}/sql/mssql/src/Parameter.ts (100%) rename {repos/effect/packages => packages}/sql/mssql/src/Procedure.ts (100%) rename {repos/effect/packages => packages}/sql/mssql/src/index.ts (100%) rename {repos/effect/packages => packages}/sql/mssql/test/Binary.test.ts (100%) rename {repos/effect/packages => packages}/sql/mssql/test/Client.test.ts (100%) rename {repos/effect/packages => packages}/sql/mssql/test/Persistence.integration.test.ts (100%) rename {repos/effect/packages => packages}/sql/mssql/test/SqlErrorClassification.test.ts (100%) rename {repos/effect/packages => packages}/sql/mssql/test/utils.ts (100%) rename {repos/effect/packages => packages}/sql/mssql/tsconfig.json (100%) rename {repos/effect/packages => packages}/sql/mysql2/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/sql/mysql2/LICENSE (100%) rename {repos/effect/packages => packages}/sql/mysql2/README.md (100%) rename {repos/effect/packages => packages}/sql/mysql2/package.json (98%) rename {repos/effect/packages => packages}/sql/mysql2/src/MysqlClient.ts (100%) rename {repos/effect/packages => packages}/sql/mysql2/src/MysqlMigrator.ts (100%) rename {repos/effect/packages => packages}/sql/mysql2/src/index.ts (100%) rename {repos/effect/packages => packages}/sql/mysql2/test/Client.integration.test.ts (100%) rename {repos/effect/packages => packages}/sql/mysql2/test/KeyValueStore.integration.test.ts (100%) rename {repos/effect/packages => packages}/sql/mysql2/test/Model.integration.test.ts (100%) rename {repos/effect/packages => packages}/sql/mysql2/test/MysqlClient.integration.test.ts (100%) rename {repos/effect/packages => packages}/sql/mysql2/test/Persistence.integration.test.ts (100%) rename {repos/effect/packages => packages}/sql/mysql2/test/SqlErrorClassification.test.ts (100%) rename {repos/effect/packages => packages}/sql/mysql2/test/SqlEventLogServerUnencrypted.integration.test.ts (100%) rename {repos/effect/packages => packages}/sql/mysql2/test/utils.ts (100%) rename {repos/effect/packages => packages}/sql/mysql2/tsconfig.json (100%) rename {repos/effect/packages => packages}/sql/pg/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/sql/pg/LICENSE (100%) rename {repos/effect/packages => packages}/sql/pg/README.md (100%) rename {repos/effect/packages => packages}/sql/pg/benchmark/PgClient.ts (100%) rename {repos/effect/packages => packages}/sql/pg/benchmark/PgCodec.ts (100%) rename {repos/effect/packages => packages}/sql/pg/benchmark/README.md (100%) rename {repos/effect/packages => packages}/sql/pg/package.json (98%) rename {repos/effect/packages => packages}/sql/pg/src/PgAuth.ts (100%) rename {repos/effect/packages => packages}/sql/pg/src/PgClient.ts (100%) rename {repos/effect/packages => packages}/sql/pg/src/PgConnection.ts (100%) rename {repos/effect/packages => packages}/sql/pg/src/PgMigrator.ts (100%) rename {repos/effect/packages => packages}/sql/pg/src/PgPool.ts (100%) rename {repos/effect/packages => packages}/sql/pg/src/PgProtocol.ts (100%) rename {repos/effect/packages => packages}/sql/pg/src/PgTypes.ts (100%) rename {repos/effect/packages => packages}/sql/pg/src/index.ts (100%) rename {repos/effect/packages => packages}/sql/pg/src/internal/connection.ts (100%) rename {repos/effect/packages => packages}/sql/pg/src/internal/sqlError.ts (100%) rename {repos/effect/packages => packages}/sql/pg/test/Client.integration.test.ts (100%) rename {repos/effect/packages => packages}/sql/pg/test/KeyValueStore.integration.test.ts (100%) rename {repos/effect/packages => packages}/sql/pg/test/Persistence.integration.test.ts (100%) rename {repos/effect/packages => packages}/sql/pg/test/PgAuth.test.ts (100%) rename {repos/effect/packages => packages}/sql/pg/test/PgConnection.in-process.test.ts (100%) rename {repos/effect/packages => packages}/sql/pg/test/PgConnection.integration.test.ts (100%) rename {repos/effect/packages => packages}/sql/pg/test/PgConnection.test.ts (100%) rename {repos/effect/packages => packages}/sql/pg/test/PgPool.integration.test.ts (100%) rename {repos/effect/packages => packages}/sql/pg/test/PgProtocol.test.ts (100%) rename {repos/effect/packages => packages}/sql/pg/test/PgTypes.test.ts (100%) rename {repos/effect/packages => packages}/sql/pg/test/SqlErrorClassification.test.ts (100%) rename {repos/effect/packages => packages}/sql/pg/test/SqlEventLogServerUnencrypted.integration.test.ts (100%) rename {repos/effect/packages => packages}/sql/pg/test/TransactionAcquire.test.ts (100%) rename {repos/effect/packages => packages}/sql/pg/test/fixtures/goldens.ts (100%) rename {repos/effect/packages => packages}/sql/pg/test/fixtures/regenerate.ts (100%) rename {repos/effect/packages => packages}/sql/pg/test/utils.ts (100%) rename {repos/effect/packages => packages}/sql/pg/tsconfig.json (100%) rename {repos/effect/packages => packages}/sql/pglite/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/sql/pglite/LICENSE (100%) rename {repos/effect/packages => packages}/sql/pglite/README.md (100%) rename {repos/effect/packages => packages}/sql/pglite/package.json (98%) rename {repos/effect/packages => packages}/sql/pglite/src/PgliteClient.ts (100%) rename {repos/effect/packages => packages}/sql/pglite/src/PgliteMigrator.ts (100%) rename {repos/effect/packages => packages}/sql/pglite/src/index.ts (100%) rename {repos/effect/packages => packages}/sql/pglite/test/Client.test.ts (100%) rename {repos/effect/packages => packages}/sql/pglite/test/Json.test.ts (100%) rename {repos/effect/packages => packages}/sql/pglite/test/Migrator.test.ts (100%) rename {repos/effect/packages => packages}/sql/pglite/test/PersistedQueue.test.ts (100%) rename {repos/effect/packages => packages}/sql/pglite/test/SqlErrorClassification.test.ts (100%) rename {repos/effect/packages => packages}/sql/pglite/test/Transaction.test.ts (100%) rename {repos/effect/packages => packages}/sql/pglite/tsconfig.json (100%) rename {repos/effect/packages => packages}/sql/sqlite-bun/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/sql/sqlite-bun/LICENSE (100%) rename {repos/effect/packages => packages}/sql/sqlite-bun/README.md (100%) rename {repos/effect/packages => packages}/sql/sqlite-bun/package.json (98%) rename {repos/effect/packages => packages}/sql/sqlite-bun/src/SqliteClient.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-bun/src/SqliteMigrator.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-bun/src/index.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-bun/test/Client.test.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-bun/tsconfig.json (100%) rename {repos/effect/packages => packages}/sql/sqlite-do/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/sql/sqlite-do/LICENSE (100%) rename {repos/effect/packages => packages}/sql/sqlite-do/README.md (100%) rename {repos/effect/packages => packages}/sql/sqlite-do/package.json (98%) rename {repos/effect/packages => packages}/sql/sqlite-do/src/SqliteClient.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-do/src/SqliteMigrator.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-do/src/index.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-do/test/Client.test.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-do/tsconfig.json (100%) rename {repos/effect/packages => packages}/sql/sqlite-node/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/sql/sqlite-node/LICENSE (100%) rename {repos/effect/packages => packages}/sql/sqlite-node/README.md (100%) rename {repos/effect/packages => packages}/sql/sqlite-node/package.json (98%) rename {repos/effect/packages => packages}/sql/sqlite-node/src/SqliteClient.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-node/src/SqliteMigrator.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-node/src/index.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-node/test/Client.test.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-node/test/KeyValueStore.test.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-node/test/Persistence.test.ts (72%) rename {repos/effect/packages => packages}/sql/sqlite-node/test/Resolver.test.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-node/test/SqlEventJournal.test.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-node/test/SqlEventLogServerEncrypted.test.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-node/test/SqlEventLogServerUnencrypted.test.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-node/test/SqlModelServices.test.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-node/test/SqliteMigrator.test.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-node/tsconfig.json (100%) rename {repos/effect/packages => packages}/sql/sqlite-react-native/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/sql/sqlite-react-native/LICENSE (100%) rename {repos/effect/packages => packages}/sql/sqlite-react-native/README.md (100%) rename {repos/effect/packages => packages}/sql/sqlite-react-native/package.json (98%) rename {repos/effect/packages => packages}/sql/sqlite-react-native/src/SqliteClient.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-react-native/src/SqliteMigrator.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-react-native/src/index.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-react-native/test/Client.test.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-react-native/tsconfig.json (100%) rename {repos/effect/packages => packages}/sql/sqlite-wasm/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/sql/sqlite-wasm/LICENSE (100%) rename {repos/effect/packages => packages}/sql/sqlite-wasm/README.md (100%) rename {repos/effect/packages => packages}/sql/sqlite-wasm/package.json (98%) rename {repos/effect/packages => packages}/sql/sqlite-wasm/src/OpfsWorker.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-wasm/src/SqliteClient.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-wasm/src/SqliteMigrator.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-wasm/src/index.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-wasm/src/internal/opfsWorker.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-wasm/src/sqlite-wasm.d.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-wasm/test/Client.test.ts (100%) rename {repos/effect/packages => packages}/sql/sqlite-wasm/tsconfig.json (100%) rename {repos/effect/packages => packages}/tools/ai-codegen/codegen.schema.json (100%) rename {repos/effect/packages => packages}/tools/ai-codegen/package.json (100%) rename {repos/effect/packages => packages}/tools/ai-codegen/src/Config.ts (100%) rename {repos/effect/packages => packages}/tools/ai-codegen/src/Discovery.ts (100%) rename {repos/effect/packages => packages}/tools/ai-codegen/src/Generator.ts (100%) rename {repos/effect/packages => packages}/tools/ai-codegen/src/Glob.ts (100%) rename {repos/effect/packages => packages}/tools/ai-codegen/src/PostProcess.ts (100%) rename {repos/effect/packages => packages}/tools/ai-codegen/src/SpecFetcher.ts (100%) rename {repos/effect/packages => packages}/tools/ai-codegen/src/bin.ts (100%) rename {repos/effect/packages => packages}/tools/ai-codegen/src/main.ts (100%) rename {repos/effect/packages => packages}/tools/ai-codegen/test/Generator.test.ts (100%) rename {repos/effect/packages => packages}/tools/ai-codegen/tsconfig.json (100%) rename {repos/effect/packages => packages}/tools/ai-docgen/package.json (100%) rename {repos/effect/packages => packages}/tools/ai-docgen/src/Glob.ts (100%) rename {repos/effect/packages => packages}/tools/ai-docgen/src/main.ts (100%) rename {repos/effect/packages => packages}/tools/ai-docgen/tsconfig.json (100%) rename {repos/effect/packages => packages}/tools/api-diff/README.md (100%) rename {repos/effect/packages => packages}/tools/api-diff/package.json (100%) rename {repos/effect/packages => packages}/tools/api-diff/src/Annotations.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/src/ApiDiff.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/src/Cli.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/src/Diff.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/src/Discovery.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/src/Error.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/src/Json.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/src/MigrationDoc.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/src/Model.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/src/Report.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/src/Snapshot.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/src/Worktrees.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/src/bin.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/test/Annotations.test.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/test/Cli.test.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/test/Diff.test.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/test/Discovery.test.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/test/Error.test.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/test/MigrationDoc.test.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/test/Snapshot.test.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/test/Worktrees.test.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/test/utils.ts (100%) rename {repos/effect/packages => packages}/tools/api-diff/tsconfig.json (100%) rename {repos/effect/packages => packages}/tools/bundle/README.md (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/arbitrary-combinators.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/basic.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/batching.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/brand.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/cache.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/config.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/differ.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/http-client.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/http-router.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/logger.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/metric.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/optic.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/pubsub.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/queue.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/schedule.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/schema-binary.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/schema-class.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/schema-fromJsonSchemaDocument.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/schema-representation-roundtrip.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/schema-string-transformation.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/schema-string.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/schema-template-literal.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/schema-toArbitrary.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/schema-toCodeDocument.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/schema-toCodecJson.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/schema-toEquivalence.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/schema-toFormatter.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/schema-toJsonSchemaDocument.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/schema-toRepresentation.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/schema.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/stm.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/fixtures/stream.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/package.json (100%) rename {repos/effect/packages => packages}/tools/bundle/src/Cli.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/src/Fixtures.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/src/Plugins.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/src/Reporter.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/src/Rollup.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/src/bin.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/test/HttpRouterEsbuild.test.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/test/Plugins.test.ts (100%) rename {repos/effect/packages => packages}/tools/bundle/tsconfig.fixtures.json (100%) rename {repos/effect/packages => packages}/tools/bundle/tsconfig.json (100%) rename {repos/effect/packages => packages}/tools/bundle/tsconfig.src.json (100%) rename {repos/effect/packages => packages}/tools/docgen/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/tools/docgen/LICENSE (100%) rename {repos/effect/packages => packages}/tools/docgen/README.md (100%) rename {repos/effect/packages => packages}/tools/docgen/package.json (98%) rename {repos/effect/packages => packages}/tools/docgen/schema.json (100%) rename {repos/effect/packages => packages}/tools/docgen/src/CLI.ts (100%) rename {repos/effect/packages => packages}/tools/docgen/src/Checker.ts (100%) rename {repos/effect/packages => packages}/tools/docgen/src/Configuration.ts (100%) rename {repos/effect/packages => packages}/tools/docgen/src/Core.ts (100%) rename {repos/effect/packages => packages}/tools/docgen/src/Domain.ts (100%) rename {repos/effect/packages => packages}/tools/docgen/src/Parser.ts (100%) rename {repos/effect/packages => packages}/tools/docgen/src/Printer.ts (100%) rename {repos/effect/packages => packages}/tools/docgen/src/bin.ts (100%) rename {repos/effect/packages => packages}/tools/docgen/src/index.ts (100%) rename {repos/effect/packages => packages}/tools/docgen/src/internal/markdown-toc.d.ts (100%) rename {repos/effect/packages => packages}/tools/docgen/test/Checker.test.ts (100%) rename {repos/effect/packages => packages}/tools/docgen/test/Configuration.test.ts (100%) rename {repos/effect/packages => packages}/tools/docgen/test/Core.test.ts (100%) rename {repos/effect/packages => packages}/tools/docgen/test/Parser.test.ts (100%) rename {repos/effect/packages => packages}/tools/docgen/test/fixtures/invalid-json.txt (100%) rename {repos/effect/packages => packages}/tools/docgen/tsconfig.json (100%) rename {repos/effect/packages => packages}/tools/doctest/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/tools/doctest/README.md (100%) rename {repos/effect/packages => packages}/tools/doctest/package.json (98%) rename {repos/effect/packages => packages}/tools/doctest/src/Plugin.ts (100%) rename {repos/effect/packages => packages}/tools/doctest/src/Protocol.ts (100%) rename {repos/effect/packages => packages}/tools/doctest/src/Runner.ts (100%) rename {repos/effect/packages => packages}/tools/doctest/src/Runtime.ts (100%) rename {repos/effect/packages => packages}/tools/doctest/src/Source.ts (100%) rename {repos/effect/packages => packages}/tools/doctest/src/Transform.ts (100%) rename {repos/effect/packages => packages}/tools/doctest/src/index.ts (100%) rename {repos/effect/packages => packages}/tools/doctest/test/Plugin.test.ts (100%) rename {repos/effect/packages => packages}/tools/doctest/test/Protocol.test.ts (100%) rename {repos/effect/packages => packages}/tools/doctest/test/Runtime.test.ts (100%) rename {repos/effect/packages => packages}/tools/doctest/test/Source.test.ts (100%) rename {repos/effect/packages => packages}/tools/doctest/test/Transform.test.ts (100%) rename {repos/effect/packages => packages}/tools/doctest/test/fixtures/markdown/docs/helper.ts (100%) rename {repos/effect/packages => packages}/tools/doctest/test/fixtures/markdown/docs/typed.md (100%) rename {repos/effect/packages => packages}/tools/doctest/test/fixtures/markdown/docs/typed.mdx (100%) rename {repos/effect/packages => packages}/tools/doctest/test/fixtures/markdown/src/typed.ts (100%) rename {repos/effect/packages => packages}/tools/doctest/test/fixtures/markdown/vitest.config.ts (100%) rename {repos/effect/packages => packages}/tools/doctest/tsconfig.json (100%) rename {repos/effect/packages => packages}/tools/jsdocs/package.json (100%) rename {repos/effect/packages => packages}/tools/jsdocs/src/Jsdocs.ts (100%) rename {repos/effect/packages => packages}/tools/jsdocs/src/bin.ts (100%) rename {repos/effect/packages => packages}/tools/jsdocs/test/jsdocs.test.ts (100%) rename {repos/effect/packages => packages}/tools/jsdocs/tsconfig.json (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/tools/openapi-generator/LICENSE (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/README.md (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/package.json (98%) rename {repos/effect/packages => packages}/tools/openapi-generator/src/HttpApiTransformer.ts (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/src/JsonSchemaGenerator.ts (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/src/OpenApiGenerator.ts (99%) rename {repos/effect/packages => packages}/tools/openapi-generator/src/OpenApiPatch.ts (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/src/OpenApiTransformer.ts (95%) rename {repos/effect/packages => packages}/tools/openapi-generator/src/ParsedOperation.ts (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/src/Utils.ts (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/src/bin.ts (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/src/main.ts (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/JsonSchemaGenerator.test.ts (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/JsonSchemaGeneratorRepresentation.test.ts (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/OpenApiGenerator.test.ts (95%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/OpenApiGeneratorCli.test.ts (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/OpenApiPatch.test.ts (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/OpenApiTransformer.test.ts (68%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/Utils.test.ts (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/fixtures/cli-basic-spec.json (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/fixtures/cli-warning-spec.json (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/fixtures/patches/invalid-op.json (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/fixtures/patches/missing-path.json (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/fixtures/patches/missing-value.json (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/fixtures/patches/valid-add.json (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/fixtures/patches/valid-multiple.json (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/fixtures/patches/valid-patch.yaml (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/fixtures/patches/valid-remove.json (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/test/fixtures/patches/valid-replace.json (100%) rename {repos/effect/packages => packages}/tools/openapi-generator/tsconfig.json (100%) rename {repos/effect/packages => packages}/tools/oxc/oxlintrc.json (100%) rename {repos/effect/packages => packages}/tools/oxc/package.json (100%) rename {repos/effect/packages => packages}/tools/oxc/src/oxlint/index.ts (100%) rename {repos/effect/packages => packages}/tools/oxc/src/oxlint/rules/no-bigint-literals.ts (100%) rename {repos/effect/packages => packages}/tools/oxc/src/oxlint/rules/no-import-from-barrel-package.ts (100%) rename {repos/effect/packages => packages}/tools/oxc/src/oxlint/rules/no-js-extension-imports.ts (100%) rename {repos/effect/packages => packages}/tools/oxc/src/oxlint/rules/no-opaque-instance-fields.ts (100%) rename {repos/effect/packages => packages}/tools/oxc/src/oxlint/rules/no-unused-internal.ts (100%) rename {repos/effect/packages => packages}/tools/oxc/test/no-import-from-barrel-package.test.ts (100%) rename {repos/effect/packages => packages}/tools/oxc/test/no-js-extension-imports.test.ts (100%) rename {repos/effect/packages => packages}/tools/oxc/test/no-opaque-instance-fields.test.ts (100%) rename {repos/effect/packages => packages}/tools/oxc/test/no-unused-internal.test.ts (100%) rename {repos/effect/packages => packages}/tools/oxc/test/utils.ts (100%) rename {repos/effect/packages => packages}/tools/oxc/tsconfig.json (100%) rename {repos/effect/packages => packages}/tools/utils/package.json (100%) rename {repos/effect/packages => packages}/tools/utils/src/Codegen.ts (100%) rename {repos/effect/packages => packages}/tools/utils/src/Glob.ts (100%) rename {repos/effect/packages => packages}/tools/utils/src/bin.ts (100%) rename {repos/effect/packages => packages}/tools/utils/src/commands/codegen.ts (100%) rename {repos/effect/packages => packages}/tools/utils/test/Codegen.test.ts (100%) rename {repos/effect/packages => packages}/tools/utils/tsconfig.json (100%) rename {repos/effect/packages => packages}/vitest/CHANGELOG.md (99%) rename {repos/effect/packages => packages}/vitest/LICENSE (100%) rename {repos/effect/packages => packages}/vitest/README.md (100%) rename {repos/effect/packages => packages}/vitest/package.json (98%) rename {repos/effect/packages => packages}/vitest/src/index.ts (100%) rename {repos/effect/packages => packages}/vitest/src/internal/internal.ts (100%) rename {repos/effect/packages => packages}/vitest/src/utils.ts (100%) rename {repos/effect/packages => packages}/vitest/test/index.test.ts (100%) rename {repos/effect/packages => packages}/vitest/test/isolation.test.ts (100%) rename {repos/effect/packages => packages}/vitest/test/layer-concurrency.test.ts (100%) rename {repos/effect/packages => packages}/vitest/test/nested-isolation.test.ts (100%) rename {repos/effect/packages => packages}/vitest/test/timeout.test.ts (100%) rename {repos/effect/packages => packages}/vitest/tsconfig.json (100%) rename {repos/effect/packages => packages}/vitest/typetest/index.tst.ts (100%) delete mode 100644 packages/vue-components/.prettierrc delete mode 100644 packages/vue-components/.storybook/main.ts delete mode 100644 packages/vue-components/.storybook/preview.ts delete mode 100644 packages/vue-components/.storybook/tsconfig.json delete mode 100644 packages/vue-components/.vscode/extensions.json delete mode 100644 packages/vue-components/CHANGELOG.md delete mode 100644 packages/vue-components/README.md delete mode 100644 packages/vue-components/__tests__/FixedNuxtErrorBoundary.test.ts delete mode 100644 packages/vue-components/__tests__/IntegerValidation.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/CustomFilterFieldSchema.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/DateValidation.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/DecimalSeparatorInput.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/DecodeTransformFallback.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/DefaultValuesPriority.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/Defaults.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/Defaults.values.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/DialogBlockingI18n.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/EmailFormatDetection.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/EmptyStringValidation.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/GeneralErrors.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/IndexedInputErrors.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/InputAttributes.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/InputReactivity.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/InputRegistry.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/IntersectionError.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/Meta.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/NullableFieldInitialization.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/NullableNestedStructValidation.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/OmegaAutoGen.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/OptionalKey.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/RedactedMeta.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/SelectMultipleLocalization.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/SubmitEffect.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/SubmitErrorClear.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/TaggedUnionBehavior.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/TaggedUnionLegacyWarning.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/TaggedUnionNested.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/TaggedUnionRequired.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/TaggedUnionRoot.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/TransformationSchema.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/TransformedStruct.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/UnregisteredFieldError.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/WithDefaultConstructorPersistency.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaForm/createUseFormWithCustomInput.test.ts delete mode 100644 packages/vue-components/__tests__/OmegaFormTest.vue delete mode 100644 packages/vue-components/__tests__/OmegaIntlProvider.vue delete mode 100644 packages/vue-components/__tests__/migration/schema-v4-migration.test.ts delete mode 100644 packages/vue-components/__tests__/setup.ts delete mode 100644 packages/vue-components/__tests__/test-array-meta.test.ts delete mode 100644 packages/vue-components/__tests__/test-nullor-duplicate.test.ts delete mode 100644 packages/vue-components/__tests__/test-union-meta.test.ts delete mode 100644 packages/vue-components/__tests__/tsconfig.json delete mode 100644 packages/vue-components/docs/superpowers/plans/2026-04-27-omegaform-refactor.md delete mode 100644 packages/vue-components/docs/superpowers/specs/2026-04-27-omegaform-refactor-design.md delete mode 100644 packages/vue-components/env.d.ts delete mode 100644 packages/vue-components/eslint.config.mjs delete mode 100644 packages/vue-components/package.json delete mode 100644 packages/vue-components/src/assets/.keep delete mode 100644 packages/vue-components/src/components/CommandButton.vue delete mode 100644 packages/vue-components/src/components/Dialog.vue delete mode 100644 packages/vue-components/src/components/FixedNuxtErrorBoundary.vue delete mode 100644 packages/vue-components/src/components/OmegaForm/InputProps.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/OmegaArray.vue delete mode 100644 packages/vue-components/src/components/OmegaForm/OmegaAutoGen.vue delete mode 100644 packages/vue-components/src/components/OmegaForm/OmegaErrorsInternal.vue delete mode 100644 packages/vue-components/src/components/OmegaForm/OmegaFormInput.vue delete mode 100644 packages/vue-components/src/components/OmegaForm/OmegaInput.vue delete mode 100644 packages/vue-components/src/components/OmegaForm/OmegaInputVuetify.vue delete mode 100644 packages/vue-components/src/components/OmegaForm/OmegaInternalInput.vue delete mode 100644 packages/vue-components/src/components/OmegaForm/OmegaTaggedUnion.vue delete mode 100644 packages/vue-components/src/components/OmegaForm/OmegaTaggedUnionInternal.vue delete mode 100644 packages/vue-components/src/components/OmegaForm/OmegaWrapper.vue delete mode 100644 packages/vue-components/src/components/OmegaForm/blockDialog.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/createUseFormWithCustomInput.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/decimalSeparatorInput.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/errors.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/getOmegaStore.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/hocs.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/index.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/inputs.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/meta/checks.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/meta/createMeta.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/meta/defaults.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/meta/redacted.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/meta/types.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/meta/walker.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/onMountedWithCleanup.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/persistency.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/submit.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/types.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/useOmegaForm.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/useRegisterField.ts delete mode 100644 packages/vue-components/src/components/OmegaForm/validation/localized.ts delete mode 100644 packages/vue-components/src/components/index.ts delete mode 100644 packages/vue-components/src/components/style.css delete mode 100644 packages/vue-components/src/index.ts delete mode 100644 packages/vue-components/src/reset.css delete mode 100644 packages/vue-components/src/utils/index.ts delete mode 100644 packages/vue-components/stories/Commands.stories.ts delete mode 100644 packages/vue-components/stories/Commands/One.vue delete mode 100644 packages/vue-components/stories/Commands/components.ts delete mode 100644 packages/vue-components/stories/Commands/helpers.ts delete mode 100644 packages/vue-components/stories/Commands/useEffectRouter.ts delete mode 100644 packages/vue-components/stories/Dialog.stories.ts delete mode 100644 packages/vue-components/stories/Dialog/AsyncBlocking.vue delete mode 100644 packages/vue-components/stories/Dialog/AsyncBlockingContent.vue delete mode 100644 packages/vue-components/stories/Dialog/SimpleBlocking.vue delete mode 100644 packages/vue-components/stories/Dialog/SimpleBlockingContent.vue delete mode 100644 packages/vue-components/stories/Dialog/UploadBlocking.vue delete mode 100644 packages/vue-components/stories/Dialog/UploadBlockingContent.vue delete mode 100644 packages/vue-components/stories/FixedNuxtErrorBoundary.stories.ts delete mode 100644 packages/vue-components/stories/FixedNuxtErrorBoundary/Demo.vue delete mode 100644 packages/vue-components/stories/OmegaForm.stories.ts delete mode 100644 packages/vue-components/stories/OmegaForm/Array.vue delete mode 100644 packages/vue-components/stories/OmegaForm/AutoGeneration.vue delete mode 100644 packages/vue-components/stories/OmegaForm/Booleans.vue delete mode 100644 packages/vue-components/stories/OmegaForm/Clearable.vue delete mode 100644 packages/vue-components/stories/OmegaForm/ComplexForm.vue delete mode 100644 packages/vue-components/stories/OmegaForm/CustomInput.vue delete mode 100644 packages/vue-components/stories/OmegaForm/CustomInputClassName.vue delete mode 100644 packages/vue-components/stories/OmegaForm/CustomLabelSlot.vue delete mode 100644 packages/vue-components/stories/OmegaForm/Date.vue delete mode 100644 packages/vue-components/stories/OmegaForm/DecodeTransformFallback.vue delete mode 100644 packages/vue-components/stories/OmegaForm/Defaults.vue delete mode 100644 packages/vue-components/stories/OmegaForm/DialogBlockingExamples.vue delete mode 100644 packages/vue-components/stories/OmegaForm/EmailForm.vue delete mode 100644 packages/vue-components/stories/OmegaForm/EnterSubmitRepro.vue delete mode 100644 packages/vue-components/stories/OmegaForm/FormTaggedUnion.vue delete mode 100644 packages/vue-components/stories/OmegaForm/IndexedTable.vue delete mode 100644 packages/vue-components/stories/OmegaForm/InputRegistry.vue delete mode 100644 packages/vue-components/stories/OmegaForm/IntegerValidationGerman.vue delete mode 100644 packages/vue-components/stories/OmegaForm/IntersectionExample.vue delete mode 100644 packages/vue-components/stories/OmegaForm/Meta.vue delete mode 100644 packages/vue-components/stories/OmegaForm/Null.vue delete mode 100644 packages/vue-components/stories/OmegaForm/Nullable.vue delete mode 100644 packages/vue-components/stories/OmegaForm/NullableNestedStruct.vue delete mode 100644 packages/vue-components/stories/OmegaForm/NumberInput.vue delete mode 100644 packages/vue-components/stories/OmegaForm/OmitConstructorDefaults.vue delete mode 100644 packages/vue-components/stories/OmegaForm/OptionalKey.vue delete mode 100644 packages/vue-components/stories/OmegaForm/PersistencyForm.vue delete mode 100644 packages/vue-components/stories/OmegaForm/ProgrammaticallyHandleSubmitCheckErrors.vue delete mode 100644 packages/vue-components/stories/OmegaForm/RatingInput.vue delete mode 100644 packages/vue-components/stories/OmegaForm/Redacted.vue delete mode 100644 packages/vue-components/stories/OmegaForm/RootLevelTaggedUnion.vue delete mode 100644 packages/vue-components/stories/OmegaForm/RootLevelTaggedUnionLegacy.vue delete mode 100644 packages/vue-components/stories/OmegaForm/SetErrorOnSubmit.vue delete mode 100644 packages/vue-components/stories/OmegaForm/SimpleForm.vue delete mode 100644 packages/vue-components/stories/OmegaForm/SimpleFormVuetifyDefault.vue delete mode 100644 packages/vue-components/stories/OmegaForm/SumExample.vue delete mode 100644 packages/vue-components/stories/OmegaForm/Tanstack.vue delete mode 100644 packages/vue-components/stories/OmegaForm/Union.vue delete mode 100644 packages/vue-components/stories/OmegaForm/UsingOmegaForm.vue delete mode 100644 packages/vue-components/stories/OmegaForm/WindowExitPrevention.vue delete mode 100644 packages/vue-components/stories/OmegaForm/WithDefaultConstructor.vue delete mode 100644 packages/vue-components/stories/OmegaForm/createUseFormWIthCustomInput.vue delete mode 100644 packages/vue-components/stories/OmegaForm/form.Input.vue delete mode 100644 packages/vue-components/stories/README.md delete mode 100644 packages/vue-components/stories/tsconfig.json delete mode 100644 packages/vue-components/tsconfig.build.json delete mode 100644 packages/vue-components/tsconfig.json delete mode 100644 packages/vue-components/types/vuetify-shims.d.ts delete mode 100644 packages/vue-components/vite.config.mts delete mode 100644 packages/vue-components/vitest.config.mts delete mode 100644 packages/vue/.madgerc delete mode 100644 packages/vue/.npmignore delete mode 100644 packages/vue/.prettierignore delete mode 100644 packages/vue/CHANGELOG.md delete mode 100644 packages/vue/docs/atom-query-api-redesign.md delete mode 100644 packages/vue/docs/mutation-command-atoms.md delete mode 100644 packages/vue/docs/query-key-invalidation.md delete mode 100644 packages/vue/examples/streamMutation.ts delete mode 100644 packages/vue/package.json delete mode 100644 packages/vue/src/atomQuery.ts delete mode 100644 packages/vue/src/commander.ts delete mode 100644 packages/vue/src/confirm.ts delete mode 100644 packages/vue/src/dependencyMetadata.ts delete mode 100644 packages/vue/src/errorReporter.ts delete mode 100644 packages/vue/src/form.ts delete mode 100644 packages/vue/src/index.ts delete mode 100644 packages/vue/src/internal/tanstackQuery.ts delete mode 100644 packages/vue/src/intl.ts delete mode 100644 packages/vue/src/lib.ts delete mode 100644 packages/vue/src/liveQueryInvalidation.ts delete mode 100644 packages/vue/src/makeClient.ts delete mode 100644 packages/vue/src/makeContext.ts delete mode 100644 packages/vue/src/makeIntl.ts delete mode 100644 packages/vue/src/makeUseCommand.ts delete mode 100644 packages/vue/src/mutate.ts delete mode 100644 packages/vue/src/query.ts delete mode 100644 packages/vue/src/queryLifetime.ts delete mode 100644 packages/vue/src/routeParams.ts delete mode 100644 packages/vue/src/runtime.ts delete mode 100644 packages/vue/src/suspense.ts delete mode 100644 packages/vue/src/toast.ts delete mode 100644 packages/vue/src/withToast.ts delete mode 100644 packages/vue/test/Mutation.test.ts delete mode 100644 packages/vue/test/dependencyInvalidation.test.ts delete mode 100644 packages/vue/test/form-validation-errors.test.ts delete mode 100644 packages/vue/test/form.test.ts delete mode 100644 packages/vue/test/inactiveInvalidation.test.ts delete mode 100644 packages/vue/test/interrupt-refetch-repro.test.ts delete mode 100644 packages/vue/test/lib.test.ts delete mode 100644 packages/vue/test/liveQueryInvalidation.test.ts delete mode 100644 packages/vue/test/makeClient.test.ts delete mode 100644 packages/vue/test/query-span.test.ts delete mode 100644 packages/vue/test/queryOptions.test.ts delete mode 100644 packages/vue/test/streamFinal.test.ts delete mode 100644 packages/vue/test/streamFn.test.ts delete mode 100644 packages/vue/test/stubs.ts delete mode 100644 packages/vue/test/suspense-regression.test.ts delete mode 100644 packages/vue/test/suspense.test.ts delete mode 100644 packages/vue/tsconfig.examples.json delete mode 100644 packages/vue/tsconfig.json delete mode 100644 packages/vue/tsconfig.src.json delete mode 100644 packages/vue/tsconfig.test.json delete mode 100644 packages/vue/vitest.config.ts delete mode 100644 patches/.gitkeep delete mode 100644 patches/@ben_12__eslint-plugin-dprint.patch delete mode 100644 patches/@changesets__cli@2.31.0.patch rename {repos/effect/patches => patches}/@changesets__get-github-info@1.0.1.patch (100%) delete mode 100644 patches/@sendgrid__mail.patch delete mode 100644 patches/@tanstack__query-core.patch delete mode 100644 patches/ts-plugin-sort-import-suggestions.patch delete mode 100644 patches/typescript.patch delete mode 100644 repos/effect/.changeset/config.json delete mode 100644 repos/effect/.changeset/pre.json delete mode 100644 repos/effect/.envrc delete mode 100644 repos/effect/.gitignore delete mode 100644 repos/effect/.oxlintrc.json delete mode 100644 repos/effect/.vscode/extensions.json delete mode 100644 repos/effect/.vscode/settings.json delete mode 100644 repos/effect/README.md delete mode 100644 repos/effect/flake.lock delete mode 100644 repos/effect/flake.nix delete mode 100644 repos/effect/package.json delete mode 100644 repos/effect/pnpm-lock.yaml delete mode 100644 repos/effect/pnpm-workspace.yaml delete mode 100644 repos/effect/tsconfig.base.json delete mode 100644 repos/effect/vitest.config.ts delete mode 100644 repos/effect/vitest.setup.ts rename {repos/effect/scratchpad => scratchpad}/index.ts (100%) rename {repos/effect/scratchpad => scratchpad}/package.json (100%) rename {repos/effect/scratchpad => scratchpad}/tsconfig.json (100%) delete mode 100644 scripts/agent-gh.mjs delete mode 100644 scripts/agent-pr-ready.mjs delete mode 100644 scripts/agent-pre-push.mjs rename {repos/effect/scripts => scripts}/bundle-analyze.sh (100%) rename {repos/effect/scripts => scripts}/bundle-compare-selected.sh (100%) rename {repos/effect/scripts => scripts}/bundle-compare.sh (100%) rename {repos/effect/scripts => scripts}/check-dist-types.mjs (100%) rename {repos/effect/scripts => scripts}/circular.mjs (100%) delete mode 100644 scripts/clean-dist.sh rename {repos/effect/scripts => scripts}/clean.mjs (100%) rename {repos/effect/scripts => scripts}/codemod.mjs (100%) rename {repos/effect/scripts => scripts}/codemods/jsdoc.ts (100%) delete mode 100644 scripts/convert_patch.js rename {repos/effect/scripts => scripts}/copy-ai-docs.mjs (100%) delete mode 100644 scripts/extract.sh delete mode 100755 scripts/hooks/post-checkout.test.sh delete mode 100644 scripts/install-git-hooks.mjs delete mode 100644 scripts/lib/agent-env.mjs delete mode 100644 scripts/lib/agent-gh-policy.mjs delete mode 100644 scripts/lib/agent-pr-state.mjs delete mode 100644 scripts/lib/agent-ship-gate-cache.mjs delete mode 100644 scripts/mergeTsConfig.mjs rename {repos/effect/scripts => scripts}/package-scalar.mjs (100%) rename {repos/effect/scripts => scripts}/package-swagger.mjs (100%) rename {repos/effect/scripts => scripts}/package.json (100%) delete mode 100644 scripts/rewrite-dist-declaration-imports.mjs rename {repos/effect/scripts => scripts}/set-strip-internal.mjs (100%) rename {repos/effect/scripts => scripts}/setup-agents.mjs (100%) delete mode 100644 scripts/sort.js delete mode 100644 scripts/stagePublishPackage.mjs delete mode 100644 scripts/sync-effect-subtree.js rename {repos/effect/scripts => scripts}/tsconfig.json (100%) rename {repos/effect/scripts => scripts}/worktree-setup.sh (100%) delete mode 100644 t3.json delete mode 100644 tsconfig.all.json rename repos/effect/tsconfig.json => tsconfig.json (100%) delete mode 100644 tsconfig.lib.json rename repos/effect/tsconfig.packages.json => tsconfig.packages.json (100%) delete mode 100644 tsconfig.plugins.json rename repos/effect/tsconfig.tests.json => tsconfig.tests.json (100%) rename repos/effect/tstyche.json => tstyche.json (100%) delete mode 100644 vite.config.base.ts rename repos/effect/vitest.docs.ts => vitest.docs.ts (100%) delete mode 100644 wiki/Home.md delete mode 100644 wiki/ResourceClients.md delete mode 100644 wiki/bag-of-tricks.md delete mode 100644 "wiki/effect\342\200\220app\342\200\220cli.md" delete mode 100644 wiki/error-reporter-migration.md delete mode 100644 wiki/repository-derived-query-invalidation.md diff --git a/repos/effect/.agents/AGENTS.md b/.agents/AGENTS.md similarity index 100% rename from repos/effect/.agents/AGENTS.md rename to .agents/AGENTS.md diff --git a/repos/effect/.agents/skills/ai-docs/SKILL.md b/.agents/skills/ai-docs/SKILL.md similarity index 100% rename from repos/effect/.agents/skills/ai-docs/SKILL.md rename to .agents/skills/ai-docs/SKILL.md diff --git a/repos/effect/.agents/skills/bundle-analysis/SKILL.md b/.agents/skills/bundle-analysis/SKILL.md similarity index 100% rename from repos/effect/.agents/skills/bundle-analysis/SKILL.md rename to .agents/skills/bundle-analysis/SKILL.md diff --git a/repos/effect/.agents/skills/changesets/SKILL.md b/.agents/skills/changesets/SKILL.md similarity index 100% rename from repos/effect/.agents/skills/changesets/SKILL.md rename to .agents/skills/changesets/SKILL.md diff --git a/repos/effect/.agents/skills/changesets/authoring.md b/.agents/skills/changesets/authoring.md similarity index 100% rename from repos/effect/.agents/skills/changesets/authoring.md rename to .agents/skills/changesets/authoring.md diff --git a/repos/effect/.agents/skills/ci-maintenance/SKILL.md b/.agents/skills/ci-maintenance/SKILL.md similarity index 100% rename from repos/effect/.agents/skills/ci-maintenance/SKILL.md rename to .agents/skills/ci-maintenance/SKILL.md diff --git a/repos/effect/.agents/skills/ci-maintenance/privileged-workflows.md b/.agents/skills/ci-maintenance/privileged-workflows.md similarity index 100% rename from repos/effect/.agents/skills/ci-maintenance/privileged-workflows.md rename to .agents/skills/ci-maintenance/privileged-workflows.md diff --git a/repos/effect/.agents/skills/dependency-maintenance/SKILL.md b/.agents/skills/dependency-maintenance/SKILL.md similarity index 100% rename from repos/effect/.agents/skills/dependency-maintenance/SKILL.md rename to .agents/skills/dependency-maintenance/SKILL.md diff --git a/repos/effect/.agents/skills/dependency-maintenance/coordinated-upgrades.md b/.agents/skills/dependency-maintenance/coordinated-upgrades.md similarity index 100% rename from repos/effect/.agents/skills/dependency-maintenance/coordinated-upgrades.md rename to .agents/skills/dependency-maintenance/coordinated-upgrades.md diff --git a/repos/effect/.agents/skills/dependency-maintenance/manifest-roles.md b/.agents/skills/dependency-maintenance/manifest-roles.md similarity index 100% rename from repos/effect/.agents/skills/dependency-maintenance/manifest-roles.md rename to .agents/skills/dependency-maintenance/manifest-roles.md diff --git a/repos/effect/.agents/skills/effect-development/SKILL.md b/.agents/skills/effect-development/SKILL.md similarity index 100% rename from repos/effect/.agents/skills/effect-development/SKILL.md rename to .agents/skills/effect-development/SKILL.md diff --git a/repos/effect/.agents/skills/jsdocs/SKILL.md b/.agents/skills/jsdocs/SKILL.md similarity index 100% rename from repos/effect/.agents/skills/jsdocs/SKILL.md rename to .agents/skills/jsdocs/SKILL.md diff --git a/repos/effect/.agents/skills/jsdocs/categories.md b/.agents/skills/jsdocs/categories.md similarity index 100% rename from repos/effect/.agents/skills/jsdocs/categories.md rename to .agents/skills/jsdocs/categories.md diff --git a/repos/effect/.agents/skills/jsdocs/declarations.md b/.agents/skills/jsdocs/declarations.md similarity index 100% rename from repos/effect/.agents/skills/jsdocs/declarations.md rename to .agents/skills/jsdocs/declarations.md diff --git a/repos/effect/.agents/skills/jsdocs/examples.md b/.agents/skills/jsdocs/examples.md similarity index 100% rename from repos/effect/.agents/skills/jsdocs/examples.md rename to .agents/skills/jsdocs/examples.md diff --git a/repos/effect/.agents/skills/migration-guidance/SKILL.md b/.agents/skills/migration-guidance/SKILL.md similarity index 100% rename from repos/effect/.agents/skills/migration-guidance/SKILL.md rename to .agents/skills/migration-guidance/SKILL.md diff --git a/repos/effect/.agents/skills/migration-guidance/annotations.md b/.agents/skills/migration-guidance/annotations.md similarity index 100% rename from repos/effect/.agents/skills/migration-guidance/annotations.md rename to .agents/skills/migration-guidance/annotations.md diff --git a/repos/effect/.agents/skills/migration-guidance/generation.md b/.agents/skills/migration-guidance/generation.md similarity index 100% rename from repos/effect/.agents/skills/migration-guidance/generation.md rename to .agents/skills/migration-guidance/generation.md diff --git a/repos/effect/.agents/skills/package-development/SKILL.md b/.agents/skills/package-development/SKILL.md similarity index 100% rename from repos/effect/.agents/skills/package-development/SKILL.md rename to .agents/skills/package-development/SKILL.md diff --git a/repos/effect/.agents/skills/package-development/dependencies.md b/.agents/skills/package-development/dependencies.md similarity index 100% rename from repos/effect/.agents/skills/package-development/dependencies.md rename to .agents/skills/package-development/dependencies.md diff --git a/repos/effect/.agents/skills/package-development/publishing.md b/.agents/skills/package-development/publishing.md similarity index 100% rename from repos/effect/.agents/skills/package-development/publishing.md rename to .agents/skills/package-development/publishing.md diff --git a/repos/effect/.agents/skills/package-development/registration.md b/.agents/skills/package-development/registration.md similarity index 100% rename from repos/effect/.agents/skills/package-development/registration.md rename to .agents/skills/package-development/registration.md diff --git a/repos/effect/.agents/skills/performance-analysis/SKILL.md b/.agents/skills/performance-analysis/SKILL.md similarity index 100% rename from repos/effect/.agents/skills/performance-analysis/SKILL.md rename to .agents/skills/performance-analysis/SKILL.md diff --git a/repos/effect/.agents/skills/performance-analysis/runtime.md b/.agents/skills/performance-analysis/runtime.md similarity index 100% rename from repos/effect/.agents/skills/performance-analysis/runtime.md rename to .agents/skills/performance-analysis/runtime.md diff --git a/repos/effect/.agents/skills/performance-analysis/types.md b/.agents/skills/performance-analysis/types.md similarity index 100% rename from repos/effect/.agents/skills/performance-analysis/types.md rename to .agents/skills/performance-analysis/types.md diff --git a/repos/effect/.agents/skills/test-development/SKILL.md b/.agents/skills/test-development/SKILL.md similarity index 100% rename from repos/effect/.agents/skills/test-development/SKILL.md rename to .agents/skills/test-development/SKILL.md diff --git a/repos/effect/.agents/skills/test-development/displayed-types.md b/.agents/skills/test-development/displayed-types.md similarity index 100% rename from repos/effect/.agents/skills/test-development/displayed-types.md rename to .agents/skills/test-development/displayed-types.md diff --git a/repos/effect/.agents/skills/test-development/runtime.md b/.agents/skills/test-development/runtime.md similarity index 100% rename from repos/effect/.agents/skills/test-development/runtime.md rename to .agents/skills/test-development/runtime.md diff --git a/repos/effect/.agents/skills/test-development/types.md b/.agents/skills/test-development/types.md similarity index 100% rename from repos/effect/.agents/skills/test-development/types.md rename to .agents/skills/test-development/types.md diff --git a/repos/effect/.agents/skills/vendored-assets/SKILL.md b/.agents/skills/vendored-assets/SKILL.md similarity index 100% rename from repos/effect/.agents/skills/vendored-assets/SKILL.md rename to .agents/skills/vendored-assets/SKILL.md diff --git a/repos/effect/.agents/skills/vendored-assets/browser-assets.md b/.agents/skills/vendored-assets/browser-assets.md similarity index 100% rename from repos/effect/.agents/skills/vendored-assets/browser-assets.md rename to .agents/skills/vendored-assets/browser-assets.md diff --git a/.changeset/README.md b/.changeset/README.md deleted file mode 100644 index e5b6d8d6a..000000000 --- a/.changeset/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Changesets - -Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works -with multi-package repos, or single-package repos to help you version and publish your code. You can -find the full documentation for it [in our repository](https://github.com/changesets/changesets) - -We have a quick list of common questions to get you started engaging with this project in -[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/active-query-invalidation.md b/.changeset/active-query-invalidation.md deleted file mode 100644 index de7f548f0..000000000 --- a/.changeset/active-query-invalidation.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": minor ---- - -Invalidate only mounted queries (TanStack `refetchType: "active"`). Idle `gcTime` entries are marked stale and refetch on remount. `invalidateAndAwait` still waits for observed refetches to finish. diff --git a/.changeset/add-oxlint-integration.md b/.changeset/add-oxlint-integration.md deleted file mode 100644 index 3fba7c31d..000000000 --- a/.changeset/add-oxlint-integration.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-shared-config": minor ---- - -Add oxlint integration: run oxlint before ESLint, with `eslint-plugin-oxlint` disabling ESLint rules already covered by oxlint. Add repo-root `.oxlintrc.json` with shared rule config. Update `lint`/`lint-fix` scripts in cli, effect-app, and infra packages. diff --git a/.changeset/add-stream-mutation.md b/.changeset/add-stream-mutation.md deleted file mode 100644 index f3308a661..000000000 --- a/.changeset/add-stream-mutation.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -"@effect-app/vue": minor -"@effect-app/vue-components": minor ---- - -Add stream mutation support throughout the Vue commander pipeline. - -- `asStreamResult` utility (mirrors `asResult`, accepts `Stream` or a factory). Reactive ref updates with each emitted value (`waiting: true`) and finalises once the stream ends (`waiting: false`); errors surface as `AsyncResult.failure`. -- `clientFor` now exposes `mutateStream` for stream-type requests as a factory `(options?) => [resultRef, execute] & { id, running?, progress? }`. Always invoke `()` (optionally with `{ progress }`) to obtain a fresh ref+execute pair — independent invocations don't share state. Helpers expose the same shape under `xxxStream`. -- `Command.wrapStream(client.x)` and `Command.wrap(client.x)` build a CommanderWrap from a stream entry; the factory is called per command build. -- `Command.fn(client.x.mutateStream)` and `Command.fn(client.x.mutateStream({ progress }))` accept a stream factory or already-called tuple-with-id; the resulting command exposes `running` (live `AsyncResult`) and `progress` (formatted loading info) only when the factory was called with a `progress: (result) => Progress | undefined` formatter, where `Progress = string | { text: string; percentage: number }`. -- `CommandBase` adds `progress?: Progress` so the `CommandButton` component overrides the Vuetify `loader` slot with a `v-progress-circular` (using `model-value` for percentage when available, otherwise indeterminate) and the formatted text alongside. -- New example `examples/streamMutation.ts` shows modelling a long-running export operation that streams `OperationProgress | ExportComplete` events. diff --git a/.changeset/adopt-module-system.md b/.changeset/adopt-module-system.md deleted file mode 100644 index b4ffc101d..000000000 --- a/.changeset/adopt-module-system.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -Adopt module system from effect-smol: replace barrel imports with specific submodule imports (`import * as X from "effect-app/X"` / `import * as X from "effect/X"`). diff --git a/.changeset/align-invalidation-entry-types.md b/.changeset/align-invalidation-entry-types.md deleted file mode 100644 index ce3049977..000000000 --- a/.changeset/align-invalidation-entry-types.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"@effect-app/vue": patch -"effect-app": patch ---- - -Align `InvalidationEntry` (vue) with `InvalidateQueryInstruction` (effect-app). - -`InvalidateQueryInstruction` is now parametrized over `Filters` / `Options` -(defaulting to `Record` so the core stays framework-agnostic). -`@effect-app/vue` exposes `InvalidationEntry` as a narrowed alias substituting -`@tanstack/vue-query`'s `InvalidateQueryFilters` and `InvalidateOptions`. Single -source of truth for the union shape across both packages. diff --git a/.changeset/align-schema-void-ts-semantics.md b/.changeset/align-schema-void-ts-semantics.md deleted file mode 100644 index 7bb4a8d9a..000000000 --- a/.changeset/align-schema-void-ts-semantics.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"effect-app": minor -"@effect-app/infra": patch ---- - -Align `Schema.Void` with TypeScript `void` return-value semantics (effect-smol PR #2475 / `b7d46ab`). - -`S.Void` now accepts **any present value** at runtime and discards it to `undefined`, while keeping the decoded/encoded type as `void` — matching a `void` return whose result callers never observe. This is implemented as an override of the AST node in a new `effect-app/SchemaAST` module (`export * from "effect/SchemaAST"` plus a `Void` subclass whose parser mirrors the PR's `fromAnyToConst(undefined)`), so there is a single canonical `Void` used everywhere, including RPC success schemas. - -- New `effect-app/SchemaAST` module; internal `SchemaAST` imports across the libs now route through it. -- Removed `ForceVoid` from `effect-app/client/makeClient` — use `S.Void` directly, which now carries this behaviour. -- `S.Void_` remains available as effect's original (`undefined`-only) Void. diff --git a/.changeset/all-phones-dream.md b/.changeset/all-phones-dream.md deleted file mode 100644 index 3dcb4dfbe..000000000 --- a/.changeset/all-phones-dream.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -temp revert diff --git a/.changeset/amber-garlics-sing.md b/.changeset/amber-garlics-sing.md deleted file mode 100644 index 56e60c1c0..000000000 --- a/.changeset/amber-garlics-sing.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Allow Struct and TaggedStruct make helpers to omit input when every constructor field is optional or defaulted, and preserve widening copy typings through a lighter named public type to improve TypeScript editor responsiveness. diff --git a/.changeset/api-client-isolate-layers.md b/.changeset/api-client-isolate-layers.md deleted file mode 100644 index 931a59b07..000000000 --- a/.changeset/api-client-isolate-layers.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -"effect-app": patch ---- - -Isolate per-call `Effect.provide(layers)` / `Stream.provide(layers)` in the -RPC api client factory via `{ local: true }`. - -`layers` here is built per RPC invocation from a caller-supplied -`requestLevelLayers` plus a fresh `RequestName` layer. Today both pieces are -stateless, so no observable bug — but `Effect.provide(layer)` without -`local: true` resolves its `MemoMap` from the ambient fiber context, and on a -long-lived runtime (browser app, server fiber) any stateful layer slipped into -`requestLevelLayers` by a caller would be memoized and shared across every -subsequent RPC call. `{ local: true }` builds the layer fresh per call and -skips the ambient MemoMap entirely. - -Also documents the rule in `AGENTS.md` ("Per-request `Effect.provide(layer)` -must isolate its MemoMap") so the pattern is enforceable in code review and -caught early. Companion to the `provideOnRequestScope` MemoMap fix in -`@effect-app/infra`. diff --git a/.changeset/atom-query-vue.md b/.changeset/atom-query-vue.md deleted file mode 100644 index c13ba4fb6..000000000 --- a/.changeset/atom-query-vue.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/vue": patch ---- - -Add Atom-native Vue query APIs, stream query pull atoms, and a TanStack-backed legacy query engine toggle. diff --git a/.changeset/batch-cosmos-acks.md b/.changeset/batch-cosmos-acks.md deleted file mode 100644 index 2c5d49414..000000000 --- a/.changeset/batch-cosmos-acks.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Batch Cosmos ack message processing updates. diff --git a/.changeset/batch-dual-options.md b/.changeset/batch-dual-options.md deleted file mode 100644 index b84b454a8..000000000 --- a/.changeset/batch-dual-options.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Merge `batchPar` into `batch`, expose `concurrency` via an optional `BatchOptions` argument, and make `batch` dual (data-first + data-last). diff --git a/.changeset/big-teams-wash.md b/.changeset/big-teams-wash.md deleted file mode 100644 index 23c182f5a..000000000 --- a/.changeset/big-teams-wash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -fix bs span diff --git a/.changeset/blue-rats-admire.md b/.changeset/blue-rats-admire.md deleted file mode 100644 index bc8acc93c..000000000 --- a/.changeset/blue-rats-admire.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Adjust Struct and TaggedStruct copy typing to follow class-style widening constraints while keeping structural copy runtime behavior. diff --git a/.changeset/bold-berries-change.md b/.changeset/bold-berries-change.md deleted file mode 100644 index 4b641c68b..000000000 --- a/.changeset/bold-berries-change.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Fixes optionalKey input in OmegaForm diff --git a/.changeset/brave-animals-like.md b/.changeset/brave-animals-like.md deleted file mode 100644 index 7c366956a..000000000 --- a/.changeset/brave-animals-like.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -improve: support .ts extension diff --git a/.changeset/brave-bushes-fold.md b/.changeset/brave-bushes-fold.md deleted file mode 100644 index 195bb03e3..000000000 --- a/.changeset/brave-bushes-fold.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -fix lock diff --git a/.changeset/brave-laws-add.md b/.changeset/brave-laws-add.md deleted file mode 100644 index 5fbc227ac..000000000 --- a/.changeset/brave-laws-add.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -remove hopefully obsolete Struct overrides diff --git a/.changeset/brave-oranges-try.md b/.changeset/brave-oranges-try.md deleted file mode 100644 index b01730ad4..000000000 --- a/.changeset/brave-oranges-try.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -enforce local diff --git a/.changeset/brave-years-fry.md b/.changeset/brave-years-fry.md deleted file mode 100644 index 99465728d..000000000 --- a/.changeset/brave-years-fry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -align CauseException diff --git a/.changeset/bright-camels-grin.md b/.changeset/bright-camels-grin.md deleted file mode 100644 index e47d4a412..000000000 --- a/.changeset/bright-camels-grin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Preserve field-level schema decode errors for relaxed Class and TaggedClass declarations so decode failures report nested constraints (for example min-length violations) instead of only a generic class-type mismatch. diff --git a/.changeset/bright-lions-share.md b/.changeset/bright-lions-share.md deleted file mode 100644 index b15f93094..000000000 --- a/.changeset/bright-lions-share.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Extend `Schema.Opaque` in `effect-app/Schema` to support an optional encoded-type generic while preserving the original single-generic behavior. diff --git a/.changeset/bright-mugs-paint.md b/.changeset/bright-mugs-paint.md deleted file mode 100644 index e550ba261..000000000 --- a/.changeset/bright-mugs-paint.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Update `Effect.allLower` to call `svc.asEffect()` when available, ensuring service entries are normalized before `Effect.all` evaluation. diff --git a/.changeset/bright-peaches-wave.md b/.changeset/bright-peaches-wave.md deleted file mode 100644 index 3ea55befc..000000000 --- a/.changeset/bright-peaches-wave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Preserve omitted-input make helpers through Schema.Opaque when the wrapped schema allows optional or default-only constructor input. diff --git a/.changeset/bright-trees-count.md b/.changeset/bright-trees-count.md deleted file mode 100644 index f43f86474..000000000 --- a/.changeset/bright-trees-count.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix config nested diff --git a/.changeset/builtin-map-union-receiver.md b/.changeset/builtin-map-union-receiver.md deleted file mode 100644 index a76007f5e..000000000 --- a/.changeset/builtin-map-union-receiver.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Fix the global `Array`/`ReadonlyArray.map` override breaking union-of-array receivers. The previous `this: NonEmptyArray`/`NonEmptyReadonlyArray` overload was selected-then-rejected on a union receiver (e.g. `(readonly A[] | readonly B[]).map(...)`), raising TS2684. Replaced with a single conditional-return signature (`this extends NonEmpty… ? NonEmpty : U[]`) that preserves NonEmpty refinement without a `this` parameter, so union-array `.map` calls type-check again. diff --git a/.changeset/cached-per-request-helper.md b/.changeset/cached-per-request-helper.md deleted file mode 100644 index 8964ac2a0..000000000 --- a/.changeset/cached-per-request-helper.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Add `cachedPerRequest` helper to `ContextMapContainer`. Runs a given Effect at most once per ContextMap (i.e. per request) and stores the result in the ContextMap under a fresh symbol, using the ContextMap's shared semaphore for safe single initialization. Use as a building block for any per-request memoized value (request resolver caches, per-request `Cache.make` instances, etc.). diff --git a/.changeset/calm-clocks-observe.md b/.changeset/calm-clocks-observe.md deleted file mode 100644 index 3fb003aa7..000000000 --- a/.changeset/calm-clocks-observe.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -Replace repository codec child spans with parent-span timing attributes and bounded metrics, and record database operation timing for instrumented stores. diff --git a/.changeset/calm-cosmos-cluster.md b/.changeset/calm-cosmos-cluster.md deleted file mode 100644 index 6ca46d941..000000000 --- a/.changeset/calm-cosmos-cluster.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Add Cosmos DB backed storage layers for Effect Cluster message and runner state. diff --git a/.changeset/calm-filter-cycle.md b/.changeset/calm-filter-cycle.md deleted file mode 100644 index 01cd97d0b..000000000 --- a/.changeset/calm-filter-cycle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Break the circular dependency between the memory store and code filter modules. diff --git a/.changeset/calm-pallets-listen.md b/.changeset/calm-pallets-listen.md deleted file mode 100644 index d015de043..000000000 --- a/.changeset/calm-pallets-listen.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Derive scoped dependency reads and writes from typed query filters and annotated model relationships, including previous aliases. diff --git a/.changeset/calm-pets-float.md b/.changeset/calm-pets-float.md deleted file mode 100644 index c9bea369a..000000000 --- a/.changeset/calm-pets-float.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -"effect-app": patch ---- - -Fix `Schema.TaggedUnion(...).tags` extraction for class-based members (for example `TaggedClass`) by using a local AST sentinel walker instead of relying on internal effect APIs. - -Add tests covering: - -- `TaggedUnion` with `encodeKeys`-wrapped members -- `TaggedUnion` with `TaggedClass` members diff --git a/.changeset/calm-picks-refresh.md b/.changeset/calm-picks-refresh.md deleted file mode 100644 index b20592b13..000000000 --- a/.changeset/calm-picks-refresh.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/vue": patch ---- - -Update Atom query caches in memory and accumulate stream invalidations so live events do not cause repeated RPC refetches. diff --git a/.changeset/chilly-colts-attack.md b/.changeset/chilly-colts-attack.md deleted file mode 100644 index 303d1065f..000000000 --- a/.changeset/chilly-colts-attack.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-shared-config": patch ---- - -update dprint plugins diff --git a/.changeset/chilly-steaks-rule.md b/.changeset/chilly-steaks-rule.md deleted file mode 100644 index c7dd9521a..000000000 --- a/.changeset/chilly-steaks-rule.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix input date diff --git a/.changeset/chubby-dolls-yell.md b/.changeset/chubby-dolls-yell.md deleted file mode 100644 index ed4649650..000000000 --- a/.changeset/chubby-dolls-yell.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@effect-app/infra": patch -"@effect-app/cli": patch ---- - -fix missing toCodecJson usages diff --git a/.changeset/class-facade-encode-keys.md b/.changeset/class-facade-encode-keys.md deleted file mode 100644 index 37d81fd7c..000000000 --- a/.changeset/class-facade-encode-keys.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/eslint-codegen-model": patch ---- - -Unify generated model facades on `OpaqueFacade` and support class facades through encoded-key schema transforms. diff --git a/.changeset/clean-atom-suspense.md b/.changeset/clean-atom-suspense.md deleted file mode 100644 index fac6a587e..000000000 --- a/.changeset/clean-atom-suspense.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Fix atom-query suspense cleanup so per-observer wrappers unsubscribe on unmount while cached query atoms keep their idle TTL. diff --git a/.changeset/clean-sql-data-column.md b/.changeset/clean-sql-data-column.md deleted file mode 100644 index 8d5798597..000000000 --- a/.changeset/clean-sql-data-column.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Strip `_etag` and `id` from the `data` JSON column in SQL store adapters (SQLite + PostgreSQL). These fields are already stored as dedicated columns and were redundantly duplicated inside the JSON blob. On read, `parseRow` now re-injects `id` from the row column. Backward compatible: existing rows with `_etag`/`id` in `data` continue to work as the column values take precedence. diff --git a/.changeset/clean-unused-dependencies.md b/.changeset/clean-unused-dependencies.md deleted file mode 100644 index 61fbe03d2..000000000 --- a/.changeset/clean-unused-dependencies.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@effect-app/cli": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch ---- - -Remove unused dependency declarations from package manifests. diff --git a/.changeset/cleanup-tsgolint-codegen.md b/.changeset/cleanup-tsgolint-codegen.md deleted file mode 100644 index 8a3965fd5..000000000 --- a/.changeset/cleanup-tsgolint-codegen.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -"@effect-app/eslint-shared-config": patch -"@effect-app/eslint-codegen-model": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -Cleanup after tsgolint + oxlint-codegen-plugin migration: - -- Wire `@effect-app/eslint-codegen-model/oxlint` via `jsPlugins` object form (`{ name: "codegen", specifier: ... }`) so the `codegen/codegen` rule key resolves. -- Drop `eslint-plugin-codegen` dep, patch, and `augmentedConfig` helper — codegen now runs through oxlint. -- Break cyclic workspace dep between `eslint-codegen-model` and `eslint-shared-config`; remove dead `eslint.config.mjs` from `eslint-codegen-model`. -- Switch `@effect-app/vue` to oxlint-only (no `.vue` files in `src`); drop its ESLint config and `eslint-shared-config` devDep. -- Restore `@typescript-eslint` plugin and rules in shared `baseConfig` so inline `eslint-disable @typescript-eslint/...` directives resolve in `@effect-app/vue-components` (the only remaining ESLint consumer, for `.vue` files). -- Add `globals.browser` to `vueConfig` so browser globals (`window`, `console`, `URL`, etc.) resolve. diff --git a/.changeset/clear-cycles-enjoy.md b/.changeset/clear-cycles-enjoy.md deleted file mode 100644 index ff5f43093..000000000 --- a/.changeset/clear-cycles-enjoy.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- - -update effect to latest beta diff --git a/.changeset/clever-breads-enter.md b/.changeset/clever-breads-enter.md deleted file mode 100644 index 41a139a79..000000000 --- a/.changeset/clever-breads-enter.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -fix request scope problems diff --git a/.changeset/clever-pets-follow.md b/.changeset/clever-pets-follow.md deleted file mode 100644 index 5e8281822..000000000 --- a/.changeset/clever-pets-follow.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -fix bs diff --git a/.changeset/cli-preserve-trailing-newline.md b/.changeset/cli-preserve-trailing-newline.md deleted file mode 100644 index 9ab097e6f..000000000 --- a/.changeset/cli-preserve-trailing-newline.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/cli": patch ---- - -preserve trailing newline when writing package.json files diff --git a/.changeset/cli-sync-no-tags.md b/.changeset/cli-sync-no-tags.md deleted file mode 100644 index 4ad0ab3d3..000000000 --- a/.changeset/cli-sync-no-tags.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/cli": patch ---- - -Prevent subtree sync commands from importing upstream git tags. diff --git a/.changeset/cli-ue-semver-target.md b/.changeset/cli-ue-semver-target.md deleted file mode 100644 index 35a7c55e2..000000000 --- a/.changeset/cli-ue-semver-target.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/cli": patch ---- - -Make `effa ue` update Effect and Effect App packages to the highest versions allowed by their existing semver ranges, including compatible prerelease updates. diff --git a/.changeset/client-fetch-property.md b/.changeset/client-fetch-property.md deleted file mode 100644 index d83dd4b70..000000000 --- a/.changeset/client-fetch-property.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@effect-app/vue": minor ---- - -Client entries are now plain objects; use `.fetch` to invoke the request. - -`client.Xxx` no longer is callable or an `Effect` itself. Call `client.Xxx.fetch(input)` (or `client.Xxx.fetch` for input-less requests) instead. `.mutate`, `.query`, `.suspense`, `.wrap`, and `.fn` are unchanged. diff --git a/.changeset/cluster-servicebus-notifications.md b/.changeset/cluster-servicebus-notifications.md deleted file mode 100644 index 2c0ba5b37..000000000 --- a/.changeset/cluster-servicebus-notifications.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Add Azure Service Bus topic notifications for persisted cluster storage polling. diff --git a/.changeset/codegen-rule-options.md b/.changeset/codegen-rule-options.md deleted file mode 100644 index b47bbd83c..000000000 --- a/.changeset/codegen-rule-options.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch ---- - -Allow oxlint codegen rule options so shared preset defaults can be configured. diff --git a/.changeset/cold-brooms-ski.md b/.changeset/cold-brooms-ski.md deleted file mode 100644 index e8ee195ab..000000000 --- a/.changeset/cold-brooms-ski.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Improve `deepToRaw` to support any root input type, correctly unwrap refs/computed values, and preserve collection/date shapes (`Array`, `Map`, `Set`, `Date`) while deeply removing Vue reactivity wrappers. diff --git a/.changeset/cold-rabbits-pay.md b/.changeset/cold-rabbits-pay.md deleted file mode 100644 index 29c55138e..000000000 --- a/.changeset/cold-rabbits-pay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -use uninterruptiple diff --git a/.changeset/command-button-optional-input.md b/.changeset/command-button-optional-input.md deleted file mode 100644 index 64c68eb33..000000000 --- a/.changeset/command-button-optional-input.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": minor ---- - -`CommandButton`: add `optionalInput` prop accepting `Option`. `Some` enables button and fires click with value; `None` disables. Use when input is gated by a `computed` rather than a `v-if` on the button. Also bind `:disabled` on the `` (previously only `aria-disabled`). diff --git a/.changeset/commander-state-toast-types.md b/.changeset/commander-state-toast-types.md deleted file mode 100644 index 264417ccb..000000000 --- a/.changeset/commander-state-toast-types.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Fix Commander combinator type inference for void Arg and withDefaultToast callbacks - -- Use `ArgForCombinator` helper to properly resolve `void` args to `undefined` in combinator positions, enabling correct type inference for `withDefaultToast` and other curried combinators -- Use explicit positional params in `withDefaultToast` options callbacks instead of rest spread, allowing users to omit trailing parameters diff --git a/.changeset/commander-stream-fn.md b/.changeset/commander-stream-fn.md deleted file mode 100644 index c67a54558..000000000 --- a/.changeset/commander-stream-fn.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -"@effect-app/vue": minor ---- - -Add `Command.streamFn` — a stream-backed variant of `Command.fn`. - -The body generator (or plain function) returns a `Stream` instead of an `Effect`. The command's `waiting` state stays `true` while the stream is running and updates the reactive `result` ref for every emitted value. - -Three handler shapes are accepted: - -1. **Generator returning a Stream** (primary): - ```ts - Command.streamFn("exportData")( - function*(arg, ctx) { - const token = yield* getAuthToken - return Stream.fromEffect(startExport(token, arg.id)).pipe( - Stream.flatMap((job) => pollProgress(job.id)) - ) - } - ) - ``` -2. Function returning a `Stream` directly. -3. Function returning `Effect` (unwrapped automatically). diff --git a/.changeset/common-schools-stop.md b/.changeset/common-schools-stop.md deleted file mode 100644 index ccf5fa437..000000000 --- a/.changeset/common-schools-stop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix more branded types diff --git a/.changeset/computed-projections-extensions.md b/.changeset/computed-projections-extensions.md deleted file mode 100644 index fdb45a612..000000000 --- a/.changeset/computed-projections-extensions.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Extend computed projections with additional relation operators: - -- `relation(path).every(op)` — boolean, all elements match the filter (compiled as `NOT EXISTS(... WHERE NOT (filter))`). -- `relation(path).distinctCount(field, op?)` — distinct count of values at `field` within the relation. -- `relation(path).sum(field, op?)` — numeric sum over a relation field. -- `relation(path).collect(field, op?)` / `collectDistinct(field, op?)` — collect values into an array (with optional dedup). - -All operators compile to native subqueries on SQL (sqlite/pg) and Cosmos, and to in-memory equivalents on the Memory store. diff --git a/.changeset/computed-projections-infra.md b/.changeset/computed-projections-infra.md deleted file mode 100644 index 903dbd32a..000000000 --- a/.changeset/computed-projections-infra.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Add computed projections for repository queries with adapter-level compilation for memory, SQL, and Cosmos stores. diff --git a/.changeset/concurrent-decode-helpers.md b/.changeset/concurrent-decode-helpers.md deleted file mode 100644 index 752b2d5f6..000000000 --- a/.changeset/concurrent-decode-helpers.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch -"@effect-app/cli": patch ---- - -Add concurrent decode helper APIs and migrate decode callsites to use them. - -- Add `withDefaultParseOptions` and keep `DefaultParseOptions` centralized. -- Export `decodeEffectConcurrently` and `decodeUnknownEffectConcurrently` from Schema and SchemaParser modules. -- Update repository, queue, client, form, and CLI decode paths to use concurrent decode helpers. -- Keep schema constructors free of hardcoded parse concurrency overrides. diff --git a/.changeset/config-nested-native.md b/.changeset/config-nested-native.md deleted file mode 100644 index 7d9cea505..000000000 --- a/.changeset/config-nested-native.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Remove the local `Config.nested` / `ConfigProvider.nested` overrides. They worked around an effect v3 bug where the nested namespace segment bypassed the provider's `mapInput`/`constantCase` transform. effect `4.0.0-beta.84` fixes this upstream (its transformation-compose refactor threads the nested prefix through the provider's lookup transform), and the old overrides relied on internals (`Config.make`, `provider.get`/`mapInput`/`prefix`) that no longer exist. Both modules now re-export effect directly; behaviour for consumers (e.g. `Config.nested("cups")` against a `constantCase` env provider) is unchanged and correct. diff --git a/.changeset/config.json b/.changeset/config.json index f246cc8e0..0a755e5f0 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -1,17 +1,53 @@ { - "$schema": "https://unpkg.com/@changesets/config@2.2.0/schema.json", - "changelog": "@changesets/cli/changelog", + "$schema": "https://unpkg.com/@changesets/config@4.0.0-next.8/schema.json", + "changelog": ["@changesets/changelog-github", { "repo": "Effect-TS/effect" }], "commit": false, + "format": false, + "linked": [], + "access": "restricted", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [ + "scratchpad", + "scripts" + ], + "privatePackages": false, "fixed": [ [ - "effect-app", - "@effect-app/infra", - "@effect-app/vue", - "@effect-app/vue-components" + "effect", + "@effect/ai-anthropic", + "@effect/ai-openai", + "@effect/ai-openai-compat", + "@effect/ai-openrouter", + "@effect/atom-react", + "@effect/atom-solid", + "@effect/atom-vue", + "@effect/docgen", + "@effect/doctest", + "@effect/openapi-generator", + "@effect/opentelemetry", + "@effect/platform-browser", + "@effect/platform-bun", + "@effect/platform-deno", + "@effect/platform-node", + "@effect/platform-node-shared", + "@effect/sql-clickhouse", + "@effect/sql-d1", + "@effect/sql-libsql", + "@effect/sql-mssql", + "@effect/sql-mysql2", + "@effect/sql-pg", + "@effect/sql-pglite", + "@effect/sql-sqlite-bun", + "@effect/sql-sqlite-do", + "@effect/sql-sqlite-node", + "@effect/sql-sqlite-react-native", + "@effect/sql-sqlite-wasm", + "@effect/vitest" ] ], - "linked": [], - "access": "public", - "baseBranch": "main", - "updateInternalDependencies": "patch" + "snapshot": { + "useCalculatedVersion": false, + "prereleaseTemplate": "{tag}-{commit}" + } } diff --git a/.changeset/configurable-barrel-import-extension.md b/.changeset/configurable-barrel-import-extension.md deleted file mode 100644 index 68fe4c1da..000000000 --- a/.changeset/configurable-barrel-import-extension.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": minor ---- - -Add `importExtension` option to the `barrel` preset to control the file extension emitted on generated imports/exports (defaults to `.js`). Configurable per block, globally via the oxlint rule option `["error", { barrel: { importExtension: ".ts" } }]`, or via `codegen.config.json` (CLI also accepts `--config `). Resolution order: preset default → global defaults → per-block options. diff --git a/.changeset/configurable-mutation-invalidation.md b/.changeset/configurable-mutation-invalidation.md deleted file mode 100644 index 50e94fa19..000000000 --- a/.changeset/configurable-mutation-invalidation.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -"@effect-app/vue": minor ---- - -Make the default mutation invalidation heuristic configurable. - -The built-in default is unchanged (collapse one namespace level: `Foo/Bar.x` invalidates `["$Foo"]`, `Foo/Bar/Baz.x` invalidates `["$Foo","$Bar"]`). Client projects can now override it globally: - -```ts -import { makeQueryKey, setDefaultGetQueryKey } from "@effect-app/vue" - -// invalidate the full namespace of the action (no parent collapse) -setDefaultGetQueryKey((h) => { - const key = makeQueryKey(h) - const ns = key.filter((_) => _.startsWith("$")) - if (!ns.length) throw new Error("empty query key for: " + h.id) - return ns -}) -``` - -Call at app bootstrap. Pass `undefined` to restore the built-in default. Per-mutation overrides via the existing `queryInvalidation` option still take precedence. diff --git a/.changeset/context-map-resolver-cache.md b/.changeset/context-map-resolver-cache.md deleted file mode 100644 index cb932fa44..000000000 --- a/.changeset/context-map-resolver-cache.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Add `withRequestResolverCache` to scope RequestResolver cache to the ContextMap (request-scoped). Add `getOrCreateStore` to ContextMap for generic scoped storage. diff --git a/.changeset/cool-needles-wash.md b/.changeset/cool-needles-wash.md deleted file mode 100644 index 79bc5b986..000000000 --- a/.changeset/cool-needles-wash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": minor ---- - -chore: update @tanstack/vue-form to version 1.32.0 and refactor OmegaTaggedUnion component to use 'tag' instead of 'state' diff --git a/.changeset/core-boundary-split.md b/.changeset/core-boundary-split.md deleted file mode 100644 index 34386436a..000000000 --- a/.changeset/core-boundary-split.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"effect-app": minor -"@effect-app/infra": major -"@effect-app/vue": minor ---- - -Move core service contracts and runtime-agnostic modules into `effect-app`, keep `infra` and `vue` focused on adapters, and drop the temporary `infra` compatibility re-export paths in favor of the new canonical imports. - -`@effect-app/infra` no longer re-exports moved core modules such as `./Model`, `./Emailer/service`, `./QueueMaker/service`, `./Store/service`, `./adapters/*`, or `./api/*` entrypoints. diff --git a/.changeset/cosmos-cluster-occ-tests.md b/.changeset/cosmos-cluster-occ-tests.md deleted file mode 100644 index 700a8e83e..000000000 --- a/.changeset/cosmos-cluster-occ-tests.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Tighten Cosmos cluster OCC handling for concurrent node polling. diff --git a/.changeset/cosmos-every-param-shift.md b/.changeset/cosmos-every-param-shift.md deleted file mode 100644 index 9d117caf5..000000000 --- a/.changeset/cosmos-every-param-shift.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix Cosmos `projectComputed` parameter index shift when `relation(...).every(...)` is present. The shared filter `print` was invoked twice per `relation-every` (once eagerly for the `where` variable, again inside the `NOT EXISTS(... WHERE NOT (...))` branch), bumping the outer `@v` counter beyond the bound parameter array and producing SQL that referenced unbound placeholders — queries returned 0 rows on Cosmos while SQLite/Memory adapters were unaffected. diff --git a/.changeset/cosmos-filter-seed.md b/.changeset/cosmos-filter-seed.md deleted file mode 100644 index 989ba7388..000000000 --- a/.changeset/cosmos-filter-seed.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix CosmosDB store `filter` to trigger namespace seeding on first access. Previously, if `filter` was the first operation called on a namespace, seed data was never created. diff --git a/.changeset/cosmos-namespace-spans.md b/.changeset/cosmos-namespace-spans.md deleted file mode 100644 index f8da1f307..000000000 --- a/.changeset/cosmos-namespace-spans.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Add span to Cosmos `batchRemove` and include `namespace` attribute on all Cosmos store spans. diff --git a/.changeset/cosmos-namespace-support.md b/.changeset/cosmos-namespace-support.md deleted file mode 100644 index 296f62a4a..000000000 --- a/.changeset/cosmos-namespace-support.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Add storage namespace support to CosmosDB adapter via partition key prefixing. When `allowNamespace` is configured, the namespace from `storeId` is prepended to partition key values (e.g., `test-ns::primary`), isolating data per namespace within the same container. diff --git a/.changeset/cosmos-span-response-size.md b/.changeset/cosmos-span-response-size.md deleted file mode 100644 index 3787b60ff..000000000 --- a/.changeset/cosmos-span-response-size.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Annotate Cosmos read spans with response size, resource count, and request charge. - -`Cosmos.queryRaw`, `Cosmos.all`, `Cosmos.filter`, and `Cosmos.find` now set `db.cosmos.request_charge`, `db.cosmos.response_bytes`, and (where applicable) `db.cosmos.resource_count` on the active span. Bytes are sourced from `diagnostics.clientSideRequestStatistics.totalResponsePayloadLengthInBytes` — no payload stringification. diff --git a/.changeset/cosmos-workflow-engine.md b/.changeset/cosmos-workflow-engine.md deleted file mode 100644 index 07d029166..000000000 --- a/.changeset/cosmos-workflow-engine.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Add Cosmos DB backed `WorkflowEngine` adapter (`layerCosmos` in `WorkflowEngineCosmos.ts`). Persists workflow state in a single container partitioned by `executionId` so per-execution writes share a partition key (TransactionalBatch-eligible). Optimistic concurrency via `_etag` + `IfMatch` on Replace; first-writer-wins via create-only batch ops for activity results and durable-deferred completions; a persisted *suspended* activity is overwritten via upsert on resume. Values crossing the storage boundary round-trip through `Schema` codecs (`S.fromJsonString(S.toCodecJson(...))`) using the workflow's own `payloadSchema` / `successSchema` / `errorSchema` for typed values, and the cluster engine's opaque `AnyOrVoid` codec for activity / deferred payloads. Includes time-bound lease + heartbeat fiber, scope-bound recovery poller for crashed-driver takeover, and cross-partition clock poller for restart-survivable durable timers. diff --git a/.changeset/cozy-cats-lie.md b/.changeset/cozy-cats-lie.md deleted file mode 100644 index 0b55ecb06..000000000 --- a/.changeset/cozy-cats-lie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -doc span diff --git a/.changeset/crisp-seals-care.md b/.changeset/crisp-seals-care.md deleted file mode 100644 index 8ecdea9fd..000000000 --- a/.changeset/crisp-seals-care.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch -"@effect-app/eslint-shared-config": patch -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- - -Beta25 diff --git a/.changeset/crisp-trees-smash.md b/.changeset/crisp-trees-smash.md deleted file mode 100644 index 43f67359d..000000000 --- a/.changeset/crisp-trees-smash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -cleanup diff --git a/.changeset/ctxmap-per-request-memomap.md b/.changeset/ctxmap-per-request-memomap.md deleted file mode 100644 index 6cf5beab8..000000000 --- a/.changeset/ctxmap-per-request-memomap.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix `provideOnRequestScope` leaking a single `ContextMap` across concurrent requests. - -`Layer.buildWithScope(layer, requestScope)` resolves its `MemoMap` from the -ambient fiber context, which lives on the HTTP server fiber and is therefore -shared by every request that server handles. With the resulting memoization, -the first request to land on a freshly-started server built -`ContextMapContainer.layer` once; every subsequent overlapping request received -the same `ContextMap` instance — etags written by one request were observed -(or overwritten) by another, and the finalizer was anchored to the first -request's scope. - -`provideOnRequestScope` now allocates a fresh `MemoMap` per call via -`Layer.makeMemoMap` and builds with `Layer.buildWithMemoMap(layer, memoMap, -requestScope)`. Each request gets its own `ContextMap`, the request-scope -binding from the earlier SSE fix is preserved, and the finalizer still only -fires once the response body has fully drained. - -Adds regression coverage in `rpc-context-map-streaming.test.ts` for three -properties: mid-stream survival of ContextMap state, a fresh map on each -succeeding request, and isolation between overlapping concurrent requests. diff --git a/.changeset/cuddly-laws-smell.md b/.changeset/cuddly-laws-smell.md deleted file mode 100644 index aeef529ec..000000000 --- a/.changeset/cuddly-laws-smell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Use warning toasts for expected commander failures, while keeping unexpected errors as error toasts. diff --git a/.changeset/cups-error-tagged.md b/.changeset/cups-error-tagged.md deleted file mode 100644 index b84f4058e..000000000 --- a/.changeset/cups-error-tagged.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Wrap `CUPS` exec failures in tagged `CUPSError` instead of `UnknownException`. - -Retains `command`, `message`, exit `code`, `signal`, `killed`, `stdout`, -`stderr`, and original `cause` from the underlying `child_process.exec` -rejection so callers can branch on real failure detail. diff --git a/.changeset/curly-beds-sing.md b/.changeset/curly-beds-sing.md deleted file mode 100644 index bf39e86ea..000000000 --- a/.changeset/curly-beds-sing.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Use request-type RPC annotations to drive interruptibility and retry behavior, apply command uninterruptibility through the router wrapper path, and add an in-memory E2E test covering command vs query interruption behavior. diff --git a/.changeset/curly-dolls-double.md b/.changeset/curly-dolls-double.md deleted file mode 100644 index 68be424ab..000000000 --- a/.changeset/curly-dolls-double.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -OmegaForm now runs field validation in ordered composition: OmegaForm-generated field rules first, then original schema checks. This makes custom schema filters (for example `S.makeFilter` checks) show during `onChange`/`onBlur` while preserving existing OmegaForm validation behavior and messages. diff --git a/.changeset/curvy-files-share.md b/.changeset/curvy-files-share.md deleted file mode 100644 index 953189ac0..000000000 --- a/.changeset/curvy-files-share.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -revert bs diff --git a/.changeset/curvy-pugs-rush.md b/.changeset/curvy-pugs-rush.md deleted file mode 100644 index 5bc6684cc..000000000 --- a/.changeset/curvy-pugs-rush.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix `Repository.query` environment typing to exclude schema context provided through `makeRepo` options. diff --git a/.changeset/cyan-experts-smoke.md b/.changeset/cyan-experts-smoke.md deleted file mode 100644 index c1646a383..000000000 --- a/.changeset/cyan-experts-smoke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -render diff --git a/.changeset/cyan-pianos-peel.md b/.changeset/cyan-pianos-peel.md deleted file mode 100644 index 97bbec1ce..000000000 --- a/.changeset/cyan-pianos-peel.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -fix stream type when no success specified diff --git a/.changeset/cyan-things-train.md b/.changeset/cyan-things-train.md deleted file mode 100644 index 27ca86655..000000000 --- a/.changeset/cyan-things-train.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix missing overloads diff --git a/.changeset/date-defaults-pipe-self.md b/.changeset/date-defaults-pipe-self.md deleted file mode 100644 index f66426fbc..000000000 --- a/.changeset/date-defaults-pipe-self.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"effect-app": patch ---- - -Fix `Date` / `DateValid` default helpers to pipe from their own schema. - -`withConstructorDefault` and `withDecodingDefaultType` on `DateValid` previously piped from `DateFromString`, dropping the `isDateValid()` check (and, after the recent identifier split, the `DateValid` annotations) from the resulting defaulted schema. Both `Date` and `DateValid` now use `extendM` so the helpers attach to the underlying schema (`DateFromString` / `DateValidFromString`). diff --git a/.changeset/date-identifier-split.md b/.changeset/date-identifier-split.md deleted file mode 100644 index fc385516d..000000000 --- a/.changeset/date-identifier-split.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"effect-app": patch ---- - -Distinguish `Date` and `DateValid` in JSON Schema output. - -- `Date` now emits identifier `DateOrInvalid` with description noting the value may be invalid. -- `DateValid` now emits its own annotated string (identifier `Date`) with description stating a valid ISO 8601 date is required. diff --git a/.changeset/delay-waiting-toast.md b/.changeset/delay-waiting-toast.md deleted file mode 100644 index 64ab53079..000000000 --- a/.changeset/delay-waiting-toast.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Delay the in-progress (waiting) toast by 1 second in `withToast` and `withDefaultToastStream`. Fast operations that produce a success/failure (or, for streams, a progress event or terminal state) within the delay window never show a waiting toast at all. Any subsequent waiting/progress/success/failure toast aborts the pending delayed toast so it never flashes after the terminal state. diff --git a/.changeset/disable-query-invalidation.md b/.changeset/disable-query-invalidation.md deleted file mode 100644 index 812ede95f..000000000 --- a/.changeset/disable-query-invalidation.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -"effect-app": minor -"@effect-app/vue": minor ---- - -Add `disableQueryInvalidation` flag to Command config for background saves. - -Set `disableQueryInvalidation: true` in a `Req.Command` config (3rd argument) -to suppress all client-side query invalidation for that command — client -`invalidatesQueries` callbacks, server-returned `metadata.invalidateQueries`, -and repository-derived write-dependency matching are all skipped. Use for -background saves (e.g. debounced auto-save) whose writes should not trigger -query refetches. - -- `InvalidationConfig` gains `disableQueryInvalidation?: boolean`. -- `RequestHandlerWithInput` gains `disableQueryInvalidation?: boolean`, - propagated from `Request.config` by `ApiClientFactory.makeFor`. -- `invalidateCache` early-returns `Effect.void` when the flag is set, - applying to both regular and stream mutations. diff --git a/.changeset/document-query-project-modes.md b/.changeset/document-query-project-modes.md deleted file mode 100644 index 176eb516e..000000000 --- a/.changeset/document-query-project-modes.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Document `Q.project` modes (`transform` / `project` / `collect`): how `select` is derived from the schema AST, the PM reverse-mapping behaviour per mode, and which decode errors surface vs `orDie`. diff --git a/.changeset/drop-constructor-default.md b/.changeset/drop-constructor-default.md deleted file mode 100644 index 41cdd1ccb..000000000 --- a/.changeset/drop-constructor-default.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"effect-app": patch ---- - -Add `Schema.dropConstructorDefault`, a `Struct.Lambda` that clears a field's `withConstructorDefault`. Compose it with `Struct.omit`/`Struct.map` when deriving a partial-update schema from a "create" schema, so omitted fields' constructor defaults don't resurrect themselves in `.make(...)` output. - -Also, `makeExactOptional` now drops constructor defaults automatically, matching this behavior. diff --git a/.changeset/easy-aliens-peel.md b/.changeset/easy-aliens-peel.md deleted file mode 100644 index 8db9c8e07..000000000 --- a/.changeset/easy-aliens-peel.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch -"@effect-app/eslint-shared-config": patch -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- - -update packages diff --git a/.changeset/easy-spiders-study.md b/.changeset/easy-spiders-study.md deleted file mode 100644 index 1addf28df..000000000 --- a/.changeset/easy-spiders-study.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix: clientFor diff --git a/.changeset/effa-sync-shared.md b/.changeset/effa-sync-shared.md deleted file mode 100644 index 8a0f1b666..000000000 --- a/.changeset/effa-sync-shared.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -"@effect-app/cli": minor ---- - -Add `effa sync` / `effa sync-diff` / `effa sync-push` subcommands for syncing content (architecture docs, e2e helpers, ts-plugins) from `effect-app/shared` into consuming projects per a project-side `.shared.json` lockfile. - -- `effa sync` — clone/checkout the shared repo at the pinned ref into `~/.cache/effa/shared/`, then copy the artifact map's files into the project (honoring `exclude`). -- `effa sync-diff` — sha256 compare each tracked file against the cache copy; reports `M` (modified locally), `D` (missing from project), `E` (excluded). -- `effa sync-push [--pr] [-m msg] [--branch name]` — branch in the cache off the pinned ref, copy modified project files in, commit, push. Optional `--pr` opens a PR via `gh pr create`. - -Lockfile shape: - -```json -{ - "repo": "github.com/effect-app/shared", - "ref": "", - "artifacts": { "": "" }, - "exclude": [""] -} -``` diff --git a/.changeset/effa-sync-update-flag.md b/.changeset/effa-sync-update-flag.md deleted file mode 100644 index dd4e975e9..000000000 --- a/.changeset/effa-sync-update-flag.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/cli": patch ---- - -Add `effa sync --update [--ref ]` to bump the pinned `ref` in `.shared.json` to the latest sha before syncing. Without `--ref` it resolves the shared repo's default branch HEAD; with `--ref` it resolves that ref (branches resolved against `origin/` so you get the latest remote commit). The resolved sha is written back to the lockfile. Omitting `--update` keeps the existing pin-and-sync behaviour. diff --git a/.changeset/effect-app-prefer-fn-untraced.md b/.changeset/effect-app-prefer-fn-untraced.md deleted file mode 100644 index ef141255c..000000000 --- a/.changeset/effect-app-prefer-fn-untraced.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Replace `(...) => Effect.gen` with `Effect.fnUntraced` in `apiClientFactory`. diff --git a/.changeset/effect-main-rc-apis.md b/.changeset/effect-main-rc-apis.md deleted file mode 100644 index fee3fcdd4..000000000 --- a/.changeset/effect-main-rc-apis.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -"effect-app": patch -"@effect-app/cli": patch ---- - -Upgrade Effect packages to `4.0.0-rc.114` (core `effect` via pkg.pr.new at `cdb3ac91` until npm publishes that version). Also bump independently versioned `@effect/language-service` to `0.87.2` and `@effect/tsgo` to `0.45.0` (requires `oxlint` `1.82.0`). - -Breaking API updates from this RC: - -- PascalCase Config/CLI constructors (`Config.String`, `Flag.File`, `Config.NonEmptyString`, `Config.Redacted`, `Config.Literal`) -- `Config.Record` now returns a Config -- Schema `toArbitrary` (fast-check) replaced by native `effect/unstable/arbitrary` -- `SchemaTransformation.transformOrFail` renamed to `transformEffect` -- `Fiber.currentSpan` moved to `fiber.cache.span` -- HTTP server addresses are `InetAddressV4`/`InetAddressV6` instead of `TcpAddress` -- Object JSON Schema now emits `additionalProperties: true` -- Schema `Union` AST stores matching as `options.mode` instead of `mode` diff --git a/.changeset/eighty-aliens-hide.md b/.changeset/eighty-aliens-hide.md deleted file mode 100644 index 36e346779..000000000 --- a/.changeset/eighty-aliens-hide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -fix conversion diff --git a/.changeset/eighty-signs-smile.md b/.changeset/eighty-signs-smile.md deleted file mode 100644 index 02133b538..000000000 --- a/.changeset/eighty-signs-smile.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix type make interface diff --git a/.changeset/eleven-eyes-lie.md b/.changeset/eleven-eyes-lie.md deleted file mode 100644 index 4b0d8cac3..000000000 --- a/.changeset/eleven-eyes-lie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -update diff --git a/.changeset/empty-queens-begin.md b/.changeset/empty-queens-begin.md deleted file mode 100644 index 64f54460e..000000000 --- a/.changeset/empty-queens-begin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix: prevent expansion of nominal brands diff --git a/.changeset/empty-rules-check.md b/.changeset/empty-rules-check.md deleted file mode 100644 index 57d63a3f9..000000000 --- a/.changeset/empty-rules-check.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -remove unnecessary span? diff --git a/.changeset/eslint-codegen-glob-11.md b/.changeset/eslint-codegen-glob-11.md deleted file mode 100644 index f2e7e8ab9..000000000 --- a/.changeset/eslint-codegen-glob-11.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch ---- - -Migrate `glob` 8 → 11. Use the named `globSync` export (glob 11 dropped the default export, which broke loading the package as an ESM oxlint plugin), and drop the stale `@types/glob` (glob 11 ships its own types). Also clears the package's pre-existing implicit-`any` typecheck errors. diff --git a/.changeset/expose-make-on-query-command.md b/.changeset/expose-make-on-query-command.md deleted file mode 100644 index 048fdd196..000000000 --- a/.changeset/expose-make-on-query-command.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Expose `make`, `makeOption`, and `makeEffect` static helpers on request classes created via `Query`/`Command`. diff --git a/.changeset/extract-fixed-nuxt-error-boundary.md b/.changeset/extract-fixed-nuxt-error-boundary.md deleted file mode 100644 index 8e4955146..000000000 --- a/.changeset/extract-fixed-nuxt-error-boundary.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Add `FixedNuxtErrorBoundary`, extracted from duplicated per-project copies. Wraps Nuxt's error boundary with injectable `captureException`/`toastError`/`debug` props, distinguishes supported errors (setup/template) from unsupported ones (native event handlers, reported but not rendered), ignores interrupts-only Effect `CauseException` failures, and clears itself on route change. diff --git a/.changeset/facade-hardening-error-facade.md b/.changeset/facade-hardening-error-facade.md deleted file mode 100644 index 8d051177d..000000000 --- a/.changeset/facade-hardening-error-facade.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -"effect-app": patch -"@effect-app/eslint-codegen-model": patch ---- - -Harden model facades and add `OpaqueErrorFacadeClass`. - -- `OpaqueErrorFacadeClass`: facade `TaggedErrorClass`/`ErrorClass` while keeping - `Cause.YieldableError` on the constructed instance (so `yield* new Err()`, - `Effect.fail`, and `instanceof` keep working through the facade). -- `OpaqueFacadeInput` relaxed to require only the codec service channels, so - transformed schemas (`.pipe(encodeKeys/annotate/filter/...)`) can be facaded; - `fields`/`copy`/`mapFields` flow through `OpaqueFacadeStatics` when present, and - `to` is carried so models that compose via `X.to.fields` keep working. -- Dropped the wide `fields`/`mapFields` overrides on the facade interfaces so the - precise statics win (keeps `Q.project(X.mapFields(...))` typed). -- Codegen (`eslint-codegen-model`): resolver prefers the private `_X` over the - self-referential facade; converges static service types in one run; per-model - classification (facade Opaque models, leave `Class` standard in mixed files); - `Make` emitted as `type X = {...} | void` when the make-input is voidable; - `readonly`-prefixed array/tuple elements parenthesized; value self-references in - the moved `_X` body rewritten to `_X`; instance getters surface on `Self`. diff --git a/.changeset/fair-baboons-marry.md b/.changeset/fair-baboons-marry.md deleted file mode 100644 index ffc987772..000000000 --- a/.changeset/fair-baboons-marry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Migrate schema arbitrary annotations to Effect v4 `toArbitrary` and cover `StringId` generation with a fast-check test. diff --git a/.changeset/fair-oranges-wave.md b/.changeset/fair-oranges-wave.md deleted file mode 100644 index 6ddb19327..000000000 --- a/.changeset/fair-oranges-wave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Preserve Struct.copy through `annotate`, `annotateKey`, and `mapFields` chains, and add tests covering chained copy behavior on Struct schemas. diff --git a/.changeset/fair-tables-march.md b/.changeset/fair-tables-march.md deleted file mode 100644 index 6b2447654..000000000 --- a/.changeset/fair-tables-march.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -fix SSE event stream merge in pipe usage diff --git a/.changeset/famous-plums-watch.md b/.changeset/famous-plums-watch.md deleted file mode 100644 index 33f059b07..000000000 --- a/.changeset/famous-plums-watch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Fixes Redacted casting diff --git a/.changeset/fancy-ducks-run.md b/.changeset/fancy-ducks-run.md deleted file mode 100644 index fc4ccf31a..000000000 --- a/.changeset/fancy-ducks-run.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -fix queryresources diff --git a/.changeset/fast-loops-scream.md b/.changeset/fast-loops-scream.md deleted file mode 100644 index 0b165758e..000000000 --- a/.changeset/fast-loops-scream.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Fixes error handling diff --git a/.changeset/fiery-feet-sleep.md b/.changeset/fiery-feet-sleep.md deleted file mode 100644 index e8da517dd..000000000 --- a/.changeset/fiery-feet-sleep.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix type diff --git a/.changeset/fiery-suits-kneel.md b/.changeset/fiery-suits-kneel.md deleted file mode 100644 index 302af0508..000000000 --- a/.changeset/fiery-suits-kneel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -workaround effect error messages diff --git a/.changeset/five-trams-repeat.md b/.changeset/five-trams-repeat.md deleted file mode 100644 index 0e00fe7c9..000000000 --- a/.changeset/five-trams-repeat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix bs diff --git a/.changeset/fix-class-type-export.md b/.changeset/fix-class-type-export.md deleted file mode 100644 index 2f2b0f7ad..000000000 --- a/.changeset/fix-class-type-export.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": minor ---- - -Add `copy` property to `Class` and `TaggedClass` for creating modified instances with updated fields. The `copy` method is cached per-class and supports both object and function-based updates, with pipeline support. diff --git a/.changeset/fix-cli-gist-cache-id.md b/.changeset/fix-cli-gist-cache-id.md deleted file mode 100644 index 7ff26aabf..000000000 --- a/.changeset/fix-cli-gist-cache-id.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/cli": patch ---- - -Require an explicit `EFFA_GIST_CACHE_ID`, remove cache Gist discovery and automatic creation, and initialize missing company pointer files once. diff --git a/.changeset/fix-client-input-stream.md b/.changeset/fix-client-input-stream.md deleted file mode 100644 index a42f7e072..000000000 --- a/.changeset/fix-client-input-stream.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Fix `client[Key].Input` resolving to `never` for stream request handlers. The extractor only matched `RequestHandlerWithInput`, so any `RequestStreamHandlerWithInput` entry fell through to the `never` branch. Added a parallel `RequestStreamHandlerWithInput` extract so stream Inputs surface the handler's input type. diff --git a/.changeset/fix-contextmap-leak.md b/.changeset/fix-contextmap-leak.md deleted file mode 100644 index 5a57edfe5..000000000 --- a/.changeset/fix-contextmap-leak.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix `ContextMap` memory leak: tie its lifecycle to the request scope. - -`ContextMapContainer.layer` provides a fresh `ContextMap` per request via `Layer.effect`, but the inner `etags` and `store` maps were never released. Cached `RequestResolver` entries (and anything they closed over) stayed reachable as long as any fiber held a reference to the map, even after the request scope closed. - -`ContextMap` is now built with `Effect.acquireRelease`, and `makeContextMap` exposes a `clear()` finalizer that empties both maps when the request scope closes. `Layer.effect` strips the `Scope` requirement automatically in Effect v4. diff --git a/.changeset/fix-cosmos-cluster-deferred.md b/.changeset/fix-cosmos-cluster-deferred.md deleted file mode 100644 index 3cc53e00f..000000000 --- a/.changeset/fix-cosmos-cluster-deferred.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix Cosmos cluster workflow resume after durable deferred completion. diff --git a/.changeset/fix-cosmos-cluster-machineid.md b/.changeset/fix-cosmos-cluster-machineid.md deleted file mode 100644 index 74fafadd6..000000000 --- a/.changeset/fix-cosmos-cluster-machineid.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix machine-id allocation in the Cosmos cluster `RunnerStorage`. It derived the machine id from a 31-multiplier string hash of the runner address, so two distinct runners could hash to the same value mod 1024 — and since the machine id feeds the Snowflake generator mod 1024, those runners would emit colliding Snowflake ids (corrupting request/reply identity across the cluster). - -Machine ids are now allocated from a single counter document via an atomic server-side `incr`, mirroring SQL's auto-increment `machine_id` primary key: unique across distinct runners and stable per address (a re-registering runner reuses its persisted id). Verified against a live Cosmos account. diff --git a/.changeset/fix-cosmos-workflow-engine.md b/.changeset/fix-cosmos-workflow-engine.md deleted file mode 100644 index 1fe5da8d7..000000000 --- a/.changeset/fix-cosmos-workflow-engine.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix correctness bugs in the Cosmos `WorkflowEngine`, found by running the adapter against a real Cosmos account. The Cosmos workflow engine now passes the same conformance suite as the in-memory and SQLite engines. - -- **OCC conflicts were fatal.** `replaceExec` used `Effect.promise` + a `statusCode` check, but single-item Cosmos `replace` *throws* on 409/412/404 (only `read` and batch ops surface the code), so every conflict became an unrecoverable defect and the `OptimisticConcurrencyException` catch was dead code. It now uses `Effect.tryPromise` and matches the thrown error (mirrors `ClusterCosmos`), so lease claims, completions, and interrupts lose gracefully under contention. -- **Illegal resource ids.** Activity/deferred/clock doc ids embedded workflow/deferred names containing `/`, which Cosmos rejects. Ids are now URI-encoded via `cosmosId` (mirrors `ClusterCosmos`). -- **Interrupt could be lost under Cosmos latency.** A concurrent `interrupt` racing a suspending driver's `onComplete` could have its `interrupted` flag swallowed (OCC) or downgraded, leaving the re-drive unable to collapse the suspension. `interrupt`/`interruptUnsafe` now persist the flag with OCC retry (`markInterrupted`), and `onComplete` never downgrades a persisted `interrupted: true`. -- **`execute` now drives unconditionally** (matching SQLite), letting `drive`'s own guard short-circuit a running/completed fiber and re-drive a suspended one, instead of skipping re-drive when a stale local entry existed. diff --git a/.changeset/fix-is-generator-function.md b/.changeset/fix-is-generator-function.md deleted file mode 100644 index 67db4cd7f..000000000 --- a/.changeset/fix-is-generator-function.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/vue": patch ---- - -Fix `isGeneratorFunction` using `isObject` instead of `isFunction`: generator functions have `typeof === "function"`, not `"object"`, so the check always returned `false`. This caused `Command.streamFn` generator-form handlers to silently pass a raw `Generator` object rather than an `Effect`, meaning the mutation was never executed. diff --git a/.changeset/fix-json-schema-annotations.md b/.changeset/fix-json-schema-annotations.md deleted file mode 100644 index 65946a1e3..000000000 --- a/.changeset/fix-json-schema-annotations.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Fix JSON schema output for Email, Date, PhoneNumber, and Url schemas. The `jsonSchema` annotation key is not recognized by Effect v4's JSON schema generator — use proper v4 annotations (`format`, `description`) and built-in checks (`isMinLength`, `isMaxLength`) instead. diff --git a/.changeset/fix-jsonschema-postprocess.md b/.changeset/fix-jsonschema-postprocess.md deleted file mode 100644 index 025ef165e..000000000 --- a/.changeset/fix-jsonschema-postprocess.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix: flatten simple allOf constraints in JSON Schema output for better codegen compatibility diff --git a/.changeset/fix-onedsl-r-inference.md b/.changeset/fix-onedsl-r-inference.md deleted file mode 100644 index 5077b1cb7..000000000 --- a/.changeset/fix-onedsl-r-inference.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix `R` inference in `OneDSL`, `OneDSLExt.modify` and `OneDSLExt.update`. The callback's effect type was annotated as `Effect<…, E, FixEnv>`, which deadlocked inference of `R` (TS6 fell back to `never`, tsgo to `unknown`, leaking `unknown` into yielded effects in generator handlers). Now matches the existing `AllDSLExt` pattern: bare `R` in the callback, `FixEnv` only in the return type. diff --git a/.changeset/fix-pascalcase-barrel.md b/.changeset/fix-pascalcase-barrel.md deleted file mode 100644 index f1b18d187..000000000 --- a/.changeset/fix-pascalcase-barrel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch ---- - -Fix `toCamelCase`/`toPascalCase` in barrel preset to preserve case boundaries. Mixed-case input like `AnCamelCase` was collapsed to `Ancamelcase` because the word splitter only matched contiguous alphanumerics. Now splits on case transitions (matching prior `lodash.camelCase` + `startCase` behavior). diff --git a/.changeset/fix-path-recursive-index-signature.md b/.changeset/fix-path-recursive-index-signature.md deleted file mode 100644 index 52372a3d1..000000000 --- a/.changeset/fix-path-recursive-index-signature.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"effect-app": patch ---- - -Fix `TS2589: Type instantiation is excessively deep and possibly infinite` when querying models that embed `Schema.Defect()` (or any field encoded as `Json`). - -The query path type `Path` (used by `Q.where`/`Q.and`/`Q.order` to type dotted field paths) recursed through object types with no termination for self-referential ones. Under effect `4.0.0-beta.83`, `Schema.Defect()` encodes as `Json`, whose `JsonObject = { readonly [x: string]: Json }` index signature made `Path` descend forever, blowing past TypeScript's instantiation limit on any model with such a field (e.g. carrier-error states carrying `raw: Schema.Defect()`). - -`Path` now threads a `Seen` set of already-entered object types and stops before re-entering one, so self-referential types terminate (the field itself stays a valid leaf path; only the unbounded descent is cut). Finite models are unaffected. diff --git a/.changeset/fix-project-encodekeys-selection.md b/.changeset/fix-project-encodekeys-selection.md deleted file mode 100644 index 9ed42dc71..000000000 --- a/.changeset/fix-project-encodekeys-selection.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix `Q.project` field selection with `Schema.encodeKeys` by deriving selected fields from the encoded schema shape. diff --git a/.changeset/fix-projection-union-adapter.md b/.changeset/fix-projection-union-adapter.md deleted file mode 100644 index 176b7e76c..000000000 --- a/.changeset/fix-projection-union-adapter.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Fix projection schema typing for union members and computed projections. diff --git a/.changeset/fix-repo-transformed-id-union.md b/.changeset/fix-repo-transformed-id-union.md deleted file mode 100644 index d627fa1ee..000000000 --- a/.changeset/fix-repo-transformed-id-union.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix repository `find` with transformed id fields in tagged union schemas diff --git a/.changeset/fix-repo-transformed-id.md b/.changeset/fix-repo-transformed-id.md deleted file mode 100644 index e706af004..000000000 --- a/.changeset/fix-repo-transformed-id.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix repository `find` with transformed id fields (e.g. composite ids using `decodeTo`) diff --git a/.changeset/fix-resolver-cache-precheck.md b/.changeset/fix-resolver-cache-precheck.md deleted file mode 100644 index 8782fcafe..000000000 --- a/.changeset/fix-resolver-cache-precheck.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix `withRequestResolverCache` causing "RequestResolver did not complete request" errors by using the `preCheck` hook instead of handling cache in `runAll`. Cache hits for in-flight or completed requests are now handled before entries enter the batch, preventing uncompleted entries. diff --git a/.changeset/fix-schema-interface-widening.md b/.changeset/fix-schema-interface-widening.md deleted file mode 100644 index c0a3a764e..000000000 --- a/.changeset/fix-schema-interface-widening.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"effect-app": patch ---- - -Fix schema interface widening regression introduced in 4.0.0-beta.255 (changeset `olive-onions-lose`). - -The original refactor annotated branded schema constants with interfaces extending `S.Codec & WithDefaults<...>`. That widened the underlying `BrandedSchema<...>` chain and dropped phantom slots (`Iso`, `~type.make.in`, `~type.parameters`, `Rebuild`, etc.) that downstream combinators read. In consumer projects this surfaced as `DecodingServices` / `EncodingServices` leaking as `unknown` — for example `Q.project(schema, "project")` failing with `Type 'unknown' is not assignable to type 'never'`, and RPC handler / generator-return shape mismatches against `Effect`. - -Each `*Schema` interface now extends the concrete underlying chain (e.g. `BrandedSchema`) and adds a call signature for `withDefaultMake` (and an explicit `withConstructorDefault` field for the numeric and `StringId` schemas). The runtime values are unchanged and the type-display improvement is preserved. - -Affected: `NonEmptyString*`, `Min3String255`, `StringId`, `Url`, `PositiveInt`, `NonNegativeInt`, `Int`, `PositiveNumber`, `NonNegativeNumber`, and `brandedStringId`. diff --git a/.changeset/fix-seed-marker-and-circular-dep.md b/.changeset/fix-seed-marker-and-circular-dep.md deleted file mode 100644 index b08aa48ed..000000000 --- a/.changeset/fix-seed-marker-and-circular-dep.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix store seeding: break circular dependency where bulkSet re-entered seedNamespace, and add explicit seed markers to SQL/Pg stores using a dedicated `__seed__` namespace. diff --git a/.changeset/fix-sql-array-relation-queries.md b/.changeset/fix-sql-array-relation-queries.md deleted file mode 100644 index b0037ae9e..000000000 --- a/.changeset/fix-sql-array-relation-queries.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix SQL `whereSome`/`whereEvery` array relation queries using `EXISTS` with `json_each` (SQLite) / `jsonb_array_elements` (Pg). diff --git a/.changeset/fix-sql-in-null-handling.md b/.changeset/fix-sql-in-null-handling.md deleted file mode 100644 index b675415b2..000000000 --- a/.changeset/fix-sql-in-null-handling.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix SQL `IN`/`NOT IN` with null values to use `IS NULL`/`IS NOT NULL` instead of `IN (NULL, ...)`. diff --git a/.changeset/fix-sql-includes-serialize.md b/.changeset/fix-sql-includes-serialize.md deleted file mode 100644 index 8e819d336..000000000 --- a/.changeset/fix-sql-includes-serialize.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -fix SQL includes-any/all double-quoting values for SQLite (JSON.stringify only needed for Postgres jsonb) diff --git a/.changeset/fix-sql-json-from-string-codec.md b/.changeset/fix-sql-json-from-string-codec.md deleted file mode 100644 index afb147746..000000000 --- a/.changeset/fix-sql-json-from-string-codec.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Apply `toCodecJson` in `SQLModel.JsonFromString` so SQL JSON string fields use the proper JSON-safe codec at the encode/decode boundary (aligns with queue, event, and gist call sites). diff --git a/.changeset/fix-sql-namespace-params.md b/.changeset/fix-sql-namespace-params.md deleted file mode 100644 index fa2666aeb..000000000 --- a/.changeset/fix-sql-namespace-params.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix SQLite store namespace parameter ordering in filter queries. The `_namespace` placeholder was prepended to the WHERE clause but its value was appended to the end of the positional params array, causing it to bind to the wrong placeholder. PostgreSQL was unaffected (uses indexed `$N` placeholders). diff --git a/.changeset/fix-sql-pg-seed-migrations-table.md b/.changeset/fix-sql-pg-seed-migrations-table.md deleted file mode 100644 index 9228c96e7..000000000 --- a/.changeset/fix-sql-pg-seed-migrations-table.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -SQL and Pg stores: use separate `_migrations` table for seed tracking instead of inserting a marker row into the data table, preventing it from appearing in `all`/`filter` queries. diff --git a/.changeset/fix-sql-select-etag-column.md b/.changeset/fix-sql-select-etag-column.md deleted file mode 100644 index 0d1d4e4aa..000000000 --- a/.changeset/fix-sql-select-etag-column.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix SQL select queries to read `_etag` from column instead of JSON data, preventing INSERT on update. diff --git a/.changeset/fix-sql-select-types-and-defaults.md b/.changeset/fix-sql-select-types-and-defaults.md deleted file mode 100644 index 2ccd01639..000000000 --- a/.changeset/fix-sql-select-types-and-defaults.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix SQLite select query type coercion using `json_quote` and apply defaultValues in SQL WHERE clauses via `COALESCE`. diff --git a/.changeset/fix-sql-whereevery-flip.md b/.changeset/fix-sql-whereevery-flip.md deleted file mode 100644 index 93e38a69e..000000000 --- a/.changeset/fix-sql-whereevery-flip.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -fix SQL whereEvery double-negation bug causing wrong query when operators like notIn are used (especially with empty arrays) diff --git a/.changeset/fix-sqlite-per-ns-seed-migrations-table.md b/.changeset/fix-sqlite-per-ns-seed-migrations-table.md deleted file mode 100644 index 932a44bdd..000000000 --- a/.changeset/fix-sqlite-per-ns-seed-migrations-table.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -SQLite per-namespace adapter: use separate `_migrations` table for seed tracking instead of inserting a marker row into the data table, preventing it from appearing in `all`/`filter` queries. diff --git a/.changeset/fix-transformed-struct-defaults.md b/.changeset/fix-transformed-struct-defaults.md deleted file mode 100644 index 9d2139ed4..000000000 --- a/.changeset/fix-transformed-struct-defaults.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Fix defaultsValueFromSchema for transformed struct schemas (e.g. decodeTo) in unions. Walk the AST properly instead of relying on schema-level .fields/.from chains. diff --git a/.changeset/fix-vue-form-numeric-type-detection.md b/.changeset/fix-vue-form-numeric-type-detection.md deleted file mode 100644 index 04696200a..000000000 --- a/.changeset/fix-vue-form-numeric-type-detection.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Fix numeric field type detection in `getMetadataFromSchema` for Effect v4 JSON schema output. `S.Number` now emits `anyOf` instead of a top-level `type: "number"`, causing fields to fall back to `"text"`. Detection now recurses through `anyOf`/`oneOf`/`allOf` to find the underlying numeric type. diff --git a/.changeset/fix-vue-interrupt-tests.md b/.changeset/fix-vue-interrupt-tests.md deleted file mode 100644 index e08911de1..000000000 --- a/.changeset/fix-vue-interrupt-tests.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Fix interrupt repro tests to observe expected suspense interruption rejections. diff --git a/.changeset/fix-vue-lint-typescript-version.md b/.changeset/fix-vue-lint-typescript-version.md deleted file mode 100644 index 67cc08f64..000000000 --- a/.changeset/fix-vue-lint-typescript-version.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Fix lint: use typescript ~6.0.3 instead of native-preview for ESLint compatibility; keep tsgo for compilation diff --git a/.changeset/flat-turkeys-invent.md b/.changeset/flat-turkeys-invent.md deleted file mode 100644 index 04b3f39ee..000000000 --- a/.changeset/flat-turkeys-invent.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Limit `client.method.mutate` extensions to only expose the mutation call and `wrap`. diff --git a/.changeset/flatten-nested-anyof.md b/.changeset/flatten-nested-anyof.md deleted file mode 100644 index 6020098d5..000000000 --- a/.changeset/flatten-nested-anyof.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Add nested anyOf flattening to JSON Schema post-processing diff --git a/.changeset/forty-bottles-tease.md b/.changeset/forty-bottles-tease.md deleted file mode 100644 index 038076323..000000000 --- a/.changeset/forty-bottles-tease.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -fix: restore context map container behavior diff --git a/.changeset/frank-ends-switch.md b/.changeset/frank-ends-switch.md deleted file mode 100644 index dd94d003f..000000000 --- a/.changeset/frank-ends-switch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -bump diff --git a/.changeset/frank-memes-sin.md b/.changeset/frank-memes-sin.md deleted file mode 100644 index ca2bf45ac..000000000 --- a/.changeset/frank-memes-sin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -fix sqlite diff --git a/.changeset/frank-papayas-design.md b/.changeset/frank-papayas-design.md deleted file mode 100644 index 55b4f6066..000000000 --- a/.changeset/frank-papayas-design.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -cleanup auth diff --git a/.changeset/fresh-buckets-pump.md b/.changeset/fresh-buckets-pump.md deleted file mode 100644 index 097c4a6b7..000000000 --- a/.changeset/fresh-buckets-pump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix TaggedUnion diff --git a/.changeset/fresh-candles-shake.md b/.changeset/fresh-candles-shake.md deleted file mode 100644 index 8db9c8e07..000000000 --- a/.changeset/fresh-candles-shake.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch -"@effect-app/eslint-shared-config": patch -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- - -update packages diff --git a/.changeset/fresh-indexed-fields.md b/.changeset/fresh-indexed-fields.md deleted file mode 100644 index 5c76d47db..000000000 --- a/.changeset/fresh-indexed-fields.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Render indexed OmegaForm inputs outside form.Array and avoid duplicate error entries for registered array fields. diff --git a/.changeset/fresh-mails-visit.md b/.changeset/fresh-mails-visit.md deleted file mode 100644 index 235d6a843..000000000 --- a/.changeset/fresh-mails-visit.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": minor -"@effect-app/vue": patch ---- - -Move `makeQueryKey` into `effect-app/client` and update Vue source and tests to import it from the shared client module. Vue still re-exports `makeQueryKey` from `src/lib` for compatibility. diff --git a/.changeset/fresh-paths-say.md b/.changeset/fresh-paths-say.md deleted file mode 100644 index 5d9b5c37e..000000000 --- a/.changeset/fresh-paths-say.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@effect-app/infra": patch -"@effect-app/vue": patch ---- - -fix atom invalidation diff --git a/.changeset/fresh-pianos-argue.md b/.changeset/fresh-pianos-argue.md deleted file mode 100644 index 8e81e76b5..000000000 --- a/.changeset/fresh-pianos-argue.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Require `clientFor` invalidation resources when any command in the client configures them. diff --git a/.changeset/friendly-points-drum.md b/.changeset/friendly-points-drum.md deleted file mode 100644 index 42d52d888..000000000 --- a/.changeset/friendly-points-drum.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Tighten schema helper generics in `Schema/ext.ts` so default-related helpers accept properly named schema type parameters instead of bare `S.Top` inputs. diff --git a/.changeset/fruity-meteors-fix.md b/.changeset/fruity-meteors-fix.md deleted file mode 100644 index 8db9c8e07..000000000 --- a/.changeset/fruity-meteors-fix.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch -"@effect-app/eslint-shared-config": patch -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- - -update packages diff --git a/.changeset/full-oranges-heal.md b/.changeset/full-oranges-heal.md deleted file mode 100644 index c9099a6bf..000000000 --- a/.changeset/full-oranges-heal.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -remove double prefix diff --git a/.changeset/full-pugs-fall.md b/.changeset/full-pugs-fall.md deleted file mode 100644 index 2aba102b2..000000000 --- a/.changeset/full-pugs-fall.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -wrap vuetify reset diff --git a/.changeset/funky-guests-switch.md b/.changeset/funky-guests-switch.md deleted file mode 100644 index 2cb2e585e..000000000 --- a/.changeset/funky-guests-switch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -also make runSync version available\ diff --git a/.changeset/funny-webs-clap.md b/.changeset/funny-webs-clap.md deleted file mode 100644 index c97a7abdb..000000000 --- a/.changeset/funny-webs-clap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -add trace id and span id to toasts diff --git a/.changeset/fuzzy-eels-decide.md b/.changeset/fuzzy-eels-decide.md deleted file mode 100644 index e3af5ced7..000000000 --- a/.changeset/fuzzy-eels-decide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -cleanup diff --git a/.changeset/fuzzy-eggs-jump.md b/.changeset/fuzzy-eggs-jump.md deleted file mode 100644 index bbd529301..000000000 --- a/.changeset/fuzzy-eggs-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Migrate `Schema/ext` context helpers to Effect v4 by implementing `provide` and `contextFromServices` with proper service subtraction across decoding and encoding requirements. diff --git a/.changeset/gentle-bats-leave.md b/.changeset/gentle-bats-leave.md deleted file mode 100644 index b1cb0696c..000000000 --- a/.changeset/gentle-bats-leave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -fix missing fn diff --git a/.changeset/gentle-donkeys-tease.md b/.changeset/gentle-donkeys-tease.md deleted file mode 100644 index e27d75735..000000000 --- a/.changeset/gentle-donkeys-tease.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix circular diff --git a/.changeset/gold-ghosts-laugh.md b/.changeset/gold-ghosts-laugh.md deleted file mode 100644 index 3f5762383..000000000 --- a/.changeset/gold-ghosts-laugh.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix: TaggedRequest should be an Opaque Schema Class diff --git a/.changeset/gold-wolves-shake.md b/.changeset/gold-wolves-shake.md deleted file mode 100644 index 6dfde3209..000000000 --- a/.changeset/gold-wolves-shake.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch ---- - -use Finite instead of Number diff --git a/.changeset/green-coins-talk.md b/.changeset/green-coins-talk.md deleted file mode 100644 index 7133303b8..000000000 --- a/.changeset/green-coins-talk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Replace `ForceVoid` in `makeClient` with a typed codec transformation instead of an unsafe cast. diff --git a/.changeset/green-frogs-check.md b/.changeset/green-frogs-check.md deleted file mode 100644 index be2f966d7..000000000 --- a/.changeset/green-frogs-check.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Fix request handler input classification to use request schema fields instead of `make` parameters, preventing defaulted/nullable input fields from being treated as no-input handlers. diff --git a/.changeset/green-snakes-poke.md b/.changeset/green-snakes-poke.md deleted file mode 100644 index e4b9c8ed2..000000000 --- a/.changeset/green-snakes-poke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-shared-config": patch ---- - -pin dprint/formatter diff --git a/.changeset/green-taxis-project-hash.md b/.changeset/green-taxis-project-hash.md deleted file mode 100644 index 7dd2bc0d8..000000000 --- a/.changeset/green-taxis-project-hash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -feat: add client projection diff --git a/.changeset/green-taxis-rule.md b/.changeset/green-taxis-rule.md deleted file mode 100644 index 462fe15b4..000000000 --- a/.changeset/green-taxis-rule.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Add optional batching overloads for repository `save` and `remove` helpers. diff --git a/.changeset/handle-mutate-request-always-functions.md b/.changeset/handle-mutate-request-always-functions.md deleted file mode 100644 index 01ee4dd2d..000000000 --- a/.changeset/handle-mutate-request-always-functions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -`handle`, `mutate`, and `request` are now always functions, never a raw Effect or Stream. For no-input handlers the first argument is omitted (`handle()`, `request()`, `mutate()`). diff --git a/.changeset/handler-input-make-aligned.md b/.changeset/handler-input-make-aligned.md deleted file mode 100644 index 520782a0a..000000000 --- a/.changeset/handler-input-make-aligned.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/vue": patch ---- - -Align request handler input typing with the request's `make` signature. Handlers are now classified as no-input only when the request schema declares no payload fields; any payload (even fully-optional) yields a function handler whose input matches `make`'s first parameter. Adds `HandlerInput` and threads it through `CommandFromRequest`. diff --git a/.changeset/heavy-bears-appear.md b/.changeset/heavy-bears-appear.md deleted file mode 100644 index 0af4b69a7..000000000 --- a/.changeset/heavy-bears-appear.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -refactor(vue): remove 1s waiting toast delay in withDefaultToastStream diff --git a/.changeset/heavy-ducks-show.md b/.changeset/heavy-ducks-show.md deleted file mode 100644 index 5a8136582..000000000 --- a/.changeset/heavy-ducks-show.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Add `relation(...).length()` computed projection — emits `ARRAY_LENGTH` on Cosmos / `arrayLength` on SQL / native `.length` on Memory. Cheaper than `relation.count()` for unconditional array sizing (no subquery scan, just metadata read). - -```ts -projectComputed( - S.Struct({ id: S.String, packageCount: S.NonNegativeInt }), - computed({ packageCount: relation("packages").length() }) -) -``` diff --git a/.changeset/honest-planets-fry.md b/.changeset/honest-planets-fry.md deleted file mode 100644 index 58b6fe3c3..000000000 --- a/.changeset/honest-planets-fry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": minor ---- - -feat: add native fork diff --git a/.changeset/http-span-name.md b/.changeset/http-span-name.md deleted file mode 100644 index 7fa8bd871..000000000 --- a/.changeset/http-span-name.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -RequestContextMiddleware: set request name to `HTTP ` (strip query string) for clearer span/trace names. diff --git a/.changeset/huge-carrots-deny.md b/.changeset/huge-carrots-deny.md deleted file mode 100644 index d2614cd19..000000000 --- a/.changeset/huge-carrots-deny.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch ---- - -update to latest effect beta diff --git a/.changeset/humble-walls-fail.md b/.changeset/humble-walls-fail.md deleted file mode 100644 index 3327be42f..000000000 --- a/.changeset/humble-walls-fail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -fix DatabaseError typing diff --git a/.changeset/icy-paws-return.md b/.changeset/icy-paws-return.md deleted file mode 100644 index 955ba2afb..000000000 --- a/.changeset/icy-paws-return.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -bogus diff --git a/.changeset/indefinite-waiting-toast.md b/.changeset/indefinite-waiting-toast.md deleted file mode 100644 index b8698031d..000000000 --- a/.changeset/indefinite-waiting-toast.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -In-progress toasts (`withToast` waiting toast and `withDefaultToastStream` waiting/progress toasts) now persist indefinitely (`timeout: Infinity`) until replaced by the success/failure toast or dismissed. Previously they used the underlying toast adapter's default duration and could disappear before the operation finished. diff --git a/.changeset/infra-prefer-fn-untraced.md b/.changeset/infra-prefer-fn-untraced.md deleted file mode 100644 index 9a19c62ba..000000000 --- a/.changeset/infra-prefer-fn-untraced.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Replace `(...) => Effect.gen` with `Effect.fnUntraced` and convert select multi-step `pipe` chains to `Effect.gen` across infra. diff --git a/.changeset/infra-sentry-node-dep.md b/.changeset/infra-sentry-node-dep.md deleted file mode 100644 index 30f66e1f3..000000000 --- a/.changeset/infra-sentry-node-dep.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Declare `@sentry/node` as a runtime dependency of `@effect-app/infra`. `errorReporter.ts` imports it statically, so `pnpm install --prod` of linked source (Docker) must install it next to the package, not only as a peer of the app. diff --git a/.changeset/invalidation-set-add-shortcut-and-batch.md b/.changeset/invalidation-set-add-shortcut-and-batch.md deleted file mode 100644 index 2ed5e26f4..000000000 --- a/.changeset/invalidation-set-add-shortcut-and-batch.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -"effect-app": patch ---- - -`InvalidationSet.add` accepts arrays and is exposed as a static shortcut. - -- Single item: `yield* InvalidationSet.add(UserRsc.GetMe)` -- Batch: `yield* InvalidationSet.add([UserRsc.GetMe, ["custom", "key"]])` -- Skips the `.use(_ => _.add(...))` boilerplate. - -Existing `InvalidationSet.use(_ => _.add(...))` form still works; the service -identity is preserved via `Object.assign` so `Effect.provideService` and -`.use` / `.useSync` continue to operate on the same `Context.Reference`. diff --git a/.changeset/itchy-mangos-find.md b/.changeset/itchy-mangos-find.md deleted file mode 100644 index 6c80d9d0b..000000000 --- a/.changeset/itchy-mangos-find.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix withDefault types diff --git a/.changeset/khaki-frogs-wave.md b/.changeset/khaki-frogs-wave.md deleted file mode 100644 index 78412a8ac..000000000 --- a/.changeset/khaki-frogs-wave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -omegaform: validate all fields on submit before delegating to tanstack handleSubmit, ensuring submit reveals all validation errors. diff --git a/.changeset/kind-lizards-bathe.md b/.changeset/kind-lizards-bathe.md deleted file mode 100644 index f7bbf607d..000000000 --- a/.changeset/kind-lizards-bathe.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- - -update to latest effect diff --git a/.changeset/large-pugs-strive.md b/.changeset/large-pugs-strive.md deleted file mode 100644 index 6e62335da..000000000 --- a/.changeset/large-pugs-strive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -bump to release diff --git a/.changeset/late-forks-obey.md b/.changeset/late-forks-obey.md deleted file mode 100644 index 67d6b721f..000000000 --- a/.changeset/late-forks-obey.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": minor -"@effect-app/vue": minor ---- - -Add command invalidation helpers that preserve query-only resource types and pass mutation input and `Exit` results into invalidation callbacks. Update Vue `clientFor` to merge request-level invalidation config with call-site invalidation and require matching invalidation resources. diff --git a/.changeset/lazy-boats-lay.md b/.changeset/lazy-boats-lay.md deleted file mode 100644 index 5dfdac068..000000000 --- a/.changeset/lazy-boats-lay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix rpc middleware context type issue diff --git a/.changeset/lazy-model-facades.md b/.changeset/lazy-model-facades.md deleted file mode 100644 index 02a937c1b..000000000 --- a/.changeset/lazy-model-facades.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/eslint-codegen-model": patch ---- - -Add generated opaque model facades that expose static Type, Encoded, Make, and Schema declarations without leaking the private struct schema type to downstream project references. diff --git a/.changeset/legal-weeks-raise.md b/.changeset/legal-weeks-raise.md deleted file mode 100644 index 29be81175..000000000 --- a/.changeset/legal-weeks-raise.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch ---- - -adapt isObject change diff --git a/.changeset/lemon-emus-behave.md b/.changeset/lemon-emus-behave.md deleted file mode 100644 index 8181569d9..000000000 --- a/.changeset/lemon-emus-behave.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/vue": patch ---- - -bye cruft diff --git a/.changeset/little-berries-sip.md b/.changeset/little-berries-sip.md deleted file mode 100644 index 3bdf51b4e..000000000 --- a/.changeset/little-berries-sip.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- - -Update to effect beta 43 diff --git a/.changeset/little-planets-bake.md b/.changeset/little-planets-bake.md deleted file mode 100644 index 8ab5b6b64..000000000 --- a/.changeset/little-planets-bake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": minor ---- - -Restore OmegaForm input reactivity broken by the @tanstack/vue-form 1.32 bump — the Field slot's state prop became a stale snapshot, so bind inputs to the reactive field.state instead. diff --git a/.changeset/live-query-dependencies.md b/.changeset/live-query-dependencies.md deleted file mode 100644 index d744cdb24..000000000 --- a/.changeset/live-query-dependencies.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": minor ---- - -Add query-owned live invalidation with recorded dependency filtering, connect-before-fetch coordination, race buffering, and configurable client-side coalescing. diff --git a/.changeset/long-regions-change.md b/.changeset/long-regions-change.md deleted file mode 100644 index 7381132f9..000000000 --- a/.changeset/long-regions-change.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -again diff --git a/.changeset/loud-planets-cheer.md b/.changeset/loud-planets-cheer.md deleted file mode 100644 index bc386da77..000000000 --- a/.changeset/loud-planets-cheer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -expose Input diff --git a/.changeset/lucky-papayas-fetch.md b/.changeset/lucky-papayas-fetch.md deleted file mode 100644 index 83e96336d..000000000 --- a/.changeset/lucky-papayas-fetch.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch -"@effect-app/eslint-shared-config": patch -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- diff --git a/.changeset/lucky-streets-add.md b/.changeset/lucky-streets-add.md deleted file mode 100644 index 8e5ca642b..000000000 --- a/.changeset/lucky-streets-add.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- - -the return of `Context` diff --git a/.changeset/lucky-zebras-invent.md b/.changeset/lucky-zebras-invent.md deleted file mode 100644 index 73f8bc979..000000000 --- a/.changeset/lucky-zebras-invent.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Add a `Commander` error-renderer registry via `Context.Reference` and apply registered guarded renderers before default error formatting. diff --git a/.changeset/major-drinks-stop.md b/.changeset/major-drinks-stop.md deleted file mode 100644 index 112305dba..000000000 --- a/.changeset/major-drinks-stop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -fix memory computation diff --git a/.changeset/major-planets-lie.md b/.changeset/major-planets-lie.md deleted file mode 100644 index 887213b27..000000000 --- a/.changeset/major-planets-lie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch ---- - -run codegen model from src locally diff --git a/.changeset/many-ideas-report.md b/.changeset/many-ideas-report.md deleted file mode 100644 index 1f6f370f1..000000000 --- a/.changeset/many-ideas-report.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-shared-config": patch ---- - -update oxlint rule diff --git a/.changeset/meta-codegen-no-export.md b/.changeset/meta-codegen-no-export.md deleted file mode 100644 index 1ccc7f58a..000000000 --- a/.changeset/meta-codegen-no-export.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch ---- - -Don't export `Req` in meta codegen preset diff --git a/.changeset/meta-module-name-override.md b/.changeset/meta-module-name-override.md deleted file mode 100644 index 2451ff248..000000000 --- a/.changeset/meta-module-name-override.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch -"@effect-app/eslint-shared-config": patch ---- - -Add `stripSuffixes` option to the meta codegen preset and configure `.Queries` stripping in the shared oxlint config. diff --git a/.changeset/metal-mammals-smell.md b/.changeset/metal-mammals-smell.md deleted file mode 100644 index 0a417e259..000000000 --- a/.changeset/metal-mammals-smell.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@effect-app/vue-components": patch -"@effect-app/vue": patch ---- - -move out Commander and friends from experimental diff --git a/.changeset/middleware-error-from-dynamic-rcm.md b/.changeset/middleware-error-from-dynamic-rcm.md deleted file mode 100644 index 26a1e5a67..000000000 --- a/.changeset/middleware-error-from-dynamic-rcm.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -`MiddlewareMaker.makeMiddlewareBasic` now derives each middleware's effective error from both the static `error` field on the tag AND the `rcm` config entry referenced by `dynamic.key`, rather than relying on the static field alone. - -Middlewares declared with `dynamic: RequestContextMap.get("foo")` (instead of an explicit static `error: ...`) end up with `tag.error = Schema.Never` at runtime — `RpcMiddleware.Tag` defaults the static error to `Never` when not provided. The composite `MiddlewareMaker.Tag(...).middleware(...)` walked `make[*].error` to build its own error union, collapsing to `Union ≡ Never`. - -`Rpc.exitSchema` walks `rpc.middlewares[*].error` when building the wire-level failure union for every rpc kind. Empty-union meant middleware-thrown errors (`NotLoggedInError`, `UnauthorizedError`, etc.) never reached the wire schema. Query/command happened to work because their wire `errorSchema = resource.error` already covered the merge from `makeRpcClient`. Stream rpcs have `errorSchema` force-set to `Schema.Never` by effect-rpc, so the resource-level merge never reached the wire — middleware errors decoded as "Expected never, got X". - -Per middleware, the new logic pushes both the static `_.error` (if non-`Never`) and `rcm[_.dynamic.key].error` (if non-`Never`) into the composite's failure union. diff --git a/.changeset/middleware-errors-via-rpc-tag.md b/.changeset/middleware-errors-via-rpc-tag.md deleted file mode 100644 index 8bcb52430..000000000 --- a/.changeset/middleware-errors-via-rpc-tag.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -Source middleware errors exclusively from the rpc middleware tag, and move command/stream invalidation wrap/unwrap entirely into the routing layer (server) and `apiClientFactory` (client). `InvalidationMiddleware` and `InvalidationMiddlewareLive` are removed. - -### Resource error schemas - -Three sites that used to fold `RequestContextMap[*].error` into a request's own error schema now stop doing so: - -- `makeRpcClient` / `makeRequestClass` — `failureSchema` is just `config.error` (still merged with the optional `generalErrors` parameter, which is the only remaining error mix on both type and runtime levels). -- `MiddlewareMaker.rpc()` — `error: options.error` only; the previous union with `rcm.config[*].error` is gone. -- Routing and `apiClientFactory.makeRpcGroupFromRequestsAndModuleName` — `Invalidation.makeCommandRpc` is called with `error: resource.error` (no widening with the composite middleware error union). - -Middleware errors reach the client through the rpc's `middlewares[*].error` failure-union channel of `Rpc.exitSchema`, exposed by attaching the middleware tag to the rpc on both sides: - -- **Server**: `makeRouter(middleware)` attaches the live composite tag (existing behavior). -- **Client**: new `middleware` option on `ClientForOptions` / `ApiClientFactory.makeFor(layer, { middleware })` attaches the same tag schema-only (no Live invoked). Threaded through `makeRpcGroupFromRequestsAndModuleName` to `RpcGroup.middleware(tag)`. Without it, stream rpcs (whose top-level `errorSchema` is forced to `Never` by effect-rpc) hit `SchemaError: Expected never | { _tag: "error", ... }` decoding middleware-thrown errors that bypass the in-stream `Stream.catch` wrap. - -**Migration**: handlers that yield errors previously sourced from rcm (e.g. `yield* new UnauthorizedError()`) now require those errors to be declared explicitly on the resource — `Req.Query()("...", fields, { success, error: UnauthorizedError })`. The handler error type no longer auto-includes the rcm union. - -### Invalidation wrap/unwrap - -- `routing.ts` (server) provides a per-request `InvalidationSet` for commands, wraps the success value as `CommandResponseWithMetaData`, and converts handler-thrown failures into `CommandFailureWithMetaData` so accumulated invalidation keys reach the client on either path. Stream wrap (per-chunk envelope + final `done` chunk) was already in routing and is unchanged. -- `apiClientFactory.ts` (client) `unwrapCommand` strips both envelopes and forwards keys to `InvalidationKeysFromServer`. -- `InvalidationMiddleware` (the tag) and `InvalidationMiddlewareLive` (the layer) are **removed**. The middleware was the previous home of the wrap; with the wrap moved to routing/apiClientFactory, the middleware became a thin pass-through and is no longer needed. `DefaultGenericMiddlewares` and `DefaultGenericMiddlewaresLive` shrink accordingly — no migration needed for callers that used the defaults; callers that referenced `InvalidationMiddleware` / `InvalidationMiddlewareLive` directly should drop those imports. - -Middleware-thrown errors are never wrapped: by definition the handler never ran, so there is nothing to invalidate. They flow raw on the Cause and the client decodes them via the middleware-tag failure-union channel described above. diff --git a/.changeset/mighty-hoops-help.md b/.changeset/mighty-hoops-help.md deleted file mode 100644 index 3c2ac4870..000000000 --- a/.changeset/mighty-hoops-help.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/vue": patch ---- - -fix diff --git a/.changeset/migrate-tsgolint.md b/.changeset/migrate-tsgolint.md deleted file mode 100644 index 1ce372869..000000000 --- a/.changeset/migrate-tsgolint.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -"@effect-app/eslint-shared-config": minor -"effect-app": patch -"@effect-app/cli": patch -"@effect-app/infra": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -Replace typescript-eslint with oxlint-tsgolint for type-aware lint. Drop ESLint entirely from non-vue packages (cli, effect-app, infra) — they now use only `oxlint --type-aware`. Vue packages keep ESLint to run `@effect-app/no-await-effect` (no tsgolint equivalent) via `@typescript-eslint/parser` + `vue-eslint-parser`. diff --git a/.changeset/modern-humans-chew.md b/.changeset/modern-humans-chew.md deleted file mode 100644 index 8011b393c..000000000 --- a/.changeset/modern-humans-chew.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-shared-config": patch ---- - -dprint bs diff --git a/.changeset/moody-peas-smoke.md b/.changeset/moody-peas-smoke.md deleted file mode 100644 index 3c2ac4870..000000000 --- a/.changeset/moody-peas-smoke.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/vue": patch ---- - -fix diff --git a/.changeset/mutate-invalidation-shorthands.md b/.changeset/mutate-invalidation-shorthands.md deleted file mode 100644 index 68567cbff..000000000 --- a/.changeset/mutate-invalidation-shorthands.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -"@effect-app/vue": patch -"effect-app": patch ---- - -`queryInvalidation` / `invalidatesQueries` accept shorthand entries (per-mutation, Command, client-level `QueryInvalidation` maps, and server-side `Req.Command` `invalidatesQueries` callbacks). - -Each entry returned may now be: - -- a raw query key (`string[]`) -- an RPC handler (`{ id, options? }`) — its query key is derived via `makeQueryKey` -- the existing `{ filters, options }` raw tanstack-query invalidation - -```ts -queryInvalidation: (queryKey) => [ - queryKey, - GetMe, - PackListIndex -] -``` - -equivalent to: - -```ts -queryInvalidation: (queryKey) => [ - { filters: { queryKey } }, - { filters: { queryKey: makeQueryKey(GetMe) } }, - { filters: { queryKey: makeQueryKey(PackListIndex) } } -] -``` diff --git a/.changeset/mutate-wrap-stream-no-args.md b/.changeset/mutate-wrap-stream-no-args.md deleted file mode 100644 index 550c0c103..000000000 --- a/.changeset/mutate-wrap-stream-no-args.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -`mutate.wrap` on stream handlers now works the same as on command/query handlers: it can be called without arguments or with only combinators, with the underlying stream handler pre-baked in. diff --git a/.changeset/namespaced-change-feed.md b/.changeset/namespaced-change-feed.md deleted file mode 100644 index 3bdfc4eb7..000000000 --- a/.changeset/namespaced-change-feed.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Repository `changeFeed` is now namespace-aware. Events carry the `storeId` namespace as a third tuple element (`ChangeFeedEvent = [items, op, namespace]`). `subscribe` accepts `options.namespace` to register a per-namespace handler; omitting it registers a wildcard handler that receives events from every namespace. Per-namespace handler buckets eliminate cross-namespace fan-out and avoid waking handlers for irrelevant tenants. diff --git a/.changeset/native-encoded-query-json.md b/.changeset/native-encoded-query-json.md deleted file mode 100644 index e9c963a39..000000000 --- a/.changeset/native-encoded-query-json.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"effect-app": minor -"@effect-app/infra": minor -"@effect-app/vue-components": minor ---- - -Stop forcing Date/Map/Set Encoded shapes to JSON. - -`Schema.Date` / `ReadonlySet` / `ReadonlyMap` now keep native Encoded types (`Date`, `Set`, `Map`). Use `DateFromString`, `ReadonlySetFromArray`, and `ReadonlyMapFromArray` when the Encoded form must be JSON. The query DSL accepts those native values, including array ops (`includes` / `in` / `includes-any`) on `Date[]` and `ReadonlySet` fields. Memory, Disk, SQL, and Cosmos convert Encoded Date/Map/Set through `Schema.toCodecJson` on write/read; query parameters and defaults lower the same way from the store schema. App types such as DateOnly stay native Encoded and JSON-lower via that schema — not a type registry. diff --git a/.changeset/neat-brooms-wave.md b/.changeset/neat-brooms-wave.md deleted file mode 100644 index ef7abda56..000000000 --- a/.changeset/neat-brooms-wave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch ---- - -Ignore commented-out exported classes when detecting model schemas for generated `Encoded` namespaces. diff --git a/.changeset/neat-dingos-tease.md b/.changeset/neat-dingos-tease.md deleted file mode 100644 index 8d1870a93..000000000 --- a/.changeset/neat-dingos-tease.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Align effect-app tagged union helpers with Effect v4 by delegating to the native tagged union utilities, exposing v4-style `cases` and `guards`, and preserving the local `tags` helper. diff --git a/.changeset/neat-pumpkins-juggle.md b/.changeset/neat-pumpkins-juggle.md deleted file mode 100644 index d3dbe4b32..000000000 --- a/.changeset/neat-pumpkins-juggle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Add computed projection expression sums with grouped and normalized variants for projectComputed relation aggregations. diff --git a/.changeset/new-badgers-wait.md b/.changeset/new-badgers-wait.md deleted file mode 100644 index a46a4fb53..000000000 --- a/.changeset/new-badgers-wait.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/cli": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -Update Effect dependencies to 4.0.0-beta.31 across workspace packages. diff --git a/.changeset/new-berries-march.md b/.changeset/new-berries-march.md deleted file mode 100644 index c2b5e4038..000000000 --- a/.changeset/new-berries-march.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch -"effect-app": patch -"@effect-app/infra": patch ---- - -unify encoded function for when you use encodedKeys diff --git a/.changeset/nice-jars-grow.md b/.changeset/nice-jars-grow.md deleted file mode 100644 index adab7c6be..000000000 --- a/.changeset/nice-jars-grow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Uses onBlur instead of intrusive onChange diff --git a/.changeset/nice-needles-film.md b/.changeset/nice-needles-film.md deleted file mode 100644 index 8692c6c82..000000000 --- a/.changeset/nice-needles-film.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -no need for .lock.lock diff --git a/.changeset/nice-shrimps-fold.md b/.changeset/nice-shrimps-fold.md deleted file mode 100644 index c49bca027..000000000 --- a/.changeset/nice-shrimps-fold.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/vue": patch ---- - -Update request helper typing and runtime invocation to rely on schema `.make` instead of class constructors, avoiding `new`-based assumptions for request schemas. diff --git a/.changeset/ninety-stamps-end.md b/.changeset/ninety-stamps-end.md deleted file mode 100644 index e39ea913e..000000000 --- a/.changeset/ninety-stamps-end.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@effect-app/cli": patch -"effect-app": patch -"@effect-app/eslint-codegen-model": patch -"@effect-app/eslint-shared-config": patch -"@effect-app/infra": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -bogus diff --git a/.changeset/no-await-effect.md b/.changeset/no-await-effect.md deleted file mode 100644 index e99b97e64..000000000 --- a/.changeset/no-await-effect.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-shared-config": minor ---- - -Add `no-await-effect` lint rule that errors when awaiting Effect, Option, Result, or Fiber values from the effect library. Enabled when type-checked linting is active (`ESLINT_TS=1`). diff --git a/.changeset/number-input-dual-separator.md b/.changeset/number-input-dual-separator.md deleted file mode 100644 index 336fd94f6..000000000 --- a/.changeset/number-input-dual-separator.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -OmegaForm number fields accept both "." and "," while typing: the wrong separator is translated to the active one (locale or explicit decimal-separator). Int fields no longer silently block decimals (precision null): invalid values go through and the schema error shows. diff --git a/.changeset/odd-deers-work.md b/.changeset/odd-deers-work.md deleted file mode 100644 index bd19a3451..000000000 --- a/.changeset/odd-deers-work.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"effect-app": patch ---- - -Change `Schema.Class` and `Schema.TaggedClass` wrappers to default constructor options to `{ disableValidation: true }`. - -This avoids strict class identifier validation by default when constructing wrapper classes (for example passing a compatible view class), while keeping existing behavior when explicit options are provided. diff --git a/.changeset/odd-tigers-scope.md b/.changeset/odd-tigers-scope.md deleted file mode 100644 index 30fbd5abd..000000000 --- a/.changeset/odd-tigers-scope.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -SQL and Pg stores now scope seed migration records by namespace and table name in shared databases to avoid cross-namespace seed collisions. diff --git a/.changeset/old-snakes-film.md b/.changeset/old-snakes-film.md deleted file mode 100644 index 4fedea556..000000000 --- a/.changeset/old-snakes-film.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -able to configure schema concurrency diff --git a/.changeset/old-suns-kneel.md b/.changeset/old-suns-kneel.md deleted file mode 100644 index b7d6bcb98..000000000 --- a/.changeset/old-suns-kneel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix type issue? diff --git a/.changeset/olive-onions-lose.md b/.changeset/olive-onions-lose.md deleted file mode 100644 index fb294dc9f..000000000 --- a/.changeset/olive-onions-lose.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"effect-app": patch ---- - -Reduce schema type complexity by exposing explicit interfaces for branded string and number schemas. - -Each branded constant in `Schema/strings.ts`, `Schema/moreStrings.ts`, and `Schema/numbers.ts` now has a named interface (e.g. `NonEmptyStringSchema`, `StringIdSchema`, `PositiveIntSchema`, `UrlSchema`) annotating its `export const`. Mirrors the pattern used in `effect/Schema` itself — TypeScript reports the interface name instead of expanding the full pipe/brand/extension chain, which shrinks inferred types in consumer code and speeds up type display. - -No runtime or API surface changes; `brandedStringId` now returns `BrandedStringIdSchema` (same shape as before, just named). diff --git a/.changeset/omega-native-input-types.md b/.changeset/omega-native-input-types.md deleted file mode 100644 index 7f4cd02b0..000000000 --- a/.changeset/omega-native-input-types.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -OmegaForm: expose native input types `tel`, `url`, `color`, `time`, `search` (already supported by `getInputType`), and render an editable text input with a dev `console.warn` for any input type no renderer branch handles (e.g. an unrecognized `"unknown"` schema type or a custom `type`) instead of rendering nothing. diff --git a/.changeset/omega-nullable-nested-struct.md b/.changeset/omega-nullable-nested-struct.md deleted file mode 100644 index 6b97fadbb..000000000 --- a/.changeset/omega-nullable-nested-struct.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -OmegaForm: deep-fill defaults for nullable nested structs. When a `S.NullOr(S.Struct(...))` field materialises because one child was filled, its untouched nullable siblings are now normalized to `null` (or their schema default) — in the live form state, and during validation and decoding — instead of being rejected as "field must not be empty". diff --git a/.changeset/omegaform-between-localization.md b/.changeset/omegaform-between-localization.md deleted file mode 100644 index 7bb347b0c..000000000 --- a/.changeset/omegaform-between-localization.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Localize `S.isBetween` validation failures: the violated side now maps to the `validation.number.min` / `validation.number.max` messages instead of falling back to the English default formatter. Also fixes the inverted `isExclusive` flag on the min/max messages for `isGreaterThan[OrEqualTo]` / `isLessThan[OrEqualTo]` (inclusive checks now say "at least/at most", strict ones "greater/less than"). diff --git a/.changeset/omegaform-decodeto-meta-from-encoded.md b/.changeset/omegaform-decodeto-meta-from-encoded.md deleted file mode 100644 index fd495e003..000000000 --- a/.changeset/omegaform-decodeto-meta-from-encoded.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -OmegaForm: meta extraction now walks the encoded (source) side of struct-level `decodeTo` transformations, so the outer schema drives field-level validation. Example: `S.Struct({ amount: S.NonNegativeInt }).pipe(S.decodeTo(S.Struct({ amount: S.PositiveInt }), ...))` now lets users enter `0` without a field error and the decode fallback can rewrite it before submit. diff --git a/.changeset/omegaform-enter-submit-repro.md b/.changeset/omegaform-enter-submit-repro.md deleted file mode 100644 index 0467fe6f1..000000000 --- a/.changeset/omegaform-enter-submit-repro.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Fix OmegaForm default inputs leaking the internal form object as a native `form="[object Object]"` attribute, restoring browser implicit Enter-key submission. Adds a Storybook repro for the default Vuetify input renderer. diff --git a/.changeset/omegaform-input-registry.md b/.changeset/omegaform-input-registry.md deleted file mode 100644 index d81105e39..000000000 --- a/.changeset/omegaform-input-registry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -OmegaForm: register custom input components per `type` via `omegaConfig.inputs`. Registered components receive the `OmegaRendererProps` contract (`{ inputProps, field, state }`) and a registered key makes `` type-valid. Resolution order: per-instance `#default` slot → `inputs[type]` → built-in renderer. `createUseFormWithCustomInput` also honors `omegaConfig.inputs`: per-`type` registrations override the universal custom input, with the same typed `type` inference. Also drops the redundant `validators` forwarding to the internal input. diff --git a/.changeset/omegaform-module-split.md b/.changeset/omegaform-module-split.md deleted file mode 100644 index 7fb1ef84f..000000000 --- a/.changeset/omegaform-module-split.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Refactor `OmegaForm` into focused modules and switch validation to a form-level `onDynamic` validator with `revalidateLogic()` so cross-field checks re-validate on every input change. `OmegaFormStuff.ts` is gone, split into `meta/{types,checks,createMeta,walker,defaults,redacted}.ts`, `validation/localized.ts`, `errors.ts`, `hocs.ts`, `inputs.ts`, `submit.ts`, `persistency.ts`, and `types.ts`; `useOmegaForm.ts` is orchestration-only. - -Restored localization parity for `S.Email` (matched via the refine's `identifier` annotation) and for `S.Literals` / `S.Array(S.Literals(...))` (via an AST pre-pass that stamps `validation.not_a_valid` so Effect's formatter — which bypasses both hooks for `AnyOf` issues — picks them up through `findMessage`). - -Behavior tweaks worth noting: per-field standard-schema validators are removed in favor of one form-level dynamic validator; `OmegaInput`'s `:key="fieldKey"` re-mount is gone; the post-change `errorMap.onSubmit` reset is gone (relies on TanStack revalidation); JSON-schema-derived annotations are no longer merged into `FieldMeta`. Public exports are preserved. diff --git a/.changeset/omegaform-typecheck-stories.md b/.changeset/omegaform-typecheck-stories.md deleted file mode 100644 index 2bbb52a03..000000000 --- a/.changeset/omegaform-typecheck-stories.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Typecheck the OmegaForm Storybook stories (previously outside `tsconfig` scope) and migrate them off removed/renamed Schema APIs surfaced by it: `.withDefault` → `.withConstructorDefault`, error-filter `{ path, message }` → `{ path, issue }`, dropped deprecated `overrideDefaultValues`, and an `OmegaAutoGenMeta` type argument. Internal only — no change to the published API. diff --git a/.changeset/omegaform-vnumber-input.md b/.changeset/omegaform-vnumber-input.md deleted file mode 100644 index 72e0ffa69..000000000 --- a/.changeset/omegaform-vnumber-input.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": minor ---- - -OmegaForm number fields now render Vuetify 4's `v-number-input` instead of `v-text-field type="number"` (`range` keeps its `v-slider`). Precision is schema-driven (`S.Int` → 0, plain numbers → free decimals), controls default to the stacked variant, and any `VNumberInput` prop (`precision`, `step`, `control-variant`, `decimal-separator`, ...) can be overridden per field via attrs. Schema `min`/`max` are exposed to assistive tech as spinbutton ARIA bounds but are deliberately not passed as component props, so out-of-range values keep reaching schema validation and show its localized error instead of being silently clamped. diff --git a/.changeset/optimize-codegen-barrel-model.md b/.changeset/optimize-codegen-barrel-model.md deleted file mode 100644 index e96a8ba0c..000000000 --- a/.changeset/optimize-codegen-barrel-model.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch ---- - -Optimize codegen barrel and model plugins: - -- Drop `io-ts-extra`, `io-ts`, and `lodash` dependencies; replace with native JS helpers -- Add fast string comparison (skip AST parse) for barrel and model equality checks -- Avoid triple file reads in the CLI path: pass already-read source into `model` via context -- Eliminate double read in `run()`: pass source string into `updateFile` -- Extract shared logic (`blockRe`, helpers, `renderPreset`) into `src/shared/codegen-block.ts` -- Remove dead `fs.existsSync`/`fs.statSync` checks in `model` preset -- Use `Set` for O(1) dedup in `model` preset -- Move `last` helper to module scope in `barrel` preset -- Pre-compile all regex constants at module scope; use fresh `RegExp` copy per oxlint `Program` visit to avoid shared `lastIndex` mutations diff --git a/.changeset/otel-semconv-spans.md b/.changeset/otel-semconv-spans.md deleted file mode 100644 index 9cbb915a5..000000000 --- a/.changeset/otel-semconv-spans.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Standardize span attributes on OpenTelemetry semantic conventions. - -All Store adapters (Cosmos, PostgreSQL, SQLite, Memory, Disk) and Queue adapters -(Service Bus, SQL, Memory) now emit OTel-compliant span names and attributes via -the new `@effect-app/infra/otel` helper module. - -Span name convention: ` ` (low cardinality). - -Attribute key migration: - -| Old | New | -| --------------------------------------------------- | --------------------------------------------------------------------------------- | -| `repository.table_name` / `repository.container_id` | `db.collection.name` | -| `repository.namespace` | `db.namespace` | -| `repository.model_name` / `itemType` | `app.entity` | -| `id` / `itemId` (entity span attr) | `app.entity.id` | -| `itemIds` | `app.entity.ids` | -| `db.cosmos.request_charge` | `azure.cosmosdb.operation.request_charge` | -| `db.cosmos.resource_count` | `db.response.returned_rows` | -| `db.cosmos.response_bytes` | `db.response.body.size` | -| `disk.file` / `disk.file_size` | `disk.file.path` / `disk.file.size` | -| `queue.name` | `messaging.destination.name` | -| `queue.sessionId` | `messaging.message.conversation_id` | -| `queue.type` | `messaging.system` | -| `queue.input` (full body) | `messaging.message.body` (+ `messaging.message.id`, `messaging.message.type`) | -| `message_tags` | `messaging.message.types` + `messaging.batch.message_count` | -| `request.name` | `code.function.name` (from `spanAttributes`) / `rpc.method` (middleware) | -| `request.locale` | `app.locale` | -| `request.namespace` | `app.tenant.id` | -| `request.source.id` | `client.id` | -| `request.user.sub` / `.roles` | `user.id` / `user.roles` | -| `requestInput` | `rpc.request.payload` | -| `connectionId` | `network.connection.id` | -| Span `Request..` | Span `/` + `rpc.system`/`rpc.service`/`rpc.method` (kind: server) | -| `.` (SQL/Model) | OTel db span via `withDbSpan`, with `dbSystem?` option | - -New attributes added: - -- `db.system.name` — e.g. `postgresql`, `sqlite`, `cosmosdb`, `memory`, `disk` -- `db.operation.name` — e.g. `find`, `all`, `filter`, `set` -- `db.query.text` — sanitized / parameterized SQL or Cosmos query (no bound values) -- `messaging.operation.name` — `publish`, `process`, `receive` - -Breaking: dashboards/alerts keying on the previous attribute names must be -updated. Queue consumer spans no longer log raw message bodies — use -`messaging.message.id` and `messaging.message.type` instead. diff --git a/.changeset/payload-summary-recurse.md b/.changeset/payload-summary-recurse.md deleted file mode 100644 index 05b52da87..000000000 --- a/.changeset/payload-summary-recurse.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Capture more of the rpc request payload in the `rpc.request.payload` span -attribute. - -The summarizer was one level deep: top-level scalars were kept, but any nested -object collapsed to `Object[N]` and any array to `Array[N]`, hiding useful -inputs (carrier, packageType, dimensions, ids, per-item amounts, …). - -It now recurses into nested objects up to `PAYLOAD_MAX_DEPTH` (4) and samples -arrays to their first `PAYLOAD_ARRAY_HEAD` (20) elements, appending a `…N more` -marker when longer — so item arrays stay diagnosable without dumping the whole -tail on high-frequency commands. Long strings are still snipped at 256 chars, -and `password`/`secret`/`token` keys are redacted at any depth (previously only -a top-level `password`). diff --git a/.changeset/per-namespace-seeding.md b/.changeset/per-namespace-seeding.md deleted file mode 100644 index e2a8e3570..000000000 --- a/.changeset/per-namespace-seeding.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Add per-namespace seeding to SQL (SQLite/PostgreSQL) and CosmosDB store adapters. Previously only the `primary` namespace was seeded at initialization; now each namespace is lazily seeded on first access using `Effect.cached` to guarantee at-most-once execution. Primary namespace continues to seed eagerly on initialization. CosmosDB uses namespace-specific marker documents for backward compatibility. diff --git a/.changeset/petite-tables-cover.md b/.changeset/petite-tables-cover.md deleted file mode 100644 index 0dbc58797..000000000 --- a/.changeset/petite-tables-cover.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix withDefault diff --git a/.changeset/polite-chefs-drum.md b/.changeset/polite-chefs-drum.md deleted file mode 100644 index 983b6be8b..000000000 --- a/.changeset/polite-chefs-drum.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -fix typo diff --git a/.changeset/pre.json b/.changeset/pre.json index 5d58b736a..d1deaa4cf 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -1,483 +1,4 @@ { "mode": "pre", - "tag": "beta", - "initialVersions": { - "@effect-app/cli": "2.0.0", - "effect-app": "3.16.0", - "@effect-app/eslint-codegen-model": "1.47.0", - "@effect-app/eslint-shared-config": "0.5.6", - "@effect-app/infra": "3.10.0", - "@effect-app/vue": "2.94.0", - "@effect-app/vue-components": "3.2.0", - "@effect-app/e2e": "4.0.0-beta.282" - }, - "changesets": [ - "active-query-invalidation", - "add-oxlint-integration", - "add-stream-mutation", - "adopt-module-system", - "align-invalidation-entry-types", - "align-schema-void-ts-semantics", - "all-phones-dream", - "amber-garlics-sing", - "api-client-isolate-layers", - "atom-query-vue", - "batch-cosmos-acks", - "batch-dual-options", - "big-teams-wash", - "blue-rats-admire", - "bold-berries-change", - "brave-animals-like", - "brave-bushes-fold", - "brave-laws-add", - "brave-oranges-try", - "brave-years-fry", - "bright-camels-grin", - "bright-lions-share", - "bright-mugs-paint", - "bright-peaches-wave", - "bright-trees-count", - "builtin-map-union-receiver", - "cached-per-request-helper", - "calm-clocks-observe", - "calm-cosmos-cluster", - "calm-filter-cycle", - "calm-pallets-listen", - "calm-pets-float", - "calm-picks-refresh", - "chilly-colts-attack", - "chilly-steaks-rule", - "chubby-dolls-yell", - "class-facade-encode-keys", - "clean-atom-suspense", - "clean-sql-data-column", - "clean-unused-dependencies", - "cleanup-tsgolint-codegen", - "clear-cycles-enjoy", - "clever-breads-enter", - "clever-pets-follow", - "cli-preserve-trailing-newline", - "cli-sync-no-tags", - "cli-ue-semver-target", - "client-fetch-property", - "cluster-servicebus-notifications", - "codegen-rule-options", - "cold-brooms-ski", - "cold-rabbits-pay", - "command-button-optional-input", - "commander-state-toast-types", - "commander-stream-fn", - "common-schools-stop", - "computed-projections-extensions", - "computed-projections-infra", - "concurrent-decode-helpers", - "config-nested-native", - "configurable-barrel-import-extension", - "configurable-mutation-invalidation", - "context-map-resolver-cache", - "cool-needles-wash", - "core-boundary-split", - "cosmos-cluster-occ-tests", - "cosmos-every-param-shift", - "cosmos-filter-seed", - "cosmos-namespace-spans", - "cosmos-namespace-support", - "cosmos-span-response-size", - "cosmos-workflow-engine", - "cozy-cats-lie", - "crisp-seals-care", - "crisp-trees-smash", - "ctxmap-per-request-memomap", - "cuddly-laws-smell", - "cups-error-tagged", - "curly-beds-sing", - "curly-dolls-double", - "curvy-files-share", - "curvy-pugs-rush", - "cyan-experts-smoke", - "cyan-pianos-peel", - "cyan-things-train", - "date-defaults-pipe-self", - "date-identifier-split", - "delay-waiting-toast", - "disable-query-invalidation", - "document-query-project-modes", - "drop-constructor-default", - "easy-aliens-peel", - "easy-spiders-study", - "effa-sync-shared", - "effa-sync-update-flag", - "effect-app-prefer-fn-untraced", - "eighty-aliens-hide", - "eighty-signs-smile", - "eleven-eyes-lie", - "empty-queens-begin", - "empty-rules-check", - "eslint-codegen-glob-11", - "expose-make-on-query-command", - "extract-fixed-nuxt-error-boundary", - "facade-hardening-error-facade", - "fair-baboons-marry", - "fair-oranges-wave", - "fair-tables-march", - "famous-plums-watch", - "fancy-ducks-run", - "fast-loops-scream", - "fiery-feet-sleep", - "fiery-suits-kneel", - "five-trams-repeat", - "fix-class-type-export", - "fix-cli-gist-cache-id", - "fix-client-input-stream", - "fix-contextmap-leak", - "fix-cosmos-cluster-deferred", - "fix-cosmos-cluster-machineid", - "fix-cosmos-workflow-engine", - "fix-is-generator-function", - "fix-json-schema-annotations", - "fix-jsonschema-postprocess", - "fix-onedsl-r-inference", - "fix-pascalcase-barrel", - "fix-path-recursive-index-signature", - "fix-project-encodekeys-selection", - "fix-projection-union-adapter", - "fix-repo-transformed-id-union", - "fix-repo-transformed-id", - "fix-resolver-cache-precheck", - "fix-schema-interface-widening", - "fix-seed-marker-and-circular-dep", - "fix-sql-array-relation-queries", - "fix-sql-in-null-handling", - "fix-sql-includes-serialize", - "fix-sql-json-from-string-codec", - "fix-sql-namespace-params", - "fix-sql-pg-seed-migrations-table", - "fix-sql-select-etag-column", - "fix-sql-select-types-and-defaults", - "fix-sql-whereevery-flip", - "fix-sqlite-per-ns-seed-migrations-table", - "fix-transformed-struct-defaults", - "fix-vue-form-numeric-type-detection", - "fix-vue-interrupt-tests", - "fix-vue-lint-typescript-version", - "flat-turkeys-invent", - "flatten-nested-anyof", - "forty-bottles-tease", - "frank-ends-switch", - "frank-memes-sin", - "frank-papayas-design", - "fresh-buckets-pump", - "fresh-candles-shake", - "fresh-indexed-fields", - "fresh-mails-visit", - "fresh-paths-say", - "fresh-pianos-argue", - "friendly-points-drum", - "fruity-meteors-fix", - "full-oranges-heal", - "full-pugs-fall", - "funky-guests-switch", - "funny-webs-clap", - "fuzzy-eels-decide", - "fuzzy-eggs-jump", - "gentle-bats-leave", - "gentle-donkeys-tease", - "gold-ghosts-laugh", - "gold-wolves-shake", - "green-coins-talk", - "green-frogs-check", - "green-snakes-poke", - "green-taxis-project-hash", - "green-taxis-rule", - "handle-mutate-request-always-functions", - "handler-input-make-aligned", - "heavy-bears-appear", - "heavy-ducks-show", - "honest-planets-fry", - "http-span-name", - "huge-carrots-deny", - "humble-walls-fail", - "icy-paws-return", - "indefinite-waiting-toast", - "infra-prefer-fn-untraced", - "infra-sentry-node-dep", - "invalidation-set-add-shortcut-and-batch", - "itchy-mangos-find", - "khaki-frogs-wave", - "kind-lizards-bathe", - "large-pugs-strive", - "late-forks-obey", - "lazy-boats-lay", - "lazy-model-facades", - "legal-weeks-raise", - "lemon-emus-behave", - "little-berries-sip", - "little-planets-bake", - "live-query-dependencies", - "long-regions-change", - "loud-planets-cheer", - "lucky-papayas-fetch", - "lucky-streets-add", - "lucky-zebras-invent", - "major-drinks-stop", - "major-planets-lie", - "many-ideas-report", - "meta-codegen-no-export", - "meta-module-name-override", - "metal-mammals-smell", - "middleware-error-from-dynamic-rcm", - "middleware-errors-via-rpc-tag", - "mighty-hoops-help", - "migrate-tsgolint", - "modern-humans-chew", - "moody-peas-smoke", - "mutate-invalidation-shorthands", - "mutate-wrap-stream-no-args", - "namespaced-change-feed", - "native-encoded-query-json", - "neat-brooms-wave", - "neat-dingos-tease", - "neat-pumpkins-juggle", - "new-badgers-wait", - "new-berries-march", - "nice-jars-grow", - "nice-needles-film", - "nice-shrimps-fold", - "ninety-stamps-end", - "no-await-effect", - "number-input-dual-separator", - "odd-deers-work", - "odd-tigers-scope", - "old-snakes-film", - "old-suns-kneel", - "olive-onions-lose", - "omega-native-input-types", - "omega-nullable-nested-struct", - "omegaform-between-localization", - "omegaform-decodeto-meta-from-encoded", - "omegaform-enter-submit-repro", - "omegaform-input-registry", - "omegaform-module-split", - "omegaform-typecheck-stories", - "omegaform-vnumber-input", - "optimize-codegen-barrel-model", - "otel-semconv-spans", - "payload-summary-recurse", - "per-namespace-seeding", - "petite-tables-cover", - "polite-chefs-drum", - "project-computed-type-safety", - "project-encoded-type-constraint", - "project-union-schema", - "project-union-subsets", - "projectable-from-domain", - "projectable-key-guard-project", - "provide-dual", - "publish-tsconfig-postpack", - "pure-usesync-cleanup", - "query-aggregate-support", - "query-map-has-ops", - "query-optional-mode", - "query-span-propagation", - "quick-seals-relate", - "quick-wolves-yawn", - "quiet-shrimps-juggle", - "quiet-tigers-reply", - "quiet-tools-rest", - "rare-llamas-begin", - "rare-rules-help", - "ready-bags-wave", - "ready-bananas-scream", - "real-lilies-design", - "real-suits-clean", - "recover-stuck-query-interrupts", - "red-pillows-repeat", - "relation-collect-fields", - "remove-by-id-array", - "remove-class-struct-pick-omit", - "remove-legacy-from-make-client", - "remove-legacy-mutate-result-2", - "remove-lodash-from-effect-app", - "remove-operations", - "remove-queue-machinery", - "remove-tagged-error-compat", - "remove-tagged-request", - "remove-void-schema-override", - "remove-withDefaultConstructor", - "rename-mutate-stream", - "rename-withdefault-to-withconstructordefault", - "replace-proxify-with-accessors", - "repo-derived-query-invalidation", - "repo-mutations-accept-empty-arrays", - "repo-span-topology", - "repo-spans-itemtype", - "repository-registry", - "request-scoped-dependencies", - "require-middleware-layers", - "resolver-cache-use-official", - "restore-tight-project-guard", - "router-no-meta", - "rpc-stream-support", - "salty-weeks-walk", - "schema-concurrency-unbounded", - "schema-encode-slow-metrics", - "schema-facade-identifier-structfacade", - "schema-json-collections", - "secret-url-tests", - "select-delayed-cache-invalidation", - "sendgrid-configurable-fake-address", - "server-driven-cache-invalidation", - "server-invalidation-handler-shorthand", - "servicebus-log-only-spans", - "shaggy-terms-show", - "shaggy-waves-slide", - "shaggy-wolves-grow", - "share-oxlintrc-config", - "sharp-buses-bow", - "sharp-seals-clean", - "short-cats-march", - "short-frogs-add", - "short-suns-travel", - "shy-squids-make", - "silent-results-shave", - "silent-rooms-throw", - "silly-eggs-roll", - "single-invalidate-query-call", - "six-regions-start", - "six-yaks-stop", - "sixty-meals-sin", - "slimy-apes-film", - "slimy-lions-laugh", - "slimy-schools-fold", - "slow-readers-wave", - "small-papers-sneeze", - "small-wolves-knock", - "smart-beers-listen", - "smart-candles-rest", - "soft-books-win", - "soft-guests-relax", - "soft-mails-brush", - "soft-work-invalidations", - "sour-turtles-smash", - "source-first-package-exports", - "sparkly-cars-press", - "spicy-falcons-rush", - "spicy-lights-trade", - "sql-namespace-support", - "sql-store-adapter", - "sql-transaction-middleware", - "sqlite-per-namespace-layermap", - "sqlite-workflow-engine", - "sse-context-map-scope", - "sse-filter-namespace-by-storeid", - "staged-publish-directory", - "stale-actors-remain", - "stale-emus-see", - "stale-papers-join", - "store-effect-cached", - "store-json-values", - "store-seed-uninterruptible", - "stream-callable-progress", - "stream-drain-data-dependencies", - "stream-effect-fail", - "stream-final-default-success", - "stream-final-type", - "stream-first-write-flush", - "stream-fn-enhancements", - "stream-metadata-v1", - "stream-on-command-query", - "stream-withdefaulttoast", - "strict-stream-handlers", - "strong-dots-sin", - "struct-pick-omit", - "structfacade-effect-app-struct", - "suspense-keep-previous-value", - "sweet-humans-ring", - "sweet-moments-see", - "swift-owls-knit", - "swift-tables-turn", - "sync-effect-app-command", - "sync-effect-subtree", - "sync-effect-url", - "sync-push-deletions", - "synchronous-change-feed", - "tagged-request-command-query-split", - "tagged-request-for", - "tagged-union-drop-fields-constraint", - "tagged-union-generate-guards", - "tagged-union-generate-guards2", - "tall-boxes-relax", - "tall-hats-reflect", - "tanstack-effect-equal-structural-sharing", - "tanstack-suspense-seed", - "tasty-eggs-stare", - "tasty-fans-accept", - "ten-crews-like", - "ten-suns-shine", - "tender-bars-ring", - "tender-donkeys-pick", - "thin-zebras-press", - "thirty-cooks-pump", - "thirty-experts-taste", - "three-hotels-roll", - "tidy-caches-reflect", - "tidy-cosmos-batches", - "tidy-derived-dependencies", - "tidy-dprint-oxlint-config", - "tidy-effects-diagnose", - "tidy-forms-report", - "tidy-pans-rule", - "tidy-poets-think", - "tidy-remaining-formatting", - "tidy-rivers-identify", - "tidy-titles-remove", - "tiny-cows-repair", - "tiny-gorillas-jump", - "tired-insects-stand", - "toast-group-request-id", - "tough-apes-whisper", - "tsgo-decodingservices-workaround", - "tsgo-direct-schema-property-access", - "twenty-seas-grab", - "two-clocks-wash", - "typed-database-error", - "typed-query-builders", - "unify-emailer-spans", - "unify-parsemany-spans", - "update-effect-beta-107", - "update-effect-beta-36", - "update-effect-beta-52", - "update-effect-beta-60-rpc-custom", - "update-effect-beta-66", - "update-effect-beta-67", - "update-effect-beta-83", - "update-effect-beta-84", - "update-effect-beta-86", - "update-effect-beta-88", - "update-effect-beta-90", - "update-effect-pkgprnew", - "update-effect-rc-112", - "upset-aliens-bathe", - "upset-bugs-roll", - "version-independent-snapshot", - "vue-components-src-exports", - "vue-components-vuetify-typecheck", - "vue-placeholder-data-fallback", - "vue-prefer-fn-untraced", - "vue-stream-query", - "vue-suspense-result-race", - "vue-unified-invalidation-foreach", - "wacky-deer-decide", - "warm-maps-reflect", - "warm-streets-smell", - "wet-roses-press", - "wet-sites-fall", - "wild-olives-bathe", - "wild-wombats-nail", - "wise-items-warn", - "wise-stamps-crash", - "withdefaulttoaststream-progress", - "witty-bats-return", - "wrap-stream-command" - ] + "tag": "rc" } diff --git a/repos/effect/.changeset/pre/add-adaptive-rate-limiter-store.md b/.changeset/pre/add-adaptive-rate-limiter-store.md similarity index 100% rename from repos/effect/.changeset/pre/add-adaptive-rate-limiter-store.md rename to .changeset/pre/add-adaptive-rate-limiter-store.md diff --git a/repos/effect/.changeset/pre/add-atom-equality.md b/.changeset/pre/add-atom-equality.md similarity index 100% rename from repos/effect/.changeset/pre/add-atom-equality.md rename to .changeset/pre/add-atom-equality.md diff --git a/repos/effect/.changeset/pre/add-bigdecimal-sumall-multiplyall.md b/.changeset/pre/add-bigdecimal-sumall-multiplyall.md similarity index 100% rename from repos/effect/.changeset/pre/add-bigdecimal-sumall-multiplyall.md rename to .changeset/pre/add-bigdecimal-sumall-multiplyall.md diff --git a/repos/effect/.changeset/pre/add-chunk-schema.md b/.changeset/pre/add-chunk-schema.md similarity index 100% rename from repos/effect/.changeset/pre/add-chunk-schema.md rename to .changeset/pre/add-chunk-schema.md diff --git a/repos/effect/.changeset/pre/add-command-hidden.md b/.changeset/pre/add-command-hidden.md similarity index 100% rename from repos/effect/.changeset/pre/add-command-hidden.md rename to .changeset/pre/add-command-hidden.md diff --git a/repos/effect/.changeset/pre/add-config-nested.md b/.changeset/pre/add-config-nested.md similarity index 100% rename from repos/effect/.changeset/pre/add-config-nested.md rename to .changeset/pre/add-config-nested.md diff --git a/repos/effect/.changeset/pre/add-deno-file-system.md b/.changeset/pre/add-deno-file-system.md similarity index 100% rename from repos/effect/.changeset/pre/add-deno-file-system.md rename to .changeset/pre/add-deno-file-system.md diff --git a/repos/effect/.changeset/pre/add-deno-http-client.md b/.changeset/pre/add-deno-http-client.md similarity index 100% rename from repos/effect/.changeset/pre/add-deno-http-client.md rename to .changeset/pre/add-deno-http-client.md diff --git a/repos/effect/.changeset/pre/add-deno-multipart.md b/.changeset/pre/add-deno-multipart.md similarity index 100% rename from repos/effect/.changeset/pre/add-deno-multipart.md rename to .changeset/pre/add-deno-multipart.md diff --git a/repos/effect/.changeset/pre/add-deno-socket-server.md b/.changeset/pre/add-deno-socket-server.md similarity index 100% rename from repos/effect/.changeset/pre/add-deno-socket-server.md rename to .changeset/pre/add-deno-socket-server.md diff --git a/repos/effect/.changeset/pre/add-deno-socket.md b/.changeset/pre/add-deno-socket.md similarity index 100% rename from repos/effect/.changeset/pre/add-deno-socket.md rename to .changeset/pre/add-deno-socket.md diff --git a/repos/effect/.changeset/pre/add-flag-hidden.md b/.changeset/pre/add-flag-hidden.md similarity index 100% rename from repos/effect/.changeset/pre/add-flag-hidden.md rename to .changeset/pre/add-flag-hidden.md diff --git a/repos/effect/.changeset/pre/add-from-string-schemas.md b/.changeset/pre/add-from-string-schemas.md similarity index 100% rename from repos/effect/.changeset/pre/add-from-string-schemas.md rename to .changeset/pre/add-from-string-schemas.md diff --git a/repos/effect/.changeset/pre/add-headers-remove-many.md b/.changeset/pre/add-headers-remove-many.md similarity index 100% rename from repos/effect/.changeset/pre/add-headers-remove-many.md rename to .changeset/pre/add-headers-remove-many.md diff --git a/repos/effect/.changeset/pre/add-http-client-request-update-headers.md b/.changeset/pre/add-http-client-request-update-headers.md similarity index 100% rename from repos/effect/.changeset/pre/add-http-client-request-update-headers.md rename to .changeset/pre/add-http-client-request-update-headers.md diff --git a/repos/effect/.changeset/pre/add-http-client-tracer-header-filter.md b/.changeset/pre/add-http-client-tracer-header-filter.md similarity index 100% rename from repos/effect/.changeset/pre/add-http-client-tracer-header-filter.md rename to .changeset/pre/add-http-client-tracer-header-filter.md diff --git a/repos/effect/.changeset/pre/add-httpapi-with-headers.md b/.changeset/pre/add-httpapi-with-headers.md similarity index 100% rename from repos/effect/.changeset/pre/add-httpapi-with-headers.md rename to .changeset/pre/add-httpapi-with-headers.md diff --git a/repos/effect/.changeset/pre/add-indexeddb-kvs-layer.md b/.changeset/pre/add-indexeddb-kvs-layer.md similarity index 100% rename from repos/effect/.changeset/pre/add-indexeddb-kvs-layer.md rename to .changeset/pre/add-indexeddb-kvs-layer.md diff --git a/repos/effect/.changeset/pre/add-json-schema-draft-04.md b/.changeset/pre/add-json-schema-draft-04.md similarity index 100% rename from repos/effect/.changeset/pre/add-json-schema-draft-04.md rename to .changeset/pre/add-json-schema-draft-04.md diff --git a/repos/effect/.changeset/pre/add-make-msgpack.md b/.changeset/pre/add-make-msgpack.md similarity index 100% rename from repos/effect/.changeset/pre/add-make-msgpack.md rename to .changeset/pre/add-make-msgpack.md diff --git a/repos/effect/.changeset/pre/add-make-option.md b/.changeset/pre/add-make-option.md similarity index 100% rename from repos/effect/.changeset/pre/add-make-option.md rename to .changeset/pre/add-make-option.md diff --git a/repos/effect/.changeset/pre/add-mcp-2025-11-25-protocol.md b/.changeset/pre/add-mcp-2025-11-25-protocol.md similarity index 100% rename from repos/effect/.changeset/pre/add-mcp-2025-11-25-protocol.md rename to .changeset/pre/add-mcp-2025-11-25-protocol.md diff --git a/repos/effect/.changeset/pre/add-mcp-icons.md b/.changeset/pre/add-mcp-icons.md similarity index 100% rename from repos/effect/.changeset/pre/add-mcp-icons.md rename to .changeset/pre/add-mcp-icons.md diff --git a/repos/effect/.changeset/pre/add-missing-tx-modules.md b/.changeset/pre/add-missing-tx-modules.md similarity index 100% rename from repos/effect/.changeset/pre/add-missing-tx-modules.md rename to .changeset/pre/add-missing-tx-modules.md diff --git a/repos/effect/.changeset/pre/add-newtype-module.md b/.changeset/pre/add-newtype-module.md similarity index 100% rename from repos/effect/.changeset/pre/add-newtype-module.md rename to .changeset/pre/add-newtype-module.md diff --git a/repos/effect/.changeset/pre/add-otlp-manual-flush.md b/.changeset/pre/add-otlp-manual-flush.md similarity index 100% rename from repos/effect/.changeset/pre/add-otlp-manual-flush.md rename to .changeset/pre/add-otlp-manual-flush.md diff --git a/repos/effect/.changeset/pre/add-platform-deno.md b/.changeset/pre/add-platform-deno.md similarity index 100% rename from repos/effect/.changeset/pre/add-platform-deno.md rename to .changeset/pre/add-platform-deno.md diff --git a/repos/effect/.changeset/pre/add-scalar-show-operation-id.md b/.changeset/pre/add-scalar-show-operation-id.md similarity index 100% rename from repos/effect/.changeset/pre/add-scalar-show-operation-id.md rename to .changeset/pre/add-scalar-show-operation-id.md diff --git a/repos/effect/.changeset/pre/add-schedule-tap.md b/.changeset/pre/add-schedule-tap.md similarity index 100% rename from repos/effect/.changeset/pre/add-schedule-tap.md rename to .changeset/pre/add-schedule-tap.md diff --git a/repos/effect/.changeset/pre/add-schema-annotate-encoded.md b/.changeset/pre/add-schema-annotate-encoded.md similarity index 100% rename from repos/effect/.changeset/pre/add-schema-annotate-encoded.md rename to .changeset/pre/add-schema-annotate-encoded.md diff --git a/repos/effect/.changeset/pre/add-schema-array-ensure.md b/.changeset/pre/add-schema-array-ensure.md similarity index 100% rename from repos/effect/.changeset/pre/add-schema-array-ensure.md rename to .changeset/pre/add-schema-array-ensure.md diff --git a/repos/effect/.changeset/pre/add-schema-bigdecimal.md b/.changeset/pre/add-schema-bigdecimal.md similarity index 100% rename from repos/effect/.changeset/pre/add-schema-bigdecimal.md rename to .changeset/pre/add-schema-bigdecimal.md diff --git a/repos/effect/.changeset/pre/add-schema-datetime.md b/.changeset/pre/add-schema-datetime.md similarity index 100% rename from repos/effect/.changeset/pre/add-schema-datetime.md rename to .changeset/pre/add-schema-datetime.md diff --git a/repos/effect/.changeset/pre/add-schema-error-module.md b/.changeset/pre/add-schema-error-module.md similarity index 100% rename from repos/effect/.changeset/pre/add-schema-error-module.md rename to .changeset/pre/add-schema-error-module.md diff --git a/repos/effect/.changeset/pre/add-schema-option-from-optional-nullor.md b/.changeset/pre/add-schema-option-from-optional-nullor.md similarity index 100% rename from repos/effect/.changeset/pre/add-schema-option-from-optional-nullor.md rename to .changeset/pre/add-schema-option-from-optional-nullor.md diff --git a/repos/effect/.changeset/pre/add-schema-option-from-undefined-nullish.md b/.changeset/pre/add-schema-option-from-undefined-nullish.md similarity index 100% rename from repos/effect/.changeset/pre/add-schema-option-from-undefined-nullish.md rename to .changeset/pre/add-schema-option-from-undefined-nullish.md diff --git a/repos/effect/.changeset/pre/add-schema-string-encoding.md b/.changeset/pre/add-schema-string-encoding.md similarity index 100% rename from repos/effect/.changeset/pre/add-schema-string-encoding.md rename to .changeset/pre/add-schema-string-encoding.md diff --git a/repos/effect/.changeset/pre/add-schema-tagged-union-discriminants.md b/.changeset/pre/add-schema-tagged-union-discriminants.md similarity index 100% rename from repos/effect/.changeset/pre/add-schema-tagged-union-discriminants.md rename to .changeset/pre/add-schema-tagged-union-discriminants.md diff --git a/repos/effect/.changeset/pre/add-semaphore-take-if-available.md b/.changeset/pre/add-semaphore-take-if-available.md similarity index 100% rename from repos/effect/.changeset/pre/add-semaphore-take-if-available.md rename to .changeset/pre/add-semaphore-take-if-available.md diff --git a/repos/effect/.changeset/pre/add-sql-pglite.md b/.changeset/pre/add-sql-pglite.md similarity index 100% rename from repos/effect/.changeset/pre/add-sql-pglite.md rename to .changeset/pre/add-sql-pglite.md diff --git a/repos/effect/.changeset/pre/add-standard-jsdoc-rule.md b/.changeset/pre/add-standard-jsdoc-rule.md similarity index 100% rename from repos/effect/.changeset/pre/add-standard-jsdoc-rule.md rename to .changeset/pre/add-standard-jsdoc-rule.md diff --git a/repos/effect/.changeset/pre/add-stream-broadcastn.md b/.changeset/pre/add-stream-broadcastn.md similarity index 100% rename from repos/effect/.changeset/pre/add-stream-broadcastn.md rename to .changeset/pre/add-stream-broadcastn.md diff --git a/repos/effect/.changeset/pre/add-tool-set-needs-approval.md b/.changeset/pre/add-tool-set-needs-approval.md similarity index 100% rename from repos/effect/.changeset/pre/add-tool-set-needs-approval.md rename to .changeset/pre/add-tool-set-needs-approval.md diff --git a/repos/effect/.changeset/pre/add-unstable-encoding-export.md b/.changeset/pre/add-unstable-encoding-export.md similarity index 100% rename from repos/effect/.changeset/pre/add-unstable-encoding-export.md rename to .changeset/pre/add-unstable-encoding-export.md diff --git a/repos/effect/.changeset/pre/add-update-service-scoped.md b/.changeset/pre/add-update-service-scoped.md similarity index 100% rename from repos/effect/.changeset/pre/add-update-service-scoped.md rename to .changeset/pre/add-update-service-scoped.md diff --git a/repos/effect/.changeset/pre/add-values-unprepared.md b/.changeset/pre/add-values-unprepared.md similarity index 100% rename from repos/effect/.changeset/pre/add-values-unprepared.md rename to .changeset/pre/add-values-unprepared.md diff --git a/repos/effect/.changeset/pre/afraid-cobras-like.md b/.changeset/pre/afraid-cobras-like.md similarity index 100% rename from repos/effect/.changeset/pre/afraid-cobras-like.md rename to .changeset/pre/afraid-cobras-like.md diff --git a/repos/effect/.changeset/pre/ai-approved-tool-results.md b/.changeset/pre/ai-approved-tool-results.md similarity index 100% rename from repos/effect/.changeset/pre/ai-approved-tool-results.md rename to .changeset/pre/ai-approved-tool-results.md diff --git a/repos/effect/.changeset/pre/ai-openai-config-field-leak.md b/.changeset/pre/ai-openai-config-field-leak.md similarity index 100% rename from repos/effect/.changeset/pre/ai-openai-config-field-leak.md rename to .changeset/pre/ai-openai-config-field-leak.md diff --git a/repos/effect/.changeset/pre/ai-openai-file-nullable-fields.md b/.changeset/pre/ai-openai-file-nullable-fields.md similarity index 100% rename from repos/effect/.changeset/pre/ai-openai-file-nullable-fields.md rename to .changeset/pre/ai-openai-file-nullable-fields.md diff --git a/repos/effect/.changeset/pre/align-type-id-paths.md b/.changeset/pre/align-type-id-paths.md similarity index 100% rename from repos/effect/.changeset/pre/align-type-id-paths.md rename to .changeset/pre/align-type-id-paths.md diff --git a/repos/effect/.changeset/pre/all-union-record-channels.md b/.changeset/pre/all-union-record-channels.md similarity index 100% rename from repos/effect/.changeset/pre/all-union-record-channels.md rename to .changeset/pre/all-union-record-channels.md diff --git a/repos/effect/.changeset/pre/anthropic-4-6-structured-output.md b/.changeset/pre/anthropic-4-6-structured-output.md similarity index 100% rename from repos/effect/.changeset/pre/anthropic-4-6-structured-output.md rename to .changeset/pre/anthropic-4-6-structured-output.md diff --git a/repos/effect/.changeset/pre/anthropic-claude-5-capabilities.md b/.changeset/pre/anthropic-claude-5-capabilities.md similarity index 100% rename from repos/effect/.changeset/pre/anthropic-claude-5-capabilities.md rename to .changeset/pre/anthropic-claude-5-capabilities.md diff --git a/repos/effect/.changeset/pre/anthropic-image-strings.md b/.changeset/pre/anthropic-image-strings.md similarity index 100% rename from repos/effect/.changeset/pre/anthropic-image-strings.md rename to .changeset/pre/anthropic-image-strings.md diff --git a/repos/effect/.changeset/pre/anthropic-open-model-enum.md b/.changeset/pre/anthropic-open-model-enum.md similarity index 100% rename from repos/effect/.changeset/pre/anthropic-open-model-enum.md rename to .changeset/pre/anthropic-open-model-enum.md diff --git a/repos/effect/.changeset/pre/anthropic-stale-max-output-tokens.md b/.changeset/pre/anthropic-stale-max-output-tokens.md similarity index 100% rename from repos/effect/.changeset/pre/anthropic-stale-max-output-tokens.md rename to .changeset/pre/anthropic-stale-max-output-tokens.md diff --git a/repos/effect/.changeset/pre/anthropic-strict-json-schema.md b/.changeset/pre/anthropic-strict-json-schema.md similarity index 100% rename from repos/effect/.changeset/pre/anthropic-strict-json-schema.md rename to .changeset/pre/anthropic-strict-json-schema.md diff --git a/repos/effect/.changeset/pre/anthropic-structured-output-fallback.md b/.changeset/pre/anthropic-structured-output-fallback.md similarity index 100% rename from repos/effect/.changeset/pre/anthropic-structured-output-fallback.md rename to .changeset/pre/anthropic-structured-output-fallback.md diff --git a/repos/effect/.changeset/pre/apply-httpapi-endpoint-client-transform.md b/.changeset/pre/apply-httpapi-endpoint-client-transform.md similarity index 100% rename from repos/effect/.changeset/pre/apply-httpapi-endpoint-client-transform.md rename to .changeset/pre/apply-httpapi-endpoint-client-transform.md diff --git a/repos/effect/.changeset/pre/arbitrary-index-constraints.md b/.changeset/pre/arbitrary-index-constraints.md similarity index 100% rename from repos/effect/.changeset/pre/arbitrary-index-constraints.md rename to .changeset/pre/arbitrary-index-constraints.md diff --git a/repos/effect/.changeset/pre/array-ensure-array-elements.md b/.changeset/pre/array-ensure-array-elements.md similarity index 100% rename from repos/effect/.changeset/pre/array-ensure-array-elements.md rename to .changeset/pre/array-ensure-array-elements.md diff --git a/repos/effect/.changeset/pre/asyncresult-exhaustive.md b/.changeset/pre/asyncresult-exhaustive.md similarity index 100% rename from repos/effect/.changeset/pre/asyncresult-exhaustive.md rename to .changeset/pre/asyncresult-exhaustive.md diff --git a/repos/effect/.changeset/pre/atom-rpc-query-requires.md b/.changeset/pre/atom-rpc-query-requires.md similarity index 100% rename from repos/effect/.changeset/pre/atom-rpc-query-requires.md rename to .changeset/pre/atom-rpc-query-requires.md diff --git a/repos/effect/.changeset/pre/atom-solid-idle-ttl.md b/.changeset/pre/atom-solid-idle-ttl.md similarity index 100% rename from repos/effect/.changeset/pre/atom-solid-idle-ttl.md rename to .changeset/pre/atom-solid-idle-ttl.md diff --git a/repos/effect/.changeset/pre/atom-stream-error-type.md b/.changeset/pre/atom-stream-error-type.md similarity index 100% rename from repos/effect/.changeset/pre/atom-stream-error-type.md rename to .changeset/pre/atom-stream-error-type.md diff --git a/repos/effect/.changeset/pre/atomic-optional-rc-map.md b/.changeset/pre/atomic-optional-rc-map.md similarity index 100% rename from repos/effect/.changeset/pre/atomic-optional-rc-map.md rename to .changeset/pre/atomic-optional-rc-map.md diff --git a/repos/effect/.changeset/pre/authentication-error-description.md b/.changeset/pre/authentication-error-description.md similarity index 100% rename from repos/effect/.changeset/pre/authentication-error-description.md rename to .changeset/pre/authentication-error-description.md diff --git a/repos/effect/.changeset/pre/autocomplete-jk-filter.md b/.changeset/pre/autocomplete-jk-filter.md similarity index 100% rename from repos/effect/.changeset/pre/autocomplete-jk-filter.md rename to .changeset/pre/autocomplete-jk-filter.md diff --git a/repos/effect/.changeset/pre/batch-persistence-expiration-cleanup.md b/.changeset/pre/batch-persistence-expiration-cleanup.md similarity index 100% rename from repos/effect/.changeset/pre/batch-persistence-expiration-cleanup.md rename to .changeset/pre/batch-persistence-expiration-cleanup.md diff --git a/repos/effect/.changeset/pre/beige-goats-sin.md b/.changeset/pre/beige-goats-sin.md similarity index 100% rename from repos/effect/.changeset/pre/beige-goats-sin.md rename to .changeset/pre/beige-goats-sin.md diff --git a/repos/effect/.changeset/pre/beige-paths-sort.md b/.changeset/pre/beige-paths-sort.md similarity index 100% rename from repos/effect/.changeset/pre/beige-paths-sort.md rename to .changeset/pre/beige-paths-sort.md diff --git a/repos/effect/.changeset/pre/better-apples-nail.md b/.changeset/pre/better-apples-nail.md similarity index 100% rename from repos/effect/.changeset/pre/better-apples-nail.md rename to .changeset/pre/better-apples-nail.md diff --git a/repos/effect/.changeset/pre/better-rocks-arrive.md b/.changeset/pre/better-rocks-arrive.md similarity index 100% rename from repos/effect/.changeset/pre/better-rocks-arrive.md rename to .changeset/pre/better-rocks-arrive.md diff --git a/repos/effect/.changeset/pre/better-shrimps-follow.md b/.changeset/pre/better-shrimps-follow.md similarity index 100% rename from repos/effect/.changeset/pre/better-shrimps-follow.md rename to .changeset/pre/better-shrimps-follow.md diff --git a/repos/effect/.changeset/pre/big-masks-care.md b/.changeset/pre/big-masks-care.md similarity index 100% rename from repos/effect/.changeset/pre/big-masks-care.md rename to .changeset/pre/big-masks-care.md diff --git a/repos/effect/.changeset/pre/big-pans-look.md b/.changeset/pre/big-pans-look.md similarity index 100% rename from repos/effect/.changeset/pre/big-pans-look.md rename to .changeset/pre/big-pans-look.md diff --git a/repos/effect/.changeset/pre/blue-dingos-greet.md b/.changeset/pre/blue-dingos-greet.md similarity index 100% rename from repos/effect/.changeset/pre/blue-dingos-greet.md rename to .changeset/pre/blue-dingos-greet.md diff --git a/repos/effect/.changeset/pre/blue-ligers-cheat.md b/.changeset/pre/blue-ligers-cheat.md similarity index 100% rename from repos/effect/.changeset/pre/blue-ligers-cheat.md rename to .changeset/pre/blue-ligers-cheat.md diff --git a/repos/effect/.changeset/pre/blue-onions-smile.md b/.changeset/pre/blue-onions-smile.md similarity index 100% rename from repos/effect/.changeset/pre/blue-onions-smile.md rename to .changeset/pre/blue-onions-smile.md diff --git a/repos/effect/.changeset/pre/blue-pigs-push.md b/.changeset/pre/blue-pigs-push.md similarity index 100% rename from repos/effect/.changeset/pre/blue-pigs-push.md rename to .changeset/pre/blue-pigs-push.md diff --git a/repos/effect/.changeset/pre/blue-ravens-type.md b/.changeset/pre/blue-ravens-type.md similarity index 100% rename from repos/effect/.changeset/pre/blue-ravens-type.md rename to .changeset/pre/blue-ravens-type.md diff --git a/repos/effect/.changeset/pre/blue-trams-kiss.md b/.changeset/pre/blue-trams-kiss.md similarity index 100% rename from repos/effect/.changeset/pre/blue-trams-kiss.md rename to .changeset/pre/blue-trams-kiss.md diff --git a/repos/effect/.changeset/pre/bold-chairs-yawn.md b/.changeset/pre/bold-chairs-yawn.md similarity index 100% rename from repos/effect/.changeset/pre/bold-chairs-yawn.md rename to .changeset/pre/bold-chairs-yawn.md diff --git a/repos/effect/.changeset/pre/bold-planets-shout.md b/.changeset/pre/bold-planets-shout.md similarity index 100% rename from repos/effect/.changeset/pre/bold-planets-shout.md rename to .changeset/pre/bold-planets-shout.md diff --git a/repos/effect/.changeset/pre/brave-keys-commit.md b/.changeset/pre/brave-keys-commit.md similarity index 100% rename from repos/effect/.changeset/pre/brave-keys-commit.md rename to .changeset/pre/brave-keys-commit.md diff --git a/repos/effect/.changeset/pre/brave-rings-update.md b/.changeset/pre/brave-rings-update.md similarity index 100% rename from repos/effect/.changeset/pre/brave-rings-update.md rename to .changeset/pre/brave-rings-update.md diff --git a/repos/effect/.changeset/pre/breezy-meals-see.md b/.changeset/pre/breezy-meals-see.md similarity index 100% rename from repos/effect/.changeset/pre/breezy-meals-see.md rename to .changeset/pre/breezy-meals-see.md diff --git a/repos/effect/.changeset/pre/bright-bugs-bow.md b/.changeset/pre/bright-bugs-bow.md similarity index 100% rename from repos/effect/.changeset/pre/bright-bugs-bow.md rename to .changeset/pre/bright-bugs-bow.md diff --git a/repos/effect/.changeset/pre/bright-canyons-clean.md b/.changeset/pre/bright-canyons-clean.md similarity index 100% rename from repos/effect/.changeset/pre/bright-canyons-clean.md rename to .changeset/pre/bright-canyons-clean.md diff --git a/repos/effect/.changeset/pre/bright-clocks-count.md b/.changeset/pre/bright-clocks-count.md similarity index 100% rename from repos/effect/.changeset/pre/bright-clocks-count.md rename to .changeset/pre/bright-clocks-count.md diff --git a/repos/effect/.changeset/pre/bright-docs-teach.md b/.changeset/pre/bright-docs-teach.md similarity index 100% rename from repos/effect/.changeset/pre/bright-docs-teach.md rename to .changeset/pre/bright-docs-teach.md diff --git a/repos/effect/.changeset/pre/bright-dogs-fail.md b/.changeset/pre/bright-dogs-fail.md similarity index 100% rename from repos/effect/.changeset/pre/bright-dogs-fail.md rename to .changeset/pre/bright-dogs-fail.md diff --git a/repos/effect/.changeset/pre/bright-flags-stand.md b/.changeset/pre/bright-flags-stand.md similarity index 100% rename from repos/effect/.changeset/pre/bright-flags-stand.md rename to .changeset/pre/bright-flags-stand.md diff --git a/repos/effect/.changeset/pre/bright-graphs-calculate.md b/.changeset/pre/bright-graphs-calculate.md similarity index 100% rename from repos/effect/.changeset/pre/bright-graphs-calculate.md rename to .changeset/pre/bright-graphs-calculate.md diff --git a/repos/effect/.changeset/pre/bright-graphs-trace.md b/.changeset/pre/bright-graphs-trace.md similarity index 100% rename from repos/effect/.changeset/pre/bright-graphs-trace.md rename to .changeset/pre/bright-graphs-trace.md diff --git a/repos/effect/.changeset/pre/bright-journals-commit.md b/.changeset/pre/bright-journals-commit.md similarity index 100% rename from repos/effect/.changeset/pre/bright-journals-commit.md rename to .changeset/pre/bright-journals-commit.md diff --git a/repos/effect/.changeset/pre/bright-laws-teach.md b/.changeset/pre/bright-laws-teach.md similarity index 100% rename from repos/effect/.changeset/pre/bright-laws-teach.md rename to .changeset/pre/bright-laws-teach.md diff --git a/repos/effect/.changeset/pre/bright-lemons-dance.md b/.changeset/pre/bright-lemons-dance.md similarity index 100% rename from repos/effect/.changeset/pre/bright-lemons-dance.md rename to .changeset/pre/bright-lemons-dance.md diff --git a/repos/effect/.changeset/pre/bright-mimes-leave.md b/.changeset/pre/bright-mimes-leave.md similarity index 100% rename from repos/effect/.changeset/pre/bright-mimes-leave.md rename to .changeset/pre/bright-mimes-leave.md diff --git a/repos/effect/.changeset/pre/bright-planes-smash.md b/.changeset/pre/bright-planes-smash.md similarity index 100% rename from repos/effect/.changeset/pre/bright-planes-smash.md rename to .changeset/pre/bright-planes-smash.md diff --git a/repos/effect/.changeset/pre/bright-rats-attend.md b/.changeset/pre/bright-rats-attend.md similarity index 100% rename from repos/effect/.changeset/pre/bright-rats-attend.md rename to .changeset/pre/bright-rats-attend.md diff --git a/repos/effect/.changeset/pre/bright-sockets-connect.md b/.changeset/pre/bright-sockets-connect.md similarity index 100% rename from repos/effect/.changeset/pre/bright-sockets-connect.md rename to .changeset/pre/bright-sockets-connect.md diff --git a/repos/effect/.changeset/pre/bright-tags-recognize.md b/.changeset/pre/bright-tags-recognize.md similarity index 100% rename from repos/effect/.changeset/pre/bright-tags-recognize.md rename to .changeset/pre/bright-tags-recognize.md diff --git a/repos/effect/.changeset/pre/bright-toes-rush.md b/.changeset/pre/bright-toes-rush.md similarity index 100% rename from repos/effect/.changeset/pre/bright-toes-rush.md rename to .changeset/pre/bright-toes-rush.md diff --git a/repos/effect/.changeset/pre/brown-glasses-thank.md b/.changeset/pre/brown-glasses-thank.md similarity index 100% rename from repos/effect/.changeset/pre/brown-glasses-thank.md rename to .changeset/pre/brown-glasses-thank.md diff --git a/repos/effect/.changeset/pre/brown-peas-enter.md b/.changeset/pre/brown-peas-enter.md similarity index 100% rename from repos/effect/.changeset/pre/brown-peas-enter.md rename to .changeset/pre/brown-peas-enter.md diff --git a/repos/effect/.changeset/pre/browser-crypto-missing-subtle.md b/.changeset/pre/browser-crypto-missing-subtle.md similarity index 100% rename from repos/effect/.changeset/pre/browser-crypto-missing-subtle.md rename to .changeset/pre/browser-crypto-missing-subtle.md diff --git a/repos/effect/.changeset/pre/browser-indexeddb-binary-key-existence.md b/.changeset/pre/browser-indexeddb-binary-key-existence.md similarity index 100% rename from repos/effect/.changeset/pre/browser-indexeddb-binary-key-existence.md rename to .changeset/pre/browser-indexeddb-binary-key-existence.md diff --git a/repos/effect/.changeset/pre/browser-runtime-custom-teardown.md b/.changeset/pre/browser-runtime-custom-teardown.md similarity index 100% rename from repos/effect/.changeset/pre/browser-runtime-custom-teardown.md rename to .changeset/pre/browser-runtime-custom-teardown.md diff --git a/repos/effect/.changeset/pre/bumpy-boxes-teach.md b/.changeset/pre/bumpy-boxes-teach.md similarity index 100% rename from repos/effect/.changeset/pre/bumpy-boxes-teach.md rename to .changeset/pre/bumpy-boxes-teach.md diff --git a/repos/effect/.changeset/pre/bun-http-server-unix-address.md b/.changeset/pre/bun-http-server-unix-address.md similarity index 100% rename from repos/effect/.changeset/pre/bun-http-server-unix-address.md rename to .changeset/pre/bun-http-server-unix-address.md diff --git a/repos/effect/.changeset/pre/bun-stream-preserve-failure.md b/.changeset/pre/bun-stream-preserve-failure.md similarity index 100% rename from repos/effect/.changeset/pre/bun-stream-preserve-failure.md rename to .changeset/pre/bun-stream-preserve-failure.md diff --git a/repos/effect/.changeset/pre/bun-websocket-outgoing-compression.md b/.changeset/pre/bun-websocket-outgoing-compression.md similarity index 100% rename from repos/effect/.changeset/pre/bun-websocket-outgoing-compression.md rename to .changeset/pre/bun-websocket-outgoing-compression.md diff --git a/repos/effect/.changeset/pre/busy-lions-sneeze.md b/.changeset/pre/busy-lions-sneeze.md similarity index 100% rename from repos/effect/.changeset/pre/busy-lions-sneeze.md rename to .changeset/pre/busy-lions-sneeze.md diff --git a/repos/effect/.changeset/pre/busy-maps-attend.md b/.changeset/pre/busy-maps-attend.md similarity index 100% rename from repos/effect/.changeset/pre/busy-maps-attend.md rename to .changeset/pre/busy-maps-attend.md diff --git a/repos/effect/.changeset/pre/cache-invalidate-when-replacement.md b/.changeset/pre/cache-invalidate-when-replacement.md similarity index 100% rename from repos/effect/.changeset/pre/cache-invalidate-when-replacement.md rename to .changeset/pre/cache-invalidate-when-replacement.md diff --git a/repos/effect/.changeset/pre/cache-refresh-cancellation-ownership.md b/.changeset/pre/cache-refresh-cancellation-ownership.md similarity index 100% rename from repos/effect/.changeset/pre/cache-refresh-cancellation-ownership.md rename to .changeset/pre/cache-refresh-cancellation-ownership.md diff --git a/repos/effect/.changeset/pre/cache-refresh-capacity.md b/.changeset/pre/cache-refresh-capacity.md similarity index 100% rename from repos/effect/.changeset/pre/cache-refresh-capacity.md rename to .changeset/pre/cache-refresh-capacity.md diff --git a/repos/effect/.changeset/pre/cache-refresh-zero-ttl-ownership.md b/.changeset/pre/cache-refresh-zero-ttl-ownership.md similarity index 100% rename from repos/effect/.changeset/pre/cache-refresh-zero-ttl-ownership.md rename to .changeset/pre/cache-refresh-zero-ttl-ownership.md diff --git a/repos/effect/.changeset/pre/cache-synchronous-interruption.md b/.changeset/pre/cache-synchronous-interruption.md similarity index 100% rename from repos/effect/.changeset/pre/cache-synchronous-interruption.md rename to .changeset/pre/cache-synchronous-interruption.md diff --git a/repos/effect/.changeset/pre/cached-with-ttl-callback.md b/.changeset/pre/cached-with-ttl-callback.md similarity index 100% rename from repos/effect/.changeset/pre/cached-with-ttl-callback.md rename to .changeset/pre/cached-with-ttl-callback.md diff --git a/repos/effect/.changeset/pre/calm-atoms-relax.md b/.changeset/pre/calm-atoms-relax.md similarity index 100% rename from repos/effect/.changeset/pre/calm-atoms-relax.md rename to .changeset/pre/calm-atoms-relax.md diff --git a/repos/effect/.changeset/pre/calm-bash-completions.md b/.changeset/pre/calm-bash-completions.md similarity index 100% rename from repos/effect/.changeset/pre/calm-bash-completions.md rename to .changeset/pre/calm-bash-completions.md diff --git a/repos/effect/.changeset/pre/calm-buckets-own.md b/.changeset/pre/calm-buckets-own.md similarity index 100% rename from repos/effect/.changeset/pre/calm-buckets-own.md rename to .changeset/pre/calm-buckets-own.md diff --git a/repos/effect/.changeset/pre/calm-buses-smile.md b/.changeset/pre/calm-buses-smile.md similarity index 100% rename from repos/effect/.changeset/pre/calm-buses-smile.md rename to .changeset/pre/calm-buses-smile.md diff --git a/repos/effect/.changeset/pre/calm-carrots-march.md b/.changeset/pre/calm-carrots-march.md similarity index 100% rename from repos/effect/.changeset/pre/calm-carrots-march.md rename to .changeset/pre/calm-carrots-march.md diff --git a/repos/effect/.changeset/pre/calm-cars-rest.md b/.changeset/pre/calm-cars-rest.md similarity index 100% rename from repos/effect/.changeset/pre/calm-cars-rest.md rename to .changeset/pre/calm-cars-rest.md diff --git a/repos/effect/.changeset/pre/calm-coins-smile.md b/.changeset/pre/calm-coins-smile.md similarity index 100% rename from repos/effect/.changeset/pre/calm-coins-smile.md rename to .changeset/pre/calm-coins-smile.md diff --git a/repos/effect/.changeset/pre/calm-contexts-rest.md b/.changeset/pre/calm-contexts-rest.md similarity index 100% rename from repos/effect/.changeset/pre/calm-contexts-rest.md rename to .changeset/pre/calm-contexts-rest.md diff --git a/repos/effect/.changeset/pre/calm-dates-view.md b/.changeset/pre/calm-dates-view.md similarity index 100% rename from repos/effect/.changeset/pre/calm-dates-view.md rename to .changeset/pre/calm-dates-view.md diff --git a/repos/effect/.changeset/pre/calm-dragons-command.md b/.changeset/pre/calm-dragons-command.md similarity index 100% rename from repos/effect/.changeset/pre/calm-dragons-command.md rename to .changeset/pre/calm-dragons-command.md diff --git a/repos/effect/.changeset/pre/calm-ducks-fail.md b/.changeset/pre/calm-ducks-fail.md similarity index 100% rename from repos/effect/.changeset/pre/calm-ducks-fail.md rename to .changeset/pre/calm-ducks-fail.md diff --git a/repos/effect/.changeset/pre/calm-graphs-span.md b/.changeset/pre/calm-graphs-span.md similarity index 100% rename from repos/effect/.changeset/pre/calm-graphs-span.md rename to .changeset/pre/calm-graphs-span.md diff --git a/repos/effect/.changeset/pre/calm-graphs-travel.md b/.changeset/pre/calm-graphs-travel.md similarity index 100% rename from repos/effect/.changeset/pre/calm-graphs-travel.md rename to .changeset/pre/calm-graphs-travel.md diff --git a/repos/effect/.changeset/pre/calm-headers-hide.md b/.changeset/pre/calm-headers-hide.md similarity index 100% rename from repos/effect/.changeset/pre/calm-headers-hide.md rename to .changeset/pre/calm-headers-hide.md diff --git a/repos/effect/.changeset/pre/calm-heads-close.md b/.changeset/pre/calm-heads-close.md similarity index 100% rename from repos/effect/.changeset/pre/calm-heads-close.md rename to .changeset/pre/calm-heads-close.md diff --git a/repos/effect/.changeset/pre/calm-hounds-smile.md b/.changeset/pre/calm-hounds-smile.md similarity index 100% rename from repos/effect/.changeset/pre/calm-hounds-smile.md rename to .changeset/pre/calm-hounds-smile.md diff --git a/repos/effect/.changeset/pre/calm-keys-repeat.md b/.changeset/pre/calm-keys-repeat.md similarity index 100% rename from repos/effect/.changeset/pre/calm-keys-repeat.md rename to .changeset/pre/calm-keys-repeat.md diff --git a/repos/effect/.changeset/pre/calm-masks-count.md b/.changeset/pre/calm-masks-count.md similarity index 100% rename from repos/effect/.changeset/pre/calm-masks-count.md rename to .changeset/pre/calm-masks-count.md diff --git a/repos/effect/.changeset/pre/calm-pages-hide.md b/.changeset/pre/calm-pages-hide.md similarity index 100% rename from repos/effect/.changeset/pre/calm-pages-hide.md rename to .changeset/pre/calm-pages-hide.md diff --git a/repos/effect/.changeset/pre/calm-pandas-retry.md b/.changeset/pre/calm-pandas-retry.md similarity index 100% rename from repos/effect/.changeset/pre/calm-pandas-retry.md rename to .changeset/pre/calm-pandas-retry.md diff --git a/repos/effect/.changeset/pre/calm-panthers-nail.md b/.changeset/pre/calm-panthers-nail.md similarity index 100% rename from repos/effect/.changeset/pre/calm-panthers-nail.md rename to .changeset/pre/calm-panthers-nail.md diff --git a/repos/effect/.changeset/pre/calm-pears-smile.md b/.changeset/pre/calm-pears-smile.md similarity index 100% rename from repos/effect/.changeset/pre/calm-pears-smile.md rename to .changeset/pre/calm-pears-smile.md diff --git a/repos/effect/.changeset/pre/calm-queues-await.md b/.changeset/pre/calm-queues-await.md similarity index 100% rename from repos/effect/.changeset/pre/calm-queues-await.md rename to .changeset/pre/calm-queues-await.md diff --git a/repos/effect/.changeset/pre/calm-ravens-reflect.md b/.changeset/pre/calm-ravens-reflect.md similarity index 100% rename from repos/effect/.changeset/pre/calm-ravens-reflect.md rename to .changeset/pre/calm-ravens-reflect.md diff --git a/repos/effect/.changeset/pre/calm-readers-transact.md b/.changeset/pre/calm-readers-transact.md similarity index 100% rename from repos/effect/.changeset/pre/calm-readers-transact.md rename to .changeset/pre/calm-readers-transact.md diff --git a/repos/effect/.changeset/pre/calm-redis-clear.md b/.changeset/pre/calm-redis-clear.md similarity index 100% rename from repos/effect/.changeset/pre/calm-redis-clear.md rename to .changeset/pre/calm-redis-clear.md diff --git a/repos/effect/.changeset/pre/calm-results-align.md b/.changeset/pre/calm-results-align.md similarity index 100% rename from repos/effect/.changeset/pre/calm-results-align.md rename to .changeset/pre/calm-results-align.md diff --git a/repos/effect/.changeset/pre/calm-schemas-encode.md b/.changeset/pre/calm-schemas-encode.md similarity index 100% rename from repos/effect/.changeset/pre/calm-schemas-encode.md rename to .changeset/pre/calm-schemas-encode.md diff --git a/repos/effect/.changeset/pre/calm-seas-smile.md b/.changeset/pre/calm-seas-smile.md similarity index 100% rename from repos/effect/.changeset/pre/calm-seas-smile.md rename to .changeset/pre/calm-seas-smile.md diff --git a/repos/effect/.changeset/pre/calm-servers-share.md b/.changeset/pre/calm-servers-share.md similarity index 100% rename from repos/effect/.changeset/pre/calm-servers-share.md rename to .changeset/pre/calm-servers-share.md diff --git a/repos/effect/.changeset/pre/calm-services-rest.md b/.changeset/pre/calm-services-rest.md similarity index 100% rename from repos/effect/.changeset/pre/calm-services-rest.md rename to .changeset/pre/calm-services-rest.md diff --git a/repos/effect/.changeset/pre/calm-squids-hug.md b/.changeset/pre/calm-squids-hug.md similarity index 100% rename from repos/effect/.changeset/pre/calm-squids-hug.md rename to .changeset/pre/calm-squids-hug.md diff --git a/repos/effect/.changeset/pre/calm-tools-parse.md b/.changeset/pre/calm-tools-parse.md similarity index 100% rename from repos/effect/.changeset/pre/calm-tools-parse.md rename to .changeset/pre/calm-tools-parse.md diff --git a/repos/effect/.changeset/pre/calm-tools-remember.md b/.changeset/pre/calm-tools-remember.md similarity index 100% rename from repos/effect/.changeset/pre/calm-tools-remember.md rename to .changeset/pre/calm-tools-remember.md diff --git a/repos/effect/.changeset/pre/calm-tracers-sample.md b/.changeset/pre/calm-tracers-sample.md similarity index 100% rename from repos/effect/.changeset/pre/calm-tracers-sample.md rename to .changeset/pre/calm-tracers-sample.md diff --git a/repos/effect/.changeset/pre/calm-trees-generate.md b/.changeset/pre/calm-trees-generate.md similarity index 100% rename from repos/effect/.changeset/pre/calm-trees-generate.md rename to .changeset/pre/calm-trees-generate.md diff --git a/repos/effect/.changeset/pre/calm-tuples-align.md b/.changeset/pre/calm-tuples-align.md similarity index 100% rename from repos/effect/.changeset/pre/calm-tuples-align.md rename to .changeset/pre/calm-tuples-align.md diff --git a/repos/effect/.changeset/pre/calm-tuples-pick.md b/.changeset/pre/calm-tuples-pick.md similarity index 100% rename from repos/effect/.changeset/pre/calm-tuples-pick.md rename to .changeset/pre/calm-tuples-pick.md diff --git a/repos/effect/.changeset/pre/calm-wolves-reduce.md b/.changeset/pre/calm-wolves-reduce.md similarity index 100% rename from repos/effect/.changeset/pre/calm-wolves-reduce.md rename to .changeset/pre/calm-wolves-reduce.md diff --git a/repos/effect/.changeset/pre/cancel-tedious-requests.md b/.changeset/pre/cancel-tedious-requests.md similarity index 100% rename from repos/effect/.changeset/pre/cancel-tedious-requests.md rename to .changeset/pre/cancel-tedious-requests.md diff --git a/repos/effect/.changeset/pre/canonical-number-schemas.md b/.changeset/pre/canonical-number-schemas.md similarity index 100% rename from repos/effect/.changeset/pre/canonical-number-schemas.md rename to .changeset/pre/canonical-number-schemas.md diff --git a/repos/effect/.changeset/pre/cap-rpc-streaming-buffers.md b/.changeset/pre/cap-rpc-streaming-buffers.md similarity index 100% rename from repos/effect/.changeset/pre/cap-rpc-streaming-buffers.md rename to .changeset/pre/cap-rpc-streaming-buffers.md diff --git a/repos/effect/.changeset/pre/catch-stream-channel-defects.md b/.changeset/pre/catch-stream-channel-defects.md similarity index 100% rename from repos/effect/.changeset/pre/catch-stream-channel-defects.md rename to .changeset/pre/catch-stream-channel-defects.md diff --git a/repos/effect/.changeset/pre/channel-rundone-completion.md b/.changeset/pre/channel-rundone-completion.md similarity index 100% rename from repos/effect/.changeset/pre/channel-rundone-completion.md rename to .changeset/pre/channel-rundone-completion.md diff --git a/repos/effect/.changeset/pre/chatty-poets-type.md b/.changeset/pre/chatty-poets-type.md similarity index 100% rename from repos/effect/.changeset/pre/chatty-poets-type.md rename to .changeset/pre/chatty-poets-type.md diff --git a/repos/effect/.changeset/pre/child-process-astral-escape-arguments.md b/.changeset/pre/child-process-astral-escape-arguments.md similarity index 100% rename from repos/effect/.changeset/pre/child-process-astral-escape-arguments.md rename to .changeset/pre/child-process-astral-escape-arguments.md diff --git a/repos/effect/.changeset/pre/childprocess-process-group-wait.md b/.changeset/pre/childprocess-process-group-wait.md similarity index 100% rename from repos/effect/.changeset/pre/childprocess-process-group-wait.md rename to .changeset/pre/childprocess-process-group-wait.md diff --git a/repos/effect/.changeset/pre/chilled-mice-wash.md b/.changeset/pre/chilled-mice-wash.md similarity index 100% rename from repos/effect/.changeset/pre/chilled-mice-wash.md rename to .changeset/pre/chilled-mice-wash.md diff --git a/repos/effect/.changeset/pre/chilly-pumas-rule.md b/.changeset/pre/chilly-pumas-rule.md similarity index 100% rename from repos/effect/.changeset/pre/chilly-pumas-rule.md rename to .changeset/pre/chilly-pumas-rule.md diff --git a/repos/effect/.changeset/pre/chubby-buckets-feel.md b/.changeset/pre/chubby-buckets-feel.md similarity index 100% rename from repos/effect/.changeset/pre/chubby-buckets-feel.md rename to .changeset/pre/chubby-buckets-feel.md diff --git a/repos/effect/.changeset/pre/chubby-parents-flow.md b/.changeset/pre/chubby-parents-flow.md similarity index 100% rename from repos/effect/.changeset/pre/chubby-parents-flow.md rename to .changeset/pre/chubby-parents-flow.md diff --git a/repos/effect/.changeset/pre/chubby-planets-fall.md b/.changeset/pre/chubby-planets-fall.md similarity index 100% rename from repos/effect/.changeset/pre/chubby-planets-fall.md rename to .changeset/pre/chubby-planets-fall.md diff --git a/repos/effect/.changeset/pre/chunk-slice-concatenation.md b/.changeset/pre/chunk-slice-concatenation.md similarity index 100% rename from repos/effect/.changeset/pre/chunk-slice-concatenation.md rename to .changeset/pre/chunk-slice-concatenation.md diff --git a/repos/effect/.changeset/pre/clean-balloons-tan.md b/.changeset/pre/clean-balloons-tan.md similarity index 100% rename from repos/effect/.changeset/pre/clean-balloons-tan.md rename to .changeset/pre/clean-balloons-tan.md diff --git a/repos/effect/.changeset/pre/clean-bulldogs-care.md b/.changeset/pre/clean-bulldogs-care.md similarity index 100% rename from repos/effect/.changeset/pre/clean-bulldogs-care.md rename to .changeset/pre/clean-bulldogs-care.md diff --git a/repos/effect/.changeset/pre/clean-cats-document.md b/.changeset/pre/clean-cats-document.md similarity index 100% rename from repos/effect/.changeset/pre/clean-cats-document.md rename to .changeset/pre/clean-cats-document.md diff --git a/repos/effect/.changeset/pre/clean-config-names.md b/.changeset/pre/clean-config-names.md similarity index 100% rename from repos/effect/.changeset/pre/clean-config-names.md rename to .changeset/pre/clean-config-names.md diff --git a/repos/effect/.changeset/pre/clean-dryers-sneeze.md b/.changeset/pre/clean-dryers-sneeze.md similarity index 100% rename from repos/effect/.changeset/pre/clean-dryers-sneeze.md rename to .changeset/pre/clean-dryers-sneeze.md diff --git a/repos/effect/.changeset/pre/clean-formatters-agree.md b/.changeset/pre/clean-formatters-agree.md similarity index 100% rename from repos/effect/.changeset/pre/clean-formatters-agree.md rename to .changeset/pre/clean-formatters-agree.md diff --git a/repos/effect/.changeset/pre/clean-geese-work.md b/.changeset/pre/clean-geese-work.md similarity index 100% rename from repos/effect/.changeset/pre/clean-geese-work.md rename to .changeset/pre/clean-geese-work.md diff --git a/repos/effect/.changeset/pre/clean-goats-wave.md b/.changeset/pre/clean-goats-wave.md similarity index 100% rename from repos/effect/.changeset/pre/clean-goats-wave.md rename to .changeset/pre/clean-goats-wave.md diff --git a/repos/effect/.changeset/pre/clean-lions-cancel.md b/.changeset/pre/clean-lions-cancel.md similarity index 100% rename from repos/effect/.changeset/pre/clean-lions-cancel.md rename to .changeset/pre/clean-lions-cancel.md diff --git a/repos/effect/.changeset/pre/clean-needles-shake.md b/.changeset/pre/clean-needles-shake.md similarity index 100% rename from repos/effect/.changeset/pre/clean-needles-shake.md rename to .changeset/pre/clean-needles-shake.md diff --git a/repos/effect/.changeset/pre/clean-tires-guess.md b/.changeset/pre/clean-tires-guess.md similarity index 100% rename from repos/effect/.changeset/pre/clean-tires-guess.md rename to .changeset/pre/clean-tires-guess.md diff --git a/repos/effect/.changeset/pre/clean-yaks-parse.md b/.changeset/pre/clean-yaks-parse.md similarity index 100% rename from repos/effect/.changeset/pre/clean-yaks-parse.md rename to .changeset/pre/clean-yaks-parse.md diff --git a/repos/effect/.changeset/pre/cleanup-before-use-callbacks.md b/.changeset/pre/cleanup-before-use-callbacks.md similarity index 100% rename from repos/effect/.changeset/pre/cleanup-before-use-callbacks.md rename to .changeset/pre/cleanup-before-use-callbacks.md diff --git a/repos/effect/.changeset/pre/clear-graphs-reduce.md b/.changeset/pre/clear-graphs-reduce.md similarity index 100% rename from repos/effect/.changeset/pre/clear-graphs-reduce.md rename to .changeset/pre/clear-graphs-reduce.md diff --git a/repos/effect/.changeset/pre/clear-hairs-pump.md b/.changeset/pre/clear-hairs-pump.md similarity index 100% rename from repos/effect/.changeset/pre/clear-hairs-pump.md rename to .changeset/pre/clear-hairs-pump.md diff --git a/repos/effect/.changeset/pre/clear-spies-boil.md b/.changeset/pre/clear-spies-boil.md similarity index 100% rename from repos/effect/.changeset/pre/clear-spies-boil.md rename to .changeset/pre/clear-spies-boil.md diff --git a/repos/effect/.changeset/pre/clear-wings-relax.md b/.changeset/pre/clear-wings-relax.md similarity index 100% rename from repos/effect/.changeset/pre/clear-wings-relax.md rename to .changeset/pre/clear-wings-relax.md diff --git a/repos/effect/.changeset/pre/clever-maps-care.md b/.changeset/pre/clever-maps-care.md similarity index 100% rename from repos/effect/.changeset/pre/clever-maps-care.md rename to .changeset/pre/clever-maps-care.md diff --git a/repos/effect/.changeset/pre/cli-completion-command-aliases.md b/.changeset/pre/cli-completion-command-aliases.md similarity index 100% rename from repos/effect/.changeset/pre/cli-completion-command-aliases.md rename to .changeset/pre/cli-completion-command-aliases.md diff --git a/repos/effect/.changeset/pre/cli-completion-shared-flags.md b/.changeset/pre/cli-completion-shared-flags.md similarity index 100% rename from repos/effect/.changeset/pre/cli-completion-shared-flags.md rename to .changeset/pre/cli-completion-shared-flags.md diff --git a/repos/effect/.changeset/pre/cli-config-built-ins.md b/.changeset/pre/cli-config-built-ins.md similarity index 100% rename from repos/effect/.changeset/pre/cli-config-built-ins.md rename to .changeset/pre/cli-config-built-ins.md diff --git a/repos/effect/.changeset/pre/cli-help-choices.md b/.changeset/pre/cli-help-choices.md similarity index 100% rename from repos/effect/.changeset/pre/cli-help-choices.md rename to .changeset/pre/cli-help-choices.md diff --git a/repos/effect/.changeset/pre/cli-key-value-pair-first-separator.md b/.changeset/pre/cli-key-value-pair-first-separator.md similarity index 100% rename from repos/effect/.changeset/pre/cli-key-value-pair-first-separator.md rename to .changeset/pre/cli-key-value-pair-first-separator.md diff --git a/repos/effect/.changeset/pre/cli-no-color-values.md b/.changeset/pre/cli-no-color-values.md similarity index 100% rename from repos/effect/.changeset/pre/cli-no-color-values.md rename to .changeset/pre/cli-no-color-values.md diff --git a/repos/effect/.changeset/pre/cli-optional-alternative-flags.md b/.changeset/pre/cli-optional-alternative-flags.md similarity index 100% rename from repos/effect/.changeset/pre/cli-optional-alternative-flags.md rename to .changeset/pre/cli-optional-alternative-flags.md diff --git a/repos/effect/.changeset/pre/cli-scalar-constructor-names.md b/.changeset/pre/cli-scalar-constructor-names.md similarity index 100% rename from repos/effect/.changeset/pre/cli-scalar-constructor-names.md rename to .changeset/pre/cli-scalar-constructor-names.md diff --git a/repos/effect/.changeset/pre/cli-variadic-absence-defaults.md b/.changeset/pre/cli-variadic-absence-defaults.md similarity index 100% rename from repos/effect/.changeset/pre/cli-variadic-absence-defaults.md rename to .changeset/pre/cli-variadic-absence-defaults.md diff --git a/repos/effect/.changeset/pre/cli-wizard-mode.md b/.changeset/pre/cli-wizard-mode.md similarity index 100% rename from repos/effect/.changeset/pre/cli-wizard-mode.md rename to .changeset/pre/cli-wizard-mode.md diff --git a/repos/effect/.changeset/pre/cli-wizard-option-looking-values.md b/.changeset/pre/cli-wizard-option-looking-values.md similarity index 100% rename from repos/effect/.changeset/pre/cli-wizard-option-looking-values.md rename to .changeset/pre/cli-wizard-option-looking-values.md diff --git a/repos/effect/.changeset/pre/close-failed-resource-map-scopes.md b/.changeset/pre/close-failed-resource-map-scopes.md similarity index 100% rename from repos/effect/.changeset/pre/close-failed-resource-map-scopes.md rename to .changeset/pre/close-failed-resource-map-scopes.md diff --git a/repos/effect/.changeset/pre/cluster-active-teardowns.md b/.changeset/pre/cluster-active-teardowns.md similarity index 100% rename from repos/effect/.changeset/pre/cluster-active-teardowns.md rename to .changeset/pre/cluster-active-teardowns.md diff --git a/repos/effect/.changeset/pre/cluster-reply-codec-services.md b/.changeset/pre/cluster-reply-codec-services.md similarity index 100% rename from repos/effect/.changeset/pre/cluster-reply-codec-services.md rename to .changeset/pre/cluster-reply-codec-services.md diff --git a/repos/effect/.changeset/pre/cold-knives-lie.md b/.changeset/pre/cold-knives-lie.md similarity index 100% rename from repos/effect/.changeset/pre/cold-knives-lie.md rename to .changeset/pre/cold-knives-lie.md diff --git a/repos/effect/.changeset/pre/cold-rooms-show.md b/.changeset/pre/cold-rooms-show.md similarity index 100% rename from repos/effect/.changeset/pre/cold-rooms-show.md rename to .changeset/pre/cold-rooms-show.md diff --git a/repos/effect/.changeset/pre/cold-shards-continue.md b/.changeset/pre/cold-shards-continue.md similarity index 100% rename from repos/effect/.changeset/pre/cold-shards-continue.md rename to .changeset/pre/cold-shards-continue.md diff --git a/repos/effect/.changeset/pre/cold-sloths-wave.md b/.changeset/pre/cold-sloths-wave.md similarity index 100% rename from repos/effect/.changeset/pre/cold-sloths-wave.md rename to .changeset/pre/cold-sloths-wave.md diff --git a/repos/effect/.changeset/pre/common-mammals-tickle.md b/.changeset/pre/common-mammals-tickle.md similarity index 100% rename from repos/effect/.changeset/pre/common-mammals-tickle.md rename to .changeset/pre/common-mammals-tickle.md diff --git a/repos/effect/.changeset/pre/compact-json-schema-checks.md b/.changeset/pre/compact-json-schema-checks.md similarity index 100% rename from repos/effect/.changeset/pre/compact-json-schema-checks.md rename to .changeset/pre/compact-json-schema-checks.md diff --git a/repos/effect/.changeset/pre/compact-json-schema-enum.md b/.changeset/pre/compact-json-schema-enum.md similarity index 100% rename from repos/effect/.changeset/pre/compact-json-schema-enum.md rename to .changeset/pre/compact-json-schema-enum.md diff --git a/repos/effect/.changeset/pre/compatible-dependency-refresh.md b/.changeset/pre/compatible-dependency-refresh.md similarity index 100% rename from repos/effect/.changeset/pre/compatible-dependency-refresh.md rename to .changeset/pre/compatible-dependency-refresh.md diff --git a/repos/effect/.changeset/pre/config-provider-option-lookup.md b/.changeset/pre/config-provider-option-lookup.md similarity index 100% rename from repos/effect/.changeset/pre/config-provider-option-lookup.md rename to .changeset/pre/config-provider-option-lookup.md diff --git a/repos/effect/.changeset/pre/config-withdefault-eager.md b/.changeset/pre/config-withdefault-eager.md similarity index 100% rename from repos/effect/.changeset/pre/config-withdefault-eager.md rename to .changeset/pre/config-withdefault-eager.md diff --git a/repos/effect/.changeset/pre/configurable-schema-reference-policy.md b/.changeset/pre/configurable-schema-reference-policy.md similarity index 100% rename from repos/effect/.changeset/pre/configurable-schema-reference-policy.md rename to .changeset/pre/configurable-schema-reference-policy.md diff --git a/repos/effect/.changeset/pre/configure-cluster-rpc-buffer-limits.md b/.changeset/pre/configure-cluster-rpc-buffer-limits.md similarity index 100% rename from repos/effect/.changeset/pre/configure-cluster-rpc-buffer-limits.md rename to .changeset/pre/configure-cluster-rpc-buffer-limits.md diff --git a/repos/effect/.changeset/pre/consolidate-encoding.md b/.changeset/pre/consolidate-encoding.md similarity index 100% rename from repos/effect/.changeset/pre/consolidate-encoding.md rename to .changeset/pre/consolidate-encoding.md diff --git a/repos/effect/.changeset/pre/consolidate-sql-error.md b/.changeset/pre/consolidate-sql-error.md similarity index 100% rename from repos/effect/.changeset/pre/consolidate-sql-error.md rename to .changeset/pre/consolidate-sql-error.md diff --git a/repos/effect/.changeset/pre/context-saved-getter-inference.md b/.changeset/pre/context-saved-getter-inference.md similarity index 100% rename from repos/effect/.changeset/pre/context-saved-getter-inference.md rename to .changeset/pre/context-saved-getter-inference.md diff --git a/repos/effect/.changeset/pre/cookies-error-tag.md b/.changeset/pre/cookies-error-tag.md similarity index 100% rename from repos/effect/.changeset/pre/cookies-error-tag.md rename to .changeset/pre/cookies-error-tag.md diff --git a/repos/effect/.changeset/pre/cozy-geese-remain.md b/.changeset/pre/cozy-geese-remain.md similarity index 100% rename from repos/effect/.changeset/pre/cozy-geese-remain.md rename to .changeset/pre/cozy-geese-remain.md diff --git a/repos/effect/.changeset/pre/crisp-seas-warn.md b/.changeset/pre/crisp-seas-warn.md similarity index 100% rename from repos/effect/.changeset/pre/crisp-seas-warn.md rename to .changeset/pre/crisp-seas-warn.md diff --git a/repos/effect/.changeset/pre/cron-locale-independent-aliases.md b/.changeset/pre/cron-locale-independent-aliases.md similarity index 100% rename from repos/effect/.changeset/pre/cron-locale-independent-aliases.md rename to .changeset/pre/cron-locale-independent-aliases.md diff --git a/repos/effect/.changeset/pre/cron-single-value-step.md b/.changeset/pre/cron-single-value-step.md similarity index 100% rename from repos/effect/.changeset/pre/cron-single-value-step.md rename to .changeset/pre/cron-single-value-step.md diff --git a/repos/effect/.changeset/pre/cron-testclock-infinity.md b/.changeset/pre/cron-testclock-infinity.md similarity index 100% rename from repos/effect/.changeset/pre/cron-testclock-infinity.md rename to .changeset/pre/cron-testclock-infinity.md diff --git a/repos/effect/.changeset/pre/cuddly-rooms-bet.md b/.changeset/pre/cuddly-rooms-bet.md similarity index 100% rename from repos/effect/.changeset/pre/cuddly-rooms-bet.md rename to .changeset/pre/cuddly-rooms-bet.md diff --git a/repos/effect/.changeset/pre/curly-files-range.md b/.changeset/pre/curly-files-range.md similarity index 100% rename from repos/effect/.changeset/pre/curly-files-range.md rename to .changeset/pre/curly-files-range.md diff --git a/repos/effect/.changeset/pre/curly-graphs-connect.md b/.changeset/pre/curly-graphs-connect.md similarity index 100% rename from repos/effect/.changeset/pre/curly-graphs-connect.md rename to .changeset/pre/curly-graphs-connect.md diff --git a/repos/effect/.changeset/pre/curly-graphs-snapshot.md b/.changeset/pre/curly-graphs-snapshot.md similarity index 100% rename from repos/effect/.changeset/pre/curly-graphs-snapshot.md rename to .changeset/pre/curly-graphs-snapshot.md diff --git a/repos/effect/.changeset/pre/curly-poems-talk.md b/.changeset/pre/curly-poems-talk.md similarity index 100% rename from repos/effect/.changeset/pre/curly-poems-talk.md rename to .changeset/pre/curly-poems-talk.md diff --git a/repos/effect/.changeset/pre/curly-ravens-decode.md b/.changeset/pre/curly-ravens-decode.md similarity index 100% rename from repos/effect/.changeset/pre/curly-ravens-decode.md rename to .changeset/pre/curly-ravens-decode.md diff --git a/repos/effect/.changeset/pre/curly-spies-relax.md b/.changeset/pre/curly-spies-relax.md similarity index 100% rename from repos/effect/.changeset/pre/curly-spies-relax.md rename to .changeset/pre/curly-spies-relax.md diff --git a/repos/effect/.changeset/pre/curly-streams-stop.md b/.changeset/pre/curly-streams-stop.md similarity index 100% rename from repos/effect/.changeset/pre/curly-streams-stop.md rename to .changeset/pre/curly-streams-stop.md diff --git a/repos/effect/.changeset/pre/curvy-apples-float.md b/.changeset/pre/curvy-apples-float.md similarity index 100% rename from repos/effect/.changeset/pre/curvy-apples-float.md rename to .changeset/pre/curvy-apples-float.md diff --git a/repos/effect/.changeset/pre/curvy-birds-float.md b/.changeset/pre/curvy-birds-float.md similarity index 100% rename from repos/effect/.changeset/pre/curvy-birds-float.md rename to .changeset/pre/curvy-birds-float.md diff --git a/repos/effect/.changeset/pre/curvy-graphs-code.md b/.changeset/pre/curvy-graphs-code.md similarity index 100% rename from repos/effect/.changeset/pre/curvy-graphs-code.md rename to .changeset/pre/curvy-graphs-code.md diff --git a/repos/effect/.changeset/pre/curvy-melons-stare.md b/.changeset/pre/curvy-melons-stare.md similarity index 100% rename from repos/effect/.changeset/pre/curvy-melons-stare.md rename to .changeset/pre/curvy-melons-stare.md diff --git a/repos/effect/.changeset/pre/curvy-otters-sync.md b/.changeset/pre/curvy-otters-sync.md similarity index 100% rename from repos/effect/.changeset/pre/curvy-otters-sync.md rename to .changeset/pre/curvy-otters-sync.md diff --git a/repos/effect/.changeset/pre/custom-cli-prompt-prefix.md b/.changeset/pre/custom-cli-prompt-prefix.md similarity index 100% rename from repos/effect/.changeset/pre/custom-cli-prompt-prefix.md rename to .changeset/pre/custom-cli-prompt-prefix.md diff --git a/repos/effect/.changeset/pre/custom-http-security-openapi-generator.md b/.changeset/pre/custom-http-security-openapi-generator.md similarity index 100% rename from repos/effect/.changeset/pre/custom-http-security-openapi-generator.md rename to .changeset/pre/custom-http-security-openapi-generator.md diff --git a/repos/effect/.changeset/pre/cute-heads-thank.md b/.changeset/pre/cute-heads-thank.md similarity index 100% rename from repos/effect/.changeset/pre/cute-heads-thank.md rename to .changeset/pre/cute-heads-thank.md diff --git a/repos/effect/.changeset/pre/cyan-loops-grow.md b/.changeset/pre/cyan-loops-grow.md similarity index 100% rename from repos/effect/.changeset/pre/cyan-loops-grow.md rename to .changeset/pre/cyan-loops-grow.md diff --git a/repos/effect/.changeset/pre/cyan-radios-switch.md b/.changeset/pre/cyan-radios-switch.md similarity index 100% rename from repos/effect/.changeset/pre/cyan-radios-switch.md rename to .changeset/pre/cyan-radios-switch.md diff --git a/repos/effect/.changeset/pre/cyan-shirts-grin.md b/.changeset/pre/cyan-shirts-grin.md similarity index 100% rename from repos/effect/.changeset/pre/cyan-shirts-grin.md rename to .changeset/pre/cyan-shirts-grin.md diff --git a/repos/effect/.changeset/pre/d1-batch-statements.md b/.changeset/pre/d1-batch-statements.md similarity index 100% rename from repos/effect/.changeset/pre/d1-batch-statements.md rename to .changeset/pre/d1-batch-statements.md diff --git a/repos/effect/.changeset/pre/d1-raw-native-results.md b/.changeset/pre/d1-raw-native-results.md similarity index 100% rename from repos/effect/.changeset/pre/d1-raw-native-results.md rename to .changeset/pre/d1-raw-native-results.md diff --git a/repos/effect/.changeset/pre/dark-dancers-rule.md b/.changeset/pre/dark-dancers-rule.md similarity index 100% rename from repos/effect/.changeset/pre/dark-dancers-rule.md rename to .changeset/pre/dark-dancers-rule.md diff --git a/repos/effect/.changeset/pre/datetime-calendar-parts.md b/.changeset/pre/datetime-calendar-parts.md similarity index 100% rename from repos/effect/.changeset/pre/datetime-calendar-parts.md rename to .changeset/pre/datetime-calendar-parts.md diff --git a/repos/effect/.changeset/pre/deduplicate-json-schema-fallbacks.md b/.changeset/pre/deduplicate-json-schema-fallbacks.md similarity index 100% rename from repos/effect/.changeset/pre/deduplicate-json-schema-fallbacks.md rename to .changeset/pre/deduplicate-json-schema-fallbacks.md diff --git a/repos/effect/.changeset/pre/deep-rivers-spend.md b/.changeset/pre/deep-rivers-spend.md similarity index 100% rename from repos/effect/.changeset/pre/deep-rivers-spend.md rename to .changeset/pre/deep-rivers-spend.md diff --git a/repos/effect/.changeset/pre/deferred-cleanup-after-completion.md b/.changeset/pre/deferred-cleanup-after-completion.md similarity index 100% rename from repos/effect/.changeset/pre/deferred-cleanup-after-completion.md rename to .changeset/pre/deferred-cleanup-after-completion.md diff --git a/repos/effect/.changeset/pre/deferred-resume-starvation.md b/.changeset/pre/deferred-resume-starvation.md similarity index 100% rename from repos/effect/.changeset/pre/deferred-resume-starvation.md rename to .changeset/pre/deferred-resume-starvation.md diff --git a/repos/effect/.changeset/pre/deno-redis-url-credentials.md b/.changeset/pre/deno-redis-url-credentials.md similarity index 100% rename from repos/effect/.changeset/pre/deno-redis-url-credentials.md rename to .changeset/pre/deno-redis-url-credentials.md diff --git a/repos/effect/.changeset/pre/deno-write-copy-errors.md b/.changeset/pre/deno-write-copy-errors.md similarity index 100% rename from repos/effect/.changeset/pre/deno-write-copy-errors.md rename to .changeset/pre/deno-write-copy-errors.md diff --git a/repos/effect/.changeset/pre/deno-writefile-existing-mode.md b/.changeset/pre/deno-writefile-existing-mode.md similarity index 100% rename from repos/effect/.changeset/pre/deno-writefile-existing-mode.md rename to .changeset/pre/deno-writefile-existing-mode.md diff --git a/repos/effect/.changeset/pre/dirty-lamps-trade.md b/.changeset/pre/dirty-lamps-trade.md similarity index 100% rename from repos/effect/.changeset/pre/dirty-lamps-trade.md rename to .changeset/pre/dirty-lamps-trade.md diff --git a/repos/effect/.changeset/pre/dirty-laws-wear.md b/.changeset/pre/dirty-laws-wear.md similarity index 100% rename from repos/effect/.changeset/pre/dirty-laws-wear.md rename to .changeset/pre/dirty-laws-wear.md diff --git a/repos/effect/.changeset/pre/docgen-alias-signature.md b/.changeset/pre/docgen-alias-signature.md similarity index 100% rename from repos/effect/.changeset/pre/docgen-alias-signature.md rename to .changeset/pre/docgen-alias-signature.md diff --git a/repos/effect/.changeset/pre/docgen-class-property-examples.md b/.changeset/pre/docgen-class-property-examples.md similarity index 100% rename from repos/effect/.changeset/pre/docgen-class-property-examples.md rename to .changeset/pre/docgen-class-property-examples.md diff --git a/repos/effect/.changeset/pre/docgen-source-relative-module-pages.md b/.changeset/pre/docgen-source-relative-module-pages.md similarity index 100% rename from repos/effect/.changeset/pre/docgen-source-relative-module-pages.md rename to .changeset/pre/docgen-source-relative-module-pages.md diff --git a/repos/effect/.changeset/pre/docgen-unique-example-files.md b/.changeset/pre/docgen-unique-example-files.md similarity index 100% rename from repos/effect/.changeset/pre/docgen-unique-example-files.md rename to .changeset/pre/docgen-unique-example-files.md diff --git a/repos/effect/.changeset/pre/doctest-console-output.md b/.changeset/pre/doctest-console-output.md similarity index 100% rename from repos/effect/.changeset/pre/doctest-console-output.md rename to .changeset/pre/doctest-console-output.md diff --git a/repos/effect/.changeset/pre/doctest-markdown-typescript.md b/.changeset/pre/doctest-markdown-typescript.md similarity index 100% rename from repos/effect/.changeset/pre/doctest-markdown-typescript.md rename to .changeset/pre/doctest-markdown-typescript.md diff --git a/repos/effect/.changeset/pre/doctest-statement-boundary.md b/.changeset/pre/doctest-statement-boundary.md similarity index 100% rename from repos/effect/.changeset/pre/doctest-statement-boundary.md rename to .changeset/pre/doctest-statement-boundary.md diff --git a/repos/effect/.changeset/pre/document-child-process-env.md b/.changeset/pre/document-child-process-env.md similarity index 100% rename from repos/effect/.changeset/pre/document-child-process-env.md rename to .changeset/pre/document-child-process-env.md diff --git a/repos/effect/.changeset/pre/dotenv-literal-substitution.md b/.changeset/pre/dotenv-literal-substitution.md similarity index 100% rename from repos/effect/.changeset/pre/dotenv-literal-substitution.md rename to .changeset/pre/dotenv-literal-substitution.md diff --git a/repos/effect/.changeset/pre/dry-bugs-hug.md b/.changeset/pre/dry-bugs-hug.md similarity index 100% rename from repos/effect/.changeset/pre/dry-bugs-hug.md rename to .changeset/pre/dry-bugs-hug.md diff --git a/repos/effect/.changeset/pre/durable-clock-zero-threshold.md b/.changeset/pre/durable-clock-zero-threshold.md similarity index 100% rename from repos/effect/.changeset/pre/durable-clock-zero-threshold.md rename to .changeset/pre/durable-clock-zero-threshold.md diff --git a/repos/effect/.changeset/pre/durable-deferred-into-encoding-services.md b/.changeset/pre/durable-deferred-into-encoding-services.md similarity index 100% rename from repos/effect/.changeset/pre/durable-deferred-into-encoding-services.md rename to .changeset/pre/durable-deferred-into-encoding-services.md diff --git a/repos/effect/.changeset/pre/duration-temporal-object-input.md b/.changeset/pre/duration-temporal-object-input.md similarity index 100% rename from repos/effect/.changeset/pre/duration-temporal-object-input.md rename to .changeset/pre/duration-temporal-object-input.md diff --git a/repos/effect/.changeset/pre/dynamic-tool-parameter-schema.md b/.changeset/pre/dynamic-tool-parameter-schema.md similarity index 100% rename from repos/effect/.changeset/pre/dynamic-tool-parameter-schema.md rename to .changeset/pre/dynamic-tool-parameter-schema.md diff --git a/repos/effect/.changeset/pre/eager-coats-cheat.md b/.changeset/pre/eager-coats-cheat.md similarity index 100% rename from repos/effect/.changeset/pre/eager-coats-cheat.md rename to .changeset/pre/eager-coats-cheat.md diff --git a/repos/effect/.changeset/pre/early-birds-dream.md b/.changeset/pre/early-birds-dream.md similarity index 100% rename from repos/effect/.changeset/pre/early-birds-dream.md rename to .changeset/pre/early-birds-dream.md diff --git a/repos/effect/.changeset/pre/early-donuts-argue.md b/.changeset/pre/early-donuts-argue.md similarity index 100% rename from repos/effect/.changeset/pre/early-donuts-argue.md rename to .changeset/pre/early-donuts-argue.md diff --git a/repos/effect/.changeset/pre/early-jobs-bow.md b/.changeset/pre/early-jobs-bow.md similarity index 100% rename from repos/effect/.changeset/pre/early-jobs-bow.md rename to .changeset/pre/early-jobs-bow.md diff --git a/repos/effect/.changeset/pre/early-peaches-check.md b/.changeset/pre/early-peaches-check.md similarity index 100% rename from repos/effect/.changeset/pre/early-peaches-check.md rename to .changeset/pre/early-peaches-check.md diff --git a/repos/effect/.changeset/pre/eff-1004-cli-display-width.md b/.changeset/pre/eff-1004-cli-display-width.md similarity index 100% rename from repos/effect/.changeset/pre/eff-1004-cli-display-width.md rename to .changeset/pre/eff-1004-cli-display-width.md diff --git a/repos/effect/.changeset/pre/eff-1008-tool-param-failure-mode.md b/.changeset/pre/eff-1008-tool-param-failure-mode.md similarity index 100% rename from repos/effect/.changeset/pre/eff-1008-tool-param-failure-mode.md rename to .changeset/pre/eff-1008-tool-param-failure-mode.md diff --git a/repos/effect/.changeset/pre/eff-1036-fiber-allocations.md b/.changeset/pre/eff-1036-fiber-allocations.md similarity index 100% rename from repos/effect/.changeset/pre/eff-1036-fiber-allocations.md rename to .changeset/pre/eff-1036-fiber-allocations.md diff --git a/repos/effect/.changeset/pre/eff-1038-http-server-allocations.md b/.changeset/pre/eff-1038-http-server-allocations.md similarity index 100% rename from repos/effect/.changeset/pre/eff-1038-http-server-allocations.md rename to .changeset/pre/eff-1038-http-server-allocations.md diff --git a/repos/effect/.changeset/pre/eff-1039-rpc-server-allocations.md b/.changeset/pre/eff-1039-rpc-server-allocations.md similarity index 100% rename from repos/effect/.changeset/pre/eff-1039-rpc-server-allocations.md rename to .changeset/pre/eff-1039-rpc-server-allocations.md diff --git a/repos/effect/.changeset/pre/eff-1042-http-server-performance.md b/.changeset/pre/eff-1042-http-server-performance.md similarity index 100% rename from repos/effect/.changeset/pre/eff-1042-http-server-performance.md rename to .changeset/pre/eff-1042-http-server-performance.md diff --git a/repos/effect/.changeset/pre/eff-115-sync-scheduler-microtask.md b/.changeset/pre/eff-115-sync-scheduler-microtask.md similarity index 100% rename from repos/effect/.changeset/pre/eff-115-sync-scheduler-microtask.md rename to .changeset/pre/eff-115-sync-scheduler-microtask.md diff --git a/repos/effect/.changeset/pre/eff-117-hydration-reactivity.md b/.changeset/pre/eff-117-hydration-reactivity.md similarity index 100% rename from repos/effect/.changeset/pre/eff-117-hydration-reactivity.md rename to .changeset/pre/eff-117-hydration-reactivity.md diff --git a/repos/effect/.changeset/pre/eff-1201-http-overhead.md b/.changeset/pre/eff-1201-http-overhead.md similarity index 100% rename from repos/effect/.changeset/pre/eff-1201-http-overhead.md rename to .changeset/pre/eff-1201-http-overhead.md diff --git a/repos/effect/.changeset/pre/eff-121-http-router-web-handler.md b/.changeset/pre/eff-121-http-router-web-handler.md similarity index 100% rename from repos/effect/.changeset/pre/eff-121-http-router-web-handler.md rename to .changeset/pre/eff-121-http-router-web-handler.md diff --git a/repos/effect/.changeset/pre/eff-123-openai-compat-unknown-events.md b/.changeset/pre/eff-123-openai-compat-unknown-events.md similarity index 100% rename from repos/effect/.changeset/pre/eff-123-openai-compat-unknown-events.md rename to .changeset/pre/eff-123-openai-compat-unknown-events.md diff --git a/repos/effect/.changeset/pre/eff-137-web-stream-interop.md b/.changeset/pre/eff-137-web-stream-interop.md similarity index 100% rename from repos/effect/.changeset/pre/eff-137-web-stream-interop.md rename to .changeset/pre/eff-137-web-stream-interop.md diff --git a/repos/effect/.changeset/pre/eff-140-deno-crypto.md b/.changeset/pre/eff-140-deno-crypto.md similarity index 100% rename from repos/effect/.changeset/pre/eff-140-deno-crypto.md rename to .changeset/pre/eff-140-deno-crypto.md diff --git a/repos/effect/.changeset/pre/eff-141-deno-child-process.md b/.changeset/pre/eff-141-deno-child-process.md similarity index 100% rename from repos/effect/.changeset/pre/eff-141-deno-child-process.md rename to .changeset/pre/eff-141-deno-child-process.md diff --git a/repos/effect/.changeset/pre/eff-142-deno-terminal.md b/.changeset/pre/eff-142-deno-terminal.md similarity index 100% rename from repos/effect/.changeset/pre/eff-142-deno-terminal.md rename to .changeset/pre/eff-142-deno-terminal.md diff --git a/repos/effect/.changeset/pre/eff-143-deno-stdio.md b/.changeset/pre/eff-143-deno-stdio.md similarity index 100% rename from repos/effect/.changeset/pre/eff-143-deno-stdio.md rename to .changeset/pre/eff-143-deno-stdio.md diff --git a/repos/effect/.changeset/pre/eff-145-deno-services.md b/.changeset/pre/eff-145-deno-services.md similarity index 100% rename from repos/effect/.changeset/pre/eff-145-deno-services.md rename to .changeset/pre/eff-145-deno-services.md diff --git a/repos/effect/.changeset/pre/eff-148-deno-http-platform.md b/.changeset/pre/eff-148-deno-http-platform.md similarity index 100% rename from repos/effect/.changeset/pre/eff-148-deno-http-platform.md rename to .changeset/pre/eff-148-deno-http-platform.md diff --git a/repos/effect/.changeset/pre/eff-151-deno-redis.md b/.changeset/pre/eff-151-deno-redis.md similarity index 100% rename from repos/effect/.changeset/pre/eff-151-deno-redis.md rename to .changeset/pre/eff-151-deno-redis.md diff --git a/repos/effect/.changeset/pre/eff-153-deno-http-server.md b/.changeset/pre/eff-153-deno-http-server.md similarity index 100% rename from repos/effect/.changeset/pre/eff-153-deno-http-server.md rename to .changeset/pre/eff-153-deno-http-server.md diff --git a/repos/effect/.changeset/pre/eff-153-websocket-initial-frames.md b/.changeset/pre/eff-153-websocket-initial-frames.md similarity index 100% rename from repos/effect/.changeset/pre/eff-153-websocket-initial-frames.md rename to .changeset/pre/eff-153-websocket-initial-frames.md diff --git a/repos/effect/.changeset/pre/eff-154-deno-cluster-http.md b/.changeset/pre/eff-154-deno-cluster-http.md similarity index 100% rename from repos/effect/.changeset/pre/eff-154-deno-cluster-http.md rename to .changeset/pre/eff-154-deno-cluster-http.md diff --git a/repos/effect/.changeset/pre/eff-155-deno-cluster-socket.md b/.changeset/pre/eff-155-deno-cluster-socket.md similarity index 100% rename from repos/effect/.changeset/pre/eff-155-deno-cluster-socket.md rename to .changeset/pre/eff-155-deno-cluster-socket.md diff --git a/repos/effect/.changeset/pre/eff-162-browser-crypto-chunks.md b/.changeset/pre/eff-162-browser-crypto-chunks.md similarity index 100% rename from repos/effect/.changeset/pre/eff-162-browser-crypto-chunks.md rename to .changeset/pre/eff-162-browser-crypto-chunks.md diff --git a/repos/effect/.changeset/pre/eff-170-bun-multipart-stream.md b/.changeset/pre/eff-170-bun-multipart-stream.md similarity index 100% rename from repos/effect/.changeset/pre/eff-170-bun-multipart-stream.md rename to .changeset/pre/eff-170-bun-multipart-stream.md diff --git a/repos/effect/.changeset/pre/eff-210-cookie-validation.md b/.changeset/pre/eff-210-cookie-validation.md similarity index 100% rename from repos/effect/.changeset/pre/eff-210-cookie-validation.md rename to .changeset/pre/eff-210-cookie-validation.md diff --git a/repos/effect/.changeset/pre/eff-212-secure-mssql-transport.md b/.changeset/pre/eff-212-secure-mssql-transport.md similarity index 100% rename from repos/effect/.changeset/pre/eff-212-secure-mssql-transport.md rename to .changeset/pre/eff-212-secure-mssql-transport.md diff --git a/repos/effect/.changeset/pre/eff-216-secure-http-redirects.md b/.changeset/pre/eff-216-secure-http-redirects.md similarity index 100% rename from repos/effect/.changeset/pre/eff-216-secure-http-redirects.md rename to .changeset/pre/eff-216-secure-http-redirects.md diff --git a/repos/effect/.changeset/pre/eff-218-bound-sse-pending-state.md b/.changeset/pre/eff-218-bound-sse-pending-state.md similarity index 100% rename from repos/effect/.changeset/pre/eff-218-bound-sse-pending-state.md rename to .changeset/pre/eff-218-bound-sse-pending-state.md diff --git a/repos/effect/.changeset/pre/eff-219-key-value-store-file-keys.md b/.changeset/pre/eff-219-key-value-store-file-keys.md similarity index 100% rename from repos/effect/.changeset/pre/eff-219-key-value-store-file-keys.md rename to .changeset/pre/eff-219-key-value-store-file-keys.md diff --git a/repos/effect/.changeset/pre/eff-220-cli-control-characters.md b/.changeset/pre/eff-220-cli-control-characters.md similarity index 100% rename from repos/effect/.changeset/pre/eff-220-cli-control-characters.md rename to .changeset/pre/eff-220-cli-control-characters.md diff --git a/repos/effect/.changeset/pre/eff-332-http-response-compression.md b/.changeset/pre/eff-332-http-response-compression.md similarity index 100% rename from repos/effect/.changeset/pre/eff-332-http-response-compression.md rename to .changeset/pre/eff-332-http-response-compression.md diff --git a/repos/effect/.changeset/pre/eff-337-preserve-mssql-parameters.md b/.changeset/pre/eff-337-preserve-mssql-parameters.md similarity index 100% rename from repos/effect/.changeset/pre/eff-337-preserve-mssql-parameters.md rename to .changeset/pre/eff-337-preserve-mssql-parameters.md diff --git a/repos/effect/.changeset/pre/eff-342-clickhouse-number-binding.md b/.changeset/pre/eff-342-clickhouse-number-binding.md similarity index 100% rename from repos/effect/.changeset/pre/eff-342-clickhouse-number-binding.md rename to .changeset/pre/eff-342-clickhouse-number-binding.md diff --git a/repos/effect/.changeset/pre/eff-389-execution-plan-attempts.md b/.changeset/pre/eff-389-execution-plan-attempts.md similarity index 100% rename from repos/effect/.changeset/pre/eff-389-execution-plan-attempts.md rename to .changeset/pre/eff-389-execution-plan-attempts.md diff --git a/repos/effect/.changeset/pre/eff-428-pg-transaction-permit.md b/.changeset/pre/eff-428-pg-transaction-permit.md similarity index 100% rename from repos/effect/.changeset/pre/eff-428-pg-transaction-permit.md rename to .changeset/pre/eff-428-pg-transaction-permit.md diff --git a/repos/effect/.changeset/pre/eff-467-execution-plan-events.md b/.changeset/pre/eff-467-execution-plan-events.md similarity index 100% rename from repos/effect/.changeset/pre/eff-467-execution-plan-events.md rename to .changeset/pre/eff-467-execution-plan-events.md diff --git a/repos/effect/.changeset/pre/eff-477-schedule-concat.md b/.changeset/pre/eff-477-schedule-concat.md similarity index 100% rename from repos/effect/.changeset/pre/eff-477-schedule-concat.md rename to .changeset/pre/eff-477-schedule-concat.md diff --git a/repos/effect/.changeset/pre/eff-487-web-tracer-shutdown.md b/.changeset/pre/eff-487-web-tracer-shutdown.md similarity index 100% rename from repos/effect/.changeset/pre/eff-487-web-tracer-shutdown.md rename to .changeset/pre/eff-487-web-tracer-shutdown.md diff --git a/repos/effect/.changeset/pre/eff-51-partitioned-semaphore-interruption.md b/.changeset/pre/eff-51-partitioned-semaphore-interruption.md similarity index 100% rename from repos/effect/.changeset/pre/eff-51-partitioned-semaphore-interruption.md rename to .changeset/pre/eff-51-partitioned-semaphore-interruption.md diff --git a/repos/effect/.changeset/pre/eff-523-registry-scoped-atom-runtime.md b/.changeset/pre/eff-523-registry-scoped-atom-runtime.md similarity index 100% rename from repos/effect/.changeset/pre/eff-523-registry-scoped-atom-runtime.md rename to .changeset/pre/eff-523-registry-scoped-atom-runtime.md diff --git a/repos/effect/.changeset/pre/eff-532-stdio-terminal.md b/.changeset/pre/eff-532-stdio-terminal.md similarity index 100% rename from repos/effect/.changeset/pre/eff-532-stdio-terminal.md rename to .changeset/pre/eff-532-stdio-terminal.md diff --git a/repos/effect/.changeset/pre/eff-537-preserve-response-metadata.md b/.changeset/pre/eff-537-preserve-response-metadata.md similarity index 100% rename from repos/effect/.changeset/pre/eff-537-preserve-response-metadata.md rename to .changeset/pre/eff-537-preserve-response-metadata.md diff --git a/repos/effect/.changeset/pre/eff-542-rc-ref-generation.md b/.changeset/pre/eff-542-rc-ref-generation.md similarity index 100% rename from repos/effect/.changeset/pre/eff-542-rc-ref-generation.md rename to .changeset/pre/eff-542-rc-ref-generation.md diff --git a/repos/effect/.changeset/pre/eff-547-node-tracer-timeout.md b/.changeset/pre/eff-547-node-tracer-timeout.md similarity index 100% rename from repos/effect/.changeset/pre/eff-547-node-tracer-timeout.md rename to .changeset/pre/eff-547-node-tracer-timeout.md diff --git a/repos/effect/.changeset/pre/eff-548-bun-serve-scope.md b/.changeset/pre/eff-548-bun-serve-scope.md similarity index 100% rename from repos/effect/.changeset/pre/eff-548-bun-serve-scope.md rename to .changeset/pre/eff-548-bun-serve-scope.md diff --git a/repos/effect/.changeset/pre/eff-549-worker-send-error.md b/.changeset/pre/eff-549-worker-send-error.md similarity index 100% rename from repos/effect/.changeset/pre/eff-549-worker-send-error.md rename to .changeset/pre/eff-549-worker-send-error.md diff --git a/repos/effect/.changeset/pre/eff-552-txqueue-shutdown.md b/.changeset/pre/eff-552-txqueue-shutdown.md similarity index 100% rename from repos/effect/.changeset/pre/eff-552-txqueue-shutdown.md rename to .changeset/pre/eff-552-txqueue-shutdown.md diff --git a/repos/effect/.changeset/pre/eff-554-sql-resolver.md b/.changeset/pre/eff-554-sql-resolver.md similarity index 100% rename from repos/effect/.changeset/pre/eff-554-sql-resolver.md rename to .changeset/pre/eff-554-sql-resolver.md diff --git a/repos/effect/.changeset/pre/eff-558-deno-file-web-range.md b/.changeset/pre/eff-558-deno-file-web-range.md similarity index 100% rename from repos/effect/.changeset/pre/eff-558-deno-file-web-range.md rename to .changeset/pre/eff-558-deno-file-web-range.md diff --git a/repos/effect/.changeset/pre/eff-691-default-logger-ordering.md b/.changeset/pre/eff-691-default-logger-ordering.md similarity index 100% rename from repos/effect/.changeset/pre/eff-691-default-logger-ordering.md rename to .changeset/pre/eff-691-default-logger-ordering.md diff --git a/repos/effect/.changeset/pre/eff-693-rpcgroup-handler-deps.md b/.changeset/pre/eff-693-rpcgroup-handler-deps.md similarity index 100% rename from repos/effect/.changeset/pre/eff-693-rpcgroup-handler-deps.md rename to .changeset/pre/eff-693-rpcgroup-handler-deps.md diff --git a/repos/effect/.changeset/pre/eff-694-cli-completions-module.md b/.changeset/pre/eff-694-cli-completions-module.md similarity index 100% rename from repos/effect/.changeset/pre/eff-694-cli-completions-module.md rename to .changeset/pre/eff-694-cli-completions-module.md diff --git a/repos/effect/.changeset/pre/eff-695-layer-mock-dual-api.md b/.changeset/pre/eff-695-layer-mock-dual-api.md similarity index 100% rename from repos/effect/.changeset/pre/eff-695-layer-mock-dual-api.md rename to .changeset/pre/eff-695-layer-mock-dual-api.md diff --git a/repos/effect/.changeset/pre/eff-697-rpcserialization-json-array-decode.md b/.changeset/pre/eff-697-rpcserialization-json-array-decode.md similarity index 100% rename from repos/effect/.changeset/pre/eff-697-rpcserialization-json-array-decode.md rename to .changeset/pre/eff-697-rpcserialization-json-array-decode.md diff --git a/repos/effect/.changeset/pre/eff-698-rpcserialization-unreachable-branch.md b/.changeset/pre/eff-698-rpcserialization-unreachable-branch.md similarity index 100% rename from repos/effect/.changeset/pre/eff-698-rpcserialization-unreachable-branch.md rename to .changeset/pre/eff-698-rpcserialization-unreachable-branch.md diff --git a/repos/effect/.changeset/pre/eff-700-httpapi-middleware-errors.md b/.changeset/pre/eff-700-httpapi-middleware-errors.md similarity index 100% rename from repos/effect/.changeset/pre/eff-700-httpapi-middleware-errors.md rename to .changeset/pre/eff-700-httpapi-middleware-errors.md diff --git a/repos/effect/.changeset/pre/eff-701-httpapierror-respondable.md b/.changeset/pre/eff-701-httpapierror-respondable.md similarity index 100% rename from repos/effect/.changeset/pre/eff-701-httpapierror-respondable.md rename to .changeset/pre/eff-701-httpapierror-respondable.md diff --git a/repos/effect/.changeset/pre/eff-704-stream-merge-predicate.md b/.changeset/pre/eff-704-stream-merge-predicate.md similarity index 100% rename from repos/effect/.changeset/pre/eff-704-stream-merge-predicate.md rename to .changeset/pre/eff-704-stream-merge-predicate.md diff --git a/repos/effect/.changeset/pre/eff-705-layer-tap-apis.md b/.changeset/pre/eff-705-layer-tap-apis.md similarity index 100% rename from repos/effect/.changeset/pre/eff-705-layer-tap-apis.md rename to .changeset/pre/eff-705-layer-tap-apis.md diff --git a/repos/effect/.changeset/pre/eff-706-servicemap-mutate.md b/.changeset/pre/eff-706-servicemap-mutate.md similarity index 100% rename from repos/effect/.changeset/pre/eff-706-servicemap-mutate.md rename to .changeset/pre/eff-706-servicemap-mutate.md diff --git a/repos/effect/.changeset/pre/eff-716-response-id-tracker-map.md b/.changeset/pre/eff-716-response-id-tracker-map.md similarity index 100% rename from repos/effect/.changeset/pre/eff-716-response-id-tracker-map.md rename to .changeset/pre/eff-716-response-id-tracker-map.md diff --git a/repos/effect/.changeset/pre/eff-717-openai-socket-cancel.md b/.changeset/pre/eff-717-openai-socket-cancel.md similarity index 100% rename from repos/effect/.changeset/pre/eff-717-openai-socket-cancel.md rename to .changeset/pre/eff-717-openai-socket-cancel.md diff --git a/repos/effect/.changeset/pre/eff-718-embedding-model-surface.md b/.changeset/pre/eff-718-embedding-model-surface.md similarity index 100% rename from repos/effect/.changeset/pre/eff-718-embedding-model-surface.md rename to .changeset/pre/eff-718-embedding-model-surface.md diff --git a/repos/effect/.changeset/pre/eff-725-fix-catch-jsdoc.md b/.changeset/pre/eff-725-fix-catch-jsdoc.md similarity index 100% rename from repos/effect/.changeset/pre/eff-725-fix-catch-jsdoc.md rename to .changeset/pre/eff-725-fix-catch-jsdoc.md diff --git a/repos/effect/.changeset/pre/eff-726-model-dimensions.md b/.changeset/pre/eff-726-model-dimensions.md similarity index 100% rename from repos/effect/.changeset/pre/eff-726-model-dimensions.md rename to .changeset/pre/eff-726-model-dimensions.md diff --git a/repos/effect/.changeset/pre/eff-727-cli-help-alignment.md b/.changeset/pre/eff-727-cli-help-alignment.md similarity index 100% rename from repos/effect/.changeset/pre/eff-727-cli-help-alignment.md rename to .changeset/pre/eff-727-cli-help-alignment.md diff --git a/repos/effect/.changeset/pre/eff-730-language-model-incremental-fallback.md b/.changeset/pre/eff-730-language-model-incremental-fallback.md similarity index 100% rename from repos/effect/.changeset/pre/eff-730-language-model-incremental-fallback.md rename to .changeset/pre/eff-730-language-model-incremental-fallback.md diff --git a/repos/effect/.changeset/pre/eff-736-cached-with-ttl.md b/.changeset/pre/eff-736-cached-with-ttl.md similarity index 100% rename from repos/effect/.changeset/pre/eff-736-cached-with-ttl.md rename to .changeset/pre/eff-736-cached-with-ttl.md diff --git a/repos/effect/.changeset/pre/eff-738-cron-prev.md b/.changeset/pre/eff-738-cron-prev.md similarity index 100% rename from repos/effect/.changeset/pre/eff-738-cron-prev.md rename to .changeset/pre/eff-738-cron-prev.md diff --git a/repos/effect/.changeset/pre/eff-739-openai-function-call-done.md b/.changeset/pre/eff-739-openai-function-call-done.md similarity index 100% rename from repos/effect/.changeset/pre/eff-739-openai-function-call-done.md rename to .changeset/pre/eff-739-openai-function-call-done.md diff --git a/repos/effect/.changeset/pre/eff-740-missing-summary-parts.md b/.changeset/pre/eff-740-missing-summary-parts.md similarity index 100% rename from repos/effect/.changeset/pre/eff-740-missing-summary-parts.md rename to .changeset/pre/eff-740-missing-summary-parts.md diff --git a/repos/effect/.changeset/pre/eff-742-http-client-request-web.md b/.changeset/pre/eff-742-http-client-request-web.md similarity index 100% rename from repos/effect/.changeset/pre/eff-742-http-client-request-web.md rename to .changeset/pre/eff-742-http-client-request-web.md diff --git a/repos/effect/.changeset/pre/eff-744-sqlite-migrator-lock.md b/.changeset/pre/eff-744-sqlite-migrator-lock.md similarity index 100% rename from repos/effect/.changeset/pre/eff-744-sqlite-migrator-lock.md rename to .changeset/pre/eff-744-sqlite-migrator-lock.md diff --git a/repos/effect/.changeset/pre/eff-746-fixed-iteration-catchup.md b/.changeset/pre/eff-746-fixed-iteration-catchup.md similarity index 100% rename from repos/effect/.changeset/pre/eff-746-fixed-iteration-catchup.md rename to .changeset/pre/eff-746-fixed-iteration-catchup.md diff --git a/repos/effect/.changeset/pre/eff-747-unify-effect.md b/.changeset/pre/eff-747-unify-effect.md similarity index 100% rename from repos/effect/.changeset/pre/eff-747-unify-effect.md rename to .changeset/pre/eff-747-unify-effect.md diff --git a/repos/effect/.changeset/pre/eff-754-url-builder-any.md b/.changeset/pre/eff-754-url-builder-any.md similarity index 100% rename from repos/effect/.changeset/pre/eff-754-url-builder-any.md rename to .changeset/pre/eff-754-url-builder-any.md diff --git a/repos/effect/.changeset/pre/eff-755-references-core.md b/.changeset/pre/eff-755-references-core.md similarity index 100% rename from repos/effect/.changeset/pre/eff-755-references-core.md rename to .changeset/pre/eff-755-references-core.md diff --git a/repos/effect/.changeset/pre/eff-769-select-text-highlight.md b/.changeset/pre/eff-769-select-text-highlight.md similarity index 100% rename from repos/effect/.changeset/pre/eff-769-select-text-highlight.md rename to .changeset/pre/eff-769-select-text-highlight.md diff --git a/repos/effect/.changeset/pre/eff-774-mutable-list-append-all-empty-array.md b/.changeset/pre/eff-774-mutable-list-append-all-empty-array.md similarity index 100% rename from repos/effect/.changeset/pre/eff-774-mutable-list-append-all-empty-array.md rename to .changeset/pre/eff-774-mutable-list-append-all-empty-array.md diff --git a/repos/effect/.changeset/pre/eff-777-schema-make-effect.md b/.changeset/pre/eff-777-schema-make-effect.md similarity index 100% rename from repos/effect/.changeset/pre/eff-777-schema-make-effect.md rename to .changeset/pre/eff-777-schema-make-effect.md diff --git a/repos/effect/.changeset/pre/eff-778-http-middleware-path-logger.md b/.changeset/pre/eff-778-http-middleware-path-logger.md similarity index 100% rename from repos/effect/.changeset/pre/eff-778-http-middleware-path-logger.md rename to .changeset/pre/eff-778-http-middleware-path-logger.md diff --git a/repos/effect/.changeset/pre/eff-779-keyvaluestore-layer-sql.md b/.changeset/pre/eff-779-keyvaluestore-layer-sql.md similarity index 100% rename from repos/effect/.changeset/pre/eff-779-keyvaluestore-layer-sql.md rename to .changeset/pre/eff-779-keyvaluestore-layer-sql.md diff --git a/repos/effect/.changeset/pre/eff-780-layer-unify.md b/.changeset/pre/eff-780-layer-unify.md similarity index 100% rename from repos/effect/.changeset/pre/eff-780-layer-unify.md rename to .changeset/pre/eff-780-layer-unify.md diff --git a/repos/effect/.changeset/pre/eff-781-fix-stream-toqueue-types.md b/.changeset/pre/eff-781-fix-stream-toqueue-types.md similarity index 100% rename from repos/effect/.changeset/pre/eff-781-fix-stream-toqueue-types.md rename to .changeset/pre/eff-781-fix-stream-toqueue-types.md diff --git a/repos/effect/.changeset/pre/eff-782-httpapi-status-literals.md b/.changeset/pre/eff-782-httpapi-status-literals.md similarity index 100% rename from repos/effect/.changeset/pre/eff-782-httpapi-status-literals.md rename to .changeset/pre/eff-782-httpapi-status-literals.md diff --git a/repos/effect/.changeset/pre/eff-783-atom-http-api-errors.md b/.changeset/pre/eff-783-atom-http-api-errors.md similarity index 100% rename from repos/effect/.changeset/pre/eff-783-atom-http-api-errors.md rename to .changeset/pre/eff-783-atom-http-api-errors.md diff --git a/repos/effect/.changeset/pre/eff-798-schema-parser.md b/.changeset/pre/eff-798-schema-parser.md similarity index 100% rename from repos/effect/.changeset/pre/eff-798-schema-parser.md rename to .changeset/pre/eff-798-schema-parser.md diff --git a/repos/effect/.changeset/pre/eff-802-tagged-union-match-or-else.md b/.changeset/pre/eff-802-tagged-union-match-or-else.md similarity index 100% rename from repos/effect/.changeset/pre/eff-802-tagged-union-match-or-else.md rename to .changeset/pre/eff-802-tagged-union-match-or-else.md diff --git a/repos/effect/.changeset/pre/eff-806-schema-error-stack.md b/.changeset/pre/eff-806-schema-error-stack.md similarity index 100% rename from repos/effect/.changeset/pre/eff-806-schema-error-stack.md rename to .changeset/pre/eff-806-schema-error-stack.md diff --git a/repos/effect/.changeset/pre/eff-819-cluster-workflow-shard-groups.md b/.changeset/pre/eff-819-cluster-workflow-shard-groups.md similarity index 100% rename from repos/effect/.changeset/pre/eff-819-cluster-workflow-shard-groups.md rename to .changeset/pre/eff-819-cluster-workflow-shard-groups.md diff --git a/repos/effect/.changeset/pre/eff-825-pool-performance.md b/.changeset/pre/eff-825-pool-performance.md similarity index 100% rename from repos/effect/.changeset/pre/eff-825-pool-performance.md rename to .changeset/pre/eff-825-pool-performance.md diff --git a/repos/effect/.changeset/pre/eff-825-pool-use.md b/.changeset/pre/eff-825-pool-use.md similarity index 100% rename from repos/effect/.changeset/pre/eff-825-pool-use.md rename to .changeset/pre/eff-825-pool-use.md diff --git a/repos/effect/.changeset/pre/eff-825-scope-single-finalizer.md b/.changeset/pre/eff-825-scope-single-finalizer.md similarity index 100% rename from repos/effect/.changeset/pre/eff-825-scope-single-finalizer.md rename to .changeset/pre/eff-825-scope-single-finalizer.md diff --git a/repos/effect/.changeset/pre/eff-837-dependency-updates.md b/.changeset/pre/eff-837-dependency-updates.md similarity index 100% rename from repos/effect/.changeset/pre/eff-837-dependency-updates.md rename to .changeset/pre/eff-837-dependency-updates.md diff --git a/repos/effect/.changeset/pre/eff-849-transpose-option.md b/.changeset/pre/eff-849-transpose-option.md similarity index 100% rename from repos/effect/.changeset/pre/eff-849-transpose-option.md rename to .changeset/pre/eff-849-transpose-option.md diff --git a/repos/effect/.changeset/pre/eff-851-skip-empty-remote-write.md b/.changeset/pre/eff-851-skip-empty-remote-write.md similarity index 100% rename from repos/effect/.changeset/pre/eff-851-skip-empty-remote-write.md rename to .changeset/pre/eff-851-skip-empty-remote-write.md diff --git a/repos/effect/.changeset/pre/eff-854-pg-connection-startup.md b/.changeset/pre/eff-854-pg-connection-startup.md similarity index 100% rename from repos/effect/.changeset/pre/eff-854-pg-connection-startup.md rename to .changeset/pre/eff-854-pg-connection-startup.md diff --git a/repos/effect/.changeset/pre/eff-861-indexeddb-equals.md b/.changeset/pre/eff-861-indexeddb-equals.md similarity index 100% rename from repos/effect/.changeset/pre/eff-861-indexeddb-equals.md rename to .changeset/pre/eff-861-indexeddb-equals.md diff --git a/repos/effect/.changeset/pre/eff-946-concurrent-traversal-cleanup.md b/.changeset/pre/eff-946-concurrent-traversal-cleanup.md similarity index 100% rename from repos/effect/.changeset/pre/eff-946-concurrent-traversal-cleanup.md rename to .changeset/pre/eff-946-concurrent-traversal-cleanup.md diff --git a/repos/effect/.changeset/pre/eff-952-terminal-failure-stack.md b/.changeset/pre/eff-952-terminal-failure-stack.md similarity index 100% rename from repos/effect/.changeset/pre/eff-952-terminal-failure-stack.md rename to .changeset/pre/eff-952-terminal-failure-stack.md diff --git a/repos/effect/.changeset/pre/eff-953-interruptor-stack-trace.md b/.changeset/pre/eff-953-interruptor-stack-trace.md similarity index 100% rename from repos/effect/.changeset/pre/eff-953-interruptor-stack-trace.md rename to .changeset/pre/eff-953-interruptor-stack-trace.md diff --git a/repos/effect/.changeset/pre/eff-955-run-sync-dispatcher.md b/.changeset/pre/eff-955-run-sync-dispatcher.md similarity index 100% rename from repos/effect/.changeset/pre/eff-955-run-sync-dispatcher.md rename to .changeset/pre/eff-955-run-sync-dispatcher.md diff --git a/repos/effect/.changeset/pre/eff-956-await-all-children.md b/.changeset/pre/eff-956-await-all-children.md similarity index 100% rename from repos/effect/.changeset/pre/eff-956-await-all-children.md rename to .changeset/pre/eff-956-await-all-children.md diff --git a/repos/effect/.changeset/pre/eff-961-node-socket-tls.md b/.changeset/pre/eff-961-node-socket-tls.md similarity index 100% rename from repos/effect/.changeset/pre/eff-961-node-socket-tls.md rename to .changeset/pre/eff-961-node-socket-tls.md diff --git a/repos/effect/.changeset/pre/eff-963-node-socket-server-tls.md b/.changeset/pre/eff-963-node-socket-server-tls.md similarity index 100% rename from repos/effect/.changeset/pre/eff-963-node-socket-server-tls.md rename to .changeset/pre/eff-963-node-socket-server-tls.md diff --git a/repos/effect/.changeset/pre/eff-965-socket-upgrade.md b/.changeset/pre/eff-965-socket-upgrade.md similarity index 100% rename from repos/effect/.changeset/pre/eff-965-socket-upgrade.md rename to .changeset/pre/eff-965-socket-upgrade.md diff --git a/repos/effect/.changeset/pre/eff-969-dependency-updates.md b/.changeset/pre/eff-969-dependency-updates.md similarity index 100% rename from repos/effect/.changeset/pre/eff-969-dependency-updates.md rename to .changeset/pre/eff-969-dependency-updates.md diff --git a/repos/effect/.changeset/pre/eff-972-deno-socket-server.md b/.changeset/pre/eff-972-deno-socket-server.md similarity index 100% rename from repos/effect/.changeset/pre/eff-972-deno-socket-server.md rename to .changeset/pre/eff-972-deno-socket-server.md diff --git a/repos/effect/.changeset/pre/eff-997-service-keys.md b/.changeset/pre/eff-997-service-keys.md similarity index 100% rename from repos/effect/.changeset/pre/eff-997-service-keys.md rename to .changeset/pre/eff-997-service-keys.md diff --git a/repos/effect/.changeset/pre/effect-eager-transform-arguments.md b/.changeset/pre/effect-eager-transform-arguments.md similarity index 100% rename from repos/effect/.changeset/pre/effect-eager-transform-arguments.md rename to .changeset/pre/effect-eager-transform-arguments.md diff --git a/repos/effect/.changeset/pre/effect-scoped-service-restoration.md b/.changeset/pre/effect-scoped-service-restoration.md similarity index 100% rename from repos/effect/.changeset/pre/effect-scoped-service-restoration.md rename to .changeset/pre/effect-scoped-service-restoration.md diff --git a/repos/effect/.changeset/pre/effect-unmatched-reason-preservation.md b/.changeset/pre/effect-unmatched-reason-preservation.md similarity index 100% rename from repos/effect/.changeset/pre/effect-unmatched-reason-preservation.md rename to .changeset/pre/effect-unmatched-reason-preservation.md diff --git a/repos/effect/.changeset/pre/effectable-class-override-delegation.md b/.changeset/pre/effectable-class-override-delegation.md similarity index 100% rename from repos/effect/.changeset/pre/effectable-class-override-delegation.md rename to .changeset/pre/effectable-class-override-delegation.md diff --git a/repos/effect/.changeset/pre/effectable-mixin.md b/.changeset/pre/effectable-mixin.md similarity index 100% rename from repos/effect/.changeset/pre/effectable-mixin.md rename to .changeset/pre/effectable-mixin.md diff --git a/repos/effect/.changeset/pre/effectify-mapper-input-tuples.md b/.changeset/pre/effectify-mapper-input-tuples.md similarity index 100% rename from repos/effect/.changeset/pre/effectify-mapper-input-tuples.md rename to .changeset/pre/effectify-mapper-input-tuples.md diff --git a/repos/effect/.changeset/pre/eight-turkeys-own.md b/.changeset/pre/eight-turkeys-own.md similarity index 100% rename from repos/effect/.changeset/pre/eight-turkeys-own.md rename to .changeset/pre/eight-turkeys-own.md diff --git a/repos/effect/.changeset/pre/eighty-lies-deny.md b/.changeset/pre/eighty-lies-deny.md similarity index 100% rename from repos/effect/.changeset/pre/eighty-lies-deny.md rename to .changeset/pre/eighty-lies-deny.md diff --git a/repos/effect/.changeset/pre/eighty-poets-draw.md b/.changeset/pre/eighty-poets-draw.md similarity index 100% rename from repos/effect/.changeset/pre/eighty-poets-draw.md rename to .changeset/pre/eighty-poets-draw.md diff --git a/repos/effect/.changeset/pre/eighty-swans-scream.md b/.changeset/pre/eighty-swans-scream.md similarity index 100% rename from repos/effect/.changeset/pre/eighty-swans-scream.md rename to .changeset/pre/eighty-swans-scream.md diff --git a/repos/effect/.changeset/pre/eighty-teeth-sniff.md b/.changeset/pre/eighty-teeth-sniff.md similarity index 100% rename from repos/effect/.changeset/pre/eighty-teeth-sniff.md rename to .changeset/pre/eighty-teeth-sniff.md diff --git a/repos/effect/.changeset/pre/eleven-apes-share.md b/.changeset/pre/eleven-apes-share.md similarity index 100% rename from repos/effect/.changeset/pre/eleven-apes-share.md rename to .changeset/pre/eleven-apes-share.md diff --git a/repos/effect/.changeset/pre/eleven-numbers-bake.md b/.changeset/pre/eleven-numbers-bake.md similarity index 100% rename from repos/effect/.changeset/pre/eleven-numbers-bake.md rename to .changeset/pre/eleven-numbers-bake.md diff --git a/repos/effect/.changeset/pre/empty-env-values-missing.md b/.changeset/pre/empty-env-values-missing.md similarity index 100% rename from repos/effect/.changeset/pre/empty-env-values-missing.md rename to .changeset/pre/empty-env-values-missing.md diff --git a/repos/effect/.changeset/pre/empty-geckos-dispatch.md b/.changeset/pre/empty-geckos-dispatch.md similarity index 100% rename from repos/effect/.changeset/pre/empty-geckos-dispatch.md rename to .changeset/pre/empty-geckos-dispatch.md diff --git a/repos/effect/.changeset/pre/empty-gifts-beg.md b/.changeset/pre/empty-gifts-beg.md similarity index 100% rename from repos/effect/.changeset/pre/empty-gifts-beg.md rename to .changeset/pre/empty-gifts-beg.md diff --git a/repos/effect/.changeset/pre/empty-http-rpc-client.md b/.changeset/pre/empty-http-rpc-client.md similarity index 100% rename from repos/effect/.changeset/pre/empty-http-rpc-client.md rename to .changeset/pre/empty-http-rpc-client.md diff --git a/repos/effect/.changeset/pre/empty-snakes-return.md b/.changeset/pre/empty-snakes-return.md similarity index 100% rename from repos/effect/.changeset/pre/empty-snakes-return.md rename to .changeset/pre/empty-snakes-return.md diff --git a/repos/effect/.changeset/pre/entity-proxy-client-codec-services.md b/.changeset/pre/entity-proxy-client-codec-services.md similarity index 100% rename from repos/effect/.changeset/pre/entity-proxy-client-codec-services.md rename to .changeset/pre/entity-proxy-client-codec-services.md diff --git a/repos/effect/.changeset/pre/entity-test-client-fatal-defect-option.md b/.changeset/pre/entity-test-client-fatal-defect-option.md similarity index 100% rename from repos/effect/.changeset/pre/entity-test-client-fatal-defect-option.md rename to .changeset/pre/entity-test-client-fatal-defect-option.md diff --git a/repos/effect/.changeset/pre/escape-completion-choice-values.md b/.changeset/pre/escape-completion-choice-values.md similarity index 100% rename from repos/effect/.changeset/pre/escape-completion-choice-values.md rename to .changeset/pre/escape-completion-choice-values.md diff --git a/repos/effect/.changeset/pre/eventlog-authentication-forbidden-retry.md b/.changeset/pre/eventlog-authentication-forbidden-retry.md similarity index 100% rename from repos/effect/.changeset/pre/eventlog-authentication-forbidden-retry.md rename to .changeset/pre/eventlog-authentication-forbidden-retry.md diff --git a/repos/effect/.changeset/pre/eventlog-empty-chunk-framing.md b/.changeset/pre/eventlog-empty-chunk-framing.md similarity index 100% rename from repos/effect/.changeset/pre/eventlog-empty-chunk-framing.md rename to .changeset/pre/eventlog-empty-chunk-framing.md diff --git a/repos/effect/.changeset/pre/eventlog-unencrypted.md b/.changeset/pre/eventlog-unencrypted.md similarity index 100% rename from repos/effect/.changeset/pre/eventlog-unencrypted.md rename to .changeset/pre/eventlog-unencrypted.md diff --git a/repos/effect/.changeset/pre/every-olives-burn.md b/.changeset/pre/every-olives-burn.md similarity index 100% rename from repos/effect/.changeset/pre/every-olives-burn.md rename to .changeset/pre/every-olives-burn.md diff --git a/repos/effect/.changeset/pre/exact-byte-size.md b/.changeset/pre/exact-byte-size.md similarity index 100% rename from repos/effect/.changeset/pre/exact-byte-size.md rename to .changeset/pre/exact-byte-size.md diff --git a/repos/effect/.changeset/pre/exact-http-file-body-length.md b/.changeset/pre/exact-http-file-body-length.md similarity index 100% rename from repos/effect/.changeset/pre/exact-http-file-body-length.md rename to .changeset/pre/exact-http-file-body-length.md diff --git a/repos/effect/.changeset/pre/execution-plan-captured-predicate.md b/.changeset/pre/execution-plan-captured-predicate.md similarity index 100% rename from repos/effect/.changeset/pre/execution-plan-captured-predicate.md rename to .changeset/pre/execution-plan-captured-predicate.md diff --git a/repos/effect/.changeset/pre/expand-schema-filter-output.md b/.changeset/pre/expand-schema-filter-output.md similarity index 100% rename from repos/effect/.changeset/pre/expand-schema-filter-output.md rename to .changeset/pre/expand-schema-filter-output.md diff --git a/repos/effect/.changeset/pre/explicit-env-record.md b/.changeset/pre/explicit-env-record.md similarity index 100% rename from repos/effect/.changeset/pre/explicit-env-record.md rename to .changeset/pre/explicit-env-record.md diff --git a/repos/effect/.changeset/pre/explicit-otel-service-identity.md b/.changeset/pre/explicit-otel-service-identity.md similarity index 100% rename from repos/effect/.changeset/pre/explicit-otel-service-identity.md rename to .changeset/pre/explicit-otel-service-identity.md diff --git a/repos/effect/.changeset/pre/export-schema-encode-keys-interface.md b/.changeset/pre/export-schema-encode-keys-interface.md similarity index 100% rename from repos/effect/.changeset/pre/export-schema-encode-keys-interface.md rename to .changeset/pre/export-schema-encode-keys-interface.md diff --git a/repos/effect/.changeset/pre/expose-ai-prompt-part-schemas.md b/.changeset/pre/expose-ai-prompt-part-schemas.md similarity index 100% rename from repos/effect/.changeset/pre/expose-ai-prompt-part-schemas.md rename to .changeset/pre/expose-ai-prompt-part-schemas.md diff --git a/repos/effect/.changeset/pre/extract-semaphore-latch.md b/.changeset/pre/extract-semaphore-latch.md similarity index 100% rename from repos/effect/.changeset/pre/extract-semaphore-latch.md rename to .changeset/pre/extract-semaphore-latch.md diff --git a/repos/effect/.changeset/pre/failed-otlp-checkpoints.md b/.changeset/pre/failed-otlp-checkpoints.md similarity index 100% rename from repos/effect/.changeset/pre/failed-otlp-checkpoints.md rename to .changeset/pre/failed-otlp-checkpoints.md diff --git a/repos/effect/.changeset/pre/fair-bees-relax.md b/.changeset/pre/fair-bees-relax.md similarity index 100% rename from repos/effect/.changeset/pre/fair-bees-relax.md rename to .changeset/pre/fair-bees-relax.md diff --git a/repos/effect/.changeset/pre/fair-birds-limit.md b/.changeset/pre/fair-birds-limit.md similarity index 100% rename from repos/effect/.changeset/pre/fair-birds-limit.md rename to .changeset/pre/fair-birds-limit.md diff --git a/repos/effect/.changeset/pre/fair-buttons-share.md b/.changeset/pre/fair-buttons-share.md similarity index 100% rename from repos/effect/.changeset/pre/fair-buttons-share.md rename to .changeset/pre/fair-buttons-share.md diff --git a/repos/effect/.changeset/pre/fair-citations-stream.md b/.changeset/pre/fair-citations-stream.md similarity index 100% rename from repos/effect/.changeset/pre/fair-citations-stream.md rename to .changeset/pre/fair-citations-stream.md diff --git a/repos/effect/.changeset/pre/fair-cooks-stop.md b/.changeset/pre/fair-cooks-stop.md similarity index 100% rename from repos/effect/.changeset/pre/fair-cooks-stop.md rename to .changeset/pre/fair-cooks-stop.md diff --git a/repos/effect/.changeset/pre/fair-cups-train.md b/.changeset/pre/fair-cups-train.md similarity index 100% rename from repos/effect/.changeset/pre/fair-cups-train.md rename to .changeset/pre/fair-cups-train.md diff --git a/repos/effect/.changeset/pre/fair-dryers-speak.md b/.changeset/pre/fair-dryers-speak.md similarity index 100% rename from repos/effect/.changeset/pre/fair-dryers-speak.md rename to .changeset/pre/fair-dryers-speak.md diff --git a/repos/effect/.changeset/pre/fair-forks-shake.md b/.changeset/pre/fair-forks-shake.md similarity index 100% rename from repos/effect/.changeset/pre/fair-forks-shake.md rename to .changeset/pre/fair-forks-shake.md diff --git a/repos/effect/.changeset/pre/fair-jobs-like.md b/.changeset/pre/fair-jobs-like.md similarity index 100% rename from repos/effect/.changeset/pre/fair-jobs-like.md rename to .changeset/pre/fair-jobs-like.md diff --git a/repos/effect/.changeset/pre/fair-logs-correlate.md b/.changeset/pre/fair-logs-correlate.md similarity index 100% rename from repos/effect/.changeset/pre/fair-logs-correlate.md rename to .changeset/pre/fair-logs-correlate.md diff --git a/repos/effect/.changeset/pre/fair-logs-listen.md b/.changeset/pre/fair-logs-listen.md similarity index 100% rename from repos/effect/.changeset/pre/fair-logs-listen.md rename to .changeset/pre/fair-logs-listen.md diff --git a/repos/effect/.changeset/pre/fair-matches-infer.md b/.changeset/pre/fair-matches-infer.md similarity index 100% rename from repos/effect/.changeset/pre/fair-matches-infer.md rename to .changeset/pre/fair-matches-infer.md diff --git a/repos/effect/.changeset/pre/fair-pandas-prove.md b/.changeset/pre/fair-pandas-prove.md similarity index 100% rename from repos/effect/.changeset/pre/fair-pandas-prove.md rename to .changeset/pre/fair-pandas-prove.md diff --git a/repos/effect/.changeset/pre/fair-pants-float.md b/.changeset/pre/fair-pants-float.md similarity index 100% rename from repos/effect/.changeset/pre/fair-pants-float.md rename to .changeset/pre/fair-pants-float.md diff --git a/repos/effect/.changeset/pre/fair-poems-visit.md b/.changeset/pre/fair-poems-visit.md similarity index 100% rename from repos/effect/.changeset/pre/fair-poems-visit.md rename to .changeset/pre/fair-poems-visit.md diff --git a/repos/effect/.changeset/pre/fair-sampling-content.md b/.changeset/pre/fair-sampling-content.md similarity index 100% rename from repos/effect/.changeset/pre/fair-sampling-content.md rename to .changeset/pre/fair-sampling-content.md diff --git a/repos/effect/.changeset/pre/fair-sinks-catch.md b/.changeset/pre/fair-sinks-catch.md similarity index 100% rename from repos/effect/.changeset/pre/fair-sinks-catch.md rename to .changeset/pre/fair-sinks-catch.md diff --git a/repos/effect/.changeset/pre/fair-workflows-suspend.md b/.changeset/pre/fair-workflows-suspend.md similarity index 100% rename from repos/effect/.changeset/pre/fair-workflows-suspend.md rename to .changeset/pre/fair-workflows-suspend.md diff --git a/repos/effect/.changeset/pre/famous-loops-flow.md b/.changeset/pre/famous-loops-flow.md similarity index 100% rename from repos/effect/.changeset/pre/famous-loops-flow.md rename to .changeset/pre/famous-loops-flow.md diff --git a/repos/effect/.changeset/pre/famous-wolves-lead.md b/.changeset/pre/famous-wolves-lead.md similarity index 100% rename from repos/effect/.changeset/pre/famous-wolves-lead.md rename to .changeset/pre/famous-wolves-lead.md diff --git a/repos/effect/.changeset/pre/fancy-glasses-grow.md b/.changeset/pre/fancy-glasses-grow.md similarity index 100% rename from repos/effect/.changeset/pre/fancy-glasses-grow.md rename to .changeset/pre/fancy-glasses-grow.md diff --git a/repos/effect/.changeset/pre/fast-graph-path-queues.md b/.changeset/pre/fast-graph-path-queues.md similarity index 100% rename from repos/effect/.changeset/pre/fast-graph-path-queues.md rename to .changeset/pre/fast-graph-path-queues.md diff --git a/repos/effect/.changeset/pre/fast-times-camp.md b/.changeset/pre/fast-times-camp.md similarity index 100% rename from repos/effect/.changeset/pre/fast-times-camp.md rename to .changeset/pre/fast-times-camp.md diff --git a/.changeset/pre/faster-schema-construction.md b/.changeset/pre/faster-schema-construction.md new file mode 100644 index 000000000..3310a7c53 --- /dev/null +++ b/.changeset/pre/faster-schema-construction.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +Optimize schema initialization while preserving custom constructor options. diff --git a/repos/effect/.changeset/pre/fetch-raw-stream-duplex.md b/.changeset/pre/fetch-raw-stream-duplex.md similarity index 100% rename from repos/effect/.changeset/pre/fetch-raw-stream-duplex.md rename to .changeset/pre/fetch-raw-stream-duplex.md diff --git a/repos/effect/.changeset/pre/few-birds-matter.md b/.changeset/pre/few-birds-matter.md similarity index 100% rename from repos/effect/.changeset/pre/few-birds-matter.md rename to .changeset/pre/few-birds-matter.md diff --git a/repos/effect/.changeset/pre/few-cougars-dig.md b/.changeset/pre/few-cougars-dig.md similarity index 100% rename from repos/effect/.changeset/pre/few-cougars-dig.md rename to .changeset/pre/few-cougars-dig.md diff --git a/repos/effect/.changeset/pre/few-foxes-grin.md b/.changeset/pre/few-foxes-grin.md similarity index 100% rename from repos/effect/.changeset/pre/few-foxes-grin.md rename to .changeset/pre/few-foxes-grin.md diff --git a/repos/effect/.changeset/pre/few-mirrors-pull.md b/.changeset/pre/few-mirrors-pull.md similarity index 100% rename from repos/effect/.changeset/pre/few-mirrors-pull.md rename to .changeset/pre/few-mirrors-pull.md diff --git a/repos/effect/.changeset/pre/few-socks-poke.md b/.changeset/pre/few-socks-poke.md similarity index 100% rename from repos/effect/.changeset/pre/few-socks-poke.md rename to .changeset/pre/few-socks-poke.md diff --git a/repos/effect/.changeset/pre/fiber-join-all-errors.md b/.changeset/pre/fiber-join-all-errors.md similarity index 100% rename from repos/effect/.changeset/pre/fiber-join-all-errors.md rename to .changeset/pre/fiber-join-all-errors.md diff --git a/repos/effect/.changeset/pre/fiber-map-reentrant-replacement.md b/.changeset/pre/fiber-map-reentrant-replacement.md similarity index 100% rename from repos/effect/.changeset/pre/fiber-map-reentrant-replacement.md rename to .changeset/pre/fiber-map-reentrant-replacement.md diff --git a/repos/effect/.changeset/pre/fiber-registration-same-fiber.md b/.changeset/pre/fiber-registration-same-fiber.md similarity index 100% rename from repos/effect/.changeset/pre/fiber-registration-same-fiber.md rename to .changeset/pre/fiber-registration-same-fiber.md diff --git a/repos/effect/.changeset/pre/fiber-runtime-start-metrics.md b/.changeset/pre/fiber-runtime-start-metrics.md similarity index 100% rename from repos/effect/.changeset/pre/fiber-runtime-start-metrics.md rename to .changeset/pre/fiber-runtime-start-metrics.md diff --git a/repos/effect/.changeset/pre/fiery-jokes-care.md b/.changeset/pre/fiery-jokes-care.md similarity index 100% rename from repos/effect/.changeset/pre/fiery-jokes-care.md rename to .changeset/pre/fiery-jokes-care.md diff --git a/repos/effect/.changeset/pre/fiery-mammals-call.md b/.changeset/pre/fiery-mammals-call.md similarity index 100% rename from repos/effect/.changeset/pre/fiery-mammals-call.md rename to .changeset/pre/fiery-mammals-call.md diff --git a/repos/effect/.changeset/pre/fifty-carrots-punch.md b/.changeset/pre/fifty-carrots-punch.md similarity index 100% rename from repos/effect/.changeset/pre/fifty-carrots-punch.md rename to .changeset/pre/fifty-carrots-punch.md diff --git a/repos/effect/.changeset/pre/file-prompt-jk-filter.md b/.changeset/pre/file-prompt-jk-filter.md similarity index 100% rename from repos/effect/.changeset/pre/file-prompt-jk-filter.md rename to .changeset/pre/file-prompt-jk-filter.md diff --git a/repos/effect/.changeset/pre/filesystem-sink-undefined-flag.md b/.changeset/pre/filesystem-sink-undefined-flag.md similarity index 100% rename from repos/effect/.changeset/pre/filesystem-sink-undefined-flag.md rename to .changeset/pre/filesystem-sink-undefined-flag.md diff --git a/repos/effect/.changeset/pre/filesystem-stat-optional-inode.md b/.changeset/pre/filesystem-stat-optional-inode.md similarity index 100% rename from repos/effect/.changeset/pre/filesystem-stat-optional-inode.md rename to .changeset/pre/filesystem-stat-optional-inode.md diff --git a/repos/effect/.changeset/pre/fine-walls-decide.md b/.changeset/pre/fine-walls-decide.md similarity index 100% rename from repos/effect/.changeset/pre/fine-walls-decide.md rename to .changeset/pre/fine-walls-decide.md diff --git a/repos/effect/.changeset/pre/first-success-of.md b/.changeset/pre/first-success-of.md similarity index 100% rename from repos/effect/.changeset/pre/first-success-of.md rename to .changeset/pre/first-success-of.md diff --git a/repos/effect/.changeset/pre/five-parents-relax.md b/.changeset/pre/five-parents-relax.md similarity index 100% rename from repos/effect/.changeset/pre/five-parents-relax.md rename to .changeset/pre/five-parents-relax.md diff --git a/repos/effect/.changeset/pre/five-spoons-visit.md b/.changeset/pre/five-spoons-visit.md similarity index 100% rename from repos/effect/.changeset/pre/five-spoons-visit.md rename to .changeset/pre/five-spoons-visit.md diff --git a/repos/effect/.changeset/pre/five-worms-rhyme.md b/.changeset/pre/five-worms-rhyme.md similarity index 100% rename from repos/effect/.changeset/pre/five-worms-rhyme.md rename to .changeset/pre/five-worms-rhyme.md diff --git a/repos/effect/.changeset/pre/fix-1332.md b/.changeset/pre/fix-1332.md similarity index 100% rename from repos/effect/.changeset/pre/fix-1332.md rename to .changeset/pre/fix-1332.md diff --git a/repos/effect/.changeset/pre/fix-1917.md b/.changeset/pre/fix-1917.md similarity index 100% rename from repos/effect/.changeset/pre/fix-1917.md rename to .changeset/pre/fix-1917.md diff --git a/repos/effect/.changeset/pre/fix-1927.md b/.changeset/pre/fix-1927.md similarity index 100% rename from repos/effect/.changeset/pre/fix-1927.md rename to .changeset/pre/fix-1927.md diff --git a/repos/effect/.changeset/pre/fix-1940.md b/.changeset/pre/fix-1940.md similarity index 100% rename from repos/effect/.changeset/pre/fix-1940.md rename to .changeset/pre/fix-1940.md diff --git a/repos/effect/.changeset/pre/fix-1947.md b/.changeset/pre/fix-1947.md similarity index 100% rename from repos/effect/.changeset/pre/fix-1947.md rename to .changeset/pre/fix-1947.md diff --git a/repos/effect/.changeset/pre/fix-2002.md b/.changeset/pre/fix-2002.md similarity index 100% rename from repos/effect/.changeset/pre/fix-2002.md rename to .changeset/pre/fix-2002.md diff --git a/repos/effect/.changeset/pre/fix-2012.md b/.changeset/pre/fix-2012.md similarity index 100% rename from repos/effect/.changeset/pre/fix-2012.md rename to .changeset/pre/fix-2012.md diff --git a/repos/effect/.changeset/pre/fix-2015.md b/.changeset/pre/fix-2015.md similarity index 100% rename from repos/effect/.changeset/pre/fix-2015.md rename to .changeset/pre/fix-2015.md diff --git a/repos/effect/.changeset/pre/fix-2260.md b/.changeset/pre/fix-2260.md similarity index 100% rename from repos/effect/.changeset/pre/fix-2260.md rename to .changeset/pre/fix-2260.md diff --git a/repos/effect/.changeset/pre/fix-2268.md b/.changeset/pre/fix-2268.md similarity index 100% rename from repos/effect/.changeset/pre/fix-2268.md rename to .changeset/pre/fix-2268.md diff --git a/repos/effect/.changeset/pre/fix-2271.md b/.changeset/pre/fix-2271.md similarity index 100% rename from repos/effect/.changeset/pre/fix-2271.md rename to .changeset/pre/fix-2271.md diff --git a/repos/effect/.changeset/pre/fix-2384.md b/.changeset/pre/fix-2384.md similarity index 100% rename from repos/effect/.changeset/pre/fix-2384.md rename to .changeset/pre/fix-2384.md diff --git a/repos/effect/.changeset/pre/fix-2414.md b/.changeset/pre/fix-2414.md similarity index 100% rename from repos/effect/.changeset/pre/fix-2414.md rename to .changeset/pre/fix-2414.md diff --git a/repos/effect/.changeset/pre/fix-2419.md b/.changeset/pre/fix-2419.md similarity index 100% rename from repos/effect/.changeset/pre/fix-2419.md rename to .changeset/pre/fix-2419.md diff --git a/repos/effect/.changeset/pre/fix-2497.md b/.changeset/pre/fix-2497.md similarity index 100% rename from repos/effect/.changeset/pre/fix-2497.md rename to .changeset/pre/fix-2497.md diff --git a/repos/effect/.changeset/pre/fix-2499.md b/.changeset/pre/fix-2499.md similarity index 100% rename from repos/effect/.changeset/pre/fix-2499.md rename to .changeset/pre/fix-2499.md diff --git a/repos/effect/.changeset/pre/fix-6464.md b/.changeset/pre/fix-6464.md similarity index 100% rename from repos/effect/.changeset/pre/fix-6464.md rename to .changeset/pre/fix-6464.md diff --git a/repos/effect/.changeset/pre/fix-6491.md b/.changeset/pre/fix-6491.md similarity index 100% rename from repos/effect/.changeset/pre/fix-6491.md rename to .changeset/pre/fix-6491.md diff --git a/repos/effect/.changeset/pre/fix-6521.md b/.changeset/pre/fix-6521.md similarity index 100% rename from repos/effect/.changeset/pre/fix-6521.md rename to .changeset/pre/fix-6521.md diff --git a/repos/effect/.changeset/pre/fix-ai-empty-params-structured-output.md b/.changeset/pre/fix-ai-empty-params-structured-output.md similarity index 100% rename from repos/effect/.changeset/pre/fix-ai-empty-params-structured-output.md rename to .changeset/pre/fix-ai-empty-params-structured-output.md diff --git a/repos/effect/.changeset/pre/fix-ai-text-toolkit-typing.md b/.changeset/pre/fix-ai-text-toolkit-typing.md similarity index 100% rename from repos/effect/.changeset/pre/fix-ai-text-toolkit-typing.md rename to .changeset/pre/fix-ai-text-toolkit-typing.md diff --git a/repos/effect/.changeset/pre/fix-ai-tool-call-id.md b/.changeset/pre/fix-ai-tool-call-id.md similarity index 100% rename from repos/effect/.changeset/pre/fix-ai-tool-call-id.md rename to .changeset/pre/fix-ai-tool-call-id.md diff --git a/repos/effect/.changeset/pre/fix-ansi-cursor-to.md b/.changeset/pre/fix-ansi-cursor-to.md similarity index 100% rename from repos/effect/.changeset/pre/fix-ansi-cursor-to.md rename to .changeset/pre/fix-ansi-cursor-to.md diff --git a/repos/effect/.changeset/pre/fix-anthropic-caller-toolid.md b/.changeset/pre/fix-anthropic-caller-toolid.md similarity index 100% rename from repos/effect/.changeset/pre/fix-anthropic-caller-toolid.md rename to .changeset/pre/fix-anthropic-caller-toolid.md diff --git a/repos/effect/.changeset/pre/fix-anthropic-code-execution-deltas.md b/.changeset/pre/fix-anthropic-code-execution-deltas.md similarity index 100% rename from repos/effect/.changeset/pre/fix-anthropic-code-execution-deltas.md rename to .changeset/pre/fix-anthropic-code-execution-deltas.md diff --git a/repos/effect/.changeset/pre/fix-anthropic-header-redaction.md b/.changeset/pre/fix-anthropic-header-redaction.md similarity index 100% rename from repos/effect/.changeset/pre/fix-anthropic-header-redaction.md rename to .changeset/pre/fix-anthropic-header-redaction.md diff --git a/repos/effect/.changeset/pre/fix-anthropic-memory-tool-requires-handler.md b/.changeset/pre/fix-anthropic-memory-tool-requires-handler.md similarity index 100% rename from repos/effect/.changeset/pre/fix-anthropic-memory-tool-requires-handler.md rename to .changeset/pre/fix-anthropic-memory-tool-requires-handler.md diff --git a/repos/effect/.changeset/pre/fix-anthropic-memory-tool.md b/.changeset/pre/fix-anthropic-memory-tool.md similarity index 100% rename from repos/effect/.changeset/pre/fix-anthropic-memory-tool.md rename to .changeset/pre/fix-anthropic-memory-tool.md diff --git a/repos/effect/.changeset/pre/fix-anthropic-plaintext-bytes.md b/.changeset/pre/fix-anthropic-plaintext-bytes.md similarity index 100% rename from repos/effect/.changeset/pre/fix-anthropic-plaintext-bytes.md rename to .changeset/pre/fix-anthropic-plaintext-bytes.md diff --git a/repos/effect/.changeset/pre/fix-array-non-finite-indexes.md b/.changeset/pre/fix-array-non-finite-indexes.md similarity index 100% rename from repos/effect/.changeset/pre/fix-array-non-finite-indexes.md rename to .changeset/pre/fix-array-non-finite-indexes.md diff --git a/repos/effect/.changeset/pre/fix-atom-batch-dependencies.md b/.changeset/pre/fix-atom-batch-dependencies.md similarity index 100% rename from repos/effect/.changeset/pre/fix-atom-batch-dependencies.md rename to .changeset/pre/fix-atom-batch-dependencies.md diff --git a/repos/effect/.changeset/pre/fix-atom-http-stream-success-types.md b/.changeset/pre/fix-atom-http-stream-success-types.md similarity index 100% rename from repos/effect/.changeset/pre/fix-atom-http-stream-success-types.md rename to .changeset/pre/fix-atom-http-stream-success-types.md diff --git a/repos/effect/.changeset/pre/fix-atom-http-top-level-dispatch.md b/.changeset/pre/fix-atom-http-top-level-dispatch.md similarity index 100% rename from repos/effect/.changeset/pre/fix-atom-http-top-level-dispatch.md rename to .changeset/pre/fix-atom-http-top-level-dispatch.md diff --git a/repos/effect/.changeset/pre/fix-atom-kvs-async-write.md b/.changeset/pre/fix-atom-kvs-async-write.md similarity index 100% rename from repos/effect/.changeset/pre/fix-atom-kvs-async-write.md rename to .changeset/pre/fix-atom-kvs-async-write.md diff --git a/repos/effect/.changeset/pre/fix-atom-query-zero-ttl.md b/.changeset/pre/fix-atom-query-zero-ttl.md similarity index 100% rename from repos/effect/.changeset/pre/fix-atom-query-zero-ttl.md rename to .changeset/pre/fix-atom-query-zero-ttl.md diff --git a/repos/effect/.changeset/pre/fix-atom-rpc-client-middleware-errors.md b/.changeset/pre/fix-atom-rpc-client-middleware-errors.md similarity index 100% rename from repos/effect/.changeset/pre/fix-atom-rpc-client-middleware-errors.md rename to .changeset/pre/fix-atom-rpc-client-middleware-errors.md diff --git a/repos/effect/.changeset/pre/fix-atom-suspense-registry-cache.md b/.changeset/pre/fix-atom-suspense-registry-cache.md similarity index 100% rename from repos/effect/.changeset/pre/fix-atom-suspense-registry-cache.md rename to .changeset/pre/fix-atom-suspense-registry-cache.md diff --git a/repos/effect/.changeset/pre/fix-atom-writable-fallback.md b/.changeset/pre/fix-atom-writable-fallback.md similarity index 100% rename from repos/effect/.changeset/pre/fix-atom-writable-fallback.md rename to .changeset/pre/fix-atom-writable-fallback.md diff --git a/repos/effect/.changeset/pre/fix-bash-subcommand-dispatch.md b/.changeset/pre/fix-bash-subcommand-dispatch.md similarity index 100% rename from repos/effect/.changeset/pre/fix-bash-subcommand-dispatch.md rename to .changeset/pre/fix-bash-subcommand-dispatch.md diff --git a/repos/effect/.changeset/pre/fix-bigint-gcd-lcm.md b/.changeset/pre/fix-bigint-gcd-lcm.md similarity index 100% rename from repos/effect/.changeset/pre/fix-bigint-gcd-lcm.md rename to .changeset/pre/fix-bigint-gcd-lcm.md diff --git a/repos/effect/.changeset/pre/fix-bun-http-default-hostname.md b/.changeset/pre/fix-bun-http-default-hostname.md similarity index 100% rename from repos/effect/.changeset/pre/fix-bun-http-default-hostname.md rename to .changeset/pre/fix-bun-http-default-hostname.md diff --git a/repos/effect/.changeset/pre/fix-cache-set-race.md b/.changeset/pre/fix-cache-set-race.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cache-set-race.md rename to .changeset/pre/fix-cache-set-race.md diff --git a/repos/effect/.changeset/pre/fix-catch-orelse-error-erasure.md b/.changeset/pre/fix-catch-orelse-error-erasure.md similarity index 100% rename from repos/effect/.changeset/pre/fix-catch-orelse-error-erasure.md rename to .changeset/pre/fix-catch-orelse-error-erasure.md diff --git a/repos/effect/.changeset/pre/fix-cause-map-annotations.md b/.changeset/pre/fix-cause-map-annotations.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cause-map-annotations.md rename to .changeset/pre/fix-cause-map-annotations.md diff --git a/repos/effect/.changeset/pre/fix-channel-effects-finalizer.md b/.changeset/pre/fix-channel-effects-finalizer.md similarity index 100% rename from repos/effect/.changeset/pre/fix-channel-effects-finalizer.md rename to .changeset/pre/fix-channel-effects-finalizer.md diff --git a/repos/effect/.changeset/pre/fix-channel-schema-decode-unknown.md b/.changeset/pre/fix-channel-schema-decode-unknown.md similarity index 100% rename from repos/effect/.changeset/pre/fix-channel-schema-decode-unknown.md rename to .changeset/pre/fix-channel-schema-decode-unknown.md diff --git a/repos/effect/.changeset/pre/fix-chunk-fractional-counts.md b/.changeset/pre/fix-chunk-fractional-counts.md similarity index 100% rename from repos/effect/.changeset/pre/fix-chunk-fractional-counts.md rename to .changeset/pre/fix-chunk-fractional-counts.md diff --git a/repos/effect/.changeset/pre/fix-class-constructor-defaults.md b/.changeset/pre/fix-class-constructor-defaults.md similarity index 100% rename from repos/effect/.changeset/pre/fix-class-constructor-defaults.md rename to .changeset/pre/fix-class-constructor-defaults.md diff --git a/repos/effect/.changeset/pre/fix-cli-help-table-spacing.md b/.changeset/pre/fix-cli-help-table-spacing.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cli-help-table-spacing.md rename to .changeset/pre/fix-cli-help-table-spacing.md diff --git a/repos/effect/.changeset/pre/fix-cli-missing-flag-values.md b/.changeset/pre/fix-cli-missing-flag-values.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cli-missing-flag-values.md rename to .changeset/pre/fix-cli-missing-flag-values.md diff --git a/repos/effect/.changeset/pre/fix-cli-mixed-global-flag-context.md b/.changeset/pre/fix-cli-mixed-global-flag-context.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cli-mixed-global-flag-context.md rename to .changeset/pre/fix-cli-mixed-global-flag-context.md diff --git a/repos/effect/.changeset/pre/fix-cli-subcommands-requirements.md b/.changeset/pre/fix-cli-subcommands-requirements.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cli-subcommands-requirements.md rename to .changeset/pre/fix-cli-subcommands-requirements.md diff --git a/repos/effect/.changeset/pre/fix-cli-unexpected-arguments.md b/.changeset/pre/fix-cli-unexpected-arguments.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cli-unexpected-arguments.md rename to .changeset/pre/fix-cli-unexpected-arguments.md diff --git a/repos/effect/.changeset/pre/fix-clickhouse-connect-timeout.md b/.changeset/pre/fix-clickhouse-connect-timeout.md similarity index 100% rename from repos/effect/.changeset/pre/fix-clickhouse-connect-timeout.md rename to .changeset/pre/fix-clickhouse-connect-timeout.md diff --git a/repos/effect/.changeset/pre/fix-cluster-entity-context-bleed.md b/.changeset/pre/fix-cluster-entity-context-bleed.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cluster-entity-context-bleed.md rename to .changeset/pre/fix-cluster-entity-context-bleed.md diff --git a/repos/effect/.changeset/pre/fix-cluster-reply-defect-isolation.md b/.changeset/pre/fix-cluster-reply-defect-isolation.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cluster-reply-defect-isolation.md rename to .changeset/pre/fix-cluster-reply-defect-isolation.md diff --git a/repos/effect/.changeset/pre/fix-cluster-shutdown-deadlock.md b/.changeset/pre/fix-cluster-shutdown-deadlock.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cluster-shutdown-deadlock.md rename to .changeset/pre/fix-cluster-shutdown-deadlock.md diff --git a/repos/effect/.changeset/pre/fix-cluster-strand-request-shutdown.md b/.changeset/pre/fix-cluster-strand-request-shutdown.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cluster-strand-request-shutdown.md rename to .changeset/pre/fix-cluster-strand-request-shutdown.md diff --git a/repos/effect/.changeset/pre/fix-cluster-stream-recovery.md b/.changeset/pre/fix-cluster-stream-recovery.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cluster-stream-recovery.md rename to .changeset/pre/fix-cluster-stream-recovery.md diff --git a/repos/effect/.changeset/pre/fix-config-array-default.md b/.changeset/pre/fix-config-array-default.md similarity index 100% rename from repos/effect/.changeset/pre/fix-config-array-default.md rename to .changeset/pre/fix-config-array-default.md diff --git a/repos/effect/.changeset/pre/fix-config-or-else-evidence.md b/.changeset/pre/fix-config-or-else-evidence.md similarity index 100% rename from repos/effect/.changeset/pre/fix-config-or-else-evidence.md rename to .changeset/pre/fix-config-or-else-evidence.md diff --git a/repos/effect/.changeset/pre/fix-config-withDefault.md b/.changeset/pre/fix-config-withDefault.md similarity index 100% rename from repos/effect/.changeset/pre/fix-config-withDefault.md rename to .changeset/pre/fix-config-withDefault.md diff --git a/repos/effect/.changeset/pre/fix-config-withdefault-filter.md b/.changeset/pre/fix-config-withdefault-filter.md similarity index 100% rename from repos/effect/.changeset/pre/fix-config-withdefault-filter.md rename to .changeset/pre/fix-config-withdefault-filter.md diff --git a/repos/effect/.changeset/pre/fix-context-add-or-omit-types.md b/.changeset/pre/fix-context-add-or-omit-types.md similarity index 100% rename from repos/effect/.changeset/pre/fix-context-add-or-omit-types.md rename to .changeset/pre/fix-context-add-or-omit-types.md diff --git a/repos/effect/.changeset/pre/fix-cors-vary.md b/.changeset/pre/fix-cors-vary.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cors-vary.md rename to .changeset/pre/fix-cors-vary.md diff --git a/repos/effect/.changeset/pre/fix-cron-and-representations.md b/.changeset/pre/fix-cron-and-representations.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cron-and-representations.md rename to .changeset/pre/fix-cron-and-representations.md diff --git a/repos/effect/.changeset/pre/fix-cron-make-validation.md b/.changeset/pre/fix-cron-make-validation.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cron-make-validation.md rename to .changeset/pre/fix-cron-make-validation.md diff --git a/repos/effect/.changeset/pre/fix-cron-next-missing-day-overflow.md b/.changeset/pre/fix-cron-next-missing-day-overflow.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cron-next-missing-day-overflow.md rename to .changeset/pre/fix-cron-next-missing-day-overflow.md diff --git a/repos/effect/.changeset/pre/fix-cron-parser-semantics.md b/.changeset/pre/fix-cron-parser-semantics.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cron-parser-semantics.md rename to .changeset/pre/fix-cron-parser-semantics.md diff --git a/repos/effect/.changeset/pre/fix-cron-prev-month-rollover.md b/.changeset/pre/fix-cron-prev-month-rollover.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cron-prev-month-rollover.md rename to .changeset/pre/fix-cron-prev-month-rollover.md diff --git a/repos/effect/.changeset/pre/fix-cron-prev-weekday-wrap.md b/.changeset/pre/fix-cron-prev-weekday-wrap.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cron-prev-weekday-wrap.md rename to .changeset/pre/fix-cron-prev-weekday-wrap.md diff --git a/repos/effect/.changeset/pre/fix-cron-timezone-hash.md b/.changeset/pre/fix-cron-timezone-hash.md similarity index 100% rename from repos/effect/.changeset/pre/fix-cron-timezone-hash.md rename to .changeset/pre/fix-cron-timezone-hash.md diff --git a/repos/effect/.changeset/pre/fix-dangling-internal-declarations.md b/.changeset/pre/fix-dangling-internal-declarations.md similarity index 100% rename from repos/effect/.changeset/pre/fix-dangling-internal-declarations.md rename to .changeset/pre/fix-dangling-internal-declarations.md diff --git a/repos/effect/.changeset/pre/fix-datetime-gmt.md b/.changeset/pre/fix-datetime-gmt.md similarity index 100% rename from repos/effect/.changeset/pre/fix-datetime-gmt.md rename to .changeset/pre/fix-datetime-gmt.md diff --git a/repos/effect/.changeset/pre/fix-deep-mutable-opaque-types.md b/.changeset/pre/fix-deep-mutable-opaque-types.md similarity index 100% rename from repos/effect/.changeset/pre/fix-deep-mutable-opaque-types.md rename to .changeset/pre/fix-deep-mutable-opaque-types.md diff --git a/repos/effect/.changeset/pre/fix-devtools-flush-on-teardown.md b/.changeset/pre/fix-devtools-flush-on-teardown.md similarity index 100% rename from repos/effect/.changeset/pre/fix-devtools-flush-on-teardown.md rename to .changeset/pre/fix-devtools-flush-on-teardown.md diff --git a/repos/effect/.changeset/pre/fix-devtools-span-snapshot.md b/.changeset/pre/fix-devtools-span-snapshot.md similarity index 100% rename from repos/effect/.changeset/pre/fix-devtools-span-snapshot.md rename to .changeset/pre/fix-devtools-span-snapshot.md diff --git a/repos/effect/.changeset/pre/fix-durable-clock-fractional-wakeup.md b/.changeset/pre/fix-durable-clock-fractional-wakeup.md similarity index 100% rename from repos/effect/.changeset/pre/fix-durable-clock-fractional-wakeup.md rename to .changeset/pre/fix-durable-clock-fractional-wakeup.md diff --git a/repos/effect/.changeset/pre/fix-durable-deferred-race.md b/.changeset/pre/fix-durable-deferred-race.md similarity index 100% rename from repos/effect/.changeset/pre/fix-durable-deferred-race.md rename to .changeset/pre/fix-durable-deferred-race.md diff --git a/repos/effect/.changeset/pre/fix-durable-race-replay.md b/.changeset/pre/fix-durable-race-replay.md similarity index 100% rename from repos/effect/.changeset/pre/fix-durable-race-replay.md rename to .changeset/pre/fix-durable-race-replay.md diff --git a/repos/effect/.changeset/pre/fix-duration-decimal-precision.md b/.changeset/pre/fix-duration-decimal-precision.md similarity index 100% rename from repos/effect/.changeset/pre/fix-duration-decimal-precision.md rename to .changeset/pre/fix-duration-decimal-precision.md diff --git a/repos/effect/.changeset/pre/fix-duration-symmetric-rounding.md b/.changeset/pre/fix-duration-symmetric-rounding.md similarity index 100% rename from repos/effect/.changeset/pre/fix-duration-symmetric-rounding.md rename to .changeset/pre/fix-duration-symmetric-rounding.md diff --git a/repos/effect/.changeset/pre/fix-effect-fn-self.md b/.changeset/pre/fix-effect-fn-self.md similarity index 100% rename from repos/effect/.changeset/pre/fix-effect-fn-self.md rename to .changeset/pre/fix-effect-fn-self.md diff --git a/repos/effect/.changeset/pre/fix-effect-schedule-errors.md b/.changeset/pre/fix-effect-schedule-errors.md similarity index 100% rename from repos/effect/.changeset/pre/fix-effect-schedule-errors.md rename to .changeset/pre/fix-effect-schedule-errors.md diff --git a/repos/effect/.changeset/pre/fix-encoded-header-metadata.md b/.changeset/pre/fix-encoded-header-metadata.md similarity index 100% rename from repos/effect/.changeset/pre/fix-encoded-header-metadata.md rename to .changeset/pre/fix-encoded-header-metadata.md diff --git a/repos/effect/.changeset/pre/fix-entity-manager-defect-replay.md b/.changeset/pre/fix-entity-manager-defect-replay.md similarity index 100% rename from repos/effect/.changeset/pre/fix-entity-manager-defect-replay.md rename to .changeset/pre/fix-entity-manager-defect-replay.md diff --git a/repos/effect/.changeset/pre/fix-entity-proxy-rpc-handler-context.md b/.changeset/pre/fix-entity-proxy-rpc-handler-context.md similarity index 100% rename from repos/effect/.changeset/pre/fix-entity-proxy-rpc-handler-context.md rename to .changeset/pre/fix-entity-proxy-rpc-handler-context.md diff --git a/repos/effect/.changeset/pre/fix-entity-proxy-server-path-params.md b/.changeset/pre/fix-entity-proxy-server-path-params.md similarity index 100% rename from repos/effect/.changeset/pre/fix-entity-proxy-server-path-params.md rename to .changeset/pre/fix-entity-proxy-server-path-params.md diff --git a/repos/effect/.changeset/pre/fix-eventlog-duplicate-chunks.md b/.changeset/pre/fix-eventlog-duplicate-chunks.md similarity index 100% rename from repos/effect/.changeset/pre/fix-eventlog-duplicate-chunks.md rename to .changeset/pre/fix-eventlog-duplicate-chunks.md diff --git a/repos/effect/.changeset/pre/fix-fiber-exit-observers.md b/.changeset/pre/fix-fiber-exit-observers.md similarity index 100% rename from repos/effect/.changeset/pre/fix-fiber-exit-observers.md rename to .changeset/pre/fix-fiber-exit-observers.md diff --git a/repos/effect/.changeset/pre/fix-fiberhandle-clear-race.md b/.changeset/pre/fix-fiberhandle-clear-race.md similarity index 100% rename from repos/effect/.changeset/pre/fix-fiberhandle-clear-race.md rename to .changeset/pre/fix-fiberhandle-clear-race.md diff --git a/repos/effect/.changeset/pre/fix-fiberset-json-id.md b/.changeset/pre/fix-fiberset-json-id.md similarity index 100% rename from repos/effect/.changeset/pre/fix-fiberset-json-id.md rename to .changeset/pre/fix-fiberset-json-id.md diff --git a/repos/effect/.changeset/pre/fix-fiberset-runtime-interruption.md b/.changeset/pre/fix-fiberset-runtime-interruption.md similarity index 100% rename from repos/effect/.changeset/pre/fix-fiberset-runtime-interruption.md rename to .changeset/pre/fix-fiberset-runtime-interruption.md diff --git a/repos/effect/.changeset/pre/fix-filesystem-integer-precision.md b/.changeset/pre/fix-filesystem-integer-precision.md similarity index 100% rename from repos/effect/.changeset/pre/fix-filesystem-integer-precision.md rename to .changeset/pre/fix-filesystem-integer-precision.md diff --git a/repos/effect/.changeset/pre/fix-fish-command-path.md b/.changeset/pre/fix-fish-command-path.md similarity index 100% rename from repos/effect/.changeset/pre/fix-fish-command-path.md rename to .changeset/pre/fix-fish-command-path.md diff --git a/repos/effect/.changeset/pre/fix-formatter-output-contracts.md b/.changeset/pre/fix-formatter-output-contracts.md similarity index 100% rename from repos/effect/.changeset/pre/fix-formatter-output-contracts.md rename to .changeset/pre/fix-formatter-output-contracts.md diff --git a/repos/effect/.changeset/pre/fix-from-json-string-identifier.md b/.changeset/pre/fix-from-json-string-identifier.md similarity index 100% rename from repos/effect/.changeset/pre/fix-from-json-string-identifier.md rename to .changeset/pre/fix-from-json-string-identifier.md diff --git a/repos/effect/.changeset/pre/fix-from-option-inline-inference.md b/.changeset/pre/fix-from-option-inline-inference.md similarity index 100% rename from repos/effect/.changeset/pre/fix-from-option-inline-inference.md rename to .changeset/pre/fix-from-option-inline-inference.md diff --git a/repos/effect/.changeset/pre/fix-from-readable-stream-cancel-defect.md b/.changeset/pre/fix-from-readable-stream-cancel-defect.md similarity index 100% rename from repos/effect/.changeset/pre/fix-from-readable-stream-cancel-defect.md rename to .changeset/pre/fix-from-readable-stream-cancel-defect.md diff --git a/repos/effect/.changeset/pre/fix-graph-allocator-equality.md b/.changeset/pre/fix-graph-allocator-equality.md similarity index 100% rename from repos/effect/.changeset/pre/fix-graph-allocator-equality.md rename to .changeset/pre/fix-graph-allocator-equality.md diff --git a/repos/effect/.changeset/pre/fix-graph-bellman-ford-self-cycle.md b/.changeset/pre/fix-graph-bellman-ford-self-cycle.md similarity index 100% rename from repos/effect/.changeset/pre/fix-graph-bellman-ford-self-cycle.md rename to .changeset/pre/fix-graph-bellman-ford-self-cycle.md diff --git a/repos/effect/.changeset/pre/fix-graph-curried-getters.md b/.changeset/pre/fix-graph-curried-getters.md similarity index 100% rename from repos/effect/.changeset/pre/fix-graph-curried-getters.md rename to .changeset/pre/fix-graph-curried-getters.md diff --git a/repos/effect/.changeset/pre/fix-graph-dfs-astar-edge-cases.md b/.changeset/pre/fix-graph-dfs-astar-edge-cases.md similarity index 100% rename from repos/effect/.changeset/pre/fix-graph-dfs-astar-edge-cases.md rename to .changeset/pre/fix-graph-dfs-astar-edge-cases.md diff --git a/repos/effect/.changeset/pre/fix-graph-edge-transforms.md b/.changeset/pre/fix-graph-edge-transforms.md similarity index 100% rename from repos/effect/.changeset/pre/fix-graph-edge-transforms.md rename to .changeset/pre/fix-graph-edge-transforms.md diff --git a/repos/effect/.changeset/pre/fix-graph-finite-edge-weights.md b/.changeset/pre/fix-graph-finite-edge-weights.md similarity index 100% rename from repos/effect/.changeset/pre/fix-graph-finite-edge-weights.md rename to .changeset/pre/fix-graph-finite-edge-weights.md diff --git a/repos/effect/.changeset/pre/fix-graph-mutable-hash.md b/.changeset/pre/fix-graph-mutable-hash.md similarity index 100% rename from repos/effect/.changeset/pre/fix-graph-mutable-hash.md rename to .changeset/pre/fix-graph-mutable-hash.md diff --git a/repos/effect/.changeset/pre/fix-graph-mutable-topo.md b/.changeset/pre/fix-graph-mutable-topo.md similarity index 100% rename from repos/effect/.changeset/pre/fix-graph-mutable-topo.md rename to .changeset/pre/fix-graph-mutable-topo.md diff --git a/repos/effect/.changeset/pre/fix-graph-mutation-errors.md b/.changeset/pre/fix-graph-mutation-errors.md similarity index 100% rename from repos/effect/.changeset/pre/fix-graph-mutation-errors.md rename to .changeset/pre/fix-graph-mutation-errors.md diff --git a/repos/effect/.changeset/pre/fix-graph-topo-types.md b/.changeset/pre/fix-graph-topo-types.md similarity index 100% rename from repos/effect/.changeset/pre/fix-graph-topo-types.md rename to .changeset/pre/fix-graph-topo-types.md diff --git a/repos/effect/.changeset/pre/fix-graph-undirected-traversal.md b/.changeset/pre/fix-graph-undirected-traversal.md similarity index 100% rename from repos/effect/.changeset/pre/fix-graph-undirected-traversal.md rename to .changeset/pre/fix-graph-undirected-traversal.md diff --git a/repos/effect/.changeset/pre/fix-graph-walker-repeatability.md b/.changeset/pre/fix-graph-walker-repeatability.md similarity index 100% rename from repos/effect/.changeset/pre/fix-graph-walker-repeatability.md rename to .changeset/pre/fix-graph-walker-repeatability.md diff --git a/repos/effect/.changeset/pre/fix-graphviz-dot-escaping.md b/.changeset/pre/fix-graphviz-dot-escaping.md similarity index 100% rename from repos/effect/.changeset/pre/fix-graphviz-dot-escaping.md rename to .changeset/pre/fix-graphviz-dot-escaping.md diff --git a/repos/effect/.changeset/pre/fix-group-by-key-types.md b/.changeset/pre/fix-group-by-key-types.md similarity index 100% rename from repos/effect/.changeset/pre/fix-group-by-key-types.md rename to .changeset/pre/fix-group-by-key-types.md diff --git a/repos/effect/.changeset/pre/fix-has-interrupts-only-empty.md b/.changeset/pre/fix-has-interrupts-only-empty.md similarity index 100% rename from repos/effect/.changeset/pre/fix-has-interrupts-only-empty.md rename to .changeset/pre/fix-has-interrupts-only-empty.md diff --git a/repos/effect/.changeset/pre/fix-hashmap-bit31-ordering.md b/.changeset/pre/fix-hashmap-bit31-ordering.md similarity index 100% rename from repos/effect/.changeset/pre/fix-hashmap-bit31-ordering.md rename to .changeset/pre/fix-hashmap-bit31-ordering.md diff --git a/repos/effect/.changeset/pre/fix-hashmap-modify-hash.md b/.changeset/pre/fix-hashmap-modify-hash.md similarity index 100% rename from repos/effect/.changeset/pre/fix-hashmap-modify-hash.md rename to .changeset/pre/fix-hashmap-modify-hash.md diff --git a/repos/effect/.changeset/pre/fix-headers-proto-enumerability.md b/.changeset/pre/fix-headers-proto-enumerability.md similarity index 100% rename from repos/effect/.changeset/pre/fix-headers-proto-enumerability.md rename to .changeset/pre/fix-headers-proto-enumerability.md diff --git a/repos/effect/.changeset/pre/fix-http-client-request-content-length.md b/.changeset/pre/fix-http-client-request-content-length.md similarity index 100% rename from repos/effect/.changeset/pre/fix-http-client-request-content-length.md rename to .changeset/pre/fix-http-client-request-content-length.md diff --git a/repos/effect/.changeset/pre/fix-http-incoming-message-parse-options.md b/.changeset/pre/fix-http-incoming-message-parse-options.md similarity index 100% rename from repos/effect/.changeset/pre/fix-http-incoming-message-parse-options.md rename to .changeset/pre/fix-http-incoming-message-parse-options.md diff --git a/repos/effect/.changeset/pre/fix-http-platform-file-ranges.md b/.changeset/pre/fix-http-platform-file-ranges.md similarity index 100% rename from repos/effect/.changeset/pre/fix-http-platform-file-ranges.md rename to .changeset/pre/fix-http-platform-file-ranges.md diff --git a/repos/effect/.changeset/pre/fix-http-pre-response-handler-types.md b/.changeset/pre/fix-http-pre-response-handler-types.md similarity index 100% rename from repos/effect/.changeset/pre/fix-http-pre-response-handler-types.md rename to .changeset/pre/fix-http-pre-response-handler-types.md diff --git a/repos/effect/.changeset/pre/fix-http-server-request-raw-body.md b/.changeset/pre/fix-http-server-request-raw-body.md similarity index 100% rename from repos/effect/.changeset/pre/fix-http-server-request-raw-body.md rename to .changeset/pre/fix-http-server-request-raw-body.md diff --git a/repos/effect/.changeset/pre/fix-http-server-response-body-headers.md b/.changeset/pre/fix-http-server-response-body-headers.md similarity index 100% rename from repos/effect/.changeset/pre/fix-http-server-response-body-headers.md rename to .changeset/pre/fix-http-server-response-body-headers.md diff --git a/.changeset/pre/fix-http-toweb-null-body-status.md b/.changeset/pre/fix-http-toweb-null-body-status.md new file mode 100644 index 000000000..dccd82337 --- /dev/null +++ b/.changeset/pre/fix-http-toweb-null-body-status.md @@ -0,0 +1,7 @@ +--- +"effect": patch +"@effect/platform-bun": patch +"@effect/platform-deno": patch +--- + +Omit response bodies for statuses 204, 205, and 304 in `HttpServerResponse.toWeb` and the Bun/Deno HTTP adapters, preventing invalid Web responses and hung requests. Cancel omitted raw `ReadableStream` bodies, and finalize request resources without starting omitted Effect streams. diff --git a/repos/effect/.changeset/pre/fix-http-tracer-response-cause.md b/.changeset/pre/fix-http-tracer-response-cause.md similarity index 100% rename from repos/effect/.changeset/pre/fix-http-tracer-response-cause.md rename to .changeset/pre/fix-http-tracer-response-cause.md diff --git a/repos/effect/.changeset/pre/fix-httpapi-authorization-decoding.md b/.changeset/pre/fix-httpapi-authorization-decoding.md similarity index 100% rename from repos/effect/.changeset/pre/fix-httpapi-authorization-decoding.md rename to .changeset/pre/fix-httpapi-authorization-decoding.md diff --git a/repos/effect/.changeset/pre/fix-httpapi-client-error-content-type.md b/.changeset/pre/fix-httpapi-client-error-content-type.md similarity index 100% rename from repos/effect/.changeset/pre/fix-httpapi-client-error-content-type.md rename to .changeset/pre/fix-httpapi-client-error-content-type.md diff --git a/repos/effect/.changeset/pre/fix-httpapi-endpoint-error-inference.md b/.changeset/pre/fix-httpapi-endpoint-error-inference.md similarity index 100% rename from repos/effect/.changeset/pre/fix-httpapi-endpoint-error-inference.md rename to .changeset/pre/fix-httpapi-endpoint-error-inference.md diff --git a/repos/effect/.changeset/pre/fix-httpapi-form-responses.md b/.changeset/pre/fix-httpapi-form-responses.md similarity index 100% rename from repos/effect/.changeset/pre/fix-httpapi-form-responses.md rename to .changeset/pre/fix-httpapi-form-responses.md diff --git a/repos/effect/.changeset/pre/fix-httpapi-malformed-json-400.md b/.changeset/pre/fix-httpapi-malformed-json-400.md similarity index 100% rename from repos/effect/.changeset/pre/fix-httpapi-malformed-json-400.md rename to .changeset/pre/fix-httpapi-malformed-json-400.md diff --git a/repos/effect/.changeset/pre/fix-httpapi-runtime-shape.md b/.changeset/pre/fix-httpapi-runtime-shape.md similarity index 100% rename from repos/effect/.changeset/pre/fix-httpapi-runtime-shape.md rename to .changeset/pre/fix-httpapi-runtime-shape.md diff --git a/repos/effect/.changeset/pre/fix-httpapi-schema-types.md b/.changeset/pre/fix-httpapi-schema-types.md similarity index 100% rename from repos/effect/.changeset/pre/fix-httpapi-schema-types.md rename to .changeset/pre/fix-httpapi-schema-types.md diff --git a/repos/effect/.changeset/pre/fix-httpapi-security-middleware-cache.md b/.changeset/pre/fix-httpapi-security-middleware-cache.md similarity index 100% rename from repos/effect/.changeset/pre/fix-httpapi-security-middleware-cache.md rename to .changeset/pre/fix-httpapi-security-middleware-cache.md diff --git a/repos/effect/.changeset/pre/fix-httpapi-single-array-query.md b/.changeset/pre/fix-httpapi-single-array-query.md similarity index 100% rename from repos/effect/.changeset/pre/fix-httpapi-single-array-query.md rename to .changeset/pre/fix-httpapi-single-array-query.md diff --git a/repos/effect/.changeset/pre/fix-httpapi-test-pre-response-handlers.md b/.changeset/pre/fix-httpapi-test-pre-response-handlers.md similarity index 100% rename from repos/effect/.changeset/pre/fix-httpapi-test-pre-response-handlers.md rename to .changeset/pre/fix-httpapi-test-pre-response-handlers.md diff --git a/repos/effect/.changeset/pre/fix-httpapi-url-builder-base-path.md b/.changeset/pre/fix-httpapi-url-builder-base-path.md similarity index 100% rename from repos/effect/.changeset/pre/fix-httpapi-url-builder-base-path.md rename to .changeset/pre/fix-httpapi-url-builder-base-path.md diff --git a/repos/effect/.changeset/pre/fix-invalid-openapi-examples.md b/.changeset/pre/fix-invalid-openapi-examples.md similarity index 100% rename from repos/effect/.changeset/pre/fix-invalid-openapi-examples.md rename to .changeset/pre/fix-invalid-openapi-examples.md diff --git a/repos/effect/.changeset/pre/fix-invalid-value-doubled-expected.md b/.changeset/pre/fix-invalid-value-doubled-expected.md similarity index 100% rename from repos/effect/.changeset/pre/fix-invalid-value-doubled-expected.md rename to .changeset/pre/fix-invalid-value-doubled-expected.md diff --git a/repos/effect/.changeset/pre/fix-is-json-dag.md b/.changeset/pre/fix-is-json-dag.md similarity index 100% rename from repos/effect/.changeset/pre/fix-is-json-dag.md rename to .changeset/pre/fix-is-json-dag.md diff --git a/repos/effect/.changeset/pre/fix-iterable-flatten-stack-safety.md b/.changeset/pre/fix-iterable-flatten-stack-safety.md similarity index 100% rename from repos/effect/.changeset/pre/fix-iterable-flatten-stack-safety.md rename to .changeset/pre/fix-iterable-flatten-stack-safety.md diff --git a/repos/effect/.changeset/pre/fix-json-schema-anyof-oneof-siblings.md b/.changeset/pre/fix-json-schema-anyof-oneof-siblings.md similarity index 100% rename from repos/effect/.changeset/pre/fix-json-schema-anyof-oneof-siblings.md rename to .changeset/pre/fix-json-schema-anyof-oneof-siblings.md diff --git a/repos/effect/.changeset/pre/fix-json-schema-import-json.md b/.changeset/pre/fix-json-schema-import-json.md similarity index 100% rename from repos/effect/.changeset/pre/fix-json-schema-import-json.md rename to .changeset/pre/fix-json-schema-import-json.md diff --git a/repos/effect/.changeset/pre/fix-json-schema-percent-references.md b/.changeset/pre/fix-json-schema-percent-references.md similarity index 100% rename from repos/effect/.changeset/pre/fix-json-schema-percent-references.md rename to .changeset/pre/fix-json-schema-percent-references.md diff --git a/repos/effect/.changeset/pre/fix-json-schema-reference-resolution.md b/.changeset/pre/fix-json-schema-reference-resolution.md similarity index 100% rename from repos/effect/.changeset/pre/fix-json-schema-reference-resolution.md rename to .changeset/pre/fix-json-schema-reference-resolution.md diff --git a/repos/effect/.changeset/pre/fix-json-schema-unique-items-false.md b/.changeset/pre/fix-json-schema-unique-items-false.md similarity index 100% rename from repos/effect/.changeset/pre/fix-json-schema-unique-items-false.md rename to .changeset/pre/fix-json-schema-unique-items-false.md diff --git a/repos/effect/.changeset/pre/fix-keepalive-blocked-timers.md b/.changeset/pre/fix-keepalive-blocked-timers.md similarity index 100% rename from repos/effect/.changeset/pre/fix-keepalive-blocked-timers.md rename to .changeset/pre/fix-keepalive-blocked-timers.md diff --git a/repos/effect/.changeset/pre/fix-language-model-stream-concurrency.md b/.changeset/pre/fix-language-model-stream-concurrency.md similarity index 100% rename from repos/effect/.changeset/pre/fix-language-model-stream-concurrency.md rename to .changeset/pre/fix-language-model-stream-concurrency.md diff --git a/repos/effect/.changeset/pre/fix-latch-stale-flush.md b/.changeset/pre/fix-latch-stale-flush.md similarity index 100% rename from repos/effect/.changeset/pre/fix-latch-stale-flush.md rename to .changeset/pre/fix-latch-stale-flush.md diff --git a/repos/effect/.changeset/pre/fix-layermap-preload.md b/.changeset/pre/fix-layermap-preload.md similarity index 100% rename from repos/effect/.changeset/pre/fix-layermap-preload.md rename to .changeset/pre/fix-layermap-preload.md diff --git a/repos/effect/.changeset/pre/fix-mcp-call-tool-arguments.md b/.changeset/pre/fix-mcp-call-tool-arguments.md similarity index 100% rename from repos/effect/.changeset/pre/fix-mcp-call-tool-arguments.md rename to .changeset/pre/fix-mcp-call-tool-arguments.md diff --git a/repos/effect/.changeset/pre/fix-mcp-completion-context.md b/.changeset/pre/fix-mcp-completion-context.md similarity index 100% rename from repos/effect/.changeset/pre/fix-mcp-completion-context.md rename to .changeset/pre/fix-mcp-completion-context.md diff --git a/repos/effect/.changeset/pre/fix-mcp-param-name-resolution.md b/.changeset/pre/fix-mcp-param-name-resolution.md similarity index 100% rename from repos/effect/.changeset/pre/fix-mcp-param-name-resolution.md rename to .changeset/pre/fix-mcp-param-name-resolution.md diff --git a/repos/effect/.changeset/pre/fix-mcp-request-errors.md b/.changeset/pre/fix-mcp-request-errors.md similarity index 100% rename from repos/effect/.changeset/pre/fix-mcp-request-errors.md rename to .changeset/pre/fix-mcp-request-errors.md diff --git a/repos/effect/.changeset/pre/fix-memory-journal-conflicts.md b/.changeset/pre/fix-memory-journal-conflicts.md similarity index 100% rename from repos/effect/.changeset/pre/fix-memory-journal-conflicts.md rename to .changeset/pre/fix-memory-journal-conflicts.md diff --git a/repos/effect/.changeset/pre/fix-memory-journal-next-sequence.md b/.changeset/pre/fix-memory-journal-next-sequence.md similarity index 100% rename from repos/effect/.changeset/pre/fix-memory-journal-next-sequence.md rename to .changeset/pre/fix-memory-journal-next-sequence.md diff --git a/repos/effect/.changeset/pre/fix-memory-journal-relay.md b/.changeset/pre/fix-memory-journal-relay.md similarity index 100% rename from repos/effect/.changeset/pre/fix-memory-journal-relay.md rename to .changeset/pre/fix-memory-journal-relay.md diff --git a/repos/effect/.changeset/pre/fix-memory-runner-health.md b/.changeset/pre/fix-memory-runner-health.md similarity index 100% rename from repos/effect/.changeset/pre/fix-memory-runner-health.md rename to .changeset/pre/fix-memory-runner-health.md diff --git a/repos/effect/.changeset/pre/fix-memory-workflow-interrupt.md b/.changeset/pre/fix-memory-workflow-interrupt.md similarity index 100% rename from repos/effect/.changeset/pre/fix-memory-workflow-interrupt.md rename to .changeset/pre/fix-memory-workflow-interrupt.md diff --git a/repos/effect/.changeset/pre/fix-mermaid-escape-special-chars.md b/.changeset/pre/fix-mermaid-escape-special-chars.md similarity index 100% rename from repos/effect/.changeset/pre/fix-mermaid-escape-special-chars.md rename to .changeset/pre/fix-mermaid-escape-special-chars.md diff --git a/repos/effect/.changeset/pre/fix-message-storage-clear-address-dedup.md b/.changeset/pre/fix-message-storage-clear-address-dedup.md similarity index 100% rename from repos/effect/.changeset/pre/fix-message-storage-clear-address-dedup.md rename to .changeset/pre/fix-message-storage-clear-address-dedup.md diff --git a/repos/effect/.changeset/pre/fix-metric-attribute-key-collisions.md b/.changeset/pre/fix-metric-attribute-key-collisions.md similarity index 100% rename from repos/effect/.changeset/pre/fix-metric-attribute-key-collisions.md rename to .changeset/pre/fix-metric-attribute-key-collisions.md diff --git a/repos/effect/.changeset/pre/fix-metric-is-metric.md b/.changeset/pre/fix-metric-is-metric.md similarity index 100% rename from repos/effect/.changeset/pre/fix-metric-is-metric.md rename to .changeset/pre/fix-metric-is-metric.md diff --git a/repos/effect/.changeset/pre/fix-metric-linear-boundaries.md b/.changeset/pre/fix-metric-linear-boundaries.md similarity index 100% rename from repos/effect/.changeset/pre/fix-metric-linear-boundaries.md rename to .changeset/pre/fix-metric-linear-boundaries.md diff --git a/repos/effect/.changeset/pre/fix-metric-negative-max.md b/.changeset/pre/fix-metric-negative-max.md similarity index 100% rename from repos/effect/.changeset/pre/fix-metric-negative-max.md rename to .changeset/pre/fix-metric-negative-max.md diff --git a/repos/effect/.changeset/pre/fix-mime-parameter-normalization.md b/.changeset/pre/fix-mime-parameter-normalization.md similarity index 100% rename from repos/effect/.changeset/pre/fix-mime-parameter-normalization.md rename to .changeset/pre/fix-mime-parameter-normalization.md diff --git a/repos/effect/.changeset/pre/fix-mssql-multitable-persistence-upsert.md b/.changeset/pre/fix-mssql-multitable-persistence-upsert.md similarity index 100% rename from repos/effect/.changeset/pre/fix-mssql-multitable-persistence-upsert.md rename to .changeset/pre/fix-mssql-multitable-persistence-upsert.md diff --git a/repos/effect/.changeset/pre/fix-multipart-file-stream-limits.md b/.changeset/pre/fix-multipart-file-stream-limits.md similarity index 100% rename from repos/effect/.changeset/pre/fix-multipart-file-stream-limits.md rename to .changeset/pre/fix-multipart-file-stream-limits.md diff --git a/repos/effect/.changeset/pre/fix-mutable-list-bounds.md b/.changeset/pre/fix-mutable-list-bounds.md similarity index 100% rename from repos/effect/.changeset/pre/fix-mutable-list-bounds.md rename to .changeset/pre/fix-mutable-list-bounds.md diff --git a/repos/effect/.changeset/pre/fix-mutable-list-empty-filter.md b/.changeset/pre/fix-mutable-list-empty-filter.md similarity index 100% rename from repos/effect/.changeset/pre/fix-mutable-list-empty-filter.md rename to .changeset/pre/fix-mutable-list-empty-filter.md diff --git a/repos/effect/.changeset/pre/fix-mutable-list-filter-length.md b/.changeset/pre/fix-mutable-list-filter-length.md similarity index 100% rename from repos/effect/.changeset/pre/fix-mutable-list-filter-length.md rename to .changeset/pre/fix-mutable-list-filter-length.md diff --git a/repos/effect/.changeset/pre/fix-ndjson-split-utf8.md b/.changeset/pre/fix-ndjson-split-utf8.md similarity index 100% rename from repos/effect/.changeset/pre/fix-ndjson-split-utf8.md rename to .changeset/pre/fix-ndjson-split-utf8.md diff --git a/repos/effect/.changeset/pre/fix-negative-file-seek.md b/.changeset/pre/fix-negative-file-seek.md similarity index 100% rename from repos/effect/.changeset/pre/fix-negative-file-seek.md rename to .changeset/pre/fix-negative-file-seek.md diff --git a/repos/effect/.changeset/pre/fix-node-compression-content-type.md b/.changeset/pre/fix-node-compression-content-type.md similarity index 100% rename from repos/effect/.changeset/pre/fix-node-compression-content-type.md rename to .changeset/pre/fix-node-compression-content-type.md diff --git a/repos/effect/.changeset/pre/fix-node-http-stream-failure.md b/.changeset/pre/fix-node-http-stream-failure.md similarity index 100% rename from repos/effect/.changeset/pre/fix-node-http-stream-failure.md rename to .changeset/pre/fix-node-http-stream-failure.md diff --git a/repos/effect/.changeset/pre/fix-node-path-file-url-flavor.md b/.changeset/pre/fix-node-path-file-url-flavor.md similarity index 100% rename from repos/effect/.changeset/pre/fix-node-path-file-url-flavor.md rename to .changeset/pre/fix-node-path-file-url-flavor.md diff --git a/repos/effect/.changeset/pre/fix-node-pipeline-kill.md b/.changeset/pre/fix-node-pipeline-kill.md similarity index 100% rename from repos/effect/.changeset/pre/fix-node-pipeline-kill.md rename to .changeset/pre/fix-node-pipeline-kill.md diff --git a/repos/effect/.changeset/pre/fix-number-remainder-scientific-notation.md b/.changeset/pre/fix-number-remainder-scientific-notation.md similarity index 100% rename from repos/effect/.changeset/pre/fix-number-remainder-scientific-notation.md rename to .changeset/pre/fix-number-remainder-scientific-notation.md diff --git a/repos/effect/.changeset/pre/fix-object-keyword-json-schema.md b/.changeset/pre/fix-object-keyword-json-schema.md similarity index 100% rename from repos/effect/.changeset/pre/fix-object-keyword-json-schema.md rename to .changeset/pre/fix-object-keyword-json-schema.md diff --git a/repos/effect/.changeset/pre/fix-one-shot-iterables.md b/.changeset/pre/fix-one-shot-iterables.md similarity index 100% rename from repos/effect/.changeset/pre/fix-one-shot-iterables.md rename to .changeset/pre/fix-one-shot-iterables.md diff --git a/repos/effect/.changeset/pre/fix-openai-header-redaction.md b/.changeset/pre/fix-openai-header-redaction.md similarity index 100% rename from repos/effect/.changeset/pre/fix-openai-header-redaction.md rename to .changeset/pre/fix-openai-header-redaction.md diff --git a/repos/effect/.changeset/pre/fix-openai-mcp-tool-names.md b/.changeset/pre/fix-openai-mcp-tool-names.md similarity index 100% rename from repos/effect/.changeset/pre/fix-openai-mcp-tool-names.md rename to .changeset/pre/fix-openai-mcp-tool-names.md diff --git a/repos/effect/.changeset/pre/fix-openai-response-failure.md b/.changeset/pre/fix-openai-response-failure.md similarity index 100% rename from repos/effect/.changeset/pre/fix-openai-response-failure.md rename to .changeset/pre/fix-openai-response-failure.md diff --git a/repos/effect/.changeset/pre/fix-openai-specialized-tool-output.md b/.changeset/pre/fix-openai-specialized-tool-output.md similarity index 100% rename from repos/effect/.changeset/pre/fix-openai-specialized-tool-output.md rename to .changeset/pre/fix-openai-specialized-tool-output.md diff --git a/repos/effect/.changeset/pre/fix-openai-system-input-text.md b/.changeset/pre/fix-openai-system-input-text.md similarity index 100% rename from repos/effect/.changeset/pre/fix-openai-system-input-text.md rename to .changeset/pre/fix-openai-system-input-text.md diff --git a/repos/effect/.changeset/pre/fix-openai-telemetry-response-namespace.md b/.changeset/pre/fix-openai-telemetry-response-namespace.md similarity index 100% rename from repos/effect/.changeset/pre/fix-openai-telemetry-response-namespace.md rename to .changeset/pre/fix-openai-telemetry-response-namespace.md diff --git a/repos/effect/.changeset/pre/fix-openai-web-search-action.md b/.changeset/pre/fix-openai-web-search-action.md similarity index 100% rename from repos/effect/.changeset/pre/fix-openai-web-search-action.md rename to .changeset/pre/fix-openai-web-search-action.md diff --git a/repos/effect/.changeset/pre/fix-openapi-client-form-url-encoding.md b/.changeset/pre/fix-openapi-client-form-url-encoding.md similarity index 100% rename from repos/effect/.changeset/pre/fix-openapi-client-form-url-encoding.md rename to .changeset/pre/fix-openapi-client-form-url-encoding.md diff --git a/repos/effect/.changeset/pre/fix-openapi-client-multipart-records.md b/.changeset/pre/fix-openapi-client-multipart-records.md similarity index 100% rename from repos/effect/.changeset/pre/fix-openapi-client-multipart-records.md rename to .changeset/pre/fix-openapi-client-multipart-records.md diff --git a/.changeset/pre/fix-openapi-client-paths.md b/.changeset/pre/fix-openapi-client-paths.md new file mode 100644 index 000000000..04b3c50ec --- /dev/null +++ b/.changeset/pre/fix-openapi-client-paths.md @@ -0,0 +1,5 @@ +--- +"@effect/openapi-generator": patch +--- + +Quote static paths and percent-encode path parameters in generated HTTP clients, including SSE and binary stream methods. Reject empty parameters and dot segments with an HTTP client error before sending a request. diff --git a/repos/effect/.changeset/pre/fix-openapi-endpoint-transform-order.md b/.changeset/pre/fix-openapi-endpoint-transform-order.md similarity index 100% rename from repos/effect/.changeset/pre/fix-openapi-endpoint-transform-order.md rename to .changeset/pre/fix-openapi-endpoint-transform-order.md diff --git a/repos/effect/.changeset/pre/fix-openapi-from-api-cache-copy.md b/.changeset/pre/fix-openapi-from-api-cache-copy.md similarity index 100% rename from repos/effect/.changeset/pre/fix-openapi-from-api-cache-copy.md rename to .changeset/pre/fix-openapi-from-api-cache-copy.md diff --git a/repos/effect/.changeset/pre/fix-openapi-generator-form-urlencoded.md b/.changeset/pre/fix-openapi-generator-form-urlencoded.md similarity index 100% rename from repos/effect/.changeset/pre/fix-openapi-generator-form-urlencoded.md rename to .changeset/pre/fix-openapi-generator-form-urlencoded.md diff --git a/repos/effect/.changeset/pre/fix-openapi-generator-swagger2openapi.md b/.changeset/pre/fix-openapi-generator-swagger2openapi.md similarity index 100% rename from repos/effect/.changeset/pre/fix-openapi-generator-swagger2openapi.md rename to .changeset/pre/fix-openapi-generator-swagger2openapi.md diff --git a/repos/effect/.changeset/pre/fix-openapi-preserve-multiple-response-content-types.md b/.changeset/pre/fix-openapi-preserve-multiple-response-content-types.md similarity index 100% rename from repos/effect/.changeset/pre/fix-openapi-preserve-multiple-response-content-types.md rename to .changeset/pre/fix-openapi-preserve-multiple-response-content-types.md diff --git a/repos/effect/.changeset/pre/fix-openapi-stream-transform-client.md b/.changeset/pre/fix-openapi-stream-transform-client.md similarity index 100% rename from repos/effect/.changeset/pre/fix-openapi-stream-transform-client.md rename to .changeset/pre/fix-openapi-stream-transform-client.md diff --git a/repos/effect/.changeset/pre/fix-openrouter-sparse-array.md b/.changeset/pre/fix-openrouter-sparse-array.md similarity index 100% rename from repos/effect/.changeset/pre/fix-openrouter-sparse-array.md rename to .changeset/pre/fix-openrouter-sparse-array.md diff --git a/repos/effect/.changeset/pre/fix-otel-logger-clock-skew.md b/.changeset/pre/fix-otel-logger-clock-skew.md similarity index 100% rename from repos/effect/.changeset/pre/fix-otel-logger-clock-skew.md rename to .changeset/pre/fix-otel-logger-clock-skew.md diff --git a/repos/effect/.changeset/pre/fix-otel-logger-severity-number.md b/.changeset/pre/fix-otel-logger-severity-number.md similarity index 100% rename from repos/effect/.changeset/pre/fix-otel-logger-severity-number.md rename to .changeset/pre/fix-otel-logger-severity-number.md diff --git a/repos/effect/.changeset/pre/fix-otel-logger-shutdown.md b/.changeset/pre/fix-otel-logger-shutdown.md similarity index 100% rename from repos/effect/.changeset/pre/fix-otel-logger-shutdown.md rename to .changeset/pre/fix-otel-logger-shutdown.md diff --git a/repos/effect/.changeset/pre/fix-otlp-exporter-shutdown.md b/.changeset/pre/fix-otlp-exporter-shutdown.md similarity index 100% rename from repos/effect/.changeset/pre/fix-otlp-exporter-shutdown.md rename to .changeset/pre/fix-otlp-exporter-shutdown.md diff --git a/repos/effect/.changeset/pre/fix-otlp-resource-attributes.md b/.changeset/pre/fix-otlp-resource-attributes.md similarity index 100% rename from repos/effect/.changeset/pre/fix-otlp-resource-attributes.md rename to .changeset/pre/fix-otlp-resource-attributes.md diff --git a/repos/effect/.changeset/pre/fix-pending-interruptible-mask.md b/.changeset/pre/fix-pending-interruptible-mask.md similarity index 100% rename from repos/effect/.changeset/pre/fix-pending-interruptible-mask.md rename to .changeset/pre/fix-pending-interruptible-mask.md diff --git a/repos/effect/.changeset/pre/fix-persisted-cluster-reply-hang.md b/.changeset/pre/fix-persisted-cluster-reply-hang.md similarity index 100% rename from repos/effect/.changeset/pre/fix-persisted-cluster-reply-hang.md rename to .changeset/pre/fix-persisted-cluster-reply-hang.md diff --git a/repos/effect/.changeset/pre/fix-persisted-queue-attempt-accounting.md b/.changeset/pre/fix-persisted-queue-attempt-accounting.md similarity index 100% rename from repos/effect/.changeset/pre/fix-persisted-queue-attempt-accounting.md rename to .changeset/pre/fix-persisted-queue-attempt-accounting.md diff --git a/repos/effect/.changeset/pre/fix-pg-tls-servername.md b/.changeset/pre/fix-pg-tls-servername.md similarity index 100% rename from repos/effect/.changeset/pre/fix-pg-tls-servername.md rename to .changeset/pre/fix-pg-tls-servername.md diff --git a/repos/effect/.changeset/pre/fix-prompt-all-iterables.md b/.changeset/pre/fix-prompt-all-iterables.md similarity index 100% rename from repos/effect/.changeset/pre/fix-prompt-all-iterables.md rename to .changeset/pre/fix-prompt-all-iterables.md diff --git a/repos/effect/.changeset/pre/fix-prompt-date-tab-buffer.md b/.changeset/pre/fix-prompt-date-tab-buffer.md similarity index 100% rename from repos/effect/.changeset/pre/fix-prompt-date-tab-buffer.md rename to .changeset/pre/fix-prompt-date-tab-buffer.md diff --git a/repos/effect/.changeset/pre/fix-proto-record-assignment.md b/.changeset/pre/fix-proto-record-assignment.md similarity index 100% rename from repos/effect/.changeset/pre/fix-proto-record-assignment.md rename to .changeset/pre/fix-proto-record-assignment.md diff --git a/repos/effect/.changeset/pre/fix-pubsub-replay-retention.md b/.changeset/pre/fix-pubsub-replay-retention.md similarity index 100% rename from repos/effect/.changeset/pre/fix-pubsub-replay-retention.md rename to .changeset/pre/fix-pubsub-replay-retention.md diff --git a/repos/effect/.changeset/pre/fix-queue-collect-duplication.md b/.changeset/pre/fix-queue-collect-duplication.md similarity index 100% rename from repos/effect/.changeset/pre/fix-queue-collect-duplication.md rename to .changeset/pre/fix-queue-collect-duplication.md diff --git a/repos/effect/.changeset/pre/fix-random-string-seeds.md b/.changeset/pre/fix-random-string-seeds.md similarity index 100% rename from repos/effect/.changeset/pre/fix-random-string-seeds.md rename to .changeset/pre/fix-random-string-seeds.md diff --git a/repos/effect/.changeset/pre/fix-rate-limiter-sleep.md b/.changeset/pre/fix-rate-limiter-sleep.md similarity index 100% rename from repos/effect/.changeset/pre/fix-rate-limiter-sleep.md rename to .changeset/pre/fix-rate-limiter-sleep.md diff --git a/repos/effect/.changeset/pre/fix-ratelimiter-tokenbucket-redis-ttl.md b/.changeset/pre/fix-ratelimiter-tokenbucket-redis-ttl.md similarity index 100% rename from repos/effect/.changeset/pre/fix-ratelimiter-tokenbucket-redis-ttl.md rename to .changeset/pre/fix-ratelimiter-tokenbucket-redis-ttl.md diff --git a/repos/effect/.changeset/pre/fix-react-native-sqlite-values.md b/.changeset/pre/fix-react-native-sqlite-values.md similarity index 100% rename from repos/effect/.changeset/pre/fix-react-native-sqlite-values.md rename to .changeset/pre/fix-react-native-sqlite-values.md diff --git a/repos/effect/.changeset/pre/fix-react-ref-switch.md b/.changeset/pre/fix-react-ref-switch.md similarity index 100% rename from repos/effect/.changeset/pre/fix-react-ref-switch.md rename to .changeset/pre/fix-react-ref-switch.md diff --git a/repos/effect/.changeset/pre/fix-reactive-query-metadata.md b/.changeset/pre/fix-reactive-query-metadata.md similarity index 100% rename from repos/effect/.changeset/pre/fix-reactive-query-metadata.md rename to .changeset/pre/fix-reactive-query-metadata.md diff --git a/repos/effect/.changeset/pre/fix-reactivity-duplicate-keys.md b/.changeset/pre/fix-reactivity-duplicate-keys.md similarity index 100% rename from repos/effect/.changeset/pre/fix-reactivity-duplicate-keys.md rename to .changeset/pre/fix-reactivity-duplicate-keys.md diff --git a/repos/effect/.changeset/pre/fix-read-alloc-invalid-sizes.md b/.changeset/pre/fix-read-alloc-invalid-sizes.md similarity index 100% rename from repos/effect/.changeset/pre/fix-read-alloc-invalid-sizes.md rename to .changeset/pre/fix-read-alloc-invalid-sizes.md diff --git a/repos/effect/.changeset/pre/fix-redis-persisted-queue.md b/.changeset/pre/fix-redis-persisted-queue.md similarity index 100% rename from repos/effect/.changeset/pre/fix-redis-persisted-queue.md rename to .changeset/pre/fix-redis-persisted-queue.md diff --git a/repos/effect/.changeset/pre/fix-remainder-scientific-notation.md b/.changeset/pre/fix-remainder-scientific-notation.md similarity index 100% rename from repos/effect/.changeset/pre/fix-remainder-scientific-notation.md rename to .changeset/pre/fix-remainder-scientific-notation.md diff --git a/repos/effect/.changeset/pre/fix-request-resolver-pending-batches-leak.md b/.changeset/pre/fix-request-resolver-pending-batches-leak.md similarity index 100% rename from repos/effect/.changeset/pre/fix-request-resolver-pending-batches-leak.md rename to .changeset/pre/fix-request-resolver-pending-batches-leak.md diff --git a/repos/effect/.changeset/pre/fix-retry-transient-autocomplete.md b/.changeset/pre/fix-retry-transient-autocomplete.md similarity index 100% rename from repos/effect/.changeset/pre/fix-retry-transient-autocomplete.md rename to .changeset/pre/fix-retry-transient-autocomplete.md diff --git a/repos/effect/.changeset/pre/fix-rpc-http-requestids-finalizer.md b/.changeset/pre/fix-rpc-http-requestids-finalizer.md similarity index 100% rename from repos/effect/.changeset/pre/fix-rpc-http-requestids-finalizer.md rename to .changeset/pre/fix-rpc-http-requestids-finalizer.md diff --git a/repos/effect/.changeset/pre/fix-rpc-json-id-edges.md b/.changeset/pre/fix-rpc-json-id-edges.md similarity index 100% rename from repos/effect/.changeset/pre/fix-rpc-json-id-edges.md rename to .changeset/pre/fix-rpc-json-id-edges.md diff --git a/repos/effect/.changeset/pre/fix-rpc-unknown-tag-isolation.md b/.changeset/pre/fix-rpc-unknown-tag-isolation.md similarity index 100% rename from repos/effect/.changeset/pre/fix-rpc-unknown-tag-isolation.md rename to .changeset/pre/fix-rpc-unknown-tag-isolation.md diff --git a/repos/effect/.changeset/pre/fix-runner-stream-completion.md b/.changeset/pre/fix-runner-stream-completion.md similarity index 100% rename from repos/effect/.changeset/pre/fix-runner-stream-completion.md rename to .changeset/pre/fix-runner-stream-completion.md diff --git a/repos/effect/.changeset/pre/fix-schedule-during.md b/.changeset/pre/fix-schedule-during.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schedule-during.md rename to .changeset/pre/fix-schedule-during.md diff --git a/repos/effect/.changeset/pre/fix-schedule-fixed-double-exec.md b/.changeset/pre/fix-schedule-fixed-double-exec.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schedule-fixed-double-exec.md rename to .changeset/pre/fix-schedule-fixed-double-exec.md diff --git a/repos/effect/.changeset/pre/fix-schedule-reduce-sync-state.md b/.changeset/pre/fix-schedule-reduce-sync-state.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schedule-reduce-sync-state.md rename to .changeset/pre/fix-schedule-reduce-sync-state.md diff --git a/repos/effect/.changeset/pre/fix-schema-arbitrary-exclusive-bounds.md b/.changeset/pre/fix-schema-arbitrary-exclusive-bounds.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-arbitrary-exclusive-bounds.md rename to .changeset/pre/fix-schema-arbitrary-exclusive-bounds.md diff --git a/repos/effect/.changeset/pre/fix-schema-bracket-prototype-pollution.md b/.changeset/pre/fix-schema-bracket-prototype-pollution.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-bracket-prototype-pollution.md rename to .changeset/pre/fix-schema-bracket-prototype-pollution.md diff --git a/repos/effect/.changeset/pre/fix-schema-codegen-optional-tuples.md b/.changeset/pre/fix-schema-codegen-optional-tuples.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-codegen-optional-tuples.md rename to .changeset/pre/fix-schema-codegen-optional-tuples.md diff --git a/repos/effect/.changeset/pre/fix-schema-codegen-proto.md b/.changeset/pre/fix-schema-codegen-proto.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-codegen-proto.md rename to .changeset/pre/fix-schema-codegen-proto.md diff --git a/repos/effect/.changeset/pre/fix-schema-defect-message.md b/.changeset/pre/fix-schema-defect-message.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-defect-message.md rename to .changeset/pre/fix-schema-defect-message.md diff --git a/repos/effect/.changeset/pre/fix-schema-encode-keys-property-keys.md b/.changeset/pre/fix-schema-encode-keys-property-keys.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-encode-keys-property-keys.md rename to .changeset/pre/fix-schema-encode-keys-property-keys.md diff --git a/repos/effect/.changeset/pre/fix-schema-encodekeys-class.md b/.changeset/pre/fix-schema-encodekeys-class.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-encodekeys-class.md rename to .changeset/pre/fix-schema-encodekeys-class.md diff --git a/repos/effect/.changeset/pre/fix-schema-encodekeys-struct.md b/.changeset/pre/fix-schema-encodekeys-struct.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-encodekeys-struct.md rename to .changeset/pre/fix-schema-encodekeys-struct.md diff --git a/repos/effect/.changeset/pre/fix-schema-encoding-checks.md b/.changeset/pre/fix-schema-encoding-checks.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-encoding-checks.md rename to .changeset/pre/fix-schema-encoding-checks.md diff --git a/repos/effect/.changeset/pre/fix-schema-identifier-expected-message.md b/.changeset/pre/fix-schema-identifier-expected-message.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-identifier-expected-message.md rename to .changeset/pre/fix-schema-identifier-expected-message.md diff --git a/repos/effect/.changeset/pre/fix-schema-is-json-records.md b/.changeset/pre/fix-schema-is-json-records.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-is-json-records.md rename to .changeset/pre/fix-schema-is-json-records.md diff --git a/repos/effect/.changeset/pre/fix-schema-is-uuid.md b/.changeset/pre/fix-schema-is-uuid.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-is-uuid.md rename to .changeset/pre/fix-schema-is-uuid.md diff --git a/repos/effect/.changeset/pre/fix-schema-json-tuple-allof.md b/.changeset/pre/fix-schema-json-tuple-allof.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-json-tuple-allof.md rename to .changeset/pre/fix-schema-json-tuple-allof.md diff --git a/repos/effect/.changeset/pre/fix-schema-make-nested-class-union.md b/.changeset/pre/fix-schema-make-nested-class-union.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-make-nested-class-union.md rename to .changeset/pre/fix-schema-make-nested-class-union.md diff --git a/repos/effect/.changeset/pre/fix-schema-option-non-schema-failures.md b/.changeset/pre/fix-schema-option-non-schema-failures.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-option-non-schema-failures.md rename to .changeset/pre/fix-schema-option-non-schema-failures.md diff --git a/repos/effect/.changeset/pre/fix-schema-parser-checks.md b/.changeset/pre/fix-schema-parser-checks.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-parser-checks.md rename to .changeset/pre/fix-schema-parser-checks.md diff --git a/repos/effect/.changeset/pre/fix-schema-pattern-state.md b/.changeset/pre/fix-schema-pattern-state.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-pattern-state.md rename to .changeset/pre/fix-schema-pattern-state.md diff --git a/repos/effect/.changeset/pre/fix-schema-representation-identifiers.md b/.changeset/pre/fix-schema-representation-identifiers.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-representation-identifiers.md rename to .changeset/pre/fix-schema-representation-identifiers.md diff --git a/repos/effect/.changeset/pre/fix-schema-sentinel-declaration.md b/.changeset/pre/fix-schema-sentinel-declaration.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-sentinel-declaration.md rename to .changeset/pre/fix-schema-sentinel-declaration.md diff --git a/repos/effect/.changeset/pre/fix-schema-tuple-post-rest-indexing.md b/.changeset/pre/fix-schema-tuple-post-rest-indexing.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-tuple-post-rest-indexing.md rename to .changeset/pre/fix-schema-tuple-post-rest-indexing.md diff --git a/repos/effect/.changeset/pre/fix-schema-union-dispatch-order.md b/.changeset/pre/fix-schema-union-dispatch-order.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-union-dispatch-order.md rename to .changeset/pre/fix-schema-union-dispatch-order.md diff --git a/repos/effect/.changeset/pre/fix-schema-union-pruning.md b/.changeset/pre/fix-schema-union-pruning.md similarity index 100% rename from repos/effect/.changeset/pre/fix-schema-union-pruning.md rename to .changeset/pre/fix-schema-union-pruning.md diff --git a/repos/effect/.changeset/pre/fix-scoped-ref-failed-replacement.md b/.changeset/pre/fix-scoped-ref-failed-replacement.md similarity index 100% rename from repos/effect/.changeset/pre/fix-scoped-ref-failed-replacement.md rename to .changeset/pre/fix-scoped-ref-failed-replacement.md diff --git a/repos/effect/.changeset/pre/fix-searchparam-initial-decode.md b/.changeset/pre/fix-searchparam-initial-decode.md similarity index 100% rename from repos/effect/.changeset/pre/fix-searchparam-initial-decode.md rename to .changeset/pre/fix-searchparam-initial-decode.md diff --git a/repos/effect/.changeset/pre/fix-semaphore-with-permits-interrupt-leak.md b/.changeset/pre/fix-semaphore-with-permits-interrupt-leak.md similarity index 100% rename from repos/effect/.changeset/pre/fix-semaphore-with-permits-interrupt-leak.md rename to .changeset/pre/fix-semaphore-with-permits-interrupt-leak.md diff --git a/repos/effect/.changeset/pre/fix-serializable-wire-transfer.md b/.changeset/pre/fix-serializable-wire-transfer.md similarity index 100% rename from repos/effect/.changeset/pre/fix-serializable-wire-transfer.md rename to .changeset/pre/fix-serializable-wire-transfer.md diff --git a/repos/effect/.changeset/pre/fix-sink-flatmap-leftovers.md b/.changeset/pre/fix-sink-flatmap-leftovers.md similarity index 100% rename from repos/effect/.changeset/pre/fix-sink-flatmap-leftovers.md rename to .changeset/pre/fix-sink-flatmap-leftovers.md diff --git a/repos/effect/.changeset/pre/fix-sliding-size-chunks.md b/.changeset/pre/fix-sliding-size-chunks.md similarity index 100% rename from repos/effect/.changeset/pre/fix-sliding-size-chunks.md rename to .changeset/pre/fix-sliding-size-chunks.md diff --git a/repos/effect/.changeset/pre/fix-sql-persisted-queue-lock-refresh.md b/.changeset/pre/fix-sql-persisted-queue-lock-refresh.md similarity index 100% rename from repos/effect/.changeset/pre/fix-sql-persisted-queue-lock-refresh.md rename to .changeset/pre/fix-sql-persisted-queue-lock-refresh.md diff --git a/repos/effect/.changeset/pre/fix-sqlite-persisted-queue.md b/.changeset/pre/fix-sqlite-persisted-queue.md similarity index 100% rename from repos/effect/.changeset/pre/fix-sqlite-persisted-queue.md rename to .changeset/pre/fix-sqlite-persisted-queue.md diff --git a/repos/effect/.changeset/pre/fix-sse-last-event-id.md b/.changeset/pre/fix-sse-last-event-id.md similarity index 100% rename from repos/effect/.changeset/pre/fix-sse-last-event-id.md rename to .changeset/pre/fix-sse-last-event-id.md diff --git a/repos/effect/.changeset/pre/fix-sse-leading-bom.md b/.changeset/pre/fix-sse-leading-bom.md similarity index 100% rename from repos/effect/.changeset/pre/fix-sse-leading-bom.md rename to .changeset/pre/fix-sse-leading-bom.md diff --git a/repos/effect/.changeset/pre/fix-sse-mixed-line-endings.md b/.changeset/pre/fix-sse-mixed-line-endings.md similarity index 100% rename from repos/effect/.changeset/pre/fix-sse-mixed-line-endings.md rename to .changeset/pre/fix-sse-mixed-line-endings.md diff --git a/repos/effect/.changeset/pre/fix-sse-retry-directives.md b/.changeset/pre/fix-sse-retry-directives.md similarity index 100% rename from repos/effect/.changeset/pre/fix-sse-retry-directives.md rename to .changeset/pre/fix-sse-retry-directives.md diff --git a/repos/effect/.changeset/pre/fix-static-head-range.md b/.changeset/pre/fix-static-head-range.md similarity index 100% rename from repos/effect/.changeset/pre/fix-static-head-range.md rename to .changeset/pre/fix-static-head-range.md diff --git a/repos/effect/.changeset/pre/fix-static-oversized-ranges.md b/.changeset/pre/fix-static-oversized-ranges.md similarity index 100% rename from repos/effect/.changeset/pre/fix-static-oversized-ranges.md rename to .changeset/pre/fix-static-oversized-ranges.md diff --git a/repos/effect/.changeset/pre/fix-stream-aggregate-within-idle.md b/.changeset/pre/fix-stream-aggregate-within-idle.md similarity index 100% rename from repos/effect/.changeset/pre/fix-stream-aggregate-within-idle.md rename to .changeset/pre/fix-stream-aggregate-within-idle.md diff --git a/repos/effect/.changeset/pre/fix-stream-execution-plan-retries.md b/.changeset/pre/fix-stream-execution-plan-retries.md similarity index 100% rename from repos/effect/.changeset/pre/fix-stream-execution-plan-retries.md rename to .changeset/pre/fix-stream-execution-plan-retries.md diff --git a/repos/effect/.changeset/pre/fix-stream-grouped-within-flush.md b/.changeset/pre/fix-stream-grouped-within-flush.md similarity index 100% rename from repos/effect/.changeset/pre/fix-stream-grouped-within-flush.md rename to .changeset/pre/fix-stream-grouped-within-flush.md diff --git a/repos/effect/.changeset/pre/fix-stream-haltwhen.md b/.changeset/pre/fix-stream-haltwhen.md similarity index 100% rename from repos/effect/.changeset/pre/fix-stream-haltwhen.md rename to .changeset/pre/fix-stream-haltwhen.md diff --git a/repos/effect/.changeset/pre/fix-stream-map-accum-array-effect.md b/.changeset/pre/fix-stream-map-accum-array-effect.md similarity index 100% rename from repos/effect/.changeset/pre/fix-stream-map-accum-array-effect.md rename to .changeset/pre/fix-stream-map-accum-array-effect.md diff --git a/repos/effect/.changeset/pre/fix-stream-range-zero-chunk.md b/.changeset/pre/fix-stream-range-zero-chunk.md similarity index 100% rename from repos/effect/.changeset/pre/fix-stream-range-zero-chunk.md rename to .changeset/pre/fix-stream-range-zero-chunk.md diff --git a/repos/effect/.changeset/pre/fix-stream-run-for-each-while.md b/.changeset/pre/fix-stream-run-for-each-while.md similarity index 100% rename from repos/effect/.changeset/pre/fix-stream-run-for-each-while.md rename to .changeset/pre/fix-stream-run-for-each-while.md diff --git a/repos/effect/.changeset/pre/fix-stream-scan-effect.md b/.changeset/pre/fix-stream-scan-effect.md similarity index 100% rename from repos/effect/.changeset/pre/fix-stream-scan-effect.md rename to .changeset/pre/fix-stream-scan-effect.md diff --git a/repos/effect/.changeset/pre/fix-stream-scoped-scope.md b/.changeset/pre/fix-stream-scoped-scope.md similarity index 100% rename from repos/effect/.changeset/pre/fix-stream-scoped-scope.md rename to .changeset/pre/fix-stream-scoped-scope.md diff --git a/repos/effect/.changeset/pre/fix-stream-wrapper-status.md b/.changeset/pre/fix-stream-wrapper-status.md similarity index 100% rename from repos/effect/.changeset/pre/fix-stream-wrapper-status.md rename to .changeset/pre/fix-stream-wrapper-status.md diff --git a/repos/effect/.changeset/pre/fix-string-case-digits.md b/.changeset/pre/fix-string-case-digits.md similarity index 100% rename from repos/effect/.changeset/pre/fix-string-case-digits.md rename to .changeset/pre/fix-string-case-digits.md diff --git a/repos/effect/.changeset/pre/fix-strip-approval-artifacts-multi-round.md b/.changeset/pre/fix-strip-approval-artifacts-multi-round.md similarity index 100% rename from repos/effect/.changeset/pre/fix-strip-approval-artifacts-multi-round.md rename to .changeset/pre/fix-strip-approval-artifacts-multi-round.md diff --git a/repos/effect/.changeset/pre/fix-struct-utility-types-simplify.md b/.changeset/pre/fix-struct-utility-types-simplify.md similarity index 100% rename from repos/effect/.changeset/pre/fix-struct-utility-types-simplify.md rename to .changeset/pre/fix-struct-utility-types-simplify.md diff --git a/repos/effect/.changeset/pre/fix-structural-proto-equality.md b/.changeset/pre/fix-structural-proto-equality.md similarity index 100% rename from repos/effect/.changeset/pre/fix-structural-proto-equality.md rename to .changeset/pre/fix-structural-proto-equality.md diff --git a/repos/effect/.changeset/pre/fix-structwithrest-index-signatures.md b/.changeset/pre/fix-structwithrest-index-signatures.md similarity index 100% rename from repos/effect/.changeset/pre/fix-structwithrest-index-signatures.md rename to .changeset/pre/fix-structwithrest-index-signatures.md diff --git a/repos/effect/.changeset/pre/fix-subscription-ref-get-and-update-some.md b/.changeset/pre/fix-subscription-ref-get-and-update-some.md similarity index 100% rename from repos/effect/.changeset/pre/fix-subscription-ref-get-and-update-some.md rename to .changeset/pre/fix-subscription-ref-get-and-update-some.md diff --git a/repos/effect/.changeset/pre/fix-subscriptionref-getandupdateeffect.md b/.changeset/pre/fix-subscriptionref-getandupdateeffect.md similarity index 100% rename from repos/effect/.changeset/pre/fix-subscriptionref-getandupdateeffect.md rename to .changeset/pre/fix-subscriptionref-getandupdateeffect.md diff --git a/repos/effect/.changeset/pre/fix-tagged-union-class-sentinels.md b/.changeset/pre/fix-tagged-union-class-sentinels.md similarity index 100% rename from repos/effect/.changeset/pre/fix-tagged-union-class-sentinels.md rename to .changeset/pre/fix-tagged-union-class-sentinels.md diff --git a/repos/effect/.changeset/pre/fix-tagged-union-match-unify.md b/.changeset/pre/fix-tagged-union-match-unify.md similarity index 100% rename from repos/effect/.changeset/pre/fix-tagged-union-match-unify.md rename to .changeset/pre/fix-tagged-union-match-unify.md diff --git a/repos/effect/.changeset/pre/fix-to-tagged-union-isanyof-custom-tags.md b/.changeset/pre/fix-to-tagged-union-isanyof-custom-tags.md similarity index 100% rename from repos/effect/.changeset/pre/fix-to-tagged-union-isanyof-custom-tags.md rename to .changeset/pre/fix-to-tagged-union-isanyof-custom-tags.md diff --git a/repos/effect/.changeset/pre/fix-toml-array-subtables.md b/.changeset/pre/fix-toml-array-subtables.md similarity index 100% rename from repos/effect/.changeset/pre/fix-toml-array-subtables.md rename to .changeset/pre/fix-toml-array-subtables.md diff --git a/repos/effect/.changeset/pre/fix-tool-provider-defined-clone.md b/.changeset/pre/fix-tool-provider-defined-clone.md similarity index 100% rename from repos/effect/.changeset/pre/fix-tool-provider-defined-clone.md rename to .changeset/pre/fix-tool-provider-defined-clone.md diff --git a/repos/effect/.changeset/pre/fix-tool-result-serialization.md b/.changeset/pre/fix-tool-result-serialization.md similarity index 100% rename from repos/effect/.changeset/pre/fix-tool-result-serialization.md rename to .changeset/pre/fix-tool-result-serialization.md diff --git a/repos/effect/.changeset/pre/fix-trie-key-replacement.md b/.changeset/pre/fix-trie-key-replacement.md similarity index 100% rename from repos/effect/.changeset/pre/fix-trie-key-replacement.md rename to .changeset/pre/fix-trie-key-replacement.md diff --git a/repos/effect/.changeset/pre/fix-trie-longest-prefix.md b/.changeset/pre/fix-trie-longest-prefix.md similarity index 100% rename from repos/effect/.changeset/pre/fix-trie-longest-prefix.md rename to .changeset/pre/fix-trie-longest-prefix.md diff --git a/repos/effect/.changeset/pre/fix-trie-undefined-values.md b/.changeset/pre/fix-trie-undefined-values.md similarity index 100% rename from repos/effect/.changeset/pre/fix-trie-undefined-values.md rename to .changeset/pre/fix-trie-undefined-values.md diff --git a/repos/effect/.changeset/pre/fix-tuple-with-rest-post-rest-index-drift.md b/.changeset/pre/fix-tuple-with-rest-post-rest-index-drift.md similarity index 100% rename from repos/effect/.changeset/pre/fix-tuple-with-rest-post-rest-index-drift.md rename to .changeset/pre/fix-tuple-with-rest-post-rest-index-drift.md diff --git a/repos/effect/.changeset/pre/fix-tuple-with-rest-post-rest-validation.md b/.changeset/pre/fix-tuple-with-rest-post-rest-validation.md similarity index 100% rename from repos/effect/.changeset/pre/fix-tuple-with-rest-post-rest-validation.md rename to .changeset/pre/fix-tuple-with-rest-post-rest-validation.md diff --git a/repos/effect/.changeset/pre/fix-txpubsub-publish-all-iterables.md b/.changeset/pre/fix-txpubsub-publish-all-iterables.md similarity index 100% rename from repos/effect/.changeset/pre/fix-txpubsub-publish-all-iterables.md rename to .changeset/pre/fix-txpubsub-publish-all-iterables.md diff --git a/repos/effect/.changeset/pre/fix-txqueue-closing-drain.md b/.changeset/pre/fix-txqueue-closing-drain.md similarity index 100% rename from repos/effect/.changeset/pre/fix-txqueue-closing-drain.md rename to .changeset/pre/fix-txqueue-closing-drain.md diff --git a/repos/effect/.changeset/pre/fix-txqueue-offer-all-iterables.md b/.changeset/pre/fix-txqueue-offer-all-iterables.md similarity index 100% rename from repos/effect/.changeset/pre/fix-txqueue-offer-all-iterables.md rename to .changeset/pre/fix-txqueue-offer-all-iterables.md diff --git a/repos/effect/.changeset/pre/fix-types-voidifempty.md b/.changeset/pre/fix-types-voidifempty.md similarity index 100% rename from repos/effect/.changeset/pre/fix-types-voidifempty.md rename to .changeset/pre/fix-types-voidifempty.md diff --git a/repos/effect/.changeset/pre/fix-variant-schema-default-cache.md b/.changeset/pre/fix-variant-schema-default-cache.md similarity index 100% rename from repos/effect/.changeset/pre/fix-variant-schema-default-cache.md rename to .changeset/pre/fix-variant-schema-default-cache.md diff --git a/repos/effect/.changeset/pre/fix-vitest-proxy-chained-helpers.md b/.changeset/pre/fix-vitest-proxy-chained-helpers.md similarity index 100% rename from repos/effect/.changeset/pre/fix-vitest-proxy-chained-helpers.md rename to .changeset/pre/fix-vitest-proxy-chained-helpers.md diff --git a/repos/effect/.changeset/pre/fix-vitest-record-schema-arbitrary.md b/.changeset/pre/fix-vitest-record-schema-arbitrary.md similarity index 100% rename from repos/effect/.changeset/pre/fix-vitest-record-schema-arbitrary.md rename to .changeset/pre/fix-vitest-record-schema-arbitrary.md diff --git a/repos/effect/.changeset/pre/fix-vitest-runner-import.md b/.changeset/pre/fix-vitest-runner-import.md similarity index 100% rename from repos/effect/.changeset/pre/fix-vitest-runner-import.md rename to .changeset/pre/fix-vitest-runner-import.md diff --git a/repos/effect/.changeset/pre/fix-vitest-throws-assertions.md b/.changeset/pre/fix-vitest-throws-assertions.md similarity index 100% rename from repos/effect/.changeset/pre/fix-vitest-throws-assertions.md rename to .changeset/pre/fix-vitest-throws-assertions.md diff --git a/repos/effect/.changeset/pre/fix-void-mcp-tool-results.md b/.changeset/pre/fix-void-mcp-tool-results.md similarity index 100% rename from repos/effect/.changeset/pre/fix-void-mcp-tool-results.md rename to .changeset/pre/fix-void-mcp-tool-results.md diff --git a/repos/effect/.changeset/pre/fix-void-response-encoding.md b/.changeset/pre/fix-void-response-encoding.md similarity index 100% rename from repos/effect/.changeset/pre/fix-void-response-encoding.md rename to .changeset/pre/fix-void-response-encoding.md diff --git a/repos/effect/.changeset/pre/fix-vue-ref-switch.md b/.changeset/pre/fix-vue-ref-switch.md similarity index 100% rename from repos/effect/.changeset/pre/fix-vue-ref-switch.md rename to .changeset/pre/fix-vue-ref-switch.md diff --git a/repos/effect/.changeset/pre/fix-worker-runner-cleanup.md b/.changeset/pre/fix-worker-runner-cleanup.md similarity index 100% rename from repos/effect/.changeset/pre/fix-worker-runner-cleanup.md rename to .changeset/pre/fix-worker-runner-cleanup.md diff --git a/repos/effect/.changeset/pre/fix-workflow-activity-interruption.md b/.changeset/pre/fix-workflow-activity-interruption.md similarity index 100% rename from repos/effect/.changeset/pre/fix-workflow-activity-interruption.md rename to .changeset/pre/fix-workflow-activity-interruption.md diff --git a/repos/effect/.changeset/pre/fix-workflow-defect-reply-serialization.md b/.changeset/pre/fix-workflow-defect-reply-serialization.md similarity index 100% rename from repos/effect/.changeset/pre/fix-workflow-defect-reply-serialization.md rename to .changeset/pre/fix-workflow-defect-reply-serialization.md diff --git a/repos/effect/.changeset/pre/fix-workflow-entity-client-collision.md b/.changeset/pre/fix-workflow-entity-client-collision.md similarity index 100% rename from repos/effect/.changeset/pre/fix-workflow-entity-client-collision.md rename to .changeset/pre/fix-workflow-entity-client-collision.md diff --git a/repos/effect/.changeset/pre/fix-workflow-proxy-rpc-handler-context.md b/.changeset/pre/fix-workflow-proxy-rpc-handler-context.md similarity index 100% rename from repos/effect/.changeset/pre/fix-workflow-proxy-rpc-handler-context.md rename to .changeset/pre/fix-workflow-proxy-rpc-handler-context.md diff --git a/repos/effect/.changeset/pre/fix-workflow-trace-context.md b/.changeset/pre/fix-workflow-trace-context.md similarity index 100% rename from repos/effect/.changeset/pre/fix-workflow-trace-context.md rename to .changeset/pre/fix-workflow-trace-context.md diff --git a/repos/effect/.changeset/pre/fix-xhr-form-data.md b/.changeset/pre/fix-xhr-form-data.md similarity index 100% rename from repos/effect/.changeset/pre/fix-xhr-form-data.md rename to .changeset/pre/fix-xhr-form-data.md diff --git a/repos/effect/.changeset/pre/fix-yaml-folded-scalars.md b/.changeset/pre/fix-yaml-folded-scalars.md similarity index 100% rename from repos/effect/.changeset/pre/fix-yaml-folded-scalars.md rename to .changeset/pre/fix-yaml-folded-scalars.md diff --git a/repos/effect/.changeset/pre/fix-zero-max-bytes.md b/.changeset/pre/fix-zero-max-bytes.md similarity index 100% rename from repos/effect/.changeset/pre/fix-zero-max-bytes.md rename to .changeset/pre/fix-zero-max-bytes.md diff --git a/repos/effect/.changeset/pre/fix-zsh-mixed-command-completions.md b/.changeset/pre/fix-zsh-mixed-command-completions.md similarity index 100% rename from repos/effect/.changeset/pre/fix-zsh-mixed-command-completions.md rename to .changeset/pre/fix-zsh-mixed-command-completions.md diff --git a/repos/effect/.changeset/pre/flat-chicken-remain.md b/.changeset/pre/flat-chicken-remain.md similarity index 100% rename from repos/effect/.changeset/pre/flat-chicken-remain.md rename to .changeset/pre/flat-chicken-remain.md diff --git a/repos/effect/.changeset/pre/flat-graphs-agree.md b/.changeset/pre/flat-graphs-agree.md similarity index 100% rename from repos/effect/.changeset/pre/flat-graphs-agree.md rename to .changeset/pre/flat-graphs-agree.md diff --git a/repos/effect/.changeset/pre/flat-pipelines-share.md b/.changeset/pre/flat-pipelines-share.md similarity index 100% rename from repos/effect/.changeset/pre/flat-pipelines-share.md rename to .changeset/pre/flat-pipelines-share.md diff --git a/repos/effect/.changeset/pre/floppy-cows-spend.md b/.changeset/pre/floppy-cows-spend.md similarity index 100% rename from repos/effect/.changeset/pre/floppy-cows-spend.md rename to .changeset/pre/floppy-cows-spend.md diff --git a/repos/effect/.changeset/pre/floppy-frogs-juggle.md b/.changeset/pre/floppy-frogs-juggle.md similarity index 100% rename from repos/effect/.changeset/pre/floppy-frogs-juggle.md rename to .changeset/pre/floppy-frogs-juggle.md diff --git a/repos/effect/.changeset/pre/floppy-items-admire.md b/.changeset/pre/floppy-items-admire.md similarity index 100% rename from repos/effect/.changeset/pre/floppy-items-admire.md rename to .changeset/pre/floppy-items-admire.md diff --git a/repos/effect/.changeset/pre/floppy-pigs-kiss.md b/.changeset/pre/floppy-pigs-kiss.md similarity index 100% rename from repos/effect/.changeset/pre/floppy-pigs-kiss.md rename to .changeset/pre/floppy-pigs-kiss.md diff --git a/repos/effect/.changeset/pre/floppy-rats-leave.md b/.changeset/pre/floppy-rats-leave.md similarity index 100% rename from repos/effect/.changeset/pre/floppy-rats-leave.md rename to .changeset/pre/floppy-rats-leave.md diff --git a/repos/effect/.changeset/pre/floyd-warshall-null-edge-data.md b/.changeset/pre/floyd-warshall-null-edge-data.md similarity index 100% rename from repos/effect/.changeset/pre/floyd-warshall-null-edge-data.md rename to .changeset/pre/floyd-warshall-null-edge-data.md diff --git a/repos/effect/.changeset/pre/fluffy-meals-matter.md b/.changeset/pre/fluffy-meals-matter.md similarity index 100% rename from repos/effect/.changeset/pre/fluffy-meals-matter.md rename to .changeset/pre/fluffy-meals-matter.md diff --git a/repos/effect/.changeset/pre/fluffy-pumas-push.md b/.changeset/pre/fluffy-pumas-push.md similarity index 100% rename from repos/effect/.changeset/pre/fluffy-pumas-push.md rename to .changeset/pre/fluffy-pumas-push.md diff --git a/repos/effect/.changeset/pre/forked-memo-maps.md b/.changeset/pre/forked-memo-maps.md similarity index 100% rename from repos/effect/.changeset/pre/forked-memo-maps.md rename to .changeset/pre/forked-memo-maps.md diff --git a/repos/effect/.changeset/pre/formatter-defined-error-causes.md b/.changeset/pre/formatter-defined-error-causes.md similarity index 100% rename from repos/effect/.changeset/pre/formatter-defined-error-causes.md rename to .changeset/pre/formatter-defined-error-causes.md diff --git a/repos/effect/.changeset/pre/forty-hounds-cheer.md b/.changeset/pre/forty-hounds-cheer.md similarity index 100% rename from repos/effect/.changeset/pre/forty-hounds-cheer.md rename to .changeset/pre/forty-hounds-cheer.md diff --git a/repos/effect/.changeset/pre/forty-otters-cry.md b/.changeset/pre/forty-otters-cry.md similarity index 100% rename from repos/effect/.changeset/pre/forty-otters-cry.md rename to .changeset/pre/forty-otters-cry.md diff --git a/repos/effect/.changeset/pre/forty-rings-film.md b/.changeset/pre/forty-rings-film.md similarity index 100% rename from repos/effect/.changeset/pre/forty-rings-film.md rename to .changeset/pre/forty-rings-film.md diff --git a/repos/effect/.changeset/pre/forty-signs-stay.md b/.changeset/pre/forty-signs-stay.md similarity index 100% rename from repos/effect/.changeset/pre/forty-signs-stay.md rename to .changeset/pre/forty-signs-stay.md diff --git a/repos/effect/.changeset/pre/forty-swans-divide.md b/.changeset/pre/forty-swans-divide.md similarity index 100% rename from repos/effect/.changeset/pre/forty-swans-divide.md rename to .changeset/pre/forty-swans-divide.md diff --git a/repos/effect/.changeset/pre/forty-trees-pay.md b/.changeset/pre/forty-trees-pay.md similarity index 100% rename from repos/effect/.changeset/pre/forty-trees-pay.md rename to .changeset/pre/forty-trees-pay.md diff --git a/repos/effect/.changeset/pre/four-papayas-bow.md b/.changeset/pre/four-papayas-bow.md similarity index 100% rename from repos/effect/.changeset/pre/four-papayas-bow.md rename to .changeset/pre/four-papayas-bow.md diff --git a/repos/effect/.changeset/pre/four-points-repeat.md b/.changeset/pre/four-points-repeat.md similarity index 100% rename from repos/effect/.changeset/pre/four-points-repeat.md rename to .changeset/pre/four-points-repeat.md diff --git a/repos/effect/.changeset/pre/frank-apes-vanish.md b/.changeset/pre/frank-apes-vanish.md similarity index 100% rename from repos/effect/.changeset/pre/frank-apes-vanish.md rename to .changeset/pre/frank-apes-vanish.md diff --git a/repos/effect/.changeset/pre/fresh-cats-smash.md b/.changeset/pre/fresh-cats-smash.md similarity index 100% rename from repos/effect/.changeset/pre/fresh-cats-smash.md rename to .changeset/pre/fresh-cats-smash.md diff --git a/repos/effect/.changeset/pre/fresh-cycles-wait.md b/.changeset/pre/fresh-cycles-wait.md similarity index 100% rename from repos/effect/.changeset/pre/fresh-cycles-wait.md rename to .changeset/pre/fresh-cycles-wait.md diff --git a/repos/effect/.changeset/pre/fresh-deps-update.md b/.changeset/pre/fresh-deps-update.md similarity index 100% rename from repos/effect/.changeset/pre/fresh-deps-update.md rename to .changeset/pre/fresh-deps-update.md diff --git a/repos/effect/.changeset/pre/fresh-emus-cheat.md b/.changeset/pre/fresh-emus-cheat.md similarity index 100% rename from repos/effect/.changeset/pre/fresh-emus-cheat.md rename to .changeset/pre/fresh-emus-cheat.md diff --git a/repos/effect/.changeset/pre/fresh-files-seek.md b/.changeset/pre/fresh-files-seek.md similarity index 100% rename from repos/effect/.changeset/pre/fresh-files-seek.md rename to .changeset/pre/fresh-files-seek.md diff --git a/repos/effect/.changeset/pre/fresh-forms-travel.md b/.changeset/pre/fresh-forms-travel.md similarity index 100% rename from repos/effect/.changeset/pre/fresh-forms-travel.md rename to .changeset/pre/fresh-forms-travel.md diff --git a/repos/effect/.changeset/pre/fresh-graphs-cycle.md b/.changeset/pre/fresh-graphs-cycle.md similarity index 100% rename from repos/effect/.changeset/pre/fresh-graphs-cycle.md rename to .changeset/pre/fresh-graphs-cycle.md diff --git a/repos/effect/.changeset/pre/fresh-images-generate.md b/.changeset/pre/fresh-images-generate.md similarity index 100% rename from repos/effect/.changeset/pre/fresh-images-generate.md rename to .changeset/pre/fresh-images-generate.md diff --git a/repos/effect/.changeset/pre/fresh-lines-wait.md b/.changeset/pre/fresh-lines-wait.md similarity index 100% rename from repos/effect/.changeset/pre/fresh-lines-wait.md rename to .changeset/pre/fresh-lines-wait.md diff --git a/repos/effect/.changeset/pre/fresh-monkeys-smoke.md b/.changeset/pre/fresh-monkeys-smoke.md similarity index 100% rename from repos/effect/.changeset/pre/fresh-monkeys-smoke.md rename to .changeset/pre/fresh-monkeys-smoke.md diff --git a/repos/effect/.changeset/pre/fresh-pools-rotate.md b/.changeset/pre/fresh-pools-rotate.md similarity index 100% rename from repos/effect/.changeset/pre/fresh-pools-rotate.md rename to .changeset/pre/fresh-pools-rotate.md diff --git a/repos/effect/.changeset/pre/fresh-rivers-report.md b/.changeset/pre/fresh-rivers-report.md similarity index 100% rename from repos/effect/.changeset/pre/fresh-rivers-report.md rename to .changeset/pre/fresh-rivers-report.md diff --git a/repos/effect/.changeset/pre/frozen-intrinsics-stack-trace-limit.md b/.changeset/pre/frozen-intrinsics-stack-trace-limit.md similarity index 100% rename from repos/effect/.changeset/pre/frozen-intrinsics-stack-trace-limit.md rename to .changeset/pre/frozen-intrinsics-stack-trace-limit.md diff --git a/repos/effect/.changeset/pre/fruity-houses-learn.md b/.changeset/pre/fruity-houses-learn.md similarity index 100% rename from repos/effect/.changeset/pre/fruity-houses-learn.md rename to .changeset/pre/fruity-houses-learn.md diff --git a/repos/effect/.changeset/pre/fruity-sloths-walk.md b/.changeset/pre/fruity-sloths-walk.md similarity index 100% rename from repos/effect/.changeset/pre/fruity-sloths-walk.md rename to .changeset/pre/fruity-sloths-walk.md diff --git a/repos/effect/.changeset/pre/full-adults-double.md b/.changeset/pre/full-adults-double.md similarity index 100% rename from repos/effect/.changeset/pre/full-adults-double.md rename to .changeset/pre/full-adults-double.md diff --git a/repos/effect/.changeset/pre/funny-crabs-hang.md b/.changeset/pre/funny-crabs-hang.md similarity index 100% rename from repos/effect/.changeset/pre/funny-crabs-hang.md rename to .changeset/pre/funny-crabs-hang.md diff --git a/repos/effect/.changeset/pre/funny-ears-beam.md b/.changeset/pre/funny-ears-beam.md similarity index 100% rename from repos/effect/.changeset/pre/funny-ears-beam.md rename to .changeset/pre/funny-ears-beam.md diff --git a/repos/effect/.changeset/pre/funny-forks-move.md b/.changeset/pre/funny-forks-move.md similarity index 100% rename from repos/effect/.changeset/pre/funny-forks-move.md rename to .changeset/pre/funny-forks-move.md diff --git a/repos/effect/.changeset/pre/fuzzy-batches-stop.md b/.changeset/pre/fuzzy-batches-stop.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-batches-stop.md rename to .changeset/pre/fuzzy-batches-stop.md diff --git a/repos/effect/.changeset/pre/fuzzy-caches-expire.md b/.changeset/pre/fuzzy-caches-expire.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-caches-expire.md rename to .changeset/pre/fuzzy-caches-expire.md diff --git a/repos/effect/.changeset/pre/fuzzy-camels-hunt.md b/.changeset/pre/fuzzy-camels-hunt.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-camels-hunt.md rename to .changeset/pre/fuzzy-camels-hunt.md diff --git a/repos/effect/.changeset/pre/fuzzy-cats-kill.md b/.changeset/pre/fuzzy-cats-kill.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-cats-kill.md rename to .changeset/pre/fuzzy-cats-kill.md diff --git a/repos/effect/.changeset/pre/fuzzy-cats-listen.md b/.changeset/pre/fuzzy-cats-listen.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-cats-listen.md rename to .changeset/pre/fuzzy-cats-listen.md diff --git a/repos/effect/.changeset/pre/fuzzy-classes-compare.md b/.changeset/pre/fuzzy-classes-compare.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-classes-compare.md rename to .changeset/pre/fuzzy-classes-compare.md diff --git a/repos/effect/.changeset/pre/fuzzy-crews-fold.md b/.changeset/pre/fuzzy-crews-fold.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-crews-fold.md rename to .changeset/pre/fuzzy-crews-fold.md diff --git a/repos/effect/.changeset/pre/fuzzy-databases-abort.md b/.changeset/pre/fuzzy-databases-abort.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-databases-abort.md rename to .changeset/pre/fuzzy-databases-abort.md diff --git a/repos/effect/.changeset/pre/fuzzy-dodos-help.md b/.changeset/pre/fuzzy-dodos-help.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-dodos-help.md rename to .changeset/pre/fuzzy-dodos-help.md diff --git a/repos/effect/.changeset/pre/fuzzy-files-slice.md b/.changeset/pre/fuzzy-files-slice.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-files-slice.md rename to .changeset/pre/fuzzy-files-slice.md diff --git a/repos/effect/.changeset/pre/fuzzy-graphs-transform.md b/.changeset/pre/fuzzy-graphs-transform.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-graphs-transform.md rename to .changeset/pre/fuzzy-graphs-transform.md diff --git a/repos/effect/.changeset/pre/fuzzy-hornets-wish.md b/.changeset/pre/fuzzy-hornets-wish.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-hornets-wish.md rename to .changeset/pre/fuzzy-hornets-wish.md diff --git a/repos/effect/.changeset/pre/fuzzy-lions-perform.md b/.changeset/pre/fuzzy-lions-perform.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-lions-perform.md rename to .changeset/pre/fuzzy-lions-perform.md diff --git a/repos/effect/.changeset/pre/fuzzy-lions-study.md b/.changeset/pre/fuzzy-lions-study.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-lions-study.md rename to .changeset/pre/fuzzy-lions-study.md diff --git a/repos/effect/.changeset/pre/fuzzy-pandas-smile.md b/.changeset/pre/fuzzy-pandas-smile.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-pandas-smile.md rename to .changeset/pre/fuzzy-pandas-smile.md diff --git a/repos/effect/.changeset/pre/fuzzy-planets-sneeze.md b/.changeset/pre/fuzzy-planets-sneeze.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-planets-sneeze.md rename to .changeset/pre/fuzzy-planets-sneeze.md diff --git a/repos/effect/.changeset/pre/fuzzy-rabbits-cancel.md b/.changeset/pre/fuzzy-rabbits-cancel.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-rabbits-cancel.md rename to .changeset/pre/fuzzy-rabbits-cancel.md diff --git a/repos/effect/.changeset/pre/fuzzy-ravens-reason.md b/.changeset/pre/fuzzy-ravens-reason.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-ravens-reason.md rename to .changeset/pre/fuzzy-ravens-reason.md diff --git a/repos/effect/.changeset/pre/fuzzy-routers-smile.md b/.changeset/pre/fuzzy-routers-smile.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-routers-smile.md rename to .changeset/pre/fuzzy-routers-smile.md diff --git a/repos/effect/.changeset/pre/fuzzy-stamps-care.md b/.changeset/pre/fuzzy-stamps-care.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-stamps-care.md rename to .changeset/pre/fuzzy-stamps-care.md diff --git a/repos/effect/.changeset/pre/fuzzy-timers-smile.md b/.changeset/pre/fuzzy-timers-smile.md similarity index 100% rename from repos/effect/.changeset/pre/fuzzy-timers-smile.md rename to .changeset/pre/fuzzy-timers-smile.md diff --git a/repos/effect/.changeset/pre/general-json-schema-converters.md b/.changeset/pre/general-json-schema-converters.md similarity index 100% rename from repos/effect/.changeset/pre/general-json-schema-converters.md rename to .changeset/pre/general-json-schema-converters.md diff --git a/repos/effect/.changeset/pre/giant-jeans-float.md b/.changeset/pre/giant-jeans-float.md similarity index 100% rename from repos/effect/.changeset/pre/giant-jeans-float.md rename to .changeset/pre/giant-jeans-float.md diff --git a/repos/effect/.changeset/pre/gold-meteors-move.md b/.changeset/pre/gold-meteors-move.md similarity index 100% rename from repos/effect/.changeset/pre/gold-meteors-move.md rename to .changeset/pre/gold-meteors-move.md diff --git a/repos/effect/.changeset/pre/gold-readers-hug.md b/.changeset/pre/gold-readers-hug.md similarity index 100% rename from repos/effect/.changeset/pre/gold-readers-hug.md rename to .changeset/pre/gold-readers-hug.md diff --git a/repos/effect/.changeset/pre/gold-rings-start.md b/.changeset/pre/gold-rings-start.md similarity index 100% rename from repos/effect/.changeset/pre/gold-rings-start.md rename to .changeset/pre/gold-rings-start.md diff --git a/repos/effect/.changeset/pre/good-cups-reply.md b/.changeset/pre/good-cups-reply.md similarity index 100% rename from repos/effect/.changeset/pre/good-cups-reply.md rename to .changeset/pre/good-cups-reply.md diff --git a/repos/effect/.changeset/pre/good-tools-work.md b/.changeset/pre/good-tools-work.md similarity index 100% rename from repos/effect/.changeset/pre/good-tools-work.md rename to .changeset/pre/good-tools-work.md diff --git a/repos/effect/.changeset/pre/good-trees-pull.md b/.changeset/pre/good-trees-pull.md similarity index 100% rename from repos/effect/.changeset/pre/good-trees-pull.md rename to .changeset/pre/good-trees-pull.md diff --git a/repos/effect/.changeset/pre/graph-acyclic-parallel-undirected-edges.md b/.changeset/pre/graph-acyclic-parallel-undirected-edges.md similarity index 100% rename from repos/effect/.changeset/pre/graph-acyclic-parallel-undirected-edges.md rename to .changeset/pre/graph-acyclic-parallel-undirected-edges.md diff --git a/repos/effect/.changeset/pre/graph-algorithm-fixes.md b/.changeset/pre/graph-algorithm-fixes.md similarity index 100% rename from repos/effect/.changeset/pre/graph-algorithm-fixes.md rename to .changeset/pre/graph-algorithm-fixes.md diff --git a/repos/effect/.changeset/pre/graph-bellman-ford-infinite-cycle-barriers.md b/.changeset/pre/graph-bellman-ford-infinite-cycle-barriers.md similarity index 100% rename from repos/effect/.changeset/pre/graph-bellman-ford-infinite-cycle-barriers.md rename to .changeset/pre/graph-bellman-ford-infinite-cycle-barriers.md diff --git a/repos/effect/.changeset/pre/graph-finalized-mutation-handle.md b/.changeset/pre/graph-finalized-mutation-handle.md similarity index 100% rename from repos/effect/.changeset/pre/graph-finalized-mutation-handle.md rename to .changeset/pre/graph-finalized-mutation-handle.md diff --git a/repos/effect/.changeset/pre/graph-guard-predicates.md b/.changeset/pre/graph-guard-predicates.md similarity index 100% rename from repos/effect/.changeset/pre/graph-guard-predicates.md rename to .changeset/pre/graph-guard-predicates.md diff --git a/repos/effect/.changeset/pre/graph-sync-mutation-callbacks.md b/.changeset/pre/graph-sync-mutation-callbacks.md similarity index 100% rename from repos/effect/.changeset/pre/graph-sync-mutation-callbacks.md rename to .changeset/pre/graph-sync-mutation-callbacks.md diff --git a/repos/effect/.changeset/pre/graph-undirected-edge-equality.md b/.changeset/pre/graph-undirected-edge-equality.md similarity index 100% rename from repos/effect/.changeset/pre/graph-undirected-edge-equality.md rename to .changeset/pre/graph-undirected-edge-equality.md diff --git a/repos/effect/.changeset/pre/graph-walker-iterator-receiver.md b/.changeset/pre/graph-walker-iterator-receiver.md similarity index 100% rename from repos/effect/.changeset/pre/graph-walker-iterator-receiver.md rename to .changeset/pre/graph-walker-iterator-receiver.md diff --git a/repos/effect/.changeset/pre/great-trains-mate.md b/.changeset/pre/great-trains-mate.md similarity index 100% rename from repos/effect/.changeset/pre/great-trains-mate.md rename to .changeset/pre/great-trains-mate.md diff --git a/repos/effect/.changeset/pre/great-trams-report.md b/.changeset/pre/great-trams-report.md similarity index 100% rename from repos/effect/.changeset/pre/great-trams-report.md rename to .changeset/pre/great-trams-report.md diff --git a/repos/effect/.changeset/pre/green-ads-camp.md b/.changeset/pre/green-ads-camp.md similarity index 100% rename from repos/effect/.changeset/pre/green-ads-camp.md rename to .changeset/pre/green-ads-camp.md diff --git a/repos/effect/.changeset/pre/green-beds-unref.md b/.changeset/pre/green-beds-unref.md similarity index 100% rename from repos/effect/.changeset/pre/green-beds-unref.md rename to .changeset/pre/green-beds-unref.md diff --git a/repos/effect/.changeset/pre/green-birds-close.md b/.changeset/pre/green-birds-close.md similarity index 100% rename from repos/effect/.changeset/pre/green-birds-close.md rename to .changeset/pre/green-birds-close.md diff --git a/repos/effect/.changeset/pre/green-chips-wash.md b/.changeset/pre/green-chips-wash.md similarity index 100% rename from repos/effect/.changeset/pre/green-chips-wash.md rename to .changeset/pre/green-chips-wash.md diff --git a/repos/effect/.changeset/pre/green-moons-smile.md b/.changeset/pre/green-moons-smile.md similarity index 100% rename from repos/effect/.changeset/pre/green-moons-smile.md rename to .changeset/pre/green-moons-smile.md diff --git a/repos/effect/.changeset/pre/green-pugs-play.md b/.changeset/pre/green-pugs-play.md similarity index 100% rename from repos/effect/.changeset/pre/green-pugs-play.md rename to .changeset/pre/green-pugs-play.md diff --git a/repos/effect/.changeset/pre/green-rings-prove.md b/.changeset/pre/green-rings-prove.md similarity index 100% rename from repos/effect/.changeset/pre/green-rings-prove.md rename to .changeset/pre/green-rings-prove.md diff --git a/repos/effect/.changeset/pre/happy-mirrors-dream.md b/.changeset/pre/happy-mirrors-dream.md similarity index 100% rename from repos/effect/.changeset/pre/happy-mirrors-dream.md rename to .changeset/pre/happy-mirrors-dream.md diff --git a/repos/effect/.changeset/pre/harden-httpapi-documentation-html.md b/.changeset/pre/harden-httpapi-documentation-html.md similarity index 100% rename from repos/effect/.changeset/pre/harden-httpapi-documentation-html.md rename to .changeset/pre/harden-httpapi-documentation-html.md diff --git a/repos/effect/.changeset/pre/hash-sql-message-dedupe-keys.md b/.changeset/pre/hash-sql-message-dedupe-keys.md similarity index 100% rename from repos/effect/.changeset/pre/hash-sql-message-dedupe-keys.md rename to .changeset/pre/hash-sql-message-dedupe-keys.md diff --git a/repos/effect/.changeset/pre/hashmap-collision-entries.md b/.changeset/pre/hashmap-collision-entries.md similarity index 100% rename from repos/effect/.changeset/pre/hashmap-collision-entries.md rename to .changeset/pre/hashmap-collision-entries.md diff --git a/repos/effect/.changeset/pre/hashring-exclusion-endpoint.md b/.changeset/pre/hashring-exclusion-endpoint.md similarity index 100% rename from repos/effect/.changeset/pre/hashring-exclusion-endpoint.md rename to .changeset/pre/hashring-exclusion-endpoint.md diff --git a/repos/effect/.changeset/pre/headers-redacted-name-case.md b/.changeset/pre/headers-redacted-name-case.md similarity index 100% rename from repos/effect/.changeset/pre/headers-redacted-name-case.md rename to .changeset/pre/headers-redacted-name-case.md diff --git a/repos/effect/.changeset/pre/headers-stateful-patterns.md b/.changeset/pre/headers-stateful-patterns.md similarity index 100% rename from repos/effect/.changeset/pre/headers-stateful-patterns.md rename to .changeset/pre/headers-stateful-patterns.md diff --git a/repos/effect/.changeset/pre/heavy-loops-cut.md b/.changeset/pre/heavy-loops-cut.md similarity index 100% rename from repos/effect/.changeset/pre/heavy-loops-cut.md rename to .changeset/pre/heavy-loops-cut.md diff --git a/repos/effect/.changeset/pre/heavy-trams-fix.md b/.changeset/pre/heavy-trams-fix.md similarity index 100% rename from repos/effect/.changeset/pre/heavy-trams-fix.md rename to .changeset/pre/heavy-trams-fix.md diff --git a/repos/effect/.changeset/pre/hip-friends-kiss.md b/.changeset/pre/hip-friends-kiss.md similarity index 100% rename from repos/effect/.changeset/pre/hip-friends-kiss.md rename to .changeset/pre/hip-friends-kiss.md diff --git a/repos/effect/.changeset/pre/hip-socks-travel.md b/.changeset/pre/hip-socks-travel.md similarity index 100% rename from repos/effect/.changeset/pre/hip-socks-travel.md rename to .changeset/pre/hip-socks-travel.md diff --git a/repos/effect/.changeset/pre/honest-pens-thank.md b/.changeset/pre/honest-pens-thank.md similarity index 100% rename from repos/effect/.changeset/pre/honest-pens-thank.md rename to .changeset/pre/honest-pens-thank.md diff --git a/repos/effect/.changeset/pre/honest-rivers-notice.md b/.changeset/pre/honest-rivers-notice.md similarity index 100% rename from repos/effect/.changeset/pre/honest-rivers-notice.md rename to .changeset/pre/honest-rivers-notice.md diff --git a/repos/effect/.changeset/pre/hot-taxis-fry.md b/.changeset/pre/hot-taxis-fry.md similarity index 100% rename from repos/effect/.changeset/pre/hot-taxis-fry.md rename to .changeset/pre/hot-taxis-fry.md diff --git a/repos/effect/.changeset/pre/hot-teeth-clean.md b/.changeset/pre/hot-teeth-clean.md similarity index 100% rename from repos/effect/.changeset/pre/hot-teeth-clean.md rename to .changeset/pre/hot-teeth-clean.md diff --git a/repos/effect/.changeset/pre/http-client-catch-response-result.md b/.changeset/pre/http-client-catch-response-result.md similarity index 100% rename from repos/effect/.changeset/pre/http-client-catch-response-result.md rename to .changeset/pre/http-client-catch-response-result.md diff --git a/repos/effect/.changeset/pre/http-client-redirect-preprocessing-recovery.md b/.changeset/pre/http-client-redirect-preprocessing-recovery.md similarity index 100% rename from repos/effect/.changeset/pre/http-client-redirect-preprocessing-recovery.md rename to .changeset/pre/http-client-redirect-preprocessing-recovery.md diff --git a/repos/effect/.changeset/pre/http-client-response-schema-json-options.md b/.changeset/pre/http-client-response-schema-json-options.md similarity index 100% rename from repos/effect/.changeset/pre/http-client-response-schema-json-options.md rename to .changeset/pre/http-client-response-schema-json-options.md diff --git a/repos/effect/.changeset/pre/http-head-stream-scope.md b/.changeset/pre/http-head-stream-scope.md similarity index 100% rename from repos/effect/.changeset/pre/http-head-stream-scope.md rename to .changeset/pre/http-head-stream-scope.md diff --git a/repos/effect/.changeset/pre/http-json-reviver.md b/.changeset/pre/http-json-reviver.md similarity index 100% rename from repos/effect/.changeset/pre/http-json-reviver.md rename to .changeset/pre/http-json-reviver.md diff --git a/repos/effect/.changeset/pre/http-response-content-length.md b/.changeset/pre/http-response-content-length.md similarity index 100% rename from repos/effect/.changeset/pre/http-response-content-length.md rename to .changeset/pre/http-response-content-length.md diff --git a/repos/effect/.changeset/pre/http-router-normalized-prefix.md b/.changeset/pre/http-router-normalized-prefix.md similarity index 100% rename from repos/effect/.changeset/pre/http-router-normalized-prefix.md rename to .changeset/pre/http-router-normalized-prefix.md diff --git a/repos/effect/.changeset/pre/http-runner-path-boundary.md b/.changeset/pre/http-runner-path-boundary.md similarity index 100% rename from repos/effect/.changeset/pre/http-runner-path-boundary.md rename to .changeset/pre/http-runner-path-boundary.md diff --git a/repos/effect/.changeset/pre/http-server-websocket-options.md b/.changeset/pre/http-server-websocket-options.md similarity index 100% rename from repos/effect/.changeset/pre/http-server-websocket-options.md rename to .changeset/pre/http-server-websocket-options.md diff --git a/repos/effect/.changeset/pre/http-status-from-literal.md b/.changeset/pre/http-status-from-literal.md similarity index 100% rename from repos/effect/.changeset/pre/http-status-from-literal.md rename to .changeset/pre/http-status-from-literal.md diff --git a/repos/effect/.changeset/pre/http-web-handler-cold-start.md b/.changeset/pre/http-web-handler-cold-start.md similarity index 100% rename from repos/effect/.changeset/pre/http-web-handler-cold-start.md rename to .changeset/pre/http-web-handler-cold-start.md diff --git a/repos/effect/.changeset/pre/httpapi-endpoint-relax-constraints.md b/.changeset/pre/httpapi-endpoint-relax-constraints.md similarity index 100% rename from repos/effect/.changeset/pre/httpapi-endpoint-relax-constraints.md rename to .changeset/pre/httpapi-endpoint-relax-constraints.md diff --git a/repos/effect/.changeset/pre/httpapi-middleware-error-dedupe.md b/.changeset/pre/httpapi-middleware-error-dedupe.md similarity index 100% rename from repos/effect/.changeset/pre/httpapi-middleware-error-dedupe.md rename to .changeset/pre/httpapi-middleware-error-dedupe.md diff --git a/repos/effect/.changeset/pre/httpapi-schema-service-types.md b/.changeset/pre/httpapi-schema-service-types.md similarity index 100% rename from repos/effect/.changeset/pre/httpapi-schema-service-types.md rename to .changeset/pre/httpapi-schema-service-types.md diff --git a/repos/effect/.changeset/pre/httpapi-sse-decode-options.md b/.changeset/pre/httpapi-sse-decode-options.md similarity index 100% rename from repos/effect/.changeset/pre/httpapi-sse-decode-options.md rename to .changeset/pre/httpapi-sse-decode-options.md diff --git a/repos/effect/.changeset/pre/huge-moons-rhyme.md b/.changeset/pre/huge-moons-rhyme.md similarity index 100% rename from repos/effect/.changeset/pre/huge-moons-rhyme.md rename to .changeset/pre/huge-moons-rhyme.md diff --git a/repos/effect/.changeset/pre/humble-pigs-dig.md b/.changeset/pre/humble-pigs-dig.md similarity index 100% rename from repos/effect/.changeset/pre/humble-pigs-dig.md rename to .changeset/pre/humble-pigs-dig.md diff --git a/repos/effect/.changeset/pre/hungry-kings-look.md b/.changeset/pre/hungry-kings-look.md similarity index 100% rename from repos/effect/.changeset/pre/hungry-kings-look.md rename to .changeset/pre/hungry-kings-look.md diff --git a/repos/effect/.changeset/pre/icy-flies-cross.md b/.changeset/pre/icy-flies-cross.md similarity index 100% rename from repos/effect/.changeset/pre/icy-flies-cross.md rename to .changeset/pre/icy-flies-cross.md diff --git a/repos/effect/.changeset/pre/improve-json-schema-import.md b/.changeset/pre/improve-json-schema-import.md similarity index 100% rename from repos/effect/.changeset/pre/improve-json-schema-import.md rename to .changeset/pre/improve-json-schema-import.md diff --git a/repos/effect/.changeset/pre/indexeddb-out-of-line-primary-keys.md b/.changeset/pre/indexeddb-out-of-line-primary-keys.md similarity index 100% rename from repos/effect/.changeset/pre/indexeddb-out-of-line-primary-keys.md rename to .changeset/pre/indexeddb-out-of-line-primary-keys.md diff --git a/repos/effect/.changeset/pre/indexeddb-stream-query-limits.md b/.changeset/pre/indexeddb-stream-query-limits.md similarity index 100% rename from repos/effect/.changeset/pre/indexeddb-stream-query-limits.md rename to .changeset/pre/indexeddb-stream-query-limits.md diff --git a/repos/effect/.changeset/pre/internal-json-string-schema.md b/.changeset/pre/internal-json-string-schema.md similarity index 100% rename from repos/effect/.changeset/pre/internal-json-string-schema.md rename to .changeset/pre/internal-json-string-schema.md diff --git a/repos/effect/.changeset/pre/isolate-sql-compiler-cache.md b/.changeset/pre/isolate-sql-compiler-cache.md similarity index 100% rename from repos/effect/.changeset/pre/isolate-sql-compiler-cache.md rename to .changeset/pre/isolate-sql-compiler-cache.md diff --git a/repos/effect/.changeset/pre/isolate-unencodable-hydration.md b/.changeset/pre/isolate-unencodable-hydration.md similarity index 100% rename from repos/effect/.changeset/pre/isolate-unencodable-hydration.md rename to .changeset/pre/isolate-unencodable-hydration.md diff --git a/repos/effect/.changeset/pre/itchy-radios-poke.md b/.changeset/pre/itchy-radios-poke.md similarity index 100% rename from repos/effect/.changeset/pre/itchy-radios-poke.md rename to .changeset/pre/itchy-radios-poke.md diff --git a/repos/effect/.changeset/pre/itchy-results-bet.md b/.changeset/pre/itchy-results-bet.md similarity index 100% rename from repos/effect/.changeset/pre/itchy-results-bet.md rename to .changeset/pre/itchy-results-bet.md diff --git a/repos/effect/.changeset/pre/itchy-shrimps-deny.md b/.changeset/pre/itchy-shrimps-deny.md similarity index 100% rename from repos/effect/.changeset/pre/itchy-shrimps-deny.md rename to .changeset/pre/itchy-shrimps-deny.md diff --git a/repos/effect/.changeset/pre/itchy-toes-promise.md b/.changeset/pre/itchy-toes-promise.md similarity index 100% rename from repos/effect/.changeset/pre/itchy-toes-promise.md rename to .changeset/pre/itchy-toes-promise.md diff --git a/repos/effect/.changeset/pre/k8s-last-transition-null.md b/.changeset/pre/k8s-last-transition-null.md similarity index 100% rename from repos/effect/.changeset/pre/k8s-last-transition-null.md rename to .changeset/pre/k8s-last-transition-null.md diff --git a/repos/effect/.changeset/pre/keep-httpapi-composition-immutable.md b/.changeset/pre/keep-httpapi-composition-immutable.md similarity index 100% rename from repos/effect/.changeset/pre/keep-httpapi-composition-immutable.md rename to .changeset/pre/keep-httpapi-composition-immutable.md diff --git a/repos/effect/.changeset/pre/khaki-cats-learn.md b/.changeset/pre/khaki-cats-learn.md similarity index 100% rename from repos/effect/.changeset/pre/khaki-cats-learn.md rename to .changeset/pre/khaki-cats-learn.md diff --git a/repos/effect/.changeset/pre/khaki-melons-appear.md b/.changeset/pre/khaki-melons-appear.md similarity index 100% rename from repos/effect/.changeset/pre/khaki-melons-appear.md rename to .changeset/pre/khaki-melons-appear.md diff --git a/repos/effect/.changeset/pre/kind-flags-help.md b/.changeset/pre/kind-flags-help.md similarity index 100% rename from repos/effect/.changeset/pre/kind-flags-help.md rename to .changeset/pre/kind-flags-help.md diff --git a/repos/effect/.changeset/pre/kind-hounds-float.md b/.changeset/pre/kind-hounds-float.md similarity index 100% rename from repos/effect/.changeset/pre/kind-hounds-float.md rename to .changeset/pre/kind-hounds-float.md diff --git a/repos/effect/.changeset/pre/kind-windows-fall.md b/.changeset/pre/kind-windows-fall.md similarity index 100% rename from repos/effect/.changeset/pre/kind-windows-fall.md rename to .changeset/pre/kind-windows-fall.md diff --git a/repos/effect/.changeset/pre/large-postgres-messages.md b/.changeset/pre/large-postgres-messages.md similarity index 100% rename from repos/effect/.changeset/pre/large-postgres-messages.md rename to .changeset/pre/large-postgres-messages.md diff --git a/repos/effect/.changeset/pre/late-hotels-rule.md b/.changeset/pre/late-hotels-rule.md similarity index 100% rename from repos/effect/.changeset/pre/late-hotels-rule.md rename to .changeset/pre/late-hotels-rule.md diff --git a/repos/effect/.changeset/pre/late-lamps-care.md b/.changeset/pre/late-lamps-care.md similarity index 100% rename from repos/effect/.changeset/pre/late-lamps-care.md rename to .changeset/pre/late-lamps-care.md diff --git a/repos/effect/.changeset/pre/late-rivers-applaud.md b/.changeset/pre/late-rivers-applaud.md similarity index 100% rename from repos/effect/.changeset/pre/late-rivers-applaud.md rename to .changeset/pre/late-rivers-applaud.md diff --git a/repos/effect/.changeset/pre/late-sockets-rest.md b/.changeset/pre/late-sockets-rest.md similarity index 100% rename from repos/effect/.changeset/pre/late-sockets-rest.md rename to .changeset/pre/late-sockets-rest.md diff --git a/repos/effect/.changeset/pre/layer-error-observer-types.md b/.changeset/pre/layer-error-observer-types.md similarity index 100% rename from repos/effect/.changeset/pre/layer-error-observer-types.md rename to .changeset/pre/layer-error-observer-types.md diff --git a/repos/effect/.changeset/pre/layer-map-dynamic-idle-ttl.md b/.changeset/pre/layer-map-dynamic-idle-ttl.md similarity index 100% rename from repos/effect/.changeset/pre/layer-map-dynamic-idle-ttl.md rename to .changeset/pre/layer-map-dynamic-idle-ttl.md diff --git a/repos/effect/.changeset/pre/layer-span-trace-options.md b/.changeset/pre/layer-span-trace-options.md similarity index 100% rename from repos/effect/.changeset/pre/layer-span-trace-options.md rename to .changeset/pre/layer-span-trace-options.md diff --git a/repos/effect/.changeset/pre/layered-context-storage.md b/.changeset/pre/layered-context-storage.md similarity index 100% rename from repos/effect/.changeset/pre/layered-context-storage.md rename to .changeset/pre/layered-context-storage.md diff --git a/repos/effect/.changeset/pre/layermap-preloaded-acquisition-errors.md b/.changeset/pre/layermap-preloaded-acquisition-errors.md similarity index 100% rename from repos/effect/.changeset/pre/layermap-preloaded-acquisition-errors.md rename to .changeset/pre/layermap-preloaded-acquisition-errors.md diff --git a/repos/effect/.changeset/pre/lazy-bun-redis-import.md b/.changeset/pre/lazy-bun-redis-import.md similarity index 100% rename from repos/effect/.changeset/pre/lazy-bun-redis-import.md rename to .changeset/pre/lazy-bun-redis-import.md diff --git a/repos/effect/.changeset/pre/lazy-openapi-initialization.md b/.changeset/pre/lazy-openapi-initialization.md similarity index 100% rename from repos/effect/.changeset/pre/lazy-openapi-initialization.md rename to .changeset/pre/lazy-openapi-initialization.md diff --git a/repos/effect/.changeset/pre/lazy-queens-rush.md b/.changeset/pre/lazy-queens-rush.md similarity index 100% rename from repos/effect/.changeset/pre/lazy-queens-rush.md rename to .changeset/pre/lazy-queens-rush.md diff --git a/repos/effect/.changeset/pre/lazy-recursive-forward-refs.md b/.changeset/pre/lazy-recursive-forward-refs.md similarity index 100% rename from repos/effect/.changeset/pre/lazy-recursive-forward-refs.md rename to .changeset/pre/lazy-recursive-forward-refs.md diff --git a/repos/effect/.changeset/pre/lazy-timers-exist.md b/.changeset/pre/lazy-timers-exist.md similarity index 100% rename from repos/effect/.changeset/pre/lazy-timers-exist.md rename to .changeset/pre/lazy-timers-exist.md diff --git a/repos/effect/.changeset/pre/lazy-undici-loading.md b/.changeset/pre/lazy-undici-loading.md similarity index 100% rename from repos/effect/.changeset/pre/lazy-undici-loading.md rename to .changeset/pre/lazy-undici-loading.md diff --git a/repos/effect/.changeset/pre/legal-pants-drop.md b/.changeset/pre/legal-pants-drop.md similarity index 100% rename from repos/effect/.changeset/pre/legal-pants-drop.md rename to .changeset/pre/legal-pants-drop.md diff --git a/repos/effect/.changeset/pre/lemon-taxis-sin.md b/.changeset/pre/lemon-taxis-sin.md similarity index 100% rename from repos/effect/.changeset/pre/lemon-taxis-sin.md rename to .changeset/pre/lemon-taxis-sin.md diff --git a/repos/effect/.changeset/pre/libsql-transaction-client-isolation.md b/.changeset/pre/libsql-transaction-client-isolation.md similarity index 100% rename from repos/effect/.changeset/pre/libsql-transaction-client-isolation.md rename to .changeset/pre/libsql-transaction-client-isolation.md diff --git a/repos/effect/.changeset/pre/light-kids-sneeze.md b/.changeset/pre/light-kids-sneeze.md similarity index 100% rename from repos/effect/.changeset/pre/light-kids-sneeze.md rename to .changeset/pre/light-kids-sneeze.md diff --git a/repos/effect/.changeset/pre/little-dryers-allow.md b/.changeset/pre/little-dryers-allow.md similarity index 100% rename from repos/effect/.changeset/pre/little-dryers-allow.md rename to .changeset/pre/little-dryers-allow.md diff --git a/repos/effect/.changeset/pre/logger-complete-file-writes.md b/.changeset/pre/logger-complete-file-writes.md similarity index 100% rename from repos/effect/.changeset/pre/logger-complete-file-writes.md rename to .changeset/pre/logger-complete-file-writes.md diff --git a/repos/effect/.changeset/pre/long-cameras-think.md b/.changeset/pre/long-cameras-think.md similarity index 100% rename from repos/effect/.changeset/pre/long-cameras-think.md rename to .changeset/pre/long-cameras-think.md diff --git a/repos/effect/.changeset/pre/loose-wings-lie.md b/.changeset/pre/loose-wings-lie.md similarity index 100% rename from repos/effect/.changeset/pre/loose-wings-lie.md rename to .changeset/pre/loose-wings-lie.md diff --git a/repos/effect/.changeset/pre/lovely-cobras-change.md b/.changeset/pre/lovely-cobras-change.md similarity index 100% rename from repos/effect/.changeset/pre/lovely-cobras-change.md rename to .changeset/pre/lovely-cobras-change.md diff --git a/repos/effect/.changeset/pre/lovely-frogs-rescue.md b/.changeset/pre/lovely-frogs-rescue.md similarity index 100% rename from repos/effect/.changeset/pre/lovely-frogs-rescue.md rename to .changeset/pre/lovely-frogs-rescue.md diff --git a/repos/effect/.changeset/pre/lucky-buttons-jump.md b/.changeset/pre/lucky-buttons-jump.md similarity index 100% rename from repos/effect/.changeset/pre/lucky-buttons-jump.md rename to .changeset/pre/lucky-buttons-jump.md diff --git a/repos/effect/.changeset/pre/lucky-dingos-smile.md b/.changeset/pre/lucky-dingos-smile.md similarity index 100% rename from repos/effect/.changeset/pre/lucky-dingos-smile.md rename to .changeset/pre/lucky-dingos-smile.md diff --git a/repos/effect/.changeset/pre/lucky-phones-listen.md b/.changeset/pre/lucky-phones-listen.md similarity index 100% rename from repos/effect/.changeset/pre/lucky-phones-listen.md rename to .changeset/pre/lucky-phones-listen.md diff --git a/repos/effect/.changeset/pre/lucky-worms-type.md b/.changeset/pre/lucky-worms-type.md similarity index 100% rename from repos/effect/.changeset/pre/lucky-worms-type.md rename to .changeset/pre/lucky-worms-type.md diff --git a/repos/effect/.changeset/pre/major-chairs-design.md b/.changeset/pre/major-chairs-design.md similarity index 100% rename from repos/effect/.changeset/pre/major-chairs-design.md rename to .changeset/pre/major-chairs-design.md diff --git a/repos/effect/.changeset/pre/managed-runtime-async-dispose.md b/.changeset/pre/managed-runtime-async-dispose.md similarity index 100% rename from repos/effect/.changeset/pre/managed-runtime-async-dispose.md rename to .changeset/pre/managed-runtime-async-dispose.md diff --git a/repos/effect/.changeset/pre/many-badgers-obey.md b/.changeset/pre/many-badgers-obey.md similarity index 100% rename from repos/effect/.changeset/pre/many-badgers-obey.md rename to .changeset/pre/many-badgers-obey.md diff --git a/repos/effect/.changeset/pre/match-generic-value-terminals.md b/.changeset/pre/match-generic-value-terminals.md similarity index 100% rename from repos/effect/.changeset/pre/match-generic-value-terminals.md rename to .changeset/pre/match-generic-value-terminals.md diff --git a/repos/effect/.changeset/pre/mcp-http-initialize-version-header.md b/.changeset/pre/mcp-http-initialize-version-header.md similarity index 100% rename from repos/effect/.changeset/pre/mcp-http-initialize-version-header.md rename to .changeset/pre/mcp-http-initialize-version-header.md diff --git a/repos/effect/.changeset/pre/mcp-http-resource-template-origins.md b/.changeset/pre/mcp-http-resource-template-origins.md similarity index 100% rename from repos/effect/.changeset/pre/mcp-http-resource-template-origins.md rename to .changeset/pre/mcp-http-resource-template-origins.md diff --git a/repos/effect/.changeset/pre/mcp-prompt-decoded-parameter-types.md b/.changeset/pre/mcp-prompt-decoded-parameter-types.md similarity index 100% rename from repos/effect/.changeset/pre/mcp-prompt-decoded-parameter-types.md rename to .changeset/pre/mcp-prompt-decoded-parameter-types.md diff --git a/repos/effect/.changeset/pre/mcp-protocol-versions.md b/.changeset/pre/mcp-protocol-versions.md similarity index 100% rename from repos/effect/.changeset/pre/mcp-protocol-versions.md rename to .changeset/pre/mcp-protocol-versions.md diff --git a/repos/effect/.changeset/pre/mcp-structured-content-object.md b/.changeset/pre/mcp-structured-content-object.md similarity index 100% rename from repos/effect/.changeset/pre/mcp-structured-content-object.md rename to .changeset/pre/mcp-structured-content-object.md diff --git a/repos/effect/.changeset/pre/mcp-tool-output-schema.md b/.changeset/pre/mcp-tool-output-schema.md similarity index 100% rename from repos/effect/.changeset/pre/mcp-tool-output-schema.md rename to .changeset/pre/mcp-tool-output-schema.md diff --git a/repos/effect/.changeset/pre/mean-dingos-share.md b/.changeset/pre/mean-dingos-share.md similarity index 100% rename from repos/effect/.changeset/pre/mean-dingos-share.md rename to .changeset/pre/mean-dingos-share.md diff --git a/repos/effect/.changeset/pre/mean-trains-smash.md b/.changeset/pre/mean-trains-smash.md similarity index 100% rename from repos/effect/.changeset/pre/mean-trains-smash.md rename to .changeset/pre/mean-trains-smash.md diff --git a/repos/effect/.changeset/pre/memoize-idempotent-asts.md b/.changeset/pre/memoize-idempotent-asts.md similarity index 100% rename from repos/effect/.changeset/pre/memoize-idempotent-asts.md rename to .changeset/pre/memoize-idempotent-asts.md diff --git a/repos/effect/.changeset/pre/memory-message-storage-clear-controls.md b/.changeset/pre/memory-message-storage-clear-controls.md similarity index 100% rename from repos/effect/.changeset/pre/memory-message-storage-clear-controls.md rename to .changeset/pre/memory-message-storage-clear-controls.md diff --git a/repos/effect/.changeset/pre/merge-resource-failures.md b/.changeset/pre/merge-resource-failures.md similarity index 100% rename from repos/effect/.changeset/pre/merge-resource-failures.md rename to .changeset/pre/merge-resource-failures.md diff --git a/repos/effect/.changeset/pre/metal-nails-sneeze.md b/.changeset/pre/metal-nails-sneeze.md similarity index 100% rename from repos/effect/.changeset/pre/metal-nails-sneeze.md rename to .changeset/pre/metal-nails-sneeze.md diff --git a/repos/effect/.changeset/pre/metal-parts-yell.md b/.changeset/pre/metal-parts-yell.md similarity index 100% rename from repos/effect/.changeset/pre/metal-parts-yell.md rename to .changeset/pre/metal-parts-yell.md diff --git a/repos/effect/.changeset/pre/metric-attribute-order-identity.md b/.changeset/pre/metric-attribute-order-identity.md similarity index 100% rename from repos/effect/.changeset/pre/metric-attribute-order-identity.md rename to .changeset/pre/metric-attribute-order-identity.md diff --git a/repos/effect/.changeset/pre/metric-registry-isolation.md b/.changeset/pre/metric-registry-isolation.md similarity index 100% rename from repos/effect/.changeset/pre/metric-registry-isolation.md rename to .changeset/pre/metric-registry-isolation.md diff --git a/repos/effect/.changeset/pre/mighty-games-matter.md b/.changeset/pre/mighty-games-matter.md similarity index 100% rename from repos/effect/.changeset/pre/mighty-games-matter.md rename to .changeset/pre/mighty-games-matter.md diff --git a/repos/effect/.changeset/pre/migrate-persisted-queues.md b/.changeset/pre/migrate-persisted-queues.md similarity index 100% rename from repos/effect/.changeset/pre/migrate-persisted-queues.md rename to .changeset/pre/migrate-persisted-queues.md diff --git a/repos/effect/.changeset/pre/migrator-windows-file-url.md b/.changeset/pre/migrator-windows-file-url.md similarity index 100% rename from repos/effect/.changeset/pre/migrator-windows-file-url.md rename to .changeset/pre/migrator-windows-file-url.md diff --git a/repos/effect/.changeset/pre/model-field-option-undefined.md b/.changeset/pre/model-field-option-undefined.md similarity index 100% rename from repos/effect/.changeset/pre/model-field-option-undefined.md rename to .changeset/pre/model-field-option-undefined.md diff --git a/repos/effect/.changeset/pre/modern-carrots-see.md b/.changeset/pre/modern-carrots-see.md similarity index 100% rename from repos/effect/.changeset/pre/modern-carrots-see.md rename to .changeset/pre/modern-carrots-see.md diff --git a/repos/effect/.changeset/pre/modern-uuid-guid-filter.md b/.changeset/pre/modern-uuid-guid-filter.md similarity index 100% rename from repos/effect/.changeset/pre/modern-uuid-guid-filter.md rename to .changeset/pre/modern-uuid-guid-filter.md diff --git a/repos/effect/.changeset/pre/mssql-binary-parameters.md b/.changeset/pre/mssql-binary-parameters.md similarity index 100% rename from repos/effect/.changeset/pre/mssql-binary-parameters.md rename to .changeset/pre/mssql-binary-parameters.md diff --git a/repos/effect/.changeset/pre/mssql-ntlm-domain.md b/.changeset/pre/mssql-ntlm-domain.md similarity index 100% rename from repos/effect/.changeset/pre/mssql-ntlm-domain.md rename to .changeset/pre/mssql-ntlm-domain.md diff --git a/repos/effect/.changeset/pre/multipart-collect-linear.md b/.changeset/pre/multipart-collect-linear.md similarity index 100% rename from repos/effect/.changeset/pre/multipart-collect-linear.md rename to .changeset/pre/multipart-collect-linear.md diff --git a/repos/effect/.changeset/pre/multipart-onDone-clobbers-error.md b/.changeset/pre/multipart-onDone-clobbers-error.md similarity index 100% rename from repos/effect/.changeset/pre/multipart-onDone-clobbers-error.md rename to .changeset/pre/multipart-onDone-clobbers-error.md diff --git a/repos/effect/.changeset/pre/multipart-parser-limits.md b/.changeset/pre/multipart-parser-limits.md similarity index 100% rename from repos/effect/.changeset/pre/multipart-parser-limits.md rename to .changeset/pre/multipart-parser-limits.md diff --git a/repos/effect/.changeset/pre/multipart-streamed-part-guard.md b/.changeset/pre/multipart-streamed-part-guard.md similarity index 100% rename from repos/effect/.changeset/pre/multipart-streamed-part-guard.md rename to .changeset/pre/multipart-streamed-part-guard.md diff --git a/repos/effect/.changeset/pre/mutable-arrays-preserve.md b/.changeset/pre/mutable-arrays-preserve.md similarity index 100% rename from repos/effect/.changeset/pre/mutable-arrays-preserve.md rename to .changeset/pre/mutable-arrays-preserve.md diff --git a/repos/effect/.changeset/pre/mutable-list-bulk-prepend-tail.md b/.changeset/pre/mutable-list-bulk-prepend-tail.md similarity index 100% rename from repos/effect/.changeset/pre/mutable-list-bulk-prepend-tail.md rename to .changeset/pre/mutable-list-bulk-prepend-tail.md diff --git a/repos/effect/.changeset/pre/mysql2-disable-prepared-statements.md b/.changeset/pre/mysql2-disable-prepared-statements.md similarity index 100% rename from repos/effect/.changeset/pre/mysql2-disable-prepared-statements.md rename to .changeset/pre/mysql2-disable-prepared-statements.md diff --git a/repos/effect/.changeset/pre/name-random-services.md b/.changeset/pre/name-random-services.md similarity index 100% rename from repos/effect/.changeset/pre/name-random-services.md rename to .changeset/pre/name-random-services.md diff --git a/repos/effect/.changeset/pre/narrow-schedule-while.md b/.changeset/pre/narrow-schedule-while.md similarity index 100% rename from repos/effect/.changeset/pre/narrow-schedule-while.md rename to .changeset/pre/narrow-schedule-while.md diff --git a/repos/effect/.changeset/pre/nasty-geese-grow.md b/.changeset/pre/nasty-geese-grow.md similarity index 100% rename from repos/effect/.changeset/pre/nasty-geese-grow.md rename to .changeset/pre/nasty-geese-grow.md diff --git a/repos/effect/.changeset/pre/neat-goats-wave.md b/.changeset/pre/neat-goats-wave.md similarity index 100% rename from repos/effect/.changeset/pre/neat-goats-wave.md rename to .changeset/pre/neat-goats-wave.md diff --git a/repos/effect/.changeset/pre/neat-graphs-induced.md b/.changeset/pre/neat-graphs-induced.md similarity index 100% rename from repos/effect/.changeset/pre/neat-graphs-induced.md rename to .changeset/pre/neat-graphs-induced.md diff --git a/repos/effect/.changeset/pre/neat-kings-chew.md b/.changeset/pre/neat-kings-chew.md similarity index 100% rename from repos/effect/.changeset/pre/neat-kings-chew.md rename to .changeset/pre/neat-kings-chew.md diff --git a/repos/effect/.changeset/pre/neat-lions-rest.md b/.changeset/pre/neat-lions-rest.md similarity index 100% rename from repos/effect/.changeset/pre/neat-lions-rest.md rename to .changeset/pre/neat-lions-rest.md diff --git a/repos/effect/.changeset/pre/neat-pandas-query.md b/.changeset/pre/neat-pandas-query.md similarity index 100% rename from repos/effect/.changeset/pre/neat-pandas-query.md rename to .changeset/pre/neat-pandas-query.md diff --git a/repos/effect/.changeset/pre/neat-snails-wash.md b/.changeset/pre/neat-snails-wash.md similarity index 100% rename from repos/effect/.changeset/pre/neat-snails-wash.md rename to .changeset/pre/neat-snails-wash.md diff --git a/repos/effect/.changeset/pre/neat-taxis-notice.md b/.changeset/pre/neat-taxis-notice.md similarity index 100% rename from repos/effect/.changeset/pre/neat-taxis-notice.md rename to .changeset/pre/neat-taxis-notice.md diff --git a/repos/effect/.changeset/pre/neat-tuples-remember.md b/.changeset/pre/neat-tuples-remember.md similarity index 100% rename from repos/effect/.changeset/pre/neat-tuples-remember.md rename to .changeset/pre/neat-tuples-remember.md diff --git a/repos/effect/.changeset/pre/neat-windows-buy.md b/.changeset/pre/neat-windows-buy.md similarity index 100% rename from repos/effect/.changeset/pre/neat-windows-buy.md rename to .changeset/pre/neat-windows-buy.md diff --git a/repos/effect/.changeset/pre/nested-union-sentinels.md b/.changeset/pre/nested-union-sentinels.md similarity index 100% rename from repos/effect/.changeset/pre/nested-union-sentinels.md rename to .changeset/pre/nested-union-sentinels.md diff --git a/repos/effect/.changeset/pre/net-address-values.md b/.changeset/pre/net-address-values.md similarity index 100% rename from repos/effect/.changeset/pre/net-address-values.md rename to .changeset/pre/net-address-values.md diff --git a/repos/effect/.changeset/pre/new-dogs-swim.md b/.changeset/pre/new-dogs-swim.md similarity index 100% rename from repos/effect/.changeset/pre/new-dogs-swim.md rename to .changeset/pre/new-dogs-swim.md diff --git a/repos/effect/.changeset/pre/new-toes-stop.md b/.changeset/pre/new-toes-stop.md similarity index 100% rename from repos/effect/.changeset/pre/new-toes-stop.md rename to .changeset/pre/new-toes-stop.md diff --git a/repos/effect/.changeset/pre/ninety-books-sit.md b/.changeset/pre/ninety-books-sit.md similarity index 100% rename from repos/effect/.changeset/pre/ninety-books-sit.md rename to .changeset/pre/ninety-books-sit.md diff --git a/repos/effect/.changeset/pre/ninety-geese-exist.md b/.changeset/pre/ninety-geese-exist.md similarity index 100% rename from repos/effect/.changeset/pre/ninety-geese-exist.md rename to .changeset/pre/ninety-geese-exist.md diff --git a/repos/effect/.changeset/pre/node-http-status-text.md b/.changeset/pre/node-http-status-text.md similarity index 100% rename from repos/effect/.changeset/pre/node-http-status-text.md rename to .changeset/pre/node-http-status-text.md diff --git a/repos/effect/.changeset/pre/node-redis-client.md b/.changeset/pre/node-redis-client.md similarity index 100% rename from repos/effect/.changeset/pre/node-redis-client.md rename to .changeset/pre/node-redis-client.md diff --git a/repos/effect/.changeset/pre/node-response-preserve-bytes.md b/.changeset/pre/node-response-preserve-bytes.md similarity index 100% rename from repos/effect/.changeset/pre/node-response-preserve-bytes.md rename to .changeset/pre/node-response-preserve-bytes.md diff --git a/repos/effect/.changeset/pre/node-sink-cancel-drain.md b/.changeset/pre/node-sink-cancel-drain.md similarity index 100% rename from repos/effect/.changeset/pre/node-sink-cancel-drain.md rename to .changeset/pre/node-sink-cancel-drain.md diff --git a/repos/effect/.changeset/pre/node-sink-finalization-errors.md b/.changeset/pre/node-sink-finalization-errors.md similarity index 100% rename from repos/effect/.changeset/pre/node-sink-finalization-errors.md rename to .changeset/pre/node-sink-finalization-errors.md diff --git a/repos/effect/.changeset/pre/node-stream-buffer-size.md b/.changeset/pre/node-stream-buffer-size.md similarity index 100% rename from repos/effect/.changeset/pre/node-stream-buffer-size.md rename to .changeset/pre/node-stream-buffer-size.md diff --git a/repos/effect/.changeset/pre/node-terminal-idle-ttl.md b/.changeset/pre/node-terminal-idle-ttl.md similarity index 100% rename from repos/effect/.changeset/pre/node-terminal-idle-ttl.md rename to .changeset/pre/node-terminal-idle-ttl.md diff --git a/repos/effect/.changeset/pre/node-terminal-stdin-eof.md b/.changeset/pre/node-terminal-stdin-eof.md similarity index 100% rename from repos/effect/.changeset/pre/node-terminal-stdin-eof.md rename to .changeset/pre/node-terminal-stdin-eof.md diff --git a/repos/effect/.changeset/pre/node-watch-relative.md b/.changeset/pre/node-watch-relative.md similarity index 100% rename from repos/effect/.changeset/pre/node-watch-relative.md rename to .changeset/pre/node-watch-relative.md diff --git a/repos/effect/.changeset/pre/node-worker-unsafe-send-envelope.md b/.changeset/pre/node-worker-unsafe-send-envelope.md similarity index 100% rename from repos/effect/.changeset/pre/node-worker-unsafe-send-envelope.md rename to .changeset/pre/node-worker-unsafe-send-envelope.md diff --git a/repos/effect/.changeset/pre/node-writeall-empty.md b/.changeset/pre/node-writeall-empty.md similarity index 100% rename from repos/effect/.changeset/pre/node-writeall-empty.md rename to .changeset/pre/node-writeall-empty.md diff --git a/repos/effect/.changeset/pre/normalize-collection-counts.md b/.changeset/pre/normalize-collection-counts.md similarity index 100% rename from repos/effect/.changeset/pre/normalize-collection-counts.md rename to .changeset/pre/normalize-collection-counts.md diff --git a/repos/effect/.changeset/pre/normalize-httpapi-payload-media-types.md b/.changeset/pre/normalize-httpapi-payload-media-types.md similarity index 100% rename from repos/effect/.changeset/pre/normalize-httpapi-payload-media-types.md rename to .changeset/pre/normalize-httpapi-payload-media-types.md diff --git a/repos/effect/.changeset/pre/normalize-unbounded-pubsub-replay.md b/.changeset/pre/normalize-unbounded-pubsub-replay.md similarity index 100% rename from repos/effect/.changeset/pre/normalize-unbounded-pubsub-replay.md rename to .changeset/pre/normalize-unbounded-pubsub-replay.md diff --git a/repos/effect/.changeset/pre/number-remainder-negative-zero-dividend.md b/.changeset/pre/number-remainder-negative-zero-dividend.md similarity index 100% rename from repos/effect/.changeset/pre/number-remainder-negative-zero-dividend.md rename to .changeset/pre/number-remainder-negative-zero-dividend.md diff --git a/repos/effect/.changeset/pre/o8drprcu-sqlite-node-node-sqlite.md b/.changeset/pre/o8drprcu-sqlite-node-node-sqlite.md similarity index 100% rename from repos/effect/.changeset/pre/o8drprcu-sqlite-node-node-sqlite.md rename to .changeset/pre/o8drprcu-sqlite-node-node-sqlite.md diff --git a/repos/effect/.changeset/pre/odd-boats-think.md b/.changeset/pre/odd-boats-think.md similarity index 100% rename from repos/effect/.changeset/pre/odd-boats-think.md rename to .changeset/pre/odd-boats-think.md diff --git a/repos/effect/.changeset/pre/odd-bulldogs-sleep.md b/.changeset/pre/odd-bulldogs-sleep.md similarity index 100% rename from repos/effect/.changeset/pre/odd-bulldogs-sleep.md rename to .changeset/pre/odd-bulldogs-sleep.md diff --git a/repos/effect/.changeset/pre/odd-fans-glow.md b/.changeset/pre/odd-fans-glow.md similarity index 100% rename from repos/effect/.changeset/pre/odd-fans-glow.md rename to .changeset/pre/odd-fans-glow.md diff --git a/repos/effect/.changeset/pre/odd-forks-talk.md b/.changeset/pre/odd-forks-talk.md similarity index 100% rename from repos/effect/.changeset/pre/odd-forks-talk.md rename to .changeset/pre/odd-forks-talk.md diff --git a/repos/effect/.changeset/pre/odd-laws-draw.md b/.changeset/pre/odd-laws-draw.md similarity index 100% rename from repos/effect/.changeset/pre/odd-laws-draw.md rename to .changeset/pre/odd-laws-draw.md diff --git a/repos/effect/.changeset/pre/odd-owls-smoke.md b/.changeset/pre/odd-owls-smoke.md similarity index 100% rename from repos/effect/.changeset/pre/odd-owls-smoke.md rename to .changeset/pre/odd-owls-smoke.md diff --git a/repos/effect/.changeset/pre/odd-socks-boil.md b/.changeset/pre/odd-socks-boil.md similarity index 100% rename from repos/effect/.changeset/pre/odd-socks-boil.md rename to .changeset/pre/odd-socks-boil.md diff --git a/repos/effect/.changeset/pre/odd-suns-dance.md b/.changeset/pre/odd-suns-dance.md similarity index 100% rename from repos/effect/.changeset/pre/odd-suns-dance.md rename to .changeset/pre/odd-suns-dance.md diff --git a/repos/effect/.changeset/pre/old-brooms-cry.md b/.changeset/pre/old-brooms-cry.md similarity index 100% rename from repos/effect/.changeset/pre/old-brooms-cry.md rename to .changeset/pre/old-brooms-cry.md diff --git a/repos/effect/.changeset/pre/old-facts-stand.md b/.changeset/pre/old-facts-stand.md similarity index 100% rename from repos/effect/.changeset/pre/old-facts-stand.md rename to .changeset/pre/old-facts-stand.md diff --git a/repos/effect/.changeset/pre/old-mirrors-float.md b/.changeset/pre/old-mirrors-float.md similarity index 100% rename from repos/effect/.changeset/pre/old-mirrors-float.md rename to .changeset/pre/old-mirrors-float.md diff --git a/repos/effect/.changeset/pre/olive-poems-visit.md b/.changeset/pre/olive-poems-visit.md similarity index 100% rename from repos/effect/.changeset/pre/olive-poems-visit.md rename to .changeset/pre/olive-poems-visit.md diff --git a/repos/effect/.changeset/pre/olive-queues-persist.md b/.changeset/pre/olive-queues-persist.md similarity index 100% rename from repos/effect/.changeset/pre/olive-queues-persist.md rename to .changeset/pre/olive-queues-persist.md diff --git a/repos/effect/.changeset/pre/opaque-graph-interface.md b/.changeset/pre/opaque-graph-interface.md similarity index 100% rename from repos/effect/.changeset/pre/opaque-graph-interface.md rename to .changeset/pre/opaque-graph-interface.md diff --git a/repos/effect/.changeset/pre/open-hotels-remain.md b/.changeset/pre/open-hotels-remain.md similarity index 100% rename from repos/effect/.changeset/pre/open-hotels-remain.md rename to .changeset/pre/open-hotels-remain.md diff --git a/repos/effect/.changeset/pre/open-objects-intersect.md b/.changeset/pre/open-objects-intersect.md similarity index 100% rename from repos/effect/.changeset/pre/open-objects-intersect.md rename to .changeset/pre/open-objects-intersect.md diff --git a/repos/effect/.changeset/pre/openai-compat-decode-tool-params.md b/.changeset/pre/openai-compat-decode-tool-params.md similarity index 100% rename from repos/effect/.changeset/pre/openai-compat-decode-tool-params.md rename to .changeset/pre/openai-compat-decode-tool-params.md diff --git a/repos/effect/.changeset/pre/openai-compat-empty-assistant-content.md b/.changeset/pre/openai-compat-empty-assistant-content.md similarity index 100% rename from repos/effect/.changeset/pre/openai-compat-empty-assistant-content.md rename to .changeset/pre/openai-compat-empty-assistant-content.md diff --git a/repos/effect/.changeset/pre/openai-compat-null-tool-calls.md b/.changeset/pre/openai-compat-null-tool-calls.md similarity index 100% rename from repos/effect/.changeset/pre/openai-compat-null-tool-calls.md rename to .changeset/pre/openai-compat-null-tool-calls.md diff --git a/repos/effect/.changeset/pre/openai-compat-nullable-tool-name.md b/.changeset/pre/openai-compat-nullable-tool-name.md similarity index 100% rename from repos/effect/.changeset/pre/openai-compat-nullable-tool-name.md rename to .changeset/pre/openai-compat-nullable-tool-name.md diff --git a/repos/effect/.changeset/pre/openai-compat-parallel-tool-calls.md b/.changeset/pre/openai-compat-parallel-tool-calls.md similarity index 100% rename from repos/effect/.changeset/pre/openai-compat-parallel-tool-calls.md rename to .changeset/pre/openai-compat-parallel-tool-calls.md diff --git a/repos/effect/.changeset/pre/openai-compat-reasoning.md b/.changeset/pre/openai-compat-reasoning.md similarity index 100% rename from repos/effect/.changeset/pre/openai-compat-reasoning.md rename to .changeset/pre/openai-compat-reasoning.md diff --git a/repos/effect/.changeset/pre/openai-compatible-quota-errors.md b/.changeset/pre/openai-compatible-quota-errors.md similarity index 100% rename from repos/effect/.changeset/pre/openai-compatible-quota-errors.md rename to .changeset/pre/openai-compatible-quota-errors.md diff --git a/repos/effect/.changeset/pre/openai-image-strings.md b/.changeset/pre/openai-image-strings.md similarity index 100% rename from repos/effect/.changeset/pre/openai-image-strings.md rename to .changeset/pre/openai-image-strings.md diff --git a/repos/effect/.changeset/pre/openai-optional-sequence-number.md b/.changeset/pre/openai-optional-sequence-number.md similarity index 100% rename from repos/effect/.changeset/pre/openai-optional-sequence-number.md rename to .changeset/pre/openai-optional-sequence-number.md diff --git a/repos/effect/.changeset/pre/openai-telemetry-response.md b/.changeset/pre/openai-telemetry-response.md similarity index 100% rename from repos/effect/.changeset/pre/openai-telemetry-response.md rename to .changeset/pre/openai-telemetry-response.md diff --git a/repos/effect/.changeset/pre/openai-text-prompt-cache.md b/.changeset/pre/openai-text-prompt-cache.md similarity index 100% rename from repos/effect/.changeset/pre/openai-text-prompt-cache.md rename to .changeset/pre/openai-text-prompt-cache.md diff --git a/repos/effect/.changeset/pre/openai-tolerant-error-stream-event.md b/.changeset/pre/openai-tolerant-error-stream-event.md similarity index 100% rename from repos/effect/.changeset/pre/openai-tolerant-error-stream-event.md rename to .changeset/pre/openai-tolerant-error-stream-event.md diff --git a/repos/effect/.changeset/pre/openai-web-search-outcomes.md b/.changeset/pre/openai-web-search-outcomes.md similarity index 100% rename from repos/effect/.changeset/pre/openai-web-search-outcomes.md rename to .changeset/pre/openai-web-search-outcomes.md diff --git a/repos/effect/.changeset/pre/openapi-generator-sse-constraint-decoder.md b/.changeset/pre/openapi-generator-sse-constraint-decoder.md similarity index 100% rename from repos/effect/.changeset/pre/openapi-generator-sse-constraint-decoder.md rename to .changeset/pre/openapi-generator-sse-constraint-decoder.md diff --git a/repos/effect/.changeset/pre/openapi-omitted-additional-properties.md b/.changeset/pre/openapi-omitted-additional-properties.md similarity index 100% rename from repos/effect/.changeset/pre/openapi-omitted-additional-properties.md rename to .changeset/pre/openapi-omitted-additional-properties.md diff --git a/repos/effect/.changeset/pre/openapi-path-parameters.md b/.changeset/pre/openapi-path-parameters.md similarity index 100% rename from repos/effect/.changeset/pre/openapi-path-parameters.md rename to .changeset/pre/openapi-path-parameters.md diff --git a/repos/effect/.changeset/pre/openapi-pointer-references.md b/.changeset/pre/openapi-pointer-references.md similarity index 100% rename from repos/effect/.changeset/pre/openapi-pointer-references.md rename to .changeset/pre/openapi-pointer-references.md diff --git a/repos/effect/.changeset/pre/openapi-response-variants.md b/.changeset/pre/openapi-response-variants.md similarity index 100% rename from repos/effect/.changeset/pre/openapi-response-variants.md rename to .changeset/pre/openapi-response-variants.md diff --git a/repos/effect/.changeset/pre/openrouter-disjoint-usage-details.md b/.changeset/pre/openrouter-disjoint-usage-details.md similarity index 100% rename from repos/effect/.changeset/pre/openrouter-disjoint-usage-details.md rename to .changeset/pre/openrouter-disjoint-usage-details.md diff --git a/repos/effect/.changeset/pre/openrouter-encrypted-tool-finish.md b/.changeset/pre/openrouter-encrypted-tool-finish.md similarity index 100% rename from repos/effect/.changeset/pre/openrouter-encrypted-tool-finish.md rename to .changeset/pre/openrouter-encrypted-tool-finish.md diff --git a/repos/effect/.changeset/pre/openrouter-generation-usage-schema.md b/.changeset/pre/openrouter-generation-usage-schema.md similarity index 100% rename from repos/effect/.changeset/pre/openrouter-generation-usage-schema.md rename to .changeset/pre/openrouter-generation-usage-schema.md diff --git a/repos/effect/.changeset/pre/openrouter-input-audio.md b/.changeset/pre/openrouter-input-audio.md similarity index 100% rename from repos/effect/.changeset/pre/openrouter-input-audio.md rename to .changeset/pre/openrouter-input-audio.md diff --git a/repos/effect/.changeset/pre/openrouter-strict-json-schema.md b/.changeset/pre/openrouter-strict-json-schema.md similarity index 100% rename from repos/effect/.changeset/pre/openrouter-strict-json-schema.md rename to .changeset/pre/openrouter-strict-json-schema.md diff --git a/repos/effect/.changeset/pre/openrouter-tool-parameter-deltas.md b/.changeset/pre/openrouter-tool-parameter-deltas.md similarity index 100% rename from repos/effect/.changeset/pre/openrouter-tool-parameter-deltas.md rename to .changeset/pre/openrouter-tool-parameter-deltas.md diff --git a/repos/effect/.changeset/pre/opentelemetry-delta-interval-starts.md b/.changeset/pre/opentelemetry-delta-interval-starts.md similarity index 100% rename from repos/effect/.changeset/pre/opentelemetry-delta-interval-starts.md rename to .changeset/pre/opentelemetry-delta-interval-starts.md diff --git a/repos/effect/.changeset/pre/opentelemetry-render-causes.md b/.changeset/pre/opentelemetry-render-causes.md similarity index 100% rename from repos/effect/.changeset/pre/opentelemetry-render-causes.md rename to .changeset/pre/opentelemetry-render-causes.md diff --git a/repos/effect/.changeset/pre/optic-projection-replacement.md b/.changeset/pre/optic-projection-replacement.md similarity index 100% rename from repos/effect/.changeset/pre/optic-projection-replacement.md rename to .changeset/pre/optic-projection-replacement.md diff --git a/repos/effect/.changeset/pre/optic-standalone-functions.md b/.changeset/pre/optic-standalone-functions.md similarity index 100% rename from repos/effect/.changeset/pre/optic-standalone-functions.md rename to .changeset/pre/optic-standalone-functions.md diff --git a/repos/effect/.changeset/pre/optic-string-index-delete.md b/.changeset/pre/optic-string-index-delete.md similarity index 100% rename from repos/effect/.changeset/pre/optic-string-index-delete.md rename to .changeset/pre/optic-string-index-delete.md diff --git a/repos/effect/.changeset/pre/optimize-array-equality.md b/.changeset/pre/optimize-array-equality.md similarity index 100% rename from repos/effect/.changeset/pre/optimize-array-equality.md rename to .changeset/pre/optimize-array-equality.md diff --git a/repos/effect/.changeset/pre/optimize-httpapi-handler-types.md b/.changeset/pre/optimize-httpapi-handler-types.md similarity index 100% rename from repos/effect/.changeset/pre/optimize-httpapi-handler-types.md rename to .changeset/pre/optimize-httpapi-handler-types.md diff --git a/repos/effect/.changeset/pre/optimize-node-http-server-response.md b/.changeset/pre/optimize-node-http-server-response.md similarity index 100% rename from repos/effect/.changeset/pre/optimize-node-http-server-response.md rename to .changeset/pre/optimize-node-http-server-response.md diff --git a/repos/effect/.changeset/pre/optimize-schema-class-decoding.md b/.changeset/pre/optimize-schema-class-decoding.md similarity index 100% rename from repos/effect/.changeset/pre/optimize-schema-class-decoding.md rename to .changeset/pre/optimize-schema-class-decoding.md diff --git a/repos/effect/.changeset/pre/optional-ai-embedding-usage.md b/.changeset/pre/optional-ai-embedding-usage.md similarity index 100% rename from repos/effect/.changeset/pre/optional-ai-embedding-usage.md rename to .changeset/pre/optional-ai-embedding-usage.md diff --git a/repos/effect/.changeset/pre/optional-ai-response-fields.md b/.changeset/pre/optional-ai-response-fields.md similarity index 100% rename from repos/effect/.changeset/pre/optional-ai-response-fields.md rename to .changeset/pre/optional-ai-response-fields.md diff --git a/repos/effect/.changeset/pre/order-consumed-criteria.md b/.changeset/pre/order-consumed-criteria.md similarity index 100% rename from repos/effect/.changeset/pre/order-consumed-criteria.md rename to .changeset/pre/order-consumed-criteria.md diff --git a/repos/effect/.changeset/pre/otel-resource-env-precedence.md b/.changeset/pre/otel-resource-env-precedence.md similarity index 100% rename from repos/effect/.changeset/pre/otel-resource-env-precedence.md rename to .changeset/pre/otel-resource-env-precedence.md diff --git a/repos/effect/.changeset/pre/otlp-disabled-batch-flush.md b/.changeset/pre/otlp-disabled-batch-flush.md similarity index 100% rename from repos/effect/.changeset/pre/otlp-disabled-batch-flush.md rename to .changeset/pre/otlp-disabled-batch-flush.md diff --git a/repos/effect/.changeset/pre/otlp-tracer-span-performance.md b/.changeset/pre/otlp-tracer-span-performance.md similarity index 100% rename from repos/effect/.changeset/pre/otlp-tracer-span-performance.md rename to .changeset/pre/otlp-tracer-span-performance.md diff --git a/.changeset/pre/parameterize-persistence-lookup-keys.md b/.changeset/pre/parameterize-persistence-lookup-keys.md new file mode 100644 index 000000000..92960c36a --- /dev/null +++ b/.changeset/pre/parameterize-persistence-lookup-keys.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +Parameterize persistence lookup keys in both SQL backing stores' `getMany` queries. diff --git a/repos/effect/.changeset/pre/partitioned-semaphore-stale-cleanup.md b/.changeset/pre/partitioned-semaphore-stale-cleanup.md similarity index 100% rename from repos/effect/.changeset/pre/partitioned-semaphore-stale-cleanup.md rename to .changeset/pre/partitioned-semaphore-stale-cleanup.md diff --git a/repos/effect/.changeset/pre/perfect-buckets-tickle.md b/.changeset/pre/perfect-buckets-tickle.md similarity index 100% rename from repos/effect/.changeset/pre/perfect-buckets-tickle.md rename to .changeset/pre/perfect-buckets-tickle.md diff --git a/repos/effect/.changeset/pre/persisted-cache-lookup-throw.md b/.changeset/pre/persisted-cache-lookup-throw.md similarity index 100% rename from repos/effect/.changeset/pre/persisted-cache-lookup-throw.md rename to .changeset/pre/persisted-cache-lookup-throw.md diff --git a/repos/effect/.changeset/pre/petite-months-allow.md b/.changeset/pre/petite-months-allow.md similarity index 100% rename from repos/effect/.changeset/pre/petite-months-allow.md rename to .changeset/pre/petite-months-allow.md diff --git a/repos/effect/.changeset/pre/pg-client-connect-error-handler.md b/.changeset/pre/pg-client-connect-error-handler.md similarity index 100% rename from repos/effect/.changeset/pre/pg-client-connect-error-handler.md rename to .changeset/pre/pg-client-connect-error-handler.md diff --git a/repos/effect/.changeset/pre/pg-explicit-ssl-precedence.md b/.changeset/pre/pg-explicit-ssl-precedence.md similarity index 100% rename from repos/effect/.changeset/pre/pg-explicit-ssl-precedence.md rename to .changeset/pre/pg-explicit-ssl-precedence.md diff --git a/repos/effect/.changeset/pre/pglite-json-string-values.md b/.changeset/pre/pglite-json-string-values.md similarity index 100% rename from repos/effect/.changeset/pre/pglite-json-string-values.md rename to .changeset/pre/pglite-json-string-values.md diff --git a/repos/effect/.changeset/pre/pipeline-root-stdin.md b/.changeset/pre/pipeline-root-stdin.md similarity index 100% rename from repos/effect/.changeset/pre/pipeline-root-stdin.md rename to .changeset/pre/pipeline-root-stdin.md diff --git a/repos/effect/.changeset/pre/plain-tool-results.md b/.changeset/pre/plain-tool-results.md similarity index 100% rename from repos/effect/.changeset/pre/plain-tool-results.md rename to .changeset/pre/plain-tool-results.md diff --git a/repos/effect/.changeset/pre/plain-variant-unions.md b/.changeset/pre/plain-variant-unions.md similarity index 100% rename from repos/effect/.changeset/pre/plain-variant-unions.md rename to .changeset/pre/plain-variant-unions.md diff --git a/repos/effect/.changeset/pre/platform-crypto-service.md b/.changeset/pre/platform-crypto-service.md similarity index 100% rename from repos/effect/.changeset/pre/platform-crypto-service.md rename to .changeset/pre/platform-crypto-service.md diff --git a/repos/effect/.changeset/pre/platform-node-shared-barrel.md b/.changeset/pre/platform-node-shared-barrel.md similarity index 100% rename from repos/effect/.changeset/pre/platform-node-shared-barrel.md rename to .changeset/pre/platform-node-shared-barrel.md diff --git a/repos/effect/.changeset/pre/plenty-moons-pull.md b/.changeset/pre/plenty-moons-pull.md similarity index 100% rename from repos/effect/.changeset/pre/plenty-moons-pull.md rename to .changeset/pre/plenty-moons-pull.md diff --git a/repos/effect/.changeset/pre/polite-brooms-tickle.md b/.changeset/pre/polite-brooms-tickle.md similarity index 100% rename from repos/effect/.changeset/pre/polite-brooms-tickle.md rename to .changeset/pre/polite-brooms-tickle.md diff --git a/repos/effect/.changeset/pre/polite-cameras-rest.md b/.changeset/pre/polite-cameras-rest.md similarity index 100% rename from repos/effect/.changeset/pre/polite-cameras-rest.md rename to .changeset/pre/polite-cameras-rest.md diff --git a/repos/effect/.changeset/pre/polite-dingos-unite.md b/.changeset/pre/polite-dingos-unite.md similarity index 100% rename from repos/effect/.changeset/pre/polite-dingos-unite.md rename to .changeset/pre/polite-dingos-unite.md diff --git a/repos/effect/.changeset/pre/polite-pigs-speak.md b/.changeset/pre/polite-pigs-speak.md similarity index 100% rename from repos/effect/.changeset/pre/polite-pigs-speak.md rename to .changeset/pre/polite-pigs-speak.md diff --git a/repos/effect/.changeset/pre/polite-tables-kneel.md b/.changeset/pre/polite-tables-kneel.md similarity index 100% rename from repos/effect/.changeset/pre/polite-tables-kneel.md rename to .changeset/pre/polite-tables-kneel.md diff --git a/repos/effect/.changeset/pre/pool-preserve-reservations.md b/.changeset/pre/pool-preserve-reservations.md similarity index 100% rename from repos/effect/.changeset/pre/pool-preserve-reservations.md rename to .changeset/pre/pool-preserve-reservations.md diff --git a/repos/effect/.changeset/pre/port-effect-reduce.md b/.changeset/pre/port-effect-reduce.md similarity index 100% rename from repos/effect/.changeset/pre/port-effect-reduce.md rename to .changeset/pre/port-effect-reduce.md diff --git a/repos/effect/.changeset/pre/port-http-api-builder-handler.md b/.changeset/pre/port-http-api-builder-handler.md similarity index 100% rename from repos/effect/.changeset/pre/port-http-api-builder-handler.md rename to .changeset/pre/port-http-api-builder-handler.md diff --git a/repos/effect/.changeset/pre/port-react-hydration.md b/.changeset/pre/port-react-hydration.md similarity index 100% rename from repos/effect/.changeset/pre/port-react-hydration.md rename to .changeset/pre/port-react-hydration.md diff --git a/repos/effect/.changeset/pre/postgres-channel-names.md b/.changeset/pre/postgres-channel-names.md similarity index 100% rename from repos/effect/.changeset/pre/postgres-channel-names.md rename to .changeset/pre/postgres-channel-names.md diff --git a/repos/effect/.changeset/pre/precise-clocks-rest.md b/.changeset/pre/precise-clocks-rest.md similarity index 100% rename from repos/effect/.changeset/pre/precise-clocks-rest.md rename to .changeset/pre/precise-clocks-rest.md diff --git a/repos/effect/.changeset/pre/precise-test-clock-nanos.md b/.changeset/pre/precise-test-clock-nanos.md similarity index 100% rename from repos/effect/.changeset/pre/precise-test-clock-nanos.md rename to .changeset/pre/precise-test-clock-nanos.md diff --git a/repos/effect/.changeset/pre/preserve-command-hidden-metadata.md b/.changeset/pre/preserve-command-hidden-metadata.md similarity index 100% rename from repos/effect/.changeset/pre/preserve-command-hidden-metadata.md rename to .changeset/pre/preserve-command-hidden-metadata.md diff --git a/repos/effect/.changeset/pre/preserve-config-all-input-evidence.md b/.changeset/pre/preserve-config-all-input-evidence.md similarity index 100% rename from repos/effect/.changeset/pre/preserve-config-all-input-evidence.md rename to .changeset/pre/preserve-config-all-input-evidence.md diff --git a/repos/effect/.changeset/pre/preserve-default-variant-class.md b/.changeset/pre/preserve-default-variant-class.md similarity index 100% rename from repos/effect/.changeset/pre/preserve-default-variant-class.md rename to .changeset/pre/preserve-default-variant-class.md diff --git a/repos/effect/.changeset/pre/preserve-negative-counter-deltas.md b/.changeset/pre/preserve-negative-counter-deltas.md similarity index 100% rename from repos/effect/.changeset/pre/preserve-negative-counter-deltas.md rename to .changeset/pre/preserve-negative-counter-deltas.md diff --git a/repos/effect/.changeset/pre/preserve-openapi-raw-json.md b/.changeset/pre/preserve-openapi-raw-json.md similarity index 100% rename from repos/effect/.changeset/pre/preserve-openapi-raw-json.md rename to .changeset/pre/preserve-openapi-raw-json.md diff --git a/repos/effect/.changeset/pre/preserve-otel-parent-context.md b/.changeset/pre/preserve-otel-parent-context.md similarity index 100% rename from repos/effect/.changeset/pre/preserve-otel-parent-context.md rename to .changeset/pre/preserve-otel-parent-context.md diff --git a/repos/effect/.changeset/pre/preserve-unsafe-workflow-interrupts.md b/.changeset/pre/preserve-unsafe-workflow-interrupts.md similarity index 100% rename from repos/effect/.changeset/pre/preserve-unsafe-workflow-interrupts.md rename to .changeset/pre/preserve-unsafe-workflow-interrupts.md diff --git a/repos/effect/.changeset/pre/pretty-moments-clap.md b/.changeset/pre/pretty-moments-clap.md similarity index 100% rename from repos/effect/.changeset/pre/pretty-moments-clap.md rename to .changeset/pre/pretty-moments-clap.md diff --git a/repos/effect/.changeset/pre/principled-collection-counts.md b/.changeset/pre/principled-collection-counts.md similarity index 100% rename from repos/effect/.changeset/pre/principled-collection-counts.md rename to .changeset/pre/principled-collection-counts.md diff --git a/repos/effect/.changeset/pre/prompt-buffer-render.md b/.changeset/pre/prompt-buffer-render.md similarity index 100% rename from repos/effect/.changeset/pre/prompt-buffer-render.md rename to .changeset/pre/prompt-buffer-render.md diff --git a/repos/effect/.changeset/pre/prompt-lossless-text-serialization.md b/.changeset/pre/prompt-lossless-text-serialization.md similarity index 100% rename from repos/effect/.changeset/pre/prompt-lossless-text-serialization.md rename to .changeset/pre/prompt-lossless-text-serialization.md diff --git a/repos/effect/.changeset/pre/prompt-response-files.md b/.changeset/pre/prompt-response-files.md similarity index 100% rename from repos/effect/.changeset/pre/prompt-response-files.md rename to .changeset/pre/prompt-response-files.md diff --git a/repos/effect/.changeset/pre/protect-schema-issue-actuals.md b/.changeset/pre/protect-schema-issue-actuals.md similarity index 100% rename from repos/effect/.changeset/pre/protect-schema-issue-actuals.md rename to .changeset/pre/protect-schema-issue-actuals.md diff --git a/repos/effect/.changeset/pre/proud-ears-say.md b/.changeset/pre/proud-ears-say.md similarity index 100% rename from repos/effect/.changeset/pre/proud-ears-say.md rename to .changeset/pre/proud-ears-say.md diff --git a/repos/effect/.changeset/pre/provider-executed-tool-results.md b/.changeset/pre/provider-executed-tool-results.md similarity index 100% rename from repos/effect/.changeset/pre/provider-executed-tool-results.md rename to .changeset/pre/provider-executed-tool-results.md diff --git a/repos/effect/.changeset/pre/public-deer-ring.md b/.changeset/pre/public-deer-ring.md similarity index 100% rename from repos/effect/.changeset/pre/public-deer-ring.md rename to .changeset/pre/public-deer-ring.md diff --git a/repos/effect/.changeset/pre/public-jeans-stop.md b/.changeset/pre/public-jeans-stop.md similarity index 100% rename from repos/effect/.changeset/pre/public-jeans-stop.md rename to .changeset/pre/public-jeans-stop.md diff --git a/repos/effect/.changeset/pre/pubsub-publish-false.md b/.changeset/pre/pubsub-publish-false.md similarity index 100% rename from repos/effect/.changeset/pre/pubsub-publish-false.md rename to .changeset/pre/pubsub-publish-false.md diff --git a/repos/effect/.changeset/pre/pubsub-sliding-single-subscriber.md b/.changeset/pre/pubsub-sliding-single-subscriber.md similarity index 100% rename from repos/effect/.changeset/pre/pubsub-sliding-single-subscriber.md rename to .changeset/pre/pubsub-sliding-single-subscriber.md diff --git a/repos/effect/.changeset/pre/pull-based-socket.md b/.changeset/pre/pull-based-socket.md similarity index 100% rename from repos/effect/.changeset/pre/pull-based-socket.md rename to .changeset/pre/pull-based-socket.md diff --git a/repos/effect/.changeset/pre/puny-pens-clap.md b/.changeset/pre/puny-pens-clap.md similarity index 100% rename from repos/effect/.changeset/pre/puny-pens-clap.md rename to .changeset/pre/puny-pens-clap.md diff --git a/repos/effect/.changeset/pre/purple-bars-prove.md b/.changeset/pre/purple-bars-prove.md similarity index 100% rename from repos/effect/.changeset/pre/purple-bars-prove.md rename to .changeset/pre/purple-bars-prove.md diff --git a/repos/effect/.changeset/pre/purple-schools-float.md b/.changeset/pre/purple-schools-float.md similarity index 100% rename from repos/effect/.changeset/pre/purple-schools-float.md rename to .changeset/pre/purple-schools-float.md diff --git a/repos/effect/.changeset/pre/purple-turtles-draw.md b/.changeset/pre/purple-turtles-draw.md similarity index 100% rename from repos/effect/.changeset/pre/purple-turtles-draw.md rename to .changeset/pre/purple-turtles-draw.md diff --git a/repos/effect/.changeset/pre/queue-manual-flush.md b/.changeset/pre/queue-manual-flush.md similarity index 100% rename from repos/effect/.changeset/pre/queue-manual-flush.md rename to .changeset/pre/queue-manual-flush.md diff --git a/repos/effect/.changeset/pre/queue-reentrant-producers.md b/.changeset/pre/queue-reentrant-producers.md similarity index 100% rename from repos/effect/.changeset/pre/queue-reentrant-producers.md rename to .changeset/pre/queue-reentrant-producers.md diff --git a/repos/effect/.changeset/pre/quick-dragons-fix.md b/.changeset/pre/quick-dragons-fix.md similarity index 100% rename from repos/effect/.changeset/pre/quick-dragons-fix.md rename to .changeset/pre/quick-dragons-fix.md diff --git a/repos/effect/.changeset/pre/quick-falcons-travel.md b/.changeset/pre/quick-falcons-travel.md similarity index 100% rename from repos/effect/.changeset/pre/quick-falcons-travel.md rename to .changeset/pre/quick-falcons-travel.md diff --git a/repos/effect/.changeset/pre/quick-geese-relax.md b/.changeset/pre/quick-geese-relax.md similarity index 100% rename from repos/effect/.changeset/pre/quick-geese-relax.md rename to .changeset/pre/quick-geese-relax.md diff --git a/repos/effect/.changeset/pre/quick-graphs-paths.md b/.changeset/pre/quick-graphs-paths.md similarity index 100% rename from repos/effect/.changeset/pre/quick-graphs-paths.md rename to .changeset/pre/quick-graphs-paths.md diff --git a/repos/effect/.changeset/pre/quick-kiwis-remember.md b/.changeset/pre/quick-kiwis-remember.md similarity index 100% rename from repos/effect/.changeset/pre/quick-kiwis-remember.md rename to .changeset/pre/quick-kiwis-remember.md diff --git a/repos/effect/.changeset/pre/quick-lamps-dig.md b/.changeset/pre/quick-lamps-dig.md similarity index 100% rename from repos/effect/.changeset/pre/quick-lamps-dig.md rename to .changeset/pre/quick-lamps-dig.md diff --git a/repos/effect/.changeset/pre/quick-lizards-fall.md b/.changeset/pre/quick-lizards-fall.md similarity index 100% rename from repos/effect/.changeset/pre/quick-lizards-fall.md rename to .changeset/pre/quick-lizards-fall.md diff --git a/repos/effect/.changeset/pre/quick-schedulers-promise.md b/.changeset/pre/quick-schedulers-promise.md similarity index 100% rename from repos/effect/.changeset/pre/quick-schedulers-promise.md rename to .changeset/pre/quick-schedulers-promise.md diff --git a/repos/effect/.changeset/pre/quick-trees-join.md b/.changeset/pre/quick-trees-join.md similarity index 100% rename from repos/effect/.changeset/pre/quick-trees-join.md rename to .changeset/pre/quick-trees-join.md diff --git a/repos/effect/.changeset/pre/quiet-buffers-decode.md b/.changeset/pre/quiet-buffers-decode.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-buffers-decode.md rename to .changeset/pre/quiet-buffers-decode.md diff --git a/repos/effect/.changeset/pre/quiet-buns-route.md b/.changeset/pre/quiet-buns-route.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-buns-route.md rename to .changeset/pre/quiet-buns-route.md diff --git a/repos/effect/.changeset/pre/quiet-carpets-grin.md b/.changeset/pre/quiet-carpets-grin.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-carpets-grin.md rename to .changeset/pre/quiet-carpets-grin.md diff --git a/repos/effect/.changeset/pre/quiet-clis-parse.md b/.changeset/pre/quiet-clis-parse.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-clis-parse.md rename to .changeset/pre/quiet-clis-parse.md diff --git a/repos/effect/.changeset/pre/quiet-crons-report.md b/.changeset/pre/quiet-crons-report.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-crons-report.md rename to .changeset/pre/quiet-crons-report.md diff --git a/repos/effect/.changeset/pre/quiet-fibers-settle.md b/.changeset/pre/quiet-fibers-settle.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-fibers-settle.md rename to .changeset/pre/quiet-fibers-settle.md diff --git a/repos/effect/.changeset/pre/quiet-files-hunt.md b/.changeset/pre/quiet-files-hunt.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-files-hunt.md rename to .changeset/pre/quiet-files-hunt.md diff --git a/repos/effect/.changeset/pre/quiet-files-write.md b/.changeset/pre/quiet-files-write.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-files-write.md rename to .changeset/pre/quiet-files-write.md diff --git a/repos/effect/.changeset/pre/quiet-graphs-guard.md b/.changeset/pre/quiet-graphs-guard.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-graphs-guard.md rename to .changeset/pre/quiet-graphs-guard.md diff --git a/repos/effect/.changeset/pre/quiet-graphs-search.md b/.changeset/pre/quiet-graphs-search.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-graphs-search.md rename to .changeset/pre/quiet-graphs-search.md diff --git a/repos/effect/.changeset/pre/quiet-graphs-simplify.md b/.changeset/pre/quiet-graphs-simplify.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-graphs-simplify.md rename to .changeset/pre/quiet-graphs-simplify.md diff --git a/repos/effect/.changeset/pre/quiet-lamps-jam.md b/.changeset/pre/quiet-lamps-jam.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-lamps-jam.md rename to .changeset/pre/quiet-lamps-jam.md diff --git a/repos/effect/.changeset/pre/quiet-mice-negotiate.md b/.changeset/pre/quiet-mice-negotiate.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-mice-negotiate.md rename to .changeset/pre/quiet-mice-negotiate.md diff --git a/repos/effect/.changeset/pre/quiet-observers-report.md b/.changeset/pre/quiet-observers-report.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-observers-report.md rename to .changeset/pre/quiet-observers-report.md diff --git a/repos/effect/.changeset/pre/quiet-otters-retry.md b/.changeset/pre/quiet-otters-retry.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-otters-retry.md rename to .changeset/pre/quiet-otters-retry.md diff --git a/repos/effect/.changeset/pre/quiet-owls-validate.md b/.changeset/pre/quiet-owls-validate.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-owls-validate.md rename to .changeset/pre/quiet-owls-validate.md diff --git a/repos/effect/.changeset/pre/quiet-pandas-listen.md b/.changeset/pre/quiet-pandas-listen.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-pandas-listen.md rename to .changeset/pre/quiet-pandas-listen.md diff --git a/repos/effect/.changeset/pre/quiet-pandas-rebuild.md b/.changeset/pre/quiet-pandas-rebuild.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-pandas-rebuild.md rename to .changeset/pre/quiet-pandas-rebuild.md diff --git a/repos/effect/.changeset/pre/quiet-pandas-respond.md b/.changeset/pre/quiet-pandas-respond.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-pandas-respond.md rename to .changeset/pre/quiet-pandas-respond.md diff --git a/repos/effect/.changeset/pre/quiet-radios-wave.md b/.changeset/pre/quiet-radios-wave.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-radios-wave.md rename to .changeset/pre/quiet-radios-wave.md diff --git a/repos/effect/.changeset/pre/quiet-redis-scripts.md b/.changeset/pre/quiet-redis-scripts.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-redis-scripts.md rename to .changeset/pre/quiet-redis-scripts.md diff --git a/repos/effect/.changeset/pre/quiet-rpcs-buffer.md b/.changeset/pre/quiet-rpcs-buffer.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-rpcs-buffer.md rename to .changeset/pre/quiet-rpcs-buffer.md diff --git a/repos/effect/.changeset/pre/quiet-savepoints-wait.md b/.changeset/pre/quiet-savepoints-wait.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-savepoints-wait.md rename to .changeset/pre/quiet-savepoints-wait.md diff --git a/repos/effect/.changeset/pre/quiet-sockets-close.md b/.changeset/pre/quiet-sockets-close.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-sockets-close.md rename to .changeset/pre/quiet-sockets-close.md diff --git a/repos/effect/.changeset/pre/quiet-spans-rest.md b/.changeset/pre/quiet-spans-rest.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-spans-rest.md rename to .changeset/pre/quiet-spans-rest.md diff --git a/repos/effect/.changeset/pre/quiet-streams-take.md b/.changeset/pre/quiet-streams-take.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-streams-take.md rename to .changeset/pre/quiet-streams-take.md diff --git a/repos/effect/.changeset/pre/quiet-tigers-yell.md b/.changeset/pre/quiet-tigers-yell.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-tigers-yell.md rename to .changeset/pre/quiet-tigers-yell.md diff --git a/repos/effect/.changeset/pre/quiet-tools-smile.md b/.changeset/pre/quiet-tools-smile.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-tools-smile.md rename to .changeset/pre/quiet-tools-smile.md diff --git a/repos/effect/.changeset/pre/quiet-turtles-smile.md b/.changeset/pre/quiet-turtles-smile.md similarity index 100% rename from repos/effect/.changeset/pre/quiet-turtles-smile.md rename to .changeset/pre/quiet-turtles-smile.md diff --git a/repos/effect/.changeset/pre/random-choice.md b/.changeset/pre/random-choice.md similarity index 100% rename from repos/effect/.changeset/pre/random-choice.md rename to .changeset/pre/random-choice.md diff --git a/repos/effect/.changeset/pre/random-exclusive-upper-endpoint.md b/.changeset/pre/random-exclusive-upper-endpoint.md similarity index 100% rename from repos/effect/.changeset/pre/random-exclusive-upper-endpoint.md rename to .changeset/pre/random-exclusive-upper-endpoint.md diff --git a/repos/effect/.changeset/pre/random-hex-encoding.md b/.changeset/pre/random-hex-encoding.md similarity index 100% rename from repos/effect/.changeset/pre/random-hex-encoding.md rename to .changeset/pre/random-hex-encoding.md diff --git a/repos/effect/.changeset/pre/rate-limiter-reset-lifetime.md b/.changeset/pre/rate-limiter-reset-lifetime.md similarity index 100% rename from repos/effect/.changeset/pre/rate-limiter-reset-lifetime.md rename to .changeset/pre/rate-limiter-reset-lifetime.md diff --git a/repos/effect/.changeset/pre/rcmap-invalidation-release.md b/.changeset/pre/rcmap-invalidation-release.md similarity index 100% rename from repos/effect/.changeset/pre/rcmap-invalidation-release.md rename to .changeset/pre/rcmap-invalidation-release.md diff --git a/repos/effect/.changeset/pre/rcmap-throwing-lookup.md b/.changeset/pre/rcmap-throwing-lookup.md similarity index 100% rename from repos/effect/.changeset/pre/rcmap-throwing-lookup.md rename to .changeset/pre/rcmap-throwing-lookup.md diff --git a/repos/effect/.changeset/pre/rcref-acquisition-shutdown.md b/.changeset/pre/rcref-acquisition-shutdown.md similarity index 100% rename from repos/effect/.changeset/pre/rcref-acquisition-shutdown.md rename to .changeset/pre/rcref-acquisition-shutdown.md diff --git a/repos/effect/.changeset/pre/rcref-release-ownership.md b/.changeset/pre/rcref-release-ownership.md similarity index 100% rename from repos/effect/.changeset/pre/rcref-release-ownership.md rename to .changeset/pre/rcref-release-ownership.md diff --git a/repos/effect/.changeset/pre/read-only-bun-sqlite.md b/.changeset/pre/read-only-bun-sqlite.md similarity index 100% rename from repos/effect/.changeset/pre/read-only-bun-sqlite.md rename to .changeset/pre/read-only-bun-sqlite.md diff --git a/repos/effect/.changeset/pre/ready-olives-divide.md b/.changeset/pre/ready-olives-divide.md similarity index 100% rename from repos/effect/.changeset/pre/ready-olives-divide.md rename to .changeset/pre/ready-olives-divide.md diff --git a/repos/effect/.changeset/pre/real-trains-ring.md b/.changeset/pre/real-trains-ring.md similarity index 100% rename from repos/effect/.changeset/pre/real-trains-ring.md rename to .changeset/pre/real-trains-ring.md diff --git a/repos/effect/.changeset/pre/reason-annotate-context-only.md b/.changeset/pre/reason-annotate-context-only.md similarity index 100% rename from repos/effect/.changeset/pre/reason-annotate-context-only.md rename to .changeset/pre/reason-annotate-context-only.md diff --git a/repos/effect/.changeset/pre/record-from-iterable-by-dual.md b/.changeset/pre/record-from-iterable-by-dual.md similarity index 100% rename from repos/effect/.changeset/pre/record-from-iterable-by-dual.md rename to .changeset/pre/record-from-iterable-by-dual.md diff --git a/repos/effect/.changeset/pre/red-pigs-repair.md b/.changeset/pre/red-pigs-repair.md similarity index 100% rename from repos/effect/.changeset/pre/red-pigs-repair.md rename to .changeset/pre/red-pigs-repair.md diff --git a/repos/effect/.changeset/pre/redact-cli-wizard-values.md b/.changeset/pre/redact-cli-wizard-values.md similarity index 100% rename from repos/effect/.changeset/pre/redact-cli-wizard-values.md rename to .changeset/pre/redact-cli-wizard-values.md diff --git a/repos/effect/.changeset/pre/redacted-representation-options.md b/.changeset/pre/redacted-representation-options.md similarity index 100% rename from repos/effect/.changeset/pre/redacted-representation-options.md rename to .changeset/pre/redacted-representation-options.md diff --git a/repos/effect/.changeset/pre/redis-subscribe-api.md b/.changeset/pre/redis-subscribe-api.md similarity index 100% rename from repos/effect/.changeset/pre/redis-subscribe-api.md rename to .changeset/pre/redis-subscribe-api.md diff --git a/repos/effect/.changeset/pre/refactor-cli-global-flags.md b/.changeset/pre/refactor-cli-global-flags.md similarity index 100% rename from repos/effect/.changeset/pre/refactor-cli-global-flags.md rename to .changeset/pre/refactor-cli-global-flags.md diff --git a/repos/effect/.changeset/pre/refactor-config-provider.md b/.changeset/pre/refactor-config-provider.md similarity index 100% rename from repos/effect/.changeset/pre/refactor-config-provider.md rename to .changeset/pre/refactor-config-provider.md diff --git a/repos/effect/.changeset/pre/refactor-representation-references.md b/.changeset/pre/refactor-representation-references.md similarity index 100% rename from repos/effect/.changeset/pre/refactor-representation-references.md rename to .changeset/pre/refactor-representation-references.md diff --git a/repos/effect/.changeset/pre/refine-config-absence.md b/.changeset/pre/refine-config-absence.md similarity index 100% rename from repos/effect/.changeset/pre/refine-config-absence.md rename to .changeset/pre/refine-config-absence.md diff --git a/repos/effect/.changeset/pre/refresh-mcp-roots.md b/.changeset/pre/refresh-mcp-roots.md similarity index 100% rename from repos/effect/.changeset/pre/refresh-mcp-roots.md rename to .changeset/pre/refresh-mcp-roots.md diff --git a/repos/effect/.changeset/pre/register-param-alternate-flags.md b/.changeset/pre/register-param-alternate-flags.md similarity index 100% rename from repos/effect/.changeset/pre/register-param-alternate-flags.md rename to .changeset/pre/register-param-alternate-flags.md diff --git a/repos/effect/.changeset/pre/release-rpc-worker-pool-entries.md b/.changeset/pre/release-rpc-worker-pool-entries.md similarity index 100% rename from repos/effect/.changeset/pre/release-rpc-worker-pool-entries.md rename to .changeset/pre/release-rpc-worker-pool-entries.md diff --git a/repos/effect/.changeset/pre/remove-context-mutate.md b/.changeset/pre/remove-context-mutate.md similarity index 100% rename from repos/effect/.changeset/pre/remove-context-mutate.md rename to .changeset/pre/remove-context-mutate.md diff --git a/repos/effect/.changeset/pre/remove-effect-transactionwith.md b/.changeset/pre/remove-effect-transactionwith.md similarity index 100% rename from repos/effect/.changeset/pre/remove-effect-transactionwith.md rename to .changeset/pre/remove-effect-transactionwith.md diff --git a/repos/effect/.changeset/pre/remove-http-span-counter.md b/.changeset/pre/remove-http-span-counter.md similarity index 100% rename from repos/effect/.changeset/pre/remove-http-span-counter.md rename to .changeset/pre/remove-http-span-counter.md diff --git a/repos/effect/.changeset/pre/remove-kubernetes-types.md b/.changeset/pre/remove-kubernetes-types.md similarity index 100% rename from repos/effect/.changeset/pre/remove-kubernetes-types.md rename to .changeset/pre/remove-kubernetes-types.md diff --git a/repos/effect/.changeset/pre/remove-msgpack.md b/.changeset/pre/remove-msgpack.md similarity index 100% rename from repos/effect/.changeset/pre/remove-msgpack.md rename to .changeset/pre/remove-msgpack.md diff --git a/repos/effect/.changeset/pre/remove-nullor.md b/.changeset/pre/remove-nullor.md similarity index 100% rename from repos/effect/.changeset/pre/remove-nullor.md rename to .changeset/pre/remove-nullor.md diff --git a/repos/effect/.changeset/pre/remove-openapi-fromapi-options.md b/.changeset/pre/remove-openapi-fromapi-options.md similarity index 100% rename from repos/effect/.changeset/pre/remove-openapi-fromapi-options.md rename to .changeset/pre/remove-openapi-fromapi-options.md diff --git a/repos/effect/.changeset/pre/remove-schedule-apis.md b/.changeset/pre/remove-schedule-apis.md similarity index 100% rename from repos/effect/.changeset/pre/remove-schedule-apis.md rename to .changeset/pre/remove-schedule-apis.md diff --git a/repos/effect/.changeset/pre/remove-schedule-either.md b/.changeset/pre/remove-schedule-either.md similarity index 100% rename from repos/effect/.changeset/pre/remove-schedule-either.md rename to .changeset/pre/remove-schedule-either.md diff --git a/repos/effect/.changeset/pre/remove-schedule-elapsed.md b/.changeset/pre/remove-schedule-elapsed.md similarity index 100% rename from repos/effect/.changeset/pre/remove-schedule-elapsed.md rename to .changeset/pre/remove-schedule-elapsed.md diff --git a/repos/effect/.changeset/pre/remove-schedule-taps.md b/.changeset/pre/remove-schedule-taps.md similarity index 100% rename from repos/effect/.changeset/pre/remove-schedule-taps.md rename to .changeset/pre/remove-schedule-taps.md diff --git a/repos/effect/.changeset/pre/remove-schema-key-value-combiner.md b/.changeset/pre/remove-schema-key-value-combiner.md similarity index 100% rename from repos/effect/.changeset/pre/remove-schema-key-value-combiner.md rename to .changeset/pre/remove-schema-key-value-combiner.md diff --git a/repos/effect/.changeset/pre/remove-schema-stringtree-keep-declarations.md b/.changeset/pre/remove-schema-stringtree-keep-declarations.md similarity index 100% rename from repos/effect/.changeset/pre/remove-schema-stringtree-keep-declarations.md rename to .changeset/pre/remove-schema-stringtree-keep-declarations.md diff --git a/repos/effect/.changeset/pre/remove-schema-utils.md b/.changeset/pre/remove-schema-utils.md similarity index 100% rename from repos/effect/.changeset/pre/remove-schema-utils.md rename to .changeset/pre/remove-schema-utils.md diff --git a/repos/effect/.changeset/pre/remove-types-mergerecord.md b/.changeset/pre/remove-types-mergerecord.md similarity index 100% rename from repos/effect/.changeset/pre/remove-types-mergerecord.md rename to .changeset/pre/remove-types-mergerecord.md diff --git a/repos/effect/.changeset/pre/remove-unused-utils-apis.md b/.changeset/pre/remove-unused-utils-apis.md similarity index 100% rename from repos/effect/.changeset/pre/remove-unused-utils-apis.md rename to .changeset/pre/remove-unused-utils-apis.md diff --git a/repos/effect/.changeset/pre/remove-with-concurrency.md b/.changeset/pre/remove-with-concurrency.md similarity index 100% rename from repos/effect/.changeset/pre/remove-with-concurrency.md rename to .changeset/pre/remove-with-concurrency.md diff --git a/repos/effect/.changeset/pre/rename-rebuild-out.md b/.changeset/pre/rename-rebuild-out.md similarity index 100% rename from repos/effect/.changeset/pre/rename-rebuild-out.md rename to .changeset/pre/rename-rebuild-out.md diff --git a/repos/effect/.changeset/pre/rename-schema-arbitrary-filter-constraint.md b/.changeset/pre/rename-schema-arbitrary-filter-constraint.md similarity index 100% rename from repos/effect/.changeset/pre/rename-schema-arbitrary-filter-constraint.md rename to .changeset/pre/rename-schema-arbitrary-filter-constraint.md diff --git a/repos/effect/.changeset/pre/rename-schema-error-constructors.md b/.changeset/pre/rename-schema-error-constructors.md similarity index 100% rename from repos/effect/.changeset/pre/rename-schema-error-constructors.md rename to .changeset/pre/rename-schema-error-constructors.md diff --git a/repos/effect/.changeset/pre/rename-schema-transform-effect.md b/.changeset/pre/rename-schema-transform-effect.md similarity index 100% rename from repos/effect/.changeset/pre/rename-schema-transform-effect.md rename to .changeset/pre/rename-schema-transform-effect.md diff --git a/repos/effect/.changeset/pre/render-cli-user-errors.md b/.changeset/pre/render-cli-user-errors.md similarity index 100% rename from repos/effect/.changeset/pre/render-cli-user-errors.md rename to .changeset/pre/render-cli-user-errors.md diff --git a/repos/effect/.changeset/pre/repeat-or-else-metadata-argument.md b/.changeset/pre/repeat-or-else-metadata-argument.md similarity index 100% rename from repos/effect/.changeset/pre/repeat-or-else-metadata-argument.md rename to .changeset/pre/repeat-or-else-metadata-argument.md diff --git a/repos/effect/.changeset/pre/report-mcp-tool-failures.md b/.changeset/pre/report-mcp-tool-failures.md similarity index 100% rename from repos/effect/.changeset/pre/report-mcp-tool-failures.md rename to .changeset/pre/report-mcp-tool-failures.md diff --git a/repos/effect/.changeset/pre/report-schema-input.md b/.changeset/pre/report-schema-input.md similarity index 100% rename from repos/effect/.changeset/pre/report-schema-input.md rename to .changeset/pre/report-schema-input.md diff --git a/repos/effect/.changeset/pre/report-transient-rpc-socket-errors.md b/.changeset/pre/report-transient-rpc-socket-errors.md similarity index 100% rename from repos/effect/.changeset/pre/report-transient-rpc-socket-errors.md rename to .changeset/pre/report-transient-rpc-socket-errors.md diff --git a/repos/effect/.changeset/pre/request-cache-cancellation.md b/.changeset/pre/request-cache-cancellation.md similarity index 100% rename from repos/effect/.changeset/pre/request-cache-cancellation.md rename to .changeset/pre/request-cache-cancellation.md diff --git a/repos/effect/.changeset/pre/request-persisted-resolver-failures.md b/.changeset/pre/request-persisted-resolver-failures.md similarity index 100% rename from repos/effect/.changeset/pre/request-persisted-resolver-failures.md rename to .changeset/pre/request-persisted-resolver-failures.md diff --git a/repos/effect/.changeset/pre/request-race-cache.md b/.changeset/pre/request-race-cache.md similarity index 100% rename from repos/effect/.changeset/pre/request-race-cache.md rename to .changeset/pre/request-race-cache.md diff --git a/repos/effect/.changeset/pre/request-resolver-failure-causes.md b/.changeset/pre/request-resolver-failure-causes.md similarity index 100% rename from repos/effect/.changeset/pre/request-resolver-failure-causes.md rename to .changeset/pre/request-resolver-failure-causes.md diff --git a/repos/effect/.changeset/pre/request-resolver-iterable-results.md b/.changeset/pre/request-resolver-iterable-results.md similarity index 100% rename from repos/effect/.changeset/pre/request-resolver-iterable-results.md rename to .changeset/pre/request-resolver-iterable-results.md diff --git a/repos/effect/.changeset/pre/required-boolean-flags.md b/.changeset/pre/required-boolean-flags.md similarity index 100% rename from repos/effect/.changeset/pre/required-boolean-flags.md rename to .changeset/pre/required-boolean-flags.md diff --git a/repos/effect/.changeset/pre/required-keys-index-signatures.md b/.changeset/pre/required-keys-index-signatures.md similarity index 100% rename from repos/effect/.changeset/pre/required-keys-index-signatures.md rename to .changeset/pre/required-keys-index-signatures.md diff --git a/repos/effect/.changeset/pre/resolved-client-urls.md b/.changeset/pre/resolved-client-urls.md similarity index 100% rename from repos/effect/.changeset/pre/resolved-client-urls.md rename to .changeset/pre/resolved-client-urls.md diff --git a/repos/effect/.changeset/pre/resource-subscriptions.md b/.changeset/pre/resource-subscriptions.md similarity index 100% rename from repos/effect/.changeset/pre/resource-subscriptions.md rename to .changeset/pre/resource-subscriptions.md diff --git a/repos/effect/.changeset/pre/restore-effect-head.md b/.changeset/pre/restore-effect-head.md similarity index 100% rename from repos/effect/.changeset/pre/restore-effect-head.md rename to .changeset/pre/restore-effect-head.md diff --git a/repos/effect/.changeset/pre/restore-schema-parse-options.md b/.changeset/pre/restore-schema-parse-options.md similarity index 100% rename from repos/effect/.changeset/pre/restore-schema-parse-options.md rename to .changeset/pre/restore-schema-parse-options.md diff --git a/repos/effect/.changeset/pre/result-map-error-success-identity.md b/.changeset/pre/result-map-error-success-identity.md similarity index 100% rename from repos/effect/.changeset/pre/result-map-error-success-identity.md rename to .changeset/pre/result-map-error-success-identity.md diff --git a/repos/effect/.changeset/pre/retry-redis-script-load.md b/.changeset/pre/retry-redis-script-load.md similarity index 100% rename from repos/effect/.changeset/pre/retry-redis-script-load.md rename to .changeset/pre/retry-redis-script-load.md diff --git a/repos/effect/.changeset/pre/reuse-httpapi-response-schemas.md b/.changeset/pre/reuse-httpapi-response-schemas.md similarity index 100% rename from repos/effect/.changeset/pre/reuse-httpapi-response-schemas.md rename to .changeset/pre/reuse-httpapi-response-schemas.md diff --git a/repos/effect/.changeset/pre/rich-dots-push.md b/.changeset/pre/rich-dots-push.md similarity index 100% rename from repos/effect/.changeset/pre/rich-dots-push.md rename to .changeset/pre/rich-dots-push.md diff --git a/repos/effect/.changeset/pre/rich-hoops-nail.md b/.changeset/pre/rich-hoops-nail.md similarity index 100% rename from repos/effect/.changeset/pre/rich-hoops-nail.md rename to .changeset/pre/rich-hoops-nail.md diff --git a/repos/effect/.changeset/pre/rich-sloths-draw.md b/.changeset/pre/rich-sloths-draw.md similarity index 100% rename from repos/effect/.changeset/pre/rich-sloths-draw.md rename to .changeset/pre/rich-sloths-draw.md diff --git a/repos/effect/.changeset/pre/ripe-lies-battle.md b/.changeset/pre/ripe-lies-battle.md similarity index 100% rename from repos/effect/.changeset/pre/ripe-lies-battle.md rename to .changeset/pre/ripe-lies-battle.md diff --git a/repos/effect/.changeset/pre/rpc-client-http-early-close.md b/.changeset/pre/rpc-client-http-early-close.md similarity index 100% rename from repos/effect/.changeset/pre/rpc-client-http-early-close.md rename to .changeset/pre/rpc-client-http-early-close.md diff --git a/repos/effect/.changeset/pre/rpc-falsy-control-ids.md b/.changeset/pre/rpc-falsy-control-ids.md similarity index 100% rename from repos/effect/.changeset/pre/rpc-falsy-control-ids.md rename to .changeset/pre/rpc-falsy-control-ids.md diff --git a/repos/effect/.changeset/pre/rpc-middleware-provides-fix.md b/.changeset/pre/rpc-middleware-provides-fix.md similarity index 100% rename from repos/effect/.changeset/pre/rpc-middleware-provides-fix.md rename to .changeset/pre/rpc-middleware-provides-fix.md diff --git a/repos/effect/.changeset/pre/rpc-server-notifications.md b/.changeset/pre/rpc-server-notifications.md similarity index 100% rename from repos/effect/.changeset/pre/rpc-server-notifications.md rename to .changeset/pre/rpc-server-notifications.md diff --git a/repos/effect/.changeset/pre/safe-json-schema-patterns.md b/.changeset/pre/safe-json-schema-patterns.md similarity index 100% rename from repos/effect/.changeset/pre/safe-json-schema-patterns.md rename to .changeset/pre/safe-json-schema-patterns.md diff --git a/repos/effect/.changeset/pre/scalar-custom-fetch.md b/.changeset/pre/scalar-custom-fetch.md similarity index 100% rename from repos/effect/.changeset/pre/scalar-custom-fetch.md rename to .changeset/pre/scalar-custom-fetch.md diff --git a/repos/effect/.changeset/pre/scheduler-global-scope-timers.md b/.changeset/pre/scheduler-global-scope-timers.md similarity index 100% rename from repos/effect/.changeset/pre/scheduler-global-scope-timers.md rename to .changeset/pre/scheduler-global-scope-timers.md diff --git a/repos/effect/.changeset/pre/schema-api-cleanup.md b/.changeset/pre/schema-api-cleanup.md similarity index 100% rename from repos/effect/.changeset/pre/schema-api-cleanup.md rename to .changeset/pre/schema-api-cleanup.md diff --git a/repos/effect/.changeset/pre/schema-arbitrary-factory.md b/.changeset/pre/schema-arbitrary-factory.md similarity index 100% rename from repos/effect/.changeset/pre/schema-arbitrary-factory.md rename to .changeset/pre/schema-arbitrary-factory.md diff --git a/repos/effect/.changeset/pre/schema-array-leaf-aggregation.md b/.changeset/pre/schema-array-leaf-aggregation.md similarity index 100% rename from repos/effect/.changeset/pre/schema-array-leaf-aggregation.md rename to .changeset/pre/schema-array-leaf-aggregation.md diff --git a/repos/effect/.changeset/pre/schema-as-class.md b/.changeset/pre/schema-as-class.md similarity index 100% rename from repos/effect/.changeset/pre/schema-as-class.md rename to .changeset/pre/schema-as-class.md diff --git a/repos/effect/.changeset/pre/schema-asserts-signature.md b/.changeset/pre/schema-asserts-signature.md similarity index 100% rename from repos/effect/.changeset/pre/schema-asserts-signature.md rename to .changeset/pre/schema-asserts-signature.md diff --git a/repos/effect/.changeset/pre/schema-aware-rpc-serialization.md b/.changeset/pre/schema-aware-rpc-serialization.md similarity index 100% rename from repos/effect/.changeset/pre/schema-aware-rpc-serialization.md rename to .changeset/pre/schema-aware-rpc-serialization.md diff --git a/repos/effect/.changeset/pre/schema-binary-codec.md b/.changeset/pre/schema-binary-codec.md similarity index 100% rename from repos/effect/.changeset/pre/schema-binary-codec.md rename to .changeset/pre/schema-binary-codec.md diff --git a/repos/effect/.changeset/pre/schema-binary-preserve-bom.md b/.changeset/pre/schema-binary-preserve-bom.md similarity index 100% rename from repos/effect/.changeset/pre/schema-binary-preserve-bom.md rename to .changeset/pre/schema-binary-preserve-bom.md diff --git a/repos/effect/.changeset/pre/schema-clean-up-additionalProperties.md b/.changeset/pre/schema-clean-up-additionalProperties.md similarity index 100% rename from repos/effect/.changeset/pre/schema-clean-up-additionalProperties.md rename to .changeset/pre/schema-clean-up-additionalProperties.md diff --git a/repos/effect/.changeset/pre/schema-codec-narrowing.md b/.changeset/pre/schema-codec-narrowing.md similarity index 100% rename from repos/effect/.changeset/pre/schema-codec-narrowing.md rename to .changeset/pre/schema-codec-narrowing.md diff --git a/repos/effect/.changeset/pre/schema-date-valid.md b/.changeset/pre/schema-date-valid.md similarity index 100% rename from repos/effect/.changeset/pre/schema-date-valid.md rename to .changeset/pre/schema-date-valid.md diff --git a/repos/effect/.changeset/pre/schema-datetime-utc-from-string.md b/.changeset/pre/schema-datetime-utc-from-string.md similarity index 100% rename from repos/effect/.changeset/pre/schema-datetime-utc-from-string.md rename to .changeset/pre/schema-datetime-utc-from-string.md diff --git a/repos/effect/.changeset/pre/schema-decoding-defaults-services.md b/.changeset/pre/schema-decoding-defaults-services.md similarity index 100% rename from repos/effect/.changeset/pre/schema-decoding-defaults-services.md rename to .changeset/pre/schema-decoding-defaults-services.md diff --git a/repos/effect/.changeset/pre/schema-defaults-issue-channel.md b/.changeset/pre/schema-defaults-issue-channel.md similarity index 100% rename from repos/effect/.changeset/pre/schema-defaults-issue-channel.md rename to .changeset/pre/schema-defaults-issue-channel.md diff --git a/repos/effect/.changeset/pre/schema-direct-class-extension.md b/.changeset/pre/schema-direct-class-extension.md similarity index 100% rename from repos/effect/.changeset/pre/schema-direct-class-extension.md rename to .changeset/pre/schema-direct-class-extension.md diff --git a/repos/effect/.changeset/pre/schema-dollar-prefix.md b/.changeset/pre/schema-dollar-prefix.md similarity index 100% rename from repos/effect/.changeset/pre/schema-dollar-prefix.md rename to .changeset/pre/schema-dollar-prefix.md diff --git a/repos/effect/.changeset/pre/schema-interpreter-backports.md b/.changeset/pre/schema-interpreter-backports.md similarity index 100% rename from repos/effect/.changeset/pre/schema-interpreter-backports.md rename to .changeset/pre/schema-interpreter-backports.md diff --git a/repos/effect/.changeset/pre/schema-json-schema-options.md b/.changeset/pre/schema-json-schema-options.md similarity index 100% rename from repos/effect/.changeset/pre/schema-json-schema-options.md rename to .changeset/pre/schema-json-schema-options.md diff --git a/repos/effect/.changeset/pre/schema-lazy-bottom.md b/.changeset/pre/schema-lazy-bottom.md similarity index 100% rename from repos/effect/.changeset/pre/schema-lazy-bottom.md rename to .changeset/pre/schema-lazy-bottom.md diff --git a/repos/effect/.changeset/pre/schema-missing-self-generic.md b/.changeset/pre/schema-missing-self-generic.md similarity index 100% rename from repos/effect/.changeset/pre/schema-missing-self-generic.md rename to .changeset/pre/schema-missing-self-generic.md diff --git a/repos/effect/.changeset/pre/schema-ordered-arbitrary-constraints.md b/.changeset/pre/schema-ordered-arbitrary-constraints.md similarity index 100% rename from repos/effect/.changeset/pre/schema-ordered-arbitrary-constraints.md rename to .changeset/pre/schema-ordered-arbitrary-constraints.md diff --git a/repos/effect/.changeset/pre/schema-parser-adapter-errors.md b/.changeset/pre/schema-parser-adapter-errors.md similarity index 100% rename from repos/effect/.changeset/pre/schema-parser-adapter-errors.md rename to .changeset/pre/schema-parser-adapter-errors.md diff --git a/repos/effect/.changeset/pre/schema-refactor-toCodecJson.md b/.changeset/pre/schema-refactor-toCodecJson.md similarity index 100% rename from repos/effect/.changeset/pre/schema-refactor-toCodecJson.md rename to .changeset/pre/schema-refactor-toCodecJson.md diff --git a/repos/effect/.changeset/pre/schema-remove-annotate-in.md b/.changeset/pre/schema-remove-annotate-in.md similarity index 100% rename from repos/effect/.changeset/pre/schema-remove-annotate-in.md rename to .changeset/pre/schema-remove-annotate-in.md diff --git a/repos/effect/.changeset/pre/schema-rename-makeUnsafe-to-make.md b/.changeset/pre/schema-rename-makeUnsafe-to-make.md similarity index 100% rename from repos/effect/.changeset/pre/schema-rename-makeUnsafe-to-make.md rename to .changeset/pre/schema-rename-makeUnsafe-to-make.md diff --git a/repos/effect/.changeset/pre/schema-rename-parser-makeUnsafe.md b/.changeset/pre/schema-rename-parser-makeUnsafe.md similarity index 100% rename from repos/effect/.changeset/pre/schema-rename-parser-makeUnsafe.md rename to .changeset/pre/schema-rename-parser-makeUnsafe.md diff --git a/repos/effect/.changeset/pre/schema-representation-refactoring.md b/.changeset/pre/schema-representation-refactoring.md similarity index 100% rename from repos/effect/.changeset/pre/schema-representation-refactoring.md rename to .changeset/pre/schema-representation-refactoring.md diff --git a/repos/effect/.changeset/pre/schema-result-combinators.md b/.changeset/pre/schema-result-combinators.md similarity index 100% rename from repos/effect/.changeset/pre/schema-result-combinators.md rename to .changeset/pre/schema-result-combinators.md diff --git a/repos/effect/.changeset/pre/schema-runtime-performance.md b/.changeset/pre/schema-runtime-performance.md similarity index 100% rename from repos/effect/.changeset/pre/schema-runtime-performance.md rename to .changeset/pre/schema-runtime-performance.md diff --git a/repos/effect/.changeset/pre/schema-struct-simplify.md b/.changeset/pre/schema-struct-simplify.md similarity index 100% rename from repos/effect/.changeset/pre/schema-struct-simplify.md rename to .changeset/pre/schema-struct-simplify.md diff --git a/repos/effect/.changeset/pre/schema-union-type-derivation.md b/.changeset/pre/schema-union-type-derivation.md similarity index 100% rename from repos/effect/.changeset/pre/schema-union-type-derivation.md rename to .changeset/pre/schema-union-type-derivation.md diff --git a/repos/effect/.changeset/pre/scope-persisted-queue-ids.md b/.changeset/pre/scope-persisted-queue-ids.md similarity index 100% rename from repos/effect/.changeset/pre/scope-persisted-queue-ids.md rename to .changeset/pre/scope-persisted-queue-ids.md diff --git a/repos/effect/.changeset/pre/scoped-cache-invalidate-all-reentrancy.md b/.changeset/pre/scoped-cache-invalidate-all-reentrancy.md similarity index 100% rename from repos/effect/.changeset/pre/scoped-cache-invalidate-all-reentrancy.md rename to .changeset/pre/scoped-cache-invalidate-all-reentrancy.md diff --git a/repos/effect/.changeset/pre/scoped-cache-refresh-lookup-defects.md b/.changeset/pre/scoped-cache-refresh-lookup-defects.md similarity index 100% rename from repos/effect/.changeset/pre/scoped-cache-refresh-lookup-defects.md rename to .changeset/pre/scoped-cache-refresh-lookup-defects.md diff --git a/repos/effect/.changeset/pre/scoped-log-nan-restoration.md b/.changeset/pre/scoped-log-nan-restoration.md similarity index 100% rename from repos/effect/.changeset/pre/scoped-log-nan-restoration.md rename to .changeset/pre/scoped-log-nan-restoration.md diff --git a/repos/effect/.changeset/pre/secure-eventlog-identities.md b/.changeset/pre/secure-eventlog-identities.md similarity index 100% rename from repos/effect/.changeset/pre/secure-eventlog-identities.md rename to .changeset/pre/secure-eventlog-identities.md diff --git a/repos/effect/.changeset/pre/select-prompt-optional-message.md b/.changeset/pre/select-prompt-optional-message.md similarity index 100% rename from repos/effect/.changeset/pre/select-prompt-optional-message.md rename to .changeset/pre/select-prompt-optional-message.md diff --git a/repos/effect/.changeset/pre/semantic-matching.md b/.changeset/pre/semantic-matching.md similarity index 100% rename from repos/effect/.changeset/pre/semantic-matching.md rename to .changeset/pre/semantic-matching.md diff --git a/repos/effect/.changeset/pre/service-interface-const.md b/.changeset/pre/service-interface-const.md similarity index 100% rename from repos/effect/.changeset/pre/service-interface-const.md rename to .changeset/pre/service-interface-const.md diff --git a/repos/effect/.changeset/pre/seven-mugs-marry.md b/.changeset/pre/seven-mugs-marry.md similarity index 100% rename from repos/effect/.changeset/pre/seven-mugs-marry.md rename to .changeset/pre/seven-mugs-marry.md diff --git a/repos/effect/.changeset/pre/seven-poems-divide.md b/.changeset/pre/seven-poems-divide.md similarity index 100% rename from repos/effect/.changeset/pre/seven-poems-divide.md rename to .changeset/pre/seven-poems-divide.md diff --git a/repos/effect/.changeset/pre/shaggy-birds-stay.md b/.changeset/pre/shaggy-birds-stay.md similarity index 100% rename from repos/effect/.changeset/pre/shaggy-birds-stay.md rename to .changeset/pre/shaggy-birds-stay.md diff --git a/repos/effect/.changeset/pre/shaggy-cities-push.md b/.changeset/pre/shaggy-cities-push.md similarity index 100% rename from repos/effect/.changeset/pre/shaggy-cities-push.md rename to .changeset/pre/shaggy-cities-push.md diff --git a/repos/effect/.changeset/pre/shaggy-numbers-accept.md b/.changeset/pre/shaggy-numbers-accept.md similarity index 100% rename from repos/effect/.changeset/pre/shaggy-numbers-accept.md rename to .changeset/pre/shaggy-numbers-accept.md diff --git a/repos/effect/.changeset/pre/shaky-beans-throw.md b/.changeset/pre/shaky-beans-throw.md similarity index 100% rename from repos/effect/.changeset/pre/shaky-beans-throw.md rename to .changeset/pre/shaky-beans-throw.md diff --git a/repos/effect/.changeset/pre/shaky-terms-push.md b/.changeset/pre/shaky-terms-push.md similarity index 100% rename from repos/effect/.changeset/pre/shaky-terms-push.md rename to .changeset/pre/shaky-terms-push.md diff --git a/repos/effect/.changeset/pre/sharding-registration-context-overrides.md b/.changeset/pre/sharding-registration-context-overrides.md similarity index 100% rename from repos/effect/.changeset/pre/sharding-registration-context-overrides.md rename to .changeset/pre/sharding-registration-context-overrides.md diff --git a/repos/effect/.changeset/pre/sharp-emus-applaud.md b/.changeset/pre/sharp-emus-applaud.md similarity index 100% rename from repos/effect/.changeset/pre/sharp-emus-applaud.md rename to .changeset/pre/sharp-emus-applaud.md diff --git a/repos/effect/.changeset/pre/sharp-goats-wink.md b/.changeset/pre/sharp-goats-wink.md similarity index 100% rename from repos/effect/.changeset/pre/sharp-goats-wink.md rename to .changeset/pre/sharp-goats-wink.md diff --git a/repos/effect/.changeset/pre/sharp-pandas-care.md b/.changeset/pre/sharp-pandas-care.md similarity index 100% rename from repos/effect/.changeset/pre/sharp-pandas-care.md rename to .changeset/pre/sharp-pandas-care.md diff --git a/repos/effect/.changeset/pre/sharp-peas-march.md b/.changeset/pre/sharp-peas-march.md similarity index 100% rename from repos/effect/.changeset/pre/sharp-peas-march.md rename to .changeset/pre/sharp-peas-march.md diff --git a/repos/effect/.changeset/pre/sharp-rules-draw.md b/.changeset/pre/sharp-rules-draw.md similarity index 100% rename from repos/effect/.changeset/pre/sharp-rules-draw.md rename to .changeset/pre/sharp-rules-draw.md diff --git a/repos/effect/.changeset/pre/sharp-singers-sort.md b/.changeset/pre/sharp-singers-sort.md similarity index 100% rename from repos/effect/.changeset/pre/sharp-singers-sort.md rename to .changeset/pre/sharp-singers-sort.md diff --git a/repos/effect/.changeset/pre/shiny-trains-hug.md b/.changeset/pre/shiny-trains-hug.md similarity index 100% rename from repos/effect/.changeset/pre/shiny-trains-hug.md rename to .changeset/pre/shiny-trains-hug.md diff --git a/repos/effect/.changeset/pre/short-cows-relate.md b/.changeset/pre/short-cows-relate.md similarity index 100% rename from repos/effect/.changeset/pre/short-cows-relate.md rename to .changeset/pre/short-cows-relate.md diff --git a/repos/effect/.changeset/pre/short-foxes-admire.md b/.changeset/pre/short-foxes-admire.md similarity index 100% rename from repos/effect/.changeset/pre/short-foxes-admire.md rename to .changeset/pre/short-foxes-admire.md diff --git a/repos/effect/.changeset/pre/short-stamps-throw.md b/.changeset/pre/short-stamps-throw.md similarity index 100% rename from repos/effect/.changeset/pre/short-stamps-throw.md rename to .changeset/pre/short-stamps-throw.md diff --git a/repos/effect/.changeset/pre/shy-cycles-flow.md b/.changeset/pre/shy-cycles-flow.md similarity index 100% rename from repos/effect/.changeset/pre/shy-cycles-flow.md rename to .changeset/pre/shy-cycles-flow.md diff --git a/repos/effect/.changeset/pre/shy-geckos-sniff.md b/.changeset/pre/shy-geckos-sniff.md similarity index 100% rename from repos/effect/.changeset/pre/shy-geckos-sniff.md rename to .changeset/pre/shy-geckos-sniff.md diff --git a/repos/effect/.changeset/pre/shy-seals-smile.md b/.changeset/pre/shy-seals-smile.md similarity index 100% rename from repos/effect/.changeset/pre/shy-seals-smile.md rename to .changeset/pre/shy-seals-smile.md diff --git a/repos/effect/.changeset/pre/silent-geckos-matter.md b/.changeset/pre/silent-geckos-matter.md similarity index 100% rename from repos/effect/.changeset/pre/silent-geckos-matter.md rename to .changeset/pre/silent-geckos-matter.md diff --git a/repos/effect/.changeset/pre/silent-needles-design.md b/.changeset/pre/silent-needles-design.md similarity index 100% rename from repos/effect/.changeset/pre/silent-needles-design.md rename to .changeset/pre/silent-needles-design.md diff --git a/repos/effect/.changeset/pre/silent-plants-matter.md b/.changeset/pre/silent-plants-matter.md similarity index 100% rename from repos/effect/.changeset/pre/silent-plants-matter.md rename to .changeset/pre/silent-plants-matter.md diff --git a/repos/effect/.changeset/pre/silent-spoons-stare.md b/.changeset/pre/silent-spoons-stare.md similarity index 100% rename from repos/effect/.changeset/pre/silent-spoons-stare.md rename to .changeset/pre/silent-spoons-stare.md diff --git a/repos/effect/.changeset/pre/silly-dodos-update.md b/.changeset/pre/silly-dodos-update.md similarity index 100% rename from repos/effect/.changeset/pre/silly-dodos-update.md rename to .changeset/pre/silly-dodos-update.md diff --git a/repos/effect/.changeset/pre/silly-loops-tickle.md b/.changeset/pre/silly-loops-tickle.md similarity index 100% rename from repos/effect/.changeset/pre/silly-loops-tickle.md rename to .changeset/pre/silly-loops-tickle.md diff --git a/repos/effect/.changeset/pre/silver-bulk-indexeddb.md b/.changeset/pre/silver-bulk-indexeddb.md similarity index 100% rename from repos/effect/.changeset/pre/silver-bulk-indexeddb.md rename to .changeset/pre/silver-bulk-indexeddb.md diff --git a/repos/effect/.changeset/pre/silver-emus-smoke.md b/.changeset/pre/silver-emus-smoke.md similarity index 100% rename from repos/effect/.changeset/pre/silver-emus-smoke.md rename to .changeset/pre/silver-emus-smoke.md diff --git a/repos/effect/.changeset/pre/silver-kings-poke.md b/.changeset/pre/silver-kings-poke.md similarity index 100% rename from repos/effect/.changeset/pre/silver-kings-poke.md rename to .changeset/pre/silver-kings-poke.md diff --git a/repos/effect/.changeset/pre/silver-snails-sqlite.md b/.changeset/pre/silver-snails-sqlite.md similarity index 100% rename from repos/effect/.changeset/pre/silver-snails-sqlite.md rename to .changeset/pre/silver-snails-sqlite.md diff --git a/repos/effect/.changeset/pre/silver-wings-watch.md b/.changeset/pre/silver-wings-watch.md similarity index 100% rename from repos/effect/.changeset/pre/silver-wings-watch.md rename to .changeset/pre/silver-wings-watch.md diff --git a/repos/effect/.changeset/pre/simplify-optic-composition.md b/.changeset/pre/simplify-optic-composition.md similarity index 100% rename from repos/effect/.changeset/pre/simplify-optic-composition.md rename to .changeset/pre/simplify-optic-composition.md diff --git a/repos/effect/.changeset/pre/six-cups-taste.md b/.changeset/pre/six-cups-taste.md similarity index 100% rename from repos/effect/.changeset/pre/six-cups-taste.md rename to .changeset/pre/six-cups-taste.md diff --git a/repos/effect/.changeset/pre/six-pumas-take.md b/.changeset/pre/six-pumas-take.md similarity index 100% rename from repos/effect/.changeset/pre/six-pumas-take.md rename to .changeset/pre/six-pumas-take.md diff --git a/repos/effect/.changeset/pre/sixty-mails-shout.md b/.changeset/pre/sixty-mails-shout.md similarity index 100% rename from repos/effect/.changeset/pre/sixty-mails-shout.md rename to .changeset/pre/sixty-mails-shout.md diff --git a/repos/effect/.changeset/pre/sixty-socks-yell.md b/.changeset/pre/sixty-socks-yell.md similarity index 100% rename from repos/effect/.changeset/pre/sixty-socks-yell.md rename to .changeset/pre/sixty-socks-yell.md diff --git a/repos/effect/.changeset/pre/skip-disabled-stack-capture.md b/.changeset/pre/skip-disabled-stack-capture.md similarity index 100% rename from repos/effect/.changeset/pre/skip-disabled-stack-capture.md rename to .changeset/pre/skip-disabled-stack-capture.md diff --git a/repos/effect/.changeset/pre/slick-signs-wish.md b/.changeset/pre/slick-signs-wish.md similarity index 100% rename from repos/effect/.changeset/pre/slick-signs-wish.md rename to .changeset/pre/slick-signs-wish.md diff --git a/repos/effect/.changeset/pre/slick-toes-rush.md b/.changeset/pre/slick-toes-rush.md similarity index 100% rename from repos/effect/.changeset/pre/slick-toes-rush.md rename to .changeset/pre/slick-toes-rush.md diff --git a/repos/effect/.changeset/pre/slimy-melons-admire.md b/.changeset/pre/slimy-melons-admire.md similarity index 100% rename from repos/effect/.changeset/pre/slimy-melons-admire.md rename to .changeset/pre/slimy-melons-admire.md diff --git a/repos/effect/.changeset/pre/slimy-planets-divide.md b/.changeset/pre/slimy-planets-divide.md similarity index 100% rename from repos/effect/.changeset/pre/slimy-planets-divide.md rename to .changeset/pre/slimy-planets-divide.md diff --git a/repos/effect/.changeset/pre/slimy-turtles-juggle.md b/.changeset/pre/slimy-turtles-juggle.md similarity index 100% rename from repos/effect/.changeset/pre/slimy-turtles-juggle.md rename to .changeset/pre/slimy-turtles-juggle.md diff --git a/repos/effect/.changeset/pre/slow-beans-battle.md b/.changeset/pre/slow-beans-battle.md similarity index 100% rename from repos/effect/.changeset/pre/slow-beans-battle.md rename to .changeset/pre/slow-beans-battle.md diff --git a/repos/effect/.changeset/pre/slow-berries-enjoy.md b/.changeset/pre/slow-berries-enjoy.md similarity index 100% rename from repos/effect/.changeset/pre/slow-berries-enjoy.md rename to .changeset/pre/slow-berries-enjoy.md diff --git a/repos/effect/.changeset/pre/slow-entities-register.md b/.changeset/pre/slow-entities-register.md similarity index 100% rename from repos/effect/.changeset/pre/slow-entities-register.md rename to .changeset/pre/slow-entities-register.md diff --git a/repos/effect/.changeset/pre/slow-spiders-refresh.md b/.changeset/pre/slow-spiders-refresh.md similarity index 100% rename from repos/effect/.changeset/pre/slow-spiders-refresh.md rename to .changeset/pre/slow-spiders-refresh.md diff --git a/repos/effect/.changeset/pre/small-basic-bundle.md b/.changeset/pre/small-basic-bundle.md similarity index 100% rename from repos/effect/.changeset/pre/small-basic-bundle.md rename to .changeset/pre/small-basic-bundle.md diff --git a/repos/effect/.changeset/pre/small-bugs-hunt.md b/.changeset/pre/small-bugs-hunt.md similarity index 100% rename from repos/effect/.changeset/pre/small-bugs-hunt.md rename to .changeset/pre/small-bugs-hunt.md diff --git a/repos/effect/.changeset/pre/small-crabs-care.md b/.changeset/pre/small-crabs-care.md similarity index 100% rename from repos/effect/.changeset/pre/small-crabs-care.md rename to .changeset/pre/small-crabs-care.md diff --git a/repos/effect/.changeset/pre/small-pandas-cache.md b/.changeset/pre/small-pandas-cache.md similarity index 100% rename from repos/effect/.changeset/pre/small-pandas-cache.md rename to .changeset/pre/small-pandas-cache.md diff --git a/repos/effect/.changeset/pre/small-pets-sit.md b/.changeset/pre/small-pets-sit.md similarity index 100% rename from repos/effect/.changeset/pre/small-pets-sit.md rename to .changeset/pre/small-pets-sit.md diff --git a/repos/effect/.changeset/pre/smart-ducks-jump.md b/.changeset/pre/smart-ducks-jump.md similarity index 100% rename from repos/effect/.changeset/pre/smart-ducks-jump.md rename to .changeset/pre/smart-ducks-jump.md diff --git a/repos/effect/.changeset/pre/smart-pillows-buy.md b/.changeset/pre/smart-pillows-buy.md similarity index 100% rename from repos/effect/.changeset/pre/smart-pillows-buy.md rename to .changeset/pre/smart-pillows-buy.md diff --git a/repos/effect/.changeset/pre/smart-timers-fly.md b/.changeset/pre/smart-timers-fly.md similarity index 100% rename from repos/effect/.changeset/pre/smart-timers-fly.md rename to .changeset/pre/smart-timers-fly.md diff --git a/repos/effect/.changeset/pre/smart-tips-sort.md b/.changeset/pre/smart-tips-sort.md similarity index 100% rename from repos/effect/.changeset/pre/smart-tips-sort.md rename to .changeset/pre/smart-tips-sort.md diff --git a/repos/effect/.changeset/pre/social-hoops-knock.md b/.changeset/pre/social-hoops-knock.md similarity index 100% rename from repos/effect/.changeset/pre/social-hoops-knock.md rename to .changeset/pre/social-hoops-knock.md diff --git a/repos/effect/.changeset/pre/social-pumas-prove.md b/.changeset/pre/social-pumas-prove.md similarity index 100% rename from repos/effect/.changeset/pre/social-pumas-prove.md rename to .changeset/pre/social-pumas-prove.md diff --git a/repos/effect/.changeset/pre/socket-paused-websocket-handoff.md b/.changeset/pre/socket-paused-websocket-handoff.md similarity index 100% rename from repos/effect/.changeset/pre/socket-paused-websocket-handoff.md rename to .changeset/pre/socket-paused-websocket-handoff.md diff --git a/repos/effect/.changeset/pre/socket-websocket-text-byte-watermark.md b/.changeset/pre/socket-websocket-text-byte-watermark.md similarity index 100% rename from repos/effect/.changeset/pre/socket-websocket-text-byte-watermark.md rename to .changeset/pre/socket-websocket-text-byte-watermark.md diff --git a/repos/effect/.changeset/pre/soft-comics-wink.md b/.changeset/pre/soft-comics-wink.md similarity index 100% rename from repos/effect/.changeset/pre/soft-comics-wink.md rename to .changeset/pre/soft-comics-wink.md diff --git a/repos/effect/.changeset/pre/soft-delete-sqlmodel.md b/.changeset/pre/soft-delete-sqlmodel.md similarity index 100% rename from repos/effect/.changeset/pre/soft-delete-sqlmodel.md rename to .changeset/pre/soft-delete-sqlmodel.md diff --git a/repos/effect/.changeset/pre/soft-seals-allow.md b/.changeset/pre/soft-seals-allow.md similarity index 100% rename from repos/effect/.changeset/pre/soft-seals-allow.md rename to .changeset/pre/soft-seals-allow.md diff --git a/repos/effect/.changeset/pre/soft-sockets-write.md b/.changeset/pre/soft-sockets-write.md similarity index 100% rename from repos/effect/.changeset/pre/soft-sockets-write.md rename to .changeset/pre/soft-sockets-write.md diff --git a/repos/effect/.changeset/pre/solid-cougars-attack.md b/.changeset/pre/solid-cougars-attack.md similarity index 100% rename from repos/effect/.changeset/pre/solid-cougars-attack.md rename to .changeset/pre/solid-cougars-attack.md diff --git a/repos/effect/.changeset/pre/solid-doors-ring.md b/.changeset/pre/solid-doors-ring.md similarity index 100% rename from repos/effect/.changeset/pre/solid-doors-ring.md rename to .changeset/pre/solid-doors-ring.md diff --git a/repos/effect/.changeset/pre/solid-items-tease.md b/.changeset/pre/solid-items-tease.md similarity index 100% rename from repos/effect/.changeset/pre/solid-items-tease.md rename to .changeset/pre/solid-items-tease.md diff --git a/repos/effect/.changeset/pre/solid-towns-smoke.md b/.changeset/pre/solid-towns-smoke.md similarity index 100% rename from repos/effect/.changeset/pre/solid-towns-smoke.md rename to .changeset/pre/solid-towns-smoke.md diff --git a/repos/effect/.changeset/pre/sour-bees-sleep.md b/.changeset/pre/sour-bees-sleep.md similarity index 100% rename from repos/effect/.changeset/pre/sour-bees-sleep.md rename to .changeset/pre/sour-bees-sleep.md diff --git a/repos/effect/.changeset/pre/sour-canyons-rescue.md b/.changeset/pre/sour-canyons-rescue.md similarity index 100% rename from repos/effect/.changeset/pre/sour-canyons-rescue.md rename to .changeset/pre/sour-canyons-rescue.md diff --git a/repos/effect/.changeset/pre/sparkly-bears-act.md b/.changeset/pre/sparkly-bears-act.md similarity index 100% rename from repos/effect/.changeset/pre/sparkly-bears-act.md rename to .changeset/pre/sparkly-bears-act.md diff --git a/repos/effect/.changeset/pre/sparkly-coins-sit.md b/.changeset/pre/sparkly-coins-sit.md similarity index 100% rename from repos/effect/.changeset/pre/sparkly-coins-sit.md rename to .changeset/pre/sparkly-coins-sit.md diff --git a/repos/effect/.changeset/pre/spicy-doors-unlist.md b/.changeset/pre/spicy-doors-unlist.md similarity index 100% rename from repos/effect/.changeset/pre/spicy-doors-unlist.md rename to .changeset/pre/spicy-doors-unlist.md diff --git a/repos/effect/.changeset/pre/split-clock-semantics.md b/.changeset/pre/split-clock-semantics.md similarity index 100% rename from repos/effect/.changeset/pre/split-clock-semantics.md rename to .changeset/pre/split-clock-semantics.md diff --git a/repos/effect/.changeset/pre/split-lines-completed-cr.md b/.changeset/pre/split-lines-completed-cr.md similarity index 100% rename from repos/effect/.changeset/pre/split-lines-completed-cr.md rename to .changeset/pre/split-lines-completed-cr.md diff --git a/repos/effect/.changeset/pre/spotty-comics-fry.md b/.changeset/pre/spotty-comics-fry.md similarity index 100% rename from repos/effect/.changeset/pre/spotty-comics-fry.md rename to .changeset/pre/spotty-comics-fry.md diff --git a/repos/effect/.changeset/pre/spotty-masks-own.md b/.changeset/pre/spotty-masks-own.md similarity index 100% rename from repos/effect/.changeset/pre/spotty-masks-own.md rename to .changeset/pre/spotty-masks-own.md diff --git a/repos/effect/.changeset/pre/sql-begin-failure-typed.md b/.changeset/pre/sql-begin-failure-typed.md similarity index 100% rename from repos/effect/.changeset/pre/sql-begin-failure-typed.md rename to .changeset/pre/sql-begin-failure-typed.md diff --git a/repos/effect/.changeset/pre/sql-event-journal-callback-errors.md b/.changeset/pre/sql-event-journal-callback-errors.md similarity index 100% rename from repos/effect/.changeset/pre/sql-event-journal-callback-errors.md rename to .changeset/pre/sql-event-journal-callback-errors.md diff --git a/repos/effect/.changeset/pre/sql-message-storage-joined-reply-id.md b/.changeset/pre/sql-message-storage-joined-reply-id.md similarity index 100% rename from repos/effect/.changeset/pre/sql-message-storage-joined-reply-id.md rename to .changeset/pre/sql-message-storage-joined-reply-id.md diff --git a/repos/effect/.changeset/pre/sql-migrator-mjs-mts.md b/.changeset/pre/sql-migrator-mjs-mts.md similarity index 100% rename from repos/effect/.changeset/pre/sql-migrator-mjs-mts.md rename to .changeset/pre/sql-migrator-mjs-mts.md diff --git a/repos/effect/.changeset/pre/sql-nested-placeholder-cache.md b/.changeset/pre/sql-nested-placeholder-cache.md similarity index 100% rename from repos/effect/.changeset/pre/sql-nested-placeholder-cache.md rename to .changeset/pre/sql-nested-placeholder-cache.md diff --git a/repos/effect/.changeset/pre/sql-optional-span-propagation.md b/.changeset/pre/sql-optional-span-propagation.md similarity index 100% rename from repos/effect/.changeset/pre/sql-optional-span-propagation.md rename to .changeset/pre/sql-optional-span-propagation.md diff --git a/repos/effect/.changeset/pre/sql-returning-identifier.md b/.changeset/pre/sql-returning-identifier.md similarity index 100% rename from repos/effect/.changeset/pre/sql-returning-identifier.md rename to .changeset/pre/sql-returning-identifier.md diff --git a/repos/effect/.changeset/pre/sql-runner-requested-shard-results.md b/.changeset/pre/sql-runner-requested-shard-results.md similarity index 100% rename from repos/effect/.changeset/pre/sql-runner-requested-shard-results.md rename to .changeset/pre/sql-runner-requested-shard-results.md diff --git a/repos/effect/.changeset/pre/sqlite-bun-prepare-error-channel.md b/.changeset/pre/sqlite-bun-prepare-error-channel.md similarity index 100% rename from repos/effect/.changeset/pre/sqlite-bun-prepare-error-channel.md rename to .changeset/pre/sqlite-bun-prepare-error-channel.md diff --git a/repos/effect/.changeset/pre/sqlite-bun-transaction-export.md b/.changeset/pre/sqlite-bun-transaction-export.md similarity index 100% rename from repos/effect/.changeset/pre/sqlite-bun-transaction-export.md rename to .changeset/pre/sqlite-bun-transaction-export.md diff --git a/repos/effect/.changeset/pre/sqlite-client-locking-defaults.md b/.changeset/pre/sqlite-client-locking-defaults.md similarity index 100% rename from repos/effect/.changeset/pre/sqlite-client-locking-defaults.md rename to .changeset/pre/sqlite-client-locking-defaults.md diff --git a/repos/effect/.changeset/pre/sqlite-do-durable-object-transactions.md b/.changeset/pre/sqlite-do-durable-object-transactions.md similarity index 100% rename from repos/effect/.changeset/pre/sqlite-do-durable-object-transactions.md rename to .changeset/pre/sqlite-do-durable-object-transactions.md diff --git a/repos/effect/.changeset/pre/sqlite-do-stream-errors.md b/.changeset/pre/sqlite-do-stream-errors.md similarity index 100% rename from repos/effect/.changeset/pre/sqlite-do-stream-errors.md rename to .changeset/pre/sqlite-do-stream-errors.md diff --git a/repos/effect/.changeset/pre/sqlite-node-unprepared-errors.md b/.changeset/pre/sqlite-node-unprepared-errors.md similarity index 100% rename from repos/effect/.changeset/pre/sqlite-node-unprepared-errors.md rename to .changeset/pre/sqlite-node-unprepared-errors.md diff --git a/repos/effect/.changeset/pre/sqlite-wasm-messageport-startup.md b/.changeset/pre/sqlite-wasm-messageport-startup.md similarity index 100% rename from repos/effect/.changeset/pre/sqlite-wasm-messageport-startup.md rename to .changeset/pre/sqlite-wasm-messageport-startup.md diff --git a/repos/effect/.changeset/pre/sqlite-wasm-statement-columns.md b/.changeset/pre/sqlite-wasm-statement-columns.md similarity index 100% rename from repos/effect/.changeset/pre/sqlite-wasm-statement-columns.md rename to .changeset/pre/sqlite-wasm-statement-columns.md diff --git a/repos/effect/.changeset/pre/sqlite-wasm-worker-error-metadata.md b/.changeset/pre/sqlite-wasm-worker-error-metadata.md similarity index 100% rename from repos/effect/.changeset/pre/sqlite-wasm-worker-error-metadata.md rename to .changeset/pre/sqlite-wasm-worker-error-metadata.md diff --git a/repos/effect/.changeset/pre/sqlmodel-insert-decoding-services.md b/.changeset/pre/sqlmodel-insert-decoding-services.md similarity index 100% rename from repos/effect/.changeset/pre/sqlmodel-insert-decoding-services.md rename to .changeset/pre/sqlmodel-insert-decoding-services.md diff --git a/repos/effect/.changeset/pre/stable-graph-traversal-config.md b/.changeset/pre/stable-graph-traversal-config.md similarity index 100% rename from repos/effect/.changeset/pre/stable-graph-traversal-config.md rename to .changeset/pre/stable-graph-traversal-config.md diff --git a/repos/effect/.changeset/pre/stale-dots-tell.md b/.changeset/pre/stale-dots-tell.md similarity index 100% rename from repos/effect/.changeset/pre/stale-dots-tell.md rename to .changeset/pre/stale-dots-tell.md diff --git a/repos/effect/.changeset/pre/stale-graph-traversal-skips.md b/.changeset/pre/stale-graph-traversal-skips.md similarity index 100% rename from repos/effect/.changeset/pre/stale-graph-traversal-skips.md rename to .changeset/pre/stale-graph-traversal-skips.md diff --git a/repos/effect/.changeset/pre/stale-laws-do.md b/.changeset/pre/stale-laws-do.md similarity index 100% rename from repos/effect/.changeset/pre/stale-laws-do.md rename to .changeset/pre/stale-laws-do.md diff --git a/repos/effect/.changeset/pre/stale-snakes-know.md b/.changeset/pre/stale-snakes-know.md similarity index 100% rename from repos/effect/.changeset/pre/stale-snakes-know.md rename to .changeset/pre/stale-snakes-know.md diff --git a/repos/effect/.changeset/pre/standard-schema-module.md b/.changeset/pre/standard-schema-module.md similarity index 100% rename from repos/effect/.changeset/pre/standard-schema-module.md rename to .changeset/pre/standard-schema-module.md diff --git a/repos/effect/.changeset/pre/stream-rechunk-large-source.md b/.changeset/pre/stream-rechunk-large-source.md similarity index 100% rename from repos/effect/.changeset/pre/stream-rechunk-large-source.md rename to .changeset/pre/stream-rechunk-large-source.md diff --git a/repos/effect/.changeset/pre/strict-areas-end.md b/.changeset/pre/strict-areas-end.md similarity index 100% rename from repos/effect/.changeset/pre/strict-areas-end.md rename to .changeset/pre/strict-areas-end.md diff --git a/repos/effect/.changeset/pre/strict-buckets-hug.md b/.changeset/pre/strict-buckets-hug.md similarity index 100% rename from repos/effect/.changeset/pre/strict-buckets-hug.md rename to .changeset/pre/strict-buckets-hug.md diff --git a/repos/effect/.changeset/pre/strict-content-length.md b/.changeset/pre/strict-content-length.md similarity index 100% rename from repos/effect/.changeset/pre/strict-content-length.md rename to .changeset/pre/strict-content-length.md diff --git a/repos/effect/.changeset/pre/strict-cookie-names.md b/.changeset/pre/strict-cookie-names.md similarity index 100% rename from repos/effect/.changeset/pre/strict-cookie-names.md rename to .changeset/pre/strict-cookie-names.md diff --git a/repos/effect/.changeset/pre/strip-resolved-approvals.md b/.changeset/pre/strip-resolved-approvals.md similarity index 100% rename from repos/effect/.changeset/pre/strip-resolved-approvals.md rename to .changeset/pre/strip-resolved-approvals.md diff --git a/repos/effect/.changeset/pre/strong-balloons-tickle.md b/.changeset/pre/strong-balloons-tickle.md similarity index 100% rename from repos/effect/.changeset/pre/strong-balloons-tickle.md rename to .changeset/pre/strong-balloons-tickle.md diff --git a/repos/effect/.changeset/pre/strong-bees-queue.md b/.changeset/pre/strong-bees-queue.md similarity index 100% rename from repos/effect/.changeset/pre/strong-bees-queue.md rename to .changeset/pre/strong-bees-queue.md diff --git a/repos/effect/.changeset/pre/strong-insects-film.md b/.changeset/pre/strong-insects-film.md similarity index 100% rename from repos/effect/.changeset/pre/strong-insects-film.md rename to .changeset/pre/strong-insects-film.md diff --git a/repos/effect/.changeset/pre/struct-numeric-selection.md b/.changeset/pre/struct-numeric-selection.md similarity index 100% rename from repos/effect/.changeset/pre/struct-numeric-selection.md rename to .changeset/pre/struct-numeric-selection.md diff --git a/repos/effect/.changeset/pre/struct-record.md b/.changeset/pre/struct-record.md similarity index 100% rename from repos/effect/.changeset/pre/struct-record.md rename to .changeset/pre/struct-record.md diff --git a/repos/effect/.changeset/pre/structural-schema-nodes.md b/.changeset/pre/structural-schema-nodes.md similarity index 100% rename from repos/effect/.changeset/pre/structural-schema-nodes.md rename to .changeset/pre/structural-schema-nodes.md diff --git a/repos/effect/.changeset/pre/sunny-ads-hang.md b/.changeset/pre/sunny-ads-hang.md similarity index 100% rename from repos/effect/.changeset/pre/sunny-ads-hang.md rename to .changeset/pre/sunny-ads-hang.md diff --git a/repos/effect/.changeset/pre/sunny-bikes-sleep.md b/.changeset/pre/sunny-bikes-sleep.md similarity index 100% rename from repos/effect/.changeset/pre/sunny-bikes-sleep.md rename to .changeset/pre/sunny-bikes-sleep.md diff --git a/repos/effect/.changeset/pre/sunny-rooms-invent.md b/.changeset/pre/sunny-rooms-invent.md similarity index 100% rename from repos/effect/.changeset/pre/sunny-rooms-invent.md rename to .changeset/pre/sunny-rooms-invent.md diff --git a/repos/effect/.changeset/pre/sweet-donuts-bet.md b/.changeset/pre/sweet-donuts-bet.md similarity index 100% rename from repos/effect/.changeset/pre/sweet-donuts-bet.md rename to .changeset/pre/sweet-donuts-bet.md diff --git a/repos/effect/.changeset/pre/sweet-hotels-give.md b/.changeset/pre/sweet-hotels-give.md similarity index 100% rename from repos/effect/.changeset/pre/sweet-hotels-give.md rename to .changeset/pre/sweet-hotels-give.md diff --git a/repos/effect/.changeset/pre/sweet-lizards-sing.md b/.changeset/pre/sweet-lizards-sing.md similarity index 100% rename from repos/effect/.changeset/pre/sweet-lizards-sing.md rename to .changeset/pre/sweet-lizards-sing.md diff --git a/repos/effect/.changeset/pre/sweet-schedules-matter.md b/.changeset/pre/sweet-schedules-matter.md similarity index 100% rename from repos/effect/.changeset/pre/sweet-schedules-matter.md rename to .changeset/pre/sweet-schedules-matter.md diff --git a/repos/effect/.changeset/pre/sweet-views-learn.md b/.changeset/pre/sweet-views-learn.md similarity index 100% rename from repos/effect/.changeset/pre/sweet-views-learn.md rename to .changeset/pre/sweet-views-learn.md diff --git a/repos/effect/.changeset/pre/swift-geese-count.md b/.changeset/pre/swift-geese-count.md similarity index 100% rename from repos/effect/.changeset/pre/swift-geese-count.md rename to .changeset/pre/swift-geese-count.md diff --git a/repos/effect/.changeset/pre/swift-pandas-parse.md b/.changeset/pre/swift-pandas-parse.md similarity index 100% rename from repos/effect/.changeset/pre/swift-pandas-parse.md rename to .changeset/pre/swift-pandas-parse.md diff --git a/repos/effect/.changeset/pre/swift-spiders-unpack.md b/.changeset/pre/swift-spiders-unpack.md similarity index 100% rename from repos/effect/.changeset/pre/swift-spiders-unpack.md rename to .changeset/pre/swift-spiders-unpack.md diff --git a/repos/effect/.changeset/pre/swift-symbols-stand.md b/.changeset/pre/swift-symbols-stand.md similarity index 100% rename from repos/effect/.changeset/pre/swift-symbols-stand.md rename to .changeset/pre/swift-symbols-stand.md diff --git a/repos/effect/.changeset/pre/synchronized-ref-modify-some-effect-currying.md b/.changeset/pre/synchronized-ref-modify-some-effect-currying.md similarity index 100% rename from repos/effect/.changeset/pre/synchronized-ref-modify-some-effect-currying.md rename to .changeset/pre/synchronized-ref-modify-some-effect-currying.md diff --git a/repos/effect/.changeset/pre/synchronized-ref-not-ref.md b/.changeset/pre/synchronized-ref-not-ref.md similarity index 100% rename from repos/effect/.changeset/pre/synchronized-ref-not-ref.md rename to .changeset/pre/synchronized-ref-not-ref.md diff --git a/repos/effect/.changeset/pre/tagged-error-class-optional-empty-props.md b/.changeset/pre/tagged-error-class-optional-empty-props.md similarity index 100% rename from repos/effect/.changeset/pre/tagged-error-class-optional-empty-props.md rename to .changeset/pre/tagged-error-class-optional-empty-props.md diff --git a/repos/effect/.changeset/pre/tall-hairs-return.md b/.changeset/pre/tall-hairs-return.md similarity index 100% rename from repos/effect/.changeset/pre/tall-hairs-return.md rename to .changeset/pre/tall-hairs-return.md diff --git a/repos/effect/.changeset/pre/tall-ideas-fix.md b/.changeset/pre/tall-ideas-fix.md similarity index 100% rename from repos/effect/.changeset/pre/tall-ideas-fix.md rename to .changeset/pre/tall-ideas-fix.md diff --git a/repos/effect/.changeset/pre/tall-mails-listen.md b/.changeset/pre/tall-mails-listen.md similarity index 100% rename from repos/effect/.changeset/pre/tall-mails-listen.md rename to .changeset/pre/tall-mails-listen.md diff --git a/repos/effect/.changeset/pre/tall-melons-shave.md b/.changeset/pre/tall-melons-shave.md similarity index 100% rename from repos/effect/.changeset/pre/tall-melons-shave.md rename to .changeset/pre/tall-melons-shave.md diff --git a/repos/effect/.changeset/pre/tall-queens-cheer.md b/.changeset/pre/tall-queens-cheer.md similarity index 100% rename from repos/effect/.changeset/pre/tall-queens-cheer.md rename to .changeset/pre/tall-queens-cheer.md diff --git a/repos/effect/.changeset/pre/tall-wombats-wave.md b/.changeset/pre/tall-wombats-wave.md similarity index 100% rename from repos/effect/.changeset/pre/tall-wombats-wave.md rename to .changeset/pre/tall-wombats-wave.md diff --git a/repos/effect/.changeset/pre/tame-json-schema-intersections.md b/.changeset/pre/tame-json-schema-intersections.md similarity index 100% rename from repos/effect/.changeset/pre/tame-json-schema-intersections.md rename to .changeset/pre/tame-json-schema-intersections.md diff --git a/repos/effect/.changeset/pre/tangy-colts-lose.md b/.changeset/pre/tangy-colts-lose.md similarity index 100% rename from repos/effect/.changeset/pre/tangy-colts-lose.md rename to .changeset/pre/tangy-colts-lose.md diff --git a/repos/effect/.changeset/pre/tangy-plants-run.md b/.changeset/pre/tangy-plants-run.md similarity index 100% rename from repos/effect/.changeset/pre/tangy-plants-run.md rename to .changeset/pre/tangy-plants-run.md diff --git a/repos/effect/.changeset/pre/tap-defect-saved-error-inference.md b/.changeset/pre/tap-defect-saved-error-inference.md similarity index 100% rename from repos/effect/.changeset/pre/tap-defect-saved-error-inference.md rename to .changeset/pre/tap-defect-saved-error-inference.md diff --git a/repos/effect/.changeset/pre/tasty-comics-send.md b/.changeset/pre/tasty-comics-send.md similarity index 100% rename from repos/effect/.changeset/pre/tasty-comics-send.md rename to .changeset/pre/tasty-comics-send.md diff --git a/repos/effect/.changeset/pre/tasty-moments-post.md b/.changeset/pre/tasty-moments-post.md similarity index 100% rename from repos/effect/.changeset/pre/tasty-moments-post.md rename to .changeset/pre/tasty-moments-post.md diff --git a/repos/effect/.changeset/pre/tcp-schema-binary-default.md b/.changeset/pre/tcp-schema-binary-default.md similarity index 100% rename from repos/effect/.changeset/pre/tcp-schema-binary-default.md rename to .changeset/pre/tcp-schema-binary-default.md diff --git a/repos/effect/.changeset/pre/template-literal-parts-without-encoding.md b/.changeset/pre/template-literal-parts-without-encoding.md similarity index 100% rename from repos/effect/.changeset/pre/template-literal-parts-without-encoding.md rename to .changeset/pre/template-literal-parts-without-encoding.md diff --git a/repos/effect/.changeset/pre/ten-kings-fry.md b/.changeset/pre/ten-kings-fry.md similarity index 100% rename from repos/effect/.changeset/pre/ten-kings-fry.md rename to .changeset/pre/ten-kings-fry.md diff --git a/repos/effect/.changeset/pre/tender-deserts-pull.md b/.changeset/pre/tender-deserts-pull.md similarity index 100% rename from repos/effect/.changeset/pre/tender-deserts-pull.md rename to .changeset/pre/tender-deserts-pull.md diff --git a/repos/effect/.changeset/pre/tender-files-complete.md b/.changeset/pre/tender-files-complete.md similarity index 100% rename from repos/effect/.changeset/pre/tender-files-complete.md rename to .changeset/pre/tender-files-complete.md diff --git a/repos/effect/.changeset/pre/tender-points-sleep.md b/.changeset/pre/tender-points-sleep.md similarity index 100% rename from repos/effect/.changeset/pre/tender-points-sleep.md rename to .changeset/pre/tender-points-sleep.md diff --git a/repos/effect/.changeset/pre/terminate-openai-failed-streams.md b/.changeset/pre/terminate-openai-failed-streams.md similarity index 100% rename from repos/effect/.changeset/pre/terminate-openai-failed-streams.md rename to .changeset/pre/terminate-openai-failed-streams.md diff --git a/repos/effect/.changeset/pre/testschema-own-field-asts.md b/.changeset/pre/testschema-own-field-asts.md similarity index 100% rename from repos/effect/.changeset/pre/testschema-own-field-asts.md rename to .changeset/pre/testschema-own-field-asts.md diff --git a/repos/effect/.changeset/pre/theme-cli-prompts.md b/.changeset/pre/theme-cli-prompts.md similarity index 100% rename from repos/effect/.changeset/pre/theme-cli-prompts.md rename to .changeset/pre/theme-cli-prompts.md diff --git a/repos/effect/.changeset/pre/thick-pandas-wait.md b/.changeset/pre/thick-pandas-wait.md similarity index 100% rename from repos/effect/.changeset/pre/thick-pandas-wait.md rename to .changeset/pre/thick-pandas-wait.md diff --git a/repos/effect/.changeset/pre/thin-ducks-wonder.md b/.changeset/pre/thin-ducks-wonder.md similarity index 100% rename from repos/effect/.changeset/pre/thin-ducks-wonder.md rename to .changeset/pre/thin-ducks-wonder.md diff --git a/repos/effect/.changeset/pre/thin-ends-hug.md b/.changeset/pre/thin-ends-hug.md similarity index 100% rename from repos/effect/.changeset/pre/thin-ends-hug.md rename to .changeset/pre/thin-ends-hug.md diff --git a/repos/effect/.changeset/pre/thirty-ducks-go.md b/.changeset/pre/thirty-ducks-go.md similarity index 100% rename from repos/effect/.changeset/pre/thirty-ducks-go.md rename to .changeset/pre/thirty-ducks-go.md diff --git a/repos/effect/.changeset/pre/thirty-forks-march.md b/.changeset/pre/thirty-forks-march.md similarity index 100% rename from repos/effect/.changeset/pre/thirty-forks-march.md rename to .changeset/pre/thirty-forks-march.md diff --git a/repos/effect/.changeset/pre/thirty-pans-love.md b/.changeset/pre/thirty-pans-love.md similarity index 100% rename from repos/effect/.changeset/pre/thirty-pans-love.md rename to .changeset/pre/thirty-pans-love.md diff --git a/repos/effect/.changeset/pre/three-corners-sort.md b/.changeset/pre/three-corners-sort.md similarity index 100% rename from repos/effect/.changeset/pre/three-corners-sort.md rename to .changeset/pre/three-corners-sort.md diff --git a/repos/effect/.changeset/pre/three-ravens-jam.md b/.changeset/pre/three-ravens-jam.md similarity index 100% rename from repos/effect/.changeset/pre/three-ravens-jam.md rename to .changeset/pre/three-ravens-jam.md diff --git a/repos/effect/.changeset/pre/three-tomatoes-wave.md b/.changeset/pre/three-tomatoes-wave.md similarity index 100% rename from repos/effect/.changeset/pre/three-tomatoes-wave.md rename to .changeset/pre/three-tomatoes-wave.md diff --git a/repos/effect/.changeset/pre/tidy-apples-rest.md b/.changeset/pre/tidy-apples-rest.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-apples-rest.md rename to .changeset/pre/tidy-apples-rest.md diff --git a/repos/effect/.changeset/pre/tidy-carpets-smile.md b/.changeset/pre/tidy-carpets-smile.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-carpets-smile.md rename to .changeset/pre/tidy-carpets-smile.md diff --git a/repos/effect/.changeset/pre/tidy-cats-smile.md b/.changeset/pre/tidy-cats-smile.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-cats-smile.md rename to .changeset/pre/tidy-cats-smile.md diff --git a/repos/effect/.changeset/pre/tidy-cats-stream.md b/.changeset/pre/tidy-cats-stream.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-cats-stream.md rename to .changeset/pre/tidy-cats-stream.md diff --git a/repos/effect/.changeset/pre/tidy-codecs-inherit.md b/.changeset/pre/tidy-codecs-inherit.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-codecs-inherit.md rename to .changeset/pre/tidy-codecs-inherit.md diff --git a/repos/effect/.changeset/pre/tidy-dates-smile.md b/.changeset/pre/tidy-dates-smile.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-dates-smile.md rename to .changeset/pre/tidy-dates-smile.md diff --git a/repos/effect/.changeset/pre/tidy-floats-edit.md b/.changeset/pre/tidy-floats-edit.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-floats-edit.md rename to .changeset/pre/tidy-floats-edit.md diff --git a/repos/effect/.changeset/pre/tidy-foxes-own.md b/.changeset/pre/tidy-foxes-own.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-foxes-own.md rename to .changeset/pre/tidy-foxes-own.md diff --git a/repos/effect/.changeset/pre/tidy-geese-release.md b/.changeset/pre/tidy-geese-release.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-geese-release.md rename to .changeset/pre/tidy-geese-release.md diff --git a/repos/effect/.changeset/pre/tidy-graphs-cycle.md b/.changeset/pre/tidy-graphs-cycle.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-graphs-cycle.md rename to .changeset/pre/tidy-graphs-cycle.md diff --git a/repos/effect/.changeset/pre/tidy-icons-glow.md b/.changeset/pre/tidy-icons-glow.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-icons-glow.md rename to .changeset/pre/tidy-icons-glow.md diff --git a/repos/effect/.changeset/pre/tidy-int32-annotations.md b/.changeset/pre/tidy-int32-annotations.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-int32-annotations.md rename to .changeset/pre/tidy-int32-annotations.md diff --git a/repos/effect/.changeset/pre/tidy-json-objects.md b/.changeset/pre/tidy-json-objects.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-json-objects.md rename to .changeset/pre/tidy-json-objects.md diff --git a/repos/effect/.changeset/pre/tidy-json-schema-object-scopes.md b/.changeset/pre/tidy-json-schema-object-scopes.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-json-schema-object-scopes.md rename to .changeset/pre/tidy-json-schema-object-scopes.md diff --git a/repos/effect/.changeset/pre/tidy-lions-smile.md b/.changeset/pre/tidy-lions-smile.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-lions-smile.md rename to .changeset/pre/tidy-lions-smile.md diff --git a/repos/effect/.changeset/pre/tidy-matches-select.md b/.changeset/pre/tidy-matches-select.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-matches-select.md rename to .changeset/pre/tidy-matches-select.md diff --git a/repos/effect/.changeset/pre/tidy-mice-grin.md b/.changeset/pre/tidy-mice-grin.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-mice-grin.md rename to .changeset/pre/tidy-mice-grin.md diff --git a/repos/effect/.changeset/pre/tidy-pandas-smile.md b/.changeset/pre/tidy-pandas-smile.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-pandas-smile.md rename to .changeset/pre/tidy-pandas-smile.md diff --git a/repos/effect/.changeset/pre/tidy-parts-narrow.md b/.changeset/pre/tidy-parts-narrow.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-parts-narrow.md rename to .changeset/pre/tidy-parts-narrow.md diff --git a/repos/effect/.changeset/pre/tidy-plums-remember.md b/.changeset/pre/tidy-plums-remember.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-plums-remember.md rename to .changeset/pre/tidy-plums-remember.md diff --git a/repos/effect/.changeset/pre/tidy-ravens-import.md b/.changeset/pre/tidy-ravens-import.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-ravens-import.md rename to .changeset/pre/tidy-ravens-import.md diff --git a/repos/effect/.changeset/pre/tidy-schema-errors.md b/.changeset/pre/tidy-schema-errors.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-schema-errors.md rename to .changeset/pre/tidy-schema-errors.md diff --git a/repos/effect/.changeset/pre/tidy-scoped-refs-close.md b/.changeset/pre/tidy-scoped-refs-close.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-scoped-refs-close.md rename to .changeset/pre/tidy-scoped-refs-close.md diff --git a/repos/effect/.changeset/pre/tidy-spans-rest.md b/.changeset/pre/tidy-spans-rest.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-spans-rest.md rename to .changeset/pre/tidy-spans-rest.md diff --git a/repos/effect/.changeset/pre/tidy-sse-events.md b/.changeset/pre/tidy-sse-events.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-sse-events.md rename to .changeset/pre/tidy-sse-events.md diff --git a/repos/effect/.changeset/pre/tidy-stacks-encode.md b/.changeset/pre/tidy-stacks-encode.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-stacks-encode.md rename to .changeset/pre/tidy-stacks-encode.md diff --git a/repos/effect/.changeset/pre/tidy-stars-drive.md b/.changeset/pre/tidy-stars-drive.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-stars-drive.md rename to .changeset/pre/tidy-stars-drive.md diff --git a/repos/effect/.changeset/pre/tidy-tools-finish.md b/.changeset/pre/tidy-tools-finish.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-tools-finish.md rename to .changeset/pre/tidy-tools-finish.md diff --git a/repos/effect/.changeset/pre/tidy-tools-handle.md b/.changeset/pre/tidy-tools-handle.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-tools-handle.md rename to .changeset/pre/tidy-tools-handle.md diff --git a/repos/effect/.changeset/pre/tidy-tools-juggle.md b/.changeset/pre/tidy-tools-juggle.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-tools-juggle.md rename to .changeset/pre/tidy-tools-juggle.md diff --git a/repos/effect/.changeset/pre/tidy-tuples-rest.md b/.changeset/pre/tidy-tuples-rest.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-tuples-rest.md rename to .changeset/pre/tidy-tuples-rest.md diff --git a/repos/effect/.changeset/pre/tidy-wasps-wait.md b/.changeset/pre/tidy-wasps-wait.md similarity index 100% rename from repos/effect/.changeset/pre/tidy-wasps-wait.md rename to .changeset/pre/tidy-wasps-wait.md diff --git a/repos/effect/.changeset/pre/timeout-error-message.md b/.changeset/pre/timeout-error-message.md similarity index 100% rename from repos/effect/.changeset/pre/timeout-error-message.md rename to .changeset/pre/timeout-error-message.md diff --git a/repos/effect/.changeset/pre/timeout-or-else-cleanup-before-fallback.md b/.changeset/pre/timeout-or-else-cleanup-before-fallback.md similarity index 100% rename from repos/effect/.changeset/pre/timeout-or-else-cleanup-before-fallback.md rename to .changeset/pre/timeout-or-else-cleanup-before-fallback.md diff --git a/repos/effect/.changeset/pre/tiny-buckets-wave.md b/.changeset/pre/tiny-buckets-wave.md similarity index 100% rename from repos/effect/.changeset/pre/tiny-buckets-wave.md rename to .changeset/pre/tiny-buckets-wave.md diff --git a/repos/effect/.changeset/pre/tiny-dodos-juggle.md b/.changeset/pre/tiny-dodos-juggle.md similarity index 100% rename from repos/effect/.changeset/pre/tiny-dodos-juggle.md rename to .changeset/pre/tiny-dodos-juggle.md diff --git a/repos/effect/.changeset/pre/tiny-files-flow.md b/.changeset/pre/tiny-files-flow.md similarity index 100% rename from repos/effect/.changeset/pre/tiny-files-flow.md rename to .changeset/pre/tiny-files-flow.md diff --git a/repos/effect/.changeset/pre/tiny-lilies-flash.md b/.changeset/pre/tiny-lilies-flash.md similarity index 100% rename from repos/effect/.changeset/pre/tiny-lilies-flash.md rename to .changeset/pre/tiny-lilies-flash.md diff --git a/repos/effect/.changeset/pre/tiny-lizards-correct.md b/.changeset/pre/tiny-lizards-correct.md similarity index 100% rename from repos/effect/.changeset/pre/tiny-lizards-correct.md rename to .changeset/pre/tiny-lizards-correct.md diff --git a/repos/effect/.changeset/pre/tiny-rabbits-smile.md b/.changeset/pre/tiny-rabbits-smile.md similarity index 100% rename from repos/effect/.changeset/pre/tiny-rabbits-smile.md rename to .changeset/pre/tiny-rabbits-smile.md diff --git a/repos/effect/.changeset/pre/to-codec-json-schema.md b/.changeset/pre/to-codec-json-schema.md similarity index 100% rename from repos/effect/.changeset/pre/to-codec-json-schema.md rename to .changeset/pre/to-codec-json-schema.md diff --git a/repos/effect/.changeset/pre/tocodecjson-return-json-type.md b/.changeset/pre/tocodecjson-return-json-type.md similarity index 100% rename from repos/effect/.changeset/pre/tocodecjson-return-json-type.md rename to .changeset/pre/tocodecjson-return-json-type.md diff --git a/repos/effect/.changeset/pre/token-bucket-elapsed-refill.md b/.changeset/pre/token-bucket-elapsed-refill.md similarity index 100% rename from repos/effect/.changeset/pre/token-bucket-elapsed-refill.md rename to .changeset/pre/token-bucket-elapsed-refill.md diff --git a/repos/effect/.changeset/pre/tokenizer-whole-prompt-truncation.md b/.changeset/pre/tokenizer-whole-prompt-truncation.md similarity index 100% rename from repos/effect/.changeset/pre/tokenizer-whole-prompt-truncation.md rename to .changeset/pre/tokenizer-whole-prompt-truncation.md diff --git a/repos/effect/.changeset/pre/tool-get-json-schema-tests.md b/.changeset/pre/tool-get-json-schema-tests.md similarity index 100% rename from repos/effect/.changeset/pre/tool-get-json-schema-tests.md rename to .changeset/pre/tool-get-json-schema-tests.md diff --git a/repos/effect/.changeset/pre/tool-result-branch-encoding.md b/.changeset/pre/tool-result-branch-encoding.md similarity index 100% rename from repos/effect/.changeset/pre/tool-result-branch-encoding.md rename to .changeset/pre/tool-result-branch-encoding.md diff --git a/repos/effect/.changeset/pre/tough-graphs-cache.md b/.changeset/pre/tough-graphs-cache.md similarity index 100% rename from repos/effect/.changeset/pre/tough-graphs-cache.md rename to .changeset/pre/tough-graphs-cache.md diff --git a/repos/effect/.changeset/pre/tough-rooms-camp.md b/.changeset/pre/tough-rooms-camp.md similarity index 100% rename from repos/effect/.changeset/pre/tough-rooms-camp.md rename to .changeset/pre/tough-rooms-camp.md diff --git a/repos/effect/.changeset/pre/tough-taxis-own.md b/.changeset/pre/tough-taxis-own.md similarity index 100% rename from repos/effect/.changeset/pre/tough-taxis-own.md rename to .changeset/pre/tough-taxis-own.md diff --git a/repos/effect/.changeset/pre/tracer-disabled-timing.md b/.changeset/pre/tracer-disabled-timing.md similarity index 100% rename from repos/effect/.changeset/pre/tracer-disabled-timing.md rename to .changeset/pre/tracer-disabled-timing.md diff --git a/repos/effect/.changeset/pre/tracer-perf.md b/.changeset/pre/tracer-perf.md similarity index 100% rename from repos/effect/.changeset/pre/tracer-perf.md rename to .changeset/pre/tracer-perf.md diff --git a/repos/effect/.changeset/pre/track-mapped-error-domain.md b/.changeset/pre/track-mapped-error-domain.md similarity index 100% rename from repos/effect/.changeset/pre/track-mapped-error-domain.md rename to .changeset/pre/track-mapped-error-domain.md diff --git a/repos/effect/.changeset/pre/trie-remove-valued-prefix.md b/.changeset/pre/trie-remove-valued-prefix.md similarity index 100% rename from repos/effect/.changeset/pre/trie-remove-valued-prefix.md rename to .changeset/pre/trie-remove-valued-prefix.md diff --git a/repos/effect/.changeset/pre/true-actors-battle.md b/.changeset/pre/true-actors-battle.md similarity index 100% rename from repos/effect/.changeset/pre/true-actors-battle.md rename to .changeset/pre/true-actors-battle.md diff --git a/repos/effect/.changeset/pre/try-direct-error-types.md b/.changeset/pre/try-direct-error-types.md similarity index 100% rename from repos/effect/.changeset/pre/try-direct-error-types.md rename to .changeset/pre/try-direct-error-types.md diff --git a/repos/effect/.changeset/pre/try-promise-catch-defect.md b/.changeset/pre/try-promise-catch-defect.md similarity index 100% rename from repos/effect/.changeset/pre/try-promise-catch-defect.md rename to .changeset/pre/try-promise-catch-defect.md diff --git a/repos/effect/.changeset/pre/tuple-optional-evolve-result-types.md b/.changeset/pre/tuple-optional-evolve-result-types.md similarity index 100% rename from repos/effect/.changeset/pre/tuple-optional-evolve-result-types.md rename to .changeset/pre/tuple-optional-evolve-result-types.md diff --git a/repos/effect/.changeset/pre/twelve-dragons-move.md b/.changeset/pre/twelve-dragons-move.md similarity index 100% rename from repos/effect/.changeset/pre/twelve-dragons-move.md rename to .changeset/pre/twelve-dragons-move.md diff --git a/repos/effect/.changeset/pre/twenty-buttons-cheer.md b/.changeset/pre/twenty-buttons-cheer.md similarity index 100% rename from repos/effect/.changeset/pre/twenty-buttons-cheer.md rename to .changeset/pre/twenty-buttons-cheer.md diff --git a/repos/effect/.changeset/pre/twenty-facts-laugh.md b/.changeset/pre/twenty-facts-laugh.md similarity index 100% rename from repos/effect/.changeset/pre/twenty-facts-laugh.md rename to .changeset/pre/twenty-facts-laugh.md diff --git a/repos/effect/.changeset/pre/twenty-garlics-marry.md b/.changeset/pre/twenty-garlics-marry.md similarity index 100% rename from repos/effect/.changeset/pre/twenty-garlics-marry.md rename to .changeset/pre/twenty-garlics-marry.md diff --git a/repos/effect/.changeset/pre/two-roses-double.md b/.changeset/pre/two-roses-double.md similarity index 100% rename from repos/effect/.changeset/pre/two-roses-double.md rename to .changeset/pre/two-roses-double.md diff --git a/repos/effect/.changeset/pre/undici-response-form-data.md b/.changeset/pre/undici-response-form-data.md similarity index 100% rename from repos/effect/.changeset/pre/undici-response-form-data.md rename to .changeset/pre/undici-response-form-data.md diff --git a/repos/effect/.changeset/pre/unify-error-defect-stack-options.md b/.changeset/pre/unify-error-defect-stack-options.md similarity index 100% rename from repos/effect/.changeset/pre/unify-error-defect-stack-options.md rename to .changeset/pre/unify-error-defect-stack-options.md diff --git a/repos/effect/.changeset/pre/unique-directed-neighbors.md b/.changeset/pre/unique-directed-neighbors.md similarity index 100% rename from repos/effect/.changeset/pre/unique-directed-neighbors.md rename to .changeset/pre/unique-directed-neighbors.md diff --git a/repos/effect/.changeset/pre/unstable-http-schemas.md b/.changeset/pre/unstable-http-schemas.md similarity index 100% rename from repos/effect/.changeset/pre/unstable-http-schemas.md rename to .changeset/pre/unstable-http-schemas.md diff --git a/repos/effect/.changeset/pre/update-schema-arbitrary-report.md b/.changeset/pre/update-schema-arbitrary-report.md similarity index 100% rename from repos/effect/.changeset/pre/update-schema-arbitrary-report.md rename to .changeset/pre/update-schema-arbitrary-report.md diff --git a/repos/effect/.changeset/pre/upgrade-socket-error-listener.md b/.changeset/pre/upgrade-socket-error-listener.md similarity index 100% rename from repos/effect/.changeset/pre/upgrade-socket-error-listener.md rename to .changeset/pre/upgrade-socket-error-listener.md diff --git a/repos/effect/.changeset/pre/upgraded-request-skips-http-response-write.md b/.changeset/pre/upgraded-request-skips-http-response-write.md similarity index 100% rename from repos/effect/.changeset/pre/upgraded-request-skips-http-response-write.md rename to .changeset/pre/upgraded-request-skips-http-response-write.md diff --git a/repos/effect/.changeset/pre/upset-colts-stick.md b/.changeset/pre/upset-colts-stick.md similarity index 100% rename from repos/effect/.changeset/pre/upset-colts-stick.md rename to .changeset/pre/upset-colts-stick.md diff --git a/repos/effect/.changeset/pre/urlparams-null-input.md b/.changeset/pre/urlparams-null-input.md similarity index 100% rename from repos/effect/.changeset/pre/urlparams-null-input.md rename to .changeset/pre/urlparams-null-input.md diff --git a/repos/effect/.changeset/pre/urlparams-setall-immutable.md b/.changeset/pre/urlparams-setall-immutable.md similarity index 100% rename from repos/effect/.changeset/pre/urlparams-setall-immutable.md rename to .changeset/pre/urlparams-setall-immutable.md diff --git a/repos/effect/.changeset/pre/use-canonical-array-indices.md b/.changeset/pre/use-canonical-array-indices.md similarity index 100% rename from repos/effect/.changeset/pre/use-canonical-array-indices.md rename to .changeset/pre/use-canonical-array-indices.md diff --git a/repos/effect/.changeset/pre/use-url-can-parse.md b/.changeset/pre/use-url-can-parse.md similarity index 100% rename from repos/effect/.changeset/pre/use-url-can-parse.md rename to .changeset/pre/use-url-can-parse.md diff --git a/repos/effect/.changeset/pre/valid-owls-rest.md b/.changeset/pre/valid-owls-rest.md similarity index 100% rename from repos/effect/.changeset/pre/valid-owls-rest.md rename to .changeset/pre/valid-owls-rest.md diff --git a/repos/effect/.changeset/pre/validate-httpapi-handler-registration.md b/.changeset/pre/validate-httpapi-handler-registration.md similarity index 100% rename from repos/effect/.changeset/pre/validate-httpapi-handler-registration.md rename to .changeset/pre/validate-httpapi-handler-registration.md diff --git a/repos/effect/.changeset/pre/validate-openapi-global-conflicts.md b/.changeset/pre/validate-openapi-global-conflicts.md similarity index 100% rename from repos/effect/.changeset/pre/validate-openapi-global-conflicts.md rename to .changeset/pre/validate-openapi-global-conflicts.md diff --git a/repos/effect/.changeset/pre/vast-bananas-send.md b/.changeset/pre/vast-bananas-send.md similarity index 100% rename from repos/effect/.changeset/pre/vast-bananas-send.md rename to .changeset/pre/vast-bananas-send.md diff --git a/repos/effect/.changeset/pre/vast-deserts-travel.md b/.changeset/pre/vast-deserts-travel.md similarity index 100% rename from repos/effect/.changeset/pre/vast-deserts-travel.md rename to .changeset/pre/vast-deserts-travel.md diff --git a/repos/effect/.changeset/pre/violet-peaches-feel.md b/.changeset/pre/violet-peaches-feel.md similarity index 100% rename from repos/effect/.changeset/pre/violet-peaches-feel.md rename to .changeset/pre/violet-peaches-feel.md diff --git a/repos/effect/.changeset/pre/violet-pugs-tickle.md b/.changeset/pre/violet-pugs-tickle.md similarity index 100% rename from repos/effect/.changeset/pre/violet-pugs-tickle.md rename to .changeset/pre/violet-pugs-tickle.md diff --git a/repos/effect/.changeset/pre/violet-tips-open.md b/.changeset/pre/violet-tips-open.md similarity index 100% rename from repos/effect/.changeset/pre/violet-tips-open.md rename to .changeset/pre/violet-tips-open.md diff --git a/repos/effect/.changeset/pre/vitest-await-timeout-finalizers.md b/.changeset/pre/vitest-await-timeout-finalizers.md similarity index 100% rename from repos/effect/.changeset/pre/vitest-await-timeout-finalizers.md rename to .changeset/pre/vitest-await-timeout-finalizers.md diff --git a/repos/effect/.changeset/pre/vitest-five-migration.md b/.changeset/pre/vitest-five-migration.md similarity index 100% rename from repos/effect/.changeset/pre/vitest-five-migration.md rename to .changeset/pre/vitest-five-migration.md diff --git a/repos/effect/.changeset/pre/vitest-layer-concurrency.md b/.changeset/pre/vitest-layer-concurrency.md similarity index 100% rename from repos/effect/.changeset/pre/vitest-layer-concurrency.md rename to .changeset/pre/vitest-layer-concurrency.md diff --git a/repos/effect/.changeset/pre/vitest-layer-top-level-options.md b/.changeset/pre/vitest-layer-top-level-options.md similarity index 100% rename from repos/effect/.changeset/pre/vitest-layer-top-level-options.md rename to .changeset/pre/vitest-layer-top-level-options.md diff --git a/repos/effect/.changeset/pre/wacky-grapes-poke.md b/.changeset/pre/wacky-grapes-poke.md similarity index 100% rename from repos/effect/.changeset/pre/wacky-grapes-poke.md rename to .changeset/pre/wacky-grapes-poke.md diff --git a/repos/effect/.changeset/pre/wacky-rice-add.md b/.changeset/pre/wacky-rice-add.md similarity index 100% rename from repos/effect/.changeset/pre/wacky-rice-add.md rename to .changeset/pre/wacky-rice-add.md diff --git a/repos/effect/.changeset/pre/warm-clocks-format.md b/.changeset/pre/warm-clocks-format.md similarity index 100% rename from repos/effect/.changeset/pre/warm-clocks-format.md rename to .changeset/pre/warm-clocks-format.md diff --git a/repos/effect/.changeset/pre/warm-dolls-brake.md b/.changeset/pre/warm-dolls-brake.md similarity index 100% rename from repos/effect/.changeset/pre/warm-dolls-brake.md rename to .changeset/pre/warm-dolls-brake.md diff --git a/repos/effect/.changeset/pre/warm-friends-tie.md b/.changeset/pre/warm-friends-tie.md similarity index 100% rename from repos/effect/.changeset/pre/warm-friends-tie.md rename to .changeset/pre/warm-friends-tie.md diff --git a/repos/effect/.changeset/pre/warm-graphs-degree.md b/.changeset/pre/warm-graphs-degree.md similarity index 100% rename from repos/effect/.changeset/pre/warm-graphs-degree.md rename to .changeset/pre/warm-graphs-degree.md diff --git a/repos/effect/.changeset/pre/warm-rivers-cache.md b/.changeset/pre/warm-rivers-cache.md similarity index 100% rename from repos/effect/.changeset/pre/warm-rivers-cache.md rename to .changeset/pre/warm-rivers-cache.md diff --git a/repos/effect/.changeset/pre/warm-snails-shop.md b/.changeset/pre/warm-snails-shop.md similarity index 100% rename from repos/effect/.changeset/pre/warm-snails-shop.md rename to .changeset/pre/warm-snails-shop.md diff --git a/repos/effect/.changeset/pre/wet-news-invent.md b/.changeset/pre/wet-news-invent.md similarity index 100% rename from repos/effect/.changeset/pre/wet-news-invent.md rename to .changeset/pre/wet-news-invent.md diff --git a/repos/effect/.changeset/pre/whole-pets-build.md b/.changeset/pre/whole-pets-build.md similarity index 100% rename from repos/effect/.changeset/pre/whole-pets-build.md rename to .changeset/pre/whole-pets-build.md diff --git a/repos/effect/.changeset/pre/wild-donuts-brake.md b/.changeset/pre/wild-donuts-brake.md similarity index 100% rename from repos/effect/.changeset/pre/wild-donuts-brake.md rename to .changeset/pre/wild-donuts-brake.md diff --git a/repos/effect/.changeset/pre/wild-readers-clean.md b/.changeset/pre/wild-readers-clean.md similarity index 100% rename from repos/effect/.changeset/pre/wild-readers-clean.md rename to .changeset/pre/wild-readers-clean.md diff --git a/repos/effect/.changeset/pre/wild-suns-bearer-space.md b/.changeset/pre/wild-suns-bearer-space.md similarity index 100% rename from repos/effect/.changeset/pre/wild-suns-bearer-space.md rename to .changeset/pre/wild-suns-bearer-space.md diff --git a/repos/effect/.changeset/pre/windows-hide-child-process-console.md b/.changeset/pre/windows-hide-child-process-console.md similarity index 100% rename from repos/effect/.changeset/pre/windows-hide-child-process-console.md rename to .changeset/pre/windows-hide-child-process-console.md diff --git a/repos/effect/.changeset/pre/wise-ants-wave.md b/.changeset/pre/wise-ants-wave.md similarity index 100% rename from repos/effect/.changeset/pre/wise-ants-wave.md rename to .changeset/pre/wise-ants-wave.md diff --git a/repos/effect/.changeset/pre/wise-bats-encrypt.md b/.changeset/pre/wise-bats-encrypt.md similarity index 100% rename from repos/effect/.changeset/pre/wise-bats-encrypt.md rename to .changeset/pre/wise-bats-encrypt.md diff --git a/repos/effect/.changeset/pre/wise-files-watch.md b/.changeset/pre/wise-files-watch.md similarity index 100% rename from repos/effect/.changeset/pre/wise-files-watch.md rename to .changeset/pre/wise-files-watch.md diff --git a/repos/effect/.changeset/pre/wise-flags-shift.md b/.changeset/pre/wise-flags-shift.md similarity index 100% rename from repos/effect/.changeset/pre/wise-flags-shift.md rename to .changeset/pre/wise-flags-shift.md diff --git a/repos/effect/.changeset/pre/wise-graphs-connect.md b/.changeset/pre/wise-graphs-connect.md similarity index 100% rename from repos/effect/.changeset/pre/wise-graphs-connect.md rename to .changeset/pre/wise-graphs-connect.md diff --git a/repos/effect/.changeset/pre/wise-oranges-stay.md b/.changeset/pre/wise-oranges-stay.md similarity index 100% rename from repos/effect/.changeset/pre/wise-oranges-stay.md rename to .changeset/pre/wise-oranges-stay.md diff --git a/repos/effect/.changeset/pre/wise-pandas-lock.md b/.changeset/pre/wise-pandas-lock.md similarity index 100% rename from repos/effect/.changeset/pre/wise-pandas-lock.md rename to .changeset/pre/wise-pandas-lock.md diff --git a/repos/effect/.changeset/pre/with-error-reporting-effect-result.md b/.changeset/pre/with-error-reporting-effect-result.md similarity index 100% rename from repos/effect/.changeset/pre/with-error-reporting-effect-result.md rename to .changeset/pre/with-error-reporting-effect-result.md diff --git a/repos/effect/.changeset/pre/witty-lobsters-share.md b/.changeset/pre/witty-lobsters-share.md similarity index 100% rename from repos/effect/.changeset/pre/witty-lobsters-share.md rename to .changeset/pre/witty-lobsters-share.md diff --git a/repos/effect/.changeset/pre/worker-run-early-exit.md b/.changeset/pre/worker-run-early-exit.md similarity index 100% rename from repos/effect/.changeset/pre/worker-run-early-exit.md rename to .changeset/pre/worker-run-early-exit.md diff --git a/repos/effect/.changeset/pre/worker-runner-multi-disconnect.md b/.changeset/pre/worker-runner-multi-disconnect.md similarity index 100% rename from repos/effect/.changeset/pre/worker-runner-multi-disconnect.md rename to .changeset/pre/worker-runner-multi-disconnect.md diff --git a/repos/effect/.changeset/pre/workflow-proxy-discard-execution-id.md b/.changeset/pre/workflow-proxy-discard-execution-id.md similarity index 100% rename from repos/effect/.changeset/pre/workflow-proxy-discard-execution-id.md rename to .changeset/pre/workflow-proxy-discard-execution-id.md diff --git a/repos/effect/.changeset/pre/xhr-arraybuffer-readers.md b/.changeset/pre/xhr-arraybuffer-readers.md similarity index 100% rename from repos/effect/.changeset/pre/xhr-arraybuffer-readers.md rename to .changeset/pre/xhr-arraybuffer-readers.md diff --git a/repos/effect/.changeset/pre/yellow-adults-study.md b/.changeset/pre/yellow-adults-study.md similarity index 100% rename from repos/effect/.changeset/pre/yellow-adults-study.md rename to .changeset/pre/yellow-adults-study.md diff --git a/repos/effect/.changeset/pre/yellow-clocks-dance.md b/.changeset/pre/yellow-clocks-dance.md similarity index 100% rename from repos/effect/.changeset/pre/yellow-clocks-dance.md rename to .changeset/pre/yellow-clocks-dance.md diff --git a/repos/effect/.changeset/pre/yellow-dingos-jump.md b/.changeset/pre/yellow-dingos-jump.md similarity index 100% rename from repos/effect/.changeset/pre/yellow-dingos-jump.md rename to .changeset/pre/yellow-dingos-jump.md diff --git a/repos/effect/.changeset/pre/young-doors-change.md b/.changeset/pre/young-doors-change.md similarity index 100% rename from repos/effect/.changeset/pre/young-doors-change.md rename to .changeset/pre/young-doors-change.md diff --git a/repos/effect/.changeset/pre/zero-node-socket-timeout.md b/.changeset/pre/zero-node-socket-timeout.md similarity index 100% rename from repos/effect/.changeset/pre/zero-node-socket-timeout.md rename to .changeset/pre/zero-node-socket-timeout.md diff --git a/.changeset/project-computed-type-safety.md b/.changeset/project-computed-type-safety.md deleted file mode 100644 index 0b4384175..000000000 --- a/.changeset/project-computed-type-safety.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Tighten projectComputed projection schema typing against encoded repo fields and computed output types. diff --git a/.changeset/project-encoded-type-constraint.md b/.changeset/project-encoded-type-constraint.md deleted file mode 100644 index 3224826e2..000000000 --- a/.changeset/project-encoded-type-constraint.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Constrain `project` schema to require matching `Encoded` type with original success schema diff --git a/.changeset/project-union-schema.md b/.changeset/project-union-schema.md deleted file mode 100644 index ab4b331d7..000000000 --- a/.changeset/project-union-schema.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Allow query projections to use a repository's full union schema. diff --git a/.changeset/project-union-subsets.md b/.changeset/project-union-subsets.md deleted file mode 100644 index cfcd3e5bd..000000000 --- a/.changeset/project-union-subsets.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Fix nested DTO subset projection inference for tagged unions. diff --git a/.changeset/projectable-from-domain.md b/.changeset/projectable-from-domain.md deleted file mode 100644 index c60797afa..000000000 --- a/.changeset/projectable-from-domain.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -Tag-aware `ProjectableFromDomain` for `projectComputed`: projection Encoded fields must exist on the matching domain tagged state (or be computed). Prevents Overview.List SchemaErrors when cancel states omit workflow lock fields like `activeRequest`. diff --git a/.changeset/projectable-key-guard-project.md b/.changeset/projectable-key-guard-project.md deleted file mode 100644 index 45052bae9..000000000 --- a/.changeset/projectable-key-guard-project.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -Keep tag-aware `ProjectableFromDomain` for `projectComputed` only; restore loose key-presence guard for `project()` so view DTOs with reshaped fields keep typechecking. diff --git a/.changeset/provide-dual.md b/.changeset/provide-dual.md deleted file mode 100644 index 2faa2bc68..000000000 --- a/.changeset/provide-dual.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Make `Schema.provide` dual (pipeable) diff --git a/.changeset/publish-tsconfig-postpack.md b/.changeset/publish-tsconfig-postpack.md deleted file mode 100644 index 18c17292d..000000000 --- a/.changeset/publish-tsconfig-postpack.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/cli": patch -"@effect-app/eslint-codegen-model": patch -"@effect-app/infra": patch -"@effect-app/vue": patch -"effect-app": patch ---- - -Move release tsconfig flattening from publish to pack lifecycle so package configs are restored before registry upload/auth can fail. diff --git a/.changeset/pure-usesync-cleanup.md b/.changeset/pure-usesync-cleanup.md deleted file mode 100644 index 31dd061c1..000000000 --- a/.changeset/pure-usesync-cleanup.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Refactor `Pure` helpers to use typed `useSync` calls instead of unsafe casts. diff --git a/.changeset/query-aggregate-support.md b/.changeset/query-aggregate-support.md deleted file mode 100644 index a0a533f88..000000000 --- a/.changeset/query-aggregate-support.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Add aggregate query support: `Q.aggregate(schema, aggregateMap)` performs GROUP BY + aggregate functions at the database level (Memory, SQL, Cosmos). - -- New `agg` DSL namespace: `agg.field(path)` (group-by), `agg.count()`, `agg.countWhen(op)`, `agg.sum(field)`, `agg.min(field)`, `agg.max(field)` -- New `aggregate(schema, aggregateMap)` query operator replaces in-memory grouping with a single DB-level query -- Memory store: pure JS group-by + aggregation -- SQL store: `GROUP BY` + `COUNT(CASE WHEN ...)` / `SUM` / `MIN` / `MAX` -- Cosmos store: `GROUP BY` + `SUM(IIF(...))` for conditional counts diff --git a/.changeset/query-map-has-ops.md b/.changeset/query-map-has-ops.md deleted file mode 100644 index 62a7d17bc..000000000 --- a/.changeset/query-map-has-ops.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"effect-app": minor -"@effect-app/infra": minor ---- - -Query maps as JSON arrays of `[key, value]` tuples. - -`where("meta", "hasKey" | "hasValue" | "hasKeyValue", ...)` (and `not*` / `*-any` / `*-all` variants) filter `ReadonlyMap` fields. Memory, Disk, SQLite, Postgres, and Cosmos compile those ops against the encoded tuple array. diff --git a/.changeset/query-optional-mode.md b/.changeset/query-optional-mode.md deleted file mode 100644 index c28dbb23a..000000000 --- a/.changeset/query-optional-mode.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": minor ---- - -Add `mode: "optional"` overload for queries. When `mode: "optional"` is set, the `arg` must be a `WatchSource>`. The query is disabled (`enabled: false`) when the option is `None`, and enabled with the unwrapped value when `Some`. diff --git a/.changeset/query-span-propagation.md b/.changeset/query-span-propagation.md deleted file mode 100644 index 16dc577f7..000000000 --- a/.changeset/query-span-propagation.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Preserve Effect parent spans across query refetch and invalidation. diff --git a/.changeset/quick-seals-relate.md b/.changeset/quick-seals-relate.md deleted file mode 100644 index 3312d8ef0..000000000 --- a/.changeset/quick-seals-relate.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/cli": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -Update Effect dependencies to 4.0.0-beta.28 across workspace packages. diff --git a/.changeset/quick-wolves-yawn.md b/.changeset/quick-wolves-yawn.md deleted file mode 100644 index a9c5fb5fa..000000000 --- a/.changeset/quick-wolves-yawn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix: isA diff --git a/.changeset/quiet-shrimps-juggle.md b/.changeset/quiet-shrimps-juggle.md deleted file mode 100644 index 15066e680..000000000 --- a/.changeset/quiet-shrimps-juggle.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch ---- - -Refactor eligible schema classes and tagged classes to Opaque schemas, and migrate constructor call sites to use `.make` for those models. diff --git a/.changeset/quiet-tigers-reply.md b/.changeset/quiet-tigers-reply.md deleted file mode 100644 index 406e3f2ef..000000000 --- a/.changeset/quiet-tigers-reply.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -bs diff --git a/.changeset/quiet-tools-rest.md b/.changeset/quiet-tools-rest.md deleted file mode 100644 index 06de1397e..000000000 --- a/.changeset/quiet-tools-rest.md +++ /dev/null @@ -1,5 +0,0 @@ ---- - ---- - -Run T3 worktree dependency preparation asynchronously while retaining portable Git hook setup. diff --git a/.changeset/rare-llamas-begin.md b/.changeset/rare-llamas-begin.md deleted file mode 100644 index 0e1478d01..000000000 --- a/.changeset/rare-llamas-begin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -allow excess props in openapi schemas diff --git a/.changeset/rare-rules-help.md b/.changeset/rare-rules-help.md deleted file mode 100644 index b19cdd872..000000000 --- a/.changeset/rare-rules-help.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Fix OmegaForm required override handling so omitted boolean props fall back to schema metadata. diff --git a/.changeset/ready-bags-wave.md b/.changeset/ready-bags-wave.md deleted file mode 100644 index 2ecf17d84..000000000 --- a/.changeset/ready-bags-wave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -unify runPromise diff --git a/.changeset/ready-bananas-scream.md b/.changeset/ready-bananas-scream.md deleted file mode 100644 index 8db9c8e07..000000000 --- a/.changeset/ready-bananas-scream.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch -"@effect-app/eslint-shared-config": patch -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- - -update packages diff --git a/.changeset/real-lilies-design.md b/.changeset/real-lilies-design.md deleted file mode 100644 index 678429a71..000000000 --- a/.changeset/real-lilies-design.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/cli": patch ---- - -update to latest effect diff --git a/.changeset/real-suits-clean.md b/.changeset/real-suits-clean.md deleted file mode 100644 index 75d7ca00c..000000000 --- a/.changeset/real-suits-clean.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -fix diff --git a/.changeset/recover-stuck-query-interrupts.md b/.changeset/recover-stuck-query-interrupts.md deleted file mode 100644 index af5ba699f..000000000 --- a/.changeset/recover-stuck-query-interrupts.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Recover interrupted queries and classify query-side suspense interrupts. - -- A query fetch that is interrupted (a subscriber lost interest, a refresh superseded it, or the component navigated) can be left `waiting = true` with no fiber running — effect-core hides the interrupt by removing the result-observer before interrupting, so it is never written back. `isStaleResult`/swr short-circuit on `waiting`, so that state is never revalidated and becomes **terminal** (a cold suspense read throws → blank page; a warm one serves stale forever). `recoverStuckWaitingOnMount` now treats a `waiting` result with `inFlight === 0` as not-yet-fetched and refetches it on mount. Interrupts are **not** auto-retried — recovery only fires for a genuine (re)mounting observer, and a live in-flight fetch (`inFlight > 0`) is joined, not superseded. Concurrent mounts share a single recovery fetch. Exposes `queryFetchStates` / `QueryFetchState`. - -- `useSuspenseQuery` / `useSuspenseQueryNew` now convert an interrupt-only failure that settles **while the component is still mounted** into a typed `SuspenseInterruptedError` (a `Data.TaggedError` carrying the original cause). Such an interrupt cannot be a navigation/unmount cancel — that path interrupts the suspense fiber itself and never yields a still-mounted `Failure` exit — so it is query-side (e.g. a server RPC interrupt `Exit` delivered over a 200). Error boundaries can render it ("the request was interrupted — reload?") instead of silencing it into a blank page, while continuing to silence genuine navigation interrupts. Adds `SuspenseInterruptedError` / `isSuspenseInterruptedError`. diff --git a/.changeset/red-pillows-repeat.md b/.changeset/red-pillows-repeat.md deleted file mode 100644 index 39d5ef5fd..000000000 --- a/.changeset/red-pillows-repeat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -update packages diff --git a/.changeset/relation-collect-fields.md b/.changeset/relation-collect-fields.md deleted file mode 100644 index b3d55d8d3..000000000 --- a/.changeset/relation-collect-fields.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Add `collectFields`/`collectDistinctFields` to `relation()` DSL for collecting values from multiple fields of relation items into a single flattened array. - -Example: given `T = { a: boolean, items: { x: string, y: string, z: number }[] }[]`, you can now collect all distinct `x` and `y` values into a single `string[]`: - -```ts -relation("items").collectDistinctFields(["x", "y"]) -``` diff --git a/.changeset/remove-by-id-array.md b/.changeset/remove-by-id-array.md deleted file mode 100644 index 7d926594e..000000000 --- a/.changeset/remove-by-id-array.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -`removeById` now takes `id | NonEmptyReadonlyArray` instead of a variadic rest, and the extended repo's `removeById` accepts a `batch` option to chunk large deletes — consistent with `save` and `remove`. diff --git a/.changeset/remove-class-struct-pick-omit.md b/.changeset/remove-class-struct-pick-omit.md deleted file mode 100644 index 5a69ca104..000000000 --- a/.changeset/remove-class-struct-pick-omit.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -Remove pick/omit customizations from Class/TaggedClass/Struct/TaggedStruct. Use `Struct.pick(X.fields, [...])` from `effect-app` instead. diff --git a/.changeset/remove-legacy-from-make-client.md b/.changeset/remove-legacy-from-make-client.md deleted file mode 100644 index 83b16c604..000000000 --- a/.changeset/remove-legacy-from-make-client.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": minor ---- - -Remove `legacy` from `makeClient` return and clean up `LegacyMutation`, `LegacyMutationImpl`, and related types. diff --git a/.changeset/remove-legacy-mutate-result-2.md b/.changeset/remove-legacy-mutate-result-2.md deleted file mode 100644 index 987fd0d4e..000000000 --- a/.changeset/remove-legacy-mutate-result-2.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": minor ---- - -Remove legacy `mutateToResult` stream mutation factory, `wrapStream` command builder, and standard command progress reporting (`running`/`progress` from the old stream factory path). Keep only the `mutate` path for use with `streamFn` combinators. Remove obsolete types (`StreamMutationWithExtensions`, `StreamCommandWithExtensions`, `StreamFnExtension`, `MutateStreamCallOptions`) and the internal `makeStreamMutation` function. Rename `mutate.wrapStream` shorthand to `mutate.wrap` to match the non-stream convention. diff --git a/.changeset/remove-lodash-from-effect-app.md b/.changeset/remove-lodash-from-effect-app.md deleted file mode 100644 index b0e38be2e..000000000 --- a/.changeset/remove-lodash-from-effect-app.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Remove lodash type imports from utils.ts, replacing with native TypeScript equivalents. diff --git a/.changeset/remove-operations.md b/.changeset/remove-operations.md deleted file mode 100644 index 8911cc433..000000000 --- a/.changeset/remove-operations.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@effect-app/infra": patch -"effect-app": patch -"@effect-app/vue": patch ---- - -Remove Operations service and repo diff --git a/.changeset/remove-queue-machinery.md b/.changeset/remove-queue-machinery.md deleted file mode 100644 index 280d159d2..000000000 --- a/.changeset/remove-queue-machinery.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@effect-app/infra": patch -"effect-app": patch ---- - -Remove obsolete queue machinery left unused after the move to cluster entities: the SB/SQLite/mem `QueueMaker` implementations (`QueueMaker/{SQLQueue,memQueue,sbqueue}.ts`), their `ServiceBus.ts`/`memQueue.ts` transports, and `RequestFiberSet.ts` (its `setRootParentSpan` helper is inlined into `MainFiberSet`). `effect-app/QueueMaker` keeps only `QueueMeta`; the `QueueBase` interface and empty `QueueMaker` ops object are dropped. diff --git a/.changeset/remove-tagged-error-compat.md b/.changeset/remove-tagged-error-compat.md deleted file mode 100644 index 66c2f2a4c..000000000 --- a/.changeset/remove-tagged-error-compat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Remove `TaggedError` compatibility re-export, use `TaggedErrorClass` directly diff --git a/.changeset/remove-tagged-request.md b/.changeset/remove-tagged-request.md deleted file mode 100644 index 80885a1c4..000000000 --- a/.changeset/remove-tagged-request.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"effect-app": minor -"@effect-app/infra": patch -"@effect-app/vue": patch ---- - -Remove `TaggedRequest` from `makeRpcClient`, now only `TaggedRequestFor` is returned. Remove all legacy `meta.moduleName` support — `id` and `moduleName` are now required on `Req` type. Remove `makeRpcGroup` (use `makeRpcGroupFromRequestsAndModuleName` instead). diff --git a/.changeset/remove-void-schema-override.md b/.changeset/remove-void-schema-override.md deleted file mode 100644 index ec58a9596..000000000 --- a/.changeset/remove-void-schema-override.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Remove the local `Schema.Void` / `SchemaAST.Void` override. effect `4.0.0-beta.90` ships the TypeScript `void` parser semantics upstream (`SchemaAST.Void.getParser()` → `fromAnyToConst(undefined)`, the effect-smol PR #2475 behavior), so `S.Void` already accepts any present value and discards it to `undefined`. `Schema.Void` now re-uses effect's `S.Void` and `SchemaAST` is a plain re-export of `effect/SchemaAST`. The unused `Void_` alias is dropped. No behavior change. diff --git a/.changeset/remove-withDefaultConstructor.md b/.changeset/remove-withDefaultConstructor.md deleted file mode 100644 index 26c595ff7..000000000 --- a/.changeset/remove-withDefaultConstructor.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"effect-app": minor -"@effect-app/infra": patch -"@effect-app/vue-components": patch ---- - -Remove `withDefaultConstructor` wrapper, use `S.withConstructorDefault` directly with `Effect.succeed`/`Effect.sync`. diff --git a/.changeset/rename-mutate-stream.md b/.changeset/rename-mutate-stream.md deleted file mode 100644 index c75f8de1b..000000000 --- a/.changeset/rename-mutate-stream.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -Rename stream mutation helpers: `mutateStream` → `mutateToResult`, `mutateStream2` → `mutate`. diff --git a/.changeset/rename-withdefault-to-withconstructordefault.md b/.changeset/rename-withdefault-to-withconstructordefault.md deleted file mode 100644 index 936806a6c..000000000 --- a/.changeset/rename-withdefault-to-withconstructordefault.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"effect-app": patch ---- - -Rename `withDefault` schema extensions to `withConstructorDefault` for clarity. - -Document that `.withConstructorDefault` is **construction-only** (applied during `.make(...)` when a field is omitted) and is **not** applied during decode — it cannot be used to JIT-migrate database fields. Per-property JSDoc on every `.withConstructorDefault` / `.withDecodingDefaultType` exposed by `Schema/ext.ts`, `Schema/numbers.ts`, `Schema/moreStrings.ts`, and `ids.ts` so the caveat is visible on hover. - -Re-export `withConstructorDefault`, `withDecodingDefault`, `withDecodingDefaultKey`, `withDecodingDefaultType`, and `withDecodingDefaultTypeKey` from `effect-app/Schema` with explicit JSDoc. `withDecodingDefault*` is discouraged for persisted data: a missing field may be data corruption rather than an old-shape document, and silently substituting a default hides the problem. Prefer an explicit, preferably versioned migration of database data over decode-time fallbacks. diff --git a/.changeset/replace-proxify-with-accessors.md b/.changeset/replace-proxify-with-accessors.md deleted file mode 100644 index 931c8e6b4..000000000 --- a/.changeset/replace-proxify-with-accessors.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": minor -"@effect-app/vue": minor ---- - -Replace `proxify` with explicit service accessor helpers: `accessFn`, `accessEffectFn`, `accessCn`, `accessEffectCn`. diff --git a/.changeset/repo-derived-query-invalidation.md b/.changeset/repo-derived-query-invalidation.md deleted file mode 100644 index 6b6a6180b..000000000 --- a/.changeset/repo-derived-query-invalidation.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"effect-app": minor -"@effect-app/infra": minor -"@effect-app/vue": minor ---- - -Derive query invalidation from repository read/write dependencies and propagate dependency metadata through RPC clients. diff --git a/.changeset/repo-mutations-accept-empty-arrays.md b/.changeset/repo-mutations-accept-empty-arrays.md deleted file mode 100644 index 8d2f5de50..000000000 --- a/.changeset/repo-mutations-accept-empty-arrays.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Repository `save`, `remove`, and `removeById` now accept plain `ReadonlyArray` instead of `NonEmptyReadonlyArray`. Callers no longer need to narrow or guard for non-emptiness before invoking — empty inputs short-circuit to a no-op, making it ergonomic to pass through query results directly. diff --git a/.changeset/repo-span-topology.md b/.changeset/repo-span-topology.md deleted file mode 100644 index 3158abcba..000000000 --- a/.changeset/repo-span-topology.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Repository owns OTel span topology; store adapters annotate db.* semconv attrs on the current span instead of opening their own child spans. Eliminates 1-1 nested span chains (e.g. `Repository.query` → `Cosmos.filter`). Adds `annotateDb` helper alongside `withDbSpan` in `otel.ts`. Repo public ops (`find`, `all`, `query`, `queryRaw`, `mapped.*`) get explicit `Repository.` spans; internal codec steps (`encodeMany`, `parseMany`, `parseMany2`) keep bare names. `validateSample` opens per-iteration sub-spans to prevent attribute clobber. Adds WeakMap decoder cache for `parseMany2` schemas. diff --git a/.changeset/repo-spans-itemtype.md b/.changeset/repo-spans-itemtype.md deleted file mode 100644 index 57511e978..000000000 --- a/.changeset/repo-spans-itemtype.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Add `itemType` annotation to all repository spans diff --git a/.changeset/repository-registry.md b/.changeset/repository-registry.md deleted file mode 100644 index 97dcc0339..000000000 --- a/.changeset/repository-registry.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Add RepositoryRegistry service that tracks all repositories by modelName, with `seedNamespace` to seed all registered repos in parallel and `entries` to inspect the registry. - -Make non-primary namespace seeding explicit: Store and Repository now expose `seedNamespace` instead of auto-seeding on access. Primary namespace is still seeded eagerly on initialization. - -SQL stores: table creation (`CREATE TABLE IF NOT EXISTS`) is now part of `seedNamespace` instead of running eagerly at store construction, ensuring tables for non-primary namespaces are only created when explicitly seeded. diff --git a/.changeset/request-scoped-dependencies.md b/.changeset/request-scoped-dependencies.md deleted file mode 100644 index f06594b26..000000000 --- a/.changeset/request-scoped-dependencies.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch ---- - -Use set-backed data dependencies and provide request-scoped dependency services through a shared root-checked helper. diff --git a/.changeset/require-middleware-layers.md b/.changeset/require-middleware-layers.md deleted file mode 100644 index f83130751..000000000 --- a/.changeset/require-middleware-layers.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -Require middleware to flow through `makeRpcClient` and the live layer through `makeRouter`. - -### `makeRpcClient(middleware, generalErrors?)` - -Signature drops the `rcs` (request-context map wrapper) parameter. `rcs` was only load-bearing on the type side for `RequestConfig` inference; that information is now derived from `middleware.requestContextMap`. `middleware` is required — the previous "rcs + optional middleware" overload is gone. - -**Migration**: - -```diff --makeRpcClient(RequestContextMap, undefined, AppMiddleware) -+makeRpcClient(AppMiddleware) -``` - -For tests/clients without a real middleware, build a minimal stub (`{ requestContextMap, requestContext }`) or pass any value satisfying `ClientMiddleware`. - -### `makeRouter(middlewareLive)` - -`makeRouter()` no longer infers the live middleware layer from `meta.middleware.Default`. The Live layer is now passed explicitly to `makeRouter`, and the request classes only carry the middleware tag (schema-only). This decouples the router from any assumption that the middleware tag exposes a `Default` static. - -**Migration**: - -```diff --export const { Router, matchAll } = makeRouter() -+export const { Router, matchAll } = makeRouter(AppMiddleware.Default) -``` diff --git a/.changeset/resolver-cache-use-official.md b/.changeset/resolver-cache-use-official.md deleted file mode 100644 index 8796b7c82..000000000 --- a/.changeset/resolver-cache-use-official.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Rewrite `withRequestResolverCache` to use official `RequestResolver.withCache`, creating a cached resolver per ContextMap via `getOrCreateStoreEffect` with semaphore-guarded initialization. diff --git a/.changeset/restore-tight-project-guard.md b/.changeset/restore-tight-project-guard.md deleted file mode 100644 index 58d2bfc21..000000000 --- a/.changeset/restore-tight-project-guard.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -Keep tag-aware `ProjectableGuard` on both `project()` and `projectComputed` (no loose key-only paper-over). - -Hardening: - -- single-literal tags allow dual same-tag domain variants (KeysOfUnion of matched members) -- multi-tag / string tags still require keys on every matched member -- optional projection/domain keys checked by key presence only (not optional-assignability) - -Call sites must project domain-owned fields per tagged state. diff --git a/.changeset/router-no-meta.md b/.changeset/router-no-meta.md deleted file mode 100644 index b270edc5e..000000000 --- a/.changeset/router-no-meta.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Router `matchFor` no longer requires `meta` property on resource when requests carry `moduleName` from `TaggedRequestFor` diff --git a/.changeset/rpc-stream-support.md b/.changeset/rpc-stream-support.md deleted file mode 100644 index dda463c45..000000000 --- a/.changeset/rpc-stream-support.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"effect-app": minor -"@effect-app/infra": minor ---- - -Add Effect RPC `Stream` support to the wrapper. - -- New `Stream` request constructor on `TaggedRequestFor` parallel to `Query`/`Command`. Emits resources with `type: "stream"`. -- Server router (`@effect-app/infra` `routing.ts`) accepts stream resources whose handlers return a `Stream.Stream` (or a function from input to one). Forwards `stream: true` to `Rpc.make` so `RpcSchema.Stream` wrapping is applied. Streams bypass `applyRequestTypeInterruptibility` and the `Effect.withSpan` wrapping (the RPC server adds its own span). -- Client (`apiClientFactory.ts`) detects stream resources, forwards `stream: true` when constructing `RpcGroup`, and exposes the per-request `handler` as a `Stream.Stream` (via `Stream.unwrap` over the `ManagedRuntime` context) instead of an `Effect`. `Invalidation.CommandResponseWithMetaData` continues to apply only to commands. -- New `RequestStreamHandler` / `RequestStreamHandlerWithInput` shapes in `clientFor.ts`; `RequestHandlers` dispatches on `type: "stream"`. diff --git a/.changeset/salty-weeks-walk.md b/.changeset/salty-weeks-walk.md deleted file mode 100644 index c2fc23af0..000000000 --- a/.changeset/salty-weeks-walk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix request attr diff --git a/.changeset/schema-concurrency-unbounded.md b/.changeset/schema-concurrency-unbounded.md deleted file mode 100644 index 91341bcfd..000000000 --- a/.changeset/schema-concurrency-unbounded.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": minor ---- - -Add `concurrency: "unbounded"` parseOptions annotation to Schema constructors (Struct, Array, NonEmptyArray, Record, TaggedStruct, ReadonlySet, ReadonlyMap, Class, TaggedClass) so all encode/decode operations automatically run with unbounded concurrency. Also override `mapFields` on Struct and Class/TaggedClass to preserve the annotation. diff --git a/.changeset/schema-encode-slow-metrics.md b/.changeset/schema-encode-slow-metrics.md deleted file mode 100644 index da4f0eb03..000000000 --- a/.changeset/schema-encode-slow-metrics.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"effect-app": patch ---- - -Improve repository schema encode/decode telemetry for event-loop tail analysis. - -- widen `app.schema.{encode,decode}.duration` histogram buckets into multi-second stalls -- count `app.schema.slow` (duration ≥ 100ms) with `app.entity` / operation attributes for alertable rates -- annotate spans with `app.schema.slow` and, on encode, `app.entity.state` from the first item's `_tag` diff --git a/.changeset/schema-facade-identifier-structfacade.md b/.changeset/schema-facade-identifier-structfacade.md deleted file mode 100644 index d2c07836c..000000000 --- a/.changeset/schema-facade-identifier-structfacade.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"effect-app": minor ---- - -Schema/Class facades: add `StructFacade` and carry `identifier` on the class facades. - -- Add `StructFacade` = `Omit, "Type" | "Encoded" | "~type.make.in" | "DecodingServices" | "EncodingServices"> & { pinned type-level members }`. A top-level `const X = S.Struct(...)` / `S.TaggedStruct(...)` model faceted by the `.d.ts`-emit compiler is retyped to it: still a real `S.Struct` (so `Workflow.AnyStructSchema`, the `Struct` reconstruction, `Union`, `.fields.x` keep working) while `Type`/`Encoded`/make/services resolve to the named namespace interfaces. -- Add `readonly identifier: string` to `OpaqueClassFacade` and `OpaqueErrorFacadeClass` (an `S.Class` static lost from the bare emitted interface, which the compiler otherwise had to hand-emit per model). `OpaqueFacade` is intentionally left untouched — `S.Opaque` and requests build on `S.Bottom`, not `S.Class`, so they have no `identifier`. diff --git a/.changeset/schema-json-collections.md b/.changeset/schema-json-collections.md deleted file mode 100644 index 0e74e3992..000000000 --- a/.changeset/schema-json-collections.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": minor ---- - -Add `ReadonlySetFromArray` and `ReadonlyMapFromArray` schema transformations that decode from annotated arrays to Set/Map. Update `ReadonlySet` and `ReadonlyMap` to use these internally. diff --git a/.changeset/secret-url-tests.md b/.changeset/secret-url-tests.md deleted file mode 100644 index 1a6c4f367..000000000 --- a/.changeset/secret-url-tests.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Add SecretURL tests and switch secretURL config to use Config.nonEmptyString diff --git a/.changeset/select-delayed-cache-invalidation.md b/.changeset/select-delayed-cache-invalidation.md deleted file mode 100644 index 5a030621b..000000000 --- a/.changeset/select-delayed-cache-invalidation.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -"@effect-app/vue": minor ---- - -Add `select` option to `MutationOptionsBase` for a second cache invalidation after long-running operations. - -When `select` is provided, cache invalidation fires twice: - -1. Immediately when the mutation completes (existing behaviour). -2. Again after the `select` effect finishes — useful for polling or waiting for a background job before refreshing data. - -```ts -useMutation(startExportCommand, { - select: (result) => pollUntilDone(result.jobId) -}) -``` diff --git a/.changeset/sendgrid-configurable-fake-address.md b/.changeset/sendgrid-configurable-fake-address.md deleted file mode 100644 index 5442509ff..000000000 --- a/.changeset/sendgrid-configurable-fake-address.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Add configurable `fakeMailAddress` to `SendgridConfig`. Supports `{i}` placeholder for unique addresses, e.g. `"test+{i}@example.com"`. diff --git a/.changeset/server-driven-cache-invalidation.md b/.changeset/server-driven-cache-invalidation.md deleted file mode 100644 index 6b3c38243..000000000 --- a/.changeset/server-driven-cache-invalidation.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -"@effect-app/infra": minor -"effect-app": minor -"@effect-app/vue": minor ---- - -Add server-driven cache invalidation via RPC response headers. - -- `effect-app/rpc`: new `Invalidation` module with `InvalidationKey` / `InvalidationKeys` schemas, `Invalidates` annotation (for declaring static invalidation on Rpc definitions), `InvalidationSet` reference (request-scoped accumulator), and `makeInvalidationSet` helper. -- `effect-app/middleware`: new `InvalidationMiddleware` RPC middleware tag; included in `DefaultGenericMiddlewares`. -- `effect-app/client`: new `InvalidationKeys` module with `InvalidationKeysFromServer` reference and `makeInvalidationKeysService` helper; `apiClientFactory` now taps HTTP responses to read the `x-invalidate` header and forward keys to `InvalidationKeysFromServer`. -- `@effect-app/infra`: new `InvalidationMiddlewareLive` RPC middleware implementation that owns the full lifecycle — creates a request-scoped `InvalidationSet` (backed by a `Ref`), pre-populates it from the `Invalidates` annotation, provides it to the handler, and after the handler completes registers an HTTP pre-response handler (via `appendPreResponseHandlerUnsafe`) to write the accumulated keys as an `x-invalidate` response header. No separate HTTP middleware is needed. -- `@effect-app/vue`: `invalidateQueries` / `useMutation` now reads server-provided invalidation keys from `InvalidationKeysFromServer` after each mutation and applies them alongside the client-side invalidation. diff --git a/.changeset/server-invalidation-handler-shorthand.md b/.changeset/server-invalidation-handler-shorthand.md deleted file mode 100644 index 298614e81..000000000 --- a/.changeset/server-invalidation-handler-shorthand.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -"effect-app": patch ---- - -`InvalidationSet.add` accepts RPC handler shorthand. - -Server-side handlers may now pass an RPC handler object directly to -`InvalidationSet.add`; its query key is derived via `makeQueryKey`. Raw -`InvalidationKey` arrays continue to work. - -```ts -// before -yield* Invalidation.InvalidationSet.use(_ => _.add(makeQueryKey(UserRsc.GetMe))) - -// after -yield* Invalidation.InvalidationSet.use(_ => _.add(UserRsc.GetMe)) -``` diff --git a/.changeset/servicebus-log-only-spans.md b/.changeset/servicebus-log-only-spans.md deleted file mode 100644 index ea7d3207d..000000000 --- a/.changeset/servicebus-log-only-spans.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Drop OTel spans from ServiceBus client/sender/receiver/subscription lifecycle wrappers; keep `withLogSpan` + info logs only. Removes high-cardinality `sessionId` from log span names; promotes it to `messaging.session.id` log attribute via `Effect.annotateLogs`. diff --git a/.changeset/shaggy-terms-show.md b/.changeset/shaggy-terms-show.md deleted file mode 100644 index 97077f219..000000000 --- a/.changeset/shaggy-terms-show.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix bug diff --git a/.changeset/shaggy-waves-slide.md b/.changeset/shaggy-waves-slide.md deleted file mode 100644 index 6faf0cb89..000000000 --- a/.changeset/shaggy-waves-slide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix Req diff --git a/.changeset/shaggy-wolves-grow.md b/.changeset/shaggy-wolves-grow.md deleted file mode 100644 index d7dd9909d..000000000 --- a/.changeset/shaggy-wolves-grow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -align TaggedUnion with array arg diff --git a/.changeset/share-oxlintrc-config.md b/.changeset/share-oxlintrc-config.md deleted file mode 100644 index 525da9a23..000000000 --- a/.changeset/share-oxlintrc-config.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-shared-config": patch ---- - -Add shared oxlintrc.json base config. Consumers extend via `"extends": ["./node_modules/@effect-app/eslint-shared-config/src/oxlintrc.json"]`. Note: oxlint does not merge `ignorePatterns` — repeat the base patterns and add project-specific ones. diff --git a/.changeset/sharp-buses-bow.md b/.changeset/sharp-buses-bow.md deleted file mode 100644 index e87842529..000000000 --- a/.changeset/sharp-buses-bow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Refine schema copy behavior by keeping class copy constructor-based while using structural copy for Struct and TaggedStruct helpers. diff --git a/.changeset/sharp-seals-clean.md b/.changeset/sharp-seals-clean.md deleted file mode 100644 index bd6a57a07..000000000 --- a/.changeset/sharp-seals-clean.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -workaround middleware error issue diff --git a/.changeset/short-cats-march.md b/.changeset/short-cats-march.md deleted file mode 100644 index 4742ffd79..000000000 --- a/.changeset/short-cats-march.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -raw dog diff --git a/.changeset/short-frogs-add.md b/.changeset/short-frogs-add.md deleted file mode 100644 index 64dfc9706..000000000 --- a/.changeset/short-frogs-add.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix proxify diff --git a/.changeset/short-suns-travel.md b/.changeset/short-suns-travel.md deleted file mode 100644 index 3fc052656..000000000 --- a/.changeset/short-suns-travel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch ---- - -Detect `Schema.Opaque()` model classes in the model preset while excluding `Context.Opaque` service tags. diff --git a/.changeset/shy-squids-make.md b/.changeset/shy-squids-make.md deleted file mode 100644 index dd94d003f..000000000 --- a/.changeset/shy-squids-make.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -bump diff --git a/.changeset/silent-results-shave.md b/.changeset/silent-results-shave.md deleted file mode 100644 index 94ce667e3..000000000 --- a/.changeset/silent-results-shave.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/vue": patch ---- - -input mess diff --git a/.changeset/silent-rooms-throw.md b/.changeset/silent-rooms-throw.md deleted file mode 100644 index b9568f068..000000000 --- a/.changeset/silent-rooms-throw.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Fixes optionalKey in OmegaForm handling diff --git a/.changeset/silly-eggs-roll.md b/.changeset/silly-eggs-roll.md deleted file mode 100644 index 09533df76..000000000 --- a/.changeset/silly-eggs-roll.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -use new schema features diff --git a/.changeset/single-invalidate-query-call.md b/.changeset/single-invalidate-query-call.md deleted file mode 100644 index 4444272b5..000000000 --- a/.changeset/single-invalidate-query-call.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Consolidate multiple `invalidateQueries` calls into a single call per group using a `predicate`, reducing the number of TanStack Query invalidation calls in the common case from N to 1. diff --git a/.changeset/six-regions-start.md b/.changeset/six-regions-start.md deleted file mode 100644 index 0855071e0..000000000 --- a/.changeset/six-regions-start.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -add missing Brand diff --git a/.changeset/six-yaks-stop.md b/.changeset/six-yaks-stop.md deleted file mode 100644 index ade76ec91..000000000 --- a/.changeset/six-yaks-stop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix boolean handling in SQL SELECT and WHERE diff --git a/.changeset/sixty-meals-sin.md b/.changeset/sixty-meals-sin.md deleted file mode 100644 index ffc4117f0..000000000 --- a/.changeset/sixty-meals-sin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix RequestName diff --git a/.changeset/slimy-apes-film.md b/.changeset/slimy-apes-film.md deleted file mode 100644 index a9a26d746..000000000 --- a/.changeset/slimy-apes-film.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -improve root union select diff --git a/.changeset/slimy-lions-laugh.md b/.changeset/slimy-lions-laugh.md deleted file mode 100644 index cd1b8574e..000000000 --- a/.changeset/slimy-lions-laugh.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -fix atom references diff --git a/.changeset/slimy-schools-fold.md b/.changeset/slimy-schools-fold.md deleted file mode 100644 index bbec62228..000000000 --- a/.changeset/slimy-schools-fold.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/cli": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -Update Effect dependencies to 4.0.0-beta.29 across workspace packages. diff --git a/.changeset/slow-readers-wave.md b/.changeset/slow-readers-wave.md deleted file mode 100644 index f2edbf31b..000000000 --- a/.changeset/slow-readers-wave.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -switch to NdJson diff --git a/.changeset/small-papers-sneeze.md b/.changeset/small-papers-sneeze.md deleted file mode 100644 index 305b504a8..000000000 --- a/.changeset/small-papers-sneeze.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -fix fn on stream semantics diff --git a/.changeset/small-wolves-knock.md b/.changeset/small-wolves-knock.md deleted file mode 100644 index bf1d95c1d..000000000 --- a/.changeset/small-wolves-knock.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -fup diff --git a/.changeset/smart-beers-listen.md b/.changeset/smart-beers-listen.md deleted file mode 100644 index 3ea43410a..000000000 --- a/.changeset/smart-beers-listen.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@effect-app/eslint-shared-config": patch -"@effect-app/infra": patch ---- - -namespaces diff --git a/.changeset/smart-candles-rest.md b/.changeset/smart-candles-rest.md deleted file mode 100644 index 2e002783a..000000000 --- a/.changeset/smart-candles-rest.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": minor -"@effect-app/eslint-codegen-model": patch ---- - -Fold the encoded-override support from `ExtendedClass` and `ExtendedTaggedClass` into `Class`, `TaggedClass`, `ErrorClass`, and `TaggedErrorClass`, and update model codegen to detect the new second-generic form. diff --git a/.changeset/soft-books-win.md b/.changeset/soft-books-win.md deleted file mode 100644 index b3b3b3637..000000000 --- a/.changeset/soft-books-win.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -update vue-components with more effect v4 diff --git a/.changeset/soft-guests-relax.md b/.changeset/soft-guests-relax.md deleted file mode 100644 index edaff71d2..000000000 --- a/.changeset/soft-guests-relax.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -fix: vue components were bundling effect modules diff --git a/.changeset/soft-mails-brush.md b/.changeset/soft-mails-brush.md deleted file mode 100644 index 0b30a9b6d..000000000 --- a/.changeset/soft-mails-brush.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Make OmegaInput's built-in input configuration props explicit so renderer attrs remain reserved for UI-library extensions. diff --git a/.changeset/soft-work-invalidations.md b/.changeset/soft-work-invalidations.md deleted file mode 100644 index a676a35ba..000000000 --- a/.changeset/soft-work-invalidations.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Allow query consumers to opt into non-blocking invalidation refetches. diff --git a/.changeset/sour-turtles-smash.md b/.changeset/sour-turtles-smash.md deleted file mode 100644 index 95c1247bc..000000000 --- a/.changeset/sour-turtles-smash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-shared-config": patch ---- - -bs diff --git a/.changeset/source-first-package-exports.md b/.changeset/source-first-package-exports.md deleted file mode 100644 index 3ea66b9db..000000000 --- a/.changeset/source-first-package-exports.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch ---- - -Point development package exports at TypeScript sources while keeping published exports on compiled dist files. diff --git a/.changeset/sparkly-cars-press.md b/.changeset/sparkly-cars-press.md deleted file mode 100644 index c8d97eaa6..000000000 --- a/.changeset/sparkly-cars-press.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Fixes useOmegaFormErrorStale stale errorMap diff --git a/.changeset/spicy-falcons-rush.md b/.changeset/spicy-falcons-rush.md deleted file mode 100644 index b82ea51a4..000000000 --- a/.changeset/spicy-falcons-rush.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -improve branded types, keep types through Rebuild diff --git a/.changeset/spicy-lights-trade.md b/.changeset/spicy-lights-trade.md deleted file mode 100644 index 0823fd9b8..000000000 --- a/.changeset/spicy-lights-trade.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -fix: double guard diff --git a/.changeset/sql-namespace-support.md b/.changeset/sql-namespace-support.md deleted file mode 100644 index 5116373fe..000000000 --- a/.changeset/sql-namespace-support.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Add storage namespace support to SQL adapters (SQLite and Postgres) via a `_namespace` column. When `allowNamespace` is configured, a `_namespace` column with composite primary key `(id, _namespace)` isolates data per namespace within the same table. New tables get the schema automatically; existing tables require manual migration. diff --git a/.changeset/sql-store-adapter.md b/.changeset/sql-store-adapter.md deleted file mode 100644 index 07d3cfb6f..000000000 --- a/.changeset/sql-store-adapter.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Add SQL Store adapter for Effect SQL (SQLite + PostgreSQL). Table-per-repo with id/etag/data JSON columns, query DSL translation to SQL WHERE clauses, optimistic concurrency via etag. diff --git a/.changeset/sql-transaction-middleware.md b/.changeset/sql-transaction-middleware.md deleted file mode 100644 index 55a89784e..000000000 --- a/.changeset/sql-transaction-middleware.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Make `withSqlTransaction` in `setupRequest` configurable via `withTransaction` option (defaults to `false`). Add `requiresTransactionConfig` and `makeSqlTransactionMiddleware` for per-RPC transaction control as a dynamic middleware that requires `SqlClient` directly. Transactions are disabled by default; opt in with `withTransaction: true` or `requiresTransaction: true`. diff --git a/.changeset/sqlite-per-namespace-layermap.md b/.changeset/sqlite-per-namespace-layermap.md deleted file mode 100644 index 0d2a39a6e..000000000 --- a/.changeset/sqlite-per-namespace-layermap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Add per-namespace in-memory SQLite adapter via LayerMap. When `makeSqlClientLayer` option is provided to `SQLiteStoreLayer`, each namespace gets its own SQLite database instance managed by a `LayerMap`. Introduces `WithNsTransaction` service for namespace-aware SQL transactions, used by `makeSqlTransactionMiddleware`. diff --git a/.changeset/sqlite-workflow-engine.md b/.changeset/sqlite-workflow-engine.md deleted file mode 100644 index 87df36154..000000000 --- a/.changeset/sqlite-workflow-engine.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": minor ---- - -Add SQLite backed `WorkflowEngine` adapter (`layerSqlite` in `WorkflowEngineSqlite.ts`). Persists workflow state across `workflow_exec` / `workflow_activity` / `workflow_deferred` / `workflow_clock` tables via `SqlClient`. Uses `sql.withTransaction` for atomicity, etag-based optimistic concurrency (`UPDATE ... WHERE etag = ? RETURNING etag`), and `INSERT ... ON CONFLICT DO NOTHING RETURNING` for first-writer-wins on activity / deferred / clock writes. Values crossing the storage boundary round-trip through `Schema` codecs (`S.fromJsonString(S.toCodecJson(...))`) using the workflow's own `payloadSchema` / `successSchema` / `errorSchema` for typed values, and the cluster engine's opaque `AnyOrVoid` codec for activity / deferred payloads. Includes time-bound lease + heartbeat fiber, scope-bound recovery poller for crashed-driver takeover, and cross-partition clock poller for restart-survivable durable timers. diff --git a/.changeset/sse-context-map-scope.md b/.changeset/sse-context-map-scope.md deleted file mode 100644 index dc1af8b99..000000000 --- a/.changeset/sse-context-map-scope.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Fix ContextMap finalizer running mid-stream on SSE responses. SSE handler now binds ContextMapContainer to the request scope via a shared `provideOnRequestScope` helper (also used by `RequestContextMiddleware`), so finalizers only run after the response body is fully drained. Adds `setupStreamingRequestContextFromCurrent` for use by streaming HTTP handlers. diff --git a/.changeset/sse-filter-namespace-by-storeid.md b/.changeset/sse-filter-namespace-by-storeid.md deleted file mode 100644 index 23e962f37..000000000 --- a/.changeset/sse-filter-namespace-by-storeid.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Filter SSE events stream by storeId namespace diff --git a/.changeset/staged-publish-directory.md b/.changeset/staged-publish-directory.md deleted file mode 100644 index f83a5a89d..000000000 --- a/.changeset/staged-publish-directory.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/cli": patch -"@effect-app/eslint-codegen-model": patch -"@effect-app/infra": patch -"@effect-app/vue": patch -"effect-app": patch ---- - -Publish from generated staging directories so release-only files are created outside the source package tree. diff --git a/.changeset/stale-actors-remain.md b/.changeset/stale-actors-remain.md deleted file mode 100644 index 7f3fbe91d..000000000 --- a/.changeset/stale-actors-remain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Handles blur in veutify diff --git a/.changeset/stale-emus-see.md b/.changeset/stale-emus-see.md deleted file mode 100644 index 54d0958af..000000000 --- a/.changeset/stale-emus-see.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Fixes Redacted Meta in Omega Form diff --git a/.changeset/stale-papers-join.md b/.changeset/stale-papers-join.md deleted file mode 100644 index 1133db65e..000000000 --- a/.changeset/stale-papers-join.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -improve: class strictness enabled by default again, allow `strict: false` as opt out for now. diff --git a/.changeset/store-effect-cached.md b/.changeset/store-effect-cached.md deleted file mode 100644 index 4e2b6dc9f..000000000 --- a/.changeset/store-effect-cached.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Use `Effect.cached` in `getOrCreateStoreEffect` for proper memoization of the resolver effect. diff --git a/.changeset/store-json-values.md b/.changeset/store-json-values.md deleted file mode 100644 index 03fb1280e..000000000 --- a/.changeset/store-json-values.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"effect-app": minor -"@effect-app/infra": minor ---- - -JSON stores lower native Encoded values (Date, Map, Set, and app types such as DateOnly) through the store's document schema. - -`makeRepo` already passes that schema. Adapters encode documents, query parameters, and defaults with `Schema.toCodecJson(toEncoded(schema))` at the field path. No type registry. Schemaless stores still lower Date/Map/Set structurally. diff --git a/.changeset/store-seed-uninterruptible.md b/.changeset/store-seed-uninterruptible.md deleted file mode 100644 index a41808100..000000000 --- a/.changeset/store-seed-uninterruptible.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Wrap store seed effects with `Effect.uninterruptible` to prevent interruption during seeding diff --git a/.changeset/stream-callable-progress.md b/.changeset/stream-callable-progress.md deleted file mode 100644 index ed672e2b7..000000000 --- a/.changeset/stream-callable-progress.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"@effect-app/vue": minor -"@effect-app/vue-components": minor ---- - -Refine `mutateStream` shape and progress reporting. - -- `mutateStream(options?)` now returns the `execute` callable directly, with `id`, `running?`, and `progress?` attached as properties. Tuple form `[ref, execute]` is gone — invoke the callable to run the stream, or pass it (or the factory) to `Command.fn` / `Command.wrap` / `Command.wrapStream`. -- `progress` formatter return type widened from `string | undefined` to `Progress | undefined`, where `Progress = string | { text: string; percentage: number }`. -- Stream failures now bubble through the execute effect's typed error channel `E` instead of being swallowed. The reactive `AsyncResult` ref still mirrors the failure for live progress UI. -- `CommandBase.progress?: Progress` replaces `progressText?: string`. `CommandButton` overrides the Vuetify `loader` slot when `progress` is set, rendering a `v-progress-circular` (bound to `model-value` when a `percentage` is supplied, otherwise `indeterminate`) alongside the formatted text. -- Factories and callables are branded with `_streamFactory` / `_streamCallable` so `Command.fn` / `Command.wrap` can disambiguate them from plain mutate functions. diff --git a/.changeset/stream-drain-data-dependencies.md b/.changeset/stream-drain-data-dependencies.md deleted file mode 100644 index fc6d8ab43..000000000 --- a/.changeset/stream-drain-data-dependencies.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -Stream RPC: drain read/write data-dependencies per emitted value chunk instead of sending the -cumulative set on every metadata chunk. Each metadata chunk now carries only the delta recorded -since the last chunk, the bucket is cleared for the next segment, and the terminal "done"/"error" -chunks drain the remainder. The emit condition also broadens to include non-empty reads, so stream -queries forward their read-dependencies mid-stream too. The client already accumulates deltas into -its per-call recorder, so no FE change is required. diff --git a/.changeset/stream-effect-fail.md b/.changeset/stream-effect-fail.md deleted file mode 100644 index 6ca924187..000000000 --- a/.changeset/stream-effect-fail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Stream resources accept `Effect.fail(...)` (and `Effect`) from controller handlers — previously only `Stream.fail(...)` / a returned `Stream` worked. The router now lifts an Effect result to a Stream via `Stream.unwrap`, so failures from an `Effect` propagate as a failing Stream on the client, matching `Stream.fail(...)` behavior. Also removes the need for manual `.pipe(Stream.unwrap)` on generator handlers that return a `Stream`. diff --git a/.changeset/stream-final-default-success.md b/.changeset/stream-final-default-success.md deleted file mode 100644 index 917afbf09..000000000 --- a/.changeset/stream-final-default-success.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"effect-app": patch -"@effect-app/vue": patch ---- - -Default the stream `mutateStream` execute resolved value to the request's success type when no `final` schema is declared. - -Previously the type defaulted to `void`, but the runtime already resolves with the last emitted value. Types now match runtime behaviour: `execute` returns `Final` if a `final` schema is set, otherwise the success type. diff --git a/.changeset/stream-final-type.md b/.changeset/stream-final-type.md deleted file mode 100644 index 3d6982831..000000000 --- a/.changeset/stream-final-type.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -"@effect-app/vue": minor -"effect-app": minor ---- - -Stream requests now support an optional `final` schema that models the final success type of the stream. When declared, `mutateStream`'s execute effect resolves with the last emitted value typed as `Final` instead of `void`. - -```ts -class MyStream - extends SomethingStream()("MyStream", { id: S.String }, { - success: S.Union([OperationProgress, ExportComplete]), - final: ExportComplete // execute now resolves with ExportComplete - }) -{} -``` diff --git a/.changeset/stream-first-write-flush.md b/.changeset/stream-first-write-flush.md deleted file mode 100644 index 25591fe83..000000000 --- a/.changeset/stream-first-write-flush.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Flush stream mutation write-deps once when the first write arrives, then again on settlement. Long-running streams can refresh queries like GetActiveJob without invalidating list queries on every subsequent item write. diff --git a/.changeset/stream-fn-enhancements.md b/.changeset/stream-fn-enhancements.md deleted file mode 100644 index 0a156647a..000000000 --- a/.changeset/stream-fn-enhancements.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"@effect-app/vue": minor -"@effect-app/vue-components": minor ---- - -- `CommandButton`: add optional `:map-progress` prop to compute progress from `command.result` via a custom mapper function -- `CommandBase`: add optional `result` field exposing reactive `AsyncResult` state -- Export `Progress` type from `@effect-app/vue` -- `streamFn`: pipe operators now receive the initial `Effect` (or `Stream`) value unchanged; `Stream.unwrap` is deferred until after all combinators, enabling use of `withDefaultToast` and other Effect-level combinators -- Add `makeStreamMutation2`: like `makeStreamMutation` but returns `Effect` per invocation (with invalidation via `Stream.ensuring`), for use with `streamFn` combinators -- Expose `streamFn` on `XClient.Y` stream handlers and on the `Command` object -- Expose `mutateStream2` on `XClient.Y` stream handlers, with a `wrapStream` helper that calls `streamFn` with the handler and provided combinators diff --git a/.changeset/stream-metadata-v1.md b/.changeset/stream-metadata-v1.md deleted file mode 100644 index cc4d2ed44..000000000 --- a/.changeset/stream-metadata-v1.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -"effect-app": minor -"@effect-app/infra": minor -"@effect-app/vue": minor ---- - -V1/V2/V3: stream and command requests carry invalidation metadata - -**V1** – stream final response includes metadata - -- `Invalidation.StreamResponseChunk` wraps each stream item as `{ _tag: "value", value }` and appends `{ _tag: "done", metadata }` at the end carrying all accumulated invalidation keys. - -**V2** – invalidation keys included in failures - -- `Invalidation.CommandFailureWithMetaData` and `Invalidation.StreamFailureChunk` carry keys accumulated up to the point of failure, so clients can invalidate queries even when a command or stream errors. -- `InvalidationMiddlewareLive` wraps command failures; `routing.ts` wraps stream failures. -- `apiClientFactory.ts` unwraps both on the client side, forwarding keys before re-failing with the original error. - -**V3** – mid-stream metadata chunks - -- `Invalidation.StreamResponseChunk` now also includes `{ _tag: "metadata", metadata }` for mid-stream invalidation. -- After each emitted value, the server drains accumulated keys and emits a "metadata" chunk if any keys were collected since the last drain (bucket reset via `InvalidationSet.drain`). -- `apiClientFactory.ts` processes "metadata" chunks the same as "done" chunks, forwarding keys to `InvalidationKeysFromServer` immediately. -- `makeInvalidationKeysService` accepts an optional `onAdded` callback that fires after each key addition, enabling `mutate.ts` to trigger query invalidation mid-stream without waiting for the stream to complete. diff --git a/.changeset/stream-on-command-query.md b/.changeset/stream-on-command-query.md deleted file mode 100644 index c9965b550..000000000 --- a/.changeset/stream-on-command-query.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -"effect-app": minor -"@effect-app/infra": minor -"@effect-app/vue": minor ---- - -Add streaming as a `stream: true` config option on `Query` / `Command` instead of a separate request type. - -`TaggedRequestFor` now exposes only `Query` and `Command` factories — the standalone `Stream` factory is removed. To produce a Stream of `success` values, pass `stream: true` in the request config. The request `type` field stays `"command" | "query"`; a new `stream: boolean` field carries the streaming flag (stripped from the stored handler config). - -```ts -// Query that streams results -Req.Query()("Tag", {}, { stream: true, success: ... }) - -// Command that streams results -Req.Command()("Tag", {}, { stream: true, success: ... }) -``` - -Vue client mapping (per-handler properties mirror the non-stream API — `.query`, `.fn`, `.mutate`): - -- `query` + `stream: true` → exposes `.query` (read-only streaming, tracked Vue Query). Helper map key: `${name}Query`. -- `command` + `stream: true` → exposes `.fn` and `.mutate` (mutating streaming). -- Plain `query` / `command` unchanged. - -Server routing dispatches via the new `stream` flag (`makeStreamRpc` for streaming commands/queries, `makeCommandRpc` / `Rpc.make` otherwise). - -Also lifts the `Struct` / `TaggedStruct` and `Opaque` definitions in `effect-app/Schema` to use `S.Bottom` / `S.Opaque` directly, exposing `fields`, `mapFields`, and a `MakeIn` that allows `void` when all fields are optional. `TaggedRequestFor` request classes now use `Opaque(TaggedStruct(...))` instead of `TaggedClass`, and decoding/encoding services are derived from `success` / `error` rather than stored on the request. - -**Migration**: replace `Req.Stream` with `Req.Query` or `Req.Command` and add `stream: true` to the config — `Query` for read-only streams, `Command` for mutating streams. diff --git a/.changeset/stream-withdefaulttoast.md b/.changeset/stream-withdefaulttoast.md deleted file mode 100644 index 7541c0c7c..000000000 --- a/.changeset/stream-withdefaulttoast.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@effect-app/vue": minor -"@effect-app/vue-components": patch ---- - -Add `Command.withDefaultToastStream` — a stream-aware combinator for `streamFn` that properly handles the full stream lifecycle (waiting/success/failure toasts). Unlike `withDefaultToast`, it waits for the stream to drain before showing the success toast and correctly handles stream errors. - -Strongly type `CommandBase` with `RA`/`RE` type params for `result`, and update `CommandButton`'s `mapProgress` prop to be typed as `(result: AsyncResult) => Progress | undefined`. diff --git a/.changeset/strict-stream-handlers.md b/.changeset/strict-stream-handlers.md deleted file mode 100644 index 2c26607ac..000000000 --- a/.changeset/strict-stream-handlers.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Router handlers are now discriminated by `Resource[K]["stream"]`: - -- Stream resources (`stream: true`) accept only `(req) => Stream<...>` handlers. -- Non-stream resources accept only `(req) => Effect<...>` (or generator yielding `Yieldable`). - -Mixing — e.g. returning `Effect.fail(...)` or `Effect>` from a stream handler — no longer type-checks. - -The runtime `Stream.unwrap` branch that lifted `Effect`/`Effect` returns into a `Stream` is removed; handlers for stream resources must return a `Stream` directly. Migrate `Effect.gen(...).pipe(Stream.unwrap)` patterns by returning the `Stream` directly, and convert `Effect.fail(err)` in stream handlers to `Stream.fail(err)`. diff --git a/.changeset/strong-dots-sin.md b/.changeset/strong-dots-sin.md deleted file mode 100644 index d65818673..000000000 --- a/.changeset/strong-dots-sin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -fix union default value diff --git a/.changeset/struct-pick-omit.md b/.changeset/struct-pick-omit.md deleted file mode 100644 index f6e0b54b4..000000000 --- a/.changeset/struct-pick-omit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": minor ---- - -Add pick/omit to Struct and TaggedStruct diff --git a/.changeset/structfacade-effect-app-struct.md b/.changeset/structfacade-effect-app-struct.md deleted file mode 100644 index 7ef3229b3..000000000 --- a/.changeset/structfacade-effect-app-struct.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"effect-app": patch ---- - -Fix `StructFacade` to extend effect-app's own `Struct`, not `effect/Schema`'s. - -`StructFacade` was built on `Omit, ...>` where `S` is `effect/Schema` (core). Scanner / consumer models are effect-app `S.Struct`, which is a distinct type from effect core's `Struct`, so a facade built on the core `Struct` is not assignable where an effect-app struct is expected — e.g. workflow payloads (`Workflow<…, Struct>`) and other effect-app `Struct`-shaped positions failed to type-check. Switch the `Omit` base to effect-app's `Struct` (the `Fields extends S.Struct.Fields` constraint stays effect core, matching effect-app's own `Struct`). diff --git a/.changeset/suspense-keep-previous-value.md b/.changeset/suspense-keep-previous-value.md deleted file mode 100644 index 84c915103..000000000 --- a/.changeset/suspense-keep-previous-value.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Keep the previous suspense value across reactive-arg atom switches. - -A reactive arg re-points a resolved suspense query at a different family atom; the fresh atom starts `Initial` (no `previousSuccess` carried over), so the always-defined `data` computed found `undefined` and threw `Internal Error: suspense resolved without a latest value` during the next render flush. The always-defined ref now serves the last defined value across that transition (TanStack's keepPreviousData — Vue cannot re-suspend after mount); waiting/failure of the new fetch stays observable on the `result` ref. Applied to `.suspense()`, `.suspenseNew()` and `useAtomSuspense` via a shared `latestDefined` helper. It only throws when there has never been a value, which is unreachable once the suspense await resolved. diff --git a/.changeset/sweet-humans-ring.md b/.changeset/sweet-humans-ring.md deleted file mode 100644 index 21b00a4f3..000000000 --- a/.changeset/sweet-humans-ring.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -fix signature diff --git a/.changeset/sweet-moments-see.md b/.changeset/sweet-moments-see.md deleted file mode 100644 index 5bd173c53..000000000 --- a/.changeset/sweet-moments-see.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -restore annotations for now diff --git a/.changeset/swift-owls-knit.md b/.changeset/swift-owls-knit.md deleted file mode 100644 index e7e836c0e..000000000 --- a/.changeset/swift-owls-knit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Add relaxed wrapper support for `ErrorClass` and `TaggedErrorClass` in `effect-app/Schema`, matching the existing class wrapper behavior (`copy`, cached `ast`, and unbounded parse concurrency). diff --git a/.changeset/swift-tables-turn.md b/.changeset/swift-tables-turn.md deleted file mode 100644 index 48772d49e..000000000 --- a/.changeset/swift-tables-turn.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@effect-app/cli": patch -"effect-app": patch -"@effect-app/eslint-codegen-model": patch -"@effect-app/eslint-shared-config": patch -"@effect-app/infra": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -update packages diff --git a/.changeset/sync-effect-app-command.md b/.changeset/sync-effect-app-command.md deleted file mode 100644 index 50d53bed7..000000000 --- a/.changeset/sync-effect-app-command.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@effect-app/cli": patch ---- - -Add `sync-effect-app` to sync vendored Effect App libs by pinned package version. -The command prefers package-version git tags and supports `--ref latest` for main. diff --git a/.changeset/sync-effect-subtree.md b/.changeset/sync-effect-subtree.md deleted file mode 100644 index 97711f395..000000000 --- a/.changeset/sync-effect-subtree.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/cli": minor ---- - -Add `sync-effect` CLI command to sync the Effect git subtree to the version pinned in package.json manifests. diff --git a/.changeset/sync-effect-url.md b/.changeset/sync-effect-url.md deleted file mode 100644 index a41630070..000000000 --- a/.changeset/sync-effect-url.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/cli": patch ---- - -Sync Effect subtrees from a repository URL without requiring a local git remote. diff --git a/.changeset/sync-push-deletions.md b/.changeset/sync-push-deletions.md deleted file mode 100644 index dd5e8c602..000000000 --- a/.changeset/sync-push-deletions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/cli": patch ---- - -`effa sync-push`: propagate locally-deleted synced files. Previously, files removed from the consuming project were silently skipped (the loop bailed when `destAbs` didn't exist). Now they're recorded as deletions, `git rm`'d in the cache branch, and listed in the PR body alongside modifications. diff --git a/.changeset/synchronous-change-feed.md b/.changeset/synchronous-change-feed.md deleted file mode 100644 index d8d0f3100..000000000 --- a/.changeset/synchronous-change-feed.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Repository `changeFeed` now broadcasts synchronously: `publish` awaits every subscribed handler before resolving. Replaces `PubSub.PubSub` with a `ChangeFeed` interface (`publish` + scoped `subscribe`). Handlers are auto-removed when the subscriber's scope closes, and the full handler set is cleared when the repository's scope closes. Repository construction now requires `Scope` — wire `makeRepo` through `Layer.scoped` / `Effect.scoped`. diff --git a/.changeset/tagged-request-command-query-split.md b/.changeset/tagged-request-command-query-split.md deleted file mode 100644 index 385aa6bc5..000000000 --- a/.changeset/tagged-request-command-query-split.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"effect-app": patch -"@effect-app/vue": patch ---- - -Split `TaggedRequestFor` into `Query` and `Command` factories, and mark generated request classes with `type: "query" | "command"`. - -Vue client helpers now expose query-only helpers (`query`, `suspense`, `fetch`) for query requests and mutation-only helpers (`mutate`, `fetch`) for command requests. diff --git a/.changeset/tagged-request-for.md b/.changeset/tagged-request-for.md deleted file mode 100644 index 923c9ecb0..000000000 --- a/.changeset/tagged-request-for.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": minor -"@effect-app/eslint-codegen-model": minor ---- - -Add `TaggedRequestFor` helper to `makeRpcClient` that curries a `moduleName`, producing request classes with static `id` and `moduleName` properties. This enables passing request classes directly to `makeQueryKey` without going through `clientFor` first. The `clientFor` function no longer requires a `meta` property on the module when requests carry `moduleName`. The meta codegen preset now generates `Req = TaggedRequestFor(moduleName)`. Original `TaggedRequest` remains for backwards compatibility. diff --git a/.changeset/tagged-union-drop-fields-constraint.md b/.changeset/tagged-union-drop-fields-constraint.md deleted file mode 100644 index 2810c05d5..000000000 --- a/.changeset/tagged-union-drop-fields-constraint.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -remove `fields` constraint from TaggedUnion/tags helpers, extract `_tag` via AST walk instead diff --git a/.changeset/tagged-union-generate-guards.md b/.changeset/tagged-union-generate-guards.md deleted file mode 100644 index 42c681dc9..000000000 --- a/.changeset/tagged-union-generate-guards.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -"effect-app": minor ---- - -Add `generateGuards` and `generateGuardsFor` to `TaggedUnion` / `ExtendTaggedUnion` for property-scoped type guards. - -- `generateGuards("key")` — generic per-guard, no need to specify the container type -- `generateGuardsFor()("key")` — curried, fixes `A` for concrete guard signatures - -Both return `{ is{Tag}, isAnyOf }` guards that narrow the container type by its tagged union property. diff --git a/.changeset/tagged-union-generate-guards2.md b/.changeset/tagged-union-generate-guards2.md deleted file mode 100644 index 42c681dc9..000000000 --- a/.changeset/tagged-union-generate-guards2.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -"effect-app": minor ---- - -Add `generateGuards` and `generateGuardsFor` to `TaggedUnion` / `ExtendTaggedUnion` for property-scoped type guards. - -- `generateGuards("key")` — generic per-guard, no need to specify the container type -- `generateGuardsFor()("key")` — curried, fixes `A` for concrete guard signatures - -Both return `{ is{Tag}, isAnyOf }` guards that narrow the container type by its tagged union property. diff --git a/.changeset/tall-boxes-relax.md b/.changeset/tall-boxes-relax.md deleted file mode 100644 index 152676792..000000000 --- a/.changeset/tall-boxes-relax.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -improve sentry diff --git a/.changeset/tall-hats-reflect.md b/.changeset/tall-hats-reflect.md deleted file mode 100644 index 2d1e31311..000000000 --- a/.changeset/tall-hats-reflect.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/vue": patch ---- - -Refactor command invalidation typing: declare resources via `Command()`, pass `invalidatesQueries` as the optional 4th argument, and enforce exact `clientFor` invalidation resources when required. diff --git a/.changeset/tanstack-effect-equal-structural-sharing.md b/.changeset/tanstack-effect-equal-structural-sharing.md deleted file mode 100644 index 342413c8b..000000000 --- a/.changeset/tanstack-effect-equal-structural-sharing.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Default legacy TanStack queries to Effect-Equal-aware structural sharing. diff --git a/.changeset/tanstack-suspense-seed.md b/.changeset/tanstack-suspense-seed.md deleted file mode 100644 index 716d9ce57..000000000 --- a/.changeset/tanstack-suspense-seed.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Seed legacy TanStack suspense results into Vue query refs when the observer re-points mid-flight. diff --git a/.changeset/tasty-eggs-stare.md b/.changeset/tasty-eggs-stare.md deleted file mode 100644 index 45ecad131..000000000 --- a/.changeset/tasty-eggs-stare.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -fix: nasty request scope bug diff --git a/.changeset/tasty-fans-accept.md b/.changeset/tasty-fans-accept.md deleted file mode 100644 index d323c56ce..000000000 --- a/.changeset/tasty-fans-accept.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch ---- - -Configure Changesets fixed versioning for public packages. diff --git a/.changeset/ten-crews-like.md b/.changeset/ten-crews-like.md deleted file mode 100644 index b24acbc35..000000000 --- a/.changeset/ten-crews-like.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -remove artificial Cosmos bulkSet delays diff --git a/.changeset/ten-suns-shine.md b/.changeset/ten-suns-shine.md deleted file mode 100644 index e17884c8d..000000000 --- a/.changeset/ten-suns-shine.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/vue": patch ---- - -Relax invalidation resource value constraints to allow arbitrary values while preserving query-only filtering in invalidation handling. diff --git a/.changeset/tender-bars-ring.md b/.changeset/tender-bars-ring.md deleted file mode 100644 index 9d864bf1c..000000000 --- a/.changeset/tender-bars-ring.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-shared-config": patch ---- - -fml diff --git a/.changeset/tender-donkeys-pick.md b/.changeset/tender-donkeys-pick.md deleted file mode 100644 index 919ed956d..000000000 --- a/.changeset/tender-donkeys-pick.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch ---- - -pass options diff --git a/.changeset/thin-zebras-press.md b/.changeset/thin-zebras-press.md deleted file mode 100644 index c73c5fb1a..000000000 --- a/.changeset/thin-zebras-press.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Fix `FixedNuxtErrorBoundary` losing the app's router: `vue-router` was missing from `vite.config.mts`'s Rollup `external` list, so it got bundled into the library output with its own `Symbol("router")` injection key a different instance from the host app's real `routerKey`. `useRouter()` inside the component therefore always returned `undefined`, crashing on `.afterEach` (500 in SSR). `vue-router` is now external like `vue`, so the component resolves the host app's actual router instance. diff --git a/.changeset/thirty-cooks-pump.md b/.changeset/thirty-cooks-pump.md deleted file mode 100644 index ae711deb3..000000000 --- a/.changeset/thirty-cooks-pump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -enable cosmosdb large partition key hashes diff --git a/.changeset/thirty-experts-taste.md b/.changeset/thirty-experts-taste.md deleted file mode 100644 index 7de73d635..000000000 --- a/.changeset/thirty-experts-taste.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -rename Literal to Literals, no longer hiding Schema's singular Literal. diff --git a/.changeset/three-hotels-roll.md b/.changeset/three-hotels-roll.md deleted file mode 100644 index 772776820..000000000 --- a/.changeset/three-hotels-roll.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch ---- - -cleanup diff --git a/.changeset/tidy-caches-reflect.md b/.changeset/tidy-caches-reflect.md deleted file mode 100644 index 9f5080a94..000000000 --- a/.changeset/tidy-caches-reflect.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Route `useUpdateQuery` through the configured query cache so TanStack-backed legacy queries receive manual cache updates. diff --git a/.changeset/tidy-cosmos-batches.md b/.changeset/tidy-cosmos-batches.md deleted file mode 100644 index f54f2eaab..000000000 --- a/.changeset/tidy-cosmos-batches.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Batch more Cosmos cluster storage updates. diff --git a/.changeset/tidy-derived-dependencies.md b/.changeset/tidy-derived-dependencies.md deleted file mode 100644 index 617b9570d..000000000 --- a/.changeset/tidy-derived-dependencies.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": minor -"@effect-app/infra": patch ---- - -Support ID-scoped signal dependencies and additive repository dependencies derived from previous and current entities. diff --git a/.changeset/tidy-dprint-oxlint-config.md b/.changeset/tidy-dprint-oxlint-config.md deleted file mode 100644 index 89b9d6708..000000000 --- a/.changeset/tidy-dprint-oxlint-config.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-shared-config": patch ---- - -ship shared dprint config and wire oxlint and dprint into package lint scripts diff --git a/.changeset/tidy-effects-diagnose.md b/.changeset/tidy-effects-diagnose.md deleted file mode 100644 index 2d6799345..000000000 --- a/.changeset/tidy-effects-diagnose.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-shared-config": patch ---- - -Run configured Effect diagnostics through Oxlint's type-aware lint integration. diff --git a/.changeset/tidy-forms-report.md b/.changeset/tidy-forms-report.md deleted file mode 100644 index b4d1a58d7..000000000 --- a/.changeset/tidy-forms-report.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Handle string form validation errors in OmegaForm.Errors without crashing, and safely ignore unsupported error values. diff --git a/.changeset/tidy-pans-rule.md b/.changeset/tidy-pans-rule.md deleted file mode 100644 index 09c873d78..000000000 --- a/.changeset/tidy-pans-rule.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -update effect to 4.0.0-beta.37 and drop the Schema Class disableValidation workaround now that the patched effect schema covers it diff --git a/.changeset/tidy-poets-think.md b/.changeset/tidy-poets-think.md deleted file mode 100644 index ff5f43093..000000000 --- a/.changeset/tidy-poets-think.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- - -update effect to latest beta diff --git a/.changeset/tidy-remaining-formatting.md b/.changeset/tidy-remaining-formatting.md deleted file mode 100644 index c267cb06a..000000000 --- a/.changeset/tidy-remaining-formatting.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -apply the remaining formatting and autofix cleanup across the vue packages diff --git a/.changeset/tidy-rivers-identify.md b/.changeset/tidy-rivers-identify.md deleted file mode 100644 index a9556c590..000000000 --- a/.changeset/tidy-rivers-identify.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Include changed entity IDs in repository data dependencies, with explicit query scopes and configurable write aliases, while retaining coarse collection dependencies. diff --git a/.changeset/tidy-titles-remove.md b/.changeset/tidy-titles-remove.md deleted file mode 100644 index a028982b0..000000000 --- a/.changeset/tidy-titles-remove.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Remove redundant schema `title` annotations when they duplicate the schema `identifier`. diff --git a/.changeset/tiny-cows-repair.md b/.changeset/tiny-cows-repair.md deleted file mode 100644 index 92390d4e5..000000000 --- a/.changeset/tiny-cows-repair.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -Preserve class annotation parseOptions in relaxed declaration struct decoding so custom parse options (including concurrency defaults) are applied consistently. diff --git a/.changeset/tiny-gorillas-jump.md b/.changeset/tiny-gorillas-jump.md deleted file mode 100644 index f4af4a259..000000000 --- a/.changeset/tiny-gorillas-jump.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"effect-app": patch ---- - -Rename the Class/TaggedClass relaxed declaration option to `strict` (default `false`) and apply it to `Class`, `TaggedClass`, `ExtendedClass`, and `ExtendedTaggedClass`. - -When `strict: true`, class decoding keeps strict class-level declaration behavior; by default, decoding remains relaxed and preserves field-level schema errors. diff --git a/.changeset/tired-insects-stand.md b/.changeset/tired-insects-stand.md deleted file mode 100644 index 2f3526345..000000000 --- a/.changeset/tired-insects-stand.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch ---- - -align with earlier updates diff --git a/.changeset/toast-group-request-id.md b/.changeset/toast-group-request-id.md deleted file mode 100644 index dd2574c67..000000000 --- a/.changeset/toast-group-request-id.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/vue": minor ---- - -Add optional `groupId` and `requestId` to toast options. - -- `ToastOpts` / `ToastOptsInternal` now accept `groupId?: string` and `requestId?: string`; values pass through the toast wrapper unchanged. -- `WithToast` / `withToast` accept `groupId` and auto-derive `requestId` once per invocation (current Effect span `traceId`, fallback `S.StringId.make()`); both are attached to every emitted toast (waiting/success/warning/error). -- `Command.withDefaultToast` and `Command.withDefaultToastStream` set `groupId: cc.id` automatically; the stream variant also computes `requestId` once and threads it through progress, success, and failure toasts. diff --git a/.changeset/tough-apes-whisper.md b/.changeset/tough-apes-whisper.md deleted file mode 100644 index ea97c1544..000000000 --- a/.changeset/tough-apes-whisper.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -Fix `TaggedRequest` no-config error type inference so requests without a third argument infer the same default error schema as requests with explicit success config. diff --git a/.changeset/tsgo-decodingservices-workaround.md b/.changeset/tsgo-decodingservices-workaround.md deleted file mode 100644 index de731817e..000000000 --- a/.changeset/tsgo-decodingservices-workaround.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/vue": patch ---- - -Work around tsgo failing to reduce `S.Codec.DecodingServices` (`X extends Top ? X["DecodingServices"] : never`) in generic positions, which left `unknown` and polluted the `R` channel of client handlers and RPC middleware failure context. Since the schemas involved are already constrained to `S.Top`, read `["DecodingServices"]` directly in `RequestHandlerFor`, `TagClass.FailureContext`, and the Vue `MutationExt` / `QueryProjection` types. diff --git a/.changeset/tsgo-direct-schema-property-access.md b/.changeset/tsgo-direct-schema-property-access.md deleted file mode 100644 index 1a2c35b49..000000000 --- a/.changeset/tsgo-direct-schema-property-access.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch ---- - -improve tsgo compat: avoid deferred `Schema.Type`/`Codec.Encoded`/`Codec.DecodingServices`/`Codec.EncodingServices` conditional helpers in generic positions where the type parameter is already constrained to `Schema.Top`. Index the property directly (`X["Type"]`, `X["Encoded"]`, `X["DecodingServices"]`, …) so tsgo doesn't leak `unknown` into `Effect` channels (notably `R`). - -Sites: `client/clientFor.ts` (`RequestHandlerFor`, `FinalTypeOf`, `ExtractResponse`, `ExtractEResponse`), `client/makeClient.ts` (`InputFromPayload`, `OutputFromSuccess`, `InvalidationConfigForCommand`, `TaggedRequestWithMeta` overloads), `rpc/MiddlewareMaker.ts` (`Errors`), `rpc/RpcMiddleware.ts` (`Failure`, `FailureContext`), `Schema/ext.ts` (`ReadonlySetFromArray`, `ReadonlyMapFromArray`), `infra/routing.ts` (`GetSuccessShape`, handlers, route matcher), `vue/makeClient.ts` (`MutationExt.project`, `MutationWithExtensions`, `QueryProjection`), `vue/routeParams.ts` (`parseRouteParams*`). diff --git a/.changeset/twenty-seas-grab.md b/.changeset/twenty-seas-grab.md deleted file mode 100644 index cd235a34a..000000000 --- a/.changeset/twenty-seas-grab.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch -"@effect-app/eslint-shared-config": patch -"effect-app": patch -"@effect-app/cli": patch ---- - -update all teh tings diff --git a/.changeset/two-clocks-wash.md b/.changeset/two-clocks-wash.md deleted file mode 100644 index 48772d49e..000000000 --- a/.changeset/two-clocks-wash.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@effect-app/cli": patch -"effect-app": patch -"@effect-app/eslint-codegen-model": patch -"@effect-app/eslint-shared-config": patch -"@effect-app/infra": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -update packages diff --git a/.changeset/typed-database-error.md b/.changeset/typed-database-error.md deleted file mode 100644 index 7d9d0dee7..000000000 --- a/.changeset/typed-database-error.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"effect-app": minor -"@effect-app/infra": minor ---- - -Add a typed, serializable `DatabaseError { message, transient, cause }` for store adapter failures. - -Store adapters wrapped DB calls in bare `Effect.promise` / `.orDie`, so a transient infra failure (request timeout, throttle, 5xx, dropped socket) became a raw-`Error` defect — which `Effect.retry` can't retry and which breaks JSON encoding of a workflow exit cause ("Expected JSON value, got Error"). `DatabaseError` is now exposed on all `Store` and `Repository` method error channels (writes: `OptimisticConcurrencyException | DatabaseError`) and added to `SupportedErrors` so the api/client/FE treat it as a 500-class error. Each adapter wraps its db-call failures into `DatabaseError` with a `transient` flag (timeout/throttle/5xx ⇒ retryable); the `cause` serializes via `Schema.Defect`. Construction/seed/DDL paths stay `orDie`. diff --git a/.changeset/typed-query-builders.md b/.changeset/typed-query-builders.md deleted file mode 100644 index 0e3da2289..000000000 --- a/.changeset/typed-query-builders.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"effect-app": minor ---- - -Tighten typing of query DSL builders so field/path parameters are constrained to actual field paths instead of bare `string`: - -- `relation(path)` now infers the relation's element type and constrains `distinctCount`/`sum`/`collect`/`collectDistinct`/`collectFields`/`collectDistinctFields` and the `unit` of `sumExprBy`/`sumExprNormalized` to `FieldPath`. -- `relation(path).expr` exposes a scope-bound math-expression builder so `expr.field(...)` inside `sumExpr`/`sumExprBy`/`sumExprNormalized` is typed against the relation element. -- Top-level `expr.field` accepts an optional generic for opt-in tightening (`expr.field("x")`). -- `aggregate(schema, build)` accepts a builder callback whose `agg` argument is bound to the source row inferred from the pipe — paths are checked without any explicit generic: `make().pipe(aggregate(schema, ($) => ({ city: $.field("address.city") })))`. Plain `AggregateMap` form still accepted. -- `projectComputed(schema, build, mode?)` accepts a builder callback whose `{ relation }` argument is bound to the source row inferred from the pipe: `make().pipe(projectComputed(out, ({ relation }) => ({ total: relation("items").sum("qty") })))`. Plain `ComputedProjectionMap` form still accepted. -- `agg()` factory remains as an escape hatch when the builder is built outside a pipe. diff --git a/.changeset/unify-emailer-spans.md b/.changeset/unify-emailer-spans.md deleted file mode 100644 index f9cefdde0..000000000 --- a/.changeset/unify-emailer-spans.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Unify Emailer `sendMail` spans across implementations. `Fake.sendMail` and `Sendgrid.sendMail` now both emit as `Emailer.sendMail` with OTel-standard `messaging.system` attribute (`"fake"` / `"sendgrid"`). diff --git a/.changeset/unify-parsemany-spans.md b/.changeset/unify-parsemany-spans.md deleted file mode 100644 index e72ba4a48..000000000 --- a/.changeset/unify-parsemany-spans.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -Unify `parseMany` span variants under a single span name. The four prior spans (`parseMany`, `parseMany2`, `parseManyProject`, `parseManyCollect`) now all emit as `parseMany` with `app.entity` and `app.query.mode` attributes (`"transform" | "project" | "collect"`). Reuses the same attribute key already set on the parent `Repository.query` span for consistency. `parseManyProject`/`parseManyCollect` previously lacked `app.entity` — now included. diff --git a/.changeset/update-effect-beta-107.md b/.changeset/update-effect-beta-107.md deleted file mode 100644 index 37966a213..000000000 --- a/.changeset/update-effect-beta-107.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- - -Update effect packages to `4.0.0-beta.107` (from `beta.90`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`, and `fast-check` to `^4.9.0`. Sync `repos/effect` subtree from `Effect-TS/effect` (effect-smol stopped publishing tags after beta.98). - -API adaptations for beta.107: - -- `concurrency: "inherit"` → `"unbounded"` -- `Schema.ErrorClass` / `TaggedErrorClass` → `Schema.Error` / `TaggedError` -- `Schema.LazyArbitrary` → `Schema.Arbitrary` -- `Schema.DateValid` / `isDateValid` removed (`Schema.Date` rejects invalid dates) -- `SchemaIssue` constructors no longer take `Option` (annotations + input) -- filter meta via `annotations.representation` instead of `annotations.meta` -- `context.defaultValue` → `context.constructorDefault` (single Link) -- Class detection via `~constructor` + static `identifier` -- Redacted detection via `representation.id` -- localized StandardSchema hooks updated for new issue/input model -- provide `NodeCrypto.layer` for cluster sqlite tests -- default `sync-effect` subtree URL → `Effect-TS/effect` diff --git a/.changeset/update-effect-beta-36.md b/.changeset/update-effect-beta-36.md deleted file mode 100644 index 56d7b4fed..000000000 --- a/.changeset/update-effect-beta-36.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -update effect to 4.0.0-beta.36, adapt to Option revert from A | undefined diff --git a/.changeset/update-effect-beta-52.md b/.changeset/update-effect-beta-52.md deleted file mode 100644 index c92200422..000000000 --- a/.changeset/update-effect-beta-52.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch -"@effect-app/cli": patch ---- - -Update effect packages to 4.0.0-beta.52 diff --git a/.changeset/update-effect-beta-60-rpc-custom.md b/.changeset/update-effect-beta-60-rpc-custom.md deleted file mode 100644 index f82562444..000000000 --- a/.changeset/update-effect-beta-60-rpc-custom.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch ---- - -Update to effect 4.0.0-beta.60 and use native `Rpc.custom` constructors (`makeCommandRpc`, `makeStreamRpc`) for metadata-wrapped RPC schemas instead of manually wrapping/unwrapping schemas inline. diff --git a/.changeset/update-effect-beta-66.md b/.changeset/update-effect-beta-66.md deleted file mode 100644 index de3c07470..000000000 --- a/.changeset/update-effect-beta-66.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch ---- - -Update to effect 4.0.0-beta.66. Remove `Yieldable` and `asEffect()` (service tags are now `Effect` directly). diff --git a/.changeset/update-effect-beta-67.md b/.changeset/update-effect-beta-67.md deleted file mode 100644 index 3bf547c7d..000000000 --- a/.changeset/update-effect-beta-67.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch ---- - -Update to effect 4.0.0-beta.67. Switch deps from `pkg.pr.new` snapshot back to npm beta tag. diff --git a/.changeset/update-effect-beta-83.md b/.changeset/update-effect-beta-83.md deleted file mode 100644 index 0c4776c63..000000000 --- a/.changeset/update-effect-beta-83.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch -"@effect-app/vue-components": patch ---- - -Update Effect packages to `4.0.0-beta.83` (from `beta.74`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/sql-sqlite-node`, `@effect/atom-vue`, `@effect/vitest`. - -Adapt the infra workflow engines to beta.83 API changes: - -- `Schema.Defect` is now a constructor function — use `S.Defect()` when building the deferred-exit codec (the bare constant no longer produces a usable schema and crashed `toType`). -- `Workflow` exposes its name as `_tag` instead of `name`. `WorkflowEngineSqlite`/`WorkflowEngineCosmos` now key the registry, codec caches, and persisted `workflow_name` off `workflow._tag`, fixing crash-recovery (stale-lease re-drive previously registered under an `undefined` key and never matched). diff --git a/.changeset/update-effect-beta-84.md b/.changeset/update-effect-beta-84.md deleted file mode 100644 index 5f2113b94..000000000 --- a/.changeset/update-effect-beta-84.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- - -Update effect packages to `4.0.0-beta.84` (`effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`). diff --git a/.changeset/update-effect-beta-86.md b/.changeset/update-effect-beta-86.md deleted file mode 100644 index 49e0b8a74..000000000 --- a/.changeset/update-effect-beta-86.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- - -Update effect packages to `4.0.0-beta.86` (from `beta.84`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`. No source changes required — typecheck and tests pass unchanged. diff --git a/.changeset/update-effect-beta-88.md b/.changeset/update-effect-beta-88.md deleted file mode 100644 index 91af448b3..000000000 --- a/.changeset/update-effect-beta-88.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- - -Update effect packages to `4.0.0-beta.88` (from `beta.86`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`. Also bump `@effect-app/cli` to `2.1.0-beta.35`. No source changes required — typecheck and tests pass unchanged. diff --git a/.changeset/update-effect-beta-90.md b/.changeset/update-effect-beta-90.md deleted file mode 100644 index b8ad24f7c..000000000 --- a/.changeset/update-effect-beta-90.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- - -Update effect packages to `4.0.0-beta.90` (from `beta.88`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`. No source changes required — typecheck and tests pass unchanged. diff --git a/.changeset/update-effect-pkgprnew.md b/.changeset/update-effect-pkgprnew.md deleted file mode 100644 index cfdcd8fcb..000000000 --- a/.changeset/update-effect-pkgprnew.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/vue": patch ---- - -Update to effect `pkg.pr.new` snapshot at `a42ef66` (4.0.0-beta.66). Remove `Yieldable` and `asEffect()` (service tags are now `Effect` directly). diff --git a/.changeset/update-effect-rc-112.md b/.changeset/update-effect-rc-112.md deleted file mode 100644 index 60c243f63..000000000 --- a/.changeset/update-effect-rc-112.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -"@effect-app/vue-components": patch -"effect-app": patch -"@effect-app/infra": patch -"@effect-app/cli": patch -"@effect-app/vue": patch ---- - -Update effect packages to `4.0.0-rc.112` (from `beta.107`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`. Sync `repos/effect` subtree from `Effect-TS/effect` at `effect@4.0.0-rc.112`. - -API adaptations for rc.112: - -- cluster encoded driver `resetAddress` → batched `resetAddresses` -- Cosmos `unprocessedMessages` honors optional `limit` / `addresses` (only claimed rows are returned) -- Service Bus `Runners.make` supplies `codecFor` for schema-aware RPC serialization -- `pnpm subtree:effect` passes `--url https://github.com/Effect-TS/effect.git` (published CLI still defaults to effect-smol) -- JSON Schema check constraints are compacted onto the parent (`minLength`/`maxLength` instead of `allOf`) diff --git a/.changeset/upset-aliens-bathe.md b/.changeset/upset-aliens-bathe.md deleted file mode 100644 index 095b7cf59..000000000 --- a/.changeset/upset-aliens-bathe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/infra": patch ---- - -replace useless span diff --git a/.changeset/upset-bugs-roll.md b/.changeset/upset-bugs-roll.md deleted file mode 100644 index b2ee1327e..000000000 --- a/.changeset/upset-bugs-roll.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": patch ---- - -set default barrel ext to .ts diff --git a/.changeset/version-independent-snapshot.md b/.changeset/version-independent-snapshot.md deleted file mode 100644 index 439a300d9..000000000 --- a/.changeset/version-independent-snapshot.md +++ /dev/null @@ -1,5 +0,0 @@ ---- - ---- - -Run Changesets version in parallel with pkg.pr.new snapshot publish on main. diff --git a/.changeset/vue-components-src-exports.md b/.changeset/vue-components-src-exports.md deleted file mode 100644 index c4ef29f70..000000000 --- a/.changeset/vue-components-src-exports.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Point the package `exports` at `src` (`.vue`/`.ts`) for workspace/source consumption, matching `effect-app` and `@effect-app/vue`. The published package is unchanged — `publishConfig.exports` still ships the built `dist` artifacts, so registry consumers keep getting compiled output. This lets linked/source consumers (e.g. via embedded-source mode) load the components from `src` without a build step; runtime `.vue` is compiled by the consumer's bundler and types resolve via `vue-tsc`. diff --git a/.changeset/vue-components-vuetify-typecheck.md b/.changeset/vue-components-vuetify-typecheck.md deleted file mode 100644 index fd35ccff1..000000000 --- a/.changeset/vue-components-vuetify-typecheck.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -OmegaForm/Vuetify: fix `@update:model-value` handler type mismatches on `v-text-field`, `v-textarea` and `v-radio-group` (wrap `field.handleChange` so Vuetify's concrete event value is accepted), and type the `v-radio` `:key`. Drop the stale `@vue-skip` on `Dialog` slot pass-through. - -Tooling: bind Vuetify component types during type-checking via a typecheck-only `types/vuetify-shims.d.ts` so `` etc. resolve in the editor and `pnpm check`, with declaration emit isolated in `tsconfig.build.json` (no Vuetify global augmentation leaks into published types, no runtime bundle). Enable `noUnusedLocals`/`noUnusedParameters` in the check config. diff --git a/.changeset/vue-placeholder-data-fallback.md b/.changeset/vue-placeholder-data-fallback.md deleted file mode 100644 index 629fabaa4..000000000 --- a/.changeset/vue-placeholder-data-fallback.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Restore TanStack `placeholderData` / `initialData` as a display-level fallback in query views. While pending with no cached value, `data` now returns the resolved placeholder (with `select` applied when set); neither option is written to the atom cache. diff --git a/.changeset/vue-prefer-fn-untraced.md b/.changeset/vue-prefer-fn-untraced.md deleted file mode 100644 index e303635eb..000000000 --- a/.changeset/vue-prefer-fn-untraced.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Replace `(...) => Effect.gen` with `Effect.fnUntraced` in commander `withDefaultToast`. diff --git a/.changeset/vue-stream-query.md b/.changeset/vue-stream-query.md deleted file mode 100644 index 6e06cc5a6..000000000 --- a/.changeset/vue-stream-query.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": minor ---- - -Add `streamQuery` support for stream-type Rpc handlers. When an Rpc is of type `"stream"`, the client now exposes a `.streamQuery` property (and `...StreamQuery` in helpers) that uses `streamedQuery` from `@tanstack/query-core` to accumulate chunks reactively as an `AsyncResult`. diff --git a/.changeset/vue-suspense-result-race.md b/.changeset/vue-suspense-result-race.md deleted file mode 100644 index 836d8db41..000000000 --- a/.changeset/vue-suspense-result-race.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Wait for Vue query result refs to settle after TanStack suspense resolves. diff --git a/.changeset/vue-unified-invalidation-foreach.md b/.changeset/vue-unified-invalidation-foreach.md deleted file mode 100644 index ed1c31980..000000000 --- a/.changeset/vue-unified-invalidation-foreach.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Merge client and server-driven cache invalidation keys into a single `Effect.forEach` pass so server keys always run regardless of whether client targets are empty or custom invalidation options are used. diff --git a/.changeset/wacky-deer-decide.md b/.changeset/wacky-deer-decide.md deleted file mode 100644 index 8591c7342..000000000 --- a/.changeset/wacky-deer-decide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -fix forms diff --git a/.changeset/warm-maps-reflect.md b/.changeset/warm-maps-reflect.md deleted file mode 100644 index 15e923726..000000000 --- a/.changeset/warm-maps-reflect.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -Run projected query decoders through Effect so schemas that require services can resolve during legacy TanStack query refetches. diff --git a/.changeset/warm-streets-smell.md b/.changeset/warm-streets-smell.md deleted file mode 100644 index 7629b1723..000000000 --- a/.changeset/warm-streets-smell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue-components": patch ---- - -Bump diff --git a/.changeset/wet-roses-press.md b/.changeset/wet-roses-press.md deleted file mode 100644 index 982956ec0..000000000 --- a/.changeset/wet-roses-press.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix - class should check type side diff --git a/.changeset/wet-sites-fall.md b/.changeset/wet-sites-fall.md deleted file mode 100644 index 6f61aa69a..000000000 --- a/.changeset/wet-sites-fall.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@effect-app/vue-components": major -"effect-app": major -"@effect-app/infra": major -"@effect-app/vue": major ---- - -Fix Schema->Codec diff --git a/.changeset/wild-olives-bathe.md b/.changeset/wild-olives-bathe.md deleted file mode 100644 index 193bb88d8..000000000 --- a/.changeset/wild-olives-bathe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix ForceVOid diff --git a/.changeset/wild-wombats-nail.md b/.changeset/wild-wombats-nail.md deleted file mode 100644 index 1c38218fe..000000000 --- a/.changeset/wild-wombats-nail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -add deprecation notices diff --git a/.changeset/wise-items-warn.md b/.changeset/wise-items-warn.md deleted file mode 100644 index 934f3a299..000000000 --- a/.changeset/wise-items-warn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"effect-app": patch ---- - -fix ForceVoid for real diff --git a/.changeset/wise-stamps-crash.md b/.changeset/wise-stamps-crash.md deleted file mode 100644 index e7ceb8cb1..000000000 --- a/.changeset/wise-stamps-crash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -update tanstack/query diff --git a/.changeset/withdefaulttoaststream-progress.md b/.changeset/withdefaulttoaststream-progress.md deleted file mode 100644 index 5210c8ea5..000000000 --- a/.changeset/withdefaulttoaststream-progress.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@effect-app/vue": patch ---- - -`Command.withDefaultToastStream`: add `progress` option to update the waiting toast with progress text on each stream element diff --git a/.changeset/witty-bats-return.md b/.changeset/witty-bats-return.md deleted file mode 100644 index a69a12acf..000000000 --- a/.changeset/witty-bats-return.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@effect-app/eslint-codegen-model": major -"effect-app": major -"@effect-app/infra": major -"@effect-app/vue": major -"@effect-app/vue-components": major ---- - -Effect v4 beta diff --git a/.changeset/wrap-stream-command.md b/.changeset/wrap-stream-command.md deleted file mode 100644 index 9c76433de..000000000 --- a/.changeset/wrap-stream-command.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -"@effect-app/vue": minor ---- - -Add `wrapStream` support to `Command` with separate `result` and `running` props. - -**Key design:** - -- `result` is always the command's own execution outcome (from `asResult`) -- `running` holds the stream's live `AsyncResult` ref for progress tracking - -**New behaviour:** - -- `CommanderImpl.wrapStream(mutation)` returns a callable like `wrap` — `wrapStream(mutation)()` gives `CommandOut`. -- Accepts either `{ id, mutateStream: [...] }` or the augmented tuple directly (when `.id` is attached). -- `Command.wrap` now accepts `{ mutateStream, id }` and the augmented tuple — both delegate to `wrapStream`. -- `FnOptions.progress` — pass a `ComputedRef` to any `fn`-created command; surfaces as `running`. -- `StreamMutationWithExtensions` now includes `.id` on the tuple. -- Stream client entries expose `wrapStream` (callable), `fn`, and `mutateStream` (with `.id`). -- Stream mutation helpers also carry `.fn` and `.id`. - -```ts -// Via client entry: -const exportCmd = Command.wrapStream(client.myExport)() -// exportCmd.result = own execution result; exportCmd.running = live stream AsyncResult - -// Via mutateStream tuple (id is attached): -const exportCmd = Command.wrapStream(client.myExport.mutateStream)() - -// wrap also accepts the tuple: -const exportCmd = Command.wrap(client.myExport.mutateStream)() - -// fn with external progress: -const cmd = Command.fn({ - id: "myExport", - progress: client.myExport.mutateStream[0] -})( - function*(arg) { - yield* client.myExport.mutateStream[1](arg) - } -) -// cmd.running === the stream AsyncResult ref -``` diff --git a/.claude/settings.json b/.claude/settings.json deleted file mode 100644 index 824fd22d2..000000000 --- a/.claude/settings.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(git commit -m ':*)", - "Bash(pnpm -r check)", - "Bash(pnpm lint-fix:*)", - "Bash(git commit -m ' *)", - "Read(//home/patroza/pj/effect-app/**)", - "Bash(git checkout *)", - "Bash(pnpm --filter @effect-app/vue check)", - "Bash(git -C /home/patroza/pj/effect-app/libs status)", - "Bash(git -C /home/patroza/pj/effect-app/libs diff --stat)", - "Bash(git -C /home/patroza/pj/effect-app/libs log -5 --oneline)", - "Bash(git -C /home/patroza/pj/effect-app/libs add packages/infra/src/Model/Repository/ext.ts packages/infra/src/Model/Repository/internal/internal.ts packages/infra/src/Model/Repository/service.ts .changeset/repo-mutations-accept-empty-arrays.md)", - "Bash(git -C /home/patroza/pj/effect-app/libs commit -m ' *)" - ] - } -} diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index 6786e9b55..000000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,42 +0,0 @@ -# Specifies which operating system image to use. -FROM mcr.microsoft.com/vscode/devcontainers/base:ubuntu - -WORKDIR /home/vscode - -# curl and ca-certificates are needed for volta installation -RUN apt-get update \ - && apt-get install -y \ - curl \ - ca-certificates \ - --no-install-recommends - -# Changes user to vscode and the SHELL to bash -USER vscode -SHELL ["/bin/bash", "-c"] - -# since we're starting non-interactive shell, we wil need to tell bash to load .bashrc manually -ENV BASH_ENV ~/.bashrc -# needed by volta() function -ENV VOLTA_HOME /home/vscode/.volta -# make sure packages managed by volta will be in PATH -ENV PATH $VOLTA_HOME/bin:$PATH - -# download volta -RUN curl https://get.volta.sh | bash -# change the working directory to the one where the project lives -WORKDIR /workspaces/macs-configurator - -# and install node and pnpm -RUN volta install node@24 -RUN npm i -g pnpm - -RUN echo - -ENV SHELL=/bin/bash - -RUN echo - -# prevent `npm or yarn` usage in the shell now that pnpm is installed -WORKDIR /home/vscode -COPY usepnpm.sh /tmp/ -RUN cat /tmp/usepnpm.sh >> ~/.bashrc diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index 6a267802a..000000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "Effect App Libs Codespace", - "build": { - "dockerfile": "Dockerfile" - }, - // see https://containers.dev/implementors/json_reference/#remoteUser - // you can change the user name to whatever you want, this is used to avoid installing stuff in the image as root - "remoteUser": "vscode", - "postCreateCommand": "pnpm i && pnpm build", - "hostRequirements": { - "cpus": 4, - "memory": "8gb" - } -} diff --git a/.devcontainer/humanlog.sh b/.devcontainer/humanlog.sh deleted file mode 100644 index d792a7551..000000000 --- a/.devcontainer/humanlog.sh +++ /dev/null @@ -1,2 +0,0 @@ - export HUMANLOG_INSTALL="/home/vscode/.humanlog" - export PATH="$HUMANLOG_INSTALL/bin:$PATH" \ No newline at end of file diff --git a/.devcontainer/usepnpm.sh b/.devcontainer/usepnpm.sh deleted file mode 100644 index 2c34d4098..000000000 --- a/.devcontainer/usepnpm.sh +++ /dev/null @@ -1,26 +0,0 @@ -NPM_PATH=$(which npm) -npm () { - if [ -e pnpm-lock.yaml ] - then - echo "Please use PNPM with this project" - elif [ -e yarn.lock ] - then - echo "Please use Yarn with this project" - else - $NPM_PATH "$@" - fi -} - - -YARN_PATH=$(which yarn) -yarn () { - if [ -e pnpm-lock.yaml ] - then - echo "Please use PNPM with this project" - elif [ -e package-lock.json ] - then - echo "Please use NPM with this project" - else - $YARN_PATH "$@" - fi -} \ No newline at end of file diff --git a/.envrc b/.envrc index 03113d3db..3550a30f2 100644 --- a/.envrc +++ b/.envrc @@ -1,5 +1 @@ use flake - -# Repo `gh` policy shim: publishing runs the ship gate first (see AGENTS.md). -# Installed by scripts/install-git-hooks.mjs; run `direnv allow` once after cloning. -PATH_add .tools/bin diff --git a/.githooks/README.md b/.githooks/README.md deleted file mode 100644 index 147308b75..000000000 --- a/.githooks/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Native Git hooks - -`pnpm install` configures `core.hooksPath=.githooks` via -`scripts/install-git-hooks.mjs`. Tracked hooks exist in every linked worktree. - -## `post-checkout` - -### 1. Clear TypeScript project emit (always on branch / worktree checkout) - -`pnpm check` is `tsgo --build` with composite + incremental. Package outputs -(`.tsbuildinfo` + `.d.ts` / `.js`) live under `packages/*/dist` and are -gitignored. - -After a branch switch, **sources** follow HEAD but **dist** can still belong to -another tree. tsgo may treat projects as up to date and typecheck new sources -against old declarations → phantom type errors that disappear on -`pnpm rbuild` (`clean` + check). Same class of failure as -[scanner#1495](https://github.com/macs-holding/scanner/pull/1495) / -[scanner#2166](https://github.com/macs-holding/scanner/pull/2166). - -On every **branch** checkout (`post-checkout` flag `1`), this hook deletes: - -- `packages/*/dist`, `packages/*/build`, root `dist` if present -- any remaining `*.tsbuildinfo` outside `node_modules` / `repos` / `.git` - -File-only checkouts (flag `0`) are left alone. - -**This is a workaround.** Root cause belongs in tsgo incremental invalidation -(e.g. [typescript-go#2666](https://github.com/microsoft/typescript-go/issues/2666), -[#4664](https://github.com/microsoft/typescript-go/issues/4664), -[#4262](https://github.com/microsoft/typescript-go/issues/4262)). Remove when -upstream is reliable. Do not re-enable cross-tree dist reuse without an exact -source-identity key. - -### 2. Reconcile pnpm (when package/lock changed) - -Records package/lockfile state under `node_modules` so T3 handoff does not -repeat an install Git already completed. - -When T3 launches the configured worktree setup script, it sets -`T3CODE_DEFER_DEPENDENCY_INSTALL=1`. Cleanup still runs synchronously, while the -setup terminal installs dependencies asynchronously with hardlink imports from -the shared pnpm store. Raw Git worktrees still install during checkout. Their -install failure is best-effort; T3 can request the real exit status with -`T3CODE_WORKTREE_PREPARATION_STRICT=1` without removing the created worktree. - -## `pre-commit` / `pre-push` - -lint-staged on commit; agent ship gate on push (see repo AGENTS.md). diff --git a/.githooks/post-checkout b/.githooks/post-checkout deleted file mode 100755 index e938e7375..000000000 --- a/.githooks/post-checkout +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/sh -# 1) After a branch/worktree checkout: drop TypeScript project-reference emit so -# tsgo --build never typechecks against foreign-tree .tsbuildinfo / .d.ts. -# 2) Reconcile pnpm when package.json / lockfile changed. - -PATH="$HOME/.local/bin:$HOME/.local/share/pnpm:$HOME/.local/share/mise/shims:/run/current-system/sw/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:$PATH" -export PATH - -# post-checkout also runs after file-only checkouts; those are not a tree switch. -[ "${3:-0}" = "1" ] || exit 0 - -wt_root=$(git rev-parse --show-toplevel 2>/dev/null) || exit 0 -[ -f "$wt_root/package.json" ] || exit 0 - -# --- TS build-cache wipe (every branch / worktree checkout) ----------------- -# -# Why: `pnpm check` is `tsgo --build` with composite + incremental. Package -# outputs live in packages/*/dist (gitignored). After checkout/rebase, sources -# belong to HEAD but dist may still be from another branch. tsgo can treat -# projects as up-to-date and typecheck new sources against old .d.ts → phantom -# errors that vanish on `pnpm rbuild` (clean+check). -# -# Same class as macs-holding/scanner#1495 / #2166 and upstream typescript-go -# incremental gaps (#2666, #4664, #4262, #3787). -# -# Workaround only — remove when upstream invalidation is reliable. Do not -# re-introduce foreign dist reuse without an exact source-identity key. -# -clean_ts_project_emit() { - root=$1 - removed=0 - - for d in \ - "$root"/packages/*/dist \ - "$root"/packages/*/build \ - "$root"/dist - do - [ -e "$d" ] || continue - rm -rf "$d" - removed=1 - done - - if [ -d "$root" ]; then - tsbuild_files=$( - find "$root" \ - \( -path "$root/node_modules" -o -path "$root/repos" -o -path "$root/.git" -o -path "$root/.run" -o -path "$root/build" \) -prune -o \ - -type f -name '*.tsbuildinfo' -print 2>/dev/null || true - ) - if [ -n "$tsbuild_files" ]; then - printf '%s\n' "$tsbuild_files" | while IFS= read -r f; do - [ -n "$f" ] || continue - rm -f "$f" - done - removed=1 - fi - fi - - if [ "$removed" = 1 ]; then - echo "post-checkout: cleared TypeScript project emit (dist / tsbuildinfo) under $root" >&2 - echo "post-checkout: workaround for tsgo stale incremental cache after tree switch — see .githooks/README.md (remove when upstream fixed)" >&2 - fi -} - -clean_ts_project_emit "$wt_root" - -# T3 launches the configured worktree setup command in a visible terminal. Keep -# cleanup synchronous, but leave dependency installation to that async setup. -if [ "${T3CODE_DEFER_DEPENDENCY_INSTALL:-0}" = "1" ]; then - echo "post-checkout: dependency installation deferred to T3 workspace initialization" >&2 - exit 0 -fi - -# --- pnpm install when lockfile / package.json changed ----------------------- -[ -f "$wt_root/pnpm-lock.yaml" ] || exit 0 -state_file="$wt_root/node_modules/.pnpm-checkout-state" -state=$(cksum "$wt_root/package.json" "$wt_root/pnpm-lock.yaml" | cksum | awk '{print $1 ":" $2}') -if [ -f "$wt_root/node_modules/.modules.yaml" ] && [ "$(cat "$state_file" 2>/dev/null)" = "$state" ]; then - exit 0 -fi -command -v pnpm >/dev/null 2>&1 || { - echo "post-checkout: pnpm not on PATH; node_modules not installed" >&2 - exit 1 -} - -export CI=1 -echo "post-checkout: pnpm install in $wt_root" >&2 -cd "$wt_root" || exit 1 -if pnpm install --frozen-lockfile --prefer-offline \ - --config.package-import-method=hardlink \ - --config.confirmModulesPurge=false -then - printf '%s\n' "$state" >"$state_file" -else - status=$? - echo "post-checkout: dependency preparation failed (exit $status); worktree remains usable but degraded" >&2 - [ "${T3CODE_WORKTREE_PREPARATION_STRICT:-0}" = "1" ] && exit "$status" - exit 0 -fi diff --git a/.githooks/pre-commit b/.githooks/pre-commit deleted file mode 100755 index 8fd0ddf8c..000000000 --- a/.githooks/pre-commit +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -root=$(git rev-parse --show-toplevel 2>/dev/null) || exit 1 -if [ ! -x "$root/node_modules/.bin/lint-staged" ]; then - echo "pre-commit: worktree preparation is incomplete (lint-staged is missing)" >&2 - echo "pre-commit: run pnpm install before committing" >&2 - exit 1 -fi -# The binary directly, not `pnpm lint-staged`: pnpm runs a dependency-status -# check first and will try to purge node_modules when the lockfile moved, which -# aborts without a TTY — the commit then fails with a pnpm error that says -# nothing about linting. The guard above already established this path exists. -exec "$root/node_modules/.bin/lint-staged" diff --git a/.githooks/pre-push b/.githooks/pre-push deleted file mode 100755 index 6ba4a4cba..000000000 --- a/.githooks/pre-push +++ /dev/null @@ -1,17 +0,0 @@ -# Agent-only ship gate (humans: no-op). See scripts/agent-pre-push.mjs. -# Every push (draft included): check + lint + test. No browser/API suite exists -# here, so there is nothing a draft could usefully defer. -# Publish: pnpm pr:ready, or raw `gh pr ready` — the shim runs the same gate first. -# -# Humans: SKIP_AGENT_PREPUSH=1 git push -# Agents: never SKIP_AGENT_PREPUSH / never --no-verify -# Nested Git commands must discover their own repositories, not inherit this -# hook's GIT_DIR/GIT_WORK_TREE from the outer push. -for name in $(git rev-parse --local-env-vars); do - unset "$name" -done -# Plain `node`, not `pnpm exec node`: pnpm runs a dependency-status check first -# and will try to purge node_modules when the lockfile moved (a rebase does it), -# which aborts without a TTY — the hook then fails with a pnpm error instead of -# anything about the gate. The gate puts node_modules/.bin on PATH itself. -node scripts/agent-pre-push.mjs diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 65e15abd8..000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -# These are supported funding model platforms - -github: [patroza] diff --git a/repos/effect/.github/actions/deploy-website/action.yml b/.github/actions/deploy-website/action.yml similarity index 100% rename from repos/effect/.github/actions/deploy-website/action.yml rename to .github/actions/deploy-website/action.yml diff --git a/repos/effect/.github/actions/setup/action.yaml b/.github/actions/setup/action.yaml similarity index 100% rename from repos/effect/.github/actions/setup/action.yaml rename to .github/actions/setup/action.yaml diff --git a/.github/npm-trusted-publishing.md b/.github/npm-trusted-publishing.md deleted file mode 100644 index 1d8ef5874..000000000 --- a/.github/npm-trusted-publishing.md +++ /dev/null @@ -1,85 +0,0 @@ -# npm Trusted Publishing (OIDC) - -Publish from GitHub Actions without a long-lived `NPM_TOKEN`. -npm mints a short-lived credential per workflow run via OIDC. - -Official docs: https://docs.npmjs.com/trusted-publishers/ - -## Prerequisites - -- You must be an **owner** (or have settings access) on each package below. -- Workflow that publishes: `.github/workflows/release.yaml` (filename is `release.yaml`). -- GitHub repo: `effect-app/libs` (public, GitHub-hosted runners). - -## Packages to configure - -Configure **each** publishable package (one trusted publisher per package): - -| Package | npm settings URL | -| --- | --- | -| `effect-app` | https://www.npmjs.com/package/effect-app/access | -| `@effect-app/infra` | https://www.npmjs.com/package/@effect-app/infra/access | -| `@effect-app/vue` | https://www.npmjs.com/package/@effect-app/vue/access | -| `@effect-app/vue-components` | https://www.npmjs.com/package/@effect-app/vue-components/access | -| `@effect-app/cli` | https://www.npmjs.com/package/@effect-app/cli/access | -| `@effect-app/eslint-codegen-model` | https://www.npmjs.com/package/@effect-app/eslint-codegen-model/access | -| `@effect-app/eslint-shared-config` | https://www.npmjs.com/package/@effect-app/eslint-shared-config/access | - -If the UI shows **Settings** / **Trusted Publisher** instead of `/access`, use that page for the same package. - -## Exact steps on npmjs.com (per package) - -Repeat for every package in the table: - -1. Open the package page → **Settings** (or the access URL above). -2. Find **Trusted Publisher**. -3. Under **Select your publisher**, choose **GitHub Actions**. -4. Fill in exactly: - - **Organization or user:** `effect-app` - - **Repository:** `libs` - - **Workflow filename:** `release.yaml` - (filename only, including `.yaml` — not `.yml`, not a path) - - **Environment name:** leave **empty** (unless you later add a GitHub Environment to the job) - - **Allowed actions:** select **`npm publish`** (required) -5. Save. - -npm does **not** validate the config on save — mismatches only show up at publish time (often as `E404`). - -## Order of operations (important) - -1. **Configure trusted publishers** for all packages above (npm side). -2. **Merge** the PR that enables OIDC in `.github/workflows/release.yaml` (`id-token: write`, no `NPM_TOKEN` on publish). -3. On push to `main`, the Changesets workflow publishes any unpublished versions. -4. Confirm success in the Actions log: look for - `No NPM_TOKEN found, but OIDC is available - using npm trusted publishing`. -5. After a successful OIDC publish, optionally harden each package: - - **Publishing access** → **Require two-factor authentication and disallow tokens** - - Revoke the old GitHub secret `NPM_TOKEN` and any automation tokens on npm. - -Do **not** set `NPM_TOKEN` on the publish step once OIDC is intended — `changesets/action` will use the long-lived token instead of OIDC when that env var is present. - -## GitHub workflow - -Live workflow: **`.github/workflows/release.yaml`**. - -It includes: - -- `permissions.id-token: write` -- Node `24` (latest 24.x; npm 12 needs Node ≥ `24.15` — pin the major, not a stale patch like `24.14`) -- Workflow upgrades to `npm@latest` after setup-node (OIDC needs npm ≥ `11.5.1`) -- **No** `NPM_TOKEN` on the publish step -- Package `repository.url` points at `https://github.com/effect-app/libs.git` (set in package.json) - -## Troubleshooting - -| Symptom | Likely cause | -| --- | --- | -| `E404` / “could not be found or you do not have permission” | Trusted publisher mismatch (org/repo/workflow filename), or OIDC not used because `NPM_TOKEN` is still set | -| `ENEEDAUTH` / unable to authenticate | Missing `id-token: write`, old npm CLI, or self-hosted runner (not supported) | -| Only some packages publish | Trusted publisher missing on those packages | -| `EBADENGINE` installing `npm@latest` | Node pin too old (e.g. `24.14`); use major `24` so runners are ≥ `24.15` | - -## Optional hardening - -- GitHub **Environment** (e.g. `npm`) on the `version` job with required reviewers; if used, put the same environment name in every package’s trusted publisher config. -- Keep a **read-only** granular npm token only if install needs private packages (not required for this public monorepo today). diff --git a/repos/effect/.github/workflows/ai-codegen.yml b/.github/workflows/ai-codegen.yml similarity index 100% rename from repos/effect/.github/workflows/ai-codegen.yml rename to .github/workflows/ai-codegen.yml diff --git a/repos/effect/.github/workflows/bundle-comment.yml b/.github/workflows/bundle-comment.yml similarity index 100% rename from repos/effect/.github/workflows/bundle-comment.yml rename to .github/workflows/bundle-comment.yml diff --git a/repos/effect/.github/workflows/check.yml b/.github/workflows/check.yml similarity index 100% rename from repos/effect/.github/workflows/check.yml rename to .github/workflows/check.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 6161e56f7..000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,179 +0,0 @@ -name: CI - -on: - # push: - # branches: [main] # CI on main branch is handled by release.yaml workflow - pull_request: - branches: [main] - workflow_call: - inputs: - publish_snapshot: - description: Run snapshot publish inside this reusable workflow - type: boolean - default: false - workflow_dispatch: - -env: - CI: true - -concurrency: - group: ci-${{ github.ref }} - cancel-in-progress: true - -permissions: - contents: read - pull-requests: write - -jobs: - lint: - name: Lint - runs-on: ubuntu-latest - timeout-minutes: 15 - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: 24 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - run_install: false - - - name: Get pnpm store directory - id: pnpm-cache - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - - name: Setup pnpm cache - uses: actions/cache@v4 - with: - path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-v2-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store-v2- - - - name: Install dependencies - run: | - pnpm install --frozen-lockfile || { - echo "::warning::pnpm install failed; wiping store and retrying" - rm -rf "$(pnpm store path)" - pnpm install --frozen-lockfile - } - - - name: Run lint - run: pnpm lint - - build: - name: Build - runs-on: ubuntu-latest - timeout-minutes: 15 - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: 24 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - run_install: false - - - name: Get pnpm store directory - id: pnpm-cache - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - - name: Setup pnpm cache - uses: actions/cache@v4 - with: - path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-v2-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store-v2- - - - name: Install dependencies - run: | - pnpm install --frozen-lockfile || { - echo "::warning::pnpm install failed; wiping store and retrying" - rm -rf "$(pnpm store path)" - pnpm install --frozen-lockfile - } - - - name: Run build - run: pnpm build - - - name: Upload build artifacts - uses: actions/upload-artifact@v4 - with: - name: build-output - path: packages/*/dist - retention-days: 1 - if-no-files-found: error - - test: - name: Test - runs-on: ubuntu-latest - timeout-minutes: 15 - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: 24 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - run_install: false - - - name: Get pnpm store directory - id: pnpm-cache - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - - name: Setup pnpm cache - uses: actions/cache@v4 - with: - path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-v2-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store-v2- - - - name: Install dependencies - run: | - pnpm install --frozen-lockfile || { - echo "::warning::pnpm install failed; wiping store and retrying" - rm -rf "$(pnpm store path)" - pnpm install --frozen-lockfile - } - - - name: Run tests - run: pnpm test - - # On main, Changesets calls this workflow and then runs `version` with - # `needs: [ci]`. Keep snapshot out of that reusable path so version does - # not wait for pkg.pr.new. Main snapshot runs as a sibling in release.yaml. - snapshot: - name: Publish Snapshot - needs: [build] - if: | - inputs.publish_snapshot || - (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository) || - github.event_name == 'workflow_dispatch' - uses: ./.github/workflows/publish-snapshot.yml - permissions: - contents: read - pull-requests: write - secrets: inherit diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml deleted file mode 100644 index eb9719ecc..000000000 --- a/.github/workflows/claude.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: Claude Code - -on: - issue_comment: - types: [created] - pull_request_review_comment: - types: [created] - issues: - types: [opened, assigned] - pull_request_review: - types: [submitted] - -jobs: - claude: - if: | - (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || - (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || - (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) || - (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude'))) - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: read - issues: read - id-token: write - actions: read # Required for Claude to read CI results on PRs - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 1 - - - name: Run Claude Code - id: claude - uses: anthropics/claude-code-action@v1 - with: - claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} - - # This is an optional setting that allows Claude to read CI results on PRs - additional_permissions: | - actions: read - - # Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it. - # prompt: 'Update the pull request description to include a summary of changes.' - - # Optional: Add claude_args to customize behavior and configuration - # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md - # or https://code.claude.com/docs/en/cli-reference for available options - # claude_args: '--allowed-tools Bash(gh pr *)' diff --git a/repos/effect/.github/workflows/cluster.yml b/.github/workflows/cluster.yml similarity index 100% rename from repos/effect/.github/workflows/cluster.yml rename to .github/workflows/cluster.yml diff --git a/.github/workflows/publish-snapshot.yml b/.github/workflows/publish-snapshot.yml deleted file mode 100644 index 33852f531..000000000 --- a/.github/workflows/publish-snapshot.yml +++ /dev/null @@ -1,105 +0,0 @@ -name: Publish Snapshot - -on: - workflow_call: - -permissions: - contents: read - pull-requests: write - -env: - CI: true - -jobs: - snapshot: - name: Publish Snapshot - timeout-minutes: 20 - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: 24 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - run_install: false - - - name: Get pnpm store directory - id: pnpm-cache - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - - name: Setup pnpm cache - uses: actions/cache@v4 - with: - path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-v2-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store-v2- - - - name: Install dependencies - run: | - pnpm install --frozen-lockfile || { - echo "::warning::pnpm install failed; wiping store and retrying" - rm -rf "$(pnpm store path)" - pnpm install --frozen-lockfile - } - env: - NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Download build artifacts - uses: actions/download-artifact@v4 - with: - name: build-output - path: packages/ - - - name: Publish snapshots to pkg.pr.new - id: publish - run: pnpm exec pkg-pr-new publish --pnpm ./packages/* - - - name: Write snapshot usage summary - id: usage - shell: bash - run: | - PACKAGE_LOCATORS="${{ steps.publish.outputs.packages }}" - PACKAGE_URLS="${{ steps.publish.outputs.urls }}" - PUBLISHED_SHA="${{ steps.publish.outputs.sha }}" - if [ -z "$PACKAGE_LOCATORS" ] || [ -z "$PACKAGE_URLS" ] || [ -z "$PUBLISHED_SHA" ]; then - echo "pkg-pr-new did not return expected outputs (packages/urls/sha)" >&2 - exit 1 - fi - - { - echo "## Snapshot publish complete" - echo - echo "- SHA: \`${PUBLISHED_SHA}\`" - echo - echo "Published via pkg.pr.new." - echo - echo "### Install package locators" - echo "\`\`\`bash" - echo "$PACKAGE_LOCATORS" - echo "\`\`\`" - echo - echo "### Package URLs" - echo "\`\`\`text" - echo "$PACKAGE_URLS" - echo "\`\`\`" - } >> "$GITHUB_STEP_SUMMARY" - - { - echo "package_locators<> "$GITHUB_OUTPUT" diff --git a/.github/workflows/publish-wiki.yml b/.github/workflows/publish-wiki.yml deleted file mode 100644 index c66cc7707..000000000 --- a/.github/workflows/publish-wiki.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Publish wiki -on: - push: - branches: [main] - paths: - - wiki/** - - .github/workflows/publish-wiki.yml -concurrency: - group: publish-wiki - cancel-in-progress: true -permissions: - contents: write -jobs: - publish-wiki: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: Andrew-Chen-Wang/github-wiki-action@v4 diff --git a/repos/effect/.github/workflows/release-queue.yml b/.github/workflows/release-queue.yml similarity index 100% rename from repos/effect/.github/workflows/release-queue.yml rename to .github/workflows/release-queue.yml diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml deleted file mode 100644 index 6e38f2e11..000000000 --- a/.github/workflows/release.yaml +++ /dev/null @@ -1,94 +0,0 @@ -name: Changesets -on: - push: - branches: - - main -# id-token: write enables npm Trusted Publishing (OIDC). -# Do not pass NPM_TOKEN on the publish step — changesets/action prefers a -# long-lived token when set and will skip OIDC. -# See .github/npm-trusted-publishing.md for npmjs.com setup. -permissions: - contents: write - pull-requests: write - id-token: write -env: - CI: true - PNPM_CACHE_FOLDER: .pnpm-store -jobs: - ci: - uses: ./.github/workflows/ci.yml - - snapshot: - name: Publish Snapshot - needs: [ci] - if: | - github.actor != 'github-actions[bot]' && - !contains(github.event.head_commit.message, 'chore: update versions') - uses: ./.github/workflows/publish-snapshot.yml - permissions: - contents: read - pull-requests: write - secrets: inherit - - version: - needs: [ci] - timeout-minutes: 15 - runs-on: ubuntu-latest - steps: - - name: checkout code repository - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Install Node.js - uses: actions/setup-node@v4 - with: - # Major pin = latest 24.x (CI uses `latest`). npm@12 needs Node >= 24.15. - node-version: 24 - registry-url: https://registry.npmjs.org - - # Trusted publishing requires npm CLI >= 11.5.1; keep CLI current on this Node line. - - name: Ensure npm supports OIDC trusted publishing - run: npm install -g npm@latest && npm --version - - - uses: pnpm/action-setup@v3 - name: Install pnpm - id: pnpm-install - with: - run_install: false - - - name: Get pnpm store directory - id: pnpm-cache - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - - uses: actions/cache@v4 - name: Setup pnpm cache - with: - path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-v2-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store-v2- - - - name: install packages - run: | - pnpm install --frozen-lockfile || { - echo "::warning::pnpm install failed; wiping store and retrying" - rm -rf "$(pnpm store path)" - pnpm install --frozen-lockfile - } - env: - NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: create and publish versions - uses: changesets/action@v1 - with: - version: pnpm ci:version - commit: "chore: update versions" - title: "chore: update versions" - publish: pnpm ci:publish - createGithubReleases: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/repos/effect/.github/workflows/release.yml b/.github/workflows/release.yml similarity index 100% rename from repos/effect/.github/workflows/release.yml rename to .github/workflows/release.yml diff --git a/repos/effect/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml similarity index 100% rename from repos/effect/.github/workflows/snapshot.yml rename to .github/workflows/snapshot.yml diff --git a/.gitignore b/.gitignore index e98229014..26bba5ae5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,64 +1,41 @@ -.claude/worktrees -.DS_Store -node_modules/ -*.log -**/*/.next/ -packages/**/dist/ -!**/.eslintrc*.js -.build/ -dist/ -**/bin/*.js -**/bin/*.js.map -**/bin/*.d.ts -**/bin/*.d.ts.map -tsconfig.tsbuildinfo -.tsbuildinfo -.ultra.cache.json -.jest-cache -.next -.data/ -.npmrc -.cache/ -.opencode/ -.env.local +# Generated by Direnv .env -# CMake -cmake-build-*/ - - -# File-based project format -*.iws - -# IntelliJ -out/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -# End of https://www.toptal.com/developers/gitignore/api/intellij - -.infra/*_rev.yaml +# Dot files and directories +**/.* +!/.agents/ +!/.changeset/ +!/.envrc +!/.github/ +!/.gitignore +!/.oxlintrc.json +!/.vscode/ + +# Generated by TypeScript +dist/ +build/ +lib/ +**/*.tsbuildinfo -# vitest? -*.timestamp-*.mjs +# Generated by Pnpm +node_modules/ -# nix -.direnv +# Generated by scripts +coverage/ +tmp/ +stats.txt +# Generated by MacOS +.DS_Store -storybook-static/ -run.sh +# Scratchpad files +scratchpad/**/* -# Generated publish staging directories -packages/*/.publish/ +# Agent instructions +/AGENTS.md +/packages/**/AGENTS.md +/packages/**/CLAUDE.md +/packages/**/ai-docs/ -# agent gh shim (generated) + local ship-gate state -.tools/ -.run/ +# Agent config +opencode.json diff --git a/.ncurc.json b/.ncurc.json deleted file mode 100644 index be9722c1c..000000000 --- a/.ncurc.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "reject": [ - "glob", - "@types/glob", - "jwks-rsa", - "applicationinsights", - "@faker-js/faker", - "redis", - "@types/redis", - "react-hook-form", - "eslint-plugin-codegen", - "@tanstack/*" - ], - "dep": [ - "prod", - "dev", - "optional", - "peer" - ] -} diff --git a/.npmrc b/.npmrc deleted file mode 100644 index ad2a213cd..000000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -# @effect-app:registry=https://npm.pkg.github.com diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index b6f5ce1e9..000000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v22.23 diff --git a/.oxlintrc.json b/.oxlintrc.json index 46a530cff..b75ec470d 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -1,37 +1,36 @@ { - "$schema": "./node_modules/@effect/tsgo/oxlint-schema.json", - "extends": ["./packages/eslint-shared-config/src/oxlintrc.json"], - "options": { - "typeAware": true - }, - "plugins": ["effecttsgo"], - "rules": { - "effecttsgo/any-unknown-in-error-context": "off", - "effecttsgo/effect-fn-iife": "off", - "effecttsgo/global-error-in-effect-catch": "off", - "effecttsgo/layer-merge-all-with-dependencies": "off", - "effecttsgo/lazy-effect": "off", - "effecttsgo/return-effect-in-gen": "off", - "effecttsgo/run-effect-inside-effect": "off", - "effecttsgo/schema-sync-in-effect": "off", - "effecttsgo/strict-effect-provide": "off", - "effecttsgo/unsafe-effect-type-assertion": "off", - "effecttsgo/unknown-in-effect-catch": "off", - "effecttsgo/missing-effect-service-dependency": "error", - "effecttsgo/effect-fn-opportunity": "warn", - "effecttsgo/global-error-in-effect-failure": "warn", - "effecttsgo/prefer-schema-over-json": "warn" - }, - // ignorePatterns overwrites (not merges) the base — all standard patterns must be repeated here. + "$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json", + "extends": ["./packages/tools/oxc/oxlintrc.json"], "ignorePatterns": [ - "**/dist/**", - "**/node_modules/**", - "**/*.d.ts", - "**/*.js", - "**/*.jsx", - "**/vitest.config.ts", - "**/eslint.*.mjs", + "LLMS.md", + "**/dist", + "**/build", + "**/docs", + "**/*.tsbuildinfo", "**/CHANGELOG.md", - "repos/**" - ] + "packages/effect/typeperf/**/*", + "packages/effect/src/StandardSchema.ts", + "!scratchpad/**/*", + "**/.*", + "!.agents", + "!.agents/**/*", + "!.changeset", + "!.changeset/**/*", + "!.envrc", + "!.github", + "!.github/**/*", + "!.gitignore", + "!.oxlintrc.json", + "!.vscode", + "!.vscode/**/*" + ], + "jsPlugins": ["@effect/oxc/oxlint"], + "overrides": [{ + "files": ["**/{test,typetest,examples,ai-docs,benchmark,bundle,scripts,scratchpad}/**"], + "rules": { + "effect/no-bigint-literals": "off", + "eslint/no-console": "off", + "effect/no-import-from-barrel-package": "off" + } + }] } diff --git a/.specs/Update-to-latest-Effect.md b/.specs/Update-to-latest-Effect.md deleted file mode 100644 index 88edfa6d0..000000000 --- a/.specs/Update-to-latest-Effect.md +++ /dev/null @@ -1,23 +0,0 @@ -# Update to latest effect packages - -## Rules - -- only include root `package.json` and packages under the `packages` folders - -## Steps - -1. run `pnpm test` and `pnpm lint-fix` to compare later -2. update package.json files -3. run `pnpm i` -4. commit the dep bump (package.json files + `pnpm-lock.yaml`) — `pnpm subtree:effect` runs `git subtree pull` which **requires a clean working tree** (`fatal: working tree has modifications. Cannot add.` otherwise). Commit before syncing. -5. run `pnpm subtree:effect` to sync the `repos/effect` subtree to the same version (creates its own squash-merge commit), then run `pnpm i` inside it. -6. run test and lint again, compare to from before the update. -7. create a changeset describing the changes -8. prepare commit (changeset + any test/lint fallout) - -If new errors occur, first describe the problem, propose solutions and wait for answers. - -## Notes - -- subtree url: `https://github.com/Effect-TS/effect.git`, prefix `repos/effect`, tag `effect@`. -- v4 currently lives under the npm `rc` dist-tag (`beta` is frozen at `4.0.0-beta.107`; npm `latest` is still v3). Find target with `npm view effect dist-tags` — prefer `rc` if present, else `beta`. diff --git a/.specs/changeset-publishing.md b/.specs/changeset-publishing.md deleted file mode 100644 index 7bd8ac4a6..000000000 --- a/.specs/changeset-publishing.md +++ /dev/null @@ -1,138 +0,0 @@ -# Changesets Publishing - -## Summary - -Publish `effect-app`, `infra`, `vue` and `vue-components` under unified -versions using changesets' `fixed` groups. - -## Background - -All public packages must move in lockstep under a single version number (`4.0.0-beta.0`, `4.0.0-beta.1`, ...) -so consumers can install a coherent set of packages at any beta iteration. -Changesets supports this via **fixed version groups** (all packages in a group share the same -version). - -## Goals - -- All 4 public library packages publish the same version on every release. -- Developers continue using the standard `pnpm changeset` workflow. - -## Non-goals - -- No changes to the build system, CI pipeline scripts, or package contents. -- No independent versioning — all packages move together. -- No canary/nightly publishing strategy. - -## How it works - -### Fixed groups - -The `fixed` field in `.changeset/config.json` takes an array of package-name -arrays. All packages in a group are bumped to the **same version** whenever any -one of them is included in a changeset. By placing all 24 public packages in one -group, a single changeset touching any package triggers a version bump for every -package. - -### Version stability during pre-release - -A common concern: won't a `minor` or `patch` changeset during the beta change -the base version (e.g., `4.0.0-beta.1` → `4.1.0-beta.0`)? No — changesets -prevents this via `pre.json`. - -`pre.json` stores two critical fields: - -- **`initialVersions`**: the version of each package when pre-release mode was - entered (e.g., `3.0.0`). -- **`changesets`**: the IDs of every changeset applied since entering - pre-release mode. - -When `changeset version` runs, it computes the target version relative to -`initialVersions` using the **cumulative** bump of all tracked changesets (both -already-applied ones in `pre.json.changesets` and new pending ones). Because the -initial major changeset is always in the tracked set, the highest bump type is -always `major`, and the base version stays at `4.0.0` regardless of subsequent -patch or minor changesets. Only the beta counter increments. - -Example: - -1. Enter pre-release, `initialVersions` = `3.0.0` -2. Major changeset → `changeset version` → `4.0.0-beta.0` (major from `3.0.0`) -3. Developer adds a patch changeset → `changeset version` → `4.0.0-beta.1` - (major still highest → base unchanged, counter increments) -4. Developer adds a minor changeset → `changeset version` → `4.0.0-beta.2` - (major still highest → base unchanged, counter increments) - -The base semver never drifts during the beta period. - -### Combined behavior - -With both features active, every `changeset version` + `changeset publish` cycle -produces a release where all 24 packages share `4.0.0-beta.`. - -## Setup steps - -### 1. Update `.changeset/config.json` - -Add the `fixed` group and change `access` to `"public"`: - -## Ongoing workflow - -### Adding changesets - -Developers continue using `pnpm changeset` as usual. Because of the `fixed` -group, the bump type (patch/minor/major) of any individual changeset is -effectively irrelevant to the version number — all packages are already on a -major bump track. However, the changeset message still serves as the changelog -entry, so meaningful descriptions are important. - -### Publishing a new version - -```bash -npx changeset version # bumps to 4.0.0-beta.(n+1) -npx changeset publish # publishes all packages under "beta" tag -``` - -The counter auto-increments. No manual version editing is needed. - -### CI integration - -The existing CI publish workflow (typically `changeset version` + -`changeset publish` in a GitHub Action) works without modification. The -pre-release mode and fixed group are configuration-only — no script changes -required. - -## Graduating to stable - -When ready to release `4.0.0`: - -```bash -npx changeset pre exit # removes pre-release mode -npx changeset version # sets all packages to 4.0.0 -npx changeset publish # publishes to "latest" dist-tag -``` - -After exiting, the `fixed` group can remain to keep packages in lockstep for -future `4.x` releases, or be removed if independent versioning is desired. - -## Edge cases - -### Workspace dependency ranges - -`updateInternalDependencies: "patch"` ensures workspace `dependencies` and -`peerDependencies` are updated whenever a dependency's version changes. Because -all packages share the same version, cross-references will always point to the -current beta. Verify that dependency ranges use `workspace:^` (pnpm protocol) so -they resolve correctly during development and are rewritten to concrete ranges on -publish. - -### npm version collision safety - -Changesets' pre-release counter prevents collisions — `4.0.0-beta.0`, -`4.0.0-beta.1`, etc. are distinct versions. npm's immutability guarantees that a -published version can never be overwritten. - -## Files to modify - -| File | Change | -| ------------------------ | --------------------------------------------- | -| `.changeset/config.json` | Add `fixed` array, set `access` to `"public"` | diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 6f2a533fc..1a118e9e7 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,9 +1,6 @@ { "recommendations": [ "oxc.oxc-vscode", - "dprint.dprint", - "dbaeumer.vscode-eslint", - "editorconfig.editorconfig", - "Vue.volar" + "dprint.dprint" ] } diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 3a998c7db..000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "node", - "request": "launch", - "name": "Debug TSC", - "program": "${workspaceFolder}/node_modules/tsc.js", - "args": [ - "--build tsconfig.all.json" - ], - "sourceMaps": false, - "protocol": "inspector", - "configurations": [ - { - "name": "Attach by Process ID", - "processId": "${command:PickProcess}", - "request": "attach", - "skipFiles": [ - "/**" - ], - "type": "node" - } - ] -} diff --git a/.vscode/model.code-snippets b/.vscode/model.code-snippets deleted file mode 100644 index 3802d7720..000000000 --- a/.vscode/model.code-snippets +++ /dev/null @@ -1,77 +0,0 @@ -{ - "ModelCodegen": { - "prefix": "genmod", - "body": [ - "// codegen:start {preset: model}" - ] - }, - "ResourceCodegen": { - "prefix": "genrsc", - "body": [ - "// codegen:start {preset: meta, sourcePrefix: src/resources/}" - ] - }, - "ModelComplete": { - "prefix": "moc", - "body": [ - "export class $1 extends S.ExtendedClass<$1, $1.Encoded>()({", - "$2", - "}) {}" - ], - "description": "Defines a Model signature" - }, - "Model": { - "prefix": "mo", - "body": [ - "export class $1 extends S.Class<$1>()({$2}) {}", - "" - ], - "description": "Defines a Model signature" - }, - "UnionOpaque": { - "prefix": "un", - "body": [ - "const $1__ = union({ $2 })", - "const $1_ = enhanceClassUnion(OpaqueSchema<$1, $1.Encoded>()($1__))", - "export type $1 = To & UnionBrand", - "export interface $1Schema extends Identity {}", - "export const $1: $1Schema = $1_", - "export namespace $1 {", - " export type Encoded = Encoded & UnionBrand", - "}" - ] - }, - "Request": { - "prefix": "req", - "body": [ - "export class $1 extends S.Req<$1>()(\"$1\", {", - " $2", - "}, { success: $3 }) {}", - "" - ], - "description": "Defines a Request signature" - }, - "Response": { - "prefix": "res", - "body": [ - "export class Response extends S.Class", - " Effect.gen(function*() {", - " //const userRepo = yield* UserRepo", - "", - " return {", - " $2: $2($3)", - " }", - " })" - ] - } -} \ No newline at end of file diff --git a/.vscode/service.code-snippets b/.vscode/service.code-snippets deleted file mode 100644 index b3314afcb..000000000 --- a/.vscode/service.code-snippets +++ /dev/null @@ -1,14 +0,0 @@ -{ - "ServiceConstructor": { - "prefix": "svc", - "body": [ - "export class $1 extends Effect.Service<$1>()(\"$1\", {", - " dependencies: [$3],", - " effect: Effect.gen(function*() {", - " $2", - " return {}", - " })", - "}) {}", - ] - } -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 362ed5f03..721746cf3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,69 +1,51 @@ { - "files.exclude": { - "**/.git": false - }, - "explorer.sortOrderLexicographicOptions": "upper", - "typescript.preferences.includePackageJsonAutoImports": "on", - "typescript.experimental.expandableHover": true, - "js/ts.hover.maximumLength": 5000, - "typescript.preferences.autoImportFileExcludePatterns": [ - "node_modules/@sentry/node", - "node_modules/vitest/dist", - "node_modules/@azure/cosmos", - "node_modules/effect-app/Schema", - "node_modules/lodash", - "node_modules/@types/lodash" - ], - "typescript.tsdk": "node_modules/typescript/lib", - "eslint.workingDirectories": [ - { - "pattern": "apps/*" - }, - { - "pattern": "packages/*" - } - ], + "dprint.path": "node_modules/.bin/dprint", "editor.formatOnSave": true, + "editor.defaultFormatter": "dprint.dprint", "editor.formatOnSaveMode": "file", "editor.codeActionsOnSave": { - "source.fixAll.oxc": "explicit", - "source.fixAll.eslint": "explicit", - "source.addMissingImports": "explicit" + "source.fixAll.oxc": "explicit" + }, + "editor.quickSuggestions": { + "other": true, + "comments": false, + "strings": false + }, + "editor.acceptSuggestionOnCommitCharacter": true, + "editor.acceptSuggestionOnEnter": "on", + "editor.quickSuggestionsDelay": 10, + "editor.suggestOnTriggerCharacters": true, + "editor.tabCompletion": "off", + "editor.suggest.localityBonus": true, + "editor.suggestSelection": "recentlyUsed", + "editor.wordBasedSuggestions": "matchingDocuments", + "editor.parameterHints.enabled": true, + "files.insertFinalNewline": true, + "[typescript]": { + "editor.defaultFormatter": "dprint.dprint" }, - "editor.defaultFormatter": "dprint.dprint", - "[vue]": { + "[typescriptreact]": { "editor.defaultFormatter": "dprint.dprint" }, "[javascript]": { "editor.defaultFormatter": "dprint.dprint" }, - "[javascriptreact]": { + "[json]": { "editor.defaultFormatter": "dprint.dprint" }, - "[typescript]": { + "[jsonc]": { "editor.defaultFormatter": "dprint.dprint" }, - "[typescriptreact]": { + "[markdown]": { "editor.defaultFormatter": "dprint.dprint" }, - "eslint.validate": [ - "javascript", - "typescript", - "vue" - ], - "eslint.format.enable": false, - "csv-preview.separator": ";", - "cSpell.words": [ - "codegen", - "composables", - "pipeable", - "tsplus" + "deno.enable": true, + "deno.lint": false, + "deno.enablePaths": [ + "./packages/platform/deno" ], - "files.watcherExclude": { - "**/target": true - }, - "chat.tools.terminal.autoApprove": { - "git add": true, - "git commit": true - } + "js/ts.tsdk.path": "./node_modules/typescript/lib", + "js/ts.tsdk.additionalLocations": ["./node_modules/typescript/lib"], + "js/ts.tsdk.promptToUseWorkspaceVersion": true, + "js/ts.experimental.useTsgo": true } diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 2d9f2e8a6..000000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "tasks": [ - { - "label": "build", - "type": "shell", - "command": "pnpm watch", - "options": { - "cwd": "${workspaceRoot}" - }, - "group": { - "kind": "build", - "isDefault": true - }, - "isBackground": true, - "presentation": { - "group": "watch-build" - }, - "problemMatcher": [ - { - "base": "$tsc-watch", - "fileLocation": [ - "relative", - "${workspaceRoot}" - ] - } - ] - }, - { - "label": "Run Storybook OmegaForm", - "type": "shell", - "command": "pnpm storybook", - "options": { - "cwd": "${workspaceRoot}/packages/vue-components" - }, - "problemMatcher": [] - } - ] -} diff --git a/AGENTS.md b/AGENTS.md deleted file mode 100644 index 0ca05556b..000000000 --- a/AGENTS.md +++ /dev/null @@ -1,217 +0,0 @@ -# Agent Instructions - -This is the Effect App library repository, focusing on functional programming patterns and effect systems in TypeScript, wrapping and extending the Effect library. - -## Development Workflow - -- The git base branch is `main` -- Use `pnpm` as the package manager - -### Pull requests - -Always open a PR for agent work that changes the repo — do not leave finished work only on a local branch. - -- **Draft early**: open a draft PR as soon as there is a meaningful commit (or when starting multi-step work that will land), so review/CI can track progress while the rest of the work continues. Pushes to a draft run the same gate as any other push — the draft is about review status, not about skipping checks. -- **Keep the PR current**: push commits as you go; update the PR body if scope shifts. -- **Ready when done**: publish with `pnpm pr:ready`, or with plain `gh pr ready` — both run the ship gate first and undraft only if it passes. Do not hand-run the checks beforehand and do not leave a finished, validated change as draft. -- **Base**: target `main` unless the work is explicitly stacked on another branch. - -### The gate runs the checks — you do not - -`.githooks/pre-push` is the agent ship gate. It is a **no-op for humans** and -fires only for coding agents (`GROK_AGENT` / `T3_AGENT` / `AI_AGENT` / Claude / -Cursor / Codex env markers). - -It runs on **every** agent push — draft, ready, or no PR at all. There is no -browser or API suite here that a draft could usefully defer, and a pushed commit -that does not compile or whose tests fail is worth nothing to a reviewer whatever -the PR says. - -The gate is `pnpm check` → `pnpm lint` → `pnpm test`, which is what CI runs and -nothing more. This is a library monorepo — no application to stand up, no browser -suite — so the unit run _is_ the gate. It caches the validated HEAD SHA in -`.run/agent-ship-gate.json`, so **one commit is validated once** however many -times you push or publish it. Force a re-run with `AGENT_SHIP_GATE_FORCE=1`. - -**Do not hand-run `pnpm check` / `lint` / `test` as routine verification.** -Validating the same commit repeatedly costs the same each time and proves nothing -the first run did not. While iterating, narrow proof is the right tool — the one -test you are fixing, or a typecheck of the package you touched. Whole-gate runs -belong to the push. - -`.envrc` puts the `gh` shim on `PATH`; run **`direnv allow`** once after cloning -(`command -v gh` should print `.tools/bin/gh`). Never `--no-verify`, and never set -`SKIP_AGENT_PREPUSH` — that is the human escape hatch. - -### Core Principles - -- **Zero Tolerance for Errors**: All automated checks must pass -- **Root causes, not workarounds**: When something fails — a type error, a runtime crash, a failing test, a hanging fiber — diagnose the invariant that was violated and fix it there. Do **not** mask the symptom with a wrapper, a revive helper, a `try/catch`, a `JSON.parse(JSON.stringify(...))`, or any other shape-coercion. Each of these is a tell that you skipped the diagnosis. -- **No `as any` / `as unknown` casts**: A specific case of the rule above. Casts hide the type system telling you the shape is wrong. Understand the actual types and fix the root cause. If a type mismatch exists, find the correct v4 API, update the type signatures, or restructure the code. -- **No hand-rolled deserialization**: Anything stored as JSON and read back must round-trip through a Schema codec (`S.fromJsonString(S.toCodecJson(...))`, `S.encodeEffect` / `S.decodeEffect`). Class prototypes — `Exit`, `Cause`, `Workflow.Result`, `Schema.Class` instances — do not survive `JSON.parse`. The schema layer is the canonical reconstruction path; writing a custom `reviveX` helper is a smell that the codec is missing. -- **Search prior art before writing helpers**: Before introducing a new utility for a cross-boundary concern (serialization, encoding, retries, context propagation, OCC), grep the repo and `repos/effect` for the established pattern. The cluster engine, the existing Cosmos adapter, the SQL stores — they have already solved most of these problems. Copying the established pattern beats inventing a parallel one. -- **Check newer branches before resuming work**: A new session may resume on `main` with no checkout of relevant feature branches. Before extending a topic, run `git branch -a | grep ` and inspect the latest version with `git show :`. Session-local memory of "how X works" may be from an older draft that has since been replaced. -- **Clarity over Cleverness**: Choose clear, maintainable solutions -- **Conciseness**: Keep code and any wording concise and to the point. Sacrifice grammar for the sake of concision. -- **Reduce comments**: Avoid comments unless absolutely required to explain unusual or complex logic. Comments in jsdocs are acceptable. -- **Look for effect sources inside `repos/effect`** -- **Never import local `repos` files**: Always use the latest online versions of packages instead. -- **Never webfetch from the effect repos**: just use the locally included under `repos` - -### When you hit an error, before writing any fix - -Errors are signals, not nuisances. Run this checklist: - -1. **State the failure precisely.** Quote the exact error or behavior. `"object is not iterable"` is not the same as `"wrong type"`. The message names the violated invariant. -2. **Name the boundary.** Where in the data flow did the value lose the property the consumer needs? At the storage write, the storage read, the network hop, the schema decode, the context provision? -3. **Search for prior art at that boundary.** `grep` the repo + `repos/effect` for how similar values cross the same boundary. If a pattern exists, use it. -4. **Only then write code.** If your fix re-implements something the searched-for pattern already does (revive prototypes, retry on OCC, encode JSON), stop — use the existing pattern instead. - -Anti-patterns that mean you skipped the checklist: - -- `JSON.parse` of a value that contains tagged classes, followed by manual prototype reconstruction. -- `try/catch` around a yield that swallows the error and returns a fabricated value. -- Adding a second `as any` to make a first `as any` typecheck. -- Adding a sleep / retry to "give it time to work" instead of finding the missing wake signal. -- Disabling a hook (`--no-verify`) or a check to make the diff land. - -### Validation - -The ship gate owns validation — see _The gate runs the checks — you do not_. It -runs `pnpm check` → `pnpm lint` → `pnpm test` on every push and on publish, once -per commit. - -`pnpm lint-fix` is the one thing worth running by hand, because it _writes_: it -formats and auto-fixes across packages, and the gate only reports what it would -have fixed. Run it when you are done editing, stage what it changes, then push. - -If type checking fails in a way that makes no sense against the diff, `pnpm clean` -clears the caches — stale incremental state produces phantom errors. - - - - -## Code Style Guidelines - -**Always** look at existing code in the repository to learn and follow -established patterns before writing new code. - -Do not worry about getting code formatting perfect while writing. Use `pnpm lint-fix` -to automatically format code according to the project's style guidelines. - -## Prefer `Effect.fnUntraced` over functions that return `Effect.gen` - -Instead of writing: - -```ts -const fn = (param: string) => - Effect.gen(function*() { - // ... - }) -``` - -Prefer: - -```ts -const fn = Effect.fnUntraced(function*(param: string) { - // ... -}) -``` - -## Using `Context.Service` - -Prefer the class syntax when working with `Context.Service`. For example: - -```ts -import { Context } from "effect-app" - -class MyService extends Context.Service number -}>()("MyService") {} -``` - -## Checking Array is not empty - -Avoid `.length > 0` or `.length === 0` or `!.length` or `!!.length` checks, use `Array.isArrayNonEmpty` for type narrowing by default. - - - - - - - -## Per-request `Effect.provide(layer)` must isolate its MemoMap - -`Effect.provide(self, layer)` resolves its `MemoMap` from the ambient fiber -context. On an HTTP server, that MemoMap lives on the server fiber and is -shared by every request that server handles. The first request to build a -stateful layer (anything using `Layer.effect` / `Effect.acquireRelease`) -memoizes the resulting value onto the server fiber; every subsequent request -then receives the _same instance_ — including its `clear()` / dispose -finalizer, which now fires at the wrong time. - -When you call `Effect.provide(layer)` (or `Stream.provide(layer)`) inside a -per-request hot path: - -- Pass `{ local: true }` if the layer is pure / stateless or you genuinely - want it scoped to _this_ effect only, or -- Build it explicitly against the request scope with a fresh `MemoMap` - (`Layer.makeMemoMap` + `Layer.buildWithMemoMap(layer, memoMap, requestScope)`) - — see `provideOnRequestScope` in `packages/infra/src/setupRequest.ts`. - -If neither option is taken and the layer carries state, the state leaks -across requests. Concrete repro lives in -`packages/infra/test/rpc-context-map-streaming.test.ts` (the overlapping -requests case). - -## Changesets - -All pull requests must include a changeset. You can create changesets in the -`.changeset/` directory. - -The have the following format: - -```md ---- -"package-name": patch | minor | major ---- - -A description of the change. -``` diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 8359239d2..000000000 --- a/CLAUDE.md +++ /dev/null @@ -1,3 +0,0 @@ -# CLAUDE.md - -Strictly follow the rules in ./AGENTS.md diff --git a/repos/effect/LICENSE b/LICENSE similarity index 100% rename from repos/effect/LICENSE rename to LICENSE diff --git a/repos/effect/LLMS.md b/LLMS.md similarity index 100% rename from repos/effect/LLMS.md rename to LLMS.md diff --git a/repos/effect/MIGRATION.md b/MIGRATION.md similarity index 100% rename from repos/effect/MIGRATION.md rename to MIGRATION.md diff --git a/README.md b/README.md index 96d052283..93973efa2 100644 --- a/README.md +++ b/README.md @@ -1,131 +1,73 @@ -# Practical use of Effect-TS + -This is an opinionated library for full-stack [Effect-TS](https://github.com/Effect-TS/core). -(See repositories for more info and discord link, articles, youtube videos, etc). +[![pkg.pr.new](https://img.shields.io/badge/pkg.pr.new-Effect--TS%2Feffect-black)](https://pkg.pr.new/~/Effect-TS/effect) -WIP [docs](https://github.com/effect-ts-app/docs) +# Effect -See https://github.com/effect-ts-app/boilerplate for a sample app use. +Effect is a library for building robust, maintainable, type-safe, and production grade applications in TypeScript. It helps you handle the hard problems at scale: typed errors, dependency injection, structured concurrency, scheduling, tracing, and unified schema validation. -## Package boundaries +> **Effect V4 is currently a release candidate.** The `main` branch contains v4 development. -- `effect-app`: service contracts and runtime-agnostic base logic. -- `@effect-app/infra`: backend / Node adapters. -- `@effect-app/vue`: Vue / browser adapters. - -Migration targets introduced in this repo include: - -- `@effect-app/infra/Emailer/service` -> `effect-app/Emailer` -- `@effect-app/infra/QueueMaker/service` -> `effect-app/QueueMaker` -- `@effect-app/infra/Store/service` -> `effect-app/Store` -- `@effect-app/infra/Model/*` -> `effect-app/Model/*` -- `@effect-app/vue/runtime` -> `effect-app/runtime` -- `@effect-app/vue/toast` -> `effect-app/toast` -- `@effect-app/vue/withToast` -> `effect-app/withToast` - -## Update Effect Subtree - -`repos/effect` is a git subtree of `https://github.com/Effect-TS/effect-smol.git`. - -Recommended (uses the currently pinned `effect` / `@effect/*` version from package.json): - -```sh -pnpm subtree:effect -``` - -Or directly via the CLI: - -```sh -effa sync-effect -``` - -Use a different repository URL: - -```sh -effa sync-effect --url https://github.com/Effect-TS/effect-smol.git -``` - -Manual update to a specific ref: - -```sh -git subtree pull --prefix=repos/effect https://github.com/Effect-TS/effect-smol.git --squash -``` - -Example: - -```sh -git subtree pull --prefix=repos/effect https://github.com/Effect-TS/effect-smol.git @effect/ai-anthropic@4.0.0-beta.47 --squash -``` - -## Update Effect App Libs Subtree - -Apps that vendor this repository as `repos/libs` can sync it to the pinned -`effect-app` / `@effect-app/*` version in their package.json: - -```sh -effa sync-effect-app -``` - -The command first tries Changesets package tags such as -`effect-app@4.0.0-beta.271` or `@effect-app/infra@4.0.0-beta.271`. If no -matching tag exists, it fetches `https://github.com/effect-app/libs.git` into a -local git cache and selects the latest commit on the default branch whose -package manifest still has the pinned version. - -Escape hatch for manual refs: +## Install V4 RC ```sh -effa sync-effect-app --ref main -effa sync-effect-app --ref latest # latest main -``` - -Both `sync-effect` and `sync-effect-app` fetch selected commits with -`--no-tags`, so syncing subtrees does not import upstream package tags into the -app repository. - -The clean release convention is to publish git tags for package versions -(`effect-app@`, `@effect-app/infra@`, etc.) from the release -workflow. The history scan exists because this repo still has older `v*` tags -but not current package-version tags. - -## Deployment - -Uses [Changesets](https://github.com/changesets/changesets/blob/main/README.md) - -1. make changes -2. generate and include changeset `pnpm changeset` -3. wait for build which creates a PR -4. inspect the PR, merge when alright -5. await new build and new package deployments - -## Thanks - -- All contributors -- Michael Arnaldi, Max Brown and the Effect-TS contributors for Effect - - ZIO Contributors for the excellent ZIO -- Anyone else we're forgetting.. - -## How to view OmegaForm docs - -On Mac: - -1. `Shift + Command + P` -2. Select `Run Task` -3. Select `Run Storybook OmegaForm` -4. Will automatically open browser to http://localhost:6006/ Enjoy! - -On Windows: - -1. Select "Run Task" - -```bash -cd packages/vue-components -``` - -2. run storybook - -```bash -pnpm storybook +npm install effect@rc ``` -3. Will automatically open browser to http://localhost:6006/ Enjoy! +## Requirements + +- **TypeScript 5.9 or newer.** TypeScript 7 is recommended for the best performance and compatibility with [Effect's TypeScript tooling](https://github.com/Effect-TS/tsgo#installation). +- **Node.js 18 or newer** is the general minimum for running Effect on Node.js. Some integration packages require newer runtimes; for example, `@effect/sql-sqlite-node` requires Node.js 22.16 or newer. +- **Strict type-checking:** the `strict` flag must be enabled in your `tsconfig.json`. + +## Effect v3 + +The Effect v3 source code is available on the [`v3`](https://github.com/Effect-TS/effect/tree/v3) branch, which is also where issues and pull requests meant for Effect v3 should be targeted. + +## Packages + +This monorepo contains the core `effect` package alongside integration packages that extend it. All v4 packages are published under the `rc` tag on npm. + +| Package | Description | API Reference | +| --------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------ | +| [`effect`](packages/effect) | The core package | [docs](https://effect.website/docs/v4/api/effect) | +| [`@effect/platform-browser`](packages/platform/browser) | Platform services for the browser | [docs](https://effect.website/docs/v4/api/platform-browser) | +| [`@effect/platform-bun`](packages/platform/bun) | Platform services for [Bun](https://bun.sh) | [docs](https://effect.website/docs/v4/api/platform-bun) | +| [`@effect/platform-deno`](packages/platform/deno) | Platform services for [Deno](https://deno.com) | [docs](https://effect.website/docs/v4/api/platform-deno) | +| [`@effect/platform-node`](packages/platform/node) | Platform services for [Node.js](https://nodejs.org) | [docs](https://effect.website/docs/v4/api/platform-node) | +| [`@effect/platform-node-shared`](packages/platform/node-shared) | Shared services for Node.js-compatible runtimes | [docs](https://effect.website/docs/v4/api/platform-node-shared) | +| [`@effect/sql-clickhouse`](packages/sql/clickhouse) | SQL client for [ClickHouse](https://clickhouse.com) | [docs](https://effect.website/docs/v4/api/sql-clickhouse) | +| [`@effect/sql-d1`](packages/sql/d1) | SQL client for Cloudflare D1 | [docs](https://effect.website/docs/v4/api/sql-d1) | +| [`@effect/sql-libsql`](packages/sql/libsql) | SQL client for libSQL | [docs](https://effect.website/docs/v4/api/sql-libsql) | +| [`@effect/sql-mssql`](packages/sql/mssql) | SQL client for Microsoft SQL Server | [docs](https://effect.website/docs/v4/api/sql-mssql) | +| [`@effect/sql-mysql2`](packages/sql/mysql2) | SQL client for MySQL | [docs](https://effect.website/docs/v4/api/sql-mysql2) | +| [`@effect/sql-pg`](packages/sql/pg) | SQL client for PostgreSQL | [docs](https://effect.website/docs/v4/api/sql-pg) | +| [`@effect/sql-pglite`](packages/sql/pglite) | SQL client for [PGlite](https://pglite.dev) | [docs](https://effect.website/docs/v4/api/sql-pglite) | +| [`@effect/sql-sqlite-bun`](packages/sql/sqlite-bun) | SQL client for SQLite via `bun:sqlite` | [docs](https://effect.website/docs/v4/api/sql-sqlite-bun) | +| [`@effect/sql-sqlite-do`](packages/sql/sqlite-do) | SQL client for Cloudflare Durable Objects SQLite | [docs](https://effect.website/docs/v4/api/sql-sqlite-do) | +| [`@effect/sql-sqlite-node`](packages/sql/sqlite-node) | SQL client for SQLite via `node:sqlite` | [docs](https://effect.website/docs/v4/api/sql-sqlite-node) | +| [`@effect/sql-sqlite-react-native`](packages/sql/sqlite-react-native) | SQL client for SQLite in React Native | [docs](https://effect.website/docs/v4/api/sql-sqlite-react-native) | +| [`@effect/sql-sqlite-wasm`](packages/sql/sqlite-wasm) | SQL client for SQLite compiled to WebAssembly | [docs](https://effect.website/docs/v4/api/sql-sqlite-wasm) | +| [`@effect/ai-anthropic`](packages/ai/anthropic) | Anthropic provider for the Effect AI modules | [docs](https://effect.website/docs/v4/api/ai-anthropic) | +| [`@effect/ai-openai`](packages/ai/openai) | OpenAI provider for the Effect AI modules | [docs](https://effect.website/docs/v4/api/ai-openai) | +| [`@effect/ai-openai-compat`](packages/ai/openai-compat) | OpenAI-compatible API provider for the Effect AI modules | [docs](https://effect.website/docs/v4/api/ai-openai-compat) | +| [`@effect/ai-openrouter`](packages/ai/openrouter) | OpenRouter provider for the Effect AI modules | [docs](https://effect.website/docs/v4/api/ai-openrouter) | +| [`@effect/atom-react`](packages/atom/react) | React bindings for Effect Atom | [docs](https://effect.website/docs/v4/api/atom-react) | +| [`@effect/atom-solid`](packages/atom/solid) | SolidJS bindings for Effect Atom | [docs](https://effect.website/docs/v4/api/atom-solid) | +| [`@effect/atom-vue`](packages/atom/vue) | Vue bindings for Effect Atom | [docs](https://effect.website/docs/v4/api/atom-vue) | +| [`@effect/opentelemetry`](packages/opentelemetry) | [OpenTelemetry](https://opentelemetry.io) integration | [docs](https://effect.website/docs/v4/api/opentelemetry) | +| [`@effect/vitest`](packages/vitest) | Helpers for testing with [Vitest](https://vitest.dev) | [docs](https://effect.website/docs/v4/api/vitest) | +| [`@effect/docgen`](packages/tools/docgen) | Documentation generator for Effect projects | [docs](https://effect.website/docs/v4/api/docgen) | +| [`@effect/doctest`](packages/tools/doctest) | Runs JSDoc examples as Vitest tests | [docs](https://effect.website/docs/v4/api/doctest) | +| [`@effect/openapi-generator`](packages/tools/openapi-generator) | Generate Effect code from OpenAPI specifications | [docs](https://effect.website/docs/v4/api/openapi-generator) | + +## Resources + +- Documentation (https://effect.website) +- Discord (https://discord.gg/effect-ts) +- Effect v3 source (https://github.com/Effect-TS/effect/tree/v3) +- Effect v4 source (https://github.com/Effect-TS/effect/tree/main) + +## License + +MIT diff --git a/repos/effect/ai-docs/README.md b/ai-docs/README.md similarity index 100% rename from repos/effect/ai-docs/README.md rename to ai-docs/README.md diff --git a/repos/effect/ai-docs/package.json b/ai-docs/package.json similarity index 100% rename from repos/effect/ai-docs/package.json rename to ai-docs/package.json diff --git a/repos/effect/ai-docs/src/01_effect/01_basics/01_effect-gen.ts b/ai-docs/src/01_effect/01_basics/01_effect-gen.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/01_basics/01_effect-gen.ts rename to ai-docs/src/01_effect/01_basics/01_effect-gen.ts diff --git a/repos/effect/ai-docs/src/01_effect/01_basics/02_effect-fn.ts b/ai-docs/src/01_effect/01_basics/02_effect-fn.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/01_basics/02_effect-fn.ts rename to ai-docs/src/01_effect/01_basics/02_effect-fn.ts diff --git a/repos/effect/ai-docs/src/01_effect/01_basics/10_creating-effects.ts b/ai-docs/src/01_effect/01_basics/10_creating-effects.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/01_basics/10_creating-effects.ts rename to ai-docs/src/01_effect/01_basics/10_creating-effects.ts diff --git a/repos/effect/ai-docs/src/01_effect/01_basics/index.md b/ai-docs/src/01_effect/01_basics/index.md similarity index 100% rename from repos/effect/ai-docs/src/01_effect/01_basics/index.md rename to ai-docs/src/01_effect/01_basics/index.md diff --git a/repos/effect/ai-docs/src/01_effect/02_schema/10_schema-basics.ts b/ai-docs/src/01_effect/02_schema/10_schema-basics.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/02_schema/10_schema-basics.ts rename to ai-docs/src/01_effect/02_schema/10_schema-basics.ts diff --git a/repos/effect/ai-docs/src/01_effect/02_schema/index.md b/ai-docs/src/01_effect/02_schema/index.md similarity index 100% rename from repos/effect/ai-docs/src/01_effect/02_schema/index.md rename to ai-docs/src/01_effect/02_schema/index.md diff --git a/repos/effect/ai-docs/src/01_effect/03_services/01_service.ts b/ai-docs/src/01_effect/03_services/01_service.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/03_services/01_service.ts rename to ai-docs/src/01_effect/03_services/01_service.ts diff --git a/repos/effect/ai-docs/src/01_effect/03_services/10_reference.ts b/ai-docs/src/01_effect/03_services/10_reference.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/03_services/10_reference.ts rename to ai-docs/src/01_effect/03_services/10_reference.ts diff --git a/repos/effect/ai-docs/src/01_effect/03_services/20_layer-composition.ts b/ai-docs/src/01_effect/03_services/20_layer-composition.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/03_services/20_layer-composition.ts rename to ai-docs/src/01_effect/03_services/20_layer-composition.ts diff --git a/repos/effect/ai-docs/src/01_effect/03_services/20_layer-unwrap.ts b/ai-docs/src/01_effect/03_services/20_layer-unwrap.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/03_services/20_layer-unwrap.ts rename to ai-docs/src/01_effect/03_services/20_layer-unwrap.ts diff --git a/repos/effect/ai-docs/src/01_effect/03_services/index.md b/ai-docs/src/01_effect/03_services/index.md similarity index 100% rename from repos/effect/ai-docs/src/01_effect/03_services/index.md rename to ai-docs/src/01_effect/03_services/index.md diff --git a/repos/effect/ai-docs/src/01_effect/04_errors/01_error-handling.ts b/ai-docs/src/01_effect/04_errors/01_error-handling.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/04_errors/01_error-handling.ts rename to ai-docs/src/01_effect/04_errors/01_error-handling.ts diff --git a/repos/effect/ai-docs/src/01_effect/04_errors/10_catch-tags.ts b/ai-docs/src/01_effect/04_errors/10_catch-tags.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/04_errors/10_catch-tags.ts rename to ai-docs/src/01_effect/04_errors/10_catch-tags.ts diff --git a/repos/effect/ai-docs/src/01_effect/04_errors/20_reason-errors.ts b/ai-docs/src/01_effect/04_errors/20_reason-errors.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/04_errors/20_reason-errors.ts rename to ai-docs/src/01_effect/04_errors/20_reason-errors.ts diff --git a/repos/effect/ai-docs/src/01_effect/04_errors/index.md b/ai-docs/src/01_effect/04_errors/index.md similarity index 100% rename from repos/effect/ai-docs/src/01_effect/04_errors/index.md rename to ai-docs/src/01_effect/04_errors/index.md diff --git a/repos/effect/ai-docs/src/01_effect/05_resources/10_acquire-release.ts b/ai-docs/src/01_effect/05_resources/10_acquire-release.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/05_resources/10_acquire-release.ts rename to ai-docs/src/01_effect/05_resources/10_acquire-release.ts diff --git a/repos/effect/ai-docs/src/01_effect/05_resources/20_layer-side-effects.ts b/ai-docs/src/01_effect/05_resources/20_layer-side-effects.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/05_resources/20_layer-side-effects.ts rename to ai-docs/src/01_effect/05_resources/20_layer-side-effects.ts diff --git a/repos/effect/ai-docs/src/01_effect/05_resources/30_layer-map.ts b/ai-docs/src/01_effect/05_resources/30_layer-map.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/05_resources/30_layer-map.ts rename to ai-docs/src/01_effect/05_resources/30_layer-map.ts diff --git a/repos/effect/ai-docs/src/01_effect/05_resources/index.md b/ai-docs/src/01_effect/05_resources/index.md similarity index 100% rename from repos/effect/ai-docs/src/01_effect/05_resources/index.md rename to ai-docs/src/01_effect/05_resources/index.md diff --git a/repos/effect/ai-docs/src/01_effect/06_running/10_run-main.ts b/ai-docs/src/01_effect/06_running/10_run-main.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/06_running/10_run-main.ts rename to ai-docs/src/01_effect/06_running/10_run-main.ts diff --git a/repos/effect/ai-docs/src/01_effect/06_running/20_layer-launch.ts b/ai-docs/src/01_effect/06_running/20_layer-launch.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/06_running/20_layer-launch.ts rename to ai-docs/src/01_effect/06_running/20_layer-launch.ts diff --git a/repos/effect/ai-docs/src/01_effect/06_running/index.md b/ai-docs/src/01_effect/06_running/index.md similarity index 100% rename from repos/effect/ai-docs/src/01_effect/06_running/index.md rename to ai-docs/src/01_effect/06_running/index.md diff --git a/repos/effect/ai-docs/src/01_effect/07_pubsub/10_pubsub.ts b/ai-docs/src/01_effect/07_pubsub/10_pubsub.ts similarity index 100% rename from repos/effect/ai-docs/src/01_effect/07_pubsub/10_pubsub.ts rename to ai-docs/src/01_effect/07_pubsub/10_pubsub.ts diff --git a/repos/effect/ai-docs/src/01_effect/07_pubsub/index.md b/ai-docs/src/01_effect/07_pubsub/index.md similarity index 100% rename from repos/effect/ai-docs/src/01_effect/07_pubsub/index.md rename to ai-docs/src/01_effect/07_pubsub/index.md diff --git a/repos/effect/ai-docs/src/03_stream/10_creating-streams.ts b/ai-docs/src/03_stream/10_creating-streams.ts similarity index 100% rename from repos/effect/ai-docs/src/03_stream/10_creating-streams.ts rename to ai-docs/src/03_stream/10_creating-streams.ts diff --git a/repos/effect/ai-docs/src/03_stream/20_consuming-streams.ts b/ai-docs/src/03_stream/20_consuming-streams.ts similarity index 100% rename from repos/effect/ai-docs/src/03_stream/20_consuming-streams.ts rename to ai-docs/src/03_stream/20_consuming-streams.ts diff --git a/repos/effect/ai-docs/src/03_stream/30_encoding.ts b/ai-docs/src/03_stream/30_encoding.ts similarity index 100% rename from repos/effect/ai-docs/src/03_stream/30_encoding.ts rename to ai-docs/src/03_stream/30_encoding.ts diff --git a/repos/effect/ai-docs/src/03_stream/index.md b/ai-docs/src/03_stream/index.md similarity index 100% rename from repos/effect/ai-docs/src/03_stream/index.md rename to ai-docs/src/03_stream/index.md diff --git a/repos/effect/ai-docs/src/04_integration/10_managed-runtime.ts b/ai-docs/src/04_integration/10_managed-runtime.ts similarity index 100% rename from repos/effect/ai-docs/src/04_integration/10_managed-runtime.ts rename to ai-docs/src/04_integration/10_managed-runtime.ts diff --git a/repos/effect/ai-docs/src/04_integration/index.md b/ai-docs/src/04_integration/index.md similarity index 100% rename from repos/effect/ai-docs/src/04_integration/index.md rename to ai-docs/src/04_integration/index.md diff --git a/repos/effect/ai-docs/src/05_batching/10_request-resolver.ts b/ai-docs/src/05_batching/10_request-resolver.ts similarity index 100% rename from repos/effect/ai-docs/src/05_batching/10_request-resolver.ts rename to ai-docs/src/05_batching/10_request-resolver.ts diff --git a/repos/effect/ai-docs/src/05_batching/index.md b/ai-docs/src/05_batching/index.md similarity index 100% rename from repos/effect/ai-docs/src/05_batching/index.md rename to ai-docs/src/05_batching/index.md diff --git a/repos/effect/ai-docs/src/06_schedule/10_schedules.ts b/ai-docs/src/06_schedule/10_schedules.ts similarity index 100% rename from repos/effect/ai-docs/src/06_schedule/10_schedules.ts rename to ai-docs/src/06_schedule/10_schedules.ts diff --git a/repos/effect/ai-docs/src/06_schedule/index.md b/ai-docs/src/06_schedule/index.md similarity index 100% rename from repos/effect/ai-docs/src/06_schedule/index.md rename to ai-docs/src/06_schedule/index.md diff --git a/repos/effect/ai-docs/src/07_datetime/10_creating-and-formatting.ts b/ai-docs/src/07_datetime/10_creating-and-formatting.ts similarity index 100% rename from repos/effect/ai-docs/src/07_datetime/10_creating-and-formatting.ts rename to ai-docs/src/07_datetime/10_creating-and-formatting.ts diff --git a/repos/effect/ai-docs/src/07_datetime/20_time-zones.ts b/ai-docs/src/07_datetime/20_time-zones.ts similarity index 100% rename from repos/effect/ai-docs/src/07_datetime/20_time-zones.ts rename to ai-docs/src/07_datetime/20_time-zones.ts diff --git a/repos/effect/ai-docs/src/07_datetime/index.md b/ai-docs/src/07_datetime/index.md similarity index 100% rename from repos/effect/ai-docs/src/07_datetime/index.md rename to ai-docs/src/07_datetime/index.md diff --git a/repos/effect/ai-docs/src/08_observability/10_logging.ts b/ai-docs/src/08_observability/10_logging.ts similarity index 100% rename from repos/effect/ai-docs/src/08_observability/10_logging.ts rename to ai-docs/src/08_observability/10_logging.ts diff --git a/repos/effect/ai-docs/src/08_observability/20_otlp-tracing.ts b/ai-docs/src/08_observability/20_otlp-tracing.ts similarity index 100% rename from repos/effect/ai-docs/src/08_observability/20_otlp-tracing.ts rename to ai-docs/src/08_observability/20_otlp-tracing.ts diff --git a/repos/effect/ai-docs/src/08_observability/index.md b/ai-docs/src/08_observability/index.md similarity index 100% rename from repos/effect/ai-docs/src/08_observability/index.md rename to ai-docs/src/08_observability/index.md diff --git a/repos/effect/ai-docs/src/09_testing/10_effect-tests.ts b/ai-docs/src/09_testing/10_effect-tests.ts similarity index 100% rename from repos/effect/ai-docs/src/09_testing/10_effect-tests.ts rename to ai-docs/src/09_testing/10_effect-tests.ts diff --git a/repos/effect/ai-docs/src/09_testing/20_layer-tests.ts b/ai-docs/src/09_testing/20_layer-tests.ts similarity index 100% rename from repos/effect/ai-docs/src/09_testing/20_layer-tests.ts rename to ai-docs/src/09_testing/20_layer-tests.ts diff --git a/repos/effect/ai-docs/src/09_testing/index.md b/ai-docs/src/09_testing/index.md similarity index 100% rename from repos/effect/ai-docs/src/09_testing/index.md rename to ai-docs/src/09_testing/index.md diff --git a/repos/effect/ai-docs/src/10_predicate/01_basics.ts b/ai-docs/src/10_predicate/01_basics.ts similarity index 100% rename from repos/effect/ai-docs/src/10_predicate/01_basics.ts rename to ai-docs/src/10_predicate/01_basics.ts diff --git a/repos/effect/ai-docs/src/10_predicate/index.md b/ai-docs/src/10_predicate/index.md similarity index 100% rename from repos/effect/ai-docs/src/10_predicate/index.md rename to ai-docs/src/10_predicate/index.md diff --git a/repos/effect/ai-docs/src/40_sql/10_basics.ts b/ai-docs/src/40_sql/10_basics.ts similarity index 100% rename from repos/effect/ai-docs/src/40_sql/10_basics.ts rename to ai-docs/src/40_sql/10_basics.ts diff --git a/repos/effect/ai-docs/src/40_sql/index.md b/ai-docs/src/40_sql/index.md similarity index 100% rename from repos/effect/ai-docs/src/40_sql/index.md rename to ai-docs/src/40_sql/index.md diff --git a/repos/effect/ai-docs/src/50_http-client/10_basics.ts b/ai-docs/src/50_http-client/10_basics.ts similarity index 100% rename from repos/effect/ai-docs/src/50_http-client/10_basics.ts rename to ai-docs/src/50_http-client/10_basics.ts diff --git a/repos/effect/ai-docs/src/50_http-client/index.md b/ai-docs/src/50_http-client/index.md similarity index 100% rename from repos/effect/ai-docs/src/50_http-client/index.md rename to ai-docs/src/50_http-client/index.md diff --git a/repos/effect/ai-docs/src/51_http-server/10_basics.ts b/ai-docs/src/51_http-server/10_basics.ts similarity index 100% rename from repos/effect/ai-docs/src/51_http-server/10_basics.ts rename to ai-docs/src/51_http-server/10_basics.ts diff --git a/repos/effect/ai-docs/src/51_http-server/20_testing.ts b/ai-docs/src/51_http-server/20_testing.ts similarity index 100% rename from repos/effect/ai-docs/src/51_http-server/20_testing.ts rename to ai-docs/src/51_http-server/20_testing.ts diff --git a/repos/effect/ai-docs/src/51_http-server/fixtures/api/Api.ts b/ai-docs/src/51_http-server/fixtures/api/Api.ts similarity index 100% rename from repos/effect/ai-docs/src/51_http-server/fixtures/api/Api.ts rename to ai-docs/src/51_http-server/fixtures/api/Api.ts diff --git a/repos/effect/ai-docs/src/51_http-server/fixtures/api/Authorization.ts b/ai-docs/src/51_http-server/fixtures/api/Authorization.ts similarity index 100% rename from repos/effect/ai-docs/src/51_http-server/fixtures/api/Authorization.ts rename to ai-docs/src/51_http-server/fixtures/api/Authorization.ts diff --git a/repos/effect/ai-docs/src/51_http-server/fixtures/api/System.ts b/ai-docs/src/51_http-server/fixtures/api/System.ts similarity index 100% rename from repos/effect/ai-docs/src/51_http-server/fixtures/api/System.ts rename to ai-docs/src/51_http-server/fixtures/api/System.ts diff --git a/repos/effect/ai-docs/src/51_http-server/fixtures/api/Users.ts b/ai-docs/src/51_http-server/fixtures/api/Users.ts similarity index 100% rename from repos/effect/ai-docs/src/51_http-server/fixtures/api/Users.ts rename to ai-docs/src/51_http-server/fixtures/api/Users.ts diff --git a/repos/effect/ai-docs/src/51_http-server/fixtures/domain/User.ts b/ai-docs/src/51_http-server/fixtures/domain/User.ts similarity index 100% rename from repos/effect/ai-docs/src/51_http-server/fixtures/domain/User.ts rename to ai-docs/src/51_http-server/fixtures/domain/User.ts diff --git a/repos/effect/ai-docs/src/51_http-server/fixtures/domain/UserErrors.ts b/ai-docs/src/51_http-server/fixtures/domain/UserErrors.ts similarity index 100% rename from repos/effect/ai-docs/src/51_http-server/fixtures/domain/UserErrors.ts rename to ai-docs/src/51_http-server/fixtures/domain/UserErrors.ts diff --git a/repos/effect/ai-docs/src/51_http-server/fixtures/server/Authorization.ts b/ai-docs/src/51_http-server/fixtures/server/Authorization.ts similarity index 100% rename from repos/effect/ai-docs/src/51_http-server/fixtures/server/Authorization.ts rename to ai-docs/src/51_http-server/fixtures/server/Authorization.ts diff --git a/repos/effect/ai-docs/src/51_http-server/fixtures/server/Users.ts b/ai-docs/src/51_http-server/fixtures/server/Users.ts similarity index 100% rename from repos/effect/ai-docs/src/51_http-server/fixtures/server/Users.ts rename to ai-docs/src/51_http-server/fixtures/server/Users.ts diff --git a/repos/effect/ai-docs/src/51_http-server/fixtures/server/Users/http.ts b/ai-docs/src/51_http-server/fixtures/server/Users/http.ts similarity index 100% rename from repos/effect/ai-docs/src/51_http-server/fixtures/server/Users/http.ts rename to ai-docs/src/51_http-server/fixtures/server/Users/http.ts diff --git a/repos/effect/ai-docs/src/51_http-server/index.md b/ai-docs/src/51_http-server/index.md similarity index 100% rename from repos/effect/ai-docs/src/51_http-server/index.md rename to ai-docs/src/51_http-server/index.md diff --git a/repos/effect/ai-docs/src/60_child-process/10_working-with-child-processes.ts b/ai-docs/src/60_child-process/10_working-with-child-processes.ts similarity index 100% rename from repos/effect/ai-docs/src/60_child-process/10_working-with-child-processes.ts rename to ai-docs/src/60_child-process/10_working-with-child-processes.ts diff --git a/repos/effect/ai-docs/src/60_child-process/index.md b/ai-docs/src/60_child-process/index.md similarity index 100% rename from repos/effect/ai-docs/src/60_child-process/index.md rename to ai-docs/src/60_child-process/index.md diff --git a/repos/effect/ai-docs/src/70_cli/10_basics.ts b/ai-docs/src/70_cli/10_basics.ts similarity index 100% rename from repos/effect/ai-docs/src/70_cli/10_basics.ts rename to ai-docs/src/70_cli/10_basics.ts diff --git a/repos/effect/ai-docs/src/70_cli/index.md b/ai-docs/src/70_cli/index.md similarity index 100% rename from repos/effect/ai-docs/src/70_cli/index.md rename to ai-docs/src/70_cli/index.md diff --git a/repos/effect/ai-docs/src/71_ai/10_language-model.ts b/ai-docs/src/71_ai/10_language-model.ts similarity index 100% rename from repos/effect/ai-docs/src/71_ai/10_language-model.ts rename to ai-docs/src/71_ai/10_language-model.ts diff --git a/repos/effect/ai-docs/src/71_ai/20_tools.ts b/ai-docs/src/71_ai/20_tools.ts similarity index 100% rename from repos/effect/ai-docs/src/71_ai/20_tools.ts rename to ai-docs/src/71_ai/20_tools.ts diff --git a/repos/effect/ai-docs/src/71_ai/30_chat.ts b/ai-docs/src/71_ai/30_chat.ts similarity index 100% rename from repos/effect/ai-docs/src/71_ai/30_chat.ts rename to ai-docs/src/71_ai/30_chat.ts diff --git a/repos/effect/ai-docs/src/71_ai/fixtures/domain/LaunchPlan.ts b/ai-docs/src/71_ai/fixtures/domain/LaunchPlan.ts similarity index 100% rename from repos/effect/ai-docs/src/71_ai/fixtures/domain/LaunchPlan.ts rename to ai-docs/src/71_ai/fixtures/domain/LaunchPlan.ts diff --git a/repos/effect/ai-docs/src/71_ai/index.md b/ai-docs/src/71_ai/index.md similarity index 100% rename from repos/effect/ai-docs/src/71_ai/index.md rename to ai-docs/src/71_ai/index.md diff --git a/repos/effect/ai-docs/src/80_cluster/10_entities.ts b/ai-docs/src/80_cluster/10_entities.ts similarity index 100% rename from repos/effect/ai-docs/src/80_cluster/10_entities.ts rename to ai-docs/src/80_cluster/10_entities.ts diff --git a/repos/effect/ai-docs/src/80_cluster/index.md b/ai-docs/src/80_cluster/index.md similarity index 100% rename from repos/effect/ai-docs/src/80_cluster/index.md rename to ai-docs/src/80_cluster/index.md diff --git a/repos/effect/ai-docs/src/index.md b/ai-docs/src/index.md similarity index 100% rename from repos/effect/ai-docs/src/index.md rename to ai-docs/src/index.md diff --git a/repos/effect/ai-docs/tsconfig.json b/ai-docs/tsconfig.json similarity index 100% rename from repos/effect/ai-docs/tsconfig.json rename to ai-docs/tsconfig.json diff --git a/assets/dev/effect-app-apple-touch-180.png b/assets/dev/effect-app-apple-touch-180.png deleted file mode 100644 index 906d1621a05e8b5d53409bf02c9dd50b315b4681..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11603 zcmYkicQl*t|37ZV3c8Hg9cmL|)GB?^s#TQQBZ^Rp5_=^ms#di|lp3}7-a=42R_(ni z_TKv&@6Y+2^E)}oegAQt=kxJg*L~f2JVG_!C{a@~Q4$akP%FPye2c$U+ARyo%P*!}Q%UGIf=6B8fG;G?$lo021A_@CiDTC=AIM`sjFU@Jh)sWZI>)1gyAl->MiKU5sSM|z`@B3y{oUdTq(9wTc(UY~>W(-;U;SJAw65Pjb3YCaCK^f$NY;vs%CzQo)q6?(3Yr9jHh-U3 zQ}_(JyZMzuUPDj78}s5;=Ba`3X~?V zbLObcnbMQv8SgD`hw0tEH$R_HlX=~J@4|MnF5TuTq^a_YN@O;Vkz8}b`2#(cz^zU3 z4nDeuBtQ$xdXO!F%aS=DZTS6TBH3Rfn_iqB`}wV*VB+&`4tWi0TJn0NQOw3{jos0x zwBx@do24-mCcxqEAErevE^&fdE$=Wazw-D#>KHBpK z8icLba@@KE$dr_Ie;~l$hGkc$b5&_TsZ|=KN7qizD)TiqvIyV0r!ugjb1SFb#@BZ0 z-A!QIreN+M%O3>=jM$)p!2bs1CCFg@;Nb0oS8ihTuxJn9ukINR6lvPk|z`)f$#&o%@w6)y2k=MDm2yUPG9-D;qZS$xl*vUeeR%qzaQATNx~m_fHad zmTc&p3aUu4aZDDr`88~1=0`QjzepMKP{oi!UOUv{$_r z626SloL51f6^)!ZeR{Q^8CK>z4o!g42fHX%6Pke|dcEYTDEUGT!k7vqUv*3_`H-fS z|D1+}4P}5a#u)3N0t*9K!$bO0;AYIk-~5QLs<{f}+0C z2Ww+kD!CG>&%nf~F+QsSlJ3dM!5K(Xm%}VwEn{trnu&Q|nXHvYMG_INLcO$MJ;a*b zLqYXFWu{d@ZC|Z#2De@x)4_y#lD>-_|NZ>?*??Ey1iB1aOAdMU4C|$^ccjtV*mQ4% zp197+dn5bq@lHw$5zfC^EhCf?6#^`eTNA4j{AvqCnto=SB`&`qMz3l-HOg!`J)D+-@9NV+#pX;2__i|SGxgKnXO8n=?e z6$N)CfXL#cl19?Z=Z1J|?=VSel?brXR?mnQ846tpzvPi2PW{J}jg)?9W=;qvgg+YV z^ap+0gXJEf2}X;HqI3Birkr0Du795aoPk$(HmG3v@7F2A5^~e@$hBXdu)}U%LZnKy z4zP+pU(29%8}P%q*<|ySHsV#Y@&4?1On&+t*m^3l(kgy)2;mwbV^8o*%u}x%Ix6SA zRsd*bacsjiC-G)0gSk$`sBq_=xR2fkRko1_4g{_v(h@t?!?uY$vqY06U<=eN5mSRr z))b=Jky(G+w2{P6cAC5j5AB#9;9jut0YsH6jDpG5efE^@{afiTDV zUd^I<4pkFE`1COmF8toB2Uw0AaaGMBN))6Uv<2omY&tUseER_S>eNaEFKWKcd0+s@ z-zoS@c#rP?YNypg9t4taen!lgs5>r?;_RQl9mnR@P5Vel&XPL;73%)+18~Qo1S1St zriEdtMk6KDKMxW@IA*<8iEu0%cy#x%1ns-cN&I!lTBIZoaUcl84ecvyM0$$00CP{A zMTv2bu-s4wAodRN?UDqYiwx&OW?Y6S8?2fA0X_J>SOZd0se?QOg!#g%d)raj_=4PK zOGC;Y3=U*)egL-K;ej4ky`sRoGNQ)uPiY@3_V7U8OvMbyy@dh>4+d^ya|ECs-czuK zdEdV+7gDm)v7!|i`k}rWfHiN&gJn&B0OLri;)4o8*|u)&Hi$uKsD+??gTmeBfIXOG zz}&5wbOzW%CItrY4};>*TM5hIQ2azLuY3H!0H5RCSdQ|Ud&4C0g9LyP^awIb)|U-i zGfI%7!m5!lWo;9rj<6HKk;eT=_Kvf<$+Epj z5J~>zvLyqDCtyqnYjbQQf5qDCM`e>*-Q`Glr2X@fet@H}K3#f0e-ErMd!J7oS!yS)%4C_Tg75QyNf-nEop5nqTG z7Xim@{)qe*Ae0V#LR$W>T4Pt+Djs5qGEp=piFZf*lYf3Z;`s%$%_=*MXf=%42oTZa z#=N}Pd@bo3XdtqGy2kt1u?&U7@FVdPtsPlI@R_~7Cr~m-3)enx?)D7#Z_RjrOF@fG zn&EP$*<~|t|Bnf?Ox6Qla`}cIcAa2VoUY*$Cn@VOxyF29u!3mt8+siK3xk$?0ZbF7(SkZ2p!q%mN)1YVx0K9kPO5u$v|8ZCkI^2ak_K>$D#u7{7Wdsilgv z|Euk&P9vcfySCDATi-Z*1~ODAUj0e}-jTCr(YuofpRH(M+ z^}^Wr(W{VSY&W?frtIh^DBCbh!n_!))KF2=&~WbhM++OiwwqemQ4rRR33JvT`vuwUu?NbH5EKDs$vf*?tzGB)3D zpC)T_?zhHomee-V`j2J1pM4FEF}hMGt415YU3SeU=sB1Q{Je1biQWjI!f60Ej!i_l zwV>gg5A%6~Od~_29oF{UoTWdPuIRZKF@woPLuH3E?@oP zd*Qj_TgvS9;``k+EsI|N2Y#`s0M?qs%S8$&zu(L`ZiV$oY@HPgCG7~exFIdv^o9nF zhCVIA6m8KI7jC@2>ZZ|^Lx&xARF_-p(NYro{(9hui5dI^0$)G?l!NhFhx{$-O~zl% zTM`)h)Z>USWP(Yd+^0wGlfrjmM9}B;3$c%~1ZdzJjEOx>2of?u#uNiTN0F;kC!cd^ zrM;oz=Px_9*?@ORm^r_%OWtc*GUDAgyNRD|T*|Uy%=)x%)=S0sjzFb)B9uLmlydvL zUyNgZ5wMj^L#puWC;)_!@tcgN&&(guM^VcKzws!rdHwL&muH)D*|AZ^;(-S@FhQjh znS=zY4zQDLsB^x*IZsSli7H@;D}Ed?%Shun_B?4fZA~pncj1V7W^-a9Gfa=Nb+k9J zK_o+ZxSVTo@rbV3>g@Z`xNbt#W3CRF3U;%8Ia{K_rH{$J9{CK~e88z;uY3nZqX#gC ze9PThga>m7yBz0X`_vO0X1nGnI86WwO-d!{`*=BnR4Y(W#_{`R$Ve07b%3E zR})Tg3!jv9O+J-71Y?mO7*KKQ$uO`NIsd&q!pcH1KWltEF|}1a$^kD#VdBw zbPLyBr2V%M8`I`w)W-GtFlB#ZV}JAeQA{DFz0#XEgj)(G4g#f@3j)Y}!RC40*5xuS z6t#BEsUyu&&5!Jk1y+uMM_|u$#;59z%e5gA=>?y#caEw-=-5?0-w4X}VjrQcfB=S+ zsW0|13EtzDvd<3v#R)P|zN;kN0^&k4rENlefs@tEI|ms+{M**S=?6382T#SguwVfb z9%>gBSX%ob$l|m`u5V@6eLGNO$h1T#^~(Nk8{t6*q+cIW@>%N_AtvJot6zAQmMlWzW!3K;~J#617z3SS{>nC@Hqf z#EmaJD%1+c4oOhwJ1JR-5KQ`c3Q^-RO0O=zQgwKS(N1pto84NjQP?V|r|&WR@4)~O zR?_ED=2!KLp<@3>EKfqstV7BLe|CUUekKxma?6Kd{0~l=b9qfY7sQhCHdr@|l3gEh zU5G4dU0KBLyYa=`Gc~RvoZ_|1QE!=`RoF6bO9&2YUa$gBS<5ylSha;@V9wowV?ha2Tu?o=WW+~^$52E^(z9Qx z*Q52BGaRWe=ToaS7AhlHKbqD*=6-Td(`r<5)_azRy*4AL`mAzBh<^rYAD3`b#lvLV zO2vadXCJ7d#XBA;v-cxJ(>ypR=;~(p=y~&5UV;Kfu0SKZ?*7Rngx2KQkJhLuF4B*( z{`3sI7WT$^`ZtSiTk0__DL+*uVyXq6lPm_Y-w9JDjgu{nEHg1*5Y~PxUr&RzIRL0= zG6kN9SkN)a-tiR9&}vK1V|dGCzJmN5nvr+*k$ z0K}MAL|b)W&vr&#nX{jMHt)Wh^4Wf901>4udakFcHVingS#0FS@bb&JsZiRC1%aqe z%$q(~oUH~O*nlj8zKP$lxvLrcdkeMJ&~Pc{X1}w``(ul92;4EnNiG*~H#C> z%>Q%w_?YyriTfa8vE{IqX+1uJqnrlD z)u7CT6>kA?h5F?m^Mi+sZst!knP5$(P8x-mS6`7;nNeQCN77jt$aa5Hc)K=lqSI?; zUzFmF9cCO1IR`I^Ft!grcYXMcK$YD-0FNr0FkmE|5`IX?%SD2CqMbC8dXBt*2t|UM8jb{-H2)bE;r1_B1^n=c}ly7!Ze31~dD+F#6N`$CYx@=z~MwY1n6F8%CI< zeLspiG2NGnJsg(mJ=_i#L^umny@MS;)W)0)|NeByYj~VkNgHQh?$$P%+S%a$K4T4H ze=rmtvqv2)X)Km~Bkemn4qW>A_(xXMi$85gDX%Fucc@@yzmwI6tfA)I%nAwNd{Gwd ze<&E=y-HG(v$>b;w{4>~HGK83Xw3J&Iq=2Ve;S3wIsg>|#_kp!@vO4iBL)qp9mh%6 z*Y`m#r$$O>YnmOIr8|d{tf8x+Q-kcNhi4J7fY!~WO$C8P5lJ|(Eg`J!9&blu3p^dA({wz*0Dh|6d`|o8=|1Z54^HAe1{4K zVsR>E4Rj7m=$m^|YQ(?!HOOjwGXH&QOrz^}aMDK+M$$Yz0eRSDZ;1ySxCY z6c_4#t^Vb5C)j-N(3ekGbFbM}&Yb?yPKbjHw#(NcGP;-UZm37LzXxvD!}&OZKKC7~ z&}M)K)gc4yOAtFZ&}w~`N;Tz4_b%JBFRCt~w!N;eWv%51P%ldISVsUMpg~zCHdPWO zTNiiTwQZLY75dhPBYnKGzhrBITXYsZvpdPX<-uVq(JaQf`}rwCnSb-1EubGysaDHX z`ja{MP*!JwWA9hI(4CKtE8t9>U9w;NJ7h4zW|-%*`}^^;?cv&C+k5q5#jKPv@Ht+# zdOOLiGR;-4=y!45K%?I}Oud1UT9NS$S4Vv^`OJdeRqoMwdaN?#1S8vQMK=rD{NB#+ zD_~K1!{sz=`?BrvaNeHQ1_p2H>`nbD`RrAiXRRB*CzLa4`fR21E-@A4_lH-y?ZK@q zSV~O0-mxX)42$R0$c$5zF&FCUcx`pfQgy|_IPor5apS&J_4Ve9I_dfbk9Q|s1JFq0 z(7Tw0iZGhxKT*A^z5EyZf6)1-LjoE^!R}U!GT3jz_G2EX);Y>H)vbCFpkw4m<4RVF zr#>505X_mGT;xeg6LON|)6l|FN!LcAoAZzuZ5e#U0cZtHwV1ZyFR+>iD~(m9xa~DJ zoFtvqF3TQu#7-j)?$7F^G&ZLy7FYKDO}vinvlgYpy)J9|Yk!tfJuvjcgR-9D?UtLz zSx{lLvP3XJd9uM6mH1(KNJ`E6>o+$Q+iF?^Ba{xwiMGEt$E)IRuCG%(?58$RD*fBs zJI$EYA<4iHgJOHRqkyx9o9VMJ_o!_aWjq(R-(Bvtcc9l~sY*1j(}n(wjpF;|Tc?EX zPa?R7dzZv@!wGPPHoaf6U|aVe}}~@ zt&)y?>)H?{DL1!+L_0Rip5Q`4Y%tkdkL>%w0C)tg>9dp*-%F0etKrwoUhdNDO?GsM zngwBvrb1cKED8JZlq2^uwrM2H3r4}z7c!~&^kk-vrlVJ+On6aBP~&F7s+f>E#?FEq{Jiu0gG1Hd$);J@oI4!P3|q;+x*&m<7}u5$6v1Lyq$; z&%6PrT;~SigAe3rh4A?+?dZ47G;LGkE?=tnHUpu+j(XgK>j~TU&@!(PdbT<{-{7=} z=**Mi<&nxn;TTX$0bnfw?LJuhc4<>c2pa^NpPj2XC`KTp<*q}N*0zh5arxE5UMvo$ z%?btjRRHbS_i4fY26`wB$vG;>`@PKT{>RnDi;*`rEZA>H5p+yckS{05yyNie!oNlc z^!LhqcNn9w*+iKeSJdp~Z;3rez@7!}J&F)>S=z(kJeqk1o}i2*>m;(V{#1 zi~X3!K3u-*at%sE>_6#YGg@mda8%t8n?DLXtDs_V?&iXUT-?82Xg1Pyni68Bf>^3e ziLt=srtkRHO2h!XIwH}R7w++;2S-J~){V!k^>sBH=hhSD)sMfhKCHvYy?$I_H53f@+TQqaJt7Zlqtfi^cS|yA~ff-dyraSC6r; z&rC_5T{Q_>^|X&Q^oc!o2P{!ba-f8aIt@~~Le93$st)Gle1NL4!m$yV-TE=YI-ygJ z#x2xxzEzEM5uLsg4H(}hv&9j;5T=LNg&~O#AOdWPF&;&RIsHxwnS){5PO%*g_D({T z9WVA&l_p}ovB}gyfAK7H<1D*ardw5LyECVA-f~G*`n0W@&Ac~^S(w{%cH*lC&qMui z2m$J5{eVjH;JXiM=hRa=tmyz8$7{~yHlIdK>!2N5vvAH;vr?VEuB&Ipc78?aV0MYh z?mvc#KLW1^W$g%I*=70z4JZaLhW&C+W^2AC`i;t<2(cE~etueT^SDkUd9-`cnS?|G zk=yoU4}{jfxeN&FOF_O90aRj|bm`d8_S6z47ov_IrHqjq{*+_uh_d1YP}@F!QS0>^j;+%qzmMDf;oG*Q#v# zJqX_u4OAA5ql<64`72iFwFh%{5?Wp;8T{lU*?pjb)1129X>XIvU!7Z=S$LcSDzy{q zWRQ6Q-V;+&oZObYk4kZVeWG=;et%hrX}VQ-?{I>}Tj&bm%*;Z`zeegyoOl23s)>;1 zmYXn-7VkSSkU2N^kCi(TjL3?B$cYIZd|694pEr2SvKqA8>U+s`FIo%c zujkNMN5px?^XQ-C5c2i1)_4_&IRH%qO3g0MI|$t<DM?ah0siVxC@r(2nex0-c04UIZ} z$0%10g&N-tCO??4Pr8iugx>f2*-B7~5uJ}}GHL4_6KV#3wEg9vZ4S_kXFU%8XPqyH z4bZe5%y-38&ZdO-e1`rYB8vFLjPss3^cn@|w<4NrJsh{f^QgB^J;R2nv7gk7M6~o{ zIx14ZIc~aSWCv~bNlwiT;}W{R<>yLker;Uy(3JbX%&epfdf{%Zk->Zv#$>|6lIw+- z*_7}lLR|bffxw&p5E7!-GFg3YR1uavSzFC&Dw&ld#C5Mspx64$I~OHIP3Cu#{wz*- z?Cj_|wQ8`Z|COTGo;Y-oQV#;%8*=MKN}7h7Q9JVXC#HzUgt~t=LJ$xDFK@K~=K72= z;CG;&oX?27fDbXHX#1X=Rr~bt+)EiN{&W^B|LPjA94yNWY&UfEqhleRp~~sp6AdIl zL{pdVXOlhF`@G93HY+1TpH&8a7g|`n{coL*9oiE-Q(O0a|2*IOG`?8&PM|>u<5NK3 z9(G}t02fuU*I15gYkfFi9)dwPjetXl2XJ06v+&K2y`Lpx=FL^DQvU#%I&`YYa)Kw` z3g}nZq{gPq-V2<__}5!IX?~e=X|C@G_P$nbd1t{ci6G2I{ANHgRKsW7*}8%aav8CH zmw7vJObZlh&omkqmd8%7_1G+x+hNoQMD$pPROg`VbA~1g#wbJTyvFKJ*e?B-L=S&Iv4!-beaLIh6X(wdQD9)EW z^@p~|=Nr0ypB=QbnX|W)&z9k9;NlxBcgoC<9h7My>$6=#TU#Omi06~%3jYNo5I%|+ zV8D5cx$1ji7YJ0aa-4i26|DQFfP*5E_BrrD5^xVkuIqZ{@C5KQtR1i$IA@S4c|ALp zJ*ZhXyZ*k<$Vac>?)L0*wOelQRF)5YW-nB*-%iUNsA5N<=|7vqrhMdoEdi{qP>+=O zGP1-tgERk9iS(A#soxuBRf z{P$W9|J+F4g^q4ObUty4gsdi{yPmYsjy3Q-rHAcaM}GK>O zKO3a)u3Tbf$GVzVD~hEY)F|^1I@NtoqAD<$pL{h0RN#3~2icPc>@}*@ zYnAqh@e49d4MXEL*XRMde^N;BsmE0{K=>sK?B(deByr#bqDZq}YVFP&Z=2@BeUBRN z9q=GkFNe?HCnh(V7E4e-$twmdX!$k2dtK6tAdsoM$1G^4I^Wn=`NWy$#`3K>TR@>d zhK25if=Rn6SBD%B*>s-lCo-vH<+yA86dJis+rwUC9f|Gmu;=hdmaBp(Tv!LxqbH6u z;%Dmx0)s$`AuOa=Wmc&Q%|-KkpZ<^SJ$IK2w<6;p9;hpgY@UWL=dnPhegq#yRckfN z2s zpZN5>$3jSSj=i%iC66?K3_eWLq!XG+K?1gJTlbAkw(ik14~A-@G;f{;OWK+h(I{{C z220MQDFjVu?4|;QUeRhKb2J{EkampR$MI8`)7*dzzzRS-1uKeOYj8rrKXwlNijE7G zOqOm)C%@+-E#2VtxwfouyC<^I{LS#I^S*dJujEKC{1J66=)c||$>9XOt#*uY-gvHW zV4&pGY(wE&Ri2?_AJouM=l0=jHm+O1>i5=k7>)(Rg3Ww>c$_TmfqK#KK{|K{V$Ce& zEDNtfdm4EjAF{*bI6;%c8(GT9qO*`OW*A99a^E@_Q*ggd+WX$b1}&ZhKhUm|_5x7A z*}X&#K7ZIVn!`&}xPP&YC7OiIzF=m-HqI7deJ1E>Sz(0X<|kP7V9D5YW$=o@z%x|& z5ECtYu1b^=)_LBpLI_tw5FV`hgTBw{f1t!p(D6e1%DI{@@p=cbiCZERFYovd^>8CJ z_El@rDqdP5w)sN>#;GE#nZu~d3XxgA(aSs9sArF8vIW}ml9QeWQkMGj^IamS66F+X_ZiS)v0dH zB^BP1)rCmUQ*-)DM?4PejV|nuH+)bw5SW$P7K!uxb}8~LdyQ3p|W z0PG##L97t~m+=66@(y35XaI!d{|N1Lb{N4@A@Tq6mVsyWl?1VOu+ElN+_wz23I4Ax z@+T>Qzmbx^bTKmf=72hCs0JbYEhTD*=P?@$IRoh2UX8qs+NC=O2@)OHqyggdb@~o7 zt(Sb42=cokWEM}h-=eev6My+At~lKNf2+9zL4=k;Y0#H${-oHwULsthGqn&F`93Hu z#xPniYY*%V+E+`*bNRK^J`2S*hy=cH!@{a3D)=FAb|-|J)xILZ&ND@xg}d&@&)UnB zop!m6#ReV#3nj4WCjzN~8;8}CM)ExZRx?Vzx&;n+-30Ey+V6NNju1MIYwZoF)whYs zmsDcfN!Xx(S6TOcKgaj&WP9s8`p41tD!E^z>v5LWqxWIHIoEg+gs>Mul`}eZS&fV{ z>JdgyRIZ{SWW?py^VSD*MC%({>#OTSvtAe=(bpkIgNq4iYUHhg?T#CaUDpf+cNJyC zMQYZAprCT zQqFYe%B~@_7ji_Y3~9zOKGpavdOm0l56DkXsg966lEq8aBujFUl1&8-#-!NZ5YYI5 z$@-<0=tIEat%6NAXNLiNV(LeD@C6C_RNQEHL^m_|;Bi9RWcdacQL!Zxz7lk_2Gf`ddc>>c~g-s&RsVPrUQnLpqY%Zf8p2`|Dq_!0n`)r>q^4kt#M zB261`|6B#PN%y`};q@vZbTF;28gpf9-;Y3KglGcl5|5D!N2Pz0YT8tI)yv6Gp>ba5 zw%+q!i_5yk@Se&3nItDo4m1%p*!0N9a)N-=^ky++6Mji2lUqty7x9&v zTd_}wvC!S&sP3hwjW?05@#ttLXv%K@TvJCd$^9h6IDW(5*JtSR=3n!soakh%hmB~0 z(3PDHxPx8So(;Pf@-C4K&gr3F38}vXG#h`ge}OEDj5Iyq-taTSNx z>*es9`mPHUJyZH!Q@M)`vZg^$r<%6(=D}FSbx>(EY*M@_GOLI_&Bg22&^M0Ycp{Ai zL;ja35fBnoWk_6S?8Bx4ua*MYia+a9KonndYzbdn@gUgR3{QK6^}JvFF@(%O4}QiL`kF4mLV4{CbfU;G!&<|3i!@osF5FYlIqU&6b&?drqAa6C)J~J!KyC^cB(xqxiX0KG*cu zHZ5g691s-oH9-{=*doJv6rR9WcrK9otLufiP{%Pbjtxp%(n{yX$7vK(@)r0(2}>7j q@f?0UCRp)5{cjg{M%w-jVO-tjJ-f<7AYLU+p#1WUV$pxlfd2= 11.0.0" - }, + "type": "module", + "packageManager": "pnpm@11.20.0", "scripts": { - "all": "pnpm -r", - "pub": "pnpm ci:version && git commit -am 'chore: update versions' && pnpm pub:only", - "pub:only": "pnpm ci:publish && git push && git push --follow-tags", - "ci:version": "pnpm changeset version", - "ci:publish": "pnpm build && pnpm changeset publish", - "preinstall": "npx only-allow pnpm", - "clean": "pnpm all clean", - "clean-dist": "pnpm -r clean-dist", - "lint-fix": "NODE_OPTIONS=--max-old-space-size=6144 pnpm -r --no-bail lint-fix", - "lint": "pnpm -r lint", - "circular:dist": "pnpm -r circular:dist", - "test": "pnpm -r --no-bail test:run", - "pr:ready": "node scripts/agent-pr-ready.mjs", - "testsuite": "pnpm -r --no-bail testsuite", - "up-all": "pnpm --recursive update", - "u": "pnpm run update && pnpm i && pnpm dedupe", - "update": "ncu -u && pnpm -r exec ncu -u", - "ncu": "ncu", - "packages": "pnpm -r --workspace-concurrency 1", - "circular-packages": "pnpm packages circular", - "lint-packages": "pnpm packages lint", - "test-packages": "pnpm packages test:run", - "testsuite-packages": "pnpm packages testsuite", - "watch-packages": "pnpm packages build && pnpm packages watch", - "build:tsc": "pnpm check && node scripts/rewrite-dist-declaration-imports.mjs", - "check": "tsgo --build ./tsconfig.all.json", - "watch": "pnpm build:tsc --watch", - "build": "cd packages/eslint-shared-config && pnpm build && cd ../.. && cd packages/cli && pnpm build && cd .. && pnpm build:tsc && cd vue-components && pnpm build", - "rbuild": "pnpm clean && pnpm build", - "nnm": "find . -name 'node_modules' -type d -prune -exec rm -rf '{}' + && pnpm i", - "prepare": "node -e \"const v=require('typescript/package.json').version;if(v.startsWith('6.')){require('child_process').execSync('effect-language-service patch',{stdio:'inherit'})}else{console.log('Skipping effect-language-service patch for TypeScript '+v)}\" && effect-tsgo patch --no-typescript --oxlint && node scripts/install-git-hooks.mjs", - "subtree:effect": "node scripts/sync-effect-subtree.js" - }, - "dependencies": { - "date-fns": "^4.4.0", - "fast-check": "^4.9.0", - "vue": "^3.5.35" + "prepare": "node scripts/setup-agents.mjs && effect-tsgo patch", + "clean": "node scripts/clean.mjs", + "codegen": "pnpm --recursive --parallel --filter \"./packages/**/*\" run codegen", + "codemod": "node scripts/codemod.mjs", + "build": "tsc -b tsconfig.packages.json && pnpm --recursive --parallel --filter \"./packages/**/*\" run build && node scripts/copy-ai-docs.mjs", + "bundle-analyze": "bash scripts/bundle-analyze.sh", + "bundle-compare": "bash scripts/bundle-compare.sh", + "bundle-compare-selected": "bash scripts/bundle-compare-selected.sh", + "circular": "node scripts/circular.mjs", + "test": "vitest", + "test-cluster": "vitest run --project cluster-integration", + "doctest": "vitest --config vitest.docs.ts", + "coverage": "vitest --coverage", + "check": "tsc -b tsconfig.json", + "typeperf": "pnpm --dir packages/effect exec node typeperf/run.mjs", + "typeperf-compare": "pnpm --dir packages/effect exec node typeperf/compare.mjs", + "runtimeperf": "pnpm --dir packages/effect exec node runtimeperf/run.mts", + "runtimeperf-compare": "pnpm --dir packages/effect exec node runtimeperf/compare.mts", + "check-recursive": "pnpm --recursive --filter \"./packages/**/*\" exec tsc -b tsconfig.json", + "check-dist-types": "node scripts/check-dist-types.mjs", + "jsdocs": "effect-jsdocs", + "lint": "oxlint -f unix && dprint check", + "lint-fix": "oxlint --fix && dprint fmt", + "ai-docgen": "effect-ai-docgen ai-docs/src -o LLMS.md", + "ai-docgen:watch": "pnpm ai-docgen --watch", + "api-diff": "pnpm --dir packages/tools/api-diff exec node src/bin.ts", + "test-types": "tstyche --target '>=5.9'", + "changeset-version": "changeset version", + "changeset-publish": "node scripts/set-strip-internal.mjs && pnpm codemod && pnpm build && changeset publish" }, "devDependencies": { - "@changesets/cli": "^2.31.0", - "@effect-app/cli": "2.1.0-beta.35", - "@effect-app/eslint-codegen-model": "workspace:*", - "@effect-app/infra": "workspace:*", - "@effect/language-service": "0.87.2", - "@effect/tsgo": "^0.45.0", - "@effect/platform-node": "4.0.0-rc.114", - "@effect/vitest": "4.0.0-rc.114", - "@tsconfig/strictest": "^2.0.8", - "@types/node": "25.9.1", - "@typescript-eslint/eslint-plugin": "8.60.0", - "@typescript-eslint/parser": "8.60.0", - "@typescript/native-preview": "7.0.0-dev.20260626.1", - "dprint": "^0.54.0", - "effect": "4.0.0-rc.114", - "effect-app": "workspace:*", - "eslint": "^10.4.1", - "json5": "^2.2.3", - "lint-staged": "^17.3.0", + "@babel/cli": "^8.0.4", + "@babel/core": "^8.0.1", + "@babel/plugin-transform-export-namespace-from": "^8.0.1", + "@babel/plugin-transform-modules-commonjs": "^8.0.1", + "@changesets/changelog-github": "1.0.1", + "@changesets/cli": "3.0.2", + "@effect/ai-docgen": "workspace:^", + "@effect/bundle": "workspace:^", + "@effect/docgen": "workspace:^", + "@effect/doctest": "workspace:^", + "@effect/jsdocs": "workspace:^", + "@effect/oxc": "workspace:^", + "@effect/tsgo": "^0.41.0", + "@effect/utils": "workspace:^", + "@effect/vitest": "workspace:^", + "@faker-js/faker": "^10.6.0", + "@rollup/plugin-node-resolve": "^16.0.3", + "@rollup/plugin-replace": "^6.0.3", + "@rollup/plugin-terser": "^1.0.0", + "@types/jscodeshift": "^17.3.0", + "@types/node": "^26.4.1", + "@vitest/coverage-v8": "^5.0.0", + "@vitest/web-worker": "^5.0.0", + "ast-types": "^0.16.3", + "babel-plugin-annotate-pure-calls": "^0.5.0", + "dprint": "^0.57.3", + "fast-check": "^4.9.0", + "glob": "^13.0.6", + "happy-dom": "^20.14.0", + "jscodeshift": "^17.4.0", + "lalph": "^0.3.139", "madge": "^8.0.0", - "npm-check-updates": "^22.2.1", - "oxlint": "1.82.0", - "oxlint-tsgolint": "7.0.2001", - "pkg-pr-new": "0.0.75", - "ts-plugin-sort-import-suggestions": "^1.0.4", - "typescript": "~6.0.3", - "vite": "^8.0.15", - "vitest": "^4.1.7" + "oxlint": "^1.81.0", + "pkg-pr-new": "0.0.88", + "playwright": "^1.63.0", + "rollup": "^4.63.1", + "rollup-plugin-bundle-stats": "^4.22.3", + "rollup-plugin-esbuild": "^6.2.1", + "rollup-plugin-visualizer": "^7.1.1", + "terser": "^5.51.2", + "tstyche": "^7.2.4", + "typescript": "^7.0.2", + "vite": "^8.2.2", + "vitest": "^5.0.0", + "vitest-websocket-mock": "^0.7.0", + "zod": "^4.5.4" } } diff --git a/repos/effect/packages/ai/anthropic/CHANGELOG.md b/packages/ai/anthropic/CHANGELOG.md similarity index 99% rename from repos/effect/packages/ai/anthropic/CHANGELOG.md rename to packages/ai/anthropic/CHANGELOG.md index 976cd390c..c72a03eab 100644 --- a/repos/effect/packages/ai/anthropic/CHANGELOG.md +++ b/packages/ai/anthropic/CHANGELOG.md @@ -1,5 +1,12 @@ # @effect/ai-anthropic +## 4.0.0-rc.115 + +### Patch Changes + +- Updated dependencies [[`657254b`](https://github.com/Effect-TS/effect/commit/657254b8218628b0116497d09aaf783cb88279f3), [`f9ef0e9`](https://github.com/Effect-TS/effect/commit/f9ef0e970260b5de143392d00593e6c8b4614cff), [`4f73f9e`](https://github.com/Effect-TS/effect/commit/4f73f9e0bd9538260f0f7166e0e6abdbd507a0e8)]: + - effect@4.0.0-rc.115 + ## 4.0.0-rc.114 ### Patch Changes diff --git a/repos/effect/packages/ai/anthropic/README.md b/packages/ai/anthropic/README.md similarity index 100% rename from repos/effect/packages/ai/anthropic/README.md rename to packages/ai/anthropic/README.md diff --git a/repos/effect/packages/ai/anthropic/codegen.yml b/packages/ai/anthropic/codegen.yml similarity index 100% rename from repos/effect/packages/ai/anthropic/codegen.yml rename to packages/ai/anthropic/codegen.yml diff --git a/repos/effect/packages/ai/anthropic/package.json b/packages/ai/anthropic/package.json similarity index 98% rename from repos/effect/packages/ai/anthropic/package.json rename to packages/ai/anthropic/package.json index b198bdbab..52d8fbf01 100644 --- a/repos/effect/packages/ai/anthropic/package.json +++ b/packages/ai/anthropic/package.json @@ -1,6 +1,6 @@ { "name": "@effect/ai-anthropic", - "version": "4.0.0-rc.114", + "version": "4.0.0-rc.115", "type": "module", "license": "MIT", "description": "An Anthropic provider integration for Effect AI SDK", diff --git a/repos/effect/packages/ai/anthropic/src/AnthropicClient.ts b/packages/ai/anthropic/src/AnthropicClient.ts similarity index 100% rename from repos/effect/packages/ai/anthropic/src/AnthropicClient.ts rename to packages/ai/anthropic/src/AnthropicClient.ts diff --git a/repos/effect/packages/ai/anthropic/src/AnthropicConfig.ts b/packages/ai/anthropic/src/AnthropicConfig.ts similarity index 100% rename from repos/effect/packages/ai/anthropic/src/AnthropicConfig.ts rename to packages/ai/anthropic/src/AnthropicConfig.ts diff --git a/repos/effect/packages/ai/anthropic/src/AnthropicError.ts b/packages/ai/anthropic/src/AnthropicError.ts similarity index 100% rename from repos/effect/packages/ai/anthropic/src/AnthropicError.ts rename to packages/ai/anthropic/src/AnthropicError.ts diff --git a/repos/effect/packages/ai/anthropic/src/AnthropicLanguageModel.ts b/packages/ai/anthropic/src/AnthropicLanguageModel.ts similarity index 100% rename from repos/effect/packages/ai/anthropic/src/AnthropicLanguageModel.ts rename to packages/ai/anthropic/src/AnthropicLanguageModel.ts diff --git a/repos/effect/packages/ai/anthropic/src/AnthropicTelemetry.ts b/packages/ai/anthropic/src/AnthropicTelemetry.ts similarity index 100% rename from repos/effect/packages/ai/anthropic/src/AnthropicTelemetry.ts rename to packages/ai/anthropic/src/AnthropicTelemetry.ts diff --git a/repos/effect/packages/ai/anthropic/src/AnthropicTool.ts b/packages/ai/anthropic/src/AnthropicTool.ts similarity index 100% rename from repos/effect/packages/ai/anthropic/src/AnthropicTool.ts rename to packages/ai/anthropic/src/AnthropicTool.ts diff --git a/repos/effect/packages/ai/anthropic/src/Generated.ts b/packages/ai/anthropic/src/Generated.ts similarity index 100% rename from repos/effect/packages/ai/anthropic/src/Generated.ts rename to packages/ai/anthropic/src/Generated.ts diff --git a/repos/effect/packages/ai/anthropic/src/index.ts b/packages/ai/anthropic/src/index.ts similarity index 100% rename from repos/effect/packages/ai/anthropic/src/index.ts rename to packages/ai/anthropic/src/index.ts diff --git a/repos/effect/packages/ai/anthropic/src/internal/errors.ts b/packages/ai/anthropic/src/internal/errors.ts similarity index 100% rename from repos/effect/packages/ai/anthropic/src/internal/errors.ts rename to packages/ai/anthropic/src/internal/errors.ts diff --git a/repos/effect/packages/ai/anthropic/src/internal/utilities.ts b/packages/ai/anthropic/src/internal/utilities.ts similarity index 100% rename from repos/effect/packages/ai/anthropic/src/internal/utilities.ts rename to packages/ai/anthropic/src/internal/utilities.ts diff --git a/repos/effect/packages/ai/anthropic/test/AnthropicClient.test.ts b/packages/ai/anthropic/test/AnthropicClient.test.ts similarity index 100% rename from repos/effect/packages/ai/anthropic/test/AnthropicClient.test.ts rename to packages/ai/anthropic/test/AnthropicClient.test.ts diff --git a/repos/effect/packages/ai/anthropic/test/AnthropicLanguageModel.test.ts b/packages/ai/anthropic/test/AnthropicLanguageModel.test.ts similarity index 100% rename from repos/effect/packages/ai/anthropic/test/AnthropicLanguageModel.test.ts rename to packages/ai/anthropic/test/AnthropicLanguageModel.test.ts diff --git a/repos/effect/packages/ai/anthropic/tsconfig.json b/packages/ai/anthropic/tsconfig.json similarity index 100% rename from repos/effect/packages/ai/anthropic/tsconfig.json rename to packages/ai/anthropic/tsconfig.json diff --git a/repos/effect/packages/ai/anthropic/typetest/AnthropicLanguageModel.tst.ts b/packages/ai/anthropic/typetest/AnthropicLanguageModel.tst.ts similarity index 100% rename from repos/effect/packages/ai/anthropic/typetest/AnthropicLanguageModel.tst.ts rename to packages/ai/anthropic/typetest/AnthropicLanguageModel.tst.ts diff --git a/repos/effect/packages/ai/openai-compat/CHANGELOG.md b/packages/ai/openai-compat/CHANGELOG.md similarity index 99% rename from repos/effect/packages/ai/openai-compat/CHANGELOG.md rename to packages/ai/openai-compat/CHANGELOG.md index d90c5021e..5b012e6a8 100644 --- a/repos/effect/packages/ai/openai-compat/CHANGELOG.md +++ b/packages/ai/openai-compat/CHANGELOG.md @@ -1,5 +1,12 @@ # @effect/ai-openai-compat +## 4.0.0-rc.115 + +### Patch Changes + +- Updated dependencies [[`657254b`](https://github.com/Effect-TS/effect/commit/657254b8218628b0116497d09aaf783cb88279f3), [`f9ef0e9`](https://github.com/Effect-TS/effect/commit/f9ef0e970260b5de143392d00593e6c8b4614cff), [`4f73f9e`](https://github.com/Effect-TS/effect/commit/4f73f9e0bd9538260f0f7166e0e6abdbd507a0e8)]: + - effect@4.0.0-rc.115 + ## 4.0.0-rc.114 ### Patch Changes diff --git a/repos/effect/packages/ai/openai-compat/README.md b/packages/ai/openai-compat/README.md similarity index 100% rename from repos/effect/packages/ai/openai-compat/README.md rename to packages/ai/openai-compat/README.md diff --git a/repos/effect/packages/ai/openai-compat/package.json b/packages/ai/openai-compat/package.json similarity index 98% rename from repos/effect/packages/ai/openai-compat/package.json rename to packages/ai/openai-compat/package.json index 6f3702053..0910f8d81 100644 --- a/repos/effect/packages/ai/openai-compat/package.json +++ b/packages/ai/openai-compat/package.json @@ -1,6 +1,6 @@ { "name": "@effect/ai-openai-compat", - "version": "4.0.0-rc.114", + "version": "4.0.0-rc.115", "type": "module", "license": "MIT", "description": "An OpenAI compat integration for Effect", diff --git a/repos/effect/packages/ai/openai-compat/src/OpenAiClient.ts b/packages/ai/openai-compat/src/OpenAiClient.ts similarity index 100% rename from repos/effect/packages/ai/openai-compat/src/OpenAiClient.ts rename to packages/ai/openai-compat/src/OpenAiClient.ts diff --git a/repos/effect/packages/ai/openai-compat/src/OpenAiConfig.ts b/packages/ai/openai-compat/src/OpenAiConfig.ts similarity index 100% rename from repos/effect/packages/ai/openai-compat/src/OpenAiConfig.ts rename to packages/ai/openai-compat/src/OpenAiConfig.ts diff --git a/repos/effect/packages/ai/openai-compat/src/OpenAiEmbeddingModel.ts b/packages/ai/openai-compat/src/OpenAiEmbeddingModel.ts similarity index 100% rename from repos/effect/packages/ai/openai-compat/src/OpenAiEmbeddingModel.ts rename to packages/ai/openai-compat/src/OpenAiEmbeddingModel.ts diff --git a/repos/effect/packages/ai/openai-compat/src/OpenAiError.ts b/packages/ai/openai-compat/src/OpenAiError.ts similarity index 100% rename from repos/effect/packages/ai/openai-compat/src/OpenAiError.ts rename to packages/ai/openai-compat/src/OpenAiError.ts diff --git a/repos/effect/packages/ai/openai-compat/src/OpenAiLanguageModel.ts b/packages/ai/openai-compat/src/OpenAiLanguageModel.ts similarity index 100% rename from repos/effect/packages/ai/openai-compat/src/OpenAiLanguageModel.ts rename to packages/ai/openai-compat/src/OpenAiLanguageModel.ts diff --git a/repos/effect/packages/ai/openai-compat/src/OpenAiTelemetry.ts b/packages/ai/openai-compat/src/OpenAiTelemetry.ts similarity index 100% rename from repos/effect/packages/ai/openai-compat/src/OpenAiTelemetry.ts rename to packages/ai/openai-compat/src/OpenAiTelemetry.ts diff --git a/repos/effect/packages/ai/openai-compat/src/index.ts b/packages/ai/openai-compat/src/index.ts similarity index 100% rename from repos/effect/packages/ai/openai-compat/src/index.ts rename to packages/ai/openai-compat/src/index.ts diff --git a/repos/effect/packages/ai/openai-compat/src/internal/errors.ts b/packages/ai/openai-compat/src/internal/errors.ts similarity index 100% rename from repos/effect/packages/ai/openai-compat/src/internal/errors.ts rename to packages/ai/openai-compat/src/internal/errors.ts diff --git a/repos/effect/packages/ai/openai-compat/src/internal/utilities.ts b/packages/ai/openai-compat/src/internal/utilities.ts similarity index 100% rename from repos/effect/packages/ai/openai-compat/src/internal/utilities.ts rename to packages/ai/openai-compat/src/internal/utilities.ts diff --git a/repos/effect/packages/ai/openai-compat/test/OpenAiClient.test.ts b/packages/ai/openai-compat/test/OpenAiClient.test.ts similarity index 100% rename from repos/effect/packages/ai/openai-compat/test/OpenAiClient.test.ts rename to packages/ai/openai-compat/test/OpenAiClient.test.ts diff --git a/repos/effect/packages/ai/openai-compat/test/OpenAiEmbeddingModel.test.ts b/packages/ai/openai-compat/test/OpenAiEmbeddingModel.test.ts similarity index 100% rename from repos/effect/packages/ai/openai-compat/test/OpenAiEmbeddingModel.test.ts rename to packages/ai/openai-compat/test/OpenAiEmbeddingModel.test.ts diff --git a/repos/effect/packages/ai/openai-compat/test/OpenAiLanguageModel.test.ts b/packages/ai/openai-compat/test/OpenAiLanguageModel.test.ts similarity index 100% rename from repos/effect/packages/ai/openai-compat/test/OpenAiLanguageModel.test.ts rename to packages/ai/openai-compat/test/OpenAiLanguageModel.test.ts diff --git a/repos/effect/packages/ai/openai-compat/tsconfig.json b/packages/ai/openai-compat/tsconfig.json similarity index 100% rename from repos/effect/packages/ai/openai-compat/tsconfig.json rename to packages/ai/openai-compat/tsconfig.json diff --git a/repos/effect/packages/ai/openai-compat/typetest/OpenAiConfig.tst.ts b/packages/ai/openai-compat/typetest/OpenAiConfig.tst.ts similarity index 100% rename from repos/effect/packages/ai/openai-compat/typetest/OpenAiConfig.tst.ts rename to packages/ai/openai-compat/typetest/OpenAiConfig.tst.ts diff --git a/repos/effect/packages/ai/openai/CHANGELOG.md b/packages/ai/openai/CHANGELOG.md similarity index 99% rename from repos/effect/packages/ai/openai/CHANGELOG.md rename to packages/ai/openai/CHANGELOG.md index 9cd78b267..5bfd0f85f 100644 --- a/repos/effect/packages/ai/openai/CHANGELOG.md +++ b/packages/ai/openai/CHANGELOG.md @@ -1,5 +1,12 @@ # @effect/ai-openai +## 4.0.0-rc.115 + +### Patch Changes + +- Updated dependencies [[`657254b`](https://github.com/Effect-TS/effect/commit/657254b8218628b0116497d09aaf783cb88279f3), [`f9ef0e9`](https://github.com/Effect-TS/effect/commit/f9ef0e970260b5de143392d00593e6c8b4614cff), [`4f73f9e`](https://github.com/Effect-TS/effect/commit/4f73f9e0bd9538260f0f7166e0e6abdbd507a0e8)]: + - effect@4.0.0-rc.115 + ## 4.0.0-rc.114 ### Patch Changes diff --git a/repos/effect/packages/ai/openai/README.md b/packages/ai/openai/README.md similarity index 100% rename from repos/effect/packages/ai/openai/README.md rename to packages/ai/openai/README.md diff --git a/repos/effect/packages/ai/openai/codegen.yaml b/packages/ai/openai/codegen.yaml similarity index 100% rename from repos/effect/packages/ai/openai/codegen.yaml rename to packages/ai/openai/codegen.yaml diff --git a/repos/effect/packages/ai/openai/package.json b/packages/ai/openai/package.json similarity index 98% rename from repos/effect/packages/ai/openai/package.json rename to packages/ai/openai/package.json index d53d870b2..7c7554d3b 100644 --- a/repos/effect/packages/ai/openai/package.json +++ b/packages/ai/openai/package.json @@ -1,6 +1,6 @@ { "name": "@effect/ai-openai", - "version": "4.0.0-rc.114", + "version": "4.0.0-rc.115", "type": "module", "license": "MIT", "description": "An OpenAI provider integration for Effect AI SDK", diff --git a/repos/effect/packages/ai/openai/src/Generated.ts b/packages/ai/openai/src/Generated.ts similarity index 100% rename from repos/effect/packages/ai/openai/src/Generated.ts rename to packages/ai/openai/src/Generated.ts diff --git a/repos/effect/packages/ai/openai/src/OpenAiClient.ts b/packages/ai/openai/src/OpenAiClient.ts similarity index 100% rename from repos/effect/packages/ai/openai/src/OpenAiClient.ts rename to packages/ai/openai/src/OpenAiClient.ts diff --git a/repos/effect/packages/ai/openai/src/OpenAiClientGenerated.ts b/packages/ai/openai/src/OpenAiClientGenerated.ts similarity index 100% rename from repos/effect/packages/ai/openai/src/OpenAiClientGenerated.ts rename to packages/ai/openai/src/OpenAiClientGenerated.ts diff --git a/repos/effect/packages/ai/openai/src/OpenAiConfig.ts b/packages/ai/openai/src/OpenAiConfig.ts similarity index 100% rename from repos/effect/packages/ai/openai/src/OpenAiConfig.ts rename to packages/ai/openai/src/OpenAiConfig.ts diff --git a/repos/effect/packages/ai/openai/src/OpenAiEmbeddingModel.ts b/packages/ai/openai/src/OpenAiEmbeddingModel.ts similarity index 100% rename from repos/effect/packages/ai/openai/src/OpenAiEmbeddingModel.ts rename to packages/ai/openai/src/OpenAiEmbeddingModel.ts diff --git a/repos/effect/packages/ai/openai/src/OpenAiError.ts b/packages/ai/openai/src/OpenAiError.ts similarity index 100% rename from repos/effect/packages/ai/openai/src/OpenAiError.ts rename to packages/ai/openai/src/OpenAiError.ts diff --git a/repos/effect/packages/ai/openai/src/OpenAiLanguageModel.ts b/packages/ai/openai/src/OpenAiLanguageModel.ts similarity index 100% rename from repos/effect/packages/ai/openai/src/OpenAiLanguageModel.ts rename to packages/ai/openai/src/OpenAiLanguageModel.ts diff --git a/repos/effect/packages/ai/openai/src/OpenAiSchema.ts b/packages/ai/openai/src/OpenAiSchema.ts similarity index 100% rename from repos/effect/packages/ai/openai/src/OpenAiSchema.ts rename to packages/ai/openai/src/OpenAiSchema.ts diff --git a/repos/effect/packages/ai/openai/src/OpenAiTelemetry.ts b/packages/ai/openai/src/OpenAiTelemetry.ts similarity index 100% rename from repos/effect/packages/ai/openai/src/OpenAiTelemetry.ts rename to packages/ai/openai/src/OpenAiTelemetry.ts diff --git a/repos/effect/packages/ai/openai/src/OpenAiTool.ts b/packages/ai/openai/src/OpenAiTool.ts similarity index 100% rename from repos/effect/packages/ai/openai/src/OpenAiTool.ts rename to packages/ai/openai/src/OpenAiTool.ts diff --git a/repos/effect/packages/ai/openai/src/index.ts b/packages/ai/openai/src/index.ts similarity index 100% rename from repos/effect/packages/ai/openai/src/index.ts rename to packages/ai/openai/src/index.ts diff --git a/repos/effect/packages/ai/openai/src/internal/errors.ts b/packages/ai/openai/src/internal/errors.ts similarity index 100% rename from repos/effect/packages/ai/openai/src/internal/errors.ts rename to packages/ai/openai/src/internal/errors.ts diff --git a/repos/effect/packages/ai/openai/src/internal/utilities.ts b/packages/ai/openai/src/internal/utilities.ts similarity index 100% rename from repos/effect/packages/ai/openai/src/internal/utilities.ts rename to packages/ai/openai/src/internal/utilities.ts diff --git a/repos/effect/packages/ai/openai/test/OpenAiClient.test.ts b/packages/ai/openai/test/OpenAiClient.test.ts similarity index 100% rename from repos/effect/packages/ai/openai/test/OpenAiClient.test.ts rename to packages/ai/openai/test/OpenAiClient.test.ts diff --git a/repos/effect/packages/ai/openai/test/OpenAiEmbeddingModel.test.ts b/packages/ai/openai/test/OpenAiEmbeddingModel.test.ts similarity index 100% rename from repos/effect/packages/ai/openai/test/OpenAiEmbeddingModel.test.ts rename to packages/ai/openai/test/OpenAiEmbeddingModel.test.ts diff --git a/repos/effect/packages/ai/openai/test/OpenAiLanguageModel.test.ts b/packages/ai/openai/test/OpenAiLanguageModel.test.ts similarity index 100% rename from repos/effect/packages/ai/openai/test/OpenAiLanguageModel.test.ts rename to packages/ai/openai/test/OpenAiLanguageModel.test.ts diff --git a/repos/effect/packages/ai/openai/test/OpenAiSchema.test.ts b/packages/ai/openai/test/OpenAiSchema.test.ts similarity index 100% rename from repos/effect/packages/ai/openai/test/OpenAiSchema.test.ts rename to packages/ai/openai/test/OpenAiSchema.test.ts diff --git a/repos/effect/packages/ai/openai/tsconfig.json b/packages/ai/openai/tsconfig.json similarity index 100% rename from repos/effect/packages/ai/openai/tsconfig.json rename to packages/ai/openai/tsconfig.json diff --git a/repos/effect/packages/ai/openai/typetest/OpenAiTool.tst.ts b/packages/ai/openai/typetest/OpenAiTool.tst.ts similarity index 100% rename from repos/effect/packages/ai/openai/typetest/OpenAiTool.tst.ts rename to packages/ai/openai/typetest/OpenAiTool.tst.ts diff --git a/repos/effect/packages/ai/openrouter/CHANGELOG.md b/packages/ai/openrouter/CHANGELOG.md similarity index 99% rename from repos/effect/packages/ai/openrouter/CHANGELOG.md rename to packages/ai/openrouter/CHANGELOG.md index 6a89a7a4c..f7e22cb87 100644 --- a/repos/effect/packages/ai/openrouter/CHANGELOG.md +++ b/packages/ai/openrouter/CHANGELOG.md @@ -1,5 +1,12 @@ # @effect/ai-openrouter +## 4.0.0-rc.115 + +### Patch Changes + +- Updated dependencies [[`657254b`](https://github.com/Effect-TS/effect/commit/657254b8218628b0116497d09aaf783cb88279f3), [`f9ef0e9`](https://github.com/Effect-TS/effect/commit/f9ef0e970260b5de143392d00593e6c8b4614cff), [`4f73f9e`](https://github.com/Effect-TS/effect/commit/4f73f9e0bd9538260f0f7166e0e6abdbd507a0e8)]: + - effect@4.0.0-rc.115 + ## 4.0.0-rc.114 ### Patch Changes diff --git a/repos/effect/packages/ai/openrouter/README.md b/packages/ai/openrouter/README.md similarity index 100% rename from repos/effect/packages/ai/openrouter/README.md rename to packages/ai/openrouter/README.md diff --git a/repos/effect/packages/ai/openrouter/codegen.yml b/packages/ai/openrouter/codegen.yml similarity index 100% rename from repos/effect/packages/ai/openrouter/codegen.yml rename to packages/ai/openrouter/codegen.yml diff --git a/repos/effect/packages/ai/openrouter/package.json b/packages/ai/openrouter/package.json similarity index 98% rename from repos/effect/packages/ai/openrouter/package.json rename to packages/ai/openrouter/package.json index 2f446d6c0..9f05c59d4 100644 --- a/repos/effect/packages/ai/openrouter/package.json +++ b/packages/ai/openrouter/package.json @@ -1,6 +1,6 @@ { "name": "@effect/ai-openrouter", - "version": "4.0.0-rc.114", + "version": "4.0.0-rc.115", "type": "module", "license": "MIT", "description": "An OpenRouter provider integration for Effect AI SDK", diff --git a/repos/effect/packages/ai/openrouter/src/Generated.ts b/packages/ai/openrouter/src/Generated.ts similarity index 100% rename from repos/effect/packages/ai/openrouter/src/Generated.ts rename to packages/ai/openrouter/src/Generated.ts diff --git a/repos/effect/packages/ai/openrouter/src/OpenRouterClient.ts b/packages/ai/openrouter/src/OpenRouterClient.ts similarity index 100% rename from repos/effect/packages/ai/openrouter/src/OpenRouterClient.ts rename to packages/ai/openrouter/src/OpenRouterClient.ts diff --git a/repos/effect/packages/ai/openrouter/src/OpenRouterConfig.ts b/packages/ai/openrouter/src/OpenRouterConfig.ts similarity index 100% rename from repos/effect/packages/ai/openrouter/src/OpenRouterConfig.ts rename to packages/ai/openrouter/src/OpenRouterConfig.ts diff --git a/repos/effect/packages/ai/openrouter/src/OpenRouterError.ts b/packages/ai/openrouter/src/OpenRouterError.ts similarity index 100% rename from repos/effect/packages/ai/openrouter/src/OpenRouterError.ts rename to packages/ai/openrouter/src/OpenRouterError.ts diff --git a/repos/effect/packages/ai/openrouter/src/OpenRouterLanguageModel.ts b/packages/ai/openrouter/src/OpenRouterLanguageModel.ts similarity index 100% rename from repos/effect/packages/ai/openrouter/src/OpenRouterLanguageModel.ts rename to packages/ai/openrouter/src/OpenRouterLanguageModel.ts diff --git a/repos/effect/packages/ai/openrouter/src/index.ts b/packages/ai/openrouter/src/index.ts similarity index 100% rename from repos/effect/packages/ai/openrouter/src/index.ts rename to packages/ai/openrouter/src/index.ts diff --git a/repos/effect/packages/ai/openrouter/src/internal/errors.ts b/packages/ai/openrouter/src/internal/errors.ts similarity index 100% rename from repos/effect/packages/ai/openrouter/src/internal/errors.ts rename to packages/ai/openrouter/src/internal/errors.ts diff --git a/repos/effect/packages/ai/openrouter/src/internal/utilities.ts b/packages/ai/openrouter/src/internal/utilities.ts similarity index 100% rename from repos/effect/packages/ai/openrouter/src/internal/utilities.ts rename to packages/ai/openrouter/src/internal/utilities.ts diff --git a/repos/effect/packages/ai/openrouter/test/Generated.test.ts b/packages/ai/openrouter/test/Generated.test.ts similarity index 100% rename from repos/effect/packages/ai/openrouter/test/Generated.test.ts rename to packages/ai/openrouter/test/Generated.test.ts diff --git a/repos/effect/packages/ai/openrouter/test/OpenRouterClient.test.ts b/packages/ai/openrouter/test/OpenRouterClient.test.ts similarity index 100% rename from repos/effect/packages/ai/openrouter/test/OpenRouterClient.test.ts rename to packages/ai/openrouter/test/OpenRouterClient.test.ts diff --git a/repos/effect/packages/ai/openrouter/test/OpenRouterLanguageModel.test.ts b/packages/ai/openrouter/test/OpenRouterLanguageModel.test.ts similarity index 100% rename from repos/effect/packages/ai/openrouter/test/OpenRouterLanguageModel.test.ts rename to packages/ai/openrouter/test/OpenRouterLanguageModel.test.ts diff --git a/repos/effect/packages/ai/openrouter/tsconfig.json b/packages/ai/openrouter/tsconfig.json similarity index 100% rename from repos/effect/packages/ai/openrouter/tsconfig.json rename to packages/ai/openrouter/tsconfig.json diff --git a/repos/effect/packages/atom/react/CHANGELOG.md b/packages/atom/react/CHANGELOG.md similarity index 99% rename from repos/effect/packages/atom/react/CHANGELOG.md rename to packages/atom/react/CHANGELOG.md index 4827788c0..b5e964c2d 100644 --- a/repos/effect/packages/atom/react/CHANGELOG.md +++ b/packages/atom/react/CHANGELOG.md @@ -1,5 +1,12 @@ # @effect/atom-react +## 4.0.0-rc.115 + +### Patch Changes + +- Updated dependencies [[`657254b`](https://github.com/Effect-TS/effect/commit/657254b8218628b0116497d09aaf783cb88279f3), [`f9ef0e9`](https://github.com/Effect-TS/effect/commit/f9ef0e970260b5de143392d00593e6c8b4614cff), [`4f73f9e`](https://github.com/Effect-TS/effect/commit/4f73f9e0bd9538260f0f7166e0e6abdbd507a0e8)]: + - effect@4.0.0-rc.115 + ## 4.0.0-rc.114 ### Patch Changes diff --git a/repos/effect/packages/atom/react/LICENSE b/packages/atom/react/LICENSE similarity index 100% rename from repos/effect/packages/atom/react/LICENSE rename to packages/atom/react/LICENSE diff --git a/repos/effect/packages/atom/react/README.md b/packages/atom/react/README.md similarity index 100% rename from repos/effect/packages/atom/react/README.md rename to packages/atom/react/README.md diff --git a/repos/effect/packages/atom/react/package.json b/packages/atom/react/package.json similarity index 98% rename from repos/effect/packages/atom/react/package.json rename to packages/atom/react/package.json index 26edef3f7..94adc90b0 100644 --- a/repos/effect/packages/atom/react/package.json +++ b/packages/atom/react/package.json @@ -1,6 +1,6 @@ { "name": "@effect/atom-react", - "version": "4.0.0-rc.114", + "version": "4.0.0-rc.115", "type": "module", "license": "MIT", "description": "React bindings for the Effect Atom modules", diff --git a/repos/effect/packages/atom/react/src/Hooks.ts b/packages/atom/react/src/Hooks.ts similarity index 100% rename from repos/effect/packages/atom/react/src/Hooks.ts rename to packages/atom/react/src/Hooks.ts diff --git a/repos/effect/packages/atom/react/src/ReactHydration.ts b/packages/atom/react/src/ReactHydration.ts similarity index 100% rename from repos/effect/packages/atom/react/src/ReactHydration.ts rename to packages/atom/react/src/ReactHydration.ts diff --git a/repos/effect/packages/atom/react/src/RegistryContext.ts b/packages/atom/react/src/RegistryContext.ts similarity index 100% rename from repos/effect/packages/atom/react/src/RegistryContext.ts rename to packages/atom/react/src/RegistryContext.ts diff --git a/repos/effect/packages/atom/react/src/ScopedAtom.ts b/packages/atom/react/src/ScopedAtom.ts similarity index 100% rename from repos/effect/packages/atom/react/src/ScopedAtom.ts rename to packages/atom/react/src/ScopedAtom.ts diff --git a/repos/effect/packages/atom/react/src/index.ts b/packages/atom/react/src/index.ts similarity index 100% rename from repos/effect/packages/atom/react/src/index.ts rename to packages/atom/react/src/index.ts diff --git a/repos/effect/packages/atom/react/test/index.test.tsx b/packages/atom/react/test/index.test.tsx similarity index 100% rename from repos/effect/packages/atom/react/test/index.test.tsx rename to packages/atom/react/test/index.test.tsx diff --git a/repos/effect/packages/atom/react/tsconfig.json b/packages/atom/react/tsconfig.json similarity index 100% rename from repos/effect/packages/atom/react/tsconfig.json rename to packages/atom/react/tsconfig.json diff --git a/repos/effect/packages/atom/react/vitest.setup.ts b/packages/atom/react/vitest.setup.ts similarity index 100% rename from repos/effect/packages/atom/react/vitest.setup.ts rename to packages/atom/react/vitest.setup.ts diff --git a/repos/effect/packages/atom/solid/CHANGELOG.md b/packages/atom/solid/CHANGELOG.md similarity index 99% rename from repos/effect/packages/atom/solid/CHANGELOG.md rename to packages/atom/solid/CHANGELOG.md index 28eb8a81c..b8d4af9bf 100644 --- a/repos/effect/packages/atom/solid/CHANGELOG.md +++ b/packages/atom/solid/CHANGELOG.md @@ -1,5 +1,12 @@ # @effect/atom-solid +## 4.0.0-rc.115 + +### Patch Changes + +- Updated dependencies [[`657254b`](https://github.com/Effect-TS/effect/commit/657254b8218628b0116497d09aaf783cb88279f3), [`f9ef0e9`](https://github.com/Effect-TS/effect/commit/f9ef0e970260b5de143392d00593e6c8b4614cff), [`4f73f9e`](https://github.com/Effect-TS/effect/commit/4f73f9e0bd9538260f0f7166e0e6abdbd507a0e8)]: + - effect@4.0.0-rc.115 + ## 4.0.0-rc.114 ### Patch Changes diff --git a/repos/effect/packages/atom/solid/LICENSE b/packages/atom/solid/LICENSE similarity index 100% rename from repos/effect/packages/atom/solid/LICENSE rename to packages/atom/solid/LICENSE diff --git a/repos/effect/packages/atom/solid/README.md b/packages/atom/solid/README.md similarity index 100% rename from repos/effect/packages/atom/solid/README.md rename to packages/atom/solid/README.md diff --git a/repos/effect/packages/atom/solid/package.json b/packages/atom/solid/package.json similarity index 98% rename from repos/effect/packages/atom/solid/package.json rename to packages/atom/solid/package.json index b9834bb7b..ca437fb06 100644 --- a/repos/effect/packages/atom/solid/package.json +++ b/packages/atom/solid/package.json @@ -1,6 +1,6 @@ { "name": "@effect/atom-solid", - "version": "4.0.0-rc.114", + "version": "4.0.0-rc.115", "type": "module", "license": "MIT", "description": "SolidJS bindings for the Effect Atom modules", diff --git a/repos/effect/packages/atom/solid/src/Hooks.ts b/packages/atom/solid/src/Hooks.ts similarity index 100% rename from repos/effect/packages/atom/solid/src/Hooks.ts rename to packages/atom/solid/src/Hooks.ts diff --git a/repos/effect/packages/atom/solid/src/RegistryContext.ts b/packages/atom/solid/src/RegistryContext.ts similarity index 100% rename from repos/effect/packages/atom/solid/src/RegistryContext.ts rename to packages/atom/solid/src/RegistryContext.ts diff --git a/repos/effect/packages/atom/solid/src/index.ts b/packages/atom/solid/src/index.ts similarity index 100% rename from repos/effect/packages/atom/solid/src/index.ts rename to packages/atom/solid/src/index.ts diff --git a/repos/effect/packages/atom/solid/test/index.test.tsx b/packages/atom/solid/test/index.test.tsx similarity index 100% rename from repos/effect/packages/atom/solid/test/index.test.tsx rename to packages/atom/solid/test/index.test.tsx diff --git a/repos/effect/packages/atom/solid/tsconfig.json b/packages/atom/solid/tsconfig.json similarity index 100% rename from repos/effect/packages/atom/solid/tsconfig.json rename to packages/atom/solid/tsconfig.json diff --git a/repos/effect/packages/atom/solid/vitest.setup.ts b/packages/atom/solid/vitest.setup.ts similarity index 100% rename from repos/effect/packages/atom/solid/vitest.setup.ts rename to packages/atom/solid/vitest.setup.ts diff --git a/repos/effect/packages/atom/vue/CHANGELOG.md b/packages/atom/vue/CHANGELOG.md similarity index 99% rename from repos/effect/packages/atom/vue/CHANGELOG.md rename to packages/atom/vue/CHANGELOG.md index e7d644638..56e3cb6ee 100644 --- a/repos/effect/packages/atom/vue/CHANGELOG.md +++ b/packages/atom/vue/CHANGELOG.md @@ -1,5 +1,12 @@ # @effect/atom-vue +## 4.0.0-rc.115 + +### Patch Changes + +- Updated dependencies [[`657254b`](https://github.com/Effect-TS/effect/commit/657254b8218628b0116497d09aaf783cb88279f3), [`f9ef0e9`](https://github.com/Effect-TS/effect/commit/f9ef0e970260b5de143392d00593e6c8b4614cff), [`4f73f9e`](https://github.com/Effect-TS/effect/commit/4f73f9e0bd9538260f0f7166e0e6abdbd507a0e8)]: + - effect@4.0.0-rc.115 + ## 4.0.0-rc.114 ### Patch Changes diff --git a/repos/effect/packages/atom/vue/LICENSE b/packages/atom/vue/LICENSE similarity index 100% rename from repos/effect/packages/atom/vue/LICENSE rename to packages/atom/vue/LICENSE diff --git a/repos/effect/packages/atom/vue/README.md b/packages/atom/vue/README.md similarity index 100% rename from repos/effect/packages/atom/vue/README.md rename to packages/atom/vue/README.md diff --git a/repos/effect/packages/atom/vue/package.json b/packages/atom/vue/package.json similarity index 98% rename from repos/effect/packages/atom/vue/package.json rename to packages/atom/vue/package.json index fe1d2e891..9fa2e6765 100644 --- a/repos/effect/packages/atom/vue/package.json +++ b/packages/atom/vue/package.json @@ -1,6 +1,6 @@ { "name": "@effect/atom-vue", - "version": "4.0.0-rc.114", + "version": "4.0.0-rc.115", "type": "module", "license": "MIT", "description": "Vue bindings for the Effect Atom modules", diff --git a/repos/effect/packages/atom/vue/src/index.ts b/packages/atom/vue/src/index.ts similarity index 100% rename from repos/effect/packages/atom/vue/src/index.ts rename to packages/atom/vue/src/index.ts diff --git a/repos/effect/packages/atom/vue/test/index.test.ts b/packages/atom/vue/test/index.test.ts similarity index 100% rename from repos/effect/packages/atom/vue/test/index.test.ts rename to packages/atom/vue/test/index.test.ts diff --git a/repos/effect/packages/atom/vue/tsconfig.json b/packages/atom/vue/tsconfig.json similarity index 100% rename from repos/effect/packages/atom/vue/tsconfig.json rename to packages/atom/vue/tsconfig.json diff --git a/packages/cli/.gitignore b/packages/cli/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/cli/.madgerc b/packages/cli/.madgerc deleted file mode 100644 index b407c6b4b..000000000 --- a/packages/cli/.madgerc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "detectiveOptions": { - "ts": { - "skipTypeImports": true - } - } -} diff --git a/packages/cli/.npmignore b/packages/cli/.npmignore deleted file mode 100644 index e4c612bb4..000000000 --- a/packages/cli/.npmignore +++ /dev/null @@ -1,14 +0,0 @@ -*.test.js -*.test.d.ts -tsconfig.build.json -*.log -tslint.json -.eslintrc.js -.eslintignore -.madgerc -.swcrc -.cache -coverage/ -.tsbuildinfo -.build/ -!dist/ diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md deleted file mode 100644 index b35aa94e6..000000000 --- a/packages/cli/CHANGELOG.md +++ /dev/null @@ -1,1628 +0,0 @@ -# @effect-app/cli - -## 2.1.0-beta.41 - -### Patch Changes - -- 8bd5bfe: Update effect packages to `4.0.0-rc.112` (from `beta.107`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`. Sync `repos/effect` subtree from `Effect-TS/effect` at `effect@4.0.0-rc.112`. - - API adaptations for rc.112: - - - cluster encoded driver `resetAddress` → batched `resetAddresses` - - Cosmos `unprocessedMessages` honors optional `limit` / `addresses` (only claimed rows are returned) - - Service Bus `Runners.make` supplies `codecFor` for schema-aware RPC serialization - - `pnpm subtree:effect` passes `--url https://github.com/Effect-TS/effect.git` (published CLI still defaults to effect-smol) - - JSON Schema check constraints are compacted onto the parent (`minLength`/`maxLength` instead of `allOf`) - -## 2.1.0-beta.40 - -### Patch Changes - -- 547e2e1: Update effect packages to `4.0.0-beta.107` (from `beta.90`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`, and `fast-check` to `^4.9.0`. Sync `repos/effect` subtree from `Effect-TS/effect` (effect-smol stopped publishing tags after beta.98). - - API adaptations for beta.107: - - - `concurrency: "inherit"` → `"unbounded"` - - `Schema.ErrorClass` / `TaggedErrorClass` → `Schema.Error` / `TaggedError` - - `Schema.LazyArbitrary` → `Schema.Arbitrary` - - `Schema.DateValid` / `isDateValid` removed (`Schema.Date` rejects invalid dates) - - `SchemaIssue` constructors no longer take `Option` (annotations + input) - - filter meta via `annotations.representation` instead of `annotations.meta` - - `context.defaultValue` → `context.constructorDefault` (single Link) - - Class detection via `~constructor` + static `identifier` - - Redacted detection via `representation.id` - - localized StandardSchema hooks updated for new issue/input model - - provide `NodeCrypto.layer` for cluster sqlite tests - - default `sync-effect` subtree URL → `Effect-TS/effect` - -## 2.1.0-beta.39 - -### Patch Changes - -- 68f1b39: Make `effa ue` update Effect and Effect App packages to the highest versions allowed by their existing semver ranges, including compatible prerelease updates. - -## 2.1.0-beta.38 - -### Patch Changes - -- e2c9ebd: Require an explicit `EFFA_GIST_CACHE_ID`, remove cache Gist discovery and automatic creation, and initialize missing company pointer files once. - -## 2.1.0-beta.37 - -### Patch Changes - -- b6dda09: Update effect packages to `4.0.0-beta.90` (from `beta.88`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`. No source changes required — typecheck and tests pass unchanged. - -## 2.1.0-beta.36 - -### Patch Changes - -- e8842aa: Update effect packages to `4.0.0-beta.88` (from `beta.86`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`. Also bump `@effect-app/cli` to `2.1.0-beta.35`. No source changes required — typecheck and tests pass unchanged. - -## 2.1.0-beta.35 - -### Patch Changes - -- ffd140f: Update effect packages to `4.0.0-beta.86` (from `beta.84`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`. No source changes required — typecheck and tests pass unchanged. - -## 2.1.0-beta.34 - -### Patch Changes - -- a354345: Move release tsconfig flattening from publish to pack lifecycle so package configs are restored before registry upload/auth can fail. -- a69da09: Publish from generated staging directories so release-only files are created outside the source package tree. - -## 2.1.0-beta.33 - -### Patch Changes - -- 32f05c8: Remove unused dependency declarations from package manifests. - -## 2.1.0-beta.32 - -### Patch Changes - -- b9312df: Prevent subtree sync commands from importing upstream git tags. - -## 2.1.0-beta.31 - -### Patch Changes - -- e7ad78c: Add `sync-effect-app` to sync vendored Effect App libs by pinned package version. - The command prefers package-version git tags and supports `--ref latest` for main. -- e7ad78c: Sync Effect subtrees from a repository URL without requiring a local git remote. - -## 2.1.0-beta.30 - -### Patch Changes - -- 78d076a: Update effect packages to `4.0.0-beta.84` (`effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`). - -## 2.1.0-beta.29 - -### Patch Changes - -- 3e855bc: Update Effect packages to `4.0.0-beta.83` (from `beta.74`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/sql-sqlite-node`, `@effect/atom-vue`, `@effect/vitest`. - - Adapt the infra workflow engines to beta.83 API changes: - - - `Schema.Defect` is now a constructor function — use `S.Defect()` when building the deferred-exit codec (the bare constant no longer produces a usable schema and crashed `toType`). - - `Workflow` exposes its name as `_tag` instead of `name`. `WorkflowEngineSqlite`/`WorkflowEngineCosmos` now key the registry, codec caches, and persisted `workflow_name` off `workflow._tag`, fixing crash-recovery (stale-lease re-drive previously registered under an `undefined` key and never matched). - -## 2.1.0-beta.28 - -### Patch Changes - -- 55c6572: update packages - -## 2.1.0-beta.27 - -### Patch Changes - -- 7b28548: Add `effa sync --update [--ref ]` to bump the pinned `ref` in `.shared.json` to the latest sha before syncing. Without `--ref` it resolves the shared repo's default branch HEAD; with `--ref` it resolves that ref (branches resolved against `origin/` so you get the latest remote commit). The resolved sha is written back to the lockfile. Omitting `--update` keeps the existing pin-and-sync behaviour. - -## 2.1.0-beta.26 - -### Patch Changes - -- bogus - -## 2.1.0-beta.25 - -### Patch Changes - -- 6138bc7: `effa sync-push`: propagate locally-deleted synced files. Previously, files removed from the consuming project were silently skipped (the loop bailed when `destAbs` didn't exist). Now they're recorded as deletions, `git rm`'d in the cache branch, and listed in the PR body alongside modifications. - -## 2.1.0-beta.24 - -### Minor Changes - -- 07dcd75: Add `effa sync` / `effa sync-diff` / `effa sync-push` subcommands for syncing content (architecture docs, e2e helpers, ts-plugins) from `effect-app/shared` into consuming projects per a project-side `.shared.json` lockfile. - - - `effa sync` — clone/checkout the shared repo at the pinned ref into `~/.cache/effa/shared/`, then copy the artifact map's files into the project (honoring `exclude`). - - `effa sync-diff` — sha256 compare each tracked file against the cache copy; reports `M` (modified locally), `D` (missing from project), `E` (excluded). - - `effa sync-push [--pr] [-m msg] [--branch name]` — branch in the cache off the pinned ref, copy modified project files in, commit, push. Optional `--pr` opens a PR via `gh pr create`. - - Lockfile shape: - - ```json - { - "repo": "github.com/effect-app/shared", - "ref": "", - "artifacts": { "": "" }, - "exclude": [""] - } - ``` - -## 2.1.0-beta.23 - -### Patch Changes - -- b8b9080: update packages - -## 2.1.0-beta.22 - -### Patch Changes - -- 6cfd83d: update effect to latest beta - -## 2.1.0-beta.21 - -### Patch Changes - -- c991be1: update packages - -## 2.1.0-beta.20 - -### Patch Changes - -- 50ce7e6: Replace typescript-eslint with oxlint-tsgolint for type-aware lint. Drop ESLint entirely from non-vue packages (cli, effect-app, infra) — they now use only `oxlint --type-aware`. Vue packages keep ESLint to run `@effect-app/no-await-effect` (no tsgolint equivalent) via `@typescript-eslint/parser` + `vue-eslint-parser`. - -## 2.1.0-beta.19 - -### Patch Changes - -- 505bfa9: Add concurrent decode helper APIs and migrate decode callsites to use them. - - - Add `withDefaultParseOptions` and keep `DefaultParseOptions` centralized. - - Export `decodeEffectConcurrently` and `decodeUnknownEffectConcurrently` from Schema and SchemaParser modules. - - Update repository, queue, client, form, and CLI decode paths to use concurrent decode helpers. - - Keep schema constructors free of hardcoded parse concurrency overrides. - -## 2.1.0-beta.18 - -### Patch Changes - -- c1e73de: - -## 2.1.0-beta.17 - -### Patch Changes - -- 8434b5f: preserve trailing newline when writing package.json files - -## 2.1.0-beta.16 - -### Patch Changes - -- d31253f: Refactor eligible schema classes and tagged classes to Opaque schemas, and migrate constructor call sites to use `.make` for those models. - -## 2.1.0-beta.15 - -### Patch Changes - -- c3299f7: update packages - -## 2.1.0-beta.14 - -### Patch Changes - -- Update effect packages to 4.0.0-beta.52 - -## 2.1.0-beta.13 - -### Minor Changes - -- 97207c0: Add `sync-effect` CLI command to sync the Effect git subtree to the version pinned in package.json manifests. - -## 2.0.1-beta.12 - -### Patch Changes - -- fac725d: update effect to latest beta - -## 2.0.1-beta.11 - -### Patch Changes - -- 8267e7d: update to latest effect - -## 2.0.1-beta.10 - -### Patch Changes - -- 1f9d7da: fix missing toCodecJson usages - -## 2.0.1-beta.9 - -### Patch Changes - -- cec026d: update packages - -## 2.0.1-beta.8 - -### Patch Changes - -- d867272: the return of `Context` - -## 2.0.1-beta.7 - -### Patch Changes - -- 10b55ff: update packages - -## 2.0.1-beta.6 - -### Patch Changes - -- a37aa38: Update to effect beta 43 - -## 2.0.1-beta.5 - -### Patch Changes - -- 8c645d5: update to latest effect - -## 2.0.1-beta.4 - -### Patch Changes - -- 601a1ff: update effect to 4.0.0-beta.37 and drop the Schema Class disableValidation workaround now that the patched effect schema covers it - -## 2.0.1-beta.3 - -### Patch Changes - -- 75c72ee: update effect to 4.0.0-beta.36, adapt to Option revert from A | undefined - -## 2.0.1-beta.2 - -### Patch Changes - -- 1c3c541: Update Effect dependencies to 4.0.0-beta.31 across workspace packages. -- de2359d: Update Effect dependencies to 4.0.0-beta.28 across workspace packages. -- 0d72f34: Update Effect dependencies to 4.0.0-beta.29 across workspace packages. - -## 2.0.1-beta.1 - -### Patch Changes - -- 01c70d0: update all teh tings - -## 2.0.1-beta.0 - -### Patch Changes - -- 64786af: Beta25 - -## 2.0.0 - -### Major Changes - -- 7e9e02b: Update to Effect v4 - -## 1.29.2 - -### Patch Changes - -- 5880020: bootstrap - -## 1.29.1 - -### Patch Changes - -- 5d043d3: propagate exit code - -## 1.29.0 - -### Minor Changes - -- 1a102e2: update packages - -## 1.28.1 - -### Patch Changes - -- 358782e: update packages - -## 1.28.0 - -### Minor Changes - -- 07f1de5: update packages and tsconfigs - -## 1.27.0 - -### Minor Changes - -- b8f5e30: update packages - -## 1.26.5 - -### Patch Changes - -- 7da965e: better multi-tenant handling (multi env, different caches) - -## 1.26.4 - -### Patch Changes - -- 36aba87: move gh presence check when logging in because of freakin' services initializations - -## 1.26.3 - -### Patch Changes - -- 25d353c: proper login - -## 1.26.2 - -### Patch Changes - -- 73288cc: move GH check - -## 1.26.1 - -### Patch Changes - -- d1a6901: check gh presence - -## 1.26.0 - -### Minor Changes - -- 2bcc323: add cli gist command to work with github gist files - -## 1.25.0 - -### Minor Changes - -- 6d8c512: update packages - -## 1.24.0 - -### Minor Changes - -- 3d49d81: update packages - -## 1.23.25 - -### Patch Changes - -- e31d54f: remove out of date wiki commands - -## 1.23.24 - -### Patch Changes - -- f35da3c: porting more to eslint shared config package - -## 1.23.23 - -### Patch Changes - -- 8096576: new eslint shared config package - -## 1.23.22 - -### Patch Changes - -- a3ac3bb: fix export (?) - -## 1.23.21 - -### Patch Changes - -- f9aee77: some fixes - -## 1.23.20 - -### Patch Changes - -- f6a3328: export base eslint files so that we import them in projects - -## 1.23.19 - -### Patch Changes - -- 539e2f2: minor wiki command enhancements - -## 1.23.18 - -### Patch Changes - -- 84be367: add command to update all but effect/effect-app packages - -## 1.23.17 - -### Patch Changes - -- d1dd883: other fml fixes - -## 1.23.16 - -### Patch Changes - -- ccbf803: fml - -## 1.23.15 - -### Patch Changes - -- 8994599: fix some wiki commands - -## 1.23.14 - -### Patch Changes - -- 2cad28a: some fixes to wiki commands - -## 1.23.13 - -### Patch Changes - -- d9280c7: fix init wiki - -## 1.23.12 - -### Patch Changes - -- 9ff7964: add wiki-init - -## 1.23.11 - -### Patch Changes - -- 7c2e428: pnpm effa wiki update - -## 1.23.10 - -### Patch Changes - -- 8133014: cli doc always fetch remote to not miss any update (like github wiki interface ones) - -## 1.23.9 - -### Patch Changes - -- 35f8488: fix sync cli command - -## 1.23.8 - -### Patch Changes - -- 5576081: cli command for interacting with wiki (v1) - -## 1.23.7 - -### Patch Changes - -- 8cb893c: dprint rules the world - -## 1.23.6 - -### Patch Changes - -- e81f093: remove watch add nuke - -## 1.23.5 - -### Patch Changes - -- de35a0f: add monitors for packagejson -- 8e1543e: add wrapping of child commands - -## 1.23.4 - -### Patch Changes - -- ca792d7: add some debug prints - -## 1.23.3 - -### Patch Changes - -- 62b36b0: fix monitors blocking next commands by forking them - -## 1.23.2 - -### Patch Changes - -- c12a49b: effect app cli to effect cli - -## 1.23.1 - -### Patch Changes - -- 20293b1: add ncu:effect and ncu:effect-app commands - -## 1.23.0 - -### Minor Changes - -- 0f2b2cf: update packages - -## 1.22.1 - -### Patch Changes - -- b095bb5: tscp - -## 1.22.0 - -### Minor Changes - -- 2c217ce: update packages - -## 1.21.1 - -### Patch Changes - -- b771967: update packages - -## 1.21.0 - -### Minor Changes - -- eac9c67: update packages - -## 1.20.1 - -### Patch Changes - -- 49d93a5: update packages - -## 1.20.0 - -### Minor Changes - -- b1d4af4: housekeeping: update packages - -## 1.19.0 - -### Minor Changes - -- 8cb33d5: update packages - -## 1.18.5 - -### Patch Changes - -- 1e1f32b: housekeeping: update packages - -## 1.18.4 - -### Patch Changes - -- update packages - -## 1.18.3 - -### Patch Changes - -- 0fcab38: update packages - -## 1.18.2 - -### Patch Changes - -- ae71bd9: add missing link for vue-componentsy - -## 1.18.1 - -### Patch Changes - -- fdb1107: filter dir - -## 1.18.0 - -### Minor Changes - -- 14ea804: housekeeping: update packages - -## 1.17.1 - -### Patch Changes - -- 4c8dfb4: update packages - -## 1.17.0 - -### Minor Changes - -- e42d5fb: update to effect 3.14 with native rpc2 - -## 1.16.2 - -### Patch Changes - -- 36996ed: housekeeping: update packages - -## 1.16.1 - -### Patch Changes - -- 63e966a: update packages - -## 1.16.0 - -### Minor Changes - -- 8be2984: housekeeping: update packages - -## 1.15.0 - -### Minor Changes - -- 1721761: improve: only update nearest controllers/routes.ts - -## 1.14.0 - -### Minor Changes - -- 9b2e385: update packages - -## 1.13.2 - -### Patch Changes - -- 9d11dfb: housekeeping: update packages - -## 1.13.1 - -### Patch Changes - -- ab9d1ea: housekeeping: update packages - -## 1.13.0 - -### Minor Changes - -- c8ebfb4: update packages - -## 1.12.0 - -### Minor Changes - -- 67023f8: kill \_cjs - -## 1.11.4 - -### Patch Changes - -- 9f504c6: update packages - -## 1.11.3 - -### Patch Changes - -- 750b46a: update packages - -## 1.11.2 - -### Patch Changes - -- 1bfc3d8: update packages - -## 1.11.1 - -### Patch Changes - -- 5ef6481: update packages - -## 1.11.0 - -### Minor Changes - -- 29a1a65: update packages - -## 1.10.0 - -### Minor Changes - -- d84aef7: update packages - -## 1.9.0 - -### Minor Changes - -- cc2c43e: update packages - -## 1.8.0 - -### Minor Changes - -- bump - -## 1.7.1 - -### Patch Changes - -- c971d73: update packages - -## 1.7.0 - -### Minor Changes - -- update - -## 1.6.0 - -### Minor Changes - -- f19762b: update packages - -## 1.5.1 - -### Patch Changes - -- 31c79d7: exit - -## 1.5.0 - -### Minor Changes - -- 4728346: add 'sync' command - -## 1.4.1 - -### Patch Changes - -- 412cb3d: update packages - -## 1.4.0 - -### Minor Changes - -- 590e5bf: update packages - -## 1.3.0 - -### Minor Changes - -- d4ab73f: update packages - -## 1.2.1 - -### Patch Changes - -- 19ea035: update packages - -## 1.2.0 - -### Minor Changes - -- d5623a6: update packages - -## 1.1.2 - -### Patch Changes - -- f68dbd2: update packages - -## 1.1.1 - -### Patch Changes - -- a66651b: m - -## 1.1.0 - -### Minor Changes - -- 964b0d2: refactor: merge adapters into infra - -## 1.0.0 - -### Major Changes - -- 13abe12: refactor: merge core into prelude - -## 0.90.0 - -### Minor Changes - -- d0471b1: refactor: merge @effect-app/schema into core - -## 0.89.0 - -### Minor Changes - -- 3872061: migrate to effect/Schema - -## 0.88.0 - -### Minor Changes - -- 480f0ef: add new controller setup support - -## 0.87.1 - -### Patch Changes - -- cda1477: update packages - -## 0.87.0 - -### Minor Changes - -- update packages - -## 0.86.0 - -### Minor Changes - -- c56949e: drop fluent extensions - -## 0.85.0 - -### Minor Changes - -- b9b64b8: housekeeping: update packages - -## 0.84.0 - -### Minor Changes - -- 65dcc73: update packages - -## 0.83.0 - -### Minor Changes - -- 4d2b804: housekeeping: update packages - -## 0.82.0 - -### Minor Changes - -- 190b139: update packages - -## 0.81.1 - -### Patch Changes - -- c710953: update packagesy - -## 0.81.0 - -### Minor Changes - -- 1018e58: update packages - -## 0.80.1 - -### Patch Changes - -- 11982eb: fix cli - -## 0.80.0 - -### Minor Changes - -- c5f5223: update packages - -## 0.79.3 - -### Patch Changes - -- e6eecd2: update packages - -## 0.79.2 - -### Patch Changes - -- ff - -## 0.79.1 - -### Patch Changes - -- fix - -## 0.79.0 - -### Minor Changes - -- 2143dd9: update packages - -## 0.78.1 - -### Patch Changes - -- f6066ac: update packages - -## 0.78.0 - -### Minor Changes - -- 79f58af: update packages - -## 0.77.2 - -### Patch Changes - -- b3ebc41: update packages - -## 0.77.1 - -### Patch Changes - -- f569681: update packages - -## 0.77.0 - -### Minor Changes - -- 613c148: update packages - -## 0.76.0 - -### Minor Changes - -- 8d0c511: update packages - -## 0.75.0 - -### Minor Changes - -- 9cc6f86: update packages - -## 0.74.1 - -### Patch Changes - -- 2c661c1: update packages - -## 0.74.0 - -### Minor Changes - -- 9ac9416: update packages - -## 0.73.2 - -### Patch Changes - -- 3411e78: update packages - -## 0.73.1 - -### Patch Changes - -- 128f636: update packages - -## 0.73.0 - -### Minor Changes - -- 2e29520: update packages - -## 0.72.1 - -### Patch Changes - -- c4dbb6c: update packages - -## 0.72.0 - -### Minor Changes - -- 0d1b378: update to latest schema - -## 0.71.0 - -### Minor Changes - -- 290a709: update packages - -## 0.70.0 - -### Minor Changes - -- ecb05f6: update packages - -## 0.69.0 - -### Minor Changes - -- revert form changes - -## 0.68.0 - -### Minor Changes - -- a9a81a1: cleanup ext - -## 0.67.2 - -### Patch Changes - -- fix - -## 0.67.1 - -### Patch Changes - -- 8dc2b62: improve link - -## 0.67.0 - -### Minor Changes - -- 7a3f05c: update packages - -## 0.66.0 - -### Minor Changes - -- bbaa558: bs - -## 0.65.0 - -### Minor Changes - -- e5b0d8e: update packages -- 2e2fa98: update packages - -## 0.64.0 - -### Minor Changes - -- 494842c: update packages - -## 0.63.1 - -### Patch Changes - -- 0334285: update packages - -## 0.63.0 - -### Minor Changes - -- 51253a2: update packages - -## 0.62.0 - -### Minor Changes - -- update packages - -## 0.61.0 - -### Minor Changes - -- d0a1774: update ts to 5.4.1-rc - -## 0.60.0 - -### Minor Changes - -- 7346691: update packages - -## 0.59.0 - -### Minor Changes - -- e8e8ee2: update packages - -## 0.58.0 - -### Minor Changes - -- 117be64: bump - -## 0.57.0 - -### Minor Changes - -- A new day - -## 0.56.0 - -### Minor Changes - -- c070e0d: update effect - -## 0.55.1 - -### Patch Changes - -- b7daa54: improve supported commands prompt - -## 0.55.0 - -### Minor Changes - -- db67c43: update bins - -## 0.54.0 - -### Minor Changes - -- 57fcfef: update packages - -## 0.53.2 - -### Patch Changes - -- 1168eb4: add link/unlink - -## 0.53.1 - -### Patch Changes - -- c550140: fix - -## 0.53.0 - -### Minor Changes - -- 25123dc: improve cli frontend - -## 0.52.0 - -### Minor Changes - -- 6e5c606: cl - -## 0.51.0 - -### Minor Changes - -- de336f6: src - -## 0.50.1 - -### Patch Changes - -- f10e630: update packages - -## 0.50.0 - -### Minor Changes - -- 47f46f0: use actual action name casing so that editor go to works. - -## 0.49.1 - -### Patch Changes - -- 7b40fa7: use full path - -## 0.49.0 - -### Minor Changes - -- m - -## 0.48.0 - -### Minor Changes - -- bs - -## 0.47.0 - -### Minor Changes - -- c8a07bc: fix path - -## 0.46.0 - -### Minor Changes - -- e5cdd42: update packages - -## 0.45.0 - -### Minor Changes - -- update to latest Effect "minor" - -## 0.44.0 - -### Minor Changes - -- c29b6ff: bump - -## 0.43.0 - -### Minor Changes - -- bump - -## 0.42.1 - -### Patch Changes - -- 0a898f8: update packages - -## 0.42.0 - -### Minor Changes - -- 449b343: update packages - -## 0.41.0 - -### Minor Changes - -- 2fd03d3: update packages - -## 0.40.0 - -### Minor Changes - -- a30db88: update packages - -## 0.39.0 - -### Minor Changes - -- 3eb4057: update packages - -## 0.38.0 - -### Minor Changes - -- 4c915ea: update packages - -## 0.37.0 - -### Minor Changes - -- a894a63: update packages - -## 0.36.0 - -### Minor Changes - -- 7945f38: update packages - -## 0.35.0 - -### Minor Changes - -- 63425a7: update packages - -## 0.34.0 - -### Minor Changes - -- 82f0f0d: update packages - -## 0.33.1 - -### Patch Changes - -- cf6ae3c: update packages - -## 0.33.0 - -### Minor Changes - -- 46bd7be: update packages - -## 0.32.0 - -### Minor Changes - -- a681ab6: update packages - -## 0.31.0 - -### Minor Changes - -- a9e8b8f: update packages - -## 0.30.0 - -### Minor Changes - -- align v - -## 0.29.0 - -### Minor Changes - -- align v - -## 0.28.0 - -### Minor Changes - -- 1f6b9a1: update packages - -## 0.27.0 - -### Minor Changes - -- c528c33: initial alignment of Schema with effect/schema - -## 0.26.0 - -### Minor Changes - -- 6c180253: cleanup - -## 0.25.1 - -### Patch Changes - -- 7ff1f6f9: update packages - -## 0.25.0 - -### Minor Changes - -- 0a4bfbc7: update packages - -## 0.24.0 - -### Minor Changes - -- 90af6a41: update packages - -## 0.23.1 - -### Patch Changes - -- aa3c98d1: update packages - -## 0.23.0 - -### Minor Changes - -- update packages - -## 0.22.1 - -### Patch Changes - -- 780a6718: update packages - -## 0.22.0 - -### Minor Changes - -- housekeeping: update packages - -## 0.21.2 - -### Patch Changes - -- 838eeb10: update packages - -## 0.21.1 - -### Patch Changes - -- fix tsplus.config for pnpm - -## 0.21.0 - -### Minor Changes - -- update packages - -## 0.20.0 - -### Minor Changes - -- add match and update packages - -## 0.19.0 - -### Minor Changes - -- update packages - -## 0.18.0 - -### Minor Changes - -- housekeeping: update packages - -## 0.17.0 - -### Minor Changes - -- c80b9e7a: Updated to latest Effect - -## 0.16.0 - -### Minor Changes - -- housekeeping: update packages - -## 0.15.0 - -### Minor Changes - -- Update packages - -## 0.14.0 - -### Minor Changes - -- Update depdendencies - -## 0.13.0 - -### Minor Changes - -- update dependencies - -## 0.12.0 - -### Minor Changes - -- Update dependencies - -## 0.11.0 - -### Minor Changes - -- Update packages - -## 0.10.0 - -### Minor Changes - -- update dependencies - -## 0.9.0 - -### Minor Changes - -- Update packages - -## 0.8.0 - -### Minor Changes - -- Update to latest effect - -## 0.7.0 - -### Minor Changes - -- Update packages - -## 0.6.0 - -### Minor Changes - -- update packages - -## 0.5.0 - -### Minor Changes - -- Update tsplus with companion instance extensions - -## 0.4.0 - -### Minor Changes - -- Update Effect - -## 0.3.1 - -### Patch Changes - -- 02997e8f: FUP - -## 0.3.0 - -### Minor Changes - -- 4d49f303: Upgrade to @effect/data - -## 0.2.7 - -### Patch Changes - -- 82a54d23: Cleanup - -## 0.2.6 - -### Patch Changes - -- 89ee2cc5: Add root index.ts support - -## 0.2.5 - -### Patch Changes - -- 9ae82030: fix index - -## 0.2.4 - -### Patch Changes - -- fe896f8c: Fix m - -## 0.2.3 - -### Patch Changes - -- 5a37df3f: Improve cli - -## 0.2.2 - -### Patch Changes - -- 1cd7bbd9: write package.json at start - -## 0.2.1 - -### Patch Changes - -- 847c1eb0: Improve cli dirs - -## 0.2.0 - -### Minor Changes - -- Update annotations and leverage ForceLazy on Effect \_\_call - -## 0.1.6 - -### Patch Changes - -- 912ba66c: Update packages - -## 0.1.5 - -### Patch Changes - -- 2cc4390c: Fix cli - -## 0.1.4 - -### Patch Changes - -- dccdfe2a: cli: add packagejson levels - -## 0.1.3 - -### Patch Changes - -- 2946e475: Fix - -## 0.1.2 - -### Patch Changes - -- 5fd3e5f5: Add package json exports support - -## 0.1.1 - -### Patch Changes - -- f8d2dea7: Add index commands - -## 0.1.0 - -### Minor Changes - -- 9150d615: Prepare CLI for multi-command - -## 0.0.2 - -### Patch Changes - -- Initial release diff --git a/packages/cli/bin.js b/packages/cli/bin.js deleted file mode 100755 index 9c4ff2202..000000000 --- a/packages/cli/bin.js +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -import "@effect-app/cli" diff --git a/packages/cli/package.json b/packages/cli/package.json deleted file mode 100644 index a1961b63f..000000000 --- a/packages/cli/package.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "name": "@effect-app/cli", - "version": "2.1.0-beta.41", - "license": "MIT", - "type": "module", - "repository": { - "type": "git", - "url": "https://github.com/effect-app/libs.git", - "directory": "packages/cli" - }, - "bin": { - "effect-app": "./bin.js", - "effa": "./bin.js", - "effect-app-cli": "./bin.js" - }, - "dependencies": { - "@effect/platform-node": "4.0.0-rc.114", - "effect": "4.0.0-rc.114", - "js-yaml": "4.2.0" - }, - "devDependencies": { - "@types/js-yaml": "^4.0.9", - "@types/node": "25.9.1", - "typescript": "npm:@typescript/native-preview@beta", - "vitest": "^4.1.7" - }, - "typesVersions": { - "*": { - "*": [ - "dist/*" - ] - } - }, - "exports": { - ".": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" - }, - "./argv-patch": { - "types": "./dist/argv-patch.d.ts", - "default": "./dist/argv-patch.js" - }, - "./extract": { - "types": "./dist/extract.d.ts", - "default": "./dist/extract.js" - }, - "./gist": { - "types": "./dist/gist.d.ts", - "default": "./dist/gist.js" - }, - "./os-command": { - "types": "./dist/os-command.d.ts", - "default": "./dist/os-command.js" - }, - "./shared": { - "types": "./dist/shared.d.ts", - "default": "./dist/shared.js" - }, - "./sync-effect-subtree": { - "types": "./dist/sync-effect-subtree.d.ts", - "default": "./dist/sync-effect-subtree.js" - }, - "./sync-effect-app-subtree": { - "types": "./dist/sync-effect-app-subtree.d.ts", - "default": "./dist/sync-effect-app-subtree.js" - }, - "./sync-shared": { - "types": "./dist/sync-shared.d.ts", - "default": "./dist/sync-shared.js" - } - }, - "scripts": { - "watch": "pnpm build:tsc -w", - "build:tsc": "pnpm clean-dist && pnpm check", - "check": "tsgo --build", - "build": "pnpm build:tsc", - "watch2": "pnpm clean-dist && NODE_OPTIONS=--max-old-space-size=6144 tsgo -w", - "clean": "rm -rf dist", - "clean-dist": "sh ../../scripts/clean-dist.sh", - "circular": "pnpm circular:src && pnpm circular:dist", - "circular:src": "madge --circular --ts-config ./tsconfig.json --extensions ts ./src", - "circular:dist": "madge --circular --extensions js ./dist", - "compile": "NODE_OPTIONS=--max-old-space-size=6144 tsgo --noEmit", - "lint": "oxlint --quiet --type-aware ./src && pnpm exec dprint check --config ../../dprint.jsonc .", - "lint-fix": "oxlint --quiet --type-aware --fix ./src && pnpm exec dprint fmt --config ../../dprint.jsonc .", - "test": "vitest", - "test:run": "pnpm run test run --passWithNoTests", - "testsuite": "pnpm lint && pnpm circular && pnpm run test:run", - "ncu": "ncu", - "pub": "pnpm publish --access public", - "prepack": "node ../../scripts/stagePublishPackage.mjs prepack", - "postpack": "node ../../scripts/stagePublishPackage.mjs postpack", - "postpublish": "node ../../scripts/stagePublishPackage.mjs postpublish" - }, - "gitHead": "bd8e27eea3eff97db8739d577d67e7336c078d28", - "sideEffects": [ - "./dist/faker.js", - "./faker", - "./src/faker", - "./dist/faker", - "./dist/src/faker.js", - "./dist/faker.js" - ], - "publishConfig": { - "directory": ".publish", - "linkDirectory": false - } -} diff --git a/packages/cli/src/argv-patch.ts b/packages/cli/src/argv-patch.ts deleted file mode 100644 index aacb0f1b0..000000000 --- a/packages/cli/src/argv-patch.ts +++ /dev/null @@ -1,16 +0,0 @@ -// Join wrap args into a single argv element so that -// `effect-app-cli index-multi tsc --build` works without quoting. -// The new effect/unstable/cli lexer classifies --flags as LongOption tokens -// and discards unrecognized ones at the subcommand level. -// By joining all args after the subcommand into one string, the lexer -// sees a single Value token instead of separate LongOption tokens. - -const wrapCommands = new Set(["index-multi", "packagejson", "packagejson-packages"]) - -export const patchArgvForWrapCommands = (argv: Array): void => { - const subIdx = argv.findIndex((a, i) => i >= 2 && wrapCommands.has(a)) - if (subIdx === -1 || subIdx + 1 >= argv.length) return - - const wrapArgs = argv.splice(subIdx + 1) - argv.push(wrapArgs.join(" ")) -} diff --git a/packages/cli/src/extract.ts b/packages/cli/src/extract.ts deleted file mode 100644 index ecc940ae2..000000000 --- a/packages/cli/src/extract.ts +++ /dev/null @@ -1,75 +0,0 @@ -import * as EffectArray from "effect/Array" -import * as Effect from "effect/Effect" -import * as FileSystem from "effect/FileSystem" -import { pipe } from "effect/Function" -import * as Order from "effect/Order" -import * as Path from "effect/Path" -import type * as PlatformError from "effect/PlatformError" - -/** - * Generates package.json exports mappings for TypeScript modules - * This function finds all .ts files in src/ (excluding test files) and generates - * JSON export entries that map source files to their compiled .js and .d.ts outputs - * - * Example output: - * "./utils/helper": { "types": "./dist/utils/helper.d.ts", "default": "./dist/utils/helper.js" }, - * - * This allows users to import individual modules instead of the entire package: - * import { helper } from 'package/utils/helper' instead of 'package' - */ -export const ExtractExportMappingsService = Effect.fn("effa-cli.extractExportMappings")(function*() { - const fs = yield* FileSystem.FileSystem - const path = yield* Path.Path - - return Effect.fn("effa-cli.extractExportMappings.service")(function*(cwd: string) { - // @effect-diagnostics-next-line effectFnOpportunity:off - const findTsFiles = (dir: string): Effect.Effect => - Effect.gen(function*() { - const entries = yield* fs.readDirectory(dir) - - const results = yield* Effect.all( - entries.map(Effect.fnUntraced(function*(entry) { - const fullPath = path.join(dir, entry) - const stat = yield* fs.stat(fullPath) - - if (stat.type === "Directory") { - return yield* findTsFiles(fullPath) - } else if (entry.endsWith(".ts") && !entry.includes(".test.")) { - return [fullPath] - } - return [] - })) - ) - - return EffectArray.flatten(results) - }) - - const srcDir = path.join(cwd, "src") - - // Check if src directory exists - const srcExists = yield* fs.exists(srcDir) - if (!srcExists) { - return "" - } - - const tsFiles = yield* findTsFiles(srcDir) - - const exportMappings = tsFiles.map((filePath) => { - // Get relative path from src directory (like bash script's cut -c 5-) - const relativePath = path.relative(srcDir, filePath) - const exportKey = `./${relativePath.replace(/\.ts$/, "")}` - const distPath = `./dist/${relativePath.replace(/\.ts$/, ".js")}` - const typesPath = `./dist/${relativePath.replace(/\.ts$/, ".d.ts")}` - - return `"${exportKey}": { "types": "${typesPath}", "default": "${distPath}" }` - }) - - const sortedMappings = pipe( - exportMappings, - EffectArray.sort(Order.String), - EffectArray.join(",\n") - ) - - return sortedMappings - }) -})() diff --git a/packages/cli/src/gist.ts b/packages/cli/src/gist.ts deleted file mode 100644 index 929cf41f8..000000000 --- a/packages/cli/src/gist.ts +++ /dev/null @@ -1,748 +0,0 @@ -/* eslint-disable no-constant-binary-expression */ -/* eslint-disable no-empty-pattern */ -// import necessary modules from the libraries -import * as Array from "effect/Array" -import * as Config from "effect/Config" -import * as Context from "effect/Context" -import * as Data from "effect/Data" -import * as Effect from "effect/Effect" -import * as FileSystem from "effect/FileSystem" -import { pipe } from "effect/Function" -import * as Layer from "effect/Layer" -import * as Option from "effect/Option" -import * as Path from "effect/Path" -import * as Redacted from "effect/Redacted" -import * as Result from "effect/Result" -import * as Schema from "effect/Schema" -import * as SchemaIssue from "effect/SchemaIssue" -import * as SchemaTransformation from "effect/SchemaTransformation" -import * as SynchronizedRef from "effect/SynchronizedRef" - -import * as yaml from "js-yaml" -import path from "path" -import { RunCommandService } from "./os-command.js" - -export class GistError extends Data.TaggedError("GistError")<{ message: string }> {} - -// -// -// Schemas -// - -export class GistEntry extends Schema.Opaque()(Schema.Struct({ - description: Schema.String, - public: Schema.Boolean, - company: Schema.String, - files: Schema.Array(Schema.String) -})) {} - -/** - * Extended gist entry that validates file_name uniqueness and extracts base filenames. - * - * GitHub Gists have a flat file structure and do not support directories/folders. - * All files within a gist must exist in the same namespace, meaning that files - * with identical names will collide, even if they originate from different local - * directories. When multiple files share the same basename, GitHub will either: - * - Reject the gist creation - * - Silently overwrite files (last one wins) - * - Display unpredictable behavior - * - * This validation prevents such collisions by detecting when multiple file paths - * would result in the same file_name when flattened to the gist structure. - * - * @example - * // These paths would collide in a gist - * ["src/config.json", "dist/config.json"] // Both become "config.json" - * - * @see {@link https://docs.github.com/articles/creating-gists | GitHub Gist Documentation} - * @see {@link https://github.com/orgs/community/discussions/29584 | Community Discussion on Gist Folder Support} - */ -export class GistEntryDecoded extends Schema.Opaque()( - GistEntry.pipe( - Schema.decodeTo( - Schema.Struct({ - description: Schema.String, - public: Schema.Boolean, - company: Schema.String, - files: Schema.Array(Schema.String), - files_with_name: Schema.Array(Schema.Struct({ - path: Schema.String, - name: Schema.String - })) - }), - SchemaTransformation.transformEffect({ - decode: Effect.fnUntraced(function*(entry) { - const files_with_name = entry.files.map((file) => ({ - path: file, - name: path.basename(file) // <-- I'm using Node's path module here so that this schema works without requirements on Effect's Path module - })) - - // check for duplicate file names - const nameMap = new Map() - for (const { name, path: filePath } of files_with_name) { - if (!nameMap.has(name)) { - nameMap.set(name, []) - } - nameMap.get(name)!.push(filePath) - } - - // find duplicates and collect all collision messages - const messages: string[] = [] - for (const [fileName, paths] of nameMap.entries()) { - if (paths.length > 1) { - messages.push( - `Duplicate file name detected: "${fileName}". Colliding paths: ${paths.join(", ")}` - ) - } - } - - // if there are any collisions, fail with a combined message - if (messages.length > 0) { - return yield* Effect.fail( - new SchemaIssue.InvalidValue({ message: messages.join("; ") }, entry.files) - ) - } - - return yield* Effect.succeed({ ...entry, files_with_name }) - }), - encode: ({ files_with_name: _, ...entry }) => Effect.succeed(entry) - }) - ) - ) -) {} - -export class GistYAML extends Schema.Opaque()(Schema.Struct({ - gists: Schema.optional(Schema.NullOr( - Schema.Record(Schema.String, GistEntryDecoded) - )), - settings: Schema.Struct({ - token_env: Schema.String, - base_directory: Schema.String - }) -})) {} - -/** - * Cache entry representing a gist mapping. - * Each entry contains the gist's human-readable name and GitHub ID. - */ -export class GistCacheEntry extends Schema.Opaque()(Schema.Struct({ - name: Schema.String, - id: Schema.String -})) {} - -export const GistCacheEntries = Schema.Array(GistCacheEntry) -export interface GistCacheEntries extends Schema.Schema.Type {} - -/** - * Gist cache mapping YAML configuration names to GitHub gist IDs with company awareness. - * - * Since GitHub gists don't have user-defined names, we maintain a cache - * that maps the human-readable names from our YAML config to actual gist IDs. - * Each cache entry is associated with a company, enabling multi-tenant operations. - * This allows us to: - * - Update existing gists instead of creating duplicates - * - Clean up obsolete entries when gists are removed from config - * - Persist the name->ID mapping across CLI runs - * - Isolate gist operations by company context - * - * The cache itself is stored as a secret GitHub gist for persistence. - */ -export class GistCache { - entries: GistCacheEntries - gist_id: string - - company: string - - constructor({ company, entries, gist_id }: { entries: GistCacheEntries; gist_id: string; company: string }) { - this.entries = entries - this.gist_id = gist_id - this.company = company - } -} - -// -// -// Errors -// -class GistYAMLError extends Data.TaggedError("GistYAMLError")<{ - readonly message: string -}> {} - -// -// -// Services -// - -export class GHGistService extends Context.Service()("GHGistService", { - make: Effect.gen(function*() { - const { runGetExitCode, runGetString } = yield* RunCommandService - - // the client cannot recover from PlatformErrors, so we convert failures into defects to clean up the signatures - const runGetExitCodeSuppressed = (...args: Parameters) => { - return runGetExitCode(...args).pipe( - Effect.mapError((e) => `Command failed: ${args.join(" ")}\nError: ${e.message}`), - Effect.orDie, - Effect.asVoid - ) - } - - // the client cannot recover from PlatformErrors, so we convert failures into defects to clean up the signatures - const runGetStringSuppressed = (...args: Parameters) => { - return runGetString(...args).pipe( - Effect.mapError((e) => `Command failed: ${args.join(" ")}\nError: ${e.message}`), - Effect.orDie - ) - } - - /** - * Extracts the Gist ID from a given GitHub Gist URL: https://gist.github.com/user/ID - * @param url - The full URL of the GitHub Gist. - * @returns An Option containing the Gist ID if extraction is successful, otherwise None. - */ - function extractGistIdFromUrl(url: string) { - const gist_id = url.trim().split("/").pop() - return gist_id && gist_id.length > 0 ? Option.some(gist_id) : Option.none() - } - - const loadGistCache = Effect.fn("effa-cli.gist.loadGistCache")( - function*(cacheGistId: string, company: string) { - const filesInCache = yield* runGetStringSuppressed(`gh gist view ${cacheGistId} --files`).pipe( - Effect.map((files) => - files - .trim() - .split("\n") - .map((f) => f.trim()) - ) - ) - - if (!filesInCache.includes(`${company}.json`)) { - yield* Effect.logInfo(`Cache for company ${company} not found, creating company-specific cache file...`) - yield* runGetStringSuppressed( - `echo "[]" | gh gist edit ${cacheGistId} -a ${company}.json -` - ) - return new GistCache({ entries: [], gist_id: cacheGistId, company }) - } - - const cacheContent = yield* runGetStringSuppressed(`gh gist view ${cacheGistId} -f "${company}.json"`) - - const entries = yield* pipe( - cacheContent, - Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.toCodecJson(GistCacheEntries))), - Effect.orDie - ) - - return new GistCache({ entries, gist_id: cacheGistId, company }) - } - ) - - const saveGistCache = Effect.fn("effa-cli.gist.saveGistCache")( - function*(cache: GistCache) { - const cacheJson = yield* pipe( - cache.entries, - Schema.encodeUnknownEffect(Schema.fromJsonString(Schema.toCodecJson(GistCacheEntries))), - // cannot recover from parse errors in any case, better to die here instead of cluttering the signature - Effect.orDie - ) - - yield* runGetExitCodeSuppressed( - `echo '${cacheJson}' | gh gist edit ${cache.gist_id} -f ${cache.company}.json -` - ) - } - ) - - const createGistWithFiles = Effect.fn("GHGistService.createGistWithFiles")( - function*({ description, env, files, gist_name, is_public }: { - gist_name: string - description: string - files: { - path: string - name: string - }[] - is_public: boolean - env: string - }) { - yield* Effect.logInfo(`Creating gist ${gist_name} with ${files.length} file(s)`) - - const ghCommand = [ - "gh", - "gist", - "create", - `--desc="${description}"`, - is_public ? "--public" : "", - ...files.map((file) => `"${file.path}"`) - ] - .filter((x) => !!x) - .join(" ") - - // create and capture the created gist URL - const gistUrl = yield* runGetStringSuppressed(ghCommand) - - // extract ID from URL - const gistNameId = yield* pipe( - gistUrl, - extractGistIdFromUrl, - Option.match({ - onNone: () => Effect.die(`Failed to extract gist ID from URL: ${gistUrl}`), - onSome: (id) => - Effect - .succeed( - { name: gist_name, id } - ) - .pipe(Effect.tap(Effect.logInfo(`Created gist with ID ${id}`))) - }) - ) - - // rename all files to include environment prefix for multi-environment support - for (const file of files) { - const originalName = file.name - const name_with_env = `${env}.${originalName}` - const ghRenameCommand = [ - "gh", - "gist", - "rename", - gistNameId.id, - originalName, - name_with_env - ] - .join(" ") - - yield* Effect.logInfo(`Renaming file ${originalName} to ${name_with_env} in gist ${gist_name}`) - yield* runGetStringSuppressed(ghRenameCommand) - } - - return gistNameId - } - ) - - const getGistFileNames = Effect.fn("getGistFileNames")( - function*({ env, gist_id, gist_name }: { - gist_id: string - gist_name: string - env: string - }) { - yield* Effect.logInfo(`Retrieving file names from gist ${gist_name} with ID ${gist_id}`) - const output = yield* runGetStringSuppressed(`gh gist view ${gist_id} --files`) - - // filter file names by environment prefix and remove the prefix - // files in gists are prefixed with "env." to support multiple environments - return Array.filterMap(output.trim().split("\n"), (fn) => { - const fnTrimmed = fn.trim() - if (!fnTrimmed.startsWith(env + ".")) return Result.fail(fn) - return Result.succeed(fnTrimmed.substring(env.length + 1)) // remove env prefix and dot - }) - } - ) - - const removeFileFromGist = Effect.fn("removeFileFromGist")( - function*({ env, file_name, gist_id, gist_name }: { - gist_id: string - gist_name: string - file_name: string - env: string - }) { - const name_with_env = `${env}.${file_name}` - yield* Effect.logInfo(`Removing file ${name_with_env} from gist ${gist_name}`) - return yield* runGetExitCodeSuppressed(`gh gist edit ${gist_id} --remove "${name_with_env}"`) - } - ) - - const updateFileOfGist = Effect.fn("updateFileOfGist")( - function*({ env, file_name, file_path, gist_id, gist_name }: { - gist_id: string - gist_name: string - file_name: string - file_path: string - env: string - }) { - const name_with_env = `${env}.${file_name}` - yield* Effect.logInfo(`Updating file ${name_with_env} located at ${file_path} of gist ${gist_name}`) - - // it seems this does not require renaming the file - const editCommand = [ - "gh", - "gist", - "edit", - gist_id, - "-f", - name_with_env, - `"${file_path}"` - ] - .join(" ") - - return yield* runGetExitCodeSuppressed(editCommand) - } - ) - - const addFileToGist = Effect.fn("addFileToGist")( - function*({ env, file, gist_id, gist_name }: { - gist_id: string - gist_name: string - file: { - path: string - name: string - } - env: string - }) { - yield* Effect.logInfo(`Adding file ${file.path} to gist ${gist_name}`) - const editCommand = [ - "gh", - "gist", - "edit", - gist_id, - "-a", - `"${file.path}"` - ] - .join(" ") - - yield* runGetExitCodeSuppressed(editCommand) - - const renameCommand = [ - "gh", - "gist", - "rename", - gist_id, - file.name, - `${env}.${file.name}` - ] - .join(" ") - - yield* Effect.logInfo(`Renaming file ${file.name} to ${env}.${file.name} in gist ${gist_name}`) - return yield* runGetExitCodeSuppressed(renameCommand) - } - ) - - const deleteGist = Effect.fn("deleteGist")( - function*({ gist_id, gist_name }: { gist_id: string; gist_name: string }) { - yield* Effect.logInfo(`Deleting gist ${gist_name} with ID ${gist_id}`) - return yield* runGetExitCodeSuppressed(`gh gist delete ${gist_id}`) - } - ) - - const login = Effect.fn("GHGistService.login")(function*(token: string) { - if ((yield* runGetExitCode("gh --version").pipe(Effect.orDie)) !== 0) { - return yield* Effect.die( - "GitHub CLI (gh) is not installed or not found in PATH. Please install it to use the gist command." - ) - } - - const isLogged = yield* runGetExitCode(`echo ${token} | gh auth login --with-token`).pipe(Effect.orDie) - if (isLogged !== 0) { - return yield* new GistError({ message: "Failed to log in to GitHub CLI with provided token" }) - } else { - yield* Effect.logInfo("Successfully logged in to GitHub CLI") - } - }) - - return { - /** Logs into GitHub using the GitHub CLI. - * This is a prerequisite for other gist operations. - * @param token - The GitHub personal access token with gist permissions - * - * @returns An Effect that succeeds when login is successful - */ - login, - - /** - * Loads company mappings from the configured cache Gist. - * A missing company file is initialized once with an empty mapping. - * - * @returns An Effect that yields the loaded company cache - */ - loadGistCache, - - /** - * Saves the current gist cache state to the GitHub cache gist. - * Updates the existing cache gist with the current mappings of names to gist IDs. - * - * @param cache - The GistCache instance to save - * @returns An Effect that succeeds when the cache is successfully saved - */ - saveGistCache, - - /** - * Creates a new GitHub gist with the specified files and renames them with environment prefixes. - * Generates a GitHub CLI command to create the gist, extracts the resulting gist ID, - * and renames all files with environment prefixes for multi-environment support. - * - * @param gist_name - The human-readable name for this gist (used in cache mapping) - * @param description - The description for the GitHub gist - * @param files - Array of file objects with path and name properties to include in the gist - * @param is_public - Whether the gist should be public or private - * @param env - Environment prefix to prepend to file names (e.g., "local-dev", "prod") - * @returns An Effect that yields a gist entry object with name and id properties - */ - createGistWithFiles, - - /** - * Retrieves file names from a GitHub gist, filtered by environment prefix. - * Fetches the list of files contained in the specified gist and returns only - * those that match the current environment, with the environment prefix removed. - * - * @param gist_id - The GitHub gist ID to retrieve file names from - * @param gist_name - The human-readable name of the gist (for logging purposes) - * @param env - Environment prefix to filter files by (e.g., "local-dev", "prod") - * @returns An Effect that yields an array of file names with environment prefix removed - */ - getGistFileNames, - - /** - * Removes a file from a specified GitHub gist. - * The file name is automatically prefixed with the environment when removing. - * @param gist_id - The ID of the gist to modify - * @param gist_name - The human-readable name of the gist (for logging purposes) - * @param file_name - The base name of the file to remove (without environment prefix) - * @param env - Environment prefix that was used when the file was added - * @returns An Effect that succeeds when the file is removed - */ - removeFileFromGist, - - /** - * Updates a file in a specified GitHub gist. - * The file name is automatically prefixed with the environment when updating. - * @param gist_id - The ID of the gist to modify - * @param gist_name - The human-readable name of the gist (for logging purposes) - * @param file_name - The base name of the file to update (without environment prefix) - * @param file_path - The local path of the file to update in the gist - * @param env - Environment prefix that was used when the file was added - * @returns An Effect that succeeds when the file is updated - */ - updateFileOfGist, - - /** - * Adds a new file to a specified GitHub gist. - * The file is automatically renamed with an environment prefix for multi-environment support. - * @param gist_id - The ID of the gist to modify - * @param gist_name - The human-readable name of the gist (for logging purposes) - * @param file - The file object containing path and name properties - * @param env - Environment prefix to prepend to the file name - * @returns An Effect that succeeds when the file is added and renamed - */ - addFileToGist, - - /** - * Deletes a specified GitHub gist by its ID. - * @param gist_id - The ID of the gist to delete - * @param gist_name - The human-readable name of the gist (for logging purposes) - * @returns An Effect that succeeds when the gist is deleted - */ - deleteGist - } - }) -}) { - static DefaultWithoutDependencies = Layer.effect(this, this.make) - static Default = this.DefaultWithoutDependencies.pipe( - Layer.provide(RunCommandService.Default) - ) -} - -export class GistHandler extends Context.Service()("GistHandler", { - make: Effect.gen(function*() { - const GH = yield* GHGistService - - // I prefer to provide these two only once during the main CLI pipeline setup - const fs = yield* FileSystem.FileSystem - const path = yield* Path.Path - - return { - handler: Effect.fn("effa-cli.gist.GistHandler")(function*({ YAMLPath }: { YAMLPath: string }) { - // load company and environment from environment variables - const CONFIG = yield* Config.all({ - company: Config.String("COMPANY"), - env: Config.String("ENV").pipe(Config.withDefault("local-dev")), - gistCacheId: Config.NonEmptyString("EFFA_GIST_CACHE_ID") - }) - - yield* Effect.logInfo(`Company: ${CONFIG.company}, ENV: ${CONFIG.env}`) - - yield* Effect.logInfo(`Reading configuration from ${YAMLPath}`) - - const configExists = yield* fs.exists(YAMLPath) - if (!configExists) { - return yield* new GistError({ message: `Configuration file not found: ${YAMLPath}` }) - } - - const configFromYaml = yield* pipe( - YAMLPath, - fs.readFileString, - Effect.andThen((content) => - Effect.try({ - try: () => yaml.load(content), - catch(error) { - return new GistYAMLError({ message: `Failed to parse YAML: ${(error as Error).message}` }) - } - }) - ), - Effect.andThen(Schema.decodeUnknownEffect(GistYAML)) - ) - - // load GitHub token securely from environment variable - const redactedToken = yield* Config.Redacted(configFromYaml.settings.token_env) - - yield* Effect.logInfo(`Using GitHub token from environment variable: ${configFromYaml.settings.token_env}`) - yield* Effect.logInfo(`Token loaded: ${redactedToken}`) // this will show in logs - - yield* GH.login(Redacted.value(redactedToken)) - - const cache = yield* SynchronizedRef.make( - yield* GH.loadGistCache(CONFIG.gistCacheId, CONFIG.company) - ) - - // filter YAML gists by company to ensure isolation between different organizations - // this prevents cross-company gist operations and maintains data separation - const thisCompanyGistsFromYaml = Object - .entries(configFromYaml.gists ?? {}) - .filter(([, v]) => v.company === CONFIG.company) - - for ( - const [name, gistConfig] of thisCompanyGistsFromYaml - ) { - const { description, files_with_name, public: is_public } = gistConfig - - yield* Effect.logInfo(`Processing gist ${name}`) - - const filesOnDiskWithFullPath = yield* Effect - .all( - files_with_name.map(Effect.fnUntraced(function*(f) { - const fullPath = path.join(configFromYaml.settings.base_directory, f.path) - const fileExists = yield* fs.exists(fullPath) - - if (!fileExists) { - yield* Effect.logWarning(`File not found: ${fullPath}, skipping...`) - return Option.none() - } - - return Option.some({ - path: fullPath, - name: f.name - }) - })), - { - concurrency: "unbounded" - } - ) - .pipe(Effect.map(Array.getSomes)) - - const gistFromCache = (yield* SynchronizedRef.get(cache)).entries.find((_) => _.name === name) - - // if the gist's name exists in cache, update the existing gist - // otherwise, create a new gist and update the local cache - if (gistFromCache) { - yield* Effect.logInfo(`Updating existing gist ${gistFromCache.name} with ID ${gistFromCache.id}`) - - // get current files in the gist to detect removed files - const gistFileNames = new Set( - yield* GH.getGistFileNames({ - gist_id: gistFromCache.id, - gist_name: gistFromCache.name, - env: CONFIG.env - }) - ) - - const expectedFiles = new Set(filesOnDiskWithFullPath.map(({ name }) => name)) - - // remove files that are no longer in YAML configuration - for (const gf of gistFileNames) { - if (!expectedFiles.has(gf)) { - yield* GH.removeFileFromGist({ - gist_id: gistFromCache.id, - gist_name: gistFromCache.name, - file_name: gf, - env: CONFIG.env - }) - } - } - - // update/add files from configuration - for (const f of filesOnDiskWithFullPath) { - if (gistFileNames.has(f.name)) { - yield* GH.updateFileOfGist({ - gist_id: gistFromCache.id, - gist_name: gistFromCache.name, - file_name: f.name, - file_path: f.path, - env: CONFIG.env - }) - } else { - yield* GH.addFileToGist({ - gist_id: gistFromCache.id, - gist_name: gistFromCache.name, - file: f, - env: CONFIG.env - }) - } - } - } else { - if (filesOnDiskWithFullPath.length !== 0) { - yield* SynchronizedRef.getAndUpdateEffect( - cache, - Effect.fnUntraced(function*(cache) { - return new GistCache({ - gist_id: cache.gist_id, - entries: [ - ...cache.entries, - { - ...(yield* GH.createGistWithFiles({ - gist_name: name, - description, - is_public, - - files: filesOnDiskWithFullPath, - env: CONFIG.env - })) - } - ], - company: cache.company - }) - }) - ) - } else { - yield* Effect.logWarning(`No valid files found for gist ${name}, skipping creation...`) - } - } - } - - // cache cleanup: remove gists that are no longer in YAML configuration - // only affects entries for the current company to maintain isolation - const configGistNames = new Set( - thisCompanyGistsFromYaml - .map(([name]) => name) - ) - - const newCache = yield* SynchronizedRef.updateAndGetEffect( - cache, - Effect.fnUntraced(function*(cache) { - const newEntries = [...cache.entries] - - // remove obsolete cache entries for current company only - // this ensures gists from other companies remain untouched - for (let i = newEntries.length - 1; i >= 0; i--) { - const cacheEntry = newEntries[i] - if (cacheEntry && !configGistNames.has(cacheEntry.name)) { - // delete the actual gist from GitHub - yield* GH.deleteGist({ - gist_id: cacheEntry.id, - gist_name: cacheEntry.name - }) - yield* Effect.logInfo( - `Obsolete gist ${cacheEntry.name} of company ${CONFIG.company} with ID ${cacheEntry.id}) will be removed from cache` - ) - newEntries.splice(i, 1) - } - } - - return { ...cache, entries: newEntries } - }) - ) - - yield* GH.saveGistCache(newCache) - - yield* Effect.logInfo("Gist operations completed") - }) - } - }) -}) { - static DefaultWithoutDependencies = Layer.effect(this, this.make) - static Default = this.DefaultWithoutDependencies.pipe( - Layer.provide(GHGistService.Default) - ) -} diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts deleted file mode 100644 index ff0b07779..000000000 --- a/packages/cli/src/index.ts +++ /dev/null @@ -1,903 +0,0 @@ -/* eslint-disable no-constant-binary-expression */ -/* eslint-disable no-empty-pattern */ -// import necessary modules from the libraries -import { NodeRuntime, NodeServices } from "@effect/platform-node" -import { Argument, Command, Flag, Prompt } from "effect/unstable/cli" - -import * as Effect from "effect/Effect" -import * as FileSystem from "effect/FileSystem" -import * as Layer from "effect/Layer" -import * as Option from "effect/Option" -import * as Path from "effect/Path" -import * as Stream from "effect/Stream" -import { ExtractExportMappingsService } from "./extract.js" -import { GistHandler } from "./gist.js" -import { RunCommandService } from "./os-command.js" -import { packages } from "./shared.js" - -import { patchArgvForWrapCommands } from "./argv-patch.js" -import { syncEffectAppSubtree } from "./sync-effect-app-subtree.js" -import { syncEffectSubtree } from "./sync-effect-subtree.js" -import { syncDiff, syncPush, syncShared } from "./sync-shared.js" -import { makeNcuUpdateCommand } from "./update-packages.js" - -patchArgvForWrapCommands(process.argv) - -NodeRuntime.runMain( - Effect - .fn("effa-cli")(function*() { - const fs = yield* FileSystem.FileSystem - const path = yield* Path.Path - const extractExportMappings = yield* ExtractExportMappingsService - const { runGetExitCode } = yield* RunCommandService - - yield* Effect.addFinalizer(() => Effect.logInfo(`CLI has finished executing`)) - - /** - * Updates effect-app packages within their existing semver ranges using npm-check-updates. - * Runs both at workspace root and recursively in all workspace packages. - */ - const updateEffectAppPackages = Effect.fn("effa-cli.ue.updateEffectAppPackages")(function*() { - const filters = ["effect-app", "@effect-app/*"] - for (const filter of filters) { - yield* runGetExitCode(makeNcuUpdateCommand(filter)) - yield* runGetExitCode(makeNcuUpdateCommand(filter, { recursive: true })) - } - })() - - /** - * Updates Effect ecosystem packages within their existing semver ranges using npm-check-updates. - * Covers core Effect packages, Effect ecosystem packages, and Effect Atom packages. - * Runs both at workspace root and recursively in all workspace packages. - */ - const updateEffectPackages = Effect.fn("effa-cli.ue.updateEffectPackages")(function*() { - const effectFilters = ["effect", "@effect/*", "@effect-atom/*"] - for (const filter of effectFilters) { - yield* runGetExitCode(makeNcuUpdateCommand(filter)) - yield* runGetExitCode(makeNcuUpdateCommand(filter, { recursive: true })) - } - })() - - /** - * Updates all packages except Effect and Effect-App ecosystem packages to their latest versions using npm-check-updates. - * Excludes core Effect packages, Effect ecosystem packages, Effect Atom packages, and Effect-App packages. - * Preserves existing rejections from .ncurc.json configuration. - * Runs both at workspace root and recursively in all workspace packages. - */ - const updatePackages = Effect.fn("effa-cli.update-packages.updatePackages")(function*() { - const effectFilters = ["effect", "@effect/*", "@effect-atom/*", "effect-app", "@effect-app/*"] - - // read existing .ncurc.json to preserve existing reject patterns - let existingRejects: string[] = [] - const ncurcPath = "./.ncurc.json" - - if (yield* fs.exists(ncurcPath)) { - const ncurcContent = yield* fs.readFileString(ncurcPath) - const ncurc = JSON.parse(ncurcContent) - if (ncurc.reject && Array.isArray(ncurc.reject)) { - existingRejects = ncurc.reject - } - } - - const allRejects = [...existingRejects, ...effectFilters] - yield* Effect.logInfo(`Excluding packages from update: ${allRejects.join(", ")}`) - const rejectArgs = allRejects.map((filter) => `--reject "${filter}"`).join(" ") - - yield* runGetExitCode(`pnpm exec ncu -u ${rejectArgs}`) - yield* runGetExitCode(`pnpm -r exec ncu -u ${rejectArgs}`) - })() - - /** - * Links local effect-app packages by adding file resolutions to package.json. - * Updates the package.json with file: protocol paths pointing to the local effect-app-libs directory, - * then runs pnpm install to apply the changes. - * - * @param effectAppLibsPath - Path to the local effect-app-libs directory - * @returns An Effect that succeeds when linking is complete - */ - const linkPackages = Effect.fnUntraced(function*(effectAppLibsPath: string) { - yield* Effect.logInfo("Linking local effect-app packages...") - - const packageJsonPath = "./package.json" - const packageJsonContent = yield* fs.readFileString(packageJsonPath) - const trailingNewline = packageJsonContent.endsWith("\n") ? "\n" : "" - const pj = JSON.parse(packageJsonContent) - - const resolutions = { - ...pj.resolutions, - "@effect-app/eslint-codegen-model": "file:" + effectAppLibsPath + "/packages/eslint-codegen-model", - "effect-app": "file:" + effectAppLibsPath + "/packages/effect-app", - "@effect-app/infra": "file:" + effectAppLibsPath + "/packages/infra", - "@effect-app/vue": "file:" + effectAppLibsPath + "/packages/vue", - "@effect-app/vue-components": "file:" + effectAppLibsPath + "/packages/vue-components", - "@effect-app/eslint-shared-config": "file:" + effectAppLibsPath + "/packages/eslint-shared-config", - ...packages.reduce((acc, p) => { - acc[p] = `file:${effectAppLibsPath}/node_modules/${p}` - return acc - }, {} as Record) - } - - pj.resolutions = resolutions - - yield* fs.writeFileString(packageJsonPath, JSON.stringify(pj, null, 2) + trailingNewline) - yield* Effect.logInfo("Updated package.json with local file resolutions") - - yield* runGetExitCode("pnpm i") - - yield* Effect.logInfo("Successfully linked local packages") - }) - - /** - * Unlinks local effect-app packages by removing file resolutions from package.json. - * Filters out all effect-app related file: protocol resolutions from package.json, - * then runs pnpm install to restore registry packages. - * - * @returns An Effect that succeeds when unlinking is complete - */ - const unlinkPackages = Effect.fnUntraced(function*() { - yield* Effect.logInfo("Unlinking local effect-app packages...") - - const packageJsonPath = "./package.json" - const packageJsonContent = yield* fs.readFileString(packageJsonPath) - const trailingNewline = packageJsonContent.endsWith("\n") ? "\n" : "" - const pj = JSON.parse(packageJsonContent) - - const filteredResolutions = Object.entries(pj.resolutions as Record).reduce( - (acc, [k, v]) => { - if (k.startsWith("@effect-app/") || k === "effect-app" || packages.includes(k)) return acc - acc[k] = v - return acc - }, - {} as Record - ) - - pj.resolutions = filteredResolutions - - yield* fs.writeFileString(packageJsonPath, JSON.stringify(pj, null, 2) + trailingNewline) - yield* Effect.logInfo("Removed effect-app file resolutions from package.json") - - yield* runGetExitCode("pnpm i") - yield* Effect.logInfo("Successfully unlinked local packages") - })() - - /** - * Monitors controller files for changes and runs eslint on related controllers.ts/routes.ts files. - * Watches for .controllers. files and triggers eslint fixes on parent directory's controller files. - * - * @param watchPath - The path to watch for controller changes - * @param debug - Whether to enable debug logging - * @returns An Effect that sets up controller file monitoring - */ - const monitorChildIndexes = Effect.fn("effa-cli.index-multi.monitorChildIndexes")( - function*(watchPath: string) { - yield* Effect.logInfo(`Starting controller monitoring for: ${watchPath}`) - - const watchStream = fs.watch(watchPath) - - yield* watchStream - .pipe( - Stream.runForEach( - Effect.fn("effa-cli.monitorChildIndexes.handleEvent")(function*(event) { - const pathParts = event.path.split("/") - const fileName = pathParts[pathParts.length - 1] - const isController = fileName?.toLowerCase().includes(".controllers.") - - if (!isController) return - - let i = 1 - const reversedParts = pathParts.toReversed() - - while (i < reversedParts.length) { - const candidateFiles = ["controllers.ts", "routes.ts"] - .map((f) => [...pathParts.slice(0, pathParts.length - i), f].join("/")) - - const existingFiles: string[] = [] - for (const file of candidateFiles) { - const exists = yield* fs.exists(file) - if (exists) existingFiles.push(file) - } - - if (existingFiles.length > 0) { - yield* Effect.logInfo( - `Controller change detected: ${event.path}, fixing files: ${existingFiles.join(", ")}` - ) - - const eslintArgs = existingFiles.map((f) => `"../${f}"`).join(" ") - yield* runGetExitCode(`cd api && pnpm eslint --fix ${eslintArgs}`) - break - } - i++ - } - }) - ), - Effect.andThen( - Effect.addFinalizer(() => Effect.logInfo(`Stopped monitoring child indexes in: ${watchPath}`)) - ), - Effect.forkScoped - ) - } - ) - - /** - * Monitors a directory for changes and runs eslint on the specified index file. - * Triggers eslint fixes when any file in the directory changes (except the index file itself). - * - * @param watchPath - The path to watch for changes - * @param indexFile - The index file to run eslint on when changes occur - * @param debug - Whether to enable debug logging - * @returns An Effect that sets up root index monitoring - */ - const monitorRootIndexes = Effect.fn("effa-cli.index-multi.monitorRootIndexes")( - function*(watchPath: string, indexFile: string) { - yield* Effect.logInfo(`Starting root index monitoring for: ${watchPath} -> ${indexFile}`) - - const watchStream = fs.watch(watchPath) - - yield* watchStream - .pipe( - Stream.runForEach( - Effect.fn("effa-cli.index-multi.monitorRootIndexes.handleEvent")(function*(event) { - if (event.path.endsWith(indexFile)) return - - yield* Effect.logInfo(`Root change detected: ${event.path}, fixing: ${indexFile}`) - - yield* runGetExitCode(`pnpm eslint --fix "${indexFile}"`) - }) - ), - Effect.andThen( - Effect.addFinalizer(() => - Effect.logInfo(`Stopped monitoring root indexes in: ${watchPath} -> ${indexFile}`) - ) - ), - Effect.forkScoped - ) - } - ) - - /** - * Sets up comprehensive index monitoring for a given path. - * Combines both child controller monitoring and root index monitoring. - * - * @param watchPath - The path to monitor - * @param debug - Whether to enable debug logging - * @returns An Effect that sets up all index monitoring for the path - */ - const monitorIndexes = Effect.fn("effa-cli.index-multi.monitorIndexes")( - function*(watchPath: string) { - yield* Effect.logInfo(`Setting up index monitoring for path: ${watchPath}`) - - const indexFile = watchPath + "/index.ts" - - const monitors = [monitorChildIndexes(watchPath)] - - if (yield* fs.exists(indexFile)) { - monitors.push(monitorRootIndexes(watchPath, indexFile)) - } else { - yield* Effect.logWarning(`Index file ${indexFile} does not exist`) - } - - yield* Effect.logInfo(`Starting ${monitors.length} monitor(s) for ${watchPath}`) - - yield* Effect.all(monitors, { concurrency: monitors.length }) - } - ) - - /** - * Updates a package.json file with generated exports mappings for TypeScript modules. - * Scans TypeScript source files and creates export entries that map module paths - * to their compiled JavaScript and TypeScript declaration files. - * - * @param startDir - The starting directory path for resolving relative paths - * @param p - The package directory path to process - * @param levels - Optional depth limit for export filtering (0 = no limit) - * @returns An Effect that succeeds when the package.json is updated - */ - const packagejsonUpdater = Effect.fn("effa-cli.packagejsonUpdater")( - function*(startDir: string, p: string, levels = 0) { - yield* Effect.logInfo(`Generating exports for ${p}`) - - const exportMappings = yield* extractExportMappings(path.resolve(startDir, p)) - - // if exportMappings is empty skip export generation - if (exportMappings === "") { - yield* Effect.logInfo(`No src directory found for ${p}, skipping export generation`) - return - } - - const sortedExportEntries = JSON.parse( - `{ ${exportMappings} }` - ) as Record< - string, - unknown - > - - const filteredExportEntries = levels - ? Object - .keys(sortedExportEntries) - // filter exports by directory depth - only include paths up to specified levels deep - .filter((_) => _.split("/").length <= (levels + 1 /* `./` */)) - .reduce( - (prev, cur) => { - prev[cur] = sortedExportEntries[cur] - return prev - }, - {} as Record - ) - : sortedExportEntries - - const packageExports = { - ...((yield* fs.exists(p + "/src/index.ts")) - && { - ".": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" - } - }), - ...Object - .keys(filteredExportEntries) - .reduce( - (prev, cur) => { - // exclude index files and internal modules from package exports: - // - skip "./index" to avoid conflicts with the main "." export - // - skip "/internal/" paths to keep internal modules private - if (cur !== "./index" && !cur.includes("/internal/")) { - prev[cur] = filteredExportEntries[cur] - } - return prev - }, - {} as Record - ) - } - - const pkgJsonContent = yield* fs.readFileString(p + "/package.json", "utf-8") - const trailingNewline = pkgJsonContent.endsWith("\n") ? "\n" : "" - const pkgJson = JSON.parse(pkgJsonContent) - - pkgJson.exports = packageExports - - yield* Effect.logInfo(`Writing updated package.json for ${p}`) - - return yield* fs.writeFileString( - p + "/package.json", - JSON.stringify(pkgJson, null, 2) + trailingNewline - ) - } - ) - - /** - * Monitors a directory for TypeScript file changes and automatically updates package.json exports. - * Generates initial package.json exports, then watches the src directory for changes to regenerate exports. - * - * @param watchPath - The directory path containing the package.json and src to monitor - * @param levels - Optional depth limit for export filtering (0 = no limit) - * @returns An Effect that sets up package.json monitoring - */ - const monitorPackageJson = Effect.fn("effa-cli.monitorPackageJson")( - function*(startDir: string, watchPath: string, levels = 0) { - yield* packagejsonUpdater(startDir, watchPath, levels) - - const srcPath = watchPath === "." ? "./src" : `${watchPath}/src` - - if (!(yield* fs.exists(srcPath))) { - yield* Effect.logWarning(`Source directory ${srcPath} does not exist - skipping monitoring`) - return - } - - const watchStream = fs.watch(srcPath) - - yield* watchStream.pipe( - Stream.runForEach( - Effect.fn("effa-cli.monitorPackageJson.handleEvent")(function*(_) { - yield* packagejsonUpdater(startDir, watchPath, levels) - }) - ), - Effect.andThen( - Effect.addFinalizer(() => Effect.logInfo(`Stopped monitoring package.json for: ${watchPath}`)) - ), - Effect.forkScoped - ) - } - ) - - /* - * CLI - */ - - const WrapAsOption = Flag.String("wrap").pipe( - Flag.withAlias("w"), - Flag.optional, - Flag.withDescription( - "Wrap child bash command: the lifetime of the CLI command will be tied to the child process" - ) - ) - - // has prio over WrapAsOption - const WrapAsArg = Argument - .String("wrap") - .pipe( - Argument.atLeast(1), - Argument.optional, - Argument.withDescription( - "Wrap child bash command: the lifetime of the CLI command will be tied to the child process" - ) - ) - - /** - * Creates a command that automatically includes wrap functionality for executing child bash commands. - * Combines both option-based (--wrap) and argument-based wrap parameters, giving priority to arguments. - * If a wrap command is provided, it will be executed **after** the main command handler. - * - * @param name - The command name - * @param config - The command configuration (options, args, etc.) - * @param handler - The main command handler function - * @param completionMessage - Optional message to log when the command completes - * @returns A Command with integrated wrap functionality - */ - const makeCommandWithWrap = ( - name: Name, - config: Config, - handler: (_: any) => Effect.Effect, - completionMessage?: string - ) => - Command.make( - name, - { ...config, wo: WrapAsOption, wa: WrapAsArg }, - Effect.fn("effa-cli.withWrapHandler")(function*(_) { - const { wa, wo, ...cfg } = _ as unknown as { - wo: Option.Option - wa: Option.Option> - } - - if (completionMessage) { - yield* Effect.addFinalizer(() => Effect.logInfo(completionMessage)) - } - - const wrapOption = Option.orElse(wa, () => wo) - - yield* handler(cfg as any) - - if (Option.isSome(wrapOption)) { - const val: string = Array.isArray(wrapOption.value) - ? wrapOption.value.join(" ") - : wrapOption.value as string - - yield* Effect.logInfo(`Spawning child command: ${val}`) - const exitCode = yield* runGetExitCode(val) - if (exitCode !== 0) { - return yield* Effect.sync(() => process.exit(exitCode)) - } - } - - return - }, (_) => Effect.scoped(_)) - ) - - const EffectAppLibsPath = Argument - .Directory("effect-app-libs-path", { mustExist: true }) - .pipe( - Argument.withDefault("../../effect-app/libs"), - Argument.withDescription("Path to the effect-app-libs directory") - ) - - const link = Command - .make( - "link", - { effectAppLibsPath: EffectAppLibsPath }, - Effect.fn("effa-cli.link")(function*({ effectAppLibsPath }) { - return yield* linkPackages(effectAppLibsPath) - }) - ) - .pipe(Command.withDescription("Link local effect-app packages using file resolutions")) - - const unlink = Command - .make( - "unlink", - {}, - Effect.fn("effa-cli.unlink")(function*({}) { - return yield* unlinkPackages - }) - ) - .pipe(Command.withDescription("Remove effect-app file resolutions and restore npm registry packages")) - - const ue = Command - .make( - "ue", - {}, - Effect.fn("effa-cli.ue")(function*({}) { - yield* Effect.logInfo("Update effect-app and/or effect packages") - - const prompted = yield* Prompt.Select({ - choices: [ - { - title: "effect-app", - description: "Update only effect-app packages", - value: "effect-app" - }, - { - title: "effect", - description: "Update only effect packages", - value: "effect" - }, - { - title: "both", - description: "Update both effect-app and effect packages", - value: "both" - } - ], - message: "Select an option" - }) - - switch (prompted) { - case "effect-app": - return yield* updateEffectAppPackages.pipe( - Effect.andThen(runGetExitCode("pnpm i")) - ) - - case "effect": - return yield* updateEffectPackages.pipe( - Effect.andThen(runGetExitCode("pnpm i")) - ) - case "both": - return yield* updateEffectPackages.pipe( - Effect.andThen(updateEffectAppPackages), - Effect.andThen(runGetExitCode("pnpm i")) - ) - } - }) - ) - .pipe(Command.withDescription("Update effect-app and/or effect packages")) - - const up = Command - .make( - "up", - {}, - Effect.fn("effa-cli.update-packages")(function*({}) { - yield* Effect.logInfo("Updating all packages except Effect/Effect-App ecosystem packages...") - - return yield* updatePackages.pipe( - Effect.andThen(runGetExitCode("pnpm i")) - ) - }) - ) - .pipe(Command.withDescription("Update all packages except Effect/Effect-App ecosystem packages")) - - const indexMulti = makeCommandWithWrap( - "index-multi", - {}, - Effect.fn("effa-cli.index-multi")(function*({}) { - yield* Effect.logInfo("Starting multi-index monitoring") - - const dirs = ["./api/src"] - - const existingDirs: string[] = [] - for (const dir of dirs) { - const dirExists = yield* fs.exists(dir) - if (dirExists) { - existingDirs.push(dir) - } else { - yield* Effect.logWarning(`Directory ${dir} does not exist - skipping`) - } - } - - const monitors = existingDirs.map((dir) => monitorIndexes(dir)) - yield* Effect.all(monitors, { concurrency: monitors.length }) - }), - "Stopped multi-index monitoring" - ) - .pipe( - Command.withDescription( - "Monitor multiple directories for index and controller file changes" - ) - ) - - const packagejson = makeCommandWithWrap( - "packagejson", - {}, - Effect.fn("effa-cli.packagejson")(function*({}) { - // https://nodejs.org/api/path.html#pathresolvepaths - const startDir = path.resolve() - - return yield* monitorPackageJson(startDir, ".") - }), - "Stopped monitoring root package.json exports" - ) - .pipe( - Command.withDescription("Generate and update root-level package.json exports mappings for TypeScript modules") - ) - - const packagejsonPackages = makeCommandWithWrap( - "packagejson-packages", - {}, - Effect.fn("effa-cli.packagejson-packages")(function*({}) { - // https://nodejs.org/api/path.html#pathresolvepaths - const startDir = path.resolve() - - const packagesDir = path.join(startDir, "packages") - - const packagesExists = yield* fs.exists(packagesDir) - if (!packagesExists) { - return yield* Effect.logWarning("No packages directory found") - } - - // get all package directories - const packageDirs = yield* fs.readDirectory(packagesDir) - - const validPackages: string[] = [] - - // filter packages that have package.json and src directory - for (const packageName of packageDirs) { - const packagePath = path.join(packagesDir, packageName) - const packageJsonExists = yield* fs.exists(path.join(packagePath, "package.json")) - const srcExists = yield* fs.exists(path.join(packagePath, "src")) - - const shouldExclude = false - || packageName.endsWith("eslint-codegen-model") - || packageName.endsWith("eslint-shared-config") - || packageName.endsWith("vue-components") - - if (packageJsonExists && srcExists && !shouldExclude) { - validPackages.push(packagePath) - } - } - - yield* Effect.logInfo(`Found ${validPackages.length} packages to update`) - - // update each package sequentially - yield* Effect.all( - validPackages.map( - Effect.fnUntraced(function*(packagePath) { - const relativePackagePath = path.relative(startDir, packagePath) - yield* Effect.logInfo(`Updating ${relativePackagePath}`) - return yield* monitorPackageJson(startDir, relativePackagePath) - }) - ) - ) - - yield* Effect.logInfo("All packages updated successfully") - }), - "Stopped monitoring package.json exports for all packages" - ) - .pipe( - Command.withDescription("Generate and update package.json exports mappings for all packages in monorepo") - ) - - const gist = Command - .make( - "gist", - { - config: Flag.File("config").pipe( - Flag.withDefault("gists.yaml"), - Flag.withDescription("Path to YAML configuration file") - ) - }, - Effect.fn("effa-cli.gist")(function*({ config }) { - const gh = yield* GistHandler - return yield* gh.handler({ - YAMLPath: config - }) - }) - ) - .pipe(Command.withDescription("Create GitHub gists from files specified in YAML configuration")) - - const nuke = Command - .make( - "nuke", - { - dryRun: Flag.Boolean("dry-run").pipe( - Flag.withDescription("Show what would be done without making changes") - ), - storePrune: Flag.Boolean("store-prune").pipe( - Flag.withDescription("Prune the package manager store") - ) - }, - Effect.fn("effa-cli.nuke")(function*({ dryRun, storePrune }) { - yield* Effect.logInfo(dryRun ? "Performing dry run cleanup..." : "Performing nuclear cleanup...") - - if (dryRun) { - yield* runGetExitCode( - "find . -depth \\( -type d \\( -name 'node_modules' -o -name '.nuxt' -o -name 'dist' -o -name '.output' -o -name '.nitro' -o -name '.cache' -o -name 'test-results' -o -name 'test-out' -o -name 'coverage' \\) -print \\) -o \\( -type f \\( -name '*.log' -o -name '*.tsbuildinfo' \\) -print \\)" - ) - } else { - yield* runGetExitCode( - "find . -depth \\( -type d \\( -name 'node_modules' -o -name '.nuxt' -o -name 'dist' -o -name '.output' -o -name '.nitro' -o -name '.cache' -o -name 'test-results' -o -name 'test-out' -o -name 'coverage' \\) -exec rm -rf -- {} + \\) -o \\( -type f \\( -name '*.log' -o -name '*.tsbuildinfo' \\) -delete \\)" - ) - - if (storePrune) { - yield* runGetExitCode( - "pnpm store prune" - ) - } - } - - yield* Effect.logInfo("Cleanup operation completed") - }) - ) - .pipe(Command.withDescription("Nuclear cleanup command: removes all generated files and cleans the workspace")) - - const syncEffect = Command - .make( - "sync-effect", - { - manifests: Flag.String("manifests").pipe( - Flag.withAlias("m"), - Flag.optional, - Flag.withDescription( - "Comma-separated list of package.json paths to scan (default: package.json)" - ) - ), - prefix: Flag.String("prefix").pipe( - Flag.optional, - Flag.withDescription("Subtree prefix (default: repos/effect)") - ), - url: Flag.String("url").pipe( - Flag.optional, - Flag.withDescription( - "Git repository URL (default: https://github.com/Effect-TS/effect.git)" - ) - ) - }, - Effect.fn("effa-cli.sync-effect")(function*({ manifests, prefix, url }) { - yield* syncEffectSubtree({ - manifestPaths: Option.match(manifests, { - onNone: () => ["package.json"], - onSome: (m) => m.split(",").map((p) => p.trim()) - }), - subtreePrefix: Option.getOrElse(prefix, () => "repos/effect"), - url: Option.getOrElse(url, () => "https://github.com/Effect-TS/effect.git") - }) - }) - ) - .pipe(Command.withDescription("Sync the Effect subtree to the version pinned in package.json")) - - const syncEffectApp = Command - .make( - "sync-effect-app", - { - manifests: Flag.String("manifests").pipe( - Flag.withAlias("m"), - Flag.optional, - Flag.withDescription( - "Comma-separated list of package.json paths to scan (default: package.json)" - ) - ), - prefix: Flag.String("prefix").pipe( - Flag.optional, - Flag.withDescription("Subtree prefix (default: repos/libs)") - ), - url: Flag.String("url").pipe( - Flag.optional, - Flag.withDescription( - "Git repository URL (default: https://github.com/effect-app/libs.git)" - ) - ), - ref: Flag.String("ref").pipe( - Flag.optional, - Flag.withDescription("Ref escape hatch (branch/tag/sha/latest); latest means main") - ) - }, - Effect.fn("effa-cli.sync-effect-app")(function*({ manifests, prefix, ref, url }) { - yield* syncEffectAppSubtree({ - manifestPaths: Option.match(manifests, { - onNone: () => ["package.json"], - onSome: (m) => m.split(",").map((p) => p.trim()) - }), - ...Option.match(ref, { - onNone: () => ({}), - onSome: (ref) => ({ ref }) - }), - subtreePrefix: Option.getOrElse(prefix, () => "repos/libs"), - url: Option.getOrElse(url, () => "https://github.com/effect-app/libs.git") - }) - }) - ) - .pipe(Command.withDescription("Sync the Effect App libs subtree to the version pinned in package.json")) - - const SharedLockfileFlag = Flag.File("lockfile").pipe( - Flag.optional, - Flag.withDescription("Path to lockfile (default: .shared.json)") - ) - - const sync = Command - .make( - "sync", - { - lockfile: SharedLockfileFlag, - update: Flag.Boolean("update").pipe( - Flag.withDescription("Bump the pinned ref to the latest sha before syncing") - ), - ref: Flag.String("ref").pipe( - Flag.optional, - Flag.withDescription("Ref (branch/tag/sha) to update to; default: remote default branch HEAD") - ) - }, - Effect.fn("effa-cli.sync")(function*({ lockfile, ref, update }) { - yield* syncShared({ - lockfilePath: Option.getOrElse(lockfile, () => ".shared.json"), - update, - ref: Option.getOrUndefined(ref) - }) - }) - ) - .pipe( - Command.withDescription("Sync shared docs / e2e helpers / plugins from effect-app/shared per .shared.json") - ) - - const syncDiffCmd = Command - .make( - "sync-diff", - { lockfile: SharedLockfileFlag }, - Effect.fn("effa-cli.sync-diff")(function*({ lockfile }) { - yield* syncDiff({ - lockfilePath: Option.getOrElse(lockfile, () => ".shared.json") - }) - }) - ) - .pipe(Command.withDescription("Report drift between local synced files and the pinned shared ref")) - - const syncPushCmd = Command - .make( - "sync-push", - { - lockfile: SharedLockfileFlag, - message: Flag.String("message").pipe( - Flag.withAlias("m"), - Flag.optional, - Flag.withDescription("Commit message for the push") - ), - branch: Flag.String("branch").pipe( - Flag.optional, - Flag.withDescription("Branch name in shared repo (default: auto-generated)") - ), - pr: Flag.Boolean("pr").pipe( - Flag.withDescription("Open a PR via `gh pr create` after pushing") - ) - }, - Effect.fn("effa-cli.sync-push")(function*({ branch, lockfile, message, pr }) { - yield* syncPush({ - lockfilePath: Option.getOrElse(lockfile, () => ".shared.json"), - message: Option.getOrUndefined(message), - branch: Option.getOrUndefined(branch), - pr - }) - }) - ) - .pipe(Command.withDescription("Push locally-modified synced files to the shared repo on a new branch")) - - // configure CLI - return yield* Command.run( - Command - .make("effa") - .pipe(Command.withSubcommands([ - ue, - up, - link, - unlink, - indexMulti, - packagejson, - packagejsonPackages, - gist, - nuke, - syncEffect, - syncEffectApp, - sync, - syncDiffCmd, - syncPushCmd - ])), - { - version: "v1.0.0" - } - ) - })() - .pipe( - Effect.scoped, - Effect.provide( - Layer.provideMerge( - Layer.merge( - GistHandler.Default, - RunCommandService.Default - ), - NodeServices.layer - ) - ) - ) -) diff --git a/packages/cli/src/os-command.ts b/packages/cli/src/os-command.ts deleted file mode 100644 index 6c8e3b48a..000000000 --- a/packages/cli/src/os-command.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* eslint-disable no-constant-binary-expression */ -/* eslint-disable no-empty-pattern */ -import * as Context from "effect/Context" -import * as Effect from "effect/Effect" -import * as Layer from "effect/Layer" -import { ChildProcess } from "effect/unstable/process" -import { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSpawner" - -/** - * Service for executing shell commands using the Effect platform's Command API. - * Provides methods to run shell commands with different output handling strategies. - * All commands are executed through the system shell (/bin/sh) for proper command parsing. - */ -export class RunCommandService extends Context.Service()("RunCommandService", { - make: Effect.gen(function*() { - // will be provided by the main CLI pipeline setup - const spawner = yield* ChildProcessSpawner - - /** - * Executes a shell command using Command API with inherited stdio streams. - * The command is run through the system shell (/bin/sh) for proper command parsing. - * - * @param cmd - The shell command to execute - * @param cwd - Optional working directory to execute the command in - * @returns An Effect that succeeds with the exit code or fails with a PlatformError - */ - const runGetExitCode = (cmd: string, cwd?: string) => - spawner - .exitCode( - ChildProcess.make("sh", ["-c", cmd], { stdout: "inherit", stderr: "inherit", cwd }) - ) - - /** - * Executes a shell command using Command API and returns the output as a string. - * The command is run through the system shell (/bin/sh) for proper command parsing. - * - * @param cmd - The shell command to execute - * @param cwd - Optional working directory to execute the command in - * @returns An Effect that succeeds with the command's stdout output as string or fails with a PlatformError - */ - const runGetString = (cmd: string, cwd?: string) => - spawner - .string( - ChildProcess.make("sh", ["-c", cmd], { cwd }) - ) - - return { - runGetExitCode, - runGetString - } - }) -}) { - static Default = Layer.effect(this, this.make) -} diff --git a/packages/cli/src/shared.ts b/packages/cli/src/shared.ts deleted file mode 100644 index 6aade80bb..000000000 --- a/packages/cli/src/shared.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const packages = ["effect", "@effect/platform", "@effect/platform-node"] - -export const EFFECT_APP_LIBS = process.env["EFFECT_APP_LIBS"] || "../../effect-app/libs" diff --git a/packages/cli/src/sync-effect-app-subtree.ts b/packages/cli/src/sync-effect-app-subtree.ts deleted file mode 100644 index 59e9cbb56..000000000 --- a/packages/cli/src/sync-effect-app-subtree.ts +++ /dev/null @@ -1,307 +0,0 @@ -import * as Arr from "effect/Array" -import * as Effect from "effect/Effect" -import * as FileSystem from "effect/FileSystem" -import * as Option from "effect/Option" -import * as Path from "node:path" -import { RunCommandService } from "./os-command.js" - -export interface SyncEffectAppConfig { - readonly manifestPaths: ReadonlyArray - readonly subtreePrefix: string - readonly url: string - readonly ref?: string -} - -interface VersionMention { - readonly manifestPath: string - readonly section: string - readonly name: string - readonly range: string - readonly normalized: string -} - -const depSections = ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"] as const - -const packageManifestPaths: Record = { - "effect-app": "packages/effect-app/package.json", - "@effect-app/infra": "packages/infra/package.json", - "@effect-app/vue": "packages/vue/package.json", - "@effect-app/vue-components": "packages/vue-components/package.json", - "@effect-app/cli": "packages/cli/package.json", - "@effect-app/eslint-codegen-model": "packages/eslint-codegen-model/package.json", - "@effect-app/eslint-shared-config": "packages/eslint-shared-config/package.json" -} - -const packagePreference = Object.keys(packageManifestPaths) - -const isRecord = (value: unknown): value is Record => - typeof value === "object" && value !== null && !Array.isArray(value) - -const isEffectAppPackage = (name: string) => name === "effect-app" || name.startsWith("@effect-app/") - -const isNonEmptyString = (value: string) => value !== "" - -const shellQuote = (value: string) => `'${value.replaceAll("'", "'\\''")}'` - -const normalizeVersion = (range: string) => { - const match = range.match(/\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?/) - return match?.[0] -} - -const isFullSha = (ref: string) => /^[0-9a-f]{40}$/i.test(ref) - -const resolveRequestedRef = (ref: string) => ref === "latest" ? "main" : ref - -const parsePackageVersion = (source: string, packagePath: string) => { - const parsed: unknown = JSON.parse(source) - if (!isRecord(parsed) || typeof parsed["version"] !== "string") { - throw new Error(`Could not read version from ${packagePath}`) - } - return parsed["version"] -} - -const parseDefaultBranch = (source: string) => { - const line = source - .split("\n") - .find((line) => line.startsWith("ref: refs/heads/") && line.endsWith("\tHEAD")) - - if (!line) { - throw new Error("Could not resolve default branch for effect-app libs repository") - } - - return line.slice("ref: refs/heads/".length, -"\tHEAD".length) -} - -const selectVersionMentions = (mentions: Arr.NonEmptyArray) => { - for (const packageName of packagePreference) { - const selected = mentions.filter((mention) => mention.name === packageName) - if (Arr.isArrayNonEmpty(selected)) return selected - } - - return mentions -} - -const describeMentions = (mentions: ReadonlyArray) => - mentions - .map((mention) => `${mention.manifestPath} (${mention.section}) ${mention.name}: ${mention.range}`) - .join("\n") - -export const syncEffectAppSubtree = Effect.fnUntraced(function*(config: SyncEffectAppConfig) { - const fs = yield* FileSystem.FileSystem - const { runGetExitCode, runGetString } = yield* RunCommandService - - const run = Effect.fnUntraced(function*(command: string) { - const exitCode = yield* runGetExitCode(command) - if (exitCode !== 0) { - return yield* Effect.fail(new Error(`Command failed with exit code ${exitCode}: ${command}`)) - } - }) - - const fetchRemoteRef = Effect.fnUntraced(function*(remoteRef: string, localRef: string) { - const rawRef = `${localRef}-raw` - - yield* run( - `git fetch --no-tags ${shellQuote(config.url)} ${shellQuote(`+${remoteRef}:${rawRef}`)}` - ) - - const commit = (yield* runGetString(`git rev-list -n1 ${shellQuote(rawRef)}`)).trim() - yield* run(`git update-ref ${shellQuote(localRef)} ${shellQuote(commit)}`) - }) - - const fetchRequestedRef = Effect.fnUntraced(function*(requestedRef: string, localRef: string) { - if (isFullSha(requestedRef)) { - const localCommit = yield* runGetString( - `git rev-parse --verify ${shellQuote(`${requestedRef}^{commit}`)}` - ) - .pipe(Effect.option) - - if (Option.isSome(localCommit)) { - return yield* run(`git update-ref ${shellQuote(localRef)} ${shellQuote(localCommit.value.trim())}`) - } - } - - const remoteRefs = requestedRef.startsWith("refs/") - ? [requestedRef] - : [`refs/heads/${requestedRef}`, `refs/tags/${requestedRef}`, requestedRef] - - for (const remoteRef of remoteRefs) { - const exists = yield* runGetString( - `git ls-remote --exit-code ${shellQuote(config.url)} ${shellQuote(remoteRef)}` - ) - .pipe(Effect.option) - - if (Option.isSome(exists)) { - return yield* fetchRemoteRef(remoteRef, localRef) - } - } - - return yield* Effect.fail(new Error(`Could not resolve effect-app ref: ${requestedRef}`)) - }) - - if (config.ref) { - const ref = resolveRequestedRef(config.ref) - const syncRef = "refs/effa-sync/effect-app-requested" - yield* Effect.logInfo(`Using effect-app subtree ref: ${ref}`) - yield* Effect.logInfo(`Using effect-app subtree url: ${config.url}`) - yield* fetchRequestedRef(ref, syncRef) - return yield* run( - `git -c status.showUntrackedFiles=no subtree pull --prefix=${shellQuote(config.subtreePrefix)} . ${ - shellQuote(syncRef) - } --squash` - ) - } - - const versionMentions: Array = [] - - for (const manifestPath of config.manifestPaths) { - if (!(yield* fs.exists(manifestPath))) continue - - const manifest: unknown = JSON.parse(yield* fs.readFileString(manifestPath)) - if (!isRecord(manifest)) continue - - for (const section of depSections) { - const deps = manifest[section] - if (!isRecord(deps)) continue - - for (const [name, range] of Object.entries(deps)) { - if (!isEffectAppPackage(name) || typeof range !== "string") continue - - const normalized = normalizeVersion(range) - if (!normalized) continue - - versionMentions.push({ manifestPath, section, name, range, normalized }) - } - } - } - - if (!Arr.isArrayNonEmpty(versionMentions)) { - return yield* Effect.fail( - new Error("Could not find any effect-app/@effect-app dependency versions in manifests") - ) - } - - const selectedMentions = selectVersionMentions(versionMentions) - const versions = [...new Set(selectedMentions.map((mention) => mention.normalized))] - - if (Arr.isArrayNonEmpty(versions.slice(1))) { - return yield* Effect.fail( - new Error(`Found multiple Effect App versions. Please align first:\n${describeMentions(selectedMentions)}`) - ) - } - - const version = selectedMentions[0].normalized - const packageName = selectedMentions[0].name - const packagePath = packageManifestPaths[packageName] - - if (!packagePath) { - return yield* Effect.fail( - new Error(`No effect-app libs package manifest mapping for ${packageName}`) - ) - } - - const tagCandidates = [ - `${packageName}@${version}`, - `v${version}`, - version - ] - - let remoteRef: string | undefined - for (const candidate of tagCandidates) { - const tagResult = yield* runGetString( - `git ls-remote --exit-code --tags ${shellQuote(config.url)} ${shellQuote(`refs/tags/${candidate}`)}` - ) - .pipe(Effect.option) - - if (Option.isSome(tagResult)) { - remoteRef = candidate - break - } - } - - if (remoteRef) { - const syncRef = "refs/effa-sync/effect-app-tag" - yield* Effect.logInfo(`Using effect-app package: ${packageName}@${version}`) - yield* Effect.logInfo(`Using effect-app subtree ref: ${remoteRef}`) - yield* Effect.logInfo(`Using effect-app subtree url: ${config.url}`) - yield* fetchRemoteRef(`refs/tags/${remoteRef}`, syncRef) - return yield* run( - `git -c status.showUntrackedFiles=no subtree pull --prefix=${shellQuote(config.subtreePrefix)} . ${ - shellQuote(syncRef) - } --squash` - ) - } - - const defaultBranchOutput = yield* runGetString(`git ls-remote --symref ${shellQuote(config.url)} HEAD`) - const defaultBranch = yield* Effect.try({ - try: () => parseDefaultBranch(defaultBranchOutput), - catch: (cause) => cause instanceof Error ? cause : new Error(String(cause)) - }) - - const cachePath = (yield* runGetString("git rev-parse --git-path effa-sync/effect-app-libs.git")).trim() - yield* run(`mkdir -p ${shellQuote(Path.dirname(cachePath))}`) - - if (!(yield* fs.exists(cachePath))) { - yield* run(`git init --bare ${shellQuote(cachePath)}`) - } - - yield* run( - `git --git-dir=${shellQuote(cachePath)} fetch --no-tags --prune ${shellQuote(config.url)} ${ - shellQuote(`+refs/heads/${defaultBranch}:refs/heads/${defaultBranch}`) - }` - ) - - const commits = (yield* runGetString( - `git --git-dir=${shellQuote(cachePath)} rev-list ${shellQuote(`refs/heads/${defaultBranch}`)}` - )) - .trim() - .split("\n") - .filter(isNonEmptyString) - - if (!Arr.isArrayNonEmpty(commits)) { - return yield* Effect.fail( - new Error(`No commits found on ${defaultBranch} for ${config.url}`) - ) - } - - let commit: string | undefined - for (const candidate of commits) { - const packageJsonResult = yield* runGetString( - `git --git-dir=${shellQuote(cachePath)} show ${shellQuote(`${candidate}:${packagePath}`)}` - ) - .pipe(Effect.option) - - if (Option.isNone(packageJsonResult)) continue - - const candidateVersion = yield* Effect.try({ - try: () => parsePackageVersion(packageJsonResult.value, packagePath), - catch: (cause) => cause instanceof Error ? cause : new Error(String(cause)) - }) - - if (candidateVersion === version) { - commit = candidate - break - } - } - - if (!commit) { - return yield* Effect.fail( - new Error( - `No commit found on ${defaultBranch} where ${packagePath} has version ${version}. Tried tags: ${ - tagCandidates.join(", ") - }` - ) - ) - } - - const syncRef = "refs/effa-sync/effect-app-selected" - yield* run(`git --git-dir=${shellQuote(cachePath)} update-ref ${shellQuote(syncRef)} ${shellQuote(commit)}`) - - yield* Effect.logInfo(`Using effect-app package: ${packageName}@${version}`) - yield* Effect.logInfo(`Using effect-app subtree commit: ${commit}`) - yield* Effect.logInfo(`Using effect-app subtree url: ${config.url}`) - yield* run( - `git -c status.showUntrackedFiles=no subtree pull --prefix=${shellQuote(config.subtreePrefix)} ${ - shellQuote(cachePath) - } ${shellQuote(syncRef)} --squash` - ) -}) diff --git a/packages/cli/src/sync-effect-subtree.ts b/packages/cli/src/sync-effect-subtree.ts deleted file mode 100644 index a307fb643..000000000 --- a/packages/cli/src/sync-effect-subtree.ts +++ /dev/null @@ -1,140 +0,0 @@ -import * as Effect from "effect/Effect" -import * as FileSystem from "effect/FileSystem" -import * as Option from "effect/Option" -import { RunCommandService } from "./os-command.js" - -export interface SyncEffectConfig { - readonly manifestPaths: ReadonlyArray - readonly subtreePrefix: string - readonly url: string -} - -const depSections = ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"] as const - -const shellQuote = (value: string) => `'${value.replaceAll("'", "'\\''")}'` - -const normalizeVersion = (range: string) => { - const match = range.match(/\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?/) - return match?.[0] -} - -export const syncEffectSubtree = Effect.fnUntraced(function*(config: SyncEffectConfig) { - const fs = yield* FileSystem.FileSystem - const { runGetExitCode, runGetString } = yield* RunCommandService - - const run = Effect.fnUntraced(function*(command: string) { - const exitCode = yield* runGetExitCode(command) - if (exitCode !== 0) { - return yield* Effect.fail(new Error(`Command failed with exit code ${exitCode}: ${command}`)) - } - }) - - const fetchRemoteRef = Effect.fnUntraced(function*(remoteRef: string, localRef: string) { - const rawRef = `${localRef}-raw` - - yield* run( - `git fetch --no-tags ${shellQuote(config.url)} ${shellQuote(`+${remoteRef}:${rawRef}`)}` - ) - - const commit = (yield* runGetString(`git rev-list -n1 ${shellQuote(rawRef)}`)).trim() - yield* run(`git update-ref ${shellQuote(localRef)} ${shellQuote(commit)}`) - }) - - const versionMentions: Array<{ - manifestPath: string - section: string - name: string - range: string - normalized: string - }> = [] - - for (const manifestPath of config.manifestPaths) { - if (!(yield* fs.exists(manifestPath))) continue - - const manifest = JSON.parse(yield* fs.readFileString(manifestPath)) - - for (const section of depSections) { - const deps = (manifest[section] ?? {}) as Record - - for (const [name, range] of Object.entries(deps)) { - if (name !== "effect" && !name.startsWith("@effect/")) continue - - const normalized = normalizeVersion(String(range)) - if (!normalized) continue - - versionMentions.push({ manifestPath, section, name, range: String(range), normalized }) - } - } - } - - const effectPackageMentions = versionMentions.filter((e) => e.name === "effect") - - const versionsFromEffectPackage = [...new Set(effectPackageMentions.map((e) => e.normalized))] - - const versionsFromEffectScope = [ - ...new Set( - versionMentions - .filter((e) => e.name.startsWith("@effect/") && e.normalized.startsWith("4.")) - .map((e) => e.normalized) - ) - ] - - const versions = versionsFromEffectPackage.length > 0 - ? versionsFromEffectPackage - : versionsFromEffectScope - - if (versions.length === 0) { - return yield* Effect.fail( - new Error("Could not find any effect/@effect dependency versions in manifests") - ) - } - - if (versions.length > 1) { - const details = (effectPackageMentions.length > 0 ? effectPackageMentions : versionMentions) - .map((e) => `${e.manifestPath} (${e.section}) ${e.name}: ${e.range}`) - .join("\n") - - return yield* Effect.fail( - new Error(`Found multiple Effect versions. Please align first:\n${details}`) - ) - } - - const version = versions[0] - const candidateRefs = [ - `effect@${version}`, - `@effect/effect@${version}`, - `@effect/ai-anthropic@${version}` - ] - - const url = shellQuote(config.url) - - let ref: string | undefined - for (const candidate of candidateRefs) { - const tagResult = yield* runGetString( - `git ls-remote --exit-code --tags ${url} ${shellQuote(`refs/tags/${candidate}`)}` - ) - .pipe(Effect.option) - - if (Option.isSome(tagResult)) { - ref = candidate - break - } - } - - if (!ref) { - return yield* Effect.fail( - new Error(`No matching tag found for version ${version}. Tried: ${candidateRefs.join(", ")}`) - ) - } - - yield* Effect.logInfo(`Using effect version: ${version}`) - yield* Effect.logInfo(`Using subtree ref: ${ref}`) - yield* Effect.logInfo(`Using subtree url: ${config.url}`) - const syncRef = "refs/effa-sync/effect-selected" - yield* fetchRemoteRef(`refs/tags/${ref}`, syncRef) - yield* run( - `git -c status.showUntrackedFiles=no subtree pull --prefix=${shellQuote(config.subtreePrefix)} . ${ - shellQuote(syncRef) - } --squash` - ) -}) diff --git a/packages/cli/src/sync-shared.ts b/packages/cli/src/sync-shared.ts deleted file mode 100644 index 978374a38..000000000 --- a/packages/cli/src/sync-shared.ts +++ /dev/null @@ -1,349 +0,0 @@ -import * as Effect from "effect/Effect" -import * as FileSystem from "effect/FileSystem" -import * as Path from "effect/Path" -import { RunCommandService } from "./os-command.js" - -/** - * Project-side lockfile shape (`.shared.json`). - * - * `artifacts` maps SOURCE path (inside the shared repo) to DEST path (inside the - * consuming project). `exclude` lists source-relative paths to skip during sync. - */ -export interface SharedLockfile { - readonly repo: string - readonly ref: string - readonly artifacts: Record - readonly exclude?: ReadonlyArray - readonly synced_at?: string -} - -const sanitizeRepoSlug = (repo: string) => repo.replace(/[^A-Za-z0-9_.-]+/g, "_") - -const repoCloneUrl = (repo: string) => { - if (repo.startsWith("http") || repo.startsWith("git@")) return repo - // "github.com/effect-app/shared" → "git@github.com:effect-app/shared.git" - const m = repo.match(/^github\.com\/(.+?)\/(.+?)$/) - if (m) return `git@github.com:${m[1]}/${m[2]}.git` - return repo -} - -const joinPosix = (a: string, b: string) => a.endsWith("/") ? a + b : a + "/" + b - -const readLockfile = Effect.fnUntraced(function*(lockfilePath: string) { - const fs = yield* FileSystem.FileSystem - if (!(yield* fs.exists(lockfilePath))) { - return yield* Effect.fail(new Error(`No ${lockfilePath} found in current directory.`)) - } - const content = yield* fs.readFileString(lockfilePath) - return { content, lockfile: JSON.parse(content) as SharedLockfile } -}) - -const ensureCache = Effect.fnUntraced(function*(lockfile: SharedLockfile) { - const fs = yield* FileSystem.FileSystem - const path = yield* Path.Path - const { runGetExitCode } = yield* RunCommandService - - const home = process.env["HOME"] ?? process.env["USERPROFILE"] - if (!home) return yield* Effect.fail(new Error("Cannot resolve home directory.")) - - const cacheRoot = path.join(home, ".cache", "effa", "shared") - const cachePath = path.join(cacheRoot, sanitizeRepoSlug(lockfile.repo)) - const cloneUrl = repoCloneUrl(lockfile.repo) - - if (!(yield* fs.exists(cachePath))) { - yield* runGetExitCode(`mkdir -p ${JSON.stringify(cacheRoot)}`) - yield* runGetExitCode(`git clone ${JSON.stringify(cloneUrl)} ${JSON.stringify(cachePath)}`) - } else { - yield* runGetExitCode("git fetch --all --tags --prune", cachePath) - } - - yield* runGetExitCode(`git checkout ${JSON.stringify(lockfile.ref)}`, cachePath) - - return cachePath -}) - -/** - * Resolve `requestedRef` (or the remote default branch HEAD if omitted) to a - * concrete commit sha in the fetched cache. Accepts branch names, tags, or - * shas; bare branch names are resolved against `origin/` first so the result - * is the latest remote commit, not a stale local ref. - */ -const resolveLatestSha = Effect.fnUntraced(function*(cachePath: string, requestedRef?: string) { - const { runGetExitCode, runGetString } = yield* RunCommandService - - const target = requestedRef - ?? (yield* runGetString("git rev-parse --abbrev-ref origin/HEAD", cachePath)).trim() - - const candidates = target.includes("/") ? [target] : [`origin/${target}`, target] - for (const candidate of candidates) { - const rev = JSON.stringify(`${candidate}^{commit}`) - const code = yield* runGetExitCode(`git rev-parse --verify --quiet ${rev}`, cachePath) - if (code === 0) { - return (yield* runGetString(`git rev-parse ${rev}`, cachePath)).trim() - } - } - - return yield* Effect.fail(new Error(`Cannot resolve ref: ${target}`)) -}) - -/** - * Walk artifact files. For each file in the artifact map (respecting excludes), - * yields `{ srcRel, srcAbs, destAbs }`. - */ -const walkArtifacts = Effect.fnUntraced(function*( - lockfile: SharedLockfile, - cachePath: string -) { - const fs = yield* FileSystem.FileSystem - const path = yield* Path.Path - const { runGetString } = yield* RunCommandService - - const excludeSet = new Set(lockfile.exclude ?? []) - const results: Array<{ srcRel: string; srcAbs: string; destAbs: string; excluded: boolean }> = [] - - for (const [srcRel, destRel] of Object.entries(lockfile.artifacts)) { - const srcAbs = path.join(cachePath, srcRel) - const destAbs = path.resolve(destRel) - - if (!(yield* fs.exists(srcAbs))) continue - - const stat = yield* fs.stat(srcAbs) - - if (stat.type === "File") { - results.push({ srcRel, srcAbs, destAbs, excluded: excludeSet.has(srcRel) }) - continue - } - - const fileList = yield* runGetString(`find ${JSON.stringify(srcAbs)} -type f`) - for (const fileAbs of fileList.split("\n").filter((l) => l.trim() !== "")) { - const relInArtifact = path.relative(srcAbs, fileAbs) - const srcRelFull = joinPosix(srcRel, relInArtifact) - const destFileAbs = path.join(destAbs, relInArtifact) - results.push({ - srcRel: srcRelFull, - srcAbs: fileAbs, - destAbs: destFileAbs, - excluded: excludeSet.has(srcRelFull) - }) - } - } - - return results -}) - -/** - * Pull artifacts from the shared repo into the consuming project according to - * `.shared.json`. Idempotent — running twice without changes is a no-op. - * - * MVP: overwrites destination files. Caller is expected to inspect `git status` - * after sync to review local changes. Conflict handling lands in a follow-up. - */ -export const syncShared = Effect.fnUntraced(function*( - opts: { lockfilePath?: string; update?: boolean; ref?: string | undefined } = {} -) { - const fs = yield* FileSystem.FileSystem - const path = yield* Path.Path - const { runGetExitCode } = yield* RunCommandService - - const lockfilePath = opts.lockfilePath ?? ".shared.json" - const { content: lockfileContent, lockfile: pinned } = yield* readLockfile(lockfilePath) - - yield* Effect.logInfo(`Syncing from ${pinned.repo} @ ${pinned.ref}`) - - const cachePath = yield* ensureCache(pinned) - yield* Effect.logInfo(`Cache: ${cachePath}`) - - let lockfile = pinned - if (opts.update) { - const newRef = yield* resolveLatestSha(cachePath, opts.ref) - if (newRef === pinned.ref) { - yield* Effect.logInfo(`Already at latest: ${newRef.slice(0, 12)}`) - } else { - yield* Effect.logInfo(`Updating ref ${pinned.ref.slice(0, 12)} → ${newRef.slice(0, 12)}`) - yield* runGetExitCode(`git checkout ${JSON.stringify(newRef)}`, cachePath) - } - lockfile = { ...pinned, ref: newRef } - } - - const files = yield* walkArtifacts(lockfile, cachePath) - - let copied = 0 - let skipped = 0 - - for (const { srcRel, srcAbs, destAbs, excluded } of files) { - if (excluded) { - yield* Effect.logInfo(` exclude ${srcRel}`) - skipped++ - continue - } - yield* runGetExitCode(`mkdir -p ${JSON.stringify(path.dirname(destAbs))}`) - yield* runGetExitCode(`cp ${JSON.stringify(srcAbs)} ${JSON.stringify(destAbs)}`) - copied++ - } - - const today = new Date().toISOString().slice(0, 10) - const trailingNewline = lockfileContent.endsWith("\n") ? "\n" : "" - const updated = { ...lockfile, synced_at: today } - yield* fs.writeFileString(lockfilePath, JSON.stringify(updated, null, 2) + trailingNewline) - - yield* Effect.logInfo(`Sync complete: ${copied} copied, ${skipped} excluded.`) - yield* Effect.logInfo("Review changes with: git status") -}) - -/** - * Compare project files to cache files. Reports each file as one of: - * M modified locally (project differs from cache) - * A added locally (project has file, cache does not — for tracked artifacts) - * D deleted locally (cache has file, project does not) - * E excluded (skipped by lockfile) - * - * Files that match cache exactly are not listed. - */ -export const syncDiff = Effect.fnUntraced(function*(opts: { lockfilePath?: string } = {}) { - const fs = yield* FileSystem.FileSystem - const { runGetString } = yield* RunCommandService - - const lockfilePath = opts.lockfilePath ?? ".shared.json" - const { lockfile } = yield* readLockfile(lockfilePath) - - yield* Effect.logInfo(`Diffing against ${lockfile.repo} @ ${lockfile.ref}`) - - const cachePath = yield* ensureCache(lockfile) - const files = yield* walkArtifacts(lockfile, cachePath) - - const changes: Array<{ kind: "M" | "D" | "E"; srcRel: string; destPath: string }> = [] - - for (const { srcRel, srcAbs, destAbs, excluded } of files) { - if (excluded) { - changes.push({ kind: "E", srcRel, destPath: destAbs }) - continue - } - - if (!(yield* fs.exists(destAbs))) { - changes.push({ kind: "D", srcRel, destPath: destAbs }) - continue - } - - const srcHash = (yield* runGetString(`sha256sum ${JSON.stringify(srcAbs)}`)).split(" ")[0] - const destHash = (yield* runGetString(`sha256sum ${JSON.stringify(destAbs)}`)).split(" ")[0] - - if (srcHash !== destHash) { - changes.push({ kind: "M", srcRel, destPath: destAbs }) - } - } - - if (changes.length === 0) { - yield* Effect.logInfo("In sync. No diff.") - return - } - - for (const { kind, srcRel, destPath } of changes) { - yield* Effect.logInfo(`${kind} ${srcRel} -> ${destPath}`) - } - yield* Effect.logInfo("") - yield* Effect.logInfo( - `Summary: ${changes.filter((c) => c.kind === "M").length} modified, ${ - changes - .filter((c) => c.kind === "D") - .length - } missing in project, ${changes.filter((c) => c.kind === "E").length} excluded.` - ) -}) - -/** - * Push locally-modified synced files back to the shared repo on a new branch. - * Optionally opens a PR via `gh pr create`. - * - * Workflow: - * 1. Ensure cache fresh at pinned ref. - * 2. Detect modified files via hash compare (project vs cache). - * 3. Create new branch in cache, copy modified files in, commit, push. - * 4. Optionally run `gh pr create` if `--pr` set. - */ -export const syncPush = Effect.fnUntraced(function*(opts: { - lockfilePath?: string | undefined - message?: string | undefined - branch?: string | undefined - pr?: boolean | undefined -} = {}) { - const { runGetExitCode, runGetString } = yield* RunCommandService - - const lockfilePath = opts.lockfilePath ?? ".shared.json" - const { lockfile } = yield* readLockfile(lockfilePath) - - const cachePath = yield* ensureCache(lockfile) - const files = yield* walkArtifacts(lockfile, cachePath) - - const fs = yield* FileSystem.FileSystem - const modified: Array<{ srcRel: string; srcAbs: string; destAbs: string }> = [] - const deleted: Array<{ srcRel: string; srcAbs: string }> = [] - - for (const { srcRel, srcAbs, destAbs, excluded } of files) { - if (excluded) continue - if (!(yield* fs.exists(destAbs))) { - deleted.push({ srcRel, srcAbs }) - continue - } - const srcHash = (yield* runGetString(`sha256sum ${JSON.stringify(srcAbs)}`)).split(" ")[0] - const destHash = (yield* runGetString(`sha256sum ${JSON.stringify(destAbs)}`)).split(" ")[0] - if (srcHash !== destHash) { - modified.push({ srcRel, srcAbs, destAbs }) - } - } - - if (modified.length === 0 && deleted.length === 0) { - yield* Effect.logInfo("No local modifications to push.") - return - } - - yield* Effect.logInfo(`Pushing ${modified.length} modified, ${deleted.length} deleted file(s):`) - for (const { srcRel } of modified) { - yield* Effect.logInfo(` M ${srcRel}`) - } - for (const { srcRel } of deleted) { - yield* Effect.logInfo(` D ${srcRel}`) - } - - const branch = opts.branch - ?? `sync/from-${sanitizeRepoSlug(process.cwd().split("/").pop() ?? "project")}-${ - new Date().toISOString().slice(0, 10) - }` - - const message = opts.message ?? "sync: propagate local edits" - - // Stash anything in cache (defensive), create branch from pinned ref. - yield* runGetExitCode(`git stash --include-untracked || true`, cachePath) - yield* runGetExitCode(`git checkout -B ${JSON.stringify(branch)} ${JSON.stringify(lockfile.ref)}`, cachePath) - - for (const { srcAbs, destAbs } of modified) { - yield* runGetExitCode(`cp ${JSON.stringify(destAbs)} ${JSON.stringify(srcAbs)}`) - } - for (const { srcAbs } of deleted) { - yield* runGetExitCode(`git rm -f ${JSON.stringify(srcAbs)}`, cachePath) - } - - yield* runGetExitCode(`git add -A`, cachePath) - yield* runGetExitCode( - `git -c commit.gpgsign=false commit -m ${JSON.stringify(message)}`, - cachePath - ) - yield* runGetExitCode(`git push -u origin ${JSON.stringify(branch)}`, cachePath) - - if (opts.pr) { - yield* runGetExitCode( - `gh pr create --title ${JSON.stringify(message)} --body ${ - JSON.stringify(`Propagated from project at ${process.cwd()}.\n\nFiles:\n${ - [ - ...modified.map((m) => `- M ${m.srcRel}`), - ...deleted.map((d) => `- D ${d.srcRel}`) - ] - .join("\n") - }`) - } --head ${JSON.stringify(branch)}`, - cachePath - ) - } - - yield* Effect.logInfo(`Pushed branch ${branch} to shared repo.`) - yield* Effect.logInfo(opts.pr ? "PR opened." : "Open a PR with: gh pr create (from the cache dir)") -}) diff --git a/packages/cli/src/update-packages.ts b/packages/cli/src/update-packages.ts deleted file mode 100644 index ae2c84386..000000000 --- a/packages/cli/src/update-packages.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const makeNcuUpdateCommand = ( - filter: string, - options?: { readonly recursive?: boolean } -) => `pnpm ${options?.recursive ? "-r " : ""}exec ncu -u --target semver --filter "${filter}"` diff --git a/packages/cli/test.gists.yaml b/packages/cli/test.gists.yaml deleted file mode 100644 index 41b4b992b..000000000 --- a/packages/cli/test.gists.yaml +++ /dev/null @@ -1,27 +0,0 @@ -gists: - # "cli-config-banana": - # company: "banana" # acts like a namespace - # description: "Package configuration and main source for Effect-App CLI" - # public: false - # files: - # - "package.json" - # # - "packages/cli/src/index.ts" - "cli-config-mela": - company: "mela" # acts like a namespace - description: "Package configuration and main source for Effect-App CLI" - public: false - files: - - "package.json" - - # "test-files": - # description: "Test YAML files for gist functionality" - # public: false - # files: - # - "gists.yaml" - -settings: - # GitHub token environment variable name - token_env: "GIST_GITHUB_TOKEN" - - # Base directory for files (relative to where the CLI is run) - base_directory: "." diff --git a/packages/cli/test/argv-patch.test.ts b/packages/cli/test/argv-patch.test.ts deleted file mode 100644 index 11c0ea30c..000000000 --- a/packages/cli/test/argv-patch.test.ts +++ /dev/null @@ -1,198 +0,0 @@ -import { execFileSync } from "node:child_process" -import path from "node:path" -import url from "node:url" -import { describe, expect, it } from "vitest" -import { patchArgvForWrapCommands } from "../src/argv-patch.js" - -describe("patchArgvForWrapCommands", () => { - const make = (...args: Array) => ["node", "effect-app-cli", ...args] - - describe("joins wrap args into a single element", () => { - it("index-multi with tsc --build", () => { - const argv = make("index-multi", "tsc", "--build") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("index-multi", "tsc --build")) - }) - - it("packagejson with tsc --build and tsconfig path", () => { - const argv = make("packagejson", "tsc", "--build", "./tsconfig.src.json") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("packagejson", "tsc --build ./tsconfig.src.json")) - }) - - it("packagejson-packages with pnpm check", () => { - const argv = make("packagejson-packages", "pnpm", "check") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("packagejson-packages", "pnpm check")) - }) - - it("single wrap arg stays as-is", () => { - const argv = make("index-multi", "tsc") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("index-multi", "tsc")) - }) - - it("wrap args with multiple --flags", () => { - const argv = make("index-multi", "tsc", "--build", "--watch", "--verbose") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("index-multi", "tsc --build --watch --verbose")) - }) - - it("wrap args with short flags", () => { - const argv = make("packagejson", "pnpm", "-r", "check") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("packagejson", "pnpm -r check")) - }) - - it("wrap args with --flag=value syntax", () => { - const argv = make("index-multi", "tsc", "--build=./tsconfig.json") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("index-multi", "tsc --build=./tsconfig.json")) - }) - - it("wrap args with --flag=\"quoted value\" syntax", () => { - const argv = make("index-multi", "tsc", "--outDir=\"dist/build\"") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("index-multi", "tsc --outDir=\"dist/build\"")) - }) - - it("wrap args with mixed quoted and unquoted flags", () => { - const argv = make("packagejson", "cmd", "--x=\"abc\"", "--y", "plain") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("packagejson", "cmd --x=\"abc\" --y plain")) - }) - - it("wrap args with single-quoted value in flag", () => { - const argv = make("index-multi", "cmd", "--config='my config.json'") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("index-multi", "cmd --config='my config.json'")) - }) - - it("wrap args with spaces inside quoted flag value", () => { - const argv = make("packagejson-packages", "cmd", "--msg=\"hello world\"", "--verbose") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("packagejson-packages", "cmd --msg=\"hello world\" --verbose")) - }) - }) - - describe("does nothing for non-wrap subcommands", () => { - it("nuke with flags", () => { - const argv = make("nuke", "--dry-run") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("nuke", "--dry-run")) - }) - - it("gist with --config flag", () => { - const argv = make("gist", "--config", "gists.yaml") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("gist", "--config", "gists.yaml")) - }) - - it("ue", () => { - const argv = make("ue") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("ue")) - }) - - it("link with path arg", () => { - const argv = make("link", "../../effect-app/libs") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("link", "../../effect-app/libs")) - }) - - it("unrecognized command", () => { - const argv = make("unknown", "tsc", "--build") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("unknown", "tsc", "--build")) - }) - }) - - describe("edge cases", () => { - it("no subcommand", () => { - const argv = ["node", "effect-app-cli"] - patchArgvForWrapCommands(argv) - expect(argv).toEqual(["node", "effect-app-cli"]) - }) - - it("subcommand with no trailing args", () => { - const argv = make("index-multi") - patchArgvForWrapCommands(argv) - expect(argv).toEqual(make("index-multi")) - }) - - it("empty argv", () => { - const argv: Array = [] - patchArgvForWrapCommands(argv) - expect(argv).toEqual([]) - }) - - it("single element argv", () => { - const argv = ["node"] - patchArgvForWrapCommands(argv) - expect(argv).toEqual(["node"]) - }) - - it("mutates the original array", () => { - const argv = make("index-multi", "tsc", "--build") - const ref = argv - patchArgvForWrapCommands(argv) - expect(ref).toBe(argv) - expect(ref).toEqual(make("index-multi", "tsc --build")) - }) - - it("different node/script paths", () => { - const argv = ["/usr/local/bin/node", "/home/user/.npm/bin/effa", "packagejson", "pnpm", "check"] - patchArgvForWrapCommands(argv) - expect(argv).toEqual(["/usr/local/bin/node", "/home/user/.npm/bin/effa", "packagejson", "pnpm check"]) - }) - }) -}) - -describe.skip("e2e: CLI spawns wrap command correctly", () => { - const binPath = path.resolve(path.dirname(url.fileURLToPath(import.meta.url)), "../bin.js") - - const run = (...args: Array) => - execFileSync("node", [binPath, ...args], { - encoding: "utf-8", - timeout: 10_000, - env: { ...process.env, NO_COLOR: "1" } - }) - - it("packagejson spawns 'echo hello' and captures output", () => { - const out = run("packagejson", "echo", "hello") - expect(out).toContain("Spawning child command: echo hello") - expect(out).toContain("hello") - }) - - it("packagejson spawns command with --flags without quoting", () => { - const out = run("packagejson", "echo", "--build-test", "extra") - expect(out).toContain("Spawning child command: echo --build-test extra") - expect(out).toContain("--build-test extra") - }) - - it("packagejson with single quoted arg still works", () => { - const out = run("packagejson", "echo from-quoted") - expect(out).toContain("Spawning child command: echo from-quoted") - expect(out).toContain("from-quoted") - }) - - it("propagates non-zero exit code", () => { - try { - run("packagejson", "exit 42") - expect.unreachable("should have thrown") - } catch (e: any) { - expect(e.status).toBe(42) - } - }) - - it("index-multi spawns wrap command with --flags", () => { - const out = run("index-multi", "echo", "--build", "done") - expect(out).toContain("Spawning child command: echo --build done") - expect(out).toContain("--build done") - }) - - it("packagejson spawns command with --flag=\"value\" syntax", () => { - const out = run("packagejson", "echo", "--x=\"abc\"", "--y") - expect(out).toContain("Spawning child command: echo --x=\"abc\" --y") - }) -}) diff --git a/packages/cli/test/gist-cache.test.ts b/packages/cli/test/gist-cache.test.ts deleted file mode 100644 index 902e71424..000000000 --- a/packages/cli/test/gist-cache.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { Effect, Layer } from "effect" -import { describe, expect, it } from "vitest" -import { GHGistService } from "../src/gist.js" -import { RunCommandService } from "../src/os-command.js" - -describe("GHGistService.loadGistCache", () => { - it("loads the company cache from the configured Gist ID without discovery", async () => { - const commands: Array = [] - const runCommand = Layer.succeed(RunCommandService)({ - runGetExitCode: (command) => { - commands.push(command) - return Effect.die(`Unexpected command: ${command}`) - }, - runGetString: (command) => { - commands.push(command) - - switch (command) { - case "gh gist view configured-cache-id --files": - return Effect.succeed("effa-gist.cache\nmako.json\n") - case "gh gist view configured-cache-id -f \"mako.json\"": - return Effect.succeed("[{\"name\":\"mako\",\"id\":\"content-gist-id\"}]") - default: - return Effect.die(`Unexpected command: ${command}`) - } - } - }) - - const cache = await Effect.runPromise( - Effect - .gen(function*() { - const gh = yield* GHGistService - return yield* gh.loadGistCache("configured-cache-id", "mako") - }) - .pipe( - Effect.provide(GHGistService.DefaultWithoutDependencies), - Effect.provide(runCommand) - ) - ) - - expect(cache.gist_id).toBe("configured-cache-id") - expect(cache.company).toBe("mako") - expect(cache.entries.map(({ id, name }) => ({ id, name }))).toEqual([ - { id: "content-gist-id", name: "mako" } - ]) - expect(commands).toEqual([ - "gh gist view configured-cache-id --files", - "gh gist view configured-cache-id -f \"mako.json\"" - ]) - }) - - it("creates a missing company cache file once without retrying", async () => { - const commands: Array = [] - const runCommand = Layer.succeed(RunCommandService)({ - runGetExitCode: (command) => { - commands.push(command) - return Effect.die(`Unexpected command: ${command}`) - }, - runGetString: (command) => { - commands.push(command) - - switch (command) { - case "gh gist view configured-cache-id --files": - return Effect.succeed("effa-gist.cache\n") - case "echo \"[]\" | gh gist edit configured-cache-id -a mako.json -": - return Effect.succeed("") - default: - return Effect.die(`Unexpected command: ${command}`) - } - } - }) - - const cache = await Effect.runPromise( - Effect - .gen(function*() { - const gh = yield* GHGistService - return yield* gh.loadGistCache("configured-cache-id", "mako") - }) - .pipe( - Effect.provide(GHGistService.DefaultWithoutDependencies), - Effect.provide(runCommand) - ) - ) - - expect(cache.gist_id).toBe("configured-cache-id") - expect(cache.company).toBe("mako") - expect(cache.entries).toEqual([]) - expect(commands).toEqual([ - "gh gist view configured-cache-id --files", - "echo \"[]\" | gh gist edit configured-cache-id -a mako.json -" - ]) - }) -}) diff --git a/packages/cli/test/update-packages.test.ts b/packages/cli/test/update-packages.test.ts deleted file mode 100644 index 9cca50be2..000000000 --- a/packages/cli/test/update-packages.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { describe, expect, it } from "vitest" -import { makeNcuUpdateCommand } from "../src/update-packages.js" - -describe("makeNcuUpdateCommand", () => { - it("targets the highest version allowed by the existing semver range", () => { - expect(makeNcuUpdateCommand("@effect-app/*")).toBe( - "pnpm exec ncu -u --target semver --filter \"@effect-app/*\"" - ) - expect(makeNcuUpdateCommand("@effect/*", { recursive: true })).toBe( - "pnpm -r exec ncu -u --target semver --filter \"@effect/*\"" - ) - }) -}) diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json deleted file mode 100644 index 069b63731..000000000 --- a/packages/cli/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "lib": [ - "esnext" - ], - "moduleResolution": "Node16", - "outDir": "./dist", - "rootDir": "./src", - "tsBuildInfoFile": "./dist/.tsbuildinfo" - }, - "include": [ - "./src/**/*.ts" - ], - "references": [] -} diff --git a/packages/cli/vitest.config.ts b/packages/cli/vitest.config.ts deleted file mode 100644 index 85903fa64..000000000 --- a/packages/cli/vitest.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -import { defineConfig } from "vitest/config" -import makeConfig from "../../vite.config.base" - -export default defineConfig(makeConfig(__dirname)) diff --git a/packages/e2e/CHANGELOG.md b/packages/e2e/CHANGELOG.md deleted file mode 100644 index d87ce279b..000000000 --- a/packages/e2e/CHANGELOG.md +++ /dev/null @@ -1,346 +0,0 @@ -# @effect-app/e2e - -## 4.0.0-beta.320 - -### Patch Changes - -- effect-app@4.0.0-beta.320 -- @effect-app/infra@4.0.0-beta.320 -- @effect-app/vue@4.0.0-beta.320 - -## 4.0.0-beta.319 - -### Patch Changes - -- effect-app@4.0.0-beta.319 -- @effect-app/infra@4.0.0-beta.319 -- @effect-app/vue@4.0.0-beta.319 - -## 4.0.0-beta.318 - -### Patch Changes - -- Updated dependencies [8bd5bfe] - - effect-app@4.0.0-beta.318 - - @effect-app/infra@4.0.0-beta.318 - - @effect-app/vue@4.0.0-beta.318 - -## 4.0.0-beta.317 - -### Patch Changes - -- Updated dependencies [186de3a] -- Updated dependencies [186de3a] -- Updated dependencies [186de3a] -- Updated dependencies [186de3a] - - @effect-app/infra@4.0.0-beta.317 - - effect-app@4.0.0-beta.317 - - @effect-app/vue@4.0.0-beta.317 - -## 4.0.0-beta.316 - -### Patch Changes - -- effect-app@4.0.0-beta.316 -- @effect-app/infra@4.0.0-beta.316 -- @effect-app/vue@4.0.0-beta.316 - -## 4.0.0-beta.315 - -### Patch Changes - -- effect-app@4.0.0-beta.315 -- @effect-app/infra@4.0.0-beta.315 -- @effect-app/vue@4.0.0-beta.315 - -## 4.0.0-beta.314 - -### Patch Changes - -- Updated dependencies [61a3931] - - @effect-app/vue@4.0.0-beta.314 - - effect-app@4.0.0-beta.314 - - @effect-app/infra@4.0.0-beta.314 - -## 4.0.0-beta.313 - -### Patch Changes - -- Updated dependencies [eddda2e] - - @effect-app/vue@4.0.0-beta.313 - - effect-app@4.0.0-beta.313 - - @effect-app/infra@4.0.0-beta.313 - -## 4.0.0-beta.312 - -### Patch Changes - -- Updated dependencies [9ea024d] - - effect-app@4.0.0-beta.312 - - @effect-app/infra@4.0.0-beta.312 - - @effect-app/vue@4.0.0-beta.312 - -## 4.0.0-beta.311 - -### Patch Changes - -- Updated dependencies [547e2e1] - - effect-app@4.0.0-beta.311 - - @effect-app/infra@4.0.0-beta.311 - - @effect-app/vue@4.0.0-beta.311 - -## 4.0.0-beta.310 - -### Patch Changes - -- Updated dependencies [0fa0e80] - - @effect-app/vue@4.0.0-beta.310 - - effect-app@4.0.0-beta.310 - - @effect-app/infra@4.0.0-beta.310 - -## 4.0.0-beta.309 - -### Patch Changes - -- Updated dependencies [99c43c4] -- Updated dependencies [99c43c4] - - effect-app@4.0.0-beta.309 - - @effect-app/vue@4.0.0-beta.309 - - @effect-app/infra@4.0.0-beta.309 - -## 4.0.0-beta.308 - -### Patch Changes - -- Updated dependencies [b4d5f55] - - @effect-app/infra@4.0.0-beta.308 - - effect-app@4.0.0-beta.308 - - @effect-app/vue@4.0.0-beta.308 - -## 4.0.0-beta.307 - -### Patch Changes - -- Updated dependencies [40585ca] -- Updated dependencies [ad0ede6] - - effect-app@4.0.0-beta.307 - - @effect-app/infra@4.0.0-beta.307 - - @effect-app/vue@4.0.0-beta.307 - -## 4.0.0-beta.306 - -### Patch Changes - -- Updated dependencies [0fe925d] - - effect-app@4.0.0-beta.306 - - @effect-app/infra@4.0.0-beta.306 - - @effect-app/vue@4.0.0-beta.306 - -## 4.0.0-beta.305 - -### Patch Changes - -- Updated dependencies [8bd9a11] - - effect-app@4.0.0-beta.305 - - @effect-app/infra@4.0.0-beta.305 - - @effect-app/vue@4.0.0-beta.305 - -## 4.0.0-beta.304 - -### Patch Changes - -- Updated dependencies [412f08b] - - effect-app@4.0.0-beta.304 - - @effect-app/infra@4.0.0-beta.304 - - @effect-app/vue@4.0.0-beta.304 - -## 4.0.0-beta.303 - -### Patch Changes - -- Updated dependencies [33b0544] - - effect-app@4.0.0-beta.303 - - @effect-app/infra@4.0.0-beta.303 - - @effect-app/vue@4.0.0-beta.303 - -## 4.0.0-beta.302 - -### Patch Changes - -- Updated dependencies [c0e5a1b] - - effect-app@4.0.0-beta.302 - - @effect-app/infra@4.0.0-beta.302 - - @effect-app/vue@4.0.0-beta.302 - -## 4.0.0-beta.301 - -### Patch Changes - -- Updated dependencies [413022d] - - @effect-app/vue@4.0.0-beta.301 - - effect-app@4.0.0-beta.301 - - @effect-app/infra@4.0.0-beta.301 - -## 4.0.0-beta.300 - -### Patch Changes - -- effect-app@4.0.0-beta.300 -- @effect-app/infra@4.0.0-beta.300 -- @effect-app/vue@4.0.0-beta.300 - -## 4.0.0-beta.299 - -### Patch Changes - -- effect-app@4.0.0-beta.299 -- @effect-app/infra@4.0.0-beta.299 -- @effect-app/vue@4.0.0-beta.299 - -## 4.0.0-beta.298 - -### Patch Changes - -- Updated dependencies [08d092c] - - effect-app@4.0.0-beta.298 - - @effect-app/vue@4.0.0-beta.298 - - @effect-app/infra@4.0.0-beta.298 - -## 4.0.0-beta.297 - -### Patch Changes - -- Updated dependencies [30c512d] - - effect-app@4.0.0-beta.297 - - @effect-app/infra@4.0.0-beta.297 - - @effect-app/vue@4.0.0-beta.297 - -## 4.0.0-beta.296 - -### Patch Changes - -- Updated dependencies [e0c4835] - - effect-app@4.0.0-beta.296 - - @effect-app/infra@4.0.0-beta.296 - - @effect-app/vue@4.0.0-beta.296 - -## 4.0.0-beta.295 - -### Patch Changes - -- Updated dependencies [eb06b32] - - effect-app@4.0.0-beta.295 - - @effect-app/infra@4.0.0-beta.295 - - @effect-app/vue@4.0.0-beta.295 - -## 4.0.0-beta.294 - -### Patch Changes - -- Updated dependencies [a211c12] -- Updated dependencies [7519318] - - effect-app@4.0.0-beta.294 - - @effect-app/vue@4.0.0-beta.294 - - @effect-app/infra@4.0.0-beta.294 - -## 4.0.0-beta.293 - -### Patch Changes - -- Updated dependencies [d1c15d3] - - effect-app@4.0.0-beta.293 - - @effect-app/infra@4.0.0-beta.293 - - @effect-app/vue@4.0.0-beta.293 - -## 4.0.0-beta.292 - -### Patch Changes - -- Updated dependencies [4622a75] - - @effect-app/vue@4.0.0-beta.292 - - effect-app@4.0.0-beta.292 - - @effect-app/infra@4.0.0-beta.292 - -## 4.0.0-beta.291 - -### Patch Changes - -- Updated dependencies [848d26d] -- Updated dependencies [fa3533e] - - @effect-app/infra@4.0.0-beta.291 - - @effect-app/vue@4.0.0-beta.291 - - effect-app@4.0.0-beta.291 - -## 4.0.0-beta.290 - -### Patch Changes - -- Updated dependencies [dc07df5] - - effect-app@4.0.0-beta.290 - - @effect-app/infra@4.0.0-beta.290 - - @effect-app/vue@4.0.0-beta.290 - -## 4.0.0-beta.289 - -### Patch Changes - -- Updated dependencies [a1b59bc] - - effect-app@4.0.0-beta.289 - - @effect-app/infra@4.0.0-beta.289 - - @effect-app/vue@4.0.0-beta.289 - -## 4.0.0-beta.288 - -### Patch Changes - -- Updated dependencies [aeb17bc] -- Updated dependencies [aeb17bc] - - effect-app@4.0.0-beta.288 - - @effect-app/vue@4.0.0-beta.288 - - @effect-app/infra@4.0.0-beta.288 - -## 4.0.0-beta.287 - -### Patch Changes - -- Updated dependencies [261470f] - - effect-app@4.0.0-beta.287 - - @effect-app/infra@4.0.0-beta.287 - - @effect-app/vue@4.0.0-beta.287 - -## 4.0.0-beta.286 - -### Patch Changes - -- Updated dependencies [b6dda09] - - effect-app@4.0.0-beta.286 - - @effect-app/infra@4.0.0-beta.286 - - @effect-app/vue@4.0.0-beta.286 - -## 4.0.0-beta.285 - -### Patch Changes - -- Updated dependencies [7bd8234] - - effect-app@4.0.0-beta.285 - - @effect-app/infra@4.0.0-beta.285 - - @effect-app/vue@4.0.0-beta.285 - -## 4.0.0-beta.284 - -### Patch Changes - -- Updated dependencies [dd239fa] - - @effect-app/infra@4.0.0-beta.284 - - @effect-app/vue@4.0.0-beta.284 - - effect-app@4.0.0-beta.284 - -## 4.0.0-beta.283 - -### Patch Changes - -- Updated dependencies [0054611] -- Updated dependencies [0054611] - - effect-app@4.0.0-beta.283 - - @effect-app/infra@4.0.0-beta.283 - - @effect-app/vue@4.0.0-beta.283 diff --git a/packages/e2e/package.json b/packages/e2e/package.json deleted file mode 100644 index 4aec31796..000000000 --- a/packages/e2e/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "@effect-app/e2e", - "version": "4.0.0-beta.320", - "license": "MIT", - "type": "module", - "private": true, - "dependencies": { - "@effect-app/infra": "workspace:*", - "@effect-app/vue": "workspace:*", - "effect-app": "workspace:*" - }, - "devDependencies": { - "@effect/atom-vue": "^4.0.0-rc.114", - "@effect/platform-node": "4.0.0-rc.114", - "@effect/vitest": "4.0.0-rc.114", - "@tanstack/vue-query": "5.96.2", - "@types/node": "25.9.1", - "@vitejs/plugin-vue": "^6.0.7", - "effect": "^4.0.0-rc.114", - "typescript": "~6.0.3", - "vitest": "^4.1.7", - "vue": "^3.5.35" - }, - "scripts": { - "check": "tsgo --noEmit", - "test": "vitest", - "test:run": "vitest run --passWithNoTests", - "lint": "oxlint --quiet --type-aware ./test && pnpm exec dprint check --config ../../dprint.jsonc .", - "lint-fix": "oxlint --quiet --type-aware --fix ./test && pnpm exec dprint fmt --config ../../dprint.jsonc .", - "testsuite": "pnpm lint && pnpm run test:run", - "clean": "rm -rf dist" - }, - "sideEffects": false -} diff --git a/packages/e2e/test/repoInvalidation.e2e.test.ts b/packages/e2e/test/repoInvalidation.e2e.test.ts deleted file mode 100644 index 6091c9dbb..000000000 --- a/packages/e2e/test/repoInvalidation.e2e.test.ts +++ /dev/null @@ -1,270 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { awaitAtomResult, buildQueryFamily, invalidateAndAwait, makeAtomClientRuntime } from "@effect-app/vue/atomQuery" -import { invalidateQueries } from "@effect-app/vue/mutate" -import { defaultRegistry } from "@effect/atom-vue" -import { NodeHttpServer } from "@effect/platform-node" -import { expect, it } from "@effect/vitest" -import { QueryClient, VueQueryPlugin } from "@tanstack/vue-query" -import { ApiClientFactory, InvalidStateError, makeRpcClient, NotLoggedInError, OptimisticConcurrencyException } from "effect-app/client" -import * as Context from "effect-app/Context" -import * as Effect from "effect-app/Effect" -import { tuple } from "effect-app/Function" -import { HttpRouter, HttpServer } from "effect-app/http" -import * as Layer from "effect-app/Layer" -import { DefaultGenericMiddlewares } from "effect-app/middleware" -import { makeRepo, RepositoryRegistryLive } from "effect-app/Model" -import { MiddlewareMaker, RpcContextMap, RpcMiddleware } from "effect-app/rpc" -import * as S from "effect-app/Schema" -import * as ManagedRuntime from "effect/ManagedRuntime" -import * as Option from "effect/Option" -import * as Scope from "effect/Scope" -import { FetchHttpClient } from "effect/unstable/http" -import * as NetAddress from "effect/unstable/net/NetAddress" -import * as Reactivity from "effect/unstable/reactivity/Reactivity" -import { RpcSerialization } from "effect/unstable/rpc" -import { createServer } from "http" -import { createApp, effectScope, ref } from "vue" -import { RequestContextMiddleware } from "../../infra/src/internal/RequestContextMiddleware.ts" -import { makeRouter } from "../../infra/src/routing.ts" -import { DefaultGenericMiddlewaresLive } from "../../infra/src/routing/middleware.ts" -import { MemoryStoreLive } from "../../infra/src/Store/Memory.ts" -import { makeTanstackQuery, makeTanstackQueryInvalidator } from "../../vue/src/internal/tanstackQuery.ts" - -class RequestContextMap extends RpcContextMap.makeMap({ - allowAnonymous: RpcContextMap.makeInverted()(NotLoggedInError) -}) {} - -class AllowAnonymous extends RpcMiddleware.Tag()("AllowAnonymous", { - dynamic: RequestContextMap.get("allowAnonymous") -}) {} - -const AllowAnonymousLive = Layer.effect( - AllowAnonymous, - Effect.succeed(Effect.fnUntraced(function*(effect, { rpc }) { - yield* Scope.Scope - if (!RequestContextMap.getConfig(rpc).allowAnonymous) { - return yield* new NotLoggedInError({ message: "Not logged in" }) - } - return yield* effect - })) -) - -class AppMiddleware extends MiddlewareMaker - .Tag()("AppMiddleware", RequestContextMap) - .middleware(AllowAnonymous) - .middleware(...DefaultGenericMiddlewares) -{ - static Default = this.layer.pipe( - Layer.provide([AllowAnonymousLive, DefaultGenericMiddlewaresLive] as const) - ) -} - -const { Router, matchAll } = makeRouter(AppMiddleware.Default) -const { TaggedRequestFor } = makeRpcClient(AppMiddleware) -const Req = TaggedRequestFor("RepoInvalidation") - -class RepoItem extends S.Class("RepoItem")({ id: S.String, label: S.String }) {} -class OtherItem extends S.Class("OtherItem")({ id: S.String, label: S.String }) {} - -class RepoItems extends Context.Service()("RepoItems", { - make: makeRepo("RepoItem", RepoItem, {}) -}) { - static Default = Layer.effect(this, this.make).pipe( - Layer.provide(Layer.merge(MemoryStoreLive, RepositoryRegistryLive)) - ) -} - -class OtherItems extends Context.Service()("OtherItems", { - make: makeRepo("OtherItem", OtherItem, {}) -}) { - static Default = Layer.effect(this, this.make).pipe( - Layer.provide(Layer.merge(MemoryStoreLive, RepositoryRegistryLive)) - ) -} - -class GetRepoCount extends Req.Query()("GetRepoCount", {}, { - allowAnonymous: true, - success: S.Number -}) {} - -class GetRepoCountRuns extends Req.Query()("GetRepoCountRuns", {}, { - allowAnonymous: true, - success: S.Number -}) {} - -class SaveRepoItem extends Req.Command()("SaveRepoItem", { - id: S.String, - label: S.String -}, { - allowAnonymous: true, - error: S.Union([InvalidStateError, OptimisticConcurrencyException]), - success: S.Void -}) {} - -class SaveOtherItem extends Req.Command()("SaveOtherItem", { - id: S.String, - label: S.String -}, { - allowAnonymous: true, - success: S.Void -}) {} - -const RepoRpcs = { GetRepoCount, GetRepoCountRuns, SaveRepoItem, SaveOtherItem } -let repoCountRuns = 0 - -const router = Router(RepoRpcs)({ - dependencies: [RepoItems.Default, OtherItems.Default], - *effect(match) { - const repo = yield* RepoItems - const otherRepo = yield* OtherItems - return match({ - GetRepoCount: () => - Effect - .sync(() => repoCountRuns++) - .pipe(Effect.andThen(repo.all), Effect.map((items) => items.length), Effect.orDie), - GetRepoCountRuns: () => Effect.sync(() => repoCountRuns), - SaveRepoItem: ({ id, label }) => repo.save(new RepoItem({ id, label })).pipe(Effect.orDie), - SaveOtherItem: ({ id, label }) => otherRepo.save(new OtherItem({ id, label })).pipe(Effect.orDie) - }) - } -}) - -const RpcRouterLayer = matchAll({ router }) -const NodeServerLayer = NodeHttpServer.layer(() => createServer(), { port: 0 }) - -const ServerLayer = HttpRouter - .serve(RpcRouterLayer.pipe(Layer.provide(HttpRouter.middleware(RequestContextMiddleware()).layer))) - .pipe( - Layer.provide(NodeServerLayer), - Layer.provide(RpcSerialization.layerNdjson) - ) - -const ClientLayer = Layer - .unwrap( - Effect.gen(function*() { - const server = yield* HttpServer.HttpServer - const addr = server.address - if (NetAddress.isUnixPathAddress(addr)) { - return yield* Effect.die(new Error("expected inet address")) - } - const host = NetAddress.isUnspecified(addr.address) ? "127.0.0.1" : NetAddress.formatUrlHost(addr.address) - return ApiClientFactory - .layer({ url: `http://${host}:${addr.port}`, headers: Option.none() }) - .pipe(Layer.provide(FetchHttpClient.layer)) - }) - ) - .pipe(Layer.provide(NodeServerLayer)) - -const TestLayer = Layer.mergeAll(ServerLayer, ClientLayer, Reactivity.layer) - -const setup = () => { - repoCountRuns = 0 - const runtime = ManagedRuntime.make(TestLayer) - return Effect - .all( - [ - ApiClientFactory.makeFor(Layer.empty)(RepoRpcs), - Effect.context() - ] as const - ) - .pipe(Effect.map(([client, context]) => tuple(runtime, client, context)), runtime.runPromise) -} - -it("atom engine: rpc repo write invalidates and refetches; unrelated rpc write does not", async () => { - const [runtime, client, context] = await setup() - const reactivity = Context.get(context, Reactivity.Reactivity) - const rt = makeAtomClientRuntime(() => Layer.succeedContext(context), runtime.memoMap) - const invalidator = { - invalidateAndAwait: (keys: ReadonlyArray>) => - invalidateAndAwait(keys).pipe(Effect.provideService(Reactivity.Reactivity, reactivity)) - } - const atom = buildQueryFamily(rt, client.GetRepoCount as any)(undefined) - const unmount = defaultRegistry.mount(atom) - const run = (effect: Effect.Effect) => Effect.runPromise(effect) - const save = (id: string) => - run( - invalidateQueries(client.SaveRepoItem, undefined, invalidator)(client.SaveRepoItem.handler({ id, label: id }), { - id, - label: id - }) - .pipe(Effect.provide(context)) as any - ) - const saveOther = (id: string) => - run( - invalidateQueries(client.SaveOtherItem, undefined, invalidator)(client.SaveOtherItem.handler({ id, label: id }), { - id, - label: id - }) - .pipe(Effect.provide(context)) as any - ) - - try { - expect(await run(awaitAtomResult(defaultRegistry, atom) as any)).toBe(0) - - await save("1") - expect(await run(awaitAtomResult(defaultRegistry, atom) as any)).toBe(1) - - const before = await run(client.GetRepoCountRuns.handler().pipe(Effect.provide(context)) as any) - await saveOther("x") - const after = await run(client.GetRepoCountRuns.handler().pipe(Effect.provide(context)) as any) - expect(after).toBe(before) - } finally { - unmount() - await runtime.dispose() - } -}, 10_000) - -it("tanstack engine: rpc repo write invalidates and refetches; unrelated rpc write does not", async () => { - const [runtime, client, context] = await setup() - const queryClient = new QueryClient({ - defaultOptions: { queries: { retry: false, gcTime: Infinity, staleTime: 0 } } - }) - const useQuery = makeTanstackQuery(() => context, queryClient) - const invalidator = makeTanstackQueryInvalidator(queryClient) - const app = createApp({ render: () => null }) - app.use(VueQueryPlugin, { queryClient }) - const scope = effectScope(true) - let handle: any - let data: any - const run = (effect: Effect.Effect) => Effect.runPromise(effect) - const save = (id: string) => - run( - invalidateQueries(client.SaveRepoItem, undefined, invalidator)(client.SaveRepoItem.handler({ id, label: id }), { - id, - label: id - }) - .pipe(Effect.provide(context)) as any - ) - const saveOther = (id: string) => - run( - invalidateQueries(client.SaveOtherItem, undefined, invalidator)(client.SaveOtherItem.handler({ id, label: id }), { - id, - label: id - }) - .pipe(Effect.provide(context)) as any - ) - - app.runWithContext(() => - scope.run(() => { - const tuple = useQuery(client.GetRepoCount as any)(ref(undefined) as any, {} as any) as any - data = tuple[1] - handle = tuple[3] - }) - ) - - try { - expect(await run(handle.refetch())).toBe(0) - - await save("1") - expect(data.value).toBe(1) - - const before = await run(client.GetRepoCountRuns.handler().pipe(Effect.provide(context)) as any) - await saveOther("x") - const after = await run(client.GetRepoCountRuns.handler().pipe(Effect.provide(context)) as any) - expect(after).toBe(before) - } finally { - scope.stop() - queryClient.clear() - await runtime.dispose() - } -}, 10_000) diff --git a/packages/e2e/tsconfig.json b/packages/e2e/tsconfig.json deleted file mode 100644 index d51e90c5f..000000000 --- a/packages/e2e/tsconfig.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "lib": [ - "esnext", - "DOM" - ], - "moduleResolution": "Node16", - "esModuleInterop": true, - "noEmit": true, - // Leaf test package: it imports workspace packages by source, so disable project-mode (which - // would demand every transitively-imported source file be listed) and emit nothing. - "composite": false, - "incremental": false, - "declarationMap": false, - "rootDir": "../..", - "types": [ - "node", - "vitest/globals" - ] - }, - "include": [ - "./test/**/*.ts" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/packages/e2e/vitest.config.ts b/packages/e2e/vitest.config.ts deleted file mode 100644 index 852ed8889..000000000 --- a/packages/e2e/vitest.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -/// -import { defineConfig } from "vitest/config" -import makeConfig from "../../vite.config.base" - -export default defineConfig({ - ...makeConfig(__dirname), - test: { - environment: "node", - include: ["**/test/**/*.test.{ts,tsx}"], - exclude: ["node_modules/**", "dist/**"], - globals: true - } -}) diff --git a/packages/effect-app/.madgerc b/packages/effect-app/.madgerc deleted file mode 100644 index b407c6b4b..000000000 --- a/packages/effect-app/.madgerc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "detectiveOptions": { - "ts": { - "skipTypeImports": true - } - } -} diff --git a/packages/effect-app/.npmignore b/packages/effect-app/.npmignore deleted file mode 100644 index 9e4be5957..000000000 --- a/packages/effect-app/.npmignore +++ /dev/null @@ -1,14 +0,0 @@ -*.test.js -*.test.d.ts -tsconfig.build.json -*.log -tslint.json -.eslintrc.js -.eslintignore -.madgerc -.swcrc -.cache -coverage/ -.tsbuildinfo -.build/ -!dist/ \ No newline at end of file diff --git a/packages/effect-app/CHANGELOG.md b/packages/effect-app/CHANGELOG.md deleted file mode 100644 index 739f630c5..000000000 --- a/packages/effect-app/CHANGELOG.md +++ /dev/null @@ -1,9018 +0,0 @@ -# @effect-app/prelude - -## 4.0.0-beta.320 - -## 4.0.0-beta.319 - -## 4.0.0-beta.318 - -### Patch Changes - -- 8bd5bfe: Update effect packages to `4.0.0-rc.112` (from `beta.107`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`. Sync `repos/effect` subtree from `Effect-TS/effect` at `effect@4.0.0-rc.112`. - - API adaptations for rc.112: - - - cluster encoded driver `resetAddress` → batched `resetAddresses` - - Cosmos `unprocessedMessages` honors optional `limit` / `addresses` (only claimed rows are returned) - - Service Bus `Runners.make` supplies `codecFor` for schema-aware RPC serialization - - `pnpm subtree:effect` passes `--url https://github.com/Effect-TS/effect.git` (published CLI still defaults to effect-smol) - - JSON Schema check constraints are compacted onto the parent (`minLength`/`maxLength` instead of `allOf`) - -## 4.0.0-beta.317 - -### Minor Changes - -- 186de3a: Stop forcing Date/Map/Set Encoded shapes to JSON. - - `Schema.Date` / `ReadonlySet` / `ReadonlyMap` now keep native Encoded types (`Date`, `Set`, `Map`). Use `DateFromString`, `ReadonlySetFromArray`, and `ReadonlyMapFromArray` when the Encoded form must be JSON. The query DSL accepts those native values, including array ops (`includes` / `in` / `includes-any`) on `Date[]` and `ReadonlySet` fields. Memory, Disk, SQL, and Cosmos convert Encoded Date/Map/Set through `Schema.toCodecJson` on write/read; query parameters and defaults lower the same way from the store schema. App types such as DateOnly stay native Encoded and JSON-lower via that schema — not a type registry. - -- 186de3a: Query maps as JSON arrays of `[key, value]` tuples. - - `where("meta", "hasKey" | "hasValue" | "hasKeyValue", ...)` (and `not*` / `*-any` / `*-all` variants) filter `ReadonlyMap` fields. Memory, Disk, SQLite, Postgres, and Cosmos compile those ops against the encoded tuple array. - -- 186de3a: JSON stores lower native Encoded values (Date, Map, Set, and app types such as DateOnly) through the store's document schema. - - `makeRepo` already passes that schema. Adapters encode documents, query parameters, and defaults with `Schema.toCodecJson(toEncoded(schema))` at the field path. No type registry. Schemaless stores still lower Date/Map/Set structurally. - -## 4.0.0-beta.316 - -## 4.0.0-beta.315 - -## 4.0.0-beta.314 - -## 4.0.0-beta.313 - -## 4.0.0-beta.312 - -### Patch Changes - -- 9ea024d: Improve repository schema encode/decode telemetry for event-loop tail analysis. - - - widen `app.schema.{encode,decode}.duration` histogram buckets into multi-second stalls - - count `app.schema.slow` (duration ≥ 100ms) with `app.entity` / operation attributes for alertable rates - - annotate spans with `app.schema.slow` and, on encode, `app.entity.state` from the first item's `_tag` - -## 4.0.0-beta.311 - -### Patch Changes - -- 547e2e1: Update effect packages to `4.0.0-beta.107` (from `beta.90`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`, and `fast-check` to `^4.9.0`. Sync `repos/effect` subtree from `Effect-TS/effect` (effect-smol stopped publishing tags after beta.98). - - API adaptations for beta.107: - - - `concurrency: "inherit"` → `"unbounded"` - - `Schema.ErrorClass` / `TaggedErrorClass` → `Schema.Error` / `TaggedError` - - `Schema.LazyArbitrary` → `Schema.Arbitrary` - - `Schema.DateValid` / `isDateValid` removed (`Schema.Date` rejects invalid dates) - - `SchemaIssue` constructors no longer take `Option` (annotations + input) - - filter meta via `annotations.representation` instead of `annotations.meta` - - `context.defaultValue` → `context.constructorDefault` (single Link) - - Class detection via `~constructor` + static `identifier` - - Redacted detection via `representation.id` - - localized StandardSchema hooks updated for new issue/input model - - provide `NodeCrypto.layer` for cluster sqlite tests - - default `sync-effect` subtree URL → `Effect-TS/effect` - -## 4.0.0-beta.310 - -## 4.0.0-beta.309 - -### Patch Changes - -- 99c43c4: Derive scoped dependency reads and writes from typed query filters and annotated model relationships, including previous aliases. - -## 4.0.0-beta.308 - -## 4.0.0-beta.307 - -### Patch Changes - -- 40585ca: Keep tag-aware `ProjectableFromDomain` for `projectComputed` only; restore loose key-presence guard for `project()` so view DTOs with reshaped fields keep typechecking. -- ad0ede6: Keep tag-aware `ProjectableGuard` on both `project()` and `projectComputed` (no loose key-only paper-over). - - Hardening: - - - single-literal tags allow dual same-tag domain variants (KeysOfUnion of matched members) - - multi-tag / string tags still require keys on every matched member - - optional projection/domain keys checked by key presence only (not optional-assignability) - - Call sites must project domain-owned fields per tagged state. - -## 4.0.0-beta.306 - -### Patch Changes - -- 0fe925d: Tag-aware `ProjectableFromDomain` for `projectComputed`: projection Encoded fields must exist on the matching domain tagged state (or be computed). Prevents Overview.List SchemaErrors when cancel states omit workflow lock fields like `activeRequest`. - -## 4.0.0-beta.305 - -### Minor Changes - -- 8bd9a11: Support ID-scoped signal dependencies and additive repository dependencies derived from previous and current entities. - -## 4.0.0-beta.304 - -### Patch Changes - -- 412f08b: Include changed entity IDs in repository data dependencies, with explicit query scopes and configurable write aliases, while retaining coarse collection dependencies. - -## 4.0.0-beta.303 - -### Patch Changes - -- 33b0544: Replace repository codec child spans with parent-span timing attributes and bounded metrics, and record database operation timing for instrumented stores. - -## 4.0.0-beta.302 - -### Patch Changes - -- c0e5a1b: Add `Schema.dropConstructorDefault`, a `Struct.Lambda` that clears a field's `withConstructorDefault`. Compose it with `Struct.omit`/`Struct.map` when deriving a partial-update schema from a "create" schema, so omitted fields' constructor defaults don't resurrect themselves in `.make(...)` output. - - Also, `makeExactOptional` now drops constructor defaults automatically, matching this behavior. - -## 4.0.0-beta.301 - -## 4.0.0-beta.300 - -## 4.0.0-beta.299 - -## 4.0.0-beta.298 - -### Patch Changes - -- 08d092c: Update Atom query caches in memory and accumulate stream invalidations so live events do not cause repeated RPC refetches. - -## 4.0.0-beta.297 - -### Patch Changes - -- 30c512d: fix rpc middleware context type issue - -## 4.0.0-beta.296 - -### Patch Changes - -- e0c4835: revert bs - -## 4.0.0-beta.295 - -### Patch Changes - -- eb06b32: improve root union select - -## 4.0.0-beta.294 - -### Patch Changes - -- a211c12: Fix projection schema typing for union members and computed projections. - -## 4.0.0-beta.293 - -### Patch Changes - -- d1c15d3: Tighten projectComputed projection schema typing against encoded repo fields and computed output types. - -## 4.0.0-beta.292 - -## 4.0.0-beta.291 - -## 4.0.0-beta.290 - -### Patch Changes - -- dc07df5: Fix nested DTO subset projection inference for tagged unions. - -## 4.0.0-beta.289 - -### Patch Changes - -- a1b59bc: Allow query projections to use a repository's full union schema. - -## 4.0.0-beta.288 - -### Minor Changes - -- aeb17bc: Add `disableQueryInvalidation` flag to Command config for background saves. - - Set `disableQueryInvalidation: true` in a `Req.Command` config (3rd argument) - to suppress all client-side query invalidation for that command — client - `invalidatesQueries` callbacks, server-returned `metadata.invalidateQueries`, - and repository-derived write-dependency matching are all skipped. Use for - background saves (e.g. debounced auto-save) whose writes should not trigger - query refetches. - - - `InvalidationConfig` gains `disableQueryInvalidation?: boolean`. - - `RequestHandlerWithInput` gains `disableQueryInvalidation?: boolean`, - propagated from `Request.config` by `ApiClientFactory.makeFor`. - - `invalidateCache` early-returns `Effect.void` when the flag is set, - applying to both regular and stream mutations. - -## 4.0.0-beta.287 - -### Patch Changes - -- 261470f: Remove the local `Schema.Void` / `SchemaAST.Void` override. effect `4.0.0-beta.90` ships the TypeScript `void` parser semantics upstream (`SchemaAST.Void.getParser()` → `fromAnyToConst(undefined)`, the effect-smol PR #2475 behavior), so `S.Void` already accepts any present value and discards it to `undefined`. `Schema.Void` now re-uses effect's `S.Void` and `SchemaAST` is a plain re-export of `effect/SchemaAST`. The unused `Void_` alias is dropped. No behavior change. - -## 4.0.0-beta.286 - -### Patch Changes - -- b6dda09: Update effect packages to `4.0.0-beta.90` (from `beta.88`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`. No source changes required — typecheck and tests pass unchanged. - -## 4.0.0-beta.285 - -### Patch Changes - -- 7bd8234: Use set-backed data dependencies and provide request-scoped dependency services through a shared root-checked helper. - -## 4.0.0-beta.284 - -## 4.0.0-beta.283 - -### Minor Changes - -- 0054611: Derive query invalidation from repository read/write dependencies and propagate dependency metadata through RPC clients. - -### Patch Changes - -- 0054611: Stream RPC: drain read/write data-dependencies per emitted value chunk instead of sending the - cumulative set on every metadata chunk. Each metadata chunk now carries only the delta recorded - since the last chunk, the bucket is cleared for the next segment, and the terminal "done"/"error" - chunks drain the remainder. The emit condition also broadens to include non-empty reads, so stream - queries forward their read-dependencies mid-stream too. The client already accumulates deltas into - its per-call recorder, so no FE change is required. - -## 4.0.0-beta.282 - -### Minor Changes - -- b2df3fa: Align `Schema.Void` with TypeScript `void` return-value semantics (effect-smol PR #2475 / `b7d46ab`). - - `S.Void` now accepts **any present value** at runtime and discards it to `undefined`, while keeping the decoded/encoded type as `void` — matching a `void` return whose result callers never observe. This is implemented as an override of the AST node in a new `effect-app/SchemaAST` module (`export * from "effect/SchemaAST"` plus a `Void` subclass whose parser mirrors the PR's `fromAnyToConst(undefined)`), so there is a single canonical `Void` used everywhere, including RPC success schemas. - - - New `effect-app/SchemaAST` module; internal `SchemaAST` imports across the libs now route through it. - - Removed `ForceVoid` from `effect-app/client/makeClient` — use `S.Void` directly, which now carries this behaviour. - - `S.Void_` remains available as effect's original (`undefined`-only) Void. - -### Patch Changes - -- f150cf9: Remove obsolete queue machinery left unused after the move to cluster entities: the SB/SQLite/mem `QueueMaker` implementations (`QueueMaker/{SQLQueue,memQueue,sbqueue}.ts`), their `ServiceBus.ts`/`memQueue.ts` transports, and `RequestFiberSet.ts` (its `setRootParentSpan` helper is inlined into `MainFiberSet`). `effect-app/QueueMaker` keeps only `QueueMeta`; the `QueueBase` interface and empty `QueueMaker` ops object are dropped. -- e8842aa: Update effect packages to `4.0.0-beta.88` (from `beta.86`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`. Also bump `@effect-app/cli` to `2.1.0-beta.35`. No source changes required — typecheck and tests pass unchanged. - -## 4.0.0-beta.281 - -### Patch Changes - -- ffd140f: Update effect packages to `4.0.0-beta.86` (from `beta.84`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`. No source changes required — typecheck and tests pass unchanged. - -## 4.0.0-beta.280 - -### Patch Changes - -- 3eda52e: Fix `StructFacade` to extend effect-app's own `Struct`, not `effect/Schema`'s. - - `StructFacade` was built on `Omit, ...>` where `S` is `effect/Schema` (core). Scanner / consumer models are effect-app `S.Struct`, which is a distinct type from effect core's `Struct`, so a facade built on the core `Struct` is not assignable where an effect-app struct is expected — e.g. workflow payloads (`Workflow<…, Struct>`) and other effect-app `Struct`-shaped positions failed to type-check. Switch the `Omit` base to effect-app's `Struct` (the `Fields extends S.Struct.Fields` constraint stays effect core, matching effect-app's own `Struct`). - -## 4.0.0-beta.279 - -### Minor Changes - -- 5f9cd6a: Schema/Class facades: add `StructFacade` and carry `identifier` on the class facades. - - - Add `StructFacade` = `Omit, "Type" | "Encoded" | "~type.make.in" | "DecodingServices" | "EncodingServices"> & { pinned type-level members }`. A top-level `const X = S.Struct(...)` / `S.TaggedStruct(...)` model faceted by the `.d.ts`-emit compiler is retyped to it: still a real `S.Struct` (so `Workflow.AnyStructSchema`, the `Struct` reconstruction, `Union`, `.fields.x` keep working) while `Type`/`Encoded`/make/services resolve to the named namespace interfaces. - - Add `readonly identifier: string` to `OpaqueClassFacade` and `OpaqueErrorFacadeClass` (an `S.Class` static lost from the bare emitted interface, which the compiler otherwise had to hand-emit per model). `OpaqueFacade` is intentionally left untouched — `S.Opaque` and requests build on `S.Bottom`, not `S.Class`, so they have no `identifier`. - -## 4.0.0-beta.278 - -### Patch Changes - -- a354345: Move release tsconfig flattening from publish to pack lifecycle so package configs are restored before registry upload/auth can fail. -- a69da09: Publish from generated staging directories so release-only files are created outside the source package tree. - -## 4.0.0-beta.277 - -## 4.0.0-beta.276 - -### Patch Changes - -- 32f05c8: Remove unused dependency declarations from package manifests. - -## 4.0.0-beta.275 - -## 4.0.0-beta.274 - -## 4.0.0-beta.273 - -### Patch Changes - -- 664e83d: Add Atom-native Vue query APIs, stream query pull atoms, and a TanStack-backed legacy query engine toggle. -- e4ff9a6: Fix the global `Array`/`ReadonlyArray.map` override breaking union-of-array receivers. The previous `this: NonEmptyArray`/`NonEmptyReadonlyArray` overload was selected-then-rejected on a union receiver (e.g. `(readonly A[] | readonly B[]).map(...)`), raising TS2684. Replaced with a single conditional-return signature (`this extends NonEmpty… ? NonEmpty : U[]`) that preserves NonEmpty refinement without a `this` parameter, so union-array `.map` calls type-check again. - -## 4.0.0-beta.272 - -### Patch Changes - -- 21ac90a: Unify generated model facades on `OpaqueFacade` and support class facades through encoded-key schema transforms. - -## 4.0.0-beta.271 - -### Patch Changes - -- 939bebc: Remove the local `Config.nested` / `ConfigProvider.nested` overrides. They worked around an effect v3 bug where the nested namespace segment bypassed the provider's `mapInput`/`constantCase` transform. effect `4.0.0-beta.84` fixes this upstream (its transformation-compose refactor threads the nested prefix through the provider's lookup transform), and the old overrides relied on internals (`Config.make`, `provider.get`/`mapInput`/`prefix`) that no longer exist. Both modules now re-export effect directly; behaviour for consumers (e.g. `Config.nested("cups")` against a `constantCase` env provider) is unchanged and correct. - -## 4.0.0-beta.270 - -### Patch Changes - -- 78d076a: Update effect packages to `4.0.0-beta.84` (`effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`). - -## 4.0.0-beta.269 - -### Patch Changes - -- 50b022e: Harden model facades and add `OpaqueErrorFacadeClass`. - - - `OpaqueErrorFacadeClass`: facade `TaggedErrorClass`/`ErrorClass` while keeping - `Cause.YieldableError` on the constructed instance (so `yield* new Err()`, - `Effect.fail`, and `instanceof` keep working through the facade). - - `OpaqueFacadeInput` relaxed to require only the codec service channels, so - transformed schemas (`.pipe(encodeKeys/annotate/filter/...)`) can be facaded; - `fields`/`copy`/`mapFields` flow through `OpaqueFacadeStatics` when present, and - `to` is carried so models that compose via `X.to.fields` keep working. - - Dropped the wide `fields`/`mapFields` overrides on the facade interfaces so the - precise statics win (keeps `Q.project(X.mapFields(...))` typed). - - Codegen (`eslint-codegen-model`): resolver prefers the private `_X` over the - self-referential facade; converges static service types in one run; per-model - classification (facade Opaque models, leave `Class` standard in mixed files); - `Make` emitted as `type X = {...} | void` when the make-input is voidable; - `readonly`-prefixed array/tuple elements parenthesized; value self-references in - the moved `_X` body rewritten to `_X`; instance getters surface on `Self`. - -- 50b022e: Add generated opaque model facades that expose static Type, Encoded, Make, and Schema declarations without leaking the private struct schema type to downstream project references. - -## 4.0.0-beta.268 - -### Patch Changes - -- acfdc9e: Point development package exports at TypeScript sources while keeping published exports on compiled dist files. - -## 4.0.0-beta.267 - -### Minor Changes - -- 23a7167: Add a typed, serializable `DatabaseError { message, transient, cause }` for store adapter failures. - - Store adapters wrapped DB calls in bare `Effect.promise` / `.orDie`, so a transient infra failure (request timeout, throttle, 5xx, dropped socket) became a raw-`Error` defect — which `Effect.retry` can't retry and which breaks JSON encoding of a workflow exit cause ("Expected JSON value, got Error"). `DatabaseError` is now exposed on all `Store` and `Repository` method error channels (writes: `OptimisticConcurrencyException | DatabaseError`) and added to `SupportedErrors` so the api/client/FE treat it as a 500-class error. Each adapter wraps its db-call failures into `DatabaseError` with a `transient` flag (timeout/throttle/5xx ⇒ retryable); the `cause` serializes via `Schema.Defect`. Construction/seed/DDL paths stay `orDie`. - -## 4.0.0-beta.266 - -### Patch Changes - -- bbaa67e: Fix `TS2589: Type instantiation is excessively deep and possibly infinite` when querying models that embed `Schema.Defect()` (or any field encoded as `Json`). - - The query path type `Path` (used by `Q.where`/`Q.and`/`Q.order` to type dotted field paths) recursed through object types with no termination for self-referential ones. Under effect `4.0.0-beta.83`, `Schema.Defect()` encodes as `Json`, whose `JsonObject = { readonly [x: string]: Json }` index signature made `Path` descend forever, blowing past TypeScript's instantiation limit on any model with such a field (e.g. carrier-error states carrying `raw: Schema.Defect()`). - - `Path` now threads a `Seen` set of already-entered object types and stops before re-entering one, so self-referential types terminate (the field itself stays a valid leaf path; only the unbounded descent is cut). Finite models are unaffected. - -## 4.0.0-beta.265 - -### Patch Changes - -- 3e855bc: Update Effect packages to `4.0.0-beta.83` (from `beta.74`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/sql-sqlite-node`, `@effect/atom-vue`, `@effect/vitest`. - - Adapt the infra workflow engines to beta.83 API changes: - - - `Schema.Defect` is now a constructor function — use `S.Defect()` when building the deferred-exit codec (the bare constant no longer produces a usable schema and crashed `toType`). - - `Workflow` exposes its name as `_tag` instead of `name`. `WorkflowEngineSqlite`/`WorkflowEngineCosmos` now key the registry, codec caches, and persisted `workflow_name` off `workflow._tag`, fixing crash-recovery (stale-lease re-drive previously registered under an `undefined` key and never matched). - -## 4.0.0-beta.264 - -## 4.0.0-beta.263 - -## 4.0.0-beta.262 - -### Patch Changes - -- 55c6572: update packages - -## 4.0.0-beta.261 - -## 4.0.0-beta.260 - -### Patch Changes - -- bogus - -## 4.0.0-beta.259 - -## 4.0.0-beta.258 - -## 4.0.0-beta.257 - -### Minor Changes - -- e71eb78: Tighten typing of query DSL builders so field/path parameters are constrained to actual field paths instead of bare `string`: - - - `relation(path)` now infers the relation's element type and constrains `distinctCount`/`sum`/`collect`/`collectDistinct`/`collectFields`/`collectDistinctFields` and the `unit` of `sumExprBy`/`sumExprNormalized` to `FieldPath`. - - `relation(path).expr` exposes a scope-bound math-expression builder so `expr.field(...)` inside `sumExpr`/`sumExprBy`/`sumExprNormalized` is typed against the relation element. - - Top-level `expr.field` accepts an optional generic for opt-in tightening (`expr.field("x")`). - - `aggregate(schema, build)` accepts a builder callback whose `agg` argument is bound to the source row inferred from the pipe — paths are checked without any explicit generic: `make().pipe(aggregate(schema, ($) => ({ city: $.field("address.city") })))`. Plain `AggregateMap` form still accepted. - - `projectComputed(schema, build, mode?)` accepts a builder callback whose `{ relation }` argument is bound to the source row inferred from the pipe: `make().pipe(projectComputed(out, ({ relation }) => ({ total: relation("items").sum("qty") })))`. Plain `ComputedProjectionMap` form still accepted. - - `agg()` factory remains as an escape hatch when the builder is built outside a pipe. - -## 4.0.0-beta.256 - -### Patch Changes - -- 347af48: Fix schema interface widening regression introduced in 4.0.0-beta.255 (changeset `olive-onions-lose`). - - The original refactor annotated branded schema constants with interfaces extending `S.Codec & WithDefaults<...>`. That widened the underlying `BrandedSchema<...>` chain and dropped phantom slots (`Iso`, `~type.make.in`, `~type.parameters`, `Rebuild`, etc.) that downstream combinators read. In consumer projects this surfaced as `DecodingServices` / `EncodingServices` leaking as `unknown` — for example `Q.project(schema, "project")` failing with `Type 'unknown' is not assignable to type 'never'`, and RPC handler / generator-return shape mismatches against `Effect`. - - Each `*Schema` interface now extends the concrete underlying chain (e.g. `BrandedSchema`) and adds a call signature for `withDefaultMake` (and an explicit `withConstructorDefault` field for the numeric and `StringId` schemas). The runtime values are unchanged and the type-display improvement is preserved. - - Affected: `NonEmptyString*`, `Min3String255`, `StringId`, `Url`, `PositiveInt`, `NonNegativeInt`, `Int`, `PositiveNumber`, `NonNegativeNumber`, and `brandedStringId`. - -## 4.0.0-beta.255 - -### Patch Changes - -- 52a31dd: Reduce schema type complexity by exposing explicit interfaces for branded string and number schemas. - - Each branded constant in `Schema/strings.ts`, `Schema/moreStrings.ts`, and `Schema/numbers.ts` now has a named interface (e.g. `NonEmptyStringSchema`, `StringIdSchema`, `PositiveIntSchema`, `UrlSchema`) annotating its `export const`. Mirrors the pattern used in `effect/Schema` itself — TypeScript reports the interface name instead of expanding the full pipe/brand/extension chain, which shrinks inferred types in consumer code and speeds up type display. - - No runtime or API surface changes; `brandedStringId` now returns `BrandedStringIdSchema` (same shape as before, just named). - -## 4.0.0-beta.254 - -### Patch Changes - -- 29a1e57: Repository `changeFeed` is now namespace-aware. Events carry the `storeId` namespace as a third tuple element (`ChangeFeedEvent = [items, op, namespace]`). `subscribe` accepts `options.namespace` to register a per-namespace handler; omitting it registers a wildcard handler that receives events from every namespace. Per-namespace handler buckets eliminate cross-namespace fan-out and avoid waking handlers for irrelevant tenants. - -## 4.0.0-beta.253 - -### Patch Changes - -- b90fa30: Repository `changeFeed` now broadcasts synchronously: `publish` awaits every subscribed handler before resolving. Replaces `PubSub.PubSub` with a `ChangeFeed` interface (`publish` + scoped `subscribe`). Handlers are auto-removed when the subscriber's scope closes, and the full handler set is cleared when the repository's scope closes. Repository construction now requires `Scope` — wire `makeRepo` through `Layer.scoped` / `Effect.scoped`. - -## 4.0.0-beta.252 - -### Patch Changes - -- a788432: fix circular - -## 4.0.0-beta.251 - -### Patch Changes - -- 1c858d3: fix request scope problems - -## 4.0.0-beta.250 - -### Patch Changes - -- 3053760: fix: restore context map container behavior - -## 4.0.0-beta.249 - -### Minor Changes - -- ba789a2: Move core service contracts and runtime-agnostic modules into `effect-app`, keep `infra` and `vue` focused on adapters, and drop the temporary `infra` compatibility re-export paths in favor of the new canonical imports. - - `@effect-app/infra` no longer re-exports moved core modules such as `./Model`, `./Emailer/service`, `./QueueMaker/service`, `./Store/service`, `./adapters/*`, or `./api/*` entrypoints. - -## 4.0.0-beta.248 - -### Patch Changes - -- 2a86a17: improve tsgo compat: avoid deferred `Schema.Type`/`Codec.Encoded`/`Codec.DecodingServices`/`Codec.EncodingServices` conditional helpers in generic positions where the type parameter is already constrained to `Schema.Top`. Index the property directly (`X["Type"]`, `X["Encoded"]`, `X["DecodingServices"]`, …) so tsgo doesn't leak `unknown` into `Effect` channels (notably `R`). - - Sites: `client/clientFor.ts` (`RequestHandlerFor`, `FinalTypeOf`, `ExtractResponse`, `ExtractEResponse`), `client/makeClient.ts` (`InputFromPayload`, `OutputFromSuccess`, `InvalidationConfigForCommand`, `TaggedRequestWithMeta` overloads), `rpc/MiddlewareMaker.ts` (`Errors`), `rpc/RpcMiddleware.ts` (`Failure`, `FailureContext`), `Schema/ext.ts` (`ReadonlySetFromArray`, `ReadonlyMapFromArray`), `infra/routing.ts` (`GetSuccessShape`, handlers, route matcher), `vue/makeClient.ts` (`MutationExt.project`, `MutationWithExtensions`, `QueryProjection`), `vue/routeParams.ts` (`parseRouteParams*`). - -## 4.0.0-beta.247 - -### Patch Changes - -- 01bab22: Work around tsgo failing to reduce `S.Codec.DecodingServices` (`X extends Top ? X["DecodingServices"] : never`) in generic positions, which left `unknown` and polluted the `R` channel of client handlers and RPC middleware failure context. Since the schemas involved are already constrained to `S.Top`, read `["DecodingServices"]` directly in `RequestHandlerFor`, `TagClass.FailureContext`, and the Vue `MutationExt` / `QueryProjection` types. - -## 4.0.0-beta.246 - -## 4.0.0-beta.245 - -## 4.0.0-beta.244 - -### Patch Changes - -- b8b9080: update packages - -## 4.0.0-beta.243 - -## 4.0.0-beta.242 - -### Patch Changes - -- da83c1f: Align `InvalidationEntry` (vue) with `InvalidateQueryInstruction` (effect-app). - - `InvalidateQueryInstruction` is now parametrized over `Filters` / `Options` - (defaulting to `Record` so the core stays framework-agnostic). - `@effect-app/vue` exposes `InvalidationEntry` as a narrowed alias substituting - `@tanstack/vue-query`'s `InvalidateQueryFilters` and `InvalidateOptions`. Single - source of truth for the union shape across both packages. - -- 21017d5: `InvalidationSet.add` accepts arrays and is exposed as a static shortcut. - - - Single item: `yield* InvalidationSet.add(UserRsc.GetMe)` - - Batch: `yield* InvalidationSet.add([UserRsc.GetMe, ["custom", "key"]])` - - Skips the `.use(_ => _.add(...))` boilerplate. - - Existing `InvalidationSet.use(_ => _.add(...))` form still works; the service - identity is preserved via `Object.assign` so `Effect.provideService` and - `.use` / `.useSync` continue to operate on the same `Context.Reference`. - -- 2495ace: `InvalidationSet.add` accepts RPC handler shorthand. - - Server-side handlers may now pass an RPC handler object directly to - `InvalidationSet.add`; its query key is derived via `makeQueryKey`. Raw - `InvalidationKey` arrays continue to work. - - ```ts - // before - yield * - Invalidation.InvalidationSet.use((_) => _.add(makeQueryKey(UserRsc.GetMe))); - - // after - yield * Invalidation.InvalidationSet.use((_) => _.add(UserRsc.GetMe)); - ``` - -## 4.0.0-beta.241 - -### Patch Changes - -- b035b1c: Isolate per-call `Effect.provide(layers)` / `Stream.provide(layers)` in the - RPC api client factory via `{ local: true }`. - - `layers` here is built per RPC invocation from a caller-supplied - `requestLevelLayers` plus a fresh `RequestName` layer. Today both pieces are - stateless, so no observable bug — but `Effect.provide(layer)` without - `local: true` resolves its `MemoMap` from the ambient fiber context, and on a - long-lived runtime (browser app, server fiber) any stateful layer slipped into - `requestLevelLayers` by a caller would be memoized and shared across every - subsequent RPC call. `{ local: true }` builds the layer fresh per call and - skips the ambient MemoMap entirely. - - Also documents the rule in `AGENTS.md` ("Per-request `Effect.provide(layer)` - must isolate its MemoMap") so the pattern is enforceable in code review and - caught early. Companion to the `provideOnRequestScope` MemoMap fix in - `@effect-app/infra`. - -## 4.0.0-beta.240 - -## 4.0.0-beta.239 - -## 4.0.0-beta.238 - -## 4.0.0-beta.237 - -## 4.0.0-beta.236 - -## 4.0.0-beta.235 - -### Patch Changes - -- ba4bdc3: improve: support .ts extension -- 6cfd83d: update effect to latest beta - -## 4.0.0-beta.234 - -## 4.0.0-beta.233 - -### Patch Changes - -- 57a1862: Update to effect 4.0.0-beta.67. Switch deps from `pkg.pr.new` snapshot back to npm beta tag. - -## 4.0.0-beta.232 - -### Patch Changes - -- 0263827: Fix `Date` / `DateValid` default helpers to pipe from their own schema. - - `withConstructorDefault` and `withDecodingDefaultType` on `DateValid` previously piped from `DateFromString`, dropping the `isDateValid()` check (and, after the recent identifier split, the `DateValid` annotations) from the resulting defaulted schema. Both `Date` and `DateValid` now use `extendM` so the helpers attach to the underlying schema (`DateFromString` / `DateValidFromString`). - -- 0263827: Distinguish `Date` and `DateValid` in JSON Schema output. - - - `Date` now emits identifier `DateOrInvalid` with description noting the value may be invalid. - - `DateValid` now emits its own annotated string (identifier `Date`) with description stating a valid ISO 8601 date is required. - -- 0263827: Update to effect `pkg.pr.new` snapshot at `a42ef66` (4.0.0-beta.66). Remove `Yieldable` and `asEffect()` (service tags are now `Effect` directly). - -## 4.0.0-beta.231 - -### Patch Changes - -- 7ca66ce: Update to effect 4.0.0-beta.66. Remove `Yieldable` and `asEffect()` (service tags are now `Effect` directly). - -## 4.0.0-beta.230 - -## 4.0.0-beta.229 - -## 4.0.0-beta.228 - -## 4.0.0-beta.227 - -## 4.0.0-beta.226 - -## 4.0.0-beta.225 - -## 4.0.0-beta.224 - -## 4.0.0-beta.223 - -## 4.0.0-beta.222 - -## 4.0.0-beta.221 - -### Patch Changes - -- 439cbeb: Adopt module system from effect-smol: replace barrel imports with specific submodule imports (`import * as X from "effect-app/X"` / `import * as X from "effect/X"`). - -## 4.0.0-beta.220 - -## 4.0.0-beta.219 - -### Patch Changes - -- d738811: remove double prefix - -## 4.0.0-beta.218 - -## 4.0.0-beta.217 - -### Patch Changes - -- 0e824ef: add missing Brand - -## 4.0.0-beta.216 - -## 4.0.0-beta.215 - -## 4.0.0-beta.214 - -## 4.0.0-beta.213 - -## 4.0.0-beta.212 - -### Patch Changes - -- 8792221: Rename `withDefault` schema extensions to `withConstructorDefault` for clarity. - - Document that `.withConstructorDefault` is **construction-only** (applied during `.make(...)` when a field is omitted) and is **not** applied during decode — it cannot be used to JIT-migrate database fields. Per-property JSDoc on every `.withConstructorDefault` / `.withDecodingDefaultType` exposed by `Schema/ext.ts`, `Schema/numbers.ts`, `Schema/moreStrings.ts`, and `ids.ts` so the caveat is visible on hover. - - Re-export `withConstructorDefault`, `withDecodingDefault`, `withDecodingDefaultKey`, `withDecodingDefaultType`, and `withDecodingDefaultTypeKey` from `effect-app/Schema` with explicit JSDoc. `withDecodingDefault*` is discouraged for persisted data: a missing field may be data corruption rather than an old-shape document, and silently substituting a default hides the problem. Prefer an explicit, preferably versioned migration of database data over decode-time fallbacks. - -## 4.0.0-beta.211 - -## 4.0.0-beta.210 - -## 4.0.0-beta.209 - -### Patch Changes - -- c991be1: update packages -- 3bae238: Remove lodash type imports from utils.ts, replacing with native TypeScript equivalents. - -## 4.0.0-beta.208 - -## 4.0.0-beta.207 - -### Patch Changes - -- 8fffc3c: cleanup - -## 4.0.0-beta.206 - -### Patch Changes - -- 54bfc59: Require middleware to flow through `makeRpcClient` and the live layer through `makeRouter`. - - ### `makeRpcClient(middleware, generalErrors?)` - - Signature drops the `rcs` (request-context map wrapper) parameter. `rcs` was only load-bearing on the type side for `RequestConfig` inference; that information is now derived from `middleware.requestContextMap`. `middleware` is required — the previous "rcs + optional middleware" overload is gone. - - **Migration**: - - ```diff - -makeRpcClient(RequestContextMap, undefined, AppMiddleware) - +makeRpcClient(AppMiddleware) - ``` - - For tests/clients without a real middleware, build a minimal stub (`{ requestContextMap, requestContext }`) or pass any value satisfying `ClientMiddleware`. - - ### `makeRouter(middlewareLive)` - - `makeRouter()` no longer infers the live middleware layer from `meta.middleware.Default`. The Live layer is now passed explicitly to `makeRouter`, and the request classes only carry the middleware tag (schema-only). This decouples the router from any assumption that the middleware tag exposes a `Default` static. - - **Migration**: - - ```diff - -export const { Router, matchAll } = makeRouter() - +export const { Router, matchAll } = makeRouter(AppMiddleware.Default) - ``` - -## 4.0.0-beta.205 - -### Patch Changes - -- f313973: fix type make interface - -## 4.0.0-beta.204 - -### Patch Changes - -- 0a0030f: fix missing overloads - -## 4.0.0-beta.203 - -### Patch Changes - -- 992d9fa: fix more branded types - -## 4.0.0-beta.202 - -### Patch Changes - -- 1186b09: improve branded types, keep types through Rebuild - -## 4.0.0-beta.201 - -### Patch Changes - -- d67d17a: Source middleware errors exclusively from the rpc middleware tag, and move command/stream invalidation wrap/unwrap entirely into the routing layer (server) and `apiClientFactory` (client). `InvalidationMiddleware` and `InvalidationMiddlewareLive` are removed. - - ### Resource error schemas - - Three sites that used to fold `RequestContextMap[*].error` into a request's own error schema now stop doing so: - - - `makeRpcClient` / `makeRequestClass` — `failureSchema` is just `config.error` (still merged with the optional `generalErrors` parameter, which is the only remaining error mix on both type and runtime levels). - - `MiddlewareMaker.rpc()` — `error: options.error` only; the previous union with `rcm.config[*].error` is gone. - - Routing and `apiClientFactory.makeRpcGroupFromRequestsAndModuleName` — `Invalidation.makeCommandRpc` is called with `error: resource.error` (no widening with the composite middleware error union). - - Middleware errors reach the client through the rpc's `middlewares[*].error` failure-union channel of `Rpc.exitSchema`, exposed by attaching the middleware tag to the rpc on both sides: - - - **Server**: `makeRouter(middleware)` attaches the live composite tag (existing behavior). - - **Client**: new `middleware` option on `ClientForOptions` / `ApiClientFactory.makeFor(layer, { middleware })` attaches the same tag schema-only (no Live invoked). Threaded through `makeRpcGroupFromRequestsAndModuleName` to `RpcGroup.middleware(tag)`. Without it, stream rpcs (whose top-level `errorSchema` is forced to `Never` by effect-rpc) hit `SchemaError: Expected never | { _tag: "error", ... }` decoding middleware-thrown errors that bypass the in-stream `Stream.catch` wrap. - - **Migration**: handlers that yield errors previously sourced from rcm (e.g. `yield* new UnauthorizedError()`) now require those errors to be declared explicitly on the resource — `Req.Query()("...", fields, { success, error: UnauthorizedError })`. The handler error type no longer auto-includes the rcm union. - - ### Invalidation wrap/unwrap - - - `routing.ts` (server) provides a per-request `InvalidationSet` for commands, wraps the success value as `CommandResponseWithMetaData`, and converts handler-thrown failures into `CommandFailureWithMetaData` so accumulated invalidation keys reach the client on either path. Stream wrap (per-chunk envelope + final `done` chunk) was already in routing and is unchanged. - - `apiClientFactory.ts` (client) `unwrapCommand` strips both envelopes and forwards keys to `InvalidationKeysFromServer`. - - `InvalidationMiddleware` (the tag) and `InvalidationMiddlewareLive` (the layer) are **removed**. The middleware was the previous home of the wrap; with the wrap moved to routing/apiClientFactory, the middleware became a thin pass-through and is no longer needed. `DefaultGenericMiddlewares` and `DefaultGenericMiddlewaresLive` shrink accordingly — no migration needed for callers that used the defaults; callers that referenced `InvalidationMiddleware` / `InvalidationMiddlewareLive` directly should drop those imports. - - Middleware-thrown errors are never wrapped: by definition the handler never ran, so there is nothing to invalidate. They flow raw on the Cause and the client decodes them via the middleware-tag failure-union channel described above. - -## 4.0.0-beta.200 - -### Patch Changes - -- 8f1cf6a: able to configure schema concurrency -- 0cff7c1: workaround middleware error issue - -## 4.0.0-beta.199 - -## 4.0.0-beta.198 - -### Patch Changes - -- 32dbc54: fix stream type when no success specified - -## 4.0.0-beta.197 - -### Minor Changes - -- 3dc0d2a: Add streaming as a `stream: true` config option on `Query` / `Command` instead of a separate request type. - - `TaggedRequestFor` now exposes only `Query` and `Command` factories — the standalone `Stream` factory is removed. To produce a Stream of `success` values, pass `stream: true` in the request config. The request `type` field stays `"command" | "query"`; a new `stream: boolean` field carries the streaming flag (stripped from the stored handler config). - - ```ts - // Query that streams results - Req.Query()("Tag", {}, { stream: true, success: ... }) - - // Command that streams results - Req.Command()("Tag", {}, { stream: true, success: ... }) - ``` - - Vue client mapping (per-handler properties mirror the non-stream API — `.query`, `.fn`, `.mutate`): - - - `query` + `stream: true` → exposes `.query` (read-only streaming, tracked Vue Query). Helper map key: `${name}Query`. - - `command` + `stream: true` → exposes `.fn` and `.mutate` (mutating streaming). - - Plain `query` / `command` unchanged. - - Server routing dispatches via the new `stream` flag (`makeStreamRpc` for streaming commands/queries, `makeCommandRpc` / `Rpc.make` otherwise). - - Also lifts the `Struct` / `TaggedStruct` and `Opaque` definitions in `effect-app/Schema` to use `S.Bottom` / `S.Opaque` directly, exposing `fields`, `mapFields`, and a `MakeIn` that allows `void` when all fields are optional. `TaggedRequestFor` request classes now use `Opaque(TaggedStruct(...))` instead of `TaggedClass`, and decoding/encoding services are derived from `success` / `error` rather than stored on the request. - - **Migration**: replace `Req.Stream` with `Req.Query` or `Req.Command` and add `stream: true` to the config — `Query` for read-only streams, `Command` for mutating streams. - -## 4.0.0-beta.196 - -## 4.0.0-beta.195 - -### Patch Changes - -- 774a9b3: `MiddlewareMaker.makeMiddlewareBasic` now derives each middleware's effective error from both the static `error` field on the tag AND the `rcm` config entry referenced by `dynamic.key`, rather than relying on the static field alone. - - Middlewares declared with `dynamic: RequestContextMap.get("foo")` (instead of an explicit static `error: ...`) end up with `tag.error = Schema.Never` at runtime — `RpcMiddleware.Tag` defaults the static error to `Never` when not provided. The composite `MiddlewareMaker.Tag(...).middleware(...)` walked `make[*].error` to build its own error union, collapsing to `Union ≡ Never`. - - `Rpc.exitSchema` walks `rpc.middlewares[*].error` when building the wire-level failure union for every rpc kind. Empty-union meant middleware-thrown errors (`NotLoggedInError`, `UnauthorizedError`, etc.) never reached the wire schema. Query/command happened to work because their wire `errorSchema = resource.error` already covered the merge from `makeRpcClient`. Stream rpcs have `errorSchema` force-set to `Schema.Never` by effect-rpc, so the resource-level merge never reached the wire — middleware errors decoded as "Expected never, got X". - - Per middleware, the new logic pushes both the static `_.error` (if non-`Never`) and `rcm[_.dynamic.key].error` (if non-`Never`) into the composite's failure union. - -## 4.0.0-beta.194 - -## 4.0.0-beta.193 - -## 4.0.0-beta.192 - -## 4.0.0-beta.191 - -### Patch Changes - -- 50ce7e6: Replace typescript-eslint with oxlint-tsgolint for type-aware lint. Drop ESLint entirely from non-vue packages (cli, effect-app, infra) — they now use only `oxlint --type-aware`. Vue packages keep ESLint to run `@effect-app/no-await-effect` (no tsgolint equivalent) via `@typescript-eslint/parser` + `vue-eslint-parser`. - -## 4.0.0-beta.190 - -### Patch Changes - -- 985176b: Align request handler input typing with the request's `make` signature. Handlers are now classified as no-input only when the request schema declares no payload fields; any payload (even fully-optional) yields a function handler whose input matches `make`'s first parameter. Adds `HandlerInput` and threads it through `CommandFromRequest`. - -## 4.0.0-beta.189 - -### Patch Changes - -- ea32222: Update to effect 4.0.0-beta.60 and use native `Rpc.custom` constructors (`makeCommandRpc`, `makeStreamRpc`) for metadata-wrapped RPC schemas instead of manually wrapping/unwrapping schemas inline. - -## 4.0.0-beta.188 - -### Patch Changes - -- b2e438f: Remove Operations service and repo - -## 4.0.0-beta.187 - -### Patch Changes - -- 0d4e0b8: Fix `isGeneratorFunction` using `isObject` instead of `isFunction`: generator functions have `typeof === "function"`, not `"object"`, so the check always returned `false`. This caused `Command.streamFn` generator-form handlers to silently pass a raw `Generator` object rather than an `Effect`, meaning the mutation was never executed. - -## 4.0.0-beta.186 - -## 4.0.0-beta.185 - -## 4.0.0-beta.184 - -## 4.0.0-beta.183 - -## 4.0.0-beta.182 - -## 4.0.0-beta.181 - -### Patch Changes - -- 583393f: Default the stream `mutateStream` execute resolved value to the request's success type when no `final` schema is declared. - - Previously the type defaulted to `void`, but the runtime already resolves with the last emitted value. Types now match runtime behaviour: `execute` returns `Final` if a `final` schema is set, otherwise the success type. - -## 4.0.0-beta.180 - -### Minor Changes - -- 7fa3045: V1/V2/V3: stream and command requests carry invalidation metadata - - **V1** – stream final response includes metadata - - - `Invalidation.StreamResponseChunk` wraps each stream item as `{ _tag: "value", value }` and appends `{ _tag: "done", metadata }` at the end carrying all accumulated invalidation keys. - - **V2** – invalidation keys included in failures - - - `Invalidation.CommandFailureWithMetaData` and `Invalidation.StreamFailureChunk` carry keys accumulated up to the point of failure, so clients can invalidate queries even when a command or stream errors. - - `InvalidationMiddlewareLive` wraps command failures; `routing.ts` wraps stream failures. - - `apiClientFactory.ts` unwraps both on the client side, forwarding keys before re-failing with the original error. - - **V3** – mid-stream metadata chunks - - - `Invalidation.StreamResponseChunk` now also includes `{ _tag: "metadata", metadata }` for mid-stream invalidation. - - After each emitted value, the server drains accumulated keys and emits a "metadata" chunk if any keys were collected since the last drain (bucket reset via `InvalidationSet.drain`). - - `apiClientFactory.ts` processes "metadata" chunks the same as "done" chunks, forwarding keys to `InvalidationKeysFromServer` immediately. - - `makeInvalidationKeysService` accepts an optional `onAdded` callback that fires after each key addition, enabling `mutate.ts` to trigger query invalidation mid-stream without waiting for the stream to complete. - -## 4.0.0-beta.179 - -### Minor Changes - -- 828d264: Stream requests now support an optional `final` schema that models the final success type of the stream. When declared, `mutateStream`'s execute effect resolves with the last emitted value typed as `Final` instead of `void`. - - ```ts - class MyStream extends SomethingStream()( - "MyStream", - { id: S.String }, - { - success: S.Union([OperationProgress, ExportComplete]), - final: ExportComplete, // execute now resolves with ExportComplete - } - ) {} - ``` - -## 4.0.0-beta.178 - -## 4.0.0-beta.177 - -### Minor Changes - -- 89d8b3a: Add Effect RPC `Stream` support to the wrapper. - - - New `Stream` request constructor on `TaggedRequestFor` parallel to `Query`/`Command`. Emits resources with `type: "stream"`. - - Server router (`@effect-app/infra` `routing.ts`) accepts stream resources whose handlers return a `Stream.Stream` (or a function from input to one). Forwards `stream: true` to `Rpc.make` so `RpcSchema.Stream` wrapping is applied. Streams bypass `applyRequestTypeInterruptibility` and the `Effect.withSpan` wrapping (the RPC server adds its own span). - - Client (`apiClientFactory.ts`) detects stream resources, forwards `stream: true` when constructing `RpcGroup`, and exposes the per-request `handler` as a `Stream.Stream` (via `Stream.unwrap` over the `ManagedRuntime` context) instead of an `Effect`. `Invalidation.CommandResponseWithMetaData` continues to apply only to commands. - - New `RequestStreamHandler` / `RequestStreamHandlerWithInput` shapes in `clientFor.ts`; `RequestHandlers` dispatches on `type: "stream"`. - -## 4.0.0-beta.176 - -### Patch Changes - -- pass options - -## 4.0.0-beta.175 - -## 4.0.0-beta.174 - -### Minor Changes - -- 821468d: Add server-driven cache invalidation via RPC response headers. - - - `effect-app/rpc`: new `Invalidation` module with `InvalidationKey` / `InvalidationKeys` schemas, `Invalidates` annotation (for declaring static invalidation on Rpc definitions), `InvalidationSet` reference (request-scoped accumulator), and `makeInvalidationSet` helper. - - `effect-app/middleware`: new `InvalidationMiddleware` RPC middleware tag; included in `DefaultGenericMiddlewares`. - - `effect-app/client`: new `InvalidationKeys` module with `InvalidationKeysFromServer` reference and `makeInvalidationKeysService` helper; `apiClientFactory` now taps HTTP responses to read the `x-invalidate` header and forward keys to `InvalidationKeysFromServer`. - - `@effect-app/infra`: new `InvalidationMiddlewareLive` RPC middleware implementation that owns the full lifecycle — creates a request-scoped `InvalidationSet` (backed by a `Ref`), pre-populates it from the `Invalidates` annotation, provides it to the handler, and after the handler completes registers an HTTP pre-response handler (via `appendPreResponseHandlerUnsafe`) to write the accumulated keys as an `x-invalidate` response header. No separate HTTP middleware is needed. - - `@effect-app/vue`: `invalidateQueries` / `useMutation` now reads server-provided invalidation keys from `InvalidationKeysFromServer` after each mutation and applies them alongside the client-side invalidation. - -## 4.0.0-beta.173 - -## 4.0.0-beta.172 - -## 4.0.0-beta.171 - -### Patch Changes - -- d71d976: fix - -## 4.0.0-beta.170 - -### Patch Changes - -- 8f09f77: fix - -## 4.0.0-beta.169 - -### Patch Changes - -- 8ae8b53: input mess - -## 4.0.0-beta.168 - -### Patch Changes - -- 178480a: Fix request handler input classification to use request schema fields instead of `make` parameters, preventing defaulted/nullable input fields from being treated as no-input handlers. - -## 4.0.0-beta.167 - -### Patch Changes - -- 140e192: Relax invalidation resource value constraints to allow arbitrary values while preserving query-only filtering in invalidation handling. - -## 4.0.0-beta.166 - -### Patch Changes - -- dbcc53b: Refactor command invalidation typing: declare resources via `Command()`, pass `invalidatesQueries` as the optional 4th argument, and enforce exact `clientFor` invalidation resources when required. - -## 4.0.0-beta.165 - -### Minor Changes - -- f88ea34: Move `makeQueryKey` into `effect-app/client` and update Vue source and tests to import it from the shared client module. Vue still re-exports `makeQueryKey` from `src/lib` for compatibility. - -## 4.0.0-beta.164 - -### Minor Changes - -- 8cb3de4: Add command invalidation helpers that preserve query-only resource types and pass mutation input and `Exit` results into invalidation callbacks. Update Vue `clientFor` to merge request-level invalidation config with call-site invalidation and require matching invalidation resources. - -## 4.0.0-beta.163 - -### Patch Changes - -- b952f19: bye cruft - -## 4.0.0-beta.162 - -### Patch Changes - -- b52b424: restore annotations for now - -## 4.0.0-beta.161 - -## 4.0.0-beta.160 - -### Patch Changes - -- 505bfa9: Add concurrent decode helper APIs and migrate decode callsites to use them. - - - Add `withDefaultParseOptions` and keep `DefaultParseOptions` centralized. - - Export `decodeEffectConcurrently` and `decodeUnknownEffectConcurrently` from Schema and SchemaParser modules. - - Update repository, queue, client, form, and CLI decode paths to use concurrent decode helpers. - - Keep schema constructors free of hardcoded parse concurrency overrides. - -## 4.0.0-beta.159 - -### Patch Changes - -- c1e73de: - -## 4.0.0-beta.158 - -### Patch Changes - -- 3c1f52d: improve: class strictness enabled by default again, allow `strict: false` as opt out for now. -- 6ae3050: Preserve class annotation parseOptions in relaxed declaration struct decoding so custom parse options (including concurrency defaults) are applied consistently. - -## 4.0.0-beta.157 - -### Patch Changes - -- 6fff09c: unify encoded function for when you use encodedKeys - -## 4.0.0-beta.156 - -## 4.0.0-beta.155 - -### Patch Changes - -- c215db8: align TaggedUnion with array arg - -## 4.0.0-beta.154 - -## 4.0.0-beta.153 - -## 4.0.0-beta.152 - -## 4.0.0-beta.151 - -## 4.0.0-beta.150 - -### Patch Changes - -- 85a8275: Expose `make`, `makeOption`, and `makeEffect` static helpers on request classes created via `Query`/`Command`. - -## 4.0.0-beta.149 - -### Patch Changes - -- f317c5e: Preserve omitted-input make helpers through Schema.Opaque when the wrapped schema allows optional or default-only constructor input. - -## 4.0.0-beta.148 - -### Patch Changes - -- 199e9a5: Allow Struct and TaggedStruct make helpers to omit input when every constructor field is optional or defaulted, and preserve widening copy typings through a lighter named public type to improve TypeScript editor responsiveness. - -## 4.0.0-beta.147 - -### Patch Changes - -- 47e3742: Preserve Struct.copy through `annotate`, `annotateKey`, and `mapFields` chains, and add tests covering chained copy behavior on Struct schemas. - -## 4.0.0-beta.146 - -### Patch Changes - -- a4dff57: Adjust Struct and TaggedStruct copy typing to follow class-style widening constraints while keeping structural copy runtime behavior. - -## 4.0.0-beta.145 - -### Patch Changes - -- 12abb55: Refine schema copy behavior by keeping class copy constructor-based while using structural copy for Struct and TaggedStruct helpers. - -## 4.0.0-beta.144 - -### Patch Changes - -- 11422f8: Update request helper typing and runtime invocation to rely on schema `.make` instead of class constructors, avoiding `new`-based assumptions for request schemas. -- d31253f: Refactor eligible schema classes and tagged classes to Opaque schemas, and migrate constructor call sites to use `.make` for those models. - -## 4.0.0-beta.143 - -### Patch Changes - -- 79eb019: Remove redundant schema `title` annotations when they duplicate the schema `identifier`. - -## 4.0.0-beta.142 - -### Minor Changes - -- 025de47: Fold the encoded-override support from `ExtendedClass` and `ExtendedTaggedClass` into `Class`, `TaggedClass`, `ErrorClass`, and `TaggedErrorClass`, and update model codegen to detect the new second-generic form. - -### Patch Changes - -- 3436d44: Extend `Schema.Opaque` in `effect-app/Schema` to support an optional encoded-type generic while preserving the original single-generic behavior. - -## 4.0.0-beta.141 - -### Patch Changes - -- 7c25dbb: Add relaxed wrapper support for `ErrorClass` and `TaggedErrorClass` in `effect-app/Schema`, matching the existing class wrapper behavior (`copy`, cached `ast`, and unbounded parse concurrency). - -## 4.0.0-beta.140 - -## 4.0.0-beta.139 - -## 4.0.0-beta.138 - -## 4.0.0-beta.137 - -## 4.0.0-beta.136 - -## 4.0.0-beta.135 - -### Patch Changes - -- c7bbc41: fix - class should check type side - -## 4.0.0-beta.134 - -### Patch Changes - -- 9d3495e: Preserve field-level schema decode errors for relaxed Class and TaggedClass declarations so decode failures report nested constraints (for example min-length violations) instead of only a generic class-type mismatch. -- f353d48: Rename the Class/TaggedClass relaxed declaration option to `strict` (default `false`) and apply it to `Class`, `TaggedClass`, `ExtendedClass`, and `ExtendedTaggedClass`. - - When `strict: true`, class decoding keeps strict class-level declaration behavior; by default, decoding remains relaxed and preserves field-level schema errors. - -## 4.0.0-beta.133 - -### Patch Changes - -- c3299f7: update packages - -## 4.0.0-beta.132 - -## 4.0.0-beta.131 - -## 4.0.0-beta.130 - -### Patch Changes - -- ea1bd46: fix: prevent expansion of nominal brands - -## 4.0.0-beta.129 - -## 4.0.0-beta.128 - -### Patch Changes - -- 57db551: Split `TaggedRequestFor` into `Query` and `Command` factories, and mark generated request classes with `type: "query" | "command"`. - - Vue client helpers now expose query-only helpers (`query`, `suspense`, `fetch`) for query requests and mutation-only helpers (`mutate`, `fetch`) for command requests. - -## 4.0.0-beta.127 - -## 4.0.0-beta.126 - -### Patch Changes - -- 458bb1b: fix type - -## 4.0.0-beta.125 - -## 4.0.0-beta.124 - -### Patch Changes - -- 256ae85: cleanup - -## 4.0.0-beta.123 - -### Patch Changes - -- 14aba14: fix: clientFor - -## 4.0.0-beta.122 - -### Patch Changes - -- f052d38: Replace `(...) => Effect.gen` with `Effect.fnUntraced` in `apiClientFactory`. - -## 4.0.0-beta.121 - -### Patch Changes - -- 5ac46cb: Make `Schema.provide` dual (pipeable) - -## 4.0.0-beta.120 - -### Minor Changes - -- f21190c: Add `copy` property to `Class` and `TaggedClass` for creating modified instances with updated fields. The `copy` method is cached per-class and supports both object and function-based updates, with pipeline support. - -## 4.0.0-beta.119 - -## 4.0.0-beta.118 - -### Minor Changes - -- 08d2e70: Add `concurrency: "unbounded"` parseOptions annotation to Schema constructors (Struct, Array, NonEmptyArray, Record, TaggedStruct, ReadonlySet, ReadonlyMap, Class, TaggedClass) so all encode/decode operations automatically run with unbounded concurrency. Also override `mapFields` on Struct and Class/TaggedClass to preserve the annotation. - -### Patch Changes - -- bd26832: Add nested anyOf flattening to JSON Schema post-processing -- Update effect packages to 4.0.0-beta.52 - -## 4.0.0-beta.117 - -## 4.0.0-beta.116 - -## 4.0.0-beta.115 - -## 4.0.0-beta.114 - -## 4.0.0-beta.113 - -## 4.0.0-beta.112 - -## 4.0.0-beta.111 - -### Patch Changes - -- ca94edf: fix typo - -## 4.0.0-beta.110 - -## 4.0.0-beta.109 - -## 4.0.0-beta.108 - -### Patch Changes - -- 3e46e7b: allow excess props in openapi schemas - -## 4.0.0-beta.107 - -## 4.0.0-beta.106 - -## 4.0.0-beta.105 - -## 4.0.0-beta.104 - -### Minor Changes - -- e944bca: Add `generateGuards` and `generateGuardsFor` to `TaggedUnion` / `ExtendTaggedUnion` for property-scoped type guards. - - - `generateGuards("key")` — generic per-guard, no need to specify the container type - - `generateGuardsFor()("key")` — curried, fixes `A` for concrete guard signatures - - Both return `{ is{Tag}, isAnyOf }` guards that narrow the container type by its tagged union property. - -## 4.0.0-beta.103 - -### Minor Changes - -- 7119320: Add `generateGuards` to `TaggedUnion` / `ExtendTaggedUnion` for generating property-scoped type guards. - - Usage: `MyUnion.generateGuards()("propertyKey")` returns `{ is{Tag}, isAnyOf }` guards that narrow the container type by its tagged union property. - -## 4.0.0-beta.102 - -## 4.0.0-beta.101 - -## 4.0.0-beta.100 - -## 4.0.0-beta.99 - -## 4.0.0-beta.98 - -## 4.0.0-beta.97 - -## 4.0.0-beta.96 - -### Patch Changes - -- 5615e47: bs - -## 4.0.0-beta.95 - -### Patch Changes - -- 88838fb: Remove pick/omit customizations from Class/TaggedClass/Struct/TaggedStruct. Use `Struct.pick(X.fields, [...])` from `effect-app` instead. - -## 4.0.0-beta.94 - -## 4.0.0-beta.93 - -## 4.0.0-beta.92 - -## 4.0.0-beta.91 - -### Minor Changes - -- 738b482: Add pick/omit to Struct and TaggedStruct - -## 4.0.0-beta.90 - -## 4.0.0-beta.89 - -## 4.0.0-beta.88 - -## 4.0.0-beta.87 - -## 4.0.0-beta.86 - -## 4.0.0-beta.85 - -## 4.0.0-beta.84 - -## 4.0.0-beta.83 - -## 4.0.0-beta.82 - -## 4.0.0-beta.81 - -## 4.0.0-beta.80 - -## 4.0.0-beta.79 - -### Minor Changes - -- d16845e: Remove `TaggedRequest` from `makeRpcClient`, now only `TaggedRequestFor` is returned. Remove all legacy `meta.moduleName` support — `id` and `moduleName` are now required on `Req` type. Remove `makeRpcGroup` (use `makeRpcGroupFromRequestsAndModuleName` instead). - -## 4.0.0-beta.78 - -## 4.0.0-beta.77 - -### Minor Changes - -- 3613e87: Add `TaggedRequestFor` helper to `makeRpcClient` that curries a `moduleName`, producing request classes with static `id` and `moduleName` properties. This enables passing request classes directly to `makeQueryKey` without going through `clientFor` first. The `clientFor` function no longer requires a `meta` property on the module when requests carry `moduleName`. The meta codegen preset now generates `Req = TaggedRequestFor(moduleName)`. Original `TaggedRequest` remains for backwards compatibility. - -## 4.0.0-beta.76 - -### Patch Changes - -- a5248a9: use new schema features -- fac725d: update effect to latest beta - -## 4.0.0-beta.75 - -### Patch Changes - -- 24f0a5a: rename Literal to Literals, no longer hiding Schema's singular Literal. - -## 4.0.0-beta.74 - -### Patch Changes - -- 54ec1ef: fix bs - -## 4.0.0-beta.73 - -## 4.0.0-beta.72 - -### Patch Changes - -- 0541f0d: fix withDefault types - -## 4.0.0-beta.71 - -### Minor Changes - -- beae3a0: Remove `withDefaultConstructor` wrapper, use `S.withConstructorDefault` directly with `Effect.succeed`/`Effect.sync`. - -## 4.0.0-beta.70 - -## 4.0.0-beta.69 - -### Patch Changes - -- dc465e3: update to latest effect beta - -## 4.0.0-beta.68 - -### Patch Changes - -- e6f2341: Add SecretURL tests and switch secretURL config to use Config.nonEmptyString - -## 4.0.0-beta.67 - -## 4.0.0-beta.66 - -### Patch Changes - -- edc52e4: update - -## 4.0.0-beta.65 - -### Minor Changes - -- 1f103b2: Replace `proxify` with explicit service accessor helpers: `accessFn`, `accessEffectFn`, `accessCn`, `accessEffectCn`. - -### Patch Changes - -- 31739d7: Fix JSON schema output for Email, Date, PhoneNumber, and Url schemas. The `jsonSchema` annotation key is not recognized by Effect v4's JSON schema generator — use proper v4 annotations (`format`, `description`) and built-in checks (`isMinLength`, `isMaxLength`) instead. - -## 4.0.0-beta.64 - -### Patch Changes - -- c1a6fdc: fix proxify - -## 4.0.0-beta.63 - -## 4.0.0-beta.62 - -### Patch Changes - -- 0b21a02: fix: flatten simple allOf constraints in JSON Schema output for better codegen compatibility - -## 4.0.0-beta.61 - -## 4.0.0-beta.60 - -## 4.0.0-beta.59 - -### Patch Changes - -- cec026d: update packages - -## 4.0.0-beta.58 - -## 4.0.0-beta.57 - -## 4.0.0-beta.56 - -## 4.0.0-beta.55 - -## 4.0.0-beta.54 - -### Patch Changes - -- d867272: the return of `Context` - -## 4.0.0-beta.53 - -### Patch Changes - -- ee9694e: fix type issue? - -## 4.0.0-beta.52 - -### Minor Changes - -- 6252808: Add `ReadonlySetFromArray` and `ReadonlyMapFromArray` schema transformations that decode from annotated arrays to Set/Map. Update `ReadonlySet` and `ReadonlyMap` to use these internally. - -## 4.0.0-beta.51 - -## 4.0.0-beta.50 - -## 4.0.0-beta.49 - -### Patch Changes - -- e585c9c: fix config nested - -## 4.0.0-beta.48 - -### Patch Changes - -- 0c88f78: Remove `TaggedError` compatibility re-export, use `TaggedErrorClass` directly - -## 4.0.0-beta.47 - -### Patch Changes - -- 3365758: workaround effect error messages - -## 4.0.0-beta.46 - -## 4.0.0-beta.45 - -### Patch Changes - -- 10b55ff: update packages - -## 4.0.0-beta.44 - -### Patch Changes - -- a37aa38: Update to effect beta 43 - -## 4.0.0-beta.43 - -## 4.0.0-beta.42 - -## 4.0.0-beta.41 - -## 4.0.0-beta.40 - -## 4.0.0-beta.39 - -### Patch Changes - -- 10e90d5: fix: TaggedRequest should be an Opaque Schema Class - -## 4.0.0-beta.38 - -### Patch Changes - -- 0b3e00e: fix bug - -## 4.0.0-beta.37 - -### Patch Changes - -- 947fe20: fix input date - -## 4.0.0-beta.36 - -## 4.0.0-beta.35 - -## 4.0.0-beta.34 - -### Patch Changes - -- 8c645d5: update to latest effect - -## 4.0.0-beta.33 - -### Patch Changes - -- 4b95009: use Finite instead of Number - -## 4.0.0-beta.32 - -### Patch Changes - -- 01d862a: again - -## 4.0.0-beta.31 - -### Patch Changes - -- 6b6d601: fix ForceVOid - -## 4.0.0-beta.30 - -### Patch Changes - -- 5ec1f45: fix ForceVoid for real - -## 4.0.0-beta.29 - -### Patch Changes - -- a899d46: Replace `ForceVoid` in `makeClient` with a typed codec transformation instead of an unsafe cast. - -## 4.0.0-beta.28 - -### Patch Changes - -- 0099208: Refactor `Pure` helpers to use typed `useSync` calls instead of unsafe casts. - -## 4.0.0-beta.27 - -### Patch Changes - -- 601a1ff: update effect to 4.0.0-beta.37 and drop the Schema Class disableValidation workaround now that the patched effect schema covers it - -## 4.0.0-beta.26 - -### Patch Changes - -- 4da28e2: Change `Schema.Class` and `Schema.TaggedClass` wrappers to default constructor options to `{ disableValidation: true }`. - - This avoids strict class identifier validation by default when constructing wrapper classes (for example passing a compatible view class), while keeping existing behavior when explicit options are provided. - -## 4.0.0-beta.25 - -### Patch Changes - -- 6282d4b: Update `Effect.allLower` to call `svc.asEffect()` when available, ensuring service entries are normalized before `Effect.all` evaluation. - -## 4.0.0-beta.24 - -### Patch Changes - -- 32f71bf: Fix `Schema.TaggedUnion(...).tags` extraction for class-based members (for example `TaggedClass`) by using a local AST sentinel walker instead of relying on internal effect APIs. - - Add tests covering: - - - `TaggedUnion` with `encodeKeys`-wrapped members - - `TaggedUnion` with `TaggedClass` members - -## 4.0.0-beta.23 - -### Patch Changes - -- ea08a79: remove `fields` constraint from TaggedUnion/tags helpers, extract `_tag` via AST walk instead - -## 4.0.0-beta.22 - -## 4.0.0-beta.21 - -### Patch Changes - -- 0d349e7: Align effect-app tagged union helpers with Effect v4 by delegating to the native tagged union utilities, exposing v4-style `cases` and `guards`, and preserving the local `tags` helper. -- 75c72ee: update effect to 4.0.0-beta.36, adapt to Option revert from A | undefined - -## 4.0.0-beta.20 - -### Patch Changes - -- aa921db: Fix `TaggedRequest` no-config error type inference so requests without a third argument infer the same default error schema as requests with explicit success config. - -## 4.0.0-beta.19 - -### Patch Changes - -- ffc10a4: Migrate `Schema/ext` context helpers to Effect v4 by implementing `provide` and `contextFromServices` with proper service subtraction across decoding and encoding requirements. - -## 4.0.0-beta.18 - -### Patch Changes - -- e9dbbdd: Tighten schema helper generics in `Schema/ext.ts` so default-related helpers accept properly named schema type parameters instead of bare `S.Top` inputs. - -## 4.0.0-beta.17 - -### Patch Changes - -- c8a6a3f: fix TaggedUnion - -## 4.0.0-beta.16 - -### Patch Changes - -- 56db2c4: fix: isA - -## 4.0.0-beta.15 - -### Patch Changes - -- 20186b6: Migrate schema arbitrary annotations to Effect v4 `toArbitrary` and cover `StringId` generation with a fast-check test. - -## 4.0.0-beta.14 - -## 4.0.0-beta.13 - -### Patch Changes - -- 16de88c: remove hopefully obsolete Struct overrides -- 1c3c541: Update Effect dependencies to 4.0.0-beta.31 across workspace packages. -- de2359d: Update Effect dependencies to 4.0.0-beta.28 across workspace packages. -- 0d72f34: Update Effect dependencies to 4.0.0-beta.29 across workspace packages. - -## 4.0.0-beta.12 - -### Patch Changes - -- 622d54a: Configure Changesets fixed versioning for public packages. - -## 4.0.0-beta.10 - -### Patch Changes - -- 01c70d0: update all teh tings - -## 4.0.0-beta.9 - -### Patch Changes - -- 5727372: switch to NdJson - -## 4.0.0-beta.8 - -### Patch Changes - -- 1f336bc: fix RequestName - -## 4.0.0-beta.7 - -### Patch Changes - -- 62b4989: fix request attr - -## 4.0.0-beta.6 - -### Patch Changes - -- df75041: fix Req - -## 4.0.0-beta.5 - -### Patch Changes - -- 016c5a3: adapt isObject change - -## 4.0.0-beta.4 - -### Patch Changes - -- 88b90c3: fix withDefault - -## 4.0.0-beta.3 - -### Patch Changes - -- 3a7abae: fix bs - -## 4.0.0-beta.2 - -### Major Changes - -- 3887256: Fix Schema->Codec - -## 4.0.0-beta.1 - -### Patch Changes - -- 64786af: Beta25 - -## 4.0.0-beta.0 - -### Major Changes - -- 880df28: Effect v4 beta - -## 3.16.0 - -### Minor Changes - -- 1a102e2: update packages - -## 3.15.1 - -### Patch Changes - -- 049b54a: improve: add NEA support to Array.groupByT. - -## 3.15.0 - -### Minor Changes - -- ecbd35f: drop default proxy - -## 3.14.2 - -### Patch Changes - -- faf7e9d: add utils, fix bugs - -## 3.14.1 - -### Patch Changes - -- c5a2bd5: add dropUndefinedRecursive - -## 3.14.0 - -### Minor Changes - -- 9316017: feat: add `dropUndefinedT2` - -### Patch Changes - -- 358782e: update packages - -## 3.13.0 - -### Minor Changes - -- 07f1de5: update packages and tsconfigs - -## 3.12.0 - -### Minor Changes - -- 23ba90f: improve: compare deep structurally - -## 3.11.0 - -### Minor Changes - -- 9697a93: feat: Map withDefault - -## 3.10.2 - -### Patch Changes - -- fdf1781: enhance runtimeFiberAsPromise with abort. - -## 3.10.1 - -### Patch Changes - -- fe49192: improve literal default, overridable - -## 3.10.0 - -### Minor Changes - -- 51ded8d: add "withDefault" to Schema.Literal. - -## 3.9.0 - -### Minor Changes - -- b8f5e30: update packages - -## 3.8.1 - -### Patch Changes - -- 493fbb8: fix tagged class pick/omit omitting \_tag. - -## 3.8.1-next.0 - -### Patch Changes - -- fix tagged class pick/omit omitting \_tag. - -## 3.8.0 - -### Minor Changes - -- 3cb4c4a: simplify requests/client, drop raw for now, fix missing schema context in request handlers - -## 3.7.1 - -### Patch Changes - -- 4da7f79: cleanup helpers namespace - -## 3.7.0 - -### Minor Changes - -- 6d8c512: update packages - -## 3.6.1 - -### Patch Changes - -- d38a50a: align S.Class to original, adding missing make. - -## 3.6.0 - -### Minor Changes - -- 3d49d81: update packages - -## 3.5.0 - -### Minor Changes - -- 68e91c9: rename `name` to `id` - -## 3.4.0 - -### Minor Changes - -- 923f0d8: improve defaultFailureMessageHandler - -## 3.3.7 - -### Patch Changes - -- 4000c95: track const action name - -## 3.3.6 - -### Patch Changes - -- 8096576: new eslint shared config package - -## 3.3.5 - -### Patch Changes - -- 47e83ca: update cli - -## 3.3.4 - -### Patch Changes - -- f9aee77: some fixes - -## 3.3.3 - -### Patch Changes - -- f6a3328: export base eslint files so that we import them in projects - -## 3.3.2 - -### Patch Changes - -- f5da9d0: update packages - -## 3.3.1 - -### Patch Changes - -- d670d5a: runtimefiber errors should be wrapped - -## 3.3.0 - -### Minor Changes - -- d50dfe6: add support for RuntimeFiber, fix should return the Promise for eventOnSubmit. - -## 3.2.4 - -### Patch Changes - -- 8cb893c: dprint rules the world - -## 3.2.3 - -### Patch Changes - -- f101ef0: upgrade ea - -## 3.2.2 - -### Patch Changes - -- 33f100d: finalize new cli - -## 3.2.1 - -### Patch Changes - -- c12a49b: effect app cli to effect cli - -## 3.2.0 - -### Minor Changes - -- bd12e89: Disable Schema batching by default, not to run into unexpected endless waiting for resolving to finish. - -## 3.1.0 - -### Minor Changes - -- 1e4de39: remove namespace/type merging in Prelude. - -### Patch Changes - -- 41352d8: refactor: remove internal usage of namespace/type collission. - -## 3.0.10 - -### Patch Changes - -- ce91007: fix non inverted rpc context map use - -## 3.0.9 - -### Patch Changes - -- ea6380f: cleanup RpcContextMap - -## 3.0.8 - -### Patch Changes - -- 3543bfb: cleanup dev-mode - -## 3.0.7 - -### Patch Changes - -- d42afe6: cleanup - -## 3.0.6 - -### Patch Changes - -- 868eab6: cleanup - -## 3.0.5 - -### Patch Changes - -- 182ca78: improve: MiddlewareMaker is a Tag with Self so we can extend it from class. - -## 3.0.4 - -### Patch Changes - -- bc68d9f: feat: introduce Layer.make as alternative to Context.ProvideService - -## 3.0.3 - -### Patch Changes - -- c31423a: cleanup rpc - -## 3.0.2 - -### Patch Changes - -- 88bb989: align dynamic/global middleware with V4 - -## 3.0.1 - -### Patch Changes - -- 74c28d1: move common rpc out of infra - -## 3.0.0 - -### Major Changes - -- 3e4c45d: feat: Add new @effect/rpc Dynamic and Global Middleware, based on effect-app Router - -## 2.56.0 - -### Minor Changes - -- db2b575: switch to new HttpLayerRouter - -## 2.55.0 - -### Minor Changes - -- 37eb29a: improve ServiceBus api - -## 2.54.3 - -### Patch Changes - -- dd30471: improve - -## 2.54.2 - -### Patch Changes - -- 79ffd88: updates - -## 2.54.1 - -### Patch Changes - -- 9f90266: fix prefix namespace - -## 2.54.0 - -### Minor Changes - -- 0f2b2cf: update packages - -## 2.53.1 - -### Patch Changes - -- fa2c8d0: fix prefix - -## 2.53.0 - -### Minor Changes - -- 5c51597: refactor Middleware to run as RPC middleware - -## 2.52.1 - -### Patch Changes - -- 244f84d: various improvements, documentation - -## 2.52.0 - -### Minor Changes - -- 99cf15f: unify middleware api - -## 2.51.0 - -### Minor Changes - -- 54dd59a: cleanup NES - -## 2.50.2 - -### Patch Changes - -- 0d33085: fix dts freak - -## 2.50.1 - -### Patch Changes - -- build fix - -## 2.50.0 - -### Minor Changes - -- 0a82e7f: update packages - -## 2.49.0 - -### Minor Changes - -- a36ceed: feat: composable dynamic middleware - -## 2.48.0 - -### Minor Changes - -- 8bb246b: cleanup and document router/middleware - -## 2.47.2 - -### Patch Changes - -- fup - -## 2.47.1 - -### Patch Changes - -- fup - -## 2.47.0 - -### Minor Changes - -- d29cb1b: refactor: drop optional identifier for Schema classes. - -## 2.46.1 - -### Patch Changes - -- b095bb5: tscp - -## 2.46.0 - -### Minor Changes - -- ba4ad65: update packages; drop ServiceStrict in favour of language-service - -## 2.45.0 - -### Minor Changes - -- 2c217ce: update packages - -## 2.44.0 - -### Minor Changes - -- 55da9e7: improve: Router supports contextProvider through middleware, replacing flawed requestLayers - -## 2.43.3 - -### Patch Changes - -- b771967: update packages - -## 2.43.2 - -### Patch Changes - -- aec6960: fix complex ast tagged union - -## 2.43.1 - -### Patch Changes - -- a2e1e1e: improve jsonschema of Email - -## 2.43.0 - -### Minor Changes - -- eac9c67: update packages - -## 2.42.1 - -### Patch Changes - -- 49d93a5: update packages - -## 2.42.0 - -### Minor Changes - -- ba96171: improve Cosmos errors - -## 2.41.0 - -### Minor Changes - -- b1d4af4: housekeeping: update packages - -## 2.40.1 - -### Patch Changes - -- 0230385: improve: rpc spans - - fewer duplicate spans - - improve name - -## 2.40.0 - -### Minor Changes - -- 8cb33d5: update packages - -## 2.39.1 - -### Patch Changes - -- d3b05cb: update packages -- 4627c7b: improve: optimise getFirstById. -- 1e1f32b: housekeeping: update packages - -## 2.39.0 - -### Minor Changes - -- bdc9d5c: feat: add support for skippable namespaces in query keys - -## 2.38.5 - -### Patch Changes - -- 8b7fdbe: update packages - -## 2.38.4 - -### Patch Changes - -- revert copyOrigin changes - -## 2.38.3 - -### Patch Changes - -- update packages - -## 2.38.2 - -### Patch Changes - -- c0ed28a: preserve readonlyness in the returned type for copyOrigin -- 0fcab38: update packages - -## 2.38.1 - -### Patch Changes - -- cd15a8e: some fixes for copyOrigin - -## 2.38.0 - -### Minor Changes - -- 81479bf: add specialized copy function wrt a constructor - -## 2.37.1 - -### Patch Changes - -- 7bedb13: updates - -## 2.37.0 - -### Minor Changes - -- 14ea804: housekeeping: update packages - -## 2.36.1 - -### Patch Changes - -- 4c8dfb4: update packages - -## 2.36.0 - -### Minor Changes - -- e42d5fb: update to effect 3.14 with native rpc2 - -## 2.35.0 - -### Minor Changes - -- f38e31f: make LogLevels readonly - -### Patch Changes - -- f30b57e: fix faker and rebuild dts - -## 2.34.0 - -### Minor Changes - -- 64d3a54: refactor: replace custom FiberRefs with Context.Reference in preparation of Effect v4 - -### Patch Changes - -- 771ac45: update packages - -## 2.33.1 - -### Patch Changes - -- 36996ed: housekeeping: update packages - -## 2.33.0 - -### Minor Changes - -- 1e88a86: improve error handled marking - -## 2.32.3 - -### Patch Changes - -- 63e966a: update packages - -## 2.32.2 - -### Patch Changes - -- 96158a1: remove manual error headers/body gathering. - -## 2.32.1 - -### Patch Changes - -- a42d5a6: mark also number for brand - -## 2.32.0 - -### Minor Changes - -- bca03c7: feat: enhance Types module - -## 2.31.1 - -### Patch Changes - -- 24417c7: lol - -## 2.31.0 - -### Minor Changes - -- 9ebae95: improve: rpc error reporting - -## 2.30.0 - -### Minor Changes - -- 10a8adf: improve: lock rpc responses to 418/422/200, report otherwise as response error! helping with bad proxies in between. -- 8be2984: housekeeping: update packages - -## 2.29.0 - -### Minor Changes - -- 7a4d393: report errors anyway to Sentry but with lower severity. add log namespace annotations. - -## 2.28.0 - -### Minor Changes - -- 32730a4: improve error reporting - -## 2.27.0 - -### Minor Changes - -- 9b2e385: update packages - -## 2.26.3 - -### Patch Changes - -- 02c4141: fix type - -## 2.26.2 - -### Patch Changes - -- 411c3d5: fix type - -## 2.26.1 - -### Patch Changes - -- 709c9cc: fix missing \_tag on TaggedClass - -## 2.26.0 - -### Minor Changes - -- 2d0ad81: update packages - -## 2.25.0 - -### Minor Changes - -- f597755: feat: remove void check and force void conversion at runtime. - -## 2.24.3 - -### Patch Changes - -- 9d11dfb: housekeeping: update packages - -## 2.24.2 - -### Patch Changes - -- 42e6776: fix Map error - -## 2.24.1 - -### Patch Changes - -- 469f28d: fix: groupByT should support any key type -- ab9d1ea: housekeeping: update packages - -## 2.24.0 - -### Minor Changes - -- 3fa0eda: fix: stream error, change to nostream - -## 2.23.2 - -### Patch Changes - -- 1c3af52: fix HttpClient type - -## 2.23.1 - -### Patch Changes - -- 93e88c2: fix: export - -## 2.23.0 - -### Minor Changes - -- c8ebfb4: update packages - -## 2.22.0 - -### Minor Changes - -- 67023f8: kill \_cjs - -## 2.21.0 - -### Minor Changes - -- b1396c9: refactor: rename ApiClient to ApiClientFactory - -## 2.20.0 - -### Minor Changes - -- 3388736: feat: add `cause` support to errors - -### Patch Changes - -- 9f504c6: update packages - -## 2.19.5 - -### Patch Changes - -- 47eb94e: cleanup legacy annotations - -## 2.19.4 - -### Patch Changes - -- fix: return type - -## 2.19.3 - -### Patch Changes - -- 750b46a: update packages - -## 2.19.2 - -### Patch Changes - -- 1bfc3d8: update packages - -## 2.19.1 - -### Patch Changes - -- 5ef6481: update packages - -## 2.19.0 - -### Minor Changes - -- 29a1a65: update packages - -## 2.18.0 - -### Minor Changes - -- fe7783b: improve: TaggedUnion .is is now S.is, isA, is the old is - -## 2.17.0 - -### Minor Changes - -- 47a543b: remove transform-paths as default plugin -- d84aef7: update packages - -## 2.16.0 - -### Minor Changes - -- cc2c43e: update packages - -## 2.15.0 - -### Minor Changes - -- improve: clientFor as part of service so that cache is also fine. - -## 2.14.0 - -### Minor Changes - -- a30da33: improve: cleanup client legacy -- 9301abb: cleanup legacy - -## 2.13.3 - -### Patch Changes - -- 125e2ea: update packages - -## 2.13.2 - -### Patch Changes - -- 54f700f: fix: missing empty config - -## 2.13.1 - -### Patch Changes - -- 0feb32c: update packages - -## 2.13.0 - -### Minor Changes - -- bump - -## 2.12.0 - -### Minor Changes - -- 82363f6: add: Schema.contextFromServices - -## 2.11.2 - -### Patch Changes - -- c7c76b4: update packages - -## 2.11.1 - -### Patch Changes - -- c971d73: update packages - -## 2.11.0 - -### Minor Changes - -- update - -## 2.10.0 - -### Minor Changes - -- f19762b: update packages - -## 2.9.0 - -### Minor Changes - -- 565d678: improve: strict dependencies for routing and services. - -## 2.8.2 - -### Patch Changes - -- c2fa0ed: fix error schema - -## 2.8.1 - -### Patch Changes - -- 1e83e5c: fix type - -## 2.8.0 - -### Minor Changes - -- ba1c7fc: feat: add support for specifying success fields directly. - closes #102 - -### Patch Changes - -- 412cb3d: update packages - -## 2.7.0 - -### Minor Changes - -- 590e5bf: update packages - -## 2.6.0 - -### Minor Changes - -- d4ab73f: update packages - -## 2.5.2 - -### Patch Changes - -- 19ea035: update packages - -## 2.5.1 - -### Patch Changes - -- 724a1a8: error bs - -## 2.5.0 - -### Minor Changes - -- e95cab7: improve: also treat cosmos 409 error as OptimisticConcurrencyException - -## 2.4.0 - -### Minor Changes - -- d5623a6: update packages - -## 2.3.0 - -### Minor Changes - -- 9ef18f6: adapt Prelude workaround - -### Patch Changes - -- 9ef18f6: adapt Prelude workaround - -## 2.2.1 - -### Patch Changes - -- f68dbd2: update packages - -## 2.2.0 - -### Minor Changes - -- 02c3f55: refactor: restructure infra - -## 2.1.1 - -### Patch Changes - -- bs - -## 2.1.0 - -### Minor Changes - -- a34ba2a: add Schema.provide - -## 2.0.2 - -### Patch Changes - -- 25b154d: fix circular - -## 2.0.1 - -### Patch Changes - -- 39e4f3d: fix: missing export - -## 2.0.0 - -### Major Changes - -- 13abe12: refactor: merge core into prelude - -## 1.32.0 - -### Minor Changes - -- d0471b1: refactor: merge @effect-app/schema into core - -### Patch Changes - -- Updated dependencies [d0471b1] - - @effect-app/core@1.19.0 - -## 1.31.0 - -### Minor Changes - -- 3872061: migrate to effect/Schema - -### Patch Changes - -- Updated dependencies [3872061] - - @effect-app/schema@1.20.0 - - @effect-app/core@1.18.0 - -## 1.30.5 - -### Patch Changes - -- e836dcc: cleanup - -## 1.30.4 - -### Patch Changes - -- 0eac9da: improve: Operation error handling - -## 1.30.3 - -### Patch Changes - -- 4a814f5: improve error report - -## 1.30.2 - -### Patch Changes - -- cda1477: update packages -- Updated dependencies [cda1477] - - @effect-app/schema@1.19.1 - - @effect-app/core@1.17.1 - -## 1.30.1 - -### Patch Changes - -- cleanup - -## 1.30.0 - -### Minor Changes - -- c069b8e: add WithOptionalSpan - -## 1.29.0 - -### Minor Changes - -- 3d4e45a: cleanup FiberSets - -## 1.28.0 - -### Minor Changes - -- update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@1.19.0 - - @effect-app/core@1.17.0 - -## 1.27.0 - -### Minor Changes - -- 9ddb31b: update packages - -### Patch Changes - -- Updated dependencies [9ddb31b] - - @effect-app/schema@1.18.0 - - @effect-app/core@1.16.0 - -## 1.26.8 - -### Patch Changes - -- 0ea3023: drop pipe ext, should've known -- Updated dependencies [0ea3023] - - @effect-app/core@1.15.8 - - @effect-app/schema@1.17.8 - -## 1.26.7 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@1.15.7 - - @effect-app/schema@1.17.7 - -## 1.26.6 - -### Patch Changes - -- Updated dependencies [c57fd1b] - - @effect-app/core@1.15.6 - - @effect-app/schema@1.17.6 - -## 1.26.5 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@1.15.5 - - @effect-app/schema@1.17.5 - -## 1.26.4 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@1.15.4 - - @effect-app/schema@1.17.4 - -## 1.26.3 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@1.15.3 - - @effect-app/schema@1.17.3 - -## 1.26.2 - -### Patch Changes - -- Updated dependencies [56b764d] - - @effect-app/core@1.15.2 - - @effect-app/schema@1.17.2 - -## 1.26.1 - -### Patch Changes - -- Updated dependencies [56df0f3] - - @effect-app/core@1.15.1 - - @effect-app/schema@1.17.1 - -## 1.26.0 - -### Minor Changes - -- 0effd97: update packages - -### Patch Changes - -- Updated dependencies [0effd97] - - @effect-app/schema@1.17.0 - - @effect-app/core@1.15.0 - -## 1.25.0 - -### Minor Changes - -- a2ac359: add pipe extensions experiment - -### Patch Changes - -- Updated dependencies [a2ac359] - - @effect-app/core@1.14.0 - - @effect-app/schema@1.16.2 - -## 1.24.1 - -### Patch Changes - -- Updated dependencies [61eb517] - - @effect-app/core@1.13.1 - - @effect-app/schema@1.16.1 - -## 1.24.0 - -### Minor Changes - -- b9b64b8: housekeeping: update packages - -### Patch Changes - -- Updated dependencies [b9b64b8] - - @effect-app/schema@1.16.0 - - @effect-app/core@1.13.0 - -## 1.23.1 - -### Patch Changes - -- 16bc3b2: fix typo - -## 1.23.0 - -### Minor Changes - -- 67a202a: fix location - -## 1.22.1 - -### Patch Changes - -- fup - -## 1.22.0 - -### Minor Changes - -- c2487d4: remove legacy FetchResponse - -## 1.21.1 - -### Patch Changes - -- 66086f3: f - -## 1.21.0 - -### Minor Changes - -- cleanup all legacy router cruft - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@1.15.0 - -## 1.20.0 - -### Minor Changes - -- 65dcc73: update packages - -### Patch Changes - -- Updated dependencies [65dcc73] - - @effect-app/schema@1.14.0 - - @effect-app/core@1.12.0 - -## 1.19.1 - -### Patch Changes - -- supply layer - -## 1.19.0 - -### Minor Changes - -- 4d2b804: housekeeping: update packages - -### Patch Changes - -- Updated dependencies [4d2b804] - - @effect-app/schema@1.13.0 - - @effect-app/core@1.11.0 - -## 1.18.0 - -### Minor Changes - -- b670052: feat: followup rpc client side - -## 1.17.5 - -### Patch Changes - -- 447cba4: fix paths - -## 1.17.4 - -### Patch Changes - -- 550ba43: control log levels -- Updated dependencies [550ba43] - - @effect-app/core@1.10.2 - - @effect-app/schema@1.12.2 - -## 1.17.3 - -### Patch Changes - -- 6a3e66a: feat: expose tags on TaggedUnion - -## 1.17.2 - -### Patch Changes - -- 13b7aa1: fix: TaggedUnion should inherit the rest of Union - -## 1.17.1 - -### Patch Changes - -- 38c0e65: cleanup - -## 1.17.0 - -### Minor Changes - -- 190b139: update packages - -## 1.16.1 - -### Patch Changes - -- c710953: update packagesy -- Updated dependencies [3de8bfb] - - @effect-app/core@1.10.1 - - @effect-app/schema@1.12.1 - -## 1.16.0 - -### Minor Changes - -- 4bc6e99: update packages -- 1018e58: update packages - -### Patch Changes - -- Updated dependencies [4bc6e99] -- Updated dependencies [1018e58] - - @effect-app/schema@1.12.0 - - @effect-app/core@1.10.0 - -## 1.15.5 - -### Patch Changes - -- d9fd446: fix type - -## 1.15.4 - -### Patch Changes - -- 70c6222: improve doc - -## 1.15.3 - -### Patch Changes - -- 97a0bf8: fix client type - -## 1.15.2 - -### Patch Changes - -- fb62f02: bwc - -## 1.15.1 - -### Patch Changes - -- 2b56d7e: cleanup routing -- 73d5e0a: cleanup routing - -## 1.15.0 - -### Minor Changes - -- feat: add new router support - -## 1.14.0 - -### Minor Changes - -- b3d9a3e: update packages - -### Patch Changes - -- Updated dependencies [b3d9a3e] - - @effect-app/schema@1.11.0 - - @effect-app/core@1.9.0 - -## 1.13.4 - -### Patch Changes - -- d08286c: update packages -- Updated dependencies [d08286c] - - @effect-app/schema@1.10.1 - - @effect-app/core@1.8.1 - -## 1.13.3 - -### Patch Changes - -- 6c81e3c: improve: remove framework stacktrace location - -## 1.13.2 - -### Patch Changes - -- a64695e: fix runtime error - -## 1.13.1 - -### Patch Changes - -- e5fc429: fix types - -## 1.13.0 - -### Minor Changes - -- c5f5223: update packages - -### Patch Changes - -- Updated dependencies [c5f5223] - - @effect-app/schema@1.10.0 - - @effect-app/core@1.8.0 - -## 1.12.5 - -### Patch Changes - -- Updated dependencies [5cb4b35] - - @effect-app/schema@1.9.5 - -## 1.12.4 - -### Patch Changes - -- Updated dependencies [0151436] - - @effect-app/schema@1.9.4 - -## 1.12.3 - -### Patch Changes - -- update packages -- Updated dependencies - - @effect-app/schema@1.9.3 - - @effect-app/core@1.7.5 - -## 1.12.2 - -### Patch Changes - -- e6eecd2: update packages -- Updated dependencies [e6eecd2] - - @effect-app/schema@1.9.2 - - @effect-app/core@1.7.4 - -## 1.12.1 - -### Patch Changes - -- ff -- Updated dependencies - - @effect-app/core@1.7.3 - - @effect-app/schema@1.9.1 - -## 1.12.0 - -### Minor Changes - -- 056f293: fix type - -### Patch Changes - -- Updated dependencies [056f293] - - @effect-app/schema@1.9.0 - -## 1.11.3 - -### Patch Changes - -- fix -- Updated dependencies - - @effect-app/core@1.7.2 - - @effect-app/schema@1.8.1 - -## 1.11.2 - -### Patch Changes - -- 65135b2: fix issue - -## 1.11.1 - -### Patch Changes - -- c229a73: add tagMap to TaggedUnion - -## 1.11.0 - -### Minor Changes - -- 24f0c0f: feat: allow custom errors per endpoint. - -### Patch Changes - -- Updated dependencies [24f0c0f] - - @effect-app/schema@1.8.0 - -## 1.10.2 - -### Patch Changes - -- 1ac74ec: cleanup tsconfig base -- 0b399ce: update packages -- Updated dependencies [0b399ce] - - @effect-app/schema@1.7.1 - - @effect-app/core@1.7.1 - -## 1.10.1 - -### Patch Changes - -- 9fbf129: fix: messagefallback - -## 1.10.0 - -### Minor Changes - -- 2143dd9: update packages - -### Patch Changes - -- Updated dependencies [2143dd9] - - @effect-app/schema@1.7.0 - - @effect-app/core@1.7.0 - -## 1.9.2 - -### Patch Changes - -- e120966: update packages -- f6066ac: update packages -- Updated dependencies [e120966] -- Updated dependencies [f6066ac] - - @effect-app/schema@1.6.1 - - @effect-app/core@1.6.1 - -## 1.9.1 - -### Patch Changes - -- 26551ce: improve rendering - -## 1.9.0 - -### Minor Changes - -- 79f58af: update packages - -### Patch Changes - -- Updated dependencies [79f58af] - - @effect-app/schema@1.6.0 - - @effect-app/core@1.6.0 - -## 1.8.2 - -### Patch Changes - -- b3ebc41: update packages -- Updated dependencies [b3ebc41] - - @effect-app/schema@1.5.2 - - @effect-app/core@1.5.2 - -## 1.8.1 - -### Patch Changes - -- f569681: update packages -- Updated dependencies [f569681] - - @effect-app/schema@1.5.1 - - @effect-app/core@1.5.1 - -## 1.8.0 - -### Minor Changes - -- d12fc1a: improve: expose interrupt, not waitUntilEmpty on FiberSets - -## 1.7.0 - -### Minor Changes - -- 613c148: update packages - -### Patch Changes - -- Updated dependencies [613c148] - - @effect-app/schema@1.5.0 - - @effect-app/core@1.5.0 - -## 1.6.0 - -### Minor Changes - -- 8d0c511: update packages - -### Patch Changes - -- Updated dependencies [8d0c511] - - @effect-app/schema@1.4.0 - - @effect-app/core@1.4.0 - -## 1.5.2 - -### Patch Changes - -- Updated dependencies [b48c630] - - @effect-app/schema@1.3.1 - -## 1.5.1 - -### Patch Changes - -- 8438eed: fix ConfigSecretURL - -## 1.5.0 - -### Minor Changes - -- 9cc6f86: update packages - -### Patch Changes - -- Updated dependencies [9cc6f86] - - @effect-app/schema@1.3.0 - - @effect-app/core@1.3.0 - -## 1.4.8 - -### Patch Changes - -- fe2754a: improve: decode span -- 349c421: Update packages -- Updated dependencies [349c421] - - @effect-app/schema@1.2.8 - - @effect-app/core@1.2.3 - -## 1.4.7 - -### Patch Changes - -- 744cf0f: add client.response span - -## 1.4.6 - -### Patch Changes - -- 9d944a1: update packages -- Updated dependencies [9d944a1] - - @effect-app/schema@1.2.7 - - @effect-app/core@1.2.2 - -## 1.4.5 - -### Patch Changes - -- a67d115: improve client trace - -## 1.4.4 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@1.2.6 - -## 1.4.3 - -### Patch Changes - -- 24c3fe9: align brands -- Updated dependencies [24c3fe9] - - @effect-app/schema@1.2.5 - -## 1.4.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@1.2.4 - -## 1.4.1 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@1.2.3 - -## 1.4.0 - -### Minor Changes - -- c10818c: improve forking - -### Patch Changes - -- 2c661c1: update packages -- Updated dependencies [2c661c1] - - @effect-app/schema@1.2.2 - - @effect-app/core@1.2.1 - -## 1.3.1 - -### Patch Changes - -- Updated dependencies [92f303f] - - @effect-app/schema@1.2.1 - -## 1.3.0 - -### Minor Changes - -- 9ac9416: update packages - -### Patch Changes - -- Updated dependencies [9ac9416] - - @effect-app/schema@1.2.0 - - @effect-app/core@1.2.0 - -## 1.2.5 - -### Patch Changes - -- revert - -## 1.2.4 - -### Patch Changes - -- 6335139: allow error - -## 1.2.3 - -### Patch Changes - -- 3411e78: update packages -- Updated dependencies [3411e78] - - @effect-app/schema@1.1.3 - - @effect-app/core@1.1.3 - -## 1.2.2 - -### Patch Changes - -- 128f636: update packages -- Updated dependencies [128f636] - - @effect-app/schema@1.1.2 - - @effect-app/core@1.1.2 - -## 1.2.1 - -### Patch Changes - -- Updated dependencies [132bbc4] - - @effect-app/core@1.1.1 - - @effect-app/schema@1.1.1 - -## 1.2.0 - -### Minor Changes - -- 2e29520: update packages - -### Patch Changes - -- Updated dependencies [2e29520] - - @effect-app/schema@1.1.0 - - @effect-app/core@1.1.0 - -## 1.1.1 - -### Patch Changes - -- 4dba4a5: add annotateSpanWithError - -## 1.1.0 - -### Minor Changes - -- b8b729e: adopt @effect-rx - -## 1.0.12 - -### Patch Changes - -- c99cdbb: update packages -- Updated dependencies [c99cdbb] - - @effect-app/schema@1.0.10 - - @effect-app/core@1.0.6 - -## 1.0.11 - -### Patch Changes - -- feat: improve error reported state. - -## 1.0.10 - -### Patch Changes - -- Updated dependencies [f202812] - - @effect-app/schema@1.0.9 - -## 1.0.9 - -### Patch Changes - -- 83f19e1: schema next minor -- Updated dependencies [83f19e1] - - @effect-app/schema@1.0.8 - -## 1.0.8 - -### Patch Changes - -- 86d33e8: add error reporter for vue - -## 1.0.7 - -### Patch Changes - -- c4dbb6c: update packages -- Updated dependencies [c4dbb6c] - - @effect-app/schema@1.0.7 - - @effect-app/core@1.0.5 - -## 1.0.6 - -### Patch Changes - -- 93f53d4: update packages -- Updated dependencies [93f53d4] - - @effect-app/schema@1.0.6 - - @effect-app/core@1.0.4 - -## 1.0.5 - -### Patch Changes - -- Updated dependencies [9c69b5b] - - @effect-app/core@1.0.3 - - @effect-app/schema@1.0.5 - -## 1.0.4 - -### Patch Changes - -- Updated dependencies [6363ff5] - - @effect-app/core@1.0.2 - - @effect-app/schema@1.0.4 - -## 1.0.3 - -### Patch Changes - -- bf702ba: update packages -- Updated dependencies [bf702ba] - - @effect-app/schema@1.0.3 - - @effect-app/core@1.0.1 - -## 1.0.2 - -### Patch Changes - -- Updated dependencies [156664e] - - @effect-app/schema@1.0.2 - -## 1.0.1 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@1.0.1 - -## 1.0.0 - -### Major Changes - -- 4e9992f: effect 3.0! - -### Patch Changes - -- Updated dependencies [4e9992f] - - @effect-app/schema@1.0.0 - - @effect-app/core@1.0.0 - -## 0.204.0 - -### Minor Changes - -- version prob - -## 0.203.1 - -### Patch Changes - -- ff5d466: cleanup Struct type -- Updated dependencies [ff5d466] - - @effect-app/schema@0.221.1 - -## 0.203.0 - -### Minor Changes - -- 0d1b378: update to latest schema - -### Patch Changes - -- Updated dependencies [0d1b378] - - @effect-app/schema@0.221.0 - - @effect-app/core@0.170.0 - -## 0.202.1 - -### Patch Changes - -- 45770ea: re-add MainFiberSet join logging - -## 0.202.0 - -### Minor Changes - -- c0a2bb1: rename FiberBag to MainFiberSet - -## 0.201.6 - -### Patch Changes - -- 4a242e9: use built in FiberSet.join - -## 0.201.5 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.169.1 - - @effect-app/schema@0.220.4 - -## 0.201.4 - -### Patch Changes - -- 36fb254: fix emptyto check - -## 0.201.3 - -### Patch Changes - -- Updated dependencies [0ad9ea9] - - @effect-app/schema@0.220.3 - -## 0.201.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.220.2 - -## 0.201.1 - -### Patch Changes - -- Updated dependencies [89bdcf0] - - @effect-app/schema@0.220.1 - -## 0.201.0 - -### Minor Changes - -- 290a709: update packages - -### Patch Changes - -- Updated dependencies [290a709] - - @effect-app/schema@0.220.0 - - @effect-app/core@0.169.0 - -## 0.200.0 - -### Minor Changes - -- 564a95c: fix branded schemas - -### Patch Changes - -- Updated dependencies [564a95c] - - @effect-app/schema@0.219.0 - -## 0.199.0 - -### Minor Changes - -- ecb05f6: update packages -- fbfa538: add title to Operations and expose all - -### Patch Changes - -- Updated dependencies [ecb05f6] - - @effect-app/schema@0.218.0 - - @effect-app/core@0.168.0 - -## 0.198.2 - -### Patch Changes - -- Updated dependencies [7b1ff1c] - - @effect-app/core@0.167.0 - - @effect-app/schema@0.217.2 - -## 0.198.1 - -### Patch Changes - -- Updated dependencies [e165c07] - - @effect-app/schema@0.217.1 - -## 0.198.0 - -### Minor Changes - -- 01f8283: cleanup: drop legacy `FromClass` - -### Patch Changes - -- Updated dependencies [01f8283] - - @effect-app/schema@0.217.0 - -## 0.197.0 - -### Minor Changes - -- revert form changes - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.166.0 - - @effect-app/schema@0.216.0 - -## 0.196.2 - -### Patch Changes - -- Updated dependencies [2044733] - - @effect-app/core@0.165.0 - - @effect-app/schema@0.215.2 - -## 0.196.1 - -### Patch Changes - -- Updated dependencies [a9a81a1] - - @effect-app/core@0.164.0 - - @effect-app/schema@0.215.1 - -## 0.196.0 - -### Minor Changes - -- 7a3f05c: update packages - -### Patch Changes - -- Updated dependencies [7a3f05c] - - @effect-app/core@0.163.0 - - @effect-app/schema@0.215.0 - -## 0.195.0 - -### Minor Changes - -- bbaa558: bs - -### Patch Changes - -- Updated dependencies [bbaa558] - - @effect-app/core@0.162.0 - - @effect-app/schema@0.214.0 - -## 0.194.1 - -### Patch Changes - -- Updated dependencies [ac37ff7] - - @effect-app/fluent-extensions@0.155.1 - - @effect-app/core@0.161.1 - - @effect-app/schema@0.213.1 - -## 0.194.0 - -### Minor Changes - -- e5b0d8e: update packages -- 2e2fa98: update packages -- 44ef913: update packages - -### Patch Changes - -- Updated dependencies [e5b0d8e] -- Updated dependencies [2e2fa98] -- Updated dependencies [44ef913] - - @effect-app/fluent-extensions@0.155.0 - - @effect-app/schema@0.213.0 - - @effect-app/core@0.161.0 - -## 0.193.0 - -### Minor Changes - -- 494842c: update packages - -### Patch Changes - -- Updated dependencies [494842c] - - @effect-app/fluent-extensions@0.154.0 - - @effect-app/schema@0.212.0 - - @effect-app/core@0.160.0 - -## 0.192.1 - -### Patch Changes - -- Updated dependencies [413bdee] - - @effect-app/core@0.159.1 - - @effect-app/schema@0.211.2 - -## 0.192.0 - -### Minor Changes - -- 215071f: cleanup TagClass -- af56c32: Integrate Service in Context - -### Patch Changes - -- Updated dependencies [af56c32] - - @effect-app/core@0.159.0 - - @effect-app/schema@0.211.1 - -## 0.191.0 - -### Minor Changes - -- cb84068: replace lodash with builtin and cleanup - -### Patch Changes - -- Updated dependencies [cb84068] - - @effect-app/fluent-extensions@0.153.0 - - @effect-app/schema@0.211.0 - - @effect-app/core@0.158.0 - -## 0.190.0 - -### Minor Changes - -- 790bfc2: cleanup - -### Patch Changes - -- Updated dependencies [790bfc2] - - @effect-app/fluent-extensions@0.152.0 - - @effect-app/core@0.157.0 - - @effect-app/schema@0.210.2 - -## 0.189.1 - -### Patch Changes - -- 0334285: update packages -- Updated dependencies [0334285] -- Updated dependencies [b9f35eb] - - @effect-app/fluent-extensions@0.151.0 - - @effect-app/schema@0.210.1 - - @effect-app/core@0.156.1 - -## 0.189.0 - -### Minor Changes - -- 498deb0: update packages - -### Patch Changes - -- Updated dependencies [498deb0] - - @effect-app/fluent-extensions@0.150.0 - - @effect-app/schema@0.210.0 - - @effect-app/core@0.156.0 - -## 0.188.0 - -### Minor Changes - -- fd8f019: update packages - -### Patch Changes - -- Updated dependencies [fd8f019] - - @effect-app/fluent-extensions@0.149.0 - - @effect-app/schema@0.209.0 - - @effect-app/core@0.155.0 - -## 0.187.1 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.208.1 - -## 0.187.0 - -### Minor Changes - -- 51253a2: update packages - -### Patch Changes - -- Updated dependencies [51253a2] - - @effect-app/fluent-extensions@0.148.0 - - @effect-app/schema@0.208.0 - - @effect-app/core@0.154.0 - -## 0.186.2 - -### Patch Changes - -- 0a0b8e9: add ServiceUnavailableError - -## 0.186.1 - -### Patch Changes - -- Updated dependencies [df2a290] - - @effect-app/schema@0.207.1 - -## 0.186.0 - -### Minor Changes - -- f2c3553: update packages - -### Patch Changes - -- Updated dependencies [f2c3553] - - @effect-app/fluent-extensions@0.147.0 - - @effect-app/schema@0.207.0 - - @effect-app/core@0.153.0 - -## 0.185.8 - -### Patch Changes - -- Updated dependencies [2b53680] - - @effect-app/schema@0.206.7 - -## 0.185.7 - -### Patch Changes - -- Updated dependencies [2794b0a] - - @effect-app/schema@0.206.6 - -## 0.185.6 - -### Patch Changes - -- Updated dependencies [41bec85] - - @effect-app/schema@0.206.5 - -## 0.185.5 - -### Patch Changes - -- Updated dependencies [511d81b] - - @effect-app/schema@0.206.4 - -## 0.185.4 - -### Patch Changes - -- df3a550: fup - -## 0.185.3 - -### Patch Changes - -- f385129: fix legacy struct use -- Updated dependencies [f385129] - - @effect-app/schema@0.206.3 - -## 0.185.2 - -### Patch Changes - -- Updated dependencies [fe910fe] - - @effect-app/schema@0.206.2 - -## 0.185.1 - -### Patch Changes - -- Updated dependencies [dbc7c83] - - @effect-app/schema@0.206.1 - -## 0.185.0 - -### Minor Changes - -- update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/fluent-extensions@0.146.0 - - @effect-app/schema@0.206.0 - - @effect-app/core@0.152.1 - -## 0.184.0 - -### Minor Changes - -- 5178025: update packages - -### Patch Changes - -- Updated dependencies [5178025] - - @effect-app/fluent-extensions@0.145.0 - - @effect-app/schema@0.205.0 - - @effect-app/core@0.152.0 - -## 0.183.2 - -### Patch Changes - -- c7b8007: bag it - -## 0.183.1 - -### Patch Changes - -- Updated dependencies [58233dd] - - @effect-app/core@0.151.1 - - @effect-app/schema@0.204.1 - -## 0.183.0 - -### Minor Changes - -- 77366cc: don't go through service constructor - -## 0.182.1 - -### Patch Changes - -- f188543: update accessor shape - -## 0.182.0 - -### Minor Changes - -- d0a1774: update ts to 5.4.1-rc - -### Patch Changes - -- Updated dependencies [d0a1774] - - @effect-app/fluent-extensions@0.144.0 - - @effect-app/schema@0.204.0 - - @effect-app/core@0.151.0 - -## 0.181.8 - -### Patch Changes - -- Updated dependencies [ce64bc5] - - @effect-app/schema@0.203.4 - -## 0.181.7 - -### Patch Changes - -- Updated dependencies [bbf24a6] - - @effect-app/schema@0.203.3 - -## 0.181.6 - -### Patch Changes - -- Updated dependencies [e12b4f8] - - @effect-app/schema@0.203.2 - -## 0.181.5 - -### Patch Changes - -- Updated dependencies [09bc0d5] - - @effect-app/schema@0.203.1 - -## 0.181.4 - -### Patch Changes - -- Updated dependencies [e355a45] - - @effect-app/schema@0.203.0 - -## 0.181.3 - -### Patch Changes - -- Updated dependencies [f4bea89] - - @effect-app/fluent-extensions@0.143.4 - - @effect-app/core@0.150.5 - - @effect-app/schema@0.202.5 - -## 0.181.2 - -### Patch Changes - -- Updated dependencies [ea3dd75] - - @effect-app/fluent-extensions@0.143.3 - - @effect-app/core@0.150.4 - - @effect-app/schema@0.202.4 - -## 0.181.1 - -### Patch Changes - -- 579f42d: fix typo - -## 0.181.0 - -### Minor Changes - -- 752958a: awesome tag - -## 0.180.10 - -### Patch Changes - -- abb5332: add ServiceShape - -## 0.180.9 - -### Patch Changes - -- Updated dependencies [cef7a30] - - @effect-app/fluent-extensions@0.143.2 - - @effect-app/core@0.150.3 - - @effect-app/schema@0.202.3 - -## 0.180.8 - -### Patch Changes - -- 190415c: fix - -## 0.180.7 - -### Patch Changes - -- 6ece717: base FiberBag on FiberSet - -## 0.180.6 - -### Patch Changes - -- dba2711: fix generic - -## 0.180.5 - -### Patch Changes - -- e470bd5: add forkDaemon and forkScoped in FiberBag. - -## 0.180.4 - -### Patch Changes - -- Updated dependencies [81f152f] - - @effect-app/core@0.150.2 - - @effect-app/schema@0.202.2 - -## 0.180.3 - -### Patch Changes - -- add fiberbag - -## 0.180.2 - -### Patch Changes - -- Updated dependencies [ef4b0ba] - - @effect-app/fluent-extensions@0.143.1 - - @effect-app/core@0.150.1 - - @effect-app/schema@0.202.1 - -## 0.180.1 - -### Patch Changes - -- f2eea61: fix TagClass - -## 0.180.0 - -### Minor Changes - -- 7346691: update packages - -### Patch Changes - -- Updated dependencies [7346691] - - @effect-app/fluent-extensions@0.143.0 - - @effect-app/schema@0.202.0 - - @effect-app/core@0.150.0 - -## 0.179.0 - -### Minor Changes - -- add AcessTag support - -## 0.178.1 - -### Patch Changes - -- fix - -## 0.178.0 - -### Minor Changes - -- 0354650: prototype - -## 0.177.0 - -### Minor Changes - -- 32f852e: add requestname to span - -## 0.176.2 - -### Patch Changes - -- Updated dependencies [d1e4f1b] - - @effect-app/schema@0.201.2 - -## 0.176.1 - -### Patch Changes - -- Updated dependencies [0b514ad] - - @effect-app/schema@0.201.1 - -## 0.176.0 - -### Minor Changes - -- e8e8ee2: update packages - -### Patch Changes - -- Updated dependencies [e8e8ee2] - - @effect-app/fluent-extensions@0.142.0 - - @effect-app/schema@0.201.0 - - @effect-app/core@0.149.0 - -## 0.175.1 - -### Patch Changes - -- Updated dependencies [ee00776] - - @effect-app/schema@0.200.0 - -## 0.175.0 - -### Minor Changes - -- 117be64: bump - -### Patch Changes - -- Updated dependencies [117be64] - - @effect-app/core@0.148.0 - - @effect-app/fluent-extensions@0.141.0 - - @effect-app/schema@0.199.0 - -## 0.174.1 - -### Patch Changes - -- 4008eb1: cleanup and add byIdAndSaveWithPure - -## 0.174.0 - -### Minor Changes - -- A new day -- 78b3c9e: reduce tspuse - -### Patch Changes - -- Updated dependencies -- Updated dependencies [78b3c9e] - - @effect-app/core@0.147.0 - - @effect-app/fluent-extensions@0.140.0 - - @effect-app/schema@0.198.0 - -## 0.173.4 - -### Patch Changes - -- 9577608: cleanup - -## 0.173.3 - -### Patch Changes - -- 4d9b13c: add extendTaggedUnion - -## 0.173.2 - -### Patch Changes - -- Updated dependencies [3170396] - - @effect-app/core@0.146.1 - - @effect-app/schema@0.197.1 - -## 0.173.1 - -### Patch Changes - -- ac8e9aa: add OperationResult.is - -## 0.173.0 - -### Minor Changes - -- c070e0d: update effect - -### Patch Changes - -- dd0cf42: update -- Updated dependencies [c070e0d] -- Updated dependencies [dd0cf42] - - @effect-app/fluent-extensions@0.139.0 - - @effect-app/schema@0.197.0 - - @effect-app/core@0.146.0 - -## 0.172.0 - -### Minor Changes - -- 57fcfef: update packages - -### Patch Changes - -- 739e742: add missing plugins in tsconfig -- Updated dependencies [57fcfef] - - @effect-app/fluent-extensions@0.138.0 - - @effect-app/schema@0.196.0 - - @effect-app/core@0.145.0 - -## 0.171.4 - -### Patch Changes - -- Updated dependencies [b5543d4] - - @effect-app/core@0.144.3 - - @effect-app/schema@0.195.3 - -## 0.171.3 - -### Patch Changes - -- Updated dependencies [39beb09] - - @effect-app/core@0.144.2 - - @effect-app/schema@0.195.2 - -## 0.171.2 - -### Patch Changes - -- 0fd4175: f - -## 0.171.1 - -### Patch Changes - -- 73c3e1b: update packages -- Updated dependencies [73c3e1b] - - @effect-app/fluent-extensions@0.137.1 - - @effect-app/core@0.144.1 - - @effect-app/schema@0.195.1 - -## 0.171.0 - -### Minor Changes - -- 49fb62c: align Tag arg order. - -## 0.170.0 - -### Minor Changes - -- 76ea9ae: improve - -## 0.169.0 - -### Minor Changes - -- 7079fc8: connection reset by peer - -### Patch Changes - -- Updated dependencies [7079fc8] - - @effect-app/fluent-extensions@0.137.0 - - @effect-app/schema@0.195.0 - - @effect-app/core@0.144.0 - -## 0.168.0 - -### Minor Changes - -- update TagClassId - -## 0.167.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/fluent-extensions@0.136.1 - - @effect-app/core@0.143.1 - - @effect-app/schema@0.194.2 - -## 0.167.1 - -### Patch Changes - -- Updated dependencies [c4ac357] - - @effect-app/core@0.143.0 - - @effect-app/schema@0.194.1 - -## 0.167.0 - -### Minor Changes - -- 8374f61: update packages - -### Patch Changes - -- Updated dependencies [8374f61] - - @effect-app/fluent-extensions@0.136.0 - - @effect-app/schema@0.194.0 - - @effect-app/core@0.142.0 - -## 0.166.1 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.141.1 - - @effect-app/schema@0.193.1 - -## 0.166.0 - -### Minor Changes - -- de336f6: src - -### Patch Changes - -- Updated dependencies [de336f6] - - @effect-app/fluent-extensions@0.135.0 - - @effect-app/schema@0.193.0 - - @effect-app/core@0.141.0 - -## 0.165.2 - -### Patch Changes - -- dbbd0da: fix path - -## 0.165.1 - -### Patch Changes - -- 7715b74: add tsconfig.base.json -- f10e630: update packages -- Updated dependencies [f10e630] - - @effect-app/fluent-extensions@0.134.1 - - @effect-app/schema@0.192.1 - - @effect-app/core@0.140.1 - -## 0.165.0 - -### Minor Changes - -- 47f46f0: use actual action name casing so that editor go to works. - -## 0.164.0 - -### Minor Changes - -- 5f52e06: update packages - -### Patch Changes - -- Updated dependencies [5f52e06] - - @effect-app/fluent-extensions@0.134.0 - - @effect-app/schema@0.192.0 - - @effect-app/core@0.140.0 - -## 0.163.0 - -### Minor Changes - -- m - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.139.0 - - @effect-app/fluent-extensions@0.133.0 - - @effect-app/schema@0.191.0 - -## 0.162.3 - -### Patch Changes - -- 5b30ea1: cleanup - -## 0.162.2 - -### Patch Changes - -- fix name - -## 0.162.1 - -### Patch Changes - -- fix name - -## 0.162.0 - -### Minor Changes - -- bs - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.138.0 - - @effect-app/fluent-extensions@0.132.0 - - @effect-app/schema@0.190.0 - -## 0.161.0 - -### Minor Changes - -- 8794c23: bs - -## 0.160.0 - -### Minor Changes - -- 797056c: update packages - -### Patch Changes - -- Updated dependencies [797056c] - - @effect-app/fluent-extensions@0.131.0 - - @effect-app/core@0.137.0 - - @effect-app/schema@0.189.1 - -## 0.159.0 - -### Minor Changes - -- 6145788: switch to tanstack-query - -## 0.158.5 - -### Patch Changes - -- b4ee7e7: f - -## 0.158.4 - -### Patch Changes - -- pf - -## 0.158.3 - -### Patch Changes - -- Updated dependencies [c31e783] - - @effect-app/fluent-extensions@0.130.3 - -## 0.158.2 - -### Patch Changes - -- 4848bc6: bump -- Updated dependencies [4848bc6] - - @effect-app/fluent-extensions@0.130.2 - -## 0.158.1 - -### Patch Changes - -- Updated dependencies [67571c9] - - @effect-app/fluent-extensions@0.130.1 - -## 0.158.0 - -### Minor Changes - -- 12eb7f7: update packages - -### Patch Changes - -- Updated dependencies [12eb7f7] - - @effect-app/fluent-extensions@0.130.0 - - @effect-app/schema@0.189.0 - - @effect-app/core@0.136.0 - -## 0.157.4 - -### Patch Changes - -- Updated dependencies [b525b4f] - - @effect-app/fluent-extensions@0.129.3 - -## 0.157.3 - -### Patch Changes - -- Updated dependencies [aed6cd9] - - @effect-app/fluent-extensions@0.129.2 - -## 0.157.2 - -### Patch Changes - -- Updated dependencies [37c167f] - - @effect-app/fluent-extensions@0.129.1 - -## 0.157.1 - -### Patch Changes - -- 28feba6: fix var - -## 0.157.0 - -### Minor Changes - -- 17cfe0f: update packages - -### Patch Changes - -- Updated dependencies [17cfe0f] - - @effect-app/fluent-extensions@0.129.0 - - @effect-app/schema@0.188.0 - - @effect-app/core@0.135.0 - -## 0.156.5 - -### Patch Changes - -- Updated dependencies [3c1cb25] - - @effect-app/core@0.134.1 - - @effect-app/fluent-extensions@0.128.5 - - @effect-app/schema@0.187.5 - -## 0.156.4 - -### Patch Changes - -- Updated dependencies [eddbf3c] - - @effect-app/core@0.134.0 - - @effect-app/fluent-extensions@0.128.4 - - @effect-app/schema@0.187.4 - -## 0.156.3 - -### Patch Changes - -- 7c28686: update packages -- Updated dependencies [7c28686] - - @effect-app/fluent-extensions@0.128.3 - - @effect-app/schema@0.187.3 - - @effect-app/core@0.133.3 - -## 0.156.2 - -### Patch Changes - -- Updated dependencies [963b8d0] - - @effect-app/core@0.133.2 - - @effect-app/fluent-extensions@0.128.2 - - @effect-app/schema@0.187.2 - -## 0.156.1 - -### Patch Changes - -- b9e1e73: ext -- Updated dependencies [b9e1e73] - - @effect-app/core@0.133.1 - - @effect-app/fluent-extensions@0.128.1 - - @effect-app/schema@0.187.1 - -## 0.156.0 - -### Minor Changes - -- 9b67f67: update packages - -### Patch Changes - -- Updated dependencies [9b67f67] - - @effect-app/fluent-extensions@0.128.0 - - @effect-app/schema@0.187.0 - - @effect-app/core@0.133.0 - -## 0.155.2 - -### Patch Changes - -- b3e095c: fix - -## 0.155.1 - -### Patch Changes - -- fix - -## 0.155.0 - -### Minor Changes - -- 71dbfc3: update packages -- 1cc7ee7: cleanup service tags - -### Patch Changes - -- Updated dependencies [71dbfc3] - - @effect-app/fluent-extensions@0.127.0 - - @effect-app/schema@0.186.0 - - @effect-app/core@0.132.0 - -## 0.154.3 - -### Patch Changes - -- Updated dependencies [8577c90] - - @effect-app/core@0.131.9 - - @effect-app/fluent-extensions@0.126.10 - - @effect-app/schema@0.185.2 - -## 0.154.2 - -### Patch Changes - -- 7db0be1: dual copy/clone -- Updated dependencies [7db0be1] - - @effect-app/core@0.131.8 - - @effect-app/fluent-extensions@0.126.9 - - @effect-app/schema@0.185.1 - -## 0.154.1 - -### Patch Changes - -- Updated dependencies [ac55751] - - @effect-app/schema@0.185.0 - - @effect-app/fluent-extensions@0.126.8 - -## 0.154.0 - -### Minor Changes - -- 83091eb: cleanup - -## 0.153.7 - -### Patch Changes - -- Updated dependencies [dc45062] - - @effect-app/core@0.131.7 - - @effect-app/fluent-extensions@0.126.7 - - @effect-app/schema@0.184.7 - -## 0.153.6 - -### Patch Changes - -- Updated dependencies [fc86a75] - - @effect-app/core@0.131.6 - - @effect-app/fluent-extensions@0.126.6 - - @effect-app/schema@0.184.6 - -## 0.153.5 - -### Patch Changes - -- Updated dependencies [e47df05] - - @effect-app/core@0.131.5 - - @effect-app/fluent-extensions@0.126.5 - - @effect-app/schema@0.184.5 - -## 0.153.4 - -### Patch Changes - -- Updated dependencies [3db43d9] - - @effect-app/core@0.131.4 - - @effect-app/fluent-extensions@0.126.4 - - @effect-app/schema@0.184.4 - -## 0.153.3 - -### Patch Changes - -- Updated dependencies [8dd650f] - - @effect-app/core@0.131.3 - - @effect-app/fluent-extensions@0.126.3 - - @effect-app/schema@0.184.3 - -## 0.153.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.131.2 - - @effect-app/fluent-extensions@0.126.2 - - @effect-app/schema@0.184.2 - -## 0.153.1 - -### Patch Changes - -- Updated dependencies [27e6867] - - @effect-app/core@0.131.1 - - @effect-app/fluent-extensions@0.126.1 - - @effect-app/schema@0.184.1 - -## 0.153.0 - -### Minor Changes - -- c8a07bc: fix path - -### Patch Changes - -- Updated dependencies [c8a07bc] - - @effect-app/core@0.131.0 - - @effect-app/fluent-extensions@0.126.0 - - @effect-app/schema@0.184.0 - -## 0.152.0 - -### Minor Changes - -- 525237e: rename @effect-app/prelude to effect-app - -### Patch Changes - -- Updated dependencies [525237e] - - @effect-app/core@0.130.0 - - @effect-app/fluent-extensions@0.125.9 - - @effect-app/schema@0.183.14 - -## 0.151.3 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.129.3 - - @effect-app/fluent-extensions@0.125.8 - - @effect-app/schema@0.183.13 - -## 0.151.2 - -### Patch Changes - -- Updated dependencies [0d02cbd] - - @effect-app/core@0.129.2 - - @effect-app/fluent-extensions@0.125.7 - - @effect-app/schema@0.183.12 - -## 0.151.1 - -### Patch Changes - -- Updated dependencies [b01fd1e] - - @effect-app/core@0.129.1 - - @effect-app/fluent-extensions@0.125.6 - - @effect-app/schema@0.183.11 - -## 0.151.0 - -### Minor Changes - -- b2d3e53: consolidate - -### Patch Changes - -- Updated dependencies [b2d3e53] - - @effect-app/core@0.129.0 - - @effect-app/fluent-extensions@0.125.5 - - @effect-app/schema@0.183.10 - -## 0.150.3 - -### Patch Changes - -- 200a840: address -- Updated dependencies [200a840] - - @effect-app/core@0.128.2 - - @effect-app/fluent-extensions@0.125.4 - - @effect-app/schema@0.183.9 - -## 0.150.2 - -### Patch Changes - -- Updated dependencies [0c57301] - - @effect-app/core@0.128.1 - - @effect-app/fluent-extensions@0.125.3 - - @effect-app/schema@0.183.8 - -## 0.150.1 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.128.0 - - @effect-app/fluent-extensions@0.125.2 - - @effect-app/schema@0.183.7 - -## 0.150.0 - -### Minor Changes - -- 83b5bb6: fix option -- 87753e4: improve prelude export - -### Patch Changes - -- Updated dependencies [83b5bb6] -- Updated dependencies [87753e4] - - @effect-app/core@0.127.0 - - @effect-app/fluent-extensions@0.125.1 - - @effect-app/schema@0.183.6 - -## 0.149.6 - -### Patch Changes - -- 988ed1d: update packages -- Updated dependencies [38bff6b] -- Updated dependencies [988ed1d] - - @effect-app/fluent-extensions@0.125.0 - - @effect-app/core@0.126.1 - - @effect-app/schema@0.183.5 - -## 0.149.5 - -### Patch Changes - -- Updated dependencies [c497ff3] - - @effect-app/schema@0.183.4 - - @effect-app/fluent-extensions@0.124.4 - -## 0.149.4 - -### Patch Changes - -- 3c4251e: fix - -## 0.149.3 - -### Patch Changes - -- Updated dependencies [65f8b7b] - - @effect-app/schema@0.183.3 - - @effect-app/fluent-extensions@0.124.3 - -## 0.149.2 - -### Patch Changes - -- Updated dependencies [8290a87] - - @effect-app/schema@0.183.2 - - @effect-app/fluent-extensions@0.124.2 - -## 0.149.1 - -### Patch Changes - -- Updated dependencies [d17dc32] - - @effect-app/schema@0.183.1 - - @effect-app/fluent-extensions@0.124.1 - -## 0.149.0 - -### Minor Changes - -- e5cdd42: update packages - -### Patch Changes - -- Updated dependencies [e5cdd42] - - @effect-app/fluent-extensions@0.124.0 - - @effect-app/schema@0.183.0 - - @effect-app/core@0.126.0 - -## 0.148.0 - -### Minor Changes - -- update to latest Effect "minor" - -### Patch Changes - -- Updated dependencies - - @effect-app/fluent-extensions@0.123.0 - - @effect-app/schema@0.182.0 - - @effect-app/core@0.125.0 - -## 0.147.0 - -### Minor Changes - -- c29b6ff: bump - -### Patch Changes - -- Updated dependencies [c29b6ff] - - @effect-app/core@0.124.0 - - @effect-app/fluent-extensions@0.122.0 - - @effect-app/schema@0.181.0 - -## 0.145.3 - -### Patch Changes - -- 6e9f253: fix requestid withDefault - -## 0.146.0 - -### Minor Changes - -- 0c47b83: update packages - -### Patch Changes - -- Updated dependencies [0c47b83] - - @effect-app/fluent-extensions@0.121.0 - - @effect-app/schema@0.180.0 - - @effect-app/core@0.123.0 - -## 0.145.2 - -### Patch Changes - -- Updated dependencies [9d31709] - - @effect-app/fluent-extensions@0.120.0 - -## 0.145.1 - -### Patch Changes - -- 871cccf: remove cpy - -## 0.145.0 - -### Minor Changes - -- bump - -### Patch Changes - -- Updated dependencies - - @effect-app/fluent-extensions@0.119.0 - - @effect-app/schema@0.179.0 - - @effect-app/core@0.122.0 - -## 0.144.0 - -### Minor Changes - -- d740bf6: use schema as patch instead - -### Patch Changes - -- Updated dependencies [d740bf6] - - @effect-app/schema@0.178.0 - - @effect-app/fluent-extensions@0.118.1 - -## 0.143.11 - -### Patch Changes - -- Updated dependencies [028af99] - - @effect-app/fluent-extensions@0.118.0 - -## 0.143.10 - -### Patch Changes - -- Updated dependencies [8217bcd] - - @effect-app/fluent-extensions@0.117.4 - -## 0.143.9 - -### Patch Changes - -- Updated dependencies - - @effect-app/fluent-extensions@0.117.3 - -## 0.143.8 - -### Patch Changes - -- Updated dependencies - - @effect-app/fluent-extensions@0.116.6 - -## 0.143.7 - -### Patch Changes - -- Updated dependencies [e1c9d4c] - - @effect-app/fluent-extensions@0.117.0 - -## 0.143.6 - -### Patch Changes - -- Updated dependencies [cf3080b] - - @effect-app/fluent-extensions@0.116.6 - -## 0.143.5 - -### Patch Changes - -- Updated dependencies [e279f74] - - @effect-app/fluent-extensions@0.116.5 - -## 0.143.4 - -### Patch Changes - -- Updated dependencies [fb25eb5] - - @effect-app/fluent-extensions@0.116.4 - -## 0.143.3 - -### Patch Changes - -- Updated dependencies [34b8449] - - @effect-app/fluent-extensions@0.116.3 - -## 0.143.2 - -### Patch Changes - -- Updated dependencies [67d4ec9] - - @effect-app/fluent-extensions@0.116.2 - -## 0.143.1 - -### Patch Changes - -- Updated dependencies [bc98aeb] - - @effect-app/schema@0.177.5 - - @effect-app/fluent-extensions@0.116.1 - -## 0.143.0 - -### Minor Changes - -- e6c8452: remove global Either - -### Patch Changes - -- Updated dependencies [e6c8452] - - @effect-app/fluent-extensions@0.116.0 - - @effect-app/core@0.121.0 - - @effect-app/schema@0.177.4 - -## 0.142.3 - -### Patch Changes - -- Updated dependencies [acbbe35] - - @effect-app/schema@0.177.3 - - @effect-app/fluent-extensions@0.115.2 - -## 0.142.2 - -### Patch Changes - -- Updated dependencies [39cc9b0] - - @effect-app/fluent-extensions@0.115.1 - -## 0.142.1 - -### Patch Changes - -- 78de0f5: fix - -## 0.142.0 - -### Minor Changes - -- b51e7b3: ext - -### Patch Changes - -- Updated dependencies [b51e7b3] - - @effect-app/fluent-extensions@0.115.0 - -## 0.141.3 - -### Patch Changes - -- Updated dependencies [6806433] - - @effect-app/fluent-extensions@0.114.3 - -## 0.141.2 - -### Patch Changes - -- Updated dependencies [f28cec3] - - @effect-app/fluent-extensions@0.114.2 - -## 0.141.1 - -### Patch Changes - -- Updated dependencies [6de437e] - - @effect-app/fluent-extensions@0.114.1 - -## 0.141.0 - -### Minor Changes - -- 72e0db6: package updates - -### Patch Changes - -- Updated dependencies [72e0db6] - - @effect-app/fluent-extensions@0.114.0 - - @effect-app/core@0.120.0 - - @effect-app/schema@0.177.2 - -## 0.140.8 - -### Patch Changes - -- Updated dependencies [e66dbfc] - - @effect-app/fluent-extensions@0.113.13 - -## 0.140.7 - -### Patch Changes - -- Updated dependencies [6677889] - - @effect-app/fluent-extensions@0.113.12 - - @effect-app/schema@0.177.1 - -## 0.140.6 - -### Patch Changes - -- Updated dependencies [78982c7] - - @effect-app/fluent-extensions@0.113.11 - -## 0.140.5 - -### Patch Changes - -- Updated dependencies [928dfc8] - - @effect-app/fluent-extensions@0.113.10 - -## 0.140.4 - -### Patch Changes - -- Updated dependencies [2ab1f78] - - @effect-app/fluent-extensions@0.113.9 - -## 0.140.3 - -### Patch Changes - -- Updated dependencies [287c4e6] - - @effect-app/schema@0.177.0 - - @effect-app/fluent-extensions@0.113.8 - -## 0.140.2 - -### Patch Changes - -- Updated dependencies [bff7d58] - - @effect-app/schema@0.176.2 - - @effect-app/fluent-extensions@0.113.7 - -## 0.140.1 - -### Patch Changes - -- Updated dependencies [f7da591] - - @effect-app/schema@0.176.1 - - @effect-app/fluent-extensions@0.113.6 - -## 0.140.0 - -### Minor Changes - -- 76c89b8: cleanup exts - -### Patch Changes - -- Updated dependencies [76c89b8] -- Updated dependencies [76c89b8] - - @effect-app/schema@0.176.0 - - @effect-app/core@0.119.0 - - @effect-app/fluent-extensions@0.113.5 - -## 0.139.0 - -### Minor Changes - -- 2ccca0f: update exts - -### Patch Changes - -- Updated dependencies [ad46a20] -- Updated dependencies [40d51e4] -- Updated dependencies [2ccca0f] - - @effect-app/schema@0.175.0 - - @effect-app/fluent-extensions@0.113.4 - -## 0.138.0 - -### Minor Changes - -- b487764: improve extensions - -### Patch Changes - -- Updated dependencies [b487764] - - @effect-app/fluent-extensions@0.113.0 - -## 0.137.0 - -### Minor Changes - -- 465afb5: fix: Schema functions should use ParseError variants - -### Patch Changes - -- Updated dependencies [465afb5] - - @effect-app/core@0.118.0 - - @effect-app/schema@0.174.0 - -## 0.136.0 - -### Minor Changes - -- f01680a: update packages -- 349d358: improve support for schemas with R. - -### Patch Changes - -- ebcd0dc: update packages -- Updated dependencies [ebcd0dc] -- Updated dependencies [f01680a] -- Updated dependencies [349d358] - - @effect-app/schema@0.173.0 - -## 0.135.0 - -### Minor Changes - -- 744e5fc: disable auto constructor call - -### Patch Changes - -- 0a898f8: update packages -- Updated dependencies [0a898f8] - - @effect-app/schema@0.172.1 - -## 0.134.0 - -### Minor Changes - -- 449b343: update packages - -### Patch Changes - -- Updated dependencies [449b343] -- Updated dependencies [d103a32] - - @effect-app/schema@0.172.0 - -## 0.133.0 - -### Minor Changes - -- 2fd03d3: update packages - -### Patch Changes - -- Updated dependencies [2fd03d3] - - @effect-app/schema@0.171.0 - - @effect-app/core@0.117.0 - -## 0.132.1 - -### Patch Changes - -- c80a6bb: fix type - -## 0.132.0 - -### Minor Changes - -- 99f79ab: update packages -- cd25b5f: improve: typed error handling - -### Patch Changes - -- Updated dependencies [99f79ab] - - @effect-app/schema@0.170.0 - - @effect-app/core@0.116.0 - -## 0.131.0 - -### Minor Changes - -- 352d57c: cleanup query/mutations. - -## 0.130.5 - -### Patch Changes - -- Updated dependencies [17dbbff] - - @effect-app/schema@0.169.3 - -## 0.130.4 - -### Patch Changes - -- 578e25c: pick POST for query/delete when not all members assignable to string -- Updated dependencies [578e25c] - - @effect-app/schema@0.169.2 - -## 0.130.3 - -### Patch Changes - -- fix - -## 0.130.2 - -### Patch Changes - -- f5d1644: fix - -## 0.130.1 - -### Patch Changes - -- Updated dependencies [cb62aaa] - - @effect-app/schema@0.169.1 - -## 0.130.0 - -### Minor Changes - -- 1832f49: add auto method support - -### Patch Changes - -- Updated dependencies [1832f49] - - @effect-app/schema@0.169.0 - -## 0.129.0 - -### Minor Changes - -- default paths to / - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.168.0 - -## 0.128.2 - -### Patch Changes - -- 7db2745: meta - -## 0.128.1 - -### Patch Changes - -- f725d15: fix js - -## 0.128.0 - -### Minor Changes - -- 5786fb6: prefix path with request name - -## 0.127.2 - -### Patch Changes - -- Updated dependencies [690624e] - - @effect-app/schema@0.167.0 - -## 0.127.1 - -### Patch Changes - -- 9780ef0: fup - -## 0.127.0 - -### Minor Changes - -- a30db88: update packages -- b454cd7: embrace Matcher - -### Patch Changes - -- Updated dependencies [a30db88] -- Updated dependencies [b454cd7] - - @effect-app/schema@0.166.0 - - @effect-app/core@0.115.0 - -## 0.126.0 - -### Minor Changes - -- ed813b4: update packages - -### Patch Changes - -- Updated dependencies [ed813b4] - - @effect-app/schema@0.165.0 - -## 0.125.0 - -### Minor Changes - -- 3eb4057: update packages - -### Patch Changes - -- Updated dependencies [3eb4057] - - @effect-app/schema@0.164.0 - - @effect-app/core@0.114.0 - -## 0.124.0 - -### Minor Changes - -- 051bad7: override reasonable Email/PhoneNumber - -### Patch Changes - -- Updated dependencies [051bad7] - - @effect-app/core@0.113.0 - - @effect-app/schema@0.163.1 - -## 0.123.0 - -### Minor Changes - -- 4c915ea: update packages - -### Patch Changes - -- Updated dependencies [4c915ea] - - @effect-app/schema@0.163.0 - - @effect-app/core@0.112.0 - -## 0.122.1 - -### Patch Changes - -- Updated dependencies [e356144] - - @effect-app/schema@0.162.1 - -## 0.122.0 - -### Minor Changes - -- fix exts - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.111.0 - - @effect-app/schema@0.162.0 - -## 0.121.0 - -### Minor Changes - -- e2b5df8: revert workaround - -### Patch Changes - -- Updated dependencies [e2b5df8] - - @effect-app/schema@0.161.0 - - @effect-app/core@0.110.0 - -## 0.120.0 - -### Minor Changes - -- efa846c: improve: class workaround - -### Patch Changes - -- Updated dependencies [efa846c] - - @effect-app/schema@0.160.0 - - @effect-app/core@0.109.0 - -## 0.119.2 - -### Patch Changes - -- d3bc95b: fix lazy arb - -## 0.119.1 - -### Patch Changes - -- Updated dependencies [3936865] - - @effect-app/schema@0.159.1 - -## 0.119.0 - -### Minor Changes - -- 4aaa360: update packages -- a64728d: update to latest Schema - -### Patch Changes - -- Updated dependencies [4aaa360] -- Updated dependencies [a64728d] - - @effect-app/schema@0.159.0 - - @effect-app/core@0.108.0 - -## 0.118.0 - -### Minor Changes - -- 3ee1505: refactor: remove \_\_call extensions - -### Patch Changes - -- Updated dependencies [3ee1505] - - @effect-app/core@0.107.0 - - @effect-app/schema@0.158.1 - -## 0.117.0 - -### Minor Changes - -- 33dcf2e: update packages - -### Patch Changes - -- Updated dependencies [33dcf2e] - - @effect-app/schema@0.158.0 - - @effect-app/core@0.106.0 - -## 0.116.1 - -### Patch Changes - -- fd233aa: package updates -- Updated dependencies [5fe664e] -- Updated dependencies [afa98cf] - - @effect-app/core@0.105.0 - - @effect-app/schema@0.157.1 - -## 0.116.0 - -### Minor Changes - -- e535d05: update packages - -### Patch Changes - -- Updated dependencies [e535d05] - - @effect-app/schema@0.157.0 - - @effect-app/core@0.104.0 - -## 0.115.0 - -### Minor Changes - -- 9049ccd: filter path params from qs - -### Patch Changes - -- Updated dependencies [9049ccd] - - @effect-app/core@0.103.0 - - @effect-app/schema@0.156.1 - -## 0.114.0 - -### Minor Changes - -- a894a63: update packages - -### Patch Changes - -- Updated dependencies [a894a63] - - @effect-app/schema@0.156.0 - - @effect-app/core@0.102.0 - -## 0.113.0 - -### Minor Changes - -- 4e2e01b: roll into one - -## 0.112.1 - -### Patch Changes - -- 59077e8: feat: add `TagClassMakeScoped` - -## 0.112.0 - -### Minor Changes - -- 7945f38: update packages - -### Patch Changes - -- bc5f735: add `TagClassMake` -- Updated dependencies [7945f38] - - @effect-app/schema@0.155.0 - - @effect-app/core@0.101.0 - -## 0.111.0 - -### Minor Changes - -- 067274a: Update packages - -### Patch Changes - -- Updated dependencies [067274a] - - @effect-app/schema@0.154.0 - -## 0.110.0 - -### Minor Changes - -- 63425a7: update packages - -### Patch Changes - -- Updated dependencies [63425a7] - - @effect-app/schema@0.153.0 - - @effect-app/core@0.100.0 - -## 0.109.3 - -### Patch Changes - -- fix Positive->NonNegative - -## 0.109.2 - -### Patch Changes - -- 4464df4: missing ext - -## 0.109.1 - -### Patch Changes - -- Updated dependencies [fd85bed] - - @effect-app/schema@0.152.1 - -## 0.109.0 - -### Minor Changes - -- 82f0f0d: update packages - -### Patch Changes - -- Updated dependencies [82f0f0d] - - @effect-app/schema@0.152.0 - - @effect-app/core@0.99.0 - -## 0.108.3 - -### Patch Changes - -- Updated dependencies [153a19f] - - @effect-app/core@0.98.1 - - @effect-app/schema@0.151.2 - -## 0.108.2 - -### Patch Changes - -- c8e7d1d: improve: stack error helper on assign.tag - -## 0.108.1 - -### Patch Changes - -- 26e8e9f: improve: use meta info for request name -- 0f8297a: feat: add class annotate decorator -- Updated dependencies [0f8297a] - - @effect-app/schema@0.151.1 - -## 0.108.0 - -### Minor Changes - -- 2ea1e3c: update packages - -### Patch Changes - -- Updated dependencies [2ea1e3c] - - @effect-app/schema@0.151.0 - - @effect-app/core@0.98.0 - -## 0.107.11 - -### Patch Changes - -- Updated dependencies [cf69a10] - - @effect-app/schema@0.150.10 - -## 0.107.10 - -### Patch Changes - -- 5564b85: update packages -- Updated dependencies [5564b85] - - @effect-app/schema@0.150.9 - - @effect-app/core@0.97.3 - -## 0.107.9 - -### Patch Changes - -- f8b45b9: export numbers -- Updated dependencies [f8b45b9] - - @effect-app/schema@0.150.8 - -## 0.107.8 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.150.7 - -## 0.107.7 - -### Patch Changes - -- Updated dependencies [a72f796] - - @effect-app/schema@0.150.6 - -## 0.107.6 - -### Patch Changes - -- c615f35: update packages -- Updated dependencies [c615f35] - - @effect-app/core@0.97.2 - - @effect-app/schema@0.150.5 - -## 0.107.5 - -### Patch Changes - -- Updated dependencies [d9034fe] - - @effect-app/schema@0.150.4 - -## 0.107.4 - -### Patch Changes - -- 38f3367: fix unsafe - -## 0.107.3 - -### Patch Changes - -- Updated dependencies [6a5591a] - - @effect-app/schema@0.150.3 - -## 0.107.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.97.1 - - @effect-app/schema@0.150.2 - -## 0.107.1 - -### Patch Changes - -- fd520f7: chore: restore UnionBrand -- Updated dependencies [fd520f7] - - @effect-app/schema@0.150.1 - -## 0.107.0 - -### Minor Changes - -- 640d24a: reference schema2 -- 640d24a: update packages - -### Patch Changes - -- 640d24a: mm -- 640d24a: clean -- 640d24a: cleanup -- 640d24a: f -- 640d24a: update -- 640d24a: faker -- 640d24a: cleanup schema ext -- 640d24a: fix stringid and clientfor -- 640d24a: updates -- 640d24a: S -- 640d24a: fix things -- 640d24a: improve -- 640d24a: update schema -- 640d24a: upd -- 640d24a: cl -- 640d24a: form and client fixes -- 640d24a: update packages -- 640d24a: ext -- 640d24a: improve rc -- 640d24a: fix RequestId -- 640d24a: dynamic faker arb -- 640d24a: fix empty body -- 640d24a: fix mapPath should use From -- 640d24a: exports -- 640d24a: use schema fork -- 640d24a: cleanup errors and use decodeSyc over parseSync -- 640d24a: update packages -- 640d24a: expose ParseResult -- 640d24a: update packages -- 640d24a: fup -- 640d24a: upd -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] -- Updated dependencies [640d24a] - - @effect-app/schema@0.150.0 - - @effect-app/core@0.97.0 - -## 0.107.0-next.45 - -### Patch Changes - -- d2bc3ac: update schema -- Updated dependencies [d2bc3ac] - - @effect-app/schema@0.150.0-next.30 - -## 0.107.0-next.44 - -### Patch Changes - -- update packages -- Updated dependencies - - @effect-app/schema@0.150.0-next.29 - - @effect-app/core@0.97.0-next.8 - -## 0.107.0-next.43 - -### Patch Changes - -- 19dc3b1: ext -- Updated dependencies [19dc3b1] - - @effect-app/schema@0.150.0-next.28 - -## 0.107.0-next.42 - -### Patch Changes - -- 09ed839: dynamic faker arb - -## 0.107.0-next.41 - -### Patch Changes - -- b6d4272: update packages -- Updated dependencies [0bc4207] -- Updated dependencies [b6d4272] - - @effect-app/schema@0.150.0-next.27 - - @effect-app/core@0.97.0-next.7 - -## 0.107.0-next.40 - -### Patch Changes - -- 14b33a9: cleanup errors and use decodeSyc over parseSync -- Updated dependencies [14b33a9] - - @effect-app/schema@0.150.0-next.26 - -## 0.107.0-next.39 - -### Patch Changes - -- Updated dependencies [aa1b654] - - @effect-app/schema@0.150.0-next.25 - -## 0.107.0-next.38 - -### Patch Changes - -- 64793a8: fix mapPath should use From - -## 0.107.0-next.37 - -### Patch Changes - -- 9e151ed: update packages -- Updated dependencies [9e151ed] - - @effect-app/schema@0.150.0-next.24 - - @effect-app/core@0.97.0-next.6 - -## 0.107.0-next.36 - -### Patch Changes - -- Updated dependencies [6b89c27] - - @effect-app/core@0.97.0-next.5 - - @effect-app/schema@0.150.0-next.23 - -## 0.107.0-next.35 - -### Patch Changes - -- 169c159: expose ParseResult -- Updated dependencies [169c159] - - @effect-app/schema@0.150.0-next.22 - -## 0.107.0-next.34 - -### Patch Changes - -- b46e30d: fup - -## 0.107.0-next.33 - -### Patch Changes - -- Updated dependencies [c57bb66] - - @effect-app/schema@0.150.0-next.21 - -## 0.107.0-next.32 - -### Patch Changes - -- 735dea9: improve rc - -## 0.107.0-next.31 - -### Patch Changes - -- 21482c6: cl - -## 0.107.0-next.30 - -### Patch Changes - -- eab24be: upd - -## 0.107.0-next.29 - -### Patch Changes - -- def06a7: fix things - -## 0.107.0-next.28 - -### Patch Changes - -- eb31797: fix empty body - -## 0.107.0-next.27 - -### Patch Changes - -- 65696a6: fix RequestId - -## 0.107.0-next.26 - -### Patch Changes - -- 777162f: improve -- Updated dependencies [777162f] - - @effect-app/schema@0.150.0-next.20 - -## 0.107.0-next.25 - -### Patch Changes - -- 0776693: fix stringid and clientfor - -## 0.107.0-next.24 - -### Patch Changes - -- 68eaf52: form and client fixes - -## 0.107.0-next.23 - -### Patch Changes - -- Updated dependencies [ca927a5] - - @effect-app/schema@0.150.0-next.19 - -## 0.107.0-next.22 - -### Patch Changes - -- 5f62f5a: upd -- Updated dependencies [5f62f5a] - - @effect-app/schema@0.150.0-next.18 - -## 0.107.0-next.21 - -### Patch Changes - -- Updated dependencies [53d4b3e] - - @effect-app/schema@0.150.0-next.17 - -## 0.107.0-next.20 - -### Patch Changes - -- Updated dependencies [63d4549] - - @effect-app/schema@0.150.0-next.16 - -## 0.107.0-next.19 - -### Patch Changes - -- b19ce70: S - -## 0.107.0-next.18 - -### Patch Changes - -- 92ff6b9: exports -- Updated dependencies [92ff6b9] - - @effect-app/schema@0.150.0-next.15 - -## 0.107.0-next.17 - -### Patch Changes - -- Updated dependencies [c234016] - - @effect-app/schema@0.150.0-next.14 - -## 0.107.0-next.16 - -### Patch Changes - -- Updated dependencies [5d53b26] - - @effect-app/schema@0.150.0-next.13 - -## 0.107.0-next.15 - -### Patch Changes - -- Updated dependencies [147bc14] - - @effect-app/schema@0.150.0-next.12 - -## 0.107.0-next.14 - -### Patch Changes - -- Updated dependencies [660d57a] - - @effect-app/schema@0.150.0-next.11 - -## 0.107.0-next.13 - -### Patch Changes - -- 20076e0: update -- Updated dependencies [20076e0] - - @effect-app/schema@0.150.0-next.10 - -## 0.107.0-next.12 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.97.0-next.4 - - @effect-app/schema@0.150.0-next.9 - -## 0.107.0-next.11 - -### Patch Changes - -- ac35466: use schema fork -- Updated dependencies [ac35466] - - @effect-app/schema@0.150.0-next.8 - -## 0.107.0-next.10 - -### Patch Changes - -- Updated dependencies [4f8ade3] - - @effect-app/core@0.97.0-next.3 - - @effect-app/schema@0.150.0-next.7 - -## 0.107.0-next.9 - -### Patch Changes - -- Updated dependencies [8897586] - - @effect-app/schema@0.150.0-next.6 - -## 0.107.0-next.8 - -### Patch Changes - -- c550ee5: updates -- Updated dependencies [c550ee5] - - @effect-app/schema@0.150.0-next.5 - - @effect-app/core@0.97.0-next.2 - -## 0.107.0-next.7 - -### Patch Changes - -- 82b3ca0: mm - -## 0.107.0-next.6 - -### Patch Changes - -- Updated dependencies [ace7afb] - - @effect-app/schema@0.150.0-next.4 - -## 0.107.0-next.5 - -### Patch Changes - -- 3320864: cleanup schema ext -- Updated dependencies [3320864] - - @effect-app/schema@0.150.0-next.3 - -## 0.107.0-next.4 - -### Patch Changes - -- Updated dependencies [fde3e90] - - @effect-app/schema@0.150.0-next.2 - - @effect-app/core@0.97.0-next.1 - -## 0.107.0-next.3 - -### Patch Changes - -- 3d9e1ab: clean -- 47d0151: faker - -## 0.107.0-next.2 - -### Patch Changes - -- c3de47e: f - -## 0.107.0-next.1 - -### Patch Changes - -- bd2130b: cleanup -- Updated dependencies [bd2130b] - - @effect-app/schema@0.150.0-next.1 - -## 0.107.0-next.0 - -### Minor Changes - -- 87a6ac2: update packages - -### Patch Changes - -- Updated dependencies [87a6ac2] - - @effect-app/schema2@0.1.0-next.0 - - @effect-app/core@0.97.0-next.0 - -## 0.106.1 - -### Patch Changes - -- efb854a: update packages -- Updated dependencies [efb854a] - - @effect-app/schema@0.90.1 - - @effect-app/core@0.96.1 - -## 0.106.0 - -### Minor Changes - -- 4330242: improve: TagClass - -## 0.105.0 - -### Minor Changes - -- c6efdeb: update packages - -### Patch Changes - -- Updated dependencies [c6efdeb] - - @effect-app/schema@0.90.0 - - @effect-app/core@0.96.0 - -## 0.104.1 - -### Patch Changes - -- cf6ae3c: update packages -- Updated dependencies [cf6ae3c] - - @effect-app/schema@0.89.1 - - @effect-app/core@0.95.1 - -## 0.104.0 - -### Minor Changes - -- 46bd7be: update packages - -### Patch Changes - -- Updated dependencies [46bd7be] - - @effect-app/schema@0.89.0 - - @effect-app/core@0.95.0 - -## 0.103.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.94.2 - - @effect-app/schema@0.88.3 - -## 0.103.1 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.94.1 - - @effect-app/schema@0.88.2 - -## 0.103.0 - -### Minor Changes - -- 92d7e37: update packages - -### Patch Changes - -- Updated dependencies [92d7e37] -- Updated dependencies - - @effect-app/core@0.94.0 - - @effect-app/schema@0.88.1 - -## 0.102.0 - -### Minor Changes - -- bump - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.93.0 - - @effect-app/schema@0.88.0 - -## 0.101.1 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.87.10 - -## 0.101.0 - -### Minor Changes - -- 67eb741: update packages - -### Patch Changes - -- Updated dependencies [67eb741] - - @effect-app/core@0.92.0 - - @effect-app/schema@0.87.9 - -## 0.100.1 - -### Patch Changes - -- 7f447d3: update packages -- Updated dependencies [7f447d3] - - @effect-app/core@0.91.1 - - @effect-app/schema@0.87.8 - -## 0.100.0 - -### Minor Changes - -- ad8154a: update packages - -### Patch Changes - -- Updated dependencies [ad8154a] - - @effect-app/core@0.91.0 - - @effect-app/schema@0.87.7 - -## 0.99.1 - -### Patch Changes - -- f33d0a1: feat: change request path to extends from `/${string}` for platform alignment -- Updated dependencies [f33d0a1] - - @effect-app/schema@0.87.6 - -## 0.99.0 - -### Minor Changes - -- f20991e: update packages - -### Patch Changes - -- Updated dependencies [f20991e] - - @effect-app/core@0.90.0 - - @effect-app/schema@0.87.5 - -## 0.98.3 - -### Patch Changes - -- Updated dependencies [687c313] - - @effect-app/schema@0.87.4 - -## 0.98.2 - -### Patch Changes - -- Updated dependencies [fcfea25] - - @effect-app/schema@0.87.3 - -## 0.98.1 - -### Patch Changes - -- Updated dependencies [e468bd0] - - @effect-app/schema@0.87.2 - -## 0.98.0 - -### Minor Changes - -- 98fbdb3: update packages - -### Patch Changes - -- Updated dependencies [98fbdb3] - - @effect-app/core@0.89.0 - - @effect-app/schema@0.87.1 - -## 0.97.0 - -### Minor Changes - -- 8b90f25: feat: add NumberAsInt, PositiveNumberAsInt - -### Patch Changes - -- Updated dependencies [8b90f25] - - @effect-app/schema@0.87.0 - -## 0.96.2 - -### Patch Changes - -- c3c5877: extend refinements with copy and clone - -## 0.96.1 - -### Patch Changes - -- a5b77fc: fix types - -## 0.96.0 - -### Minor Changes - -- 60ecffb: feat: copy/clone trait trial - -### Patch Changes - -- Updated dependencies [60ecffb] - - @effect-app/schema@0.86.0 - -## 0.95.0 - -### Minor Changes - -- fb332b4: update packages - -### Patch Changes - -- Updated dependencies [fb332b4] - - @effect-app/schema@0.85.0 - - @effect-app/core@0.88.0 - -## 0.94.0 - -### Minor Changes - -- 0069d09: Cleanup layers - -## 0.93.0 - -### Minor Changes - -- a681ab6: update packages - -### Patch Changes - -- Updated dependencies [a681ab6] - - @effect-app/schema@0.84.0 - - @effect-app/core@0.87.0 - -## 0.92.0 - -### Minor Changes - -- a9e8b8f: update packages - -### Patch Changes - -- Updated dependencies [169ccb0] -- Updated dependencies [a9e8b8f] - - @effect-app/core@0.86.0 - - @effect-app/schema@0.83.0 - -## 0.91.1 - -### Patch Changes - -- Updated dependencies [3cf98d6] - - @effect-app/schema@0.82.2 - -## 0.91.0 - -### Minor Changes - -- e0b2e24: fix: update for Secret - -### Patch Changes - -- Updated dependencies [e0b2e24] - - @effect-app/core@0.85.0 - - @effect-app/schema@0.82.1 - -## 0.90.0 - -### Minor Changes - -- ac36723: update dependencies - -### Patch Changes - -- Updated dependencies [ac36723] - - @effect-app/schema@0.82.0 - - @effect-app/core@0.84.0 - -## 0.89.0 - -### Minor Changes - -- da80c66: feat: add literalNumber - -### Patch Changes - -- Updated dependencies [da80c66] - - @effect-app/schema@0.81.0 - -## 0.88.9 - -### Patch Changes - -- Updated dependencies [8235a1a] - - @effect-app/core@0.83.3 - - @effect-app/schema@0.80.6 - -## 0.88.8 - -### Patch Changes - -- Updated dependencies [f6e1e15] - - @effect-app/schema@0.80.5 - -## 0.88.7 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.83.2 - - @effect-app/schema@0.80.4 - -## 0.88.6 - -### Patch Changes - -- Updated dependencies [8a81a8f] - - @effect-app/core@0.83.1 - - @effect-app/schema@0.80.3 - -## 0.88.5 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.83.0 - - @effect-app/schema@0.80.2 - -## 0.88.4 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.82.1 - - @effect-app/schema@0.80.1 - -## 0.88.3 - -### Patch Changes - -- Updated dependencies [4012f97] - - @effect-app/schema@0.80.0 - - @effect-app/core@0.82.0 - -## 0.88.2 - -### Patch Changes - -- 7f946cb: remove obsolete helpers -- Updated dependencies [7f946cb] - - @effect-app/core@0.81.1 - - @effect-app/schema@0.79.1 - -## 0.88.1 - -### Patch Changes - -- 65886f2: fix type sigs - -## 0.88.0 - -### Minor Changes - -- 16ffb5e: class service/repo support andThen, drop flatMap - -## 0.87.0 - -### Minor Changes - -- align v - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.81.0 - - @effect-app/schema@0.79.0 - -## 0.86.0 - -### Minor Changes - -- align v - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.80.0 - - @effect-app/schema@0.78.0 - -## 0.85.5 - -### Patch Changes - -- 4627526: improve string name - -## 0.85.4 - -### Patch Changes - -- Updated dependencies [081418b] - - @effect-app/schema@0.77.1 - -## 0.85.3 - -### Patch Changes - -- fix - -## 0.85.2 - -### Patch Changes - -- fix - -## 0.85.1 - -### Patch Changes - -- fix typo - -## 0.85.0 - -### Minor Changes - -- feat: support constructor input for clientFor requests - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.77.0 - -## 0.84.0 - -### Minor Changes - -- improve String schemas - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.76.0 - -## 0.83.0 - -### Minor Changes - -- fa908e8: move fluent-extensions - -## 0.82.3 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.75.3 - -## 0.82.2 - -### Patch Changes - -- Updated dependencies [086c2b1] - - @effect-app/schema@0.75.2 - -## 0.82.1 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.75.1 - -## 0.82.0 - -### Minor Changes - -- 68359de: more schema alignment - -### Patch Changes - -- Updated dependencies [68359de] - - @effect-app/schema@0.75.0 - -## 0.81.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.74.2 - -## 0.81.1 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.74.1 - -## 0.81.0 - -### Minor Changes - -- 771d7e6: Fix model name - -### Patch Changes - -- Updated dependencies [771d7e6] - - @effect-app/schema@0.74.0 - -## 0.80.1 - -### Patch Changes - -- Updated dependencies [af19954] - - @effect-app/core@0.79.1 - - @effect-app/schema@0.73.1 - -## 0.80.0 - -### Minor Changes - -- 1f6b9a1: update packages - -### Patch Changes - -- Updated dependencies [1f6b9a1] - - @effect-app/schema@0.73.0 - - @effect-app/core@0.79.0 - -## 0.79.0 - -### Minor Changes - -- c528c33: initial alignment of Schema with effect/schema - -### Patch Changes - -- Updated dependencies [c528c33] - - @effect-app/schema@0.72.0 - - @effect-app/core@0.78.0 - -## 0.78.2 - -### Patch Changes - -- d4a6be2: fix ext - -## 0.78.1 - -### Patch Changes - -- 4c9e60a: add basic fluent extensions for projects without tsplus - -## 0.78.0 - -### Minor Changes - -- da85f48: cleanup operators. add nonEmpty map variant - -### Patch Changes - -- ab7eddc: update packages -- Updated dependencies [ab7eddc] -- Updated dependencies [da85f48] - - @effect-app/core@0.77.0 - - @effect-app/schema@0.71.0 - -## 0.77.3 - -### Patch Changes - -- Updated dependencies [d462c64] - - @effect-app/schema@0.70.0 - - @effect-app/core@0.76.0 - -## 0.77.2 - -### Patch Changes - -- Updated dependencies [26a3bc8] - - @effect-app/schema@0.69.2 - -## 0.77.1 - -### Patch Changes - -- Updated dependencies [9efeed84] - - @effect-app/core@0.75.1 - - @effect-app/schema@0.69.1 - -## 0.77.0 - -### Minor Changes - -- 88f5695c: revert schema classes double as tag - -### Patch Changes - -- Updated dependencies [88f5695c] - - @effect-app/schema@0.69.0 - - @effect-app/core@0.75.0 - -## 0.76.0 - -### Minor Changes - -- 46719cec: feat: schema classes double as Tag - -### Patch Changes - -- Updated dependencies [46719cec] - - @effect-app/schema@0.68.0 - - @effect-app/core@0.74.0 - -## 0.75.2 - -### Patch Changes - -- Updated dependencies [5813c6b2] - - @effect-app/core@0.73.1 - - @effect-app/schema@0.67.2 - -## 0.75.1 - -### Patch Changes - -- a644e7b5: fix methods exports -- Updated dependencies [a644e7b5] - - @effect-app/schema@0.67.1 - -## 0.75.0 - -### Minor Changes - -- 6c180253: cleanup - -### Patch Changes - -- Updated dependencies [6c180253] - - @effect-app/schema@0.67.0 - - @effect-app/core@0.73.0 - -## 0.74.4 - -### Patch Changes - -- Updated dependencies [f436ce54] - - @effect-app/schema@0.66.0 - -## 0.74.3 - -### Patch Changes - -- 7ff1f6f9: update packages -- 04f6bafa: update packages -- Updated dependencies [7ff1f6f9] -- Updated dependencies [04f6bafa] - - @effect-app/core@0.72.1 - - @effect-app/schema@0.65.3 - -## 0.74.2 - -### Patch Changes - -- Updated dependencies [07c0dbfc] - - @effect-app/schema@0.65.2 - -## 0.74.1 - -### Patch Changes - -- Updated dependencies [a7a9f51f] - - @effect-app/schema@0.65.1 - -## 0.74.0 - -### Minor Changes - -- 0a4bfbc7: update packages - -### Patch Changes - -- Updated dependencies [0a4bfbc7] - - @effect-app/schema@0.65.0 - - @effect-app/core@0.72.0 - -## 0.73.5 - -### Patch Changes - -- 56583d9b: align span names -- Updated dependencies [baf5a2b7] - - @effect-app/core@0.71.5 - - @effect-app/schema@0.64.5 - -## 0.73.4 - -### Patch Changes - -- update packages -- Updated dependencies - - @effect-app/core@0.71.4 - - @effect-app/schema@0.64.4 - -## 0.73.3 - -### Patch Changes - -- Updated dependencies [99205b44] - - @effect-app/core@0.71.3 - - @effect-app/schema@0.64.3 - -## 0.73.2 - -### Patch Changes - -- 002cdb31: update packages -- Updated dependencies [002cdb31] - - @effect-app/core@0.71.2 - - @effect-app/schema@0.64.2 - -## 0.73.1 - -### Patch Changes - -- Updated dependencies [868919c8] - - @effect-app/schema@0.64.1 - - @effect-app/core@0.71.1 - -## 0.73.0 - -### Minor Changes - -- 90af6a41: update packages - -### Patch Changes - -- Updated dependencies [90af6a41] - - @effect-app/schema@0.64.0 - - @effect-app/core@0.71.0 - -## 0.72.9 - -### Patch Changes - -- de419614: enhance errors - -## 0.72.8 - -### Patch Changes - -- ed346253: Improve NotLoggedInError - -## 0.72.7 - -### Patch Changes - -- ff54e102: update packages -- Updated dependencies [ff54e102] - - @effect-app/core@0.70.2 - - @effect-app/schema@0.63.2 - -## 0.72.6 - -### Patch Changes - -- ef626697: improve client span - -## 0.72.5 - -### Patch Changes - -- 60615760: cleanup - -## 0.72.4 - -### Patch Changes - -- fix id - -## 0.72.3 - -### Patch Changes - -- f03b6b48: fix - -## 0.72.2 - -### Patch Changes - -- Updated dependencies [3f0dba21] - - @effect-app/core@0.70.1 - - @effect-app/schema@0.63.1 - -## 0.72.1 - -### Patch Changes - -- 8b0e01b4: workaround new Ref variance - -## 0.72.0 - -### Minor Changes - -- 283ebbe7: update packages - -### Patch Changes - -- Updated dependencies [283ebbe7] - - @effect-app/schema@0.63.0 - - @effect-app/core@0.70.0 - -## 0.71.1 - -### Patch Changes - -- d1a6193b: feat: support span across client and api -- Updated dependencies [d1a6193b] - - @effect-app/core@0.69.1 - - @effect-app/schema@0.62.5 - -## 0.71.0 - -### Minor Changes - -- 40a6c3b6: update packages - -### Patch Changes - -- Updated dependencies [40a6c3b6] - - @effect-app/core@0.69.0 - - @effect-app/schema@0.62.4 - -## 0.70.4 - -### Patch Changes - -- housekeeping: update packages -- Updated dependencies - - @effect-app/core@0.68.3 - - @effect-app/schema@0.62.3 - -## 0.70.3 - -### Patch Changes - -- e4185126: unification workaround - -## 0.70.2 - -### Patch Changes - -- 263a56b9: update packages -- Updated dependencies [263a56b9] - - @effect-app/core@0.68.2 - - @effect-app/schema@0.62.2 - -## 0.70.1 - -### Patch Changes - -- aa3c98d1: update packages -- Updated dependencies [aa3c98d1] - - @effect-app/schema@0.62.1 - - @effect-app/core@0.68.1 - -## 0.70.0 - -### Minor Changes - -- update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.68.0 - - @effect-app/schema@0.62.0 - -## 0.69.10 - -### Patch Changes - -- Updated dependencies [9c347b64] - - @effect-app/schema@0.61.1 - -## 0.69.9 - -### Patch Changes - -- Updated dependencies [fdd19b0b] - - @effect-app/schema@0.61.0 - -## 0.69.8 - -### Patch Changes - -- d7dd36d4: update packages -- Updated dependencies [d7dd36d4] - - @effect-app/schema@0.60.5 - - @effect-app/core@0.67.5 - -## 0.69.7 - -### Patch Changes - -- 780a6718: update packages -- Updated dependencies [780a6718] - - @effect-app/core@0.67.4 - - @effect-app/schema@0.60.4 - -## 0.69.6 - -### Patch Changes - -- 57f506e7: feat: add demandJson for HttpClient - -## 0.69.5 - -### Patch Changes - -- 8c0b8270: improve json parse error - -## 0.69.4 - -### Patch Changes - -- 84e54d54: Update packages -- Updated dependencies [84e54d54] - - @effect-app/core@0.67.3 - - @effect-app/schema@0.60.3 - -## 0.69.3 - -### Patch Changes - -- 696a525e: update packages -- Updated dependencies [696a525e] - - @effect-app/schema@0.60.2 - - @effect-app/core@0.67.2 - -## 0.69.2 - -### Patch Changes - -- f8cb0efd: schemaJsonBody - -## 0.69.1 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.67.1 - - @effect-app/schema@0.60.1 - -## 0.69.0 - -### Minor Changes - -- housekeeping: update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.60.0 - - @effect-app/core@0.67.0 - -## 0.68.3 - -### Patch Changes - -- blurg - -## 0.68.2 - -### Patch Changes - -- 7118bf61: fix error type - -## 0.68.1 - -### Patch Changes - -- Updated dependencies [56a4418f] - - @effect-app/schema@0.59.0 - -## 0.68.0 - -### Minor Changes - -- 271e2c7a: yieldable errors - -### Patch Changes - -- Updated dependencies [271e2c7a] - - @effect-app/schema@0.58.0 - - @effect-app/core@0.66.0 - -## 0.67.10 - -### Patch Changes - -- Updated dependencies [89bae16e] - - @effect-app/core@0.65.5 - - @effect-app/schema@0.57.10 - -## 0.67.9 - -### Patch Changes - -- 838eeb10: update packages -- Updated dependencies [838eeb10] - - @effect-app/schema@0.57.9 - -## 0.67.8 - -### Patch Changes - -- Updated dependencies [0b279a80] - - @effect-app/core@0.65.4 - - @effect-app/schema@0.57.8 - -## 0.67.7 - -### Patch Changes - -- 50c7fe31: fix typo - -## 0.67.6 - -### Patch Changes - -- 7fc3cfbe: improve client api - -## 0.67.5 - -### Patch Changes - -- 26087368: update platform extensions -- Updated dependencies [26087368] - - @effect-app/core@0.65.3 - - @effect-app/schema@0.57.7 - -## 0.67.4 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.65.2 - - @effect-app/schema@0.57.6 - -## 0.67.3 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.65.1 - - @effect-app/schema@0.57.5 - -## 0.67.2 - -### Patch Changes - -- fix HttpClient global - -## 0.67.1 - -### Patch Changes - -- 924817d9: fix type - -## 0.67.0 - -### Minor Changes - -- 51b546c5: feat: Convert clientFor to use @effect/platform HttpClient - -### Patch Changes - -- Updated dependencies [51b546c5] - - @effect-app/core@0.65.0 - - @effect-app/schema@0.57.4 - -## 0.66.0 - -### Minor Changes - -- 5f3ae060: feat: add HttpClient from @effect/platform - -### Patch Changes - -- Updated dependencies [5f3ae060] - - @effect-app/core@0.64.0 - - @effect-app/schema@0.57.3 - -## 0.65.2 - -### Patch Changes - -- 87e29b7d: export httpclient -- Updated dependencies [87e29b7d] - - @effect-app/core@0.63.2 - - @effect-app/schema@0.57.2 - -## 0.65.1 - -### Patch Changes - -- fix tsplus.config for pnpm -- Updated dependencies - - @effect-app/core@0.63.1 - - @effect-app/schema@0.57.1 - -## 0.65.0 - -### Minor Changes - -- update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.57.0 - - @effect-app/core@0.63.0 - -## 0.64.0 - -### Minor Changes - -- update packages, improve error reporting - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.62.0 - - @effect-app/schema@0.56.0 - -## 0.63.1 - -### Patch Changes - -- add date extensions - -## 0.63.0 - -### Minor Changes - -- add match and update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.55.0 - - @effect-app/core@0.61.0 - -## 0.62.0 - -### Minor Changes - -- update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.54.0 - - @effect-app/core@0.60.0 - -## 0.61.0 - -### Minor Changes - -- housekeeping: update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.53.0 - - @effect-app/core@0.59.0 - -## 0.60.4 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.58.4 - - @effect-app/schema@0.52.4 - -## 0.60.3 - -### Patch Changes - -- Updated dependencies [6b002041] -- Updated dependencies - - @effect-app/core@0.58.3 - - @effect-app/schema@0.52.3 - -## 0.60.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.58.2 - - @effect-app/schema@0.52.2 - -## 0.60.1 - -### Patch Changes - -- improve tsc parsing performance 3x -- Updated dependencies - - @effect-app/core@0.58.1 - - @effect-app/schema@0.52.1 - -## 0.60.0 - -### Minor Changes - -- 4d2e68df: Switch to effect meta package - -### Patch Changes - -- Updated dependencies [4d2e68df] - - @effect-app/schema@0.52.0 - - @effect-app/core@0.58.0 - -## 0.59.7 - -### Patch Changes - -- fix tagclass type - -## 0.59.6 - -### Patch Changes - -- fix tagclass - -## 0.59.5 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.57.5 - - @effect-app/schema@0.51.5 - -## 0.59.4 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.57.4 - - @effect-app/schema@0.51.4 - -## 0.59.3 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.57.3 - - @effect-app/schema@0.51.3 - -## 0.59.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.57.2 - - @effect-app/schema@0.51.2 - -## 0.59.1 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.57.1 - - @effect-app/schema@0.51.1 - -## 0.59.0 - -### Minor Changes - -- c80b9e7a: Updated to latest Effect - -### Patch Changes - -- Updated dependencies [c80b9e7a] - - @effect-app/schema@0.51.0 - - @effect-app/core@0.57.0 - -## 0.58.2 - -### Patch Changes - -- fix type of E variants of clientFor - -## 0.58.1 - -### Patch Changes - -- update packages -- Updated dependencies - - @effect-app/core@0.56.1 - - @effect-app/schema@0.50.1 - -## 0.58.0 - -### Minor Changes - -- housekeeping: update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.50.0 - - @effect-app/core@0.56.0 - -## 0.57.0 - -### Minor Changes - -- aa9c3126: using the new faker-js package instead of the old cursed one - -## 0.56.1 - -### Patch Changes - -- e4609777: Use distributive omit - -## 0.56.0 - -### Minor Changes - -- update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.55.0 - - @effect-app/schema@0.49.0 - -## 0.55.2 - -### Patch Changes - -- add pick and omit object extensions - -## 0.55.1 - -### Patch Changes - -- Update packages -- Updated dependencies - - @effect-app/schema@0.48.1 - - @effect-app/core@0.54.1 - -## 0.55.0 - -### Minor Changes - -- update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.54.0 - - @effect-app/schema@0.48.0 - -## 0.54.0 - -### Minor Changes - -- Cleanup legacy cache - -## 0.53.2 - -### Patch Changes - -- EffectCache - -## 0.53.1 - -### Patch Changes - -- Add exports -- Updated dependencies - - @effect-app/core@0.53.1 - - @effect-app/schema@0.47.1 - -## 0.53.0 - -### Minor Changes - -- Update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.53.0 - - @effect-app/schema@0.47.0 - -## 0.52.0 - -### Minor Changes - -- Update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.52.0 - - @effect-app/schema@0.46.0 - -## 0.51.0 - -### Minor Changes - -- Update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.45.0 - - @effect-app/core@0.51.0 - -## 0.50.1 - -### Patch Changes - -- c78a54ff: Enhance TagClass - -## 0.50.0 - -### Minor Changes - -- update ids - -## 0.49.1 - -### Patch Changes - -- Add brandedStringId - -## 0.49.0 - -### Minor Changes - -- a - -### Patch Changes - -- Updated dependencies -- Updated dependencies - - @effect-app/schema@0.44.0 - - @effect-app/core@0.50.0 - -## 0.48.3 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.49.1 - - @effect-app/schema@0.43.3 - -## 0.48.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.43.2 - -## 0.48.1 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.43.1 - -## 0.48.0 - -### Minor Changes - -- Compiler test - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.49.0 - - @effect-app/schema@0.43.0 - -## 0.47.0 - -### Minor Changes - -- Update depdendencies - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.42.0 - - @effect-app/core@0.48.0 - -## 0.46.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.41.2 - -## 0.46.1 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.41.1 - -## 0.46.0 - -### Minor Changes - -- Cleanup schema ext location - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.41.0 - -## 0.45.0 - -### Minor Changes - -- Improve codegen - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.40.0 - -## 0.44.12 - -### Patch Changes - -- fix rest -- Updated dependencies - - @effect-app/schema@0.39.12 - -## 0.44.11 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.39.11 - -## 0.44.10 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.39.10 - -## 0.44.9 - -### Patch Changes - -- feat: property extensions -- Updated dependencies - - @effect-app/schema@0.39.9 - -## 0.44.8 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.39.8 - -## 0.44.7 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.39.7 - -## 0.44.6 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.39.6 - -## 0.44.5 - -### Patch Changes - -- fix -- Updated dependencies - - @effect-app/schema@0.39.5 - -## 0.44.4 - -### Patch Changes - -- fix global -- Updated dependencies - - @effect-app/core@0.47.1 - - @effect-app/schema@0.39.4 - -## 0.44.3 - -### Patch Changes - -- Improve schema prop api -- Updated dependencies - - @effect-app/schema@0.39.3 - -## 0.44.2 - -### Patch Changes - -- Improve withDefadult -- Updated dependencies - - @effect-app/schema@0.39.2 - -## 0.44.1 - -### Patch Changes - -- fix withDefault -- Updated dependencies - - @effect-app/schema@0.39.1 - -## 0.44.0 - -### Minor Changes - -- update dependencies - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.39.0 - - @effect-app/core@0.47.0 - -## 0.43.0 - -### Minor Changes - -- Improve Schema withDefault - -## 0.42.0 - -### Minor Changes - -- update dependencies - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.46.0 - - @effect-app/schema@0.38.0 - -## 0.41.0 - -### Minor Changes - -- Update dependencies - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.37.0 - - @effect-app/core@0.45.0 - -## 0.40.1 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.44.0 - - @effect-app/schema@0.36.1 - -## 0.40.0 - -### Minor Changes - -- support optional constructors for schema with none or only optional input. - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.36.0 - -## 0.39.0 - -### Minor Changes - -- update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.35.0 - - @effect-app/core@0.43.0 - -## 0.38.0 - -### Minor Changes - -- update packages and cleanup - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.34.0 - - @effect-app/core@0.42.0 - -## 0.37.0 - -### Minor Changes - -- Update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.33.0 - - @effect-app/core@0.41.0 - -## 0.36.1 - -### Patch Changes - -- fix error channel of allLowerFirst - -## 0.36.0 - -### Minor Changes - -- AllLowerFirst should be Par - -## 0.35.0 - -### Minor Changes - -- update dependencies - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.40.0 - - @effect-app/schema@0.32.0 - -## 0.34.1 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.39.1 - - @effect-app/schema@0.31.1 - -## 0.34.0 - -### Minor Changes - -- update packages - -### Patch Changes - -- Updated dependencies -- Updated dependencies [ba4849c9] - - @effect-app/schema@0.31.0 - - @effect-app/core@0.39.0 - -## 0.33.4 - -### Patch Changes - -- Update packages -- Updated dependencies - - @effect-app/schema@0.30.2 - - @effect-app/core@0.38.1 - -## 0.33.3 - -### Patch Changes - -- fup - -## 0.33.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.30.1 - -## 0.33.1 - -### Patch Changes - -- fup - -## 0.33.0 - -### Minor Changes - -- improve min/max/range for numbers. - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.30.0 - -## 0.32.0 - -### Minor Changes - -- Properly identify number schemas - -## 0.31.0 - -### Minor Changes - -- Update packages -- feat(form): number vs string - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.29.0 - - @effect-app/core@0.38.0 - -## 0.30.2 - -### Patch Changes - -- FUP - -## 0.30.1 - -### Patch Changes - -- rename: servicesOrEffects to allLowerFirst - -## 0.30.0 - -### Minor Changes - -- Update to latest effect - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.28.0 - - @effect-app/core@0.37.0 - -## 0.29.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.36.1 - - @effect-app/schema@0.27.1 - -## 0.29.1 - -### Patch Changes - -- Extend Services extensions - -## 0.29.0 - -### Minor Changes - -- update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.27.0 - - @effect-app/core@0.36.0 - -## 0.28.0 - -### Minor Changes - -- Update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.26.0 - - @effect-app/core@0.35.0 - -## 0.27.1 - -### Patch Changes - -- fix dep -- Updated dependencies - - @effect-app/schema@0.25.1 - -## 0.27.0 - -### Minor Changes - -- update packages - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.25.0 - - @effect-app/core@0.34.0 - -## 0.26.2 - -### Patch Changes - -- fix clientFor E - -## 0.26.1 - -### Patch Changes - -- fix - -## 0.26.0 - -### Minor Changes - -- Update packages, add support for class features to schema and optic - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.33.0 - - @effect-app/schema@0.24.0 - -## 0.25.3 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.32.3 - - @effect-app/schema@0.23.3 - -## 0.25.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.32.2 - - @effect-app/schema@0.23.2 - -## 0.25.1 - -### Patch Changes - -- Cleanup - -## 0.25.0 - -### Minor Changes - -- Improve Encoded codegen - -## 0.24.2 - -### Patch Changes - -- Fix compilation -- Updated dependencies - - @effect-app/core@0.32.1 - - @effect-app/schema@0.23.1 - -## 0.24.1 - -### Patch Changes - -- fix svc tag - -## 0.24.0 - -### Minor Changes - -- Update tsplus with companion instance extensions - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.23.0 - - @effect-app/core@0.32.0 - -## 0.23.7 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.31.0 - - @effect-app/schema@0.22.4 - -## 0.23.6 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.30.3 - - @effect-app/schema@0.22.3 - -## 0.23.5 - -### Patch Changes - -- fix service tag -- Updated dependencies - - @effect-app/core@0.30.2 - - @effect-app/schema@0.22.2 - -## 0.23.4 - -### Patch Changes - -- tag workaround 3 - -## 0.23.3 - -### Patch Changes - -- Workaround tag - -## 0.23.2 - -### Patch Changes - -- tag workaround -- Updated dependencies - - @effect-app/core@0.30.1 - - @effect-app/schema@0.22.1 - -## 0.23.1 - -### Patch Changes - -- Fix service tag - -## 0.23.0 - -### Minor Changes - -- Update Effect - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.30.0 - - @effect-app/schema@0.22.0 - -## 0.22.5 - -### Patch Changes - -- Updated dependencies [00d34a69] - - @effect-app/schema@0.21.0 - -## 0.22.4 - -### Patch Changes - -- Improve curry support for PreparedLens - -## 0.22.3 - -### Patch Changes - -- Fix - -## 0.22.2 - -### Patch Changes - -- Update packages -- Updated dependencies - - @effect-app/schema@0.20.1 - - @effect-app/core@0.29.1 - -## 0.22.1 - -### Patch Changes - -- d89f88cb: add assignTag, TagClass, ServiceTaggedClass - -## 0.22.0 - -### Minor Changes - -- b967055c: Replace fp-ts/core with effect/data - -### Patch Changes - -- Updated dependencies [b967055c] - - @effect-app/schema@0.20.0 - - @effect-app/core@0.29.0 - -## 0.21.14 - -### Patch Changes - -- 28d5530b: Fix Encoded - -## 0.21.13 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.28.0 - - @effect-app/schema@0.19.4 - -## 0.21.12 - -### Patch Changes - -- Updated dependencies [39da5db8] - - @effect-app/core@0.27.0 - - @effect-app/schema@0.19.3 - -## 0.21.11 - -### Patch Changes - -- Updated dependencies [4679321f] - - @effect-app/core@0.26.0 - - @effect-app/schema@0.19.2 - -## 0.21.10 - -### Patch Changes - -- Updated dependencies [d66406c9] - - @effect-app/core@0.25.1 - - @effect-app/schema@0.19.1 - -## 0.21.9 - -### Patch Changes - -- Updated dependencies [b385e928] - - @effect-app/schema@0.19.0 - - @effect-app/core@0.25.0 - -## 0.21.8 - -### Patch Changes - -- Updated dependencies [c4b4a20a] - - @effect-app/core@0.24.1 - - @effect-app/schema@0.18.7 - -## 0.21.7 - -### Patch Changes - -- Updated dependencies [3d49bb4a] - - @effect-app/schema@0.18.6 - -## 0.21.6 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.24.0 - - @effect-app/schema@0.18.5 - -## 0.21.5 - -### Patch Changes - -- Updated dependencies [8da4c8fc] - - @effect-app/core@0.23.1 - - @effect-app/schema@0.18.4 - -## 0.21.4 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.23.0 - - @effect-app/schema@0.18.3 - -## 0.21.3 - -### Patch Changes - -- c29ab9fa: default Effect.servicesWith\* to lowercase first letter services. - -## 0.21.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.22.2 - - @effect-app/schema@0.18.2 - -## 0.21.1 - -### Patch Changes - -- Updated dependencies [df13134f] - - @effect-app/core@0.22.1 - - @effect-app/schema@0.18.1 - -## 0.21.0 - -### Minor Changes - -- Update annotations, drop Aspects for now - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.22.0 - - @effect-app/schema@0.18.0 - -## 0.20.3 - -### Patch Changes - -- Updated dependencies [e3e768a5] - - @effect-app/core@0.21.3 - - @effect-app/schema@0.17.3 - -## 0.20.2 - -### Patch Changes - -- Updated dependencies [d9751183] - - @effect-app/core@0.21.2 - - @effect-app/schema@0.17.2 - -## 0.20.1 - -### Patch Changes - -- Updated dependencies [46d8b7e1] - - @effect-app/core@0.21.1 - - @effect-app/schema@0.17.1 - -## 0.20.0 - -### Minor Changes - -- 338f1f19: Update packages - -### Patch Changes - -- Updated dependencies [338f1f19] - - @effect-app/schema@0.17.0 - - @effect-app/core@0.21.0 - -## 0.19.3 - -### Patch Changes - -- Updated dependencies [00ac8993] - - @effect-app/core@0.20.2 - - @effect-app/schema@0.16.3 - -## 0.19.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.20.1 - - @effect-app/schema@0.16.2 - -## 0.19.1 - -### Patch Changes - -- 02997e8f: FUP -- Updated dependencies [02997e8f] - - @effect-app/schema@0.16.1 - -## 0.19.0 - -### Minor Changes - -- 4d49f303: Upgrade to @effect/data - -### Patch Changes - -- Updated dependencies [4d49f303] - - @effect-app/schema@0.16.0 - - @effect-app/core@0.20.0 - -## 0.18.2 - -### Patch Changes - -- ca8b9a4e: Fix Function flow - -## 0.18.1 - -### Patch Changes - -- Updated dependencies [f8d8e4ec] - - @effect-app/core@0.19.0 - - @effect-app/schema@0.15.6 - -## 0.18.0 - -### Minor Changes - -- Update annotations and leverage ForceLazy on Effect \_\_call - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.18.0 - - @effect-app/schema@0.15.5 - -## 0.17.5 - -### Patch Changes - -- 912ba66c: Update packages -- Updated dependencies [912ba66c] - - @effect-app/schema@0.15.4 - - @effect-app/core@0.17.4 - -## 0.17.4 - -### Patch Changes - -- Updated dependencies [407cc13e] - - @effect-app/core@0.17.3 - - @effect-app/schema@0.15.3 - -## 0.17.3 - -### Patch Changes - -- e9e498ee: Update packages -- Updated dependencies [e9e498ee] - - @effect-app/schema@0.15.2 - - @effect-app/core@0.17.2 - -## 0.17.2 - -### Patch Changes - -- 33d2a60f: Cleanup - -## 0.17.1 - -### Patch Changes - -- Updated dependencies [8b10e403] - - @effect-app/core@0.17.1 - - @effect-app/schema@0.15.1 - -## 0.17.0 - -### Minor Changes - -- 9f9b2d32: Update effect and fp-ts - -### Patch Changes - -- Updated dependencies [9f9b2d32] - - @effect-app/schema@0.15.0 - - @effect-app/core@0.17.0 - -## 0.16.1 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.16.1 - - @effect-app/schema@0.14.1 - -## 0.16.0 - -### Minor Changes - -- 67716050: Update to TS5 beta - -### Patch Changes - -- Updated dependencies [67716050] - - @effect-app/schema@0.14.0 - - @effect-app/core@0.16.0 - -## 0.15.1 - -### Patch Changes - -- 5a69e08a: Reclaim Duration -- Updated dependencies [5a69e08a] - - @effect-app/core@0.15.1 - - @effect-app/schema@0.13.1 - -## 0.15.0 - -### Minor Changes - -- 25ec7aff: Reclaim the Option - -### Patch Changes - -- Updated dependencies [25ec7aff] - - @effect-app/schema@0.13.0 - - @effect-app/core@0.15.0 - -## 0.14.2 - -### Patch Changes - -- Updated dependencies [90d6e600] - - @effect-app/core@0.14.2 - - @effect-app/schema@0.12.9 - -## 0.14.1 - -### Patch Changes - -- Updated dependencies [8f97d979] - - @effect-app/core@0.14.1 - - @effect-app/schema@0.12.8 - -## 0.14.0 - -### Minor Changes - -- e4730778: Test dual api for Optic - -### Patch Changes - -- Updated dependencies [e4730778] - - @effect-app/core@0.14.0 - - @effect-app/schema@0.12.7 - -## 0.13.0 - -### Minor Changes - -- e7b4a0b9: Cleanup extensions - -### Patch Changes - -- Updated dependencies [e7b4a0b9] - - @effect-app/core@0.13.0 - - @effect-app/schema@0.12.6 - -## 0.12.5 - -### Patch Changes - -- Updated dependencies [a1bbd31f] - - @effect-app/schema@0.12.5 - -## 0.12.4 - -### Patch Changes - -- Updated dependencies [ffd11b1c] - - @effect-app/schema@0.12.4 - - @effect-app/core@0.12.4 - -## 0.12.3 - -### Patch Changes - -- 602ffbce: Update packages -- Updated dependencies [602ffbce] - - @effect-app/schema@0.12.3 - - @effect-app/core@0.12.3 - -## 0.12.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.12.2 - - @effect-app/schema@0.12.2 - -## 0.12.1 - -### Patch Changes - -- Disable trace -- Updated dependencies - - @effect-app/schema@0.12.1 - - @effect-app/core@0.12.1 - -## 0.12.0 - -### Minor Changes - -- Update to effect and fp-ts 0.1 line - -### Patch Changes - -- Updated dependencies - - @effect-app/schema@0.12.0 - - @effect-app/core@0.12.0 - -## 0.11.6 - -### Patch Changes - -- Fix ServiceBus should inherit runtime context - -## 0.11.5 - -### Patch Changes - -- e9a667fe: Add Operations - -## 0.11.4 - -### Patch Changes - -- 387dea6e: Fix Cache MapKey - -## 0.11.3 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.11.3 - - @effect-app/schema@0.11.3 - -## 0.11.2 - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.11.2 - - @effect-app/schema@0.11.2 - -## 0.11.1 - -### Patch Changes - -- 5ee19e1e: Improve exports -- Updated dependencies [5ee19e1e] - - @effect-app/core@0.11.1 - - @effect-app/schema@0.11.1 - -## 0.11.0 - -### Minor Changes - -- Remove @effect-ts/\* and replace monocle with fp-ts/optic - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.11.0 - - @effect-app/schema@0.11.0 - -## 0.10.2 - -### Patch Changes - -- Updated dependencies [cc4b37ea] - - @effect-app/core@0.10.2 - - @effect-app/schema@0.10.2 - -## 0.10.1 - -### Patch Changes - -- Updated dependencies [c4b95c0d] - - @effect-app/core@0.10.1 - - @effect-app/schema@0.10.1 - -## 0.10.0 - -### Minor Changes - -- Removed more of @effect-ts/core legacy - -### Patch Changes - -- Updated dependencies - - @effect-app/core@0.10.0 - - @effect-app/schema@0.10.0 - -## 0.9.0 - -### Minor Changes - -- 7d445f3e: Adopt Equivalence and Equal from @effect/data - -### Patch Changes - -- Updated dependencies [7d445f3e] - - @effect-app/schema@0.9.0 - - @effect-app/core@0.9.0 - -## 0.8.0 - -### Minor Changes - -- bba14672: Update to latest @effect/io and @effect/data - -### Patch Changes - -- Updated dependencies [bba14672] - - @effect-app/schema@0.8.0 - - @effect-app/core@0.8.0 - -## 0.7.1 - -### Patch Changes - -- Cleanup infra packages diff --git a/packages/effect-app/package.json b/packages/effect-app/package.json deleted file mode 100644 index aaae2ff75..000000000 --- a/packages/effect-app/package.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "name": "effect-app", - "version": "4.0.0-beta.320", - "license": "MIT", - "type": "module", - "repository": { - "type": "git", - "url": "https://github.com/effect-app/libs.git", - "directory": "packages/effect-app" - }, - "dependencies": { - "@tsconfig/strictest": "^2.0.8", - "date-fns": "^4.4.0", - "nanoid": "^5.1.11", - "path-parser": "^6.1.0", - "query-string": "^9.4.0", - "ts-toolbelt": "^9.6.0", - "validator": "^13.15.35" - }, - "devDependencies": { - "@faker-js/faker": "^8.4.1", - "@types/node": "25.9.1", - "@types/validator": "^13.15.10", - "fast-check": "^4.9.0", - "typescript": "~6.0.3", - "vitest": "^4.1.7" - }, - "peerDependencies": { - "effect": "^4.0.0-rc.114" - }, - "typesVersions": { - "*": { - "*": [ - "dist/*" - ] - } - }, - "exports": { - ".": { - "types": "./src/index.ts", - "default": "./src/index.ts" - }, - "./internal/*": null, - "./*": { - "types": "./src/*.ts", - "default": "./src/*.ts" - } - }, - "publishConfig": { - "exports": { - ".": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" - }, - "./internal/*": null, - "./*": { - "types": "./dist/*.d.ts", - "default": "./dist/*.js" - } - }, - "directory": ".publish", - "linkDirectory": false - }, - "scripts": { - "watch": "pnpm build:tsc -w", - "build:tsc": "pnpm clean-dist && pnpm check && node ../../scripts/rewrite-dist-declaration-imports.mjs dist", - "check": "tsgo --build", - "build:tsc-src": "pnpm clean-dist && tsc --build ./tsconfig.src.json && node ../../scripts/rewrite-dist-declaration-imports.mjs dist", - "build:src": "pnpm build:tsc-src", - "build": "pnpm build:tsc", - "watch2": "pnpm clean-dist && NODE_OPTIONS=--max-old-space-size=6144 tsgo -w", - "clean": "rm -rf dist", - "clean-dist": "sh ../../scripts/clean-dist.sh", - "circular": "pnpm circular:src && pnpm circular:dist", - "circular:src": "madge --circular --ts-config ./tsconfig.json --extensions ts ./src", - "circular:dist": "madge --circular --extensions js ./dist", - "compile": "NODE_OPTIONS=--max-old-space-size=6144 tsgo --noEmit", - "lint": "oxlint --type-aware ./src && pnpm exec dprint check --config ../../dprint.jsonc .", - "lint-fix": "oxlint --type-aware --fix ./src && pnpm exec dprint fmt --config ../../dprint.jsonc .", - "test": "vitest", - "test:run": "pnpm run test run --passWithNoTests", - "testsuite": "pnpm lint && pnpm circular && pnpm run test:run", - "ncu": "ncu", - "pub": "pnpm publish --access public", - "prepack": "node ../../scripts/stagePublishPackage.mjs prepack", - "postpack": "node ../../scripts/stagePublishPackage.mjs postpack", - "postpublish": "node ../../scripts/stagePublishPackage.mjs postpublish" - }, - "gitHead": "bd8e27eea3eff97db8739d577d67e7336c078d28", - "sideEffects": [ - "./dist/faker.js", - "./faker", - "./src/faker", - "./dist/faker", - "./dist/src/faker.js", - "./dist/faker.js" - ] -} diff --git a/packages/effect-app/src/Array.ts b/packages/effect-app/src/Array.ts deleted file mode 100644 index a36c992c8..000000000 --- a/packages/effect-app/src/Array.ts +++ /dev/null @@ -1,110 +0,0 @@ -import type { NonEmptyArray, NonEmptyReadonlyArray } from "effect/Array" -import * as Array from "effect/Array" -import * as Chunk from "effect/Chunk" -import * as Effect from "effect/Effect" -import { dual, type Predicate } from "./Function.ts" -import * as Option from "./Option.ts" - -export const toNonEmptyArray = Option.liftPredicate(Array.isReadonlyArrayNonEmpty) - -export const isArray: { - // uses ReadonlyArray here because otherwise the second overload don't work when ROA is involved. - (self: unknown): self is ReadonlyArray - (self: T): self is Extract> -} = Array.isArray - -export function NEAFromArray(ar: Array) { - return ar.length ? Option.some(ar as NonEmptyArray) : Option.none() -} - -export function NEROArrayFromArray(ar: ReadonlyArray) { - return ar.length ? Option.some(ar as NonEmptyReadonlyArray) : Option.none() -} - -export const groupByT = dual< - ( - f: (a: NoInfer) => Key - ) => (as: ReadonlyArray) => Array]>, - ( - as: ReadonlyArray, - f: (a: A) => Key - ) => Array]> ->(2, ( - as: ReadonlyArray, - f: (a: A) => Key -): Array]> => { - const r = new Map>() - for (const a of as) { - const k = f(a) - if (r.has(k)) { - r.get(k)!.push(a) - } else { - r.set(k, [a]) - } - } - return [...r.entries()] -}) - -export const groupByTNonEmpty = dual< - ( - f: (a: NoInfer) => Key - ) => (as: NonEmptyReadonlyArray) => NonEmptyArray]>, - ( - as: NonEmptyReadonlyArray, - f: (a: A) => Key - ) => NonEmptyArray]> ->(2, ( - as: NonEmptyReadonlyArray, - f: (a: A) => Key -): NonEmptyArray]> => { - const r = new Map>() - for (const a of as) { - const k = f(a) - if (r.has(k)) { - r.get(k)!.push(a) - } else { - r.set(k, [a]) - } - } - return [...r.entries()] as unknown as NonEmptyArray]> -}) - -// const a = [1, 2, 3] as const -// const b = [1, 2, 3] - -// const a1 = groupByTNonEmpty(a, (x) => x % 2) // $ExpectType NonEmptyReadonlyArray]> -// const b1 = groupByT(b, (x) => x % 2) // $ExpectType Array]> - -export function randomElement(a: NonEmptyReadonlyArray): A -export function randomElement(a: ReadonlyArray): A | undefined -export function randomElement(a: ReadonlyArray): A | undefined { - return a[Math.floor(Math.random() * a.length)] -} - -export function filterWith(self: ReadonlyArray, predicates: ReadonlyArray>) { - return self.filter((_) => predicates.every((f) => f(_))) -} - -/** - * Split the `items` array into multiple, smaller chunks of the given `size`. - */ -export function* _chunk_(items_: Iterable, size: number) { - const items = [...items_] - - while (items.length) { - yield items.splice(0, size) - } -} - -/** - * Split the `items` array into multiple, smaller chunks of the given `size`. - */ -export function chunk_(items_: Iterable, size: number) { - return Chunk.fromIterable(_chunk_(items_, size)) -} - -export function forEachEffectNA(as: NonEmptyReadonlyArray, f: (a: A) => Effect.Effect) { - return Effect.map(Effect.forEach(as, f), (_) => Option.getOrNull(toNonEmptyArray(_))) -} - -export * from "effect/Array" diff --git a/packages/effect-app/src/Chunk.ts b/packages/effect-app/src/Chunk.ts deleted file mode 100644 index 1ac48650d..000000000 --- a/packages/effect-app/src/Chunk.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { pipe, type Predicate, type Refinement } from "./Function.ts" -import * as Option from "./Option.ts" - -import * as Chunk from "effect/Chunk" -import { type Equivalence } from "effect/Equivalence" -import * as Array from "./Array.ts" - -export * from "effect/Chunk" - -export const fromIterable = Chunk.fromIterable - -export function groupByTChunk_(c: Chunk.Chunk, f: (a: A) => Key) { - return pipe(Chunk.toReadonlyArray(c), Array.groupByT(f), Chunk.fromIterable) -} - -/** - * Returns the first element that satisfies the predicate. - */ -export function findFirstMap( - f: (a: A) => Option.Option -) { - return (as: Chunk.Chunk) => { - const ass = Chunk.toReadonlyArray(as) - const len = ass.length - for (let i = 0; i < len; i++) { - const v = f(ass[i]!) - if (Option.isSome(v)) { - return v - } - } - return Option.none() - } -} - -export function toArray(c: Chunk.Chunk): T[] { - return Chunk.toReadonlyArray(c) as T[] -} - -/** - * Remove duplicates from an array, keeping the first occurrence of an element. - */ -export function uniq(E: Equivalence) { - return (self: Chunk.Chunk): Chunk.Chunk => { - let out = Chunk.fromIterable([] as A[]) - for (let i = 0; i < self.length; i++) { - const a = Chunk.getUnsafe(self, i) - if (!elem(E, a)(out)) { - out = Chunk.append(out, a) - } - } - return self.length === out.length ? self : out - } -} - -/** - * Test if a value is a member of an array. Takes a `Equivalence` as a single - * argument which returns the function to use to search for a value of type `A` - * in an array of type `Chunk`. - */ -export function elem(E: Equivalence, value: A) { - return (self: Chunk.Chunk): boolean => { - for (let i = 0; i < self.length; i++) { - if (E(Chunk.getUnsafe(self, i), value)) { - return true - } - } - return false - } -} - -export const ChunkPartition = Chunk.partition - -export const findFirstSimple: { - (self: Chunk.Chunk, refinement: Refinement): Option.Option - (self: Chunk.Chunk, predicate: Predicate): Option.Option -} = Chunk.findFirst - -export const findLastSimple: { - (self: Chunk.Chunk, refinement: Refinement): Option.Option - (self: Chunk.Chunk, predicate: Predicate): Option.Option -} = Chunk.findLast diff --git a/packages/effect-app/src/Config.ts b/packages/effect-app/src/Config.ts deleted file mode 100644 index 1dc6d489e..000000000 --- a/packages/effect-app/src/Config.ts +++ /dev/null @@ -1,7 +0,0 @@ -// `Config.nested` previously needed a local override because effect v3's `nested` -// did not run the provider's `mapInput`/`constantCase` over the nested namespace -// segment (see commit "fix Config.nested mapping"). As of effect 4.0.0-beta.84 the -// upstream `nested` threads the prefix through the lookup path, so the provider -// transform covers it — the override is obsolete and the old internals it used are -// gone. Re-export the native module directly. -export * from "effect/Config" diff --git a/packages/effect-app/src/Config/SecretURL.ts b/packages/effect-app/src/Config/SecretURL.ts deleted file mode 100644 index 684db9396..000000000 --- a/packages/effect-app/src/Config/SecretURL.ts +++ /dev/null @@ -1,80 +0,0 @@ -/** - * @since 1.0.0 - */ -import type * as Chunk from "effect/Chunk" -import * as Config from "effect/Config" -import type * as Equal from "effect/Equal" -import type * as Redacted from "effect/Redacted" -import * as internal from "./internal/configSecretURL.ts" - -// /** -// * @since 1.0.0 -// * @category symbols -// */ -// export const SecretURLTypeId: unique symbol = internal.SecretURLTypeId - -// /** -// * @since 1.0.0 -// * @category symbols -// */ -// export type SecretURLTypeId = typeof SecretURLTypeId - -/** - * @since 1.0.0 - * @category models - */ -// eslint-disable-next-line import/namespace -export interface SecretURL extends Redacted.Redacted, Equal.Equal { - /** @internal */ - readonly raw: Array -} - -export interface SecretURLOps {} - -export const SecretURL: SecretURLOps = {} - -/** - * @since 1.0.0 - */ -export declare namespace SecretURL {} - -/** - * @since 1.0.0 - * @category refinements - * @deprecated - */ -export const isSecretURL: (u: unknown) => u is SecretURL = internal.isSecretURL - -/** - * @since 1.0.0 - * @category constructors - */ -export const make: (bytes: Array) => SecretURL = internal.make - -/** - * @since 1.0.0 - * @category constructors - */ -export const fromChunk: (chunk: Chunk.Chunk) => SecretURL = internal.fromChunk - -/** - * @since 1.0.0 - * @category constructors - */ -export const fromString: (text: string) => SecretURL = internal.fromString - -/** - * @since 1.0.0 - * @category getters - */ -export const value: (self: SecretURL) => string = internal.value - -/** - * @since 1.0.0 - * @category unsafe - */ -export const unsafeWipe: (self: SecretURL) => void = internal.unsafeWipe - -export const secretURL = (name?: string): Config.Config => { - return Config.map(Config.NonEmptyString(name), fromString) -} diff --git a/packages/effect-app/src/Config/internal/configSecretURL.ts b/packages/effect-app/src/Config/internal/configSecretURL.ts deleted file mode 100644 index 36a3aa5b7..000000000 --- a/packages/effect-app/src/Config/internal/configSecretURL.ts +++ /dev/null @@ -1,68 +0,0 @@ -import * as Chunk from "effect/Chunk" -import * as Redacted from "effect/Redacted" -import type * as SecretURL from "../SecretURL.ts" - -/** @internal */ -export const isSecretURL = (u: unknown): u is SecretURL.SecretURL => { - return Redacted.isRedacted(u) && typeof (u as any).raw !== "undefined" -} - -/** @internal */ -export const make = (bytes: Array): SecretURL.SecretURL => { - const secret = Object.assign( - Redacted.make(bytes.map((byte) => String.fromCharCode(byte)).join("")), - { raw: undefined as any } as const - ) - let protocol = "unknown" - try { - const url = new URL(bytes.map((byte) => String.fromCharCode(byte)).join("")) - protocol = url.protocol.substring(0, url.protocol.length - 1) - } catch { - const matches = protocol.match(/^([^:]+):\/\//) - if (matches !== null) { - protocol = matches[1]! - } - } - Object.defineProperty(secret, "toJSON", { - enumerable: false, - value() { - return ({ - _tag: "SecretURL", - protocol - }) - } - }) - Object.defineProperty(secret, "toString", { - enumerable: false, - value() { - return `SecretURL(${protocol}://)` - } - }) - Object.defineProperty(secret, "raw", { - enumerable: false, - value: bytes - }) - return secret -} - -/** @internal */ -export const fromChunk = (chunk: Chunk.Chunk): SecretURL.SecretURL => { - return make(Chunk.toReadonlyArray(chunk).map((char) => char.charCodeAt(0))) -} - -/** @internal */ -export const fromString = (text: string): SecretURL.SecretURL => { - return make(text.split("").map((char) => char.charCodeAt(0))) -} - -/** @internal */ -export const value = (self: SecretURL.SecretURL): string => { - return self.raw.map((byte) => String.fromCharCode(byte)).join("") -} - -/** @internal */ -export const unsafeWipe = (self: SecretURL.SecretURL): void => { - for (let i = 0; i < self.raw.length; i++) { - self.raw[i] = 0 - } -} diff --git a/packages/effect-app/src/ConfigProvider.ts b/packages/effect-app/src/ConfigProvider.ts deleted file mode 100644 index 881a627a2..000000000 --- a/packages/effect-app/src/ConfigProvider.ts +++ /dev/null @@ -1,5 +0,0 @@ -// Local `nested` override removed: it existed to make the nested namespace honour the -// provider's `mapInput`/`constantCase` (see commit "fix Config.nested mapping"), which -// effect 4.0.0-beta.84 now does natively. The old override also relied on internals -// (`provider.get`/`mapInput`/`prefix`) that no longer exist. Re-export native directly. -export * from "effect/ConfigProvider" diff --git a/packages/effect-app/src/Context.ts b/packages/effect-app/src/Context.ts deleted file mode 100644 index 8846a8fa8..000000000 --- a/packages/effect-app/src/Context.ts +++ /dev/null @@ -1,181 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable import/namespace */ - -import * as CTX from "effect/Context" -import type * as Effect from "effect/Effect" -import * as Layer from "effect/Layer" -import type * as Scope from "effect/Scope" -import type * as Types from "effect/Types" - -export * from "effect/Context" - -export interface Opaque extends CTX.Key { - of(this: void, self: Shape): Self - context(self: Shape): CTX.Context - // a version that leverages the Shape -> Self conversion - toLayer: ( - eff: Effect.Effect - ) => Layer.Layer> - use(f: (service: Shape) => Effect.Effect): Effect.Effect - useSync(f: (service: Shape) => A): Effect.Effect -} - -// export interface OpaqueMake -// extends CTX.Service -// { -// // temp while sorting out https://github.com/Effect-TS/effect-smol/pull/1534 -// of(self: Shape): Self -// contextMap2(self: Shape): CTX.Context -// // a version that leverages the Shape -> Self conversion -// toLayer: { -// ( -// eff: Effect.Effect -// ): Layer.Layer> -// (): Layer.Layer> -// } -// } - -export function assignTag( - key: string, - creationError?: Error -) { - return (cls: S): S & Opaque => { - const tag = CTX.Service(key) - let fields = tag - if (Reflect.ownKeys(cls).includes("key")) { - const { key, ...rest } = tag - fields = rest as any - } - const t = Object.assign(cls, Object.getPrototypeOf(tag), fields) - if (!creationError) { - const limit = Error.stackTraceLimit - Error.stackTraceLimit = 2 - creationError = new Error() - Error.stackTraceLimit = limit - } - // the stack is used to get the location of the tag definition, if a service is not found in the registry - Object.defineProperty(t, "stack", { - get() { - return creationError!.stack - } - }) - return t - } -} - -/** Accessor for a service method that returns a plain value. Wraps via `useSync`. */ -export const accessFn = < - Self extends object, - Shape extends Record, - K extends keyof Shape ->( - Tag: Opaque, - key: K -): Shape[K] extends (...args: [...infer Args]) => infer A ? (...args: Readonly) => Effect.Effect - : never => ((...args: Array) => Tag.useSync((s: any) => s[key](...args))) as any - -/** Accessor for a service method that returns an Effect. Delegates via `use`. */ -export const accessEffectFn = < - Self extends object, - Shape extends Record, - K extends keyof Shape ->( - Tag: Opaque, - key: K -): Shape[K] extends (...args: [...infer Args]) => Effect.Effect - ? (...args: Readonly) => Effect.Effect - : never => ((...args: Array) => Tag.use((s: any) => s[key](...args))) as any - -/** Accessor for a service property (constant). Wraps via `useSync`. */ -export const accessCn = < - Self extends object, - Shape extends Record, - K extends keyof Shape ->( - Tag: Opaque, - key: K -): Effect.Effect => Tag.useSync((s) => s[key]) - -/** Accessor for a service property that is an Effect. Delegates via `use`. */ -export const accessEffectCn = < - Self extends object, - Shape extends Record, - K extends keyof Shape ->( - Tag: Opaque, - key: K -): Shape[K] extends Effect.Effect ? Effect.Effect - : never => Tag.use((s: any) => s[key]) as any - -export const TypeId = "~Context.Opaque" - -// export function Opaque(key: Key) { -// return () => { -// const limit = Error.stackTraceLimit -// Error.stackTraceLimit = 2 -// const creationError = new Error() -// Error.stackTraceLimit = limit -// const c: abstract new(_: never) => Shape & { readonly [TypeId]: Key } = class {} as any - -// return assignTag(key, creationError)(c) -// } -// } - -export interface OpaqueClass - extends Opaque -{ - new(_: never): Shape & { readonly [TypeId]: Identifier } - readonly key: Identifier -} - -// export interface OpaqueClassMake -// extends OpaqueMake -// { -// new(_: never): Shape & { readonly [TypeId]: Identifier } -// readonly key: Identifier -// } - -export const Opaque: { - (): < - const Identifier extends string, - E, - R = Types.unassigned, - Args extends ReadonlyArray = never - >( - id: Identifier, - options?: { - readonly make: ((...args: Args) => Effect.Effect) | Effect.Effect | undefined - } - ) => - & OpaqueClass - & ([Types.unassigned] extends [R] ? unknown - : { - readonly make: [Args] extends [never] ? Effect.Effect - : (...args: Args) => Effect.Effect - }) - (): < - const Identifier extends string, - Make extends Effect.Effect | ((...args: any) => Effect.Effect) - >( - id: Identifier, - options: { - readonly make: Make - } - ) => - & OpaqueClass< - Self, - Identifier, - Make extends - | Effect.Effect - | ((...args: infer _Args) => Effect.Effect) ? _A - : never - > - & { readonly make: Make } -} = () => (id: string, options: any) => { - const svc = CTX.Service()(id, options) as any - return Object.assign(svc, { - toLayer: (eff: Effect.Effect) => { - return Layer.effect(svc, eff) - } - }) -} diff --git a/packages/effect-app/src/DataDependencies.ts b/packages/effect-app/src/DataDependencies.ts deleted file mode 100644 index 920fc7cb2..000000000 --- a/packages/effect-app/src/DataDependencies.ts +++ /dev/null @@ -1,171 +0,0 @@ -import type { NonEmptyReadonlyArray } from "effect/Array" -import * as Ref from "effect/Ref" -import * as Stream from "effect/Stream" -import * as Context from "./Context.ts" -import * as Effect from "./Effect.ts" -import * as RequestScopedDependencies from "./RequestScopedDependencies.ts" -import * as S from "./Schema.ts" - -export const DataDependency = S.Union([ - S.Struct({ - type: S.Literal("repo"), - name: S.String, - ids: S.optional(S.NonEmptyArray(S.String)) - }), - S.Struct({ - type: S.Literal("signal"), - name: S.String, - ids: S.optional(S.NonEmptyArray(S.String)) - }) -]) -export type DataDependency = S.Schema.Type - -export const DataDependencies = S.ReadonlySet(DataDependency) -export type DataDependencies = S.Schema.Type - -export const empty = (): DataDependencies => new Set() - -export const DataDependencySet = S.Struct({ - reads: DataDependencies, - writes: DataDependencies -}) -export type DataDependencySet = S.Schema.Type - -export interface DataDependencyRecorderService { - readonly read: (dependency: DataDependency) => Effect.Effect - readonly write: (dependency: DataDependency) => Effect.Effect - readonly get: Effect.Effect - readonly drain: Effect.Effect - readonly drainWrites: Effect.Effect -} - -const sameDomain = (a: DataDependency, b: DataDependency) => a.type === b.type && a.name === b.name - -const dependenciesOverlap = (a: DataDependency, b: DataDependency) => { - if (!sameDomain(a, b)) return false - if (a.ids === undefined || b.ids === undefined) return true - return a.ids.some((id) => b.ids?.includes(id)) -} - -const containsDependency = (dependencies: ReadonlySet, dependency: DataDependency) => { - for (const _ of dependencies) { - if (dependenciesOverlap(_, dependency)) return true - } - return false -} - -const appendDependency = (dependency: DataDependency) => (dependencies: DataDependencies): DataDependencies => { - const existing = [...dependencies].find((_) => sameDomain(_, dependency)) - if (existing === undefined) return new Set([...dependencies, dependency]) - if (existing.ids === undefined) return dependencies - if (dependency.ids === undefined) { - return new Set([...dependencies].filter((_) => _ !== existing).concat(dependency)) - } - const first = existing.ids[0] - const ids: NonEmptyReadonlyArray = [ - first, - ...new Set([...existing.ids.slice(1), ...dependency.ids].filter((id) => id !== first)) - ] - if (ids.length === existing.ids.length) return dependencies - const merged = existing.type === "repo" ? repo(existing.name, ids) : signal(existing.name, ids) - return new Set([...dependencies].filter((_) => _ !== existing).concat(merged)) -} - -export const merge = (...groups: ReadonlyArray): DataDependencies => { - let merged = empty() - for (const group of groups) { - for (const dependency of group) merged = appendDependency(dependency)(merged) - } - return merged -} - -export const DataDependencyRecorder = RequestScopedDependencies.make( - "effect-app/DataDependencyRecorder", - Effect.gen(function*() { - const readsRef = yield* Ref.make(empty()) - const writesRef = yield* Ref.make(empty()) - return makeDataDependencyRecorder(readsRef, writesRef) - }) -) -export type DataDependencyRecorder = typeof DataDependencyRecorder - -export type DataDependencyRecorderNotStartedError = RequestScopedDependencies.RequestScopedDependencyNotStartedError - -export const getDataDependencyRecorder = DataDependencyRecorder.current - -/** - * Guarantee a recorder is in scope for `self`, providing a fresh one per request when none is - * (e.g. a top-level client call with no parent query/command tracking its dependencies). An - * existing recorder is inherited, so nested calls forward into their parent rather than shadow it. - */ -export const ensureDataDependencyRecorder = (self: Effect.Effect): Effect.Effect => - Effect.flatMap( - DataDependencyRecorder, - (current) => current === "root" ? Effect.provide(self, DataDependencyRecorder.layer) : self - ) - -/** Stream variant of {@link ensureDataDependencyRecorder}. */ -export const ensureDataDependencyRecorderStream = (self: Stream.Stream): Stream.Stream => - Stream.unwrap( - Effect.map( - DataDependencyRecorder, - (current) => current === "root" ? Stream.provide(self, DataDependencyRecorder.layer) : self - ) - ) - -export const makeDataDependencyRecorder = ( - readsRef: Ref.Ref, - writesRef: Ref.Ref -): DataDependencyRecorderService => ({ - read: (dependency) => Ref.update(readsRef, appendDependency(dependency)), - write: (dependency) => Ref.update(writesRef, appendDependency(dependency)), - get: Effect.all({ - reads: Ref.get(readsRef), - writes: Ref.get(writesRef) - }), - drain: Effect.all({ - reads: Ref.getAndSet(readsRef, empty()), - writes: Ref.getAndSet(writesRef, empty()) - }), - drainWrites: Ref.getAndSet(writesRef, empty()) -}) - -export const repo = (name: string, ids?: NonEmptyReadonlyArray): DataDependency => - ids === undefined ? { type: "repo", name } : { type: "repo", name, ids } -export const signal = (name: string, ids?: NonEmptyReadonlyArray): DataDependency => - ids === undefined ? { type: "signal", name } : { type: "signal", name, ids } - -const RepoReadScope = Context.Reference("effect-app/DataDependencies/RepoReadScope", { - defaultValue: () => undefined -}) - -export const readRepo = (name: string) => - Effect.flatMap( - RepoReadScope, - (scope) => read(scope?.type === "repo" && scope.name === name ? scope : repo(name)) - ) - -export const withRepoReadScope = - (name: string, ids: NonEmptyReadonlyArray) => - (self: Effect.Effect): Effect.Effect => - Effect.provideService(self, RepoReadScope, repo(name, ids)) - -export const QueryReadDependenciesMetaKey = "effect-app.query.readDependencies" - -export const read = (dependency: DataDependency) => - getDataDependencyRecorder.pipe(Effect.flatMap((_) => _.read(dependency))) - -export const write = (dependency: DataDependency) => - getDataDependencyRecorder.pipe(Effect.flatMap((_) => _.write(dependency))) - -export const intersects = ( - a: ReadonlySet, - b: ReadonlySet -) => { - for (const dependency of a) { - if (containsDependency(b, dependency)) return true - } - return false -} - -export const isNonEmpty = (dependencies: DataDependencies) => dependencies.size > 0 diff --git a/packages/effect-app/src/Effect.ts b/packages/effect-app/src/Effect.ts deleted file mode 100644 index 0685cdbeb..000000000 --- a/packages/effect-app/src/Effect.ts +++ /dev/null @@ -1,202 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable prefer-destructuring */ -// eslint-disable-next-line @typescript-eslint/no-unused-vars - -import * as Def from "effect/Deferred" -import * as Effect from "effect/Effect" -import * as Option from "effect/Option" -import * as Ref from "effect/Ref" -import type { Scope } from "effect/Scope" -import type { Semaphore } from "effect/Semaphore" -import type * as Context from "./Context.ts" -import { curry } from "./Function.ts" -import { typedKeysOf } from "./utils.ts" - -export * from "effect/Effect" -// v4: Effect interface not re-exported by `export *` due to local binding collision -export type { Effect } from "effect/Effect" - -export function flatMapOption( - self: Effect.Effect, E, R>, - fm: (a: A) => Effect.Effect -): Effect.Effect, E | E2, R | R2> { - return Effect.flatMap(self, (d) => - Option.match(d, { - onNone: () => Effect.sync(() => Option.none()), - onSome: (_) => Effect.map(fm(_), Option.some) - })) -} - -export function tapOption( - self: Effect.Effect, E, R>, - fm: (a: A) => Effect.Effect -): Effect.Effect, E | E2, R | R2> { - return Effect.flatMap(self, (d) => - Option.match(d, { - onNone: () => Effect.sync(() => Option.none()), - onSome: (_) => Effect.map(fm(_), () => Option.some(_)) - })) -} - -export function zipRightOption( - self: Effect.Effect, E, R>, - fm: Effect.Effect -) { - return Effect.flatMap(self, (d) => - Option.match(d, { - onNone: () => Effect.sync(() => Option.none()), - onSome: (_) => Effect.map(fm, () => Option.some(_)) - })) -} - -export function mapOption( - self: Effect.Effect, E, R>, - fm: (a: A) => A2 -): Effect.Effect, E, R> { - return Effect.map(self, (d) => - Option.match(d, { - onNone: () => Option.none(), - onSome: (_) => Option.some(fm(_)) - })) -} - -/** - * Takes [A, B], applies it to a curried Effect function, - * taps the Effect, returning A. - */ -export function tupleTap( - f: (b: B) => (a: A) => Effect.Effect -) { - return (t: readonly [A, B]) => Effect.sync(() => t[0]).pipe(Effect.tap(f(t[1]))) -} - -/** - * Takes [A, B], applies it to an Effect function, - * taps the Effect, returning A. - */ -export function tupleTap_(f: (a: A, b: B) => Effect.Effect) { - return tupleTap(curry(f)) -} - -export function ifDiffR(f: (i: I) => Effect.Effect) { - return (n: I, orig: I) => ifDiff_(n, orig, f) -} - -export function ifDiff_( - n: I, - orig: I, - f: (i: I) => Effect.Effect -) { - return n !== orig ? f(n) : Effect.void -} - -export function ifDiff(n: I, orig: I) { - return (f: (i: I) => Effect.Effect) => ifDiff_(n, orig, f) -} - -// NOTE: await extension doesnt work via tsplus somehow -export const await_ = Def.await - -/** - * Ref has atomic modify support if synchronous, for Effect we need a Semaphore. - */ -export function modifyWithPermitWithEffect(ref: Ref.Ref, semaphore: Semaphore) { - const withPermit = semaphore.withPermits(1) - return (mod: (a: A) => Effect.Effect) => - withPermit( - Effect - .flatMap(Ref.get(ref), mod) - .pipe( - Effect.tap(([, _]) => Ref.set(ref, _)), - Effect.map(([_]) => _) - ) - ) -} - -type ServiceA = T extends Effect.Effect ? S - : T extends Context.Service ? S - : never -type ServiceR = T extends Effect.Effect ? R - : T extends Context.Service ? I - : never -type ServiceE = T extends Effect.Effect ? E : never -// type Values = T extends { [s: string]: infer S } ? ServiceA : never -type ValuesR = T extends { [s: string]: infer S } ? ServiceR : never -type ValuesE = T extends { [s: string]: infer S } ? ServiceE : never - -/** - * Due to tsplus unification (tsplus unify tag), when trying to use the Effect type in a type constraint - * the compiler will cause basically anything to match. as such, use this type instead. - * ```ts - * const a = < - * SVC extends Record< - * string, - * ((req: number) => Effect.Effect) | Effect.Effect - * > - * >(svc: SVC) => svc - * - * const b = a({ str: "" }) // valid, but shouldn't be! - * ``` - */ -// eslint-disable-next-line import/namespace -export interface EffectUnunified extends Effect.Effect {} - -export type LowerFirst = S extends `${infer First}${infer Rest}` ? `${Lowercase}${Rest}` - : S -export type LowerServices | Effect.Effect>> = { - [key in keyof T as LowerFirst]: ServiceA -} - -export function allLower | Effect.Effect>>( - services: T -) { - return Effect.all( - typedKeysOf(services).reduce((prev, cur) => { - const svc = services[cur]! - prev[((cur as string)[0]!.toLowerCase() + (cur as string).slice(1)) as unknown as LowerFirst] = svc - return prev - }, {} as any), - { concurrency: "unbounded" } - ) as any as Effect.Effect, ValuesE, ValuesR> -} - -export function allLowerWith | Effect.Effect>, A>( - services: T, - fn: (services: LowerServices) => A -) { - return Effect.map(allLower(services), fn) -} - -export function allLowerWithEffect< - T extends Record | Effect.Effect>, - R, - E, - A ->( - services: T, - fn: (services: LowerServices) => Effect.Effect -) { - return Effect.flatMap(allLower(services), fn) -} - -/** - * Recovers from all errors. - */ -export function catchAllMap(f: (e: E) => A2) { - return (self: Effect.Effect): Effect.Effect => - Effect.catch(self, (err: E) => Effect.sync(() => f(err))) -} - -/** - * Annotates each log in this scope with the specified log annotation. - */ -export function annotateLogscoped(key: string, value: string): Effect.Effect { - return Effect.annotateLogsScoped(key, value) -} - -/** - * Annotates each log in this scope with the specified log annotations. - */ -export function annotateLogsScoped(kvps: Record): Effect.Effect { - return Effect.annotateLogsScoped(kvps) -} diff --git a/packages/effect-app/src/Emailer.ts b/packages/effect-app/src/Emailer.ts deleted file mode 100644 index 1fe5eab07..000000000 --- a/packages/effect-app/src/Emailer.ts +++ /dev/null @@ -1,51 +0,0 @@ -import * as Data from "effect/Data" -import type { NonEmptyReadonlyArray } from "./Array.ts" -import * as Context from "./Context.ts" -import type * as Effect from "./Effect.ts" -import type { Email } from "./Schema.ts" - -export class SendMailError extends Data.TaggedError("SendMailError")<{ - readonly raw: Error -}> {} - -export class Emailer extends Context.Opaque Effect.Effect -}>()("effect-app/Emailer") {} - -export type EmailData = Email | { - name?: string - email: Email -} - -export interface EmailContentPart { - type: string - value: string -} - -export type EmailRecipients = EmailData | NonEmptyReadonlyArray - -export interface EmailMsgBase { - readonly to: EmailRecipients - readonly cc?: EmailRecipients - readonly bcc?: EmailRecipients - readonly from: EmailData - readonly replyTo?: EmailData - readonly subject?: string - /** - * should multiple `to` addresess be considered multiple emails? - * defaults to `true`, not to leak email addresses - */ - readonly isMultiple?: boolean -} - -export type EmailContent = - | { text: string } - | { html: string } - | { templateId: string } - | { content: NonEmptyReadonlyArray } - -export type EmailMsg = - & EmailMsgBase - & EmailContent - -export type EmailMsgOptionalFrom = Omit & Partial> & EmailContent diff --git a/packages/effect-app/src/Function.ts b/packages/effect-app/src/Function.ts deleted file mode 100644 index 1f56364fe..000000000 --- a/packages/effect-app/src/Function.ts +++ /dev/null @@ -1,175 +0,0 @@ -export * from "effect/Function" -export type { Predicate, Refinement } from "effect/Predicate" - -/** - * Construct tuples - */ -export function tuple>(...t: T): Readonly { - return t -} - -/* eslint-disable @typescript-eslint/no-explicit-any */ - -export function tupledCurry(f: (b: B) => (a: A) => C) { - return (t: [A, B]) => f(t[1])(t[0]) -} - -export function reverseCurry(f: (b: B) => (a: A) => C) { - return (a: A) => (b: B) => f(b)(a) -} - -export function curry(f: (a: A, b: B) => C) { - return (b: B) => (a: A) => f(a, b) -} - -export function uncurry(f: (b: B) => (a: A) => C) { - return (a: A, b: B) => f(b)(a) -} - -// It's better to have these expanded, so that on the call site you understand the functions better. -// type OptMagix = ((b?: B) => (a: A) => C) & { -// /** -// * Uncurried version of the parent function -// */ -// _: (a: A, b?: B) => C -// /** -// * Reverse curried version of the parent function -// */ -// r: (a: A) => (b?: B) => C -// } -// type Magix = ((b: B) => (a: A) => C) & { -// /** -// * Uncurried version of the parent function -// */ -// _: (a: A, b: B) => C -// /** -// * Reverse curried version of the parent function -// */ -// r: (a: A) => (b: B) => C -// } - -export function curriedMagix( - f: (b?: B) => (a: A) => C -): ((b?: B) => (a: A) => C) & { - /** - * Uncurried version of the parent function - */ - _: (a: A, b?: B) => C - /** - * Reverse curried version of the parent function - */ - r: (a: A) => (b?: B) => C -} -export function curriedMagix( - f: (b: B) => (a: A) => C -): ((b: B) => (a: A) => C) & { - /** - * Uncurried version of the parent function - */ - _: (a: A, b: B) => C - /** - * Reverse curried version of the parent function - */ - r: (a: A) => (b: B) => C -} -export function curriedMagix(f: (b: B) => (a: A) => C) { - return Object.assign(f, { - /** - * Uncurried version of the parent function - */ - _: uncurry(f), - /** - * Reverse curried version of the parent function - */ - r: reverseCurry(f) - }) -} - -export function uncurriedMagix( - f: (a: A, b?: B) => C -): ((b?: B) => (a: A) => C) & { - /** - * Uncurried version of the parent function - */ - _: (a: A, b?: B) => C - /** - * Reverse curried version of the parent function - */ - r: (a: A) => (b?: B) => C -} -export function uncurriedMagix( - f: (a: A, b: B) => C -): ((b: B) => (a: A) => C) & { - /** - * Uncurried version of the parent function - */ - _: (a: A, b: B) => C - /** - * Reverse curried version of the parent function - */ - r: (a: A) => (b: B) => C -} -export function uncurriedMagix(f: (a: A, b: B) => C) { - const curried = curry(f) - return Object.assign(curried, { - /** - * Uncurried version of the parent function - */ - _: f, - /** - * Reverse curried version of the parent function - */ - r: reverseCurry(curried) - }) -} - -export function reverseCurriedMagix( - f: (a: A) => (b: B) => C -): ((b?: B) => (a: A) => C) & { - /** - * Uncurried version of the parent function - */ - _: (a: A, b?: B) => C - /** - * Reverse curried version of the parent function - */ - r: (a: A) => (b?: B) => C -} -export function reverseCurriedMagix( - f: (a?: A) => (b: B) => C -): ((b: B) => (a: A) => C) & { - /** - * Uncurried version of the parent function - */ - _: (a: A, b: B) => C - /** - * Reverse curried version of the parent function - */ - r: (a: A) => (b: B) => C -} -export function reverseCurriedMagix(f: (a: A) => (b: B) => C) { - const curried = reverseCurry(f) - return Object.assign(curried, { - /** - * Uncurried version of the parent function - */ - _: uncurry(curried), - /** - * Reverse curried version of the parent function - */ - r: f - }) -} - -export function lazy(f: () => A): () => A { - let tmp: A | undefined - let done = false - return () => { - if (done) { - return tmp! - } - tmp = f() - done = true - return tmp - } -} diff --git a/packages/effect-app/src/Inputify.type.ts b/packages/effect-app/src/Inputify.type.ts deleted file mode 100644 index a47022685..000000000 --- a/packages/effect-app/src/Inputify.type.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { BuiltInObject } from "effect-app/utils" - -import type { Primitive } from "./Widen.type.ts" - -// Get rid of Date | string, and replace with Date | null -export type Inputify = Date extends T ? string extends T ? Date | null - : Date | null - : [T] extends [BuiltInObject] | [Primitive] ? T - : [T] extends [Array] ? { [K in keyof T]: Inputify } - : [T] extends [ReadonlyArray] ? { [K in keyof T]: Inputify } - : [T] extends [object] ? { [K in keyof T]: Inputify } - : T diff --git a/packages/effect-app/src/Layer.ts b/packages/effect-app/src/Layer.ts deleted file mode 100644 index 6f1c820b2..000000000 --- a/packages/effect-app/src/Layer.ts +++ /dev/null @@ -1,69 +0,0 @@ -import type * as Array from "effect/Array" -import * as Effect from "effect/Effect" -import { dual } from "effect/Function" -import * as Layer from "effect/Layer" -import type * as Scope from "effect/Scope" -import type * as Types from "effect/Types" -import type * as Context from "./Context.ts" -import { type EffectGenUtils } from "./utils/gen.ts" - -export * from "effect/Layer" - -type Make = DependenciesOpt & (MakeEff | MakeGenNo | MakeGen) - -type MakeEff = { - readonly make: Effect.Effect -} -type MakeGen = { - readonly make: () => Generator, S> -} -type MakeGenNo = { - readonly make: () => Generator -} -type MakeErr = Opts extends { make: () => any } ? EffectGenUtils.Error : never -type MakeContext = Opts extends { make: () => any } ? EffectGenUtils.Context : never - -type DependenciesOpt = { dependencies?: Array.NonEmptyReadonlyArray } -type Dependencies = { dependencies: Array.NonEmptyReadonlyArray } - -// Local replacements for removed Effect.Service.MakeDeps* types -type MakeDepsE = Opts extends { dependencies: ReadonlyArray> } ? E : never -type MakeDepsOut = Opts extends { dependencies: ReadonlyArray> } ? Out : never - -type PackedLayers = - & Layer.Layer< - I, - MakeErr | MakeDepsE, - Exclude, Scope.Scope | MakeDepsOut> - > - & { - withoutDependencies: Layer.Layer, Exclude, Scope.Scope>> - } - -type PackedOrUnpackedLayer = Opts extends Dependencies ? PackedLayers & {} - : Layer.Layer, MakeContext> - -export const make: { - ( - tag: Context.Service - ): , any, any>>( - options: Opts - ) => PackedOrUnpackedLayer - , any, any>>( - tag: Context.Service, - options: Opts - ): PackedOrUnpackedLayer -} = dual(2, (tag, options) => { - const effect = options.make[Symbol.toStringTag] === "GeneratorFunction" - ? Effect.fnUntraced(options.make)() - : options.make - const withoutDependencies = Layer.effect(tag, effect) - if (options.dependencies) { - return Object.assign( - withoutDependencies.pipe(Layer.provide(options.dependencies)), - { withoutDependencies } - ) - } else { - return withoutDependencies - } -}) diff --git a/packages/effect-app/src/Model.ts b/packages/effect-app/src/Model.ts deleted file mode 100644 index fdfa6b568..000000000 --- a/packages/effect-app/src/Model.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from "./Model/dsl.ts" -export * as Q from "./Model/query.ts" -export { makeRepo } from "./Model/Repository.ts" -export { repositoryDependency } from "./Model/Repository.ts" -export { type RegisteredRepository, RepositoryRegistry, RepositoryRegistryLive } from "./Model/Repository.ts" diff --git a/packages/effect-app/src/Model/Repository.ts b/packages/effect-app/src/Model/Repository.ts deleted file mode 100644 index f68b0b3e0..000000000 --- a/packages/effect-app/src/Model/Repository.ts +++ /dev/null @@ -1,7 +0,0 @@ -export { repositoryDependency } from "./Repository/dependency.ts" -export * from "./Repository/ext.ts" -export * from "./Repository/legacy.ts" -export { makeRepo } from "./Repository/makeRepo.ts" -export * from "./Repository/Registry.ts" -export * from "./Repository/service.ts" -export * from "./Repository/validation.ts" diff --git a/packages/effect-app/src/Model/Repository/Registry.ts b/packages/effect-app/src/Model/Repository/Registry.ts deleted file mode 100644 index 6fb1a675b..000000000 --- a/packages/effect-app/src/Model/Repository/Registry.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { DatabaseError } from "../../client/errors.ts" -import * as Context from "../../Context.ts" -import * as Effect from "../../Effect.ts" - -export interface RegisteredRepository { - readonly seedNamespace: (namespace: string) => Effect.Effect -} - -const make = Effect.sync(() => { - const repos = new Map() - return { - register(modelName: string, repo: RegisteredRepository) { - repos.set(modelName, repo) - }, - seedNamespace: (namespace: string) => - Effect.suspend(() => - Effect.forEach( - repos.values(), - (r) => r.seedNamespace(namespace), - { concurrency: "unbounded", discard: true } - ) - ), - get entries(): ReadonlyMap { - return repos - } - } -}) - -export class RepositoryRegistry extends Context.Opaque void - readonly seedNamespace: (namespace: string) => Effect.Effect - readonly entries: ReadonlyMap -}>()("effect-app/RepositoryRegistry", { make }) {} - -export const RepositoryRegistryLive = RepositoryRegistry.toLayer(RepositoryRegistry.make) diff --git a/packages/effect-app/src/Model/Repository/dependency.ts b/packages/effect-app/src/Model/Repository/dependency.ts deleted file mode 100644 index adc7e64d9..000000000 --- a/packages/effect-app/src/Model/Repository/dependency.ts +++ /dev/null @@ -1,32 +0,0 @@ -import * as S from "../../Schema.ts" -import * as SchemaAST from "../../SchemaAST.ts" - -const RepositoryDependencyAnnotation = "effect-app/Repository/dependency" - -/** Marks an encoded model field as an identity alias for repository invalidation. */ -export const repositoryDependency = (schema: Schema): Schema["Rebuild"] => - S.annotateEncoded({ [RepositoryDependencyAnnotation]: true })(schema) - -/** @internal */ -export const repositoryDependencyPaths = (schema: S.Schema): readonly string[] => { - const visit = (ast: SchemaAST.AST, path: readonly string[]): readonly string[] => { - const annotations = ast.checks?.at(-1)?.annotations ?? ast.annotations - if (annotations?.[RepositoryDependencyAnnotation] === true) return [path.join(".")] - if (SchemaAST.isDeclaration(ast)) return ast.typeParameters.flatMap((parameter) => visit(parameter, path)) - if (SchemaAST.isUnion(ast)) return ast.types.flatMap((member) => visit(member, path)) - if (SchemaAST.isObjects(ast)) { - return ast.propertySignatures.flatMap((property) => - typeof property.name === "string" ? visit(property.type, [...path, property.name]) : [] - ) - } - if (SchemaAST.isArrays(ast)) { - return [ - ...ast.elements.flatMap((element, index) => visit(element, [...path, String(index)])), - ...ast.rest.flatMap((element) => visit(element, [...path, "-1"])) - ] - } - return [] - } - - return [...new Set(visit(SchemaAST.toEncoded(schema.ast), []))] -} diff --git a/packages/effect-app/src/Model/Repository/ext.ts b/packages/effect-app/src/Model/Repository/ext.ts deleted file mode 100644 index d8fedfbef..000000000 --- a/packages/effect-app/src/Model/Repository/ext.ts +++ /dev/null @@ -1,374 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/no-unsafe-return */ -import * as Exit from "effect/Exit" -import * as Request from "effect/Request" -import * as RequestResolver from "effect/RequestResolver" -import * as Array from "../../Array.ts" -import type { NonEmptyArray } from "../../Array.ts" -import { type DatabaseError, type InvalidStateError, NotFoundError, type OptimisticConcurrencyException } from "../../client/errors.ts" -import * as Effect from "../../Effect.ts" -import * as Option from "../../Option.ts" -import { type FixEnv, type PureEnv, runTerm } from "../../Pure.ts" -import { AnyPureDSL } from "../dsl.ts" -import type { FieldValues } from "../filter/types.ts" -import type { Query, QueryEnd, QueryWhere } from "../query.ts" -import * as Q from "../query.ts" -import type { Repository } from "./service.ts" - -interface BatchOptions { - readonly batch?: true | number -} - -const asReadonlyArray = (itemOrItems: T | ReadonlyArray): ReadonlyArray => - globalThis.Array.isArray(itemOrItems) - ? itemOrItems as ReadonlyArray - : [itemOrItems as T] - -const getBatchSize = (batch?: true | number) => - batch === true - ? 100 - : typeof batch === "number" && Number.isFinite(batch) && batch > 0 - ? Math.floor(batch) - : undefined - -export const extendRepo = < - T, - Encoded extends FieldValues, - Evt, - ItemType extends string, - IdKey extends keyof T & keyof Encoded, - RSchema, - RPublish, - RProvided = never ->( - repo: Repository -) => { - const get = (id: T[IdKey]) => - repo.find(id).pipe( - Effect.flatMap(Option.match({ - onNone: () => Effect.fail(new NotFoundError({ type: repo.itemType, id })), - onSome: Effect.succeed - })) - ) - function saveManyWithPure_< - R, - A, - E, - S1 extends T, - S2 extends T - >( - items: Iterable, - pure: Effect.Effect> - ) { - return saveAllWithEffectInt( - runTerm(pure, [...items]) - ) - } - - function saveWithPure_< - R, - A, - E, - S1 extends T, - S2 extends T - >( - item: S1, - pure: Effect.Effect> - ) { - return saveAllWithEffectInt( - runTerm(pure, item) - .pipe(Effect - .map(([item, events, a]) => [[item], events, a])) - ) - } - - function saveAllWithEffectInt< - P extends T, - R, - E, - A - >( - gen: Effect.Effect, Iterable, A], E, R> - ): Effect.Effect< - A, - E | InvalidStateError | OptimisticConcurrencyException | DatabaseError, - R | RSchema | RPublish - > { - return Effect.flatMap(gen, ([items, events, a]) => repo.saveAndPublish(items, events).pipe(Effect.map(() => a))) - } - - function saveManyWithPureBatched_< - R, - A, - E, - S1 extends T, - S2 extends T - >( - items: Iterable, - pure: Effect.Effect>, - batchSize = 100 - ) { - return Effect.forEach( - Array.chunksOf(items, batchSize), - (batch) => - saveAllWithEffectInt( - runTerm(pure, batch) - ) - ) - } - - type PureStoreError = InvalidStateError | OptimisticConcurrencyException | DatabaseError - - const queryAndSavePure: { - ( - q: ( - q: Query - ) => QueryEnd, - pure: Effect.Effect> - ): Effect.Effect< - A, - PureStoreError | NotFoundError | E2, - | RSchema - | RPublish - | Exclude - }> - > - ( - q: ( - q: Query - ) => - | Query - | QueryWhere - | QueryEnd, - pure: Effect.Effect> - ): Effect.Effect< - A, - PureStoreError | E2, - | RSchema - | RPublish - | Exclude - }> - > - ( - q: ( - q: Query - ) => - | Query - | QueryWhere - | QueryEnd, - pure: Effect.Effect>, - batch: "batched" | number - ): Effect.Effect< - A[], - PureStoreError | E2, - | RSchema - | RPublish - | Exclude - }> - > - } = ((q: any, pure: any, batch?: "batched" | number) => - // Overload dispatch: query returns T | T[]; pure helpers are generic on item shape. - // Runtime path is query → pure term → saveAndPublish (which raises DatabaseError). - repo.query(q).pipe( - Effect.andThen((_) => - Array.isArray(_) - ? batch === undefined - ? saveManyWithPure_(_ as T[], pure) - : saveManyWithPureBatched_(_ as T[], pure, batch === "batched" ? 100 : batch) - : saveWithPure_(_ as T, pure) - ) - )) as typeof queryAndSavePure - - const saveManyWithPure: { - ( - items: Iterable, - pure: Effect.Effect> - ): Effect.Effect< - A, - PureStoreError | E, - | RSchema - | RPublish - | Exclude - }> - > - ( - items: Iterable, - pure: Effect.Effect>, - batch: "batched" | number - ): Effect.Effect< - A[], - PureStoreError | E, - | RSchema - | RPublish - | Exclude - }> - > - } = ((items: Iterable, pure: any, batch?: "batched" | number) => - batch - ? Effect.forEach( - Array.chunksOf([...items], batch === "batched" ? 100 : batch), - (batchItems) => - saveAllWithEffectInt( - runTerm(pure, batchItems as any) - ) - ) - : saveAllWithEffectInt( - runTerm(pure, [...items] as any) - )) as typeof saveManyWithPure - - const byIdAndSaveWithPure: { - ( - id: T[IdKey], - pure: Effect.Effect> - ): Effect.Effect< - A, - PureStoreError | NotFoundError | E, - | RSchema - | RPublish - | Exclude - }> - > - } = (id, pure) => get(id).pipe(Effect.flatMap((item) => saveWithPure_(item, pure))) - - // query can raise DatabaseError; NotFound is completed per-entry. Dual package - // round-trips may still surface other store errors via failCause — keep channel honest. - type Req = - & Request.Request | DatabaseError> - & { _tag: `Get${ItemType}`; id: T[IdKey] } - const _request = Request.tagged(`Get${repo.itemType}`) - - const requestResolver = RequestResolver - .make(( - entries: NonEmptyArray>, - _key: unknown - ) => - (repo.query(Q.where(repo.idKey as any, "in" as any, entries.map((_) => _.request.id)) as any) as Effect.Effect< - readonly T[], - DatabaseError - >) - .pipe( - Effect.andThen((items) => - Effect.forEach(entries, (entry) => - Request.complete( - Array - .findFirst(items, (_) => _[repo.idKey] === entry.request.id) - .pipe(Option.match({ - onNone: () => Exit.fail(new NotFoundError({ type: repo.itemType, id: entry.request.id })), - onSome: Exit.succeed - })) - )(entry), { discard: true }) - ), - Effect - .catchCause((cause) => - Effect.forEach(entries, (entry) => Request.complete(Exit.failCause(cause))(entry), { discard: true }) - ) - ) - ) - .pipe( - RequestResolver.batchN(20) - ) - - const exts = { - request: (id: T[IdKey]) => Effect.request(_request({ id }), requestResolver), - get, - log: (evt: Evt) => AnyPureDSL.log(evt), - /** - * Enables chunked writes for large batches via `options.batch`. - * Note: batching breaks transactional properties because chunks are saved independently. - */ - save: (itemOrItems: T | ReadonlyArray, options?: BatchOptions) => { - const items = asReadonlyArray(itemOrItems) - if (!Array.isReadonlyArrayNonEmpty(items)) { - return Effect.void - } - const batchSize = getBatchSize(options?.batch) - if (batchSize === undefined) { - return repo.saveAndPublish(items) - } - return Effect.forEach( - Array.chunksOf(items, batchSize), - (batch) => repo.saveAndPublish(batch), - { discard: true } - ) - }, - saveWithEvents: (events: Iterable) => (...items: NonEmptyArray) => repo.saveAndPublish(items, events), - /** - * Enables chunked deletes for large batches via `options.batch`. - * Note: batching breaks transactional properties because chunks are removed independently. - */ - remove: (itemOrItems: T | ReadonlyArray, options?: BatchOptions) => { - const items = asReadonlyArray(itemOrItems) - if (!Array.isReadonlyArrayNonEmpty(items)) { - return Effect.void as Effect.Effect - } - const batchSize = getBatchSize(options?.batch) - if (batchSize === undefined) { - return repo.removeAndPublish(items) - } - return Effect.forEach( - Array.chunksOf(items, batchSize), - (batch) => repo.removeAndPublish(batch), - { discard: true } - ) - }, - /** - * Enables chunked deletes for large batches via `options.batch`. - * Note: batching breaks transactional properties because chunks are removed independently. - */ - removeById: (idOrIds: T[IdKey] | ReadonlyArray, options?: BatchOptions) => { - const ids = asReadonlyArray(idOrIds) - if (!Array.isReadonlyArrayNonEmpty(ids)) { - return Effect.void as Effect.Effect - } - const batchSize = getBatchSize(options?.batch) - if (batchSize === undefined) { - return repo.removeById(ids) - } - return Effect.forEach( - Array.chunksOf(ids, batchSize), - (batch) => repo.removeById(batch), - { discard: true } - ) - }, - queryAndSavePure, - saveManyWithPure, - byIdAndSaveWithPure, - saveWithPure: < - R, - A, - E, - S1 extends T, - S2 extends T - >( - item: S1, - pure: Effect.Effect> - ) => - saveAllWithEffectInt( - runTerm(pure, item) - .pipe(Effect.map(([item, events, a]) => [[item], events, a])) - ) - } - - return { - ...repo, - ...exts - } as Repository & typeof exts -} - -// eslint-disable-next-line @typescript-eslint/no-empty-object-type -export interface ExtendedRepository< - T, - Encoded extends FieldValues, - Evt, - ItemType extends string, - IdKey extends keyof T & keyof Encoded, - RSchema, - RPublish, - RProvided = never -> extends ReturnType> {} diff --git a/packages/effect-app/src/Model/Repository/internal/internal.ts b/packages/effect-app/src/Model/Repository/internal/internal.ts deleted file mode 100644 index 0bb5cba8b..000000000 --- a/packages/effect-app/src/Model/Repository/internal/internal.ts +++ /dev/null @@ -1,950 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -import * as Equivalence from "effect/Equivalence" -import { flow, pipe } from "effect/Function" -import * as HashMap from "effect/HashMap" -import * as HashSet from "effect/HashSet" -import * as Metric from "effect/Metric" -import * as Pipeable from "effect/Pipeable" -import * as Ref from "effect/Ref" -import * as Result from "effect/Result" -import type * as Scope from "effect/Scope" -import * as Unify from "effect/Unify" -import * as Array from "../../../Array.ts" -import type { NonEmptyReadonlyArray } from "../../../Array.ts" -import { toNonEmptyArray } from "../../../Array.ts" -import * as Chunk from "../../../Chunk.ts" -import { NotFoundError } from "../../../client/errors.ts" -import * as Context from "../../../Context.ts" -import * as DataDependencies from "../../../DataDependencies.ts" -import * as Effect from "../../../Effect.ts" -import { flatMapOption } from "../../../Effect.ts" -import * as Option from "../../../Option.ts" -import * as S from "../../../Schema.ts" -import { type Codec, NonNegativeInt } from "../../../Schema.ts" -import * as SchemaAST from "../../../SchemaAST.ts" -import { setupRequestContextFromCurrent } from "../../../setupRequest.ts" -import { type FilterArgs, getContextMap, type PersistenceModelType, type StoreConfig, storeId, StoreMaker } from "../../../Store.ts" -import type { FilterResult } from "../../filter/filterApi.ts" -import type { FieldValues } from "../../filter/types.ts" -import * as Q from "../../query.ts" -import { repositoryDependencyPaths } from "../dependency.ts" -import type { ChangeFeed, ChangeFeedEvent, Repository } from "../service.ts" -import { ValidationError, ValidationResult } from "../validation.ts" - -const dedupe = Array.dedupeWith(Equivalence.String) - -// ms buckets: dense under 100ms (common path), then mid-tail and multi-second stalls. -// Rare 0.5–1s+ encodes (fat aggregates) must not collapse into a single overflow bin. -const schemaDurationBoundaries = [ - 0.1, - 0.5, - 1, - 2, - 5, - 10, - 25, - 50, - 100, - 150, - 200, - 300, - 500, - 750, - 1_000, - 1_500, - 2_000, - 5_000 -] -// Event-loop-relevant stall floor: encodes/decodes above this are rare but block Node. -const SCHEMA_SLOW_MS = 100 -const schemaDecodeDuration = Metric.histogram("app.schema.decode.duration", { boundaries: schemaDurationBoundaries }) -const schemaEncodeDuration = Metric.histogram("app.schema.encode.duration", { boundaries: schemaDurationBoundaries }) -const schemaItemCount = Metric.histogram("app.schema.item_count", { - boundaries: [0, 1, 2, 5, 10, 25, 50, 100, 250, 500, 1_000, 5_000] -}) -const schemaSlow = Metric.counter("app.schema.slow", { - description: `Repository schema encode/decode slower than ${SCHEMA_SLOW_MS}ms`, - incremental: true -}) - -const entityStateFromItems = (items: readonly unknown[]): string | undefined => { - const first = items[0] - if (first === null || typeof first !== "object" || !("_tag" in first)) return undefined - const tag = (first as { readonly _tag: unknown })._tag - return typeof tag === "string" ? tag : undefined -} - -const timeSchema = ( - operation: "decode" | "encode", - entity: string, - queryMode: "aggregate" | "collect" | "project" | "transform" | undefined, - itemCount: number, - entityState?: string -) => -(self: Effect.Effect): Effect.Effect => - Effect.clockWith((clock) => { - const startedAt = clock.currentTimeNanosUnsafe() - const attributes = { - "app.entity": entity, - "app.schema.operation": operation, - ...(queryMode !== undefined && { "app.query.mode": queryMode }), - ...(entityState !== undefined && { "app.entity.state": entityState }) - } - return Effect.onExit(self, () => { - const durationMs = Number(clock.currentTimeNanosUnsafe() - startedAt) / 1_000_000 - const slow = durationMs >= SCHEMA_SLOW_MS - return Effect.all([ - Effect.annotateCurrentSpan({ - [`app.schema.${operation}.duration_ms`]: durationMs, - "app.schema.item_count": itemCount, - "app.schema.slow": slow, - ...(queryMode !== undefined && { "app.query.mode": queryMode }), - ...(entityState !== undefined && { "app.entity.state": entityState }) - }), - Metric.update( - Metric.withAttributes( - operation === "decode" ? schemaDecodeDuration : schemaEncodeDuration, - attributes - ), - durationMs - ), - Metric.update(Metric.withAttributes(schemaItemCount, attributes), itemCount), - ...(slow - ? [Metric.update(Metric.withAttributes(schemaSlow, attributes), 1)] as const - : []) - ], { discard: true }) - }) - }) - -/** - * A base implementation to create a repository. - */ -export function makeRepoInternal< - Evt = never ->() { - return < - ItemType extends string, - R, - Encoded extends FieldValues, - T, - IdKey extends keyof T & keyof Encoded - >( - name: ItemType, - schema: S.Codec, - mapFrom: (pm: Encoded) => Encoded, - mapTo: (e: Encoded, etag: string | undefined) => PersistenceModelType, - idKey: IdKey - ) => { - type PM = PersistenceModelType - function mapToPersistenceModel( - e: Encoded, - getEtag: (id: string) => string | undefined - ): PM { - return mapTo(e, getEtag(e[idKey])) - } - - function mapReverse( - { _etag, ...e }: PM, - setEtag: (id: string, eTag: string | undefined) => void - ): Encoded { - setEtag((e as any)[idKey], _etag) - return mapFrom(e as unknown as Encoded) - } - - const mkStore = makeStore()(name, schema, mapTo, idKey) - - function make( - args: [Evt] extends [never] ? { - schemaContext?: Context.Context - makeInitial?: Effect.Effect | undefined - dependencyIds?: (item: T) => NonEmptyReadonlyArray - additionalWriteDependencies?: (item: T) => ReadonlyArray - config?: Omit, "partitionValue"> & { - partitionValue?: (e?: Encoded) => string - } - } - : { - schemaContext?: Context.Context - publishEvents: (evt: NonEmptyReadonlyArray) => Effect.Effect - makeInitial?: Effect.Effect | undefined - dependencyIds?: (item: T) => NonEmptyReadonlyArray - additionalWriteDependencies?: (item: T) => ReadonlyArray - config?: Omit, "partitionValue"> & { - partitionValue?: (e?: Encoded) => string - } - } - ) { - return Effect - .gen(function*() { - const rctx: Context.Context = args.schemaContext ?? Context.empty() as any - const provideRctx = Effect.provide(rctx) - const encodeMany = (items: readonly T[]) => - S.encodeEffect(S.Array(schema))(items).pipe( - provideRctx, - timeSchema("encode", name, undefined, items.length, entityStateFromItems(items)) - ) - const decode = flow(S.decodeEffectConcurrently(schema), provideRctx) - const decodeMany = flow( - S.decodeEffectConcurrently(S.Array(schema)), - provideRctx - ) - - const store = yield* mkStore(args.makeInitial, args.config) - const dependencyPaths = repositoryDependencyPaths(schema) - const recordRead = DataDependencies.readRepo(name) - const entityDependency = (ids: NonEmptyReadonlyArray) => - DataDependencies.repo(name, [String(ids[0]), ...ids.slice(1).map(String)]) - const valuesAtPath = (value: unknown, path: string): readonly unknown[] => { - if (path.length === 0) return [value] - const [head, ...tail] = path.split(".") - if (head === undefined) return [value] - if (head === "-1") { - return globalThis.Array.isArray(value) - ? value.flatMap((item) => valuesAtPath(item, tail.join("."))) - : [] - } - return typeof value === "object" && value !== null - ? valuesAtPath((value as Record)[head], tail.join(".")) - : [] - } - const dependencyIds = (item: T): NonEmptyReadonlyArray => { - const configured = dependencyPaths - .flatMap((path) => valuesAtPath(item, String(path))) - .filter((value): value is string => typeof value === "string") ?? [] - const ids = args.dependencyIds?.(item) ?? [String(item[idKey]), ...configured] - return [ids[0], ...ids.slice(1)] - } - const itemDependencies = (item: T) => { - const ids = dependencyIds(item) - return [ - DataDependencies.repo(name, ids), - ...(args.additionalWriteDependencies?.(item) ?? []) - ] - } - const queryDependencyIds = (filter: readonly FilterResult[] | undefined): readonly string[] => { - if (!filter) return [] - const paths = new Set([String(idKey), ...dependencyPaths]) - const visit = (items: readonly FilterResult[]): readonly string[] => { - if (items.some((item) => item.t === "or" || item.t === "or-scope")) return [] - return items.flatMap((item) => { - if ("result" in item) return visit(item.result) - if (!paths.has(item.path)) return [] - const value: unknown = item.value - if (item.op === "eq" && typeof value === "string") return [value] - if (item.op === "in" && globalThis.Array.isArray(value)) { - return value.filter((entry): entry is string => typeof entry === "string") - } - return [] - }) - } - return [...new Set(visit(filter))] - } - const recordEntityRead = (id: T[IdKey]) => DataDependencies.read(entityDependency([id])) - const recordEntityWrite = (ids: NonEmptyReadonlyArray) => - DataDependencies.write(entityDependency(ids)) - const recordItemWrite = (items: NonEmptyReadonlyArray) => - Effect.forEach( - DataDependencies.merge(new Set(items.flatMap(itemDependencies))), - DataDependencies.write, - { discard: true } - ) - const cms = Effect.map(getContextMap.pipe(Effect.orDie), (_) => ({ - get: (id: string) => _.get(`${name}.${id}`), - set: (id: string, etag: string | undefined) => _.set(`${name}.${id}`, etag) - })) - - const pub = "publishEvents" in args - ? args.publishEvents - : () => Effect.void - - type ChangeFeedHandler = (evt: ChangeFeedEvent) => Effect.Effect - const changeFeedByNamespace = yield* Ref.make(HashMap.empty>()) - const changeFeedWildcard = yield* Ref.make(HashSet.empty()) - // clear all handlers when the repository's scope closes - yield* Effect.addFinalizer(() => - Effect.all([ - Ref.set(changeFeedByNamespace, HashMap.empty>()), - Ref.set(changeFeedWildcard, HashSet.empty()) - ], { discard: true }) - ) - const changeFeed: ChangeFeed = { - publish: ([items, op]) => - Effect.gen(function*() { - const ns = yield* storeId - const evt: ChangeFeedEvent = [items, op, ns] - const map = yield* Ref.get(changeFeedByNamespace) - const wild = yield* Ref.get(changeFeedWildcard) - const targeted = Option.getOrElse(HashMap.get(map, ns), () => HashSet.empty()) - const all = HashSet.union(targeted, wild) - yield* Effect.forEach(all, (h) => h(evt), { concurrency: "unbounded", discard: true }) - }), - subscribe: (handler, options) => { - const ns = options?.namespace - if (ns === undefined) { - return Effect.acquireRelease( - Ref.update(changeFeedWildcard, HashSet.add(handler)), - () => Ref.update(changeFeedWildcard, HashSet.remove(handler)) - ) - } - return Effect.acquireRelease( - Ref.update(changeFeedByNamespace, (m) => { - const cur = Option.getOrElse(HashMap.get(m, ns), () => HashSet.empty()) - return HashMap.set(m, ns, HashSet.add(cur, handler)) - }), - () => - Ref.update(changeFeedByNamespace, (m) => { - const cur = Option.getOrElse(HashMap.get(m, ns), () => HashSet.empty()) - const next = HashSet.remove(cur, handler) - return HashSet.size(next) === 0 ? HashMap.remove(m, ns) : HashMap.set(m, ns, next) - }) - ) - } - } - - const allE = cms - .pipe(Effect.flatMap((cm) => Effect.map(store.all, (_) => _.map((_) => mapReverse(_, cm.set))))) - - const all = Effect - .flatMap( - allE, - (items) => - decodeMany(items).pipe( - Effect.orDie, - timeSchema("decode", name, undefined, items.length) - ) - ) - .pipe( - Effect.tap(() => recordRead), - Effect.map((_) => _ as T[]), - Effect.withSpan("Repository.all", { - kind: "client", - attributes: { "app.entity": name } - }, { captureStackTrace: false }) - ) - - const fieldsSchema = schema as unknown as { fields: any } - // assumes the id field never needs a service... - const i = ("fields" in fieldsSchema ? S.Struct(fieldsSchema["fields"]) as unknown as typeof schema : schema) - .pipe((_) => { - let ast = _.ast - if (ast._tag === "Declaration") ast = ast.typeParameters[0]! - - const pickIdFromAst = (a: SchemaAST.AST) => { - // Unwrap Declaration (e.g. TaggedClass) to get the underlying Objects AST - let inner = a - if (inner._tag === "Declaration") inner = inner.typeParameters[0]! - // Pick from the original AST to preserve the full encoding chain (e.g. decodeTo transformations). - // Using toEncoded would lose transformation info needed to encode Type -> Encoded. - if (SchemaAST.isObjects(inner)) { - const field = inner.propertySignatures.find((_) => _.name === idKey) - if (field) { - return S.Struct({ [idKey]: S.make(field.type) }) as unknown as Codec - } - } - return S.make(a) as unknown as Codec - } - - return ast._tag === "Union" - // we need to get the Objects (TypeLiteral), in case of class it has encoding chain... - ? S.Union( - ast.types.map((_) => pickIdFromAst(_)) - ) - : pickIdFromAst(ast) - }) - const encodeId = flow(S.encodeEffect(i), provideRctx) - const encodeIdOnly = (id: string) => - encodeId({ [idKey]: id } as any).pipe( - Effect.map((_: Record) => _[idKey as string] as Encoded[IdKey]) - ) - const findEId = Effect.fnUntraced(function*(id: Encoded[IdKey]) { - yield* Effect.annotateCurrentSpan({ "app.entity.id": id }) - - return yield* Effect.flatMap( - store.find(id), - (item) => - Effect.gen(function*() { - const { set } = yield* cms - return item.pipe(Option.map((_) => mapReverse(_, set))) - }) - ) - }) - // TODO: select the particular field, instead of as struct - const findE = Effect.fnUntraced(function*(id: T[IdKey]) { - yield* Effect.annotateCurrentSpan({ "app.entity.id": id }) - - return yield* pipe( - encodeId({ [idKey]: id } as any), - Effect.orDie, - Effect.map((_) => (_ as any)[idKey]), - Effect.flatMap(findEId) - ) - }) - - const loadExistingItems = (ids: ReadonlyArray) => - Effect - .forEach( - ids, - (id) => - findE(id).pipe( - Effect.flatMap(Option.match({ - onNone: () => Effect.succeed(Option.none()), - onSome: (encoded) => decode(encoded).pipe(Effect.orDie, Effect.map(Option.some)) - })) - ) - ) - .pipe(Effect.map(Array.getSomes)) - - const find = Effect.fn("Repository.find", { - kind: "client", - attributes: { "app.entity": name } - })(function*(id: T[IdKey]) { - yield* recordEntityRead(id) - yield* Effect.annotateCurrentSpan({ "app.entity.id": id }) - return yield* flatMapOption(findE(id), (_) => Effect.orDie(decode(_))) - }) - - const saveAllE = (a: Iterable) => - flatMapOption( - Effect - .sync(() => toNonEmptyArray([...a])), - (a) => - Effect.gen(function*() { - const { get, set } = yield* cms - const items = a.map((_) => mapToPersistenceModel(_, get)) - const ret = yield* store.batchSet(items) - ret.forEach((_) => set(_[idKey], _._etag)) - }) - ) - .pipe(Effect.asVoid) - - const saveAll = (a: Iterable) => - encodeMany(Array.fromIterable(a)) - .pipe( - Effect.orDie, - Effect.andThen(saveAllE) - ) - - const saveAndPublish = Effect.fn("Repository.saveAndPublish", { attributes: { "app.entity": name } })( - function*(items: Iterable, events: Iterable = []) { - const it = Chunk.fromIterable(items) - if (Chunk.isNonEmpty(it)) { - const values = Chunk.toReadonlyArray(it) - const previous = args.additionalWriteDependencies || args.dependencyIds || dependencyPaths.length > 0 - ? yield* loadExistingItems(values.map((item) => item[idKey])) - : [] - yield* recordItemWrite([values[0], ...values.slice(1), ...previous]) - } - const evts = [...events] - yield* Effect.annotateCurrentSpan({ - "app.entity.ids": Chunk.map(it, (_) => _[idKey]), - "app.event.count": evts.length - }) - return yield* saveAll(it) - .pipe( - Effect.andThen(Effect.sync(() => toNonEmptyArray(evts))), - // TODO: for full consistency the events should be stored within the same database transaction, and then picked up. - (_) => flatMapOption(_, pub), - Effect.andThen(changeFeed.publish([Chunk.toArray(it), "save"] as [T[], "save" | "remove"])), - Effect.asVoid - ) - } - ) - - const removeAndPublish = Effect.fn("Repository.removeAndPublish", { attributes: { "app.entity": name } })( - function*(a: Iterable, events: Iterable = []) { - const { set } = yield* cms - const it = [...a] - if (Array.isReadonlyArrayNonEmpty(it)) { - yield* recordItemWrite(it) - } - const evts = [...events] - yield* Effect.annotateCurrentSpan({ - "app.entity.ids": it.map((_) => _[idKey]), - "app.event.count": evts.length - }) - const items = yield* encodeMany(it).pipe(Effect.orDie) - if (Array.isReadonlyArrayNonEmpty(items)) { - yield* store.batchRemove( - items.map((_) => (_[idKey])), - args.config?.partitionValue?.(items[0]) - ) - for (const e of items) { - set(e[idKey], undefined) - } - yield* Effect - .sync(() => toNonEmptyArray(evts)) - // TODO: for full consistency the events should be stored within the same database transaction, and then picked up. - .pipe((_) => flatMapOption(_, pub)) - - yield* changeFeed.publish([it, "remove"] as [T[], "save" | "remove"]) - } - } - ) - - const removeById = Effect.fn("Repository.removeById", { attributes: { "app.entity": name } })( - function*(idOrIds: T[IdKey] | ReadonlyArray) { - const ids = globalThis.Array.isArray(idOrIds) - ? idOrIds as readonly T[IdKey][] - : [idOrIds as T[IdKey]] - if (!Array.isReadonlyArrayNonEmpty(ids)) { - return - } - yield* recordEntityWrite(ids) - if (args.additionalWriteDependencies || args.dependencyIds || dependencyPaths.length > 0) { - const previous = yield* loadExistingItems(ids) - if (Array.isReadonlyArrayNonEmpty(previous)) yield* recordItemWrite(previous) - } - const { set } = yield* cms - const eids = yield* Effect.forEach(ids, (_) => encodeIdOnly(_ as any)).pipe(Effect.orDie) - yield* Effect.annotateCurrentSpan({ "app.entity.ids": eids }) - yield* store.batchRemove(eids) - for (const id of eids) { - set(id, undefined) - } - yield* changeFeed.publish([[], "remove"] as [T[], "save" | "remove"]) - } - ) - - const parseMany = Effect.fnUntraced( - function*(items: readonly PM[]) { - const cm = yield* cms - return yield* decodeMany(items.map((_) => mapReverse(_, cm.set))).pipe( - Effect.orDie, - timeSchema("decode", name, "transform", items.length) - ) - } - ) - const decodeManyCache = new WeakMap< - S.Codec, - (i: readonly any[]) => Effect.Effect - >() - const getDecodeMany = (s: S.Codec) => { - let dec = decodeManyCache.get(s) - if (!dec) { - dec = S.decodeEffectConcurrently(S.Array(s)) - decodeManyCache.set(s, dec) - } - return dec - } - const parseMany2 = Effect.fnUntraced( - function*(items: readonly PM[], schema: S.Codec) { - const cm = yield* cms - return yield* getDecodeMany(schema)(items.map((_) => mapReverse(_, cm.set))).pipe( - Effect.orDie, - timeSchema("decode", name, "transform", items.length) - ) - } - ) - const filter = (args: FilterArgs) => - store - .filter( - // always enforce id and _etag because they are system fields, required for etag tracking etc - { - ...args, - select: args.select - ? dedupe([...args.select, idKey, "_etag" as any]) - : undefined - } as typeof args - ) - .pipe( - Effect.tap((items) => - Effect.map(cms, ({ set }) => items.forEach((_) => set((_ as Encoded)[idKey], (_ as PM)._etag))) - ) - ) - - // TODO: For raw we should use S.from, and drop the R... - const query: { - ( - q: Q.QueryProjection - ): Effect.Effect> - ( - q: Q.QAll, NoInfer, A, R> - ): Effect.Effect> - } = ((q: Q.QAll) => { - const a = Q.toFilter(q, schema) - const scopedIds = queryDependencyIds(a.filter) - const recordQueryRead = Array.isReadonlyArrayNonEmpty(scopedIds) - ? DataDependencies.read(DataDependencies.repo(name, scopedIds)) - : recordRead - // Mode dispatch — see `Q.project` JSDoc for the contract: - // aggregate: GROUP BY + aggregate functions at DB level; decode raw rows with schema; SchemaError surfaces. - // project : decode raw encoded rows with schema; no PM reverse-mapping; SchemaError surfaces. - // collect : same as project, but schema yields Option and None rows are dropped. - // transform: PM reverse-map (re-inject _etag/PM state from cms cache) then decode; orDie. - const eff = a.mode === "aggregate" - ? store - // `a.select` contains `{ key, aggregate }` items not expressible in FilterFunc's - // `U extends keyof Encoded` generic. Cast is unavoidable until FilterFunc supports aggregate mode. - .filter(a as any) - // Decode raw aggregate rows directly — no PM reverse-mapping, no id/_etag needed. - .pipe( - Effect.andThen( - (items) => - S.decodeEffectConcurrently(S.Array(S.toCodecJson(a.schema ?? schema)))(items).pipe( - provideRctx, - timeSchema("decode", name, "aggregate", items.length) - ) - ) - ) - : a.mode === "project" - ? filter(a) - // TODO: mapFrom but need to support per field and dependencies - .pipe( - Effect.andThen( - (items) => - S.decodeEffectConcurrently(S.Array(S.toCodecJson(a.schema ?? schema)))(items).pipe( - provideRctx, - timeSchema("decode", name, "project", items.length) - ) - ) - ) - : a.mode === "collect" - ? filter(a) - // TODO: mapFrom but need to support per field and dependencies - .pipe( - Effect.flatMap((items) => - S.decodeEffectConcurrently(S.Array(S.toCodecJson(a.schema)))(items).pipe( - Effect.map(Array.getSomes), - provideRctx, - timeSchema("decode", name, "collect", items.length) - ) - ) - ) - : Effect.flatMap( - filter(a), - (_) => - Unify.unify( - a.schema - // TODO: partial may not match? - ? parseMany2(_ as any, a.schema as any) - : parseMany(_ as any) - ) - ) - return pipe( - a.ttype === "one" - ? Effect.flatMap( - eff, - flow( - Array.head, - Option.match({ - onNone: () => Effect.fail(new NotFoundError({ id: "query", /* TODO */ type: name })), - onSome: Effect.succeed - }) - ) - ) - : a.ttype === "count" - ? Effect - .map(eff, (_) => NonNegativeInt(_.length)) - .pipe(Effect.catchTag("SchemaError", (e) => Effect.die(e))) - : eff, - Effect.tap((r) => - Effect.annotateCurrentSpan({ - "app.query.ttype": a.ttype, - "app.query.mode": a.mode, - "db.response.returned_rows": Array.isArray(r) ? r.length : 1 - }) - ), - Effect.tap(() => recordQueryRead), - Effect.withSpan("Repository.query", { - kind: "client", - attributes: { "app.entity": name } - }, { captureStackTrace: false }) - ) - }) as any - - const validateSample = Effect.fn("Repository.validateSample", { attributes: { "app.entity": name } })( - function*(options?: { - percentage?: number - maxItems?: number - }) { - const percentage = options?.percentage ?? 0.1 // default 10% - const maxItems = options?.maxItems - - // 1. get all IDs with projection (bypasses main schema decode) - const allIds = yield* store - .filter({ - t: null as unknown as Encoded, - select: [idKey as keyof Encoded] - }) - .pipe(Effect.withSpan("Repository.filter", { - kind: "client", - attributes: { "app.entity": name } - }, { captureStackTrace: false })) - - // 2. random subset - const shuffled = [...allIds].sort(() => Math.random() - 0.5) - const sampleSize = Math.min( - maxItems ?? Infinity, - Math.ceil(allIds.length * percentage) - ) - const sample = shuffled.slice(0, sampleSize) - - // 3. validate each item - const errors: ValidationError[] = [] - - for (const item of sample) { - const id = item[idKey] - const rawResult = yield* store.find(id).pipe( - Effect.withSpan("Repository.find", { - kind: "client", - attributes: { "app.entity": name, "app.entity.id": id } - }, { captureStackTrace: false }) - ) - - if (Option.isNone(rawResult)) continue - - const rawData = rawResult.value as Encoded - const jitMResult = mapFrom(rawData) // apply jitM - - const decodeResult = yield* S.decodeEffectConcurrently(schema)(jitMResult).pipe( - Effect.result, - provideRctx - ) - - if (Result.isFailure(decodeResult)) { - errors.push( - ValidationError.make({ - id, - rawData, - jitMResult, - error: decodeResult.failure - }) - ) - } - } - - return ValidationResult.make({ - total: NonNegativeInt(allIds.length), - sampled: NonNegativeInt(sample.length), - valid: NonNegativeInt(sample.length - errors.length), - errors - }) - } - ) - - const r = { - changeFeed, - itemType: name, - idKey, - find, - all, - saveAndPublish, - removeAndPublish, - removeById, - seedNamespace: (namespace: string) => store.seedNamespace(namespace), - validateSample, - queryRaw(schema: S.Codec, q: Q.RawQuery) { - return store.queryRaw(q).pipe( - Effect.flatMap((items) => - S.decodeEffectConcurrently(S.Array(S.toCodecJson(schema)))(items as readonly S.Json[]).pipe( - timeSchema("decode", name, undefined, items.length) - ) - ), - Effect.tap(() => recordRead), - Effect.withSpan("Repository.queryRaw", { - kind: "client", - attributes: { "app.entity": name } - }, { captureStackTrace: false }) - ) - }, - query(q: any) { - // eslint-disable-next-line prefer-rest-params - return query(typeof q === "function" ? Pipeable.pipeArguments(Q.make(), arguments) : q) as any - }, - /** - * @internal - */ - mapped: (schema: S.Codec) => { - const dec = S.decodeEffectConcurrently(schema) - const encMany = S.encodeEffect(S.Array(schema)) - const decMany = S.decodeEffectConcurrently(S.Array(schema)) - const spanAttrs = { kind: "client" as const, attributes: { "app.entity": name } } - return { - all: allE.pipe( - Effect.flatMap((items) => - decMany(items).pipe( - timeSchema("decode", name, undefined, items.length) - ) - ), - Effect.tap(() => recordRead), - Effect.map((_) => _ as any[]), - Effect.withSpan("Repository.mapped.all", spanAttrs, { captureStackTrace: false }) - ), - find: (id: T[IdKey]) => - flatMapOption(findE(id), dec).pipe( - Effect.tap(() => recordEntityRead(id)), - Effect.withSpan("Repository.mapped.find", { - ...spanAttrs, - attributes: { ...spanAttrs.attributes, "app.entity.id": id } - }, { captureStackTrace: false }) - ), - // query: (q: any) => { - // const a = Q.toFilter(q) - - // return filter(a) - // .pipe( - // Effect.flatMap(decMany), - // Effect.map((_) => _ as any[]), - // Effect.withSpan("Repository.mapped.query [effect-app/infra]", { - // captureStackTrace: false, - // attributes: { - // "repository.model_name": name, - // query: { ...a, schema: a.schema ? "__SCHEMA__" : a.schema, filter: a.filter.build() } - // } - // }) - // ) - // }, - save: (...xes: any[]) => - Effect - .flatMap( - encMany(xes).pipe( - timeSchema("encode", name, undefined, xes.length, entityStateFromItems(xes)) - ), - (_) => saveAllE(_) - ) - .pipe( - Effect.tap(() => - Array.isReadonlyArrayNonEmpty(xes) - ? recordEntityWrite([xes[0][idKey], ...xes.slice(1).map((_) => _[idKey])]) - : Effect.void - ), - Effect.withSpan("Repository.mapped.save", spanAttrs, { captureStackTrace: false }) - ) - } - } - } - return r as Repository, RPublish, RCtx> - }) - .pipe(Effect - // .withSpan("Repository.make [effect-app/infra]", { attributes: { "repository.model_name": name } }) - .withLogSpan("Repository.make: " + name)) - } - - return { - make, - Q: Q.make() - } - } -} - -const pluralize = (s: string) => - s.endsWith("s") - ? s + "es" - : s.endsWith("y") - ? s.substring(0, s.length - 1) + "ies" - : s + "s" - -export function makeStore() { - return < - ItemType extends string, - R, - E, - T, - IdKey extends keyof Encoded - >( - name: ItemType, - schema: S.Codec, - mapTo: (e: E, etag: string | undefined) => Encoded, - idKey: IdKey - ) => { - function makeStore( - makeInitial?: Effect.Effect, - config?: Omit, "partitionValue"> & { - partitionValue?: (e?: Encoded) => string - } - ) { - function encodeToEncoded() { - const getEtag = () => undefined - return (t: T) => - S.encodeEffect(schema)(t).pipe( - Effect.orDie, - Effect.map((_) => mapToPersistenceModel(_, getEtag)) - ) - } - - function mapToPersistenceModel( - e: E, - getEtag: (id: string) => string | undefined - ): Encoded { - return mapTo(e, getEtag((e as any)[idKey] as string)) - } - - return Effect.gen(function*() { - const { make } = yield* StoreMaker - - const store = yield* make( - pluralize(name), - idKey, - makeInitial - ? makeInitial - .pipe( - Effect.flatMap(Effect.forEach(encodeToEncoded())), - setupRequestContextFromCurrent("Repository.makeInitial [effect-app/infra]", { - attributes: { "app.entity": name } - }) - ) - : undefined, - { - ...config, - schema, - partitionValue: config?.partitionValue - ?? ((_) => "primary") /*(isIntegrationEvent(r) ? r.companyId : r.id*/ - } - ) - - return store - }) - } - - return makeStore - } -} - -export interface Repos< - T, - Encoded extends { id: string }, - RSchema, - Evt, - ItemType extends string, - IdKey extends keyof T, - RPublish -> { - make( - args: [Evt] extends [never] ? { - makeInitial?: Effect.Effect | undefined - config?: Omit, "partitionValue"> & { - partitionValue?: (e?: Encoded) => string - } - } - : { - publishEvents: (evt: NonEmptyReadonlyArray) => Effect.Effect - makeInitial?: Effect.Effect | undefined - config?: Omit, "partitionValue"> & { - partitionValue?: (e?: Encoded) => string - } - } - ): Effect.Effect< - Repository, - E, - StoreMaker | RInitial | R2 | Scope.Scope - > - makeWith( - args: [Evt] extends [never] ? { - makeInitial?: Effect.Effect | undefined - config?: Omit, "partitionValue"> & { - partitionValue?: (e?: Encoded) => string - } - } - : { - publishEvents: (evt: NonEmptyReadonlyArray) => Effect.Effect - makeInitial?: Effect.Effect | undefined - config?: Omit, "partitionValue"> & { - partitionValue?: (e?: Encoded) => string - } - }, - f: (r: Repository) => Out - ): Effect.Effect - readonly Q: ReturnType> - readonly type: Repository -} diff --git a/packages/effect-app/src/Model/Repository/legacy.ts b/packages/effect-app/src/Model/Repository/legacy.ts deleted file mode 100644 index bac20bb3e..000000000 --- a/packages/effect-app/src/Model/Repository/legacy.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -import type { DatabaseError, OptimisticConcurrencyException } from "../../client/errors.ts" -import type * as Effect from "../../Effect.ts" -import type * as Option from "../../Option.ts" -import type * as S from "../../Schema.ts" - -export interface Mapped1 { - all: Effect.Effect - save: (...xes: readonly A[]) => Effect.Effect - find: (id: A[IdKey]) => Effect.Effect, S.SchemaError | DatabaseError, R> -} - -// TODO: auto use project, and select fields from the From side of schema only -export interface Mapped2 { - all: Effect.Effect -} - -export interface Mapped { - (schema: S.Codec): Mapped1 - // TODO: constrain on Encoded2 having to contain only fields that fit Encoded - (schema: S.Codec): Mapped2 -} - -export interface MM { - (schema: S.Codec): Effect.Effect, never, Repo> - // TODO: constrain on Encoded2 having to contain only fields that fit Encoded - (schema: S.Codec): Effect.Effect, never, Repo> -} diff --git a/packages/effect-app/src/Model/Repository/makeRepo.ts b/packages/effect-app/src/Model/Repository/makeRepo.ts deleted file mode 100644 index b2b5af115..000000000 --- a/packages/effect-app/src/Model/Repository/makeRepo.ts +++ /dev/null @@ -1,156 +0,0 @@ -/* eslint-disable @typescript-eslint/no-empty-object-type */ -/* eslint-disable @typescript-eslint/no-unsafe-return */ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -// import type { ParserEnv } from "../../Schema/custom/Parser.ts" - -import type * as Scope from "effect/Scope" -import type { NonEmptyReadonlyArray } from "../../Array.ts" -import type * as Context from "../../Context.ts" -import type * as DataDependencies from "../../DataDependencies.ts" -import * as Effect from "../../Effect.ts" -import type * as S from "../../Schema.ts" -import type { StoreConfig, StoreMaker } from "../../Store.ts" -import type { FieldValues } from "../filter/types.ts" -import { type ExtendedRepository, extendRepo } from "./ext.ts" -import { makeRepoInternal } from "./internal/internal.ts" -import { RepositoryRegistry } from "./Registry.ts" -import type { Repository } from "./service.ts" - -export interface RepositoryOptions< - IdKey extends keyof T & keyof Encoded, - Encoded extends FieldValues, - T, - ItemType extends string, - Evt = never, - RPublish = never, - E = never, - RInitial = never, - RCtx = never, - RSchema = never -> { - /** - * Specify the idKey of the Type side, if it's different from the default "id". - * Does not change the Encoded side, which is always "id" to support database drivers. - * At this time as queries are operating on the Encoded side, the queries must still specify "id" regardless. - */ - idKey: IdKey - /** - * just in time Migration: for complex migrations that aren't just default simple values - * use the config.defaultValues instead for simple default values - */ - jitM?: (pm: Encoded) => Encoded - config?: Omit, "partitionValue"> & { - partitionValue?: (e?: Encoded) => string - } - /** - * Optional handler to be able to publish events after successfull save. - */ - publishEvents?: (evt: NonEmptyReadonlyArray) => Effect.Effect - /** - * Optional creator for initial data in the table when it's created for the first itme. - */ - makeInitial?: Effect.Effect | undefined - /** - * Optional context to be provided to Schema decode/encode. - * Useful for effectful transformations like XWithItems, where items is a transformation retrieving elements from another database table or other source. - */ - schemaContext?: Context.Context - - /** IDs, including aliases, that identify an entity for dependency invalidation. */ - dependencyIds?: (item: T) => NonEmptyReadonlyArray - - /** - * Additional derived queries or resources affected by writing an item. - * Saves invalidate dependencies derived from both the previous and next item; - * removals derive them from the removed item. - */ - additionalWriteDependencies?: (item: T) => ReadonlyArray - - overrides?: ( - repo: Repository, RPublish, RCtx> - ) => Repository, RPublish, RCtx> -} - -/** - * Create a repository instance. - * @param itemType an identifier used for the table name and e.g NotFoundError - * @param schema the Schema used for this Repository - * @param options @see RepositoryOptions - * @returns a Repository - */ -export const makeRepo: { - < - ItemType extends string, - RSchema, - Encoded extends FieldValues, - T, - IdKey extends keyof T & keyof Encoded, - E = never, - Evt = never, - RInitial = never, - RPublish = never, - RCtx = never - >( - itemType: ItemType, - schema: S.Codec, - options: RepositoryOptions - ): Effect.Effect< - ExtendedRepository, RPublish, RCtx>, - E, - RInitial | StoreMaker | RepositoryRegistry | Scope.Scope - > - < - ItemType extends string, - RSchema, - Encoded extends FieldValues, - T extends { id: unknown }, - E = never, - Evt = never, - RInitial = never, - RPublish = never, - RCtx = never - >( - itemType: ItemType, - schema: S.Codec, - options: Omit, "idKey"> - ): Effect.Effect< - ExtendedRepository, RPublish, RCtx>, - E, - RInitial | StoreMaker | RepositoryRegistry | Scope.Scope - > -} = < - ItemType extends string, - RSchema, - Encoded extends FieldValues, - T, - IdKey extends keyof T & keyof Encoded, - E = never, - RInitial = never, - RPublish = never, - Evt = never, - RCtx = never ->( - itemType: ItemType, - schema: S.Codec, - options: Omit, "idKey"> & { - idKey?: IdKey - } -) => - Effect.gen(function*() { - const mkRepo = makeRepoInternal()( - itemType, - schema, - options?.jitM ? (pm) => options.jitM!(pm) : (pm) => pm, - (e, _etag) => ({ ...e, _etag }), - options.idKey ?? "id" as any - ) - let r = yield* mkRepo.make(options as any) - if (options.overrides) r = options.overrides(r) - const repo = extendRepo(r) - const registry = yield* RepositoryRegistry - registry.register(itemType, repo) - return repo - }) diff --git a/packages/effect-app/src/Model/Repository/service.ts b/packages/effect-app/src/Model/Repository/service.ts deleted file mode 100644 index 875a0cd17..000000000 --- a/packages/effect-app/src/Model/Repository/service.ts +++ /dev/null @@ -1,676 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import type * as Scope from "effect/Scope" -import type { DatabaseError, InvalidStateError, NotFoundError, OptimisticConcurrencyException } from "../../client/errors.ts" -import type * as Effect from "../../Effect.ts" -import type * as Option from "../../Option.ts" -import type * as S from "../../Schema.ts" -import type { NonNegativeInt } from "../../Schema/numbers.ts" -import type { FieldValues, IsNever, ResolveFirstLevel } from "../filter/types.ts" -import type { QAll, Query, QueryProjection, RawQuery } from "../query.ts" -import type { Mapped } from "./legacy.ts" -import type { ValidationResult } from "./validation.ts" - -/** - * Event emitted by a repository's ChangeFeed. - * - * Tuple shape: `[items, op, namespace]` — `namespace` is the `storeId` - * context value at publish time (defaults to `"primary"`). - */ -export type ChangeFeedEvent = readonly [items: T[], op: "save" | "remove", namespace: string] - -/** - * Synchronous broadcast channel for repository change events. - * - * `publish` only completes after every matching handler's Effect has - * finished — callers must await all handlers before continuing. Subscribers - * can target a single namespace via `options.namespace`, or omit it to - * receive events from every namespace (wildcard). - * - * Handlers are auto-removed when the subscriber's Scope closes; the full - * handler set is cleared when the repository's own scope closes. - */ -export interface ChangeFeed { - readonly publish: (evt: [T[], "save" | "remove"]) => Effect.Effect - readonly subscribe: ( - handler: (evt: ChangeFeedEvent) => Effect.Effect, - options?: { readonly namespace?: string } - ) => Effect.Effect -} - -export interface Repository< - T, - Encoded extends FieldValues, - Evt, - ItemType extends string, - IdKey extends keyof T, - RSchema, - RPublish, - RProvided = never -> { - readonly itemType: ItemType - readonly idKey: IdKey - readonly find: (id: T[IdKey]) => Effect.Effect, DatabaseError, RSchema> - readonly all: Effect.Effect - readonly saveAndPublish: ( - items: Iterable, - events?: Iterable - ) => Effect.Effect - readonly changeFeed: ChangeFeed - readonly removeAndPublish: ( - items: Iterable, - events?: Iterable - ) => Effect.Effect - - readonly removeById: ( - idOrIds: T[IdKey] | ReadonlyArray - ) => Effect.Effect - - readonly queryRaw: ( - schema: S.Codec, - raw: RawQuery - ) => Effect.Effect - - /** - * Explicitly seed a namespace. Primary is seeded eagerly on initialization. - * Non-primary namespaces must be seeded explicitly before use. - */ - readonly seedNamespace: (namespace: string) => Effect.Effect - - readonly query: { - // ending with projection - < - A, - R, - From extends FieldValues, - TType extends "one" | "many" | "count" = "many", - E extends boolean = false - >( - q: ( - initial: Query - ) => QueryProjection - ): Effect.Effect< - TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A, - | (TType extends "many" ? never : NotFoundError) - | (TType extends "count" ? never : S.SchemaError) - | DatabaseError, - Exclude | RSchema - > - < - A, - R, - From extends FieldValues, - TType extends "one" | "many" | "count" = "many", - $A = never, - E extends boolean = false - >( - q1: ( - initial: Query - ) => $A, - q2: ( - _: $A - ) => QueryProjection - ): Effect.Effect< - TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A, - | (TType extends "many" ? never : NotFoundError) - | (TType extends "count" ? never : S.SchemaError) - | DatabaseError, - Exclude | RSchema - > - < - A, - R, - From extends FieldValues, - TType extends "one" | "many" | "count" = "many", - $A = never, - $B = never, - E extends boolean = false - >( - q1: ( - initial: Query - ) => $A, - q2: (_: $A) => $B, - q3: ( - _: $B - ) => QueryProjection - ): Effect.Effect< - TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A, - | (TType extends "many" ? never : NotFoundError) - | (TType extends "count" ? never : S.SchemaError) - | DatabaseError, - Exclude | RSchema - > - < - A, - R, - From extends FieldValues, - TType extends "one" | "many" | "count" = "many", - $A = never, - $B = never, - $C = never, - E extends boolean = false - >( - q1: ( - initial: Query - ) => $A, - q2: (_: $A) => $B, - q3: (_: $B) => $C, - q4: ( - _: $C - ) => QueryProjection - ): Effect.Effect< - TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A, - | (TType extends "many" ? never : NotFoundError) - | (TType extends "count" ? never : S.SchemaError) - | DatabaseError, - Exclude | RSchema - > - < - A, - R, - From extends FieldValues, - TType extends "one" | "many" | "count" = "many", - $A = never, - $B = never, - $C = never, - $D = never, - E extends boolean = false - >( - q1: ( - initial: Query - ) => $A, - q2: (_: $A) => $B, - q3: (_: $B) => $C, - q4: (_: $C) => $D, - q5: ( - _: $D - ) => QueryProjection - ): Effect.Effect< - TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A, - | (TType extends "many" ? never : NotFoundError) - | (TType extends "count" ? never : S.SchemaError) - | DatabaseError, - Exclude | RSchema - > - < - A, - R, - From extends FieldValues, - TType extends "one" | "many" | "count" = "many", - $A = never, - $B = never, - $C = never, - $D = never, - $E = never, - E extends boolean = false - >( - q1: ( - initial: Query - ) => $A, - q2: (_: $A) => $B, - q3: (_: $B) => $C, - q4: (_: $C) => $D, - q5: (_: $D) => $E, - q6: (_: $E) => QueryProjection - ): Effect.Effect< - TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A, - | (TType extends "many" ? never : NotFoundError) - | (TType extends "count" ? never : S.SchemaError) - | DatabaseError, - Exclude | RSchema - > - < - A, - R, - From extends FieldValues, - TType extends "one" | "many" | "count" = "many", - $A = never, - $B = never, - $C = never, - $D = never, - $E = never, - $F = never, - E extends boolean = false - >( - q1: ( - initial: Query - ) => $A, - q2: (_: $A) => $B, - q3: (_: $B) => $C, - q4: (_: $C) => $D, - q5: (_: $D) => $E, - q6: (_: $E) => $F, - q7: (_: $F) => QueryProjection - ): Effect.Effect< - TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A, - | (TType extends "many" ? never : NotFoundError) - | (TType extends "count" ? never : S.SchemaError) - | DatabaseError, - Exclude | RSchema - > - < - A, - R, - From extends FieldValues, - TType extends "one" | "many" | "count" = "many", - $A = never, - $B = never, - $C = never, - $D = never, - $E = never, - $F = never, - $G = never, - E extends boolean = false - >( - q1: ( - initial: Query - ) => $A, - q2: (_: $A) => $B, - q3: (_: $B) => $C, - q4: (_: $C) => $D, - q5: (_: $D) => $E, - q6: (_: $E) => $F, - q7: (_: $F) => $G, - q8: (_: $G) => QueryProjection - ): Effect.Effect< - TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A, - | (TType extends "many" ? never : NotFoundError) - | (TType extends "count" ? never : S.SchemaError) - | DatabaseError, - Exclude | RSchema - > - < - A, - R, - From extends FieldValues, - TType extends "one" | "many" | "count" = "many", - $A = never, - $B = never, - $C = never, - $D = never, - $E = never, - $F = never, - $G = never, - $H = never, - E extends boolean = false - >( - q1: ( - initial: Query - ) => $A, - q2: (_: $A) => $B, - q3: (_: $B) => $C, - q4: (_: $C) => $D, - q5: (_: $D) => $E, - q6: (_: $E) => $F, - q7: (_: $F) => $G, - q8: (_: $G) => $H, - q9: (_: $H) => QueryProjection - ): Effect.Effect< - TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A, - | (TType extends "many" ? never : NotFoundError) - | (TType extends "count" ? never : S.SchemaError) - | DatabaseError, - Exclude | RSchema - > - < - A, - R, - From extends FieldValues, - TType extends "one" | "many" | "count" = "many", - $A = never, - $B = never, - $C = never, - $D = never, - $E = never, - $F = never, - $G = never, - $H = never, - $I = never, - E extends boolean = false - >( - q1: ( - initial: Query - ) => $A, - q2: (_: $A) => $B, - q3: (_: $B) => $C, - q4: (_: $C) => $D, - q5: (_: $D) => $E, - q6: (_: $E) => $F, - q7: (_: $F) => $G, - q8: (_: $G) => $H, - q9: (_: $H) => $I, - q10: (_: $I) => QueryProjection - ): Effect.Effect< - TType extends "many" ? readonly A[] : TType extends "count" ? NonNegativeInt : A, - | (TType extends "many" ? never : NotFoundError) - | (TType extends "count" ? never : S.SchemaError) - | DatabaseError, - Exclude | RSchema - > - - // ending with generic query - < - R = never, - TType extends "one" | "many" = "many", - EncodedRefined extends Encoded = Encoded, - E extends boolean = false - >( - q: (initial: Query) => QAll, R, TType, E> - ): Effect.Effect< - TType extends "many" ? DistributeQueryIfExclusiveOnArray : RefineTHelper, - (TType extends "many" ? never : NotFoundError) | DatabaseError, - Exclude | RSchema - > - < - R = never, - TType extends "one" | "many" = "many", - EncodedRefined extends Encoded = Encoded, - $A = never, - E extends boolean = false - >( - q1: (initial: Query) => $A, - q2: ( - _: $A - ) => QAll, R, TType, E> - ): Effect.Effect< - TType extends "many" ? DistributeQueryIfExclusiveOnArray : RefineTHelper, - (TType extends "many" ? never : NotFoundError) | DatabaseError, - Exclude | RSchema - > - < - R = never, - TType extends "one" | "many" = "many", - EncodedRefined extends Encoded = Encoded, - $A = never, - $B = never, - E extends boolean = false - >( - q1: (initial: Query) => $A, - q2: ( - _: $A - ) => $B, - q3: ( - _: $B - ) => QAll, R, TType, E> - ): Effect.Effect< - TType extends "many" ? DistributeQueryIfExclusiveOnArray : RefineTHelper, - (TType extends "many" ? never : NotFoundError) | DatabaseError, - Exclude | RSchema - > - < - R = never, - TType extends "one" | "many" = "many", - EncodedRefined extends Encoded = Encoded, - $A = never, - $B = never, - $C = never, - E extends boolean = false - >( - q1: (initial: Query) => $A, - q2: (_: $A) => $B, - q3: (_: $B) => $C, - q4: ( - _: $C - ) => QAll, R, TType, E> - ): Effect.Effect< - TType extends "many" ? DistributeQueryIfExclusiveOnArray : RefineTHelper, - (TType extends "many" ? never : NotFoundError) | DatabaseError, - Exclude | RSchema - > - < - R = never, - TType extends "one" | "many" = "many", - EncodedRefined extends Encoded = Encoded, - $A = never, - $B = never, - $C = never, - $D = never, - E extends boolean = false - >( - q1: (initial: Query) => $A, - q2: (_: $A) => $B, - q3: (_: $B) => $C, - q4: (_: $C) => $D, - q5: ( - _: $D - ) => QAll, R, TType, E> - ): Effect.Effect< - TType extends "many" ? DistributeQueryIfExclusiveOnArray : RefineTHelper, - (TType extends "many" ? never : NotFoundError) | DatabaseError, - Exclude | RSchema - > - < - R = never, - TType extends "one" | "many" = "many", - EncodedRefined extends Encoded = Encoded, - $A = never, - $B = never, - $C = never, - $D = never, - $E = never, - E extends boolean = false - >( - q1: (initial: Query) => $A, - q2: (_: $A) => $B, - q3: (_: $B) => $C, - q4: (_: $C) => $D, - q5: (_: $D) => $E, - q6: ( - _: $E - ) => QAll, R, TType, E> - ): Effect.Effect< - TType extends "many" ? DistributeQueryIfExclusiveOnArray : RefineTHelper, - (TType extends "many" ? never : NotFoundError) | DatabaseError, - Exclude | RSchema - > - < - R = never, - TType extends "one" | "many" = "many", - EncodedRefined extends Encoded = Encoded, - $A = never, - $B = never, - $C = never, - $D = never, - $E = never, - $F = never, - E extends boolean = false - >( - q1: (initial: Query) => $A, - q2: (_: $A) => $B, - q3: (_: $B) => $C, - q4: (_: $C) => $D, - q5: (_: $D) => $E, - q6: (_: $E) => $F, - q7: ( - _: $F - ) => QAll, R, TType, E> - ): Effect.Effect< - TType extends "many" ? DistributeQueryIfExclusiveOnArray : RefineTHelper, - (TType extends "many" ? never : NotFoundError) | DatabaseError, - Exclude | RSchema - > - < - R = never, - TType extends "one" | "many" = "many", - EncodedRefined extends Encoded = Encoded, - $A = never, - $B = never, - $C = never, - $D = never, - $E = never, - $F = never, - $G = never, - E extends boolean = false - >( - q1: (initial: Query) => $A, - q2: (_: $A) => $B, - q3: (_: $B) => $C, - q4: (_: $C) => $D, - q5: (_: $D) => $E, - q6: (_: $E) => $F, - q7: (_: $F) => $G, - q8: ( - _: $G - ) => QAll, R, TType, E> - ): Effect.Effect< - TType extends "many" ? DistributeQueryIfExclusiveOnArray - : RefineTHelper, - (TType extends "many" ? never : NotFoundError) | DatabaseError, - Exclude | RSchema - > - < - R = never, - TType extends "one" | "many" = "many", - EncodedRefined extends Encoded = Encoded, - $A = never, - $B = never, - $C = never, - $D = never, - $E = never, - $F = never, - $G = never, - $H = never, - E extends boolean = false - >( - q1: (initial: Query) => $A, - q2: (_: $A) => $B, - q3: (_: $B) => $C, - q4: (_: $C) => $D, - q5: (_: $D) => $E, - q6: (_: $E) => $F, - q7: (_: $F) => $G, - q8: (_: $G) => $H, - q9: ( - _: $H - ) => QAll, R, TType, E> - ): Effect.Effect< - TType extends "many" ? DistributeQueryIfExclusiveOnArray - : RefineTHelper, - (TType extends "many" ? never : NotFoundError) | DatabaseError, - Exclude | RSchema - > - < - R = never, - TType extends "one" | "many" = "many", - EncodedRefined extends Encoded = Encoded, - $A = never, - $B = never, - $C = never, - $D = never, - $E = never, - $F = never, - $G = never, - $H = never, - $I = never, - E extends boolean = false - >( - q1: (initial: Query) => $A, - q2: (_: $A) => $B, - q3: (_: $B) => $C, - q4: (_: $C) => $D, - q5: (_: $D) => $E, - q6: (_: $E) => $F, - q7: (_: $F) => $G, - q8: (_: $G) => $H, - q9: (_: $H) => $I, - q10: ( - _: $I - ) => QAll, R, TType, E> - ): Effect.Effect< - TType extends "many" ? DistributeQueryIfExclusiveOnArray - : RefineTHelper, - (TType extends "many" ? never : NotFoundError) | DatabaseError, - Exclude | RSchema - > - } - - /** @deprecated use query */ - readonly mapped: Mapped - - /** - * Validates a random sample of repository items by applying jitM and schema decode. - * Useful for testing that migrations and schema changes work correctly on existing data. - */ - readonly validateSample: (options?: { - /** percentage of items to sample (0.0-1.0), default 0.1 (10%) */ - percentage?: number - /** optional maximum number of items to sample */ - maxItems?: number - }) => Effect.Effect -} - -type DistributeQueryIfExclusiveOnArray = [Exclusive] extends [true] - ? T extends any ? RefineTHelper extends infer R ? IsNever extends true ? never - : readonly R[] - : never - : never - : readonly RefineTHelper[] - -type NullableRefined = { - // EncodedRefined may be a union, so if you just keyof you'll get just common keys - // p.s. NullableRefined is homomorphic in T so it distributes itself over T - [k in keyof T]: [null] extends [T[k]] ? [null] extends [Extract[k]] ? T[k] - : Exclude - : T[k] -} - -// for DX purposes -type ShouldRecursiveExtractTagged = true extends { - [k in keyof T]: "_tag" extends keyof T[k] - ? k extends keyof EncodedRefined ? "_tag" extends keyof EncodedRefined[k] ? true - : false - : false - : false -}[keyof T] ? true - : false - -// support is not 100% but we have to make compromises -type RecursiveExtractTagged = ShouldRecursiveExtractTagged extends true ? { - [k in keyof T]: "_tag" extends keyof T[k] - ? k extends keyof EncodedRefined ? "_tag" extends keyof EncodedRefined[k] ? ExtractTagged - : T[k] - : T[k] - : T[k] - } - : T - -type ExtractTagged_ = EncodedRefined extends { _tag: string } - ? T extends { _tag: string } ? Extract - : T - : T - -type ExtractTagged = ExtractTagged_ extends infer R - ? RecursiveExtractTagged, EncodedRefined> - : never - -type ShouldRecursiveExtractIded = true extends { - [k in keyof T]: "id" extends keyof T[k] ? k extends keyof EncodedRefined ? "id" extends keyof EncodedRefined[k] ? true - : false - : false - : false -}[keyof T] ? true - : false - -type RecusiveExtractIded = ShouldRecursiveExtractIded extends true ? { - [k in keyof T]: "id" extends keyof T[k] - ? k extends keyof EncodedRefined ? "id" extends keyof EncodedRefined[k] ? ExtractIded - : T[k] - : T[k] - : T[k] - } - : T - -type ExtractIded_ = EncodedRefined extends { id: string } - ? T extends { id: string } ? Extract - : T - : T - -type ExtractIded = ExtractIded_ extends infer R - ? RecusiveExtractIded, EncodedRefined> - : never - -export type RefineTHelper = ResolveFirstLevel< - NullableRefined< - ExtractIded, EncodedRefined>, - EncodedRefined - > -> diff --git a/packages/effect-app/src/Model/Repository/validation.ts b/packages/effect-app/src/Model/Repository/validation.ts deleted file mode 100644 index 10dc285ee..000000000 --- a/packages/effect-app/src/Model/Repository/validation.ts +++ /dev/null @@ -1,31 +0,0 @@ -import * as S from "../../Schema.ts" -import { NonNegativeInt } from "../../Schema.ts" - -/** - * Represents a single validation error when decoding a repository item. - * Contains full context for debugging: raw data, jitM result, and decode error. - */ -export class ValidationError extends S.Opaque()(S.Struct({ - /** the id of the item that failed validation */ - id: S.Unknown, - /** the raw data from the database before jitM */ - rawData: S.Unknown, - /** the data after applying jitM transformation */ - jitMResult: S.Unknown, - /** the S.SchemaError from schema decode */ - error: S.Unknown -})) {} - -/** - * Result of validating a sample of repository items. - */ -export class ValidationResult extends S.Opaque()(S.Struct({ - /** total number of items in the repository */ - total: NonNegativeInt, - /** number of items that were sampled for validation */ - sampled: NonNegativeInt, - /** number of items that passed validation */ - valid: NonNegativeInt, - /** list of validation errors with full context */ - errors: S.Array(ValidationError) -})) {} diff --git a/packages/effect-app/src/Model/dsl.ts b/packages/effect-app/src/Model/dsl.ts deleted file mode 100644 index a99abfd71..000000000 --- a/packages/effect-app/src/Model/dsl.ts +++ /dev/null @@ -1,129 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import type { NonEmptyReadonlyArray } from "../Array.ts" -import { toNonEmptyArray } from "../Array.ts" -import * as Effect from "../Effect.ts" -import { type FixEnv, get, logMany, type Pure, type PureEnvEnv, type PureLogT, set } from "../Pure.ts" - -export interface PureDSL { - get: Pure - set: (s: S2) => Pure - log: (...w: W[]) => PureLogT -} - -export const AnyPureDSL: PureDSL = { - get: get(), - set: set as any, - log: (...evt: any[]) => logMany(evt) -} - -const anyDSL = makeDSL() - -export type AllDSL = - & (( - pure: (dsl: PureDSL) => Effect.Effect - ) => Effect.Effect>) - & AllDSLExt - -export interface AllDSLExt { - modify: ( - pure: (items: readonly S1[], dsl: PureDSL) => Effect.Effect - ) => Effect.Effect> - update: ( - pure: (items: readonly S1[], log: (...evt: Evt[]) => PureLogT) => Effect.Effect - ) => Effect.Effect> - updateWith: ( - upd: (item: readonly S1[]) => readonly S2[] - ) => Effect.Effect> -} - -export function makeAllDSL() { - const dsl: AllDSL = anyDSL - return dsl -} - -export type OneDSL = - & (( - pure: (dsl: PureDSL) => Effect.Effect - ) => Effect.Effect>) - & OneDSLExt - -export interface OneDSLExt { - modify: ( - pure: (items: S1, dsl: PureDSL) => Effect.Effect - ) => Effect.Effect | PureEnvEnv> - update: ( - pure: (items: S1, log: (...evt: Evt[]) => PureLogT) => Effect.Effect - ) => Effect.Effect> - updateWith: ( - upd: (item: S1) => S2 - ) => Effect.Effect> -} - -export function makeOneDSL(): OneDSL { - return anyDSL -} - -export function makeDSL() { - const dsl: PureDSL = AnyPureDSL - - function modify< - R, - E, - A - >( - pure: ( - items: S1, - dsl: PureDSL - ) => Effect.Effect - ): Effect.Effect> { - return dsl.get.pipe(Effect.flatMap((items) => pure(items, dsl))) as any - } - - function update< - R, - E - >( - pure: ( - items: S1, - log: (...evt: Evt[]) => PureLogT - ) => Effect.Effect - ): Effect.Effect> { - return dsl.get.pipe(Effect.flatMap((items) => pure(items, dsl.log).pipe(Effect.tap(dsl.set)))) as any - } - - function withDSL< - R, - A, - E - >( - pure: (dsl: PureDSL) => Effect.Effect - ): Effect.Effect> { - return pure(AnyPureDSL) as any - } - - function updateWith(upd: (item: S1) => S2) { - return update((_: S1) => Effect.sync(() => upd(_))) - } - - return Object.assign( - withDSL, - { - modify, - update, - updateWith - } - ) -} - -export interface DSLExt extends ReturnType> {} - -export function ifAny(fn: (items: NonEmptyReadonlyArray) => Effect.Effect) { - return (items: Iterable) => Effect.flatMapOption(Effect.sync(() => toNonEmptyArray([...items])), fn) -} - -export function ifAny_( - items: Iterable, - fn: (items: NonEmptyReadonlyArray) => Effect.Effect -) { - return Effect.flatMapOption(Effect.sync(() => toNonEmptyArray([...items])), fn) -} diff --git a/packages/effect-app/src/Model/filter/filterApi.ts b/packages/effect-app/src/Model/filter/filterApi.ts deleted file mode 100644 index 81c5eb250..000000000 --- a/packages/effect-app/src/Model/filter/filterApi.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { type RelationDirection } from "../query.ts" - -export type InOps = - | "in" - | "notIn" - -export type OtherOps = - | "endsWith" - | "startsWith" - | "notEndsWith" - | "notStartsWith" - | "contains" - | "notContains" - | "includes" - | "notIncludes" - | "includes-any" - | "notIncludes-any" - | "includes-all" - | "notIncludes-all" - | "hasKey" - | "notHasKey" - | "hasValue" - | "notHasValue" - | "hasKeyValue" - | "notHasKeyValue" - | "hasKey-any" - | "notHasKey-any" - | "hasKey-all" - | "notHasKey-all" - | "hasValue-any" - | "notHasValue-any" - | "hasValue-all" - | "notHasValue-all" - | "hasKeyValue-any" - | "notHasKeyValue-any" - | "hasKeyValue-all" - | "notHasKeyValue-all" - | "eq" - | "neq" - | "gt" - | "gte" - | "lt" - | "lte" - -export type Ops = OtherOps | InOps - -export type FilterScopes = { - t: "or-scope" - result: readonly FilterResult[] - relation: RelationDirection -} | { - t: "and-scope" - result: readonly FilterResult[] - relation: RelationDirection -} | { - t: "where-scope" - result: readonly FilterResult[] - relation: RelationDirection -} - -export type FilterR = { - op: Ops - - path: string - value: unknown -} - -export type FilterResult = - | { - t: "where" - } & FilterR - | { - t: "or" - } & FilterR - | { - t: "and" - } & FilterR - | FilterScopes diff --git a/packages/effect-app/src/Model/filter/types.ts b/packages/effect-app/src/Model/filter/types.ts deleted file mode 100644 index d4cca62cf..000000000 --- a/packages/effect-app/src/Model/filter/types.ts +++ /dev/null @@ -1,6 +0,0 @@ -// codegen:start {preset: barrel, include: ./types/*.ts} -export * from "./types/errors.ts" -export * from "./types/fields.ts" -export * from "./types/utils.ts" -export * from "./types/validator.ts" -// codegen:end diff --git a/packages/effect-app/src/Model/filter/types/errors.ts b/packages/effect-app/src/Model/filter/types/errors.ts deleted file mode 100644 index f6501cb94..000000000 --- a/packages/effect-app/src/Model/filter/types/errors.ts +++ /dev/null @@ -1,47 +0,0 @@ -import type { FieldValues, InternalFieldName } from "./fields.ts" -import type { BrowserNativeObject, IsAny, LiteralUnion, Merge } from "./utils.ts" -import type { RegisterOptions, ValidateResult } from "./validator.ts" - -export type Message = string - -export type MultipleFieldErrors = - & { - [K in keyof RegisterOptions]?: ValidateResult - } - & { - [key: string]: ValidateResult - } - -export type FieldError = { - type: LiteralUnion - root?: FieldError - // ref?: Ref - types?: MultipleFieldErrors - message?: Message -} - -export type ErrorOption = { - message?: Message - type?: LiteralUnion - types?: MultipleFieldErrors -} - -export type DeepRequired = T extends BrowserNativeObject | Blob ? T - : { - [K in keyof T]-?: NonNullable> - } - -export type FieldErrorsImpl = { - [K in keyof T]?: T[K] extends BrowserNativeObject | Blob ? FieldError - : T[K] extends object ? Merge> - : FieldError -} - -export type FieldErrors = Partial< - FieldValues extends IsAny ? any - : FieldErrorsImpl> -> - -export type InternalFieldErrors = Partial< - Record -> diff --git a/packages/effect-app/src/Model/filter/types/fields.ts b/packages/effect-app/src/Model/filter/types/fields.ts deleted file mode 100644 index 73808a451..000000000 --- a/packages/effect-app/src/Model/filter/types/fields.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { IsFlatObject } from "./utils.ts" -import type { RegisterOptions } from "./validator.ts" - -export type InternalFieldName = string - -export type FieldName = IsFlatObject extends true - ? Extract - : string - -// export type CustomElement = { -// name: FieldName -// type?: string -// value?: any -// disabled?: boolean -// checked?: boolean -// options?: HTMLOptionsCollection -// files?: FileList | null -// focus?: Noop -// } - -export type FieldValue = TFieldValues[InternalFieldName] - -export type FieldValues = Record - -export type NativeFieldValue = - | string - | number - | boolean - | null - | undefined - | unknown[] - -// export type FieldElement = -// | HTMLInputElement -// | HTMLSelectElement -// | HTMLTextAreaElement -// | CustomElement - -// export type Ref = FieldElement - -export type Field = { - _f: { - // ref: Ref - name: InternalFieldName - // refs?: HTMLInputElement[] - mount?: boolean - } & RegisterOptions -} - -export type FieldRefs = Partial> diff --git a/packages/effect-app/src/Model/filter/types/path/common.ts b/packages/effect-app/src/Model/filter/types/path/common.ts deleted file mode 100644 index 40324c0d0..000000000 --- a/packages/effect-app/src/Model/filter/types/path/common.ts +++ /dev/null @@ -1,404 +0,0 @@ -import type { IsAny, IsNever } from "../utils.ts" - -/** - * Type alias to `string` which describes a lodash-like path through an object. - * E.g. `'foo.bar.0.baz'` - */ -export type PathString = string - -/** - * Type which can be traversed through with a {@link PathString}. - * I.e. objects, arrays, and tuples - */ -export type Traversable = object - -/** - * Type to query whether an array type T is a tuple type. - * @typeParam T - type which may be an array or tuple - * @example - * ``` - * IsTuple<[number]> = true - * IsTuple = false - * ``` - */ -export type IsTuple> = number extends T["length"] ? false - : true - -/** - * Type which can be used to index an array or tuple type. - */ -export type ArrayKey = number - -/** - * Type which can be used to index an object. - */ -export type Key = string - -/** - * Type to assert that a type is a {@link Key}. - * @typeParam T - type which may be a {@link Key} - */ -export type AsKey = Extract - -/** - * Type to convert a type to a {@link Key}. - * @typeParam T - type which may be converted to a {@link Key} - */ -export type ToKey = T extends ArrayKey ? `${T}` : AsKey - -/** - * Type which describes a path through an object - * as a list of individual {@link Key}s. - */ -export type PathTuple = Key[] - -/** - * Type to assert that a type is a {@link PathTuple}. - * @typeParam T - type which may be a {@link PathTuple} - */ -export type AsPathTuple = Extract - -/** - * Type to intersect a union type. - * See https://fettblog.eu/typescript-union-to-intersection/ - * @typeParam U - union - * @example - * ``` - * UnionToIntersection<{ foo: string } | { bar: number }> - * = { foo: string; bar: number } - * ``` - */ -export type UnionToIntersection = ( - U extends any ? (_: U) => any : never -) extends (_: infer I) => any ? I - : never - -/** - * Type which appends a {@link Key} to the {@link PathTuple} only if it is not - * blank, i.e. not the empty string. - * @typeParam PT - path - * @typeParam K - key - * @example - * ``` - * AppendNonBlankKey<['foo'], 'bar'> = ['foo', 'bar'] - * AppendNonBlankKey<['foo'], ''> = ['foo'] - * ``` - */ -type AppendNonBlankKey = K extends "" ? PT - : [...PT, K] - -/** - * Type to implement {@link SplitPathString} tail recursively. - * @typeParam PS - remaining {@link PathString} which should be split into its - * individual {@link Key}s - * @typeParam PT - accumulator of the {@link Key}s which have been split from - * the original {@link PathString} already - */ -type SplitPathStringImpl< - PS extends PathString, - PT extends PathTuple -> = PS extends `${infer K}.${infer R}` ? SplitPathStringImpl> - : AppendNonBlankKey - -/** - * Type to split a {@link PathString} into a {@link PathTuple}. - * The individual {@link Key}s may be empty strings. - * @typeParam PS - {@link PathString} which should be split into its - * individual {@link Key}s - * @example - * ``` - * SplitPathString<'foo'> = ['foo'] - * SplitPathString<'foo.bar.0.baz'> = ['foo', 'bar', '0', 'baz'] - * SplitPathString<'.'> = [] - * ``` - */ -export type SplitPathString = SplitPathStringImpl< - PS, - [] -> - -/** - * Type to implement {@link JoinPathTuple} tail-recursively. - * @typeParam PT - remaining {@link Key}s which needs to be joined - * @typeParam PS - accumulator of the already joined {@link Key}s - */ -type JoinPathTupleImpl< - PT extends PathTuple, - PS extends PathString -> = PT extends [infer K, ...infer R] ? JoinPathTupleImpl, `${PS}.${AsKey}`> - : PS - -/** - * Type to join a {@link PathTuple} to a {@link PathString}. - * @typeParam PT - {@link PathTuple} which should be joined. - * @example - * ``` - * JoinPathTuple<['foo']> = 'foo' - * JoinPathTuple<['foo', 'bar', '0', 'baz']> = 'foo.bar.0.baz' - * JoinPathTuple<[]> = never - * ``` - */ -export type JoinPathTuple = PT extends [ - infer K, - ...infer R -] ? JoinPathTupleImpl, AsKey> - : never - -/** - * Type which converts all keys of an object to {@link Key}s. - * @typeParam T - object type - * @example - * ``` - * MapKeys<{0: string}> = {'0': string} - * ``` - */ -type MapKeys = { [K in keyof T as ToKey]: T[K] } - -/** - * Type to access a type by a key. - * - Returns undefined if it can't be indexed by that key. - * - Returns null if the type is null. - * - Returns undefined if the type is not traversable. - * @typeParam T - type which is indexed by the key - * @typeParam K - key into the type - * ``` - * TryAccess<{foo: string}, 'foo'> = string - * TryAccess<{foo: string}, 'bar'> = undefined - * TryAccess = null - * TryAccess = undefined - * ``` - */ -type TryAccess = K extends keyof T ? T[K] - : T extends null ? null - : undefined - -/** - * Type to access an array type by a key. - * Returns undefined if the key is non-numeric. - * @typeParam T - type which is indexed by the key - * @typeParam K - key into the type - * ``` - * TryAccessArray = string - * TryAccessArray = undefined - * ``` - */ -type TryAccessArray< - T extends ReadonlyArray, - K extends Key -> = K extends `${ArrayKey}` ? T[number] : TryAccess - -/** - * Type to evaluate the type which the given key points to. - * @typeParam T - type which is indexed by the key - * @typeParam K - key into the type - * @example - * ``` - * EvaluateKey<{foo: string}, 'foo'> = string - * EvaluateKey<[number, string], '1'> = string - * EvaluateKey = string - * ``` - */ -export type EvaluateKey = T extends ReadonlyArray ? IsTuple extends true ? TryAccess - : TryAccessArray - : TryAccess, K> - -/** - * Type to evaluate the type which the given path points to. - * @typeParam T - deeply nested type which is indexed by the path - * @typeParam PT - path into the deeply nested type - * @example - * ``` - * EvaluatePath<{foo: {bar: string}}, ['foo', 'bar']> = string - * EvaluatePath<[number, string], ['1']> = string - * EvaluatePath = number - * EvaluatePath = undefined - * ``` - */ -export type EvaluatePath = PT extends [ - infer K, - ...infer R -] ? EvaluatePath>, AsPathTuple> - : T - -/** - * Type which given a tuple type returns its own keys, i.e. only its indices. - * @typeParam T - tuple type - * @example - * ``` - * TupleKeys<[number, string]> = '0' | '1' - * ``` - */ -export type TupleKeys> = Exclude< - keyof T, - keyof any[] -> - -/** - * Type which extracts all numeric keys from an object. - * @typeParam T - type - * @example - * ``` - * NumericObjectKeys<{0: string, '1': string, foo: string}> = '0' | '1' - * ``` - */ -type NumericObjectKeys = ToKey< - Extract -> - -/** - * Type which extracts all numeric keys from an object, tuple, or array. - * If a union is passed, it evaluates to the overlapping numeric keys. - * @typeParam T - type - * @example - * ``` - * NumericKeys<{0: string, '1': string, foo: string}> = '0' | '1' - * NumericKeys = `${number}` - * NumericKeys<[string, number]> = '0' | '1' - * NumericKeys<{0: string, '1': string} | [number] | number[]> = '0' - * ``` - */ -export type NumericKeys = UnionToIntersection< - T extends ReadonlyArray ? IsTuple extends true ? [TupleKeys] - : [ToKey] - : [NumericObjectKeys] ->[never] - -/** - * Type which extracts all keys from an object. - * If a union is passed, it evaluates to the overlapping keys. - * @typeParam T - object type - * @example - * ``` - * ObjectKeys<{foo: string, bar: string}, string> = 'foo' | 'bar' - * ObjectKeys<{foo: string, bar: number}, string> = 'foo' - * ``` - */ -export type ObjectKeys = Exclude< - ToKey, - `${string}.${string}` | "" -> - -/** - * Type to check whether a type's property matches the constraint type - * and return its key. Converts the key to a {@link Key}. - * @typeParam T - type whose property should be checked - * @typeParam K - key of the property - * @typeParam U - constraint type - * @example - * ``` - * CheckKeyConstraint<{foo: string}, 'foo', string> = 'foo' - * CheckKeyConstraint<{foo: string}, 'foo', number> = never - * CheckKeyConstraint = `${number}` - * ``` - */ -export type CheckKeyConstraint = K extends any ? EvaluateKey extends U ? K - : never - : never - -/** - * Type which evaluates to true when the type is an array or tuple or is a union - * which contains an array or tuple. - * @typeParam T - type - * @example - * ``` - * ContainsIndexable<{foo: string}> = false - * ContainsIndexable<{foo: string} | number[]> = true - * ``` - */ -export type ContainsIndexable = IsNever< - Extract> -> extends true ? false - : true - -/** - * Type to implement {@link Keys} for non-nullable values. - * @typeParam T - non-nullable type whose property should be checked - */ -type KeysImpl = [T] extends [Traversable] ? ContainsIndexable extends true ? NumericKeys - : ObjectKeys - : never - -/** - * Type to find all properties of a type that match the constraint type - * and return their keys. - * If a union is passed, it evaluates to the overlapping keys. - * @typeParam T - type whose property should be checked - * @typeParam U - constraint type - * @example - * ``` - * Keys<{foo: string, bar: string}, string> = 'foo' | 'bar' - * Keys<{foo?: string, bar?: string}> = 'foo' | 'bar' - * Keys<{foo: string, bar: number}, string> = 'foo' - * Keys<[string, number], string> = '0' - * Keys = `${number}` - * Keys<{0: string, '1': string} | [number] | number[]> = '0' - * ``` - */ -export type Keys = IsAny extends true ? Key - : IsNever extends true ? Key - : IsNever> extends true ? never - : CheckKeyConstraint>, U> - -/** - * Type to check whether a {@link Key} is present in a type. - * If a union of {@link Key}s is passed, all {@link Key}s have to be present - * in the type. - * @typeParam T - type which is introspected - * @typeParam K - key - * @example - * ``` - * HasKey<{foo: string}, 'foo'> = true - * HasKey<{foo: string}, 'bar'> = false - * HasKey<{foo: string}, 'foo' | 'bar'> = false - * ``` - */ -export type HasKey = IsNever>> - -/** - * Type to implement {@link ValidPathPrefix} tail recursively. - * @typeParam T - type which the path should be checked against - * @typeParam PT - path which should exist within the given type - * @typeParam VPT - accumulates the prefix of {@link Key}s which have been - * confirmed to exist already - */ -type ValidPathPrefixImpl< - T, - PT extends PathTuple, - VPT extends PathTuple -> = PT extends [infer K, ...infer R] ? HasKey> extends true ? ValidPathPrefixImpl< - EvaluateKey>, - AsPathTuple, - AsPathTuple<[...VPT, K]> - > - : VPT - : VPT - -/** - * Type to find the longest path prefix which is still valid, - * i.e. exists within the given type. - * @typeParam T - type which the path should be checked against - * @typeParam PT - path which should exist within the given type - * @example - * ``` - * ValidPathPrefix<{foo: {bar: string}}, ['foo', 'bar']> = ['foo', 'bar'] - * ValidPathPrefix<{foo: {bar: string}}, ['foo', 'ba']> = ['foo'] - * ``` - */ -export type ValidPathPrefix = ValidPathPrefixImpl< - T, - PT, - [] -> - -/** - * Type to check whether a path through a type exists. - * @typeParam T - type which the path should be checked against - * @typeParam PT - path which should exist within the given type - * @example - * ``` - * HasPath<{foo: {bar: string}}, ['foo', 'bar']> = true - * HasPath<{foo: {bar: string}}, ['foo', 'ba']> = false - * ``` - */ -export type HasPath = ValidPathPrefix extends PT ? true - : false diff --git a/packages/effect-app/src/Model/filter/types/path/eager.ts b/packages/effect-app/src/Model/filter/types/path/eager.ts deleted file mode 100644 index 26e8ef271..000000000 --- a/packages/effect-app/src/Model/filter/types/path/eager.ts +++ /dev/null @@ -1,329 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { expectTypeOf } from "@effect/vitest" -import type { FieldValues } from "../fields.ts" -import type { BrowserNativeObject, Equals, IsLiteral, IsNever, Primitive } from "../utils.ts" - -import type { ArrayKey, IsTuple, TupleKeys } from "./common.ts" - -/** - * Helper type for recursively constructing paths through a type. - * `Seen` carries the set of object types already entered on this branch so - * recursion terminates on self-referential types (see {@link Path}). - */ -type PathImpl = V extends - | Primitive - | BrowserNativeObject ? `${K}` - // Stop before re-entering a type already on this branch. Recursive types - // (notably `Json`, the encoded form of `Schema.Defect()`: - // `JsonObject = { [x: string]: Json }`) would otherwise descend forever and - // blow past TS's instantiation limit => TS2589. The key itself stays a valid - // leaf path; only the unbounded descent is cut. - : [V] extends [Seen] ? `${K}` - : `${K}` | `${K}.${Path}` - -/** - * Type which eagerly collects all paths through a type - * @typeParam T - type which should be introspected - * @typeParam Seen - object types already entered on this recursion branch; - * used to terminate on self-referential types - * @example - * ``` - * Path<{foo: {bar: string}}> = 'foo' | 'foo.bar' - * ``` - */ -export type Path = T extends ReadonlyArray ? IsTuple extends true ? { - [K in TupleKeys]-?: PathImpl | "length" - }[TupleKeys] - : PathImpl | "length" - : { - [K in keyof T]-?: PathImpl - }[keyof T] - -/** - * See {@link Path} - */ -export type FieldPath = Path - -{ - // Regression: self-referential types must terminate instead of blowing past - // TS's instantiation limit (TS2589). `JsonLike` mirrors effect's `Json` — the - // encoded form of `Schema.Defect()` — whose `{ [x: string]: Json }` index - // signature previously made `Path` recurse forever. These aliases failing to - // compile (rather than resolving to a string union) signals the regression. - type JsonLike = - | string - | number - | boolean - | null - | ReadonlyArray - | { readonly [x: string]: JsonLike } - type _RawDefect = Path<{ id: string; raw: JsonLike }> - type _NestedDefect = Path<{ a: { b: { error: { raw: JsonLike } } } }> - type _ArrayOfDefect = Path<{ items: ReadonlyArray<{ raw: JsonLike }> }> - // finite paths are still produced - expectTypeOf<"id">().toExtend<_RawDefect>() - expectTypeOf<"raw">().toExtend<_RawDefect>() - expectTypeOf<"a.b.error.raw">().toExtend<_NestedDefect>() - expectTypeOf<`items.${number}.raw`>().toExtend<_ArrayOfDefect>() -} - -/** - * Type to evaluate the type which the given path points to. - * @typeParam T - deeply nested type which is indexed by the path - * @typeParam P - path into the deeply nested type - * @example - * ``` - * PathValue<{foo: {bar: string}}, 'foo.bar'> = string - * PathValue<[number, string], '1'> = string - * ``` - */ -/* dprint-ignore-start */ -export type PathValue> = - T extends any - ? P extends `${infer K}.${infer R}` - ? K extends keyof T - ? R extends Path - ? PathValue - : never - : K extends `${ArrayKey}` - ? T extends ReadonlyArray - ? PathValue> - : never - : never - : P extends keyof T - ? T[P] - : P extends `${ArrayKey}` - ? T extends ReadonlyArray - ? V - : never - : never - : never -/* dprint-ignore-end */ - -/** - * See {@link PathValue} - */ -export type FieldPathValue< - TFieldValues extends FieldValues, - TFieldPath extends FieldPath -> = PathValue - -/* dprint-ignore-start */ -export type SetPathValue, X> = - T extends any - ? P extends `${infer K}.${infer R}` - ? K extends keyof T - ? R extends Path - ? { [_ in keyof T]: _ extends K ? SetPathValue : T[_] } - : never - : K extends `${ArrayKey}` - ? T extends ReadonlyArray - ? { [_ in keyof T]: SetPathValue, X> } - : never - : never - : P extends keyof T - ? { [_ in keyof T]: _ extends P ? X : T[_] } - : P extends `${ArrayKey}` - ? T extends ReadonlyArray - ? { [_ in keyof T]: X } - : never - : never - : never -/* dprint-ignore-end */ - -export type SetFieldPathValue< - TFieldValues extends FieldValues, - TFieldPath extends FieldPath, - X -> = SetPathValue - -/* dprint-ignore-start */ -export type RefinePathValue, X extends string | number | boolean | null | bigint, Exclde extends boolean = false> = - T extends any - // recursive cases - ? P extends `${infer K}.${infer R}` - ? K extends keyof T - ? R extends Path - ? { [_ in keyof T]: _ extends K ? RefinePathValue : T[_] } - : never - : K extends `${ArrayKey}` - ? T extends ReadonlyArray - ? { [_ in keyof T]: RefinePathValue, X, Exclde> } - : never - : never - // base cases - : P extends keyof T - ? X extends T[P] - ? ({ [_ in keyof T]: _ extends P - ? Equals< - Exclde, - true, - Exclude, - IsLiteral>> - > - : T[_] - }) extends infer $T - ? Equals, true, never, $T> - : never - : Equals - : P extends `${ArrayKey}` - ? T extends ReadonlyArray - ? X extends V - ? { [_ in keyof T]: Equals< - Exclde, - true, - Exclude, - IsLiteral>> - > } - : never - : never - : never - : never -/* dprint-ignore-end */ - -export type EraseNeverContainingUnionElements = T extends any ? { - [K in keyof T]: IsNever extends true ? true : false -} extends infer $NC ? true extends $NC[keyof $NC] ? never : T -: never : never - -export type RefineFieldPathValue< - TFieldValues extends FieldValues, - TFieldPath extends FieldPath, - X extends string | number | boolean | null | bigint, - Exclde extends boolean = false -> = EraseNeverContainingUnionElements> - -{ - type test1 = RefineFieldPathValue<{ a: { b: "tag1"; v1: string } | { b: "tag2"; v2: number } }, "a.b", "tag1"> - expectTypeOf().toEqualTypeOf<{ a: { b: "tag1"; v1: string } }>() - - type test2 = RefineFieldPathValue<{ b: "tag1"; v1: string } | { b: "tag2"; v2: number }, "b", "tag1"> - expectTypeOf().toEqualTypeOf<{ b: "tag1"; v1: string }>() - - type test3 = RefineFieldPathValue<{ b: "tag1" | "tag2" }, "b", "tag1"> - expectTypeOf().toEqualTypeOf<{ b: "tag1" }>() - - type test4 = RefineFieldPathValue<{ b: ("tag1" | "tag2")[] }, `b.${number}`, "tag1"> - expectTypeOf().toEqualTypeOf<{ b: "tag1"[] }>() - - type test5 = RefineFieldPathValue<{ b: "tag1"; v1: unknown } | { b: "tag2"; v2: unknown }, "b", "tag1"> - expectTypeOf().toEqualTypeOf<{ b: "tag1"; v1: unknown }>() - - type test6 = RefineFieldPathValue< - { a: { b: "tag1"; v1: string } | { b: "tag2"; v2: number } } | { something: "else " }, - "a.b", - "tag2" - > - expectTypeOf().toEqualTypeOf<{ a: { b: "tag2"; v2: number } }>() - - type test7 = RefineFieldPathValue<{ b: string | null }, "b", "tag1"> - expectTypeOf().toEqualTypeOf<{ b: string }>() - - type test8 = RefineFieldPathValue<{ b: string | null }, "b", null> - expectTypeOf().toEqualTypeOf<{ b: null }>() - - type test1E = RefineFieldPathValue<{ a: { b: "tag1"; v1: string } | { b: "tag2"; v2: number } }, "a.b", "tag1", true> - expectTypeOf().toEqualTypeOf<{ a: { b: "tag2"; v2: number } }>() - - type test2E = RefineFieldPathValue<{ b: "tag1"; v1: string } | { b: "tag2"; v2: number }, "b", "tag2", true> - expectTypeOf().toEqualTypeOf<{ b: "tag1"; v1: string }>() - - type test3E = RefineFieldPathValue<{ b: "tag1" | "tag2" | null }, "b", null, true> - expectTypeOf().toEqualTypeOf<{ b: "tag1" | "tag2" }>() - - type test4E = RefineFieldPathValue<{ b: ("tag1" | "tag2")[] }, `b.${number}`, "tag1", true> - expectTypeOf().toEqualTypeOf<{ b: "tag2"[] }>() - - type test5E = RefineFieldPathValue<{ b: "tag1"; v1: unknown } | { b: "tag2"; v2: unknown }, "b", "tag1", true> - expectTypeOf().toEqualTypeOf<{ b: "tag2"; v2: unknown }>() - - type test6E = RefineFieldPathValue< - { a: { b: "tag1"; v1: string } | { b: "tag2"; v2: number } } | { something: "else " }, - "a.b", - "tag2", - true - > - expectTypeOf().toEqualTypeOf<{ a: { b: "tag1"; v1: string } }>() - - type test10 = RefineFieldPathValue< - | { nested: { a: string; _tag: "a" } | { b: number; _tag: "b" }; _tag: "ab" } - | { nested: { b: number; _tag: "b" } | { c: boolean; _tag: "c" }; _tag: "bc" }, - "nested._tag", - "a" - > - - expectTypeOf().toEqualTypeOf<{ - nested: { - a: string - _tag: "a" - } - _tag: "ab" - }>() -} - -{ - type test1 = SetFieldPathValue<{ foo: { bar: string[] } }, `foo.bar`, boolean> - expectTypeOf().toEqualTypeOf<{ foo: { bar: boolean } }>() - - type test1a = SetFieldPathValue<{ foo: { bar: string[]; baz: 12 } }, `foo.bar`, boolean> - expectTypeOf().toEqualTypeOf<{ foo: { bar: boolean; baz: 12 } }>() - - type test2 = SetFieldPathValue<{ foo: { bar: string[] } }, `foo.bar.${number}`, boolean> - expectTypeOf().toEqualTypeOf<{ foo: { bar: boolean[] } }>() - - type test2a = SetFieldPathValue<{ foo: { bar: readonly string[]; baz: 3 }; ban: 123 }, `foo.bar.${number}`, boolean> - expectTypeOf().toEqualTypeOf<{ foo: { bar: readonly boolean[]; baz: 3 }; ban: 123 }>() - - type test2b = SetFieldPathValue< - { foo: { bar: readonly { a: 1; b: 2 }[]; baz: 3 }; ban: 123 }, - `foo.bar.${number}.b`, - "b" - > - expectTypeOf().toEqualTypeOf<{ foo: { bar: readonly { a: 1; b: "b" }[]; baz: 3 }; ban: 123 }>() - - type test3 = SetFieldPathValue<{ foo: ["a", "b"] }, `foo.0`, boolean> - expectTypeOf().toEqualTypeOf<{ foo: [boolean, "b"] }>() - - type test3a = SetFieldPathValue<{ foo: [{ a: 123 }, "b"] }, `foo.0.a`, boolean> - expectTypeOf().toEqualTypeOf<{ foo: [{ a: boolean }, "b"] }>() -} - -/** - * Type to evaluate the type which the given paths point to. - * @typeParam TFieldValues - field values which are indexed by the paths - * @typeParam TPath - paths into the deeply nested field values - * @example - * ``` - * FieldPathValues<{foo: {bar: string}}, ['foo', 'foo.bar']> - * = [{bar: string}, string] - * ``` - */ -export type FieldPathValues< - TFieldValues extends FieldValues, - TPath extends FieldPath[] | readonly FieldPath[] -> = - & {} - & { - [K in keyof TPath]: FieldPathValue< - TFieldValues, - TPath[K] & FieldPath - > - } - -/** - * Type which eagerly collects all paths through a fieldType that matches a give type - * @typeParam TFieldValues - field values which are indexed by the paths - * @typeParam TValue - the value you want to match into each type - * @example - * ```typescript - * FieldPathByValue<{foo: {bar: number}, baz: number, bar: string}, number> - * = 'foo.bar' | 'baz' - * ``` - */ -export type FieldPathByValue = { - [Key in FieldPath]: FieldPathValue< - TFieldValues, - Key - > extends TValue ? Key - : never -}[FieldPath] diff --git a/packages/effect-app/src/Model/filter/types/path/index.ts b/packages/effect-app/src/Model/filter/types/path/index.ts deleted file mode 100644 index 67d7d71b2..000000000 --- a/packages/effect-app/src/Model/filter/types/path/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -/** Re-export public API */ - -export type { PathString } from "./common.ts" -export type { FieldPath, FieldPathByValue, FieldPathValue, FieldPathValues, Path, PathValue } from "./eager.ts" diff --git a/packages/effect-app/src/Model/filter/types/utils.ts b/packages/effect-app/src/Model/filter/types/utils.ts deleted file mode 100644 index 95d8aa7db..000000000 --- a/packages/effect-app/src/Model/filter/types/utils.ts +++ /dev/null @@ -1,128 +0,0 @@ -declare const $NestedValue: unique symbol - -/** - * @deprecated to be removed in the next major version - */ -export type NestedValue = { - [$NestedValue]: never -} & TValue - -/** - * @deprecated to be removed in the next major version - */ -export type UnpackNestedValue = T extends NestedValue ? U - : T extends Date | FileList | File | Blob ? T - : T extends object ? { [K in keyof T]: UnpackNestedValue } - : T - -/* -Projects that React Hook Form installed don't include the DOM library need these interfaces to compile. -React Native applications is no DOM available. The JavaScript runtime is ES6/ES2015 only. -These definitions allow such projects to compile with only --lib ES6. - -Warning: all of these interfaces are empty. -If you want type definitions for various properties, you need to add `--lib DOM` (via command line or tsconfig.json). -*/ - -export type Noop = () => void - -interface File extends Blob { - readonly lastModified: number - readonly name: string -} - -interface FileList { - readonly length: number - item(index: number): File | null - [index: number]: File -} - -export type Primitive = - | null - | undefined - | string - | number - | boolean - | symbol - | bigint - -export type BrowserNativeObject = Date | FileList | File - -export type EmptyObject = { [K in string | number]: never } - -export type NonUndefined = T extends undefined ? never : T - -export type LiteralUnion = - | T - | (U & { _?: never }) - -export type DeepPartial = T extends BrowserNativeObject | NestedValue ? T - : { [K in keyof T]?: DeepPartial } - -export type DeepPartialSkipArrayKey = T extends - | BrowserNativeObject - | NestedValue ? T - : T extends ReadonlyArray ? { [K in keyof T]: DeepPartialSkipArrayKey } - : { [K in keyof T]?: DeepPartialSkipArrayKey } - -/** - * Checks whether the type is any - * See {@link https://stackoverflow.com/a/49928360/3406963} - * @typeParam T - type which may be any - * ``` - * IsAny = true - * IsAny = false - * ``` - */ -export type IsAny = 0 extends 1 & T ? true : false - -/** - * Checks whether the type is never - * @typeParam T - type which may be never - * ``` - * IsAny = true - * IsAny = false - * ``` - */ -export type IsNever = [T] extends [never] ? true : false - -export type DeepMap = IsAny extends true ? any - : T extends BrowserNativeObject | NestedValue ? TValue - : T extends object ? { [K in keyof T]: DeepMap, TValue> } - : TValue - -export type IsFlatObject = Extract< - Exclude, - any[] | object -> extends never ? true - : false - -export type Merge = { - [K in keyof A | keyof B]?: K extends keyof A & keyof B ? [A[K], B[K]] extends [object, object] ? Merge - : A[K] | B[K] - : K extends keyof A ? A[K] - : K extends keyof B ? B[K] - : never -} - -export type Resolve = - & { - [K in keyof T]: Resolve - } - & {} - -export type ResolveFirstLevel = - & { - [K in keyof T]: T[K] - } - & {} - -export type Cast = T extends U ? T : U - -export type IsLiteral = string extends T ? False : number extends T ? False : True - -export type Extends = T extends U ? True : False - -export type IsEqual = (<_>() => _ extends T ? 1 : 2) extends (<_>() => _ extends U ? 1 : 2) ? true : false - -export type Equals = IsEqual extends true ? True : False diff --git a/packages/effect-app/src/Model/filter/types/validator.ts b/packages/effect-app/src/Model/filter/types/validator.ts deleted file mode 100644 index 062346819..000000000 --- a/packages/effect-app/src/Model/filter/types/validator.ts +++ /dev/null @@ -1,46 +0,0 @@ -import type { Message } from "./errors.ts" -import type { FieldValues, InternalFieldName } from "./fields.ts" -import type { FieldPath, FieldPathValue } from "./path/index.ts" - -export type ValidationValue = boolean | number | string | RegExp - -export type ValidationRule< - TValidationValue extends ValidationValue = ValidationValue -> = TValidationValue | ValidationValueMessage - -export type ValidationValueMessage< - TValidationValue extends ValidationValue = ValidationValue -> = { - value: TValidationValue - message: Message -} - -export type ValidateResult = Message | Message[] | boolean | undefined - -export type Validate = ( - value: TFieldValue -) => ValidateResult | Promise - -export type RegisterOptions< - TFieldValues extends FieldValues = FieldValues, - TFieldName extends FieldPath = FieldPath -> = Partial<{ - required: Message | ValidationRule - min: ValidationRule - max: ValidationRule - maxLength: ValidationRule - minLength: ValidationRule - pattern: ValidationRule - validate: - | Validate> - | Record>> - valueAsNumber: boolean - valueAsDate: boolean - value: FieldPathValue - setValueAs: (value: any) => any - shouldUnregister?: boolean - onChange?: (event: any) => void - onBlur?: (event: any) => void - disabled: boolean - deps: InternalFieldName | InternalFieldName[] -}> diff --git a/packages/effect-app/src/Model/query.ts b/packages/effect-app/src/Model/query.ts deleted file mode 100644 index 22d242aca..000000000 --- a/packages/effect-app/src/Model/query.ts +++ /dev/null @@ -1,13 +0,0 @@ -export * from "./query/dsl.ts" -export * from "./query/new-kid-interpreter.ts" - -export interface RawQuery { - cosmos: (vals: { name: string }) => { - query: string - parameters: { - name: string - value: any - }[] - } - memory: (t: readonly Encoded[]) => readonly Out[] -} diff --git a/packages/effect-app/src/Model/query/dsl.ts b/packages/effect-app/src/Model/query/dsl.ts deleted file mode 100644 index b91351471..000000000 --- a/packages/effect-app/src/Model/query/dsl.ts +++ /dev/null @@ -1,3092 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import * as Data from "effect/Data" -import { flow } from "effect/Function" -import * as Pipeable from "effect/Pipeable" -import type { Covariant } from "effect/Types" -import type * as Option from "../../Option.ts" -import type * as S from "../../Schema.ts" -import type { NonNegativeInt } from "../../Schema.ts" -import type { Ops } from "../filter/filterApi.ts" -import type { FieldValues } from "../filter/types.ts" -import type { FieldPath, FieldPathValue, RefineFieldPathValue } from "../filter/types/path/eager.ts" - -export type QAll< - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - A = TFieldValues, - R = never, - TType extends "one" | "many" = "many", - Exclusive extends boolean = false -> = - | Query - | QueryWhere - | QueryEnd - | QueryProjection - -export const QId = Symbol() -export type QId = typeof QId - -export interface QueryTogether< - out TFieldValues extends FieldValues, - out TFieldValuesRefined extends TFieldValues = TFieldValues, - out Exclusive extends boolean = false, - out T extends "initial" | "where" | "end" | "projection" = "initial", - out A = TFieldValues, - out R = never, - out TType extends "many" | "one" | "count" = "many" -> extends Pipeable.Pipeable { - readonly [QId]: { - readonly _TFieldValues: Covariant - readonly _T: Covariant - readonly _TFieldValuesRefined: Covariant - readonly _A: Covariant - readonly _R: Covariant - readonly _TT: Covariant - readonly _Exclusive: Covariant - } -} - -type ExtractTType = T extends QueryTogether ? TType : never -type ExtractExclusiveness = T extends QueryTogether - ? Exclusive - : never -type ExtractFieldValues = T extends QueryTogether ? TFieldValues - : never -type ExtractFieldValuesRefined = T extends QueryTogether - ? TFieldValuesRefined - : never -type KeysOfUnion = T extends T ? keyof T : never -/** Peel Schema `tag`/`Literal` brands down to the underlying literal value. */ -type LiteralValue = T extends { readonly literal: infer L } ? L - : T extends string | number | boolean | null | bigint ? T - // Schema.tag<"x"> / withConstructorDefault wrappers are object brands whose - // nominal shape is not a PropertyKey — fall back to never so callers treat - // them via UnwrapTag below. - : never -// Last-resort: if T is a single object brand wrapping a string literal in its -// structure, treat non-union object tags as single-literal for same-tag duals. -type TagKey = [LiteralValue] extends [never] ? ( - string extends T ? string - : [T] extends [PropertyKey] ? T - // object brand (e.g. tag<"packing">): treat as single opaque tag token - : T - ) - : LiteralValue -// One-directional: domain tag may be a single literal that is a member of a -// multi-tag projection (`"picking" extends "picking"|"picked"`). Bidirectional -// equality would reject every multi-tag flat projection. -type ExtractTagged = From extends { readonly _tag: infer FromTag } - ? [TagKey] extends [TagKey] ? From : never - : never -type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never -/** - * True when `Tag` is a single tag token (string literal or opaque brand like - * Schema.tag<"packing">), not a union of tags and not bare `string`. - */ -type IsSingleLiteralTag = string extends Tag ? false - : [Tag] extends [UnionToIntersection] ? true - : false -/** - * Domain shape that may supply stored fields for projection member `I`. - * - * - True tagged unions (`A | B` with different fields per `_tag`) resolve to the - * matching member so state-owned keys are not treated as universal. - * - Flat models that only carry `_tag: "a" | "b"` on a shared shape (no - * per-tag members in the Encoded union) fall back to the full `From` so - * existing Class+Literals projections keep typechecking. - */ -type ProjectableSource = I extends { readonly _tag: infer Tag } ? ( - [ExtractTagged] extends [never] ? From : ExtractTagged - ) - : From - -/** - * One projection member is projectable when every key is either: - * - in `ExtraKeys` (computed by the query / not stored on the domain row), or - * - a key of the matching domain source member (key presence only; nested - * field types may be narrowed by the projection). - * - * Uses `keyof Source` (not `KeysOfUnion` of the whole domain union) so a field - * owned only by some tags cannot be required on every branch — except for a - * single literal tag that maps to several domain variants (same `_tag`, - * different payloads), where `KeysOfUnion` allows each variant's keys. - */ -/** - * Keys the domain may supply for projection member `I`. - * - Single-literal tagged `I` (`_tag: "packing"`): keys of *any* same-tag - * domain variant (`KeysOfUnion`) — dual packing/closed shapes stay projectable. - * - Multi-tag / string-tagged `I` (`_tag: "a"|"b"` or `string`): keys of the - * *intersection* of matched domain members (`keyof` of the source union) so - * a flat multi-tag DTO cannot claim state-only fields (e.g. `batchId` on - * `initial`). - * - Untagged `I` (plain project DTOs): keys present on *any* domain member - * (`KeysOfUnion`), matching historical `project()` behavior. - */ -type ProjectableDomainKeys = I extends { readonly _tag: infer Tag } ? ( - IsSingleLiteralTag extends true ? KeysOfUnion> - : keyof ProjectableSource - ) - : KeysOfUnion - -/** - * Keys on projection member `I` that are neither computed (`ExtraKeys`) nor - * present on the matching domain source. Key presence only — nested field - * types may be narrowed by the projection, and optional domain/projection - * keys must not fail via `{ k?: T } extends { k: T }` (the old `-?` mapped - * assignability check rejected legitimate optionalKey fields like closed.batchId). - */ -type UnprojectableKeys = { - [K in keyof I]-?: K extends ExtraKeys ? never - : K extends ProjectableDomainKeys ? never - : K -}[keyof I] - -/** - * Distribute over tagged-union projection Encoded types. A non-distributive - * check against a union only sees `keyof (A|B)` (key intersection) and misses - * branch-only fields like cancel-only omissions. - */ -type IsProjectableMember = [I] extends [FieldValues] - ? ([UnprojectableKeys] extends [never] ? true : false) - : false - -/** - * `unknown` when every member of projection Encoded `I` is projectable from - * domain Encoded `From` (plus optional ExtraKeys for computed fields); `never` - * otherwise — use as an intersection constraint on a schema argument. - */ -type ProjectableGuard = false extends ( - I extends any ? IsProjectableMember : never -) ? never - : unknown - -/** - * Compile-time proof that a projection Encoded shape only requires stored keys - * that exist on the matching domain tagged state (or non-tagged source), plus - * any `ExtraKeys` filled by `projectComputed` (counts, flags, collects, …). - * - * Catches the class of Overview.List SchemaError where a cancel/recovery state - * omits a workflow lock field (`activeRequest`) in the domain model but the - * projection still requires it on every branch. - * - * @example - * ```ts - * type _ok = ProjectableFromDomain< - * { readonly _tag: "cancelled"; readonly id: string }, - * DomainEnc - * > // unknown - * - * type _bad = ProjectableFromDomain< - * { readonly _tag: "cancelled"; readonly id: string; readonly activeRequest: null }, - * DomainEnc - * > // never — activeRequest is not on domain cancelled - * ``` - */ -export type ProjectableFromDomain< - ProjectionEncoded, - DomainEncoded, - ExtraKeys extends PropertyKey = never -> = ProjectableGuard - -export type RelationDirection = "some" | "every" -export type Relation = { relation: RelationDirection } -export type Query = QueryTogether -export type QueryWhere< - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - Exclusive extends boolean = false -> = - & QueryTogether< - TFieldValues, - TFieldValuesRefined, - Exclusive, - "where" - > - & Relation - -export type QueryEnd< - TFieldValues extends FieldValues, - TType extends "many" | "one" | "count" = "many", - Exclusive extends boolean = false -> = QueryTogether< - TFieldValues, - TFieldValues, - Exclusive, - "end", - TFieldValues, - never, - TType -> - -export type QueryProjection< - TFieldValues extends FieldValues, - A = TFieldValues, - R = never, - TType extends "many" | "one" | "count" = "many", - Exclusive extends boolean = false -> = QueryTogether< - TFieldValues, - TFieldValues, - Exclusive, - "projection", - A, - R, - TType -> - -export type ComputedProjectionOperation = (q: Query) => QueryWhere - -export type ComputedProjectionMathExpression = - | { - readonly _tag: "field" - readonly field: string - } - | { - readonly _tag: "mul" - readonly left: ComputedProjectionMathExpression - readonly right: ComputedProjectionMathExpression - } - -declare const ComputedProjectionExpressionTypeId: unique symbol - -type ComputedProjectionOutput = { - readonly [ComputedProjectionExpressionTypeId]?: Covariant -} - -export type ComputedProjectionExpression = - & ComputedProjectionOutput - & ( - | { - readonly _tag: "relation-count" - readonly path: string - readonly operation?: ComputedProjectionOperation - } - | { - readonly _tag: "relation-any" - readonly path: string - readonly operation?: ComputedProjectionOperation - } - | { - readonly _tag: "relation-every" - readonly path: string - readonly operation: ComputedProjectionOperation - } - | { - readonly _tag: "relation-distinct-count" - readonly path: string - readonly field: string - readonly operation?: ComputedProjectionOperation - } - | { - readonly _tag: "relation-sum" - readonly path: string - readonly field: string - readonly operation?: ComputedProjectionOperation - } - | { - readonly _tag: "relation-sum-expr" - readonly path: string - readonly expression: ComputedProjectionMathExpression - readonly operation?: ComputedProjectionOperation - } - | { - readonly _tag: "relation-sum-expr-by" - readonly path: string - readonly expression: ComputedProjectionMathExpression - readonly unit: string - readonly operation?: ComputedProjectionOperation - } - | { - readonly _tag: "relation-sum-expr-normalized" - readonly path: string - readonly expression: ComputedProjectionMathExpression - readonly unit: string - readonly toBase: string - readonly factors: Readonly> - readonly operation?: ComputedProjectionOperation - } - | { - readonly _tag: "relation-collect" - readonly path: string - readonly field: string - readonly distinct: boolean - readonly operation?: ComputedProjectionOperation - } - | { - readonly _tag: "relation-collect-fields" - readonly path: string - readonly fields: readonly string[] - readonly distinct: boolean - readonly operation?: ComputedProjectionOperation - } - | { - readonly _tag: "relation-length" - readonly path: string - } - ) - -type NoExtraComputedKeys = string extends keyof M ? unknown - : Exclude> extends never ? unknown - : never - -/** - * An expression that aggregates values across documents (for use with {@link aggregate}). - * `agg-field` references a document field to group by; other tags are aggregate functions. - */ -export type AggregateExpression = - | { - readonly _tag: "agg-field" - readonly path: string - } - | { - readonly _tag: "agg-count" - } - | { - readonly _tag: "agg-count-when" - readonly operation: ComputedProjectionOperation - } - | { - readonly _tag: "agg-sum" - readonly field: string - } - | { - readonly _tag: "agg-min" - readonly field: string - } - | { - readonly _tag: "agg-max" - readonly field: string - } - -export type AggregateMap = Readonly> - -export type ComputedProjectionMap = Readonly> -export type Q = - | Initial - | Where - | And - | Or - | Order - | Page - | Project - | One - | Count - -export class Initial extends Data.TaggedClass("value")<{ value: "initial" }> - implements Query -{ - readonly [QId]!: any - constructor() { - super({ value: "initial" as const }) - } - override pipe() { - // eslint-disable-next-line prefer-rest-params - return Pipeable.pipeArguments(this, arguments) - } -} - -export class Where extends Data.TaggedClass("where")<{ - current: Query - operation: [string, Ops, any] | [string, any] | ((q: Query) => QueryWhere) - relation: RelationDirection - subPath?: string -}> implements QueryWhere { - readonly [QId]!: any - - override pipe() { - // eslint-disable-next-line prefer-rest-params - return Pipeable.pipeArguments(this, arguments) - } -} - -export class And extends Data.TaggedClass("and")<{ - current: Query - operation: [string, Ops, any] | [string, any] | ((q: Query) => QueryWhere) - relation: RelationDirection -}> implements QueryWhere { - readonly [QId]!: any - override pipe() { - // eslint-disable-next-line prefer-rest-params - return Pipeable.pipeArguments(this, arguments) - } -} - -export class Or extends Data.TaggedClass("or")<{ - current: Query - operation: [string, Ops, any] | [string, any] | ((q: Query) => QueryWhere) - relation: RelationDirection -}> implements QueryWhere { - readonly [QId]!: any - override pipe() { - // eslint-disable-next-line prefer-rest-params - return Pipeable.pipeArguments(this, arguments) - } -} - -export class Page extends Data.TaggedClass("page")<{ - current: Query | QueryWhere | QueryEnd - take?: number | undefined - skip?: number | undefined -}> implements QueryEnd { - readonly [QId]!: any - override pipe() { - // eslint-disable-next-line prefer-rest-params - return Pipeable.pipeArguments(this, arguments) - } -} - -export class One extends Data.TaggedClass("one")<{ - current: Query | QueryWhere | QueryEnd -}> implements QueryEnd { - readonly [QId]!: any - override pipe() { - // eslint-disable-next-line prefer-rest-params - return Pipeable.pipeArguments(this, arguments) - } -} - -export class Count extends Data.TaggedClass("count")<{ - current: Query | QueryWhere | QueryEnd -}> implements QueryEnd { - readonly [QId]!: any - override pipe() { - // eslint-disable-next-line prefer-rest-params - return Pipeable.pipeArguments(this, arguments) - } -} - -export class Order> - extends Data.TaggedClass("order")<{ - current: Query | QueryWhere | QueryEnd - field: TFieldName - direction: "ASC" | "DESC" - }> - implements QueryEnd -{ - readonly [QId]!: any - override pipe() { - // eslint-disable-next-line prefer-rest-params - return Pipeable.pipeArguments(this, arguments) - } -} - -export class Project - extends Data.TaggedClass("project")<{ - current: Query | QueryWhere | QueryEnd - schema: S.Codec - mode: "collect" | "project" | "transform" | "aggregate" - computed?: ComputedProjectionMap - aggregateMap?: AggregateMap - }> - implements QueryProjection -{ - readonly [QId]!: any - override pipe() { - // eslint-disable-next-line prefer-rest-params - return Pipeable.pipeArguments(this, arguments) - } -} - -export const make: () => Query = () => new Initial() - -export const where: FilterWhere = (...operation: any[]) => (current: any) => - new Where({ current, operation: typeof operation[0] === "function" ? flow(...operation as [any]) : operation } as any) - -export const and: FilterContinuationAnd = (...operation: any[]) => (current: any) => - new And({ current, operation: typeof operation[0] === "function" ? flow(...operation as [any]) : operation } as any) - -export const or: FilterContinuationOr = (...operation: any[]) => (current: any) => - new Or({ current, operation: typeof operation[0] === "function" ? flow(...operation as [any]) : operation } as any) - -export const whereEvery: WhereEveryOrSome = - ((subPath: string, ...[first, ...rest]: any[]) => (current: any) => - new Where( - { - current, - operation: typeof first === "function" - ? flow(...[first, ...rest] as [any]) - : [`${subPath}.-1.${first}`, ...rest], - relation: "every", - subPath - } as any - )) as unknown as WhereEveryOrSome -export const whereSome: WhereEveryOrSome = - ((subPath: string, ...[first, ...rest]: any[]) => (current: any) => - new Where( - { - current, - operation: typeof first === "function" - ? flow(...[first, ...rest] as [any]) - : [`${subPath}.-1.${first}`, ...rest], - relation: "some", - subPath - } as any - )) as unknown as WhereEveryOrSome - -export const order: { - < - Q extends Query | QueryWhere | QueryEnd - >( - field: FieldPath>, - direction?: "ASC" | "DESC" - ): ( - current: Q - ) => QueryEnd, "many", ExtractExclusiveness> -} = (field, direction = "ASC") => (current) => new Order({ current, field: field as any, direction }) - -export const page: { - ( - page: { skip?: number; take?: number } - ): | QueryWhere | QueryEnd>( - current: Q - ) => QueryEnd, "many", ExtractExclusiveness> -} = ({ skip, take }) => (current) => - new Page({ - current, - take, - skip - }) - -export const one: { - | QueryWhere | QueryEnd>( - current: Q - ): QueryEnd, "one", ExtractExclusiveness> -} = (current) => - new One({ - current - }) - -// it's better to implement a distinct count so that the implementation can be optimised per adapter -export const count: { - < - Q extends Query | QueryWhere | QueryEnd - >( - current: Q - ): QueryProjection, NonNegativeInt, never, "count", ExtractExclusiveness> -} = (current) => new Count({ current }) - -/** - * Attach a projection schema to a query. - * - * The `select` clause sent to the store is derived from the schema's encoded - * AST property names (top-level + per-array sub-keys), so a projection always - * narrows what is read from the store. The repository augments that select - * with `id` and `_etag` for change tracking. See {@link toFilter} and the - * dispatch in `Repository/internal/internal.ts`. - * - * Modes — pick based on shape of the decoded value and on whether the - * persistence-model (PM) reverse-mapping is needed: - * - * - `"transform"` (default when `mode` omitted): goes through the repo's - * `parseMany` pipeline. The raw row is reverse-mapped via the - * etag/PM cache (re-injecting `_etag` and any PM-shape state) before - * decoding. Decode failures `orDie` (error channel = `never`). Use when - * the schema operates on the full PM shape (e.g. full-entity reads that - * must preserve etag tracking). - * - * - `"project"`: decodes the raw encoded row directly with the supplied - * schema. No PM reverse-mapping, no etag cache merge. Decode failures - * surface as `S.SchemaError`. Use for slim DTOs / aggregations that do not - * need etag tracking and whose schema input is a plain subset of `Encoded`. - * - * - `"collect"`: like `"project"`, but the schema yields `Option` and - * `None` values are dropped post-decode (`Array.getSomes`). Use to filter - * rows during decode (e.g. discriminated-union narrowing where some rows - * should not appear in the result). - */ -export const project: { - < - Q extends Query | QueryWhere | QueryEnd, - I extends ExtractFieldValuesRefined, - A = ExtractFieldValuesRefined, - R = never, - E extends boolean = ExtractExclusiveness - >( - schema: S.Codec, I, R>, - mode: "collect" - ): ( - current: Q - ) => QueryProjection, A, R, ExtractTType, E> - - < - Q extends Query | QueryWhere | QueryEnd, - I extends ExtractFieldValuesRefined, - A = ExtractFieldValuesRefined, - R = never, - E extends boolean = ExtractExclusiveness - >( - schema: S.Codec, - mode: "project" - ): ( - current: Q - ) => QueryProjection, A, R, ExtractTType, E> - < - Q extends Query | QueryWhere | QueryEnd, - I extends ExtractFieldValuesRefined, - A = ExtractFieldValuesRefined, - R = never, - E extends boolean = ExtractExclusiveness - >( - schema: S.Codec - ): ( - current: Q - ) => QueryProjection, A, R, ExtractTType, E> - - < - Q extends Query | QueryWhere | QueryEnd, - I extends FieldValues, - A, - R = never, - E extends boolean = ExtractExclusiveness - >( - schema: - & S.Codec, I, R> - & ProjectableGuard>, - mode: "collect" - ): ( - current: Q - ) => QueryProjection, A, R, ExtractTType, E> - - < - Q extends Query | QueryWhere | QueryEnd, - I extends FieldValues, - A, - R = never, - E extends boolean = ExtractExclusiveness - >( - schema: - & S.Codec - & ProjectableGuard>, - mode: "project" - ): ( - current: Q - ) => QueryProjection, A, R, ExtractTType, E> - < - Q extends Query | QueryWhere | QueryEnd, - I extends FieldValues, - A, - R = never, - E extends boolean = ExtractExclusiveness - >( - schema: - & S.Codec - & ProjectableGuard> - ): ( - current: Q - ) => QueryProjection, A, R, ExtractTType, E> -} = (schema: any, mode = "transform") => (current: any) => new Project({ current, schema, mode } as any) - -/** - * Element type of an array-valued field path on `TFieldValues`. Falls back to - * `FieldValues` when the path does not resolve to an array of structs so that - * `FieldPath<...>` stays defined (it just degrades to `string`). - * - * Uses `Extract` so that when `P` defaults to the full `FieldPath` - * union, only the array-valued branches contribute to the element type. - */ -export type RelationElement< - TFieldValues extends FieldValues, - P extends FieldPath -> = Extract, ReadonlyArray> extends ReadonlyArray - ? (E extends FieldValues ? E : FieldValues) - : FieldValues - -export const relation = < - TFieldValues extends FieldValues, - const P extends FieldPath = FieldPath ->( - path: P -) => ({ - /** - * Typed math-expression builder bound to the relation's element scope: - * `relation("items").expr.field("weight")` constrains the field path to - * `FieldPath>`. - */ - expr: { - field: (field: FieldPath>): ComputedProjectionMathExpression => ({ - _tag: "field", - field - }), - mul: ( - left: ComputedProjectionMathExpression, - right: ComputedProjectionMathExpression - ): ComputedProjectionMathExpression => ({ _tag: "mul", left, right }) - }, - length: (): ComputedProjectionExpression => ({ - _tag: "relation-length", - path - }), - count: (operation?: ComputedProjectionOperation): ComputedProjectionExpression => - operation - ? { - _tag: "relation-count", - path, - operation - } - : { - _tag: "relation-count", - path - }, - any: (operation?: ComputedProjectionOperation): ComputedProjectionExpression => - operation - ? { - _tag: "relation-any", - path, - operation - } - : { - _tag: "relation-any", - path - }, - every: (operation: ComputedProjectionOperation): ComputedProjectionExpression => ({ - _tag: "relation-every", - path, - operation - }), - distinctCount: >>( - field: F, - operation?: ComputedProjectionOperation - ): ComputedProjectionExpression => - operation - ? { - _tag: "relation-distinct-count", - path, - field, - operation - } - : { - _tag: "relation-distinct-count", - path, - field - }, - sum: >>( - field: F, - operation?: ComputedProjectionOperation - ): ComputedProjectionExpression => - operation - ? { - _tag: "relation-sum", - path, - field, - operation - } - : { - _tag: "relation-sum", - path, - field - }, - sumExpr: ( - expression: ComputedProjectionMathExpression, - operation?: ComputedProjectionOperation - ): ComputedProjectionExpression => - operation - ? { - _tag: "relation-sum-expr", - path, - expression, - operation - } - : { - _tag: "relation-sum-expr", - path, - expression - }, - sumExprBy: >>( - expression: ComputedProjectionMathExpression, - options: { unit: F }, - operation?: ComputedProjectionOperation - ): ComputedProjectionExpression< - ReadonlyArray<{ readonly unit: FieldPathValue, F>; readonly total: number }> - > => - operation - ? { - _tag: "relation-sum-expr-by", - path, - expression, - unit: options.unit, - operation - } - : { - _tag: "relation-sum-expr-by", - path, - expression, - unit: options.unit - }, - sumExprNormalized: ( - expression: ComputedProjectionMathExpression, - options: { - unit: FieldPath> - toBase: string - factors: Readonly> - }, - operation?: ComputedProjectionOperation - ): ComputedProjectionExpression => - operation - ? { - _tag: "relation-sum-expr-normalized", - path, - expression, - unit: options.unit, - toBase: options.toBase, - factors: options.factors, - operation - } - : { - _tag: "relation-sum-expr-normalized", - path, - expression, - unit: options.unit, - toBase: options.toBase, - factors: options.factors - }, - collect: >>( - field: F, - operation?: ComputedProjectionOperation - ): ComputedProjectionExpression, F>>> => - operation - ? { - _tag: "relation-collect", - path, - field, - distinct: false, - operation - } - : { - _tag: "relation-collect", - path, - field, - distinct: false - }, - collectDistinct: >>( - field: F, - operation?: ComputedProjectionOperation - ): ComputedProjectionExpression, F>>> => - operation - ? { - _tag: "relation-collect", - path, - field, - distinct: true, - operation - } - : { - _tag: "relation-collect", - path, - field, - distinct: true - }, - collectFields: >[]>( - fields: F, - operation?: ComputedProjectionOperation - ): ComputedProjectionExpression< - ReadonlyArray, F[number]>> - > => - operation - ? { - _tag: "relation-collect-fields", - path, - fields, - distinct: false, - operation - } - : { - _tag: "relation-collect-fields", - path, - fields, - distinct: false - }, - collectDistinctFields: >[]>( - fields: F, - operation?: ComputedProjectionOperation - ): ComputedProjectionExpression< - ReadonlyArray, F[number]>> - > => - operation - ? { - _tag: "relation-collect-fields", - path, - fields, - distinct: true, - operation - } - : { - _tag: "relation-collect-fields", - path, - fields, - distinct: true - } -}) - -/** - * Untyped math-expression builder. Field paths are not statically validated — - * prefer the scope-bound `relation(path).expr` builder when the element type - * is known, since it constrains the field argument to `FieldPath`. - * - * The generic parameter is accepted for symmetry with the scoped builder so - * callers may opt into a tighter check via `expr.field("x")`. - */ -export const expr = { - field: ( - field: FieldPath - ): ComputedProjectionMathExpression => ({ _tag: "field", field }), - mul: ( - left: ComputedProjectionMathExpression, - right: ComputedProjectionMathExpression - ): ComputedProjectionMathExpression => ({ _tag: "mul", left, right }) -} as const - -export const computed = (value: T): T => value - -/** - * Helpers passed to the inline-builder form of {@link projectComputed}. The - * `relation` factory is bound to the source row shape so paths/fields inside - * the projection are validated against the document shape inferred from the - * pipe. - */ -export interface ComputedHelpers { - relation: >(path: P) => ReturnType> -} - -const makeComputedHelpers = (): ComputedHelpers => ({ - relation: (path) => relation(path) -}) - -/** - * Only treat computed-map keys as ExtraKeys when `M` is a concrete object type. - * `ComputedProjectionMap` is `Record`, so `keyof M` is `string` and - * would otherwise allow every projection field as "computed". - */ -type ConcreteComputedKeys = string extends keyof M ? never : Extract - -/** - * Proof that projection Encoded `I` is projectable from domain Encoded, allowing - * concrete computed keys. Intersected onto the computed-map argument so - * inference of `M` is complete before the check runs. - */ -type ProjectableComputedMap< - M extends ComputedProjectionMap, - I extends FieldValues, - Domain -> = - & M - & NoExtraComputedKeys - & ( - [ProjectableGuard>] extends [never] ? { - readonly __projectableFromDomain: - "projection fields must exist on the matching domain tagged state or be computed keys" - } - : unknown - ) - -export const projectComputed: { - < - Q extends Query | QueryWhere | QueryEnd, - Schema extends S.Codec, - M extends ComputedProjectionMap, - I extends FieldValues = S.Codec.Encoded, - E extends boolean = ExtractExclusiveness - >( - schema: Schema, - build: (helpers: ComputedHelpers>) => ProjectableComputedMap>, - mode: "collect" - ): ( - current: Q - ) => QueryProjection< - ExtractFieldValuesRefined, - S.Schema.Type extends Option.Option ? A : never, - never, - ExtractTType, - E - > - - < - Q extends Query | QueryWhere | QueryEnd, - Schema extends S.Codec, - M extends ComputedProjectionMap, - I extends FieldValues = S.Codec.Encoded, - E extends boolean = ExtractExclusiveness - >( - schema: Schema, - build: (helpers: ComputedHelpers>) => ProjectableComputedMap>, - mode?: "project" - ): ( - current: Q - ) => QueryProjection, S.Schema.Type, never, ExtractTType, E> - - < - Q extends Query | QueryWhere | QueryEnd, - Schema extends S.Codec, - M extends ComputedProjectionMap, - I extends FieldValues = S.Codec.Encoded, - E extends boolean = ExtractExclusiveness - >( - schema: Schema, - computedProjection: ProjectableComputedMap>, - mode: "collect" - ): ( - current: Q - ) => QueryProjection< - ExtractFieldValuesRefined, - S.Schema.Type extends Option.Option ? A : never, - never, - ExtractTType, - E - > - - < - Q extends Query | QueryWhere | QueryEnd, - Schema extends S.Codec, - M extends ComputedProjectionMap, - I extends FieldValues = S.Codec.Encoded, - E extends boolean = ExtractExclusiveness - >( - schema: Schema, - computedProjection: ProjectableComputedMap>, - mode?: "project" - ): ( - current: Q - ) => QueryProjection, S.Schema.Type, never, ExtractTType, E> -} = ( - schema: any, - mapOrBuild: - | ComputedProjectionMap - | ((helpers: ComputedHelpers) => ComputedProjectionMap), - mode = "project" -) => -(current: any) => { - const computedProjection = typeof mapOrBuild === "function" - ? mapOrBuild(makeComputedHelpers()) - : mapOrBuild - return new Project({ current, schema, mode, computed: computedProjection }) -} - -/** - * Builder shape returned by {@link agg}. Field-taking methods are constrained - * to `FieldPath` so paths are validated against the document - * shape. - */ -export interface AggBuilder { - field: (path: FieldPath) => AggregateExpression - count: () => AggregateExpression - countWhen: (operation: ComputedProjectionOperation) => AggregateExpression - sum: (field: FieldPath) => AggregateExpression - min: (field: FieldPath) => AggregateExpression - max: (field: FieldPath) => AggregateExpression -} - -const makeAggBuilder = (): AggBuilder => ({ - field: (path) => ({ _tag: "agg-field", path }), - count: () => ({ _tag: "agg-count" }), - countWhen: (operation) => ({ _tag: "agg-count-when", operation }), - sum: (field) => ({ _tag: "agg-sum", field }), - min: (field) => ({ _tag: "agg-min", field }), - max: (field) => ({ _tag: "agg-max", field }) -}) - -/** - * Scope-bound aggregate-expression builder factory. Invoke with the source - * document field-value shape to get a builder whose `field`/`sum`/`min`/`max` - * arguments are constrained to `FieldPath`. - * - * Prefer the inline callback form of {@link aggregate} (`aggregate(schema, - * ($) => ({...}))`) — there the source shape is inferred from the pipe so no - * explicit type argument is needed. This factory is the escape hatch when - * the builder is constructed outside the pipe. - */ -export const agg = (): AggBuilder => - makeAggBuilder() - -/** - * Attach an aggregate projection to a query, performing GROUP BY + aggregate functions at the - * database level instead of fetching all rows and grouping in memory. - * - * Pass a builder callback to get a typed `agg` bound to the source row shape - * (inferred from the pipe — no explicit generic needed): - * - * @example - * ```ts - * repo.query( - * where("status", "active"), - * aggregate( - * S.Struct({ city: S.String, count: S.Number }), - * ($) => ({ - * city: $.field("address.city"), - * count: $.countWhen((q) => q.pipe(where("active", true))) - * }) - * ) - * ) - * ``` - * - * A plain {@link AggregateMap} is also accepted for the rare case where the - * map is built outside the pipe (loses path inference). - * - * The output is decoded directly with `schema` (no PM reverse-mapping, no etag tracking). - * Decode failures surface as `S.SchemaError`. - */ -export const aggregate: { - < - Q extends Query | QueryWhere | QueryEnd, - I extends Record, - A = ExtractFieldValuesRefined, - R = never, - E extends boolean = ExtractExclusiveness - >( - schema: S.Codec, - build: (agg: AggBuilder>) => AggregateMap - ): ( - current: Q - ) => QueryProjection, A, R, ExtractTType, E> - < - Q extends Query | QueryWhere | QueryEnd, - I extends Record, - A = ExtractFieldValuesRefined, - R = never, - E extends boolean = ExtractExclusiveness - >( - schema: S.Codec, - aggregateMap: AggregateMap - ): ( - current: Q - ) => QueryProjection, A, R, ExtractTType, E> -} = (schema: any, mapOrBuild: AggregateMap | ((agg: AggBuilder) => AggregateMap)) => (current: any) => { - const aggregateMap = typeof mapOrBuild === "function" - ? mapOrBuild(makeAggBuilder()) - : mapOrBuild - return new Project({ current, schema, mode: "aggregate", aggregateMap } as any) -} - -type GetArV = T extends ReadonlySet ? R - : T extends readonly (infer R)[] ? R - : never - -type GetMapK = T extends ReadonlyMap ? K : never -type GetMapV = T extends ReadonlyMap ? V : never -type GetMapEntry = T extends ReadonlyMap ? readonly [K, V] : never - -type InValues = readonly T[] | ReadonlySet - -export type FilterContinuations = { - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - V extends FieldPathValue, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false - >( - path: TFieldName, - value: V - ): ( - current: IsCurrentInitial extends true ? Query - : QueryWhere - ) => IsCurrentInitial extends true ? QueryWhere - : QueryWhere - - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - V extends FieldPathValue, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false - >( - path: TFieldName, - op: "gt" | "gte" | "lt" | "lte" | "neq", - value: V // only numbers? - ): ( - current: IsCurrentInitial extends true ? Query - : QueryWhere - ) => IsCurrentInitial extends true ? QueryWhere - : QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false - >( - path: TFieldName, - op: "startsWith" | "endsWith" | "contains" | "notContains" | "notStartsWith" | "notEndsWith", - value: FieldPathValue extends string ? string : never - ): ( - current: IsCurrentInitial extends true ? Query - : QueryWhere - ) => IsCurrentInitial extends true ? QueryWhere - : QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false - >( - path: TFieldName, - op: "in" | "notIn", - value: InValues> - ): ( - current: IsCurrentInitial extends true ? Query - : QueryWhere - ) => IsCurrentInitial extends true ? QueryWhere - : QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - V extends FieldPathValue, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false - >( - path: TFieldName, - op: - | "includes" - | "notIncludes", - value: GetArV - ): ( - current: IsCurrentInitial extends true ? Query - : QueryWhere - ) => IsCurrentInitial extends true ? QueryWhere - : QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - V extends FieldPathValue, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false - >( - path: TFieldName, - op: - | "includes-any" - | "notIncludes-any" - | "includes-all" - | "notIncludes-all", - value: InValues> - ): ( - current: IsCurrentInitial extends true ? Query - : QueryWhere - ) => IsCurrentInitial extends true ? QueryWhere - : QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - V extends FieldPathValue, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false - >( - path: TFieldName, - op: "hasKey" | "notHasKey", - value: GetMapK - ): ( - current: IsCurrentInitial extends true ? Query - : QueryWhere - ) => IsCurrentInitial extends true ? QueryWhere - : QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - V extends FieldPathValue, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false - >( - path: TFieldName, - op: "hasValue" | "notHasValue", - value: GetMapV - ): ( - current: IsCurrentInitial extends true ? Query - : QueryWhere - ) => IsCurrentInitial extends true ? QueryWhere - : QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - V extends FieldPathValue, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false - >( - path: TFieldName, - op: "hasKeyValue" | "notHasKeyValue", - value: GetMapEntry - ): ( - current: IsCurrentInitial extends true ? Query - : QueryWhere - ) => IsCurrentInitial extends true ? QueryWhere - : QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - V extends FieldPathValue, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false - >( - path: TFieldName, - op: "hasKey-any" | "notHasKey-any" | "hasKey-all" | "notHasKey-all", - value: InValues> - ): ( - current: IsCurrentInitial extends true ? Query - : QueryWhere - ) => IsCurrentInitial extends true ? QueryWhere - : QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - V extends FieldPathValue, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false - >( - path: TFieldName, - op: "hasValue-any" | "notHasValue-any" | "hasValue-all" | "notHasValue-all", - value: InValues> - ): ( - current: IsCurrentInitial extends true ? Query - : QueryWhere - ) => IsCurrentInitial extends true ? QueryWhere - : QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - V extends FieldPathValue, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false - >( - path: TFieldName, - op: "hasKeyValue-any" | "notHasKeyValue-any" | "hasKeyValue-all" | "notHasKeyValue-all", - value: InValues> - ): ( - current: IsCurrentInitial extends true ? Query - : QueryWhere - ) => IsCurrentInitial extends true ? QueryWhere - : QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - V extends FieldPathValue, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false - >(f: { - path: TFieldName - op: "eq" - value: V - }): ( - current: IsCurrentInitial extends true ? Query - : QueryWhere - ) => IsCurrentInitial extends true ? QueryWhere - : QueryWhere -} - -export type FilterContinuationsWithSubpath = { - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TFieldValuesSub extends TFieldValues[TFieldName][number], - TFieldNameSub extends FieldPath, - V extends FieldPathValue - >( - subPath: TFieldName, - restPath: TFieldNameSub, - value: V - ): ( - current: Query - ) => QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TFieldValuesSub extends TFieldValues[TFieldName][number], - TFieldNameSub extends FieldPath, - V extends FieldPathValue - >( - subPath: TFieldName, - restPath: TFieldNameSub, - op: "gt" | "gte" | "lt" | "lte" | "neq", - value: V // only numbers? - ): ( - current: Query - ) => QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TFieldValuesSub extends TFieldValues[TFieldName][number], - TFieldNameSub extends FieldPath - >( - subPath: TFieldName, - restPath: TFieldNameSub, - op: "startsWith" | "endsWith" | "contains" | "notContains" | "notStartsWith" | "notEndsWith", - value: FieldPathValue extends string ? string : never - ): ( - current: Query - ) => QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TFieldValuesSub extends TFieldValues[TFieldName][number], - TFieldNameSub extends FieldPath, - V extends FieldPathValue - >( - subPath: TFieldName, - restPath: TFieldNameSub, - op: "in" | "notIn", - value: InValues - ): ( - current: Query - ) => QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TFieldValuesSub extends TFieldValues[TFieldName][number], - TFieldNameSub extends FieldPath, - V extends FieldPathValue - >( - subPath: TFieldName, - restPath: TFieldNameSub, - op: - | "includes" - | "notIncludes", - value: GetArV - ): ( - current: Query - ) => QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TFieldValuesSub extends TFieldValues[TFieldName][number], - TFieldNameSub extends FieldPath, - V extends FieldPathValue - >( - subPath: TFieldName, - restPath: TFieldNameSub, - op: - | "includes-any" - | "notIncludes-any" - | "includes-all" - | "notIncludes-all", - value: InValues> - ): ( - current: Query - ) => QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TFieldValuesSub extends TFieldValues[TFieldName][number], - TFieldNameSub extends FieldPath, - V extends FieldPathValue - >( - subPath: TFieldName, - restPath: TFieldNameSub, - op: "hasKey" | "notHasKey", - value: GetMapK - ): ( - current: Query - ) => QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TFieldValuesSub extends TFieldValues[TFieldName][number], - TFieldNameSub extends FieldPath, - V extends FieldPathValue - >( - subPath: TFieldName, - restPath: TFieldNameSub, - op: "hasValue" | "notHasValue", - value: GetMapV - ): ( - current: Query - ) => QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TFieldValuesSub extends TFieldValues[TFieldName][number], - TFieldNameSub extends FieldPath, - V extends FieldPathValue - >( - subPath: TFieldName, - restPath: TFieldNameSub, - op: "hasKeyValue" | "notHasKeyValue", - value: GetMapEntry - ): ( - current: Query - ) => QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TFieldValuesSub extends TFieldValues[TFieldName][number], - TFieldNameSub extends FieldPath, - V extends FieldPathValue - >( - subPath: TFieldName, - restPath: TFieldNameSub, - op: "hasKey-any" | "notHasKey-any" | "hasKey-all" | "notHasKey-all", - value: InValues> - ): ( - current: Query - ) => QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TFieldValuesSub extends TFieldValues[TFieldName][number], - TFieldNameSub extends FieldPath, - V extends FieldPathValue - >( - subPath: TFieldName, - restPath: TFieldNameSub, - op: "hasValue-any" | "notHasValue-any" | "hasValue-all" | "notHasValue-all", - value: InValues> - ): ( - current: Query - ) => QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TFieldValuesSub extends TFieldValues[TFieldName][number], - TFieldNameSub extends FieldPath, - V extends FieldPathValue - >( - subPath: TFieldName, - restPath: TFieldNameSub, - op: "hasKeyValue-any" | "notHasKeyValue-any" | "hasKeyValue-all" | "notHasKeyValue-all", - value: InValues> - ): ( - current: Query - ) => QueryWhere - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - TFieldValuesSub extends TFieldValues[TFieldName][number], - TFieldNameSub extends FieldPath, - V extends FieldPathValue - >(f: { - subPath: TFieldName - restPath: TFieldNameSub - op: "eq" - value: V - }): ( - current: Query - ) => QueryWhere -} - -/* dprint-ignore-start */ -export type RefineWithLiteral< - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - V, - Exclde extends boolean = false -> = - // refine only if the value is a primitive - [V] extends [string | number | boolean | null | bigint] - ? RefineFieldPathValue - : TFieldValues -/* dprint-ignore-end */ - -export type FilteringRefinements = { - < - TFieldValues extends FieldValues, - const TFieldName extends FieldPath, - const V extends FieldPathValue, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false - >( - path: TFieldName, - value: V - ): ( - current: IsCurrentInitial extends true ? Query - : QueryWhere - ) => QueryWhere< - TFieldValues, - // @ts-expect-error it's TS - RefineWithLiteral, - TFieldName extends "_tag" ? true : false // consider only _tag as an exclusive field and only in the positive case - > - < - TFieldValues extends FieldValues, - const TFieldName extends FieldPath, - const V extends FieldPathValue, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false - >( - path: TFieldName, - op: "neq", - value: V - ): ( - current: IsCurrentInitial extends true ? Query - : QueryWhere - ) => QueryWhere< - TFieldValues, - // @ts-expect-error it's TS - RefineWithLiteral, - E - > - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath, - const V extends readonly FieldPathValue[], - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false - >( - path: TFieldName, - op: "in", - value: V - ): ( - current: IsCurrentInitial extends true ? Query - : QueryWhere - ) => QueryWhere< - TFieldValues, - // @ts-expect-error it's TS - RefineWithLiteral>, - E - > -} - -export type NestedQueriesFixedRefinement = { - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false - >( - fb: (current: Query) => QueryWhere - ): ( - current: IsCurrentInitial extends true ? Query : QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: (query: QueryWhere) => QueryWhere - ): ( - current: IsCurrentInitial extends true ? Query : QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: (query: QueryWhere) => QueryWhere, - fd: (query: QueryWhere) => QueryWhere - ): ( - current: IsCurrentInitial extends true ? Query : QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: (query: QueryWhere) => QueryWhere, - fd: (query: QueryWhere) => QueryWhere, - fe: (query: QueryWhere) => QueryWhere - ): ( - current: IsCurrentInitial extends true ? Query : QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: (query: QueryWhere) => QueryWhere, - fd: (query: QueryWhere) => QueryWhere, - fe: (query: QueryWhere) => QueryWhere, - ff: (query: QueryWhere) => QueryWhere - ): ( - current: IsCurrentInitial extends true ? Query : QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: (query: QueryWhere) => QueryWhere, - fd: (query: QueryWhere) => QueryWhere, - fe: (query: QueryWhere) => QueryWhere, - ff: (query: QueryWhere) => QueryWhere, - fg: (query: QueryWhere) => QueryWhere - ): ( - current: IsCurrentInitial extends true ? Query : QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: (query: QueryWhere) => QueryWhere, - fd: (query: QueryWhere) => QueryWhere, - fe: (query: QueryWhere) => QueryWhere, - ff: (query: QueryWhere) => QueryWhere, - fg: (query: QueryWhere) => QueryWhere, - fh: (query: QueryWhere) => QueryWhere - ): ( - current: IsCurrentInitial extends true ? Query : QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: (query: QueryWhere) => QueryWhere, - fd: (query: QueryWhere) => QueryWhere, - fe: (query: QueryWhere) => QueryWhere, - ff: (query: QueryWhere) => QueryWhere, - fg: (query: QueryWhere) => QueryWhere, - fh: (query: QueryWhere) => QueryWhere, - fi: (query: QueryWhere) => QueryWhere - ): ( - current: IsCurrentInitial extends true ? Query : QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false, - E10 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: (query: QueryWhere) => QueryWhere, - fd: (query: QueryWhere) => QueryWhere, - fe: (query: QueryWhere) => QueryWhere, - ff: (query: QueryWhere) => QueryWhere, - fg: (query: QueryWhere) => QueryWhere, - fh: (query: QueryWhere) => QueryWhere, - fi: (query: QueryWhere) => QueryWhere, - fj: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: IsCurrentInitial extends true ? Query : QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false, - E10 extends boolean = false, - E11 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: (query: QueryWhere) => QueryWhere, - fd: (query: QueryWhere) => QueryWhere, - fe: (query: QueryWhere) => QueryWhere, - ff: (query: QueryWhere) => QueryWhere, - fg: (query: QueryWhere) => QueryWhere, - fh: (query: QueryWhere) => QueryWhere, - fi: (query: QueryWhere) => QueryWhere, - fj: ( - query: QueryWhere - ) => QueryWhere, - fk: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: IsCurrentInitial extends true ? Query : QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false, - E10 extends boolean = false, - E11 extends boolean = false, - E12 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: (query: QueryWhere) => QueryWhere, - fd: (query: QueryWhere) => QueryWhere, - fe: (query: QueryWhere) => QueryWhere, - ff: (query: QueryWhere) => QueryWhere, - fg: (query: QueryWhere) => QueryWhere, - fh: (query: QueryWhere) => QueryWhere, - fi: (query: QueryWhere) => QueryWhere, - fj: ( - query: QueryWhere - ) => QueryWhere, - fk: ( - query: QueryWhere - ) => QueryWhere, - fl: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: IsCurrentInitial extends true ? Query : QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false, - E10 extends boolean = false, - E11 extends boolean = false, - E12 extends boolean = false, - E13 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: (query: QueryWhere) => QueryWhere, - fd: (query: QueryWhere) => QueryWhere, - fe: (query: QueryWhere) => QueryWhere, - ff: (query: QueryWhere) => QueryWhere, - fg: (query: QueryWhere) => QueryWhere, - fh: (query: QueryWhere) => QueryWhere, - fi: (query: QueryWhere) => QueryWhere, - fj: ( - query: QueryWhere - ) => QueryWhere, - fk: ( - query: QueryWhere - ) => QueryWhere, - fl: ( - query: QueryWhere - ) => QueryWhere, - fm: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: IsCurrentInitial extends true ? Query : QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false, - E10 extends boolean = false, - E11 extends boolean = false, - E12 extends boolean = false, - E13 extends boolean = false, - E14 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: (query: QueryWhere) => QueryWhere, - fd: (query: QueryWhere) => QueryWhere, - fe: (query: QueryWhere) => QueryWhere, - ff: (query: QueryWhere) => QueryWhere, - fg: (query: QueryWhere) => QueryWhere, - fh: (query: QueryWhere) => QueryWhere, - fi: (query: QueryWhere) => QueryWhere, - fj: ( - query: QueryWhere - ) => QueryWhere, - fk: ( - query: QueryWhere - ) => QueryWhere, - fl: ( - query: QueryWhere - ) => QueryWhere, - fm: ( - query: QueryWhere - ) => QueryWhere, - fn: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: IsCurrentInitial extends true ? Query : QueryWhere - ) => QueryWhere -} - -export type NestedQueriesFreeIntersectionRefinement = { - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false - >( - fb: (current: Query) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - TFieldValuesRefined7 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere, - fg: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - TFieldValuesRefined7 extends TFieldValues = TFieldValues, - TFieldValuesRefined8 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere, - fg: ( - query: QueryWhere - ) => QueryWhere, - fh: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - TFieldValuesRefined7 extends TFieldValues = TFieldValues, - TFieldValuesRefined8 extends TFieldValues = TFieldValues, - TFieldValuesRefined9 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere, - fg: ( - query: QueryWhere - ) => QueryWhere, - fh: ( - query: QueryWhere - ) => QueryWhere, - fi: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - TFieldValuesRefined7 extends TFieldValues = TFieldValues, - TFieldValuesRefined8 extends TFieldValues = TFieldValues, - TFieldValuesRefined9 extends TFieldValues = TFieldValues, - TFieldValuesRefined10 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false, - E10 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere, - fg: ( - query: QueryWhere - ) => QueryWhere, - fh: ( - query: QueryWhere - ) => QueryWhere, - fi: ( - query: QueryWhere - ) => QueryWhere, - fj: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - TFieldValuesRefined7 extends TFieldValues = TFieldValues, - TFieldValuesRefined8 extends TFieldValues = TFieldValues, - TFieldValuesRefined9 extends TFieldValues = TFieldValues, - TFieldValuesRefined10 extends TFieldValues = TFieldValues, - TFieldValuesRefined11 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false, - E10 extends boolean = false, - E11 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere, - fg: ( - query: QueryWhere - ) => QueryWhere, - fh: ( - query: QueryWhere - ) => QueryWhere, - fi: ( - query: QueryWhere - ) => QueryWhere, - fj: ( - query: QueryWhere - ) => QueryWhere, - fk: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - TFieldValuesRefined7 extends TFieldValues = TFieldValues, - TFieldValuesRefined8 extends TFieldValues = TFieldValues, - TFieldValuesRefined9 extends TFieldValues = TFieldValues, - TFieldValuesRefined10 extends TFieldValues = TFieldValues, - TFieldValuesRefined11 extends TFieldValues = TFieldValues, - TFieldValuesRefined12 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false, - E10 extends boolean = false, - E11 extends boolean = false, - E12 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere, - fg: ( - query: QueryWhere - ) => QueryWhere, - fh: ( - query: QueryWhere - ) => QueryWhere, - fi: ( - query: QueryWhere - ) => QueryWhere, - fj: ( - query: QueryWhere - ) => QueryWhere, - fk: ( - query: QueryWhere - ) => QueryWhere, - fl: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - TFieldValuesRefined7 extends TFieldValues = TFieldValues, - TFieldValuesRefined8 extends TFieldValues = TFieldValues, - TFieldValuesRefined9 extends TFieldValues = TFieldValues, - TFieldValuesRefined10 extends TFieldValues = TFieldValues, - TFieldValuesRefined11 extends TFieldValues = TFieldValues, - TFieldValuesRefined12 extends TFieldValues = TFieldValues, - TFieldValuesRefined13 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false, - E10 extends boolean = false, - E11 extends boolean = false, - E12 extends boolean = false, - E13 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere, - fg: ( - query: QueryWhere - ) => QueryWhere, - fh: ( - query: QueryWhere - ) => QueryWhere, - fi: ( - query: QueryWhere - ) => QueryWhere, - fj: ( - query: QueryWhere - ) => QueryWhere, - fk: ( - query: QueryWhere - ) => QueryWhere, - fl: ( - query: QueryWhere - ) => QueryWhere, - fm: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - TFieldValuesRefined7 extends TFieldValues = TFieldValues, - TFieldValuesRefined8 extends TFieldValues = TFieldValues, - TFieldValuesRefined9 extends TFieldValues = TFieldValues, - TFieldValuesRefined10 extends TFieldValues = TFieldValues, - TFieldValuesRefined11 extends TFieldValues = TFieldValues, - TFieldValuesRefined12 extends TFieldValues = TFieldValues, - TFieldValuesRefined13 extends TFieldValues = TFieldValues, - TFieldValuesRefined14 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false, - E10 extends boolean = false, - E11 extends boolean = false, - E12 extends boolean = false, - E13 extends boolean = false, - E14 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere, - fg: ( - query: QueryWhere - ) => QueryWhere, - fh: ( - query: QueryWhere - ) => QueryWhere, - fi: ( - query: QueryWhere - ) => QueryWhere, - fj: ( - query: QueryWhere - ) => QueryWhere, - fk: ( - query: QueryWhere - ) => QueryWhere, - fl: ( - query: QueryWhere - ) => QueryWhere, - fm: ( - query: QueryWhere - ) => QueryWhere, - fn: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere -} - -// to be safe, or forces the output to be exclusive because you can always or _tag filters -export type NestedQueriesFreeDisjointRefinement = { - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false - >( - fb: (current: Query) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - TFieldValuesRefined7 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere, - fg: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - TFieldValuesRefined7 extends TFieldValues = TFieldValues, - TFieldValuesRefined8 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere, - fg: ( - query: QueryWhere - ) => QueryWhere, - fh: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - TFieldValuesRefined7 extends TFieldValues = TFieldValues, - TFieldValuesRefined8 extends TFieldValues = TFieldValues, - TFieldValuesRefined9 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere, - fg: ( - query: QueryWhere - ) => QueryWhere, - fh: ( - query: QueryWhere - ) => QueryWhere, - fi: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - TFieldValuesRefined7 extends TFieldValues = TFieldValues, - TFieldValuesRefined8 extends TFieldValues = TFieldValues, - TFieldValuesRefined9 extends TFieldValues = TFieldValues, - TFieldValuesRefined10 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false, - E10 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere, - fg: ( - query: QueryWhere - ) => QueryWhere, - fh: ( - query: QueryWhere - ) => QueryWhere, - fi: ( - query: QueryWhere - ) => QueryWhere, - fj: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - TFieldValuesRefined7 extends TFieldValues = TFieldValues, - TFieldValuesRefined8 extends TFieldValues = TFieldValues, - TFieldValuesRefined9 extends TFieldValues = TFieldValues, - TFieldValuesRefined10 extends TFieldValues = TFieldValues, - TFieldValuesRefined11 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false, - E10 extends boolean = false, - E11 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere, - fg: ( - query: QueryWhere - ) => QueryWhere, - fh: ( - query: QueryWhere - ) => QueryWhere, - fi: ( - query: QueryWhere - ) => QueryWhere, - fj: ( - query: QueryWhere - ) => QueryWhere, - fk: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - TFieldValuesRefined7 extends TFieldValues = TFieldValues, - TFieldValuesRefined8 extends TFieldValues = TFieldValues, - TFieldValuesRefined9 extends TFieldValues = TFieldValues, - TFieldValuesRefined10 extends TFieldValues = TFieldValues, - TFieldValuesRefined11 extends TFieldValues = TFieldValues, - TFieldValuesRefined12 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false, - E10 extends boolean = false, - E11 extends boolean = false, - E12 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere, - fg: ( - query: QueryWhere - ) => QueryWhere, - fh: ( - query: QueryWhere - ) => QueryWhere, - fi: ( - query: QueryWhere - ) => QueryWhere, - fj: ( - query: QueryWhere - ) => QueryWhere, - fk: ( - query: QueryWhere - ) => QueryWhere, - fl: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - TFieldValuesRefined7 extends TFieldValues = TFieldValues, - TFieldValuesRefined8 extends TFieldValues = TFieldValues, - TFieldValuesRefined9 extends TFieldValues = TFieldValues, - TFieldValuesRefined10 extends TFieldValues = TFieldValues, - TFieldValuesRefined11 extends TFieldValues = TFieldValues, - TFieldValuesRefined12 extends TFieldValues = TFieldValues, - TFieldValuesRefined13 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false, - E10 extends boolean = false, - E11 extends boolean = false, - E12 extends boolean = false, - E13 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere, - fg: ( - query: QueryWhere - ) => QueryWhere, - fh: ( - query: QueryWhere - ) => QueryWhere, - fi: ( - query: QueryWhere - ) => QueryWhere, - fj: ( - query: QueryWhere - ) => QueryWhere, - fk: ( - query: QueryWhere - ) => QueryWhere, - fl: ( - query: QueryWhere - ) => QueryWhere, - fm: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere - - < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - TFieldValuesRefined2 extends TFieldValues = TFieldValues, - TFieldValuesRefined3 extends TFieldValues = TFieldValues, - TFieldValuesRefined4 extends TFieldValues = TFieldValues, - TFieldValuesRefined5 extends TFieldValues = TFieldValues, - TFieldValuesRefined6 extends TFieldValues = TFieldValues, - TFieldValuesRefined7 extends TFieldValues = TFieldValues, - TFieldValuesRefined8 extends TFieldValues = TFieldValues, - TFieldValuesRefined9 extends TFieldValues = TFieldValues, - TFieldValuesRefined10 extends TFieldValues = TFieldValues, - TFieldValuesRefined11 extends TFieldValues = TFieldValues, - TFieldValuesRefined12 extends TFieldValues = TFieldValues, - TFieldValuesRefined13 extends TFieldValues = TFieldValues, - TFieldValuesRefined14 extends TFieldValues = TFieldValues, - E extends boolean = false, - E2 extends boolean = false, - E3 extends boolean = false, - E4 extends boolean = false, - E5 extends boolean = false, - E6 extends boolean = false, - E7 extends boolean = false, - E8 extends boolean = false, - E9 extends boolean = false, - E10 extends boolean = false, - E11 extends boolean = false, - E12 extends boolean = false, - E13 extends boolean = false, - E14 extends boolean = false - >( - fb: (current: Query) => QueryWhere, - fc: ( - query: QueryWhere - ) => QueryWhere, - fd: ( - query: QueryWhere - ) => QueryWhere, - fe: ( - query: QueryWhere - ) => QueryWhere, - ff: ( - query: QueryWhere - ) => QueryWhere, - fg: ( - query: QueryWhere - ) => QueryWhere, - fh: ( - query: QueryWhere - ) => QueryWhere, - fi: ( - query: QueryWhere - ) => QueryWhere, - fj: ( - query: QueryWhere - ) => QueryWhere, - fk: ( - query: QueryWhere - ) => QueryWhere, - fl: ( - query: QueryWhere - ) => QueryWhere, - fm: ( - query: QueryWhere - ) => QueryWhere, - fn: ( - query: QueryWhere - ) => QueryWhere - ): ( - current: QueryWhere - ) => QueryWhere -} - -export type FilterWhere = - & NestedQueriesFixedRefinement - & FilteringRefinements - & FilterContinuations - -export type FilterContinuationAnd = - & NestedQueriesFreeIntersectionRefinement - & FilteringRefinements - & FilterContinuations - -export type FilterContinuationOr = - & NestedQueriesFreeDisjointRefinement - & FilterContinuations - -// it does not support refinements by choice (for now) -export type WhereEveryOrSome = - & { - < - TFieldValues extends FieldValues, - TFieldName extends FieldPath - >( - subPath: TFieldName, - dude: ( - current: Query - ) => QueryWhere, - ...dudes: (( - current: QueryWhere - ) => QueryWhere)[] - ): ( - current: Query - ) => QueryWhere - } - & FilterContinuationsWithSubpath diff --git a/packages/effect-app/src/Model/query/new-kid-interpreter.ts b/packages/effect-app/src/Model/query/new-kid-interpreter.ts deleted file mode 100644 index e3c680444..000000000 --- a/packages/effect-app/src/Model/query/new-kid-interpreter.ts +++ /dev/null @@ -1,532 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -import { identity } from "effect/Function" -import * as Array from "../../Array.ts" -import { toNonEmptyArray } from "../../Array.ts" -import * as Option from "../../Option.ts" -import * as S from "../../Schema.ts" -import * as SchemaAST from "../../SchemaAST.ts" -import { dropUndefinedT } from "../../utils.ts" -import type { FilterResult } from "../filter/filterApi.ts" -import type { FieldValues } from "../filter/types.ts" -import type { FieldPath } from "../filter/types/path/eager.ts" -import { make, type Q, type QAll } from "../query/dsl.ts" - -export type AggregateIrExpression = - | { readonly _tag: "agg-count" } - | { readonly _tag: "agg-count-when"; readonly filter: readonly FilterResult[] } - | { readonly _tag: "agg-sum"; readonly field: string } - | { readonly _tag: "agg-min"; readonly field: string } - | { readonly _tag: "agg-max"; readonly field: string } - -export type AggregateIrItem = - | AggregateIrExpression - | { readonly _tag: "agg-field"; readonly path: string } - -export type ComputedProjectionMathIrExpression = - | { - readonly _tag: "field" - readonly field: string - } - | { - readonly _tag: "mul" - readonly left: ComputedProjectionMathIrExpression - readonly right: ComputedProjectionMathIrExpression - } - -export type ComputedProjectionIrExpression = - | { - readonly _tag: "relation-count" - readonly path: string - readonly filter: readonly FilterResult[] - } - | { - readonly _tag: "relation-any" - readonly path: string - readonly filter: readonly FilterResult[] - } - | { - readonly _tag: "relation-every" - readonly path: string - readonly filter: readonly FilterResult[] - } - | { - readonly _tag: "relation-distinct-count" - readonly path: string - readonly field: string - readonly filter: readonly FilterResult[] - } - | { - readonly _tag: "relation-sum" - readonly path: string - readonly field: string - readonly filter: readonly FilterResult[] - } - | { - readonly _tag: "relation-sum-expr" - readonly path: string - readonly expression: ComputedProjectionMathIrExpression - readonly filter: readonly FilterResult[] - } - | { - readonly _tag: "relation-sum-expr-by" - readonly path: string - readonly expression: ComputedProjectionMathIrExpression - readonly unit: string - readonly filter: readonly FilterResult[] - } - | { - readonly _tag: "relation-sum-expr-normalized" - readonly path: string - readonly expression: ComputedProjectionMathIrExpression - readonly unit: string - readonly toBase: string - readonly factors: Readonly> - readonly filter: readonly FilterResult[] - } - | { - readonly _tag: "relation-collect" - readonly path: string - readonly field: string - readonly distinct: boolean - readonly filter: readonly FilterResult[] - } - | { - readonly _tag: "relation-collect-fields" - readonly path: string - readonly fields: readonly string[] - readonly distinct: boolean - readonly filter: readonly FilterResult[] - } - | { - readonly _tag: "relation-length" - readonly path: string - } - -type SelectItem = - | keyof TFieldValues - | { key: string; subKeys: string[] } - | { - key: string - computed: ComputedProjectionIrExpression - } - -const isArraySelect = ( - item: SelectItem -): item is { key: string; subKeys: string[] } => typeof item === "object" && item !== null && "subKeys" in item - -const mergeArraySelect = ( - select: SelectItem[], - arraySelect: { key: string; subKeys: string[] } -) => { - const subKeys = [...new Set(arraySelect.subKeys)] - const existing = select.find( - (item): item is { key: string; subKeys: string[] } => isArraySelect(item) && item.key === arraySelect.key - ) - - if (existing) { - const existingIndex = select.indexOf(existing) - select[existingIndex] = { - key: arraySelect.key, - subKeys: [...new Set([...existing.subKeys, ...subKeys])] - } - } else { - select.push({ key: arraySelect.key, subKeys }) - } - - const scalarIndex = select.findIndex((item) => item === arraySelect.key) - if (scalarIndex >= 0) { - select.splice(scalarIndex, 1) - } -} - -type Result = { - filter: FilterResult[] - schema: S.Codec | undefined - limit: number | undefined - skip: number | undefined - order: { key: FieldPath; direction: "ASC" | "DESC" }[] - ttype: "one" | "many" | "count" | undefined - mode: "collect" | "project" | "transform" | "aggregate" | undefined - computed: Record | undefined - aggregateMap: Record | undefined -} - -const interpret = < - TFieldValues extends FieldValues, - TFieldValuesRefined extends TFieldValues = TFieldValues, - A = TFieldValues, - R = never ->(_: QAll) => { - const a = _ as Q - - const data: Result = { - filter: [], - schema: undefined, - limit: undefined, - skip: undefined, - order: [], - ttype: undefined, - mode: undefined, - computed: undefined, - aggregateMap: undefined - } - - const upd = ( - v: Result - ) => { - data.filter.push(...v.filter) - data.order.push(...v.order) - if (v.limit !== undefined) data.limit = v.limit - if (v.skip !== undefined) data.skip = v.skip - if (v.ttype !== undefined) data.ttype = v.ttype - if (v.schema !== undefined) data.schema = v.schema - if (v.mode !== undefined) data.mode = v.mode - if (v.computed !== undefined) data.computed = v.computed - if (v.aggregateMap !== undefined) data.aggregateMap = v.aggregateMap - } - - const applyPath = (path: string) => (_: FilterResult): FilterResult => - _.t === "where" || _.t === "and" || _.t === "or" - ? { ..._, path: `${path}.-1.${_.path}` } - : { ..._, result: _.result.map(applyPath(path)) } - - switch (a._tag) { - case "value": - break - case "where": { - const { current, operation, relation, subPath } = a - upd(interpret(current)) - if (typeof operation === "function") { - data.filter.push( - { - t: "where-scope", - result: interpret(operation(make())).filter.map(subPath ? applyPath(subPath) : identity), - relation - } - ) - } else { - data.filter.push( - { - t: "where", - path: operation[0], - op: operation.length === 2 ? "eq" : operation[1], - value: operation.length === 2 ? operation[1] : operation[2] - } - ) - } - break - } - case "and": { - const { current, operation, relation } = a - upd(interpret(current)) - if (typeof operation === "function") { - data.filter.push( - { t: "and-scope", result: interpret(operation(make())).filter, relation } - ) - } else { - data.filter.push( - { - t: "and", - path: operation[0], - op: operation.length === 2 ? "eq" : operation[1], - value: operation.length === 2 ? operation[1] : operation[2] - } - ) - } - break - } - case "or": { - const { current, operation, relation } = a - upd(interpret(current)) - if (typeof operation === "function") { - data.filter.push( - { t: "or-scope", result: interpret(operation(make())).filter, relation } - ) - } else { - data.filter.push( - { - t: "or", - path: operation[0], - op: operation.length === 2 ? "eq" : operation[1], - value: operation.length === 2 ? operation[1] : operation[2] - } - ) - } - break - } - case "one": { - upd(interpret(a.current)) - data.limit = 1 - data.ttype = "one" - break - } - case "count": { - upd(interpret(a.current)) - data.ttype = "count" - data.schema = S.Struct({ id: S.String }) as any - break - } - case "order": { - upd(interpret(a.current)) - data.order.push({ key: a.field, direction: a.direction }) - break - } - case "page": { - upd(interpret(a.current)) - data.limit = a.take - data.skip = a.skip - break - } - case "project": { - upd(interpret(a.current)) - if (a.mode === "aggregate" && a.aggregateMap) { - data.schema = a.schema - data.mode = "aggregate" - data.aggregateMap = Object.fromEntries( - Object.entries(a.aggregateMap).map(([key, expression]) => { - switch (expression._tag) { - case "agg-field": - return [key, { _tag: "agg-field" as const, path: expression.path }] - case "agg-count": - return [key, { _tag: "agg-count" as const }] - case "agg-count-when": { - const filter = interpret(expression.operation(make())).filter - return [key, { _tag: "agg-count-when" as const, filter }] - } - case "agg-sum": - return [key, { _tag: "agg-sum" as const, field: expression.field }] - case "agg-min": - return [key, { _tag: "agg-min" as const, field: expression.field }] - case "agg-max": - return [key, { _tag: "agg-max" as const, field: expression.field }] - } - }) - ) - break - } - if (a.computed && a.mode === "transform") { - throw new Error("Computed projections require mode 'project' or 'collect', not 'transform'") - } - data.schema = a.schema - data.mode = a.computed - ? a.mode === "collect" ? "collect" : "project" - : a.mode - data.computed = a.computed - ? Object.fromEntries( - Object.entries(a.computed).map(([key, expression]) => { - const e = expression - const op = "operation" in e ? e.operation : undefined - const filter = op ? interpret(op(make())).filter.map(applyPath(e.path)) : [] - switch (e._tag) { - case "relation-count": - case "relation-any": - case "relation-every": - return [key, { _tag: e._tag, path: e.path, filter }] - case "relation-distinct-count": - case "relation-sum": - return [ - key, - { _tag: e._tag, path: e.path, field: e.field, filter } - ] - case "relation-sum-expr": - return [ - key, - { _tag: e._tag, path: e.path, expression: e.expression, filter } - ] - case "relation-sum-expr-by": - return [ - key, - { - _tag: e._tag, - path: e.path, - expression: e.expression, - unit: e.unit, - filter - } - ] - case "relation-sum-expr-normalized": - return [ - key, - { - _tag: e._tag, - path: e.path, - expression: e.expression, - unit: e.unit, - toBase: e.toBase, - factors: e.factors, - filter - } - ] - case "relation-collect": - return [ - key, - { - _tag: e._tag, - path: e.path, - field: e.field, - distinct: e.distinct, - filter - } - ] - case "relation-collect-fields": - return [ - key, - { - _tag: e._tag, - path: e.path, - fields: e.fields, - distinct: e.distinct, - filter - } - ] - case "relation-length": - return [key, { _tag: e._tag, path: e.path }] - } - }) - ) - : undefined - break - } - } - - return data -} - -const walkTransformation = (t: S.AST.AST): S.AST.AST => { - if (S.AST.isDeclaration(t) && t.typeParameters.length > 0) { - return walkTransformation(t.typeParameters[0]!) - } - return t -} - -const objectAsts = (ast: S.AST.AST): readonly S.AST.Objects[] => { - const t = walkTransformation(ast) - if (S.AST.isObjects(t)) { - return [t] - } - if (S.AST.isUnion(t)) { - return t.types.flatMap(objectAsts) - } - return [] -} - -const objectKeys = (ast: S.AST.AST): readonly string[] => [ - ...new Set(objectAsts(ast).flatMap((object) => object.propertySignatures.map((_) => _.name as string))) -] - -export const toFilter = < - TFieldValues extends FieldValues, - A, - R, - TFieldValuesRefined extends TFieldValues = TFieldValues ->( - q: QAll, - baseSchema?: S.Schema -) => { - // TODO: Native interpreter for each db adapter, instead of the intermediate "new-kid" format - const a = interpret(q) - - // Aggregate mode: build select entirely from aggregateMap (no schema-driven field list) - if (a.mode === "aggregate" && a.aggregateMap) { - const aggSelect = Object.entries(a.aggregateMap).map(([key, item]) => { - if (item._tag === "agg-field") { - return { key, path: item.path } - } - return { key, aggregate: item } - }) - return dropUndefinedT({ - t: null as unknown as TFieldValues, - limit: a.limit, - skip: a.skip, - select: Option.getOrUndefined(toNonEmptyArray(aggSelect)) as any, - schema: a.schema, - computed: undefined, - order: Option.getOrUndefined(toNonEmptyArray(a.order)), - ttype: a.ttype, - mode: "aggregate" as const, - filter: a.filter.length ? a.filter : undefined - }) - } - - const schema = a.schema - let select: SelectItem[] = [] - // TODO: support more complex (nested) schemas? - if (schema) { - const t = walkTransformation(SchemaAST.toEncoded(schema.ast)) - const objects = [...objectAsts(t)] - if (Array.isArrayNonEmpty(objects)) { - select = [...objectKeys(t)] - for (const prop of objects.flatMap((_) => _.propertySignatures)) { - if (S.AST.isArrays(prop.type)) { - // make sure we only select when there are actually type literals in the tuple... - // otherwise we might be dealing with strings etc. - // TODO; be more strict, can't support arrays with unions that have non TypeLiteral members etc.. - const arraySelect = { - key: prop.name as string, - subKeys: Array.flatMap( - prop.type.rest, - (x) => { - return objectKeys(x) - } - ) - } - if (arraySelect.subKeys.length > 0) { - mergeArraySelect(select, arraySelect) - } - } - } - } - } - const computed = a.computed - const getSelectKey = (_: (typeof select)[number]) => { - if (typeof _ === "string") { - return _ - } - if (typeof _ === "object" && _ !== null && "key" in _) { - return _.key - } - return String(_) - } - const schemaKeys = select.map(getSelectKey) - const nonEncodedSchemaKeys = (() => { - if (!baseSchema) { - return [] as string[] - } - const encoded = walkTransformation(SchemaAST.toEncoded(baseSchema.ast)) - const encodedKeys = objectKeys(encoded) - return schemaKeys.filter((key) => !encodedKeys.includes(key)) - })() - const missingComputedKeys = nonEncodedSchemaKeys.filter((key) => !(computed && key in computed)) - - if (Array.isArrayNonEmpty(missingComputedKeys)) { - throw new Error(`Missing computed projections for schema keys: ${missingComputedKeys.join(", ")}`) - } - - if (computed) { - const computedKeys = Object.keys(computed) - const extraComputedKeys = computedKeys.filter((key) => !schemaKeys.includes(key)) - if (Array.isArrayNonEmpty(extraComputedKeys)) { - throw new Error(`Computed projection keys must exist in projection schema: ${extraComputedKeys.join(", ")}`) - } - select = select.filter((_) => { - const key = getSelectKey(_) - return !(key in computed) - }) - select.push(...Object.entries(computed).map(([key, expression]) => ({ key, computed: expression }))) - } - return dropUndefinedT({ - t: null as unknown as TFieldValues, - limit: a.limit, - skip: a.skip, - select: Option.getOrUndefined(toNonEmptyArray(select)), - schema, - computed, - order: Option.getOrUndefined(toNonEmptyArray(a.order)), - ttype: a.ttype, - mode: a.mode ?? "transform", - filter: a.filter.length - ? a.filter - : undefined - }) -} diff --git a/packages/effect-app/src/NonEmptySet.ts b/packages/effect-app/src/NonEmptySet.ts deleted file mode 100644 index 1cd39e22a..000000000 --- a/packages/effect-app/src/NonEmptySet.ts +++ /dev/null @@ -1,92 +0,0 @@ -import type { NonEmptyReadonlyArray } from "effect/Array" -import type * as Equivalence from "effect/Equivalence" -import * as Option from "effect/Option" -import type * as Order from "effect/Order" -import { flow, pipe } from "./Function.ts" -import { filter_, filterMap, filterMap_, fromArray as fromArrayOriginal, insert as insertOriginal, insert_ as insert_Original, map, map_, reduce, reduce_, remove, remove_, type Set, toArray as toArrayOriginal } from "./Set.ts" - -export interface NonEmptyBrand { - readonly NonEmpty: unique symbol -} - -export type NonEmptySet = Set & NonEmptyBrand - -function make_(ord: Order.Order, eq_?: Equivalence.Equivalence) { - const eq = eq_ - ?? ((x, y) => ord(x, y) === 0) - - const fromArray_ = fromArrayOriginal(eq) - const fromArray = flow(fromArray_, fromSet) - const fromNonEmptyArray = (arr: NonEmptyReadonlyArray) => fromArray_(arr) as NonEmptySet - const concat_ = (set: NonEmptySet, it: Iterable) => fromArray([...set, ...it]) - const insert__ = insertOriginal(eq) - const insert: (a: A) => (set: NonEmptySet) => NonEmptySet = insert__ as any - const insert_: (set: NonEmptySet, a: A) => NonEmptySet = insert_Original as any - - function replace_(set: NonEmptySet, a: A) { - return (pipe(filter_(set, (x) => !eq(x, a)), insert__(a)) as NonEmptySet) - } - - const toArray__ = toArrayOriginal(ord) - - function toArray(s: NonEmptySet) { - return toArray__(s) as NonEmptyReadonlyArray - } - - const remove__ = remove(eq) - const filterMap__ = filterMap(eq) - - return { - insert, - insert_, - remove: (a: A) => flow(remove__(a), fromSet), - remove_: flow(remove_(eq), fromSet), - reduce: reduce(ord), - reduce_: reduce_(ord), - replace: (a: A) => (set: NonEmptySet) => replace_(set, a), - replace_, - toArray, - fromArray, - fromNonEmptyArray, - from: (it: Iterable) => fromArray([...it]), - of: (a: A) => new Set([a]) as unknown as NonEmptySet, - concat_, - concat: (it: Iterable) => (set: NonEmptySet) => concat_(set, it), - - // A and B the same, useful when editing elements. - map: map(eq) as unknown as ( - f: (x: A) => A - ) => (set: NonEmptySet) => NonEmptySet, - map_: map_(eq) as unknown as ( - set: NonEmptySet, - f: (x: A) => A - ) => NonEmptySet, - filterMap: (f: (a: A) => Option.Option) => flow(filterMap__((a) => f(a)), fromSet), - filterMap_: flow(filterMap_(eq), fromSet) - } - // TODO: extend -} - -class Wrapper { - wrapped(ord: Order.Order, eq?: Equivalence.Equivalence) { - return make_(ord, eq) - } -} - -export interface NonEmptySetSchemaExtensions extends ReturnType["wrapped"]> {} - -export const make: ( - ord: Order.Order, - eq?: Equivalence.Equivalence -) => NonEmptySetSchemaExtensions = make_ - -export function fromSet(set: Set) { - if (set.size > 0) { - return Option.some(set as NonEmptySet) - } else { - return Option.none() - } -} - -// TODO -export * from "./Set.ts" diff --git a/packages/effect-app/src/Option.ts b/packages/effect-app/src/Option.ts deleted file mode 100644 index 5e0934ddc..000000000 --- a/packages/effect-app/src/Option.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -/* eslint-disable @typescript-eslint/no-unsafe-return */ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -// eslint-disable-next-line import/no-unassigned-import -import "./builtin.ts" -import { getOrUndefined as value, type Some } from "effect/Option" -import * as Option from "effect/Option" - -export * from "effect/Option" - -export const getOrUndefined = value - -export function omitableToNullable(om: Option.Option | undefined) { - return om ?? Option.fromNullishOr(om) -} - -export const toBool = Option.match({ - onNone: () => false, - onSome: () => true -}) - -export const fromBool = (b: boolean) => (b ? Option.some(true) : Option.none()) - -/** - * Access property, unwrapping Options along the path - */ -export function p>>( - k: K -): (v: Option.Option) => Option.Option<_A> -export function p(k: K): (v: Option.Option) => Option.Option -export function p(k: any) { - return (v: Option.Option) => Option.flatMap(v, (a) => convert((a as any)[k])) -} -function convert(a: any) { - return Option.isSome(a) || Option.isNone(a) ? a : Option.fromNullishOr(a) -} -export type _A = A extends Some ? Y : never -type KeysMatching = { - [K in keyof T]: T[K] extends V ? K : never -}[keyof T] - -export const PartialExceptionTypeId = Symbol() -export type PartialExceptionTypeId = typeof PartialExceptionTypeId - -export class PartialException { - readonly _typeId: PartialExceptionTypeId = PartialExceptionTypeId -} - -function raisePartial(): X { - throw new PartialException() -} - -/** - * Simulates a partial function - */ -export function partial( - f: (miss: () => X) => (...args: ARGS) => A -): (...args: ARGS) => Option.Option { - return (...args) => { - try { - return Option.some(f(raisePartial)(...args)) - } catch (e) { - if (e instanceof PartialException) { - return Option.none() - } - throw e - } - } -} diff --git a/packages/effect-app/src/Pure.ts b/packages/effect-app/src/Pure.ts deleted file mode 100644 index c21bcf9db..000000000 --- a/packages/effect-app/src/Pure.ts +++ /dev/null @@ -1,450 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import * as Chunk from "effect/Chunk" -import * as Effect from "effect/Effect" -import * as Layer from "effect/Layer" -import * as Result from "effect/Result" -import * as Context from "./Context.ts" -import { tuple } from "./Function.ts" - -const S1 = Symbol() -const S2 = Symbol() -const W = Symbol() - -export interface PureState { - readonly [S1]: (_: S) => void - readonly [S2]: () => S2 - - state: S2 -} - -export interface PureLog { - readonly [W]: () => W - log: Chunk.Chunk -} - -export interface PureEnv extends PureState, PureLog {} - -export interface PureEnvTest extends PureState, PureLog {} - -class PureEnvBase implements PureEnv { - readonly [W]!: () => W - readonly [S1]!: (_: S) => void - readonly [S2]!: () => S2 - readonly state: S2 - readonly log: Chunk.Chunk - - constructor(s: S2) { - this.state = s - this.log = Chunk.empty() - } -} - -export function makePureEnv(s: S2): PureEnv { - return new PureEnvBase(s) -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function unifyPureEnv>( - self: X -): PureEnv< - [X] extends [{ [W]: () => infer W }] ? W : never, - [X] extends [{ [S1]: (_: infer S) => void }] ? S : never, - [X] extends [{ [S2]: () => infer S2 }] ? S2 : never -> { - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - return self -} - -export type Pure = Effect.Effect | R> - -// type dsl = ProgramDSL - -export function GMUA_( - get: Pure, - modify: (i: GA) => Pure, - update: (i: GA) => Pure -): Pure { - return Effect.flatMap(get, modify).pipe(Effect.flatMap(([s, a]) => Effect.map(update(s), () => a))) -} - -export function GMUA(modify: (i: GA) => Pure) { - return ( - get: Pure, - update: (i: GA) => Pure - ) => GMUA_(get, modify, update) -} - -export function GMU_( - get: Pure, - modify: (i: GA) => Pure, - update: (i: GA) => Pure -): Pure { - return Effect.flatMap(get, modify).pipe(Effect.flatMap(update)) -} - -export function GMU(modify: (i: GA) => Pure) { - return ( - get: Pure, - update: (i: GA) => Pure - ) => GMU_(get, modify, update) -} - -const tagg = Context.Service<{ env: PureEnv }>("PureEnv") -function castTag() { - return tagg as any as Context.Service, PureEnvEnv> -} - -export const ServiceTag = Symbol() -export type ServiceTag = typeof ServiceTag - -export abstract class PhantomTypeParameter { - protected abstract readonly [ServiceTag]: { - readonly [NameP in Identifier]: (_: InstantiatedType) => InstantiatedType - } -} - -export type ServiceShape> = Omit< - T, - keyof Context.ServiceClass.Shape -> - -export abstract class ServiceTagged extends PhantomTypeParameter {} - -export function makeService>(_: Omit) { - return _ as T -} - -export const PureEnvEnv = Symbol() -export interface PureEnvEnv extends ServiceTagged { - env: PureEnv -} - -export function get(): Pure { - return (castTag()).useSync((_) => _.env.state) -} - -export function set(s: S): Pure { - return (castTag()).useSync((_) => { - _.env.state = s - }) -} - -export type PureLogT = Pure - -export function log(w: W): PureLogT { - return (castTag()).useSync((_) => { - _.env.log = Chunk.append(_.env.log, w) - }) -} - -export function logMany(w: Iterable): PureLogT { - return (castTag()).useSync((_) => { - _.env.log = Chunk.appendAll(_.env.log, Chunk.fromIterable(w)) - }) -} - -export function runAll( - self: Effect.Effect>, - s: S4 -): Effect.Effect< - readonly [Chunk.Chunk, Result.Result], - never, - Exclude }> -> { - const a = Effect - .flatMap(self, (x) => - (castTag()) - .useSync( - ({ env: _ }) => ({ log: _.log, state: _.state }) - ) - .pipe( - Effect.map( - ({ log, state }) => tuple(log, Result.succeed(tuple(state, x))) - ) - )) - .pipe(Effect.catch((err: any) => tagg.useSync((env) => tuple(env.env.log, Result.fail(err))))) - return Effect.provide(a, Layer.succeed(tagg, { env: makePureEnv(s) as any }) as any) as any -} - -export function runResult( - self: Effect.Effect>, - s: S4 -) { - return Effect.map(runAll(self, s), ([log, r]) => tuple(log, Result.map(r, ([s]) => s))) -} - -export function runTerm( - self: Effect.Effect>, - s: S4 -) { - return Effect.flatMap( - runAll(self, s), - ([evts, r]) => Effect.map(Effect.fromResult(r), ([s3, a]) => tuple(s3, Chunk.toArray(evts), a)) - ) -} - -export function runTermDiscard( - self: Effect.Effect>, - s: S4 -) { - return Effect.map(runTerm(self, s), ([s3, w3]) => tuple(s3, w3)) -} - -export function runA( - self: Effect.Effect>, - s: S4 -) { - return Effect.map(runAll(self, s), ([log, r]) => tuple(log, Result.map(r, ([, a]) => a))) -} - -export function modify( - mod: (s: S2) => readonly [S3, A] -): Effect.Effect }> { - return (castTag()).useSync((_) => { - const [s, a] = mod(_.env.state) - _.env.state = s as any - return a - }) as any -} - -export function modifyM( - mod: (s: S2) => Effect.Effect> -): Effect.Effect> { - // return serviceWithEffect(_ => Ref.modifyM_(_.state, mod)) - return Effect.flatMap( - (castTag()).useSync((_) => _), - (_: any) => - Effect.map(mod(_.env.state), ([s, a]: any) => { - _.env.state = s - return a - }) - ) as any -} - -export function updateWith(upd: (s: S2) => S3) { - return modify((_: S2) => { - const r = upd(_) - return tuple(r, r) - }) -} - -export function updateWithEffect( - upd: (s: S2, log: (evt: W) => PureLogT) => Effect.Effect> -): Effect.Effect> { - return modifyM((_: S2) => Effect.map(upd(_, log), (_) => tuple(_, _))) -} - -export type FixEnv = - | Exclude> - | PureEnvEnv - -// export function getMA(self: (s: S) => A): Pure { -// return Effect.accessM((_: PureState) => Ref.get(_.state).map(self)) -// } - -// export function getM(self: (s: S) => Pure): Pure { -// return Effect.accessM((_: PureState) => Ref.get(_.state).flatMap(self)) -// } - -// export function getTM__(self: (s: S) => Pure) { -// return (tag: Tag>) => Effect.accessServiceM(tag)(_ => Ref.get(_.state).flatMap(self)) -// } - -// export function getTM_(tag: Tag>, self: (s: S) => Pure) { -// return Effect.accessServiceM(tag)(_ => Ref.get(_.state).flatMap(self)) -// } - -// export function getTM(tag: Tag>) { -// const access = Effect.accessServiceM(tag) -// return (self: (s: S) => Pure) => access(_ => Ref.get(_.state).flatMap(self)) -// } - -// export function makeProgramDSL(): ProgramDSL { -// return makeDSL_() -// } - -// function makeDSL_() { -// const tag = tagg as unknown as Tag> -// const get = Effect.serviceWithEffect(tag, _ => _.env.state.get) -// function getM(self: (s: S2) => Effect.Effect) { return get.flatMap(self) } -// function get_(self: (s: S2) => A) { return get.map(self)} -// function set(s: S2) { -// return Effect.serviceWithEffect(tag, _ => _.env.state.set(s)) -// } -// function log(w: W2): Effect.Effect<{ -// env: PureEnv; -// }, never, void> { -// return Effect.serviceWithEffect(tag, _ => _.env.log.update(l => l.append(w as any))) as any -// } - -// const baseDSL = { -// get, -// log, -// set -// } - -// function modify(mod: (s: S2) => readonly [S3, A]): Effect.Effect<{ -// env: PureEnv; -// }, never, A> { -// return Effect.serviceWithEffect(tag, _ => -// _.env.state.get.map(_ => mod(_)).flatMap(([s, a]) => _.env.state.set(s as any ).map(() => a)) -// ) as any -// } - -// function modifyM(mod: (s: S2) => Effect.Effect): Effect.Effect<{ -// env: PureEnv; -// } | R, E, A> { -// // return serviceWithEffect(_ => Ref.modifyM_(_.state, mod)) -// return Effect.serviceWithEffect(tag, _ => -// _.env.state.get.flatMap(_ => mod(_ as unknown as S2)).flatMap(([s, a]) => _.env.state.set(s as any).map(() => a)) -// ) as any -// } - -// function update(upd: (s: S2) => S3) { -// return modify(_ => tuple(upd(_), void 0 as void)) -// } - -// function updateM(upd: (s: S2) => Effect.Effect) { -// return modifyM(_ => upd(_).map(_ => tuple(_, void 0 as void))) -// } - -// const accessLog = Effect.serviceWithEffect(tag, _ => _.env.log.get) - -// function runAll( -// self: Effect.Effect, E, A>, -// s: S4 -// ): Effect.Effect}>, never, readonly [Chunk, Either.Either]> { -// return self.flatMap(x => -// Effect.serviceWithEffect(tag, ({ env: _ }) => -// Effect.all({ log: _.log.get, state: _.state.get }) -// // Ref.get(_.log).flatMap(log => Ref.get(_.state).map(state => ({ log, state }))) -// ).map( -// ( -// { log, state } -// ) => tuple(log, Either.right(tuple(state, x)) as Either.Either) -// ) -// ).catchAll( -// err => -// accessLog.map(log => -// tuple(log, Either.left(err) as Either.Either) -// ) -// ).provideService(tag, { env: makePureEnv(s) as any }) as any -// } - -// function runResult( -// self: Effect.Effect, E, A>, -// s: S4 -// ) { -// return runAll(self, s).map(([log, r]) => tuple(log, r.map(([s]) => s))) -// } - -// function runA( -// self: Effect.Effect, E, A>, -// s: S4 -// ) { -// return runAll(self, s).map(([log, r]) => tuple(log, r.map(([, a]) => a))) -// } - -// return { -// ...baseDSL, - -// getM, -// get_, -// accessLog, -// runAll, -// runA, -// runResult, - -// modify, -// modifyM, -// update, -// updateM -// } -// } - -// type dsl_ = ReturnType> - -// export interface ProgramDSL extends dsl_ { } - -// export function dslmodifyM(dsl: ProgramDSL, mod: (s: S, dsl: ProgramDSL) => Effect.Effect) { -// return dsl.modifyM(_ => mod(_, dsl)) -// } - -// export function dslmodify(dsl: ProgramDSL, mod: (s: S, dsl: ProgramDSL) => readonly [S, A]) { -// return dsl.modify(_ => mod(_, dsl)) -// } - -// export function dslupdateM(dsl: ProgramDSL, upd: (s: S2, dsl: ProgramDSL) => Effect.Effect) { -// return dsl.updateM(_ => upd(_, dsl)) -// } - -// export function dslupdate(dsl: ProgramDSL, upd: (s: S, dsl: ProgramDSL) => S) { -// return dsl.update(_ => upd(_, dsl)) -// } - -// export interface ZPure {} - -// export class ZPureImpl implements ZPure { -// zipRight( -// f: ZPure -// ): ZPure { -// throw new Error("not implemented") -// } - -// flatMap( -// f: (a: A) => ZPure -// ): ZPure { -// throw new Error("not implemented") - -// } -// } - -// declare type Eff1 = Effect.Effect, never, void> - -// function flatMap(self: Effect.Effect, E, A>, (s: S) => Effect.Effect) { -// } - -// export interface PureEnv2 extends PureState2, PureLog {} - -// const S1 = Symbol() -// const S2 = Symbol() -// const W = Symbol() -// export interface PureState2 { -// readonly [S1]: () => S -// readonly [S2]: () => S2 - -// readonly state: Ref -// } - -// const abc = Do($ => { -// const s = $(Pure.get<{ a: 1 }>()) -// console.log(s) -// // const a = $(Pure.log("hello")) -// $(Pure.log("hallo" as const)) -// $(Pure.log("hello" as const)) -// $(Pure.log<"hallo" | "hello" | 5>(5)) -// }) - -// declare const a: Effect.Effect< -// | { -// env: PureEnv -// } -// | { env: PureEnv } -// | { env: PureEnv }, -// never, -// never -// > -// type R = _R -// type Env = T extends { env: infer rr } ? rr : never - -// type RRRR = Env - -// const abcc = unifyPureEnv( -// undefined as any as RRRR -// ) -// const test = Pure.runAll( -// abc, -// { a: 1 } -// ) diff --git a/packages/effect-app/src/QueueMaker.ts b/packages/effect-app/src/QueueMaker.ts deleted file mode 100644 index bfcf6213e..000000000 --- a/packages/effect-app/src/QueueMaker.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { RequestContext } from "./RequestContext.ts" - -/** - * Per-message context envelope (tenant/store id, request metadata) carried - * alongside message-schema payloads. Alias of {@link RequestContext}. - * - * All that remains of the former queue machinery (SB/SQLite/mem `QueueMaker` - * implementations and the `QueueBase` interface) after the move to cluster - * entities — the message schemas that embed it still reference this envelope. - */ -export const QueueMeta = RequestContext diff --git a/packages/effect-app/src/RequestContext.ts b/packages/effect-app/src/RequestContext.ts deleted file mode 100644 index b8c6a7b2b..000000000 --- a/packages/effect-app/src/RequestContext.ts +++ /dev/null @@ -1,48 +0,0 @@ -import * as Context from "./Context.ts" -import { UserProfileId } from "./ids.ts" -import * as S from "./Schema.ts" -import { NonEmptyString255 } from "./Schema.ts" - -export const Locale = S.Literals(["en", "de"]) -export type Locale = typeof Locale.Type - -export class LocaleRef extends Context.Reference("Locale", { defaultValue: (): Locale => "en" }) {} - -export class RequestContext extends S.Opaque()(S.Struct({ - span: S.Struct({ - traceId: S.String, - spanId: S.String, - sampled: S.Boolean - }), - name: NonEmptyString255, - locale: Locale, - sourceId: S.optional(NonEmptyString255), // TODO? - namespace: NonEmptyString255, - /** @deprecated */ - userProfile: S.optional(S.Struct({ sub: UserProfileId })) // -})) { - static toMonitoring(this: void, self: RequestContext) { - return { - operationName: self.name, - locale: self.locale - } - } -} - -export const spanAttributes = (ctx: Pick & Partial) => ({ - "code.function.name": ctx.name, - "app.locale": ctx.locale, - "app.tenant.id": ctx.namespace, - ...ctx.sourceId ? { "client.id": ctx.sourceId } : {}, - ...(ctx.userProfile?.sub - ? { - "user.id": ctx - .userProfile - .sub, - "user.roles": "roles" in ctx - .userProfile - ? ctx.userProfile.roles - : undefined - } - : {}) -}) diff --git a/packages/effect-app/src/RequestScopedDependencies.ts b/packages/effect-app/src/RequestScopedDependencies.ts deleted file mode 100644 index e045f7a56..000000000 --- a/packages/effect-app/src/RequestScopedDependencies.ts +++ /dev/null @@ -1,45 +0,0 @@ -import * as Data from "effect/Data" -import type * as Scope from "effect/Scope" -import * as Context from "./Context.ts" -import * as Effect from "./Effect.ts" -import * as Layer from "./Layer.ts" - -export type Root = "root" - -export class RequestScopedDependencyNotStartedError extends Data.TaggedError( - "RequestScopedDependencyNotStartedError" -)<{ readonly key: string }> {} - -export interface RequestScopedDependency extends Context.Reference { - readonly current: Effect.Effect - readonly layer: Layer.Layer -} - -export const access = ( - dependency: Context.Reference, - key: string -): Effect.Effect => - dependency.pipe( - Effect.filterOrFail((_): _ is Service => _ !== "root", () => new RequestScopedDependencyNotStartedError({ key })) - ) - -export const make = ( - key: string, - service: Effect.Effect -): RequestScopedDependency> => { - const dependency = Context.Reference(key, { defaultValue: () => "root" }) - return Object.assign(dependency, { - current: access(dependency, key), - layer: Layer.effect(dependency, service) - }) -} - -export const layer = < - Deps extends readonly [RequestScopedDependency, ...Array>] ->( - ...dependencies: Deps -): Layer.Layer< - never, - { [K in keyof Deps]: Deps[K] extends RequestScopedDependency ? E : never }[number], - { [K in keyof Deps]: Deps[K] extends RequestScopedDependency ? R : never }[number] -> => dependencies.map((_) => _.layer).reduce((acc, l) => Layer.merge(acc, l)) as any diff --git a/packages/effect-app/src/Schema.ts b/packages/effect-app/src/Schema.ts deleted file mode 100644 index a20a48b0d..000000000 --- a/packages/effect-app/src/Schema.ts +++ /dev/null @@ -1,499 +0,0 @@ -import * as S from "effect/Schema" -import { type Simplify } from "effect/Struct" -import type * as Tracer from "effect/Tracer" -import type { RequiredKeys } from "effect/Types" -import type { Arbitrary as FastCheckArbitrary } from "fast-check" -import type { NonEmptyReadonlyArray } from "./Array.ts" -import { Email as EmailT, type Email as EmailType } from "./Schema/email.ts" -import { concurrencyUnbounded, withDefaultMake, withDefaultParseOptions } from "./Schema/ext.ts" -import type { FC } from "./Schema/FastCheck.ts" -import { PhoneNumber as PhoneNumberT, type PhoneNumber as PhoneNumberType } from "./Schema/phoneNumber.ts" -import { type AST } from "./Schema/schema.ts" -import * as SchemaAST from "./SchemaAST.ts" -import { copy, extendM, type StructuralCopyOrigin } from "./utils.ts" - -// --------------------------------------------------------------------------- -// Default helpers — re-exported from effect/Schema -// -// The five helpers below are surfaced explicitly so the (important) policy -// around them lives next to the export. See also the file-level note in -// `./Schema/ext.ts` and the documented wrappers in -// `./Schema/ext.ts`, `./Schema/numbers.ts`, `./Schema/moreStrings.ts`, -// and `./ids.ts`. -// -// **Construction-only**: `withConstructorDefault` fills the field when it -// is omitted from `.make(...)` input. It is NOT applied during decode, so -// it CANNOT be used to just-in-time migrate database fields. A stored -// record missing the field will still fail to decode. -// -// **`withDecodingDefault*` is discouraged**: a missing field in persisted -// data is just as likely to be data corruption as it is an old-shape -// document; silently substituting a default hides the problem and can -// poison downstream aggregates. Prefer an explicit, preferably versioned -// migration of database data over shoving missing fields under the rug. -// --------------------------------------------------------------------------- - -/** - * Attach a default value used **only** when constructing a value (e.g. via - * `.make(...)` or struct constructors) and the field is omitted from input. - * - * **Not applied during decode.** Decoding a payload that is missing the - * field will still raise a parse error. Do **not** rely on this to migrate - * database fields just-in-time — see the section header above. - * - * @see {@link withDecodingDefault} / {@link withDecodingDefaultType} — - * decode-time variants (discouraged for persisted data; use explicit, - * versioned migrations instead). - */ -export { withConstructorDefault } from "effect/Schema" - -/** - * Attach a default value used during decode when the field's `Encoded` value - * is missing **or** `undefined`. The default is specified as an `Encoded` - * value and threaded through the schema's decode step. - * - * **Discouraged for persisted data.** A missing field in a stored record is - * just as likely to be data corruption as it is an old-shape document; - * silently substituting a default hides the problem. Prefer an explicit, - * preferably versioned migration of database data — see the section header - * above. - * - * @see {@link withDecodingDefaultKey} — key-absent-only variant - * @see {@link withDecodingDefaultType} — `Type`-side variant - * @see {@link withConstructorDefault} — for `.make(...)`-time defaults - */ -export { withDecodingDefault } from "effect/Schema" - -/** - * Attach a default value used during decode when the field **key is absent** - * (note: not when present and `undefined`). The default is an `Encoded` - * value. - * - * **Discouraged for persisted data** — same reasoning as - * {@link withDecodingDefault}. Use explicit, preferably versioned migrations - * over decode-time fallbacks. - * - * @see {@link withDecodingDefault} — value-absent-or-undefined variant - * @see {@link withDecodingDefaultTypeKey} — `Type`-side variant - * @see {@link withConstructorDefault} — for `.make(...)`-time defaults - */ -export { withDecodingDefaultKey } from "effect/Schema" - -/** - * Attach a default value used during decode when the field is missing **or** - * `undefined`. The default is specified as a `Type` value (i.e. on the - * decoded side). - * - * **Discouraged for persisted data** — same reasoning as - * {@link withDecodingDefault}. Use explicit, preferably versioned migrations - * over decode-time fallbacks. - * - * @see {@link withDecodingDefault} — `Encoded`-side variant - * @see {@link withDecodingDefaultTypeKey} — key-absent-only variant - * @see {@link withConstructorDefault} — for `.make(...)`-time defaults - */ -export { withDecodingDefaultType } from "effect/Schema" - -/** - * Attach a default value used during decode when the field **key is absent** - * (note: not when present and `undefined`). The default is a `Type` value. - * - * **Discouraged for persisted data** — same reasoning as - * {@link withDecodingDefault}. Use explicit, preferably versioned migrations - * over decode-time fallbacks. - * - * @see {@link withDecodingDefaultKey} — `Encoded`-side variant - * @see {@link withDecodingDefaultType} — value-absent-or-undefined variant - * @see {@link withConstructorDefault} — for `.make(...)`-time defaults - */ -export { withDecodingDefaultTypeKey } from "effect/Schema" - -export * from "effect/Schema" - -export * from "./Schema/Class.ts" -export { Class, ErrorClass, Opaque, OpaqueErrorFacadeClass, OpaqueFacade, OpaqueShape, OpaqueType, TaggedClass, TaggedErrorClass } from "./Schema/Class.ts" - -export { fromBrand, nominal } from "./Schema/brand.ts" -export { Array, Boolean, Date, DateFromString, DateValid, Finite, Literals, NullOr, Number, ReadonlyMap, ReadonlySet } from "./Schema/ext.ts" -export { Int, NonNegativeInt } from "./Schema/numbers.ts" - -export * from "./Schema/email.ts" -export * from "./Schema/ext.ts" -export * from "./Schema/moreStrings.ts" -export * from "./Schema/numbers.ts" -export * from "./Schema/phoneNumber.ts" -export * from "./Schema/schema.ts" -export * from "./Schema/SpecialJsonSchema.ts" -export * from "./Schema/SpecialOpenApi.ts" -export * from "./Schema/strings.ts" -export { NonEmptyString } from "./Schema/strings.ts" - -export * as SchemaIssue from "effect/SchemaIssue" - -/** Fast-check generator factory previously exported as `Schema.Arbitrary`. */ -export type Arbitrary = (fc: FC) => FastCheckArbitrary - -export const decodeEffectConcurrently: typeof S.decodeEffect = withDefaultParseOptions(S.decodeEffect) -export const decodeUnknownEffectConcurrently: typeof S.decodeUnknownEffect = withDefaultParseOptions( - S.decodeUnknownEffect -) -export * as SchemaParser from "./Schema/SchemaParser.ts" - -/** - * Schema for a TypeScript `void` return value — the canonical `Void` used - * across the app, including RPC success schemas. Accepts **any present value** - * at runtime and discards it to `undefined`, while keeping the decoded/encoded - * type as `void`. Use `S.Undefined` when the input must be exactly `undefined`. - */ -export interface Void extends S.Void {} -export const Void: Void = S.Void - -// --------------------------------------------------------------------------- -// Struct / NonEmptyArray / Record -// --------------------------------------------------------------------------- - -export function Struct( - fields: Fields -): Struct { - const result = S.Struct(fields).annotate(concurrencyUnbounded) - const allowVoidMake = (schema: any): any => { - // Normalize omitted input to an empty object so optional/default-only structs can be constructed with make(). - const origMake: any = schema.make - const origMakeOption: any = schema.makeOption - const origMakeEffect: any = schema.makeEffect - schema.make = function(this: any, input: any, options?: any) { - return origMake.call(this, input === undefined ? {} : input, options) - } - schema.makeOption = function(this: any, input: any, options?: any) { - return origMakeOption.call(this, input === undefined ? {} : input, options) - } - schema.makeEffect = function(this: any, input: any, options?: any) { - return origMakeEffect.call(this, input === undefined ? {} : input, options) - } - return schema - } - // eslint-disable-next-line @typescript-eslint/unbound-method, @typescript-eslint/no-unsafe-assignment - const origMapFields: any = result.mapFields - // eslint-disable-next-line @typescript-eslint/unbound-method, @typescript-eslint/no-unsafe-assignment - const origAnnotate: any = result.annotate - // eslint-disable-next-line @typescript-eslint/unbound-method, @typescript-eslint/no-unsafe-assignment - const origAnnotateKey: any = result.annotateKey - - const preserveCopyAndMethods = (schema: any): any => { - schema.copy = copy - schema.mapFields = function(this: any, f: any, options?: any) { - return (result as any).mapFields.call(this, f, options) - } - schema.annotate = function(this: any, annotations?: any) { - return (result as any).annotate.call(this, annotations) - } - schema.annotateKey = function(this: any, annotations?: any) { - return (result as any).annotateKey.call(this, annotations) - } - return allowVoidMake(schema) - } - ;(result as any).mapFields = function(this: any, f: any, options?: any) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-call - const mapped = origMapFields.call(this, f, options).annotate(concurrencyUnbounded) - return preserveCopyAndMethods(mapped) - } - ;(result as any).annotate = function(this: any, annotations?: any) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-call - const annotated = origAnnotate.call(this, annotations) - return preserveCopyAndMethods(annotated) - } - ;(result as any).annotateKey = function(this: any, annotations?: any) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-call - const annotated = origAnnotateKey.call(this, annotations) - return preserveCopyAndMethods(annotated) - } - ;(result as any).copy = copy - allowVoidMake(result) - return result as Struct -} - -export interface Struct extends - S.Bottom< - Struct.Type, - Struct.Encoded, - Struct.DecodingServices, - Struct.EncodingServices, - AST.Objects, - // Rebuild is what's returned from annotate etc - Struct, - Struct.MakeIn, - Struct.Iso - > -{ - /** - * The field definitions of this struct. Spread them into a new struct to - * reuse fields across schemas. - * - * **Example** (Reusing fields across structs) - * - * ```ts - * import * as Schema from "effect/Schema" - * - * const Timestamped = Schema.Struct({ - * createdAt: Schema.Date, - * updatedAt: Schema.Date - * }) - * - * const User = Schema.Struct({ - * ...Timestamped.fields, - * name: Schema.String, - * email: Schema.String - * }) - * ``` - */ - readonly fields: Fields - /** - * Returns a new struct with the fields modified by the provided function. - * - * **Options** - * - * - `unsafePreserveChecks` - if `true`, keep any `.check(...)` constraints - * that were attached to the original union. Defaults to `false`. - * - * **Warning**: This is an unsafe operation. Since `mapFields` - * transformations change the schema type, the original refinement functions - * may no longer be valid or safe to apply to the transformed schema. Only - * use this option if you have verified that your refinements remain correct - * after the transformation. - */ - mapFields( - f: (fields: Fields) => To, - options?: { - readonly unsafePreserveChecks?: boolean | undefined - } | undefined - ): Struct>> - - // added copy - readonly copy: StructuralCopyOrigin> -} - -export declare namespace Struct { - export type Fields = S.Struct.Fields - export type Type = S.Struct.Type - export type Encoded = S.Struct.Encoded - export type DecodingServices = S.Struct.DecodingServices - export type EncodingServices = S.Struct.EncodingServices - // changed; all optional allows void - export type MakeIn = RequiredKeys> extends never - ? void | S.Struct.MakeIn - : S.Struct.MakeIn - export type Iso = S.Struct.Iso -} - -export type StructNestedEncodedError = { - readonly _tag: "StructNestedEncodedError" - readonly message: "Expected a Struct schema or a schema with from.Encoded" - readonly schema: T -} - -export type StructNestedEncoded = T extends { fields: infer Fields extends S.Struct.Fields } ? Struct.Encoded - : T extends { readonly from: { readonly Encoded: infer Encoded } } ? Encoded - : StructNestedEncodedError - -export function NonEmptyArray(value: Value): S.NonEmptyArray { - return S.NonEmptyArray(value).annotate(concurrencyUnbounded) -} - -export function TaggedStruct( - value: Tag, - fields: Fields -): TaggedStruct { - return Struct({ _tag: S.tag(value), ...fields }) as any -} -export interface TaggedStruct - extends Struct<{ readonly _tag: S.tag } & Fields> -{} -export declare namespace TaggedStruct { - export type Fields = S.Struct.Fields - export type Type = S.Struct.Type< - { readonly _tag: S.tag } & F - > - export type Encoded = S.Struct.Encoded< - { readonly _tag: S.tag } & F - > - export type DecodingServices = - S.Struct.DecodingServices< - { readonly _tag: S.tag } & F - > - export type EncodingServices = - S.Struct.EncodingServices< - { readonly _tag: S.tag } & F - > - export type MakeIn = S.Struct.MakeIn< - { readonly _tag: S.tag } & F - > - export type Iso = S.Struct.Iso< - { readonly _tag: S.tag } & F - > -} - -export function Record( - key: Key, - value: Value -): S.$Record { - return S.Record(key, value).annotate(concurrencyUnbounded) -} -export declare namespace Record { - export type Key = S.Record.Key - export type Type = S.Record.Type - export type Encoded = S.Record.Encoded -} - -export const SpanId = Symbol() -export type SpanId = typeof SpanId - -export interface WithOptionalSpan { - [SpanId]?: Tracer.Span -} - -export const Email = EmailT.pipe(withDefaultMake) - -export type Email = EmailType - -export const PhoneNumber = PhoneNumberT.pipe(withDefaultMake) - -export type PhoneNumber = PhoneNumberType - -// Copied from SchemaAST.collectSentinels (marked @internal in effect). -// Returns all { key, literal } pairs that can discriminate a union member. -const getTagFromAST = (schema: S.Top): string => { - const sentinels = collectSentinelsFromAST(schema.ast) - const sentinel = sentinels.find((s) => s.key === "_tag") - if (sentinel !== undefined && typeof sentinel.literal === "string") return sentinel.literal - throw new Error("No _tag literal found on schema member") -} - -function collectSentinelsFromAST( - ast: SchemaAST.AST -): Array<{ key: PropertyKey; literal: SchemaAST.LiteralValue | symbol }> { - switch (ast._tag) { - case "Declaration": { - const s = ast.annotations?.["~sentinels"] - return Array.isArray(s) ? s : [] - } - case "Objects": - return ast.propertySignatures.flatMap( - (ps): Array<{ key: PropertyKey; literal: SchemaAST.LiteralValue | symbol }> => { - const type = ps.type - if (!SchemaAST.isOptional(type)) { - if (SchemaAST.isLiteral(type)) return [{ key: ps.name, literal: type.literal }] - if (SchemaAST.isUniqueSymbol(type)) return [{ key: ps.name, literal: type.symbol }] - } - return [] - } - ) - case "Suspend": - return collectSentinelsFromAST(ast.thunk()) - default: - return [] - } -} - -export const tags = < - Members extends NonEmptyReadonlyArray<(S.Top & { readonly Type: { readonly _tag: string } })> ->( - self: Members -) => - S.Literals( - self.map(getTagFromAST) as { - [Index in keyof Members]: Members[Index]["Type"]["_tag"] - } - ) as S.Literals< - { - [Index in keyof Members]: Members[Index]["Type"]["_tag"] - } - > - -type TaggedUnionMembers = NonEmptyReadonlyArray< - S.Top & { readonly Type: { readonly _tag: string } } -> - -type TaggedUnionTags = S.Literals< - { - [Index in keyof Members]: Members[Index]["Type"]["_tag"] - } -> - -type TaggedPropertyKeys = { - [K in keyof A & string]: A[K] extends Members[number]["Type"] ? K : never -}[keyof A & string] - -type PropertyGuardsFor< - Members extends TaggedUnionMembers, - K extends string, - A -> = - & { - readonly [M in Members[number] as `is${M["Type"]["_tag"]}`]: ( - target: A - ) => target is A & { readonly [P in K]: M["Type"] } - } - & { - readonly isAnyOf: >( - tags: Tags - ) => ( - target: A - ) => target is A & { readonly [P in K]: Extract } - } - -type PropertyGuards< - Members extends TaggedUnionMembers, - K extends string -> = - & { - readonly [M in Members[number] as `is${M["Type"]["_tag"]}`]: < - T extends { readonly [P in K]: Members[number]["Type"] } - >(target: T) => target is T & { readonly [P in K]: M["Type"] } - } - & { - readonly isAnyOf: >( - tags: Tags - ) => ( - target: T - ) => target is T & { readonly [P in K]: Extract } - } - -type TaggedUnionWithTags = S.toTaggedUnion<"_tag", Members> & { - readonly tags: TaggedUnionTags - readonly generateGuards: (property: K) => PropertyGuards - readonly generateGuardsFor: () => >( - property: K - ) => PropertyGuardsFor -} - -const extendTaggedUnionWithTags = ( - schema: S.Union -): TaggedUnionWithTags => - extendM(schema.pipe(S.toTaggedUnion("_tag")), (tagged) => { - const makeGuards = (property: string) => { - const result: any = {} - const guards: Record boolean> = tagged.guards - for (const tag of Object.keys(guards)) { - const guard = guards[tag]! - result[`is${tag}`] = (target: any) => guard(target[property]) - } - result.isAnyOf = (memberTags: Array) => { - const check = tagged.isAnyOf(memberTags) - return (target: any) => check(target[property]) - } - return result - } - return { - tags: tags(schema.members), - generateGuards: makeGuards, - generateGuardsFor: () => makeGuards - } - }) - -export const ExtendTaggedUnion = ( - schema: S.Union -): TaggedUnionWithTags => extendTaggedUnionWithTags(schema) - -export const TaggedUnion = < - Members extends TaggedUnionMembers ->(members: Members): TaggedUnionWithTags => extendTaggedUnionWithTags(S.Union(members)) diff --git a/packages/effect-app/src/Schema/Class.ts b/packages/effect-app/src/Schema/Class.ts deleted file mode 100644 index a13163e22..000000000 --- a/packages/effect-app/src/Schema/Class.ts +++ /dev/null @@ -1,683 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import type * as Cause from "effect/Cause" -import * as Effect from "effect/Effect" -import * as S from "effect/Schema" -import * as SchemaGetter from "effect/SchemaGetter" -import * as SchemaIssue from "effect/SchemaIssue" -import * as SchemaTransformation from "effect/SchemaTransformation" -import type { Struct as EffectAppStruct } from "../Schema.ts" -import * as SchemaAST from "../SchemaAST.ts" -import { copyOrigin } from "../utils.ts" -import { concurrencyUnbounded } from "./ext.ts" -import * as SchemaParser from "./SchemaParser.ts" - -type ClassAnnotations = S.Annotations.Declaration - -export interface EnhancedClass< - Self, - SchemaS extends S.Constraint & { readonly fields: S.Struct.Fields }, - Inherited -> extends S.Class { - /** - * See `copyOrigin` docs in `utils.ts` for return-type design details. - */ - readonly copy: ReturnType Self>> -} -type MissingSelfGeneric = - `Missing \`Self\` generic - use \`class Self extends ${Usage}()(${Params}{ ... })\`` - -type HasFields = { - readonly fields: Fields -} | { - readonly from: HasFields -} - -type ClassOptions = { - readonly strict?: boolean -} - -export declare const ExtendedSchemaNoEncoded: unique symbol - -export type ExtendedSchemaNoEncoded = typeof ExtendedSchemaNoEncoded - -/** - * Override schema `Encoded` while keeping `Constraint` (intersection, not `Omit`). - * Free type-params for `Encoded` keep the conditional unresolved — callers that - * need Encoded overrides use the intersection form of the class factory return type. - */ -type WithEncoded = SchemaS & { readonly Encoded: Encoded } - -type ExtendedSchema = [ - Encoded -] extends [ExtendedSchemaNoEncoded] ? SchemaS - : WithEncoded - -/** Struct fields schema, optionally with a caller-supplied Encoded override. */ -type ClassFieldsSchema = ExtendedSchema, Encoded> - -export type Class = EnhancedClass< - Self, - S, - Inherited -> - -/** - * Build a modified Declaration that accepts struct-matching values during - * encoding, given the original Declaration and the class's fields. - */ -function makeRelaxedDeclaration( - ast: SchemaAST.Declaration, - fields: S.Struct.Fields, - cls: any -): SchemaAST.Declaration { - const parseOptions = ast.annotations?.["parseOptions"] as SchemaAST.ParseOptions | undefined - const structSchema = S.Struct(fields) - const annotatedStruct = parseOptions ? S.toType(structSchema).annotate({ parseOptions }) : S.toType(structSchema) - const decodeStruct = SchemaParser.decodeUnknownEffect(annotatedStruct) - - return new SchemaAST.Declaration( - ast.typeParameters, - () => (input: unknown, self: SchemaAST.Declaration, options: SchemaAST.ParseOptions) => { - if (input instanceof cls) { - return Effect.succeed(input) - } - if (input !== null && typeof input === "object") { - return decodeStruct(input, options) - } - return Effect.fail(new SchemaIssue.InvalidType(self, input)) - }, - ast.annotations, - ast.checks, - ast.encoding, - ast.context - ) -} - -// --------------------------------------------------------------------------- -// Class — like Schema.Class but with relaxed encoding -// --------------------------------------------------------------------------- - -/** - * Like `Schema.Class`, but the resulting class accepts plain objects matching - * the struct schema during encoding — not only `instanceof` or type-id - * checks. - * - * @example - * ```ts - * import * as Schema from "effect/Schema" - * import { Class } from "./Class.ts" - * - * class A extends Class("A")({ a: Schema.String }) {} - * - * // Construction works as normal: - * new A({ a: "hello" }) - * - * // Encoding accepts plain objects: - * Schema.encodeUnknownSync(A)({ a: "hello" }) // { a: "hello" } - * ``` - */ -export const Class: ( - identifier: string -) => ( - fieldsOr: Fields | HasFields, - annotations?: ClassAnnotations, - options?: ClassOptions -) => [Self] extends [never] ? MissingSelfGeneric<"Class"> - : EnhancedClass< - Self, - ClassFieldsSchema, - Brand - > = (identifier) => (fields, annotations, options) => { - const relaxed = options?.strict === false - // Build the original Schema.Class - const Base = (S.Class as any)(identifier)(fields, { ...concurrencyUnbounded, ...annotations }) - // Get the original ast getter from the base class - const originalAstDescriptor = Object.getOwnPropertyDescriptor(Base, "ast")! - - // Cache per-class to avoid recomputing - const astCache = new WeakMap() - const copyCache = new WeakMap>() - - return class extends Base { - static get copy() { - let cached = copyCache.get(this) - if (cached === undefined) { - cached = copyOrigin(this) - copyCache.set(this, cached) - } - return cached - } - static get ast(): SchemaAST.Declaration { - let cached = astCache.get(this) - if (cached !== undefined) return cached - // Call the original getter with `this` bound to the actual user class, - // so getClassSchema(this) creates a schema that uses `new this(...)`. - const originalAst = originalAstDescriptor.get!.call(this) as SchemaAST.Declaration - cached = relaxed ? makeRelaxedDeclaration(originalAst, Base.fields, this) : originalAst - astCache.set(this, cached) - return cached - } - static mapFields(f: any, options?: any) { - return Base.mapFields(f, options).annotate(concurrencyUnbounded) - } - } as any - } - -// --------------------------------------------------------------------------- -// TaggedClass — like Schema.TaggedClass but with relaxed encoding -// --------------------------------------------------------------------------- - -/** - * Like `Schema.TaggedClass`, but the resulting class accepts plain objects - * matching the struct schema during encoding. - * - * @example - * ```ts - * import * as Schema from "effect/Schema" - * import { TaggedClass } from "./Class.ts" - * - * class Circle extends TaggedClass()("Circle", { - * radius: Schema.Number - * }) {} - * - * Schema.encodeUnknownSync(Circle)({ _tag: "Circle", radius: 5 }) - * ``` - */ -export const TaggedClass: ( - identifier?: string -) => ( - tag: Tag, - fieldsOr: Fields | HasFields, - annotations?: ClassAnnotations, - options?: ClassOptions -) => [Self] extends [never] ? MissingSelfGeneric<"TaggedClass"> - : EnhancedClass< - Self, - ClassFieldsSchema<{ readonly _tag: S.tag } & Fields, Encoded>, - Brand - > = (identifier) => (tag, fields, annotations, options) => { - const relaxed = options?.strict === false - const Base = (S.TaggedClass as any)(identifier)(tag, fields, { ...concurrencyUnbounded, ...annotations }) - const originalAstDescriptor = Object.getOwnPropertyDescriptor(Base, "ast")! - const astCache = new WeakMap() - const copyCache = new WeakMap>() - - return class extends Base { - static get copy() { - let cached = copyCache.get(this) - if (cached === undefined) { - cached = copyOrigin(this) - copyCache.set(this, cached) - } - return cached - } - static get ast(): SchemaAST.Declaration { - let cached = astCache.get(this) - if (cached !== undefined) return cached - const originalAst = originalAstDescriptor.get!.call(this) as SchemaAST.Declaration - cached = relaxed ? makeRelaxedDeclaration(originalAst, Base.fields, this) : originalAst - astCache.set(this, cached) - return cached - } - static mapFields(f: any, options?: any) { - return Base.mapFields(f, options).annotate(concurrencyUnbounded) - } - } as any - } - -// --------------------------------------------------------------------------- -// ErrorClass — like Schema.ErrorClass but with relaxed encoding -// --------------------------------------------------------------------------- - -export const ErrorClass: ( - identifier: string -) => ( - fieldsOr: Fields | HasFields, - annotations?: ClassAnnotations, - options?: ClassOptions -) => [Self] extends [never] ? MissingSelfGeneric<"ErrorClass"> - : EnhancedClass< - Self, - ClassFieldsSchema, - Cause.YieldableError & Brand - > = (identifier) => (fields, annotations, options) => { - const relaxed = options?.strict === false - const Base = (S.Error as any)(identifier)(fields, { ...concurrencyUnbounded, ...annotations }) - const originalAstDescriptor = Object.getOwnPropertyDescriptor(Base, "ast")! - const astCache = new WeakMap() - const copyCache = new WeakMap>() - - return class extends Base { - static get copy() { - let cached = copyCache.get(this) - if (cached === undefined) { - cached = copyOrigin(this) - copyCache.set(this, cached) - } - return cached - } - static get ast(): SchemaAST.Declaration { - let cached = astCache.get(this) - if (cached !== undefined) return cached - const originalAst = originalAstDescriptor.get!.call(this) as SchemaAST.Declaration - cached = relaxed ? makeRelaxedDeclaration(originalAst, Base.fields, this) : originalAst - astCache.set(this, cached) - return cached - } - static mapFields(f: any, options?: any) { - return Base.mapFields(f, options).annotate(concurrencyUnbounded) - } - } as any - } - -// --------------------------------------------------------------------------- -// TaggedErrorClass — like Schema.TaggedErrorClass but with relaxed encoding -// --------------------------------------------------------------------------- - -export const TaggedErrorClass: ( - identifier?: string -) => ( - tag: Tag, - fieldsOr: Fields | HasFields, - annotations?: ClassAnnotations, - options?: ClassOptions -) => [Self] extends [never] ? MissingSelfGeneric<"TaggedErrorClass"> - : EnhancedClass< - Self, - ClassFieldsSchema<{ readonly _tag: S.tag } & Fields, Encoded>, - Cause.YieldableError & Brand - > = (identifier) => (tag, fields, annotations, options) => { - const relaxed = options?.strict === false - const Base = (S.TaggedError as any)(identifier)(tag, fields, { ...concurrencyUnbounded, ...annotations }) - const originalAstDescriptor = Object.getOwnPropertyDescriptor(Base, "ast")! - const astCache = new WeakMap() - const copyCache = new WeakMap>() - - return class extends Base { - static get copy() { - let cached = copyCache.get(this) - if (cached === undefined) { - cached = copyOrigin(this) - copyCache.set(this, cached) - } - return cached - } - static get ast(): SchemaAST.Declaration { - let cached = astCache.get(this) - if (cached !== undefined) return cached - const originalAst = originalAstDescriptor.get!.call(this) as SchemaAST.Declaration - cached = relaxed ? makeRelaxedDeclaration(originalAst, Base.fields, this) : originalAst - astCache.set(this, cached) - return cached - } - static mapFields(f: any, options?: any) { - return Base.mapFields(f, options).annotate(concurrencyUnbounded) - } - } as any - } - -export interface Opaque extends S.Opaque { - readonly "Encoded": Encoded extends ExtendedSchemaNoEncoded ? SchemaS["Encoded"] : Encoded -} - -export const Opaque: () => ( - schema: S -) => Opaque & Omit = S.Opaque as any - -/** - * Like {@link Opaque}, but the class **instance type is exactly `Self`** (the supplied - * decoded `Type`) instead of the structurally-computed `struct["Type"] & Brand`. - * - * Stock `Opaque` types the instance as `struct["Type"] & Brand` and only overrides the - * schema's `Type`/`Encoded` *members* with `Self`/`Encoded`. So `make`/`copy`/consumers - * still resolve the struct's mapped `Type`. With a codegen-supplied pre-expanded literal - * `Type` interface, `OpaqueType` lets all of those resolve a single **named** interface - * (resolved once per checker) instead of re-deriving the mapped `Type` — cutting - * instantiation on `Type`-touching consumers. - * - * Use with `class X extends OpaqueType()(struct) {}` where `X.Type` - * and `X.Encoded` are generated literal interfaces (see `@effect-app/eslint-codegen-model`, - * `static` + `type` mode). - * - * KNOWN GAP — **no branding**: the instance type is a plain structural `Self`, so opaque - * types of identical shape are mutually assignable. (Stock `Opaque` is also structural by - * default — `Brand` defaults to `{}` — so this only differs if you passed a non-default - * `Brand`.) Re-introducing a nominal brand on top of a supplied `Self` (e.g. branding the - * generated `Type` interface) is not yet implemented. - * - * NOTE: only `Type` (via `Self`) and `Encoded` are supplied statically here; `make`'s input - * (`~type.make.in`) and other derived members are still computed from the struct. See - * a future `OpaqueShape`-style helper if those also need to be supplied. - */ -export interface OpaqueType extends S.Opaque { - readonly "Encoded": Encoded extends ExtendedSchemaNoEncoded ? SchemaS["Encoded"] : Encoded - new(_: never): Self -} - -export const OpaqueType: () => ( - schema: S -) => OpaqueType & Omit = S.Opaque as any - -type OpaqueFacadeConstructorArgs = {} extends MakeIn ? [props?: MakeIn, options?: S.MakeOptions] - : [props: MakeIn, options?: S.MakeOptions] - -// Only the codec channels are required. `copy`/`fields`/`mapFields` are NOT -// required here: transformed schemas (`.pipe(S.encodeKeys/annotate/filter/...)`) -// don't expose them at the static level, and requiring them would reject those -// models from facading. When present they still flow through via -// `OpaqueFacadeStatics`; when absent the facade simply doesn't offer them. -type OpaqueFacadeInput = S.Top & { - readonly DecodingServices: DecodingServices - readonly EncodingServices: EncodingServices -} - -type OpaqueClassFacadeInput = - & OpaqueFacadeInput< - DecodingServices, - EncodingServices - > - & (abstract new(...args: Array) => unknown) - -type PrototypeFunction = Function & { prototype: object } - -// Class schemas expose a constructor descriptor under this key (was previously -// identified via a `~effect/Schema/Class` annotation id). -const ConstructorAnnotationKey = "~constructor" - -const getOwnOrInheritedPropertyDescriptor = (value: object, property: PropertyKey): PropertyDescriptor | undefined => { - let current: object | null = value - while (current !== null) { - const descriptor = Object.getOwnPropertyDescriptor(current, property) - if (descriptor !== undefined) return descriptor - current = Object.getPrototypeOf(current) - } -} - -const isClassSchemaConstructor = (value: unknown): value is PrototypeFunction => { - if (typeof value !== "function") return false - // Transformed schemas (e.g. `Class.pipe(S.encodeKeys(...))`) are also functions with a - // Declaration AST that still carries `~constructor`, but they are not constructable classes. - // Real Schema.Class constructors expose a static `identifier`. - if (typeof (value as { readonly identifier?: unknown }).identifier !== "string") return false - const ast = (value as { readonly ast?: unknown }).ast - return SchemaAST.isAST(ast) - && SchemaAST.isDeclaration(ast) - && ast.annotations?.[ConstructorAnnotationKey] !== undefined -} - -const getFacadeClassSchema = (schema: OpaqueFacadeInput): PrototypeFunction | undefined => { - if (isClassSchemaConstructor(schema)) return schema - const target = "to" in schema ? (schema as { readonly to?: unknown }).to : undefined - return isClassSchemaConstructor(target) ? target : undefined -} - -const makePublicClassTransformation = (Public: PrototypeFunction) => - new SchemaTransformation.Transformation( - SchemaGetter.transform((input) => Reflect.construct(Public, [input], Public)), - SchemaGetter.passthrough() - ) - -const makeFacadeClassAst = ( - schema: OpaqueFacadeInput, - originalAst: SchemaAST.AST, - Public: PrototypeFunction -): SchemaAST.AST => { - if (SchemaAST.isDeclaration(schema.ast)) { - const schemaEncoding = schema.ast.encoding ?? [] - if (schemaEncoding.length > 0) { - return new SchemaAST.Declaration( - schema.ast.typeParameters, - schema.ast.run, - schema.ast.annotations, - schema.ast.checks, - [new SchemaAST.Link(schemaEncoding[0]!.to, makePublicClassTransformation(Public)), ...schemaEncoding.slice(1)], - schema.ast.context, - schema.ast.encodingChecks - ) - } - } - - return schema.rebuild(originalAst).ast -} - -// Carry the schema's own statics, dropping the generic `S.Top` machinery and -// `prototype`. EXCEPT `to`: models compose each other via `X.to.fields` / -// `X.to.copy` at definition time, so it must survive on the facade. -type OpaqueFacadeStatics = Omit | "prototype"> - -/** - * Like {@link OpaqueType}, but ALSO supplies a static **make-input** shape, so - * `make`/`copy` resolve a named `MakeIn` interface instead of re-deriving the struct's - * mapped `~type.make.in`. Use with codegen-supplied `X.Type` / `X.Encoded` / `X.Make`: - * - * ```ts - * class X extends OpaqueShape()(struct) {} - * ``` - * - * `decode`/`encode` already use the supplied `Type`/`Encoded` (they read the schema's - * `Type`/`Encoded` members, which are `Self`/`Encoded` here) — no separate override needed. - * - * NOTE — measured gain is modest (~5%): the struct passed to the wrapper is still - * constructed in full (definition cost dominates); the static shapes only cheapen - * consumer-side reads of `Type`/`Encoded`/`MakeIn`. Same `no-branding` gap as - * {@link OpaqueType}. - */ -export interface OpaqueShape - extends S.Opaque -{ - readonly "Encoded": Encoded - readonly "~type.make.in": MakeIn - new(_: never): Self -} - -export const OpaqueShape: () => ( - schema: S -) => OpaqueShape & Omit = S.Opaque as any - -/** - * Shallow public view for generated model facades. - * - * The runtime value can still be the full private schema class, but emitted - * declarations expose only named `Type` / `Encoded` / `Make` interfaces and a - * small static surface. This keeps downstream project references from pulling - * the private struct field map back through `typeof Model`. - */ -export interface OpaqueFacade< - Self, - Encoded, - MakeIn, - DecodingServices = never, - EncodingServices = DecodingServices, - Brand = {} -> extends - S.Bottom< - Self, - Encoded, - DecodingServices, - EncodingServices, - SchemaAST.AST, - S.Codec, - MakeIn, - Self, - readonly [], - MakeIn - > -{ - new(_: never): Brand - readonly copy: ReturnType Self>> - // NOTE: no `identifier` here — `S.Opaque` (and requests) build on `S.Bottom`, not `S.Class`, - // so they have no `identifier`. It lives only on the class facades below. - // NOTE: `fields` / `mapFields` are intentionally NOT redeclared here. They are - // carried (precise) from the underlying schema via `OpaqueFacadeStatics`. A wide - // `mapFields(f: (fields: S.Struct.Fields) => To)` override would win overload - // resolution and erase field precision in `Q.project(X.mapFields(...))`. -} - -export interface OpaqueClassFacade< - Self, - Encoded, - MakeIn, - DecodingServices = never, - EncodingServices = DecodingServices, - Brand = {} -> extends - S.Bottom< - Self, - Encoded, - DecodingServices, - EncodingServices, - SchemaAST.AST, - S.Codec, - MakeIn, - Self, - readonly [], - MakeIn - > -{ - new(...args: OpaqueFacadeConstructorArgs): Brand - readonly copy: ReturnType Self>> - readonly identifier: string -} - -export function OpaqueFacade< - Self, - Encoded, - MakeIn, - DecodingServices = never, - EncodingServices = DecodingServices, - Brand = {} ->() { - function facade>( - schema: SchemaS - ): - & OpaqueClassFacade - & OpaqueFacadeStatics - function facade>( - schema: SchemaS - ): - & OpaqueFacade - & OpaqueFacadeStatics - function facade(schema: OpaqueFacadeInput) { - const Base = getFacadeClassSchema(schema) - if (Base !== undefined) { - const astCache = new WeakMap() - const originalAstDescriptor = getOwnOrInheritedPropertyDescriptor(Base, "ast") - - return class extends (Base as any) { - static get ast(): SchemaAST.AST { - let cached = astCache.get(this) - if (cached !== undefined) return cached - - const originalAst = originalAstDescriptor?.get?.call(this) as SchemaAST.AST - cached = makeFacadeClassAst(schema, originalAst, this) - astCache.set(this, cached) - return cached - } - } - } - - class Facade {} - return Object.setPrototypeOf(Facade, schema) - } - - return facade -} - -/** - * Like class-schema {@link OpaqueFacade}, but for error models (`TaggedErrorClass` / - * `ErrorClass`). The decoded instance type carries `Cause.YieldableError`, so - * `yield* new MyError(...)`, `Effect.fail(myError)`, and `instanceof` all keep - * working through the facade — the runtime `_X` is the real error class (the - * facade `X extends ...(_X)` inherits its prototype), and the type reflects it. - * Nothing is lost vs the underlying error class. - */ -export interface OpaqueErrorFacadeClass< - Self, - Encoded, - MakeIn, - DecodingServices = never, - EncodingServices = DecodingServices, - Brand = {} -> extends - S.Bottom< - Self, - Encoded, - DecodingServices, - EncodingServices, - SchemaAST.AST, - S.Codec, - MakeIn, - Self, - readonly [], - MakeIn - > -{ - // YieldableError (not Self) on the constructed instance — like class-schema OpaqueFacade's - // `new(): Brand`, the data type comes from the declaration-merged `interface X`, - // so `Self` must NOT appear here (would recurse). Merging `X & YieldableError` - // makes `yield* new X()` / `Effect.fail` / `instanceof` work without losing data. - new(...args: OpaqueFacadeConstructorArgs): Cause.YieldableError & Brand - readonly copy: ReturnType Self>> - readonly identifier: string -} - -export function OpaqueErrorFacadeClass< - Self, - Encoded, - MakeIn, - DecodingServices = never, - EncodingServices = DecodingServices, - Brand = {} ->() { - return >( - schema: SchemaS - ): - & OpaqueErrorFacadeClass - & OpaqueFacadeStatics => - { - type FacadeSchema = - & OpaqueErrorFacadeClass - & OpaqueFacadeStatics - - if (isClassSchemaConstructor(schema)) { - return schema as SchemaS & FacadeSchema - } - - throw new TypeError("OpaqueErrorFacadeClass requires a class schema") - } -} - -/** - * Workflow-compatible struct facade. - * - * A top-level `const X = S.Struct(...)` / `S.TaggedStruct(...)` schema model whose `.d.ts` - * is produced by the schema-aware declaration emitter is retyped from the giant inline - * `S.Struct<{ ...fields... }>` to this facade. - * - * Unlike {@link OpaqueFacade}, `StructFacade` **extends effect-app's `Struct`**, so the - * value is still a real (effect-app) struct schema: it satisfies `Workflow.AnyStructSchema` and - * the `Struct` reconstruction the workflow machinery performs, and `Union` / - * `.fields.x` keep working. It MUST be effect-app's `Struct` (not effect core's) — scanner - * models are effect-app `S.Struct`, so a facade built on `effect/Schema`'s `Struct` is not - * assignable where an effect-app struct is expected. At the same time the type-level members - * (`Type` / `Encoded` / make-input / services) are pinned to the named interfaces the emitter - * generates in `namespace X`, so consumers reference those by name instead of re-deriving them - * from `Fields` on every use. `Fields` is the model's own generated `X.Fields` interface — a - * single materialization of the (expensive) field shape that every reference site points at. - */ -export type StructFacade< - Self, - Encoded, - MakeIn, - DecodingServices, - EncodingServices, - Fields extends S.Struct.Fields -> = - & Omit, "Type" | "Encoded" | "~type.make.in" | "DecodingServices" | "EncodingServices"> - & { - readonly "Type": Self - readonly "Encoded": Encoded - readonly "~type.make.in": MakeIn - readonly "DecodingServices": DecodingServices - readonly "EncodingServices": EncodingServices - } diff --git a/packages/effect-app/src/Schema/FastCheck.ts b/packages/effect-app/src/Schema/FastCheck.ts deleted file mode 100644 index 0c01c89aa..000000000 --- a/packages/effect-app/src/Schema/FastCheck.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type * as fc from "fast-check" - -export type { Arbitrary } from "fast-check" -type FC = typeof fc - -export type { FC } - -export const ALPHABET = "abcdefghijklmnopqrstuvwxyz" -export const ALPHABET_UC = ALPHABET.toUpperCase() - -// uppercase A-Z -const UC_char = (fc: Pick) => fc.integer({ min: 0x41, max: 0x5a }).map(String.fromCharCode) -export const UC_alphabet = (min: number, max: number) => (fc: FC) => - fc.array(UC_char(fc), { minLength: min, maxLength: max }).map((arr) => arr.join("")) -// lowercase A-Z -const LC_char = (fc: Pick) => fc.integer({ min: 0x61, max: 0x7a }).map(String.fromCharCode) -export const LC_alphabet = (min: number, max: number) => (fc: Pick) => - fc.array(LC_char(fc), { minLength: min, maxLength: max }).map((arr) => arr.join("")) - -// numbers 0-9 -const N_char = (fc: Pick) => fc.integer({ min: 0x30, max: 0x39 }).map(String.fromCharCode) -export const Numbers = (min: number, max: number) => (fc: Pick) => - fc.array(N_char(fc), { minLength: min, maxLength: max }).map((arr) => arr.join("")) diff --git a/packages/effect-app/src/Schema/Methods.ts b/packages/effect-app/src/Schema/Methods.ts deleted file mode 100644 index 2da6a7a93..000000000 --- a/packages/effect-app/src/Schema/Methods.ts +++ /dev/null @@ -1,8 +0,0 @@ -export type ReadMethods = "GET" -export type WriteMethods = "POST" | "PUT" | "PATCH" | "DELETE" - -export type Rest = ReadMethods | WriteMethods - -export type System = "OPTIONS" | "HEAD" | "TRACE" - -export type All = Rest | System diff --git a/packages/effect-app/src/Schema/SchemaParser.ts b/packages/effect-app/src/Schema/SchemaParser.ts deleted file mode 100644 index 5b0fe3265..000000000 --- a/packages/effect-app/src/Schema/SchemaParser.ts +++ /dev/null @@ -1,12 +0,0 @@ -import * as SchemaParser from "effect/SchemaParser" -import { withDefaultParseOptions } from "./ext.ts" - -export * from "effect/SchemaParser" - -export const decodeEffectConcurrently: typeof SchemaParser.decodeEffect = withDefaultParseOptions( - SchemaParser.decodeEffect -) - -export const decodeUnknownEffectConcurrently: typeof SchemaParser.decodeUnknownEffect = withDefaultParseOptions( - SchemaParser.decodeUnknownEffect -) diff --git a/packages/effect-app/src/Schema/SpecialJsonSchema.ts b/packages/effect-app/src/Schema/SpecialJsonSchema.ts deleted file mode 100644 index e99d1cd88..000000000 --- a/packages/effect-app/src/Schema/SpecialJsonSchema.ts +++ /dev/null @@ -1,137 +0,0 @@ -/** - * SpecialJsonSchema — A variant of Schema.toJsonSchemaDocument that - * post-processes the output (e.g. flattens simple allOf). - */ -import type * as JsonSchema from "effect/JsonSchema" -import * as Schema from "effect/Schema" - -/** - * Converts a schema to a JSON Schema Document (draft-2020-12), with - * post-processing that flattens simple allOf entries. - */ -export function specialJsonSchemaDocument( - schema: Schema.Top, - options?: Schema.ToJsonSchemaOptions -): JsonSchema.Document<"draft-2020-12"> { - const jd = Schema.toJsonSchemaDocument(schema, options) - const processedDefs: JsonSchema.Definitions = {} - for (const [key, def] of Object.entries(jd.definitions)) { - processedDefs[key] = postProcessJsonSchema(def) - } - return { - dialect: "draft-2020-12", - schema: postProcessJsonSchema(jd.schema), - definitions: processedDefs - } -} - -/** - * Flattens `allOf` entries into the parent when the parent already has a - * `type` and every `allOf` entry is a plain constraint object (no `$ref`, - * no `type`). Merged properties from `allOf` entries win on conflict. - */ -export function flattenSimpleAllOf(obj: unknown): unknown { - if (obj === null || typeof obj !== "object") return obj - - if (globalThis.Array.isArray(obj)) { - return obj.map(flattenSimpleAllOf) - } - - const record = obj as Record - const result: Record = {} - for (const [key, value] of Object.entries(record)) { - result[key] = flattenSimpleAllOf(value) - } - - if (result["type"] && globalThis.Array.isArray(result["allOf"])) { - const allOf = result["allOf"] as Array> - const canFlatten = allOf.every((entry) => - typeof entry === "object" && entry !== null && !("$ref" in entry) && !("type" in entry) - ) - if (canFlatten) { - const { allOf: _, ...rest } = result - const merged: Record = { ...rest } - for (const entry of allOf) { - Object.assign(merged, entry) - } - return merged - } - } - - return result -} - -/** - * Recursively removes `additionalProperties: false` from JSON Schema objects. - * Only removes when the value is exactly `false` -- other values are left intact. - */ -export function removeAdditionalPropertiesFalse(obj: unknown): unknown { - if (obj === null || typeof obj !== "object") return obj - - if (globalThis.Array.isArray(obj)) { - return obj.map(removeAdditionalPropertiesFalse) - } - - const record = obj as Record - const result: Record = {} - for (const [key, value] of Object.entries(record)) { - if (key === "additionalProperties" && value === false) continue - result[key] = removeAdditionalPropertiesFalse(value) - } - - return result -} - -/** - * Flattens nested `anyOf` entries: if an anyOf entry is itself just `{ anyOf: [...] }` - * with no other keys, its children are inlined. If only one item remains, the anyOf - * wrapper is removed entirely. - */ -export function flattenNestedAnyOf(obj: unknown): unknown { - if (obj === null || typeof obj !== "object") return obj - if (globalThis.Array.isArray(obj)) return obj.map(flattenNestedAnyOf) - - const record = obj as Record - const result: Record = {} - for (const [key, value] of Object.entries(record)) { - result[key] = flattenNestedAnyOf(value) - } - - if (globalThis.Array.isArray(result["anyOf"])) { - const anyOf = result["anyOf"] as Array - const flattened: Array = [] - for (const entry of anyOf) { - if ( - typeof entry === "object" - && entry !== null - && !globalThis.Array.isArray(entry) - && "anyOf" in entry - && Object.keys(entry).length === 1 - && globalThis.Array.isArray((entry as Record)["anyOf"]) - ) { - flattened.push(...(entry as Record)["anyOf"] as Array) - } else { - flattened.push(entry) - } - } - if (flattened.length === 1) { - const { anyOf: _, ...rest } = result - const single = flattened[0] - if (typeof single === "object" && single !== null && !globalThis.Array.isArray(single)) { - return { ...rest, ...single } - } - return single - } - result["anyOf"] = flattened - } - - return result -} - -/** - * Applies JSON Schema post-processing: flattens simple allOf, - * flattens nested anyOf, then strips additionalProperties: false. - */ -export function postProcessJsonSchema(obj: JsonSchema.JsonSchema): JsonSchema.JsonSchema { - return removeAdditionalPropertiesFalse(flattenNestedAnyOf(flattenSimpleAllOf(obj))) as JsonSchema.JsonSchema -} diff --git a/packages/effect-app/src/Schema/SpecialOpenApi.ts b/packages/effect-app/src/Schema/SpecialOpenApi.ts deleted file mode 100644 index d65457a7d..000000000 --- a/packages/effect-app/src/Schema/SpecialOpenApi.ts +++ /dev/null @@ -1,130 +0,0 @@ -/** - * SpecialOpenApi — Deduplicates `components/schemas` entries in an OpenAPI spec - * and applies JSON Schema post-processing (null removal, allOf flattening). - * - * When `OpenApi.fromApi` generates the spec, different AST nodes sharing the - * same identifier can produce duplicate entries (e.g. "X" and "X1") in - * `components.schemas`. This module provides a transform function that - * collapses those duplicates, rewrites all `$ref` pointers accordingly, - * and post-processes schemas for better codegen compatibility. - * - * Usage with the OpenApi `Transform` annotation: - * - * ```ts - * import { OpenApi } from "effect/unstable" - * import { deduplicateOpenApiSchemas } from "./SpecialOpenApi.ts" - * - * const api = HttpApi.make("myApi") - * .pipe(HttpApi.annotateContext(OpenApi.annotations({ transform: deduplicateOpenApiSchemas }))) - * ``` - */ - -import { postProcessJsonSchema } from "./SpecialJsonSchema.ts" - -/** - * Deduplicates `components.schemas` entries in an OpenAPI spec. - * - * Entries sharing the same base identifier (e.g. "X" and "X1") whose JSON - * representations are identical are collapsed into a single canonical entry, - * and all `$ref` pointers throughout the spec are rewritten to point to - * the canonical key. - * - * Designed to be used as the `transform` option in `OpenApi.annotations`. - */ -export function deduplicateOpenApiSchemas( - spec: Record -): Record { - const components = spec["components"] as Record | undefined - if (!components) return spec - const schemas = components["schemas"] as Record | undefined - if (!schemas) return spec - - const keys = Object.keys(schemas) - if (keys.length === 0) return spec - - // Group keys by base identifier (strip trailing digits) - const groups = new Map>() - for (const key of keys) { - const base = getBaseIdentifier(key) - const fingerprint = JSON.stringify(schemas[key]) - const group = groups.get(base) - if (group === undefined) { - groups.set(base, [{ key, fingerprint }]) - } else { - group.push({ key, fingerprint }) - } - } - - // Build remapping from duplicate keys to canonical keys - const remapping = new Map() - for (const [, group] of groups) { - if (group.length <= 1) continue - const seen = new Map() // fingerprint -> canonical key - for (const entry of group) { - const canonical = seen.get(entry.fingerprint) - if (canonical !== undefined) { - remapping.set(entry.key, canonical) - } else { - seen.set(entry.fingerprint, entry.key) - } - } - } - - if (remapping.size === 0) return postProcessJsonSchema(spec) - - // Build new schemas object without duplicates - const newSchemas: Record = {} - for (const key of keys) { - if (!remapping.has(key)) { - newSchemas[key] = schemas[key] - } - } - - // Deep clone the spec, replace schemas, and rewrite all $ref pointers - const newSpec = structuredClone(spec) - newSpec["components"]["schemas"] = newSchemas - rewriteRefs(newSpec, remapping) - - return postProcessJsonSchema(newSpec) -} - -/** - * Extracts the base identifier from a schema key by stripping trailing - * digits appended by the gen() function. - * E.g. "X1" -> "X", "X" -> "X", "MyType2" -> "MyType" - */ -function getBaseIdentifier(key: string): string { - const match = key.match(/^(.+?)(\d+)$/) - return match ? match[1]! : key -} - -/** - * Recursively rewrites `$ref` values in a JSON object tree. - * Mutates the object in-place (caller should pass a deep clone). - */ -function rewriteRefs(obj: any, remapping: Map): void { - if (obj === null || typeof obj !== "object") return - - if (Array.isArray(obj)) { - for (const item of obj) { - rewriteRefs(item, remapping) - } - return - } - - if (typeof obj.$ref === "string") { - // OpenAPI refs look like "#/components/schemas/X1" - const prefix = "#/components/schemas/" - if (obj.$ref.startsWith(prefix)) { - const refKey = obj.$ref.slice(prefix.length) - const canonical = remapping.get(refKey) - if (canonical !== undefined) { - obj.$ref = prefix + canonical - } - } - } - - for (const value of Object.values(obj)) { - rewriteRefs(value, remapping) - } -} diff --git a/packages/effect-app/src/Schema/brand.ts b/packages/effect-app/src/Schema/brand.ts deleted file mode 100644 index 73497ee74..000000000 --- a/packages/effect-app/src/Schema/brand.ts +++ /dev/null @@ -1,71 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/no-unsafe-return */ -import * as B from "effect/Brand" -import type * as Option from "effect/Option" -import type * as Result from "effect/Result" -import * as S from "effect/Schema" - -export interface Constructor> { - /** - * Constructs a branded type from a value of type `A`, throwing an error if - * the provided `A` is not valid. - */ - (args: Unbranded): A - /** - * Constructs a branded type from a value of type `A`, returning `Some` - * if the provided `A` is valid, `None` otherwise. - */ - option(args: Unbranded): Option.Option - /** - * Constructs a branded type from a value of type `A`, returning `Result.succeed` - * if the provided `A` is valid, `Result.fail` otherwise. - */ - result(args: Unbranded): Result.Result - /** - * Attempts to refine the provided value of type `A`, returning `true` if - * the provided `A` is valid, `false` otherwise. - */ - is(a: Unbranded): a is Unbranded & A -} - -type BrandAnnotations = S.Annotations.Filter - -export interface BrandedSchema> extends - S.Bottom< - C, - S["Encoded"], - S["DecodingServices"], - S["EncodingServices"], - S["ast"], - BrandedSchema, - S["~type.make.in"], - S["Iso"], - S["~type.parameters"], - C, - S["~type.mutability"], - S["~type.optionality"], - S["~type.constructor.default"], - S["~encoded.mutability"], - S["~encoded.optionality"] - > -{} - -export const fromBrand = >( - constructor: Constructor, - options?: BrandAnnotations -) => -(self: Self): BrandedSchema => { - const branded = S.fromBrand(options?.identifier ?? "Brand", constructor as any)(self as any) - return options ? (branded as any).pipe(S.annotate(options)) : branded as any -} - -export type Brands

= P extends B.Brand ? B.Brand.Brands

- : never - -export type Unbranded

= P extends B.Brand ? B.Brand.Unbranded

> = { -// [K in keyof P[B.BrandTypeId]]: K extends string | symbol ? { -// readonly [k in K]: k -// } -// : never -// }[keyof P[B.BrandTypeId]] -// export type UnionToIntersection3 = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I -// : never - -/** Union of core `Schema.Date` (Date objects) and string-encoded `DateFromString`, with default helpers. */ -export const inputDate = extendM( - S.Union([S.Date, DateFromString]), - (s) => ({ - /** - * Construction-only default `new Date()`. Applied only when the field is - * omitted from `.make(...)` input. NOT applied during decode — cannot be - * used to JIT-migrate database fields. See file-level note. - */ - withConstructorDefault: s.pipe(S.withConstructorDefault(Effect.sync(() => new globalThis.Date()))), - /** - * Decode-time default `new Date()`. **Discouraged for persisted data:** a - * missing field may be data corruption, not an old-shape document; - * silently substituting `new Date()` hides the problem. Prefer an - * explicit, preferably versioned migration over a decode-time fallback. - * See file-level note. - */ - withDecodingDefaultType: s.pipe(S.withDecodingDefaultType(Effect.sync(() => new globalThis.Date()))) - }) -) - -export interface UnionBrand {} - -// TODO: v4 migration — makeOpt used internal PropertySignature types that are removed in v4 -// Simplified to use v4's S.optional / S.optionalKey directly -export function makeOptional( - t: NER -): { - [K in keyof NER]: NER[K] extends S.Top ? ReturnType> : any -} { - return typedKeysOf(t).reduce((prev, cur) => { - prev[cur] = S.optional(t[cur] as any) - return prev - }, {} as any) -} - -// `Omit` erases the polymorphic `this` of "this-returning" methods (`annotate`, `annotateKey`, -// `check`, `rebuild`): extracting them through a mapped type binds their `this["Rebuild"]` back to -// the original `T`, not to this intersection. So overriding just `Rebuild` above is not enough, those -// four methods have to be redeclared here with a concrete return type instead of `this["Rebuild"]`. -export type DropConstructorDefault = - & Omit< - T, - "~type.constructor.default" | "Rebuild" | "annotate" | "annotateKey" | "check" | "rebuild" - > - & { - readonly "~type.constructor.default": "no-default" - readonly "Rebuild": DropConstructorDefault - annotate(annotations: S.Annotations.Bottom): DropConstructorDefault - annotateKey(annotations: S.Annotations.Key): DropConstructorDefault - check( - ...checks: readonly [SchemaAST.Check, ...Array>] - ): DropConstructorDefault - rebuild(ast: T["ast"]): DropConstructorDefault - } - -// `replaceContext` is `@internal` in `effect/SchemaAST` (stripped from its public types, though the -// export itself still ships in the compiled JS). Effect's own `withConstructorDefault` goes through the -// same function internally, so this mirrors an existing code path rather than reaching for something -// novel, but it's still an internal API that could move or disappear without a signal. -const SchemaASTInternal = SchemaAST as unknown as { - readonly replaceContext: (ast: A, context: SchemaAST.Context | undefined) => A -} - -export interface DropConstructorDefaultLambda extends Struct.Lambda { - (self: T): DropConstructorDefault - readonly "~lambda.out": DropConstructorDefault -} - -/** - * A `Struct.Lambda` that removes a field's `withConstructorDefault`, if any. - * Compose with `Struct.pick`/`Struct.omit` via `Struct.map` to derive a - * partial-update schema from a "create" schema without inheriting defaults - * that would resurrect omitted fields in `.make(...)` output: - * - * ```ts - * import { flow } from "effect/Function" - * import * as Struct from "effect/Struct" - * import * as S from "effect-app/Schema" - * - * const Person = S.Struct({ - * id: S.String, - * name: S.String.pipe(S.optionalKey, S.withConstructorDefault(() => "")) - * }) - * - * const UpdatePerson = Person.mapFields( - * flow(Struct.omit(["id"]), Struct.map(S.dropConstructorDefault)) - * ) - * ``` - */ -export const dropConstructorDefault: DropConstructorDefaultLambda = Struct.lambda( - (schema) => { - const context = schema.ast.context - if (!context?.constructorDefault) return schema - return schema.rebuild( - SchemaASTInternal.replaceContext( - schema.ast, - new SchemaAST.Context(context.isOptional, context.isMutable, undefined, context.annotations) - ) - ) - } -) - -export function makeExactOptional( - t: NER -): { - [K in keyof NER]: NER[K] extends S.Top ? DropConstructorDefault>> - : any -} { - return typedKeysOf(t).reduce((prev, cur) => { - prev[cur] = dropConstructorDefault(S.optionalKey(t[cur] as any)) - return prev - }, {} as any) -} - -/** A version of transform which is only a one way mapping of From->To */ -export const transformTo = ( - from: From, - to: To, - decode: ( - fromA: From["Type"], - options: SchemaAST.ParseOptions - ) => To["Encoded"] -) => - from.pipe( - S.decodeTo( - to, - SchemaTransformation.transformEffect({ - decode: (input: any, options: any) => Effect.sync(() => decode(input, options)), - encode: (i: any) => - Effect.fail( - new SchemaIssue.Forbidden( - { message: "One way schema transformation, encoding is not allowed" }, - i - ) - ) - }) - ) - ) - -/** A version of transformEffect which is only a one way mapping of From->To */ -export const transformToOrFail = ( - from: From, - to: To, - decode: ( - fromA: From["Type"], - options: SchemaAST.ParseOptions - ) => Effect.Effect -) => - from.pipe( - S.decodeTo( - to, - SchemaTransformation.transformEffect({ - decode, - encode: (i: any) => - Effect.fail( - new SchemaIssue.Forbidden( - { message: "One way schema transformation, encoding is not allowed" }, - i - ) - ) - }) - ) - ) - -export const provide: { - (context: Context.Context): (self: Self) => ProvidedCodec - (self: Self, context: Context.Context): ProvidedCodec -} = Function.dual(2, (self: Self, context: Context.Context): ProvidedCodec => { - const prov = Effect.provide(context) - return self.pipe( - S.middlewareDecoding((effect) => prov(effect)), - S.middlewareEncoding((effect) => prov(effect)) - ) -}) -export const contextFromServices = Effect.fnUntraced(function*< - Self extends S.Top, - Tags extends ReadonlyArray> ->(self: Self, ...services: Tags) { - const context: Context.Context> = Context.pick(...services)( - yield* Effect.context>() - ) - return provide(self, context) -}) as < - Self extends S.Top, - Tags extends ReadonlyArray> ->( - self: Self, - ...services: Tags -) => Effect.Effect< - ProvidedCodec>, - never, - Context.Service.Identifier -> diff --git a/packages/effect-app/src/Schema/moreStrings.ts b/packages/effect-app/src/Schema/moreStrings.ts deleted file mode 100644 index d8ef9902e..000000000 --- a/packages/effect-app/src/Schema/moreStrings.ts +++ /dev/null @@ -1,321 +0,0 @@ -/** - * Branded string ID schemas with `.withConstructorDefault` extensions. - * - * Each `.withConstructorDefault` here is **only** applied when the field is - * omitted during construction (`.make(...)`). It is **not** applied during - * decode and therefore cannot be used to JIT-migrate database fields. - * - * For persisted data, prefer an explicit, preferably versioned migration - * over decode-time fallbacks. See `./ext.ts` for the full policy note. - */ -import type { Refinement } from "effect-app/Function" -import { extendM } from "effect-app/utils" -import type * as B from "effect/Brand" -import * as Effect from "effect/Effect" -import { pipe } from "effect/Function" -import * as S from "effect/Schema" -import type { Simplify } from "effect/Types" -import { nanoid } from "nanoid" -import validator from "validator" -import type * as SchemaAST from "../SchemaAST.ts" -import { type BrandedSchema, fromBrand, nominal } from "./brand.ts" -import { withDefaultMake } from "./ext.ts" -import { type B as SchemaB } from "./schema.ts" -import type { NonEmptyString255Brand, NonEmptyStringBrand } from "./strings.ts" - -const nonEmptyString = S.NonEmptyString - -/** - * A string that is at least 1 character long and a maximum of 50. - */ -export interface NonEmptyString50Brand extends Simplify & NonEmptyString64Brand> {} - -/** - * A string that is at least 1 character long and a maximum of 50. - */ -export type NonEmptyString50 = string & NonEmptyString50Brand - -/** - * A string that is at least 1 character long and a maximum of 50. - */ -export interface NonEmptyString50Schema extends BrandedSchema { - (i: string, options?: SchemaAST.ParseOptions): NonEmptyString50 -} -export const NonEmptyString50: NonEmptyString50Schema = nonEmptyString.pipe( - S.check(S.isMaxLength(50)), - fromBrand(nominal(), { - identifier: "NonEmptyString50", - jsonSchema: {} - }), - withDefaultMake -) - -/** - * A string that is at least 1 character long and a maximum of 64. - */ -export interface NonEmptyString64Brand extends Simplify & NonEmptyString80Brand> {} - -/** - * A string that is at least 1 character long and a maximum of 64. - */ -export type NonEmptyString64 = string & NonEmptyString64Brand - -/** - * A string that is at least 1 character long and a maximum of 64. - */ -export interface NonEmptyString64Schema extends BrandedSchema { - (i: string, options?: SchemaAST.ParseOptions): NonEmptyString64 -} -export const NonEmptyString64: NonEmptyString64Schema = nonEmptyString.pipe( - S.check(S.isMaxLength(64)), - fromBrand(nominal(), { - identifier: "NonEmptyString64", - jsonSchema: {} - }), - withDefaultMake -) - -/** - * A string that is at least 1 character long and a maximum of 80. - */ -export interface NonEmptyString80Brand extends Simplify & NonEmptyString100Brand> {} - -/** - * A string that is at least 1 character long and a maximum of 80. - */ -export type NonEmptyString80 = string & NonEmptyString80Brand - -/** - * A string that is at least 1 character long and a maximum of 80. - */ - -export interface NonEmptyString80Schema extends BrandedSchema { - (i: string, options?: SchemaAST.ParseOptions): NonEmptyString80 -} -export const NonEmptyString80: NonEmptyString80Schema = nonEmptyString.pipe( - S.check(S.isMaxLength(80)), - fromBrand(nominal(), { - identifier: "NonEmptyString80", - jsonSchema: {} - }), - withDefaultMake -) - -/** - * A string that is at least 1 character long and a maximum of 100. - */ -export interface NonEmptyString100Brand extends Simplify & NonEmptyString255Brand> {} - -/** - * A string that is at least 1 character long and a maximum of 100. - */ -export type NonEmptyString100 = string & NonEmptyString100Brand - -/** - * A string that is at least 1 character long and a maximum of 100. - */ -export interface NonEmptyString100Schema extends BrandedSchema { - (i: string, options?: SchemaAST.ParseOptions): NonEmptyString100 -} -export const NonEmptyString100: NonEmptyString100Schema = nonEmptyString.pipe( - S.check(S.isMaxLength(100)), - fromBrand(nominal(), { - identifier: "NonEmptyString100", - jsonSchema: {} - }), - withDefaultMake -) - -/** - * A string that is at least 3 character long and a maximum of 255. - */ -export interface Min3String255Brand extends Simplify & NonEmptyString255Brand> {} - -/** - * A string that is at least 3 character long and a maximum of 255. - */ -export type Min3String255 = string & Min3String255Brand - -/** - * A string that is at least 3 character long and a maximum of 255. - */ -export interface Min3String255Schema extends BrandedSchema { - (i: string, options?: SchemaAST.ParseOptions): Min3String255 -} -export const Min3String255: Min3String255Schema = pipe( - S.String, - S.check(S.isMinLength(3), S.isMaxLength(255)), - fromBrand(nominal(), { - identifier: "Min3String255", - jsonSchema: {} - }), - withDefaultMake -) - -/** - * A string that is at least 6 characters long and a maximum of 50. - */ -export interface StringIdBrand extends Simplify & NonEmptyString50Brand> {} - -/** - * A string that is at least 6 characters long and a maximum of 50. - */ -export type StringId = string & StringIdBrand - -const minLength = 6 -const maxLength = 50 -const StringIdSchemaBase = pipe( - S.String, - S.check(S.isMinLength(minLength), S.isMaxLength(maxLength)), - fromBrand(nominal(), { - identifier: "StringId", - jsonSchema: {} - }) -) -const makeStringId = (s?: string): StringId => - s !== undefined ? S.decodeSync(StringIdSchemaBase)(s) : nanoid() as unknown as StringId -/** - * A string that is at least 6 characters long and a maximum of 50. - * - * `.withConstructorDefault` => fresh `nanoid()` (construction-only; not - * applied during decode — see file-level note). - */ -export interface StringIdSchema extends BrandedSchema { - (i: string, options?: SchemaAST.ParseOptions): StringId - /** Generate fresh `nanoid()`-shaped `StringId`. */ - make(): StringId - /** Construct a `StringId` from a known string (validated via decodeSync). */ - make(input: string, options?: S.MakeOptions): StringId - readonly withConstructorDefault: S.withConstructorDefault> -} -export const StringId: StringIdSchema = extendM( - StringIdSchemaBase, - (s) => ({ - make: makeStringId, - /** - * Construction-only default: fresh `nanoid()`-shaped `StringId`. Applied - * only when the field is omitted from `.make(...)` input. NOT applied - * during decode — cannot be used to JIT-migrate database fields. See - * file-level note. - */ - withConstructorDefault: s.pipe(S.withConstructorDefault(Effect.sync(makeStringId))) - }) -) - .pipe(withDefaultMake) - -/** - * Build a `StringId` schema whose values are required to start with a fixed - * `prefix` (joined with `separator`, default `-`). - * - * The returned schema exposes `.withConstructorDefault` that mints a fresh - * prefixed id. Construction-only — not applied during decode; see file-level - * note. - */ -export function prefixedStringId() { - return ( - prefix: Prefix, - name: string, - separator?: Separator - ) => { - type FullPrefix = `${Prefix}${Separator}` - const pref = `${prefix}${separator ?? "-"}` as FullPrefix - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const s = StringIdSchemaBase - .pipe( - S.refine((x: string): x is Type => x.startsWith(pref), { - identifier: name - }) - ) - const schema = s.pipe(withDefaultMake) - const make = () => (pref + StringId.make().substring(0, 50 - pref.length)) as Type - - return extendM( - schema, - (ex): PrefixedStringUtils => ({ - make, - /** - * Automatically adds the prefix. - */ - unsafeFrom: (str: string) => ex(pref + str), - /** - * Must provide a literal string starting with prefix. - */ - prefixSafe: (str: `${Prefix}${Separator}${REST}`) => ex(str), - prefix, - /** - * Construction-only default: fresh prefixed id. Applied only when - * the field is omitted from `.make(...)` input. NOT applied during - * decode — cannot be used to JIT-migrate database fields. See - * file-level note. - */ - withConstructorDefault: schema.pipe( - S.withConstructorDefault & S.WithoutConstructorDefault>( - Effect.sync(make) - ) - ) - }) - ) - } -} - -/** - * Build a branded `StringId` schema for the given branded `Id` type. - * - * Exposes `.withConstructorDefault` that mints a fresh `nanoid()`-shaped id. - * Construction-only — not applied during decode; see file-level note. - */ -export const brandedStringId = >(): BrandedStringIdSchema => - withDefaultMake( - Object.assign(Object.create(StringId), StringId) as BrandedStringIdSchema - ) - -export interface PrefixedStringUtils< - Type extends StringId, - Prefix extends string, - Separator extends string -> { - readonly make: () => Type - readonly unsafeFrom: (str: string) => Type - prefixSafe: (str: `${Prefix}${Separator}${REST}`) => Type - readonly prefix: Prefix - /** - * Construction-only default: fresh prefixed id. Applied only when the - * field is omitted from `.make(...)` input. NOT applied during decode — - * cannot be used to JIT-migrate database fields. See file-level note. - */ - readonly withConstructorDefault: S.withConstructorDefault & S.WithoutConstructorDefault> -} - -export interface BrandedStringIdSchema> extends BrandedSchema { - (i: string, options?: SchemaAST.ParseOptions): Id - /** Generate fresh `nanoid()`-shaped id (inherited from `StringId`). */ - make(): Id - /** Construct an `Id` from a known string (validated via decodeSync). */ - make(input: string, options?: S.MakeOptions): Id - readonly withConstructorDefault: S.withConstructorDefault> -} - -export interface UrlBrand extends Simplify & NonEmptyStringBrand> {} - -export type Url = string & UrlBrand - -const isUrl: Refinement = (s: string): s is Url => { - return validator.default.isURL(s, { require_tld: false }) -} - -export interface UrlSchema extends S.refine { - (i: string, options?: SchemaAST.ParseOptions): Url -} -export const Url: UrlSchema = S - .String - .pipe( - S.annotate({ - title: "Url", - format: "uri" - }), - S.refine(isUrl, { - identifier: "Url", - jsonSchema: { format: "uri" } - }), - withDefaultMake - ) diff --git a/packages/effect-app/src/Schema/numbers.ts b/packages/effect-app/src/Schema/numbers.ts deleted file mode 100644 index d26a86ff3..000000000 --- a/packages/effect-app/src/Schema/numbers.ts +++ /dev/null @@ -1,152 +0,0 @@ -/** - * Numeric brand schemas with `.withConstructorDefault` extensions. - * - * Each `.withConstructorDefault` here is **only** applied when the field is - * omitted during construction (`.make(...)`). It is **not** applied during - * decode and therefore cannot be used to JIT-migrate database fields. - * - * For persisted data, prefer an explicit, preferably versioned migration - * over decode-time fallbacks. See `./ext.ts` for the full policy note. - */ -import { extendM } from "effect-app/utils" -import * as Effect from "effect/Effect" -import * as S from "effect/Schema" -import type { Simplify } from "effect/Types" -import type * as SchemaAST from "../SchemaAST.ts" -import { type BrandedSchema, fromBrand, nominal } from "./brand.ts" -import { withDefaultMake } from "./ext.ts" -import { type B } from "./schema.ts" - -export interface PositiveIntBrand - extends Simplify & NonNegativeIntBrand & PositiveNumberBrand> -{} -export type PositiveInt = number & PositiveIntBrand -/** Positive integer. `.withConstructorDefault` => `1` (construction-only). */ -export interface PositiveIntSchema extends BrandedSchema { - (i: number, options?: SchemaAST.ParseOptions): PositiveInt - readonly withConstructorDefault: S.withConstructorDefault> -} -export const PositiveInt: PositiveIntSchema = extendM( - S.Int.pipe( - S.check(S.isGreaterThan(0)), - fromBrand(nominal(), { identifier: "PositiveInt", jsonSchema: {} }), - withDefaultMake - ), - (s) => ({ - /** - * Construction-only default `1`. Applied only when the field is omitted - * from `.make(...)` input. NOT applied during decode — cannot be used to - * JIT-migrate database fields. See file-level note. - */ - withConstructorDefault: s.pipe(S.withConstructorDefault(Effect.sync(() => s(1)))) - }) -) - -export interface NonNegativeIntBrand extends Simplify & IntBrand & NonNegativeNumberBrand> {} -export type NonNegativeInt = number & NonNegativeIntBrand -/** Non-negative integer. `.withConstructorDefault` => `0` (construction-only). */ -export interface NonNegativeIntSchema extends BrandedSchema { - (i: number, options?: SchemaAST.ParseOptions): NonNegativeInt - readonly withConstructorDefault: S.withConstructorDefault> -} -export const NonNegativeInt: NonNegativeIntSchema = extendM( - S.Int.pipe( - S.check(S.isGreaterThanOrEqualTo(0)), - fromBrand(nominal(), { - identifier: "NonNegativeInt", - jsonSchema: {} - }), - withDefaultMake - ), - (s) => ({ - /** - * Construction-only default `0`. Applied only when the field is omitted - * from `.make(...)` input. NOT applied during decode — cannot be used to - * JIT-migrate database fields. See file-level note. - */ - withConstructorDefault: s.pipe(S.withConstructorDefault(Effect.sync(() => s(0)))) - }) -) - -export interface IntBrand extends Simplify> {} -export type Int = number & IntBrand -/** Integer. `.withConstructorDefault` => `0` (construction-only). */ -export interface IntSchema extends BrandedSchema { - (i: number, options?: SchemaAST.ParseOptions): Int - readonly withConstructorDefault: S.withConstructorDefault> -} -export const Int: IntSchema = extendM( - S.Int.pipe(fromBrand(nominal(), { identifier: "Int", jsonSchema: {} }), withDefaultMake), - (s) => ({ - /** - * Construction-only default `0`. Applied only when the field is omitted - * from `.make(...)` input. NOT applied during decode — cannot be used to - * JIT-migrate database fields. See file-level note. - */ - withConstructorDefault: s.pipe(S.withConstructorDefault(Effect.sync(() => s(0)))) - }) -) - -export interface PositiveNumberBrand extends Simplify & NonNegativeNumberBrand> {} -export type PositiveNumber = number & PositiveNumberBrand -/** Positive finite number. `.withConstructorDefault` => `1` (construction-only). */ -export interface PositiveNumberSchema extends BrandedSchema { - (i: number, options?: SchemaAST.ParseOptions): PositiveNumber - readonly withConstructorDefault: S.withConstructorDefault> -} -export const PositiveNumber: PositiveNumberSchema = extendM( - S.Finite.pipe( - S.check(S.isGreaterThan(0)), - fromBrand(nominal(), { - identifier: "PositiveNumber", - jsonSchema: {} - }), - withDefaultMake - ), - (s) => ({ - /** - * Construction-only default `1`. Applied only when the field is omitted - * from `.make(...)` input. NOT applied during decode — cannot be used to - * JIT-migrate database fields. See file-level note. - */ - withConstructorDefault: s.pipe(S.withConstructorDefault(Effect.sync(() => s(1)))) - }) -) - -export interface NonNegativeNumberBrand extends Simplify> {} -export type NonNegativeNumber = number & NonNegativeNumberBrand -/** Non-negative finite number. `.withConstructorDefault` => `0` (construction-only). */ -export interface NonNegativeNumberSchema extends BrandedSchema { - (i: number, options?: SchemaAST.ParseOptions): NonNegativeNumber - readonly withConstructorDefault: S.withConstructorDefault> -} -export const NonNegativeNumber: NonNegativeNumberSchema = extendM( - S - .Finite - .pipe( - S.check(S.isGreaterThanOrEqualTo(0)), - fromBrand(nominal(), { - identifier: "NonNegativeNumber", - jsonSchema: {} - }), - withDefaultMake - ), - (s) => ({ - /** - * Construction-only default `0`. Applied only when the field is omitted - * from `.make(...)` input. NOT applied during decode — cannot be used to - * JIT-migrate database fields. See file-level note. - */ - withConstructorDefault: s.pipe(S.withConstructorDefault(Effect.sync(() => s(0)))) - }) -) - -/** @deprecated Not an actual decimal */ -export const NonNegativeDecimal = NonNegativeNumber -/** @deprecated Not an actual decimal */ -export type NonNegativeDecimal = NonNegativeNumber - -/** @deprecated Not an actual decimal */ -export const PositiveDecimal = PositiveNumber -/** @deprecated Not an actual decimal */ -export type PositiveDecimal = PositiveNumber diff --git a/packages/effect-app/src/Schema/phoneNumber.ts b/packages/effect-app/src/Schema/phoneNumber.ts deleted file mode 100644 index 2ddc9f6e6..000000000 --- a/packages/effect-app/src/Schema/phoneNumber.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { Refinement } from "effect-app/Function" -import { isValidPhone } from "effect-app/validation" -import * as S from "effect/Schema" -import type { Simplify } from "effect/Types" -import { withDefaultMake } from "./ext.ts" -import type { B } from "./schema.ts" -import type { NonEmptyStringBrand } from "./strings.ts" - -export interface PhoneNumberBrand extends Simplify & NonEmptyStringBrand> {} -export type PhoneNumber = string & PhoneNumberBrand - -export const PhoneNumber = S - .String - .pipe( - S.annotate({ - title: "PhoneNumber", - description: "a phone number with at least 7 digits", - format: "phone" - }), - S.refine(isValidPhone as Refinement, { - identifier: "PhoneNumber", - description: "a phone number with at least 7 digits", - jsonSchema: { format: "phone" } - }), - withDefaultMake - ) diff --git a/packages/effect-app/src/Schema/schema.ts b/packages/effect-app/src/Schema/schema.ts deleted file mode 100644 index 5b405c8be..000000000 --- a/packages/effect-app/src/Schema/schema.ts +++ /dev/null @@ -1,5 +0,0 @@ -import * as B from "effect/Brand" -import * as P from "effect/SchemaParser" -import * as AST from "../SchemaAST.ts" - -export { AST, B, P } diff --git a/packages/effect-app/src/Schema/strings.ts b/packages/effect-app/src/Schema/strings.ts deleted file mode 100644 index 71d857dd9..000000000 --- a/packages/effect-app/src/Schema/strings.ts +++ /dev/null @@ -1,69 +0,0 @@ -import type * as B from "effect/Brand" -import * as S from "effect/Schema" -import type { Simplify } from "effect/Types" -import type * as SchemaAST from "../SchemaAST.ts" -import { type BrandedSchema, fromBrand, nominal } from "./brand.ts" -import { withDefaultMake } from "./ext.ts" - -export type NonEmptyStringBrand = B.Brand<"NonEmptyString"> -export type NonEmptyString = string & NonEmptyStringBrand -export interface NonEmptyStringSchema extends BrandedSchema { - (i: string, options?: SchemaAST.ParseOptions): NonEmptyString -} -export const NonEmptyString: NonEmptyStringSchema = S - .NonEmptyString - .pipe( - fromBrand(nominal(), { - identifier: "NonEmptyString", - jsonSchema: {} - }), - withDefaultMake - ) - -export interface NonEmptyString64kBrand extends Simplify & NonEmptyStringBrand> {} -export type NonEmptyString64k = string & NonEmptyString64kBrand -export interface NonEmptyString64kSchema extends BrandedSchema { - (i: string, options?: SchemaAST.ParseOptions): NonEmptyString64k -} -export const NonEmptyString64k: NonEmptyString64kSchema = S - .NonEmptyString - .pipe( - S.check(S.isMaxLength(64 * 1024)), - fromBrand(nominal(), { - identifier: "NonEmptyString64k", - jsonSchema: {} - }), - withDefaultMake - ) - -export interface NonEmptyString2kBrand extends Simplify & NonEmptyString64kBrand> {} -export type NonEmptyString2k = string & NonEmptyString2kBrand -export interface NonEmptyString2kSchema extends BrandedSchema { - (i: string, options?: SchemaAST.ParseOptions): NonEmptyString2k -} -export const NonEmptyString2k: NonEmptyString2kSchema = S - .NonEmptyString - .pipe( - S.check(S.isMaxLength(2 * 1024)), - fromBrand(nominal(), { - identifier: "NonEmptyString2k", - jsonSchema: {} - }), - withDefaultMake - ) - -export interface NonEmptyString255Brand extends Simplify & NonEmptyString2kBrand> {} -export type NonEmptyString255 = string & NonEmptyString255Brand -export interface NonEmptyString255Schema extends BrandedSchema { - (i: string, options?: SchemaAST.ParseOptions): NonEmptyString255 -} -export const NonEmptyString255: NonEmptyString255Schema = S - .NonEmptyString - .pipe( - S.check(S.isMaxLength(255)), - fromBrand(nominal(), { - identifier: "NonEmptyString255", - jsonSchema: {} - }), - withDefaultMake - ) diff --git a/packages/effect-app/src/SchemaAST.ts b/packages/effect-app/src/SchemaAST.ts deleted file mode 100644 index 968094487..000000000 --- a/packages/effect-app/src/SchemaAST.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "effect/SchemaAST" diff --git a/packages/effect-app/src/Set.ts b/packages/effect-app/src/Set.ts deleted file mode 100644 index f03b8138d..000000000 --- a/packages/effect-app/src/Set.ts +++ /dev/null @@ -1,665 +0,0 @@ -// ets_tracing: off - -import * as Array from "effect/Array" -import type * as Equivalence from "effect/Equivalence" -import * as Option from "effect/Option" -import type * as Order from "effect/Order" -import { not } from "effect/Predicate" -import type * as Result from "effect/Result" -import { identity, pipe, type Predicate, type Refinement, tuple } from "./Function.ts" - -export function find_( - as: ReadonlySet, - refinement: Refinement -): B | undefined -export function find_(set: ReadonlySet, predicate: Predicate): A | undefined -export function find_(set: ReadonlySet, predicate: Predicate) { - return [...set].find(predicate) -} - -export function findFirst_( - set: ReadonlySet, - refinement: Refinement -): Option.Option -export function findFirst_(set: ReadonlySet, predicate: Predicate): Option.Option -export function findFirst_(set: ReadonlySet, predicate: Predicate): Option.Option { - return Option.fromNullishOr([...set].find(predicate)) -} - -export function findFirstMap_( - set: ReadonlySet, - f: (a: A) => Option.Option -): Option.Option { - return Array.findFirst([...set], f) -} - -export type MutableSet = globalThis.Set -export type Set = ReadonlySet - -export const empty: Set = new Set() - -/** - * The set of elements which are in both the first and second set - */ -export function intersection_(E: Equivalence.Equivalence): (l: Set, r: Set) => Set { - const elemE = elem_(E) - return (x, y) => { - if (x === empty || y === empty) { - return empty - } - const r = new Set() - x.forEach((e) => { - if (elemE(y, e)) { - r.add(e) - } - }) - return r - } -} - -/** - * The set of elements which are in both the first and second set - */ -export function intersection(E: Equivalence.Equivalence): (r: Set) => (l: Set) => Set { - const i = intersection_(E) - return (x) => (y) => i(x, y) -} - -/** - * Convert a mutable set to a readonly one - */ -export function fromMutable(s: MutableSet): Set { - return new Set(s) -} - -/** - * Convert a set to a mutable one - */ -export function toMutable(s: Set): MutableSet { - return new Set(s) -} - -// /** -// * get Show for set given Show for values -// */ -// export function getShow(S: Show): Show> { -// return { -// show: (s) => { -// let elements = "" -// s.forEach((a) => { -// elements += S.show(a) + ", " -// }) -// if (elements !== "") { -// elements = elements.substring(0, elements.length - 2) -// } -// return `new Set([${elements}])` -// } -// } -// } - -/** - * Convert a set to an Array - */ -export function toArray(O: Order.Order): (set: Set) => ReadonlyArray { - return (x) => { - const r: Array = [] - x.forEach((e) => r.push(e)) - return r.sort(O) - } -} - -/** - * Convert a set to an Array - */ -export function toArray_(x: Set, O: Order.Order): ReadonlyArray { - return toArray(O)(x) -} - -// /** -// * Get Equivalence for Setgiven Equivalence for element -// */ -// export function getEquivalence.Equivalence(E: Equivalence.Equivalence): Equivalence.Equivalence> { -// const subsetE = isSubset_(E) -// return makeEquivalence((x, y) => subsetE(x, y) && subsetE(y, x)) -// } - -interface Next { - readonly done?: boolean - readonly value: A -} - -/** - * true if one or more elements match predicate - */ -export function some(predicate: Predicate): (set: Set) => boolean { - return (set) => { - const values = set.values() - let e: Next - let found = false - while (!found && !(e = values.next() as any).done) { - found = predicate(e.value) - } - return found - } -} - -/** - * true if one or more elements match predicate - */ -export function some_(set: Set, predicate: Predicate): boolean { - return some(predicate)(set) -} - -/** - * Projects a Set through a function - */ -export function map(E: Equivalence.Equivalence): (f: (x: A) => B) => (set: Set) => Set { - const m = map_(E) - return (f) => (set) => m(set, f) -} - -/** - * Projects a Set through a function - */ -export function map_(E: Equivalence.Equivalence): (set: Set, f: (x: A) => B) => Set { - const elemE = elem_(E) - return (set, f) => { - const r = new Set() - set.forEach((e) => { - const v = f(e) - if (!elemE(r, v)) { - r.add(v) - } - }) - return r - } -} - -/** - * true if all elements match predicate - */ -export function every(predicate: Predicate): (set: Set) => boolean { - return (set) => every_(set, predicate) -} - -/** - * true if all elements match predicate - */ -export function every_(set: Set, predicate: Predicate): boolean { - return not(some(not(predicate)))(set) -} - -/** - * Map + Flatten - */ -export function chain( - E: Equivalence.Equivalence -): (f: (x: A) => Set) => (set: Set) => Set { - const c = chain_(E) - return (f) => (set) => c(set, f) -} - -/** - * Map + Flatten - */ -export function chain_( - E: Equivalence.Equivalence -): (set: Set, f: (x: A) => Set) => Set { - const elemE = elem_(E) - return (set, f) => { - const r = new Set() - set.forEach((e) => { - f(e).forEach((e) => { - if (!elemE(r, e)) { - r.add(e) - } - }) - }) - return r - } -} - -/** - * `true` if and only if every element in the first set is an element of the second set - */ -export function isSubset(E: Equivalence.Equivalence): (x: Set, y: Set) => boolean { - const i = isSubset_(E) - return (x, y) => i(y, x) -} - -/** - * `true` if and only if every element in the first set is an element of the second set - */ -export function isSubset_(E: Equivalence.Equivalence): (x: Set, y: Set) => boolean { - const elemE = elem_(E) - return (x, y) => every((a: A) => elemE(y, a))(x) -} - -/** - * Filter set values using predicate - */ -export function filter( - refinement: Refinement -): (set: Set) => Set -export function filter(predicate: Predicate): (set: Set) => Set -export function filter(predicate: Predicate): (set: Set) => Set { - return (set) => filter_(set, predicate) -} - -/** - * Filter set values using predicate - */ -export function filter_( - set: Set, - refinement: Refinement -): Set -export function filter_(set: Set, predicate: Predicate): Set -export function filter_(set: Set, predicate: Predicate): Set { - const values = set.values() - let e: Next - const r = new Set() - while (!(e = values.next() as any).done) { - const value = e.value - if (predicate(value)) { - r.add(value) - } - } - return r -} - -/** - * Partition set values using predicate - */ -export function partition( - refinement: Refinement -): (set: Set) => readonly [Set, Set] -export function partition( - predicate: Predicate -): (set: Set) => readonly [Set, Set] -export function partition( - predicate: Predicate -): (set: Set) => readonly [Set, Set] { - return (set) => partition_(set, predicate) -} - -/** - * Partition set values using predicate - */ -export function partition_( - set: Set, - refinement: Refinement -): readonly [Set, Set] -export function partition_( - set: Set, - predicate: Predicate -): readonly [Set, Set] -export function partition_( - set: Set, - predicate: Predicate -): readonly [Set, Set] { - const values = set.values() - let e: Next - const right = new Set() - const left = new Set() - while (!(e = values.next() as any).done) { - const value = e.value - if (predicate(value)) { - right.add(value) - } else { - left.add(value) - } - } - return tuple(left, right) -} - -/** - * Test if a value is a member of a set - */ -export function elem_(E: Equivalence.Equivalence): (set: Set, a: A) => boolean { - return (set, a) => { - const values = set.values() - let e: Next - let found = false - while (!found && !(e = values.next() as any).done) { - found = E(a, e.value) - } - return found - } -} - -/** - * Test if a value is a member of a set - */ -export function elem(E: Equivalence.Equivalence): (a: A) => (set: Set) => boolean { - const e = elem_(E) - return (a) => (set) => e(set, a) -} - -/** - * Partition elements according to f - */ -export function partitionMap( - EB: Equivalence.Equivalence, - EC: Equivalence.Equivalence -): (f: (a: A) => Result.Result) => (set: Set) => readonly [Set, Set] { - const pm = partitionMap_(EB, EC) - return (f: (a: A) => Result.Result) => (set: Set) => pm(set, f) -} - -/** - * Partition elements according to f - */ -export function partitionMap_( - EB: Equivalence.Equivalence, - EC: Equivalence.Equivalence -): (set: Set, f: (a: A) => Result.Result) => readonly [Set, Set] { - return (set: Set, f: (a: A) => Result.Result) => { - const values = set.values() - let e: Next - const left = new Set() - const right = new Set() - const hasB = elem_(EB) - const hasC = elem_(EC) - while (!(e = values.next() as any).done) { - const v = f(e.value) - switch (v._tag) { - case "Failure": - if (!hasB(left, v.failure)) { - left.add(v.failure) - } - break - case "Success": - if (!hasC(right, v.success)) { - right.add(v.success) - } - break - } - } - return tuple(left, right) - } -} - -/** - * Form the set difference (`x` - `y`) - */ -export function difference_(E: Equivalence.Equivalence): (l: Set, r: Set) => Set { - const elemE = elem_(E) - return (x, y) => filter((a: A) => !elemE(y, a))(x) -} - -/** - * Form the set difference (`x` - `y`) - */ -export function difference(E: Equivalence.Equivalence): (x: Set, y: Set) => Set { - const diff = difference_(E) - return (x, y) => diff(x, y) -} - -/** - * Reduce over the set values - */ -export function reduce( - O: Order.Order -): (b: B, f: (b: B, a: A) => B) => (fa: Set) => B { - const red = reduce_(O) - return (b, f) => (fa) => red(fa, b, f) -} - -/** - * Reduce over the set values - */ -export function reduce_( - O: Order.Order -): (fa: Set, b: B, f: (b: B, a: A) => B) => B { - const toArrayO = toArray(O) - return (fa, b, f) => toArrayO(fa).reduce(f, b) -} - -// /** -// * Fold + Map -// */ -// export function foldMap( -// O: Order.Order, -// M: Identity -// ): (f: (a: A) => M) => (fa: Set) => M { -// const fm = foldMap_(O, M) -// return (f) => (fa) => fm(fa, f) -// } - -// /** -// * Fold + Map -// */ -// export function foldMap_( -// O: Order.Order, -// M: Identity -// ): (fa: Set, f: (a: A) => M) => M { -// const toArrayO = toArray(O) -// return (fa, f) => toArrayO(fa).reduce((b, a) => M.combine(b, f(a)), M.identity) -// } - -/** - * Create a set with one element - */ -export function singleton(a: A): Set { - return new Set([a]) -} - -/** - * Insert a value into a set - */ -export function insert(E: Equivalence.Equivalence): (a: A) => (set: Set) => Set { - const i = insert_(E) - return (a) => (set) => i(set, a) -} - -/** - * Insert a value into a set - */ -export function insert_(E: Equivalence.Equivalence): (set: Set, a: A) => Set { - const elemE = elem_(E) - return (set, a) => { - if (!elemE(set, a)) { - const r = new Set(set) - r.add(a) - return r - } else { - return set - } - } -} - -/** - * Delete a value from a set - */ -export function remove(E: Equivalence.Equivalence): (a: A) => (set: Set) => Set { - const rem = remove_(E) - return (a) => (set) => rem(set, a) -} - -/** - * Delete a value from a set - */ -export function remove_(E: Equivalence.Equivalence): (set: Set, a: A) => Set { - return (set, a) => filter((ax: A) => !E(a, ax))(set) -} - -/** - * If element is present remove it, if not add it - */ -export function toggle(E: Equivalence.Equivalence): (a: A) => (set: Set) => Set { - const t = toggle_(E) - return (a) => (set) => t(set, a) -} - -/** - * If element is present remove it, if not add it - */ -export function toggle_(E: Equivalence.Equivalence): (set: Set, a: A) => Set { - const elemE = elem_(E) - const removeE = remove(E) - const insertE = insert(E) - return (set, a) => (elemE(set, a) ? removeE : insertE)(a)(set) -} - -/** - * Create a set from an array - */ -export function fromArray(E: Equivalence.Equivalence): (as: ReadonlyArray) => Set { - return (as) => { - const len = as.length - const r = new Set() - const has = elem_(E) - for (let i = 0; i < len; i++) { - const a = as[i]! - if (!has(r, a)) { - r.add(a) - } - } - return r - } -} - -/** - * Set compaction, remove none - */ -export function compact(E: Equivalence.Equivalence): (fa: Set>) => Set { - return filterMap(E)(identity) -} - -/** - * Separate elements - */ -export function separate( - EE: Equivalence.Equivalence, - EA: Equivalence.Equivalence -): (fa: Set>) => readonly [Set, Set] { - return (fa) => { - const elemEE = elem_(EE) - const elemEA = elem_(EA) - const left: MutableSet = new Set() - const right: MutableSet = new Set() - fa.forEach((e) => { - switch (e._tag) { - case "Failure": - if (!elemEE(left, e.failure)) { - left.add(e.failure) - } - break - case "Success": - if (!elemEA(right, e.success)) { - right.add(e.success) - } - break - } - }) - return tuple(left, right) - } -} - -/** - * Filter + Map - */ -export function filterMap( - E: Equivalence.Equivalence -): (f: (a: A) => Option.Option) => (fa: Set) => Set { - const fm = filterMap_(E) - return (f) => (fa) => fm(fa, f) -} - -/** - * Filter + Map - */ -export function filterMap_( - E: Equivalence.Equivalence -): (fa: Set, f: (a: A) => Option.Option) => Set { - const elemE = elem_(E) - return (fa, f) => { - const r: MutableSet = new Set() - fa.forEach((a) => { - const ob = f(a) - if (ob._tag === "Some" && !elemE(r, ob.value)) { - r.add(ob.value) - } - }) - return r - } -} - -/** - * Form the union of two sets - */ -export function union_(E: Equivalence.Equivalence): (set: Set, y: Set) => Set { - const elemE = elem_(E) - return (x, y) => { - if (x === empty) { - return y - } - if (y === empty) { - return x - } - const r = new Set(x) - y.forEach((e) => { - if (!elemE(r, e)) { - r.add(e) - } - }) - return r - } -} - -/** - * Form the union of two sets - */ -export function union(E: Equivalence.Equivalence): (set: Set, y: Set) => Set { - const u = union_(E) - return (x, y) => u(x, y) -} - -function make_(ord: Order.Order, eq_?: Equivalence.Equivalence) { - const eq = eq_ ?? ((x, y) => ord(x, y) === 0) - - const fromArray_ = fromArray(eq) - const concat_ = (set: Set, it: Iterable) => fromArray_([...set, ...it]) - const insert__ = insert(eq) - - function replace_(set: Set, a: A) { - return pipe(filter_(set, (x) => !eq(x, a)), insert__(a)) - } - - return { - insert: insert__, - insert_: insert_(eq), - remove: remove(eq), - remove_: remove_(eq), - reduce: reduce(ord), - reduce_: reduce_(ord), - replace: (a: A) => (set: Set) => replace_(set, a), - replace_, - toArray: toArray(ord), - fromArray, - from: (it: Iterable) => fromArray_([...it]), - empty: () => new Set(), - concat_, - concat: (it: Iterable) => (set: Set) => concat_(set, it), - - // A and B the same, useful when editing elements. - map: map(eq), - map_: map_(eq), - filterMap: filterMap(eq), - filterMap_: filterMap_(eq) - } - // TODO: extend -} - -class Wrapper { - wrapped(ord: Order.Order, eq: Equivalence.Equivalence) { - return make_(ord, eq) - } -} - -export interface SetSchemaExtensions extends ReturnType["wrapped"]> {} - -export const make: ( - ord: Order.Order, - eq?: Equivalence.Equivalence -) => SetSchemaExtensions = make_ diff --git a/packages/effect-app/src/Store.ts b/packages/effect-app/src/Store.ts deleted file mode 100644 index 3bf25fba9..000000000 --- a/packages/effect-app/src/Store.ts +++ /dev/null @@ -1,280 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import type * as Redacted from "effect/Redacted" -import * as Semaphore from "effect/Semaphore" -import type { NonEmptyReadonlyArray } from "./Array.ts" -import type { DatabaseError, OptimisticConcurrencyException } from "./client/errors.ts" -import * as Context from "./Context.ts" -import * as Effect from "./Effect.ts" -import type { FilterResult } from "./Model/filter/filterApi.ts" -import type { FieldValues } from "./Model/filter/types.ts" -import type { FieldPath } from "./Model/filter/types/path/index.ts" -import type { AggregateIrExpression, ComputedProjectionIrExpression, RawQuery } from "./Model/query.ts" -import type * as Option from "./Option.ts" -import * as RequestScopedDependencies from "./RequestScopedDependencies.ts" -import { NonEmptyString255, type Top as SchemaTop } from "./Schema.ts" - -/** - * Adapter-neutral unique-key definition for stores that support unique indexes, - * such as the Cosmos adapter. This shape is intentionally kept structurally - * compatible with adapter-specific `UniqueKey` types. Each path identifies a - * field participating in the unique key, and adapters forward these paths - * directly to the underlying storage engine. - */ -export interface UniqueKey { - readonly paths: string[] -} - -export interface StoreConfig { - partitionValue: (e?: E) => string - /** - * Primarily used for testing, creating namespaces in the database to separate data e.g to run multiple tests in isolation within the same database. - * Memory/Disk use separate store instances per namespace. CosmosDB uses namespace-prefixed partition keys. SQL uses a `_namespace` column. - */ - allowNamespace?: (namespace: string) => boolean - /** - * just in time migrations, supported by the database driver, supporting queries, for simple default values - */ - defaultValues?: Partial - - /** - * How many items can be processed in one batch at a time. - * Defaults to 100 for CosmosDB. - */ - maxBulkSize?: number - - /** - * Unique indexes, mainly for CosmosDB - */ - uniqueKeys?: UniqueKey[] - /** - * Domain schema whose Encoded shape is stored. JSON adapters use - * `Schema.toCodecJson(Schema.toEncoded(schema))` for documents, query - * values, and defaults. Date/Map/Set (and app types such as DateOnly) - * stay native on Encoded and lower only on this JSON boundary. - */ - schema?: SchemaTop -} - -export type SupportedValues = string | boolean | number | null -export type SupportedValues2 = string | boolean | number - -// default is eq -export type Where = - | { key: string; t?: "eq" | "not-eq"; value: SupportedValues } - | { key: string; t: "gt" | "lt" | "gte" | "lte"; value: SupportedValues2 } - | { - key: string - t: "contains" | "starts-with" | "ends-with" | "not-contains" | "not-starts-with" | "not-ends-with" - value: string - } - | { key: string; t: "includes" | "not-includes"; value: string } - | { - key: string - t: "in" | "not-in" - value: readonly (SupportedValues)[] - } - -export type Filter = readonly FilterResult[] - -export interface O { - key: FieldPath - direction: "ASC" | "DESC" -} - -export interface FilterArgs { - t: Encoded - filter?: Filter | undefined - select?: - | NonEmptyReadonlyArray< - U | { key: string; subKeys: readonly string[] } | { - key: string - computed: ComputedProjectionIrExpression - } | { - key: string - path: string - } | { - key: string - aggregate: AggregateIrExpression - } - > - | undefined - order?: NonEmptyReadonlyArray>> - limit?: number | undefined - skip?: number | undefined -} - -export type FilterFunc = ( - args: FilterArgs -) => Effect.Effect<(U extends undefined ? Encoded : Pick)[], DatabaseError> - -export interface Store< - IdKey extends keyof Encoded, - Encoded extends FieldValues, - PM extends PersistenceModelType = PersistenceModelType -> { - all: Effect.Effect - filter: FilterFunc - find: (id: Encoded[IdKey]) => Effect.Effect, DatabaseError> - set: (e: PM) => Effect.Effect - batchSet: ( - items: NonEmptyReadonlyArray - ) => Effect.Effect, OptimisticConcurrencyException | DatabaseError> - bulkSet: ( - items: NonEmptyReadonlyArray - ) => Effect.Effect, OptimisticConcurrencyException | DatabaseError> - batchRemove: (ids: NonEmptyReadonlyArray, partitionKey?: string) => Effect.Effect - queryRaw: (query: RawQuery) => Effect.Effect - /** - * Explicitly seed a namespace. Primary is seeded eagerly on initialization. - * Non-primary namespaces must be seeded explicitly before use. - */ - seedNamespace: (namespace: string) => Effect.Effect -} - -export class StoreMaker extends Context.Opaque( - name: string, - idKey: IdKey, - seed?: Effect.Effect, E, R>, - config?: StoreConfig - ) => Effect.Effect, E, R> -}>()("effect-app/StoreMaker") { -} - -export const makeContextMap = () => { - const etags = new Map() - const getEtag = (id: string) => etags.get(id) - const setEtag = (id: string, eTag: string | undefined) => { - if (eTag === undefined) { - etags.delete(id) - } else { - etags.set(id, eTag) - } - } - - // const parsedCache = new Map< - // Parser, - // Map> - // >() - - // const parserCache = new Map< - // Parser, - // (i: any) => These.These - // >() - - // const setAndReturn = ( - // p: Parser, - // np: (i: I) => These.These - // ) => { - // parserCache.set(p, np) - // return np - // } - - // const parserEnv: ParserEnv = { - // // TODO: lax: true would turn off refinement checks, may help on large payloads - // // but of course removes confirming of validation rules (which may be okay for a database owned by the app, as we write safely) - // lax: false, - // cache: { - // getOrSetParser: (p) => parserCache.get(p) ?? setAndReturn(p, (i) => parserEnv.cache!.getOrSet(i, p)), - // getOrSetParsers: (parsers) => { - // return Object.entries(parsers).reduce((prev, [k, v]) => { - // prev[k] = parserEnv.cache!.getOrSetParser(v) - // return prev - // }, {} as any) - // }, - // getOrSet: (i, parse): any => { - // const c = parsedCache.get(parse) - // if (c) { - // const f = c.get(i) - // if (f) { - // // console.log("$$$ cache hit", i) - // return f - // } else { - // const nf = parse(i, parserEnv) - // c.set(i, nf) - // return nf - // } - // } else { - // const nf = parse(i, parserEnv) - // parsedCache.set(parse, new Map([[i, nf]])) - // return nf - // } - // } - // } - // } - - const store = new Map() - const sem = Semaphore.makeUnsafe(1) - - return { - createdAt: new Date(), - get: getEtag, - set: setEtag, - getOrCreateStore: (key: symbol, make: () => T): T => { - let value = store.get(key) as T | undefined - if (value === undefined) { - value = make() - store.set(key, value) - } - return value - }, - getOrCreateStoreEffect: (key: symbol, make: Effect.Effect): Effect.Effect => - sem.withPermits(1)(Effect.uninterruptible(Effect.gen(function*() { - const value = store.get(key) as T | undefined - if (value !== undefined) return value - const v = yield* make - store.set(key, v) - return v - }))), - clear: () => { - etags.clear() - store.clear() - } - } -} - -const makeMap = Effect.acquireRelease( - Effect.sync(() => makeContextMap()), - (m) => Effect.sync(() => m.clear()) -) - -export class ContextMap extends Context.Opaque()("effect-app/ContextMap", { make: makeMap }) { -} - -export const ContextMapContainer = RequestScopedDependencies.make( - "ContextMapContainer", - ContextMap.make.pipe(Effect.map(ContextMap.of)) -) - -export type ContextMapNotStartedError = RequestScopedDependencies.RequestScopedDependencyNotStartedError - -export const getContextMap = ContextMapContainer.current - -/** - * Runs `make` at most once per ContextMap (i.e. per request) and caches the - * resulting value in the ContextMap under a fresh symbol. Subsequent calls of - * the returned Effect within the same ContextMap return the cached value. - * - * Uses the ContextMap's shared semaphore for safe single initialization. - */ -export const cachedPerRequest = ( - make: Effect.Effect -): Effect.Effect => { - const cacheKey = Symbol() - return getContextMap.pipe( - Effect.flatMap((ctxMap) => ctxMap.getOrCreateStoreEffect(cacheKey, make)) - ) -} - -const defaultNs: NonEmptyString255 = NonEmptyString255("primary") -export class storeId extends Context.Reference("StoreId", { defaultValue: (): NonEmptyString255 => defaultNs }) {} - -export type PersistenceModelType = Encoded & { - _etag?: string | undefined -} - -export interface StorageConfig { - url: Redacted.Redacted - prefix: string - dbName: string -} diff --git a/packages/effect-app/src/TypeTest.ts b/packages/effect-app/src/TypeTest.ts deleted file mode 100644 index d7b7018db..000000000 --- a/packages/effect-app/src/TypeTest.ts +++ /dev/null @@ -1,7 +0,0 @@ -// Nice way to underline types that are only there for type testing, not for production use -// sadly with unique symbols we get weird issues in app projects. -// api/src/X/PackList.Controllers.ts:21:1 - error TS4082: Default export of the module has or is using private name 'TypeTestId' -// export const TypeTestId: unique symbol = Symbol.for("@effect/infra/type-test") -// export type TypeTestId = typeof TypeTestId -export const TypeTestId = "effect-app/type-test" as const -export type TypeTestId = typeof TypeTestId diff --git a/packages/effect-app/src/Types.ts b/packages/effect-app/src/Types.ts deleted file mode 100644 index 99bc8370d..000000000 --- a/packages/effect-app/src/Types.ts +++ /dev/null @@ -1,16 +0,0 @@ -export * from "effect/Types" - -export type DeepMutable = T extends ReadonlyMap ? Map, DeepMutable> - : T extends ReadonlySet ? Set> - : [keyof T] extends [never] ? T - // keep brands alive - : T extends string ? T - : T extends number ? T - : { -readonly [K in keyof T]: DeepMutable } - -export type Mutable = { - -readonly [P in keyof T]: T[P] -} - -export type DistributiveOmit = T extends any ? Omit - : never diff --git a/packages/effect-app/src/Widen.type.ts b/packages/effect-app/src/Widen.type.ts deleted file mode 100644 index 6ad23d875..000000000 --- a/packages/effect-app/src/Widen.type.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import type { BuiltInObject } from "effect-app/utils" - -type AllKeys = T extends any ? keyof T : never - -type OptionalKeys = T extends any ? { [K in keyof T]-?: {} extends Pick ? K : never }[keyof T] - : never - -type Idx = T extends any ? K extends keyof T ? T[K] - : D - : never - -type PartialKeys = - & Omit - & Partial> extends infer O ? { [P in keyof O]: O[P] } - : never - -export type Primitive = boolean | string | number | bigint | symbol | undefined | null -export type Widen = [T] extends [BuiltInObject] | [Primitive] ? T - : [T] extends [Array] ? { [K in keyof T]: Widen } - : [T] extends [ReadonlyArray] ? { [K in keyof T]: Widen } - : [T] extends [object] ? PartialKeys< - { [K in AllKeys]: Widen> }, - Exclude, keyof T> | OptionalKeys - > - : T diff --git a/packages/effect-app/src/_ext/Array.ts b/packages/effect-app/src/_ext/Array.ts deleted file mode 100644 index 27f2ad0fa..000000000 --- a/packages/effect-app/src/_ext/Array.ts +++ /dev/null @@ -1,36 +0,0 @@ -import * as Chunk from "effect-app/Chunk" -import * as Effect from "effect-app/Effect" -import * as Equal from "effect/Equal" -import { NotFoundError } from "../client/errors.ts" - -function getFirstBy( - a: Iterable, - idKey: keyof A, - id: A[typeof idKey], - type: Type -) { - return Effect - .fromOption( - Chunk.fromIterable(a).pipe(Chunk.findFirst((_) => Equal.equals(_[idKey], id))) - ) - .pipe(Effect.mapError(() => new NotFoundError({ type, id }))) -} - -export function makeGetFirstBy() { - return (idKey: Id, type: Type) => - ( - a: Iterable, - id: A[Id] - ) => getFirstBy(a, idKey, id, type) -} - -export const makeGetFirstById = () => (type: Type) => - makeGetFirstBy()("id", type) - -export function getFirstById( - a: Iterable, - id: A["id"], - type: Type -) { - return getFirstBy(a, "id", id, type) -} diff --git a/packages/effect-app/src/_ext/date.ts b/packages/effect-app/src/_ext/date.ts deleted file mode 100644 index 60169bea5..000000000 --- a/packages/effect-app/src/_ext/date.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { addDays, addHours, addMinutes, addMonths, addSeconds, addWeeks, addYears, subDays, subHours, subMinutes, subMonths, subSeconds, subWeeks, subYears } from "date-fns" - -export const DateAddDays: (date: Date, amount: number) => Date = addDays -export const DateSubDays: (date: Date, amount: number) => Date = subDays - -export const DateAddHours: (date: Date, amount: number) => Date = addHours -export const DateSubHours: (date: Date, amount: number) => Date = subHours - -export const DateAddMinutes: (date: Date, amount: number) => Date = addMinutes - -export const DateSubMinutes: (date: Date, amount: number) => Date = subMinutes - -export const DateAddSeconds: (date: Date, amount: number) => Date = addSeconds - -export const DateSubSeconds: (date: Date, amount: number) => Date = subSeconds - -export const DateAddYears: (date: Date, amount: number) => Date = addYears - -export const DateSubYears: (date: Date, amount: number) => Date = subYears - -export const DateAddMonths: (date: Date, amount: number) => Date = addMonths - -export const DateSubMonths: (date: Date, amount: number) => Date = subMonths - -export const DateAddWeeks: (date: Date, amount: number) => Date = addWeeks - -export const DateSubWeeks: (date: Date, amount: number) => Date = subWeeks diff --git a/packages/effect-app/src/_ext/misc.ts b/packages/effect-app/src/_ext/misc.ts deleted file mode 100644 index 0d4c2a736..000000000 --- a/packages/effect-app/src/_ext/misc.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { LazyArg } from "effect-app/Function" -import * as Effect from "effect/Effect" -import * as Option from "effect/Option" -import * as Result from "effect/Result" -import type * as Scope from "effect/Scope" - -export type _R> = [T] extends [ - Effect.Effect -] ? R - : never - -export type _E> = [T] extends [ - Effect.Effect -] ? E - : never - -export function encaseMaybeInEffect_( - o: Option.Option, - onError: LazyArg -): Effect.Effect { - return Option.match(o, { onNone: () => Effect.fail(onError()), onSome: Effect.succeed }) -} - -export function encaseMaybeEither_( - o: Option.Option, - onError: LazyArg -): Result.Result { - return Option.match(o, { onNone: () => Result.fail(onError()), onSome: Result.succeed }) -} - -export function toNullable( - self: Effect.Effect, E, R> -) { - return Effect.map(self, (_) => Option.getOrNull(_)) -} - -export function scope( - scopedEffect: Effect.Effect, - effect: Effect.Effect -): Effect.Effect> { - return Effect.andThen(scopedEffect, effect).pipe(Effect.scoped) -} - -export function flatMapScoped( - scopedEffect: Effect.Effect, - effect: (a: A) => Effect.Effect -): Effect.Effect> { - return scopedEffect.pipe(Effect.flatMap(effect), Effect.scoped) -} diff --git a/packages/effect-app/src/_ext/ord.ext.ts b/packages/effect-app/src/_ext/ord.ext.ts deleted file mode 100644 index b89c2c949..000000000 --- a/packages/effect-app/src/_ext/ord.ext.ts +++ /dev/null @@ -1,40 +0,0 @@ -import * as Chunk from "effect/Chunk" -import type * as Equivalence from "effect/Equivalence" - -export function toArray( - gen: Generator -) { - return Array.from(gen) -} - -/** - * Remove duplicates from an array, keeping the first occurrence of an element. - */ -export function uniq(E: Equivalence.Equivalence) { - return (self: Chunk.Chunk): Chunk.Chunk => { - let out = Chunk.fromIterable([]) - for (let i = 0; i < self.length; i++) { - const a = Chunk.getUnsafe(self, i) - if (!elem(E, a)(out)) { - out = Chunk.append(out, a) - } - } - return self.length === out.length ? self : out - } -} - -/** - * Test if a value is a member of an array. Takes a `Equivalence.Equivalence` as a single - * argument which returns the function to use to search for a value of type `A` - * in an array of type `Chunk.Chunk`. - */ -export function elem(E: Equivalence.Equivalence, value: A) { - return (self: Chunk.Chunk): boolean => { - for (let i = 0; i < self.length; i++) { - if (E(Chunk.getUnsafe(self, i), value)) { - return true - } - } - return false - } -} diff --git a/packages/effect-app/src/builtin-json.d.ts b/packages/effect-app/src/builtin-json.d.ts deleted file mode 100644 index 1e643f362..000000000 --- a/packages/effect-app/src/builtin-json.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -// JSON / Body return-type overrides (`any` -> `unknown`), isolated from -// `builtin.ts` so consumers that source-link this package (e.g. an embedded -// Effect-source setup) can toggle them off. As a `declare global`, the override -// is program-wide: in linked mode it leaks into source-linked Effect and breaks -// Effect's own `JSON.parse(...)` / `response.json()` call sites (TS2322 -// `unknown` vs `Json`). `builtin.ts` triple-slash-references this file, so -// normal builds keep the override. -declare global { - interface JSON { - /** - * Converts a JavaScript Object Notation (JSON) string into an object. - * @param text A valid JSON string. - * @param reviver A function that transforms the results. This function is called for each member of the object. - * If a member contains nested objects, the nested objects are transformed before the parent object is. - */ - parse(text: string, reviver?: (this: any, key: string, value: any) => any): unknown - } - - interface Body { - json(): Promise - } -} - -export {} diff --git a/packages/effect-app/src/builtin.ts b/packages/effect-app/src/builtin.ts deleted file mode 100644 index 084a6ce79..000000000 --- a/packages/effect-app/src/builtin.ts +++ /dev/null @@ -1,53 +0,0 @@ -// oxlint-disable-next-line typescript/triple-slash-reference -/// -import type { NonEmptyArray, NonEmptyReadonlyArray } from "effect/Array" - -declare global { - interface String { - /** - * Split a string into substrings using the specified separator and return them as an array. - * @param splitter An object that can split a string. - * @param limit A value used to limit the number of elements returned in the array. - */ - split(splitter: { [Symbol.split](string: string, limit?: number): string[] }, limit?: number): [string, ...string[]] - - /** - * Split a string into substrings using the specified separator and return them as an array. - * @param separator A string that identifies character or characters to use in separating the string. If omitted, a single-element array containing the entire string is returned. - * @param limit A value used to limit the number of elements returned in the array. - */ - split(separator: string | RegExp, limit?: number): [string, ...string[]] - } - - // JSON.parse / Body.json overrides live in ./builtin-json.d.ts (referenced - // above) so a source-linked consumer can disable them in linked mode. - - interface Array { - // Conditional return instead of a `this`-typed overload: a `this` overload - // is selected-then-rejected on union-of-array receivers (TS2684), poisoning - // foreign code like `(readonly A[] | readonly B[]).map(...)`. A single - // conditional-return signature refines NonEmpty without a `this` param. - map( - callbackfn: (value: T, index: number, array: T[]) => U, - thisArg?: any - ): this extends NonEmptyArray ? NonEmptyArray : U[] - } - interface ReadonlyArray { - // Subsequent property declarations must have the same type. Property 'length' must be of type 'number', but here has type 'NonNegativeInt'. - // readonly length: NonNegativeInt - - map( - callbackfn: (value: T, index: number, array: readonly T[]) => U, - thisArg?: any - ): this extends NonEmptyReadonlyArray ? NonEmptyReadonlyArray : U[] - } -} - -declare module "effect/Option" { - export interface None { - get value(): A | undefined - } -} - -// TODO: v4 migration — Either module augmentation removed (Either → Result) -// Previously added .right to Left and .left to Right for convenience access diff --git a/packages/effect-app/src/client.ts b/packages/effect-app/src/client.ts deleted file mode 100644 index 578b82dd7..000000000 --- a/packages/effect-app/src/client.ts +++ /dev/null @@ -1,8 +0,0 @@ -// codegen:start {preset: barrel, include: ./client/*.ts} -export * from "./client/apiClientFactory.ts" -export * from "./client/clientFor.ts" -export * from "./client/errors.ts" -export * from "./client/InvalidationKeys.ts" -export * from "./client/makeClient.ts" -// codegen:end -export * as DataDependencies from "./DataDependencies.ts" diff --git a/packages/effect-app/src/client/InvalidationKeys.ts b/packages/effect-app/src/client/InvalidationKeys.ts deleted file mode 100644 index 6e0086335..000000000 --- a/packages/effect-app/src/client/InvalidationKeys.ts +++ /dev/null @@ -1,55 +0,0 @@ -import * as Equal from "effect/Equal" -import * as Ref from "effect/Ref" -import * as Context from "../Context.ts" -import * as Effect from "../Effect.ts" -import type { InvalidationKey } from "../rpc/Invalidation.ts" - -export type { InvalidationKey } -/** Shape of the per-mutation service that accumulates server-provided invalidation keys. */ -export interface InvalidationKeysService { - readonly add: (key: InvalidationKey) => Effect.Effect - readonly get: Effect.Effect> -} - -/** - * Context.Reference that accumulates invalidation keys received from the server via the - * `x-invalidate` HTTP response header. - * - * The default is a no-op: when not explicitly provided (e.g. outside a mutation wrapper) - * all calls are ignored. The mutation wrapper in `@effect-app/vue` provides a real - * implementation backed by a `Ref`. - */ -export const InvalidationKeysFromServer = Context.Reference( - "effect-app/client/InvalidationKeysFromServer", - { - defaultValue: () => ({ - add: (_key: InvalidationKey) => Effect.void, - get: Effect.succeed([] as ReadonlyArray) - }) - } -) -export type InvalidationKeysFromServer = typeof InvalidationKeysFromServer - -/** - * Creates a fresh `InvalidationKeysService` implementation backed by a `Ref`. - * - * @param ref - The `Ref` that stores the accumulated keys. - * @param onAdded - V3: Optional Effect run after a distinct key is added. Use to trigger - * mid-stream query invalidation without waiting for the stream to complete. Repeated keys - * stay accumulated for the final refresh but do not retrigger the callback. - */ -export const makeInvalidationKeysService = ( - ref: Ref.Ref>, - onAdded?: (key: InvalidationKey) => Effect.Effect -): InvalidationKeysService => ({ - add: (key) => - Ref - .modify(ref, (keys) => { - if (keys.some((existing) => Equal.equals(existing, key))) return [false, keys] - return [true, [...keys, key]] - }) - .pipe( - Effect.flatMap((added) => added && onAdded ? onAdded(key) : Effect.void) - ), - get: Ref.get(ref) -}) diff --git a/packages/effect-app/src/client/apiClientFactory.ts b/packages/effect-app/src/client/apiClientFactory.ts deleted file mode 100644 index b13436285..000000000 --- a/packages/effect-app/src/client/apiClientFactory.ts +++ /dev/null @@ -1,464 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { constant, flow } from "effect/Function" -import * as Layer from "effect/Layer" -import * as ManagedRuntime from "effect/ManagedRuntime" -import * as Option from "effect/Option" -import * as Predicate from "effect/Predicate" -import * as Schema from "effect/Schema" -import * as Stream from "effect/Stream" -import * as Struct from "effect/Struct" -import { Rpc, RpcClient, RpcGroup, RpcSerialization } from "effect/unstable/rpc" -import * as Config from "../Config.ts" -import * as Context from "../Context.ts" -import * as DataDependencies from "../DataDependencies.ts" -import * as Effect from "../Effect.ts" -import { HttpClient, HttpClientRequest } from "../http.ts" -import { Invalidation } from "../rpc.ts" -import type * as S from "../Schema.ts" -import { typedKeysOf, typedValuesOf } from "../utils.ts" -import type { Client, ClientForOptions, ExtractModuleName, RequestsAny } from "./clientFor.ts" -import { InvalidationKeysFromServer } from "./InvalidationKeys.ts" - -export interface ApiConfig { - url: string - headers: Option.Option> -} - -export const DefaultApiConfig = Config.all({ - url: Config.String("apiUrl").pipe(Config.withDefault("/api")), - headers: Config.Record(Schema.String, Schema.String, "headers").pipe(Config.option) -}) - -export type Req = S.Top & { - readonly make: (...args: any[]) => any - _tag: string - fields: S.Struct.Fields - success: S.Top - error: S.Top - /** Optional final-value schema for stream requests. When set, the execute effect resolves with the last stream value decoded to this type. */ - final?: S.Top - config?: Record - readonly id: string - readonly moduleName: string - readonly type: "command" | "query" - readonly stream: boolean - readonly middleware?: unknown -} - -class RequestName extends Context.Reference("RequestName", { - defaultValue: () => ({ requestName: "Unspecified", moduleName: "Error" }) -}) {} - -export const HttpClientLayer = (config: ApiConfig) => - Layer.effect( - HttpClient.HttpClient, - Effect - .gen(function*() { - const baseClient = yield* HttpClient.HttpClient - const client = baseClient.pipe( - HttpClient.mapRequest(HttpClientRequest.prependUrl(config.url + "/rpc")), - HttpClient.mapRequest( - HttpClientRequest.setHeaders(config.headers.pipe(Option.getOrElse(() => ({})))) - ), - HttpClient.mapRequestEffect((req) => - Effect.map(RequestName, (ctx) => - flow( - HttpClientRequest.appendUrlParam("action", ctx.requestName), - HttpClientRequest.appendUrl("/" + ctx.moduleName) - )(req)) - ) - ) - return client - }) - ) - -export const HttpClientFromConfigLayer = Layer.unwrap( - Effect.gen(function*() { - const config = yield* DefaultApiConfig - return HttpClientLayer(config) - }) -) - -export const RpcSerializationLayer = (config: ApiConfig) => - Layer.mergeAll( - RpcSerialization.layerNdjson, - HttpClientLayer(config) - ) - -type RpcHandlers = { - [K in keyof M]: Rpc.Rpc -} - -const getFiltered = (resource: M) => { - type Filtered = { - [K in keyof M as M[K] extends Req ? K : never]: M[K] extends Req ? M[K] : never - } - // TODO: Record.filter - const filtered = typedKeysOf(resource).reduce((acc, cur) => { - if ( - Predicate.isObjectKeyword(resource[cur]) - && (resource[cur].success) - ) { - acc[cur as keyof Filtered] = resource[cur] as any - } - return acc - }, {} as Record) - - return filtered as unknown as Filtered -} - -export const getMeta = ( - resource: M -): { moduleName: ExtractModuleName; middleware?: unknown } => { - const first = typedValuesOf(getFiltered(resource))[0] - if (first && "moduleName" in first) return { moduleName: first.moduleName, middleware: (first as any).middleware } - throw new Error("No moduleName on requests!") -} - -export const makeRpcGroupFromRequestsAndModuleName = ( - resource: M, - moduleName: ModuleName, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - middleware?: any -) => { - const filtered = getFiltered(resource) - type newM = typeof filtered - const baseRpcs = RpcGroup - .make( - ...typedValuesOf(filtered).map((_) => { - const r = _ as any - const isStream = r.stream - const isCommand = r.type === "command" - return (isCommand - ? isStream - ? Invalidation.makeStreamRpc(r._tag, { - payload: r, - success: r.success, - error: r.error, - stream: true as const - }) - : Invalidation.makeCommandRpc(r._tag, { payload: r, success: r.success, error: r.error }) - : Rpc.make(r._tag, { - payload: r, - success: isStream ? r.success : Invalidation.QueryResponseWithMetaData(r.success), - error: r.error, - stream: isStream - })) as any - }) - ) - .prefix(`${moduleName}.`) - // Attach the middleware tag (schema-only on the client — no Live invoked) - // so its declared `error` joins the rpc failure union via - // `Rpc.exitSchema`'s `rpc.middlewares[*].error` walk. Required for stream - // rpcs whose top-level `errorSchema` is forced to `Never` by effect-rpc; - // without it, middleware-thrown errors fail client decode. - const rpcs = (middleware ? baseRpcs.middleware(middleware) : baseRpcs) as unknown as RpcGroup.RpcGroup< - Rpc.Prefixed[keyof newM], `${ModuleName}.`> - > - return rpcs -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const makeRpcTag = (resource: M, middleware?: any) => { - const meta = getMeta(resource) - const rpcs = makeRpcGroupFromRequestsAndModuleName(resource, meta.moduleName, middleware) - - // Use Object.assign instead of class extension to avoid TS2509 with complex generic return types. - // The first type arg is `any` because this is a dynamically created tag — its identity is the string key. - const TheClient = Context.Opaque< - any, - RpcClient.RpcClient> - >()(`RpcClient.${meta.moduleName}`) - // Use Layer.effect directly (not TheClient.toLayer) so TypeScript properly excludes Scope - const layer = Layer.effect( - TheClient, - RpcClient.make(rpcs) - ) - return Object.assign(TheClient, { layer }) -} - -const makeApiClientFactory = Effect - .gen(function*() { - const ctx = yield* Effect.context() - const makeClientFor = Effect.fnUntraced(function*( - resource: M, - requestLevelLayers = Layer.empty, - options?: ClientForOptions - ) { - const meta = getMeta(resource) - - const TheClient = makeRpcTag(resource, meta.middleware) - - // TODO: somehow we need a protocol per REQUEST kind of it seems ... - // otherwise it locks up on the client, navigation remains empty... - const clientLayer = TheClient.layer.pipe( - // add ApiClientFactory for nested schemas - // eslint-disable-next-line @typescript-eslint/no-use-before-define - Layer.provide(Layer.succeed(ApiClientFactory, makeClientForCached as any)), - Layer.provide( - RpcClient - .layerProtocolHttp({ url: "" }) // why not here set meta.moduleName as root? - .pipe( - Layer.provideMerge(Layer.succeedContext(ctx)) - ) - ) - ) - const mr = ManagedRuntime.make(clientLayer) - - const filtered = getFiltered(resource) - - // Unwrap `CommandResponseWithMetaData` (success) and `CommandFailureWithMetaData` - // (handler-thrown failure): forward accumulated invalidation keys to - // `InvalidationKeysFromServer` and yield the raw payload / re-fail with the raw - // error. Middleware-thrown failures arrive raw on the Cause already (no wrap to - // strip) — the `else` branch passes them through. - const forwardDependencies = ( - dependencies: DataDependencies.DataDependencySet | undefined, - options?: { readonly reads?: boolean } - ) => - dependencies === undefined - ? Effect.void - : Effect.gen(function*() { - const dependencyRecorder = yield* DataDependencies.getDataDependencyRecorder - if (options?.reads) { - yield* Effect.forEach(dependencies.reads, dependencyRecorder.read, { discard: true }) - } - yield* Effect.forEach(dependencies.writes, dependencyRecorder.write, { discard: true }) - }) - - const unwrapCommand = (eff: Effect.Effect): Effect.Effect => - eff.pipe( - Effect.flatMap((result: any) => - Effect.gen(function*() { - const keys: ReadonlyArray = result?.metadata?.invalidateQueries ?? [] - const invalidationKeys = yield* InvalidationKeysFromServer - yield* Effect.forEach(keys, (key) => invalidationKeys.add(key), { discard: true }) - yield* forwardDependencies(result?.metadata?.dataDependencies) - return result.payload - }) - ), - Effect.catch((result: any) => - result?._tag === "CommandFailureWithMetaData" - ? Effect.gen(function*() { - const keys: ReadonlyArray = result.metadata?.invalidateQueries ?? [] - const invalidationKeys = yield* InvalidationKeysFromServer - yield* Effect.forEach(keys, (key) => invalidationKeys.add(key), { discard: true }) - yield* forwardDependencies(result.metadata?.dataDependencies) - return yield* Effect.fail(result.error) - }) - : Effect.fail(result) - ) - ) - - const unwrapQuery = (eff: Effect.Effect): Effect.Effect => - eff.pipe( - Effect.flatMap((result: any) => - Effect.gen(function*() { - yield* forwardDependencies(result?.metadata?.dataDependencies, { reads: true }) - return result.payload - }) - ) - ) - - return { - mr, - client: typedKeysOf(filtered) - .reduce((prev, cur) => { - const h = filtered[cur]! - - const Request = h - - const id = `${meta.moduleName}.${cur as string}` - .replaceAll(".js", "") - - const requestMeta = { - Request, - id, - options, - disableQueryInvalidation: (h as { config?: { disableQueryInvalidation?: boolean } }) - .config - ?.disableQueryInvalidation === true - } - - const requestNameLayer = Layer.succeed(RequestName, { - requestName: cur as string, - moduleName: meta.moduleName - }) - - const layers = requestLevelLayers.pipe(Layer.provideMerge(requestNameLayer)) - - const fields = Struct.omit(Request.fields, ["_tag"] as const) - const requestAttr = `${meta.moduleName}.${h._tag}` - const isCommand = h.type === "command" - const isStream = h.stream - - const buildEffect = (input: any) => - mr.contextEffect.pipe( - Effect.flatMap((svcs) => { - const rpcEffect = TheClient - .use((client) => (client as any)[requestAttr]!(Request.make(input)) as Effect.Effect) - .pipe( - // local: true → isolate to this RPC call. `layers` is pure today - // (RequestName + caller-supplied requestLevelLayers), but the - // flag prevents a stateful caller-supplied layer from leaking - // across RPC calls via the ambient fiber MemoMap. - Effect.provide(layers, { local: true }), - Effect.provide(svcs) - ) - return isCommand ? unwrapCommand(rpcEffect) : isStream ? rpcEffect : unwrapQuery(rpcEffect) - }), - // Forwarding the server's dependency metadata needs a recorder in scope. A parent - // query/command (vue) provides one; a top-level call gets a fresh per-request one. - DataDependencies.ensureDataDependencyRecorder - ) - - const buildStream = (input: any) => { - const stream = Stream.unwrap( - mr.contextEffect.pipe( - Effect.flatMap((svcs) => - TheClient - .useSync((client) => { - const rpcStream = (client as any)[requestAttr]!( - Request.make(input) - ) as Stream.Stream - return rpcStream.pipe( - // Collect server invalidation keys from the "done" chunk, then discard it. - Stream.tap((item: any) => - item._tag === "done" || item._tag === "metadata" - ? Effect.gen(function*() { - const metadata = item.metadata as Invalidation.CommandMetaData - const invalidationKeys = yield* InvalidationKeysFromServer - yield* Effect.forEach(metadata.invalidateQueries, invalidationKeys.add, { - discard: true - }) - const dependencyRecorder = yield* DataDependencies.getDataDependencyRecorder - yield* Effect.forEach( - metadata.dataDependencies.reads, - dependencyRecorder.read, - { discard: true } - ) - yield* Effect.forEach( - metadata.dataDependencies.writes, - dependencyRecorder.write, - { discard: true } - ) - }) - : Effect.void - ), - Stream.filter((item: any) => item._tag === "value"), - Stream.map((item: any) => item.value), - // V2: unwrap StreamFailureChunk — forward keys from failures too, - // then re-fail with the original error so callers see the unmodified - // error type. - Stream.catch((err: any) => - err?._tag === "error" && err?.metadata - ? Stream.fromEffect( - Effect.gen(function*() { - const metadata = err.metadata as Invalidation.CommandMetaData - const invalidationKeys = yield* InvalidationKeysFromServer - yield* Effect.forEach(metadata.invalidateQueries, invalidationKeys.add, { - discard: true - }) - const dependencyRecorder = yield* DataDependencies.getDataDependencyRecorder - yield* Effect.forEach( - metadata.dataDependencies.writes, - dependencyRecorder.write, - { discard: true } - ) - return yield* Effect.fail(err.error) - }) - ) - : Stream.fail(err) - ), - // local: true — see buildEffect above. - Stream.provide(layers, { local: true }), - Stream.provide(svcs) - ) - }) - .pipe(Effect.provide(svcs)) - ) - ) - ) - // Forwarding the server's dependency metadata needs a recorder in scope. A parent - // query/command (vue) provides one; a top-level stream call gets a fresh per-request one. - return Stream.unwrap( - Effect.map( - DataDependencies.DataDependencyRecorder, - (current) => - current === "root" - ? Stream.provide(stream, DataDependencies.DataDependencyRecorder.layer) - : stream - ) - ) - } - - // @ts-expect-error doc - prev[cur] = Object.keys(fields).length === 0 - ? { - handler: isStream ? constant(buildStream({})) : constant(buildEffect({})), - ...requestMeta - } - : { - handler: isStream - ? (req: any) => buildStream(req) - : (req: any) => buildEffect(req), - ...requestMeta - } - - return prev - }, {} as Client>) - } - }) - - const register: ManagedRuntime.ManagedRuntime[] = [] - yield* Effect.addFinalizer(() => Effect.forEach(register, (mr) => mr.disposeEffect)) - - const cacheL = new Map>>() - - function makeClientForCached(requestLevelLayers: Layer.Layer, options?: ClientForOptions) { - let cache = cacheL.get(requestLevelLayers) - if (!cache) { - cache = new Map>() - cacheL.set(requestLevelLayers, cache) - } - - return Effect.fnUntraced(function*(models: M) { - const found = cache.get(models) as Client> | undefined - if (found) { - return found - } - const m = yield* makeClientFor(models, requestLevelLayers, options) - cache.set(models, m.client) - register.push(m.mr) - return m.client - }) - } - - return makeClientForCached - }) - -/** - * Used to create clients for resource modules. - */ -export class ApiClientFactory - extends Context.Opaque>()("ApiClientFactory") -{ - static readonly layer = (config: ApiConfig) => - ApiClientFactory.toLayer(makeApiClientFactory).pipe(Layer.provide(RpcSerializationLayer(config))) - static readonly layerFromConfig = Layer.unwrap( - Effect.gen(function*() { - const config = yield* DefaultApiConfig - return ApiClientFactory.layer(config) - }) - ) - - static readonly makeFor = - (requestLevelLayers: Layer.Layer, options?: ClientForOptions) => - ( - resource: M - ) => - ApiClientFactory.use((apiClientFactory) => { - const f = apiClientFactory(requestLevelLayers, options) - return f(resource) - }) -} diff --git a/packages/effect-app/src/client/clientFor.ts b/packages/effect-app/src/client/clientFor.ts deleted file mode 100644 index bb4da478e..000000000 --- a/packages/effect-app/src/client/clientFor.ts +++ /dev/null @@ -1,186 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -import * as Record from "effect/Record" -import type * as Stream from "effect/Stream" -import type { Path } from "path-parser" -import qs from "query-string" -import type * as Effect from "../Effect.ts" -import type * as S from "../Schema.ts" -import { type Req } from "./apiClientFactory.ts" - -export function makePathWithQuery( - path: Path, - pars: Record< - string, - | string - | number - | boolean - | readonly string[] - | readonly number[] - | readonly boolean[] - | null - > -) { - const forQs = Record.filter(pars, (_, k) => !path.params.includes(k)) - const q = forQs // { ...forQs, _: JSON.stringify(forQs) } // TODO: drop completely individual keys from query?, sticking to json only - return ( - path.build(pars, { ignoreSearch: true, ignoreConstraints: true }) - + (Object.keys(q).length - ? "?" + qs.stringify(q) - : "") - ) -} - -export function makePathWithBody( - path: Path, - pars: Record< - string, - | string - | number - | boolean - | readonly string[] - | readonly number[] - | readonly boolean[] - | null - > -) { - return path.build(pars, { ignoreSearch: true, ignoreConstraints: true }) -} - -export type Requests = RequestsAny -export type RequestsAny = Record - -export type ExtractModuleName = - { [K in keyof M]: M[K] extends { moduleName: infer N extends string } ? N : never }[keyof M] extends - infer R extends string ? R - : string - -export type Client = RequestHandlers< - never, - never, - M, - ModuleName -> - -export type ExtractResponse = T extends S.Codec ? T["Type"] - : T extends unknown ? void - : never - -export type ExtractEResponse = T extends S.Codec ? T["Encoded"] - : T extends unknown ? void - : never - -export interface ClientForOptions { - readonly skipQueryKey?: readonly string[] - /** - * Middleware tag to attach to every rpc on the client. Schema-only — the - * client never invokes the middleware (no Live impl required), but its - * declared `error` schema joins the rpc failure union via - * `Rpc.exitSchema`'s `rpc.middlewares[*].error` walk. Required when - * middleware can throw errors that aren't part of the resource's declared - * error union (e.g. auth middleware throwing `NotLoggedInError`); without - * it the client decode would fail with a `SchemaError` for stream rpcs. - */ -} - -// $Project/$Configuration.Index -// -> "$Project", "$Configuration", "Index" -export const makeQueryKey = ({ id, options }: { id: string; options?: ClientForOptions }) => - id - .split("/") - .filter((segment: string) => !options || !options.skipQueryKey?.includes(segment)) - .map((segment: string) => "$" + segment) - .join(".") - .split(".") - -export interface RequestHandlerWithInput { - handler: (i: I) => Effect.Effect - id: Id - options?: ClientForOptions - Request: Request - queryKeyProjectionHash?: string - disableQueryInvalidation?: boolean -} - -/** Type alias: a no-input handler is simply `RequestHandlerWithInput`. */ -export type RequestHandler = RequestHandlerWithInput< - void, - A, - E, - R, - Request, - Id -> - -export interface RequestStreamHandlerWithInput { - handler: (i: I) => Stream.Stream - id: Id - options?: ClientForOptions - Request: Request - /** - * Phantom type property (never set at runtime) that carries the `Final` type to - * `StreamMutationWithExtensions`. The tilde prefix follows the Effect convention for - * phantom/virtual properties and prevents accidental runtime access. - * Stream failures bubble through the execute effect's typed error channel `E`; - * the reactive `AsyncResult` ref also mirrors the failure for live progress UI. - */ - readonly "~final"?: Final -} - -/** Type alias: a no-input stream handler is simply `RequestStreamHandlerWithInput`. */ -export type RequestStreamHandler = - RequestStreamHandlerWithInput - -// make sure this is exported or d.ts of apiClientFactory breaks?! -export type RequestInputFromMake any }> = Parameters extends - [] ? void : Parameters[0] - -// Has no input only when the request schema declares no payload fields (the auto-added -// `_tag` field is ignored). Any payload fields (even all-optional) produce a function handler. -type HasNoFields = I extends { readonly fields: infer F extends S.Struct.Fields } - ? [Exclude] extends [never] ? true : false - : false - -type RequestInput any }> = Parameters[0] - -/** - * Caller-facing input type for a request. `void` when the request schema has no fields; - * otherwise `make`'s first param type. - */ -export type HandlerInput any }> = HasNoFields extends true ? void - : RequestInput - -/** Extracts the final-value type from a stream request. Defaults to the success type when no `final` schema is set. */ -type FinalTypeOf = T extends { readonly final: infer F extends S.Top } ? F["Type"] - : T["success"]["Type"] - -// `T["success"]` / `T["error"]` are constrained to `S.Top` via `Req`, so we -// can read `["DecodingServices"]` directly. Avoids the conditional in -// `S.Codec.DecodingServices = X extends Top ? X["DecodingServices"] : never`, -// which tsgo (native) fails to reduce in this generic position and leaves as -// `unknown`, polluting the `R` channel of every client handler. -type RequestHandlerFor = T["stream"] extends true - ? RequestStreamHandlerWithInput< - HandlerInput, - T["success"]["Type"], - T["error"]["Type"] | E, - R | T["success"]["DecodingServices"] | T["error"]["DecodingServices"], - T, - Id, - FinalTypeOf - > - : RequestHandlerWithInput< - HandlerInput, - T["success"]["Type"], - T["error"]["Type"] | E, - R | T["success"]["DecodingServices"] | T["error"]["DecodingServices"], - T, - Id - > - -export type RequestHandlers = { - [K in keyof M as M[K] extends Req ? K : never]: Extract extends infer T extends Req - ? RequestHandlerFor - : never -} diff --git a/packages/effect-app/src/client/errors.ts b/packages/effect-app/src/client/errors.ts deleted file mode 100644 index 988b45f4d..000000000 --- a/packages/effect-app/src/client/errors.ts +++ /dev/null @@ -1,310 +0,0 @@ -/** @effect-diagnostics overriddenSchemaConstructor:skip-file */ -import { TaggedErrorClass } from "effect-app/Schema" -import * as Cause from "effect/Cause" -import * as S from "../Schema.ts" - -export const tryToJson = (error: unknown) => { - try { - const errorJson = (error as any).toJSON() - return errorJson && typeof errorJson === "object" ? errorJson as Record : { error } - } catch { - try { - return { error: (error as any).toString() } - } catch (err) { - try { - return { error: `Failed to convert error: ${err}` } - } catch { - return { error: `Failed to convert error: unknown failure` } - } - } - } -} - -// eslint-disable-next-line unused-imports/no-unused-vars -// @ts-expect-error type not used -export class NotFoundError extends TaggedErrorClass>()("NotFoundError", { - type: S.String, - id: S.Unknown -}) { - constructor( - props: { type: string; id: unknown; cause?: unknown }, - disableValidation?: boolean - ) { - super(props, disableValidation as any) - } - override get message() { - return `Didn't find ${(this as any).type}#${JSON.stringify((this as any).id)}` - } - override toString() { - return `NotFoundError: ${this.message}` - } -} - -const messageFallback = (messageOrObject?: string | { message: string }) => - typeof messageOrObject === "object" ? messageOrObject : { message: messageOrObject ?? "" } - -export class InvalidStateError extends TaggedErrorClass()("InvalidStateError", { - message: S.String -}) { - constructor(messageOrObject: string | { message: string; cause?: unknown }, disableValidation?: boolean) { - super( - typeof messageOrObject === "object" ? messageOrObject : { message: messageOrObject }, - disableValidation as any - ) - } - override toString() { - return `InvalidStateError: ${this.message}` - } -} - -export class ServiceUnavailableError extends TaggedErrorClass()("ServiceUnavailableError", { - message: S.String -}) { - constructor(messageOrObject: string | { message: string; cause?: unknown }, disableValidation?: boolean) { - super( - typeof messageOrObject === "object" ? messageOrObject : { message: messageOrObject }, - disableValidation as any - ) - } - override toString() { - return `ServiceUnavailableError: ${this.message}` - } -} - -export class ValidationError extends TaggedErrorClass()("ValidationError", { - errors: S.Array(S.Unknown) -}) { - constructor( - props: { errors: ReadonlyArray; cause?: unknown }, - disableValidation?: boolean - ) { - super(props, disableValidation as any) - } - override get message() { - return `Validation failed: ${(this as any).errors.map((e: any) => JSON.stringify(e, undefined, 2)).join(",\n")}` - } - override toString() { - return `ValidationError: ${this.message}` - } -} - -export class NotLoggedInError extends TaggedErrorClass()("NotLoggedInError", { - message: S.String -}) { - constructor(messageOrObject?: string | { message: string; cause?: unknown }, disableValidation?: boolean) { - super(messageFallback(messageOrObject), disableValidation as any) - } - override toString() { - return `NotLoggedInError: ${this.message}` - } -} - -/** - * The user carries a valid Userprofile, but there is a problem with the login none the less. - */ -export class LoginError extends TaggedErrorClass()("NotLoggedInError", { - message: S.String -}) { - constructor(messageOrObject?: string | { message: string; cause?: unknown }, disableValidation?: boolean) { - super(messageFallback(messageOrObject), disableValidation as any) - } - override toString() { - return `LoginError: ${this.message}` - } -} - -export class UnauthorizedError extends TaggedErrorClass()("UnauthorizedError", { - message: S.String -}) { - constructor(messageOrObject?: string | { message: string; cause?: unknown }, disableValidation?: boolean) { - super(messageFallback(messageOrObject), disableValidation as any) - } - override toString() { - return `UnauthorizedError: ${this.message}` - } -} - -type OptimisticConcurrencyDetails = { - readonly type: string - readonly id: string - readonly code: number - readonly current?: string | undefined - readonly found?: string | undefined -} - -export class OptimisticConcurrencyException extends TaggedErrorClass()( - "OptimisticConcurrencyException", - { message: S.String } -) { - readonly details?: OptimisticConcurrencyDetails - readonly raw?: unknown - constructor( - args: - | OptimisticConcurrencyDetails - | ({ message: string; cause?: unknown; raw?: unknown }), - disableValidation?: boolean - ) { - super( - "message" in args ? args : { message: `Existing ${args.type} ${args.id} record changed` }, - disableValidation as any - ) - if (!("message" in args)) { - this.details = args - } - } - override toString() { - return `OptimisticConcurrencyException: ${this.message}` - } -} - -/** - * Raised by a store adapter when a database operation fails for an - * infrastructure reason (request timeout, throttle, 5xx, dropped socket, or any - * non-conflict error). Distinct from `OptimisticConcurrencyException`, which is - * an expected etag conflict. - * - * `transient` is set by the adapter for failures worth retrying (timeout / - * throttle / 5xx / network). `cause` is the underlying adapter error, carried - * through a `Defect` schema so it serializes (an `Error` encodes to - * `{ name, message, cause }`) instead of breaking JSON encoding of the channel. - * - * Treated by the api/client/FE machinery like an unexpected (500-class) error. - */ -export class DatabaseError extends TaggedErrorClass()( - "DatabaseError", - { - message: S.String, - transient: S.Boolean, - cause: S.optional(S.Defect()) - } -) { - constructor( - args: { message?: string; transient?: boolean; cause?: unknown }, - disableValidation?: boolean - ) { - super( - { - message: args.message ?? "Database operation failed", - transient: args.transient ?? false, - cause: args.cause - }, - disableValidation as any - ) - } - override toString() { - return `DatabaseError: ${this.message}` - } -} - -const MutationOnlyErrors = [ - InvalidStateError, - OptimisticConcurrencyException -] as const - -const GeneralErrors = [ - NotFoundError, - NotLoggedInError, - LoginError, - UnauthorizedError, - ValidationError, - ServiceUnavailableError, - DatabaseError -] as const - -export const SupportedErrors = S.Union([ - ...MutationOnlyErrors, - ...GeneralErrors -]) -// .pipe(named("SupportedErrors")) -// .pipe(withDefaultMake) -export type SupportedErrors = S.Schema.Type - -// ideal? -// export const QueryErrors = union({ ...GeneralErrors }) -// .pipe(named("QueryErrors")) -// .pipe(withDefaultMake) -// export type QueryErrors = Schema.Type -// export const MutationErrors = union({ ...GeneralErrors, ...GeneralErrors }) -// .pipe(named("MutationErrors")) -// .pipe(withDefaultMake) - -// export type MutationErrors = Schema.Type - -export const MutationErrors = SupportedErrors -export const QueryErrors = SupportedErrors -export type MutationErrors = S.Schema.Type -export type QueryErrors = S.Schema.Type - -export const ErrorSilenced = Symbol.for("effect-app/error-silenced") -export const isErrorSilenced = (e: unknown): boolean => - typeof e === "object" && e !== null && ErrorSilenced in e ? !!e[ErrorSilenced] : false -export const silenceError = (e: Record) => { - e[ErrorSilenced] = true -} - -export class CauseException extends Error { - readonly originalCause: Cause.Cause - readonly _tag: string - - constructor(originalCause: Cause.Cause, _tag: string) { - const limit = Error.stackTraceLimit - Error.stackTraceLimit = 0 - super() - Error.stackTraceLimit = limit - this.originalCause = originalCause - this._tag = _tag - this.cause = Cause.squash(originalCause) - // v4: makeFiberFailure removed — use Cause.prettyErrors instead - const errors = Cause.prettyErrors(originalCause) - const first = errors[0] - if (first) { - this.name = first.name - this.message = first.message - if (first.stack) { - this.stack = first.stack - } - } else { - this.name = "CauseException" - this.message = Cause.pretty(originalCause) - } - } - toReport() { - return { - _tag: this._tag, - name: this.name, - message: this.message - } - } - - toJSON() { - return { - _tag: this._tag, - name: this.name, - message: this.message, - originalCause: this.originalCause - } - } - - [Symbol.for("nodejs.util.inspect.custom")]() { - return this.toJSON() - } - override toString() { - return `[${this._tag}] ` + Cause.pretty(this.originalCause) - } -} - -export const tryToReport = (error: { toReport(): Record; toString(): string }) => { - try { - return error.toReport() - } catch { - try { - return { error: error.toString() } - } catch (err) { - try { - return { error: `Failed to convert error: ${err}` } - } catch { - return { error: `Failed to convert error: unknown failure` } - } - } - } -} diff --git a/packages/effect-app/src/client/makeClient.ts b/packages/effect-app/src/client/makeClient.ts deleted file mode 100644 index c1785f084..000000000 --- a/packages/effect-app/src/client/makeClient.ts +++ /dev/null @@ -1,629 +0,0 @@ -import type * as Exit from "effect/Exit" -import { type GetContextConfig, type RpcContextMap } from "../rpc/RpcContextMap.ts" -import * as S from "../Schema.ts" -import { AST } from "../Schema.ts" -import type { ClientForOptions } from "./clientFor.ts" - -/** - * Minimal structural shape for an rpc-client middleware tag. - * Captures only what `makeRpcClient` and routing/client factory consume from it - * (no `Default` layer required — that is provided to `makeRouter`). - */ -export interface ClientMiddleware> { - readonly requestContextMap: RequestContextMap - readonly requestContext: unknown - readonly provides?: unknown - readonly requires?: unknown -} - -const merge = (a: any, b: Array) => - a !== undefined && b.length ? S.Union([a, ...b]) : a !== undefined ? a : b.length ? S.Union(b) : S.Never - -type SchemaOrFields = T extends S.Top ? T : T extends S.Struct.Fields ? S.Struct : S.Void - -type TaggedRequestSchema = S.Struct< - { readonly _tag: S.tag } & Payload -> - -type QueryOnlyRequests = { - [K in keyof Resource as Resource[K] extends { readonly type: "query" } ? K : never]: Resource[K] -} - -type QueryOnlyResources = { - [K in keyof Resources]: QueryOnlyRequests -} - -type InputFromPayload = keyof Payload extends never ? void - : S.Struct["Type"] - -type OutputFromSuccess = Success extends typeof S.Void ? void : Success["Type"] - -type InvalidationResources = Record> - -/** - * An invalidation instruction returned from `invalidatesQueries`. One of: - * - a raw query key (`ReadonlyArray`) - * - an RPC handler object (`{ id, options? }`) — query key derived from `id` - * - a compatibility `{ filters: { queryKey }, options? }` shape - * - * Predicate filters are intentionally not represented: atom invalidation is keyed by - * concrete query keys. - */ -export type InvalidateQueryInstruction< - Filters = { readonly queryKey: ReadonlyArray }, - Options = Record -> = - | ReadonlyArray - | { - readonly id: string - readonly options?: ClientForOptions - } - | { - readonly filters: Filters - readonly options?: Options - } - -export type InvalidationCallback = ( - queryKey: readonly string[], - resources: QueryOnlyResources, - ...args: [Input] extends [void] ? [exit: Exit.Exit] - : [input: Input, exit: Exit.Exit] -) => ReadonlyArray - -export type InvalidationConfig = { - readonly invalidatesQueries: InvalidationCallback - readonly invalidationResources?: Resources - readonly disableQueryInvalidation?: boolean -} - -type InvalidationConfigForCommand< - Resources, - Payload extends S.Struct.Fields, - Success extends S.Top, - Error extends S.Top -> = InvalidationConfig< - Resources, - InputFromPayload, - OutputFromSuccess, - Error["Type"] -> - -export const configureInvalidation = () => -( - invalidatesQueries: InvalidationCallback, NoInfer, NoInfer> -): InvalidationConfig => ({ invalidatesQueries }) - -export const configureInvalidationCallback = () => -( - invalidatesQueries: InvalidationCallback, NoInfer, NoInfer> -): InvalidationCallback => invalidatesQueries - -export const configureInvalidationResources = () => - ({}) as Pick, "invalidationResources"> - -type TaggedRequestForResult< - Self, - Tag extends string, - Payload extends S.Struct.Fields, - Success extends S.Top, - Error extends S.Top, - Config, - ModuleName extends string, - Type extends "command" | "query", - Stream extends boolean, - Resources = never, - Final extends S.Top = never, - Middleware = unknown -> = - & S.Opaque, {}> - & { - readonly fields: TaggedRequestSchema["fields"] - readonly _tag: Tag - readonly success: Success - readonly error: Error - readonly config: Config - readonly id: `${ModuleName}.${Tag}` - readonly moduleName: ModuleName - readonly type: Type - readonly stream: Stream - readonly middleware?: Middleware - readonly "~invalidationResources"?: Resources - } - & ([Final] extends [never] ? {} : { readonly final: Final }) - -export const makeRpcClient = < - Middleware extends ClientMiddleware>, - GeneralErrors extends S.Top = never ->(middleware: Middleware, generalErrors?: GeneralErrors) => { - // Long way around Context/C extends etc to support actual jsdoc from passed in RequestConfig etc... (??) - type ServiceMap = { - success: S.Top | S.Struct.Fields // SchemaOrFields will make a Schema type out of Struct.Fields - error: S.Top | S.Struct.Fields // SchemaOrFields will make a Schema type out of Struct.Fields - final?: S.Top | S.Struct.Fields // optional final-value schema for stream requests - stream?: boolean // request metadata — stripped from stored config - } - - type RequestConfig = GetContextConfig - - // Errors raised by RPC middleware (e.g. `NotLoggedInError` from auth) used to - // be merged into `resource.error` here so they would surface in the wire - // failure schema. That merging is gone — the canonical source for middleware - // errors is now the middleware tag attached to the rpc on both server and - // client (see `ApiClientFactory.makeFor({ middleware })`). `Rpc.exitSchema` - // unions in `rpc.middlewares[*].error` automatically. - type MergeError = [GeneralErrors] extends [never] ? SchemaOrFields : S.Union<[SchemaOrFields, GeneralErrors]> - type ErrorResult = C extends { error: infer E } ? MergeError - : [GeneralErrors] extends [never] ? typeof S.Never - : GeneralErrors - - function makeRequestClass>( - tag: Tag, - fields: Fields, - config?: C - ) { - const failureSchema = merge( - config?.error ? S.isSchema(config.error) ? config.error : S.Struct(config.error) : undefined, - [generalErrors].filter(Boolean) - ) - const successSchema = config?.success - ? S.isSchema(config.success) - ? AST.isVoid(config.success.ast) ? S.Void : config.success - : S.Struct(config.success) - : S.Void - - const finalConfig = (config as any)?.final - const finalSchema = finalConfig && S.isSchema(finalConfig) ? finalConfig : undefined - - // Strip stream from the stored config — it's request metadata, not handler config - const { stream: _stream, ...restConfig } = config ?? ({} as C) - - const RequestClass = S.Opaque()(S.TaggedStruct(tag, fields)) - Object.assign(RequestClass, { - _tag: tag, - success: successSchema, - error: failureSchema, - ...(finalSchema !== undefined ? { final: finalSchema } : {}), - config: restConfig - }) - - return RequestClass - } - - function makeTaggedRequestWithMeta< - ModuleName extends string, - Type extends "command" | "query" - >( - moduleName: ModuleName, - type: Type - ) { - function TaggedRequestWithMeta(): { - // ─── stream: true overloads (must come before non-stream so TypeScript picks them) ─────────── - < - Tag extends string, - Payload extends S.Struct.Fields, - Success extends S.Top | S.Struct.Fields, - Error extends S.Top | S.Struct.Fields, - Final extends S.Top | S.Struct.Fields = never, - C extends RequestConfig & Record = RequestConfig & Record - >( - tag: Tag, - fields: Payload, - config: - & Omit - & { stream: true; success: Success; error: Error; final?: Final }, - invalidatesQueries?: InvalidationCallback< - Resources, - InputFromPayload, - OutputFromSuccess>, - ErrorResult["Type"] - > - ): TaggedRequestForResult< - Self, - Tag, - Payload, - SchemaOrFields, - ErrorResult, - Omit< - & Omit - & { - success: Success - error: Error - } - & Partial< - InvalidationConfigForCommand< - Resources, - Payload, - SchemaOrFields, - ErrorResult - > - >, - "success" | "error" | "stream" - >, - ModuleName, - Type, - true, - Resources, - [Final] extends [never] ? never : SchemaOrFields, - Middleware - > - < - Tag extends string, - Payload extends S.Struct.Fields, - Success extends S.Top | S.Struct.Fields, - Final extends S.Top | S.Struct.Fields = never, - C extends RequestConfig & Record & { error?: never } = - & RequestConfig - & Record - & { error?: never } - >( - tag: Tag, - fields: Payload, - config: - & Omit - & { stream: true; success: Success; final?: Final }, - invalidatesQueries?: InvalidationCallback< - Resources, - InputFromPayload, - OutputFromSuccess>, - ErrorResult["Type"] - > - ): TaggedRequestForResult< - Self, - Tag, - Payload, - SchemaOrFields, - ErrorResult, - Omit< - & Omit - & { success: Success } - & Partial< - InvalidationConfigForCommand< - Resources, - Payload, - SchemaOrFields, - ErrorResult - > - >, - "success" | "error" | "stream" - >, - ModuleName, - Type, - true, - Resources, - [Final] extends [never] ? never : SchemaOrFields, - Middleware - > - // ─── stream: true without `success` overloads ──────────────────────────────────────────────── - < - Tag extends string, - Payload extends S.Struct.Fields, - Error extends S.Top | S.Struct.Fields, - C extends RequestConfig & Record & { success?: never } = - & RequestConfig - & Record - & { success?: never } - >( - tag: Tag, - fields: Payload, - config: - & Omit - & { stream: true; error: Error }, - invalidatesQueries?: InvalidationCallback< - Resources, - InputFromPayload, - void, - ErrorResult["Type"] - > - ): TaggedRequestForResult< - Self, - Tag, - Payload, - typeof S.Void, - ErrorResult, - Omit< - & Omit - & { error: Error } - & Partial< - InvalidationConfigForCommand< - Resources, - Payload, - typeof S.Void, - ErrorResult - > - >, - "success" | "error" | "stream" - >, - ModuleName, - Type, - true, - Resources, - never, - Middleware - > - < - Tag extends string, - Payload extends S.Struct.Fields, - C extends RequestConfig & Record & { success?: never; error?: never } = - & RequestConfig - & Record - & { success?: never; error?: never } - >( - tag: Tag, - fields: Payload, - config: - & Omit - & { stream: true }, - invalidatesQueries?: InvalidationCallback< - Resources, - InputFromPayload, - void, - ErrorResult["Type"] - > - ): TaggedRequestForResult< - Self, - Tag, - Payload, - typeof S.Void, - ErrorResult, - Omit< - & Omit - & Partial>>, - "success" | "error" | "stream" - >, - ModuleName, - Type, - true, - Resources, - never, - Middleware - > - // ─── non-stream overloads ──────────────────────────────────────────────────────────────────── - < - Tag extends string, - Payload extends S.Struct.Fields, - Success extends S.Top | S.Struct.Fields, - Error extends S.Top | S.Struct.Fields, - Final extends S.Top | S.Struct.Fields = never, - C extends RequestConfig & Record = RequestConfig & Record - >( - tag: Tag, - fields: Payload, - config: - & Omit - & { success: Success; error: Error; final?: Final }, - invalidatesQueries?: InvalidationCallback< - Resources, - InputFromPayload, - OutputFromSuccess>, - ErrorResult["Type"] - > - ): TaggedRequestForResult< - Self, - Tag, - Payload, - SchemaOrFields, - ErrorResult, - Omit< - & Omit - & { - success: Success - error: Error - } - & Partial< - InvalidationConfigForCommand< - Resources, - Payload, - SchemaOrFields, - ErrorResult - > - >, - "success" | "error" | "stream" - >, - ModuleName, - Type, - false, - Resources, - [Final] extends [never] ? never : SchemaOrFields, - Middleware - > - < - Tag extends string, - Payload extends S.Struct.Fields, - Success extends S.Top | S.Struct.Fields, - Final extends S.Top | S.Struct.Fields = never, - C extends RequestConfig & Record & { error?: never } = - & RequestConfig - & Record - & { - error?: never - } - >( - tag: Tag, - fields: Payload, - config: - & Omit - & { success: Success; final?: Final }, - invalidatesQueries?: InvalidationCallback< - Resources, - InputFromPayload, - OutputFromSuccess>, - ErrorResult["Type"] - > - ): TaggedRequestForResult< - Self, - Tag, - Payload, - SchemaOrFields, - ErrorResult, - Omit< - & Omit - & { - success: Success - } - & Partial< - InvalidationConfigForCommand< - Resources, - Payload, - SchemaOrFields, - ErrorResult - > - >, - "success" | "error" | "stream" - >, - ModuleName, - Type, - false, - Resources, - [Final] extends [never] ? never : SchemaOrFields, - Middleware - > - < - Tag extends string, - Payload extends S.Struct.Fields, - Error extends S.Top | S.Struct.Fields, - C extends RequestConfig & Record & { success?: never } - >( - tag: Tag, - fields: Payload, - config: - & Omit - & { error: Error }, - invalidatesQueries?: InvalidationCallback< - Resources, - InputFromPayload, - void, - ErrorResult["Type"] - > - ): TaggedRequestForResult< - Self, - Tag, - Payload, - typeof S.Void, - ErrorResult, - Omit< - & Omit - & { - error: Error - } - & Partial< - InvalidationConfigForCommand< - Resources, - Payload, - typeof S.Void, - ErrorResult - > - >, - "success" | "error" | "stream" - >, - ModuleName, - Type, - false, - Resources, - never, - Middleware - > - < - Tag extends string, - Payload extends S.Struct.Fields, - C extends RequestConfig & Record & { success?: never; error?: never } - >( - tag: Tag, - fields: Payload, - config: Omit, - invalidatesQueries?: InvalidationCallback< - Resources, - InputFromPayload, - void, - ErrorResult["Type"] - > - ): TaggedRequestForResult< - Self, - Tag, - Payload, - typeof S.Void, - ErrorResult, - Omit< - & Omit - & Partial>>, - "success" | "error" | "stream" - >, - ModuleName, - Type, - false, - Resources, - never, - Middleware - > - ( - tag: Tag, - fields: Payload - ): TaggedRequestForResult< - Self, - Tag, - Payload, - typeof S.Void, - ErrorResult<{}>, - // Empty config, NOT `Record`: the config type flows into - // `GetEffectContext`/`GetEffectError` as `T`, and `keyof Record` - // is `string` — so an inverted key like `allowAnonymous` would satisfy - // `key extends keyof T`, then `T[key]` (`never`) `extends true` (true, since - // `never` is assignable to everything) and the middleware wrongly takes the - // "allowAnonymous: true" (anonymous) branch, dropping `UserProfile`. `{}` has - // `keyof {} = never`, so no config key is treated as set and the defaults - // (auth required, `UserProfile` provided) apply — same as passing `{}` explicitly. - {}, - ModuleName, - Type, - false, - never, - never, - Middleware - > - } { - return (( - tag: Tag, - fields: Fields, - config?: C, - invalidatesQueries?: InvalidationCallback - ) => { - const isStream = (config as any)?.stream === true - const requestConfig = invalidatesQueries === undefined ? config : { ...config, invalidatesQueries } - const cls = makeRequestClass(tag, fields, requestConfig) - Object.assign(cls, { - id: `${moduleName}.${tag}`, - moduleName, - type, - stream: isStream, - middleware - }) - return cls - }) as any - } - return Object.assign(TaggedRequestWithMeta, { moduleName, type } as const) - } - - function TaggedRequestFor(moduleName: ModuleName) { - const Query = makeTaggedRequestWithMeta(moduleName, "query") - const Command = makeTaggedRequestWithMeta(moduleName, "command") - - return { - moduleName, - /** - * Create query request classes for this module. - * Queries read state and should not mutate server state. - * Pass `stream: true` in the config to produce a Stream of `success` values (QueryStream behaviour). - */ - Query, - /** - * Create command request classes for this module. - * Commands mutate state and should avoid returning complex read models. - * Pass `stream: true` in the config to produce a Stream of `success` values (CommandStream behaviour). - */ - Command - } as const - } - - return { - TaggedRequestFor - } -} diff --git a/packages/effect-app/src/faker.ts b/packages/effect-app/src/faker.ts deleted file mode 100644 index 601683305..000000000 --- a/packages/effect-app/src/faker.ts +++ /dev/null @@ -1,32 +0,0 @@ -// FILE HAS SIDE EFFECTS! -import type { Faker } from "@faker-js/faker" -import * as FC from "fast-check" - -// TODO: inject faker differently, so we dont care about multiple instances of library. - -// eslint-disable-next-line prefer-const -// eslint-disable-next-line @typescript-eslint/no-explicit-any -let faker: Faker = undefined as any as Faker -export function setFaker(f: Faker) { - faker = f -} - -export function getFaker() { - if (!faker) throw new Error("You forgot to load faker library") - return faker -} - -export const fakerToArb = (fakerGen: () => T) => (fc: typeof FC) => { - return FC.noBias(FC.noShrink( - fc - .integer() - .map((seed) => { - faker.seed(seed) // seed the generator - return fakerGen() // call it - }) - )) -} - -export const fakerArb = ( - gen: (fake: Faker) => () => T -): (a: any) => FC.Arbitrary => fakerToArb(() => gen(getFaker())()) diff --git a/packages/effect-app/src/http.ts b/packages/effect-app/src/http.ts deleted file mode 100644 index 51bad709f..000000000 --- a/packages/effect-app/src/http.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./http/internal/lib.ts" diff --git a/packages/effect-app/src/http/Request.ts b/packages/effect-app/src/http/Request.ts deleted file mode 100644 index d25b381dc..000000000 --- a/packages/effect-app/src/http/Request.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as Option from "effect/Option" -import type { HttpClientResponse } from "effect/unstable/http/HttpClientResponse" -import * as Effect from "../Effect.ts" -import { HttpClient, HttpClientError, HttpClientRequest, HttpHeaders } from "./internal/lib.ts" - -export interface ResponseWithBody extends Pick { - readonly body: A -} - -// TODO: consider rebuilding the text/json helpers to use a cached effect -// https://discord.com/channels/795981131316985866/1098177242598756412/1168565257569046712 - -export const responseWithJsonBody = ( - response: HttpClientResponse -) => - Effect.map(response.json, (body): ResponseWithBody => ({ - body, - headers: response.headers, - status: response.status, - remoteAddress: response.remoteAddress - })) - -export const demandJson = (client: HttpClient.HttpClient) => - HttpClient - .mapRequest(client, (_) => HttpClientRequest.acceptJson(_)) - .pipe(HttpClient.transform((r, request) => - Effect.tap(r, (response) => - Option - .exists( - HttpHeaders.get(response.headers, "Content-Type"), - (_) => _.startsWith("application/json") - ) - ? Effect.void - : Effect.fail( - new HttpClientError.DecodeError({ - request, - response, - description: "not json response: " - + Option.getOrElse(HttpHeaders.get(response.headers, "Content-Type"), () => "") - }) - )) - )) diff --git a/packages/effect-app/src/http/internal/lib.ts b/packages/effect-app/src/http/internal/lib.ts deleted file mode 100644 index 738870b9f..000000000 --- a/packages/effect-app/src/http/internal/lib.ts +++ /dev/null @@ -1,13 +0,0 @@ -export * as HttpHeaders from "effect/unstable/http/Headers" -export * as HttpBody from "effect/unstable/http/HttpBody" -export * as HttpClient from "effect/unstable/http/HttpClient" -export * as HttpClientError from "effect/unstable/http/HttpClientError" -export * as HttpClientRequest from "effect/unstable/http/HttpClientRequest" -export * as HttpClientResponse from "effect/unstable/http/HttpClientResponse" -// HttpLayerRouter removed in v4 — use HttpRouter instead -export * as HttpMiddleware from "effect/unstable/http/HttpMiddleware" -export * as HttpRouter from "effect/unstable/http/HttpRouter" -export * as HttpServer from "effect/unstable/http/HttpServer" -export * as HttpServerError from "effect/unstable/http/HttpServerError" -export * as HttpServerRequest from "effect/unstable/http/HttpServerRequest" -export * as HttpServerResponse from "effect/unstable/http/HttpServerResponse" diff --git a/packages/effect-app/src/ids.ts b/packages/effect-app/src/ids.ts deleted file mode 100644 index c9b910ed4..000000000 --- a/packages/effect-app/src/ids.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { brandedStringId, type Codec, NonEmptyString255, StringId, type StringIdBrand, withDefaultMake } from "effect-app/Schema" -import type { B } from "effect-app/Schema/schema" -import * as Effect from "effect/Effect" -import type { Simplify } from "effect/Types" -import * as S from "./Schema.ts" -import { extendM } from "./utils.ts" - -export interface RequestIdBrand extends StringIdBrand { - readonly RequestId: unique symbol -} - -export type RequestId = NonEmptyString255 -/** - * Schema for a request id. - * - * A request id may be made from a span id, which does not comply with the - * `StringId` schema (hence the looser `NonEmptyString255` base). - * - * `.withConstructorDefault` => fresh `StringId` (construction-only; not - * applied during decode — cannot be used to JIT-migrate database fields). - * See `./Schema/ext.ts` for the full policy note. - */ -export const RequestId = extendM( - Object - .assign(Object.create(NonEmptyString255) as {}, NonEmptyString255 as unknown as Codec), - (s) => { - function make(): NonEmptyString255 - function make(input: string, options?: S.MakeOptions): NonEmptyString255 - function make(input?: string, options?: S.MakeOptions): NonEmptyString255 { - const id = input === undefined ? StringId.make() : StringId.make(input, options) - return id - } - return ({ - make, - /** - * Construction-only default: fresh `StringId`. Applied only when the - * field is omitted from `.make(...)` input. NOT applied during decode — - * cannot be used to JIT-migrate database fields. See `./Schema/ext.ts` - * file-level note. - */ - withConstructorDefault: S.withConstructorDefault(Effect.sync(make))(s as typeof s & S.WithoutConstructorDefault) - }) - } -) - .pipe(withDefaultMake) - -export interface UserProfileIdBrand extends Simplify & StringIdBrand> {} -export type UserProfileId = string & UserProfileIdBrand -/** - * Branded `StringId` for user profiles. - * - * Exposes `.withConstructorDefault` (fresh id) — construction-only; not - * applied during decode. See `./Schema/ext.ts` for the full policy note. - */ -export const UserProfileId = brandedStringId() diff --git a/packages/effect-app/src/index.ts b/packages/effect-app/src/index.ts deleted file mode 100644 index 5f15b05be..000000000 --- a/packages/effect-app/src/index.ts +++ /dev/null @@ -1,27 +0,0 @@ -// eslint-disable-next-line import/no-unassigned-import -import "./builtin.ts" - -export * as Fnc from "./Function.ts" -export * as Utils from "./utils.ts" - -export * as Array from "./Array.ts" -export * as Config from "./Config.ts" -export * as ConfigProvider from "./ConfigProvider.ts" -export * as Context from "./Context.ts" -export * as Effect from "./Effect.ts" -export * as Layer from "./Layer.ts" -export * as Model from "./Model.ts" -export * as NonEmptySet from "./NonEmptySet.ts" -export * as Set from "./Set.ts" -export * as Store from "./Store.ts" - -export { type NonEmptyArray, type NonEmptyReadonlyArray } from "./Array.ts" - -export * from "effect" - -export type * as Types from "./Types.ts" - -export * as SecretURL from "./Config/SecretURL.ts" -export * as RpcX from "./rpc.ts" -export * as S from "./Schema.ts" -export { copy } from "./utils.ts" diff --git a/packages/effect-app/src/logger.ts b/packages/effect-app/src/logger.ts deleted file mode 100644 index 3b1c9822b..000000000 --- a/packages/effect-app/src/logger.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { makeLog } from "effect-app/utils/logger" - -export const PreludeLogger = makeLog("effect-app", "info") diff --git a/packages/effect-app/src/middleware.ts b/packages/effect-app/src/middleware.ts deleted file mode 100644 index 4cb4937af..000000000 --- a/packages/effect-app/src/middleware.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import * as Context from "effect-app/Context" -import { RpcMiddleware } from "./rpc.ts" - -export class DevMode extends Context.Reference("DevMode", { defaultValue: () => false }) {} - -export class RequestCacheMiddleware extends RpcMiddleware.Tag()("RequestCacheMiddleware") {} - -export class ConfigureInterruptibilityMiddleware - extends RpcMiddleware.Tag()("ConfigureInterruptibilityMiddleware") -{} - -export class LoggerMiddleware extends RpcMiddleware.Tag()("LoggerMiddleware") {} - -export class DevModeMiddleware extends RpcMiddleware.Tag()("DevModeMiddleware") {} - -/** - * Generic middlewares attached by `makeRouter` to every request. - * - * Invalidation key wrap/unwrap is handled by the routing layer (server) and the - * api client factory (client) directly — there is no middleware tag for it. - */ -export const DefaultGenericMiddlewares = [ - RequestCacheMiddleware, - ConfigureInterruptibilityMiddleware, - LoggerMiddleware, - DevModeMiddleware -] as const diff --git a/packages/effect-app/src/rpc.ts b/packages/effect-app/src/rpc.ts deleted file mode 100644 index e07797b67..000000000 --- a/packages/effect-app/src/rpc.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * as Invalidation from "./rpc/Invalidation.ts" -export * as MiddlewareMaker from "./rpc/MiddlewareMaker.ts" -export * as RpcContextMap from "./rpc/RpcContextMap.ts" -export * as RpcMiddleware from "./rpc/RpcMiddleware.ts" diff --git a/packages/effect-app/src/rpc/Invalidation.ts b/packages/effect-app/src/rpc/Invalidation.ts deleted file mode 100644 index 3ae402dbb..000000000 --- a/packages/effect-app/src/rpc/Invalidation.ts +++ /dev/null @@ -1,278 +0,0 @@ -import * as Ref from "effect/Ref" -import { Rpc } from "effect/unstable/rpc" -import { type ClientForOptions, makeQueryKey } from "../client/clientFor.ts" -import * as Context from "../Context.ts" -import * as DataDependencies from "../DataDependencies.ts" -import * as Effect from "../Effect.ts" -import * as S from "../Schema.ts" - -/** - * Shorthand for a handler-derived invalidation key. - * Accepts an RPC handler object so `add(GetMe)` is equivalent to - * `add(makeQueryKey(GetMe))`. - */ -export type InvalidationKeyInput = InvalidationKey | { readonly id: string; readonly options?: ClientForOptions } - -const normalizeKey = (input: InvalidationKeyInput): InvalidationKey => { - if (Array.isArray(input)) return input - const handler = input as { id: string; options?: ClientForOptions } - return makeQueryKey(handler.options ? { id: handler.id, options: handler.options } : { id: handler.id }) -} - -// Disambiguates `add` overloads: a `string[]` means a single key; an array -// containing arrays-or-objects means a batch of inputs. -const isBatch = ( - input: InvalidationKeyInput | ReadonlyArray -): input is ReadonlyArray => - Array.isArray(input) && input[0] !== undefined && typeof input[0] !== "string" - -const normalizeInputs = ( - input: InvalidationKeyInput | ReadonlyArray -): ReadonlyArray => isBatch(input) ? input.map(normalizeKey) : [normalizeKey(input)] - -/** - * A single segment within an `InvalidationKey` array. - * Accepts any JSON-compatible value: string, number, boolean, null, - * arrays and objects recursively — matching TanStack Query's `queryKey` element type. - */ -export const InvalidationKeySegment = S.Json -export type InvalidationKeySegment = S.Schema.Type - -/** Schema for a single invalidation key – an array of segments compatible with TanStack Query `queryKey`. */ -export const InvalidationKey = S.Array(InvalidationKeySegment) -export type InvalidationKey = S.Schema.Type - -/** Schema for the full set of invalidation keys – an array of `InvalidationKey`. */ -export const InvalidationKeys = S.Array(InvalidationKey) -export type InvalidationKeys = S.Schema.Type - -/** Metadata included in every command response for server-driven cache invalidation. */ -export const CommandMetaData = S.Struct({ - invalidateQueries: InvalidationKeys, - dataDependencies: DataDependencies.DataDependencySet -}) -export type CommandMetaData = S.Schema.Type - -export const emptyDataDependencies: DataDependencies.DataDependencySet = { - reads: DataDependencies.empty(), - writes: DataDependencies.empty() -} - -export const makeMetaData = ( - invalidateQueries: InvalidationKeys, - dataDependencies: DataDependencies.DataDependencySet = emptyDataDependencies -): CommandMetaData => ({ invalidateQueries, dataDependencies }) - -export const QueryResponseWithMetaData = (success: S) => - S.Struct({ payload: success, metadata: S.Struct({ dataDependencies: DataDependencies.DataDependencySet }) }) - -/** - * Wraps a command's success schema so that the wire format carries both the `payload` - * (the handler's actual return value) and `metadata` (server-driven cache invalidation keys). - * Transparent to users: the server handler returns the plain payload and the client receives - * the plain payload — wrapping/unwrapping is handled internally by the routing layer. - */ -export const CommandResponseWithMetaData = (success: S) => - S.Struct({ payload: success, metadata: CommandMetaData }) - -/** - * Wraps a command's failure schema so that the wire format carries both the `error` - * (the handler's actual failure value) and `metadata` (server-driven cache invalidation keys - * accumulated thus far before the failure occurred). - * Transparent to users: the server handler fails with the plain error and the client receives - * the plain error — wrapping/unwrapping is handled internally by the routing layer. - */ -export const CommandFailureWithMetaData = (error: E) => - S.Struct({ _tag: S.Literal("CommandFailureWithMetaData"), error, metadata: CommandMetaData }) - -/** - * Stream chunk schema for stream responses with metadata. - * Each item is either a data value, an intermediate "metadata" signal carrying cache - * invalidation keys accumulated since the previous drain, or a final "done" signal. - * Transparent to users: stream handlers return plain values and clients receive plain values — - * wrapping/unwrapping is handled internally by the routing layer. - * - * The "done" chunk is always the last item in the stream and carries any remaining invalidation - * keys. An optional "metadata" chunk may appear after any "value" chunk and carries keys - * accumulated since the last drain (V3: mid-stream invalidation). - */ -export const StreamResponseChunk = (success: S) => - S.Union([ - S.Struct({ _tag: S.Literal("value"), value: success }), - S.Struct({ _tag: S.Literal("metadata"), metadata: CommandMetaData }), - S.Struct({ _tag: S.Literal("done"), metadata: CommandMetaData }) - ]) - -export type StreamResponseChunk = - | { readonly _tag: "value"; readonly value: A } - | { readonly _tag: "metadata"; readonly metadata: CommandMetaData } - | { readonly _tag: "done"; readonly metadata: CommandMetaData } - -/** - * Stream chunk schema for stream failures with metadata. - * Used to signal a stream failure while still carrying cache invalidation keys - * accumulated thus far. - */ -export const StreamFailureChunk = (error: E) => - S.Struct({ _tag: S.Literal("error"), error, metadata: CommandMetaData }) - -export type StreamFailureChunk = { readonly _tag: "error"; readonly error: E; readonly metadata: CommandMetaData } - -/** - * Context annotation for declaring static cache invalidation keys on a low-level `Rpc` definition. - * These keys are always included in the command response metadata, regardless of the handler logic. - * - * Prefer using `makeQueryKey` over raw string arrays to stay in sync with the actual query - * definitions without manual string maintenance: - * - * ```ts - * import { makeQueryKey } from "effect-app/client" - * import { Invalidation } from "effect-app/rpc" - * import * as UserRsc from "../User/index.ts" // separate module to avoid circular deps - * - * class UpdateProfile extends Rpc.make("UpdateProfile", { ... }) - * .annotate(Invalidation.Invalidates, [makeQueryKey(UserRsc.GetMe), makeQueryKey(UserRsc.GetProfile)]) {} - * ``` - * - * **Circular dependency note:** if mutations and queries live in the same file you may hit a - * circular reference at evaluation time. The idiomatic fix is to move mutations into their own - * module (e.g. `User/mutations.ts`) that directly imports the relevant query classes rather than - * re-exporting them through a barrel. - * - * For the higher-level `Command`/`Query` builders from `makeRpcClient`, use the - * `invalidatesQueries` callback argument instead (it receives the same query keys at runtime). - */ -export const Invalidates = Context.Reference>( - "effect-app/rpc/Invalidates", - { defaultValue: () => [] } -) -export type Invalidates = typeof Invalidates - -/** The shape of the per-request service that accumulates invalidation keys. */ -export interface InvalidationSetService { - readonly add: ( - input: InvalidationKeyInput | ReadonlyArray - ) => Effect.Effect - readonly get: Effect.Effect> - /** - * V3: Reads all currently accumulated keys and resets the bucket to empty. - * Used by the stream routing layer to emit intermediate "metadata" chunks - * without re-sending keys that have already been forwarded to the client. - */ - readonly drain: Effect.Effect> -} - -/** - * Request-scoped service for accumulating invalidation keys dynamically inside a handler. - * Provided by `InvalidationMiddlewareLive` for every RPC call; has a no-op default so it is - * safe to use even when the HTTP middleware is absent (tests, workers, etc.). - * - * Use `InvalidationSet.add(key)` as a shorthand to skip `.use(_ => _.add(key))`. The - * underlying service is still available via `.use` / `.useSync` for advanced cases. - * - * `add` accepts an RPC handler directly (e.g. `UserRsc.GetMe`) — its query key is derived via - * `makeQueryKey` so keys stay in sync with the actual query definitions. Raw `InvalidationKey` - * arrays and arrays of either form are also accepted. - * - * ```ts - * import * as Effect from "effect/Effect" - * import { Invalidation } from "effect-app/rpc" - * import * as CartRsc from "../Cart/queries.ts" - * import * as UserRsc from "../User/queries.ts" - * - * const handler = Effect.fnUntraced(function*(req: UpdateCartRequest) { - * const cart = yield* CartRepo.save(req.cart) - * - * // single handler - * yield* Invalidation.InvalidationSet.add(UserRsc.GetMe) - * - * // batch - * if (cart.isCheckedOut) { - * yield* Invalidation.InvalidationSet.add([CartRsc.GetCartStats, UserRsc.GetMe]) - * } - * - * return cart - * }) - * ``` - * - * You can combine static (`Invalidates` annotation) and dynamic (`InvalidationSet.use`) keys: - * the annotation pre-populates the set before the handler runs; dynamic additions accumulate - * throughout the handler. All keys are included in the command response metadata. - */ -const InvalidationSetRef = Context.Reference( - "effect-app/rpc/InvalidationSet", - { - defaultValue: () => ({ - add: (_input: InvalidationKeyInput | ReadonlyArray) => Effect.void, - get: Effect.succeed([] as ReadonlyArray), - drain: Effect.succeed([] as ReadonlyArray) - }) - } -) -export const InvalidationSet = Object.assign(InvalidationSetRef, { - /** - * Shortcut for `InvalidationSet.use(_ => _.add(input))`. Accepts a single - * `InvalidationKeyInput` or an array of them. - */ - add: (input: InvalidationKeyInput | ReadonlyArray) => - InvalidationSetRef.use((_) => _.add(input)) -}) -export type InvalidationSet = typeof InvalidationSetRef - -/** Creates a fresh `InvalidationSet` implementation backed by a `Ref`. */ -export const makeInvalidationSet = (ref: Ref.Ref>): InvalidationSetService => ({ - add: (input) => Ref.update(ref, (keys) => [...keys, ...normalizeInputs(input)]), - get: Ref.get(ref), - drain: Ref.getAndSet(ref, []) -}) - -/** - * `Rpc.Custom` definition for command RPCs that wrap the success/error schemas - * with `CommandResponseWithMetaData` / `CommandFailureWithMetaData`. The wrap - * lets server forward accumulated invalidation keys on both success and - * handler-thrown failure paths. Middleware-thrown errors bypass the wrap - * (the handler never ran, so no metadata) and flow raw at the Cause level — - * the client decodes them via the `rpc.middlewares[*].error` failure-union - * channel of `Rpc.exitSchema`. - */ -// eslint-disable-next-line import/namespace -export interface CommandRpc extends Rpc.Custom { - readonly out: Rpc.Custom.Out< - ReturnType>, - ReturnType> - > -} - -/** - * Custom Rpc constructor for command RPCs. - * Wraps the success schema with `CommandResponseWithMetaData` and the error - * schema with `CommandFailureWithMetaData`. - */ -export const makeCommandRpc = Rpc.custom(({ defect, error, success }) => ({ - success: CommandResponseWithMetaData(success), - error: CommandFailureWithMetaData(error), - defect -})) - -/** - * `Rpc.Custom` definition for stream RPCs that wrap the success/error schemas - * with `StreamResponseChunk` / `StreamFailureChunk`. - */ -// eslint-disable-next-line import/namespace -export interface StreamRpc extends Rpc.Custom { - readonly out: Rpc.Custom.Out< - ReturnType>, - ReturnType> - > -} - -/** - * Custom Rpc constructor for stream RPCs. - * Wraps the success schema with `StreamResponseChunk` and - * the error schema with `StreamFailureChunk`. - */ -export const makeStreamRpc = Rpc.custom(({ defect, error, success }) => ({ - success: StreamResponseChunk(success), - error: StreamFailureChunk(error), - defect -})) diff --git a/packages/effect-app/src/rpc/MiddlewareMaker.ts b/packages/effect-app/src/rpc/MiddlewareMaker.ts deleted file mode 100644 index 486af1096..000000000 --- a/packages/effect-app/src/rpc/MiddlewareMaker.ts +++ /dev/null @@ -1,492 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { type NonEmptyArray, type NonEmptyReadonlyArray } from "effect/Array" -import * as Effect from "effect/Effect" -import * as Layer from "effect/Layer" -import * as S from "effect/Schema" -import type * as Scope from "effect/Scope" -import { type Simplify } from "effect/Types" -import { Rpc, type RpcGroup, type RpcSchema } from "effect/unstable/rpc" -import { type HandlersFrom } from "effect/unstable/rpc/RpcGroup" -import * as Context from "../Context.ts" -import { PreludeLogger } from "../logger.ts" -import { type TypeTestId } from "../TypeTest.ts" -import { type GetContextConfig, type RequestContextMapTagAny, type RpcContextMap } from "./RpcContextMap.ts" -import { type AddMiddleware, type AnyDynamic, type RpcDynamic, type RpcMiddlewareV4, type TagClassAny } from "./RpcMiddleware.ts" -import * as RpcMiddlewareX from "./RpcMiddleware.ts" - -// adapter for effect/rpc v3 middleware provides. (in effect-smol (v4), it's just a Service Identifier, no tags.) -// hm? -type MakeTags = A - -export interface MiddlewareMaker< - Self, - Id extends string, - RequestContextMap extends Record, - MiddlewareProviders extends ReadonlyArray -> extends - RpcMiddlewareX.TagClass< - Self, - Id, - Simplify< - & (Exclude< - MiddlewareMaker.ManyRequired, - MiddlewareMaker.ManyProvided - > extends never ? {} : { - readonly requires: MakeTags< - Exclude< - MiddlewareMaker.ManyRequired, - MiddlewareMaker.ManyProvided - > - > - }) - & (MiddlewareMaker.ManyErrors extends never ? {} - : { - readonly error: S.Codec> - }) - & (MiddlewareMaker.ManyProvided extends never ? {} - : { readonly provides: MakeTags> }) - >, - { - provides: MiddlewareMaker.ManyProvided extends never ? never - : MakeTags> - requires: Exclude< - MiddlewareMaker.ManyRequired, - MiddlewareMaker.ManyProvided - > extends never ? never - : MakeTags< - Exclude< - MiddlewareMaker.ManyRequired, - MiddlewareMaker.ManyProvided - > - > - } - > -{ - readonly layer: Layer.Layer> - readonly requestContext: RequestContextTag - readonly requestContextMap: RequestContextMap -} - -export interface RequestContextTag> - extends Context.Service<"RequestContextConfig", GetContextConfig> -{} - -export namespace MiddlewareMaker { - export type Any = TagClassAny - - export type ApplyServices = Exclude> | Required - - export type ApplyManyServices, R> = - | Exclude }[number]> - | { [K in keyof A]: Required }[number] - - export type ManyProvided> = A extends NonEmptyReadonlyArray - ? { [K in keyof A]: Provided }[number] - : Provided - export type ManyRequired> = A extends NonEmptyReadonlyArray - ? { [K in keyof A]: Required }[number] - : Required - export type ManyErrors> = A extends NonEmptyReadonlyArray - ? { [K in keyof A]: Errors }[number] - : Errors - - export type Provided = T extends TagClassAny ? T extends { provides: infer _P } ? _P - : never - : never - - export type Errors = T extends TagClassAny ? T extends { error: S.Top } ? T["error"]["Type"] - : never - : never - - export type Required = T extends TagClassAny ? T extends { requires: infer _R } ? _R - : never - : never -} - -// the following implements sort of builder pattern -// we support both sideways and upwards elimination of dependencies - -// it's for dynamic middlewares -type GetDependsOnKeys = MW extends { dependsOn: NonEmptyReadonlyArray } ? { - [K in keyof MW["dependsOn"]]: MW["dependsOn"][K] extends AnyDynamic ? MW["dependsOn"][K]["dynamic"]["key"] - : never - }[keyof MW["dependsOn"]] - : never - -type FilterInDynamicMiddlewares< - MWs extends ReadonlyArray, - RequestContextMap extends Record -> = { - [K in keyof MWs]: MWs[K] extends { dynamic: RpcDynamic } ? MWs[K] - : never -} - -type RecursiveHandleMWsSideways< - MWs, - R extends { - self: any - id: string - rcm: Record - provided: keyof R["rcm"] // that's fine - middlewares: ReadonlyArray - dmp: any - middlewareR: any - } -> = MWs extends [] ? R - : MWs extends [infer F, ...infer Rest extends ReadonlyArray] - ? F extends MiddlewareMaker.Any ? RecursiveHandleMWsSideways[number]["dynamic"]["key"], - // F is fine here because only dynamic middlewares will have 'dependsOn' prop - GetDependsOnKeys - > - middlewares: [...R["middlewares"], F] - dmp: [FilterInDynamicMiddlewares<[F], R["rcm"]>[number]] extends [never] ? R["dmp"] - : - & R["dmp"] - & { - [U in FilterInDynamicMiddlewares<[F], R["rcm"]>[number] as U["dynamic"]["key"]]: U - } - middlewareR: MiddlewareMaker.ApplyManyServices<[F], R["middlewareR"]> - }> - // TypeScript inference fails when checking F extends MiddlewareMaker.Any during F's inference - // if F is a class with static properties - deferring the check avoids this limitation - : `Absurd: F must extend MiddlewareMaker.Any` - : never - -export interface BuildingMiddleware< - Self, - Id extends string, - RequestContextMap extends Record, - Provided extends keyof RequestContextMap, - Middlewares extends ReadonlyArray, - DynamicMiddlewareProviders, - out MiddlewareR extends { _tag: string } = never -> { - rpc: < - const Tag extends string, - Payload extends S.Top | S.Struct.Fields = typeof S.Void, - Success extends S.Top = typeof S.Void, - Error extends S.Top = typeof S.Never, - const Stream extends boolean = false, - Config extends GetContextConfig = {} - >(tag: Tag, options?: { - readonly payload?: Payload - readonly success?: Success - readonly error?: Error - readonly stream?: Stream - readonly config?: Config - readonly primaryKey?: [Payload] extends [S.Struct.Fields] ? (( - payload: Payload extends S.Struct.Fields ? Simplify["Type"]> : Payload["Type"] - ) => string) - : never - }) => - & Rpc.Rpc< - Tag, - Payload extends S.Struct.Fields ? S.Struct : Payload, - Stream extends true ? RpcSchema.Stream : Success, - Stream extends true ? typeof S.Never : Error - > - & { readonly config: Config } - - middleware>( - ...mw: MWs - ): RecursiveHandleMWsSideways extends infer Res extends { - self: any - id: string - rcm: RequestContextMap - provided: keyof RequestContextMap - middlewares: ReadonlyArray - dmp: any - middlewareR: any - } ? MiddlewaresBuilder< - Res["self"], - Res["id"], - Res["rcm"], - Res["provided"], - Res["middlewares"], - Res["dmp"], - Res["middlewareR"] - > - : never - - // helps debugging what are the missing requirements (type only) - readonly [TypeTestId]: { - missingDynamicMiddlewares: Exclude - missingContext: MiddlewareR - } -} - -export type MiddlewaresBuilder< - Self, - Id extends string, - RequestContextMap extends Record, - Provided extends keyof RequestContextMap = never, - Middlewares extends ReadonlyArray = [], - DynamicMiddlewareProviders = unknown, - MiddlewareR extends { _tag: string } = never -> = - & BuildingMiddleware< - Self, - Id, - RequestContextMap, - Provided, - Middlewares, - DynamicMiddlewareProviders, - MiddlewareR - > - & // keyof Omit extends never is true when all the dynamic middlewares are provided - // MiddlewareR is never when all the required services from generic & dynamic middlewares are provided - (keyof Omit extends never ? [MiddlewareR] extends [never] ? MiddlewareMaker< - Self, - Id, - RequestContextMap, - Middlewares - > - : { new(_: never): {} } - : { new(_: never): {} }) - -const middlewareMaker = Effect.fnUntraced(function*< - MiddlewareProviders extends ReadonlyArray ->(middlewares: MiddlewareProviders) { - type Middleware = RpcMiddlewareV4< - MiddlewareMaker.ManyProvided, - MiddlewareMaker.ManyErrors, - Exclude< - MiddlewareMaker.ManyRequired, - MiddlewareMaker.ManyProvided - > extends never ? never - : Exclude, MiddlewareMaker.ManyProvided> - > - type Next = Parameters[0] - type Options = Parameters[1] - - // we want to run them in reverse order because latter middlewares will provide context to former ones - const reversed = middlewares.toReversed() - const context = yield* Effect.context() - - // returns a Effect/RpcMiddlewareV4 with Scope.Scope in requirements - // v4: wrap middleware takes (effect, options) as two params instead of a single options bag - return (next: Next, options: Options) => { - // we start with the actual handler - let handler = next - - // inspired from Effect/RpcMiddleware - for (const tag of reversed) { - // use the tag to get the middleware from context - const middleware = Context.getUnsafe(context, tag) - - // wrap the current handler, allowing the middleware to run before and after it - handler = PreludeLogger.logDebug("Applying middleware wrap " + tag.key).pipe( - Effect.andThen(middleware(handler, options)) - ) as any - } - return handler - } -}) - -const makeMiddlewareBasic = () => -// by setting RequestContextMap beforehand, execute contextual typing does not fuck up itself to anys -< - const Id extends string, - RequestContextMap extends Record, - MiddlewareProviders extends ReadonlyArray ->( - id: Id, - rcm: RequestContextMap, - ...make: MiddlewareProviders -) => { - // reverse middlewares and wrap one after the other - const middleware = middlewareMaker(make) - - // Per-middleware error: union of the static `error` on the tag (if any) AND - // the rcm config entry pointed at by the middleware's `dynamic.key` (if any). - // Reason: middlewares declared with `dynamic: RequestContextMap.get("foo")` - // don't set a static `error` field — at runtime their `.error` defaults to - // `S.Never`. Without pulling from rcm, the composite middleware's - // `.error` collapses to `Never`, and `Rpc.exitSchema` (which walks - // `rpc.middlewares[*].error` to build the wire failure union) can't decode - // the actual middleware-thrown error type. Critical for stream rpcs whose - // top-level `errorSchema` is force-set to `Never` by effect-rpc. - const isMeaningfulError = (e: S.Top | undefined): e is S.Top => e !== undefined && e !== null && e !== S.Never - const rcmRecord = rcm as Record - const failures: Array = make.flatMap((_) => { - const out: Array = [] - if (isMeaningfulError(_.error)) out.push(_.error) - const key = _.dynamic?.key as string | undefined - if (key && rcmRecord[key] && isMeaningfulError(rcmRecord[key].error)) { - out.push(rcmRecord[key].error) - } - return out - }) - const provides = make.flatMap((_) => !_.provides ? [] : Array.isArray(_.provides) ? _.provides : [_.provides]) - const requires = make - .flatMap((_) => !_.requires ? [] : Array.isArray(_.requires) ? _.requires : [_.requires]) - .filter((_) => !provides.includes(_)) - - const [firstFailure, ...restFailures] = failures - - const MiddlewareMaker = RpcMiddlewareX.Tag()(id, { - error: (firstFailure - ? S.Union([firstFailure, ...restFailures]) - : S.Never) as unknown as MiddlewareMaker.ManyErrors extends never ? never - : S.Codec>, - requires: (requires.length > 0 - ? requires - : undefined) as unknown as Exclude< - MiddlewareMaker.ManyRequired, - MiddlewareMaker.ManyProvided - > extends never ? never : [ - MakeTags< - Exclude< - MiddlewareMaker.ManyRequired, - MiddlewareMaker.ManyProvided - > - > - ], - provides: (provides.length > 0 - ? provides - : undefined) as unknown as MiddlewareMaker.ManyProvided extends never ? never - : MakeTags> - }) - - const layer = Layer - .effect( - MiddlewareMaker, - middleware as Effect.Effect< - any - > - // todo; they dont change the type.. - // Effect.Error, - // Effect.Services - ) - - // add to the tag a default implementation - return Object.assign(MiddlewareMaker, { - layer, - // tag to be used to retrieve the RequestContextConfig from Rpc annotations - requestContext: Context.Service<"RequestContextConfig", GetContextConfig>( - "RequestContextConfig" - ), - requestContextMap: rcm - }) -} - -export const Tag = () => -< - const Id extends string, - RequestContextMap extends RequestContextMapTagAny ->(id: Id, rcm: RequestContextMap): MiddlewaresBuilder => { - const allMiddleware: MiddlewareMaker.Any[] = [] - const requestContext = Context.Service<"RequestContextConfig", GetContextConfig>( - "RequestContextConfig" - ) - const it = { - id, - // rpc with config - rpc: < - const Tag extends string, - Payload extends S.Top | S.Struct.Fields = typeof S.Void, - Success extends S.Top = typeof S.Void, - Error extends S.Top = typeof S.Never, - const Stream extends boolean = false, - Config extends GetContextConfig = {} - >(tag: Tag, options?: { - readonly payload?: Payload - readonly success?: Success - readonly error?: Error - readonly stream?: Stream - readonly config?: Config - readonly primaryKey?: [Payload] extends [S.Struct.Fields] ? (( - payload: Payload extends S.Struct.Fields ? Simplify["Type"]> : Payload["Type"] - ) => string) - : never - }): - & Rpc.Rpc< - Tag, - Payload extends S.Struct.Fields ? S.Struct : Payload, - // TODO: enhance `Error`. type based on middleware config. - Stream extends true ? RpcSchema.Stream : Success, - Stream extends true ? typeof S.Never : Error - > - & { config: Config } => - { - const config = options?.config ?? {} as Config - - // The rpc's `error` schema carries ONLY the request's own declared errors. - // Middleware errors (rcm-derived) reach the wire via the middleware tag - // attached to the rpc group later (`RpcGroup.middleware(...)` at the - // routing/client level), and are unioned into the failure schema by - // `Rpc.exitSchema`'s `rpc.middlewares[*].error` walk. - // @ts-expect-error — TypeScript can't prove Simplify ≡ { [K in keyof T]: T[K] } for unresolved generics (primaryKey) - const rpc = Rpc.make(tag, { - ...options?.payload !== undefined ? { payload: options.payload } : {}, - ...options?.success !== undefined ? { success: options.success } : {}, - ...options?.error !== undefined ? { error: options.error } : {}, - ...options?.stream !== undefined ? { stream: options.stream } : {}, - ...options?.primaryKey !== undefined ? { primaryKey: options.primaryKey } : {} - }) as any - - return Object.assign(rpc.annotate(requestContext, config), { config }) - }, - middleware: (...middlewares: any[]) => { - for (const mw of middlewares) { - // recall that we run middlewares in reverse order - allMiddleware.unshift(mw) - } - return allMiddleware.filter((m) => !!m.dynamic).length !== Object.keys(rcm.config).length - // for sure, until all the dynamic middlewares are provided it's non sensical to call makeMiddlewareBasic - ? it - // actually, we don't know yet if MiddlewareR is never, but we can't easily check it at runtime - : Object.assign(makeMiddlewareBasic()(id, rcm.config, ...allMiddleware), it) - } - } - return it as any -} - -// alternatively consider group.serverMiddleware? hmmm -export const middlewareGroup = < - RequestContextMap extends Record, - Middleware extends RpcMiddlewareX.TagClassAny & { - readonly requestContext: RequestContextTag - readonly requestContextMap: RequestContextMap - } ->( - middleware: Middleware -) => -(group: RpcGroup.RpcGroup) => { - type RN = AddMiddleware - const middlewaredGroup = group.middleware(middleware) as unknown as RpcGroup.RpcGroup - const toLayerOriginal = middlewaredGroup.toLayer.bind(middlewaredGroup) - return Object.assign(middlewaredGroup, { - toLayerDynamic: < - Handlers extends HandlersFrom, - EX = never, - RX = never - >( - build: - | Handlers - | Effect.Effect - ): Layer.Layer< - Rpc.ToHandler, - EX, - | Exclude - | RpcMiddlewareX.HandlersContext - > => { - return toLayerOriginal(build as any) as any // ?? - } - }) -} diff --git a/packages/effect-app/src/rpc/README.md b/packages/effect-app/src/rpc/README.md deleted file mode 100644 index 192abc189..000000000 --- a/packages/effect-app/src/rpc/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# Effect RPC extensions - -The extensions use V4 format of RPC middleware: - -- supports `requires` besides `provides` -- `requires` and `provides` should be set as second generic argument: `Tag`. -- `wrap: true` is the default, there is no classic `provides: Tag` - -## Features - -### Bundle Middleware - -Compose multiple middleware into a single middleware, so that you can use them easily together as a unit. -The middleware group is fully typesafe, supporting chained or sideways elimination of requirements. -All configured dynamic middleware must be provided or the bundle is not complete. - -### Dynamic Middleware - -Dynamic middleware is middleware that is being controlled by Configuration set on the RPC. -The middleware generally runs globally, but it's behaviour depends on configuration on the RPC. - -For instance, `AllowAnonymous`, with a default of `false`, would either provide a `UserProfile` service, or fail with a `NotLoggedInError`. -therefore `UserProfile` is eliminated from a handler implementing that rpc. -If the RPC however opts out and specifies: `allowAnonymous: true`, the `UserProfile` service is no longer eliminated from the handler, -and thus one has to use `Effect.serviceOption(UserProfile)` instead, to not get a type error. - -For instance, `RequireRoles` would by default require a `manager` role, but can be opted out from per RPC, perhaps lowering to `user` or `anonymous` role. - -### Create RPCGroups and Handlers from a common set of Middleware - -You create a bundle of middleware, containing standard or dynamic middleware, and from it you can create all your rpc groups and handlers. -NOTE: perhaps not as useful anymore if support for dynamic middleware gets integrated directly into effect RPC. -`middleware.group`, `middleware.rpc` and `group.toLayerDynamic` would become obsolete, and `RpcGroup.make().middleware(globalMiddleware)` would be simpler. - -## Examples - -See [tests](../../../infra/test/rpc-multi-middleware.test.ts) - -## Future - -Gauge interest to integrate natively into `@effect/rpc` package, and then integrate. diff --git a/packages/effect-app/src/rpc/RpcContextMap.ts b/packages/effect-app/src/rpc/RpcContextMap.ts deleted file mode 100644 index d9d53aac3..000000000 --- a/packages/effect-app/src/rpc/RpcContextMap.ts +++ /dev/null @@ -1,156 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-return */ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -import type * as S from "effect/Schema" -import { type AnyWithProps } from "effect/unstable/rpc/Rpc" -import * as Context from "../Context.ts" -import { type RpcDynamic } from "./RpcMiddleware.ts" - -type Values> = T[keyof T] - -/** - * Middleware is inactivate by default, the Key is optional in route context, and the service is optionally provided as Effect Context. - * Unless explicitly configured as `true`. - */ -export type RpcContextMap = { - // todo; rename Provides - service: Service - error: E - contextActivation: true - inverted: false -} - -export declare namespace RpcContextMap { - /** - * Middleware is active by default, and provides the Service at Key in route context, and the Service is provided as Effect Context. - * Unless explicitly omitted. - */ - export type Inverted = { - service: Service - error: E - contextActivation: false - inverted: true - } - - export type Custom = { - service: Service - error: E - contextActivation: C - inverted: false - } - - export type Any = { - service: any - error: S.Top - contextActivation: any - inverted: boolean - } -} - -export type GetContextConfig> = { - [K in keyof RequestContextMap]?: RequestContextMap[K]["inverted"] extends true - ? RequestContextMap[K]["contextActivation"] extends true ? false - : RequestContextMap[K]["contextActivation"] extends false ? true - : RequestContextMap[K]["contextActivation"] - : RequestContextMap[K]["contextActivation"] -} - -export type GetEffectContext, T> = Values< - // inverted: contextActivation is false => remove if explicitly set to true (like allowAnonymous: true disables auth and auth service and related errors) - & { - [ - key in keyof RequestContextMap as RequestContextMap[key]["contextActivation"] extends true ? never - : key extends keyof T ? T[key] extends true ? never : key - : key - ]: // TODO: or as an Optional available? - RequestContextMap[key]["service"] - } - // normal: contextActivation is true => add if explicitly set to true - & { - [ - key in keyof RequestContextMap as RequestContextMap[key]["contextActivation"] extends false ? never - : key extends keyof T ? T[key] extends true ? key : never - : never - ]: // TODO: or as an Optional available? - RequestContextMap[key]["service"] - } -> - -export type GetEffectError, T> = Values< - // inverted: contextActivation is false => remove if explicitly set to true (like allowAnonymous: true disables auth and auth service and related errors) - & { - [ - key in keyof RequestContextMap as RequestContextMap[key]["contextActivation"] extends true ? never - : key extends keyof T ? T[key] extends true ? never : key - : key - ]: // TODO: or as an Optional available? - RequestContextMap[key]["error"] - } - // normal: contextActivation is true => add if explicitly set to true - & { - [ - key in keyof RequestContextMap as RequestContextMap[key]["contextActivation"] extends false ? never - : key extends keyof T ? T[key] extends true ? key : never - : never - ]: // TODO: or as an Optional available? - RequestContextMap[key]["error"] - } -> - -const tag = Context.Service("RequestContextConfig") - -export const makeMap = >(config: Config) => { - const cls = class { - readonly config: Config - constructor() { - this.config = config - } - } - return Object.assign(cls, { - config, /** Retrieves RequestContextConfig out of the Rpc annotations */ - getConfig: (rpc: AnyWithProps): GetContextConfig => { - return Context.getOrElse(rpc.annotations, tag as any, () => ({})) - }, - /** Adapter used when setting the dynamic prop on a middleware implementation */ - get: < - Key extends (keyof Config) & string - >(key: Key): RpcDynamic => ({ - key, - settings: { service: config[key]!["service"] } as Config[Key] - }) - }) -} - -export const make = () => -( - error: E -): RpcContextMap => ({ - service: null as Service, - error, - contextActivation: true, - inverted: false -}) - -export const makeInverted = () => -( - error: E -): RpcContextMap.Inverted => ({ - service: null as Service, - error, - contextActivation: false, - inverted: true -}) - -export const makeCustom = () => -( - error: E, - contextActivation: C -): RpcContextMap.Custom => ({ - service: null as Service, - error, - contextActivation, - inverted: false -}) - -export type RequestContextMapTagAny = { readonly config: Record } diff --git a/packages/effect-app/src/rpc/RpcMiddleware.ts b/packages/effect-app/src/rpc/RpcMiddleware.ts deleted file mode 100644 index a760fdca4..000000000 --- a/packages/effect-app/src/rpc/RpcMiddleware.ts +++ /dev/null @@ -1,244 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-return */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { type NonEmptyReadonlyArray } from "effect/Array" -import type * as Effect from "effect/Effect" -import type * as S from "effect/Schema" -import type * as Scope from "effect/Scope" -import type * as Stream from "effect/Stream" -import { type Rpc, RpcMiddleware } from "effect/unstable/rpc" -import { type TypeId } from "effect/unstable/rpc/RpcMiddleware" -import type * as Context from "../Context.ts" -import { type GetEffectContext, type RpcContextMap } from "./RpcContextMap.ts" - -export type RpcMiddlewareV4 = RpcMiddleware.RpcMiddleware - -export type RpcOptionsOriginal = { - readonly optional?: boolean - readonly error?: S.Top - readonly requiredForClient?: boolean -} - -export type RpcDynamic = { - key: Key - settings: A -} - -export type AnyDynamic = { dynamic: RpcDynamic } - -export type DependsOn = { - readonly dependsOn: NonEmptyReadonlyArray | undefined -} - -export interface RpcOptionsDynamic extends RpcOptionsOriginal { - readonly dynamic: RpcDynamic - readonly dependsOn?: NonEmptyReadonlyArray | undefined -} - -export type Dynamic = Options extends RpcOptionsDynamic ? true : false - -export interface RpcMiddlewareDynamic extends RpcMiddleware.RpcMiddleware {} - -export interface TagClassAny extends RpcMiddleware.AnyService { - readonly optional: boolean - readonly provides: any - readonly requires: any - readonly error: S.Top - readonly dynamic?: RpcDynamic | undefined - readonly dependsOn?: NonEmptyReadonlyArray | undefined -} - -export declare namespace TagClass { - /** - * @since 1.0.0 - * @category models - */ - export type FailureSchema = Options extends { readonly error: S.Top; readonly optional?: false } - ? Options["error"] - // actually not, the Failure depends on Dynamic Middleware Configuration! - // : Options extends { readonly dynamic: RpcDynamic } ? A["error"] - : typeof S.Never - - /** - * @since 1.0.0 - * @category models - */ - export type Failure = Options extends { readonly error: S.Codec; readonly optional?: false } ? _A - // actually not, the Failure depends on Dynamic Middleware Configuration! - : Options extends { readonly dynamic: RpcDynamic } ? A["error"]["Type"] - : never - - /** - * @since 1.0.0 - * @category models - */ - // Avoid `S.Codec.DecodingServices = X extends Top ? X["DecodingServices"] : never`: - // tsgo fails to reduce it here and leaves `unknown`. `FailureSchema` is - // always `S.Top` (either `Options["error"]` or `typeof S.Never`), so read directly. - export type FailureContext = FailureSchema["DecodingServices"] - - /** - * @since 1.0.0 - * @category models - */ - export type FailureService = Optional extends true ? unknown : Failure - - /** - * @since 1.0.0 - * @category models - */ - export type Optional = Options extends { readonly optional: true } ? true : false - - /** - * @since 1.0.0 - * @category models - */ - export type RequiredForClient = Options extends { readonly requiredForClient: true } ? true : false - - /** - * @since 1.0.0 - * @category models - */ - export interface Base< - Self, - Name extends string, - Options, - Service, - Config extends { - requires?: any - provides?: any - } - > extends Context.Service { - new(_: never): Context.ServiceClass.Shape - readonly [TypeId]: TypeId - readonly optional: Optional - readonly error: FailureSchema - readonly "~ClientError": Options extends { readonly clientError: infer CE } ? CE : never - readonly provides: "provides" extends keyof Config ? Config["provides"] : never - readonly requires: "requires" extends keyof Config ? Config["requires"] : never - readonly dynamic: Options extends RpcOptionsDynamic ? Options["dynamic"] - : undefined - readonly dependsOn: Options extends DependsOn ? Options["dependsOn"] : undefined - readonly requiredForClient: RequiredForClient - } -} - -export interface TagClass< - Self, - Name extends string, - Options, - Config extends { - requires?: any - provides?: any - } = { requires: never; provides: never } -> extends - TagClass.Base< - Self, - Name, - Options, - Options extends RpcOptionsDynamic ? RpcMiddlewareDynamic< - TagClass.FailureService, - "requires" extends keyof Config ? Config["requires"] : never, - { [K in Options["dynamic"]["key"]]?: Options["dynamic"]["settings"]["contextActivation"] } - > - : RpcMiddlewareV4< - "provides" extends keyof Config ? Config["provides"] : never, - TagClass.Failure, - "requires" extends keyof Config ? Config["requires"] : never - >, - Config - > -{} - -export const Tag = < - Self, - Config extends { - requires?: any - provides?: any - } = { requires: never; provides: never } ->() => -< - const Name extends string, - const Options extends RpcOptionsOriginal | RpcOptionsDynamic = {} ->( - id: Name, - options?: Options -): TagClass => - class extends RpcMiddleware.Service()(id, options as any) { - static readonly requires: "requires" extends keyof Config ? Config["requires"] : never - static readonly provides: "provides" extends keyof Config ? Config["provides"] : never - static readonly dynamic = options && "dynamic" in options ? options.dynamic : undefined - static readonly dependsOn = options && "dependsOn" in options ? options.dependsOn : undefined - } as any - -// not needed if there's official support in Rpc.Rpc. -export type AddMiddleware = R extends Rpc.Rpc< - infer _Tag, - infer _Payload, - infer _Success, - infer _Error, - infer _Middleware -> ? - & Rpc.Rpc< - _Tag, - _Payload, - _Success, - _Error, - _Middleware | Middleware - > - & { readonly config: R extends { readonly config: infer _C } ? _C : never } - : never - -// customized versions to handle dynamically eliminated context. -export type HandlersContext = keyof Handlers extends infer K - ? K extends keyof Handlers & string ? HandlerContext : never - : never - -export type HandlerContext = [Rpc.IsStream] extends - [true] ? Handler extends (...args: any) => - | Stream.Stream - | Rpc.Wrapper> - | Effect.Effect< - infer _A, - infer _EX, - infer _R - > - | Rpc.Wrapper< - Effect.Effect< - infer _A, - infer _EX, - infer _R - > - > ? Exclude, Scope.Scope> - : never - : Handler extends ( - ...args: any - ) => Effect.Effect | Rpc.Wrapper> - ? ExcludeProvides<_R, Rpcs, K> - : never - -// new -export type ExtractDynamicallyProvides = R extends - Rpc.Rpc ? _Middleware extends { - readonly requestContextMap: infer _RC - } ? _RC extends Record // ? GetEffectContext<_RC, { allowAnonymous: false }> - ? R extends { readonly config: infer _C } ? GetEffectContext<_RC, _C> - : GetEffectContext<_RC, {}> - : never - : never - : never - -export type ExtractProvides = R extends - Rpc.Rpc ? _Middleware extends { - readonly provides: infer _P - } ? [_P] extends [never] ? never - : _P /*_P extends Context.Service ? _I - : never */ - : never - : never - -export type ExcludeProvides = Exclude< - Env, - // customisation is down here. - ExtractProvides | ExtractDynamicallyProvides -> diff --git a/packages/effect-app/src/runtime.ts b/packages/effect-app/src/runtime.ts deleted file mode 100644 index a8b004539..000000000 --- a/packages/effect-app/src/runtime.ts +++ /dev/null @@ -1,57 +0,0 @@ -import * as Exit from "effect/Exit" -import { flow } from "effect/Function" -import * as Logger from "effect/Logger" -import * as ManagedRuntime from "effect/ManagedRuntime" -import { CauseException } from "./client/errors.ts" -import { type Context } from "./Context.ts" -import * as Effect from "./Effect.ts" -import * as Layer from "./Layer.ts" - -export const makeAppRuntime = Effect.fnUntraced(function*(layer: Layer.Layer) { - const l = layer.pipe( - Layer.provide(Logger.layer([Logger.consolePretty()])), - Layer.orDie - ) - const mrt = ManagedRuntime.make(l) - yield* mrt.contextEffect - return Object.assign(mrt, { - [Symbol.dispose]() { - return Effect.runSync(mrt.disposeEffect) - }, - - [Symbol.asyncDispose]() { - return mrt.dispose() - } - }) // as we initialise here, there is no more error left. -}) - -export function initializeSync(layer: Layer.Layer) { - const runtime = Effect.runSync(makeAppRuntime(layer)) - return runtime -} - -export function initializeAsync(layer: Layer.Layer) { - return Effect - .runPromise(makeAppRuntime(layer)) -} - -// we wrap into CauseException because we want to keep the full cause of the failure. -export const makeRunPromise = (services: Context) => - flow(Effect.runPromiseExitWith(services), (_) => - _.then( - Exit.match({ - onFailure: (cause) => Promise.reject(new CauseException(cause, "runPromise")), - onSuccess: (value) => Promise.resolve(value) - }) - )) - -export const makeRunSync = (services: Context) => - flow( - Effect.runSyncExitWith(services), - Exit.match({ - onFailure: (cause) => { - throw new CauseException(cause, "runSync") - }, - onSuccess: (value) => value - }) - ) diff --git a/packages/effect-app/src/setupRequest.ts b/packages/effect-app/src/setupRequest.ts deleted file mode 100644 index 683d9a7d1..000000000 --- a/packages/effect-app/src/setupRequest.ts +++ /dev/null @@ -1,138 +0,0 @@ -import * as Tracer from "effect/Tracer" -import { SqlClient } from "effect/unstable/sql" -import { DataDependencyRecorder } from "./DataDependencies.ts" -import * as Effect from "./Effect.ts" -import * as Layer from "./Layer.ts" -import * as Option from "./Option.ts" -import { LocaleRef, RequestContext, spanAttributes } from "./RequestContext.ts" -import * as RequestScopedDependencies from "./RequestScopedDependencies.ts" -import { NonEmptyString255 } from "./Schema.ts" -import { ContextMapContainer, storeId } from "./Store.ts" - -const withSqlTransaction = (self: Effect.Effect): Effect.Effect => - Effect.serviceOption(SqlClient.SqlClient).pipe( - Effect.flatMap(Option.match({ - onNone: () => self, - onSome: (sql) => sql.withTransaction(self).pipe(Effect.orDie) - })) - ) - -export const getRequestContext = Effect - .all({ - span: Effect.currentSpan.pipe(Effect.orDie), - locale: LocaleRef, - namespace: storeId - }) - .pipe( - Effect.map(({ locale, namespace, span }) => - RequestContext.make({ - span: Tracer.externalSpan(span), - locale, - namespace, - name: NonEmptyString255(span.name) - }) - ) - ) - -export const getRC = Effect.all({ - locale: LocaleRef, - namespace: storeId -}) - -const withRequestSpan = (name = "request", options?: Tracer.SpanOptions) => (f: Effect.Effect) => - Effect.andThen( - getRC, - (ctx) => - f.pipe( - Effect.withSpan(name, { - ...options, - attributes: { ...spanAttributes({ ...ctx, name: NonEmptyString255(name) }), ...options?.attributes } - }, { - captureStackTrace: options?.captureStackTrace ?? false - }), - // TODO: false - // request context info is picked up directly in the logger for annotations. - Effect.withLogSpan(name) - ) - ) - -export interface SetupRequestOptions { - readonly withTransaction?: boolean -} - -export const requestStateLayer = RequestScopedDependencies.layer(ContextMapContainer, DataDependencyRecorder) - -// Build `layer` against the ambient (request) scope rather than a sub-scope of the -// returned Effect. Required when the returned value is a streaming HttpServerResponse: -// the response body keeps producing chunks (and using layer-provided state) after the -// Effect returns, so a sub-scope would close too early and run finalizers mid-stream. -export const provideOnRequestScope = - (layer: Layer.Layer) => (self: Effect.Effect) => - Effect.gen(function*() { - const requestScope = yield* Effect.scope - // Fresh MemoMap per request: `Layer.buildWithScope` would otherwise reuse - // the ambient MemoMap living on the HTTP server fiber, sharing the built - // value (e.g. ContextMap) across every request handled by that server. - const memoMap = yield* Layer.makeMemoMap - const ctx = yield* Layer.buildWithMemoMap(layer, memoMap, requestScope) - return yield* Effect.provide(self, ctx) - }) - -export const setupRequestContextFromCurrent = - (name = "request", options?: Tracer.SpanOptions & SetupRequestOptions) => (self: Effect.Effect) => - self - .pipe( - options?.withTransaction === true ? withSqlTransaction : (_) => _, - withRequestSpan(name, options), - Effect.provide(requestStateLayer, { local: true }) - ) - -// Streaming variant: binds ContextMapContainer to the ambient (request) scope so its -// finalizer (clear()) runs only after the response body is fully drained, not when the -// outer Effect returns its HttpServerResponse value. Use for handlers that return a -// streaming HttpServerResponse (e.g. SSE) — see RequestContextMiddleware for context. -export const setupStreamingRequestContextFromCurrent = - (name = "request", options?: Tracer.SpanOptions & SetupRequestOptions) => (self: Effect.Effect) => - self.pipe( - options?.withTransaction === true ? withSqlTransaction : (_) => _, - withRequestSpan(name, options), - provideOnRequestScope(requestStateLayer) - ) - -// TODO: consider integrating Effect.withParentSpan -export function setupRequestContext( - self: Effect.Effect, - requestContext: RequestContext, - options?: SetupRequestOptions -) { - const layer = Layer.mergeAll( - requestStateLayer, - Layer.succeed(LocaleRef, requestContext.locale), - Layer.succeed(storeId, requestContext.namespace) - ) - return self - .pipe( - options?.withTransaction === true ? withSqlTransaction : (_) => _, - withRequestSpan(requestContext.name), - Effect.provide(layer, { local: true }) - ) -} - -export function setupRequestContextWithCustomSpan( - self: Effect.Effect, - requestContext: RequestContext, - name: string, - options?: Tracer.SpanOptions & SetupRequestOptions -) { - const layer = Layer.mergeAll( - requestStateLayer, - Layer.succeed(LocaleRef, requestContext.locale), - Layer.succeed(storeId, requestContext.namespace) - ) - return self - .pipe( - options?.withTransaction === true ? withSqlTransaction : (_) => _, - withRequestSpan(name, options), - Effect.provide(layer, { local: true }) - ) -} diff --git a/packages/effect-app/src/toast.ts b/packages/effect-app/src/toast.ts deleted file mode 100644 index d9b674db4..000000000 --- a/packages/effect-app/src/toast.ts +++ /dev/null @@ -1,54 +0,0 @@ -import * as Context from "./Context.ts" -import { accessEffectFn } from "./Context.ts" -import * as Effect from "./Effect.ts" -import * as Option from "./Option.ts" - -export type ToastId = string | number -export type ToastOpts = { id?: ToastId; timeout?: number; groupId?: string; requestId?: string } -export type ToastOptsInternal = { id?: ToastId | null; timeout?: number; groupId?: string; requestId?: string } - -export type UseToast = () => { - error: (this: void, message: string, options?: ToastOpts) => ToastId - warning: (this: void, message: string, options?: ToastOpts) => ToastId - success: (this: void, message: string, options?: ToastOpts) => ToastId - info: (this: void, message: string, options?: ToastOpts) => ToastId - dismiss: (this: void, id: ToastId) => void -} - -export class CurrentToastId extends Context.Opaque()("CurrentToastId") {} - -/** fallback to CurrentToastId when available unless id is explicitly set to a value or null */ -export const wrap = (toast: ReturnType) => { - const wrap = (toastHandler: (message: string, options?: ToastOpts) => ToastId) => { - return (message: string, options?: ToastOptsInternal) => - Effect.serviceOption(CurrentToastId).pipe( - Effect.flatMap((currentToast) => - Effect.sync(() => { - const { id: _id, ...rest } = options ?? {} - const id = _id !== undefined - ? _id ?? undefined - : Option.getOrUndefined(Option.map(currentToast, (_) => _.toastId)) - // when id is undefined, we may end up with no toast at all.. - return toastHandler(message, id !== undefined ? { ...rest, id } : rest) - }) - ) - ) - } - return { - error: wrap(toast.error), - info: wrap(toast.info), - success: wrap(toast.success), - warning: wrap(toast.warning), - dismiss: (toastId: ToastId) => Effect.sync(() => toast.dismiss(toastId)) - } -} - -type ToastShape = ReturnType - -export class Toast extends Context.Opaque()("Toast") { - static readonly error = accessEffectFn(this, "error") - static readonly info = accessEffectFn(this, "info") - static readonly success = accessEffectFn(this, "success") - static readonly warning = accessEffectFn(this, "warning") - static readonly dismiss = accessEffectFn(this, "dismiss") -} diff --git a/packages/effect-app/src/transform.ts b/packages/effect-app/src/transform.ts deleted file mode 100644 index 0855cb3a0..000000000 --- a/packages/effect-app/src/transform.ts +++ /dev/null @@ -1,80 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import type { NonEmptyReadonlyArray } from "effect/Array" -import * as Option from "effect/Option" -import type { Misc, Union } from "ts-toolbelt" -import type * as SET from "./Set.ts" - -// type SomeObject = { -// 0: Option.Option -// a: { -// b: Option.Option -// g: Option.Option> -// h: Option.Option<{ i: Option.Option }> -// } -// c: { d: Array }>> } -// } -// type test0 = Transform -// type test1 = Transform - -type OptOf = Union.Exclude< - A extends Option.Some ? X | null : A, - Option.None -> -// eslint-disable-next-line @typescript-eslint/no-explicit-any - -export type TransformRoot = O extends Option.Option ? Transform> - : Transform -export type Transform = O extends Misc.BuiltIn | Misc.Primitive ? O - : { - [K in keyof O]: OptOf extends infer X ? X extends (infer Y)[] ? OptOf>[] - : X extends NonEmptyReadonlyArray ? NonEmptyReadonlyArray>> - : X extends SET.Set ? SET.Set>> - : X extends readonly (infer Y)[] ? readonly OptOf>[] - : Transform - : never - } - -export const encodeOptsAsNullable = (root: T): TransformRoot => encodeOptsAsNullable_(root, new Map()) - -const encodeOptsAsNullable_ = (value: any, cacheMap: Map): any => { - const cacheEntry = cacheMap.get(value) - if (cacheEntry) { - return cacheEntry - } - - if (Array.isArray(value)) { - const newAr: typeof value = [] - cacheMap.set(value, newAr) - value.forEach((x) => newAr.push(encodeOptsAsNullable_(x, cacheMap))) - return newAr - } - - if ( - value instanceof Date - || typeof value === "function" - || (typeof value === "object" && value !== null && "then" in value && typeof value.then === "function") - ) { - return value - } - - if (value instanceof Set) { - const newValue = [...value] - cacheMap.set(value, newValue) - return newValue - } - - if (value instanceof Object) { - if (value._tag === "Some" || value._tag === "None") { - const v = value as Option.Option - return encodeOptsAsNullable_(Option.getOrNull(v), cacheMap) - } - const newObj = {} as Record - cacheMap.set(value, newObj) - - Object.keys(value).forEach((key) => { - newObj[key] = encodeOptsAsNullable_(value[key], cacheMap) - }) - return newObj - } - return value -} diff --git a/packages/effect-app/src/utils.ts b/packages/effect-app/src/utils.ts deleted file mode 100644 index ed4613820..000000000 --- a/packages/effect-app/src/utils.ts +++ /dev/null @@ -1,901 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-function-type */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/no-redundant-type-constituents */ -import * as Cause from "effect/Cause" -import * as Effect from "effect/Effect" -import * as Exit from "effect/Exit" -import * as Fiber from "effect/Fiber" -import { dual } from "effect/Function" -import * as Option from "effect/Option" -import { isFunction } from "effect/Predicate" -import * as Record from "effect/Record" -import * as Result from "effect/Result" -import { identity, pipe } from "./Function.ts" -import type { DeepMutable, Equals, Mutable } from "./Types.ts" - -// codegen:start {preset: barrel, include: ./utils/*.ts, nodir: false } -export * from "./utils/effectify.ts" -export * from "./utils/extend.ts" -export * from "./utils/gen.ts" -export * from "./utils/logger.ts" -export * from "./utils/logLevel.ts" -// codegen:end - -export * from "effect/Utils" - -export const cloneTrait = Symbol.for("clone-trait") -export interface Clone { - [cloneTrait](this: this, that: any): this -} - -export const unsafeRight = (ei: Result.Result) => { - if (Result.isFailure(ei)) { - console.error(ei.failure) - throw ei.failure - } - return ei.success -} - -export const unsafeSome = (makeErrorMessage: () => string) => (o: Option.Option) => { - if (Option.isNone(o)) { - throw new Error(makeErrorMessage()) - } - return o.value -} - -export function toString(v: unknown) { - return `${v}` -} - -export const typedKeysOf = (obj: T) => Object.keys(obj) as (keyof T)[] -// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion -export const typedValuesOf = (obj: T) => Object.values(obj) as ValueOf[] -type ValueOf = T[keyof T] - -export type Constructor = { new(...args: any[]): T } -export type ThenArg = T extends Promise ? U - : T extends (...args: any[]) => Promise ? V - : T - -/** - * @deprecated TODO: does not filter optional fields! - */ -type NoUndefinedField = { [P in keyof T]: Exclude } -export function dropUndefinedT>( - input: A -): NoUndefinedField { - const newR = pipe( - input, - Record.filter((x): x is A => x !== undefined) - ) - return newR as any -} - -type IsOptional, K extends keyof T> = {} extends Pick ? true : false - -type WithUndefined> = { - [K in keyof T]: IsOptional extends true ? T[K] | undefined : T[K] -} - -type WithUndefinedRecursive> = { - [K in keyof T]: WithUndefinedRecursive extends infer $RTK - ? IsOptional extends true ? $RTK | undefined : $RTK - : never -} - -/** a version of @see dropUndefinedT that keeps support for go to definition, auto completion, and documentation of fields! */ -export function dropUndefinedT2>() { - return ( - input: WithUndefined - ): Desired => { - const newR = pipe( - input as any, - Record.filter((x): x is Desired => x !== undefined) - ) - return newR as any - } -} - -/** - * A recursive version of @see dropUndefinedT that preserves IDE support for - * go-to-definition, auto-completion, and field documentation. - * - * Note: This utility does not physically remove `undefined` fields at runtime. - * It provides type-level compatibility with libraries that use `prop?: type` - * syntax. Before the introduction of `exactOptionalPropertyTypes`, this syntax - * implicitly allowed `undefined` values. Libraries that adopted `prop?: type` - * before this flag was introduced still accept `undefined` at runtime. - */ - -export function dropUndefinedRec>() { - return ( - input: WithUndefinedRecursive - ): Desired => { - // doesn't drop for real - return input as any - } -} - -export type Dictionary = { - readonly [P in string]: T -} - -export function dropUndefined( - input: Dictionary -): Dictionary { - const newR = pipe( - input, - Record.filter((x): x is A => x !== undefined) - ) - return newR -} - -type GetTag = T extends { _tag: infer K } ? K : never -export const isOfType = (tag: GetTag) => (e: { _tag: string }): e is T => e._tag === tag - -export function capitalize(string: T): Capitalize { - return (string.charAt(0).toUpperCase() + string.slice(1)) as Capitalize -} - -export function uncapitalize(string: T): Uncapitalize { - return (string.charAt(0).toLowerCase() + string.slice(1)) as Uncapitalize -} - -export function pretty(o: unknown): string { - return JSON.stringify(o, undefined, 2) ?? "undefined" -} - -export type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ( - k: infer I -) => void ? I - : never - -// generally A | B is not assignable to A & B -export type IsUnion = [T] extends [UnionToIntersection] ? false : true - -export type EnforceNonEmptyRecord = keyof R extends never ? never : R - -export function intersect( - ...as: AS -): UnionToIntersection<{ [k in keyof AS]: AS[k] }[number]> { - return as.reduce((a: any, b: any) => Object.assign(a, b), {}) as any -} - -export type IsEqualTo = (() => T extends X ? 1 : 2) extends < - T ->() => T extends Y ? 1 : 2 ? true - : false - -export const unifyIndex = Symbol() -export type unifyIndex = typeof unifyIndex - -export interface UnifiableIndexed<_X> {} -export type UnifiableIndexedURI = keyof UnifiableIndexed - -export interface Unifiable { - // Sync: [X] extends [Sync] ? Sync : never - // Effect: [X] extends [Effect] - // ? [X] extends [Sync] - // ? never - // : Effect.Effect - // : never - Unify: [X] extends [{ readonly [unifyIndex]: infer K }] ? K extends UnifiableIndexedURI ? UnifiableIndexed[K] - : never - : never -} - -export type Unify = Unifiable[keyof Unifiable] extends never ? X - : Unifiable[keyof Unifiable] - -// forked from https://github.com/Alorel/typescript-lazy-get-decorator - -type DecoratorReturn = PropertyDescriptor | NewDescriptor - -function decorateNew( - inp: NewDescriptor, - setProto: boolean, - makeNonConfigurable: boolean, - resultSelector: ResultSelectorFn -): NewDescriptor { - const out: NewDescriptor = Object.assign({}, inp) - if (out.descriptor) { - out.descriptor = Object.assign({}, out.descriptor) - } - const actualDesc: PropertyDescriptor = out.descriptor || /* istanbul ignore next */ out - - const originalMethod = validateAndExtractMethodFromDescriptor(actualDesc) - const isStatic = inp.placement === "static" - - actualDesc.get = function(this: any): any { - return getterCommon( - isStatic ? this : Object.getPrototypeOf(this), - out.key, - isStatic, - !!actualDesc.enumerable, - originalMethod, - this, - // eslint-disable-next-line prefer-rest-params - arguments, - setProto, - makeNonConfigurable, - resultSelector - ) - } - - return out -} - -function decorateLegacy( - target: any, - key: PropertyKey, - descriptor: PropertyDescriptor | undefined, - setProto: boolean, - makeNonConfigurable: boolean, - // tslint:enable:bool-param-default - resultSelector: ResultSelectorFn -): PropertyDescriptor { - /* istanbul ignore if */ - if (!descriptor) { - descriptor = Object.getOwnPropertyDescriptor(target, key) - if (!descriptor) { - const e = Object.assign(new Error("@LazyGetter is unable to determine the property descriptor"), { - $key: key, - $target: target - }) - throw e - } - } - - const originalMethod = validateAndExtractMethodFromDescriptor(descriptor) - - return Object.assign({}, descriptor, { - get(this: any): any { - return getterCommon( - target, - key, - Object.getPrototypeOf(target) === Function.prototype, - !!descriptor.enumerable, - originalMethod, - this, - // eslint-disable-next-line prefer-rest-params - arguments, - setProto, - makeNonConfigurable, - resultSelector - ) - } - }) -} - -/** Signifies that the modified property descriptor can be reset to its original state */ -interface ResettableDescriptor { - /** - * Restore the property descriptor on the given class instance or prototype and re-apply the lazy getter. - * @param on The class instance or prototype - */ - reset(on: any): void -} - -/** ES7 proposal descriptor, tweaked for Babel */ -interface NewDescriptor extends PropertyDescriptor { - descriptor?: PropertyDescriptor - - key: PropertyKey - - kind: string - - placement: string -} - -/** A filter function that must return true for the value to cached */ -export type ResultSelectorFn = (v: any) => boolean - -function defaultFilter(): boolean { - return true -} - -function validateAndExtractMethodFromDescriptor(desc: PropertyDescriptor): Function { - // eslint-disable-next-line @typescript-eslint/unbound-method - const originalMethod = desc.get - - if (!originalMethod) { - throw new Error("@LazyGetter can only decorate getters!") - } else if (!desc.configurable) { - throw new Error("@LazyGetter target must be configurable") - } - - return originalMethod -} - -function getterCommon( // tslint:disable-line:parameters-max-number - target: any, - key: PropertyKey, - isStatic: boolean, - enumerable: boolean, - originalMethod: Function, - thisArg: any, - args: IArguments, - setProto: boolean, - makeNonConfigurable: boolean, - resultSelector: ResultSelectorFn -): any { - const value = originalMethod.apply(thisArg, args) - - if (resultSelector(value)) { - const newDescriptor: PropertyDescriptor = { - configurable: !makeNonConfigurable, - enumerable, - value - } - - if (isStatic || setProto) { - Object.defineProperty(target, key, newDescriptor) - } - - if (!isStatic) { - Object.defineProperty(thisArg, key, newDescriptor) - } - } - - return value -} - -/** - * Evaluate the getter function and cache the result - * @param [setProto=false] Set the value on the class prototype as well. Only applies to non-static getters. - * @param [makeNonConfigurable=false] Set to true to make the resolved property non-configurable - * @param [resultSelector] A filter function that must return true for the value to cached - * @return A decorator function - */ -export function LazyGetter( - setProto = false, - makeNonConfigurable = false, - resultSelector: ResultSelectorFn = defaultFilter -): MethodDecorator & ResettableDescriptor { - let desc: PropertyDescriptor - let prop: PropertyKey - let args: [targetOrDesc: any, key: PropertyKey | undefined, descriptor: PropertyDescriptor | undefined] | undefined - let isLegacy: boolean - - function decorator( - targetOrDesc: any, - key: PropertyKey | undefined, - descriptor: PropertyDescriptor | undefined - ): DecoratorReturn { - args = [targetOrDesc, key, descriptor] - if (key === undefined) { - if (typeof desc === "undefined") { - const newDescriptor = targetOrDesc as NewDescriptor - isLegacy = false - prop = newDescriptor.key - desc = Object.assign( - {}, - newDescriptor.descriptor - /* istanbul ignore next */ || targetOrDesc - ) - } - - return decorateNew(targetOrDesc, setProto, makeNonConfigurable, resultSelector) - } else { - if (typeof desc === "undefined") { - isLegacy = true - prop = key - desc = Object.assign( - {}, - descriptor - /* istanbul ignore next */ || Object.getOwnPropertyDescriptor( - targetOrDesc, - key - ) - ) - } - - return decorateLegacy( - targetOrDesc, - key, - descriptor, - setProto, - makeNonConfigurable, - resultSelector - ) - } - } - - decorator.reset = setProto - ? thrower - : (on: any): void => { - if (!on) { - throw new Error("Unable to restore descriptor on an undefined target") - } - if (!desc) { - throw new Error( - "Unable to restore descriptor. Did you remember to apply your decorator to a method?" - ) - } - if (!args) { - throw new Error("Unable to restore descriptor before applying the decorator.") - } - // Restore descriptor to its original state - Object.defineProperty(on, prop, desc) - const ret = decorator.apply(null, args) - const restoredDescriptor = isLegacy ? ret : "descriptor" in ret && ret.descriptor ? ret.descriptor : ret - Object.defineProperty(on, prop, restoredDescriptor) - } - - return decorator -} - -function thrower(): never { - throw new Error("This decoration modifies the class prototype and cannot be reset.") -} - -export type RefinementWithIndex = (i: I, a: A) => a is B - -export type PredicateWithIndex = (i: I, a: A) => boolean - -export type Erase = R & K extends K & infer R1 ? R1 : R - -/** from ts-toolbelt, minimal port of Compute */ - -export type Depth = "flat" | "deep" - -type Errors = Error -// | EvalError -// | RangeError -// | ReferenceError -// | SyntaxError -// | TypeError -// | URIError - -type Numeric = - // | Number - // | BigInt // not needed - // | Math - Date - -type Textual = - // | String - RegExp - -type Arrays = - // | Array - // | ReadonlyArray - | Int8Array - | Uint8Array - | Uint8ClampedArray - | Int16Array - | Uint16Array - | Int32Array - | Uint32Array - | Float32Array - | Float64Array -// | BigInt64Array -// | BigUint64Array - -type Maps = - // | Map - // | Set - | ReadonlyMap - | ReadonlySet - | WeakMap - | WeakSet - -type Structures = - | ArrayBuffer - // | SharedArrayBuffer - // | Atomics - | DataView -// | JSON - -type Abstractions = Function | Promise | Generator -// | GeneratorFunction - -type WebAssembly = never - -export type BuiltInObject = - | Errors - | Numeric - | Textual - | Arrays - | Maps - | Structures - | Abstractions - | WebAssembly - -export type ComputeRaw = A extends Function ? A - : - & { - [K in keyof A]: A[K] - } - & {} - -export type ComputeFlat = A extends BuiltInObject ? A - : - & { - [K in keyof A]: A[K] - } - & {} - -export type ComputeDeep = A extends BuiltInObject ? A - : - & { - [K in keyof A]: ComputeDeep - } - & {} - -export type Compute = { - flat: ComputeFlat - deep: ComputeDeep -}[depth] - -///// - -export const LazySymbol = Symbol("lazy") - -interface Lazy { - [LazySymbol]: Record -} - -export function lazyGetter(creator: (target: T) => T2) { - const key = Symbol(creator.name) - const f = (target: T): T2 => { - let lazy = (target as unknown as Lazy)[LazySymbol] - if (!lazy) { - lazy = {} - Object.defineProperty(target, LazySymbol, { enumerable: false, value: lazy }) - } else if (lazy[key]) { - return lazy[key] - } - const value = creator(target) - lazy[key] = value - return value - } - Object.defineProperty(f, "name", { - enumerable: false, - value: `Lazy<${creator.name}>` - }) - return f -} - -export function exhaustiveMatch() { - return any>>(handlers: Out) => (t: T): ReturnType => handlers[t](t) -} - -export function exhaustiveMatch_(t: T) { - return any>>(handlers: Out): ReturnType => handlers[t](t) -} - -export function assertUnreachable(x: never): never { - throw new Error("Unknown case " + x) -} - -export type OptPromise any> = ( - ...args: Parameters -) => Promise> | ReturnType - -export function access(t: Record) { - return (key: T) => t[key] -} - -export function todayAtUTCNoon() { - const localDate = new Date() - const utcDateAtNoon = Date.UTC( - localDate.getFullYear(), - localDate.getMonth(), - localDate.getDate(), - 12 - ) - return new Date(utcDateAtNoon) -} - -function anyOp_$(self: T) { - return { - get subject() { - return self - } - } -} - -export function anyOp$(self: T): AnyOps { - return anyOp_$(self) -} - -export interface AnyOps { - subject: T -} - -export const clone = dual< - (f: NoInfer) => (self: A) => A, - (self: A, f: A) => A ->(2, (self, f) => { - if (cloneTrait in (self as any)) { - const selfWithClone = self as typeof self & Clone - return selfWithClone[cloneTrait](f) - } - return Object.setPrototypeOf(f, Object.getPrototypeOf(self)) as typeof self -}) - -export const copy = dual< - { - (f: (a: A) => Partial>): (self: A) => A - (f: Partial>): (self: A) => A - }, - { - (self: A, f: (a: A) => Partial): A - (self: A, f: Partial): A - } ->(2, (self: A, f: Partial | ((a: A) => Partial)) => clone(self, { ...self, ...(isFunction(f) ? f(self) : f) })) - -export type CopyOriginU any> = - & { - [K in keyof U & keyof InstanceType]?: U[K] - } - & {} - -export type CopyOriginRet = - & { - [K in keyof A | keyof U]: K extends keyof U ? U[K] : A[K & keyof A] - } - & {} - -export type CopyOriginSelf = Equals<{}, U> extends true - ? Equals extends true ? `updates argument is empty or contains only extra properties` - : A - : A - -export interface StructuralCopyOrigin { - >( - f: (a: A) => - & { - [K in keyof U & keyof Self]?: U[K] - } - & {} - ): (self: CopyOriginSelf) => CopyOriginRet - >( - updates: - & { - [K in keyof U & keyof Self]?: U[K] - } - & {} - ): (self: CopyOriginSelf) => CopyOriginRet - >( - self: CopyOriginSelf, - f: (a: A) => - & { - [K in keyof U & keyof Self]?: U[K] - } - & {} - ): CopyOriginRet - >( - self: CopyOriginSelf, - updates: - & { - [K in keyof U & keyof Self]?: U[K] - } - & {} - ): CopyOriginRet -} - -// just one input param: the convention is that the ctor takes an object -// containing the properties of the value (I can't put object there as type because of contravariance) -/** - * By design this does not return `Self` directly. - * - * The return type is computed from `Self` and the update payload so callers can - * expose an explicit structural return type that remains assignable to `Self`. - */ -export const copyOrigin = any>(ctor: Ctor) => - dual< - { - , U extends Partial>>( - f: (a: A) => CopyOriginU - ): (self: CopyOriginSelf) => CopyOriginRet - , U extends Partial>>( - updates: CopyOriginU - ): (self: CopyOriginSelf) => CopyOriginRet - }, - { - , U extends Partial>>( - self: CopyOriginSelf, - f: (a: A) => CopyOriginU - ): CopyOriginRet - , U extends Partial>>( - self: CopyOriginSelf, - updates: CopyOriginU - ): CopyOriginRet - } - >( - 2, - , U extends Partial>>( - self: Equals<{}, U> extends true ? `updates argument is empty or contains only extra properties` : A, - f: - | CopyOriginU - | ((a: A) => CopyOriginU) - ): CopyOriginRet => { - const o = { ...self, ...(isFunction(f) ? f(self as any) : f) } - - if (cloneTrait in (self as any)) { - const selfWithClone = self as typeof self & Clone - return selfWithClone[cloneTrait](o) - } - - return new ctor(o) - } - ) - -export function debug(a: AnyOps, name: string) { - let r: string | A = a.subject - try { - r = pretty(a.subject) - } catch { /* empty */ } - return Effect - .logDebug("print") - .pipe( - Effect.annotateLogs(name, `${r}`), - Effect - .map(() => a.subject) - ) -} - -export function debugUnsafe(a: AnyOps, name: string) { - console.log(name, a.subject) - return a.subject -} - -export function spread< - // eslint-disable-next-line @typescript-eslint/no-explicit-any - Fields extends Record, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - NewProps ->(fields: Fields, fnc: (fields: Fields) => NewProps) { - return fnc(fields) -} - -export function spreadS< - // eslint-disable-next-line @typescript-eslint/no-explicit-any - Fields extends Record ->(fields: Fields, fnc: (fields: Fields) => Fields) { - return fnc(fields) -} - -export function makeAzureFriendly(path: string) { - return path.replace(/\//g, "___SL@SH___") -} - -export function undoAzureFriendly(path: T): T { - return path.replace(/___SL@SH___/g, "/") as T -} - -export function arrayMove( - arrInput: readonly T[], - oldIndex: number, - newIndex: number -) { - const arr: (T | undefined)[] = [...arrInput] - while (oldIndex < 0) { - oldIndex += arr.length - } - while (newIndex < 0) { - newIndex += arr.length - } - if (newIndex >= arr.length) { - let k = newIndex - arr.length + 1 - while (k--) { - arr.push(undefined) - } - } - arr.splice(newIndex, 0, arr.splice(oldIndex, 1)[0]) - return arr -} - -export function arrayMoveDropUndefined( - arrInput: readonly (T | undefined)[], - oldIndex: number, - newIndex: number -): T[] { - return arrayMove(arrInput, oldIndex, newIndex).filter((x): x is T => x !== undefined) -} - -export function arMoveElDropUndefined(el: T, newIndex: number) { - return (arrInput: ReadonlyArray): Option.Option> => { - const ar = [...arrInput] - const index = ar.findIndex((x) => x === el) - if (index === -1) { - return Option.none() - } - return Option.some(arrayMoveDropUndefined(ar, index, newIndex)) - } -} - -export function setMoveElDropUndefined(el: T, newIndex: number) { - return (arrInput: ReadonlySet): Option.Option> => - pipe([...arrInput], arMoveElDropUndefined(el, newIndex), Option.map((ar) => new Set(ar))) -} - -type RemoveNonArray = T extends readonly any[] ? T : never -export function isNativeTuple(a: A): a is RemoveNonArray { - return Array.isArray(a) -} - -export const mutable: { (a: A, deep: true): DeepMutable; (a: A): Mutable } = identity - -/** - * Recursively removes all elements assignable to type `E` from tuple `T`. - * - * @example - * ```typescript - * type Mixed = [1, "hello", 2, "world", 3] - * type Numbers = ExcludeFromTuple - * // Result: [1, 2, 3] - * ``` - */ -export type ExcludeFromTuple = T extends [infer F, ...infer R] - ? [F] extends [E] ? ExcludeFromTuple - : [F, ...ExcludeFromTuple] - : [] - -export const addAbortToRuntimeFiber = (fiber: Fiber.Fiber, signal: AbortSignal) => { - const abort = () => Effect.runSync(Fiber.interrupt(fiber)) - if (signal.aborted) { - abort() - return fiber - } - signal.addEventListener("abort", abort) - return fiber -} - -export const runtimeFiberAsPromise = (fiber: Fiber.Fiber, signal?: AbortSignal) => { - if (signal) addAbortToRuntimeFiber(fiber, signal) - return new Promise((resolve, reject) => - fiber.addObserver((exit) => { - if (Exit.isSuccess(exit)) { - resolve(exit.value) - } else { - // eslint-disable-next-line - reject(Cause.squash(exit.cause)) - } - }) - ) -} - -// unifies any input to be an effect. -export const wrapEffect = >( - m: ((...args: Args) => A) | ((...args: Args) => Effect.Effect) | I -) => { - if (typeof m === "function") { - return (...args: Args): Effect.Effect => { - const r = (m as any)(...args) - if (Effect.isEffect(r)) return r as Effect.Effect - return Effect.succeed(r) - } - } - return (): Effect.Effect => Effect.succeed(m) -} - -export type UnionToTuples = [T] extends [never] ? [] - : T extends any ? - | [T, ...UnionToTuples>] - | UnionToTuples> - : [] - -const genConstructor = (function*() {}).constructor - -/** - * @example - * ```ts - * import * as Utils from "effect/Utils" - * - * function* generatorFn() { - * yield 1 - * yield 2 - * } - * - * console.log(Utils.isGeneratorFunction(generatorFn)) // true - * console.log(Utils.isGeneratorFunction(() => {})) // false - * ``` - * - * @category predicates - * @since 3.11.0 - */ -export const isGeneratorFunction = (u: unknown): u is (...args: Array) => Generator => - isFunction(u) && u.constructor === genConstructor diff --git a/packages/effect-app/src/utils/effectify.ts b/packages/effect-app/src/utils/effectify.ts deleted file mode 100644 index 2aab5cad9..000000000 --- a/packages/effect-app/src/utils/effectify.ts +++ /dev/null @@ -1,260 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ - -import * as Effect from "effect/Effect" - -interface Callback { - (err: E, a?: A): void -} - -type ArgsWithCallback, E, A> = [...args: Args, cb: Callback] - -type WithoutNull = unknown extends A ? void : Exclude - -type Effectify = T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - (...args: ArgsWithCallback): infer _R3 - (...args: ArgsWithCallback): infer _R4 - (...args: ArgsWithCallback): infer _R5 - (...args: ArgsWithCallback): infer _R6 - (...args: ArgsWithCallback): infer _R7 - (...args: ArgsWithCallback): infer _R8 - (...args: ArgsWithCallback): infer _R9 - (...args: ArgsWithCallback): infer _R10 -} ? { - (...args: Args1): Effect.Effect, E> - (...args: Args2): Effect.Effect, E> - (...args: Args3): Effect.Effect, E> - (...args: Args4): Effect.Effect, E> - (...args: Args5): Effect.Effect, E> - (...args: Args6): Effect.Effect, E> - (...args: Args7): Effect.Effect, E> - (...args: Args8): Effect.Effect, E> - (...args: Args9): Effect.Effect, E> - (...args: Args10): Effect.Effect, E> - } - : T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - (...args: ArgsWithCallback): infer _R3 - (...args: ArgsWithCallback): infer _R4 - (...args: ArgsWithCallback): infer _R5 - (...args: ArgsWithCallback): infer _R6 - (...args: ArgsWithCallback): infer _R7 - (...args: ArgsWithCallback): infer _R8 - (...args: ArgsWithCallback): infer _R9 - } ? { - (...args: Args1): Effect.Effect, E> - (...args: Args2): Effect.Effect, E> - (...args: Args3): Effect.Effect, E> - (...args: Args4): Effect.Effect, E> - (...args: Args5): Effect.Effect, E> - (...args: Args6): Effect.Effect, E> - (...args: Args7): Effect.Effect, E> - (...args: Args8): Effect.Effect, E> - (...args: Args9): Effect.Effect, E> - } - : T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - (...args: ArgsWithCallback): infer _R3 - (...args: ArgsWithCallback): infer _R4 - (...args: ArgsWithCallback): infer _R5 - (...args: ArgsWithCallback): infer _R6 - (...args: ArgsWithCallback): infer _R7 - (...args: ArgsWithCallback): infer _R8 - } ? { - (...args: Args1): Effect.Effect, E> - (...args: Args2): Effect.Effect, E> - (...args: Args3): Effect.Effect, E> - (...args: Args4): Effect.Effect, E> - (...args: Args5): Effect.Effect, E> - (...args: Args6): Effect.Effect, E> - (...args: Args7): Effect.Effect, E> - (...args: Args8): Effect.Effect, E> - } - : T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - (...args: ArgsWithCallback): infer _R3 - (...args: ArgsWithCallback): infer _R4 - (...args: ArgsWithCallback): infer _R5 - (...args: ArgsWithCallback): infer _R6 - (...args: ArgsWithCallback): infer _R7 - } ? { - (...args: Args1): Effect.Effect, E> - (...args: Args2): Effect.Effect, E> - (...args: Args3): Effect.Effect, E> - (...args: Args4): Effect.Effect, E> - (...args: Args5): Effect.Effect, E> - (...args: Args6): Effect.Effect, E> - (...args: Args7): Effect.Effect, E> - } - : T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - (...args: ArgsWithCallback): infer _R3 - (...args: ArgsWithCallback): infer _R4 - (...args: ArgsWithCallback): infer _R5 - (...args: ArgsWithCallback): infer _R6 - } ? { - (...args: Args1): Effect.Effect, E> - (...args: Args2): Effect.Effect, E> - (...args: Args3): Effect.Effect, E> - (...args: Args4): Effect.Effect, E> - (...args: Args5): Effect.Effect, E> - (...args: Args6): Effect.Effect, E> - } - : T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - (...args: ArgsWithCallback): infer _R3 - (...args: ArgsWithCallback): infer _R4 - (...args: ArgsWithCallback): infer _R5 - } ? { - (...args: Args1): Effect.Effect, E> - (...args: Args2): Effect.Effect, E> - (...args: Args3): Effect.Effect, E> - (...args: Args4): Effect.Effect, E> - (...args: Args5): Effect.Effect, E> - } - : T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - (...args: ArgsWithCallback): infer _R3 - (...args: ArgsWithCallback): infer _R4 - } ? { - (...args: Args1): Effect.Effect, E> - (...args: Args2): Effect.Effect, E> - (...args: Args3): Effect.Effect, E> - (...args: Args4): Effect.Effect, E> - } - : T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - (...args: ArgsWithCallback): infer _R3 - } ? { - (...args: Args1): Effect.Effect, E> - (...args: Args2): Effect.Effect, E> - (...args: Args3): Effect.Effect, E> - } - : T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - } ? { - (...args: Args1): Effect.Effect, E> - (...args: Args2): Effect.Effect, E> - } - : T extends { - (...args: ArgsWithCallback): infer _R1 - } ? { - (...args: Args1): Effect.Effect, E> - } - : never - -type CallbackError = T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - (...args: ArgsWithCallback): infer _R3 - (...args: ArgsWithCallback): infer _R4 - (...args: ArgsWithCallback): infer _R5 - (...args: ArgsWithCallback): infer _R6 - (...args: ArgsWithCallback): infer _R7 - (...args: ArgsWithCallback): infer _R8 - (...args: ArgsWithCallback): infer _R9 - (...args: ArgsWithCallback): infer _R10 -} ? NonNullable - : T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - (...args: ArgsWithCallback): infer _R3 - (...args: ArgsWithCallback): infer _R4 - (...args: ArgsWithCallback): infer _R5 - (...args: ArgsWithCallback): infer _R6 - (...args: ArgsWithCallback): infer _R7 - (...args: ArgsWithCallback): infer _R8 - (...args: ArgsWithCallback): infer _R9 - } ? NonNullable - : T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - (...args: ArgsWithCallback): infer _R3 - (...args: ArgsWithCallback): infer _R4 - (...args: ArgsWithCallback): infer _R5 - (...args: ArgsWithCallback): infer _R6 - (...args: ArgsWithCallback): infer _R7 - (...args: ArgsWithCallback): infer _R8 - } ? NonNullable - : T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - (...args: ArgsWithCallback): infer _R3 - (...args: ArgsWithCallback): infer _R4 - (...args: ArgsWithCallback): infer _R5 - (...args: ArgsWithCallback): infer _R6 - (...args: ArgsWithCallback): infer _R7 - } ? NonNullable - : T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - (...args: ArgsWithCallback): infer _R3 - (...args: ArgsWithCallback): infer _R4 - (...args: ArgsWithCallback): infer _R5 - (...args: ArgsWithCallback): infer _R6 - } ? NonNullable - : T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - (...args: ArgsWithCallback): infer _R3 - (...args: ArgsWithCallback): infer _R4 - (...args: ArgsWithCallback): infer _R5 - } ? NonNullable - : T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - (...args: ArgsWithCallback): infer _R3 - (...args: ArgsWithCallback): infer _R4 - } ? NonNullable - : T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - (...args: ArgsWithCallback): infer _R3 - } ? NonNullable - : T extends { - (...args: ArgsWithCallback): infer _R1 - (...args: ArgsWithCallback): infer _R2 - } ? NonNullable - : T extends { - (...args: ArgsWithCallback): infer _R1 - } ? NonNullable - : never - -export const effectify: { - ) => any>(fn: F): Effectify> - ) => any, E>( - fn: F, - onError: (error: CallbackError, args: Parameters) => E - ): Effectify - ) => any, E, E2>( - fn: F, - onError: (error: CallbackError, args: Parameters) => E, - onSyncError: (error: unknown, args: Parameters) => E2 - ): Effectify -} = - // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type - ((fn: Function, onError?: (e: any, args: any) => any, onSyncError?: (e: any, args: any) => any) => - (...args: Array) => - Effect.callback((resume) => { - try { - fn(...args, (err: Error | null, result: A) => { - if (err) { - resume(Effect.fail(onError ? onError(err, args) : err)) - } else { - resume(Effect.succeed(result)) - } - }) - } catch (err) { - resume(onSyncError ? Effect.fail(onSyncError(err, args)) : Effect.die(err)) - } - })) as any diff --git a/packages/effect-app/src/utils/extend.ts b/packages/effect-app/src/utils/extend.ts deleted file mode 100644 index db453b731..000000000 --- a/packages/effect-app/src/utils/extend.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const extend = (a: T, ext: X) => { - Object.assign(a, ext) - return a as T & X -} - -export const extendM = (a: T, ext: (a: T) => X) => { - Object.assign(a, ext(a)) - return a as typeof a & X -} diff --git a/packages/effect-app/src/utils/gen.ts b/packages/effect-app/src/utils/gen.ts deleted file mode 100644 index e2bae01ce..000000000 --- a/packages/effect-app/src/utils/gen.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { type Effect } from "effect/Effect" - -export namespace EffectGenUtils { - export type Success = EG extends Effect ? A - // there could be a case where the generator function does not yield anything, so we need to handle that - : EG extends (..._: infer _3) => Generator ? A - // generators yield Effect values - : EG extends (..._: infer _3) => Generator, infer A, infer _2> ? A - : never - - export type Error = EG extends Effect ? E - // there could be a case where the generator function does not yield anything, so we need to handle that - : EG extends (..._: infer _3) => Generator ? never - // generators yield Effect values - : EG extends (..._: infer _3) => Generator, infer _A, infer _2> ? E - : never - - export type Context = EG extends Effect ? R - // there could be a case where the generator function does not yield anything, so we need to handle that - : EG extends (..._: infer _3) => Generator ? never - // generators yield Effect values - : EG extends (..._: infer _3) => Generator, infer _A, infer _2> ? R - : never -} diff --git a/packages/effect-app/src/utils/logLevel.ts b/packages/effect-app/src/utils/logLevel.ts deleted file mode 100644 index dba7d1e27..000000000 --- a/packages/effect-app/src/utils/logLevel.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type * as LogLevel from "effect/LogLevel" - -export const LogLevelToSentry = (level: LogLevel.LogLevel) => { - switch (level) { - case "Debug": - return "debug" as const - case "Info": - return "info" as const - case "Warn": - return "warning" as const - case "Error": - return "error" as const - case "Fatal": - return "fatal" as const - } - return "log" as const -} diff --git a/packages/effect-app/src/utils/logger.ts b/packages/effect-app/src/utils/logger.ts deleted file mode 100644 index 68c0f9ab6..000000000 --- a/packages/effect-app/src/utils/logger.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -import * as Effect from "effect/Effect" -import type * as LogLevel from "effect/LogLevel" -import * as Context from "../Context.ts" - -type Levels = "info" | "debug" | "warn" | "error" - -export class LogLevels extends Context.Reference("LogLevels", { - defaultValue: () => new Map() -}) {} - -export const makeLog = (namespace: string, defaultLevel: Levels = "warn") => { - const level = LogLevels.use((levels) => Effect.succeed(levels.get(namespace) ?? defaultLevel)) - const withLogNamespace = Effect.annotateLogs({ logNamespace: namespace }) - return { - logWarning: (...message: ReadonlyArray) => - Effect.flatMap(level, (l) => - l === "info" || l === "debug" || l === "warn" - ? Effect.logWarning(...message).pipe(withLogNamespace) - : Effect.void), - logError: (...message: ReadonlyArray) => Effect.logError(...message).pipe(withLogNamespace), - logFatal: (...message: ReadonlyArray) => Effect.logFatal(...message).pipe(withLogNamespace), - logInfo: (...message: ReadonlyArray) => - Effect.flatMap( - level, - (l) => l === "info" || l === "debug" ? Effect.logInfo(...message).pipe(withLogNamespace) : Effect.void - ), - logDebug: (...message: ReadonlyArray) => - Effect.flatMap(level, (l) => l === "debug" ? Effect.logDebug(...message).pipe(withLogNamespace) : Effect.void), - // for now always log - logWithLevel: (level: LogLevel.Severity, ...message: ReadonlyArray) => - Effect.logWithLevel(level)(...message).pipe(withLogNamespace) - } -} diff --git a/packages/effect-app/src/validation.ts b/packages/effect-app/src/validation.ts deleted file mode 100644 index 24f9ade4b..000000000 --- a/packages/effect-app/src/validation.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { Predicate } from "./Function.ts" - -export const all_ = (v: T, ...a: Predicate[]) => !a.some((x) => !x(v)) -export const all = (...a: Predicate[]) => (v: T) => all_(v, ...a) - -export const maxN = (max: number) => (v: number) => v <= max -export const minN = (min: number) => (v: number) => v >= min - -export const max = (max: number) => { - const f = maxN(max) - return (v: { length: number }) => f(v.length) -} -export const min = (min: number) => { - const f = minN(min) - return (v: { length: number }) => f(v.length) -} - -export * from "./validation/validators.ts" diff --git a/packages/effect-app/src/validation/validators.ts b/packages/effect-app/src/validation/validators.ts deleted file mode 100644 index f2ec83f69..000000000 --- a/packages/effect-app/src/validation/validators.ts +++ /dev/null @@ -1,31 +0,0 @@ -// Not importing from /es/lib because they are .js files and bundlers probably assume they're cjs :( -import isEmail, { type IsEmailOptions } from "validator/lib/isEmail.js" - -// Source https://emailregex.com/ -// eslint-disable-next-line no-control-regex -// const EMAIL_REGEX = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/ - -// allow for "/", "+", "-", " .js" and digits -const PHONE_REGEX = /^\+?[\d-/ ]*$/ - -const PHONE_LENGTH = 7 - -/** - * Validate emails according to RFC 5322 - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const isValidEmail = isEmail as any as (str: string, options?: IsEmailOptions) => boolean - -/** - * Validates that phone number contains at least 7 numbers. - * Allowed characters are [0-1] "/", "+", "-", " .js" - */ -export const isValidPhone = (phone: string): boolean => { - const isValidPhone = PHONE_REGEX.test(phone) - if (!isValidPhone) return false - - const isValidLength = phone.split("").filter((c) => !isNaN(Number(c))).length >= PHONE_LENGTH - if (!isValidLength) return false - - return true -} diff --git a/packages/effect-app/src/withToast.ts b/packages/effect-app/src/withToast.ts deleted file mode 100644 index 9b0b6bb73..000000000 --- a/packages/effect-app/src/withToast.ts +++ /dev/null @@ -1,133 +0,0 @@ -import * as Cause from "effect/Cause" -import * as Fiber from "effect/Fiber" -import * as Context from "./Context.ts" -import * as Effect from "./Effect.ts" -import * as Layer from "./Layer.ts" -import type * as Option from "./Option.ts" -import * as S from "./Schema.ts" -import { CurrentToastId, Toast, type ToastId } from "./toast.ts" -import { wrapEffect } from "./utils.ts" - -export interface ToastOptions, WaiR, SucR, ErrR> { - stableToastId?: undefined | string | ((...args: Args) => string | undefined) - timeout?: number - showSpanInfo?: false - groupId?: string - onWaiting: - | string - | ((...args: Args) => string | null) - | null - | (( - ...args: Args - ) => Effect.Effect) - onSuccess: - | string - | ((a: A, ...args: Args) => string | null) - | null - | (( - a: A, - ...args: Args - ) => Effect.Effect) - onFailure: - | string - | (( - error: Option.Option, - ...args: Args - ) => string | { level: "warn" | "error"; message: string }) - | (( - error: Option.Option, - ...args: Args - ) => Effect.Effect) -} - -// @effect-diagnostics-next-line missingEffectServiceDependency:off -export class WithToast extends Context.Service()("WithToast", { - make: Effect.gen(function*() { - const toast = yield* Toast - return ( - options: ToastOptions - ) => - Effect.fnUntraced(function*(self: Effect.Effect, ...args: Args) { - const baseTimeout = options.timeout ?? 3_000 - - const stableToastId = typeof options.stableToastId === "function" - ? options.stableToastId(...args) - : options.stableToastId - - const requestId: string = yield* Effect.currentSpan.pipe( - Effect.map((span) => span.traceId), - Effect.orElseSucceed(() => S.StringId.make()) - ) - const groupId = options.groupId - const meta = { ...(groupId !== undefined ? { groupId } : {}), requestId } - - const t = yield* wrapEffect(options.onWaiting)(...args) - const toastId: ToastId | undefined = t === null - ? stableToastId - : stableToastId ?? `wait-${Math.random().toString(36).slice(2)}` - - const waitingFiber = t === null ? undefined : yield* Effect.forkChild( - Effect.sleep("1 seconds").pipe( - Effect.andThen(toast.info(t, { id: toastId!, timeout: Infinity, ...meta })) - ) - ) - const interruptWaiting = waitingFiber ? Fiber.interrupt(waitingFiber) : Effect.void - - return yield* self.pipe( - Effect.tap(Effect.fnUntraced(function*(a) { - yield* interruptWaiting - const t = yield* wrapEffect(options.onSuccess)(a, ...args) - if (t === null) { - return - } - yield* toast.success( - t, - toastId !== undefined - ? { id: toastId, timeout: baseTimeout, ...meta } - : { timeout: baseTimeout, ...meta } - ) - })), - Effect.tapCause(Effect.fnUntraced(function*(cause) { - yield* interruptWaiting - yield* Effect.logDebug( - "WithToast - caught error cause: " + Cause.squash(cause), - Cause.hasInterruptsOnly(cause), - cause - ) - - if (Cause.hasInterruptsOnly(cause)) { - if (toastId) yield* toast.dismiss(toastId) - return - } - - const spanInfo = options.showSpanInfo !== false - ? yield* Effect.currentSpan.pipe( - Effect.map((span) => `\nTrace: ${span.traceId}\nSpan: ${span.spanId}`), - Effect.orElseSucceed(() => "") - ) - : "" - - const t = yield* wrapEffect(options.onFailure)(Cause.findErrorOption(cause), ...args) - const opts = { timeout: baseTimeout * 2, ...meta } - - if (typeof t === "object") { - const message = t.message + spanInfo - return t.level === "warn" - ? yield* toast.warning(message, toastId !== undefined ? { ...opts, id: toastId } : opts) - : yield* toast.error(message, toastId !== undefined ? { ...opts, id: toastId } : opts) - } - yield* toast.error(t + spanInfo, toastId !== undefined ? { ...opts, id: toastId } : opts) - }, Effect.uninterruptible)), - toastId !== undefined ? Effect.provideService(CurrentToastId, CurrentToastId.of({ toastId })) : (_) => _ - ) - }) - }) -}) { - static readonly DefaultWithoutDependencies = Layer.effect(this, this.make) - static readonly Default = this.DefaultWithoutDependencies - - static readonly handle = , R, WaiR = never, SucR = never, ErrR = never>( - options: ToastOptions - ): (self: Effect.Effect, ...args: Args) => Effect.Effect => - (self, ...args) => this.use((_) => _(options)(self, ...args)) -} diff --git a/packages/effect-app/test/moreStrings.test.ts b/packages/effect-app/test/moreStrings.test.ts deleted file mode 100644 index 2189c15c4..000000000 --- a/packages/effect-app/test/moreStrings.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as S from "effect-app/Schema" -import { urlAlphabet } from "nanoid" -import { test } from "vitest" - -const nanoidAlphabet = new Set(urlAlphabet) - -const isNanoId = (value: string) => value.length === 21 && Array.from(value).every((char) => nanoidAlphabet.has(char)) - -test("StringId make generates nanoid-shaped values", () => { - for (let i = 0; i < 20; i++) { - const value = S.StringId.make() - expect(isNanoId(value)).toBe(true) - expect(S.is(S.StringId)(value)).toBe(true) - } -}) diff --git a/packages/effect-app/test/rpc.test.ts b/packages/effect-app/test/rpc.test.ts deleted file mode 100644 index d76ed2e00..000000000 --- a/packages/effect-app/test/rpc.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -import type * as Effect from "effect/Effect" -import type * as Option from "effect/Option" -import { expect, test } from "vitest" -import { makeRpcClient, NotLoggedInError, UnauthorizedError } from "../src/client.js" -import { S } from "../src/index.js" -import { RpcContextMap } from "../src/rpc.js" - -export class RequestContextMap extends RpcContextMap.makeMap({ - allowAnonymous: RpcContextMap.makeInverted()(NotLoggedInError), - requireRoles: RpcContextMap.makeCustom()(UnauthorizedError, Array()), - test: RpcContextMap.make()(S.Never) -}) {} - -const stubMiddleware = { - requestContextMap: RequestContextMap.config, - requestContext: undefined as never -} -const { TaggedRequestFor } = makeRpcClient(stubMiddleware) -const TaggedRequest = TaggedRequestFor("Test").Query - -export class Stats extends TaggedRequest()("Stats", {}, { - allowedRoles: ["manager"], - success: { - usersActive24Hours: S.Finite, - usersActiveLastWeek: S.Finite, - newUsersLast24Hours: S.Finite, - newUsersLastWeek: S.Finite - } -}) {} - -declare const _stats: typeof Stats.Type -declare const _statsSuccess: typeof Stats.success.Type -declare const _statsError: typeof Stats.error.Type -declare const _statsRequestType: typeof Stats.type - -test("Void decodes and encodes as void", () => { - const statsFromMake = Stats.make({}) - const statsFromMakeOption = Stats.makeOption({}) - const statsFromMakeEffect = Stats.makeEffect({}) - - expect(S.decodeUnknownSync(S.Void)(undefined)).toBe(undefined) - expect(S.is(S.Void)(undefined)).toBe(true) - expect(S.decodeUnknownSync(S.Void)("test")).toBe(undefined) - expect(S.is(S.Void)("test")).toBe(true) - expect(S.encodeUnknownSync(S.Void)("test")).toBe(undefined) - expect(S.encodeUnknownSync(S.toCodecJson(S.Void))("test")).toBe(null) - expectTypeOf().toEqualTypeOf() - expectTypeOf().toEqualTypeOf<{ - readonly usersActive24Hours: number - readonly usersActiveLastWeek: number - readonly newUsersLast24Hours: number - readonly newUsersLastWeek: number - }>() - // Resource error carries only `config.error` (and optional `generalErrors`); rcm-derived - // middleware errors no longer leak into `resource.error` — they reach the wire via the - // middleware tag attached to the rpc group (`rpc.middlewares[*].error` failure-union). - expectTypeOf().toEqualTypeOf() - expectTypeOf().toEqualTypeOf<"query">() - expectTypeOf(statsFromMake).toEqualTypeOf() - expectTypeOf(statsFromMakeOption).toEqualTypeOf>() - expectTypeOf(statsFromMakeEffect).toEqualTypeOf>() -}) diff --git a/packages/effect-app/test/rpcMiddlewareContext.test.ts b/packages/effect-app/test/rpcMiddlewareContext.test.ts deleted file mode 100644 index 654a20c7a..000000000 --- a/packages/effect-app/test/rpcMiddlewareContext.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { expectTypeOf, test } from "vitest" -import { makeRpcClient, NotLoggedInError, UnauthorizedError } from "../src/client.js" -import { RpcContextMap } from "../src/rpc.js" - -// A stand-in for an app service (e.g. `UserProfile`) that the `allowAnonymous` -// inverted middleware provides into the handler context whenever auth is -// required (i.e. `allowAnonymous` is not `true`). -interface UserProfile { - readonly _tag: "UserProfile" -} - -// Mirrors a real app request-context map: one inverted key providing a service -// by default (unless opted out), and one custom (role) key. -class RequestContextMap extends RpcContextMap.makeMap({ - allowAnonymous: RpcContextMap.makeInverted()(NotLoggedInError), - allowRoles: RpcContextMap.makeCustom()(UnauthorizedError, Array()) -}) {} - -type Map = typeof RequestContextMap.config - -// The context a handler receives for a given rpc config — exactly the -// `GetEffectContext<_RC, rpc.config>` the router computes for the handler -// (see `RpcMiddleware.ts`). Testing it against config literals pins down the -// middleware semantics directly. -type CtxFor = RpcContextMap.GetEffectContext - -test("`GetEffectContext`: the inverted `UserProfile` provision is gated by `allowAnonymous`, not `allowRoles`", () => { - // Empty config = nothing opted out → auth required → `UserProfile` provided. - expectTypeOf>().toEqualTypeOf() - - // `allowRoles` does not gate `UserProfile` — still provided. - expectTypeOf>().toEqualTypeOf() - - // Negative case: opting into anonymous removes the `UserProfile` provision. - expectTypeOf>().toBeNever() - - // Anonymous wins over roles for the inverted provision. - expectTypeOf>().toBeNever() - - // Regression documentation: a config that collapses to `Record` - // (what the no-config command overload used to produce) WRONGLY drops - // `UserProfile` — `keyof Record` is `string`, so `allowAnonymous` - // satisfies `key extends keyof T`, and `T["allowAnonymous"]` (`never`) `extends - // true`, taking the anonymous branch. This is exactly why the overload must - // yield `{}` (see the command-builder test below). - expectTypeOf>>().toBeNever() -}) - -// End-to-end guard for the actual fix: a command defined with NO config object -// must still provide `UserProfile` (auth required by default). This exercises the -// no-config `Command` overload, which now yields an empty `{}` config instead of -// `Record`. -const { TaggedRequestFor } = makeRpcClient({ - requestContextMap: RequestContextMap.config, - requestContext: undefined as never -}) -const Command = TaggedRequestFor("Test").Command - -class NoConfigCmd extends Command()("NoConfigCmd", {}) {} - -test("a no-config command still provides the auth-required `UserProfile` service", () => { - expectTypeOf>().toEqualTypeOf() -}) diff --git a/packages/effect-app/test/schema.test.ts b/packages/effect-app/test/schema.test.ts deleted file mode 100644 index da644edb4..000000000 --- a/packages/effect-app/test/schema.test.ts +++ /dev/null @@ -1,681 +0,0 @@ -// import { generateFromArbitrary } from "@effect-app/infra/test" -import * as Array from "effect-app/Array" -import * as S from "effect-app/Schema" -import { specialJsonSchemaDocument } from "effect-app/Schema/SpecialJsonSchema" -import * as Effect from "effect/Effect" -import * as Struct from "effect/Struct" -import { describe, expect, expectTypeOf, test } from "vitest" - -const A = S.Struct({ a: S.NonEmptyString255, email: S.NullOr(S.Email) }) -test("works", () => { - console.log(S.StringId.make()) - // console.log(generateFromArbitrary(S.A.make(A)).value) - console.log(S.AST.resolveTitle(S.Email.ast)) - console.log(S.AST.resolveDescription(S.Email.ast)) - console.log(S.toJsonSchemaDocument(S.Email)) - console.log(S.toJsonSchemaDocument(S.Email)) - console.log(S.decodeExit(A)({ a: Array.range(1, 256).join(""), email: "hello" })) -}) - -test("literal default works", () => { - const l = S.Literals(["a", "b"]) - expect(l.Default).toBe("a") - expectTypeOf(l.Default).toEqualTypeOf<"a">() - const s = S.Struct({ l: l.withConstructorDefault }) - expect(s.make({}).l).toBe("a") - - const l2 = l.changeDefault("b") - const s2 = S.Struct({ l: l2.withConstructorDefault }) - expect(s2.make({}).l).toBe("b") -}) - -// Toy schema for `dropConstructorDefault`: a field with a constructor -// default that should NOT auto-populate when deriving a partial-update -// schema from a "create" schema. -const Person = S.Struct({ - name: S.String, - notes: S.NullOr(S.String).pipe(S.optionalKey, S.withConstructorDefault(Effect.succeed(null))) -}) - -test("plain Struct.omit leaks the inherited constructor default (the bug)", () => { - const UpdatePersonBuggy = S.Struct(Struct.omit(Person.fields, [] as const)) - expect(UpdatePersonBuggy.make({ name: "Mario" })).toEqual({ name: "Mario", notes: null }) -}) - -test("Struct.map(S.dropConstructorDefault) strips the inherited constructor default (the fix)", () => { - const UpdatePersonFixed = S.Struct(Struct.map(Struct.omit(Person.fields, [] as const), S.dropConstructorDefault)) - expect(UpdatePersonFixed.make({ name: "Mario" })).toEqual({ name: "Mario" }) -}) - -test("Struct.map(S.dropConstructorDefault) still omits the requested keys, like Struct.omit", () => { - const NameOnly = S.Struct(Struct.map(Struct.omit(Person.fields, ["notes"] as const), S.dropConstructorDefault)) - expect(NameOnly.make({ name: "Mario" })).toEqual({ name: "Mario" }) - expectTypeOf().toEqualTypeOf<{ readonly name: string }>() -}) - -test("makeExactOptional drops the inherited constructor default too", () => { - const UpdatePerson = S.Struct(S.makeExactOptional(Person.fields)) - expect(UpdatePerson.make({ name: "Mario" })).toEqual({ name: "Mario" }) -}) - -test("dropConstructorDefault stays 'no-default' after annotate/annotateKey (Rebuild fix)", () => { - const notesDropped = S.dropConstructorDefault(Person.fields.notes) - expectTypeOf<(typeof notesDropped)["~type.constructor.default"]>().toEqualTypeOf<"no-default">() - - const notesAnnotated = notesDropped.annotate({ description: "no longer defaulted" }) - expectTypeOf<(typeof notesAnnotated)["~type.constructor.default"]>().toEqualTypeOf<"no-default">() - - const notesKeyAnnotated = notesDropped.annotateKey({ description: "no longer defaulted (key)" }) - expectTypeOf<(typeof notesKeyAnnotated)["~type.constructor.default"]>().toEqualTypeOf<"no-default">() - - const UpdatePerson = S.Struct({ name: Person.fields.name, notes: notesAnnotated }) - expect(UpdatePerson.make({ name: "Mario" })).toEqual({ name: "Mario" }) -}) - -test("NonEmptyString255.Type uses the named brand alias", () => { - type A = typeof S.NonEmptyString255.Type - type B = string & S.NonEmptyString255Brand - expectTypeOf().toEqualTypeOf() -}) - -test("Opaque accepts an explicit Encoded type", () => { - interface User { - readonly id: string - readonly _tag: "User" - } - - interface UserEncoded { - readonly id: string - } - - const baseSchema = S.Struct({ id: S.String, name: S.String }) - const _UserSchema = S.Opaque()(baseSchema) - - expectTypeOf>().toEqualTypeOf() - expectTypeOf>().toEqualTypeOf() - expectTypeOf>().not.toEqualTypeOf>() -}) - -test("Opaque with one generic keeps the base encoded shape", () => { - interface User { - readonly id: string - } - - const baseSchema = S.Struct({ id: S.String }) - const _UserSchema = S.Opaque()(baseSchema) - - expectTypeOf>().toEqualTypeOf<{ readonly id: string }>() - expectTypeOf>().toEqualTypeOf() -}) - -test("Opaque preserves optional Struct.make input", () => { - interface User { - readonly a?: string | undefined - readonly b?: number | undefined - } - - const schema = S.Opaque()(S.Struct({ - a: S.optional(S.String), - b: S.optional(S.Number) - })) - - const made = schema.make() - expect(made).toEqual({}) - expectTypeOf(made).toEqualTypeOf() -}) - -test("Opaque preserves optional TaggedStruct.make input", () => { - interface OnlyTag { - readonly _tag: "OnlyTag" - } - - const schema = S.Opaque()(S.TaggedStruct("OnlyTag", {})) - - const made = schema.make() - expect(made).toEqual({ _tag: "OnlyTag" }) - expectTypeOf(made).toEqualTypeOf() -}) - -test("S.Literals([\"A\", \"B\"]).Default is typed as \"A\"", () => { - const l = S.Literals(["A", "B"]) - expect(l.Default).toBe("A") - expectTypeOf(l.Default).toEqualTypeOf<"A">() -}) - -test("Struct.make accepts void when all fields are optional", () => { - const schema = S.Struct({ - a: S.optional(S.String), - b: S.optional(S.Number) - }) - - const made = schema.make() - expect(made).toEqual({}) - expectTypeOf(made).toEqualTypeOf<{ readonly a?: string | undefined; readonly b?: number | undefined }>() -}) - -test("StructNestedEncoded resolves Struct and from.Encoded", () => { - const plain = S.Struct({ a: S.String, b: S.NullOr(S.String) }) - const encodedKeys = plain.pipe(S.encodeKeys({ b: "b_encoded" })) - - expectTypeOf>().toEqualTypeOf<{ - readonly a: string - readonly b: string | null - }>() - - expectTypeOf>().toEqualTypeOf<{ - readonly a: string - readonly b_encoded: string | null - }>() -}) - -test("TaggedStruct.make accepts void when only constructor-default fields exist", () => { - const schema = S.TaggedStruct("OnlyTag", {}) - - const made = schema.make() - expect(made).toEqual({ _tag: "OnlyTag" }) - expectTypeOf(made).toEqualTypeOf<{ readonly _tag: "OnlyTag" }>() -}) - -test("tagged union derives tag map and tags from v4 literal ast", () => { - const schema = S.TaggedUnion([ - S.TaggedStruct("A", { a: S.String }), - S.TaggedStruct("B", { b: S.Finite }), - S.TaggedStruct("C", { c: S.Boolean }) - ]) - const caseA = schema.cases["A"] - const caseB = schema.cases["B"] - const caseC = schema.cases["C"] - const isAOrB = schema.isAnyOf(["A", "B"]) - - expect(caseA.fields._tag.ast.literal).toBe("A") - expect(caseB.fields._tag.ast.literal).toBe("B") - expect(caseC.fields._tag.ast.literal).toBe("C") - expect(S.decodeSync(schema.tags)("A")).toBe("A") - expect(S.decodeSync(schema.tags)("B")).toBe("B") - expect(S.decodeSync(schema.tags)("C")).toBe("C") - expect(() => S.decodeUnknownSync(schema.tags)("D")).toThrow() - - expect(schema.guards.A({ _tag: "A", a: "ok" })).toBe(true) - expect(schema.guards.A({ _tag: "B", b: 1 })).toBe(false) - expect(schema.guards.B({ _tag: "B", b: 1 })).toBe(true) - expect(schema.guards.B({ _tag: "A", a: "ok" })).toBe(false) - expect(schema.guards.C({ _tag: "C", c: true })).toBe(true) - expect(schema.guards.C({ _tag: "A", a: "ok" })).toBe(false) - - expect(isAOrB({ _tag: "A", a: "ok" })).toBe(true) - expect(isAOrB({ _tag: "B", b: 1 })).toBe(true) - expect(isAOrB({ _tag: "C", c: true })).toBe(false) -}) - -test("TaggedUnion tags returns a Literals schema with correct literal values", () => { - const schema = S.TaggedUnion([ - S.TaggedStruct("X", { x: S.String }), - S.TaggedStruct("Y", { y: S.Finite }) - ]) - - expect(schema.tags.literals).toEqual(["X", "Y"]) - expectTypeOf(schema.tags.literals).toMatchTypeOf() -}) - -test("TaggedUnion tags.pick returns a subset of the tag literals", () => { - const schema = S.TaggedUnion([ - S.TaggedStruct("A", { a: S.String }), - S.TaggedStruct("B", { b: S.Finite }), - S.TaggedStruct("C", { c: S.Boolean }) - ]) - - const subset = schema.tags.pick(["A", "C"]) - expect(subset.literals).toEqual(["A", "C"]) - expect(S.decodeSync(subset)("A")).toBe("A") - expect(S.decodeSync(subset)("C")).toBe("C") - expect(() => S.decodeUnknownSync(subset)("B")).toThrow() -}) - -test("tags standalone function extracts tags from member schemas", () => { - const members = [ - S.TaggedStruct("Foo", { foo: S.String }), - S.TaggedStruct("Bar", { bar: S.Finite }) - ] as const - - const tagSchema = S.tags(members) - expect(tagSchema.literals).toEqual(["Foo", "Bar"]) - expect(S.decodeSync(tagSchema)("Foo")).toBe("Foo") - expect(S.decodeSync(tagSchema)("Bar")).toBe("Bar") - expect(() => S.decodeUnknownSync(tagSchema)("Baz")).toThrow() -}) - -test("ExtendTaggedUnion adds tags to an existing Union", () => { - const union = S.Union([ - S.TaggedStruct("P", { p: S.String }), - S.TaggedStruct("Q", { q: S.Finite }) - ]) - const extended = S.ExtendTaggedUnion(union) - - expect(extended.tags.literals).toEqual(["P", "Q"]) - expect(S.decodeSync(extended.tags)("P")).toBe("P") - expect(S.decodeSync(extended.tags)("Q")).toBe("Q") - expect(() => S.decodeUnknownSync(extended.tags)("R")).toThrow() - expect(extended.cases["P"].fields._tag.ast.literal).toBe("P") - expect(extended.guards.P({ _tag: "P", p: "ok" })).toBe(true) - expect(extended.guards.P({ _tag: "Q", q: 1 })).toBe(false) -}) - -test("TaggedUnion match dispatches on _tag", () => { - const schema = S.TaggedUnion([ - S.TaggedStruct("A", { a: S.String }), - S.TaggedStruct("B", { b: S.Finite }) - ]) - - const matcher = schema.match({ - A: (v) => `got A: ${v.a}`, - B: (v) => `got B: ${v.b}` - }) - expect(matcher({ _tag: "A", a: "hello" })).toBe("got A: hello") - expect(matcher({ _tag: "B", b: 42 })).toBe("got B: 42") -}) - -test("TaggedUnion with single member", () => { - const schema = S.TaggedUnion([ - S.TaggedStruct("Only", { val: S.String }) - ]) - - expect(schema.tags.literals).toEqual(["Only"]) - expect(S.decodeSync(schema.tags)("Only")).toBe("Only") - expect(() => S.decodeUnknownSync(schema.tags)("Other")).toThrow() - expect(schema.guards.Only({ _tag: "Only", val: "x" })).toBe(true) -}) - -test("TaggedUnion tags type is narrowed to the exact tag literals", () => { - const schema = S.TaggedUnion([ - S.TaggedStruct("Alpha", { a: S.String }), - S.TaggedStruct("Beta", { b: S.Finite }), - S.TaggedStruct("Gamma", { c: S.Boolean }) - ]) - - type Tags = S.Schema.Type - expectTypeOf().toEqualTypeOf<"Alpha" | "Beta" | "Gamma">() -}) - -test("TaggedUnion with encodeKeys renaming a non-tag key", () => { - const MemberA = S.TaggedStruct("A", { firstName: S.String }).pipe( - S.encodeKeys({ firstName: "first_name" }) - ) - const MemberB = S.TaggedStruct("B", { lastName: S.Finite }).pipe( - S.encodeKeys({ lastName: "last_name" }) - ) - - const schema = S.TaggedUnion([MemberA, MemberB]) - - expect(schema.tags.literals).toEqual(["A", "B"]) - expect(S.decodeSync(schema.tags)("A")).toBe("A") - expect(S.decodeSync(schema.tags)("B")).toBe("B") - - // decode from encoded (snake_case) to decoded (camelCase) - const decoded = S.decodeUnknownSync(schema)({ _tag: "A", first_name: "Alice" }) - expect(decoded).toEqual({ _tag: "A", firstName: "Alice" }) - - const decoded2 = S.decodeUnknownSync(schema)({ _tag: "B", last_name: 42 }) - expect(decoded2).toEqual({ _tag: "B", lastName: 42 }) - - // encode back to snake_case - const encoded = S.encodeSync(schema)({ _tag: "A", firstName: "Alice" }) - expect(encoded).toEqual({ _tag: "A", first_name: "Alice" }) - - // guards work on decoded values - expect(schema.guards.A({ _tag: "A", firstName: "Alice" })).toBe(true) - expect(schema.guards.A({ _tag: "B", lastName: 42 })).toBe(false) - expect(schema.guards.B({ _tag: "B", lastName: 42 })).toBe(true) -}) - -test("TaggedUnion with TaggedClass members", () => { - class Foo extends S.TaggedClass()("Foo", { name: S.String }) {} - class Bar extends S.TaggedClass()("Bar", { count: S.Finite }) {} - - const schema = S.TaggedUnion([Foo, Bar]) - - expect(schema.tags.literals).toEqual(["Foo", "Bar"]) - expect(S.decodeSync(schema.tags)("Foo")).toBe("Foo") - expect(S.decodeSync(schema.tags)("Bar")).toBe("Bar") - expect(() => S.decodeUnknownSync(schema.tags)("Baz")).toThrow() - - const decoded = S.decodeUnknownSync(schema)({ _tag: "Foo", name: "Alice" }) - expect(decoded).toBeInstanceOf(Foo) - expect(decoded).toEqual(new Foo({ name: "Alice" })) - - const decoded2 = S.decodeUnknownSync(schema)({ _tag: "Bar", count: 3 }) - expect(decoded2).toBeInstanceOf(Bar) - expect(decoded2).toEqual(new Bar({ count: 3 })) - - expect(schema.guards.Foo(new Foo({ name: "Alice" }))).toBe(true) - expect(schema.guards.Foo(new Bar({ count: 3 }))).toBe(false) - expect(schema.guards.Bar(new Bar({ count: 3 }))).toBe(true) -}) - -describe("ReadonlySetFromArray", () => { - test("decodes an array of strings to a Set", () => { - const schema = S.ReadonlySetFromArray(S.String) - const decoded = S.decodeUnknownSync(schema)(["a", "b", "c"]) - expect(decoded).toEqual(new Set(["a", "b", "c"])) - }) - - test("encodes a Set back to an array", () => { - const schema = S.ReadonlySetFromArray(S.String) - const encoded = S.encodeSync(schema)(new Set(["a", "b"])) - expect(encoded).toEqual(["a", "b"]) - }) - - test("decodes with NumberFromString as value", () => { - const schema = S.ReadonlySetFromArray(S.NumberFromString) - const decoded = S.decodeUnknownSync(schema)(["1", "2", "3"]) - expect(decoded).toEqual(new Set([1, 2, 3])) - expectTypeOf(decoded).toEqualTypeOf>() - }) - - test("encodes with NumberFromString as value", () => { - const schema = S.ReadonlySetFromArray(S.NumberFromString) - const encoded = S.encodeSync(schema)(new Set([1, 2, 3])) - expect(encoded).toEqual(["1", "2", "3"]) - }) - - test("rejects invalid input", () => { - const schema = S.ReadonlySetFromArray(S.NumberFromString) - expect(() => S.decodeUnknownSync(schema)([1, 2])).toThrow() - }) -}) - -describe("ReadonlyMapFromArray", () => { - test("decodes an array of tuples to a Map", () => { - const schema = S.ReadonlyMapFromArray({ key: S.String, value: S.Finite }) - const decoded = S.decodeUnknownSync(schema)([["a", 1], ["b", 2]]) - expect(decoded).toEqual(new Map([["a", 1], ["b", 2]])) - }) - - test("encodes a Map back to an array of tuples", () => { - const schema = S.ReadonlyMapFromArray({ key: S.String, value: S.Finite }) - const encoded = S.encodeSync(schema)(new Map([["a", 1], ["b", 2]])) - expect(encoded).toEqual([["a", 1], ["b", 2]]) - }) - - test("decodes with NumberFromString as key", () => { - const schema = S.ReadonlyMapFromArray({ key: S.NumberFromString, value: S.String }) - const decoded = S.decodeUnknownSync(schema)([["1", "one"], ["2", "two"]]) - expect(decoded).toEqual(new Map([[1, "one"], [2, "two"]])) - expectTypeOf(decoded).toEqualTypeOf>() - }) - - test("encodes with NumberFromString as key", () => { - const schema = S.ReadonlyMapFromArray({ key: S.NumberFromString, value: S.String }) - const encoded = S.encodeSync(schema)(new Map([[1, "one"], [2, "two"]])) - expect(encoded).toEqual([["1", "one"], ["2", "two"]]) - }) - - test("decodes with NumberFromString as value", () => { - const schema = S.ReadonlyMapFromArray({ key: S.String, value: S.NumberFromString }) - const decoded = S.decodeUnknownSync(schema)([["a", "10"], ["b", "20"]]) - expect(decoded).toEqual(new Map([["a", 10], ["b", 20]])) - expectTypeOf(decoded).toEqualTypeOf>() - }) - - test("encodes with NumberFromString as value", () => { - const schema = S.ReadonlyMapFromArray({ key: S.String, value: S.NumberFromString }) - const encoded = S.encodeSync(schema)(new Map([["a", 10], ["b", 20]])) - expect(encoded).toEqual([["a", "10"], ["b", "20"]]) - }) - - test("decodes with NumberFromString as both key and value", () => { - const schema = S.ReadonlyMapFromArray({ key: S.NumberFromString, value: S.NumberFromString }) - const decoded = S.decodeUnknownSync(schema)([["1", "10"], ["2", "20"]]) - expect(decoded).toEqual(new Map([[1, 10], [2, 20]])) - expectTypeOf(decoded).toEqualTypeOf>() - }) - - test("rejects invalid input", () => { - const schema = S.ReadonlyMapFromArray({ key: S.NumberFromString, value: S.String }) - expect(() => S.decodeUnknownSync(schema)([[1, "val"]])).toThrow() - }) -}) - -describe("ReadonlySet (with withConstructorDefault)", () => { - test("make provides withConstructorDefault", () => { - const schema = S.ReadonlySet(S.NumberFromString) - const struct = S.Struct({ items: schema.withConstructorDefault }) - const made = struct.make({}) - expect(made.items).toEqual(new Set()) - }) - - test("decodes a Set with NumberFromString values", () => { - const schema = S.ReadonlySet(S.NumberFromString) - const decoded = S.decodeUnknownSync(schema)(new Set(["1", "2"])) - expect(decoded).toEqual(new Set([1, 2])) - }) - - test("Encoded is a Set, not an array", () => { - const schema = S.ReadonlySet(S.String) - const encoded = S.encodeSync(schema)(new Set(["a"])) - expect(encoded).toEqual(new Set(["a"])) - expectTypeOf(encoded).toEqualTypeOf>() - }) -}) - -describe("ReadonlyMap (with withConstructorDefault)", () => { - test("make provides withConstructorDefault", () => { - const schema = S.ReadonlyMap({ key: S.NumberFromString, value: S.String }) - const struct = S.Struct({ items: schema.withConstructorDefault }) - const made = struct.make({}) - expect(made.items).toEqual(new Map()) - }) - - test("decodes a Map with NumberFromString keys", () => { - const schema = S.ReadonlyMap({ key: S.NumberFromString, value: S.String }) - const decoded = S.decodeUnknownSync(schema)(new Map([["1", "one"]])) - expect(decoded).toEqual(new Map([[1, "one"]])) - }) - - test("Encoded is a Map, not an array of tuples", () => { - const schema = S.ReadonlyMap({ key: S.String, value: S.Finite }) - const encoded = S.encodeSync(schema)(new Map([["a", 1]])) - expect(encoded).toEqual(new Map([["a", 1]])) - expectTypeOf(encoded).toEqualTypeOf>() - }) -}) - -describe("JSON Schema", () => { - test("Email has format, minLength, maxLength", () => { - const doc = S.toJsonSchemaDocument(S.Email) - expect(doc).toStrictEqual({ - dialect: "draft-2020-12", - schema: { "$ref": "#/$defs/Email" }, - definitions: { - Email: { - type: "string", - title: "Email", - description: "an email according to RFC 5322", - format: "email", - minLength: 3, - maxLength: 998 - } - } - }) - }) - - test("Email specialJsonSchemaDocument flattens allOf", () => { - const doc = specialJsonSchemaDocument(S.Email) - expect(doc).toStrictEqual({ - dialect: "draft-2020-12", - schema: { "$ref": "#/$defs/Email" }, - definitions: { - Email: { - type: "string", - title: "Email", - description: "an email according to RFC 5322", - format: "email", - minLength: 3, - maxLength: 998 - } - } - }) - }) - - test("Date Encoded is Date; JSON codec encodes ISO strings", () => { - const d = new Date("2024-01-01T00:00:00.000Z") - expect(S.decodeUnknownSync(S.Date)(d)).toBe(d) - expect(S.encodeSync(S.Date)(d)).toBe(d) - expect(S.encodeSync(S.toCodecJson(S.Date))(d)).toBe("2024-01-01T00:00:00.000Z") - const doc = S.toJsonSchemaDocument(S.Date) - expect(doc.dialect).toBe("draft-2020-12") - expect(doc.schema).toEqual({ type: "string" }) - }) - - test("DateFromString keeps string Encoded", () => { - const doc = S.toJsonSchemaDocument(S.DateFromString) - expect(doc).toStrictEqual({ - dialect: "draft-2020-12", - schema: { "$ref": "#/$defs/DateOrInvalid" }, - definitions: { - DateOrInvalid: { - type: "string", - description: "an ISO 8601 date string that will be decoded as a Date (may be invalid)", - format: "date-time" - } - } - }) - }) - - test("PhoneNumber has format phone", () => { - const doc = specialJsonSchemaDocument(S.PhoneNumber) - expect(doc).toStrictEqual({ - dialect: "draft-2020-12", - schema: { "$ref": "#/$defs/PhoneNumber" }, - definitions: { - PhoneNumber: { - type: "string", - title: "PhoneNumber", - description: "a phone number with at least 7 digits", - format: "phone" - } - } - }) - }) - - test("Url has format uri", () => { - const doc = specialJsonSchemaDocument(S.Url) - expect(doc).toStrictEqual({ - dialect: "draft-2020-12", - schema: { "$ref": "#/$defs/Url" }, - definitions: { - Url: { - type: "string", - title: "Url", - format: "uri" - } - } - }) - }) -}) - -describe("generateGuards", () => { - const StateSchema = S.TaggedUnion([ - S.TaggedStruct("Active", { since: S.String }), - S.TaggedStruct("Inactive", { reason: S.String }), - S.TaggedStruct("Pending", { eta: S.Finite }) - ]) - - type State = S.Schema.Type - type Entity = { readonly state: State; readonly name: string } - - const { isActive, isAnyOf, isInactive, isPending } = StateSchema.generateGuards("state") - - test("isActive narrows to Active member", () => { - const entity: Entity = { state: { _tag: "Active", since: "2024-01-01" }, name: "foo" } - expect(isActive(entity)).toBe(true) - if (isActive(entity)) { - expectTypeOf(entity.state).toEqualTypeOf<{ readonly _tag: "Active"; readonly since: string }>() - } - }) - - test("isActive returns false for non-Active", () => { - const entity: Entity = { state: { _tag: "Inactive", reason: "expired" }, name: "foo" } - expect(isActive(entity)).toBe(false) - }) - - test("isInactive narrows to Inactive member", () => { - const entity: Entity = { state: { _tag: "Inactive", reason: "expired" }, name: "foo" } - expect(isInactive(entity)).toBe(true) - }) - - test("isPending narrows to Pending member", () => { - const entity: Entity = { state: { _tag: "Pending", eta: 42 }, name: "foo" } - expect(isPending(entity)).toBe(true) - }) - - test("isAnyOf narrows to union of specified members", () => { - const isActiveOrPending = isAnyOf(["Active", "Pending"]) - const active: Entity = { state: { _tag: "Active", since: "2024-01-01" }, name: "foo" } - const pending: Entity = { state: { _tag: "Pending", eta: 5 }, name: "bar" } - const inactive: Entity = { state: { _tag: "Inactive", reason: "expired" }, name: "baz" } - - expect(isActiveOrPending(active)).toBe(true) - expect(isActiveOrPending(pending)).toBe(true) - expect(isActiveOrPending(inactive)).toBe(false) - - if (isActiveOrPending(active)) { - expectTypeOf(active.state).toEqualTypeOf< - { readonly _tag: "Active"; readonly since: string } | { readonly _tag: "Pending"; readonly eta: number } - >() - } - }) - - test("guards use schema-based validation (built-in guards)", () => { - expect(StateSchema.guards.Active({ _tag: "Active" })).toBe(false) - expect(StateSchema.guards.Active({ _tag: "Active", since: "2024-01-01" })).toBe(true) - }) -}) - -describe("generateGuardsFor", () => { - const StateSchema = S.TaggedUnion([ - S.TaggedStruct("Active", { since: S.String }), - S.TaggedStruct("Inactive", { reason: S.String }), - S.TaggedStruct("Pending", { eta: S.Finite }) - ]) - - type State = S.Schema.Type - type Entity = { readonly state: State; readonly name: string } - - const { isActive, isAnyOf } = StateSchema.generateGuardsFor()("state") - - test("isActive narrows to Active member", () => { - const entity: Entity = { state: { _tag: "Active", since: "2024-01-01" }, name: "foo" } - expect(isActive(entity)).toBe(true) - if (isActive(entity)) { - expectTypeOf(entity.state).toEqualTypeOf<{ readonly _tag: "Active"; readonly since: string }>() - } - }) - - test("isActive returns false for non-Active", () => { - const entity: Entity = { state: { _tag: "Inactive", reason: "expired" }, name: "foo" } - expect(isActive(entity)).toBe(false) - }) - - test("isAnyOf narrows to union of specified members", () => { - const isActiveOrPending = isAnyOf(["Active", "Pending"]) - const active: Entity = { state: { _tag: "Active", since: "2024-01-01" }, name: "foo" } - const inactive: Entity = { state: { _tag: "Inactive", reason: "expired" }, name: "baz" } - - expect(isActiveOrPending(active)).toBe(true) - expect(isActiveOrPending(inactive)).toBe(false) - }) - - test("ExtendTaggedUnion also exposes generateGuardsFor", () => { - const union = S.Union([ - S.TaggedStruct("X", { x: S.String }), - S.TaggedStruct("Y", { y: S.Finite }) - ]) - const extended = S.ExtendTaggedUnion(union) - type Obj = { readonly field: S.Schema.Type } - const { isX, isY } = extended.generateGuardsFor()("field") - - expect(isX({ field: { _tag: "X", x: "hi" } })).toBe(true) - expect(isX({ field: { _tag: "Y", y: 1 } })).toBe(false) - expect(isY({ field: { _tag: "Y", y: 1 } })).toBe(true) - }) -}) diff --git a/packages/effect-app/test/secretURL.test.ts b/packages/effect-app/test/secretURL.test.ts deleted file mode 100644 index af2ab186c..000000000 --- a/packages/effect-app/test/secretURL.test.ts +++ /dev/null @@ -1,160 +0,0 @@ -import * as Chunk from "effect/Chunk" -import * as Config from "effect/Config" -import * as ConfigProvider from "effect/ConfigProvider" -import * as Effect from "effect/Effect" -import { describe, expect, test } from "vitest" -import { fromChunk, fromString, isSecretURL, make, secretURL, unsafeWipe, value } from "../src/Config/SecretURL.js" - -const testUrls = [ - "https://example.com/path?key=secret123", - "http://user:password@host.com:8080/resource", - "postgres://admin:p4ssw0rd@db.internal:5432/mydb", - "redis://default:token@cache.example.com:6379", - "mongodb+srv://user:pass@cluster.mongodb.net/db", - "https://api.example.com/v2/endpoint?token=abc&format=json" -] - -describe("SecretURL", () => { - describe("fromString / value roundtrip", () => { - test.each(testUrls)("preserves %s", (url) => { - const secret = fromString(url) - expect(value(secret)).toBe(url) - }) - }) - - describe("make / value roundtrip", () => { - test.each(testUrls)("preserves %s via byte array", (url) => { - const bytes = url.split("").map((c) => c.charCodeAt(0)) - const secret = make(bytes) - expect(value(secret)).toBe(url) - }) - }) - - describe("fromChunk / value roundtrip", () => { - test.each(testUrls)("preserves %s via Chunk", (url) => { - const chunk = Chunk.fromIterable(url.split("")) - const secret = fromChunk(chunk) - expect(value(secret)).toBe(url) - }) - }) - - describe("toString", () => { - test("redacts the URL, showing only protocol", () => { - const secret = fromString("https://example.com/secret") - expect(String(secret)).toBe("SecretURL(https://)") - }) - - test("shows http protocol", () => { - const secret = fromString("http://example.com") - expect(String(secret)).toBe("SecretURL(http://)") - }) - - test("shows unknown for non-URL strings", () => { - const secret = fromString("not-a-url") - expect(String(secret)).toBe("SecretURL(unknown://)") - }) - }) - - describe("toJSON", () => { - test("returns tag and protocol only", () => { - const secret = fromString("https://example.com/secret") - expect(JSON.parse(JSON.stringify(secret))).toEqual({ _tag: "SecretURL", protocol: "https" }) - }) - - test("returns unknown protocol for non-URL", () => { - const secret = fromString("not-a-url") - expect(JSON.parse(JSON.stringify(secret))).toEqual({ _tag: "SecretURL", protocol: "unknown" }) - }) - }) - - describe("isSecretURL", () => { - test("returns true for SecretURL", () => { - const secret = fromString("https://example.com") - expect(isSecretURL(secret)).toBe(true) - }) - - test("returns false for plain string", () => { - expect(isSecretURL("https://example.com")).toBe(false) - }) - - test("returns false for plain object", () => { - expect(isSecretURL({ raw: [1, 2, 3] })).toBe(false) - }) - }) - - describe("unsafeWipe", () => { - test("zeroes out raw bytes", () => { - const secret = fromString("https://example.com") - unsafeWipe(secret) - expect(value(secret)).toBe("\0".repeat("https://example.com".length)) - }) - }) - - describe("non-URL strings", () => { - const nonUrls = [ - "just-a-secret-token", - "Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.abc", - "sk-1234567890abcdef", - "some random string with spaces and symbols!@#$%" - ] - - test.each(nonUrls)("preserves non-URL value: %s", (input) => { - const secret = fromString(input) - expect(value(secret)).toBe(input) - expect(String(secret)).toBe("SecretURL(unknown://)") - expect(JSON.parse(JSON.stringify(secret))).toEqual({ _tag: "SecretURL", protocol: "unknown" }) - }) - }) - - describe("special characters", () => { - test("preserves URLs with encoded characters", () => { - const url = "https://example.com/path?q=hello%20world&name=%C3%A9" - expect(value(fromString(url))).toBe(url) - }) - - test("preserves URLs with unicode", () => { - const url = "https://example.com/café" - expect(value(fromString(url))).toBe(url) - }) - - test("preserves URLs with special query params", () => { - const url = "https://example.com?a=1&b=2&c=foo+bar" - expect(value(fromString(url))).toBe(url) - }) - }) - - describe("secretURL config", () => { - const run = (config: Config.Config, provider: ConfigProvider.ConfigProvider) => - Effect.runSync(config.parse(provider)) - - test("reads from env-style ConfigProvider (QUEUE_URL)", () => { - const url = "https://sqs.us-east-1.amazonaws.com/123456789/my-queue" - const provider = ConfigProvider.fromEnv({ env: { QUEUE_URL: url } }) - const result = run(secretURL("QUEUE_URL"), provider) - expect(value(result)).toBe(url) - expect(String(result)).toBe("SecretURL(https://)") - }) - - test("reads from fromUnknown with nested config ({ queue: { url } })", () => { - const url = "redis://default:token@cache.example.com:6379" - const provider = ConfigProvider.fromUnknown({ queue: { url } }) - const config = secretURL("url").pipe(Config.nested("queue")) - const result = run(config, provider) - expect(value(result)).toBe(url) - expect(String(result)).toBe("SecretURL(redis://)") - }) - - test("reads non-URL secret from env", () => { - const token = "sk-1234567890abcdef" - const provider = ConfigProvider.fromEnv({ env: { API_KEY: token } }) - const result = run(secretURL("API_KEY"), provider) - expect(value(result)).toBe(token) - expect(String(result)).toBe("SecretURL(unknown://)") - }) - - test("rejects empty string", () => { - const provider = ConfigProvider.fromEnv({ env: { QUEUE_URL: "" } }) - expect(() => run(secretURL("QUEUE_URL"), provider)).toThrow() - }) - }) -}) diff --git a/packages/effect-app/test/special.test.ts b/packages/effect-app/test/special.test.ts deleted file mode 100644 index 9931c7757..000000000 --- a/packages/effect-app/test/special.test.ts +++ /dev/null @@ -1,1261 +0,0 @@ -import { InvalidStateError, LoginError, NotFoundError, NotLoggedInError, OptimisticConcurrencyException, ServiceUnavailableError, UnauthorizedError, ValidationError } from "effect-app/client/errors" -import { RequestContext } from "effect-app/RequestContext" -import * as AppSchema from "effect-app/Schema" -import { Class } from "effect-app/Schema/Class" -import { flattenNestedAnyOf, flattenSimpleAllOf, specialJsonSchemaDocument } from "effect-app/Schema/SpecialJsonSchema" -import { deduplicateOpenApiSchemas } from "effect-app/Schema/SpecialOpenApi" -import * as Effect from "effect/Effect" -import * as Option from "effect/Option" -import * as Predicate from "effect/Predicate" -import * as S from "effect/Schema" -import * as SchemaGetter from "effect/SchemaGetter" -import { describe, expect, it } from "vitest" - -class _FacadeModel extends AppSchema.Class<_FacadeModel>("FacadeModel")({ value: S.String }) { - get upperValue() { - return this.value.toUpperCase() - } - - static describe(self: { readonly value: string }) { - return `value:${self.value}` - } -} - -interface FacadeModelEncoded { - readonly value: string -} - -interface FacadeModelMake { - readonly value: string -} - -class FacadeModel extends AppSchema.OpaqueFacade< - FacadeModel, - FacadeModelEncoded, - FacadeModelMake, - never, - never ->()(_FacadeModel) { - declare readonly value: string - declare readonly upperValue: string - - get decoratedValue() { - return `facade:${this.value}` - } - - label() { - return this.decoratedValue - } -} - -class _RenamedFacadeModel extends AppSchema.Class<_RenamedFacadeModel>("RenamedFacadeModel")({ - internalName: S.String -}) { - get upperName() { - return this.internalName.toUpperCase() - } -} - -interface RenamedFacadeModelEncoded { - readonly external_name: string -} - -interface RenamedFacadeModelMake { - readonly internalName: string -} - -class RenamedFacadeModel extends AppSchema.OpaqueFacade< - RenamedFacadeModel, - RenamedFacadeModelEncoded, - RenamedFacadeModelMake, - never, - never ->()(_RenamedFacadeModel.pipe(S.encodeKeys({ internalName: "external_name" }))) { - declare readonly internalName: string - declare readonly upperName: string - - get decoratedName() { - return `facade:${this.internalName}` - } -} - -const _StructFacadeModel = AppSchema.Struct({ value: S.String }) - -interface StructFacadeModelEncoded { - readonly value: string -} - -interface StructFacadeModelMake { - readonly value: string -} - -class StructFacadeModel extends AppSchema.OpaqueFacade< - StructFacadeModel, - StructFacadeModelEncoded, - StructFacadeModelMake, - never, - never ->()(_StructFacadeModel) { - declare readonly value: string -} - -const _RenamedStructFacadeModel = AppSchema.Struct({ internalName: S.String }).pipe( - S.encodeKeys({ internalName: "external_name" }) -) - -interface RenamedStructFacadeModelEncoded { - readonly external_name: string -} - -interface RenamedStructFacadeModelMake { - readonly internalName: string -} - -class RenamedStructFacadeModel extends AppSchema.OpaqueFacade< - RenamedStructFacadeModel, - RenamedStructFacadeModelEncoded, - RenamedStructFacadeModelMake, - never, - never ->()(_RenamedStructFacadeModel) { - declare readonly internalName: string -} - -const _RenamedOpaqueStructFacadeModel = AppSchema - .Opaque< - { readonly internalName: string }, - RenamedStructFacadeModelEncoded - >()(AppSchema.Struct({ internalName: S.String })) - .pipe(S.encodeKeys({ internalName: "external_name" })) - -class RenamedOpaqueStructFacadeModel extends AppSchema.OpaqueFacade< - RenamedOpaqueStructFacadeModel, - RenamedStructFacadeModelEncoded, - RenamedStructFacadeModelMake, - never, - never ->()(_RenamedOpaqueStructFacadeModel) { - declare readonly internalName: string -} - -describe("Class", () => { - describe("strict", () => { - it("encoding doesnt accepts plain objects matching the struct (Fields argument)", () => { - class A extends Class("A")({ a: S.String }) {} - - expect(S.encodeUnknownSync(A)(new A({ a: "hello" }))).toStrictEqual({ a: "hello" }) - expect(() => S.encodeUnknownSync(A)({ a: "world" })).toThrow() - expect(() => S.encodeUnknownSync(A)(null)).toThrow() - }) - - it("encoding rejects plain objects matching the struct (Struct argument)", () => { - class A extends Class("A")(S.Struct({ a: S.String })) {} - - expect(S.encodeUnknownSync(A)(new A({ a: "hello" }))).toStrictEqual({ a: "hello" }) - expect(() => S.encodeUnknownSync(A)({ a: "world" })).toThrow() - expect(() => S.encodeUnknownSync(A)(null)).toThrow() - }) - - it("decoding still works normally", () => { - class A extends Class("A")({ a: S.String }) {} - - const decoded = S.decodeUnknownSync(A)({ a: "hello" }) - expect(decoded).toBeInstanceOf(A) - expect(decoded.a).toBe("hello") - - expect(() => S.decodeUnknownSync(A)(null)).toThrow() - expect(() => S.decodeUnknownSync(A)({ a: 1 })).toThrow() - }) - - it("S.is accepts class instances and not matching plain objects", () => { - class A extends Class("A")({ a: S.String }) {} - - expect(S.is(A)(new A({ a: "hello" }))).toBe(true) - expect(S.is(A)({ a: "world" })).toBe(false) - expect(S.is(A)({ a: 1 })).toBe(false) - expect(S.is(A)(null)).toBe(false) - }) - - it("rejects values that don't match the struct", () => { - class A extends Class("A")({ a: S.String }) {} - - expect(() => S.encodeUnknownSync(A)({ a: 123 })).toThrow() - expect(() => S.encodeUnknownSync(A)("not an object")).toThrow() - }) - - it("returns a class constructor — new and instanceof work", () => { - class A extends Class("A")({ a: S.String }) {} - - const instance = new A({ a: "hello" }) - expect(instance).toBeInstanceOf(A) - expect(instance.a).toBe("hello") - }) - - it("preserves fields and identifier", () => { - class A extends Class("A")({ a: S.String, b: S.Number }) {} - - expect(A.identifier).toBe("A") - expect(Object.keys(A.fields)).toStrictEqual(["a", "b"]) - }) - }) - - describe("non strict", () => { - it("encoding accepts plain objects matching the struct (Fields argument)", () => { - class A extends Class("A")({ a: S.String }, undefined, { strict: false }) {} - - expect(S.encodeUnknownSync(A)(new A({ a: "hello" }))).toStrictEqual({ a: "hello" }) - expect(S.encodeUnknownSync(A)({ a: "world" })).toStrictEqual({ a: "world" }) - expect(() => S.encodeUnknownSync(A)(null)).toThrow() - }) - - it("encoding accepts plain objects matching the struct (Struct argument)", () => { - class A extends Class("A")(S.Struct({ a: S.String }), undefined, { strict: false }) {} - - expect(S.encodeUnknownSync(A)(new A({ a: "hello" }))).toStrictEqual({ a: "hello" }) - expect(S.encodeUnknownSync(A)({ a: "world" })).toStrictEqual({ a: "world" }) - expect(() => S.encodeUnknownSync(A)(null)).toThrow() - }) - - it("S.is accepts class instances and matching plain objects", () => { - class A extends Class("A")({ a: S.String }, undefined, { strict: false }) {} - - expect(S.is(A)(new A({ a: "hello" }))).toBe(true) - expect(S.is(A)({ a: "world" })).toBe(true) - expect(S.is(A)({ a: 1 })).toBe(false) - expect(S.is(A)(null)).toBe(false) - }) - }) -}) - -describe("Class constructor", () => { - describe("strict", () => { - it("works as a base class — new, instanceof, encoding plain objects", () => { - class A extends Class("A")({ a: S.String }) {} - - const instance = new A({ a: "hello" }) - expect(instance).toBeInstanceOf(A) - expect(instance.a).toBe("hello") - - expect(S.encodeUnknownSync(A)(instance)).toStrictEqual({ a: "hello" }) - expect(() => S.encodeUnknownSync(A)({ a: "world" })).toThrow() - expect(() => S.encodeUnknownSync(A)(null)).toThrow() - expect(() => S.encodeUnknownSync(A)({ a: 123 })).toThrow() - }) - - it("decoding works normally", () => { - class A extends Class("A")({ a: S.String }) {} - - const decoded = S.decodeUnknownSync(A)({ a: "hello" }) - expect(decoded).toBeInstanceOf(A) - expect(decoded.a).toBe("hello") - - expect(() => S.decodeUnknownSync(A)({ a: 1 })).toThrow() - }) - - it("exposes fields, identifier", () => { - class A extends Class("A")({ a: S.String, b: S.Number }) {} - - expect(A.identifier).toBe("A") - expect(Object.keys(A.fields)).toStrictEqual(["a", "b"]) - }) - }) - - describe("non strict", () => { - it("works as a base class — new, instanceof, encoding plain objects", () => { - class A extends Class("A")({ a: S.String }, undefined, { strict: false }) {} - - const instance = new A({ a: "hello" }) - expect(instance).toBeInstanceOf(A) - expect(instance.a).toBe("hello") - - expect(S.encodeUnknownSync(A)(instance)).toStrictEqual({ a: "hello" }) - expect(S.encodeUnknownSync(A)({ a: "world" })).toStrictEqual({ a: "world" }) - expect(() => S.encodeUnknownSync(A)(null)).toThrow() - expect(() => S.encodeUnknownSync(A)({ a: 123 })).toThrow() - }) - }) -}) - -describe("TaggedStruct constructor", () => { - it("works with _tag, make, and encoding plain objects", () => { - const Circle = AppSchema.TaggedStruct("Circle", { radius: S.Number }) - - const instance = Circle.make({ radius: 5 }) - expect(instance).toEqual({ _tag: "Circle", radius: 5 }) - - expect(S.encodeUnknownSync(Circle)(instance)).toStrictEqual({ _tag: "Circle", radius: 5 }) - expect(S.encodeUnknownSync(Circle)({ _tag: "Circle", radius: 10 })).toStrictEqual({ _tag: "Circle", radius: 10 }) - - expect(() => S.encodeUnknownSync(Circle)(null)).toThrow() - expect(() => S.encodeUnknownSync(Circle)({ _tag: "Circle", radius: "nope" })).toThrow() - }) - - it("decoding works normally", () => { - const Circle = AppSchema.TaggedStruct("Circle", { radius: S.Number }) - - const decoded = S.decodeUnknownSync(Circle)({ _tag: "Circle", radius: 5 }) - expect(decoded).toEqual({ _tag: "Circle", radius: 5 }) - }) - - it("S.decodeSync(S.toType(X)) should report n length schema error", () => { - class X extends S.Opaque()(S.TaggedStruct("X", { n: S.String.pipe(S.check(S.isMinLength(3))) })) {} - - try { - S.decodeSync(S.toType(X))({ _tag: "X", n: "a" /* not length 3 */ }) - expect.fail("expected decode to fail with a SchemaError") - } catch (error) { - expect(S.isSchemaError(error)).toBe(true) - if (S.isSchemaError(error)) { - expect(error.message).toContain("n") - expect(error.message.toLowerCase()).toContain("length") - } - } - }) - - it("exposes fields", () => { - const Circle = AppSchema.TaggedStruct("Circle", { radius: S.Number }) - - expect(Object.keys(Circle.fields)).toContain("_tag") - expect(Object.keys(Circle.fields)).toContain("radius") - }) -}) - -describe("strict declaration option", () => { - it("Class strict: true keeps class-level expected errors", () => { - class X extends Class("X")({ n: S.String.pipe(S.check(S.isMinLength(3))) }, undefined, { strict: true }) {} - - expect(() => S.decodeSync(S.toType(X))({ n: "a" })).toThrow("Expected X") - }) - - it("TaggedStruct preserves field-level expected errors", () => { - class X extends S.Opaque()(AppSchema.TaggedStruct("X", { n: S.String.pipe(S.check(S.isMinLength(3))) })) {} - - expect(() => S.decodeSync(S.toType(X))({ _tag: "X", n: "a" })).toThrow() - }) - - it("Class with encoded override strict: true keeps class-level expected errors", () => { - class X extends Class("X")({ n: S.String.pipe(S.check(S.isMinLength(3))) }, undefined, { - strict: true - }) {} - - expect(() => S.decodeSync(S.toType(X))({ n: "a" })).toThrow("Expected X") - }) - - it("TaggedStruct with opaque wrapper decodes tagged input", () => { - class X extends S.Opaque()(AppSchema.TaggedStruct("X", { n: S.String.pipe(S.check(S.isMinLength(3))) })) {} - - expect(() => S.decodeSync(S.toType(X))({ _tag: "X", n: "a" })).toThrow() - }) -}) - -describe("Class.copy", () => { - it("creates a new instance with updated fields", () => { - class A extends Class("A")({ a: S.String, b: S.Number }) {} - - const instance = new A({ a: "hello", b: 1 }) - const copied: A = A.copy(instance, { b: 2 }) - expect(copied).toBeInstanceOf(A) - expect(copied.a).toBe("hello") - expect(copied.b).toBe(2) - }) - - it("accepts a function for updates", () => { - class A extends Class("A")({ a: S.String, b: S.Number }) {} - - const instance = new A({ a: "hello", b: 1 }) - const copied: A = A.copy(instance, (a) => ({ b: a.b + 1 })) - expect(copied).toBeInstanceOf(A) - expect(copied.b).toBe(2) - }) - - it("is pipeable", () => { - class A extends Class("A")({ a: S.String, b: S.Number }) {} - - const instance = new A({ a: "hello", b: 1 }) - const copied: A = A.copy({ b: 2 })(instance) - expect(copied).toBeInstanceOf(A) - expect(copied.b).toBe(2) - }) -}) - -describe("TaggedStruct (opaque).copy", () => { - it("creates a new instance with updated fields", () => { - const Circle = AppSchema.TaggedStruct("Circle", { radius: S.Number }) - - const instance = Circle.make({ radius: 5 }) - const copied = Circle.copy(instance, { radius: 10 }) - expect(copied).toEqual({ _tag: "Circle", radius: 10 }) - }) - - it("accepts a function for updates", () => { - const Circle = AppSchema.TaggedStruct("Circle", { radius: S.Number }) - - const instance = Circle.make({ radius: 5 }) - const copied = Circle.copy(instance, (c) => ({ radius: c.radius * 2 })) - expect(copied).toEqual({ _tag: "Circle", radius: 10 }) - }) -}) - -describe("OpaqueFacade", () => { - it("keeps OpaqueFacade usable with struct schemas", () => { - const decoded = S.decodeSync(StructFacadeModel)({ value: "hello" }) - - expect(decoded).toStrictEqual({ value: "hello" }) - expect(S.encodeSync(StructFacadeModel)(decoded)).toStrictEqual({ value: "hello" }) - expect(S.is(StructFacadeModel)(decoded)).toBe(true) - expect(S.is(StructFacadeModel)({ value: 1 })).toBe(false) - }) - - it("keeps encoded-key struct facades on the struct path", () => { - const decoded = S.decodeSync(RenamedStructFacadeModel)({ external_name: "fran" }) - - expect(decoded).toStrictEqual({ internalName: "fran" }) - expect(decoded).not.toBeInstanceOf(RenamedStructFacadeModel) - expect(S.encodeSync(RenamedStructFacadeModel)(decoded)).toStrictEqual({ external_name: "fran" }) - expect(S.is(RenamedStructFacadeModel)(decoded)).toBe(true) - expect(S.is(RenamedStructFacadeModel)({ external_name: "fran" })).toBe(false) - }) - - it("keeps encoded-key opaque struct facades on the struct path", () => { - const decoded = S.decodeSync(RenamedOpaqueStructFacadeModel)({ external_name: "fran" }) - - expect(decoded).toStrictEqual({ internalName: "fran" }) - expect(decoded).not.toBeInstanceOf(RenamedOpaqueStructFacadeModel) - expect(S.encodeSync(RenamedOpaqueStructFacadeModel)(decoded)).toStrictEqual({ external_name: "fran" }) - expect(S.is(RenamedOpaqueStructFacadeModel)(decoded)).toBe(true) - expect(S.is(RenamedOpaqueStructFacadeModel)({ external_name: "fran" })).toBe(false) - }) - - it("decodes through the public facade class", () => { - const decoded = S.decodeSync(FacadeModel)({ value: "hello" }) - const decodedEffect = Effect.runSync(S.decodeUnknownEffect(FacadeModel)({ value: "effect" })) - - expect(decoded).toBeInstanceOf(FacadeModel) - expect(decodedEffect).toBeInstanceOf(FacadeModel) - expect(decoded).toBeInstanceOf(_FacadeModel) - expect(decoded.value).toBe("hello") - expect(decoded.upperValue).toBe("HELLO") - expect(decoded.decoratedValue).toBe("facade:hello") - expect(decoded.label()).toBe("facade:hello") - expect(FacadeModel.describe(decoded)).toBe("value:hello") - }) - - it("validates facade instances with S.is", () => { - const instance = new FacadeModel({ value: "hello" }) - - expect(instance).toBeInstanceOf(FacadeModel) - expect(instance.upperValue).toBe("HELLO") - expect(instance.label()).toBe("facade:hello") - expect(S.is(FacadeModel)(instance)).toBe(true) - expect(S.is(FacadeModel)(S.decodeSync(FacadeModel)({ value: "world" }))).toBe(true) - expect(S.is(FacadeModel)({ value: "plain" })).toBe(false) - expect(S.is(FacadeModel)({ value: 1 })).toBe(false) - }) - - it("decodes renamed keys through the public facade class", () => { - const decoded = S.decodeSync(RenamedFacadeModel)({ external_name: "fran" }) - - expect(decoded).toBeInstanceOf(RenamedFacadeModel) - expect(decoded).toBeInstanceOf(_RenamedFacadeModel) - expect(Object.getPrototypeOf(decoded)).toBe(RenamedFacadeModel.prototype) - expect(decoded.internalName).toBe("fran") - expect(decoded.upperName).toBe("FRAN") - expect(decoded.decoratedName).toBe("facade:fran") - expect(S.encodeSync(RenamedFacadeModel)(decoded)).toStrictEqual({ external_name: "fran" }) - expect(S.is(RenamedFacadeModel)(decoded)).toBe(true) - expect(S.is(RenamedFacadeModel)({ internalName: "plain" })).toBe(false) - expect(S.is(RenamedFacadeModel)({ external_name: "plain" })).toBe(false) - }) - - it("keeps generated struct facades decodable with public statics", () => { - const input: typeof RequestContext.Encoded = { - span: { traceId: "trace", spanId: "span", sampled: true }, - name: "operation", - locale: "en", - namespace: "tenant" - } - - const decoded = S.decodeSync(RequestContext)(input) - - expect(decoded).not.toBeInstanceOf(RequestContext) - expect(S.is(RequestContext)(decoded)).toBe(true) - expect(RequestContext.toMonitoring(decoded)).toStrictEqual({ operationName: "operation", locale: "en" }) - }) - - it("keeps error facades class-only", () => { - const makeStructErrorFacade = () => - AppSchema.OpaqueErrorFacadeClass< - { readonly value: string }, - { readonly value: string }, - { readonly value: string }, - never, - never - >()( - // Runtime guard: only class schemas are accepted (struct schemas throw). - AppSchema.Struct({ value: S.String }) as never - ) - - expect(makeStructErrorFacade).toThrow("OpaqueErrorFacadeClass requires a class schema") - }) -}) - -describe("Struct.copy", () => { - it("creates a new value with updated fields", () => { - const A = AppSchema.Struct({ a: S.String, b: S.Number }) - - const instance = A.make({ a: "hello", b: 1 }) - const copied = A.copy(instance, { b: 2 }) - - expect(copied).toEqual({ a: "hello", b: 2 }) - expect(copied).not.toBe(instance) - }) - - it("accepts a function for updates", () => { - const A = AppSchema.Struct({ a: S.String, b: S.Number }) - - const instance = A.make({ a: "hello", b: 1 }) - const copied = A.copy(instance, (a) => ({ b: a.b + 1 })) - - expect(copied).toEqual({ a: "hello", b: 2 }) - }) - - it("allows widening updates against the full struct type", () => { - const A = AppSchema.Struct({ - name: S.String, - state: S.Union([ - S.Struct({ _tag: S.tag("a"), a: S.String }), - S.Struct({ _tag: S.tag("b"), b: S.Number }) - ]) - }) - - const instance = A.make({ name: "x", state: { _tag: "a", a: "a" } }) - const copied = A.copy(instance, { state: { _tag: "b", b: 1 } }) - - expect(copied).toEqual({ name: "x", state: { _tag: "b", b: 1 } }) - }) - - it("copy function is preserved when using .annotate()", () => { - const A = AppSchema.Struct({ a: S.String, b: S.Number }).annotate({ title: "A" }) - - const instance = A.make({ a: "hello", b: 1 }) - const copied = A.copy(instance, { b: 2 }) - - expect(copied).toEqual({ a: "hello", b: 2 }) - expect(copied).not.toBe(instance) - }) - - it("copy function is preserved when using .annotateKey()", () => { - const A = AppSchema.Struct({ a: S.String, b: S.Number }).annotateKey({ title: "A" }) - - const instance = A.make({ a: "hello", b: 1 }) - const copied = A.copy(instance, { b: 2 }) - - expect(copied).toEqual({ a: "hello", b: 2 }) - expect(copied).not.toBe(instance) - }) - - it("copy function is preserved when using .mapFields()", () => { - const A = AppSchema.Struct({ a: S.String, b: S.Number }).mapFields((f) => ({ ...f })) - - const instance = A.make({ a: "hello", b: 1 }) - const copied = A.copy(instance, { b: 2 }) - - expect(copied).toEqual({ a: "hello", b: 2 }) - expect(copied).not.toBe(instance) - }) - - it("copy function is preserved through chained calls", () => { - const A = AppSchema - .Struct({ a: S.String, b: S.Number }) - .annotate({ title: "A" }) - .annotateKey({ description: "test" }) - - const instance = A.make({ a: "hello", b: 1 }) - const copied = A.copy(instance, { b: 2 }) - - expect(copied).toEqual({ a: "hello", b: 2 }) - expect(copied).not.toBe(instance) - }) -}) - -describe("TaggedStruct.copy", () => { - it("creates a new tagged value with updated fields", () => { - const Circle = AppSchema.TaggedStruct("Circle", { radius: S.Number }) - - const instance = Circle.make({ radius: 5 }) - const copied = Circle.copy(instance, { radius: 10 }) - - expect(copied).toEqual({ _tag: "Circle", radius: 10 }) - expect(copied).not.toBe(instance) - }) -}) - -describe("TaggedError", () => { - it("InvalidStateError toString includes the message", () => { - const error = new InvalidStateError("something went wrong") - expect(error.toString()).toContain("something went wrong") - }) - - it("NotFoundError toString includes the message", () => { - const error = new NotFoundError({ type: "User", id: "123" }) - expect(error.toString()).toContain("Didn't find User") - expect(error.toString()).toContain("123") - }) - - it("ServiceUnavailableError toString includes the message", () => { - const error = new ServiceUnavailableError("service down") - expect(error.toString()).toContain("service down") - }) - - it("ValidationError toString includes the message", () => { - const error = new ValidationError({ errors: ["field required"] }) - expect(error.toString()).toContain("Validation failed") - expect(error.toString()).toContain("field required") - }) - - it("NotLoggedInError toString includes the message", () => { - const error = new NotLoggedInError("not logged in") - expect(error.toString()).toContain("not logged in") - }) - - it("LoginError toString includes the message", () => { - const error = new LoginError("login failed") - expect(error.toString()).toContain("login failed") - }) - - it("UnauthorizedError toString includes the message", () => { - const error = new UnauthorizedError("forbidden") - expect(error.toString()).toContain("forbidden") - }) - - it("OptimisticConcurrencyException toString includes the message", () => { - const error = new OptimisticConcurrencyException({ message: "conflict" }) - expect(error.toString()).toContain("conflict") - }) - - it("OptimisticConcurrencyException from details toString includes the message", () => { - const error = new OptimisticConcurrencyException({ type: "User", id: "123", code: 409 }) - expect(error.toString()).toContain("Existing User 123 record changed") - }) -}) - -describe("SpecialJsonSchema", () => { - it("nullable to optional — from NullOr", () => { - const nullableDecodedUndefinedEncoded = (schema: S.Top) => { - const isNullableSchema = "members" in schema - && globalThis.Array.isArray((schema as any).members) - && (schema as any).members.length === 2 - && (schema as any).members.some((member: any) => member.ast._tag === "Null") - - const nullableMembers = isNullableSchema ? (schema as any).members as ReadonlyArray : undefined - const innerSchema = nullableMembers - ? nullableMembers.find((member: any) => member.ast._tag !== "Null")! - : schema - - const nullableSchema = isNullableSchema ? schema : S.NullOr(schema) - - return nullableSchema.pipe( - S.encodeTo(S.optionalKey(innerSchema), { - decode: SchemaGetter.transformOptional(Option.orElseSome(() => null)), - encode: SchemaGetter.transformOptional(Option.filter(Predicate.isNotNull)) - }) - ) - } - - const fromNullOr = nullableDecodedUndefinedEncoded(S.NullOr(S.String)) - const structFromNullOr = S.Struct({ status: fromNullOr }) - - const encode = S.encodeUnknownSync(structFromNullOr as any) - const encodedNull = encode({ status: null }) - expect("status" in encodedNull).toBe(false) - expect(encode({ status: "test" })).toStrictEqual({ status: "test" }) - - const decode = S.decodeUnknownSync(structFromNullOr as any) - expect(decode({})).toStrictEqual({ status: null }) - expect(decode({ status: "test" })).toStrictEqual({ status: "test" }) - - const doc = specialJsonSchemaDocument(structFromNullOr) - expect(doc).toStrictEqual({ - dialect: "draft-2020-12", - schema: { - "type": "object", - "additionalProperties": true, - "properties": { - "status": { "type": "string" } - } - }, - definitions: {} - }) - }) - - it("identifies X universally — deduplicates same-fingerprint references", () => { - const X = S.String.annotate({ title: "X", identifier: "X" }) - - const s = S.Struct({ - a: S.NullOr(X).pipe( - S.encodeTo(S.optionalKey(X), { - decode: SchemaGetter.transformOptional(Option.orElseSome(() => null)), - encode: SchemaGetter.transformOptional(Option.filter(Predicate.isNotNull)) - }) - ), - b: S.NullOr(X).pipe( - S.encodeTo(S.optionalKey(X), { - decode: SchemaGetter.transformOptional(Option.orElseSome(() => null)), - encode: SchemaGetter.transformOptional(Option.filter(Predicate.isNotNull)) - }) - ), - c: S.NullOr(X), - d: X, - e: X.pipe(S.optionalKey) - }) - - const doc = specialJsonSchemaDocument(s) - expect(doc).toStrictEqual({ - dialect: "draft-2020-12", - schema: { - "type": "object", - "additionalProperties": true, - "properties": { - "a": { "$ref": "#/$defs/X" }, - "b": { "$ref": "#/$defs/X" }, - "c": { - "anyOf": [ - { "$ref": "#/$defs/X" }, - { "type": "null" } - ] - }, - "d": { "$ref": "#/$defs/X" }, - "e": { "$ref": "#/$defs/X" } - }, - "required": ["c", "d"] - }, - definitions: { - X: { - "type": "string", - "title": "X" - } - } - }) - }) - - it("shared annotated schema via helper — deduplicates", () => { - const X = S.String.annotate({ title: "X", identifier: "X" }) - - const cache = new WeakMap() - const nullableDecodedUndefinedEncoded = (schema: S.Top) => { - const isNullableSchema = "members" in schema - && globalThis.Array.isArray((schema as any).members) - && (schema as any).members.length === 2 - && (schema as any).members.some((member: any) => member.ast._tag === "Null") - - const nullableMembers = isNullableSchema ? (schema as any).members as ReadonlyArray : undefined - const innerSchema = nullableMembers - ? nullableMembers.find((member: any) => member.ast._tag !== "Null")! - : schema - - const cached = cache.get(innerSchema.ast) - if (cached !== undefined) return cached - - const nullableSchema = isNullableSchema ? schema : S.NullOr(schema) - const out = nullableSchema.pipe( - S.encodeTo(S.optionalKey(innerSchema), { - decode: SchemaGetter.transformOptional(Option.orElseSome(() => null)), - encode: SchemaGetter.transformOptional(Option.filter(Predicate.isNotNull)) - }) - ) - - cache.set(innerSchema.ast, out) - return out - } - - const structWithShared = S.Struct({ - a: nullableDecodedUndefinedEncoded(X), - b: nullableDecodedUndefinedEncoded(S.NullOr(X)), - c: S.NullOr(X), - d: X, - e: X.pipe(S.optionalKey) - }) - - const doc = specialJsonSchemaDocument(structWithShared) - expect(doc).toStrictEqual({ - dialect: "draft-2020-12", - schema: { - "type": "object", - "additionalProperties": true, - "properties": { - "a": { "$ref": "#/$defs/X" }, - "b": { "$ref": "#/$defs/X" }, - "c": { - "anyOf": [ - { "$ref": "#/$defs/X" }, - { "type": "null" } - ] - }, - "d": { "$ref": "#/$defs/X" }, - "e": { "$ref": "#/$defs/X" } - }, - "required": ["c", "d"] - }, - definitions: { - X: { - "type": "string", - "title": "X" - } - } - }) - }) -}) - -describe("SpecialOpenApi", () => { - it("deduplicates identical components.schemas entries with same base identifier", () => { - const spec = { - openapi: "3.1.0", - info: { title: "Test", version: "1.0" }, - paths: { - "/foo": { - get: { - responses: { - 200: { - content: { - "application/json": { - schema: { $ref: "#/components/schemas/X" } - } - } - } - } - } - }, - "/bar": { - get: { - responses: { - 200: { - content: { - "application/json": { - schema: { $ref: "#/components/schemas/X1" } - } - } - } - } - } - } - }, - components: { - schemas: { - X: { type: "string", title: "X" }, - X1: { type: "string", title: "X" } - } - } - } - - const result = deduplicateOpenApiSchemas(spec) as any - - // X1 should be removed, and $ref to X1 rewritten to X - expect(result.components.schemas).toStrictEqual({ - X: { type: "string", title: "X" } - }) - expect( - result.paths["/bar"].get.responses[200].content["application/json"].schema - ) - .toStrictEqual({ $ref: "#/components/schemas/X" }) - }) - - it("does not deduplicate entries with different representations", () => { - const spec = { - openapi: "3.1.0", - info: { title: "Test", version: "1.0" }, - paths: {}, - components: { - schemas: { - X: { type: "string", title: "X" }, - X1: { type: "number", title: "X" } - } - } - } - - const result = deduplicateOpenApiSchemas(spec) as any - - // Both should remain since they have different representations - expect(result.components.schemas).toStrictEqual({ - X: { type: "string", title: "X" }, - X1: { type: "number", title: "X" } - }) - }) - - it("returns spec unchanged when no duplicates exist", () => { - const spec = { - openapi: "3.1.0", - info: { title: "Test", version: "1.0" }, - paths: {}, - components: { - schemas: { - Foo: { type: "string" }, - Bar: { type: "number" } - } - } - } - - const result = deduplicateOpenApiSchemas(spec) - expect(result).toStrictEqual(spec) - }) - - it("rewrites nested $ref pointers in allOf/anyOf/oneOf", () => { - const spec = { - openapi: "3.1.0", - info: { title: "Test", version: "1.0" }, - paths: { - "/baz": { - post: { - requestBody: { - content: { - "application/json": { - schema: { - anyOf: [ - { $ref: "#/components/schemas/Y1" }, - { type: "null" } - ] - } - } - } - } - } - } - }, - components: { - schemas: { - Y: { type: "object", properties: { name: { type: "string" } } }, - Y1: { type: "object", properties: { name: { type: "string" } } } - } - } - } - - const result = deduplicateOpenApiSchemas(spec) as any - - expect(result.components.schemas).toStrictEqual({ - Y: { type: "object", properties: { name: { type: "string" } } } - }) - expect( - result.paths["/baz"].post.requestBody.content["application/json"].schema.anyOf[0] - ) - .toStrictEqual({ $ref: "#/components/schemas/Y" }) - }) - - it("rewrites $ref pointers inside definitions themselves", () => { - const spec = { - openapi: "3.1.0", - info: { title: "Test", version: "1.0" }, - paths: {}, - components: { - schemas: { - Inner: { type: "string" }, - Inner1: { type: "string" }, - Outer: { - type: "object", - properties: { - field: { $ref: "#/components/schemas/Inner1" } - } - } - } - } - } - - const result = deduplicateOpenApiSchemas(spec) as any - - expect(Object.keys(result.components.schemas)).toStrictEqual(["Inner", "Outer"]) - expect(result.components.schemas.Outer.properties.field).toStrictEqual({ - $ref: "#/components/schemas/Inner" - }) - }) - - it("handles spec without components gracefully", () => { - const spec = { openapi: "3.1.0", info: { title: "Test", version: "1.0" }, paths: {} } - const result = deduplicateOpenApiSchemas(spec) - expect(result).toStrictEqual(spec) - }) - - it("flattens allOf in components.schemas", () => { - const spec = { - openapi: "3.1.0", - info: { title: "Test", version: "1.0" }, - paths: {}, - components: { - schemas: { - PositiveInt: { - type: "integer", - allOf: [{ exclusiveMinimum: 0, title: "PositiveInt" }] - } - } - } - } - - const result = deduplicateOpenApiSchemas(spec) as any - - expect(result.components.schemas.PositiveInt).toStrictEqual({ - type: "integer", - exclusiveMinimum: 0, - title: "PositiveInt" - }) - }) - - it("does not flatten allOf containing $ref entries", () => { - const spec = { - openapi: "3.1.0", - info: { title: "Test", version: "1.0" }, - paths: {}, - components: { - schemas: { - Composed: { - type: "object", - allOf: [{ $ref: "#/components/schemas/Base" }] - }, - Base: { type: "object", properties: { id: { type: "string" } } } - } - } - } - - const result = deduplicateOpenApiSchemas(spec) as any - - expect(result.components.schemas.Composed).toStrictEqual({ - type: "object", - allOf: [{ $ref: "#/components/schemas/Base" }] - }) - }) - - it("does not flatten allOf entries that define their own type", () => { - const spec = { - openapi: "3.1.0", - info: { title: "Test", version: "1.0" }, - paths: {}, - components: { - schemas: { - Mixed: { - type: "object", - allOf: [{ type: "string", minLength: 1 }] - } - } - } - } - - const result = deduplicateOpenApiSchemas(spec) as any - - expect(result.components.schemas.Mixed).toStrictEqual({ - type: "object", - allOf: [{ type: "string", minLength: 1 }] - }) - }) -}) - -describe("flattenSimpleAllOf", () => { - it("flattens constraint-only allOf into parent with type", () => { - const input = { - type: "integer", - allOf: [{ exclusiveMinimum: 0, title: "PositiveInt" }] - } - expect(flattenSimpleAllOf(input)).toStrictEqual({ - type: "integer", - exclusiveMinimum: 0, - title: "PositiveInt" - }) - }) - - it("flattens string type with multiple constraints", () => { - const input = { - type: "string", - allOf: [ - { minLength: 1, maxLength: 255 }, - { title: "NonEmptyString255" } - ] - } - expect(flattenSimpleAllOf(input)).toStrictEqual({ - type: "string", - minLength: 1, - maxLength: 255, - title: "NonEmptyString255" - }) - }) - - it("does not flatten allOf with $ref", () => { - const input = { - type: "object", - allOf: [{ $ref: "#/components/schemas/Base" }] - } - expect(flattenSimpleAllOf(input)).toStrictEqual(input) - }) - - it("does not flatten allOf entries with their own type", () => { - const input = { - type: "object", - allOf: [{ type: "string", minLength: 1 }] - } - expect(flattenSimpleAllOf(input)).toStrictEqual(input) - }) - - it("allOf entry wins on property conflict", () => { - const input = { - type: "integer", - title: "OldTitle", - allOf: [{ title: "NewTitle", minimum: 0 }] - } - expect(flattenSimpleAllOf(input)).toStrictEqual({ - type: "integer", - title: "NewTitle", - minimum: 0 - }) - }) -}) - -describe("Post-processing integration — real Effect Schema types", () => { - it("PositiveInt — allOf flattened, no wrapping", () => { - const doc = specialJsonSchemaDocument(AppSchema.PositiveInt) - expect(doc.definitions["PositiveInt"]).toStrictEqual({ - type: "integer", - exclusiveMinimum: 0 - }) - }) - - it("NonEmptyString255 — multiple allOf constraints merged", () => { - const doc = specialJsonSchemaDocument(AppSchema.NonEmptyString255) - expect(doc.definitions["NonEmptyString255"]).toStrictEqual({ - type: "string", - minLength: 1, - maxLength: 255 - }) - }) - - it("NullOr(NonEmptyString64k) — null preserved in anyOf, allOf flattened in definition", () => { - const schema = S.Struct({ note: S.NullOr(AppSchema.NonEmptyString64k) }) - const doc = specialJsonSchemaDocument(schema) - - // null variant preserved (correct JSON Schema for NullOr) - expect(doc.schema).toStrictEqual({ - type: "object", - additionalProperties: true, - properties: { - note: { - anyOf: [ - { $ref: "#/$defs/NonEmptyString64k" }, - { type: "null" } - ] - } - }, - required: ["note"] - }) - - // allOf flattened in the referenced definition - expect(doc.definitions["NonEmptyString64k"]).toStrictEqual({ - type: "string", - minLength: 1, - maxLength: 65536 - }) - }) - - it("NonNegativeInt — allOf flattened", () => { - const doc = specialJsonSchemaDocument(AppSchema.NonNegativeInt) - expect(doc.definitions["NonNegativeInt"]).toStrictEqual({ - type: "integer", - minimum: 0 - }) - }) - - it("NullOr union flattens nested anyOf members", () => { - const A = S.String.annotate({ identifier: "A" }) - const B = S.Boolean.annotate({ identifier: "B" }) - const schema = S.Struct({ - value: S.NullOr(S.Union([A, B])) - }) - const doc = specialJsonSchemaDocument(schema) - const valueProp = (doc.schema as Record)["properties"]["value"] - - expect(valueProp).toStrictEqual({ - anyOf: [ - { $ref: "#/$defs/A" }, - { $ref: "#/$defs/B" }, - { type: "null" } - ] - }) - }) -}) - -describe("flattenNestedAnyOf", () => { - it("flattens nested anyOf with no sibling keys", () => { - const input = { - anyOf: [ - { anyOf: [{ type: "string" }, { type: "number" }] }, - { type: "null" } - ] - } - expect(flattenNestedAnyOf(input)).toStrictEqual({ - anyOf: [ - { type: "string" }, - { type: "number" }, - { type: "null" } - ] - }) - }) - - it("does not flatten anyOf entry with sibling keys", () => { - const input = { - anyOf: [ - { anyOf: [{ type: "string" }], title: "X" }, - { type: "null" } - ] - } - // The inner anyOf is not flattened into the outer (sibling "title" prevents it), - // but the single-element inner anyOf is unwrapped within the entry itself - expect(flattenNestedAnyOf(input)).toStrictEqual({ - anyOf: [ - { type: "string", title: "X" }, - { type: "null" } - ] - }) - }) - - it("unwraps anyOf with single item after flattening", () => { - const input = { - anyOf: [ - { anyOf: [{ type: "string" }] } - ] - } - expect(flattenNestedAnyOf(input)).toStrictEqual({ type: "string" }) - }) - - it("unwraps anyOf with single item, merging sibling properties", () => { - const input = { - title: "MyField", - anyOf: [{ type: "string" }] - } - expect(flattenNestedAnyOf(input)).toStrictEqual({ - title: "MyField", - type: "string" - }) - }) - - it("recurses into nested objects", () => { - const input = { - properties: { - field: { - anyOf: [ - { anyOf: [{ $ref: "#/defs/A" }, { $ref: "#/defs/B" }] }, - { type: "null" } - ] - } - } - } - expect(flattenNestedAnyOf(input)).toStrictEqual({ - properties: { - field: { - anyOf: [ - { $ref: "#/defs/A" }, - { $ref: "#/defs/B" }, - { type: "null" } - ] - } - } - }) - }) - - it("passes through non-objects unchanged", () => { - expect(flattenNestedAnyOf(null)).toBe(null) - expect(flattenNestedAnyOf(42)).toBe(42) - expect(flattenNestedAnyOf("hello")).toBe("hello") - }) -}) diff --git a/packages/effect-app/test/utils.test.ts b/packages/effect-app/test/utils.test.ts deleted file mode 100644 index 2fe525b99..000000000 --- a/packages/effect-app/test/utils.test.ts +++ /dev/null @@ -1,209 +0,0 @@ -import * as S from "effect-app/Schema" -import { test } from "vitest" -import { copyOrigin } from "../src/utils.js" - -test("works with class", () => { - class Banana { - name: string - state: { a: string; _tag: "a" } | { b: number; _tag: "b" } - - constructor(params: { name: string; state: { a: string; _tag: "a" } | { b: number; _tag: "b" } }) { - this.name = params.name - this.state = params.state - } - } - - const copyBanana = copyOrigin(Banana) - - const original = new Banana({ name: "banana", state: { a: "a", _tag: "a" } }) - - const res1 = copyBanana( - original, - (_) => ({ state: { b: 1, _tag: "b" } }) - ) satisfies Banana // must be assignable to Banana - - expectTypeOf(res1).toEqualTypeOf<{ - name: string - state: { - b: number - _tag: "b" - } - }>() - - expect(res1).toEqual({ - name: "banana", - state: { b: 1, _tag: "b" } - }) - - expect(Object.getPrototypeOf(res1)).toEqual(Banana.prototype) - - const res2 = copyBanana( - original, - { state: { b: 1, _tag: "b" } } - ) satisfies Banana // must be assignable to Banana - - expectTypeOf(res2).toEqualTypeOf<{ - name: string - state: { - b: number - _tag: "b" - } - }>() - - expect(res2).toEqual({ - name: "banana", - state: { b: 1, _tag: "b" } - }) - - expect(Object.getPrototypeOf(res2)).toEqual(Banana.prototype) - - const res3 = copyBanana( - res2, - { state: { a: "a", _tag: "a" } } - ) satisfies Banana // must be assignable to Banana - - expectTypeOf(res3).toEqualTypeOf<{ - name: string - state: { - a: string - _tag: "a" - } - }>() - - expect(res3).toEqual({ - name: "banana", - state: { a: "a", _tag: "a" } - }) - - expect(Object.getPrototypeOf(res3)).toEqual(Banana.prototype) - - copyBanana( - original, - // @ts-expect-error extraProp is not a valid property of Banana - { name: "string", extraProp: "whatever" } - ) - - copyBanana( - // @ts-expect-error extraProp is not a valid property of Banana - original, - { extraProp: "whatever" } - ) - - const res4 = copyBanana( - original, - (o) => o - ) satisfies Banana // must be assignable to Banana - - expectTypeOf(res4).toEqualTypeOf<{ - name: string - state: { - a: string - _tag: "a" - } | { - b: number - _tag: "b" - } - }>() -}) - -test("works with schema class", () => { - class Banana extends S.Class("Banana")({ - name: S.String, - state: S.Union([ - S.Struct({ a: S.String, _tag: S.tag("a") }), - S.Struct({ b: S.Finite, _tag: S.tag("b") }) - ]) - }) {} - - const copyBanana = copyOrigin(Banana) - - const original = new Banana({ name: "banana", state: { a: "a", _tag: "a" } }) - - const res1 = copyBanana( - original, - (_) => ({ state: { b: 1, _tag: "b" } }) - ) satisfies Banana // must be assignable to Banana - - expectTypeOf(res1).toEqualTypeOf<{ - name: string - state: { - b: number - _tag: "b" - } - }>() - - expect(res1).toEqual({ - name: "banana", - state: { b: 1, _tag: "b" } - }) - - expect(Object.getPrototypeOf(res1)).toEqual(Banana.prototype) - - const res2 = copyBanana( - original, - { state: { b: 1, _tag: "b" } } - ) satisfies Banana // must be assignable to Banana - - expectTypeOf(res2).toEqualTypeOf<{ - name: string - state: { - b: number - _tag: "b" - } - }>() - - expect(res2).toEqual({ - name: "banana", - state: { b: 1, _tag: "b" } - }) - - expect(Object.getPrototypeOf(res2)).toEqual(Banana.prototype) - - const res3 = copyBanana( - res2, - { state: { a: "a", _tag: "a" } } - ) satisfies Banana // must be assignable to Banana - - expectTypeOf(res3).toEqualTypeOf<{ - name: string - state: { - a: string - _tag: "a" - } - }>() - - expect(res3).toEqual({ - name: "banana", - state: { a: "a", _tag: "a" } - }) - - expect(Object.getPrototypeOf(res3)).toEqual(Banana.prototype) - - copyBanana( - original, - // @ts-expect-error extraProp is not a valid property of Banana - { name: "string", extraProp: "whatever" } - ) - - copyBanana( - // @ts-expect-error extraProp is not a valid property of Banana - original, - { extraProp: "whatever" } - ) - - const res4 = copyBanana( - original, - (o) => o - ) satisfies Banana // must be assignable to Banana - - expectTypeOf(res4).toEqualTypeOf<{ - name: string - state: { - readonly a: string - readonly _tag: "a" - } | { - readonly b: number - readonly _tag: "b" - } - }>() -}) diff --git a/packages/effect-app/tsconfig.base.json b/packages/effect-app/tsconfig.base.json deleted file mode 100644 index 832135d45..000000000 --- a/packages/effect-app/tsconfig.base.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "extends": "@tsconfig/strictest/tsconfig.json", - "compilerOptions": { - "module": "Node16", - "lib": [ - "ES2023" - ], - "target": "ES2022", - // inline source maps stay better in sync with the source, which should aid with watchers. - // "sourceMap": true, - "inlineSourceMap": true, - "incremental": true, - "composite": true, - "declarationMap": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "noImplicitAny": true, - "useUnknownInCatchVariables": true, - // This is not desirable, as it's useful in generators. - "noImplicitReturns": false, - "noImplicitThis": true, - "resolveJsonModule": true, - "moduleResolution": "Node16", - "noErrorTruncation": true, - "forceConsistentCasingInFileNames": true, - "rewriteRelativeImportExtensions": true, - "allowImportingTsExtensions": true - }, - "watchOptions": { - // Use native file system events for files and directories - // This actually detect changes in parent directories ... not great! - // however it seems that the response is very fast on the non-related projects figuring out their files are unchanged... - "watchFile": "useFsEvents", - "watchDirectory": "useFsEvents", - // // Poll files for updates more frequently - // // when they're updated a lot. - "fallbackPolling": "dynamicPriority", - "excludeDirectories": [ - "**/node_modules", - "**/dist", - "**/.build", - "**/.git", - "**/.data", - "**/.logs", - "**/.*" - ], - "excludeFiles": [ - "**/*.tmp", - "openapi.json", - "*.json" - ] - }, - "files": [], - "include": [], - "exclude": [ - "**/node_modules", - "**/build", - "**/dist", - "**/.*" - ] -} diff --git a/packages/effect-app/tsconfig.json b/packages/effect-app/tsconfig.json deleted file mode 100644 index 8565116ac..000000000 --- a/packages/effect-app/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": {}, - "extends": "../../tsconfig.base.json", - "references": [ - { - "path": "./tsconfig.src.json" - }, - { - "path": "./tsconfig.test.json" - } - ] -} diff --git a/packages/effect-app/tsconfig.src.json b/packages/effect-app/tsconfig.src.json deleted file mode 100644 index 872c35832..000000000 --- a/packages/effect-app/tsconfig.src.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "lib": [ - "esnext" - ], - "tsBuildInfoFile": "./dist/.tsbuildinfo", - "esModuleInterop": true, - "rootDir": "./src", - // keep in here, cause madge can't detect it from extended tsconfig - "moduleResolution": "Node16", - "outDir": "./dist" - }, - "include": [ - "./src/**/*.ts" - ], - "exclude": [ - "./dist", - "*.test.ts", - "node_modules", - "build", - "lib", - "dist", - "**/*.d.ts.map", - ".git", - ".data", - "**/.*", - "**/*.tmp" - ], - "references": [] -} diff --git a/packages/effect-app/tsconfig.test.json b/packages/effect-app/tsconfig.test.json deleted file mode 100644 index c071d42d0..000000000 --- a/packages/effect-app/tsconfig.test.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "extends": "./tsconfig.src.json", - "compilerOptions": { - "rootDir": "./test", - "outDir": "./test/dist", - "tsBuildInfoFile": "./test/dist/.tsbuildinfo", - "types": [ - "node", - "vitest/globals" - ] - }, - "include": [ - "./test/**/*.ts" - ], - "exclude": [ - "./dist", - "./test/dist", - "node_modules", - "build", - "lib", - "dist", - "**/*.d.ts.map", - ".git", - ".data", - "**/.*", - "**/*.tmp" - ], - "references": [ - { - "path": "./tsconfig.src.json" - } - ] -} diff --git a/packages/effect-app/vitest.config.ts b/packages/effect-app/vitest.config.ts deleted file mode 100644 index 85903fa64..000000000 --- a/packages/effect-app/vitest.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -import { defineConfig } from "vitest/config" -import makeConfig from "../../vite.config.base" - -export default defineConfig(makeConfig(__dirname)) diff --git a/repos/effect/packages/effect/ARBITRARY-FOLLOW-UPS.md b/packages/effect/ARBITRARY-FOLLOW-UPS.md similarity index 100% rename from repos/effect/packages/effect/ARBITRARY-FOLLOW-UPS.md rename to packages/effect/ARBITRARY-FOLLOW-UPS.md diff --git a/repos/effect/packages/effect/ARBITRARY-MIGRATION.md b/packages/effect/ARBITRARY-MIGRATION.md similarity index 100% rename from repos/effect/packages/effect/ARBITRARY-MIGRATION.md rename to packages/effect/ARBITRARY-MIGRATION.md diff --git a/repos/effect/packages/effect/ARBITRARY.md b/packages/effect/ARBITRARY.md similarity index 100% rename from repos/effect/packages/effect/ARBITRARY.md rename to packages/effect/ARBITRARY.md diff --git a/repos/effect/packages/effect/CHANGELOG.md b/packages/effect/CHANGELOG.md similarity index 99% rename from repos/effect/packages/effect/CHANGELOG.md rename to packages/effect/CHANGELOG.md index e1585ca6d..9e7c1dcbd 100644 --- a/repos/effect/packages/effect/CHANGELOG.md +++ b/packages/effect/CHANGELOG.md @@ -1,5 +1,15 @@ # effect +## 4.0.0-rc.115 + +### Patch Changes + +- [#8196](https://github.com/Effect-TS/effect/pull/8196) [`657254b`](https://github.com/Effect-TS/effect/commit/657254b8218628b0116497d09aaf783cb88279f3) Thanks @gcanti! - Optimize schema initialization while preserving custom constructor options. + +- [#8190](https://github.com/Effect-TS/effect/pull/8190) [`f9ef0e9`](https://github.com/Effect-TS/effect/commit/f9ef0e970260b5de143392d00593e6c8b4614cff) Thanks @javascript-unsafe! - Omit response bodies for statuses 204, 205, and 304 in `HttpServerResponse.toWeb` and the Bun/Deno HTTP adapters, preventing invalid Web responses and hung requests. Cancel omitted raw `ReadableStream` bodies, and finalize request resources without starting omitted Effect streams. + +- [#8187](https://github.com/Effect-TS/effect/pull/8187) [`4f73f9e`](https://github.com/Effect-TS/effect/commit/4f73f9e0bd9538260f0f7166e0e6abdbd507a0e8) Thanks @tim-smart! - Parameterize persistence lookup keys in both SQL backing stores' `getMany` queries. + ## 4.0.0-rc.114 ### Patch Changes diff --git a/repos/effect/packages/effect/CONFIG.md b/packages/effect/CONFIG.md similarity index 100% rename from repos/effect/packages/effect/CONFIG.md rename to packages/effect/CONFIG.md diff --git a/repos/effect/packages/effect/HTTPAPI.md b/packages/effect/HTTPAPI.md similarity index 100% rename from repos/effect/packages/effect/HTTPAPI.md rename to packages/effect/HTTPAPI.md diff --git a/repos/effect/packages/effect/LICENSE b/packages/effect/LICENSE similarity index 100% rename from repos/effect/packages/effect/LICENSE rename to packages/effect/LICENSE diff --git a/repos/effect/packages/effect/MCP.md b/packages/effect/MCP.md similarity index 100% rename from repos/effect/packages/effect/MCP.md rename to packages/effect/MCP.md diff --git a/repos/effect/packages/effect/OPTIC.md b/packages/effect/OPTIC.md similarity index 100% rename from repos/effect/packages/effect/OPTIC.md rename to packages/effect/OPTIC.md diff --git a/repos/effect/packages/effect/README.md b/packages/effect/README.md similarity index 100% rename from repos/effect/packages/effect/README.md rename to packages/effect/README.md diff --git a/repos/effect/packages/effect/SCHEMA.md b/packages/effect/SCHEMA.md similarity index 100% rename from repos/effect/packages/effect/SCHEMA.md rename to packages/effect/SCHEMA.md diff --git a/repos/effect/packages/effect/benchmark/Pool.ts b/packages/effect/benchmark/Pool.ts similarity index 100% rename from repos/effect/packages/effect/benchmark/Pool.ts rename to packages/effect/benchmark/Pool.ts diff --git a/repos/effect/packages/effect/benchmark/http/multipart.ts b/packages/effect/benchmark/http/multipart.ts similarity index 100% rename from repos/effect/packages/effect/benchmark/http/multipart.ts rename to packages/effect/benchmark/http/multipart.ts diff --git a/repos/effect/packages/effect/benchmark/http/serverAllocations.ts b/packages/effect/benchmark/http/serverAllocations.ts similarity index 100% rename from repos/effect/packages/effect/benchmark/http/serverAllocations.ts rename to packages/effect/benchmark/http/serverAllocations.ts diff --git a/repos/effect/packages/effect/benchmark/http/tracer.ts b/packages/effect/benchmark/http/tracer.ts similarity index 100% rename from repos/effect/packages/effect/benchmark/http/tracer.ts rename to packages/effect/benchmark/http/tracer.ts diff --git a/repos/effect/packages/effect/benchmark/httpapi/sseClientDecoder.ts b/packages/effect/benchmark/httpapi/sseClientDecoder.ts similarity index 100% rename from repos/effect/packages/effect/benchmark/httpapi/sseClientDecoder.ts rename to packages/effect/benchmark/httpapi/sseClientDecoder.ts diff --git a/repos/effect/packages/effect/benchmark/rpc/RpcSerialization.ts b/packages/effect/benchmark/rpc/RpcSerialization.ts similarity index 100% rename from repos/effect/packages/effect/benchmark/rpc/RpcSerialization.ts rename to packages/effect/benchmark/rpc/RpcSerialization.ts diff --git a/repos/effect/packages/effect/benchmark/schema/Optic.ts b/packages/effect/benchmark/schema/Optic.ts similarity index 100% rename from repos/effect/packages/effect/benchmark/schema/Optic.ts rename to packages/effect/benchmark/schema/Optic.ts diff --git a/repos/effect/packages/effect/benchmark/schema/SchemaBinary.md b/packages/effect/benchmark/schema/SchemaBinary.md similarity index 100% rename from repos/effect/packages/effect/benchmark/schema/SchemaBinary.md rename to packages/effect/benchmark/schema/SchemaBinary.md diff --git a/repos/effect/packages/effect/benchmark/schema/SchemaBinary.ts b/packages/effect/benchmark/schema/SchemaBinary.ts similarity index 100% rename from repos/effect/packages/effect/benchmark/schema/SchemaBinary.ts rename to packages/effect/benchmark/schema/SchemaBinary.ts diff --git a/repos/effect/packages/effect/benchmark/schema/SchemaError.ts b/packages/effect/benchmark/schema/SchemaError.ts similarity index 100% rename from repos/effect/packages/effect/benchmark/schema/SchemaError.ts rename to packages/effect/benchmark/schema/SchemaError.ts diff --git a/repos/effect/packages/effect/benchmark/stream/splitLines.ts b/packages/effect/benchmark/stream/splitLines.ts similarity index 100% rename from repos/effect/packages/effect/benchmark/stream/splitLines.ts rename to packages/effect/benchmark/stream/splitLines.ts diff --git a/repos/effect/packages/effect/package.json b/packages/effect/package.json similarity index 98% rename from repos/effect/packages/effect/package.json rename to packages/effect/package.json index ea3707531..96edea2fa 100644 --- a/repos/effect/packages/effect/package.json +++ b/packages/effect/package.json @@ -1,7 +1,7 @@ { "name": "effect", "type": "module", - "version": "4.0.0-rc.114", + "version": "4.0.0-rc.115", "license": "MIT", "description": "The missing standard library for TypeScript, for writing production-grade software.", "homepage": "https://effect.website", @@ -116,6 +116,6 @@ "immer": "^11.1.18", "protobufjs": "^8.8.0", "tinybench": "^6.1.6", - "valibot": "^1.4.2" + "valibot": "^1.5.0" } } diff --git a/repos/effect/packages/effect/runtimeperf/README.md b/packages/effect/runtimeperf/README.md similarity index 100% rename from repos/effect/packages/effect/runtimeperf/README.md rename to packages/effect/runtimeperf/README.md diff --git a/repos/effect/packages/effect/runtimeperf/compare.mts b/packages/effect/runtimeperf/compare.mts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/compare.mts rename to packages/effect/runtimeperf/compare.mts diff --git a/repos/effect/packages/effect/runtimeperf/config.json b/packages/effect/runtimeperf/config.json similarity index 96% rename from repos/effect/packages/effect/runtimeperf/config.json rename to packages/effect/runtimeperf/config.json index 01ec037fe..516e43c7c 100644 --- a/repos/effect/packages/effect/runtimeperf/config.json +++ b/packages/effect/runtimeperf/config.json @@ -1171,6 +1171,13 @@ "size": 2 }, "cases": [ + { + "name": "adapter-make-valid", + "export": "makeValid", + "scenario": "adapter-make-valid", + "operation": "make", + "adapter": "Sync" + }, { "name": "adapter-parser-decode-exit-invalid", "export": "parserExitInvalid", @@ -1246,6 +1253,44 @@ "size": 32 }, "cases": [ + { + "name": "schema-creation-object-2-effect", + "export": "effectSchemaCreationObject2", + "scenario": "schema-creation-object-2", + "implementation": "effect", + "operation": "schema", + "size": 2 + }, + { + "name": "schema-creation-object-32-effect", + "export": "effectSchemaCreationObject32", + "scenario": "schema-creation-object-32", + "implementation": "effect", + "operation": "schema" + }, + { + "name": "schema-creation-object-256-effect", + "export": "effectSchemaCreationObject256", + "scenario": "schema-creation-object-256", + "implementation": "effect", + "operation": "schema", + "size": 256 + }, + { + "name": "schema-creation-encoded-record-effect", + "export": "effectSchemaCreationEncodedRecord", + "scenario": "schema-creation-encoded-record", + "implementation": "effect", + "operation": "schema" + }, + { + "name": "first-make-object-2-effect", + "export": "effectFirstMakeObject2", + "scenario": "first-make-object-2", + "implementation": "effect", + "operation": "first-make", + "size": 2 + }, { "name": "schema-creation-template-literal-effect", "export": "effectSchemaCreationTemplateLiteral", @@ -1257,6 +1302,17 @@ ], "size": 5 }, + { + "name": "schema-creation-template-literal-256-effect", + "export": "effectSchemaCreationTemplateLiteral256", + "scenario": "schema-creation-template-literal-256", + "implementation": "effect", + "operation": "schema", + "astTags": [ + "TemplateLiteral" + ], + "size": 256 + }, { "name": "first-decode-checked-object-32-effect", "export": "effectFirstDecodeCheckedObject32", diff --git a/repos/effect/packages/effect/runtimeperf/materialize.mts b/packages/effect/runtimeperf/materialize.mts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/materialize.mts rename to packages/effect/runtimeperf/materialize.mts diff --git a/repos/effect/packages/effect/runtimeperf/run.mts b/packages/effect/runtimeperf/run.mts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/run.mts rename to packages/effect/runtimeperf/run.mts diff --git a/repos/effect/packages/effect/runtimeperf/stats.mts b/packages/effect/runtimeperf/stats.mts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/stats.mts rename to packages/effect/runtimeperf/stats.mts diff --git a/repos/effect/packages/effect/runtimeperf/suites/arbitrary/fixtures/fast-check-v4.ts b/packages/effect/runtimeperf/suites/arbitrary/fixtures/fast-check-v4.ts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/suites/arbitrary/fixtures/fast-check-v4.ts rename to packages/effect/runtimeperf/suites/arbitrary/fixtures/fast-check-v4.ts diff --git a/repos/effect/packages/effect/runtimeperf/suites/arbitrary/fixtures/native.ts b/packages/effect/runtimeperf/suites/arbitrary/fixtures/native.ts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/suites/arbitrary/fixtures/native.ts rename to packages/effect/runtimeperf/suites/arbitrary/fixtures/native.ts diff --git a/repos/effect/packages/effect/runtimeperf/suites/arbitrary/fixtures/schema.ts b/packages/effect/runtimeperf/suites/arbitrary/fixtures/schema.ts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/suites/arbitrary/fixtures/schema.ts rename to packages/effect/runtimeperf/suites/arbitrary/fixtures/schema.ts diff --git a/repos/effect/packages/effect/runtimeperf/suites/schema-benchmarks/fixtures/data.ts b/packages/effect/runtimeperf/suites/schema-benchmarks/fixtures/data.ts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/suites/schema-benchmarks/fixtures/data.ts rename to packages/effect/runtimeperf/suites/schema-benchmarks/fixtures/data.ts diff --git a/repos/effect/packages/effect/runtimeperf/suites/schema-benchmarks/fixtures/effect-beta.ts b/packages/effect/runtimeperf/suites/schema-benchmarks/fixtures/effect-beta.ts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/suites/schema-benchmarks/fixtures/effect-beta.ts rename to packages/effect/runtimeperf/suites/schema-benchmarks/fixtures/effect-beta.ts diff --git a/repos/effect/packages/effect/runtimeperf/suites/schema-benchmarks/fixtures/valibot.ts b/packages/effect/runtimeperf/suites/schema-benchmarks/fixtures/valibot.ts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/suites/schema-benchmarks/fixtures/valibot.ts rename to packages/effect/runtimeperf/suites/schema-benchmarks/fixtures/valibot.ts diff --git a/repos/effect/packages/effect/runtimeperf/suites/schema-benchmarks/fixtures/zod.ts b/packages/effect/runtimeperf/suites/schema-benchmarks/fixtures/zod.ts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/suites/schema-benchmarks/fixtures/zod.ts rename to packages/effect/runtimeperf/suites/schema-benchmarks/fixtures/zod.ts diff --git a/repos/effect/packages/effect/runtimeperf/suites/schema/fixtures/adapters.ts b/packages/effect/runtimeperf/suites/schema/fixtures/adapters.ts similarity index 94% rename from repos/effect/packages/effect/runtimeperf/suites/schema/fixtures/adapters.ts rename to packages/effect/runtimeperf/suites/schema/fixtures/adapters.ts index 2a84cab07..e5d891cd7 100644 --- a/repos/effect/packages/effect/runtimeperf/suites/schema/fixtures/adapters.ts +++ b/packages/effect/runtimeperf/suites/schema/fixtures/adapters.ts @@ -11,6 +11,11 @@ const schema = Schema.Struct({ const input = { a: "a", b: 1 } const invalidInput = { a: "a", b: "invalid" } +export const makeValid = () => ({ + run: () => schema.make(input), + validate: (result) => assert.deepEqual(result, input) +}) + export const parserExitInvalid = () => { const run = SchemaParser.decodeUnknownExit(schema) return { diff --git a/repos/effect/packages/effect/runtimeperf/suites/schema/fixtures/behavior.ts b/packages/effect/runtimeperf/suites/schema/fixtures/behavior.ts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/suites/schema/fixtures/behavior.ts rename to packages/effect/runtimeperf/suites/schema/fixtures/behavior.ts diff --git a/repos/effect/packages/effect/runtimeperf/suites/schema/fixtures/cold.ts b/packages/effect/runtimeperf/suites/schema/fixtures/cold.ts similarity index 60% rename from repos/effect/packages/effect/runtimeperf/suites/schema/fixtures/cold.ts rename to packages/effect/runtimeperf/suites/schema/fixtures/cold.ts index 2f62d5ac0..59dc535f9 100644 --- a/repos/effect/packages/effect/runtimeperf/suites/schema/fixtures/cold.ts +++ b/packages/effect/runtimeperf/suites/schema/fixtures/cold.ts @@ -14,7 +14,32 @@ const makeEffectCheckedSchema = () => const makeEffectTemplateLiteralSchema = () => Schema.TemplateLiteral(["prefix-", Schema.String, "-middle-", Schema.Number, "-suffix"]) +const templateLiteral256Parts = Array.from({ length: 256 }, (_, index) => Schema.Literal(`part${index}`)) +const makeEffectTemplateLiteral256Schema = () => Schema.TemplateLiteral(templateLiteral256Parts) + const makeEffectRecordSchema = () => Schema.Record(Schema.String, Schema.String) +const makeEffectEncodedRecordSchema = () => + Schema.Record( + Schema.String.pipe(Schema.decodeTo(Schema.Number, SchemaTransformation.passthrough())), + Schema.String + ) + +const makeEffectObject2Schema = () => + Schema.Struct({ + name: Schema.String, + age: Schema.Number + }) + +const makeObjectFields = (size: number) => + Object.fromEntries(Array.from({ length: size }, (_, index) => [`field${index}`, Schema.NonEmptyString])) + +const object32Fields = makeObjectFields(32) +const object256Fields = makeObjectFields(256) + +const makeEffectObject32Schema = () => Schema.Struct(object32Fields) +const makeEffectObject256Schema = () => Schema.Struct(object256Fields) + +const object2Input = { name: "John", age: 42 } const literalValues100 = Array.from({ length: 100 }, (_, index) => `value${index}`) @@ -53,6 +78,36 @@ export const effectSchemaCreationTemplateLiteral = () => ({ validate: (schema) => assert.equal(schema.ast._tag, "TemplateLiteral") }) +export const effectSchemaCreationTemplateLiteral256 = () => ({ + run: makeEffectTemplateLiteral256Schema, + validate: (schema) => assert.equal(schema.ast._tag, "TemplateLiteral") +}) + +export const effectSchemaCreationObject2 = () => ({ + run: makeEffectObject2Schema, + validate: (schema) => assert.equal(schema.ast._tag, "Objects") +}) + +export const effectSchemaCreationObject32 = () => ({ + run: makeEffectObject32Schema, + validate: (schema) => assert.equal(schema.ast._tag, "Objects") +}) + +export const effectSchemaCreationObject256 = () => ({ + run: makeEffectObject256Schema, + validate: (schema) => assert.equal(schema.ast._tag, "Objects") +}) + +export const effectSchemaCreationEncodedRecord = () => ({ + run: makeEffectEncodedRecordSchema, + validate: (schema) => assert.equal(schema.ast._tag, "Objects") +}) + +export const effectFirstMakeObject2 = () => ({ + run: () => makeEffectObject2Schema().make(object2Input), + validate: (result) => assert.deepEqual(result, object2Input) +}) + export const effectFirstDecodeCheckedObject32 = () => ({ run: () => SchemaParser.decodeUnknownExit(makeEffectCheckedSchema())(input), validate: (result) => assert.equal(result._tag, "Success") diff --git a/repos/effect/packages/effect/runtimeperf/suites/schema/fixtures/comparison.ts b/packages/effect/runtimeperf/suites/schema/fixtures/comparison.ts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/suites/schema/fixtures/comparison.ts rename to packages/effect/runtimeperf/suites/schema/fixtures/comparison.ts diff --git a/repos/effect/packages/effect/runtimeperf/test/materialize.test.mts b/packages/effect/runtimeperf/test/materialize.test.mts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/test/materialize.test.mts rename to packages/effect/runtimeperf/test/materialize.test.mts diff --git a/repos/effect/packages/effect/runtimeperf/test/registry.test.mts b/packages/effect/runtimeperf/test/registry.test.mts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/test/registry.test.mts rename to packages/effect/runtimeperf/test/registry.test.mts diff --git a/repos/effect/packages/effect/runtimeperf/test/stats.test.mts b/packages/effect/runtimeperf/test/stats.test.mts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/test/stats.test.mts rename to packages/effect/runtimeperf/test/stats.test.mts diff --git a/repos/effect/packages/effect/runtimeperf/test/worker.test.mts b/packages/effect/runtimeperf/test/worker.test.mts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/test/worker.test.mts rename to packages/effect/runtimeperf/test/worker.test.mts diff --git a/repos/effect/packages/effect/runtimeperf/utils.mts b/packages/effect/runtimeperf/utils.mts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/utils.mts rename to packages/effect/runtimeperf/utils.mts diff --git a/repos/effect/packages/effect/runtimeperf/worker.mts b/packages/effect/runtimeperf/worker.mts similarity index 100% rename from repos/effect/packages/effect/runtimeperf/worker.mts rename to packages/effect/runtimeperf/worker.mts diff --git a/repos/effect/packages/effect/src/Array.ts b/packages/effect/src/Array.ts similarity index 100% rename from repos/effect/packages/effect/src/Array.ts rename to packages/effect/src/Array.ts diff --git a/repos/effect/packages/effect/src/BigDecimal.ts b/packages/effect/src/BigDecimal.ts similarity index 100% rename from repos/effect/packages/effect/src/BigDecimal.ts rename to packages/effect/src/BigDecimal.ts diff --git a/repos/effect/packages/effect/src/BigInt.ts b/packages/effect/src/BigInt.ts similarity index 100% rename from repos/effect/packages/effect/src/BigInt.ts rename to packages/effect/src/BigInt.ts diff --git a/repos/effect/packages/effect/src/Boolean.ts b/packages/effect/src/Boolean.ts similarity index 100% rename from repos/effect/packages/effect/src/Boolean.ts rename to packages/effect/src/Boolean.ts diff --git a/repos/effect/packages/effect/src/Brand.ts b/packages/effect/src/Brand.ts similarity index 100% rename from repos/effect/packages/effect/src/Brand.ts rename to packages/effect/src/Brand.ts diff --git a/repos/effect/packages/effect/src/ByteSize.ts b/packages/effect/src/ByteSize.ts similarity index 100% rename from repos/effect/packages/effect/src/ByteSize.ts rename to packages/effect/src/ByteSize.ts diff --git a/repos/effect/packages/effect/src/Cache.ts b/packages/effect/src/Cache.ts similarity index 100% rename from repos/effect/packages/effect/src/Cache.ts rename to packages/effect/src/Cache.ts diff --git a/repos/effect/packages/effect/src/Cause.ts b/packages/effect/src/Cause.ts similarity index 100% rename from repos/effect/packages/effect/src/Cause.ts rename to packages/effect/src/Cause.ts diff --git a/repos/effect/packages/effect/src/Channel.ts b/packages/effect/src/Channel.ts similarity index 100% rename from repos/effect/packages/effect/src/Channel.ts rename to packages/effect/src/Channel.ts diff --git a/repos/effect/packages/effect/src/ChannelSchema.ts b/packages/effect/src/ChannelSchema.ts similarity index 100% rename from repos/effect/packages/effect/src/ChannelSchema.ts rename to packages/effect/src/ChannelSchema.ts diff --git a/repos/effect/packages/effect/src/Chunk.ts b/packages/effect/src/Chunk.ts similarity index 100% rename from repos/effect/packages/effect/src/Chunk.ts rename to packages/effect/src/Chunk.ts diff --git a/repos/effect/packages/effect/src/Clock.ts b/packages/effect/src/Clock.ts similarity index 100% rename from repos/effect/packages/effect/src/Clock.ts rename to packages/effect/src/Clock.ts diff --git a/repos/effect/packages/effect/src/Combiner.ts b/packages/effect/src/Combiner.ts similarity index 100% rename from repos/effect/packages/effect/src/Combiner.ts rename to packages/effect/src/Combiner.ts diff --git a/repos/effect/packages/effect/src/Config.ts b/packages/effect/src/Config.ts similarity index 100% rename from repos/effect/packages/effect/src/Config.ts rename to packages/effect/src/Config.ts diff --git a/repos/effect/packages/effect/src/ConfigProvider.ts b/packages/effect/src/ConfigProvider.ts similarity index 100% rename from repos/effect/packages/effect/src/ConfigProvider.ts rename to packages/effect/src/ConfigProvider.ts diff --git a/repos/effect/packages/effect/src/Console.ts b/packages/effect/src/Console.ts similarity index 100% rename from repos/effect/packages/effect/src/Console.ts rename to packages/effect/src/Console.ts diff --git a/repos/effect/packages/effect/src/Context.ts b/packages/effect/src/Context.ts similarity index 100% rename from repos/effect/packages/effect/src/Context.ts rename to packages/effect/src/Context.ts diff --git a/repos/effect/packages/effect/src/Cron.ts b/packages/effect/src/Cron.ts similarity index 100% rename from repos/effect/packages/effect/src/Cron.ts rename to packages/effect/src/Cron.ts diff --git a/repos/effect/packages/effect/src/Crypto.ts b/packages/effect/src/Crypto.ts similarity index 100% rename from repos/effect/packages/effect/src/Crypto.ts rename to packages/effect/src/Crypto.ts diff --git a/repos/effect/packages/effect/src/Data.ts b/packages/effect/src/Data.ts similarity index 100% rename from repos/effect/packages/effect/src/Data.ts rename to packages/effect/src/Data.ts diff --git a/repos/effect/packages/effect/src/DateTime.ts b/packages/effect/src/DateTime.ts similarity index 100% rename from repos/effect/packages/effect/src/DateTime.ts rename to packages/effect/src/DateTime.ts diff --git a/repos/effect/packages/effect/src/Deferred.ts b/packages/effect/src/Deferred.ts similarity index 100% rename from repos/effect/packages/effect/src/Deferred.ts rename to packages/effect/src/Deferred.ts diff --git a/repos/effect/packages/effect/src/Differ.ts b/packages/effect/src/Differ.ts similarity index 100% rename from repos/effect/packages/effect/src/Differ.ts rename to packages/effect/src/Differ.ts diff --git a/repos/effect/packages/effect/src/Duration.ts b/packages/effect/src/Duration.ts similarity index 100% rename from repos/effect/packages/effect/src/Duration.ts rename to packages/effect/src/Duration.ts diff --git a/repos/effect/packages/effect/src/Effect.ts b/packages/effect/src/Effect.ts similarity index 100% rename from repos/effect/packages/effect/src/Effect.ts rename to packages/effect/src/Effect.ts diff --git a/repos/effect/packages/effect/src/Effectable.ts b/packages/effect/src/Effectable.ts similarity index 100% rename from repos/effect/packages/effect/src/Effectable.ts rename to packages/effect/src/Effectable.ts diff --git a/repos/effect/packages/effect/src/Encoding.ts b/packages/effect/src/Encoding.ts similarity index 100% rename from repos/effect/packages/effect/src/Encoding.ts rename to packages/effect/src/Encoding.ts diff --git a/repos/effect/packages/effect/src/Equal.ts b/packages/effect/src/Equal.ts similarity index 100% rename from repos/effect/packages/effect/src/Equal.ts rename to packages/effect/src/Equal.ts diff --git a/repos/effect/packages/effect/src/Equivalence.ts b/packages/effect/src/Equivalence.ts similarity index 100% rename from repos/effect/packages/effect/src/Equivalence.ts rename to packages/effect/src/Equivalence.ts diff --git a/repos/effect/packages/effect/src/ErrorReporter.ts b/packages/effect/src/ErrorReporter.ts similarity index 100% rename from repos/effect/packages/effect/src/ErrorReporter.ts rename to packages/effect/src/ErrorReporter.ts diff --git a/repos/effect/packages/effect/src/ExecutionPlan.ts b/packages/effect/src/ExecutionPlan.ts similarity index 100% rename from repos/effect/packages/effect/src/ExecutionPlan.ts rename to packages/effect/src/ExecutionPlan.ts diff --git a/repos/effect/packages/effect/src/Exit.ts b/packages/effect/src/Exit.ts similarity index 100% rename from repos/effect/packages/effect/src/Exit.ts rename to packages/effect/src/Exit.ts diff --git a/repos/effect/packages/effect/src/Fiber.ts b/packages/effect/src/Fiber.ts similarity index 100% rename from repos/effect/packages/effect/src/Fiber.ts rename to packages/effect/src/Fiber.ts diff --git a/repos/effect/packages/effect/src/FiberHandle.ts b/packages/effect/src/FiberHandle.ts similarity index 100% rename from repos/effect/packages/effect/src/FiberHandle.ts rename to packages/effect/src/FiberHandle.ts diff --git a/repos/effect/packages/effect/src/FiberMap.ts b/packages/effect/src/FiberMap.ts similarity index 100% rename from repos/effect/packages/effect/src/FiberMap.ts rename to packages/effect/src/FiberMap.ts diff --git a/repos/effect/packages/effect/src/FiberSet.ts b/packages/effect/src/FiberSet.ts similarity index 100% rename from repos/effect/packages/effect/src/FiberSet.ts rename to packages/effect/src/FiberSet.ts diff --git a/repos/effect/packages/effect/src/FileSystem.ts b/packages/effect/src/FileSystem.ts similarity index 100% rename from repos/effect/packages/effect/src/FileSystem.ts rename to packages/effect/src/FileSystem.ts diff --git a/repos/effect/packages/effect/src/Filter.ts b/packages/effect/src/Filter.ts similarity index 100% rename from repos/effect/packages/effect/src/Filter.ts rename to packages/effect/src/Filter.ts diff --git a/repos/effect/packages/effect/src/Formatter.ts b/packages/effect/src/Formatter.ts similarity index 100% rename from repos/effect/packages/effect/src/Formatter.ts rename to packages/effect/src/Formatter.ts diff --git a/repos/effect/packages/effect/src/Function.ts b/packages/effect/src/Function.ts similarity index 100% rename from repos/effect/packages/effect/src/Function.ts rename to packages/effect/src/Function.ts diff --git a/repos/effect/packages/effect/src/Graph.ts b/packages/effect/src/Graph.ts similarity index 100% rename from repos/effect/packages/effect/src/Graph.ts rename to packages/effect/src/Graph.ts diff --git a/repos/effect/packages/effect/src/HKT.ts b/packages/effect/src/HKT.ts similarity index 100% rename from repos/effect/packages/effect/src/HKT.ts rename to packages/effect/src/HKT.ts diff --git a/repos/effect/packages/effect/src/Hash.ts b/packages/effect/src/Hash.ts similarity index 100% rename from repos/effect/packages/effect/src/Hash.ts rename to packages/effect/src/Hash.ts diff --git a/repos/effect/packages/effect/src/HashMap.ts b/packages/effect/src/HashMap.ts similarity index 100% rename from repos/effect/packages/effect/src/HashMap.ts rename to packages/effect/src/HashMap.ts diff --git a/repos/effect/packages/effect/src/HashRing.ts b/packages/effect/src/HashRing.ts similarity index 100% rename from repos/effect/packages/effect/src/HashRing.ts rename to packages/effect/src/HashRing.ts diff --git a/repos/effect/packages/effect/src/HashSet.ts b/packages/effect/src/HashSet.ts similarity index 100% rename from repos/effect/packages/effect/src/HashSet.ts rename to packages/effect/src/HashSet.ts diff --git a/repos/effect/packages/effect/src/Inspectable.ts b/packages/effect/src/Inspectable.ts similarity index 100% rename from repos/effect/packages/effect/src/Inspectable.ts rename to packages/effect/src/Inspectable.ts diff --git a/repos/effect/packages/effect/src/Iterable.ts b/packages/effect/src/Iterable.ts similarity index 100% rename from repos/effect/packages/effect/src/Iterable.ts rename to packages/effect/src/Iterable.ts diff --git a/repos/effect/packages/effect/src/JsonPatch.ts b/packages/effect/src/JsonPatch.ts similarity index 100% rename from repos/effect/packages/effect/src/JsonPatch.ts rename to packages/effect/src/JsonPatch.ts diff --git a/repos/effect/packages/effect/src/JsonPointer.ts b/packages/effect/src/JsonPointer.ts similarity index 100% rename from repos/effect/packages/effect/src/JsonPointer.ts rename to packages/effect/src/JsonPointer.ts diff --git a/repos/effect/packages/effect/src/JsonSchema.ts b/packages/effect/src/JsonSchema.ts similarity index 100% rename from repos/effect/packages/effect/src/JsonSchema.ts rename to packages/effect/src/JsonSchema.ts diff --git a/repos/effect/packages/effect/src/Latch.ts b/packages/effect/src/Latch.ts similarity index 100% rename from repos/effect/packages/effect/src/Latch.ts rename to packages/effect/src/Latch.ts diff --git a/repos/effect/packages/effect/src/Layer.ts b/packages/effect/src/Layer.ts similarity index 100% rename from repos/effect/packages/effect/src/Layer.ts rename to packages/effect/src/Layer.ts diff --git a/repos/effect/packages/effect/src/LayerMap.ts b/packages/effect/src/LayerMap.ts similarity index 100% rename from repos/effect/packages/effect/src/LayerMap.ts rename to packages/effect/src/LayerMap.ts diff --git a/repos/effect/packages/effect/src/LayerRef.ts b/packages/effect/src/LayerRef.ts similarity index 100% rename from repos/effect/packages/effect/src/LayerRef.ts rename to packages/effect/src/LayerRef.ts diff --git a/repos/effect/packages/effect/src/LogLevel.ts b/packages/effect/src/LogLevel.ts similarity index 100% rename from repos/effect/packages/effect/src/LogLevel.ts rename to packages/effect/src/LogLevel.ts diff --git a/repos/effect/packages/effect/src/Logger.ts b/packages/effect/src/Logger.ts similarity index 100% rename from repos/effect/packages/effect/src/Logger.ts rename to packages/effect/src/Logger.ts diff --git a/repos/effect/packages/effect/src/ManagedRuntime.ts b/packages/effect/src/ManagedRuntime.ts similarity index 100% rename from repos/effect/packages/effect/src/ManagedRuntime.ts rename to packages/effect/src/ManagedRuntime.ts diff --git a/repos/effect/packages/effect/src/Match.ts b/packages/effect/src/Match.ts similarity index 100% rename from repos/effect/packages/effect/src/Match.ts rename to packages/effect/src/Match.ts diff --git a/repos/effect/packages/effect/src/Metric.ts b/packages/effect/src/Metric.ts similarity index 100% rename from repos/effect/packages/effect/src/Metric.ts rename to packages/effect/src/Metric.ts diff --git a/repos/effect/packages/effect/src/MutableHashMap.ts b/packages/effect/src/MutableHashMap.ts similarity index 100% rename from repos/effect/packages/effect/src/MutableHashMap.ts rename to packages/effect/src/MutableHashMap.ts diff --git a/repos/effect/packages/effect/src/MutableHashSet.ts b/packages/effect/src/MutableHashSet.ts similarity index 100% rename from repos/effect/packages/effect/src/MutableHashSet.ts rename to packages/effect/src/MutableHashSet.ts diff --git a/repos/effect/packages/effect/src/MutableList.ts b/packages/effect/src/MutableList.ts similarity index 100% rename from repos/effect/packages/effect/src/MutableList.ts rename to packages/effect/src/MutableList.ts diff --git a/repos/effect/packages/effect/src/MutableRef.ts b/packages/effect/src/MutableRef.ts similarity index 100% rename from repos/effect/packages/effect/src/MutableRef.ts rename to packages/effect/src/MutableRef.ts diff --git a/repos/effect/packages/effect/src/Newtype.ts b/packages/effect/src/Newtype.ts similarity index 100% rename from repos/effect/packages/effect/src/Newtype.ts rename to packages/effect/src/Newtype.ts diff --git a/repos/effect/packages/effect/src/NonEmptyIterable.ts b/packages/effect/src/NonEmptyIterable.ts similarity index 100% rename from repos/effect/packages/effect/src/NonEmptyIterable.ts rename to packages/effect/src/NonEmptyIterable.ts diff --git a/repos/effect/packages/effect/src/Number.ts b/packages/effect/src/Number.ts similarity index 100% rename from repos/effect/packages/effect/src/Number.ts rename to packages/effect/src/Number.ts diff --git a/repos/effect/packages/effect/src/Optic.ts b/packages/effect/src/Optic.ts similarity index 100% rename from repos/effect/packages/effect/src/Optic.ts rename to packages/effect/src/Optic.ts diff --git a/repos/effect/packages/effect/src/Option.ts b/packages/effect/src/Option.ts similarity index 100% rename from repos/effect/packages/effect/src/Option.ts rename to packages/effect/src/Option.ts diff --git a/repos/effect/packages/effect/src/Order.ts b/packages/effect/src/Order.ts similarity index 100% rename from repos/effect/packages/effect/src/Order.ts rename to packages/effect/src/Order.ts diff --git a/repos/effect/packages/effect/src/Ordering.ts b/packages/effect/src/Ordering.ts similarity index 100% rename from repos/effect/packages/effect/src/Ordering.ts rename to packages/effect/src/Ordering.ts diff --git a/repos/effect/packages/effect/src/PartitionedSemaphore.ts b/packages/effect/src/PartitionedSemaphore.ts similarity index 100% rename from repos/effect/packages/effect/src/PartitionedSemaphore.ts rename to packages/effect/src/PartitionedSemaphore.ts diff --git a/repos/effect/packages/effect/src/Path.ts b/packages/effect/src/Path.ts similarity index 100% rename from repos/effect/packages/effect/src/Path.ts rename to packages/effect/src/Path.ts diff --git a/repos/effect/packages/effect/src/Pipeable.ts b/packages/effect/src/Pipeable.ts similarity index 100% rename from repos/effect/packages/effect/src/Pipeable.ts rename to packages/effect/src/Pipeable.ts diff --git a/repos/effect/packages/effect/src/PlatformError.ts b/packages/effect/src/PlatformError.ts similarity index 100% rename from repos/effect/packages/effect/src/PlatformError.ts rename to packages/effect/src/PlatformError.ts diff --git a/repos/effect/packages/effect/src/Pool.ts b/packages/effect/src/Pool.ts similarity index 100% rename from repos/effect/packages/effect/src/Pool.ts rename to packages/effect/src/Pool.ts diff --git a/repos/effect/packages/effect/src/Predicate.ts b/packages/effect/src/Predicate.ts similarity index 100% rename from repos/effect/packages/effect/src/Predicate.ts rename to packages/effect/src/Predicate.ts diff --git a/repos/effect/packages/effect/src/PrimaryKey.ts b/packages/effect/src/PrimaryKey.ts similarity index 100% rename from repos/effect/packages/effect/src/PrimaryKey.ts rename to packages/effect/src/PrimaryKey.ts diff --git a/repos/effect/packages/effect/src/PubSub.ts b/packages/effect/src/PubSub.ts similarity index 100% rename from repos/effect/packages/effect/src/PubSub.ts rename to packages/effect/src/PubSub.ts diff --git a/repos/effect/packages/effect/src/Pull.ts b/packages/effect/src/Pull.ts similarity index 100% rename from repos/effect/packages/effect/src/Pull.ts rename to packages/effect/src/Pull.ts diff --git a/repos/effect/packages/effect/src/Queue.ts b/packages/effect/src/Queue.ts similarity index 100% rename from repos/effect/packages/effect/src/Queue.ts rename to packages/effect/src/Queue.ts diff --git a/repos/effect/packages/effect/src/Random.ts b/packages/effect/src/Random.ts similarity index 100% rename from repos/effect/packages/effect/src/Random.ts rename to packages/effect/src/Random.ts diff --git a/repos/effect/packages/effect/src/RcMap.ts b/packages/effect/src/RcMap.ts similarity index 100% rename from repos/effect/packages/effect/src/RcMap.ts rename to packages/effect/src/RcMap.ts diff --git a/repos/effect/packages/effect/src/RcRef.ts b/packages/effect/src/RcRef.ts similarity index 100% rename from repos/effect/packages/effect/src/RcRef.ts rename to packages/effect/src/RcRef.ts diff --git a/repos/effect/packages/effect/src/Record.ts b/packages/effect/src/Record.ts similarity index 100% rename from repos/effect/packages/effect/src/Record.ts rename to packages/effect/src/Record.ts diff --git a/repos/effect/packages/effect/src/Redactable.ts b/packages/effect/src/Redactable.ts similarity index 100% rename from repos/effect/packages/effect/src/Redactable.ts rename to packages/effect/src/Redactable.ts diff --git a/repos/effect/packages/effect/src/Redacted.ts b/packages/effect/src/Redacted.ts similarity index 100% rename from repos/effect/packages/effect/src/Redacted.ts rename to packages/effect/src/Redacted.ts diff --git a/repos/effect/packages/effect/src/Reducer.ts b/packages/effect/src/Reducer.ts similarity index 100% rename from repos/effect/packages/effect/src/Reducer.ts rename to packages/effect/src/Reducer.ts diff --git a/repos/effect/packages/effect/src/Ref.ts b/packages/effect/src/Ref.ts similarity index 100% rename from repos/effect/packages/effect/src/Ref.ts rename to packages/effect/src/Ref.ts diff --git a/repos/effect/packages/effect/src/References.ts b/packages/effect/src/References.ts similarity index 100% rename from repos/effect/packages/effect/src/References.ts rename to packages/effect/src/References.ts diff --git a/repos/effect/packages/effect/src/RegExp.ts b/packages/effect/src/RegExp.ts similarity index 100% rename from repos/effect/packages/effect/src/RegExp.ts rename to packages/effect/src/RegExp.ts diff --git a/repos/effect/packages/effect/src/Request.ts b/packages/effect/src/Request.ts similarity index 100% rename from repos/effect/packages/effect/src/Request.ts rename to packages/effect/src/Request.ts diff --git a/repos/effect/packages/effect/src/RequestResolver.ts b/packages/effect/src/RequestResolver.ts similarity index 100% rename from repos/effect/packages/effect/src/RequestResolver.ts rename to packages/effect/src/RequestResolver.ts diff --git a/repos/effect/packages/effect/src/Resource.ts b/packages/effect/src/Resource.ts similarity index 100% rename from repos/effect/packages/effect/src/Resource.ts rename to packages/effect/src/Resource.ts diff --git a/repos/effect/packages/effect/src/Result.ts b/packages/effect/src/Result.ts similarity index 100% rename from repos/effect/packages/effect/src/Result.ts rename to packages/effect/src/Result.ts diff --git a/repos/effect/packages/effect/src/Runtime.ts b/packages/effect/src/Runtime.ts similarity index 100% rename from repos/effect/packages/effect/src/Runtime.ts rename to packages/effect/src/Runtime.ts diff --git a/repos/effect/packages/effect/src/Schedule.ts b/packages/effect/src/Schedule.ts similarity index 100% rename from repos/effect/packages/effect/src/Schedule.ts rename to packages/effect/src/Schedule.ts diff --git a/repos/effect/packages/effect/src/Scheduler.ts b/packages/effect/src/Scheduler.ts similarity index 100% rename from repos/effect/packages/effect/src/Scheduler.ts rename to packages/effect/src/Scheduler.ts diff --git a/repos/effect/packages/effect/src/Schema.ts b/packages/effect/src/Schema.ts similarity index 100% rename from repos/effect/packages/effect/src/Schema.ts rename to packages/effect/src/Schema.ts diff --git a/repos/effect/packages/effect/src/SchemaAST.ts b/packages/effect/src/SchemaAST.ts similarity index 99% rename from repos/effect/packages/effect/src/SchemaAST.ts rename to packages/effect/src/SchemaAST.ts index 6f63b4b1f..0b6a455c1 100644 --- a/repos/effect/packages/effect/src/SchemaAST.ts +++ b/packages/effect/src/SchemaAST.ts @@ -1377,10 +1377,18 @@ type TemplateLiteralPart = | TemplateLiteral | Union -function isTemplateLiteralPart(ast: AST, path: string, validated: WeakSet): ast is TemplateLiteralPart { +function formatTemplateLiteralPath(path: string | number): string { + return typeof path === "number" ? `parts[${path}]` : path +} + +function isTemplateLiteralPart( + ast: AST, + path: string | number, + validated: Set +): ast is TemplateLiteralPart { if (validated.has(ast)) return true if (ast.encoding) { - throw new Error(`TemplateLiteral parts cannot have an encoding at ${path}`) + throw new Error(`TemplateLiteral parts cannot have an encoding at ${formatTemplateLiteralPath(path)}`) } let valid: boolean switch (ast._tag) { @@ -1392,14 +1400,18 @@ function isTemplateLiteralPart(ast: AST, path: string, validated: WeakSet): case "Literal": valid = !ast.checks break - case "TemplateLiteral": + case "TemplateLiteral": { + const currentPath = formatTemplateLiteralPath(path) valid = !ast.checks && - ast.parts.every((part, index) => isTemplateLiteralPart(part, `${path}.parts[${index}]`, validated)) + ast.parts.every((part, index) => isTemplateLiteralPart(part, `${currentPath}.parts[${index}]`, validated)) break - case "Union": + } + case "Union": { + const currentPath = formatTemplateLiteralPath(path) valid = !ast.checks && - ast.types.every((part, index) => isTemplateLiteralPart(part, `${path}.types[${index}]`, validated)) + ast.types.every((part, index) => isTemplateLiteralPart(part, `${currentPath}.types[${index}]`, validated)) break + } default: return false } @@ -1477,10 +1489,10 @@ export const TemplateLiteral: new( super(annotations, checks, encoding, context) const encodedParts: Array = [] const literals: Array = [] - const validated = new WeakSet() + const validated = new Set() for (let index = 0; index < parts.length; index++) { const part = parts[index] - if (!isTemplateLiteralPart(part, `parts[${index}]`, validated)) { + if (!isTemplateLiteralPart(part, index, validated)) { throw new Error(`Invalid TemplateLiteral part ${part._tag}`) } encodedParts.push(part) @@ -2573,8 +2585,23 @@ function isIndexSignatureParameterSide(ast: AST): ast is IndexSignatureParameter } } +function isIndexSignatureParameterEncodedSide(ast: AST): boolean { + const encoded = getLastEncoding(ast) + switch (encoded._tag) { + case "String": + case "Number": + case "Symbol": + case "TemplateLiteral": + return true + case "Union": + return encoded.types.every(isIndexSignatureParameterEncodedSide) + default: + return false + } +} + function isIndexSignatureParameter(ast: AST): ast is IndexSignatureParameter { - return isIndexSignatureParameterSide(ast) && isIndexSignatureParameterSide(toEncoded(ast)) + return isIndexSignatureParameterSide(ast) && isIndexSignatureParameterEncodedSide(ast) } /** @@ -2727,7 +2754,16 @@ export const Objects: new( this.encodingChecks = encodingChecks // Duplicate property signatures - const duplicates = propertySignatures.map((ps) => ps.name).filter((name, i, arr) => arr.indexOf(name) !== i) + const seen = new Set() + const duplicates: Array = [] + for (const propertySignature of propertySignatures) { + const name = propertySignature.name + if (seen.has(name)) { + duplicates.push(name) + } else { + seen.add(name) + } + } if (duplicates.length > 0) { throw new Error(`Duplicate identifiers: ${JSON.stringify(duplicates)}. ts(2300)`) } @@ -3780,20 +3816,6 @@ function formatIsOptional(isOptional: boolean | undefined): string { return isOptional ? "?" : "" } -/** @internal */ -export function memoizeThunk(f: () => A): () => A { - let done = false - let a: A - return () => { - if (done) { - return a - } - a = f() - done = true - return a - } -} - /** * AST node for lazy/recursive schemas. * @@ -3866,7 +3888,8 @@ export const Suspend: new( throw new Error("Cannot add checks to Suspend") } super(annotations, undefined, encoding, context) - this.thunk = memoizeThunk(thunk) + let ast: AST + this.thunk = () => ast ??= thunk() } /** @internal */ getParser(compile: SchemaParser.Compiler): SchemaParser.Parser { diff --git a/repos/effect/packages/effect/src/SchemaGetter.ts b/packages/effect/src/SchemaGetter.ts similarity index 100% rename from repos/effect/packages/effect/src/SchemaGetter.ts rename to packages/effect/src/SchemaGetter.ts diff --git a/repos/effect/packages/effect/src/SchemaIssue.ts b/packages/effect/src/SchemaIssue.ts similarity index 100% rename from repos/effect/packages/effect/src/SchemaIssue.ts rename to packages/effect/src/SchemaIssue.ts diff --git a/repos/effect/packages/effect/src/SchemaParser.ts b/packages/effect/src/SchemaParser.ts similarity index 99% rename from repos/effect/packages/effect/src/SchemaParser.ts rename to packages/effect/src/SchemaParser.ts index a3fcf6411..47b068c7c 100644 --- a/repos/effect/packages/effect/src/SchemaParser.ts +++ b/packages/effect/src/SchemaParser.ts @@ -41,9 +41,10 @@ import * as SchemaIssue from "./SchemaIssue.ts" * @since 4.0.0 */ export function makeEffect(schema: S) { - const parser = runWithCompiler(constructorCompiler, SchemaAST.toType(schema.ast)) + const ast = schema.ast + let parser: ReturnType> return (input: S["~type.make.in"], options?: Schema.MakeOptions): Effect.Effect => { - return parser( + return (parser ??= runWithCompiler(constructorCompiler, SchemaAST.toType(ast)))( input, options?.disableChecks ? options?.parseOptions ? { ...options.parseOptions, disableChecks: true } : { disableChecks: true } diff --git a/repos/effect/packages/effect/src/SchemaRepresentation.ts b/packages/effect/src/SchemaRepresentation.ts similarity index 100% rename from repos/effect/packages/effect/src/SchemaRepresentation.ts rename to packages/effect/src/SchemaRepresentation.ts diff --git a/repos/effect/packages/effect/src/SchemaTransformation.ts b/packages/effect/src/SchemaTransformation.ts similarity index 100% rename from repos/effect/packages/effect/src/SchemaTransformation.ts rename to packages/effect/src/SchemaTransformation.ts diff --git a/repos/effect/packages/effect/src/Scope.ts b/packages/effect/src/Scope.ts similarity index 100% rename from repos/effect/packages/effect/src/Scope.ts rename to packages/effect/src/Scope.ts diff --git a/repos/effect/packages/effect/src/ScopedCache.ts b/packages/effect/src/ScopedCache.ts similarity index 100% rename from repos/effect/packages/effect/src/ScopedCache.ts rename to packages/effect/src/ScopedCache.ts diff --git a/repos/effect/packages/effect/src/ScopedRef.ts b/packages/effect/src/ScopedRef.ts similarity index 100% rename from repos/effect/packages/effect/src/ScopedRef.ts rename to packages/effect/src/ScopedRef.ts diff --git a/repos/effect/packages/effect/src/Semaphore.ts b/packages/effect/src/Semaphore.ts similarity index 100% rename from repos/effect/packages/effect/src/Semaphore.ts rename to packages/effect/src/Semaphore.ts diff --git a/repos/effect/packages/effect/src/Sink.ts b/packages/effect/src/Sink.ts similarity index 100% rename from repos/effect/packages/effect/src/Sink.ts rename to packages/effect/src/Sink.ts diff --git a/repos/effect/packages/effect/src/StandardSchema.ts b/packages/effect/src/StandardSchema.ts similarity index 100% rename from repos/effect/packages/effect/src/StandardSchema.ts rename to packages/effect/src/StandardSchema.ts diff --git a/repos/effect/packages/effect/src/Stdio.ts b/packages/effect/src/Stdio.ts similarity index 100% rename from repos/effect/packages/effect/src/Stdio.ts rename to packages/effect/src/Stdio.ts diff --git a/repos/effect/packages/effect/src/Stream.ts b/packages/effect/src/Stream.ts similarity index 100% rename from repos/effect/packages/effect/src/Stream.ts rename to packages/effect/src/Stream.ts diff --git a/repos/effect/packages/effect/src/String.ts b/packages/effect/src/String.ts similarity index 100% rename from repos/effect/packages/effect/src/String.ts rename to packages/effect/src/String.ts diff --git a/repos/effect/packages/effect/src/Struct.ts b/packages/effect/src/Struct.ts similarity index 100% rename from repos/effect/packages/effect/src/Struct.ts rename to packages/effect/src/Struct.ts diff --git a/repos/effect/packages/effect/src/SubscriptionRef.ts b/packages/effect/src/SubscriptionRef.ts similarity index 100% rename from repos/effect/packages/effect/src/SubscriptionRef.ts rename to packages/effect/src/SubscriptionRef.ts diff --git a/repos/effect/packages/effect/src/Symbol.ts b/packages/effect/src/Symbol.ts similarity index 100% rename from repos/effect/packages/effect/src/Symbol.ts rename to packages/effect/src/Symbol.ts diff --git a/repos/effect/packages/effect/src/SynchronizedRef.ts b/packages/effect/src/SynchronizedRef.ts similarity index 100% rename from repos/effect/packages/effect/src/SynchronizedRef.ts rename to packages/effect/src/SynchronizedRef.ts diff --git a/repos/effect/packages/effect/src/Take.ts b/packages/effect/src/Take.ts similarity index 100% rename from repos/effect/packages/effect/src/Take.ts rename to packages/effect/src/Take.ts diff --git a/repos/effect/packages/effect/src/Terminal.ts b/packages/effect/src/Terminal.ts similarity index 100% rename from repos/effect/packages/effect/src/Terminal.ts rename to packages/effect/src/Terminal.ts diff --git a/repos/effect/packages/effect/src/Tracer.ts b/packages/effect/src/Tracer.ts similarity index 100% rename from repos/effect/packages/effect/src/Tracer.ts rename to packages/effect/src/Tracer.ts diff --git a/repos/effect/packages/effect/src/Trie.ts b/packages/effect/src/Trie.ts similarity index 100% rename from repos/effect/packages/effect/src/Trie.ts rename to packages/effect/src/Trie.ts diff --git a/repos/effect/packages/effect/src/Tuple.ts b/packages/effect/src/Tuple.ts similarity index 100% rename from repos/effect/packages/effect/src/Tuple.ts rename to packages/effect/src/Tuple.ts diff --git a/repos/effect/packages/effect/src/TxChunk.ts b/packages/effect/src/TxChunk.ts similarity index 100% rename from repos/effect/packages/effect/src/TxChunk.ts rename to packages/effect/src/TxChunk.ts diff --git a/repos/effect/packages/effect/src/TxDeferred.ts b/packages/effect/src/TxDeferred.ts similarity index 100% rename from repos/effect/packages/effect/src/TxDeferred.ts rename to packages/effect/src/TxDeferred.ts diff --git a/repos/effect/packages/effect/src/TxHashMap.ts b/packages/effect/src/TxHashMap.ts similarity index 100% rename from repos/effect/packages/effect/src/TxHashMap.ts rename to packages/effect/src/TxHashMap.ts diff --git a/repos/effect/packages/effect/src/TxHashSet.ts b/packages/effect/src/TxHashSet.ts similarity index 100% rename from repos/effect/packages/effect/src/TxHashSet.ts rename to packages/effect/src/TxHashSet.ts diff --git a/repos/effect/packages/effect/src/TxPriorityQueue.ts b/packages/effect/src/TxPriorityQueue.ts similarity index 100% rename from repos/effect/packages/effect/src/TxPriorityQueue.ts rename to packages/effect/src/TxPriorityQueue.ts diff --git a/repos/effect/packages/effect/src/TxPubSub.ts b/packages/effect/src/TxPubSub.ts similarity index 100% rename from repos/effect/packages/effect/src/TxPubSub.ts rename to packages/effect/src/TxPubSub.ts diff --git a/repos/effect/packages/effect/src/TxQueue.ts b/packages/effect/src/TxQueue.ts similarity index 100% rename from repos/effect/packages/effect/src/TxQueue.ts rename to packages/effect/src/TxQueue.ts diff --git a/repos/effect/packages/effect/src/TxReentrantLock.ts b/packages/effect/src/TxReentrantLock.ts similarity index 100% rename from repos/effect/packages/effect/src/TxReentrantLock.ts rename to packages/effect/src/TxReentrantLock.ts diff --git a/repos/effect/packages/effect/src/TxRef.ts b/packages/effect/src/TxRef.ts similarity index 100% rename from repos/effect/packages/effect/src/TxRef.ts rename to packages/effect/src/TxRef.ts diff --git a/repos/effect/packages/effect/src/TxSemaphore.ts b/packages/effect/src/TxSemaphore.ts similarity index 100% rename from repos/effect/packages/effect/src/TxSemaphore.ts rename to packages/effect/src/TxSemaphore.ts diff --git a/repos/effect/packages/effect/src/TxSubscriptionRef.ts b/packages/effect/src/TxSubscriptionRef.ts similarity index 100% rename from repos/effect/packages/effect/src/TxSubscriptionRef.ts rename to packages/effect/src/TxSubscriptionRef.ts diff --git a/repos/effect/packages/effect/src/Types.ts b/packages/effect/src/Types.ts similarity index 100% rename from repos/effect/packages/effect/src/Types.ts rename to packages/effect/src/Types.ts diff --git a/repos/effect/packages/effect/src/UndefinedOr.ts b/packages/effect/src/UndefinedOr.ts similarity index 100% rename from repos/effect/packages/effect/src/UndefinedOr.ts rename to packages/effect/src/UndefinedOr.ts diff --git a/repos/effect/packages/effect/src/Unify.ts b/packages/effect/src/Unify.ts similarity index 100% rename from repos/effect/packages/effect/src/Unify.ts rename to packages/effect/src/Unify.ts diff --git a/repos/effect/packages/effect/src/Utils.ts b/packages/effect/src/Utils.ts similarity index 100% rename from repos/effect/packages/effect/src/Utils.ts rename to packages/effect/src/Utils.ts diff --git a/repos/effect/packages/effect/src/index.ts b/packages/effect/src/index.ts similarity index 100% rename from repos/effect/packages/effect/src/index.ts rename to packages/effect/src/index.ts diff --git a/repos/effect/packages/effect/src/internal/arbitrary/model.ts b/packages/effect/src/internal/arbitrary/model.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/arbitrary/model.ts rename to packages/effect/src/internal/arbitrary/model.ts diff --git a/repos/effect/packages/effect/src/internal/arbitrary/regexp.ts b/packages/effect/src/internal/arbitrary/regexp.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/arbitrary/regexp.ts rename to packages/effect/src/internal/arbitrary/regexp.ts diff --git a/repos/effect/packages/effect/src/internal/arbitrary/runner.ts b/packages/effect/src/internal/arbitrary/runner.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/arbitrary/runner.ts rename to packages/effect/src/internal/arbitrary/runner.ts diff --git a/repos/effect/packages/effect/src/internal/arbitrary/schema.ts b/packages/effect/src/internal/arbitrary/schema.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/arbitrary/schema.ts rename to packages/effect/src/internal/arbitrary/schema.ts diff --git a/repos/effect/packages/effect/src/internal/array.ts b/packages/effect/src/internal/array.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/array.ts rename to packages/effect/src/internal/array.ts diff --git a/repos/effect/packages/effect/src/internal/core.ts b/packages/effect/src/internal/core.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/core.ts rename to packages/effect/src/internal/core.ts diff --git a/repos/effect/packages/effect/src/internal/count.ts b/packages/effect/src/internal/count.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/count.ts rename to packages/effect/src/internal/count.ts diff --git a/repos/effect/packages/effect/src/internal/dateTime.ts b/packages/effect/src/internal/dateTime.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/dateTime.ts rename to packages/effect/src/internal/dateTime.ts diff --git a/repos/effect/packages/effect/src/internal/doNotation.ts b/packages/effect/src/internal/doNotation.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/doNotation.ts rename to packages/effect/src/internal/doNotation.ts diff --git a/repos/effect/packages/effect/src/internal/effect.ts b/packages/effect/src/internal/effect.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/effect.ts rename to packages/effect/src/internal/effect.ts diff --git a/repos/effect/packages/effect/src/internal/equal.ts b/packages/effect/src/internal/equal.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/equal.ts rename to packages/effect/src/internal/equal.ts diff --git a/repos/effect/packages/effect/src/internal/errors.ts b/packages/effect/src/internal/errors.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/errors.ts rename to packages/effect/src/internal/errors.ts diff --git a/repos/effect/packages/effect/src/internal/executionPlan.ts b/packages/effect/src/internal/executionPlan.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/executionPlan.ts rename to packages/effect/src/internal/executionPlan.ts diff --git a/repos/effect/packages/effect/src/internal/graph.ts b/packages/effect/src/internal/graph.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/graph.ts rename to packages/effect/src/internal/graph.ts diff --git a/repos/effect/packages/effect/src/internal/graphCsr.ts b/packages/effect/src/internal/graphCsr.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/graphCsr.ts rename to packages/effect/src/internal/graphCsr.ts diff --git a/repos/effect/packages/effect/src/internal/hashMap.ts b/packages/effect/src/internal/hashMap.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/hashMap.ts rename to packages/effect/src/internal/hashMap.ts diff --git a/repos/effect/packages/effect/src/internal/hashSet.ts b/packages/effect/src/internal/hashSet.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/hashSet.ts rename to packages/effect/src/internal/hashSet.ts diff --git a/repos/effect/packages/effect/src/internal/layer.ts b/packages/effect/src/internal/layer.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/layer.ts rename to packages/effect/src/internal/layer.ts diff --git a/repos/effect/packages/effect/src/internal/matcher.ts b/packages/effect/src/internal/matcher.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/matcher.ts rename to packages/effect/src/internal/matcher.ts diff --git a/repos/effect/packages/effect/src/internal/metric.ts b/packages/effect/src/internal/metric.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/metric.ts rename to packages/effect/src/internal/metric.ts diff --git a/repos/effect/packages/effect/src/internal/option.ts b/packages/effect/src/internal/option.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/option.ts rename to packages/effect/src/internal/option.ts diff --git a/repos/effect/packages/effect/src/internal/persistence.ts b/packages/effect/src/internal/persistence.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/persistence.ts rename to packages/effect/src/internal/persistence.ts diff --git a/repos/effect/packages/effect/src/internal/random.ts b/packages/effect/src/internal/random.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/random.ts rename to packages/effect/src/internal/random.ts diff --git a/repos/effect/packages/effect/src/internal/rcRef.ts b/packages/effect/src/internal/rcRef.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/rcRef.ts rename to packages/effect/src/internal/rcRef.ts diff --git a/repos/effect/packages/effect/src/internal/record.ts b/packages/effect/src/internal/record.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/record.ts rename to packages/effect/src/internal/record.ts diff --git a/repos/effect/packages/effect/src/internal/redacted.ts b/packages/effect/src/internal/redacted.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/redacted.ts rename to packages/effect/src/internal/redacted.ts diff --git a/repos/effect/packages/effect/src/internal/references.ts b/packages/effect/src/internal/references.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/references.ts rename to packages/effect/src/internal/references.ts diff --git a/repos/effect/packages/effect/src/internal/request.ts b/packages/effect/src/internal/request.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/request.ts rename to packages/effect/src/internal/request.ts diff --git a/repos/effect/packages/effect/src/internal/result.ts b/packages/effect/src/internal/result.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/result.ts rename to packages/effect/src/internal/result.ts diff --git a/repos/effect/packages/effect/src/internal/schedule.ts b/packages/effect/src/internal/schedule.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/schedule.ts rename to packages/effect/src/internal/schedule.ts diff --git a/repos/effect/packages/effect/src/internal/schema/annotations.ts b/packages/effect/src/internal/schema/annotations.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/schema/annotations.ts rename to packages/effect/src/internal/schema/annotations.ts diff --git a/repos/effect/packages/effect/src/internal/schema/cause.ts b/packages/effect/src/internal/schema/cause.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/schema/cause.ts rename to packages/effect/src/internal/schema/cause.ts diff --git a/repos/effect/packages/effect/src/internal/schema/fromJsonSchemaDocument.ts b/packages/effect/src/internal/schema/fromJsonSchemaDocument.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/schema/fromJsonSchemaDocument.ts rename to packages/effect/src/internal/schema/fromJsonSchemaDocument.ts diff --git a/repos/effect/packages/effect/src/internal/schema/fromRepresentation.ts b/packages/effect/src/internal/schema/fromRepresentation.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/schema/fromRepresentation.ts rename to packages/effect/src/internal/schema/fromRepresentation.ts diff --git a/repos/effect/packages/effect/src/internal/schema/make.ts b/packages/effect/src/internal/schema/make.ts similarity index 78% rename from repos/effect/packages/effect/src/internal/schema/make.ts rename to packages/effect/src/internal/schema/make.ts index 44e4d194a..f83575a02 100644 --- a/repos/effect/packages/effect/src/internal/schema/make.ts +++ b/packages/effect/src/internal/schema/make.ts @@ -25,10 +25,15 @@ const SchemaProto = { /** @internal */ export function make(ast: S["ast"], options?: object): S { function Schema() {} - const self = Object.defineProperties( - Object.setPrototypeOf(Schema, SchemaProto), - Object.getOwnPropertyDescriptors({ ...options }) - ) + const self = Object.setPrototypeOf(Schema, SchemaProto) + if ( + options && + (Object.hasOwn(options, "name") || Object.hasOwn(options, "length") || Object.hasOwn(options, "__proto__")) + ) { + Object.defineProperties(self, Object.getOwnPropertyDescriptors({ ...options })) + } else { + Object.assign(self, options) + } self.ast = ast self.rebuild = (ast: SchemaAST.AST) => make(ast, options) self.makeEffect = SchemaParser.makeEffect(self) diff --git a/repos/effect/packages/effect/src/internal/schema/parser.ts b/packages/effect/src/internal/schema/parser.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/schema/parser.ts rename to packages/effect/src/internal/schema/parser.ts diff --git a/repos/effect/packages/effect/src/internal/schema/standardSchema.ts b/packages/effect/src/internal/schema/standardSchema.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/schema/standardSchema.ts rename to packages/effect/src/internal/schema/standardSchema.ts diff --git a/repos/effect/packages/effect/src/internal/schema/toCodeDocument.ts b/packages/effect/src/internal/schema/toCodeDocument.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/schema/toCodeDocument.ts rename to packages/effect/src/internal/schema/toCodeDocument.ts diff --git a/repos/effect/packages/effect/src/internal/schema/toCodec.ts b/packages/effect/src/internal/schema/toCodec.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/schema/toCodec.ts rename to packages/effect/src/internal/schema/toCodec.ts diff --git a/repos/effect/packages/effect/src/internal/schema/toDifferJsonPatch.ts b/packages/effect/src/internal/schema/toDifferJsonPatch.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/schema/toDifferJsonPatch.ts rename to packages/effect/src/internal/schema/toDifferJsonPatch.ts diff --git a/repos/effect/packages/effect/src/internal/schema/toEncoderXml.ts b/packages/effect/src/internal/schema/toEncoderXml.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/schema/toEncoderXml.ts rename to packages/effect/src/internal/schema/toEncoderXml.ts diff --git a/repos/effect/packages/effect/src/internal/schema/toEquivalence.ts b/packages/effect/src/internal/schema/toEquivalence.ts similarity index 98% rename from repos/effect/packages/effect/src/internal/schema/toEquivalence.ts rename to packages/effect/src/internal/schema/toEquivalence.ts index 6fd9646bb..5032387d3 100644 --- a/repos/effect/packages/effect/src/internal/schema/toEquivalence.ts +++ b/packages/effect/src/internal/schema/toEquivalence.ts @@ -153,8 +153,8 @@ function recur(ast: SchemaAST.AST, path: ReadonlyArray): Equivalenc }) } case "Suspend": { - const get = SchemaAST.memoizeThunk(() => recur(ast.thunk(), path)) - return Equivalence.make((a, b) => get()(a, b)) + let equivalence: Equivalence.Equivalence + return Equivalence.make((a, b) => (equivalence ??= recur(ast.thunk(), path))(a, b)) } } } diff --git a/repos/effect/packages/effect/src/internal/schema/toFormatter.ts b/packages/effect/src/internal/schema/toFormatter.ts similarity index 98% rename from repos/effect/packages/effect/src/internal/schema/toFormatter.ts rename to packages/effect/src/internal/schema/toFormatter.ts index 419559ada..21eef24e3 100644 --- a/repos/effect/packages/effect/src/internal/schema/toFormatter.ts +++ b/packages/effect/src/internal/schema/toFormatter.ts @@ -222,8 +222,8 @@ export function toFormatter(ast: SchemaAST.AST, options?: { } } case "Suspend": { - const get = SchemaAST.memoizeThunk(() => recur(ast.thunk())) - return (value) => get()(value) + let formatter: Formatter + return (value) => (formatter ??= recur(ast.thunk()))(value) } } } diff --git a/repos/effect/packages/effect/src/internal/schema/toIso.ts b/packages/effect/src/internal/schema/toIso.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/schema/toIso.ts rename to packages/effect/src/internal/schema/toIso.ts diff --git a/repos/effect/packages/effect/src/internal/schema/toJsonSchemaDocument.ts b/packages/effect/src/internal/schema/toJsonSchemaDocument.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/schema/toJsonSchemaDocument.ts rename to packages/effect/src/internal/schema/toJsonSchemaDocument.ts diff --git a/repos/effect/packages/effect/src/internal/schema/toRepresentation.ts b/packages/effect/src/internal/schema/toRepresentation.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/schema/toRepresentation.ts rename to packages/effect/src/internal/schema/toRepresentation.ts diff --git a/repos/effect/packages/effect/src/internal/schemaError.ts b/packages/effect/src/internal/schemaError.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/schemaError.ts rename to packages/effect/src/internal/schemaError.ts diff --git a/repos/effect/packages/effect/src/internal/stackTraceLimit.ts b/packages/effect/src/internal/stackTraceLimit.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/stackTraceLimit.ts rename to packages/effect/src/internal/stackTraceLimit.ts diff --git a/repos/effect/packages/effect/src/internal/stream.ts b/packages/effect/src/internal/stream.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/stream.ts rename to packages/effect/src/internal/stream.ts diff --git a/repos/effect/packages/effect/src/internal/tracer.ts b/packages/effect/src/internal/tracer.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/tracer.ts rename to packages/effect/src/internal/tracer.ts diff --git a/repos/effect/packages/effect/src/internal/trie.ts b/packages/effect/src/internal/trie.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/trie.ts rename to packages/effect/src/internal/trie.ts diff --git a/repos/effect/packages/effect/src/internal/uuid.ts b/packages/effect/src/internal/uuid.ts similarity index 100% rename from repos/effect/packages/effect/src/internal/uuid.ts rename to packages/effect/src/internal/uuid.ts diff --git a/repos/effect/packages/effect/src/testing/TestClock.ts b/packages/effect/src/testing/TestClock.ts similarity index 100% rename from repos/effect/packages/effect/src/testing/TestClock.ts rename to packages/effect/src/testing/TestClock.ts diff --git a/repos/effect/packages/effect/src/testing/TestConsole.ts b/packages/effect/src/testing/TestConsole.ts similarity index 100% rename from repos/effect/packages/effect/src/testing/TestConsole.ts rename to packages/effect/src/testing/TestConsole.ts diff --git a/repos/effect/packages/effect/src/testing/TestSchema.ts b/packages/effect/src/testing/TestSchema.ts similarity index 100% rename from repos/effect/packages/effect/src/testing/TestSchema.ts rename to packages/effect/src/testing/TestSchema.ts diff --git a/repos/effect/packages/effect/src/testing/index.ts b/packages/effect/src/testing/index.ts similarity index 100% rename from repos/effect/packages/effect/src/testing/index.ts rename to packages/effect/src/testing/index.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/AiError.ts b/packages/effect/src/unstable/ai/AiError.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/AiError.ts rename to packages/effect/src/unstable/ai/AiError.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/AnthropicStructuredOutput.ts b/packages/effect/src/unstable/ai/AnthropicStructuredOutput.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/AnthropicStructuredOutput.ts rename to packages/effect/src/unstable/ai/AnthropicStructuredOutput.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/Chat.ts b/packages/effect/src/unstable/ai/Chat.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/Chat.ts rename to packages/effect/src/unstable/ai/Chat.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/EmbeddingModel.ts b/packages/effect/src/unstable/ai/EmbeddingModel.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/EmbeddingModel.ts rename to packages/effect/src/unstable/ai/EmbeddingModel.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/IdGenerator.ts b/packages/effect/src/unstable/ai/IdGenerator.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/IdGenerator.ts rename to packages/effect/src/unstable/ai/IdGenerator.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/LanguageModel.ts b/packages/effect/src/unstable/ai/LanguageModel.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/LanguageModel.ts rename to packages/effect/src/unstable/ai/LanguageModel.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/McpProtocol.ts b/packages/effect/src/unstable/ai/McpProtocol.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/McpProtocol.ts rename to packages/effect/src/unstable/ai/McpProtocol.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/McpSchema.ts b/packages/effect/src/unstable/ai/McpSchema.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/McpSchema.ts rename to packages/effect/src/unstable/ai/McpSchema.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/McpServer.ts b/packages/effect/src/unstable/ai/McpServer.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/McpServer.ts rename to packages/effect/src/unstable/ai/McpServer.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/Model.ts b/packages/effect/src/unstable/ai/Model.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/Model.ts rename to packages/effect/src/unstable/ai/Model.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/OpenAiStructuredOutput.ts b/packages/effect/src/unstable/ai/OpenAiStructuredOutput.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/OpenAiStructuredOutput.ts rename to packages/effect/src/unstable/ai/OpenAiStructuredOutput.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/Prompt.ts b/packages/effect/src/unstable/ai/Prompt.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/Prompt.ts rename to packages/effect/src/unstable/ai/Prompt.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/Response.ts b/packages/effect/src/unstable/ai/Response.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/Response.ts rename to packages/effect/src/unstable/ai/Response.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/ResponseIdTracker.ts b/packages/effect/src/unstable/ai/ResponseIdTracker.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/ResponseIdTracker.ts rename to packages/effect/src/unstable/ai/ResponseIdTracker.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/Telemetry.ts b/packages/effect/src/unstable/ai/Telemetry.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/Telemetry.ts rename to packages/effect/src/unstable/ai/Telemetry.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/Tokenizer.ts b/packages/effect/src/unstable/ai/Tokenizer.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/Tokenizer.ts rename to packages/effect/src/unstable/ai/Tokenizer.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/Tool.ts b/packages/effect/src/unstable/ai/Tool.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/Tool.ts rename to packages/effect/src/unstable/ai/Tool.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/Toolkit.ts b/packages/effect/src/unstable/ai/Toolkit.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/Toolkit.ts rename to packages/effect/src/unstable/ai/Toolkit.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/index.ts b/packages/effect/src/unstable/ai/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/index.ts rename to packages/effect/src/unstable/ai/index.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/internal/codec-transformer.ts b/packages/effect/src/unstable/ai/internal/codec-transformer.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/internal/codec-transformer.ts rename to packages/effect/src/unstable/ai/internal/codec-transformer.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/internal/mcpCore.ts b/packages/effect/src/unstable/ai/internal/mcpCore.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/internal/mcpCore.ts rename to packages/effect/src/unstable/ai/internal/mcpCore.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/internal/mcpProtocol.ts b/packages/effect/src/unstable/ai/internal/mcpProtocol.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/internal/mcpProtocol.ts rename to packages/effect/src/unstable/ai/internal/mcpProtocol.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/internal/mcpProtocol/v2024_11_05.ts b/packages/effect/src/unstable/ai/internal/mcpProtocol/v2024_11_05.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/internal/mcpProtocol/v2024_11_05.ts rename to packages/effect/src/unstable/ai/internal/mcpProtocol/v2024_11_05.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/internal/mcpProtocol/v2025_03_26.ts b/packages/effect/src/unstable/ai/internal/mcpProtocol/v2025_03_26.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/internal/mcpProtocol/v2025_03_26.ts rename to packages/effect/src/unstable/ai/internal/mcpProtocol/v2025_03_26.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/internal/mcpProtocol/v2025_06_18.ts b/packages/effect/src/unstable/ai/internal/mcpProtocol/v2025_06_18.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/internal/mcpProtocol/v2025_06_18.ts rename to packages/effect/src/unstable/ai/internal/mcpProtocol/v2025_06_18.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/internal/mcpProtocol/v2025_11_25.ts b/packages/effect/src/unstable/ai/internal/mcpProtocol/v2025_11_25.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/internal/mcpProtocol/v2025_11_25.ts rename to packages/effect/src/unstable/ai/internal/mcpProtocol/v2025_11_25.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/internal/mcpProtocolRegistry.ts b/packages/effect/src/unstable/ai/internal/mcpProtocolRegistry.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/internal/mcpProtocolRegistry.ts rename to packages/effect/src/unstable/ai/internal/mcpProtocolRegistry.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/internal/mcpSchema/v2024_11_05.ts b/packages/effect/src/unstable/ai/internal/mcpSchema/v2024_11_05.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/internal/mcpSchema/v2024_11_05.ts rename to packages/effect/src/unstable/ai/internal/mcpSchema/v2024_11_05.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/internal/mcpSchema/v2025_03_26.ts b/packages/effect/src/unstable/ai/internal/mcpSchema/v2025_03_26.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/internal/mcpSchema/v2025_03_26.ts rename to packages/effect/src/unstable/ai/internal/mcpSchema/v2025_03_26.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/internal/mcpSchema/v2025_06_18.ts b/packages/effect/src/unstable/ai/internal/mcpSchema/v2025_06_18.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/internal/mcpSchema/v2025_06_18.ts rename to packages/effect/src/unstable/ai/internal/mcpSchema/v2025_06_18.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/internal/mcpSchema/v2025_11_25.ts b/packages/effect/src/unstable/ai/internal/mcpSchema/v2025_11_25.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/internal/mcpSchema/v2025_11_25.ts rename to packages/effect/src/unstable/ai/internal/mcpSchema/v2025_11_25.ts diff --git a/repos/effect/packages/effect/src/unstable/ai/internal/structured-output.ts b/packages/effect/src/unstable/ai/internal/structured-output.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/ai/internal/structured-output.ts rename to packages/effect/src/unstable/ai/internal/structured-output.ts diff --git a/repos/effect/packages/effect/src/unstable/arbitrary/Arbitrary.ts b/packages/effect/src/unstable/arbitrary/Arbitrary.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/arbitrary/Arbitrary.ts rename to packages/effect/src/unstable/arbitrary/Arbitrary.ts diff --git a/repos/effect/packages/effect/src/unstable/arbitrary/index.ts b/packages/effect/src/unstable/arbitrary/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/arbitrary/index.ts rename to packages/effect/src/unstable/arbitrary/index.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/Argument.ts b/packages/effect/src/unstable/cli/Argument.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/Argument.ts rename to packages/effect/src/unstable/cli/Argument.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/CliConfig.ts b/packages/effect/src/unstable/cli/CliConfig.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/CliConfig.ts rename to packages/effect/src/unstable/cli/CliConfig.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/CliError.ts b/packages/effect/src/unstable/cli/CliError.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/CliError.ts rename to packages/effect/src/unstable/cli/CliError.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/CliOutput.ts b/packages/effect/src/unstable/cli/CliOutput.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/CliOutput.ts rename to packages/effect/src/unstable/cli/CliOutput.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/Command.ts b/packages/effect/src/unstable/cli/Command.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/Command.ts rename to packages/effect/src/unstable/cli/Command.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/Completions.ts b/packages/effect/src/unstable/cli/Completions.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/Completions.ts rename to packages/effect/src/unstable/cli/Completions.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/Flag.ts b/packages/effect/src/unstable/cli/Flag.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/Flag.ts rename to packages/effect/src/unstable/cli/Flag.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/GlobalFlag.ts b/packages/effect/src/unstable/cli/GlobalFlag.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/GlobalFlag.ts rename to packages/effect/src/unstable/cli/GlobalFlag.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/HelpDoc.ts b/packages/effect/src/unstable/cli/HelpDoc.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/HelpDoc.ts rename to packages/effect/src/unstable/cli/HelpDoc.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/Param.ts b/packages/effect/src/unstable/cli/Param.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/Param.ts rename to packages/effect/src/unstable/cli/Param.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/Primitive.ts b/packages/effect/src/unstable/cli/Primitive.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/Primitive.ts rename to packages/effect/src/unstable/cli/Primitive.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/Prompt.ts b/packages/effect/src/unstable/cli/Prompt.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/Prompt.ts rename to packages/effect/src/unstable/cli/Prompt.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/index.ts b/packages/effect/src/unstable/cli/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/index.ts rename to packages/effect/src/unstable/cli/index.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/internal/ansi.ts b/packages/effect/src/unstable/cli/internal/ansi.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/internal/ansi.ts rename to packages/effect/src/unstable/cli/internal/ansi.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/internal/auto-suggest.ts b/packages/effect/src/unstable/cli/internal/auto-suggest.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/internal/auto-suggest.ts rename to packages/effect/src/unstable/cli/internal/auto-suggest.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/internal/command.ts b/packages/effect/src/unstable/cli/internal/command.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/internal/command.ts rename to packages/effect/src/unstable/cli/internal/command.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/internal/completions/bash.ts b/packages/effect/src/unstable/cli/internal/completions/bash.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/internal/completions/bash.ts rename to packages/effect/src/unstable/cli/internal/completions/bash.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/internal/completions/descriptor.ts b/packages/effect/src/unstable/cli/internal/completions/descriptor.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/internal/completions/descriptor.ts rename to packages/effect/src/unstable/cli/internal/completions/descriptor.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/internal/completions/fish.ts b/packages/effect/src/unstable/cli/internal/completions/fish.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/internal/completions/fish.ts rename to packages/effect/src/unstable/cli/internal/completions/fish.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/internal/completions/zsh.ts b/packages/effect/src/unstable/cli/internal/completions/zsh.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/internal/completions/zsh.ts rename to packages/effect/src/unstable/cli/internal/completions/zsh.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/internal/config.ts b/packages/effect/src/unstable/cli/internal/config.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/internal/config.ts rename to packages/effect/src/unstable/cli/internal/config.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/internal/help.ts b/packages/effect/src/unstable/cli/internal/help.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/internal/help.ts rename to packages/effect/src/unstable/cli/internal/help.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/internal/lexer.ts b/packages/effect/src/unstable/cli/internal/lexer.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/internal/lexer.ts rename to packages/effect/src/unstable/cli/internal/lexer.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/internal/parser.ts b/packages/effect/src/unstable/cli/internal/parser.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/internal/parser.ts rename to packages/effect/src/unstable/cli/internal/parser.ts diff --git a/repos/effect/packages/effect/src/unstable/cli/internal/wizard.ts b/packages/effect/src/unstable/cli/internal/wizard.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cli/internal/wizard.ts rename to packages/effect/src/unstable/cli/internal/wizard.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/ClusterCron.ts b/packages/effect/src/unstable/cluster/ClusterCron.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/ClusterCron.ts rename to packages/effect/src/unstable/cluster/ClusterCron.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/ClusterError.ts b/packages/effect/src/unstable/cluster/ClusterError.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/ClusterError.ts rename to packages/effect/src/unstable/cluster/ClusterError.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/ClusterMetrics.ts b/packages/effect/src/unstable/cluster/ClusterMetrics.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/ClusterMetrics.ts rename to packages/effect/src/unstable/cluster/ClusterMetrics.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/ClusterSchema.ts b/packages/effect/src/unstable/cluster/ClusterSchema.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/ClusterSchema.ts rename to packages/effect/src/unstable/cluster/ClusterSchema.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/ClusterWorkflowEngine.ts b/packages/effect/src/unstable/cluster/ClusterWorkflowEngine.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/ClusterWorkflowEngine.ts rename to packages/effect/src/unstable/cluster/ClusterWorkflowEngine.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/DeliverAt.ts b/packages/effect/src/unstable/cluster/DeliverAt.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/DeliverAt.ts rename to packages/effect/src/unstable/cluster/DeliverAt.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/Entity.ts b/packages/effect/src/unstable/cluster/Entity.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/Entity.ts rename to packages/effect/src/unstable/cluster/Entity.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/EntityAddress.ts b/packages/effect/src/unstable/cluster/EntityAddress.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/EntityAddress.ts rename to packages/effect/src/unstable/cluster/EntityAddress.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/EntityId.ts b/packages/effect/src/unstable/cluster/EntityId.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/EntityId.ts rename to packages/effect/src/unstable/cluster/EntityId.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/EntityProxy.ts b/packages/effect/src/unstable/cluster/EntityProxy.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/EntityProxy.ts rename to packages/effect/src/unstable/cluster/EntityProxy.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/EntityProxyServer.ts b/packages/effect/src/unstable/cluster/EntityProxyServer.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/EntityProxyServer.ts rename to packages/effect/src/unstable/cluster/EntityProxyServer.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/EntityResource.ts b/packages/effect/src/unstable/cluster/EntityResource.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/EntityResource.ts rename to packages/effect/src/unstable/cluster/EntityResource.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/EntityType.ts b/packages/effect/src/unstable/cluster/EntityType.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/EntityType.ts rename to packages/effect/src/unstable/cluster/EntityType.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/Envelope.ts b/packages/effect/src/unstable/cluster/Envelope.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/Envelope.ts rename to packages/effect/src/unstable/cluster/Envelope.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/HttpRunner.ts b/packages/effect/src/unstable/cluster/HttpRunner.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/HttpRunner.ts rename to packages/effect/src/unstable/cluster/HttpRunner.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/K8sHttpClient.ts b/packages/effect/src/unstable/cluster/K8sHttpClient.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/K8sHttpClient.ts rename to packages/effect/src/unstable/cluster/K8sHttpClient.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/K8sTypes.ts b/packages/effect/src/unstable/cluster/K8sTypes.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/K8sTypes.ts rename to packages/effect/src/unstable/cluster/K8sTypes.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/MachineId.ts b/packages/effect/src/unstable/cluster/MachineId.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/MachineId.ts rename to packages/effect/src/unstable/cluster/MachineId.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/Message.ts b/packages/effect/src/unstable/cluster/Message.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/Message.ts rename to packages/effect/src/unstable/cluster/Message.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/MessageStorage.ts b/packages/effect/src/unstable/cluster/MessageStorage.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/MessageStorage.ts rename to packages/effect/src/unstable/cluster/MessageStorage.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/Reply.ts b/packages/effect/src/unstable/cluster/Reply.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/Reply.ts rename to packages/effect/src/unstable/cluster/Reply.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/Runner.ts b/packages/effect/src/unstable/cluster/Runner.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/Runner.ts rename to packages/effect/src/unstable/cluster/Runner.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/RunnerAddress.ts b/packages/effect/src/unstable/cluster/RunnerAddress.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/RunnerAddress.ts rename to packages/effect/src/unstable/cluster/RunnerAddress.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/RunnerHealth.ts b/packages/effect/src/unstable/cluster/RunnerHealth.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/RunnerHealth.ts rename to packages/effect/src/unstable/cluster/RunnerHealth.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/RunnerServer.ts b/packages/effect/src/unstable/cluster/RunnerServer.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/RunnerServer.ts rename to packages/effect/src/unstable/cluster/RunnerServer.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/RunnerStorage.ts b/packages/effect/src/unstable/cluster/RunnerStorage.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/RunnerStorage.ts rename to packages/effect/src/unstable/cluster/RunnerStorage.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/Runners.ts b/packages/effect/src/unstable/cluster/Runners.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/Runners.ts rename to packages/effect/src/unstable/cluster/Runners.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/ShardId.ts b/packages/effect/src/unstable/cluster/ShardId.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/ShardId.ts rename to packages/effect/src/unstable/cluster/ShardId.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/Sharding.ts b/packages/effect/src/unstable/cluster/Sharding.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/Sharding.ts rename to packages/effect/src/unstable/cluster/Sharding.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/ShardingConfig.ts b/packages/effect/src/unstable/cluster/ShardingConfig.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/ShardingConfig.ts rename to packages/effect/src/unstable/cluster/ShardingConfig.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/ShardingRegistrationEvent.ts b/packages/effect/src/unstable/cluster/ShardingRegistrationEvent.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/ShardingRegistrationEvent.ts rename to packages/effect/src/unstable/cluster/ShardingRegistrationEvent.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/SingleRunner.ts b/packages/effect/src/unstable/cluster/SingleRunner.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/SingleRunner.ts rename to packages/effect/src/unstable/cluster/SingleRunner.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/Singleton.ts b/packages/effect/src/unstable/cluster/Singleton.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/Singleton.ts rename to packages/effect/src/unstable/cluster/Singleton.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/SingletonAddress.ts b/packages/effect/src/unstable/cluster/SingletonAddress.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/SingletonAddress.ts rename to packages/effect/src/unstable/cluster/SingletonAddress.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/Snowflake.ts b/packages/effect/src/unstable/cluster/Snowflake.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/Snowflake.ts rename to packages/effect/src/unstable/cluster/Snowflake.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/SocketRunner.ts b/packages/effect/src/unstable/cluster/SocketRunner.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/SocketRunner.ts rename to packages/effect/src/unstable/cluster/SocketRunner.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/SqlMessageStorage.ts b/packages/effect/src/unstable/cluster/SqlMessageStorage.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/SqlMessageStorage.ts rename to packages/effect/src/unstable/cluster/SqlMessageStorage.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/SqlRunnerStorage.ts b/packages/effect/src/unstable/cluster/SqlRunnerStorage.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/SqlRunnerStorage.ts rename to packages/effect/src/unstable/cluster/SqlRunnerStorage.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/TestRunner.ts b/packages/effect/src/unstable/cluster/TestRunner.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/TestRunner.ts rename to packages/effect/src/unstable/cluster/TestRunner.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/index.ts b/packages/effect/src/unstable/cluster/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/index.ts rename to packages/effect/src/unstable/cluster/index.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/internal/clusterAbandon.ts b/packages/effect/src/unstable/cluster/internal/clusterAbandon.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/internal/clusterAbandon.ts rename to packages/effect/src/unstable/cluster/internal/clusterAbandon.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/internal/entityManager.ts b/packages/effect/src/unstable/cluster/internal/entityManager.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/internal/entityManager.ts rename to packages/effect/src/unstable/cluster/internal/entityManager.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/internal/entityReaper.ts b/packages/effect/src/unstable/cluster/internal/entityReaper.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/internal/entityReaper.ts rename to packages/effect/src/unstable/cluster/internal/entityReaper.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/internal/hash.ts b/packages/effect/src/unstable/cluster/internal/hash.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/internal/hash.ts rename to packages/effect/src/unstable/cluster/internal/hash.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/internal/interruptors.ts b/packages/effect/src/unstable/cluster/internal/interruptors.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/internal/interruptors.ts rename to packages/effect/src/unstable/cluster/internal/interruptors.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/internal/resourceMap.ts b/packages/effect/src/unstable/cluster/internal/resourceMap.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/internal/resourceMap.ts rename to packages/effect/src/unstable/cluster/internal/resourceMap.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/internal/resourceRef.ts b/packages/effect/src/unstable/cluster/internal/resourceRef.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/internal/resourceRef.ts rename to packages/effect/src/unstable/cluster/internal/resourceRef.ts diff --git a/repos/effect/packages/effect/src/unstable/cluster/internal/shardLock.ts b/packages/effect/src/unstable/cluster/internal/shardLock.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/cluster/internal/shardLock.ts rename to packages/effect/src/unstable/cluster/internal/shardLock.ts diff --git a/repos/effect/packages/effect/src/unstable/devtools/DevTools.ts b/packages/effect/src/unstable/devtools/DevTools.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/devtools/DevTools.ts rename to packages/effect/src/unstable/devtools/DevTools.ts diff --git a/repos/effect/packages/effect/src/unstable/devtools/DevToolsClient.ts b/packages/effect/src/unstable/devtools/DevToolsClient.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/devtools/DevToolsClient.ts rename to packages/effect/src/unstable/devtools/DevToolsClient.ts diff --git a/repos/effect/packages/effect/src/unstable/devtools/DevToolsSchema.ts b/packages/effect/src/unstable/devtools/DevToolsSchema.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/devtools/DevToolsSchema.ts rename to packages/effect/src/unstable/devtools/DevToolsSchema.ts diff --git a/repos/effect/packages/effect/src/unstable/devtools/DevToolsServer.ts b/packages/effect/src/unstable/devtools/DevToolsServer.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/devtools/DevToolsServer.ts rename to packages/effect/src/unstable/devtools/DevToolsServer.ts diff --git a/repos/effect/packages/effect/src/unstable/devtools/index.ts b/packages/effect/src/unstable/devtools/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/devtools/index.ts rename to packages/effect/src/unstable/devtools/index.ts diff --git a/repos/effect/packages/effect/src/unstable/encoding/Ini.ts b/packages/effect/src/unstable/encoding/Ini.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/encoding/Ini.ts rename to packages/effect/src/unstable/encoding/Ini.ts diff --git a/repos/effect/packages/effect/src/unstable/encoding/Ndjson.ts b/packages/effect/src/unstable/encoding/Ndjson.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/encoding/Ndjson.ts rename to packages/effect/src/unstable/encoding/Ndjson.ts diff --git a/repos/effect/packages/effect/src/unstable/encoding/SchemaBinary.ts b/packages/effect/src/unstable/encoding/SchemaBinary.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/encoding/SchemaBinary.ts rename to packages/effect/src/unstable/encoding/SchemaBinary.ts diff --git a/repos/effect/packages/effect/src/unstable/encoding/Sse.ts b/packages/effect/src/unstable/encoding/Sse.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/encoding/Sse.ts rename to packages/effect/src/unstable/encoding/Sse.ts diff --git a/repos/effect/packages/effect/src/unstable/encoding/Toml.ts b/packages/effect/src/unstable/encoding/Toml.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/encoding/Toml.ts rename to packages/effect/src/unstable/encoding/Toml.ts diff --git a/repos/effect/packages/effect/src/unstable/encoding/Yaml.ts b/packages/effect/src/unstable/encoding/Yaml.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/encoding/Yaml.ts rename to packages/effect/src/unstable/encoding/Yaml.ts diff --git a/repos/effect/packages/effect/src/unstable/encoding/index.ts b/packages/effect/src/unstable/encoding/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/encoding/index.ts rename to packages/effect/src/unstable/encoding/index.ts diff --git a/repos/effect/packages/effect/src/unstable/eventlog/Event.ts b/packages/effect/src/unstable/eventlog/Event.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/eventlog/Event.ts rename to packages/effect/src/unstable/eventlog/Event.ts diff --git a/repos/effect/packages/effect/src/unstable/eventlog/EventGroup.ts b/packages/effect/src/unstable/eventlog/EventGroup.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/eventlog/EventGroup.ts rename to packages/effect/src/unstable/eventlog/EventGroup.ts diff --git a/repos/effect/packages/effect/src/unstable/eventlog/EventJournal.ts b/packages/effect/src/unstable/eventlog/EventJournal.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/eventlog/EventJournal.ts rename to packages/effect/src/unstable/eventlog/EventJournal.ts diff --git a/repos/effect/packages/effect/src/unstable/eventlog/EventLog.ts b/packages/effect/src/unstable/eventlog/EventLog.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/eventlog/EventLog.ts rename to packages/effect/src/unstable/eventlog/EventLog.ts diff --git a/repos/effect/packages/effect/src/unstable/eventlog/EventLogEncryption.ts b/packages/effect/src/unstable/eventlog/EventLogEncryption.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/eventlog/EventLogEncryption.ts rename to packages/effect/src/unstable/eventlog/EventLogEncryption.ts diff --git a/repos/effect/packages/effect/src/unstable/eventlog/EventLogMessage.ts b/packages/effect/src/unstable/eventlog/EventLogMessage.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/eventlog/EventLogMessage.ts rename to packages/effect/src/unstable/eventlog/EventLogMessage.ts diff --git a/repos/effect/packages/effect/src/unstable/eventlog/EventLogRemote.ts b/packages/effect/src/unstable/eventlog/EventLogRemote.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/eventlog/EventLogRemote.ts rename to packages/effect/src/unstable/eventlog/EventLogRemote.ts diff --git a/repos/effect/packages/effect/src/unstable/eventlog/EventLogServer.ts b/packages/effect/src/unstable/eventlog/EventLogServer.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/eventlog/EventLogServer.ts rename to packages/effect/src/unstable/eventlog/EventLogServer.ts diff --git a/repos/effect/packages/effect/src/unstable/eventlog/EventLogServerEncrypted.ts b/packages/effect/src/unstable/eventlog/EventLogServerEncrypted.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/eventlog/EventLogServerEncrypted.ts rename to packages/effect/src/unstable/eventlog/EventLogServerEncrypted.ts diff --git a/repos/effect/packages/effect/src/unstable/eventlog/EventLogServerUnencrypted.ts b/packages/effect/src/unstable/eventlog/EventLogServerUnencrypted.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/eventlog/EventLogServerUnencrypted.ts rename to packages/effect/src/unstable/eventlog/EventLogServerUnencrypted.ts diff --git a/repos/effect/packages/effect/src/unstable/eventlog/EventLogSessionAuth.ts b/packages/effect/src/unstable/eventlog/EventLogSessionAuth.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/eventlog/EventLogSessionAuth.ts rename to packages/effect/src/unstable/eventlog/EventLogSessionAuth.ts diff --git a/repos/effect/packages/effect/src/unstable/eventlog/SqlEventJournal.ts b/packages/effect/src/unstable/eventlog/SqlEventJournal.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/eventlog/SqlEventJournal.ts rename to packages/effect/src/unstable/eventlog/SqlEventJournal.ts diff --git a/repos/effect/packages/effect/src/unstable/eventlog/SqlEventLogServerEncrypted.ts b/packages/effect/src/unstable/eventlog/SqlEventLogServerEncrypted.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/eventlog/SqlEventLogServerEncrypted.ts rename to packages/effect/src/unstable/eventlog/SqlEventLogServerEncrypted.ts diff --git a/repos/effect/packages/effect/src/unstable/eventlog/SqlEventLogServerUnencrypted.ts b/packages/effect/src/unstable/eventlog/SqlEventLogServerUnencrypted.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/eventlog/SqlEventLogServerUnencrypted.ts rename to packages/effect/src/unstable/eventlog/SqlEventLogServerUnencrypted.ts diff --git a/repos/effect/packages/effect/src/unstable/eventlog/index.ts b/packages/effect/src/unstable/eventlog/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/eventlog/index.ts rename to packages/effect/src/unstable/eventlog/index.ts diff --git a/repos/effect/packages/effect/src/unstable/eventlog/internal/identityRootSecretDerivation.ts b/packages/effect/src/unstable/eventlog/internal/identityRootSecretDerivation.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/eventlog/internal/identityRootSecretDerivation.ts rename to packages/effect/src/unstable/eventlog/internal/identityRootSecretDerivation.ts diff --git a/repos/effect/packages/effect/src/unstable/http/Cookies.ts b/packages/effect/src/unstable/http/Cookies.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/Cookies.ts rename to packages/effect/src/unstable/http/Cookies.ts diff --git a/repos/effect/packages/effect/src/unstable/http/Etag.ts b/packages/effect/src/unstable/http/Etag.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/Etag.ts rename to packages/effect/src/unstable/http/Etag.ts diff --git a/repos/effect/packages/effect/src/unstable/http/FetchHttpClient.ts b/packages/effect/src/unstable/http/FetchHttpClient.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/FetchHttpClient.ts rename to packages/effect/src/unstable/http/FetchHttpClient.ts diff --git a/repos/effect/packages/effect/src/unstable/http/FindMyWay.ts b/packages/effect/src/unstable/http/FindMyWay.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/FindMyWay.ts rename to packages/effect/src/unstable/http/FindMyWay.ts diff --git a/repos/effect/packages/effect/src/unstable/http/FindMyWay/internal/queryString.ts b/packages/effect/src/unstable/http/FindMyWay/internal/queryString.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/FindMyWay/internal/queryString.ts rename to packages/effect/src/unstable/http/FindMyWay/internal/queryString.ts diff --git a/repos/effect/packages/effect/src/unstable/http/FindMyWay/internal/router.ts b/packages/effect/src/unstable/http/FindMyWay/internal/router.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/FindMyWay/internal/router.ts rename to packages/effect/src/unstable/http/FindMyWay/internal/router.ts diff --git a/repos/effect/packages/effect/src/unstable/http/Headers.ts b/packages/effect/src/unstable/http/Headers.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/Headers.ts rename to packages/effect/src/unstable/http/Headers.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpBody.ts b/packages/effect/src/unstable/http/HttpBody.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpBody.ts rename to packages/effect/src/unstable/http/HttpBody.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpClient.ts b/packages/effect/src/unstable/http/HttpClient.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpClient.ts rename to packages/effect/src/unstable/http/HttpClient.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpClientError.ts b/packages/effect/src/unstable/http/HttpClientError.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpClientError.ts rename to packages/effect/src/unstable/http/HttpClientError.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpClientRequest.ts b/packages/effect/src/unstable/http/HttpClientRequest.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpClientRequest.ts rename to packages/effect/src/unstable/http/HttpClientRequest.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpClientResponse.ts b/packages/effect/src/unstable/http/HttpClientResponse.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpClientResponse.ts rename to packages/effect/src/unstable/http/HttpClientResponse.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpEffect.ts b/packages/effect/src/unstable/http/HttpEffect.ts similarity index 98% rename from repos/effect/packages/effect/src/unstable/http/HttpEffect.ts rename to packages/effect/src/unstable/http/HttpEffect.ts index 95e89f6a1..21737180d 100644 --- a/repos/effect/packages/effect/src/unstable/http/HttpEffect.ts +++ b/packages/effect/src/unstable/http/HttpEffect.ts @@ -295,9 +295,12 @@ export const toWebHandlerWith = { - if (request.method !== "HEAD") response = scopeTransferToStream(response) + const withoutBody = request.method === "HEAD" + if (!Response.omitsBody(response, withoutBody)) { + response = scopeTransferToStream(response) + } ;(request as any)[resolveSymbol]( - Response.toWeb(response, { withoutBody: request.method === "HEAD", context }) + Response.toWeb(response, { withoutBody, context }) ) return Effect.void }, middleware) diff --git a/repos/effect/packages/effect/src/unstable/http/HttpIncomingMessage.ts b/packages/effect/src/unstable/http/HttpIncomingMessage.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpIncomingMessage.ts rename to packages/effect/src/unstable/http/HttpIncomingMessage.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpMethod.ts b/packages/effect/src/unstable/http/HttpMethod.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpMethod.ts rename to packages/effect/src/unstable/http/HttpMethod.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpMiddleware.ts b/packages/effect/src/unstable/http/HttpMiddleware.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpMiddleware.ts rename to packages/effect/src/unstable/http/HttpMiddleware.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpPlatform.ts b/packages/effect/src/unstable/http/HttpPlatform.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpPlatform.ts rename to packages/effect/src/unstable/http/HttpPlatform.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpRouter.ts b/packages/effect/src/unstable/http/HttpRouter.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpRouter.ts rename to packages/effect/src/unstable/http/HttpRouter.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpServer.ts b/packages/effect/src/unstable/http/HttpServer.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpServer.ts rename to packages/effect/src/unstable/http/HttpServer.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpServerError.ts b/packages/effect/src/unstable/http/HttpServerError.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpServerError.ts rename to packages/effect/src/unstable/http/HttpServerError.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpServerRequest.ts b/packages/effect/src/unstable/http/HttpServerRequest.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpServerRequest.ts rename to packages/effect/src/unstable/http/HttpServerRequest.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpServerRespondable.ts b/packages/effect/src/unstable/http/HttpServerRespondable.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpServerRespondable.ts rename to packages/effect/src/unstable/http/HttpServerRespondable.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpServerResponse.ts b/packages/effect/src/unstable/http/HttpServerResponse.ts similarity index 97% rename from repos/effect/packages/effect/src/unstable/http/HttpServerResponse.ts rename to packages/effect/src/unstable/http/HttpServerResponse.ts index 9a3dd5c18..11148609a 100644 --- a/repos/effect/packages/effect/src/unstable/http/HttpServerResponse.ts +++ b/packages/effect/src/unstable/http/HttpServerResponse.ts @@ -14,7 +14,7 @@ import type * as ByteSize from "../../ByteSize.ts" import * as Context from "../../Context.ts" import * as Effect from "../../Effect.ts" import * as ErrorReporter from "../../ErrorReporter.ts" -import { dual } from "../../Function.ts" +import { constVoid, dual } from "../../Function.ts" import * as Inspectable from "../../Inspectable.ts" import { PipeInspectableProto } from "../../internal/core.ts" import * as Option from "../../Option.ts" @@ -965,14 +965,27 @@ export const setStatus: { }) ) +/** + * Returns whether a response must omit its body because its status is 204, 205, + * or 304, or `withoutBody` is true. + * + * @category predicates + * @since 4.0.0 + */ +export const omitsBody = (response: HttpServerResponse, withoutBody = false): boolean => + withoutBody || response.status === 204 || response.status === 205 || response.status === 304 + /** * Converts an `HttpServerResponse` to a Web `Response`. * * **Details** * * Cookies are appended as `Set-Cookie` headers. Stream bodies are converted using - * the supplied context, and `withoutBody` can be used for responses such as HEAD - * responses. + * the supplied context. + * + * Bodies are omitted for statuses 204, 205, and 304, or when `withoutBody` is true + * (for example, for HEAD responses). Omitted raw `ReadableStream` bodies are + * cancelled without awaiting completion, and cancellation errors are ignored. * * @category converting * @since 4.0.0 @@ -991,14 +1004,17 @@ export const toWeb = ( headers.append("set-cookie", header) } } - if (options?.withoutBody) { + const body = response.body + if (omitsBody(response, options?.withoutBody)) { + if (body._tag === "Raw" && isReadableStream(body.body)) { + body.body.cancel().catch(constVoid) + } return new Response(undefined, { status: response.status, statusText: response.statusText as string, headers }) } - const body = response.body switch (body._tag) { case "Empty": { return new Response(undefined, { diff --git a/repos/effect/packages/effect/src/unstable/http/HttpStaticServer.ts b/packages/effect/src/unstable/http/HttpStaticServer.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpStaticServer.ts rename to packages/effect/src/unstable/http/HttpStaticServer.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpStatus.ts b/packages/effect/src/unstable/http/HttpStatus.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpStatus.ts rename to packages/effect/src/unstable/http/HttpStatus.ts diff --git a/repos/effect/packages/effect/src/unstable/http/HttpTraceContext.ts b/packages/effect/src/unstable/http/HttpTraceContext.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/HttpTraceContext.ts rename to packages/effect/src/unstable/http/HttpTraceContext.ts diff --git a/repos/effect/packages/effect/src/unstable/http/Mime.ts b/packages/effect/src/unstable/http/Mime.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/Mime.ts rename to packages/effect/src/unstable/http/Mime.ts diff --git a/repos/effect/packages/effect/src/unstable/http/Multipart.ts b/packages/effect/src/unstable/http/Multipart.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/Multipart.ts rename to packages/effect/src/unstable/http/Multipart.ts diff --git a/repos/effect/packages/effect/src/unstable/http/MultipartParser.ts b/packages/effect/src/unstable/http/MultipartParser.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/MultipartParser.ts rename to packages/effect/src/unstable/http/MultipartParser.ts diff --git a/repos/effect/packages/effect/src/unstable/http/MultipartParser/HeadersParser.ts b/packages/effect/src/unstable/http/MultipartParser/HeadersParser.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/MultipartParser/HeadersParser.ts rename to packages/effect/src/unstable/http/MultipartParser/HeadersParser.ts diff --git a/repos/effect/packages/effect/src/unstable/http/MultipartParser/Search.ts b/packages/effect/src/unstable/http/MultipartParser/Search.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/MultipartParser/Search.ts rename to packages/effect/src/unstable/http/MultipartParser/Search.ts diff --git a/repos/effect/packages/effect/src/unstable/http/MultipartParser/internal/contentType.ts b/packages/effect/src/unstable/http/MultipartParser/internal/contentType.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/MultipartParser/internal/contentType.ts rename to packages/effect/src/unstable/http/MultipartParser/internal/contentType.ts diff --git a/repos/effect/packages/effect/src/unstable/http/MultipartParser/internal/headers.ts b/packages/effect/src/unstable/http/MultipartParser/internal/headers.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/MultipartParser/internal/headers.ts rename to packages/effect/src/unstable/http/MultipartParser/internal/headers.ts diff --git a/repos/effect/packages/effect/src/unstable/http/MultipartParser/internal/multipart.ts b/packages/effect/src/unstable/http/MultipartParser/internal/multipart.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/MultipartParser/internal/multipart.ts rename to packages/effect/src/unstable/http/MultipartParser/internal/multipart.ts diff --git a/repos/effect/packages/effect/src/unstable/http/MultipartParser/internal/search.ts b/packages/effect/src/unstable/http/MultipartParser/internal/search.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/MultipartParser/internal/search.ts rename to packages/effect/src/unstable/http/MultipartParser/internal/search.ts diff --git a/repos/effect/packages/effect/src/unstable/http/Template.ts b/packages/effect/src/unstable/http/Template.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/Template.ts rename to packages/effect/src/unstable/http/Template.ts diff --git a/repos/effect/packages/effect/src/unstable/http/Url.ts b/packages/effect/src/unstable/http/Url.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/Url.ts rename to packages/effect/src/unstable/http/Url.ts diff --git a/repos/effect/packages/effect/src/unstable/http/UrlParams.ts b/packages/effect/src/unstable/http/UrlParams.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/UrlParams.ts rename to packages/effect/src/unstable/http/UrlParams.ts diff --git a/repos/effect/packages/effect/src/unstable/http/index.ts b/packages/effect/src/unstable/http/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/index.ts rename to packages/effect/src/unstable/http/index.ts diff --git a/repos/effect/packages/effect/src/unstable/http/internal/compression.ts b/packages/effect/src/unstable/http/internal/compression.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/internal/compression.ts rename to packages/effect/src/unstable/http/internal/compression.ts diff --git a/repos/effect/packages/effect/src/unstable/http/internal/headers.ts b/packages/effect/src/unstable/http/internal/headers.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/internal/headers.ts rename to packages/effect/src/unstable/http/internal/headers.ts diff --git a/repos/effect/packages/effect/src/unstable/http/internal/httpBody.ts b/packages/effect/src/unstable/http/internal/httpBody.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/internal/httpBody.ts rename to packages/effect/src/unstable/http/internal/httpBody.ts diff --git a/repos/effect/packages/effect/src/unstable/http/internal/mimeTypes.ts b/packages/effect/src/unstable/http/internal/mimeTypes.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/internal/mimeTypes.ts rename to packages/effect/src/unstable/http/internal/mimeTypes.ts diff --git a/repos/effect/packages/effect/src/unstable/http/internal/preResponseHandler.ts b/packages/effect/src/unstable/http/internal/preResponseHandler.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/http/internal/preResponseHandler.ts rename to packages/effect/src/unstable/http/internal/preResponseHandler.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/HttpApi.ts b/packages/effect/src/unstable/httpapi/HttpApi.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/HttpApi.ts rename to packages/effect/src/unstable/httpapi/HttpApi.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/HttpApiBuilder.ts b/packages/effect/src/unstable/httpapi/HttpApiBuilder.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/HttpApiBuilder.ts rename to packages/effect/src/unstable/httpapi/HttpApiBuilder.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/HttpApiClient.ts b/packages/effect/src/unstable/httpapi/HttpApiClient.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/HttpApiClient.ts rename to packages/effect/src/unstable/httpapi/HttpApiClient.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/HttpApiEndpoint.ts b/packages/effect/src/unstable/httpapi/HttpApiEndpoint.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/HttpApiEndpoint.ts rename to packages/effect/src/unstable/httpapi/HttpApiEndpoint.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/HttpApiError.ts b/packages/effect/src/unstable/httpapi/HttpApiError.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/HttpApiError.ts rename to packages/effect/src/unstable/httpapi/HttpApiError.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/HttpApiGroup.ts b/packages/effect/src/unstable/httpapi/HttpApiGroup.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/HttpApiGroup.ts rename to packages/effect/src/unstable/httpapi/HttpApiGroup.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/HttpApiMiddleware.ts b/packages/effect/src/unstable/httpapi/HttpApiMiddleware.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/HttpApiMiddleware.ts rename to packages/effect/src/unstable/httpapi/HttpApiMiddleware.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/HttpApiScalar.ts b/packages/effect/src/unstable/httpapi/HttpApiScalar.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/HttpApiScalar.ts rename to packages/effect/src/unstable/httpapi/HttpApiScalar.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/HttpApiSchema.ts b/packages/effect/src/unstable/httpapi/HttpApiSchema.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/HttpApiSchema.ts rename to packages/effect/src/unstable/httpapi/HttpApiSchema.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/HttpApiSecurity.ts b/packages/effect/src/unstable/httpapi/HttpApiSecurity.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/HttpApiSecurity.ts rename to packages/effect/src/unstable/httpapi/HttpApiSecurity.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/HttpApiSwagger.ts b/packages/effect/src/unstable/httpapi/HttpApiSwagger.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/HttpApiSwagger.ts rename to packages/effect/src/unstable/httpapi/HttpApiSwagger.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/HttpApiTest.ts b/packages/effect/src/unstable/httpapi/HttpApiTest.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/HttpApiTest.ts rename to packages/effect/src/unstable/httpapi/HttpApiTest.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/OpenApi.ts b/packages/effect/src/unstable/httpapi/OpenApi.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/OpenApi.ts rename to packages/effect/src/unstable/httpapi/OpenApi.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/index.ts b/packages/effect/src/unstable/httpapi/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/index.ts rename to packages/effect/src/unstable/httpapi/index.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/internal/html.ts b/packages/effect/src/unstable/httpapi/internal/html.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/internal/html.ts rename to packages/effect/src/unstable/httpapi/internal/html.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/internal/httpApiScalar.ts b/packages/effect/src/unstable/httpapi/internal/httpApiScalar.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/internal/httpApiScalar.ts rename to packages/effect/src/unstable/httpapi/internal/httpApiScalar.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/internal/httpApiSwagger.ts b/packages/effect/src/unstable/httpapi/internal/httpApiSwagger.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/internal/httpApiSwagger.ts rename to packages/effect/src/unstable/httpapi/internal/httpApiSwagger.ts diff --git a/repos/effect/packages/effect/src/unstable/httpapi/internal/mediaType.ts b/packages/effect/src/unstable/httpapi/internal/mediaType.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/httpapi/internal/mediaType.ts rename to packages/effect/src/unstable/httpapi/internal/mediaType.ts diff --git a/repos/effect/packages/effect/src/unstable/net/IpInterface.ts b/packages/effect/src/unstable/net/IpInterface.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/net/IpInterface.ts rename to packages/effect/src/unstable/net/IpInterface.ts diff --git a/repos/effect/packages/effect/src/unstable/net/IpNetwork.ts b/packages/effect/src/unstable/net/IpNetwork.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/net/IpNetwork.ts rename to packages/effect/src/unstable/net/IpNetwork.ts diff --git a/repos/effect/packages/effect/src/unstable/net/NetAddress.ts b/packages/effect/src/unstable/net/NetAddress.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/net/NetAddress.ts rename to packages/effect/src/unstable/net/NetAddress.ts diff --git a/repos/effect/packages/effect/src/unstable/net/index.ts b/packages/effect/src/unstable/net/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/net/index.ts rename to packages/effect/src/unstable/net/index.ts diff --git a/repos/effect/packages/effect/src/unstable/observability/Otlp.ts b/packages/effect/src/unstable/observability/Otlp.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/observability/Otlp.ts rename to packages/effect/src/unstable/observability/Otlp.ts diff --git a/repos/effect/packages/effect/src/unstable/observability/OtlpExporter.ts b/packages/effect/src/unstable/observability/OtlpExporter.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/observability/OtlpExporter.ts rename to packages/effect/src/unstable/observability/OtlpExporter.ts diff --git a/repos/effect/packages/effect/src/unstable/observability/OtlpLogger.ts b/packages/effect/src/unstable/observability/OtlpLogger.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/observability/OtlpLogger.ts rename to packages/effect/src/unstable/observability/OtlpLogger.ts diff --git a/repos/effect/packages/effect/src/unstable/observability/OtlpMetrics.ts b/packages/effect/src/unstable/observability/OtlpMetrics.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/observability/OtlpMetrics.ts rename to packages/effect/src/unstable/observability/OtlpMetrics.ts diff --git a/repos/effect/packages/effect/src/unstable/observability/OtlpResource.ts b/packages/effect/src/unstable/observability/OtlpResource.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/observability/OtlpResource.ts rename to packages/effect/src/unstable/observability/OtlpResource.ts diff --git a/repos/effect/packages/effect/src/unstable/observability/OtlpSerialization.ts b/packages/effect/src/unstable/observability/OtlpSerialization.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/observability/OtlpSerialization.ts rename to packages/effect/src/unstable/observability/OtlpSerialization.ts diff --git a/repos/effect/packages/effect/src/unstable/observability/OtlpTracer.ts b/packages/effect/src/unstable/observability/OtlpTracer.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/observability/OtlpTracer.ts rename to packages/effect/src/unstable/observability/OtlpTracer.ts diff --git a/repos/effect/packages/effect/src/unstable/observability/PrometheusMetrics.ts b/packages/effect/src/unstable/observability/PrometheusMetrics.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/observability/PrometheusMetrics.ts rename to packages/effect/src/unstable/observability/PrometheusMetrics.ts diff --git a/repos/effect/packages/effect/src/unstable/observability/index.ts b/packages/effect/src/unstable/observability/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/observability/index.ts rename to packages/effect/src/unstable/observability/index.ts diff --git a/repos/effect/packages/effect/src/unstable/observability/internal/otlpEnv.ts b/packages/effect/src/unstable/observability/internal/otlpEnv.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/observability/internal/otlpEnv.ts rename to packages/effect/src/unstable/observability/internal/otlpEnv.ts diff --git a/repos/effect/packages/effect/src/unstable/observability/internal/otlpProtobuf.ts b/packages/effect/src/unstable/observability/internal/otlpProtobuf.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/observability/internal/otlpProtobuf.ts rename to packages/effect/src/unstable/observability/internal/otlpProtobuf.ts diff --git a/repos/effect/packages/effect/src/unstable/observability/internal/protobuf.ts b/packages/effect/src/unstable/observability/internal/protobuf.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/observability/internal/protobuf.ts rename to packages/effect/src/unstable/observability/internal/protobuf.ts diff --git a/repos/effect/packages/effect/src/unstable/persistence/KeyValueStore.ts b/packages/effect/src/unstable/persistence/KeyValueStore.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/persistence/KeyValueStore.ts rename to packages/effect/src/unstable/persistence/KeyValueStore.ts diff --git a/repos/effect/packages/effect/src/unstable/persistence/Persistable.ts b/packages/effect/src/unstable/persistence/Persistable.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/persistence/Persistable.ts rename to packages/effect/src/unstable/persistence/Persistable.ts diff --git a/repos/effect/packages/effect/src/unstable/persistence/PersistedCache.ts b/packages/effect/src/unstable/persistence/PersistedCache.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/persistence/PersistedCache.ts rename to packages/effect/src/unstable/persistence/PersistedCache.ts diff --git a/repos/effect/packages/effect/src/unstable/persistence/PersistedQueue.ts b/packages/effect/src/unstable/persistence/PersistedQueue.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/persistence/PersistedQueue.ts rename to packages/effect/src/unstable/persistence/PersistedQueue.ts diff --git a/repos/effect/packages/effect/src/unstable/persistence/Persistence.ts b/packages/effect/src/unstable/persistence/Persistence.ts similarity index 98% rename from repos/effect/packages/effect/src/unstable/persistence/Persistence.ts rename to packages/effect/src/unstable/persistence/Persistence.ts index 631df6ed7..0572e1bb0 100644 --- a/repos/effect/packages/effect/src/unstable/persistence/Persistence.ts +++ b/packages/effect/src/unstable/persistence/Persistence.ts @@ -385,11 +385,6 @@ export const layerBackingSqlMultiTable: Layer.Layer< `.unprepared }) - const wrapString = sql.onDialectOrElse({ - mssql: () => (s: string) => `N'${s}'`, - orElse: () => (s: string) => `'${s}'` - }) - return identity({ get: (key) => sql< @@ -419,9 +414,9 @@ export const layerBackingSqlMultiTable: Layer.Layer< }) ), getMany: (keys) => - sql<{ id: string; value: string }>`SELECT id, value FROM ${table} WHERE id IN (${ - sql.literal(keys.map(wrapString).join(", ")) - }) AND (expires IS NULL OR expires > ${clock.currentTimeMillisUnsafe()})`.unprepared.pipe( + sql<{ id: string; value: string }>`SELECT id, value FROM ${table} WHERE ${ + sql.in("id", keys) + } AND (expires IS NULL OR expires > ${clock.currentTimeMillisUnsafe()})`.unprepared.pipe( Effect.mapError((cause) => new PersistenceError({ message: `Failed to getMany from backing store`, @@ -726,11 +721,6 @@ export const layerBackingSql: Layer.Layer< `.unprepared }) - const wrapString = sql.onDialectOrElse({ - mssql: () => (s: string) => `N'${s}'`, - orElse: () => (s: string) => `'${s}'` - }) - return BackingPersistence.of({ make: Effect.fnUntraced(function*(storeId) { const clock = yield* Clock.Clock @@ -764,9 +754,9 @@ export const layerBackingSql: Layer.Layer< }) ), getMany: (keys) => - sql<{ id: string; value: string }>`SELECT id, value FROM ${table} WHERE store_id = ${storeId} AND id IN (${ - sql.literal(keys.map(wrapString).join(", ")) - }) AND (expires IS NULL OR expires > ${clock.currentTimeMillisUnsafe()})`.unprepared.pipe( + sql<{ id: string; value: string }>`SELECT id, value FROM ${table} WHERE store_id = ${storeId} AND ${ + sql.in("id", keys) + } AND (expires IS NULL OR expires > ${clock.currentTimeMillisUnsafe()})`.unprepared.pipe( Effect.mapError((cause) => new PersistenceError({ message: `Failed to getMany from backing store`, diff --git a/repos/effect/packages/effect/src/unstable/persistence/RateLimiter.ts b/packages/effect/src/unstable/persistence/RateLimiter.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/persistence/RateLimiter.ts rename to packages/effect/src/unstable/persistence/RateLimiter.ts diff --git a/repos/effect/packages/effect/src/unstable/persistence/Redis.ts b/packages/effect/src/unstable/persistence/Redis.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/persistence/Redis.ts rename to packages/effect/src/unstable/persistence/Redis.ts diff --git a/repos/effect/packages/effect/src/unstable/persistence/index.ts b/packages/effect/src/unstable/persistence/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/persistence/index.ts rename to packages/effect/src/unstable/persistence/index.ts diff --git a/repos/effect/packages/effect/src/unstable/process/ChildProcess.ts b/packages/effect/src/unstable/process/ChildProcess.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/process/ChildProcess.ts rename to packages/effect/src/unstable/process/ChildProcess.ts diff --git a/repos/effect/packages/effect/src/unstable/process/ChildProcessSpawner.ts b/packages/effect/src/unstable/process/ChildProcessSpawner.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/process/ChildProcessSpawner.ts rename to packages/effect/src/unstable/process/ChildProcessSpawner.ts diff --git a/repos/effect/packages/effect/src/unstable/process/index.ts b/packages/effect/src/unstable/process/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/process/index.ts rename to packages/effect/src/unstable/process/index.ts diff --git a/repos/effect/packages/effect/src/unstable/reactivity/AsyncResult.ts b/packages/effect/src/unstable/reactivity/AsyncResult.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/reactivity/AsyncResult.ts rename to packages/effect/src/unstable/reactivity/AsyncResult.ts diff --git a/repos/effect/packages/effect/src/unstable/reactivity/Atom.ts b/packages/effect/src/unstable/reactivity/Atom.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/reactivity/Atom.ts rename to packages/effect/src/unstable/reactivity/Atom.ts diff --git a/repos/effect/packages/effect/src/unstable/reactivity/AtomHttpApi.ts b/packages/effect/src/unstable/reactivity/AtomHttpApi.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/reactivity/AtomHttpApi.ts rename to packages/effect/src/unstable/reactivity/AtomHttpApi.ts diff --git a/repos/effect/packages/effect/src/unstable/reactivity/AtomRef.ts b/packages/effect/src/unstable/reactivity/AtomRef.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/reactivity/AtomRef.ts rename to packages/effect/src/unstable/reactivity/AtomRef.ts diff --git a/repos/effect/packages/effect/src/unstable/reactivity/AtomRegistry.ts b/packages/effect/src/unstable/reactivity/AtomRegistry.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/reactivity/AtomRegistry.ts rename to packages/effect/src/unstable/reactivity/AtomRegistry.ts diff --git a/repos/effect/packages/effect/src/unstable/reactivity/AtomRpc.ts b/packages/effect/src/unstable/reactivity/AtomRpc.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/reactivity/AtomRpc.ts rename to packages/effect/src/unstable/reactivity/AtomRpc.ts diff --git a/repos/effect/packages/effect/src/unstable/reactivity/Hydration.ts b/packages/effect/src/unstable/reactivity/Hydration.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/reactivity/Hydration.ts rename to packages/effect/src/unstable/reactivity/Hydration.ts diff --git a/repos/effect/packages/effect/src/unstable/reactivity/Reactivity.ts b/packages/effect/src/unstable/reactivity/Reactivity.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/reactivity/Reactivity.ts rename to packages/effect/src/unstable/reactivity/Reactivity.ts diff --git a/repos/effect/packages/effect/src/unstable/reactivity/index.ts b/packages/effect/src/unstable/reactivity/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/reactivity/index.ts rename to packages/effect/src/unstable/reactivity/index.ts diff --git a/repos/effect/packages/effect/src/unstable/rpc/Rpc.ts b/packages/effect/src/unstable/rpc/Rpc.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/rpc/Rpc.ts rename to packages/effect/src/unstable/rpc/Rpc.ts diff --git a/repos/effect/packages/effect/src/unstable/rpc/RpcClient.ts b/packages/effect/src/unstable/rpc/RpcClient.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/rpc/RpcClient.ts rename to packages/effect/src/unstable/rpc/RpcClient.ts diff --git a/repos/effect/packages/effect/src/unstable/rpc/RpcClientError.ts b/packages/effect/src/unstable/rpc/RpcClientError.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/rpc/RpcClientError.ts rename to packages/effect/src/unstable/rpc/RpcClientError.ts diff --git a/repos/effect/packages/effect/src/unstable/rpc/RpcGroup.ts b/packages/effect/src/unstable/rpc/RpcGroup.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/rpc/RpcGroup.ts rename to packages/effect/src/unstable/rpc/RpcGroup.ts diff --git a/repos/effect/packages/effect/src/unstable/rpc/RpcMessage.ts b/packages/effect/src/unstable/rpc/RpcMessage.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/rpc/RpcMessage.ts rename to packages/effect/src/unstable/rpc/RpcMessage.ts diff --git a/repos/effect/packages/effect/src/unstable/rpc/RpcMiddleware.ts b/packages/effect/src/unstable/rpc/RpcMiddleware.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/rpc/RpcMiddleware.ts rename to packages/effect/src/unstable/rpc/RpcMiddleware.ts diff --git a/repos/effect/packages/effect/src/unstable/rpc/RpcSchema.ts b/packages/effect/src/unstable/rpc/RpcSchema.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/rpc/RpcSchema.ts rename to packages/effect/src/unstable/rpc/RpcSchema.ts diff --git a/repos/effect/packages/effect/src/unstable/rpc/RpcSerialization.ts b/packages/effect/src/unstable/rpc/RpcSerialization.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/rpc/RpcSerialization.ts rename to packages/effect/src/unstable/rpc/RpcSerialization.ts diff --git a/repos/effect/packages/effect/src/unstable/rpc/RpcServer.ts b/packages/effect/src/unstable/rpc/RpcServer.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/rpc/RpcServer.ts rename to packages/effect/src/unstable/rpc/RpcServer.ts diff --git a/repos/effect/packages/effect/src/unstable/rpc/RpcTest.ts b/packages/effect/src/unstable/rpc/RpcTest.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/rpc/RpcTest.ts rename to packages/effect/src/unstable/rpc/RpcTest.ts diff --git a/repos/effect/packages/effect/src/unstable/rpc/RpcWorker.ts b/packages/effect/src/unstable/rpc/RpcWorker.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/rpc/RpcWorker.ts rename to packages/effect/src/unstable/rpc/RpcWorker.ts diff --git a/repos/effect/packages/effect/src/unstable/rpc/Utils.ts b/packages/effect/src/unstable/rpc/Utils.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/rpc/Utils.ts rename to packages/effect/src/unstable/rpc/Utils.ts diff --git a/repos/effect/packages/effect/src/unstable/rpc/index.ts b/packages/effect/src/unstable/rpc/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/rpc/index.ts rename to packages/effect/src/unstable/rpc/index.ts diff --git a/repos/effect/packages/effect/src/unstable/schema/Model.ts b/packages/effect/src/unstable/schema/Model.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/schema/Model.ts rename to packages/effect/src/unstable/schema/Model.ts diff --git a/repos/effect/packages/effect/src/unstable/schema/VariantSchema.ts b/packages/effect/src/unstable/schema/VariantSchema.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/schema/VariantSchema.ts rename to packages/effect/src/unstable/schema/VariantSchema.ts diff --git a/repos/effect/packages/effect/src/unstable/schema/index.ts b/packages/effect/src/unstable/schema/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/schema/index.ts rename to packages/effect/src/unstable/schema/index.ts diff --git a/repos/effect/packages/effect/src/unstable/socket/Socket.ts b/packages/effect/src/unstable/socket/Socket.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/socket/Socket.ts rename to packages/effect/src/unstable/socket/Socket.ts diff --git a/repos/effect/packages/effect/src/unstable/socket/SocketServer.ts b/packages/effect/src/unstable/socket/SocketServer.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/socket/SocketServer.ts rename to packages/effect/src/unstable/socket/SocketServer.ts diff --git a/repos/effect/packages/effect/src/unstable/socket/index.ts b/packages/effect/src/unstable/socket/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/socket/index.ts rename to packages/effect/src/unstable/socket/index.ts diff --git a/repos/effect/packages/effect/src/unstable/sql/Migrator.ts b/packages/effect/src/unstable/sql/Migrator.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/sql/Migrator.ts rename to packages/effect/src/unstable/sql/Migrator.ts diff --git a/repos/effect/packages/effect/src/unstable/sql/SqlClient.ts b/packages/effect/src/unstable/sql/SqlClient.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/sql/SqlClient.ts rename to packages/effect/src/unstable/sql/SqlClient.ts diff --git a/repos/effect/packages/effect/src/unstable/sql/SqlConnection.ts b/packages/effect/src/unstable/sql/SqlConnection.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/sql/SqlConnection.ts rename to packages/effect/src/unstable/sql/SqlConnection.ts diff --git a/repos/effect/packages/effect/src/unstable/sql/SqlError.ts b/packages/effect/src/unstable/sql/SqlError.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/sql/SqlError.ts rename to packages/effect/src/unstable/sql/SqlError.ts diff --git a/repos/effect/packages/effect/src/unstable/sql/SqlModel.ts b/packages/effect/src/unstable/sql/SqlModel.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/sql/SqlModel.ts rename to packages/effect/src/unstable/sql/SqlModel.ts diff --git a/repos/effect/packages/effect/src/unstable/sql/SqlResolver.ts b/packages/effect/src/unstable/sql/SqlResolver.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/sql/SqlResolver.ts rename to packages/effect/src/unstable/sql/SqlResolver.ts diff --git a/repos/effect/packages/effect/src/unstable/sql/SqlSchema.ts b/packages/effect/src/unstable/sql/SqlSchema.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/sql/SqlSchema.ts rename to packages/effect/src/unstable/sql/SqlSchema.ts diff --git a/repos/effect/packages/effect/src/unstable/sql/SqlStream.ts b/packages/effect/src/unstable/sql/SqlStream.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/sql/SqlStream.ts rename to packages/effect/src/unstable/sql/SqlStream.ts diff --git a/repos/effect/packages/effect/src/unstable/sql/Statement.ts b/packages/effect/src/unstable/sql/Statement.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/sql/Statement.ts rename to packages/effect/src/unstable/sql/Statement.ts diff --git a/repos/effect/packages/effect/src/unstable/sql/index.ts b/packages/effect/src/unstable/sql/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/sql/index.ts rename to packages/effect/src/unstable/sql/index.ts diff --git a/repos/effect/packages/effect/src/unstable/workers/Transferable.ts b/packages/effect/src/unstable/workers/Transferable.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/workers/Transferable.ts rename to packages/effect/src/unstable/workers/Transferable.ts diff --git a/repos/effect/packages/effect/src/unstable/workers/Worker.ts b/packages/effect/src/unstable/workers/Worker.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/workers/Worker.ts rename to packages/effect/src/unstable/workers/Worker.ts diff --git a/repos/effect/packages/effect/src/unstable/workers/WorkerError.ts b/packages/effect/src/unstable/workers/WorkerError.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/workers/WorkerError.ts rename to packages/effect/src/unstable/workers/WorkerError.ts diff --git a/repos/effect/packages/effect/src/unstable/workers/WorkerRunner.ts b/packages/effect/src/unstable/workers/WorkerRunner.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/workers/WorkerRunner.ts rename to packages/effect/src/unstable/workers/WorkerRunner.ts diff --git a/repos/effect/packages/effect/src/unstable/workers/index.ts b/packages/effect/src/unstable/workers/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/workers/index.ts rename to packages/effect/src/unstable/workers/index.ts diff --git a/repos/effect/packages/effect/src/unstable/workflow/Activity.ts b/packages/effect/src/unstable/workflow/Activity.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/workflow/Activity.ts rename to packages/effect/src/unstable/workflow/Activity.ts diff --git a/repos/effect/packages/effect/src/unstable/workflow/DurableClock.ts b/packages/effect/src/unstable/workflow/DurableClock.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/workflow/DurableClock.ts rename to packages/effect/src/unstable/workflow/DurableClock.ts diff --git a/repos/effect/packages/effect/src/unstable/workflow/DurableDeferred.ts b/packages/effect/src/unstable/workflow/DurableDeferred.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/workflow/DurableDeferred.ts rename to packages/effect/src/unstable/workflow/DurableDeferred.ts diff --git a/repos/effect/packages/effect/src/unstable/workflow/DurableQueue.ts b/packages/effect/src/unstable/workflow/DurableQueue.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/workflow/DurableQueue.ts rename to packages/effect/src/unstable/workflow/DurableQueue.ts diff --git a/repos/effect/packages/effect/src/unstable/workflow/Workflow.ts b/packages/effect/src/unstable/workflow/Workflow.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/workflow/Workflow.ts rename to packages/effect/src/unstable/workflow/Workflow.ts diff --git a/repos/effect/packages/effect/src/unstable/workflow/WorkflowEngine.ts b/packages/effect/src/unstable/workflow/WorkflowEngine.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/workflow/WorkflowEngine.ts rename to packages/effect/src/unstable/workflow/WorkflowEngine.ts diff --git a/repos/effect/packages/effect/src/unstable/workflow/WorkflowProxy.ts b/packages/effect/src/unstable/workflow/WorkflowProxy.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/workflow/WorkflowProxy.ts rename to packages/effect/src/unstable/workflow/WorkflowProxy.ts diff --git a/repos/effect/packages/effect/src/unstable/workflow/WorkflowProxyServer.ts b/packages/effect/src/unstable/workflow/WorkflowProxyServer.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/workflow/WorkflowProxyServer.ts rename to packages/effect/src/unstable/workflow/WorkflowProxyServer.ts diff --git a/repos/effect/packages/effect/src/unstable/workflow/index.ts b/packages/effect/src/unstable/workflow/index.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/workflow/index.ts rename to packages/effect/src/unstable/workflow/index.ts diff --git a/repos/effect/packages/effect/src/unstable/workflow/internal/crypto.ts b/packages/effect/src/unstable/workflow/internal/crypto.ts similarity index 100% rename from repos/effect/packages/effect/src/unstable/workflow/internal/crypto.ts rename to packages/effect/src/unstable/workflow/internal/crypto.ts diff --git a/repos/effect/packages/effect/test/Array.test.ts b/packages/effect/test/Array.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Array.test.ts rename to packages/effect/test/Array.test.ts diff --git a/repos/effect/packages/effect/test/ArrayNaNIndex.test.ts b/packages/effect/test/ArrayNaNIndex.test.ts similarity index 100% rename from repos/effect/packages/effect/test/ArrayNaNIndex.test.ts rename to packages/effect/test/ArrayNaNIndex.test.ts diff --git a/repos/effect/packages/effect/test/AtomRef.test.ts b/packages/effect/test/AtomRef.test.ts similarity index 100% rename from repos/effect/packages/effect/test/AtomRef.test.ts rename to packages/effect/test/AtomRef.test.ts diff --git a/repos/effect/packages/effect/test/BigDecimal.test.ts b/packages/effect/test/BigDecimal.test.ts similarity index 100% rename from repos/effect/packages/effect/test/BigDecimal.test.ts rename to packages/effect/test/BigDecimal.test.ts diff --git a/repos/effect/packages/effect/test/BigInt.test.ts b/packages/effect/test/BigInt.test.ts similarity index 100% rename from repos/effect/packages/effect/test/BigInt.test.ts rename to packages/effect/test/BigInt.test.ts diff --git a/repos/effect/packages/effect/test/Boolean.test.ts b/packages/effect/test/Boolean.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Boolean.test.ts rename to packages/effect/test/Boolean.test.ts diff --git a/repos/effect/packages/effect/test/Brand.test.ts b/packages/effect/test/Brand.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Brand.test.ts rename to packages/effect/test/Brand.test.ts diff --git a/repos/effect/packages/effect/test/ByteSize.test.ts b/packages/effect/test/ByteSize.test.ts similarity index 100% rename from repos/effect/packages/effect/test/ByteSize.test.ts rename to packages/effect/test/ByteSize.test.ts diff --git a/repos/effect/packages/effect/test/Cache.test.ts b/packages/effect/test/Cache.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Cache.test.ts rename to packages/effect/test/Cache.test.ts diff --git a/repos/effect/packages/effect/test/Cause.test.ts b/packages/effect/test/Cause.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Cause.test.ts rename to packages/effect/test/Cause.test.ts diff --git a/repos/effect/packages/effect/test/CauseMapAnnotations.test.ts b/packages/effect/test/CauseMapAnnotations.test.ts similarity index 100% rename from repos/effect/packages/effect/test/CauseMapAnnotations.test.ts rename to packages/effect/test/CauseMapAnnotations.test.ts diff --git a/repos/effect/packages/effect/test/Channel.test.ts b/packages/effect/test/Channel.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Channel.test.ts rename to packages/effect/test/Channel.test.ts diff --git a/repos/effect/packages/effect/test/Chunk.test.ts b/packages/effect/test/Chunk.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Chunk.test.ts rename to packages/effect/test/Chunk.test.ts diff --git a/repos/effect/packages/effect/test/Clock.test.ts b/packages/effect/test/Clock.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Clock.test.ts rename to packages/effect/test/Clock.test.ts diff --git a/repos/effect/packages/effect/test/Combiner.test.ts b/packages/effect/test/Combiner.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Combiner.test.ts rename to packages/effect/test/Combiner.test.ts diff --git a/repos/effect/packages/effect/test/Config.test.ts b/packages/effect/test/Config.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Config.test.ts rename to packages/effect/test/Config.test.ts diff --git a/repos/effect/packages/effect/test/ConfigProvider.test.ts b/packages/effect/test/ConfigProvider.test.ts similarity index 100% rename from repos/effect/packages/effect/test/ConfigProvider.test.ts rename to packages/effect/test/ConfigProvider.test.ts diff --git a/repos/effect/packages/effect/test/Context.test.ts b/packages/effect/test/Context.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Context.test.ts rename to packages/effect/test/Context.test.ts diff --git a/repos/effect/packages/effect/test/Cron.test.ts b/packages/effect/test/Cron.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Cron.test.ts rename to packages/effect/test/Cron.test.ts diff --git a/repos/effect/packages/effect/test/Crypto.test.ts b/packages/effect/test/Crypto.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Crypto.test.ts rename to packages/effect/test/Crypto.test.ts diff --git a/repos/effect/packages/effect/test/Data.test.ts b/packages/effect/test/Data.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Data.test.ts rename to packages/effect/test/Data.test.ts diff --git a/repos/effect/packages/effect/test/DateTime.test.ts b/packages/effect/test/DateTime.test.ts similarity index 100% rename from repos/effect/packages/effect/test/DateTime.test.ts rename to packages/effect/test/DateTime.test.ts diff --git a/repos/effect/packages/effect/test/Deferred.test.ts b/packages/effect/test/Deferred.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Deferred.test.ts rename to packages/effect/test/Deferred.test.ts diff --git a/repos/effect/packages/effect/test/Duration.test.ts b/packages/effect/test/Duration.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Duration.test.ts rename to packages/effect/test/Duration.test.ts diff --git a/repos/effect/packages/effect/test/Effect.test.ts b/packages/effect/test/Effect.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Effect.test.ts rename to packages/effect/test/Effect.test.ts diff --git a/repos/effect/packages/effect/test/EffectEager.test.ts b/packages/effect/test/EffectEager.test.ts similarity index 100% rename from repos/effect/packages/effect/test/EffectEager.test.ts rename to packages/effect/test/EffectEager.test.ts diff --git a/repos/effect/packages/effect/test/EffectKeepAlive.test.ts b/packages/effect/test/EffectKeepAlive.test.ts similarity index 100% rename from repos/effect/packages/effect/test/EffectKeepAlive.test.ts rename to packages/effect/test/EffectKeepAlive.test.ts diff --git a/repos/effect/packages/effect/test/Effectable.test.ts b/packages/effect/test/Effectable.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Effectable.test.ts rename to packages/effect/test/Effectable.test.ts diff --git a/repos/effect/packages/effect/test/Encoding.test.ts b/packages/effect/test/Encoding.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Encoding.test.ts rename to packages/effect/test/Encoding.test.ts diff --git a/repos/effect/packages/effect/test/Equal.test.ts b/packages/effect/test/Equal.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Equal.test.ts rename to packages/effect/test/Equal.test.ts diff --git a/repos/effect/packages/effect/test/Equivalence.test.ts b/packages/effect/test/Equivalence.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Equivalence.test.ts rename to packages/effect/test/Equivalence.test.ts diff --git a/repos/effect/packages/effect/test/ExecutionPlan.test.ts b/packages/effect/test/ExecutionPlan.test.ts similarity index 100% rename from repos/effect/packages/effect/test/ExecutionPlan.test.ts rename to packages/effect/test/ExecutionPlan.test.ts diff --git a/repos/effect/packages/effect/test/Exit.test.ts b/packages/effect/test/Exit.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Exit.test.ts rename to packages/effect/test/Exit.test.ts diff --git a/repos/effect/packages/effect/test/Fiber.test.ts b/packages/effect/test/Fiber.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Fiber.test.ts rename to packages/effect/test/Fiber.test.ts diff --git a/repos/effect/packages/effect/test/FiberHandle.test.ts b/packages/effect/test/FiberHandle.test.ts similarity index 100% rename from repos/effect/packages/effect/test/FiberHandle.test.ts rename to packages/effect/test/FiberHandle.test.ts diff --git a/repos/effect/packages/effect/test/FiberMap.test.ts b/packages/effect/test/FiberMap.test.ts similarity index 100% rename from repos/effect/packages/effect/test/FiberMap.test.ts rename to packages/effect/test/FiberMap.test.ts diff --git a/repos/effect/packages/effect/test/FiberSet.test.ts b/packages/effect/test/FiberSet.test.ts similarity index 100% rename from repos/effect/packages/effect/test/FiberSet.test.ts rename to packages/effect/test/FiberSet.test.ts diff --git a/repos/effect/packages/effect/test/FiberSetRuntimePropagation.test.ts b/packages/effect/test/FiberSetRuntimePropagation.test.ts similarity index 100% rename from repos/effect/packages/effect/test/FiberSetRuntimePropagation.test.ts rename to packages/effect/test/FiberSetRuntimePropagation.test.ts diff --git a/repos/effect/packages/effect/test/FileSystem.test-utils.ts b/packages/effect/test/FileSystem.test-utils.ts similarity index 100% rename from repos/effect/packages/effect/test/FileSystem.test-utils.ts rename to packages/effect/test/FileSystem.test-utils.ts diff --git a/repos/effect/packages/effect/test/Formatter.test.ts b/packages/effect/test/Formatter.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Formatter.test.ts rename to packages/effect/test/Formatter.test.ts diff --git a/repos/effect/packages/effect/test/Function.test.ts b/packages/effect/test/Function.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Function.test.ts rename to packages/effect/test/Function.test.ts diff --git a/repos/effect/packages/effect/test/Graph.test.ts b/packages/effect/test/Graph.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Graph.test.ts rename to packages/effect/test/Graph.test.ts diff --git a/repos/effect/packages/effect/test/HashMap.test.ts b/packages/effect/test/HashMap.test.ts similarity index 100% rename from repos/effect/packages/effect/test/HashMap.test.ts rename to packages/effect/test/HashMap.test.ts diff --git a/repos/effect/packages/effect/test/HashRing.test.ts b/packages/effect/test/HashRing.test.ts similarity index 100% rename from repos/effect/packages/effect/test/HashRing.test.ts rename to packages/effect/test/HashRing.test.ts diff --git a/repos/effect/packages/effect/test/HashSet.test.ts b/packages/effect/test/HashSet.test.ts similarity index 100% rename from repos/effect/packages/effect/test/HashSet.test.ts rename to packages/effect/test/HashSet.test.ts diff --git a/repos/effect/packages/effect/test/HttpClient.test.ts b/packages/effect/test/HttpClient.test.ts similarity index 100% rename from repos/effect/packages/effect/test/HttpClient.test.ts rename to packages/effect/test/HttpClient.test.ts diff --git a/repos/effect/packages/effect/test/Iterable.test.ts b/packages/effect/test/Iterable.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Iterable.test.ts rename to packages/effect/test/Iterable.test.ts diff --git a/repos/effect/packages/effect/test/JsonPatch.test.ts b/packages/effect/test/JsonPatch.test.ts similarity index 100% rename from repos/effect/packages/effect/test/JsonPatch.test.ts rename to packages/effect/test/JsonPatch.test.ts diff --git a/repos/effect/packages/effect/test/JsonPointer.test.ts b/packages/effect/test/JsonPointer.test.ts similarity index 100% rename from repos/effect/packages/effect/test/JsonPointer.test.ts rename to packages/effect/test/JsonPointer.test.ts diff --git a/repos/effect/packages/effect/test/JsonSchema.test.ts b/packages/effect/test/JsonSchema.test.ts similarity index 100% rename from repos/effect/packages/effect/test/JsonSchema.test.ts rename to packages/effect/test/JsonSchema.test.ts diff --git a/repos/effect/packages/effect/test/Latch.test.ts b/packages/effect/test/Latch.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Latch.test.ts rename to packages/effect/test/Latch.test.ts diff --git a/repos/effect/packages/effect/test/Layer.test.ts b/packages/effect/test/Layer.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Layer.test.ts rename to packages/effect/test/Layer.test.ts diff --git a/repos/effect/packages/effect/test/LayerMap.test.ts b/packages/effect/test/LayerMap.test.ts similarity index 100% rename from repos/effect/packages/effect/test/LayerMap.test.ts rename to packages/effect/test/LayerMap.test.ts diff --git a/repos/effect/packages/effect/test/LayerRef.test.ts b/packages/effect/test/LayerRef.test.ts similarity index 100% rename from repos/effect/packages/effect/test/LayerRef.test.ts rename to packages/effect/test/LayerRef.test.ts diff --git a/repos/effect/packages/effect/test/LogLevel.test.ts b/packages/effect/test/LogLevel.test.ts similarity index 100% rename from repos/effect/packages/effect/test/LogLevel.test.ts rename to packages/effect/test/LogLevel.test.ts diff --git a/repos/effect/packages/effect/test/Logger.test.ts b/packages/effect/test/Logger.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Logger.test.ts rename to packages/effect/test/Logger.test.ts diff --git a/repos/effect/packages/effect/test/ManagedRuntime.test.ts b/packages/effect/test/ManagedRuntime.test.ts similarity index 100% rename from repos/effect/packages/effect/test/ManagedRuntime.test.ts rename to packages/effect/test/ManagedRuntime.test.ts diff --git a/repos/effect/packages/effect/test/Match.test.ts b/packages/effect/test/Match.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Match.test.ts rename to packages/effect/test/Match.test.ts diff --git a/repos/effect/packages/effect/test/Metric.test.ts b/packages/effect/test/Metric.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Metric.test.ts rename to packages/effect/test/Metric.test.ts diff --git a/repos/effect/packages/effect/test/Migrator.test.ts b/packages/effect/test/Migrator.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Migrator.test.ts rename to packages/effect/test/Migrator.test.ts diff --git a/repos/effect/packages/effect/test/MutableHashMap.test.ts b/packages/effect/test/MutableHashMap.test.ts similarity index 100% rename from repos/effect/packages/effect/test/MutableHashMap.test.ts rename to packages/effect/test/MutableHashMap.test.ts diff --git a/repos/effect/packages/effect/test/MutableHashSet.test.ts b/packages/effect/test/MutableHashSet.test.ts similarity index 100% rename from repos/effect/packages/effect/test/MutableHashSet.test.ts rename to packages/effect/test/MutableHashSet.test.ts diff --git a/repos/effect/packages/effect/test/MutableList.test.ts b/packages/effect/test/MutableList.test.ts similarity index 100% rename from repos/effect/packages/effect/test/MutableList.test.ts rename to packages/effect/test/MutableList.test.ts diff --git a/repos/effect/packages/effect/test/Newtype.test.ts b/packages/effect/test/Newtype.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Newtype.test.ts rename to packages/effect/test/Newtype.test.ts diff --git a/repos/effect/packages/effect/test/Number.test.ts b/packages/effect/test/Number.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Number.test.ts rename to packages/effect/test/Number.test.ts diff --git a/repos/effect/packages/effect/test/Optic.test.ts b/packages/effect/test/Optic.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Optic.test.ts rename to packages/effect/test/Optic.test.ts diff --git a/repos/effect/packages/effect/test/Option.test.ts b/packages/effect/test/Option.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Option.test.ts rename to packages/effect/test/Option.test.ts diff --git a/repos/effect/packages/effect/test/Order.test.ts b/packages/effect/test/Order.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Order.test.ts rename to packages/effect/test/Order.test.ts diff --git a/repos/effect/packages/effect/test/Ordering.test.ts b/packages/effect/test/Ordering.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Ordering.test.ts rename to packages/effect/test/Ordering.test.ts diff --git a/repos/effect/packages/effect/test/PartitionedSemaphore.test.ts b/packages/effect/test/PartitionedSemaphore.test.ts similarity index 100% rename from repos/effect/packages/effect/test/PartitionedSemaphore.test.ts rename to packages/effect/test/PartitionedSemaphore.test.ts diff --git a/repos/effect/packages/effect/test/Pathfinding.test.ts b/packages/effect/test/Pathfinding.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Pathfinding.test.ts rename to packages/effect/test/Pathfinding.test.ts diff --git a/repos/effect/packages/effect/test/Pool.test.ts b/packages/effect/test/Pool.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Pool.test.ts rename to packages/effect/test/Pool.test.ts diff --git a/repos/effect/packages/effect/test/Predicate.test.ts b/packages/effect/test/Predicate.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Predicate.test.ts rename to packages/effect/test/Predicate.test.ts diff --git a/repos/effect/packages/effect/test/PubSub.test.ts b/packages/effect/test/PubSub.test.ts similarity index 100% rename from repos/effect/packages/effect/test/PubSub.test.ts rename to packages/effect/test/PubSub.test.ts diff --git a/repos/effect/packages/effect/test/Pull.test.ts b/packages/effect/test/Pull.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Pull.test.ts rename to packages/effect/test/Pull.test.ts diff --git a/repos/effect/packages/effect/test/Queue.test.ts b/packages/effect/test/Queue.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Queue.test.ts rename to packages/effect/test/Queue.test.ts diff --git a/repos/effect/packages/effect/test/Random.test.ts b/packages/effect/test/Random.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Random.test.ts rename to packages/effect/test/Random.test.ts diff --git a/repos/effect/packages/effect/test/RcMap.test.ts b/packages/effect/test/RcMap.test.ts similarity index 100% rename from repos/effect/packages/effect/test/RcMap.test.ts rename to packages/effect/test/RcMap.test.ts diff --git a/repos/effect/packages/effect/test/RcRef.test.ts b/packages/effect/test/RcRef.test.ts similarity index 100% rename from repos/effect/packages/effect/test/RcRef.test.ts rename to packages/effect/test/RcRef.test.ts diff --git a/repos/effect/packages/effect/test/Record.test.ts b/packages/effect/test/Record.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Record.test.ts rename to packages/effect/test/Record.test.ts diff --git a/repos/effect/packages/effect/test/Redacted.test.ts b/packages/effect/test/Redacted.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Redacted.test.ts rename to packages/effect/test/Redacted.test.ts diff --git a/repos/effect/packages/effect/test/Reducer.test.ts b/packages/effect/test/Reducer.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Reducer.test.ts rename to packages/effect/test/Reducer.test.ts diff --git a/repos/effect/packages/effect/test/Ref.test.ts b/packages/effect/test/Ref.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Ref.test.ts rename to packages/effect/test/Ref.test.ts diff --git a/repos/effect/packages/effect/test/Request.test.ts b/packages/effect/test/Request.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Request.test.ts rename to packages/effect/test/Request.test.ts diff --git a/repos/effect/packages/effect/test/Resource.test.ts b/packages/effect/test/Resource.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Resource.test.ts rename to packages/effect/test/Resource.test.ts diff --git a/repos/effect/packages/effect/test/Result.test.ts b/packages/effect/test/Result.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Result.test.ts rename to packages/effect/test/Result.test.ts diff --git a/repos/effect/packages/effect/test/Schedule.test.ts b/packages/effect/test/Schedule.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Schedule.test.ts rename to packages/effect/test/Schedule.test.ts diff --git a/repos/effect/packages/effect/test/Scheduler.test.ts b/packages/effect/test/Scheduler.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Scheduler.test.ts rename to packages/effect/test/Scheduler.test.ts diff --git a/repos/effect/packages/effect/test/Scope.test.ts b/packages/effect/test/Scope.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Scope.test.ts rename to packages/effect/test/Scope.test.ts diff --git a/repos/effect/packages/effect/test/ScopedCache.test.ts b/packages/effect/test/ScopedCache.test.ts similarity index 100% rename from repos/effect/packages/effect/test/ScopedCache.test.ts rename to packages/effect/test/ScopedCache.test.ts diff --git a/repos/effect/packages/effect/test/ScopedRef.test.ts b/packages/effect/test/ScopedRef.test.ts similarity index 100% rename from repos/effect/packages/effect/test/ScopedRef.test.ts rename to packages/effect/test/ScopedRef.test.ts diff --git a/repos/effect/packages/effect/test/Semaphore.test.ts b/packages/effect/test/Semaphore.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Semaphore.test.ts rename to packages/effect/test/Semaphore.test.ts diff --git a/repos/effect/packages/effect/test/Sink.test.ts b/packages/effect/test/Sink.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Sink.test.ts rename to packages/effect/test/Sink.test.ts diff --git a/repos/effect/packages/effect/test/StackCapture.test.ts b/packages/effect/test/StackCapture.test.ts similarity index 100% rename from repos/effect/packages/effect/test/StackCapture.test.ts rename to packages/effect/test/StackCapture.test.ts diff --git a/repos/effect/packages/effect/test/StackTraceLimit.test.ts b/packages/effect/test/StackTraceLimit.test.ts similarity index 100% rename from repos/effect/packages/effect/test/StackTraceLimit.test.ts rename to packages/effect/test/StackTraceLimit.test.ts diff --git a/repos/effect/packages/effect/test/Stdio.test.ts b/packages/effect/test/Stdio.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Stdio.test.ts rename to packages/effect/test/Stdio.test.ts diff --git a/repos/effect/packages/effect/test/Stream.test.ts b/packages/effect/test/Stream.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Stream.test.ts rename to packages/effect/test/Stream.test.ts diff --git a/repos/effect/packages/effect/test/String.test.ts b/packages/effect/test/String.test.ts similarity index 100% rename from repos/effect/packages/effect/test/String.test.ts rename to packages/effect/test/String.test.ts diff --git a/repos/effect/packages/effect/test/Struct.test.ts b/packages/effect/test/Struct.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Struct.test.ts rename to packages/effect/test/Struct.test.ts diff --git a/repos/effect/packages/effect/test/SubscriptionRef.test.ts b/packages/effect/test/SubscriptionRef.test.ts similarity index 100% rename from repos/effect/packages/effect/test/SubscriptionRef.test.ts rename to packages/effect/test/SubscriptionRef.test.ts diff --git a/repos/effect/packages/effect/test/Symbol.test.ts b/packages/effect/test/Symbol.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Symbol.test.ts rename to packages/effect/test/Symbol.test.ts diff --git a/repos/effect/packages/effect/test/SynchronizedRef.modifySomeEffect.test.ts b/packages/effect/test/SynchronizedRef.modifySomeEffect.test.ts similarity index 100% rename from repos/effect/packages/effect/test/SynchronizedRef.modifySomeEffect.test.ts rename to packages/effect/test/SynchronizedRef.modifySomeEffect.test.ts diff --git a/repos/effect/packages/effect/test/SynchronizedRef.test.ts b/packages/effect/test/SynchronizedRef.test.ts similarity index 100% rename from repos/effect/packages/effect/test/SynchronizedRef.test.ts rename to packages/effect/test/SynchronizedRef.test.ts diff --git a/repos/effect/packages/effect/test/TestClock.test.ts b/packages/effect/test/TestClock.test.ts similarity index 100% rename from repos/effect/packages/effect/test/TestClock.test.ts rename to packages/effect/test/TestClock.test.ts diff --git a/repos/effect/packages/effect/test/Tracer.test.ts b/packages/effect/test/Tracer.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Tracer.test.ts rename to packages/effect/test/Tracer.test.ts diff --git a/repos/effect/packages/effect/test/Trie.test.ts b/packages/effect/test/Trie.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Trie.test.ts rename to packages/effect/test/Trie.test.ts diff --git a/repos/effect/packages/effect/test/Tuple.test.ts b/packages/effect/test/Tuple.test.ts similarity index 100% rename from repos/effect/packages/effect/test/Tuple.test.ts rename to packages/effect/test/Tuple.test.ts diff --git a/repos/effect/packages/effect/test/TxChunk.test.ts b/packages/effect/test/TxChunk.test.ts similarity index 100% rename from repos/effect/packages/effect/test/TxChunk.test.ts rename to packages/effect/test/TxChunk.test.ts diff --git a/repos/effect/packages/effect/test/TxDeferred.test.ts b/packages/effect/test/TxDeferred.test.ts similarity index 100% rename from repos/effect/packages/effect/test/TxDeferred.test.ts rename to packages/effect/test/TxDeferred.test.ts diff --git a/repos/effect/packages/effect/test/TxHashMap.test.ts b/packages/effect/test/TxHashMap.test.ts similarity index 100% rename from repos/effect/packages/effect/test/TxHashMap.test.ts rename to packages/effect/test/TxHashMap.test.ts diff --git a/repos/effect/packages/effect/test/TxHashSet.test.ts b/packages/effect/test/TxHashSet.test.ts similarity index 100% rename from repos/effect/packages/effect/test/TxHashSet.test.ts rename to packages/effect/test/TxHashSet.test.ts diff --git a/repos/effect/packages/effect/test/TxPriorityQueue.test.ts b/packages/effect/test/TxPriorityQueue.test.ts similarity index 100% rename from repos/effect/packages/effect/test/TxPriorityQueue.test.ts rename to packages/effect/test/TxPriorityQueue.test.ts diff --git a/repos/effect/packages/effect/test/TxPubSub.test.ts b/packages/effect/test/TxPubSub.test.ts similarity index 100% rename from repos/effect/packages/effect/test/TxPubSub.test.ts rename to packages/effect/test/TxPubSub.test.ts diff --git a/repos/effect/packages/effect/test/TxQueue.test.ts b/packages/effect/test/TxQueue.test.ts similarity index 100% rename from repos/effect/packages/effect/test/TxQueue.test.ts rename to packages/effect/test/TxQueue.test.ts diff --git a/repos/effect/packages/effect/test/TxReentrantLock.test.ts b/packages/effect/test/TxReentrantLock.test.ts similarity index 100% rename from repos/effect/packages/effect/test/TxReentrantLock.test.ts rename to packages/effect/test/TxReentrantLock.test.ts diff --git a/repos/effect/packages/effect/test/TxSemaphore.test.ts b/packages/effect/test/TxSemaphore.test.ts similarity index 100% rename from repos/effect/packages/effect/test/TxSemaphore.test.ts rename to packages/effect/test/TxSemaphore.test.ts diff --git a/repos/effect/packages/effect/test/TxSubscriptionRef.test.ts b/packages/effect/test/TxSubscriptionRef.test.ts similarity index 100% rename from repos/effect/packages/effect/test/TxSubscriptionRef.test.ts rename to packages/effect/test/TxSubscriptionRef.test.ts diff --git a/repos/effect/packages/effect/test/UndefinedOr.test.ts b/packages/effect/test/UndefinedOr.test.ts similarity index 100% rename from repos/effect/packages/effect/test/UndefinedOr.test.ts rename to packages/effect/test/UndefinedOr.test.ts diff --git a/repos/effect/packages/effect/test/cluster/ClusterWorkflowEngine.test.ts b/packages/effect/test/cluster/ClusterWorkflowEngine.test.ts similarity index 100% rename from repos/effect/packages/effect/test/cluster/ClusterWorkflowEngine.test.ts rename to packages/effect/test/cluster/ClusterWorkflowEngine.test.ts diff --git a/repos/effect/packages/effect/test/cluster/Entity.test.ts b/packages/effect/test/cluster/Entity.test.ts similarity index 100% rename from repos/effect/packages/effect/test/cluster/Entity.test.ts rename to packages/effect/test/cluster/Entity.test.ts diff --git a/repos/effect/packages/effect/test/cluster/Envelope.test.ts b/packages/effect/test/cluster/Envelope.test.ts similarity index 100% rename from repos/effect/packages/effect/test/cluster/Envelope.test.ts rename to packages/effect/test/cluster/Envelope.test.ts diff --git a/repos/effect/packages/effect/test/cluster/K8sHttpClient.test.ts b/packages/effect/test/cluster/K8sHttpClient.test.ts similarity index 100% rename from repos/effect/packages/effect/test/cluster/K8sHttpClient.test.ts rename to packages/effect/test/cluster/K8sHttpClient.test.ts diff --git a/repos/effect/packages/effect/test/cluster/MessageStorage.test.ts b/packages/effect/test/cluster/MessageStorage.test.ts similarity index 100% rename from repos/effect/packages/effect/test/cluster/MessageStorage.test.ts rename to packages/effect/test/cluster/MessageStorage.test.ts diff --git a/repos/effect/packages/effect/test/cluster/ResourceMap.test.ts b/packages/effect/test/cluster/ResourceMap.test.ts similarity index 100% rename from repos/effect/packages/effect/test/cluster/ResourceMap.test.ts rename to packages/effect/test/cluster/ResourceMap.test.ts diff --git a/repos/effect/packages/effect/test/cluster/ResourceRef.test.ts b/packages/effect/test/cluster/ResourceRef.test.ts similarity index 100% rename from repos/effect/packages/effect/test/cluster/ResourceRef.test.ts rename to packages/effect/test/cluster/ResourceRef.test.ts diff --git a/repos/effect/packages/effect/test/cluster/RunnerServer.test.ts b/packages/effect/test/cluster/RunnerServer.test.ts similarity index 100% rename from repos/effect/packages/effect/test/cluster/RunnerServer.test.ts rename to packages/effect/test/cluster/RunnerServer.test.ts diff --git a/repos/effect/packages/effect/test/cluster/RunnerStorage.test.ts b/packages/effect/test/cluster/RunnerStorage.test.ts similarity index 100% rename from repos/effect/packages/effect/test/cluster/RunnerStorage.test.ts rename to packages/effect/test/cluster/RunnerStorage.test.ts diff --git a/repos/effect/packages/effect/test/cluster/Runners.test.ts b/packages/effect/test/cluster/Runners.test.ts similarity index 100% rename from repos/effect/packages/effect/test/cluster/Runners.test.ts rename to packages/effect/test/cluster/Runners.test.ts diff --git a/repos/effect/packages/effect/test/cluster/Sharding.test.ts b/packages/effect/test/cluster/Sharding.test.ts similarity index 100% rename from repos/effect/packages/effect/test/cluster/Sharding.test.ts rename to packages/effect/test/cluster/Sharding.test.ts diff --git a/repos/effect/packages/effect/test/cluster/ShardingConfig.test.ts b/packages/effect/test/cluster/ShardingConfig.test.ts similarity index 100% rename from repos/effect/packages/effect/test/cluster/ShardingConfig.test.ts rename to packages/effect/test/cluster/ShardingConfig.test.ts diff --git a/repos/effect/packages/effect/test/cluster/TestEntity.ts b/packages/effect/test/cluster/TestEntity.ts similarity index 100% rename from repos/effect/packages/effect/test/cluster/TestEntity.ts rename to packages/effect/test/cluster/TestEntity.ts diff --git a/repos/effect/packages/effect/test/cluster/interruptors.test.ts b/packages/effect/test/cluster/interruptors.test.ts similarity index 100% rename from repos/effect/packages/effect/test/cluster/interruptors.test.ts rename to packages/effect/test/cluster/interruptors.test.ts diff --git a/repos/effect/packages/effect/test/fixtures/migrator/0001_first.js b/packages/effect/test/fixtures/migrator/0001_first.js similarity index 100% rename from repos/effect/packages/effect/test/fixtures/migrator/0001_first.js rename to packages/effect/test/fixtures/migrator/0001_first.js diff --git a/repos/effect/packages/effect/test/fixtures/text.txt b/packages/effect/test/fixtures/text.txt similarity index 100% rename from repos/effect/packages/effect/test/fixtures/text.txt rename to packages/effect/test/fixtures/text.txt diff --git a/repos/effect/packages/effect/test/internal/Uuid.test.ts b/packages/effect/test/internal/Uuid.test.ts similarity index 100% rename from repos/effect/packages/effect/test/internal/Uuid.test.ts rename to packages/effect/test/internal/Uuid.test.ts diff --git a/repos/effect/packages/effect/test/reactivity/AsyncResult.test.ts b/packages/effect/test/reactivity/AsyncResult.test.ts similarity index 100% rename from repos/effect/packages/effect/test/reactivity/AsyncResult.test.ts rename to packages/effect/test/reactivity/AsyncResult.test.ts diff --git a/repos/effect/packages/effect/test/reactivity/Atom.test.ts b/packages/effect/test/reactivity/Atom.test.ts similarity index 100% rename from repos/effect/packages/effect/test/reactivity/Atom.test.ts rename to packages/effect/test/reactivity/Atom.test.ts diff --git a/repos/effect/packages/effect/test/reactivity/AtomHttpApi.test.ts b/packages/effect/test/reactivity/AtomHttpApi.test.ts similarity index 100% rename from repos/effect/packages/effect/test/reactivity/AtomHttpApi.test.ts rename to packages/effect/test/reactivity/AtomHttpApi.test.ts diff --git a/repos/effect/packages/effect/test/reactivity/AtomRpc.test.ts b/packages/effect/test/reactivity/AtomRpc.test.ts similarity index 100% rename from repos/effect/packages/effect/test/reactivity/AtomRpc.test.ts rename to packages/effect/test/reactivity/AtomRpc.test.ts diff --git a/repos/effect/packages/effect/test/rpc/Rpc.test.ts b/packages/effect/test/rpc/Rpc.test.ts similarity index 100% rename from repos/effect/packages/effect/test/rpc/Rpc.test.ts rename to packages/effect/test/rpc/Rpc.test.ts diff --git a/repos/effect/packages/effect/test/rpc/RpcClient.test.ts b/packages/effect/test/rpc/RpcClient.test.ts similarity index 100% rename from repos/effect/packages/effect/test/rpc/RpcClient.test.ts rename to packages/effect/test/rpc/RpcClient.test.ts diff --git a/repos/effect/packages/effect/test/rpc/RpcSerialization.test.ts b/packages/effect/test/rpc/RpcSerialization.test.ts similarity index 100% rename from repos/effect/packages/effect/test/rpc/RpcSerialization.test.ts rename to packages/effect/test/rpc/RpcSerialization.test.ts diff --git a/repos/effect/packages/effect/test/rpc/RpcServer.test.ts b/packages/effect/test/rpc/RpcServer.test.ts similarity index 100% rename from repos/effect/packages/effect/test/rpc/RpcServer.test.ts rename to packages/effect/test/rpc/RpcServer.test.ts diff --git a/repos/effect/packages/effect/test/schema/Graph.test.ts b/packages/effect/test/schema/Graph.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/Graph.test.ts rename to packages/effect/test/schema/Graph.test.ts diff --git a/repos/effect/packages/effect/test/schema/HMR.test.ts b/packages/effect/test/schema/HMR.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/HMR.test.ts rename to packages/effect/test/schema/HMR.test.ts diff --git a/repos/effect/packages/effect/test/schema/Schema.test.ts b/packages/effect/test/schema/Schema.test.ts similarity index 99% rename from repos/effect/packages/effect/test/schema/Schema.test.ts rename to packages/effect/test/schema/Schema.test.ts index 60168097d..0dce68d6a 100644 --- a/repos/effect/packages/effect/test/schema/Schema.test.ts +++ b/packages/effect/test/schema/Schema.test.ts @@ -595,6 +595,20 @@ Missing key ) }) + it("should throw an error if a large struct has duplicate property signatures", () => { + throws( + () => + new SchemaAST.Objects( + Array.from( + { length: 32 }, + (_, index) => new SchemaAST.PropertySignature(`field${index === 31 ? 0 : index}`, Schema.String.ast) + ), + [] + ), + new Error(`Duplicate identifiers: ["field0"]. ts(2300)`) + ) + }) + describe("onExcessProperty", () => { it("error", async () => { const schema = Schema.Struct({ @@ -3507,6 +3521,19 @@ Expected a value between -2147483648 and 2147483647` strictEqual((rebuilt as any).length, 2) }) + it("assigns options", () => { + const schema = Schema.make(Schema.String.ast, { + custom: "value" + }) + + assertTrue(Schema.isSchema(schema)) + strictEqual((schema as any).custom, "value") + + const rebuilt = schema.annotate({}) + + strictEqual((rebuilt as any).custom, "value") + }) + it("should throw an error when the cause contains both a schema issue and a defect", () => { const cause = Cause.combine( Cause.fail(new SchemaIssue.InvalidValue({ message: "schema issue" })), diff --git a/repos/effect/packages/effect/test/schema/SchemaAST.test.ts b/packages/effect/test/schema/SchemaAST.test.ts similarity index 96% rename from repos/effect/packages/effect/test/schema/SchemaAST.test.ts rename to packages/effect/test/schema/SchemaAST.test.ts index f78600f1e..714aafb57 100644 --- a/repos/effect/packages/effect/test/schema/SchemaAST.test.ts +++ b/packages/effect/test/schema/SchemaAST.test.ts @@ -4,6 +4,21 @@ import { describe, it } from "vitest" import { deepStrictEqual, doesNotThrow, strictEqual, throws } from "../utils/assert.ts" describe("SchemaAST", () => { + describe("Suspend", () => { + it("memoizes the thunk", () => { + let calls = 0 + const ast = new SchemaAST.Suspend(() => { + calls++ + return SchemaAST.string + }) + + strictEqual(calls, 0) + strictEqual(ast.thunk(), SchemaAST.string) + strictEqual(ast.thunk(), SchemaAST.string) + strictEqual(calls, 1) + }) + }) + it("isJson", () => { strictEqual(SchemaAST.isJson(null), true) strictEqual(SchemaAST.isJson(undefined), false) @@ -704,6 +719,25 @@ describe("SchemaAST", () => { () => new SchemaAST.IndexSignature(StringFromBoolean.ast, Schema.Number.ast), new Error("Invalid index signature parameter String") ) + throws( + () => + new SchemaAST.IndexSignature( + Schema.Union([Schema.String, StringFromBoolean]).ast, + Schema.Number.ast + ), + new Error("Invalid index signature parameter Union") + ) + + const UnionFromBoolean = Schema.Boolean.pipe( + Schema.decodeTo(Schema.Union([Schema.String, Schema.Number]), { + decode: SchemaGetter.transform((b: boolean): string | number => b ? "true" : 0), + encode: SchemaGetter.transform((_value: string | number) => true) + }) + ) + throws( + () => new SchemaAST.IndexSignature(UnionFromBoolean.ast, Schema.Number.ast), + new Error("Invalid index signature parameter Union") + ) }) }) }) diff --git a/repos/effect/packages/effect/test/schema/SchemaGetter.test.ts b/packages/effect/test/schema/SchemaGetter.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/SchemaGetter.test.ts rename to packages/effect/test/schema/SchemaGetter.test.ts diff --git a/repos/effect/packages/effect/test/schema/SchemaIssue.test.ts b/packages/effect/test/schema/SchemaIssue.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/SchemaIssue.test.ts rename to packages/effect/test/schema/SchemaIssue.test.ts diff --git a/repos/effect/packages/effect/test/schema/SchemaParser.test.ts b/packages/effect/test/schema/SchemaParser.test.ts similarity index 97% rename from repos/effect/packages/effect/test/schema/SchemaParser.test.ts rename to packages/effect/test/schema/SchemaParser.test.ts index a19e051eb..f9f3e9f1c 100644 --- a/repos/effect/packages/effect/test/schema/SchemaParser.test.ts +++ b/packages/effect/test/schema/SchemaParser.test.ts @@ -9,6 +9,7 @@ import { Ref, Result, Schema, + type SchemaAST, SchemaGetter, SchemaIssue, SchemaParser, @@ -337,6 +338,32 @@ describe("SchemaParser", () => { })) }) + describe("makeEffect", () => { + it.effect("defers deriving the type AST until the maker is called and derives it once", () => + Effect.gen(function*() { + let encodingReads = 0 + const ast = new Proxy(Schema.String.ast, { + get(target, property, receiver) { + if (property === "encoding") { + encodingReads++ + } + return Reflect.get(target, property, receiver) + } + }) + const schema: { ast: SchemaAST.AST } = { ast } + const make = SchemaParser.makeEffect(schema as Schema.Codec) + schema.ast = Schema.Number.ast + + strictEqual(encodingReads, 0) + const effect = make("a") + assertTrue(encodingReads > 0) + strictEqual(yield* effect, "a") + const reads = encodingReads + strictEqual(yield* make("b"), "b") + strictEqual(encodingReads, reads) + })) + }) + const makeMixedCause = () => Cause.combine( Cause.fail(new SchemaIssue.InvalidValue({ message: "schema issue" })), diff --git a/repos/effect/packages/effect/test/schema/SchemaTransformation.test.ts b/packages/effect/test/schema/SchemaTransformation.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/SchemaTransformation.test.ts rename to packages/effect/test/schema/SchemaTransformation.test.ts diff --git a/repos/effect/packages/effect/test/schema/TemplateLiteral.test.ts b/packages/effect/test/schema/TemplateLiteral.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/TemplateLiteral.test.ts rename to packages/effect/test/schema/TemplateLiteral.test.ts diff --git a/repos/effect/packages/effect/test/schema/fixtures/HMR-Class.ts b/packages/effect/test/schema/fixtures/HMR-Class.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/fixtures/HMR-Class.ts rename to packages/effect/test/schema/fixtures/HMR-Class.ts diff --git a/repos/effect/packages/effect/test/schema/fixtures/HMR-sanity-check.ts b/packages/effect/test/schema/fixtures/HMR-sanity-check.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/fixtures/HMR-sanity-check.ts rename to packages/effect/test/schema/fixtures/HMR-sanity-check.ts diff --git a/repos/effect/packages/effect/test/schema/jsonSchemaRoundTrip.test.ts b/packages/effect/test/schema/jsonSchemaRoundTrip.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/jsonSchemaRoundTrip.test.ts rename to packages/effect/test/schema/jsonSchemaRoundTrip.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/builtInRevivers.test.ts b/packages/effect/test/schema/representation/builtInRevivers.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/builtInRevivers.test.ts rename to packages/effect/test/schema/representation/builtInRevivers.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/fromJson.test.ts b/packages/effect/test/schema/representation/fromJson.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/fromJson.test.ts rename to packages/effect/test/schema/representation/fromJson.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/fromJsonMultiDocument.test.ts b/packages/effect/test/schema/representation/fromJsonMultiDocument.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/fromJsonMultiDocument.test.ts rename to packages/effect/test/schema/representation/fromJsonMultiDocument.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/fromJsonSchemaDocument.test.ts b/packages/effect/test/schema/representation/fromJsonSchemaDocument.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/fromJsonSchemaDocument.test.ts rename to packages/effect/test/schema/representation/fromJsonSchemaDocument.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/fromJsonSchemaMultiDocument.test.ts b/packages/effect/test/schema/representation/fromJsonSchemaMultiDocument.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/fromJsonSchemaMultiDocument.test.ts rename to packages/effect/test/schema/representation/fromJsonSchemaMultiDocument.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/fromRepresentation.test.ts b/packages/effect/test/schema/representation/fromRepresentation.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/fromRepresentation.test.ts rename to packages/effect/test/schema/representation/fromRepresentation.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/fromRepresentations.test.ts b/packages/effect/test/schema/representation/fromRepresentations.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/fromRepresentations.test.ts rename to packages/effect/test/schema/representation/fromRepresentations.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/makeCode.test.ts b/packages/effect/test/schema/representation/makeCode.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/makeCode.test.ts rename to packages/effect/test/schema/representation/makeCode.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/schemaToJsonSchemaDocument.test.ts b/packages/effect/test/schema/representation/schemaToJsonSchemaDocument.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/schemaToJsonSchemaDocument.test.ts rename to packages/effect/test/schema/representation/schemaToJsonSchemaDocument.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/stringTreeRoundtrip.test.ts b/packages/effect/test/schema/representation/stringTreeRoundtrip.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/stringTreeRoundtrip.test.ts rename to packages/effect/test/schema/representation/stringTreeRoundtrip.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/toCodeDocument.annotations.test.ts b/packages/effect/test/schema/representation/toCodeDocument.annotations.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/toCodeDocument.annotations.test.ts rename to packages/effect/test/schema/representation/toCodeDocument.annotations.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/toCodeDocument.test.ts b/packages/effect/test/schema/representation/toCodeDocument.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/toCodeDocument.test.ts rename to packages/effect/test/schema/representation/toCodeDocument.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/toJson.test.ts b/packages/effect/test/schema/representation/toJson.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/toJson.test.ts rename to packages/effect/test/schema/representation/toJson.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/toJsonMultiDocument.test.ts b/packages/effect/test/schema/representation/toJsonMultiDocument.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/toJsonMultiDocument.test.ts rename to packages/effect/test/schema/representation/toJsonMultiDocument.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/toJsonSchemaDocument.test.ts b/packages/effect/test/schema/representation/toJsonSchemaDocument.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/toJsonSchemaDocument.test.ts rename to packages/effect/test/schema/representation/toJsonSchemaDocument.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/toJsonSchemaMultiDocument.test.ts b/packages/effect/test/schema/representation/toJsonSchemaMultiDocument.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/toJsonSchemaMultiDocument.test.ts rename to packages/effect/test/schema/representation/toJsonSchemaMultiDocument.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/toMultiDocument.test.ts b/packages/effect/test/schema/representation/toMultiDocument.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/toMultiDocument.test.ts rename to packages/effect/test/schema/representation/toMultiDocument.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/toRepresentation.test.ts b/packages/effect/test/schema/representation/toRepresentation.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/toRepresentation.test.ts rename to packages/effect/test/schema/representation/toRepresentation.test.ts diff --git a/repos/effect/packages/effect/test/schema/representation/toRepresentations.test.ts b/packages/effect/test/schema/representation/toRepresentations.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/representation/toRepresentations.test.ts rename to packages/effect/test/schema/representation/toRepresentations.test.ts diff --git a/repos/effect/packages/effect/test/schema/toCodec.test.ts b/packages/effect/test/schema/toCodec.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/toCodec.test.ts rename to packages/effect/test/schema/toCodec.test.ts diff --git a/repos/effect/packages/effect/test/schema/toDifferJsonPatch.test.ts b/packages/effect/test/schema/toDifferJsonPatch.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/toDifferJsonPatch.test.ts rename to packages/effect/test/schema/toDifferJsonPatch.test.ts diff --git a/repos/effect/packages/effect/test/schema/toEquivalence.test.ts b/packages/effect/test/schema/toEquivalence.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/toEquivalence.test.ts rename to packages/effect/test/schema/toEquivalence.test.ts diff --git a/repos/effect/packages/effect/test/schema/toFormatter.test.ts b/packages/effect/test/schema/toFormatter.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/toFormatter.test.ts rename to packages/effect/test/schema/toFormatter.test.ts diff --git a/repos/effect/packages/effect/test/schema/toIso.test.ts b/packages/effect/test/schema/toIso.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/toIso.test.ts rename to packages/effect/test/schema/toIso.test.ts diff --git a/repos/effect/packages/effect/test/schema/toJsonSchemaDocument.test.ts b/packages/effect/test/schema/toJsonSchemaDocument.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/toJsonSchemaDocument.test.ts rename to packages/effect/test/schema/toJsonSchemaDocument.test.ts diff --git a/repos/effect/packages/effect/test/schema/toStandardJSONSchemaV1.test.ts b/packages/effect/test/schema/toStandardJSONSchemaV1.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/toStandardJSONSchemaV1.test.ts rename to packages/effect/test/schema/toStandardJSONSchemaV1.test.ts diff --git a/repos/effect/packages/effect/test/schema/toStandardSchemaV1.test.ts b/packages/effect/test/schema/toStandardSchemaV1.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/toStandardSchemaV1.test.ts rename to packages/effect/test/schema/toStandardSchemaV1.test.ts diff --git a/repos/effect/packages/effect/test/schema/v3-v4.test.ts b/packages/effect/test/schema/v3-v4.test.ts similarity index 100% rename from repos/effect/packages/effect/test/schema/v3-v4.test.ts rename to packages/effect/test/schema/v3-v4.test.ts diff --git a/repos/effect/packages/effect/test/testing/TestSchema.test.ts b/packages/effect/test/testing/TestSchema.test.ts similarity index 100% rename from repos/effect/packages/effect/test/testing/TestSchema.test.ts rename to packages/effect/test/testing/TestSchema.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/AiError.test.ts b/packages/effect/test/unstable/ai/AiError.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/AiError.test.ts rename to packages/effect/test/unstable/ai/AiError.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/AnthropicStructuredOutput.test.ts b/packages/effect/test/unstable/ai/AnthropicStructuredOutput.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/AnthropicStructuredOutput.test.ts rename to packages/effect/test/unstable/ai/AnthropicStructuredOutput.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/AnthropicStructuredOutputRepresentation.test.ts b/packages/effect/test/unstable/ai/AnthropicStructuredOutputRepresentation.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/AnthropicStructuredOutputRepresentation.test.ts rename to packages/effect/test/unstable/ai/AnthropicStructuredOutputRepresentation.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/Chat.test.ts b/packages/effect/test/unstable/ai/Chat.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/Chat.test.ts rename to packages/effect/test/unstable/ai/Chat.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/EmbeddingModel.test.ts b/packages/effect/test/unstable/ai/EmbeddingModel.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/EmbeddingModel.test.ts rename to packages/effect/test/unstable/ai/EmbeddingModel.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/LanguageModel.test.ts b/packages/effect/test/unstable/ai/LanguageModel.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/LanguageModel.test.ts rename to packages/effect/test/unstable/ai/LanguageModel.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/LanguageModelRepresentation.test.ts b/packages/effect/test/unstable/ai/LanguageModelRepresentation.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/LanguageModelRepresentation.test.ts rename to packages/effect/test/unstable/ai/LanguageModelRepresentation.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/LanguageModelTrackerLifecycle.test.ts b/packages/effect/test/unstable/ai/LanguageModelTrackerLifecycle.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/LanguageModelTrackerLifecycle.test.ts rename to packages/effect/test/unstable/ai/LanguageModelTrackerLifecycle.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpSchema.test.ts b/packages/effect/test/unstable/ai/McpSchema.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpSchema.test.ts rename to packages/effect/test/unstable/ai/McpSchema.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/BaseProtocolTest.ts b/packages/effect/test/unstable/ai/McpServer/McpConformance/BaseProtocolTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/BaseProtocolTest.ts rename to packages/effect/test/unstable/ai/McpServer/McpConformance/BaseProtocolTest.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/CompletionTest.ts b/packages/effect/test/unstable/ai/McpServer/McpConformance/CompletionTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/CompletionTest.ts rename to packages/effect/test/unstable/ai/McpServer/McpConformance/CompletionTest.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/ElicitationTest.ts b/packages/effect/test/unstable/ai/McpServer/McpConformance/ElicitationTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/ElicitationTest.ts rename to packages/effect/test/unstable/ai/McpServer/McpConformance/ElicitationTest.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/LifecycleTest.ts b/packages/effect/test/unstable/ai/McpServer/McpConformance/LifecycleTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/LifecycleTest.ts rename to packages/effect/test/unstable/ai/McpServer/McpConformance/LifecycleTest.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/LoggingTest.ts b/packages/effect/test/unstable/ai/McpServer/McpConformance/LoggingTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/LoggingTest.ts rename to packages/effect/test/unstable/ai/McpServer/McpConformance/LoggingTest.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/McpConformance.ts b/packages/effect/test/unstable/ai/McpServer/McpConformance/McpConformance.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/McpConformance.ts rename to packages/effect/test/unstable/ai/McpServer/McpConformance/McpConformance.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/McpConformanceFixtures.ts b/packages/effect/test/unstable/ai/McpServer/McpConformance/McpConformanceFixtures.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/McpConformanceFixtures.ts rename to packages/effect/test/unstable/ai/McpServer/McpConformance/McpConformanceFixtures.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/McpTestPeer.ts b/packages/effect/test/unstable/ai/McpServer/McpConformance/McpTestPeer.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/McpTestPeer.ts rename to packages/effect/test/unstable/ai/McpServer/McpConformance/McpTestPeer.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/PromptsTest.ts b/packages/effect/test/unstable/ai/McpServer/McpConformance/PromptsTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/PromptsTest.ts rename to packages/effect/test/unstable/ai/McpServer/McpConformance/PromptsTest.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/ResourcesTest.ts b/packages/effect/test/unstable/ai/McpServer/McpConformance/ResourcesTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/ResourcesTest.ts rename to packages/effect/test/unstable/ai/McpServer/McpConformance/ResourcesTest.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/RootsTest.ts b/packages/effect/test/unstable/ai/McpServer/McpConformance/RootsTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/RootsTest.ts rename to packages/effect/test/unstable/ai/McpServer/McpConformance/RootsTest.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/SamplingTest.ts b/packages/effect/test/unstable/ai/McpServer/McpConformance/SamplingTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/SamplingTest.ts rename to packages/effect/test/unstable/ai/McpServer/McpConformance/SamplingTest.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/ToolsTest.ts b/packages/effect/test/unstable/ai/McpServer/McpConformance/ToolsTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/ToolsTest.ts rename to packages/effect/test/unstable/ai/McpServer/McpConformance/ToolsTest.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/TransportsTest.ts b/packages/effect/test/unstable/ai/McpServer/McpConformance/TransportsTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/TransportsTest.ts rename to packages/effect/test/unstable/ai/McpServer/McpConformance/TransportsTest.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/UtilitiesTest.ts b/packages/effect/test/unstable/ai/McpServer/McpConformance/UtilitiesTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpConformance/UtilitiesTest.ts rename to packages/effect/test/unstable/ai/McpServer/McpConformance/UtilitiesTest.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpProtocol.test.ts b/packages/effect/test/unstable/ai/McpServer/McpProtocol.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpProtocol.test.ts rename to packages/effect/test/unstable/ai/McpServer/McpProtocol.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/McpServer.test.ts b/packages/effect/test/unstable/ai/McpServer/McpServer.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/McpServer.test.ts rename to packages/effect/test/unstable/ai/McpServer/McpServer.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/ProtocolAdapters.test.ts b/packages/effect/test/unstable/ai/McpServer/ProtocolAdapters.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/ProtocolAdapters.test.ts rename to packages/effect/test/unstable/ai/McpServer/ProtocolAdapters.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/TestUtils/McpHttpHarness.ts b/packages/effect/test/unstable/ai/McpServer/TestUtils/McpHttpHarness.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/TestUtils/McpHttpHarness.ts rename to packages/effect/test/unstable/ai/McpServer/TestUtils/McpHttpHarness.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/TestUtils/McpServerLayer.ts b/packages/effect/test/unstable/ai/McpServer/TestUtils/McpServerLayer.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/TestUtils/McpServerLayer.ts rename to packages/effect/test/unstable/ai/McpServer/TestUtils/McpServerLayer.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/TestUtils/McpStdioHarness.ts b/packages/effect/test/unstable/ai/McpServer/TestUtils/McpStdioHarness.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/TestUtils/McpStdioHarness.ts rename to packages/effect/test/unstable/ai/McpServer/TestUtils/McpStdioHarness.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/v2024_11_05.test.ts b/packages/effect/test/unstable/ai/McpServer/v2024_11_05.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/v2024_11_05.test.ts rename to packages/effect/test/unstable/ai/McpServer/v2024_11_05.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/v2025_03_26.test.ts b/packages/effect/test/unstable/ai/McpServer/v2025_03_26.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/v2025_03_26.test.ts rename to packages/effect/test/unstable/ai/McpServer/v2025_03_26.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/v2025_06_18.test.ts b/packages/effect/test/unstable/ai/McpServer/v2025_06_18.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/v2025_06_18.test.ts rename to packages/effect/test/unstable/ai/McpServer/v2025_06_18.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/McpServer/v2025_11_25.test.ts b/packages/effect/test/unstable/ai/McpServer/v2025_11_25.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/McpServer/v2025_11_25.test.ts rename to packages/effect/test/unstable/ai/McpServer/v2025_11_25.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/Model.test.ts b/packages/effect/test/unstable/ai/Model.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/Model.test.ts rename to packages/effect/test/unstable/ai/Model.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/OpenAiStructuredOutput.test.ts b/packages/effect/test/unstable/ai/OpenAiStructuredOutput.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/OpenAiStructuredOutput.test.ts rename to packages/effect/test/unstable/ai/OpenAiStructuredOutput.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/OpenAiStructuredOutputRepresentation.test.ts b/packages/effect/test/unstable/ai/OpenAiStructuredOutputRepresentation.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/OpenAiStructuredOutputRepresentation.test.ts rename to packages/effect/test/unstable/ai/OpenAiStructuredOutputRepresentation.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/Prompt.test.ts b/packages/effect/test/unstable/ai/Prompt.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/Prompt.test.ts rename to packages/effect/test/unstable/ai/Prompt.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/Response.test.ts b/packages/effect/test/unstable/ai/Response.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/Response.test.ts rename to packages/effect/test/unstable/ai/Response.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/ResponseIdTracker.test.ts b/packages/effect/test/unstable/ai/ResponseIdTracker.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/ResponseIdTracker.test.ts rename to packages/effect/test/unstable/ai/ResponseIdTracker.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/Tokenizer.test.ts b/packages/effect/test/unstable/ai/Tokenizer.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/Tokenizer.test.ts rename to packages/effect/test/unstable/ai/Tokenizer.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/Tool.test.ts b/packages/effect/test/unstable/ai/Tool.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/Tool.test.ts rename to packages/effect/test/unstable/ai/Tool.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/ToolRepresentation.test.ts b/packages/effect/test/unstable/ai/ToolRepresentation.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/ToolRepresentation.test.ts rename to packages/effect/test/unstable/ai/ToolRepresentation.test.ts diff --git a/repos/effect/packages/effect/test/unstable/ai/utils.ts b/packages/effect/test/unstable/ai/utils.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/ai/utils.ts rename to packages/effect/test/unstable/ai/utils.ts diff --git a/repos/effect/packages/effect/test/unstable/arbitrary/Arbitrary.test.ts b/packages/effect/test/unstable/arbitrary/Arbitrary.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/arbitrary/Arbitrary.test.ts rename to packages/effect/test/unstable/arbitrary/Arbitrary.test.ts diff --git a/repos/effect/packages/effect/test/unstable/cli/Ansi.test.ts b/packages/effect/test/unstable/cli/Ansi.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/cli/Ansi.test.ts rename to packages/effect/test/unstable/cli/Ansi.test.ts diff --git a/repos/effect/packages/effect/test/unstable/cli/Arguments.test.ts b/packages/effect/test/unstable/cli/Arguments.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/cli/Arguments.test.ts rename to packages/effect/test/unstable/cli/Arguments.test.ts diff --git a/repos/effect/packages/effect/test/unstable/cli/Command.test.ts b/packages/effect/test/unstable/cli/Command.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/cli/Command.test.ts rename to packages/effect/test/unstable/cli/Command.test.ts diff --git a/repos/effect/packages/effect/test/unstable/cli/Errors.test.ts b/packages/effect/test/unstable/cli/Errors.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/cli/Errors.test.ts rename to packages/effect/test/unstable/cli/Errors.test.ts diff --git a/repos/effect/packages/effect/test/unstable/cli/Help.test.ts b/packages/effect/test/unstable/cli/Help.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/cli/Help.test.ts rename to packages/effect/test/unstable/cli/Help.test.ts diff --git a/repos/effect/packages/effect/test/unstable/cli/Lexer.test.ts b/packages/effect/test/unstable/cli/Lexer.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/cli/Lexer.test.ts rename to packages/effect/test/unstable/cli/Lexer.test.ts diff --git a/repos/effect/packages/effect/test/unstable/cli/LogLevel.test.ts b/packages/effect/test/unstable/cli/LogLevel.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/cli/LogLevel.test.ts rename to packages/effect/test/unstable/cli/LogLevel.test.ts diff --git a/repos/effect/packages/effect/test/unstable/cli/Param.test.ts b/packages/effect/test/unstable/cli/Param.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/cli/Param.test.ts rename to packages/effect/test/unstable/cli/Param.test.ts diff --git a/repos/effect/packages/effect/test/unstable/cli/Primitive.test.ts b/packages/effect/test/unstable/cli/Primitive.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/cli/Primitive.test.ts rename to packages/effect/test/unstable/cli/Primitive.test.ts diff --git a/repos/effect/packages/effect/test/unstable/cli/Prompt.test.ts b/packages/effect/test/unstable/cli/Prompt.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/cli/Prompt.test.ts rename to packages/effect/test/unstable/cli/Prompt.test.ts diff --git a/repos/effect/packages/effect/test/unstable/cli/completions/completions.test.ts b/packages/effect/test/unstable/cli/completions/completions.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/cli/completions/completions.test.ts rename to packages/effect/test/unstable/cli/completions/completions.test.ts diff --git a/repos/effect/packages/effect/test/unstable/cli/completions/descriptor.test.ts b/packages/effect/test/unstable/cli/completions/descriptor.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/cli/completions/descriptor.test.ts rename to packages/effect/test/unstable/cli/completions/descriptor.test.ts diff --git a/repos/effect/packages/effect/test/unstable/cli/fixtures/ComprehensiveCli.ts b/packages/effect/test/unstable/cli/fixtures/ComprehensiveCli.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/cli/fixtures/ComprehensiveCli.ts rename to packages/effect/test/unstable/cli/fixtures/ComprehensiveCli.ts diff --git a/repos/effect/packages/effect/test/unstable/cli/services/MockTerminal.ts b/packages/effect/test/unstable/cli/services/MockTerminal.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/cli/services/MockTerminal.ts rename to packages/effect/test/unstable/cli/services/MockTerminal.ts diff --git a/repos/effect/packages/effect/test/unstable/cli/services/TestActions.ts b/packages/effect/test/unstable/cli/services/TestActions.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/cli/services/TestActions.ts rename to packages/effect/test/unstable/cli/services/TestActions.ts diff --git a/repos/effect/packages/effect/test/unstable/devtools/DevToolsClient.test.ts b/packages/effect/test/unstable/devtools/DevToolsClient.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/devtools/DevToolsClient.test.ts rename to packages/effect/test/unstable/devtools/DevToolsClient.test.ts diff --git a/repos/effect/packages/effect/test/unstable/encoding/Ini.test.ts b/packages/effect/test/unstable/encoding/Ini.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/encoding/Ini.test.ts rename to packages/effect/test/unstable/encoding/Ini.test.ts diff --git a/repos/effect/packages/effect/test/unstable/encoding/Ndjson.test.ts b/packages/effect/test/unstable/encoding/Ndjson.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/encoding/Ndjson.test.ts rename to packages/effect/test/unstable/encoding/Ndjson.test.ts diff --git a/repos/effect/packages/effect/test/unstable/encoding/SchemaBinary.test.ts b/packages/effect/test/unstable/encoding/SchemaBinary.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/encoding/SchemaBinary.test.ts rename to packages/effect/test/unstable/encoding/SchemaBinary.test.ts diff --git a/repos/effect/packages/effect/test/unstable/encoding/Sse.test.ts b/packages/effect/test/unstable/encoding/Sse.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/encoding/Sse.test.ts rename to packages/effect/test/unstable/encoding/Sse.test.ts diff --git a/repos/effect/packages/effect/test/unstable/encoding/Toml.test.ts b/packages/effect/test/unstable/encoding/Toml.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/encoding/Toml.test.ts rename to packages/effect/test/unstable/encoding/Toml.test.ts diff --git a/repos/effect/packages/effect/test/unstable/encoding/Yaml.test.ts b/packages/effect/test/unstable/encoding/Yaml.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/encoding/Yaml.test.ts rename to packages/effect/test/unstable/encoding/Yaml.test.ts diff --git a/repos/effect/packages/effect/test/unstable/eventlog/EventJournal.test.ts b/packages/effect/test/unstable/eventlog/EventJournal.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/eventlog/EventJournal.test.ts rename to packages/effect/test/unstable/eventlog/EventJournal.test.ts diff --git a/repos/effect/packages/effect/test/unstable/eventlog/EventLog.test.ts b/packages/effect/test/unstable/eventlog/EventLog.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/eventlog/EventLog.test.ts rename to packages/effect/test/unstable/eventlog/EventLog.test.ts diff --git a/repos/effect/packages/effect/test/unstable/eventlog/EventLogIdentityDerivation.test.ts b/packages/effect/test/unstable/eventlog/EventLogIdentityDerivation.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/eventlog/EventLogIdentityDerivation.test.ts rename to packages/effect/test/unstable/eventlog/EventLogIdentityDerivation.test.ts diff --git a/repos/effect/packages/effect/test/unstable/eventlog/EventLogMessage.test.ts b/packages/effect/test/unstable/eventlog/EventLogMessage.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/eventlog/EventLogMessage.test.ts rename to packages/effect/test/unstable/eventlog/EventLogMessage.test.ts diff --git a/repos/effect/packages/effect/test/unstable/eventlog/EventLogRemote.test.ts b/packages/effect/test/unstable/eventlog/EventLogRemote.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/eventlog/EventLogRemote.test.ts rename to packages/effect/test/unstable/eventlog/EventLogRemote.test.ts diff --git a/repos/effect/packages/effect/test/unstable/eventlog/EventLogServerUnencrypted.test.ts b/packages/effect/test/unstable/eventlog/EventLogServerUnencrypted.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/eventlog/EventLogServerUnencrypted.test.ts rename to packages/effect/test/unstable/eventlog/EventLogServerUnencrypted.test.ts diff --git a/repos/effect/packages/effect/test/unstable/eventlog/EventLogSessionAuth.test.ts b/packages/effect/test/unstable/eventlog/EventLogSessionAuth.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/eventlog/EventLogSessionAuth.test.ts rename to packages/effect/test/unstable/eventlog/EventLogSessionAuth.test.ts diff --git a/repos/effect/packages/effect/test/unstable/eventlog/SqlEventLogServerUnencryptedStorageTest.ts b/packages/effect/test/unstable/eventlog/SqlEventLogServerUnencryptedStorageTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/eventlog/SqlEventLogServerUnencryptedStorageTest.ts rename to packages/effect/test/unstable/eventlog/SqlEventLogServerUnencryptedStorageTest.ts diff --git a/repos/effect/packages/effect/test/unstable/http/Cookies.test.ts b/packages/effect/test/unstable/http/Cookies.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/Cookies.test.ts rename to packages/effect/test/unstable/http/Cookies.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/FetchHttpClient.test.ts b/packages/effect/test/unstable/http/FetchHttpClient.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/FetchHttpClient.test.ts rename to packages/effect/test/unstable/http/FetchHttpClient.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/FindMyWay/case-insensitive.test.ts b/packages/effect/test/unstable/http/FindMyWay/case-insensitive.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/FindMyWay/case-insensitive.test.ts rename to packages/effect/test/unstable/http/FindMyWay/case-insensitive.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/FindMyWay/matching-order.test.ts b/packages/effect/test/unstable/http/FindMyWay/matching-order.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/FindMyWay/matching-order.test.ts rename to packages/effect/test/unstable/http/FindMyWay/matching-order.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/FindMyWay/methods.test.ts b/packages/effect/test/unstable/http/FindMyWay/methods.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/FindMyWay/methods.test.ts rename to packages/effect/test/unstable/http/FindMyWay/methods.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/FindMyWay/optional-params.test.ts b/packages/effect/test/unstable/http/FindMyWay/optional-params.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/FindMyWay/optional-params.test.ts rename to packages/effect/test/unstable/http/FindMyWay/optional-params.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/FindMyWay/params-collisions.test.ts b/packages/effect/test/unstable/http/FindMyWay/params-collisions.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/FindMyWay/params-collisions.test.ts rename to packages/effect/test/unstable/http/FindMyWay/params-collisions.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/FindMyWay/path-params-match.test.ts b/packages/effect/test/unstable/http/FindMyWay/path-params-match.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/FindMyWay/path-params-match.test.ts rename to packages/effect/test/unstable/http/FindMyWay/path-params-match.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/FindMyWay/querystring.test.ts b/packages/effect/test/unstable/http/FindMyWay/querystring.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/FindMyWay/querystring.test.ts rename to packages/effect/test/unstable/http/FindMyWay/querystring.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/FindMyWay/regex.test.ts b/packages/effect/test/unstable/http/FindMyWay/regex.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/FindMyWay/regex.test.ts rename to packages/effect/test/unstable/http/FindMyWay/regex.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/Headers.test.ts b/packages/effect/test/unstable/http/Headers.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/Headers.test.ts rename to packages/effect/test/unstable/http/Headers.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/HttpBody.test.ts b/packages/effect/test/unstable/http/HttpBody.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/HttpBody.test.ts rename to packages/effect/test/unstable/http/HttpBody.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/HttpClient.test.ts b/packages/effect/test/unstable/http/HttpClient.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/HttpClient.test.ts rename to packages/effect/test/unstable/http/HttpClient.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/HttpClientRequest.test.ts b/packages/effect/test/unstable/http/HttpClientRequest.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/HttpClientRequest.test.ts rename to packages/effect/test/unstable/http/HttpClientRequest.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/HttpCompression.test.ts b/packages/effect/test/unstable/http/HttpCompression.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/HttpCompression.test.ts rename to packages/effect/test/unstable/http/HttpCompression.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/HttpEffect.test.ts b/packages/effect/test/unstable/http/HttpEffect.test.ts similarity index 94% rename from repos/effect/packages/effect/test/unstable/http/HttpEffect.test.ts rename to packages/effect/test/unstable/http/HttpEffect.test.ts index f923bf930..6049c3836 100644 --- a/repos/effect/packages/effect/test/unstable/http/HttpEffect.test.ts +++ b/packages/effect/test/unstable/http/HttpEffect.test.ts @@ -151,6 +151,32 @@ describe("HttpEffect", () => { strictEqual(finalized, true) }) + test.each([204, 205, 304])("status %i closes the request scope without starting the stream", async (status) => { + let finalized = false + let streamStarted = false + const handler = HttpEffect.toWebHandler(Effect.gen(function*() { + yield* Effect.addFinalizer(() => + Effect.sync(() => { + finalized = true + }) + ) + return HttpServerResponse.stream( + Stream.fromEffect(Effect.sync(() => { + streamStarted = true + return new Uint8Array([1]) + })), + { status } + ) + })) + + const response = await handler(new Request("http://localhost:3000/")) + + strictEqual(response.status, status) + strictEqual(response.body, null) + strictEqual(streamStarted, false) + strictEqual(finalized, true) + }) + test("stream runtime", async () => { const handler = Effect.succeed(HttpServerResponse.stream( Stream.fromEffect(TestValue).pipe(Stream.map(String), Stream.encodeText) diff --git a/repos/effect/packages/effect/test/unstable/http/HttpMiddleware.test.ts b/packages/effect/test/unstable/http/HttpMiddleware.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/HttpMiddleware.test.ts rename to packages/effect/test/unstable/http/HttpMiddleware.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/HttpPlatform.test.ts b/packages/effect/test/unstable/http/HttpPlatform.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/HttpPlatform.test.ts rename to packages/effect/test/unstable/http/HttpPlatform.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/HttpRouter.test.ts b/packages/effect/test/unstable/http/HttpRouter.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/HttpRouter.test.ts rename to packages/effect/test/unstable/http/HttpRouter.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/HttpServer.test.ts b/packages/effect/test/unstable/http/HttpServer.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/HttpServer.test.ts rename to packages/effect/test/unstable/http/HttpServer.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/HttpServerError.test.ts b/packages/effect/test/unstable/http/HttpServerError.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/HttpServerError.test.ts rename to packages/effect/test/unstable/http/HttpServerError.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/HttpServerRequest.test.ts b/packages/effect/test/unstable/http/HttpServerRequest.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/HttpServerRequest.test.ts rename to packages/effect/test/unstable/http/HttpServerRequest.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/HttpServerRespondable.test.ts b/packages/effect/test/unstable/http/HttpServerRespondable.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/HttpServerRespondable.test.ts rename to packages/effect/test/unstable/http/HttpServerRespondable.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/HttpServerResponse.test.ts b/packages/effect/test/unstable/http/HttpServerResponse.test.ts similarity index 72% rename from repos/effect/packages/effect/test/unstable/http/HttpServerResponse.test.ts rename to packages/effect/test/unstable/http/HttpServerResponse.test.ts index db6263313..b44082cf5 100644 --- a/repos/effect/packages/effect/test/unstable/http/HttpServerResponse.test.ts +++ b/packages/effect/test/unstable/http/HttpServerResponse.test.ts @@ -5,6 +5,61 @@ import { HttpBody, HttpClientRequest, HttpClientResponse, HttpServerResponse } f const TestValue = Context.Reference("test/TestValue", { defaultValue: () => 0 }) describe("HttpServerResponse", () => { + describe("toWeb", () => { + it.each([ + { status: 200, withoutBody: true }, + { status: 304, withoutBody: false } + ])( + "preserves representation headers for status $status with withoutBody=$withoutBody", + ({ status, withoutBody }) => { + const web = HttpServerResponse.toWeb(HttpServerResponse.text("body", { status }), { withoutBody }) + + assert.strictEqual(web.body, null) + assert.strictEqual(web.headers.get("content-length"), "4") + assert.strictEqual(web.headers.get("content-type"), "text/plain") + } + ) + + it.each([ + { status: 200, withoutBody: true }, + { status: 204, withoutBody: false }, + { status: 205, withoutBody: false }, + { status: 304, withoutBody: false } + ])("cancels raw streams for status $status with withoutBody=$withoutBody", async ({ status, withoutBody }) => { + let cancelled = false + const body = new ReadableStream({ + cancel() { + cancelled = true + } + }) + try { + const web = HttpServerResponse.toWeb(HttpServerResponse.raw(body, { status }), { withoutBody }) + + assert.strictEqual(web.status, status) + assert.strictEqual(web.body, null) + assert.strictEqual(await web.text(), "") + assert.strictEqual(cancelled, true) + } finally { + await body.cancel() + } + }) + + for (const status of [204, 205, 304]) { + it.each([ + { name: "text", response: HttpServerResponse.text("body", { status }) }, + { name: "uint8Array", response: HttpServerResponse.uint8Array(new Uint8Array([1]), { status }) }, + { name: "raw", response: HttpServerResponse.raw("body", { status }) }, + { name: "formData", response: HttpServerResponse.formData(new FormData(), { status }) }, + { name: "stream", response: HttpServerResponse.stream(Stream.succeed(new Uint8Array([1])), { status }) } + ])(`omits $name bodies for status ${status}`, ({ response }) => { + const web = HttpServerResponse.toWeb(response) + + assert.strictEqual(web.status, status) + assert.strictEqual(web.body, null) + }) + } + }) + it("setHeader overrides body-derived content headers", () => { const response = HttpServerResponse.text("body").pipe( HttpServerResponse.setHeader("content-type", "text/custom"), diff --git a/repos/effect/packages/effect/test/unstable/http/HttpStaticServer.test.ts b/packages/effect/test/unstable/http/HttpStaticServer.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/HttpStaticServer.test.ts rename to packages/effect/test/unstable/http/HttpStaticServer.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/HttpStatus.test.ts b/packages/effect/test/unstable/http/HttpStatus.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/HttpStatus.test.ts rename to packages/effect/test/unstable/http/HttpStatus.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/Mime.test.ts b/packages/effect/test/unstable/http/Mime.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/Mime.test.ts rename to packages/effect/test/unstable/http/Mime.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/Multipart.test.ts b/packages/effect/test/unstable/http/Multipart.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/Multipart.test.ts rename to packages/effect/test/unstable/http/Multipart.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/SchemaRepresentation.test.ts b/packages/effect/test/unstable/http/SchemaRepresentation.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/SchemaRepresentation.test.ts rename to packages/effect/test/unstable/http/SchemaRepresentation.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/Template.test.ts b/packages/effect/test/unstable/http/Template.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/Template.test.ts rename to packages/effect/test/unstable/http/Template.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/Url.test.ts b/packages/effect/test/unstable/http/Url.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/Url.test.ts rename to packages/effect/test/unstable/http/Url.test.ts diff --git a/repos/effect/packages/effect/test/unstable/http/UrlParams.test.ts b/packages/effect/test/unstable/http/UrlParams.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/http/UrlParams.test.ts rename to packages/effect/test/unstable/http/UrlParams.test.ts diff --git a/repos/effect/packages/effect/test/unstable/httpapi/HttpApi.test.ts b/packages/effect/test/unstable/httpapi/HttpApi.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/httpapi/HttpApi.test.ts rename to packages/effect/test/unstable/httpapi/HttpApi.test.ts diff --git a/repos/effect/packages/effect/test/unstable/httpapi/HttpApiBuilder.test.ts b/packages/effect/test/unstable/httpapi/HttpApiBuilder.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/httpapi/HttpApiBuilder.test.ts rename to packages/effect/test/unstable/httpapi/HttpApiBuilder.test.ts diff --git a/repos/effect/packages/effect/test/unstable/httpapi/HttpApiClient.test.ts b/packages/effect/test/unstable/httpapi/HttpApiClient.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/httpapi/HttpApiClient.test.ts rename to packages/effect/test/unstable/httpapi/HttpApiClient.test.ts diff --git a/repos/effect/packages/effect/test/unstable/httpapi/HttpApiDocumentation.test.ts b/packages/effect/test/unstable/httpapi/HttpApiDocumentation.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/httpapi/HttpApiDocumentation.test.ts rename to packages/effect/test/unstable/httpapi/HttpApiDocumentation.test.ts diff --git a/repos/effect/packages/effect/test/unstable/httpapi/HttpApiEndpoint.test.ts b/packages/effect/test/unstable/httpapi/HttpApiEndpoint.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/httpapi/HttpApiEndpoint.test.ts rename to packages/effect/test/unstable/httpapi/HttpApiEndpoint.test.ts diff --git a/repos/effect/packages/effect/test/unstable/httpapi/HttpApiSchema.test.ts b/packages/effect/test/unstable/httpapi/HttpApiSchema.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/httpapi/HttpApiSchema.test.ts rename to packages/effect/test/unstable/httpapi/HttpApiSchema.test.ts diff --git a/repos/effect/packages/effect/test/unstable/httpapi/HttpApiSecurity.test.ts b/packages/effect/test/unstable/httpapi/HttpApiSecurity.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/httpapi/HttpApiSecurity.test.ts rename to packages/effect/test/unstable/httpapi/HttpApiSecurity.test.ts diff --git a/repos/effect/packages/effect/test/unstable/httpapi/OpenApi.test.ts b/packages/effect/test/unstable/httpapi/OpenApi.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/httpapi/OpenApi.test.ts rename to packages/effect/test/unstable/httpapi/OpenApi.test.ts diff --git a/repos/effect/packages/effect/test/unstable/httpapi/OpenApiRepresentation.test.ts b/packages/effect/test/unstable/httpapi/OpenApiRepresentation.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/httpapi/OpenApiRepresentation.test.ts rename to packages/effect/test/unstable/httpapi/OpenApiRepresentation.test.ts diff --git a/repos/effect/packages/effect/test/unstable/net/IpInterface.test.ts b/packages/effect/test/unstable/net/IpInterface.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/net/IpInterface.test.ts rename to packages/effect/test/unstable/net/IpInterface.test.ts diff --git a/repos/effect/packages/effect/test/unstable/net/IpNetwork.test.ts b/packages/effect/test/unstable/net/IpNetwork.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/net/IpNetwork.test.ts rename to packages/effect/test/unstable/net/IpNetwork.test.ts diff --git a/repos/effect/packages/effect/test/unstable/net/NetAddress.test.ts b/packages/effect/test/unstable/net/NetAddress.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/net/NetAddress.test.ts rename to packages/effect/test/unstable/net/NetAddress.test.ts diff --git a/repos/effect/packages/effect/test/unstable/observability/OtlpConfig.test.ts b/packages/effect/test/unstable/observability/OtlpConfig.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/observability/OtlpConfig.test.ts rename to packages/effect/test/unstable/observability/OtlpConfig.test.ts diff --git a/repos/effect/packages/effect/test/unstable/observability/OtlpEnvHeaders.test.ts b/packages/effect/test/unstable/observability/OtlpEnvHeaders.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/observability/OtlpEnvHeaders.test.ts rename to packages/effect/test/unstable/observability/OtlpEnvHeaders.test.ts diff --git a/repos/effect/packages/effect/test/unstable/observability/OtlpExporter.test.ts b/packages/effect/test/unstable/observability/OtlpExporter.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/observability/OtlpExporter.test.ts rename to packages/effect/test/unstable/observability/OtlpExporter.test.ts diff --git a/repos/effect/packages/effect/test/unstable/observability/OtlpMetrics.test.ts b/packages/effect/test/unstable/observability/OtlpMetrics.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/observability/OtlpMetrics.test.ts rename to packages/effect/test/unstable/observability/OtlpMetrics.test.ts diff --git a/repos/effect/packages/effect/test/unstable/observability/OtlpResource.test.ts b/packages/effect/test/unstable/observability/OtlpResource.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/observability/OtlpResource.test.ts rename to packages/effect/test/unstable/observability/OtlpResource.test.ts diff --git a/repos/effect/packages/effect/test/unstable/observability/OtlpSerialization.test.ts b/packages/effect/test/unstable/observability/OtlpSerialization.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/observability/OtlpSerialization.test.ts rename to packages/effect/test/unstable/observability/OtlpSerialization.test.ts diff --git a/repos/effect/packages/effect/test/unstable/observability/PrometheusMetrics.test.ts b/packages/effect/test/unstable/observability/PrometheusMetrics.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/observability/PrometheusMetrics.test.ts rename to packages/effect/test/unstable/observability/PrometheusMetrics.test.ts diff --git a/repos/effect/packages/effect/test/unstable/persistence/KeyValueStore.test.ts b/packages/effect/test/unstable/persistence/KeyValueStore.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/persistence/KeyValueStore.test.ts rename to packages/effect/test/unstable/persistence/KeyValueStore.test.ts diff --git a/repos/effect/packages/effect/test/unstable/persistence/KeyValueStoreTest.ts b/packages/effect/test/unstable/persistence/KeyValueStoreTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/persistence/KeyValueStoreTest.ts rename to packages/effect/test/unstable/persistence/KeyValueStoreTest.ts diff --git a/repos/effect/packages/effect/test/unstable/persistence/PersistedCache.test.ts b/packages/effect/test/unstable/persistence/PersistedCache.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/persistence/PersistedCache.test.ts rename to packages/effect/test/unstable/persistence/PersistedCache.test.ts diff --git a/repos/effect/packages/effect/test/unstable/persistence/PersistedCacheTest.ts b/packages/effect/test/unstable/persistence/PersistedCacheTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/persistence/PersistedCacheTest.ts rename to packages/effect/test/unstable/persistence/PersistedCacheTest.ts diff --git a/repos/effect/packages/effect/test/unstable/persistence/PersistedQueue.test.ts b/packages/effect/test/unstable/persistence/PersistedQueue.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/persistence/PersistedQueue.test.ts rename to packages/effect/test/unstable/persistence/PersistedQueue.test.ts diff --git a/repos/effect/packages/effect/test/unstable/persistence/PersistedQueueTest.ts b/packages/effect/test/unstable/persistence/PersistedQueueTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/persistence/PersistedQueueTest.ts rename to packages/effect/test/unstable/persistence/PersistedQueueTest.ts diff --git a/repos/effect/packages/effect/test/unstable/persistence/RateLimiter.test.ts b/packages/effect/test/unstable/persistence/RateLimiter.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/persistence/RateLimiter.test.ts rename to packages/effect/test/unstable/persistence/RateLimiter.test.ts diff --git a/repos/effect/packages/effect/test/unstable/persistence/RateLimiterTest.ts b/packages/effect/test/unstable/persistence/RateLimiterTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/persistence/RateLimiterTest.ts rename to packages/effect/test/unstable/persistence/RateLimiterTest.ts diff --git a/repos/effect/packages/effect/test/unstable/persistence/Redis.test.ts b/packages/effect/test/unstable/persistence/Redis.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/persistence/Redis.test.ts rename to packages/effect/test/unstable/persistence/Redis.test.ts diff --git a/repos/effect/packages/effect/test/unstable/persistence/SqlCleanupTest.ts b/packages/effect/test/unstable/persistence/SqlCleanupTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/persistence/SqlCleanupTest.ts rename to packages/effect/test/unstable/persistence/SqlCleanupTest.ts diff --git a/repos/effect/packages/effect/test/unstable/process/ChildProcess.test.ts b/packages/effect/test/unstable/process/ChildProcess.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/process/ChildProcess.test.ts rename to packages/effect/test/unstable/process/ChildProcess.test.ts diff --git a/repos/effect/packages/effect/test/unstable/process/ChildProcessSpawnerTest.ts b/packages/effect/test/unstable/process/ChildProcessSpawnerTest.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/process/ChildProcessSpawnerTest.ts rename to packages/effect/test/unstable/process/ChildProcessSpawnerTest.ts diff --git a/repos/effect/packages/effect/test/unstable/process/fixtures/bash/no-permissions.sh b/packages/effect/test/unstable/process/fixtures/bash/no-permissions.sh similarity index 100% rename from repos/effect/packages/effect/test/unstable/process/fixtures/bash/no-permissions.sh rename to packages/effect/test/unstable/process/fixtures/bash/no-permissions.sh diff --git a/repos/effect/packages/effect/test/unstable/process/fixtures/bash/parent-exits-early.sh b/packages/effect/test/unstable/process/fixtures/bash/parent-exits-early.sh similarity index 100% rename from repos/effect/packages/effect/test/unstable/process/fixtures/bash/parent-exits-early.sh rename to packages/effect/test/unstable/process/fixtures/bash/parent-exits-early.sh diff --git a/repos/effect/packages/effect/test/unstable/process/fixtures/bash/spawn-children.sh b/packages/effect/test/unstable/process/fixtures/bash/spawn-children.sh similarity index 100% rename from repos/effect/packages/effect/test/unstable/process/fixtures/bash/spawn-children.sh rename to packages/effect/test/unstable/process/fixtures/bash/spawn-children.sh diff --git a/repos/effect/packages/effect/test/unstable/process/fixtures/config/SHOUTING b/packages/effect/test/unstable/process/fixtures/config/SHOUTING similarity index 100% rename from repos/effect/packages/effect/test/unstable/process/fixtures/config/SHOUTING rename to packages/effect/test/unstable/process/fixtures/config/SHOUTING diff --git a/repos/effect/packages/effect/test/unstable/process/fixtures/config/integer b/packages/effect/test/unstable/process/fixtures/config/integer similarity index 100% rename from repos/effect/packages/effect/test/unstable/process/fixtures/config/integer rename to packages/effect/test/unstable/process/fixtures/config/integer diff --git a/repos/effect/packages/effect/test/unstable/process/fixtures/config/nested/config b/packages/effect/test/unstable/process/fixtures/config/nested/config similarity index 100% rename from repos/effect/packages/effect/test/unstable/process/fixtures/config/nested/config rename to packages/effect/test/unstable/process/fixtures/config/nested/config diff --git a/repos/effect/packages/effect/test/unstable/process/fixtures/config/secret b/packages/effect/test/unstable/process/fixtures/config/secret similarity index 100% rename from repos/effect/packages/effect/test/unstable/process/fixtures/config/secret rename to packages/effect/test/unstable/process/fixtures/config/secret diff --git a/repos/effect/packages/effect/test/unstable/schema/VariantSchema.test.ts b/packages/effect/test/unstable/schema/VariantSchema.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/schema/VariantSchema.test.ts rename to packages/effect/test/unstable/schema/VariantSchema.test.ts diff --git a/repos/effect/packages/effect/test/unstable/socket/Socket.test.ts b/packages/effect/test/unstable/socket/Socket.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/socket/Socket.test.ts rename to packages/effect/test/unstable/socket/Socket.test.ts diff --git a/repos/effect/packages/effect/test/unstable/sql/SqlClient.test.ts b/packages/effect/test/unstable/sql/SqlClient.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/sql/SqlClient.test.ts rename to packages/effect/test/unstable/sql/SqlClient.test.ts diff --git a/repos/effect/packages/effect/test/unstable/sql/SqlError.test.ts b/packages/effect/test/unstable/sql/SqlError.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/sql/SqlError.test.ts rename to packages/effect/test/unstable/sql/SqlError.test.ts diff --git a/repos/effect/packages/effect/test/unstable/sql/SqlResolver.test.ts b/packages/effect/test/unstable/sql/SqlResolver.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/sql/SqlResolver.test.ts rename to packages/effect/test/unstable/sql/SqlResolver.test.ts diff --git a/repos/effect/packages/effect/test/unstable/sql/SqlSchema.test.ts b/packages/effect/test/unstable/sql/SqlSchema.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/sql/SqlSchema.test.ts rename to packages/effect/test/unstable/sql/SqlSchema.test.ts diff --git a/repos/effect/packages/effect/test/unstable/sql/Statement.test.ts b/packages/effect/test/unstable/sql/Statement.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/sql/Statement.test.ts rename to packages/effect/test/unstable/sql/Statement.test.ts diff --git a/repos/effect/packages/effect/test/unstable/workers/Worker.test.ts b/packages/effect/test/unstable/workers/Worker.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/workers/Worker.test.ts rename to packages/effect/test/unstable/workers/Worker.test.ts diff --git a/repos/effect/packages/effect/test/unstable/workers/WorkerError.test.ts b/packages/effect/test/unstable/workers/WorkerError.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/workers/WorkerError.test.ts rename to packages/effect/test/unstable/workers/WorkerError.test.ts diff --git a/repos/effect/packages/effect/test/unstable/workflow/DurableQueue.test.ts b/packages/effect/test/unstable/workflow/DurableQueue.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/workflow/DurableQueue.test.ts rename to packages/effect/test/unstable/workflow/DurableQueue.test.ts diff --git a/repos/effect/packages/effect/test/unstable/workflow/Workflow.test.ts b/packages/effect/test/unstable/workflow/Workflow.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/workflow/Workflow.test.ts rename to packages/effect/test/unstable/workflow/Workflow.test.ts diff --git a/repos/effect/packages/effect/test/unstable/workflow/WorkflowEngine.test.ts b/packages/effect/test/unstable/workflow/WorkflowEngine.test.ts similarity index 100% rename from repos/effect/packages/effect/test/unstable/workflow/WorkflowEngine.test.ts rename to packages/effect/test/unstable/workflow/WorkflowEngine.test.ts diff --git a/repos/effect/packages/effect/test/utils/assert.ts b/packages/effect/test/utils/assert.ts similarity index 100% rename from repos/effect/packages/effect/test/utils/assert.ts rename to packages/effect/test/utils/assert.ts diff --git a/repos/effect/packages/effect/test/utils/chunkCoordination.ts b/packages/effect/test/utils/chunkCoordination.ts similarity index 100% rename from repos/effect/packages/effect/test/utils/chunkCoordination.ts rename to packages/effect/test/utils/chunkCoordination.ts diff --git a/repos/effect/packages/effect/test/utils/counter.ts b/packages/effect/test/utils/counter.ts similarity index 100% rename from repos/effect/packages/effect/test/utils/counter.ts rename to packages/effect/test/utils/counter.ts diff --git a/repos/effect/packages/effect/tsconfig.json b/packages/effect/tsconfig.json similarity index 100% rename from repos/effect/packages/effect/tsconfig.json rename to packages/effect/tsconfig.json diff --git a/repos/effect/packages/effect/typeperf/README.md b/packages/effect/typeperf/README.md similarity index 100% rename from repos/effect/packages/effect/typeperf/README.md rename to packages/effect/typeperf/README.md diff --git a/repos/effect/packages/effect/typeperf/compare.mjs b/packages/effect/typeperf/compare.mjs similarity index 100% rename from repos/effect/packages/effect/typeperf/compare.mjs rename to packages/effect/typeperf/compare.mjs diff --git a/repos/effect/packages/effect/typeperf/compare/httpapi.mjs b/packages/effect/typeperf/compare/httpapi.mjs similarity index 100% rename from repos/effect/packages/effect/typeperf/compare/httpapi.mjs rename to packages/effect/typeperf/compare/httpapi.mjs diff --git a/repos/effect/packages/effect/typeperf/config.json b/packages/effect/typeperf/config.json similarity index 100% rename from repos/effect/packages/effect/typeperf/config.json rename to packages/effect/typeperf/config.json diff --git a/repos/effect/packages/effect/typeperf/run.mjs b/packages/effect/typeperf/run.mjs similarity index 100% rename from repos/effect/packages/effect/typeperf/run.mjs rename to packages/effect/typeperf/run.mjs diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/baseline.ts b/packages/effect/typeperf/suites/httpapi/baseline.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/baseline.ts rename to packages/effect/typeperf/suites/httpapi/baseline.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/_endpoint-selection-types.ts b/packages/effect/typeperf/suites/httpapi/fixtures/_endpoint-selection-types.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/_endpoint-selection-types.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/_endpoint-selection-types.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/_grouped-api-500.ts b/packages/effect/typeperf/suites/httpapi/fixtures/_grouped-api-500.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/_grouped-api-500.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/_grouped-api-500.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/_grouped-api-types.ts b/packages/effect/typeperf/suites/httpapi/fixtures/_grouped-api-types.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/_grouped-api-types.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/_grouped-api-types.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/builder-endpoint-count-500.ts b/packages/effect/typeperf/suites/httpapi/fixtures/builder-endpoint-count-500.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/builder-endpoint-count-500.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/builder-endpoint-count-500.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/builder-handle-all-count-500.ts b/packages/effect/typeperf/suites/httpapi/fixtures/builder-handle-all-count-500.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/builder-handle-all-count-500.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/builder-handle-all-count-500.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/builder-handle-all-two-batches-count-500.ts b/packages/effect/typeperf/suites/httpapi/fixtures/builder-handle-all-two-batches-count-500.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/builder-handle-all-two-batches-count-500.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/builder-handle-all-two-batches-count-500.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/builder-handlers-count-100.ts b/packages/effect/typeperf/suites/httpapi/fixtures/builder-handlers-count-100.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/builder-handlers-count-100.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/builder-handlers-count-100.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/builder-raw-handlers-count-100.ts b/packages/effect/typeperf/suites/httpapi/fixtures/builder-raw-handlers-count-100.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/builder-raw-handlers-count-100.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/builder-raw-handlers-count-100.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/client-endpoint-count-500.ts b/packages/effect/typeperf/suites/httpapi/fixtures/client-endpoint-count-500.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/client-endpoint-count-500.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/client-endpoint-count-500.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/client-group-count-500.ts b/packages/effect/typeperf/suites/httpapi/fixtures/client-group-count-500.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/client-group-count-500.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/client-group-count-500.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/client-groups-100x5-count-500.ts b/packages/effect/typeperf/suites/httpapi/fixtures/client-groups-100x5-count-500.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/client-groups-100x5-count-500.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/client-groups-100x5-count-500.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/client-methods-count-500.ts b/packages/effect/typeperf/suites/httpapi/fixtures/client-methods-count-500.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/client-methods-count-500.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/client-methods-count-500.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/client-top-level-count-500.ts b/packages/effect/typeperf/suites/httpapi/fixtures/client-top-level-count-500.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/client-top-level-count-500.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/client-top-level-count-500.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/endpoint-class-count-500.ts b/packages/effect/typeperf/suites/httpapi/fixtures/endpoint-class-count-500.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/endpoint-class-count-500.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/endpoint-class-count-500.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/endpoint-count-500.ts b/packages/effect/typeperf/suites/httpapi/fixtures/endpoint-count-500.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/endpoint-count-500.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/endpoint-count-500.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/group-endpoints-count-500.ts b/packages/effect/typeperf/suites/httpapi/fixtures/group-endpoints-count-500.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/group-endpoints-count-500.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/group-endpoints-count-500.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/url-builder-count-500.ts b/packages/effect/typeperf/suites/httpapi/fixtures/url-builder-count-500.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/url-builder-count-500.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/url-builder-count-500.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/url-builder-top-level-count-500.ts b/packages/effect/typeperf/suites/httpapi/fixtures/url-builder-top-level-count-500.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/fixtures/url-builder-top-level-count-500.ts rename to packages/effect/typeperf/suites/httpapi/fixtures/url-builder-top-level-count-500.ts diff --git a/repos/effect/packages/effect/typeperf/suites/httpapi/thresholds.json b/packages/effect/typeperf/suites/httpapi/thresholds.json similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/httpapi/thresholds.json rename to packages/effect/typeperf/suites/httpapi/thresholds.json diff --git a/repos/effect/packages/effect/typeperf/suites/schema/baseline.ts b/packages/effect/typeperf/suites/schema/baseline.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/baseline.ts rename to packages/effect/typeperf/suites/schema/baseline.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/array.ts b/packages/effect/typeperf/suites/schema/fixtures/array.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/array.ts rename to packages/effect/typeperf/suites/schema/fixtures/array.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/brand.ts b/packages/effect/typeperf/suites/schema/fixtures/brand.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/brand.ts rename to packages/effect/typeperf/suites/schema/fixtures/brand.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/decode-unknown-effect.ts b/packages/effect/typeperf/suites/schema/fixtures/decode-unknown-effect.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/decode-unknown-effect.ts rename to packages/effect/typeperf/suites/schema/fixtures/decode-unknown-effect.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/encode-unknown-effect.ts b/packages/effect/typeperf/suites/schema/fixtures/encode-unknown-effect.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/encode-unknown-effect.ts rename to packages/effect/typeperf/suites/schema/fixtures/encode-unknown-effect.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/exit.ts b/packages/effect/typeperf/suites/schema/fixtures/exit.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/exit.ts rename to packages/effect/typeperf/suites/schema/fixtures/exit.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/non-empty-array.ts b/packages/effect/typeperf/suites/schema/fixtures/non-empty-array.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/non-empty-array.ts rename to packages/effect/typeperf/suites/schema/fixtures/non-empty-array.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/record.ts b/packages/effect/typeperf/suites/schema/fixtures/record.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/record.ts rename to packages/effect/typeperf/suites/schema/fixtures/record.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/struct-mixed.ts b/packages/effect/typeperf/suites/schema/fixtures/struct-mixed.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/struct-mixed.ts rename to packages/effect/typeperf/suites/schema/fixtures/struct-mixed.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/struct-mutable-only.ts b/packages/effect/typeperf/suites/schema/fixtures/struct-mutable-only.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/struct-mutable-only.ts rename to packages/effect/typeperf/suites/schema/fixtures/struct-mutable-only.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/struct-optional-only.ts b/packages/effect/typeperf/suites/schema/fixtures/struct-optional-only.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/struct-optional-only.ts rename to packages/effect/typeperf/suites/schema/fixtures/struct-optional-only.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/struct-required.ts b/packages/effect/typeperf/suites/schema/fixtures/struct-required.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/struct-required.ts rename to packages/effect/typeperf/suites/schema/fixtures/struct-required.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/struct-with-rest.ts b/packages/effect/typeperf/suites/schema/fixtures/struct-with-rest.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/struct-with-rest.ts rename to packages/effect/typeperf/suites/schema/fixtures/struct-with-rest.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/tagged-union.ts b/packages/effect/typeperf/suites/schema/fixtures/tagged-union.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/tagged-union.ts rename to packages/effect/typeperf/suites/schema/fixtures/tagged-union.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/to-codec-array-from-single.ts b/packages/effect/typeperf/suites/schema/fixtures/to-codec-array-from-single.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/to-codec-array-from-single.ts rename to packages/effect/typeperf/suites/schema/fixtures/to-codec-array-from-single.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/to-codec-json.ts b/packages/effect/typeperf/suites/schema/fixtures/to-codec-json.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/to-codec-json.ts rename to packages/effect/typeperf/suites/schema/fixtures/to-codec-json.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/to-codec-string-tree.ts b/packages/effect/typeperf/suites/schema/fixtures/to-codec-string-tree.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/to-codec-string-tree.ts rename to packages/effect/typeperf/suites/schema/fixtures/to-codec-string-tree.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/to-encoded.ts b/packages/effect/typeperf/suites/schema/fixtures/to-encoded.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/to-encoded.ts rename to packages/effect/typeperf/suites/schema/fixtures/to-encoded.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/to-standard-json-schema.ts b/packages/effect/typeperf/suites/schema/fixtures/to-standard-json-schema.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/to-standard-json-schema.ts rename to packages/effect/typeperf/suites/schema/fixtures/to-standard-json-schema.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/to-type.ts b/packages/effect/typeperf/suites/schema/fixtures/to-type.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/to-type.ts rename to packages/effect/typeperf/suites/schema/fixtures/to-type.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/tuple-with-rest.ts b/packages/effect/typeperf/suites/schema/fixtures/tuple-with-rest.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/tuple-with-rest.ts rename to packages/effect/typeperf/suites/schema/fixtures/tuple-with-rest.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/tuple.ts b/packages/effect/typeperf/suites/schema/fixtures/tuple.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/tuple.ts rename to packages/effect/typeperf/suites/schema/fixtures/tuple.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/fixtures/union.ts b/packages/effect/typeperf/suites/schema/fixtures/union.ts similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/fixtures/union.ts rename to packages/effect/typeperf/suites/schema/fixtures/union.ts diff --git a/repos/effect/packages/effect/typeperf/suites/schema/thresholds.json b/packages/effect/typeperf/suites/schema/thresholds.json similarity index 100% rename from repos/effect/packages/effect/typeperf/suites/schema/thresholds.json rename to packages/effect/typeperf/suites/schema/thresholds.json diff --git a/repos/effect/packages/effect/typetest/AiError.tst.ts b/packages/effect/typetest/AiError.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/AiError.tst.ts rename to packages/effect/typetest/AiError.tst.ts diff --git a/repos/effect/packages/effect/typetest/Array.tst.ts b/packages/effect/typetest/Array.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Array.tst.ts rename to packages/effect/typetest/Array.tst.ts diff --git a/repos/effect/packages/effect/typetest/Brand.tst.ts b/packages/effect/typetest/Brand.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Brand.tst.ts rename to packages/effect/typetest/Brand.tst.ts diff --git a/repos/effect/packages/effect/typetest/ByteSize.tst.ts b/packages/effect/typetest/ByteSize.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/ByteSize.tst.ts rename to packages/effect/typetest/ByteSize.tst.ts diff --git a/repos/effect/packages/effect/typetest/Channel.tst.ts b/packages/effect/typetest/Channel.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Channel.tst.ts rename to packages/effect/typetest/Channel.tst.ts diff --git a/repos/effect/packages/effect/typetest/ChannelSchema.tst.ts b/packages/effect/typetest/ChannelSchema.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/ChannelSchema.tst.ts rename to packages/effect/typetest/ChannelSchema.tst.ts diff --git a/repos/effect/packages/effect/typetest/Clock.tst.ts b/packages/effect/typetest/Clock.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Clock.tst.ts rename to packages/effect/typetest/Clock.tst.ts diff --git a/repos/effect/packages/effect/typetest/Config.tst.ts b/packages/effect/typetest/Config.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Config.tst.ts rename to packages/effect/typetest/Config.tst.ts diff --git a/repos/effect/packages/effect/typetest/ConfigProvider.tst.ts b/packages/effect/typetest/ConfigProvider.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/ConfigProvider.tst.ts rename to packages/effect/typetest/ConfigProvider.tst.ts diff --git a/repos/effect/packages/effect/typetest/Context.tst.ts b/packages/effect/typetest/Context.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Context.tst.ts rename to packages/effect/typetest/Context.tst.ts diff --git a/repos/effect/packages/effect/typetest/Data.tst.ts b/packages/effect/typetest/Data.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Data.tst.ts rename to packages/effect/typetest/Data.tst.ts diff --git a/repos/effect/packages/effect/typetest/Effect.tst.ts b/packages/effect/typetest/Effect.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Effect.tst.ts rename to packages/effect/typetest/Effect.tst.ts diff --git a/repos/effect/packages/effect/typetest/Effectable.tst.ts b/packages/effect/typetest/Effectable.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Effectable.tst.ts rename to packages/effect/typetest/Effectable.tst.ts diff --git a/repos/effect/packages/effect/typetest/Equivalence.tst.ts b/packages/effect/typetest/Equivalence.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Equivalence.tst.ts rename to packages/effect/typetest/Equivalence.tst.ts diff --git a/repos/effect/packages/effect/typetest/Fiber.tst.ts b/packages/effect/typetest/Fiber.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Fiber.tst.ts rename to packages/effect/typetest/Fiber.tst.ts diff --git a/repos/effect/packages/effect/typetest/FileSystem.tst.ts b/packages/effect/typetest/FileSystem.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/FileSystem.tst.ts rename to packages/effect/typetest/FileSystem.tst.ts diff --git a/repos/effect/packages/effect/typetest/Function.tst.ts b/packages/effect/typetest/Function.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Function.tst.ts rename to packages/effect/typetest/Function.tst.ts diff --git a/repos/effect/packages/effect/typetest/Graph.tst.ts b/packages/effect/typetest/Graph.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Graph.tst.ts rename to packages/effect/typetest/Graph.tst.ts diff --git a/repos/effect/packages/effect/typetest/Iterable.tst.ts b/packages/effect/typetest/Iterable.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Iterable.tst.ts rename to packages/effect/typetest/Iterable.tst.ts diff --git a/repos/effect/packages/effect/typetest/Layer.tst.ts b/packages/effect/typetest/Layer.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Layer.tst.ts rename to packages/effect/typetest/Layer.tst.ts diff --git a/repos/effect/packages/effect/typetest/Match.tst.ts b/packages/effect/typetest/Match.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Match.tst.ts rename to packages/effect/typetest/Match.tst.ts diff --git a/repos/effect/packages/effect/typetest/Newtype.tst.ts b/packages/effect/typetest/Newtype.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Newtype.tst.ts rename to packages/effect/typetest/Newtype.tst.ts diff --git a/repos/effect/packages/effect/typetest/Optic.tst.ts b/packages/effect/typetest/Optic.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Optic.tst.ts rename to packages/effect/typetest/Optic.tst.ts diff --git a/repos/effect/packages/effect/typetest/Option.tst.ts b/packages/effect/typetest/Option.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Option.tst.ts rename to packages/effect/typetest/Option.tst.ts diff --git a/repos/effect/packages/effect/typetest/Order.tst.ts b/packages/effect/typetest/Order.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Order.tst.ts rename to packages/effect/typetest/Order.tst.ts diff --git a/repos/effect/packages/effect/typetest/Predicate.tst.ts b/packages/effect/typetest/Predicate.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Predicate.tst.ts rename to packages/effect/typetest/Predicate.tst.ts diff --git a/repos/effect/packages/effect/typetest/Random.tst.ts b/packages/effect/typetest/Random.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Random.tst.ts rename to packages/effect/typetest/Random.tst.ts diff --git a/repos/effect/packages/effect/typetest/Record.tst.ts b/packages/effect/typetest/Record.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Record.tst.ts rename to packages/effect/typetest/Record.tst.ts diff --git a/repos/effect/packages/effect/typetest/Result.tst.ts b/packages/effect/typetest/Result.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Result.tst.ts rename to packages/effect/typetest/Result.tst.ts diff --git a/repos/effect/packages/effect/typetest/Schedule.tst.ts b/packages/effect/typetest/Schedule.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Schedule.tst.ts rename to packages/effect/typetest/Schedule.tst.ts diff --git a/repos/effect/packages/effect/typetest/Sink.tst.ts b/packages/effect/typetest/Sink.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Sink.tst.ts rename to packages/effect/typetest/Sink.tst.ts diff --git a/repos/effect/packages/effect/typetest/Stream.tst.ts b/packages/effect/typetest/Stream.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Stream.tst.ts rename to packages/effect/typetest/Stream.tst.ts diff --git a/repos/effect/packages/effect/typetest/Struct.tst.ts b/packages/effect/typetest/Struct.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Struct.tst.ts rename to packages/effect/typetest/Struct.tst.ts diff --git a/repos/effect/packages/effect/typetest/SynchronizedRef.tst.ts b/packages/effect/typetest/SynchronizedRef.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/SynchronizedRef.tst.ts rename to packages/effect/typetest/SynchronizedRef.tst.ts diff --git a/repos/effect/packages/effect/typetest/TestSchema.tst.ts b/packages/effect/typetest/TestSchema.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/TestSchema.tst.ts rename to packages/effect/typetest/TestSchema.tst.ts diff --git a/repos/effect/packages/effect/typetest/Tuple.tst.ts b/packages/effect/typetest/Tuple.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Tuple.tst.ts rename to packages/effect/typetest/Tuple.tst.ts diff --git a/repos/effect/packages/effect/typetest/Types.tst.ts b/packages/effect/typetest/Types.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/Types.tst.ts rename to packages/effect/typetest/Types.tst.ts diff --git a/repos/effect/packages/effect/typetest/VariantSchema.tst.ts b/packages/effect/typetest/VariantSchema.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/VariantSchema.tst.ts rename to packages/effect/typetest/VariantSchema.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/Array.tst.ts b/packages/effect/typetest/schema/Array.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/Array.tst.ts rename to packages/effect/typetest/schema/Array.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/FromJsonSchema.tst.ts b/packages/effect/typetest/schema/FromJsonSchema.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/FromJsonSchema.tst.ts rename to packages/effect/typetest/schema/FromJsonSchema.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/Graph.tst.ts b/packages/effect/typetest/schema/Graph.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/Graph.tst.ts rename to packages/effect/typetest/schema/Graph.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/Literals.tst.ts b/packages/effect/typetest/schema/Literals.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/Literals.tst.ts rename to packages/effect/typetest/schema/Literals.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/Record.tst.ts b/packages/effect/typetest/schema/Record.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/Record.tst.ts rename to packages/effect/typetest/schema/Record.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/Schema.tst.ts b/packages/effect/typetest/schema/Schema.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/Schema.tst.ts rename to packages/effect/typetest/schema/Schema.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/SchemaBuiltInRevivers.tst.ts b/packages/effect/typetest/schema/SchemaBuiltInRevivers.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/SchemaBuiltInRevivers.tst.ts rename to packages/effect/typetest/schema/SchemaBuiltInRevivers.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/SchemaJsonSchemaConsumer.tst.ts b/packages/effect/typetest/schema/SchemaJsonSchemaConsumer.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/SchemaJsonSchemaConsumer.tst.ts rename to packages/effect/typetest/schema/SchemaJsonSchemaConsumer.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/SchemaRepresentation.tst.ts b/packages/effect/typetest/schema/SchemaRepresentation.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/SchemaRepresentation.tst.ts rename to packages/effect/typetest/schema/SchemaRepresentation.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/SchemaRepresentationCompilers.tst.ts b/packages/effect/typetest/schema/SchemaRepresentationCompilers.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/SchemaRepresentationCompilers.tst.ts rename to packages/effect/typetest/schema/SchemaRepresentationCompilers.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/SchemaRepresentationReviver.tst.ts b/packages/effect/typetest/schema/SchemaRepresentationReviver.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/SchemaRepresentationReviver.tst.ts rename to packages/effect/typetest/schema/SchemaRepresentationReviver.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/Struct.tst.ts b/packages/effect/typetest/schema/Struct.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/Struct.tst.ts rename to packages/effect/typetest/schema/Struct.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/Tuple.tst.ts b/packages/effect/typetest/schema/Tuple.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/Tuple.tst.ts rename to packages/effect/typetest/schema/Tuple.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/Union.tst.ts b/packages/effect/typetest/schema/Union.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/Union.tst.ts rename to packages/effect/typetest/schema/Union.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/api.tst.ts b/packages/effect/typetest/schema/api.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/api.tst.ts rename to packages/effect/typetest/schema/api.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/options.tst.ts b/packages/effect/typetest/schema/options.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/options.tst.ts rename to packages/effect/typetest/schema/options.tst.ts diff --git a/repos/effect/packages/effect/typetest/schema/toIso.tst.ts b/packages/effect/typetest/schema/toIso.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/schema/toIso.tst.ts rename to packages/effect/typetest/schema/toIso.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/ai/LanguageModel.tst.ts b/packages/effect/typetest/unstable/ai/LanguageModel.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/ai/LanguageModel.tst.ts rename to packages/effect/typetest/unstable/ai/LanguageModel.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/ai/McpServer.tst.ts b/packages/effect/typetest/unstable/ai/McpServer.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/ai/McpServer.tst.ts rename to packages/effect/typetest/unstable/ai/McpServer.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/ai/Response.tst.ts b/packages/effect/typetest/unstable/ai/Response.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/ai/Response.tst.ts rename to packages/effect/typetest/unstable/ai/Response.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/ai/Tool.tst.ts b/packages/effect/typetest/unstable/ai/Tool.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/ai/Tool.tst.ts rename to packages/effect/typetest/unstable/ai/Tool.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/arbitrary/Arbitrary.tst.ts b/packages/effect/typetest/unstable/arbitrary/Arbitrary.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/arbitrary/Arbitrary.tst.ts rename to packages/effect/typetest/unstable/arbitrary/Arbitrary.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/cli/Command.tst.ts b/packages/effect/typetest/unstable/cli/Command.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/cli/Command.tst.ts rename to packages/effect/typetest/unstable/cli/Command.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/cli/Param.tst.ts b/packages/effect/typetest/unstable/cli/Param.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/cli/Param.tst.ts rename to packages/effect/typetest/unstable/cli/Param.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/cli/Prompt.tst.ts b/packages/effect/typetest/unstable/cli/Prompt.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/cli/Prompt.tst.ts rename to packages/effect/typetest/unstable/cli/Prompt.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/cluster/EntityProxyServer.tst.ts b/packages/effect/typetest/unstable/cluster/EntityProxyServer.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/cluster/EntityProxyServer.tst.ts rename to packages/effect/typetest/unstable/cluster/EntityProxyServer.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/cluster/K8sHttpClient.tst.ts b/packages/effect/typetest/unstable/cluster/K8sHttpClient.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/cluster/K8sHttpClient.tst.ts rename to packages/effect/typetest/unstable/cluster/K8sHttpClient.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/cluster/Reply.tst.ts b/packages/effect/typetest/unstable/cluster/Reply.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/cluster/Reply.tst.ts rename to packages/effect/typetest/unstable/cluster/Reply.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/encoding/Ndjson.tst.ts b/packages/effect/typetest/unstable/encoding/Ndjson.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/encoding/Ndjson.tst.ts rename to packages/effect/typetest/unstable/encoding/Ndjson.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/http/HttpClient.tst.ts b/packages/effect/typetest/unstable/http/HttpClient.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/http/HttpClient.tst.ts rename to packages/effect/typetest/unstable/http/HttpClient.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/http/HttpPlatform.tst.ts b/packages/effect/typetest/unstable/http/HttpPlatform.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/http/HttpPlatform.tst.ts rename to packages/effect/typetest/unstable/http/HttpPlatform.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/http/HttpRouter.tst.ts b/packages/effect/typetest/unstable/http/HttpRouter.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/http/HttpRouter.tst.ts rename to packages/effect/typetest/unstable/http/HttpRouter.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApi.tst.ts b/packages/effect/typetest/unstable/httpapi/HttpApi.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/httpapi/HttpApi.tst.ts rename to packages/effect/typetest/unstable/httpapi/HttpApi.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiBuilder.tst.ts b/packages/effect/typetest/unstable/httpapi/HttpApiBuilder.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiBuilder.tst.ts rename to packages/effect/typetest/unstable/httpapi/HttpApiBuilder.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiClient.tst.ts b/packages/effect/typetest/unstable/httpapi/HttpApiClient.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiClient.tst.ts rename to packages/effect/typetest/unstable/httpapi/HttpApiClient.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiEndpoint.tst.ts b/packages/effect/typetest/unstable/httpapi/HttpApiEndpoint.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiEndpoint.tst.ts rename to packages/effect/typetest/unstable/httpapi/HttpApiEndpoint.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiGroup.tst.ts b/packages/effect/typetest/unstable/httpapi/HttpApiGroup.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiGroup.tst.ts rename to packages/effect/typetest/unstable/httpapi/HttpApiGroup.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiMiddleware.tst.ts b/packages/effect/typetest/unstable/httpapi/HttpApiMiddleware.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiMiddleware.tst.ts rename to packages/effect/typetest/unstable/httpapi/HttpApiMiddleware.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiSchema.tst.ts b/packages/effect/typetest/unstable/httpapi/HttpApiSchema.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiSchema.tst.ts rename to packages/effect/typetest/unstable/httpapi/HttpApiSchema.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/httpapi/OpenApiRepresentation.tst.ts b/packages/effect/typetest/unstable/httpapi/OpenApiRepresentation.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/httpapi/OpenApiRepresentation.tst.ts rename to packages/effect/typetest/unstable/httpapi/OpenApiRepresentation.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/net/IpInterface.tst.ts b/packages/effect/typetest/unstable/net/IpInterface.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/net/IpInterface.tst.ts rename to packages/effect/typetest/unstable/net/IpInterface.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/net/IpNetwork.tst.ts b/packages/effect/typetest/unstable/net/IpNetwork.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/net/IpNetwork.tst.ts rename to packages/effect/typetest/unstable/net/IpNetwork.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/net/NetAddress.tst.ts b/packages/effect/typetest/unstable/net/NetAddress.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/net/NetAddress.tst.ts rename to packages/effect/typetest/unstable/net/NetAddress.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/reactivity/AsyncResult.tst.ts b/packages/effect/typetest/unstable/reactivity/AsyncResult.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/reactivity/AsyncResult.tst.ts rename to packages/effect/typetest/unstable/reactivity/AsyncResult.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/reactivity/Atom.tst.ts b/packages/effect/typetest/unstable/reactivity/Atom.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/reactivity/Atom.tst.ts rename to packages/effect/typetest/unstable/reactivity/Atom.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/reactivity/AtomHttpApi.tst.ts b/packages/effect/typetest/unstable/reactivity/AtomHttpApi.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/reactivity/AtomHttpApi.tst.ts rename to packages/effect/typetest/unstable/reactivity/AtomHttpApi.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/reactivity/AtomRpc.tst.ts b/packages/effect/typetest/unstable/reactivity/AtomRpc.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/reactivity/AtomRpc.tst.ts rename to packages/effect/typetest/unstable/reactivity/AtomRpc.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/rpc/Rpc.tst.ts b/packages/effect/typetest/unstable/rpc/Rpc.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/rpc/Rpc.tst.ts rename to packages/effect/typetest/unstable/rpc/Rpc.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/rpc/RpcGroup.tst.ts b/packages/effect/typetest/unstable/rpc/RpcGroup.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/rpc/RpcGroup.tst.ts rename to packages/effect/typetest/unstable/rpc/RpcGroup.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/rpc/RpcMiddleware.tst.ts b/packages/effect/typetest/unstable/rpc/RpcMiddleware.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/rpc/RpcMiddleware.tst.ts rename to packages/effect/typetest/unstable/rpc/RpcMiddleware.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/rpc/RpcServer.tst.ts b/packages/effect/typetest/unstable/rpc/RpcServer.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/rpc/RpcServer.tst.ts rename to packages/effect/typetest/unstable/rpc/RpcServer.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/socket/Socket.tst.ts b/packages/effect/typetest/unstable/socket/Socket.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/socket/Socket.tst.ts rename to packages/effect/typetest/unstable/socket/Socket.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/sql/SqlSchema.tst.ts b/packages/effect/typetest/unstable/sql/SqlSchema.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/sql/SqlSchema.tst.ts rename to packages/effect/typetest/unstable/sql/SqlSchema.tst.ts diff --git a/repos/effect/packages/effect/typetest/unstable/workflow/Workflow.tst.ts b/packages/effect/typetest/unstable/workflow/Workflow.tst.ts similarity index 100% rename from repos/effect/packages/effect/typetest/unstable/workflow/Workflow.tst.ts rename to packages/effect/typetest/unstable/workflow/Workflow.tst.ts diff --git a/packages/eslint-codegen-model/CHANGELOG.md b/packages/eslint-codegen-model/CHANGELOG.md deleted file mode 100644 index cdc729531..000000000 --- a/packages/eslint-codegen-model/CHANGELOG.md +++ /dev/null @@ -1,1354 +0,0 @@ -# @effect-app/eslint-codegen-model - -## 2.0.0-beta.27 - -### Patch Changes - -- a354345: Move release tsconfig flattening from publish to pack lifecycle so package configs are restored before registry upload/auth can fail. -- a69da09: Publish from generated staging directories so release-only files are created outside the source package tree. - -## 2.0.0-beta.26 - -### Patch Changes - -- e71b67a: run codegen model from src locally - -## 2.0.0-beta.25 - -### Minor Changes - -- 82655fa: feat: add native fork - -### Patch Changes - -- 21ac90a: Unify generated model facades on `OpaqueFacade` and support class facades through encoded-key schema transforms. -- d605f3d: Migrate `glob` 8 → 11. Use the named `globSync` export (glob 11 dropped the default export, which broke loading the package as an ESM oxlint plugin), and drop the stale `@types/glob` (glob 11 ships its own types). Also clears the package's pre-existing implicit-`any` typecheck errors. - -## 2.0.0-beta.24 - -### Patch Changes - -- 50b022e: Harden model facades and add `OpaqueErrorFacadeClass`. - - - `OpaqueErrorFacadeClass`: facade `TaggedErrorClass`/`ErrorClass` while keeping - `Cause.YieldableError` on the constructed instance (so `yield* new Err()`, - `Effect.fail`, and `instanceof` keep working through the facade). - - `OpaqueFacadeInput` relaxed to require only the codec service channels, so - transformed schemas (`.pipe(encodeKeys/annotate/filter/...)`) can be facaded; - `fields`/`copy`/`mapFields` flow through `OpaqueFacadeStatics` when present, and - `to` is carried so models that compose via `X.to.fields` keep working. - - Dropped the wide `fields`/`mapFields` overrides on the facade interfaces so the - precise statics win (keeps `Q.project(X.mapFields(...))` typed). - - Codegen (`eslint-codegen-model`): resolver prefers the private `_X` over the - self-referential facade; converges static service types in one run; per-model - classification (facade Opaque models, leave `Class` standard in mixed files); - `Make` emitted as `type X = {...} | void` when the make-input is voidable; - `readonly`-prefixed array/tuple elements parenthesized; value self-references in - the moved `_X` body rewritten to `_X`; instance getters surface on `Self`. - -- 50b022e: Add generated opaque model facades that expose static Type, Encoded, Make, and Schema declarations without leaking the private struct schema type to downstream project references. - -## 2.0.0-beta.23 - -### Patch Changes - -- 55c6572: update packages - -## 2.0.0-beta.22 - -### Patch Changes - -- b2e0f62: Allow oxlint codegen rule options so shared preset defaults can be configured. - -## 2.0.0-beta.21 - -### Patch Changes - -- 22be885: Add `stripSuffixes` option to the meta codegen preset and configure `.Queries` stripping in the shared oxlint config. - -## 2.0.0-beta.20 - -### Patch Changes - -- bogus - -## 2.0.0-beta.19 - -### Patch Changes - -- b8b9080: update packages - -## 2.0.0-beta.18 - -### Minor Changes - -- 34ab818: Add `importExtension` option to the `barrel` preset to control the file extension emitted on generated imports/exports (defaults to `.js`). Configurable per block, globally via the oxlint rule option `["error", { barrel: { importExtension: ".ts" } }]`, or via `codegen.config.json` (CLI also accepts `--config `). Resolution order: preset default → global defaults → per-block options. - -### Patch Changes - -- ccd4845: set default barrel ext to .ts - -## 2.0.0-beta.17 - -### Patch Changes - -- f04327a: Fix `toCamelCase`/`toPascalCase` in barrel preset to preserve case boundaries. Mixed-case input like `AnCamelCase` was collapsed to `Ancamelcase` because the word splitter only matched contiguous alphanumerics. Now splits on case transitions (matching prior `lodash.camelCase` + `startCase` behavior). - -## 2.0.0-beta.15 - -### Patch Changes - -- c991be1: update packages - -## 2.0.0-beta.14 - -### Patch Changes - -- 830e1ce: Optimize codegen barrel and model plugins: - - Drop `io-ts-extra`, `io-ts`, and `lodash` dependencies; replace with native JS helpers - - Add fast string comparison (skip AST parse) for barrel and model equality checks - - Avoid triple file reads in the CLI path: pass already-read source into `model` via context - - Eliminate double read in `run()`: pass source string into `updateFile` - - Extract shared logic (`blockRe`, helpers, `renderPreset`) into `src/shared/codegen-block.ts` - - Remove dead `fs.existsSync`/`fs.statSync` checks in `model` preset - - Use `Set` for O(1) dedup in `model` preset - - Move `last` helper to module scope in `barrel` preset - - Pre-compile all regex constants at module scope; use fresh `RegExp` copy per oxlint `Program` visit to avoid shared `lastIndex` mutations - -## 2.0.0-beta.13 - -### Patch Changes - -- 8c753cb: align with earlier updates - -## 2.0.0-beta.12 - -### Patch Changes - -- 50ce7e6: Cleanup after tsgolint + oxlint-codegen-plugin migration: - - Wire `@effect-app/eslint-codegen-model/oxlint` via `jsPlugins` object form (`{ name: "codegen", specifier: ... }`) so the `codegen/codegen` rule key resolves. - - Drop `eslint-plugin-codegen` dep, patch, and `augmentedConfig` helper — codegen now runs through oxlint. - - Break cyclic workspace dep between `eslint-codegen-model` and `eslint-shared-config`; remove dead `eslint.config.mjs` from `eslint-codegen-model`. - - Switch `@effect-app/vue` to oxlint-only (no `.vue` files in `src`); drop its ESLint config and `eslint-shared-config` devDep. - - Restore `@typescript-eslint` plugin and rules in shared `baseConfig` so inline `eslint-disable @typescript-eslint/...` directives resolve in `@effect-app/vue-components` (the only remaining ESLint consumer, for `.vue` files). - - Add `globals.browser` to `vueConfig` so browser globals (`window`, `console`, `URL`, etc.) resolve. - -## 2.0.0-beta.11 - -### Patch Changes - -- c1e73de: - -## 2.0.0-beta.10 - -### Patch Changes - -- 6fff09c: unify encoded function for when you use encodedKeys - -## 2.0.0-beta.9 - -### Patch Changes - -- 25008fb: Ignore commented-out exported classes when detecting model schemas for generated `Encoded` namespaces. -- 77efa95: Detect `Schema.Opaque()` model classes in the model preset while excluding `Context.Opaque` service tags. - -## 2.0.0-beta.8 - -### Patch Changes - -- 025de47: Fold the encoded-override support from `ExtendedClass` and `ExtendedTaggedClass` into `Class`, `TaggedClass`, `ErrorClass`, and `TaggedErrorClass`, and update model codegen to detect the new second-generic form. - -## 2.0.0-beta.7 - -### Patch Changes - -- c3299f7: update packages - -## 2.0.0-beta.6 - -### Patch Changes - -- 3b27909: Don't export `Req` in meta codegen preset - -## 2.0.0-beta.5 - -### Minor Changes - -- 3613e87: Add `TaggedRequestFor` helper to `makeRpcClient` that curries a `moduleName`, producing request classes with static `id` and `moduleName` properties. This enables passing request classes directly to `makeQueryKey` without going through `clientFor` first. The `clientFor` function no longer requires a `meta` property on the module when requests carry `moduleName`. The meta codegen preset now generates `Req = TaggedRequestFor(moduleName)`. Original `TaggedRequest` remains for backwards compatibility. - -## 2.0.0-beta.4 - -### Patch Changes - -- cec026d: update packages - -## 2.0.0-beta.3 - -### Patch Changes - -- 10b55ff: update packages - -## 2.0.0-beta.2 - -### Patch Changes - -- 01c70d0: update all teh tings - -## 2.0.0-beta.1 - -### Patch Changes - -- 64786af: Beta25 - -## 2.0.0-beta.0 - -### Major Changes - -- 880df28: Effect v4 beta - -## 1.47.0 - -### Minor Changes - -- 1a102e2: update packages - -## 1.46.1 - -### Patch Changes - -- 358782e: update packages - -## 1.46.0 - -### Minor Changes - -- 07f1de5: update packages and tsconfigs - -## 1.45.0 - -### Minor Changes - -- b8f5e30: update packages - -## 1.44.0 - -### Minor Changes - -- 6d8c512: update packages - -## 1.43.0 - -### Minor Changes - -- 3d49d81: update packages - -## 1.42.3 - -### Patch Changes - -- 8096576: new eslint shared config package - -## 1.42.2 - -### Patch Changes - -- f6a3328: export base eslint files so that we import them in projects - -## 1.42.1 - -### Patch Changes - -- 8cb893c: dprint rules the world - -## 1.42.0 - -### Minor Changes - -- 0f2b2cf: update packages - -## 1.41.0 - -### Minor Changes - -- 0a82e7f: update packages - -## 1.40.1 - -### Patch Changes - -- b095bb5: tscp - -## 1.40.0 - -### Minor Changes - -- 2c217ce: update packages - -## 1.39.1 - -### Patch Changes - -- b771967: update packages - -## 1.39.0 - -### Minor Changes - -- eac9c67: update packages - -## 1.38.1 - -### Patch Changes - -- 49d93a5: update packages - -## 1.38.0 - -### Minor Changes - -- b1d4af4: housekeeping: update packages - -## 1.37.0 - -### Minor Changes - -- 8cb33d5: update packages - -## 1.36.4 - -### Patch Changes - -- 1e1f32b: housekeeping: update packages - -## 1.36.3 - -### Patch Changes - -- 8b7fdbe: update packages - -## 1.36.2 - -### Patch Changes - -- update packages - -## 1.36.1 - -### Patch Changes - -- 0fcab38: update packages - -## 1.36.0 - -### Minor Changes - -- 14ea804: housekeeping: update packages - -## 1.35.1 - -### Patch Changes - -- 4c8dfb4: update packages - -## 1.35.0 - -### Minor Changes - -- e42d5fb: update to effect 3.14 with native rpc2 - -## 1.34.3 - -### Patch Changes - -- 771ac45: update packages - -## 1.34.2 - -### Patch Changes - -- 36996ed: housekeeping: update packages - -## 1.34.1 - -### Patch Changes - -- 63e966a: update packages - -## 1.34.0 - -### Minor Changes - -- 8be2984: housekeeping: update packages - -## 1.33.0 - -### Minor Changes - -- 9b2e385: update packages - -## 1.32.0 - -### Minor Changes - -- 2d0ad81: update packages - -## 1.31.2 - -### Patch Changes - -- 9d11dfb: housekeeping: update packages - -## 1.31.1 - -### Patch Changes - -- ab9d1ea: housekeeping: update packages - -## 1.31.0 - -### Minor Changes - -- c8ebfb4: update packages - -## 1.30.4 - -### Patch Changes - -- 9f504c6: update packages - -## 1.30.3 - -### Patch Changes - -- 750b46a: update packages - -## 1.30.2 - -### Patch Changes - -- 1bfc3d8: update packages - -## 1.30.1 - -### Patch Changes - -- 5ef6481: update packages - -## 1.30.0 - -### Minor Changes - -- 29a1a65: update packages - -## 1.29.0 - -### Minor Changes - -- d84aef7: update packages - -## 1.28.0 - -### Minor Changes - -- cc2c43e: update packages - -## 1.27.2 - -### Patch Changes - -- 125e2ea: update packages - -## 1.27.1 - -### Patch Changes - -- 0feb32c: update packages - -## 1.27.0 - -### Minor Changes - -- bump - -## 1.26.1 - -### Patch Changes - -- c971d73: update packages - -## 1.26.0 - -### Minor Changes - -- update - -## 1.25.0 - -### Minor Changes - -- f19762b: update packages - -## 1.24.1 - -### Patch Changes - -- 412cb3d: update packages - -## 1.24.0 - -### Minor Changes - -- 58d373f: switch from `From` to `Encoded` - -## 1.23.0 - -### Minor Changes - -- 590e5bf: update packages - -## 1.22.0 - -### Minor Changes - -- d4ab73f: update packages - -## 1.21.0 - -### Minor Changes - -- d5623a6: update packages - -## 1.20.1 - -### Patch Changes - -- f68dbd2: update packages - -## 1.20.0 - -### Minor Changes - -- 2dfcb9f: remove "resources" level from moduleName - -## 1.19.0 - -### Minor Changes - -- 3872061: migrate to effect/Schema - -## 1.18.1 - -### Patch Changes - -- cda1477: update packages - -## 1.18.0 - -### Minor Changes - -- 3d37a85: improve: moduleName as const - -### Patch Changes - -- 3d37a85: use as const - -## 1.17.0 - -### Minor Changes - -- update packages - -## 1.16.0 - -### Minor Changes - -- 9ddb31b: update packages - -## 1.15.0 - -### Minor Changes - -- 0effd97: update packages - -## 1.14.0 - -### Minor Changes - -- b9b64b8: housekeeping: update packages - -## 1.13.0 - -### Minor Changes - -- 65dcc73: update packages - -## 1.12.0 - -### Minor Changes - -- 4d2b804: housekeeping: update packages - -## 1.11.0 - -### Minor Changes - -- 1018e58: update packages - -## 1.10.0 - -### Minor Changes - -- b3d9a3e: update packages - -## 1.9.1 - -### Patch Changes - -- d08286c: update packages - -## 1.9.0 - -### Minor Changes - -- c5f5223: update packages - -## 1.8.3 - -### Patch Changes - -- d61e00a: fix rule - -## 1.8.2 - -### Patch Changes - -- f45f63d: fix typo - -## 1.8.1 - -### Patch Changes - -- update packages - -## 1.8.0 - -### Minor Changes - -- 08361d8: modulegen hack - -## 1.7.4 - -### Patch Changes - -- e6eecd2: update packages - -## 1.7.3 - -### Patch Changes - -- ff - -## 1.7.2 - -### Patch Changes - -- fix - -## 1.7.1 - -### Patch Changes - -- 0b399ce: update packages - -## 1.7.0 - -### Minor Changes - -- 2143dd9: update packages - -## 1.6.1 - -### Patch Changes - -- e120966: update packages -- f6066ac: update packages - -## 1.6.0 - -### Minor Changes - -- 79f58af: update packages - -## 1.5.2 - -### Patch Changes - -- b3ebc41: update packages - -## 1.5.1 - -### Patch Changes - -- f569681: update packages - -## 1.5.0 - -### Minor Changes - -- 613c148: update packages - -## 1.4.0 - -### Minor Changes - -- 8d0c511: update packages - -## 1.3.0 - -### Minor Changes - -- 9cc6f86: update packages - -## 1.2.3 - -### Patch Changes - -- 349c421: Update packages - -## 1.2.2 - -### Patch Changes - -- 9d944a1: update packages - -## 1.2.1 - -### Patch Changes - -- 2c661c1: update packages - -## 1.2.0 - -### Minor Changes - -- 9ac9416: update packages - -## 1.1.2 - -### Patch Changes - -- 3411e78: update packages - -## 1.1.1 - -### Patch Changes - -- 128f636: update packages - -## 1.1.0 - -### Minor Changes - -- 2e29520: update packages - -## 1.0.4 - -### Patch Changes - -- c99cdbb: update packages - -## 1.0.3 - -### Patch Changes - -- c4dbb6c: update packages - -## 1.0.2 - -### Patch Changes - -- caa40e4: update packagesy - -## 1.0.1 - -### Patch Changes - -- bf702ba: update packages - -## 1.0.0 - -### Major Changes - -- 4e9992f: effect 3.0! - -## 0.75.0 - -### Minor Changes - -- 0d1b378: update to latest schema - -## 0.74.0 - -### Minor Changes - -- 290a709: update packages - -## 0.73.0 - -### Minor Changes - -- ecb05f6: update packages - -## 0.72.0 - -### Minor Changes - -- 01f8283: cleanup: drop legacy `FromClass` - -## 0.71.0 - -### Minor Changes - -- revert form changes - -## 0.70.0 - -### Minor Changes - -- 7a3f05c: update packages - -## 0.69.0 - -### Minor Changes - -- bbaa558: bs - -## 0.68.0 - -### Minor Changes - -- e5b0d8e: update packages -- 2e2fa98: update packages - -## 0.67.0 - -### Minor Changes - -- 494842c: update packages - -## 0.66.0 - -### Minor Changes - -- 498deb0: update packages - -## 0.65.0 - -### Minor Changes - -- fd8f019: update packages - -## 0.64.0 - -### Minor Changes - -- 51253a2: update packages - -## 0.63.0 - -### Minor Changes - -- f2c3553: update packages - -## 0.62.0 - -### Minor Changes - -- update packages - -## 0.61.0 - -### Minor Changes - -- 5178025: update packages - -## 0.60.1 - -### Patch Changes - -- 326c1ce: fix model gen - -## 0.60.0 - -### Minor Changes - -- d0a1774: update ts to 5.4.1-rc - -## 0.59.2 - -### Patch Changes - -- 2fd7c69: fix for comments - -## 0.59.1 - -### Patch Changes - -- 5243e13: remove need for ts compiler - -## 0.59.0 - -### Minor Changes - -- 7346691: update packages - -## 0.58.0 - -### Minor Changes - -- e8e8ee2: update packages - -## 0.57.1 - -### Patch Changes - -- 0a312c3: update packages - -## 0.57.0 - -### Minor Changes - -- 117be64: bump - -## 0.56.0 - -### Minor Changes - -- A new day -- 78b3c9e: reduce tspuse - -## 0.55.0 - -### Minor Changes - -- c070e0d: update effect - -## 0.54.0 - -### Minor Changes - -- 57fcfef: update packages - -## 0.53.1 - -### Patch Changes - -- d8496db: peer - -## 0.53.0 - -### Minor Changes - -- d478694: handle double namespace as one - -## 0.52.0 - -### Minor Changes - -- 29c5f16: detsp - -## 0.51.0 - -### Minor Changes - -- 6e5c606: cl - -## 0.50.0 - -### Minor Changes - -- de336f6: src - -## 0.49.1 - -### Patch Changes - -- d7ebf34: enable sourcePrefix option - -## 0.49.0 - -### Minor Changes - -- m - -## 0.48.0 - -### Minor Changes - -- bs - -## 0.47.0 - -### Minor Changes - -- 17cfe0f: update packages - -## 0.46.0 - -### Minor Changes - -- c8a07bc: fix path - -## 0.45.1 - -### Patch Changes - -- 200a840: address - -## 0.45.0 - -### Minor Changes - -- c29b6ff: bump - -## 0.44.0 - -### Minor Changes - -- bump - -## 0.43.0 - -### Minor Changes - -- 034717f: update packages - -## 0.42.0 - -### Minor Changes - -- fa729da: detect instead the Extended Class, instead of the decorator - -## 0.41.0 - -### Minor Changes - -- 99f79ab: update packages - -## 0.40.1 - -### Patch Changes - -- dd60aca: fix - -## 0.40.0 - -### Minor Changes - -- a5c50bb: feat: add meta codegen - -## 0.39.0 - -### Minor Changes - -- 4c915ea: update packages - -## 0.38.0 - -### Minor Changes - -- 33dcf2e: update packages - -## 0.37.0 - -### Minor Changes - -- 63425a7: update packages - -## 0.36.1 - -### Patch Changes - -- c615f35: update packages - -## 0.36.0 - -### Minor Changes - -- 640d24a: update packages - -### Patch Changes - -- 640d24a: update package -- 640d24a: codegen update -- 640d24a: update packages - -## 0.36.0-next.3 - -### Patch Changes - -- 2b721f7: update packages - -## 0.36.0-next.2 - -### Patch Changes - -- 2597bfd: codegen update - -## 0.36.0-next.1 - -### Patch Changes - -- e7acd67: update package - -## 0.36.0-next.0 - -### Minor Changes - -- 87a6ac2: update packages - -## 0.35.1 - -### Patch Changes - -- 350f685: update packages - -## 0.35.0 - -### Minor Changes - -- 67eb741: update packages - -## 0.34.0 - -### Minor Changes - -- fb332b4: update packages - -## 0.33.0 - -### Minor Changes - -- a9e8b8f: update packages - -## 0.32.0 - -### Minor Changes - -- align v - -## 0.31.0 - -### Minor Changes - -- align v - -## 0.30.0 - -### Minor Changes - -- c528c33: initial alignment of Schema with effect/schema - -## 0.29.1 - -### Patch Changes - -- ab7eddc: update packages - -## 0.29.0 - -### Minor Changes - -- 6c180253: cleanup - -## 0.28.0 - -### Minor Changes - -- 0a4bfbc7: update packages - -## 0.27.0 - -### Minor Changes - -- 40a6c3b6: update packages - -## 0.26.2 - -### Patch Changes - -- 263a56b9: update packages - -## 0.26.1 - -### Patch Changes - -- aa3c98d1: update packages - -## 0.26.0 - -### Minor Changes - -- update packages - -## 0.25.3 - -### Patch Changes - -- 780a6718: update packages - -## 0.25.2 - -### Patch Changes - -- 838eeb10: update packages - -## 0.25.1 - -### Patch Changes - -- fix tsplus.config for pnpm - -## 0.25.0 - -### Minor Changes - -- update packages - -## 0.24.0 - -### Minor Changes - -- add match and update packages - -## 0.23.0 - -### Minor Changes - -- housekeeping: update packages - -## 0.22.0 - -### Minor Changes - -- Update packages - -## 0.21.0 - -### Minor Changes - -- Improve codegen - -## 0.20.0 - -### Minor Changes - -- update packages and cleanup - -## 0.19.0 - -### Minor Changes - -- update dependencies - -## 0.18.0 - -### Minor Changes - -- update packages - -## 0.17.0 - -### Minor Changes - -- Update to latest effect - -## 0.16.0 - -### Minor Changes - -- update packages - -## 0.15.1 - -### Patch Changes - -- fix glob - -## 0.15.0 - -### Minor Changes - -- fix double quotes - -## 0.14.0 - -### Minor Changes - -- Improve Encoded codegen - -## 0.13.0 - -### Minor Changes - -- Update tsplus with companion instance extensions - -## 0.12.2 - -### Patch Changes - -- 28d5530b: Fix Encoded - -## 0.12.1 - -### Patch Changes - -- 315487e5: Fix unneeded interface - -## 0.12.0 - -### Minor Changes - -- 0ed16973: Disable full-type generation by default - -## 0.11.0 - -### Minor Changes - -- Update annotations, drop Aspects for now - -## 0.10.0 - -### Minor Changes - -- 4d49f303: Upgrade to @effect/data - -## 0.9.1 - -### Patch Changes - -- 912ba66c: Update packages - -## 0.9.0 - -### Minor Changes - -- 67716050: Update to TS5 beta - -## 0.8.2 - -### Patch Changes - -- Disable trace - -## 0.8.1 - -### Patch Changes - -- Use ReadonlyMap - -## 0.8.0 - -### Minor Changes - -- bba14672: Update to latest @effect/io and @effect/data diff --git a/packages/eslint-codegen-model/examples/model-facades.ts b/packages/eslint-codegen-model/examples/model-facades.ts deleted file mode 100644 index 2d2677f36..000000000 --- a/packages/eslint-codegen-model/examples/model-facades.ts +++ /dev/null @@ -1,318 +0,0 @@ -import { Effect } from "effect" -import * as S from "../../effect-app/src/Schema.ts" - -export interface CatalogDecodingServices { - readonly CatalogDecodingServices: "CatalogDecodingServices" -} - -export interface CatalogEncodingServices { - readonly CatalogEncodingServices: "CatalogEncodingServices" -} - -const ServiceAwareSku = S.NonEmptyString255.pipe( - S.middlewareDecoding((effect) => Effect.context().pipe(Effect.flatMap(() => effect))), - S.middlewareEncoding((effect) => Effect.context().pipe(Effect.flatMap(() => effect))) -) - -class _CatalogItem extends S.Opaque<_CatalogItem>()( - S.Struct({ - id: S.StringId, - sku: ServiceAwareSku, - name: S.NonEmptyString255, - dimensions: S.Struct({ - width: S.Number, - height: S.Number, - depth: S.Number, - unit: S.Literals(["cm", "in"]) - }), - tags: S.Array(S.NonEmptyString255), - attributes: S.Record(S.String, S.Union([S.String, S.Number, S.Boolean])), - discontinuedAt: S.NullOr(S.DateFromString) - }) -) {} - -// codegen:start {preset: modelFacade, className: _CatalogItem, schema: S} -// eslint-disable-next-line typescript/no-unsafe-declaration-merging -export class CatalogItem extends S.OpaqueFacade< - CatalogItem, - CatalogItem.Encoded, - CatalogItem.Make, - CatalogItem.DecodingServices, - CatalogItem.EncodingServices ->()(_CatalogItem) {} -// codegen:end - -class _OrderLine extends S.Opaque<_OrderLine>()( - S.Struct({ - item: CatalogItem, - quantity: S.Int, - unitPrice: S.Struct({ - amount: S.Number, - currency: S.Literals(["EUR", "USD", "GBP"]) - }), - adjustments: S.Array( - S.Struct({ - code: S.String, - amount: S.Number, - reason: S.optional(S.String) - }) - ) - }) -) { - static defaultCurrency(): "EUR" { - return "EUR" - } -} - -// codegen:start {preset: modelFacade, className: _OrderLine, schema: S} -// eslint-disable-next-line typescript/no-unsafe-declaration-merging -export class OrderLine extends S.OpaqueFacade< - OrderLine, - OrderLine.Encoded, - OrderLine.Make, - OrderLine.DecodingServices, - OrderLine.EncodingServices ->()(_OrderLine) {} -// codegen:end - -export const defaultOrderCurrency: "EUR" = OrderLine.defaultCurrency() - -class _OrderAggregate extends S.Opaque<_OrderAggregate>()( - S.Struct({ - id: S.StringId, - customer: S.Struct({ - id: S.StringId, - email: S.NonEmptyString255, - profile: S.Struct({ - displayName: S.NonEmptyString255, - phone: S.NullOr(S.String), - address: S.Struct({ - line1: S.NonEmptyString255, - line2: S.optional(S.NonEmptyString255), - postalCode: S.NonEmptyString255, - city: S.NonEmptyString255, - country: S.NonEmptyString255 - }) - }) - }), - lines: S.NonEmptyArray(OrderLine), - fulfillment: S.Union([ - S.TaggedStruct("Pending", { - requestedAt: S.DateFromString - }), - S.TaggedStruct("Packed", { - packedAt: S.DateFromString, - packageIds: S.NonEmptyArray(S.StringId) - }), - S.TaggedStruct("Shipped", { - shippedAt: S.DateFromString, - carrier: S.NonEmptyString255, - trackingNumber: S.NonEmptyString255 - }) - ]), - audit: S.Array( - S.Struct({ - at: S.DateFromString, - actorId: S.StringId, - message: S.String, - metadata: S.Record(S.String, S.String) - }) - ) - }) -) {} - -// codegen:start {preset: modelFacade, className: _OrderAggregate, schema: S} -// eslint-disable-next-line typescript/no-unsafe-declaration-merging -export class OrderAggregate extends S.OpaqueFacade< - OrderAggregate, - OrderAggregate.Encoded, - OrderAggregate.Make, - OrderAggregate.DecodingServices, - OrderAggregate.EncodingServices ->()(_OrderAggregate) {} -// codegen:end - -// codegen:start {preset: model, static: true, facade: true} -// -export interface CatalogItem { - readonly id: S.StringId - readonly sku: S.NonEmptyString255 - readonly name: S.NonEmptyString255 - readonly dimensions: { - readonly width: number - readonly height: number - readonly depth: number - readonly unit: "cm" | "in" - } - readonly tags: readonly S.NonEmptyString255[] - readonly attributes: { readonly [x: string]: string | number | boolean } - readonly discontinuedAt: null | Date -} -export namespace CatalogItem { - export interface Encoded { - readonly id: string - readonly sku: string - readonly name: string - readonly dimensions: { - readonly width: number - readonly height: number - readonly depth: number - readonly unit: "cm" | "in" - } - readonly tags: readonly string[] - readonly attributes: { readonly [x: string]: string | number | boolean } - readonly discontinuedAt: null | string - } - export interface Make { - readonly id: S.StringId - readonly sku: S.NonEmptyString255 - readonly name: S.NonEmptyString255 - readonly dimensions: { - readonly width: number - readonly height: number - readonly depth: number - readonly unit: "cm" | "in" - } - readonly tags: readonly S.NonEmptyString255[] - readonly attributes: { readonly [x: string]: string | number | boolean } - readonly discontinuedAt: null | Date - } - export type DecodingServices = CatalogDecodingServices - export type EncodingServices = CatalogEncodingServices -} -export interface OrderLine { - readonly item: CatalogItem - readonly quantity: S.Int - readonly unitPrice: { readonly amount: number; readonly currency: "EUR" | "USD" | "GBP" } - readonly adjustments: - readonly ({ readonly code: string; readonly amount: number; readonly reason?: undefined | string })[] -} -export namespace OrderLine { - export interface Encoded { - readonly item: CatalogItem.Encoded - readonly quantity: number - readonly unitPrice: { readonly amount: number; readonly currency: "EUR" | "USD" | "GBP" } - readonly adjustments: - readonly ({ readonly code: string; readonly amount: number; readonly reason?: undefined | string })[] - } - export interface Make { - readonly item: CatalogItem.Make - readonly quantity: S.Int - readonly unitPrice: { readonly amount: number; readonly currency: "EUR" | "USD" | "GBP" } - readonly adjustments: - readonly ({ readonly code: string; readonly amount: number; readonly reason?: undefined | string })[] - } - export type DecodingServices = CatalogDecodingServices - export type EncodingServices = CatalogEncodingServices -} -export interface OrderAggregate { - readonly id: S.StringId - readonly customer: { - readonly id: S.StringId - readonly email: S.NonEmptyString255 - readonly profile: { - readonly displayName: S.NonEmptyString255 - readonly phone: null | string - readonly address: { - readonly line1: S.NonEmptyString255 - readonly postalCode: S.NonEmptyString255 - readonly city: S.NonEmptyString255 - readonly country: S.NonEmptyString255 - readonly line2?: undefined | S.NonEmptyString255 - } - } - } - readonly lines: readonly [OrderLine, ...OrderLine[]] - readonly fulfillment: { readonly _tag: "Pending"; readonly requestedAt: Date } | { - readonly _tag: "Packed" - readonly packedAt: Date - readonly packageIds: readonly [S.StringId, ...S.StringId[]] - } | { - readonly _tag: "Shipped" - readonly shippedAt: Date - readonly carrier: S.NonEmptyString255 - readonly trackingNumber: S.NonEmptyString255 - } - readonly audit: readonly { - readonly at: Date - readonly actorId: S.StringId - readonly message: string - readonly metadata: { readonly [x: string]: string } - }[] -} -export namespace OrderAggregate { - export interface Encoded { - readonly id: string - readonly customer: { - readonly id: string - readonly email: string - readonly profile: { - readonly displayName: string - readonly phone: null | string - readonly address: { - readonly line1: string - readonly postalCode: string - readonly city: string - readonly country: string - readonly line2?: undefined | string - } - } - } - readonly lines: readonly [OrderLine.Encoded, ...OrderLine.Encoded[]] - readonly fulfillment: { readonly _tag: "Pending"; readonly requestedAt: string } | { - readonly _tag: "Packed" - readonly packedAt: string - readonly packageIds: readonly [string, ...string[]] - } | { - readonly _tag: "Shipped" - readonly shippedAt: string - readonly carrier: string - readonly trackingNumber: string - } - readonly audit: readonly { - readonly at: string - readonly actorId: string - readonly message: string - readonly metadata: { readonly [x: string]: string } - }[] - } - export interface Make { - readonly id: S.StringId - readonly customer: { - readonly id: S.StringId - readonly email: S.NonEmptyString255 - readonly profile: { - readonly displayName: S.NonEmptyString255 - readonly phone: null | string - readonly address: { - readonly line1: S.NonEmptyString255 - readonly postalCode: S.NonEmptyString255 - readonly city: S.NonEmptyString255 - readonly country: S.NonEmptyString255 - readonly line2?: undefined | S.NonEmptyString255 - } - } - } - readonly lines: readonly [OrderLine.Make, ...OrderLine.Make[]] - readonly fulfillment: { readonly _tag: "Pending"; readonly requestedAt: Date } | { - readonly _tag: "Packed" - readonly packedAt: Date - readonly packageIds: readonly [S.StringId, ...S.StringId[]] - } | { - readonly _tag: "Shipped" - readonly shippedAt: Date - readonly carrier: S.NonEmptyString255 - readonly trackingNumber: S.NonEmptyString255 - } - readonly audit: readonly { - readonly at: Date - readonly actorId: S.StringId - readonly message: string - readonly metadata: { readonly [x: string]: string } - }[] - } - export type DecodingServices = CatalogDecodingServices - export type EncodingServices = CatalogEncodingServices -} -// -// codegen:end diff --git a/packages/eslint-codegen-model/examples/workflow-facades.ts b/packages/eslint-codegen-model/examples/workflow-facades.ts deleted file mode 100644 index 1a262a6d0..000000000 --- a/packages/eslint-codegen-model/examples/workflow-facades.ts +++ /dev/null @@ -1,184 +0,0 @@ -import * as S from "../../effect-app/src/Schema.ts" - -class _WorkflowStep extends S.Opaque<_WorkflowStep>()( - S.Struct({ - id: S.StringId, - name: S.NonEmptyString255, - timeout: S.optional(S.Number), - retryPolicy: S.Struct({ - maxAttempts: S.Int, - backoff: S.Literals(["fixed", "exponential"]), - jitter: S.Boolean - }), - input: S.Record(S.String, S.Union([S.String, S.Number, S.Boolean, S.Null])) - }) -) {} - -// codegen:start {preset: modelFacade, className: _WorkflowStep, schema: S} -export class WorkflowStep - extends S.OpaqueFacade< - WorkflowStep, - WorkflowStep.Encoded, - WorkflowStep.Make, - WorkflowStep.DecodingServices, - WorkflowStep.EncodingServices - >()(_WorkflowStep) -{} -// codegen:end - -class _WorkflowRun extends S.Opaque<_WorkflowRun>()( - S.Struct({ - id: S.StringId, - workflowName: S.NonEmptyString255, - version: S.Int, - steps: S.NonEmptyArray(WorkflowStep), - status: S.Union([ - S.TaggedStruct("Queued", { - queuedAt: S.DateFromString - }), - S.TaggedStruct("Running", { - startedAt: S.DateFromString, - activeStepId: S.StringId - }), - S.TaggedStruct("Completed", { - completedAt: S.DateFromString, - result: S.Record(S.String, S.String) - }), - S.TaggedStruct("Failed", { - failedAt: S.DateFromString, - failedStepId: S.StringId, - reason: S.NonEmptyString255 - }) - ]), - history: S.Array( - S.Struct({ - at: S.DateFromString, - stepId: S.optional(S.StringId), - event: S.NonEmptyString255, - details: S.Record(S.String, S.String) - }) - ) - }) -) {} - -// codegen:start {preset: modelFacade, className: _WorkflowRun, schema: S} -export class WorkflowRun - extends S.OpaqueFacade< - WorkflowRun, - WorkflowRun.Encoded, - WorkflowRun.Make, - WorkflowRun.DecodingServices, - WorkflowRun.EncodingServices - >()(_WorkflowRun) -{} -// codegen:end - -// codegen:start {preset: model, static: true, facade: true} -// -export interface WorkflowStep { - readonly id: S.StringId - readonly name: S.NonEmptyString255 - readonly retryPolicy: { - readonly maxAttempts: S.Int - readonly backoff: "fixed" | "exponential" - readonly jitter: false | true - } - readonly input: { readonly [x: string]: string | number | boolean | null } - readonly timeout?: undefined | number -} -export namespace WorkflowStep { - export interface Encoded { - readonly id: string - readonly name: string - readonly retryPolicy: { - readonly maxAttempts: number - readonly backoff: "fixed" | "exponential" - readonly jitter: false | true - } - readonly input: { readonly [x: string]: string | number | boolean | null } - readonly timeout?: undefined | number - } - export interface Make { - readonly id: S.StringId - readonly name: S.NonEmptyString255 - readonly retryPolicy: { - readonly maxAttempts: S.Int - readonly backoff: "fixed" | "exponential" - readonly jitter: false | true - } - readonly input: { readonly [x: string]: string | number | boolean | null } - readonly timeout?: undefined | number - } - export type DecodingServices = never - export type EncodingServices = never -} -export interface WorkflowRun { - readonly id: S.StringId - readonly workflowName: S.NonEmptyString255 - readonly version: S.Int - readonly steps: readonly [WorkflowStep, ...WorkflowStep[]] - readonly status: - | { readonly _tag: "Queued"; readonly queuedAt: Date } - | { readonly _tag: "Running"; readonly startedAt: Date; readonly activeStepId: S.StringId } - | { readonly _tag: "Completed"; readonly completedAt: Date; readonly result: { readonly [x: string]: string } } - | { - readonly _tag: "Failed" - readonly failedAt: Date - readonly failedStepId: S.StringId - readonly reason: S.NonEmptyString255 - } - readonly history: - readonly ({ - readonly at: Date - readonly event: S.NonEmptyString255 - readonly details: { readonly [x: string]: string } - readonly stepId?: undefined | S.StringId - })[] -} -export namespace WorkflowRun { - export interface Encoded { - readonly id: string - readonly workflowName: string - readonly version: number - readonly steps: readonly [WorkflowStep.Encoded, ...WorkflowStep.Encoded[]] - readonly status: - | { readonly _tag: "Queued"; readonly queuedAt: string } - | { readonly _tag: "Running"; readonly startedAt: string; readonly activeStepId: string } - | { readonly _tag: "Completed"; readonly completedAt: string; readonly result: { readonly [x: string]: string } } - | { readonly _tag: "Failed"; readonly failedAt: string; readonly failedStepId: string; readonly reason: string } - readonly history: - readonly ({ - readonly at: string - readonly event: string - readonly details: { readonly [x: string]: string } - readonly stepId?: undefined | string - })[] - } - export interface Make { - readonly id: S.StringId - readonly workflowName: S.NonEmptyString255 - readonly version: S.Int - readonly steps: readonly [WorkflowStep.Make, ...WorkflowStep.Make[]] - readonly status: - | { readonly _tag: "Queued"; readonly queuedAt: Date } - | { readonly _tag: "Running"; readonly startedAt: Date; readonly activeStepId: S.StringId } - | { readonly _tag: "Completed"; readonly completedAt: Date; readonly result: { readonly [x: string]: string } } - | { - readonly _tag: "Failed" - readonly failedAt: Date - readonly failedStepId: S.StringId - readonly reason: S.NonEmptyString255 - } - readonly history: - readonly ({ - readonly at: Date - readonly event: S.NonEmptyString255 - readonly details: { readonly [x: string]: string } - readonly stepId?: undefined | S.StringId - })[] - } - export type DecodingServices = never - export type EncodingServices = never -} -// -// codegen:end diff --git a/packages/eslint-codegen-model/index.js b/packages/eslint-codegen-model/index.js deleted file mode 100644 index 7192ff723..000000000 --- a/packages/eslint-codegen-model/index.js +++ /dev/null @@ -1,3 +0,0 @@ -exports.barrel = require("./dist/presets/barrel").barrel -exports.model = require("./dist/presets/model").model -exports.meta = require("./dist/presets/meta").meta diff --git a/packages/eslint-codegen-model/package.json b/packages/eslint-codegen-model/package.json deleted file mode 100644 index 206eda85f..000000000 --- a/packages/eslint-codegen-model/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "@effect-app/eslint-codegen-model", - "description": "Contains eslint helpers", - "sideEffects": false, - "type": "module", - "version": "2.0.0-beta.27", - "repository": { - "type": "git", - "url": "https://github.com/effect-app/libs.git", - "directory": "packages/eslint-codegen-model" - }, - "bin": { - "effect-app-codegen": "./dist/cli.js" - }, - "scripts": { - "watch": "pnpm build:tsc -w", - "build:tsc": "pnpm clean-dist && pnpm check", - "check": "tsgo --build", - "build": "tsgo", - "codegen": "pnpm build && node ./dist/cli.js", - "circular": "madge --circular --ts-config ./tsconfig.json --extensions ts ./src", - "ncu": "ncu", - "pub": "pnpm publish --access public", - "prepack": "node ../../scripts/stagePublishPackage.mjs prepack", - "postpack": "node ../../scripts/stagePublishPackage.mjs postpack", - "postpublish": "node ../../scripts/stagePublishPackage.mjs postpublish" - }, - "dependencies": { - "glob": "^11.1.0", - "js-yaml": "4.2.0", - "oxc-parser": "0.133.0" - }, - "peerDependencies": { - "typescript": ">=5.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - }, - "devDependencies": { - "@types/js-yaml": "4.0.9", - "madge": "8.0.0", - "oxlint": "1.67.0", - "typescript": "~6.0.3", - "effect-app": "workspace:*" - }, - "main": "index.js", - "exports": { - ".": { - "types": "./src/index.ts", - "default": "./src/index.ts" - }, - "./oxlint": { - "types": "./src/oxlint/index.ts", - "default": "./src/oxlint/index.ts" - } - }, - "publishConfig": { - "exports": { - ".": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" - }, - "./oxlint": { - "types": "./dist/oxlint/index.d.ts", - "default": "./dist/oxlint/index.js" - } - }, - "directory": ".publish", - "linkDirectory": false - }, - "author": "Wessel van der Veen & Scott vanBommel", - "license": "ISC" -} diff --git a/packages/eslint-codegen-model/src/cli.ts b/packages/eslint-codegen-model/src/cli.ts deleted file mode 100644 index 550fa12ad..000000000 --- a/packages/eslint-codegen-model/src/cli.ts +++ /dev/null @@ -1,638 +0,0 @@ -#!/usr/bin/env node -import * as fs from "node:fs" -import * as path from "node:path" - -import { globSync } from "glob" - -import { getExportedModelNames, getFacadeableModelNames } from "./presets/model.ts" -import { applyDefaults, blockRe, type CodegenDefaults, indentBlock, normaliseGeneratedContent, parseBlockOptions, renderPreset, trimTrailingNewline } from "./shared/codegen-block.ts" -import { createNativeModelTypeResolver } from "./shared/native-type-resolver.ts" -import { createModelTypeResolver, type ModelTypeResolver } from "./shared/type-resolver.ts" - -const CONFIG_FILENAMES = ["codegen.config.json"] - -function loadConfig(cwd: string, explicit?: string): CodegenDefaults | undefined { - const candidates = explicit ? [path.resolve(cwd, explicit)] : CONFIG_FILENAMES.map((f) => path.join(cwd, f)) - for (const candidate of candidates) { - if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) { - const parsed = JSON.parse(fs.readFileSync(candidate, "utf8")) - return parsed as CodegenDefaults - } - } - if (explicit) { - throw new Error(`Config not found: ${explicit}`) - } - return undefined -} - -const modelBlockRe = /\/\/ codegen:start[ \t]*\{[^}]*\bpreset:\s*model\b/ -const staticTypeModelBlockRe = - /\/\/ codegen:start[ \t]*\{[^}]*\bpreset:\s*model\b[^}]*\bstatic:\s*true\b[^}]*\btype:\s*true\b/ -const staticMakeModelBlockRe = - /\/\/ codegen:start[ \t]*\{[^}]*\bpreset:\s*model\b[^}]*\bstatic:\s*true\b[^}]*\bmake:\s*true\b/ -const facadeModelBlockRe = /\/\/ codegen:start[ \t]*\{[^}]*\bpreset:\s*model\b[^}]*\bfacade:\s*true\b/ - -function escapeRe(s: string): string { - return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") -} - -type CtorMode = "plain" | "type" | "make" - -/** - * Keep each model's `Opaque` base-class clause in sync with the block mode (idempotent): - * - make → `S.OpaqueShape` - * - type → `S.OpaqueType` - * - plain → `S.Opaque` (revert) - * - * Only `Opaque`-family clauses for the model's own `Self`/`Encoded` are touched (matches - * ``); `Class`/`TaggedClass` models are left untouched. - */ -function syncCtor(source: string, modelNames: ReadonlyArray, mode: CtorMode): string { - let out = source - for (const name of modelNames) { - const n = escapeRe(name) - const re = new RegExp( - `((?:[A-Za-z_$][\\w$]*\\.)?)(?:Opaque|OpaqueType|OpaqueShape)<\\s*${n}(?:\\.Type)?\\s*,\\s*${n}\\.Encoded(?:\\s*,\\s*${n}\\.Make)?\\s*>`, - "g" - ) - const target = mode === "make" - ? `$1OpaqueShape<${name}.Type, ${name}.Encoded, ${name}.Make>` - : mode === "type" - ? `$1OpaqueType<${name}.Type, ${name}.Encoded>` - : `$1Opaque<${name}, ${name}.Encoded>` - out = out.replace(re, target) - } - return out -} - -function findMatchingBrace(source: string, openIndex: number): number { - let depth = 0 - let quote: "\"" | "'" | "`" | undefined - let escaped = false - let lineComment = false - let blockComment = false - - for (let index = openIndex; index < source.length; index++) { - const char = source[index]! - const next = source[index + 1] - - if (lineComment) { - if (char === "\n") lineComment = false - continue - } - if (blockComment) { - if (char === "*" && next === "/") { - blockComment = false - index++ - } - continue - } - if (quote) { - if (escaped) { - escaped = false - } else if (char === "\\") { - escaped = true - } else if (char === quote) { - quote = undefined - } - continue - } - - if (char === "/" && next === "/") { - lineComment = true - index++ - continue - } - if (char === "/" && next === "*") { - blockComment = true - index++ - continue - } - if (char === "\"" || char === "'" || char === "`") { - quote = char - continue - } - if (char === "{") { - depth++ - continue - } - if (char === "}") { - depth-- - if (depth === 0) return index - } - } - - return -1 -} - -function findClassBodyOpen(source: string, start: number): number { - let parenDepth = 0 - let bracketDepth = 0 - let quote: "\"" | "'" | "`" | undefined - let escaped = false - let lineComment = false - let blockComment = false - - for (let index = start; index < source.length; index++) { - const char = source[index]! - const next = source[index + 1] - - if (lineComment) { - if (char === "\n") lineComment = false - continue - } - if (blockComment) { - if (char === "*" && next === "/") { - blockComment = false - index++ - } - continue - } - if (quote) { - if (escaped) { - escaped = false - } else if (char === "\\") { - escaped = true - } else if (char === quote) { - quote = undefined - } - continue - } - - if (char === "/" && next === "/") { - lineComment = true - index++ - continue - } - if (char === "/" && next === "*") { - blockComment = true - index++ - continue - } - if (char === "\"" || char === "'" || char === "`") { - quote = char - continue - } - if (char === "(") { - parenDepth++ - continue - } - if (char === ")") { - parenDepth-- - continue - } - if (char === "[") { - bracketDepth++ - continue - } - if (char === "]") { - bracketDepth-- - continue - } - if (char === "{" && parenDepth === 0 && bracketDepth === 0) { - return index - } - } - - return -1 -} - -function findClassEnd(source: string, start: number): number { - const openIndex = findClassBodyOpen(source, start) - if (openIndex === -1) return -1 - const closeIndex = findMatchingBrace(source, openIndex) - return closeIndex === -1 ? -1 : closeIndex + 1 -} - -function modelSchemaPrefix(classText: string): string { - const match = /\bextends\s+((?:[A-Za-z_$][\w$]*\.)?)(?:Opaque|OpaqueType|OpaqueShape)\s*`, - "g" - ) - const rewritten = classText.replace(re, `$1Opaque<_${name}>`) - // The body moves onto the private `_X`, but the public facade `X` is declared - // AFTER it. Member-access self-references (`X.fields`, `X.someStatic`) would be - // use-before-declaration, so point them at `_X` (structurally equivalent, declared - // first). Keep namespace TYPE members (`X.Encoded`/`Make`/`Type`/services) on `X`. - // NOTE: only the `X.` (member-access) form is rewritten — a bare `\bX\b` rewrite - // would also corrupt `TaggedStruct("X")` tag strings. Bare value self-refs - // (`S.decodeTo(X, ...)`) in a static body are rare; such models stay standard. - const selfValueRef = new RegExp( - `\\b${n}\\.(?!(?:Encoded|Make|Type|DecodingServices|EncodingServices)\\b)`, - "g" - ) - return rewritten.replace(selfValueRef, `_${name}.`) -} - -function facadeClassLine(name: string, prefix: string): string { - return `export class ${name} extends ${prefix}OpaqueFacade<${name}, ${name}.Encoded, ${name}.Make, ${name}.DecodingServices, ${name}.EncodingServices>()(_${name}) {}` -} - -// If `classText` is a no-statics `export class X extends (S.)Opaque()(STRUCT) {}` -// (empty body), return the private as a plain struct const `const _X = STRUCT` -// (lighter than the Opaque class). Returns null for any body content (statics, -// getters, methods) or non-Opaque bases — those keep the class form. -function tryStructPrivate(classText: string, name: string, indent: string): string | null { - const open = findClassBodyOpen(classText, 0) - if (open === -1) return null - const close = findMatchingBrace(classText, open) - if (close === -1) return null - const body = classText.slice(open + 1, close).replace(/\/\/[^\n]*/g, "").replace(/\/\*[\s\S]*?\*\//g, "").trim() - if (body.length > 0) return null // has statics/getters/methods -> keep class - // Extract STRUCT from `extends (prefix)Opaque()(STRUCT)`. - const m = /\bextends\s+(?:[A-Za-z_$][\w$]*\.)?Opaque\s*<[^(]*>\s*\(\s*\)\s*\(/.exec(classText.slice(0, open)) - if (!m) return null // OpaqueType/OpaqueShape/Class/etc -> keep class form - const argOpen = m.index + m[0].length - 1 // index of the `(` before STRUCT - let depth = 0 - let k = argOpen - for (; k < classText.length; k++) { - if (classText[k] === "(") depth++ - else if (classText[k] === ")") { - depth-- - if (depth === 0) break - } - } - const struct = classText.slice(argOpen + 1, k).trim() - return `${indent}const _${name} = ${struct}` -} - -function syncFacade(source: string, modelNames: ReadonlyArray, enabled: boolean): string { - let out = source - for (const name of modelNames) { - const n = escapeRe(name) - if (enabled) { - // Base mode: the facade is the generated `class __X extends OpaqueFacade<...>()(_X)` - // (owned by its modelFacade block); the user owns `export class X extends __X { ...statics... }`. - // Leave both alone — only the block preset regenerates `__X`. - const baseMode = new RegExp( - `(^|\\n)\\s*class\\s+__${n}\\s+extends\\s+(?:[A-Za-z_$][\\w$]*\\.)?OpaqueFacade(?:Class)?\\s*<` - ) - if (baseMode.test(out)) continue - const existingClass = new RegExp( - `(^|\\n)\\s*export\\s+class\\s+${n}\\s+extends\\s+(?:[A-Za-z_$][\\w$]*\\.)?OpaqueFacade(?:Class)?\\s*<` - ) - const existingConst = new RegExp(`(^|\\n)\\s*export\\s+const\\s+${n}\\s*:\\s*${n}\\.Schema\\s*=`) - if (existingClass.test(out) || existingConst.test(out)) { - // Upgrade a 3-arg facade (``) to the 5-arg form by - // appending the services. Idempotent: when the services are already - // present (group 3), leave the match untouched so we don't collapse a - // dprint-wrapped multi-line declaration back to one line (which would - // oscillate with the formatter forever). - out = out.replace( - new RegExp( - `(OpaqueFacade(?:Class)?<\\s*)${n}(?:\\.Type)?(\\s*,\\s*${n}\\.Encoded\\s*,\\s*${n}\\.Make)((?:\\s*,\\s*${n}\\.DecodingServices\\s*,\\s*${n}\\.EncodingServices)?)(\\s*>)`, - "g" - ), - (match, p1: string, p2: string, services: string, p3: string) => - services ? match : `${p1}${name}${p2}, ${name}.DecodingServices, ${name}.EncodingServices${p3}` - ) - const privateClassRe = new RegExp(`(^|\\n)(\\s*)class\\s+_${n}\\b`) - const privateMatch = privateClassRe.exec(out) - if (privateMatch) { - const start = privateMatch.index + privateMatch[1]!.length - const end = findClassEnd(out, start) - if (end !== -1) { - const pIndent = privateMatch[2]! - const ct = out.slice(start, end) - const replacement = tryStructPrivate(ct, name, pIndent) ?? syncFacadeSourceCtor(ct, name) - out = `${out.slice(0, start)}${replacement}${out.slice(end)}` - } - } - const facadeBlock = new RegExp( - `// codegen:start[^\\n]*\\{[^}]*\\bpreset:\\s*modelFacade\\b[^}]*\\bclassName:\\s*_${n}\\b[^}]*\\}[\\s\\S]*?export\\s+(?:const|class)\\s+${n}\\b` - ) - if (!facadeBlock.test(out)) { - const facadeLine = new RegExp( - `(^|\\n)([ \\t]*)export\\s+const\\s+${n}\\s*:\\s*${n}\\.Schema\\s*=\\s*((?:(?:[A-Za-z_$][\\w$]*\\.)?)OpaqueFacade<\\s*${n}\\s*,\\s*${n}\\.Encoded\\s*,\\s*${n}\\.Make(?:\\s*,\\s*${n}\\.DecodingServices\\s*,\\s*${n}\\.EncodingServices)?\\s*>\\(\\)\\(\\s*_${n}\\s*\\))` - ) - out = out.replace(facadeLine, (_match, lineStart: string, indent: string, expression: string) => { - const prefix = /^((?:[A-Za-z_$][\w$]*\.)?)OpaqueFacade/.exec(expression)?.[1] ?? "" - return [ - `${lineStart}${indent}// codegen:start {preset: modelFacade, className: _${name}${schemaOption(prefix)}}`, - `${indent}${facadeClassLine(name, prefix)}`, - `${indent}// codegen:end` - ] - .join("\n") - }) - } - continue - } - - const classRe = new RegExp(`(^|\\n)(\\s*)export\\s+class\\s+${n}\\b`) - const match = classRe.exec(out) - if (!match) continue - const start = match.index + match[1]!.length - const end = findClassEnd(out, start) - if (end === -1) continue - - const classText = out.slice(start, end) - const indent = match[2]! - const prefix = modelSchemaPrefix(classText) - // No-statics `S.Opaque` model -> emit the private as a plain `S.Struct` const - // (lighter type; ~-14.5% definition instantiations). The facade class still - // wraps it and is constructable (OpaqueFacade uses overloads for class vs struct schemas). - const privateClass = tryStructPrivate(classText, name, indent) ?? syncFacadeSourceCtor( - classText.replace(new RegExp(`^${indent}export\\s+class\\s+${n}\\b`), `${indent}class _${name}`), - name - ) - const facade = [ - `${indent}// codegen:start {preset: modelFacade, className: _${name}${schemaOption(prefix)}}`, - `${indent}${facadeClassLine(name, prefix)}`, - `${indent}// codegen:end` - ] - .join("\n") - out = `${out.slice(0, start)}${privateClass}\n${facade}${out.slice(end)}` - } else { - const classRe = new RegExp(`(^|\\n)(\\s*)class\\s+_${n}\\b`) - const match = classRe.exec(out) - if (!match) continue - const start = match.index + match[1]!.length - const end = findClassEnd(out, start) - if (end === -1) continue - - const classText = out.slice(start, end) - const indent = match[2]! - const exportedClass = classText.replace( - new RegExp(`^${indent}class\\s+_${n}\\b`), - `${indent}export class ${name}` - ) - const facadeRe = new RegExp( - `\\n${indent}(?:// codegen:start[^\\n]*\\{[^}]*\\bpreset:\\s*modelFacade\\b[^}]*\\}\\n)?${indent}export\\s+(?:const\\s+${n}\\s*:\\s*${n}\\.Schema\\s*=\\s*(?:[A-Za-z_$][\\w$]*\\.)?OpaqueFacade<\\s*${n}(?:\\.Type)?\\s*,\\s*${n}\\.Encoded\\s*,\\s*${n}\\.Make(?:\\s*,\\s*${n}\\.DecodingServices\\s*,\\s*${n}\\.EncodingServices)?\\s*>\\(\\)\\(\\s*_${n}\\s*\\)|class\\s+${n}\\s+extends\\s+(?:[A-Za-z_$][\\w$]*\\.)?OpaqueFacade(?:Class)?<\\s*${n}\\s*,\\s*${n}\\.Encoded\\s*,\\s*${n}\\.Make\\s*,\\s*${n}\\.DecodingServices\\s*,\\s*${n}\\.EncodingServices\\s*>\\(\\)\\(\\s*_${n}\\s*\\)\\s*\\{\\})(?:\\n${indent}// codegen:end)?` - ) - out = `${out.slice(0, start)}${exportedClass}${out.slice(end)}`.replace(facadeRe, "") - } - } - return out -} - -function syncModelSource(source: string): string { - // Sync each model's Opaque ctor to the block mode (make → OpaqueShape, type → OpaqueType, - // else plain Opaque). Done outside codegen blocks, on the class declarations. Only for files - // that actually contain a model codegen block, so manual OpaqueType/Shape usage is untouched. - if (modelBlockRe.test(source)) { - const facade = facadeModelBlockRe.test(source) - const mode: CtorMode = staticMakeModelBlockRe.test(source) - ? "make" - : staticTypeModelBlockRe.test(source) - ? "type" - : "plain" - const modelNames = getExportedModelNames(source) - if (facade) { - // Only rewrite Opaque-struct models into facades; leave Class-based models - // as-is so a mixed file still converts the facade-able ones. - return syncFacade(source, getFacadeableModelNames(source), true) - } - return syncCtor(syncFacade(source, modelNames, false), modelNames, mode) - } - return source -} - -function updateFile( - filePath: string, - source: string, - defaults?: CodegenDefaults, - resolver?: ModelTypeResolver -): boolean { - let changed = false - - const synced = syncModelSource(source) - if (synced !== source) { - changed = true - source = synced - } - - const next = source.replace( - blockRe, - (_match, indent: string, rawOptions: string, body: string, endIndent: string) => { - const options = applyDefaults(parseBlockOptions(rawOptions), defaults) - const existingContent = trimTrailingNewline(body) - const generatedContent = trimTrailingNewline( - normaliseGeneratedContent( - options, - filePath, - renderPreset(options, { filename: filePath, existingContent }, source, resolver) - ) - ) - - const nextBody = generatedContent.length > 0 ? `${indentBlock(generatedContent, indent)}\n` : "" - const replacement = `${indent}// codegen:start ${rawOptions}\n${nextBody}${endIndent}// codegen:end` - - if (replacement !== _match) { - changed = true - } - - return replacement - } - ) - - if (next !== source) { - fs.writeFileSync(filePath, next) - } - - return changed -} - -interface ParsedArgs { - files: Array - help: boolean - config?: string - tsconfig?: string - native?: boolean -} - -function parseArgs(args: ReadonlyArray): ParsedArgs { - const files: Array = [] - let config: string | undefined - let tsconfig: string | undefined - // Native (tsgo) is the default resolver; `--legacy` opts back into the classic - // `typescript` Compiler API. `--native` is kept as an accepted no-op. - let native = true - - for (let index = 0; index < args.length; index++) { - const part = args[index]! - if (part === "--help" || part === "-h") { - return { files, help: true } - } - if (part === "--file") { - const next = args[index + 1] - if (!next) { - throw new Error("Missing value for --file") - } - files.push(path.resolve(process.cwd(), next)) - index++ - continue - } - if (part === "--config") { - const next = args[index + 1] - if (!next) { - throw new Error("Missing value for --config") - } - config = next - index++ - continue - } - if (part === "--tsconfig") { - const next = args[index + 1] - if (!next) { - throw new Error("Missing value for --tsconfig") - } - tsconfig = path.resolve(process.cwd(), next) - index++ - continue - } - if (part === "--native") { - native = true - continue - } - if (part === "--legacy" || part === "--classic") { - native = false - continue - } - throw new Error(`Unknown argument: ${part}`) - } - - const result: ParsedArgs = { files, help: false, native } - if (config !== undefined) result.config = config - if (tsconfig !== undefined) result.tsconfig = tsconfig - return result -} - -// A model block requests type-checker-backed literal interfaces via `static: true` -// or a shallow facade. -const staticModelBlockRe = /\/\/ codegen:start[ \t]*\{[^}]*\bpreset:\s*model\b[^}]*\b(?:static|facade):\s*true\b/ - -function defaultFiles(): Array { - return globSync("**/*.{ts,tsx,mts,cts}", { - cwd: process.cwd(), - nodir: true, - ignore: [ - "**/node_modules/**", - "**/dist/**", - "**/build/**", - "**/.git/**" - ] - }) - .map((filePath) => path.resolve(process.cwd(), filePath)) -} - -function findNearestTsconfig(fromDir: string): string | undefined { - let dir = fromDir - for (;;) { - const candidate = path.join(dir, "tsconfig.json") - if (fs.existsSync(candidate)) return candidate - const parent = path.dirname(dir) - if (parent === dir) return undefined - dir = parent - } -} - -function run() { - const { config, files, help, native, tsconfig } = parseArgs(process.argv.slice(2)) - - if (help) { - console.log("Usage: effect-app-codegen [--file ]... [--config ] [--tsconfig ] [--legacy]") - console.log("Runs codegen blocks in the given files, or scans the current working tree when omitted.") - console.log(`Loads ${CONFIG_FILENAMES.join(", ")} from cwd when present; --config overrides.`) - console.log( - "static/facade blocks resolve via the native tsgo fork by default; --legacy uses the classic typescript API." - ) - console.log("--tsconfig enables `static` model blocks (type-checker-backed literal Encoded/Type).") - return - } - - const defaults = loadConfig(process.cwd(), config) - const targetFiles = files.length > 0 ? files : defaultFiles() - const updated: Array = [] - const untouched: Array = [] - - // Build the type resolver lazily, only if some target file requests static model blocks. - const candidateFiles = targetFiles.filter((f) => fs.existsSync(f) && fs.statSync(f).isFile()) - const staticFiles = candidateFiles.filter((f) => staticModelBlockRe.test(fs.readFileSync(f, "utf8"))) - const preSynced = new Set() - for (const filePath of staticFiles) { - const source = fs.readFileSync(filePath, "utf8") - const synced = syncModelSource(source) - if (synced !== source) { - fs.writeFileSync(filePath, synced) - preSynced.add(filePath) - } - } - const tsconfigPath = staticFiles.length > 0 - ? (tsconfig ?? findNearestTsconfig(path.dirname(staticFiles[0]!))) - : undefined - if (staticFiles.length > 0 && !tsconfigPath) { - throw new Error("static model blocks require a tsconfig; pass --tsconfig ") - } - - // Static/facade blocks resolve a model's generated `Encoded`/`Make`/services - // from its NESTED models' generated namespaces. A composite model whose nested - // models are generated in the same run only resolves correctly once those - // namespaces exist, so we iterate until the static files reach a fixed point - // (recreating the resolver each round to pick up freshly-written namespaces). - const updatedSet = new Set() - const MAX_ROUNDS = 5 - let round = 0 - let changedStatic = true - while (round === 0 || (changedStatic && round < MAX_ROUNDS)) { - const firstRound = round === 0 - round++ - changedStatic = false - const resolver: ModelTypeResolver | undefined = tsconfigPath - ? native - ? createNativeModelTypeResolver({ tsconfigPath }) - : createModelTypeResolver({ tsconfigPath, files: staticFiles }) - : undefined - - // First round: process every target (incl. non-static presets). Later rounds: - // only re-resolve static files (the rest are already at a fixed point). - const filesThisRound = firstRound ? targetFiles : staticFiles - for (const filePath of filesThisRound) { - if (!fs.existsSync(filePath) || !fs.statSync(filePath).isFile()) { - throw new Error(`File not found: ${filePath}`) - } - const source = fs.readFileSync(filePath, "utf8") - if (!source.includes("// codegen:start")) continue - if (updateFile(filePath, source, defaults, resolver)) { - updatedSet.add(path.relative(process.cwd(), filePath)) - if (staticFiles.includes(filePath)) changedStatic = true - } else if (firstRound && preSynced.has(filePath)) { - updatedSet.add(path.relative(process.cwd(), filePath)) - } - } - } - for (const f of updatedSet) updated.push(f) - for (const f of targetFiles) { - const rel = path.relative(process.cwd(), f) - if (!updatedSet.has(rel) && fs.existsSync(f) && fs.readFileSync(f, "utf8").includes("// codegen:start")) { - untouched.push(rel) - } - } - - console.log(`codegen: ${updated.length} updated, ${untouched.length} unchanged`) - for (const filePath of updated) { - console.log(`updated ${filePath}`) - } -} - -try { - run() -} catch (error) { - const message = error instanceof Error ? error.message : String(error) - console.error(message) - process.exitCode = 1 -} diff --git a/packages/eslint-codegen-model/src/index.ts b/packages/eslint-codegen-model/src/index.ts deleted file mode 100644 index ffc8f9204..000000000 --- a/packages/eslint-codegen-model/src/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -// codegen:start {preset: barrel, include: ./*/, nodir: false} -export * from "./oxlint/index.ts" -export * from "./presets/index.ts" -// codegen:end diff --git a/packages/eslint-codegen-model/src/js-yaml.d.ts b/packages/eslint-codegen-model/src/js-yaml.d.ts deleted file mode 100644 index 2a5e7b5a3..000000000 --- a/packages/eslint-codegen-model/src/js-yaml.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare module "js-yaml" { - export function load(input: string): unknown -} diff --git a/packages/eslint-codegen-model/src/normalise.ts b/packages/eslint-codegen-model/src/normalise.ts deleted file mode 100644 index 481896edf..000000000 --- a/packages/eslint-codegen-model/src/normalise.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { parseSync } from "oxc-parser" - -function stripNoise(value: unknown): unknown { - if (Array.isArray(value)) { - return value.map(stripNoise) - } - - if (!value || typeof value !== "object") { - return value - } - - const entries = Object.entries(value).filter(([key]) => - key !== "end" - && key !== "loc" - && key !== "range" - && key !== "raw" - && key !== "start" - ) - - return Object.fromEntries(entries.map(([key, child]) => [key, stripNoise(child)])) -} - -export function normaliseModule(code: string, filename: string) { - return JSON.stringify( - stripNoise( - parseSync(filename, code, { - lang: "ts", - preserveParens: false, - sourceType: "module" - }) - .program - ) - ) -} - -export function normaliseModuleForBarrel(code: string, filename: string) { - return normaliseModule(code.replace(/\/index\b/g, ""), filename) -} diff --git a/packages/eslint-codegen-model/src/oxlint/index.ts b/packages/eslint-codegen-model/src/oxlint/index.ts deleted file mode 100644 index 7723d6880..000000000 --- a/packages/eslint-codegen-model/src/oxlint/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import codegenRule from "./rules/codegen.ts" - -export default { - meta: { name: "codegen" }, - rules: { - codegen: codegenRule - } -} diff --git a/packages/eslint-codegen-model/src/oxlint/rules/codegen.ts b/packages/eslint-codegen-model/src/oxlint/rules/codegen.ts deleted file mode 100644 index ba416b6d0..000000000 --- a/packages/eslint-codegen-model/src/oxlint/rules/codegen.ts +++ /dev/null @@ -1,142 +0,0 @@ -import * as fs from "node:fs" -import * as path from "node:path" -// @ts-expect-error oxlint@1.61.0 declares CreateRule but does not export it. -import type { CreateRule } from "oxlint/plugins-dev" -import { applyDefaults, type BlockOptions, blockRe, type CodegenDefaults, indentBlock, normaliseGeneratedContent, parseBlockOptions, renderPreset, trimTrailingNewline } from "../../shared/codegen-block.ts" -import { createNativeModelTypeResolver } from "../../shared/native-type-resolver.ts" -import type { ModelTypeResolver } from "../../shared/type-resolver.ts" - -/** Nearest `tsconfig.json` walking up from `from`, or null. */ -function findNearestTsconfig(from: string): string | null { - let dir = path.dirname(from) - for (;;) { - const candidate = path.join(dir, "tsconfig.json") - if (fs.existsSync(candidate)) return candidate - const parent = path.dirname(dir) - if (parent === dir) return null - dir = parent - } -} - -/** - * Editor/CI type-aware resolver, opt-in via `TSGOLINT_CODEGEN_BIN`. When set, - * the oxlint codegen rule resolves `static`/`facade` model blocks through the - * tsgo fork -- so facade interfaces stay live in the editor without running the - * CLI. Without the env var the rule keeps its text-only behaviour (no checker, - * static/facade blocks left untouched). Cached per tsconfig per process. - */ -const nativeResolvers = new Map() -function nativeResolverFor(filename: string): ModelTypeResolver | undefined { - // Native (tsgo) is the default: the binary ships as the `oxlint-tsgolint` - // drop-in, and the resolver is lazy (no binary work until a static/facade - // block actually calls it). Set `TSGOLINT_CODEGEN_OFF` to fall back to - // text-only (static/facade blocks left untouched). `TSGOLINT_CODEGEN_BIN` - // overrides the binary path. - if (process.env["TSGOLINT_CODEGEN_OFF"]) return undefined - const tsconfigPath = findNearestTsconfig(filename) - if (!tsconfigPath) return undefined - if (!nativeResolvers.has(tsconfigPath)) { - try { - nativeResolvers.set(tsconfigPath, createNativeModelTypeResolver({ tsconfigPath })) - } catch { - nativeResolvers.set(tsconfigPath, null) - } - } - return nativeResolvers.get(tsconfigPath) ?? undefined -} - -type RuleContext = { - sourceCode: { - getText: () => string - } - physicalFilename: string - options: ReadonlyArray - report: (diagnostic: { - node: RuleNode - message: string - fix: (fixer: RuleFixer) => { range: [number, number]; text: string } - }) => void -} - -type RuleNode = { - start: number - end: number - range: [number, number] -} - -type RuleFixer = { - replaceTextRange: (range: [number, number], text: string) => { range: [number, number]; text: string } -} - -const codegenRule: CreateRule = { - meta: { - type: "suggestion", - fixable: "code", - schema: [{ - type: "object", - additionalProperties: { - type: "object", - additionalProperties: true - } - }], - docs: { - description: "Ensure codegen blocks are up to date" - } - }, - create(context: RuleContext) { - const defaults = (context.options[0] ?? undefined) as CodegenDefaults | undefined - return { - Program(program: RuleNode) { - const source = context.sourceCode.getText() - const filename = context.physicalFilename - const resolver = nativeResolverFor(filename) - - // Create a fresh regex instance per Program visit to avoid shared lastIndex state - const re = new RegExp(blockRe.source, blockRe.flags) - let match: RegExpExecArray | null - - while ((match = re.exec(source)) !== null) { - const [fullMatch, indent = "", rawOptions = "", body = "", endIndent = ""] = match - const matchStart = match.index - const matchEnd = match.index + fullMatch.length - - let options: BlockOptions - try { - options = applyDefaults(parseBlockOptions(rawOptions), defaults) - } catch { - continue - } - - const existingContent = trimTrailingNewline(body) - let generatedContent: string - try { - generatedContent = trimTrailingNewline( - normaliseGeneratedContent( - options, - filename, - renderPreset(options, { filename, existingContent }, source, resolver) - ) - ) - } catch { - continue - } - - const nextBody = generatedContent.length > 0 ? `${indentBlock(generatedContent, indent)}\n` : "" - const replacement = `${indent}// codegen:start ${rawOptions}\n${nextBody}${endIndent}// codegen:end` - - if (replacement !== fullMatch) { - context.report({ - node: program, - message: `codegen block with preset "${options.preset}" is stale`, - fix(fixer: RuleFixer) { - return fixer.replaceTextRange([matchStart, matchEnd], replacement) - } - }) - } - } - } - } - } -} - -export default codegenRule diff --git a/packages/eslint-codegen-model/src/presets/barrel.ts b/packages/eslint-codegen-model/src/presets/barrel.ts deleted file mode 100644 index 068caa045..000000000 --- a/packages/eslint-codegen-model/src/presets/barrel.ts +++ /dev/null @@ -1,219 +0,0 @@ -import { globSync } from "glob" -import * as path from "path" -import { normaliseModuleForBarrel } from "../normalise.ts" - -// dprint's default import/export sort: case-insensitive, then case-sensitive as -// a tie-break (uppercase before lowercase). Plain lexicographic, not numeric. -function bySpecifier(a: string, b: string): number { - const la = a.toLowerCase() - const lb = b.toLowerCase() - if (la !== lb) return la < lb ? -1 : 1 - return a < b ? -1 : a > b ? 1 : 0 -} - -type PresetFn> = (args: { - meta: { filename: string; existingContent: string } - options: T -}, context?: unknown) => string - -function last(list: readonly T[]): T | undefined { - return list[list.length - 1] -} - -function splitWords(s: string): string[] { - return s - .replace(/([a-z\d])([A-Z])/g, "$1 $2") - .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2") - .split(/[^a-zA-Z0-9]+/) - .filter((w) => w.length > 0) -} - -function toCamelCase(s: string): string { - return splitWords(s) - .map((word, i) => { - const lower = word.toLowerCase() - return i === 0 ? lower : lower[0]!.toUpperCase() + lower.slice(1) - }) - .join("") -} - -function toPascalCase(s: string): string { - return splitWords(s) - .map((word) => word[0]!.toUpperCase() + word.slice(1).toLowerCase()) - .join("") -} - -/** - * Bundle several modules into a single convenient one. - * - * @example - * // codegen:start {preset: barrel, include: some/path/*.ts, exclude: some/path/*util.ts} - * export * from './some/path/module-a' - * export * from './some/path/module-b' - * export * from './some/path/module-c' - * // codegen:end - * - * @param include - * [optional] If specified, the barrel will only include file paths that match this glob pattern - * @param exclude - * [optional] If specified, the barrel will exclude file paths that match these glob patterns - * @param import - * [optional] If specified, matching files will be imported and re-exported rather than directly exported - * with `export * from './xyz'`. Use `import: star` for `import * as xyz from './xyz'` style imports. - * Use `import: default` for `import xyz from './xyz'` style imports. - * @param export - * [optional] Only valid if the import style has been specified (either `import: star` or `import: default`). - * If specified, matching modules will be bundled into a const or default export based on this name. If set - * to `{name: someName, keys: path}` the relative file paths will be used as keys. Otherwise the file paths - * will be camel-cased to make them valid js identifiers. - * @param importExtension - * [optional] Extension used on the emitted import/export specifiers. Defaults to `.ts`. Set to `.js` (or - * empty string) to emit unsuffixed/TS specifiers. Configurable per block, or globally via the rule option - * `{ barrel: { importExtension: ".js" } }` / `codegen.config.json`. - */ -export const barrel: PresetFn<{ - include?: string - exclude?: string | string[] - import?: "default" | "star" - export?: - | string - | { name: string; keys: "path" | "camelCase" } - | { as: "PascalCase"; postfix?: string } - nodir?: boolean - modulegen?: boolean - importExtension?: string -}> = ({ meta, options: opts }) => { - const cwd = path.dirname(meta.filename) - const nodir = opts.nodir ?? true - const modulegen = opts.modulegen ?? false - const importExt = opts.importExtension ?? ".ts" - - const ext = meta.filename.split(".").slice(-1)[0] - const pattern = opts.include || `*.${ext}` - - const relativeFiles = globSync(pattern, { cwd, nodir, ...(opts.exclude ? { ignore: opts.exclude } : {}) }) - .filter((f) => path.resolve(cwd, f) !== path.resolve(meta.filename)) - .map((f) => `./${f}`.replace(/(\.\/)+\./g, ".")) - .filter((file) => - nodir - ? [".js", ".mjs", ".ts", ".tsx"].includes(path.extname(file)) - : true - ) - .map((f) => { - const isDir = f.endsWith("/") - const cleaned = f.replace(/\.\w+$/, "").replace(/\/$/, "") - return isDir ? `${cleaned}/index` : cleaned - }) - // Match dprint's module-specifier sort so the generated barrel and the - // formatter agree (otherwise lint-fix reorders the exports and codegen then - // flags them as stale). dprint sorts case-insensitively, tie-breaking by the - // original case (uppercase first); it is NOT numeric (`a10` before `a2`). - .sort(bySpecifier) - - let expectedContent: string - - if (opts.import === undefined) { - const exportOpt = opts.export - if ( - typeof exportOpt === "object" - && exportOpt !== null - && "as" in exportOpt - && exportOpt.as === "PascalCase" - ) { - expectedContent = relativeFiles - .map( - (f) => - `export * as ${toPascalCase(last(f.split("/"))!)}${ - "postfix" in exportOpt ? exportOpt.postfix : "" - } from "${f}${importExt}"` - ) - .join("\n") - } else { - expectedContent = relativeFiles.map((f) => `export * from "${f}${importExt}"`).join("\n") - } - } else { - const importPrefix = opts.import === "default" ? "" : "* as " - const rawIdentifiers = relativeFiles.map((f) => ({ - file: f, - identifier: toCamelCase(modulegen ? last(f.split("/"))! : f) - .replace(/^([^a-z])/, "_$1") - .replace(/([\^/])Index$/, "$1") - })) - - const grouped = rawIdentifiers.reduce>>( - (acc, info) => { - ;(acc[info.identifier] ??= []).push(info) - return acc - }, - {} - ) - const withIdentifiers = Object.values(grouped).flatMap((group) => - group.length === 1 - ? group - : group.map((info, i) => ({ ...info, identifier: `${info.identifier}_${i + 1}` })) - ) - - const imports = withIdentifiers - .map((i) => `import ${importPrefix}${i.identifier} from "${i.file}${importExt}"`) - .join("\n") - - const exportOpt = opts.export - const exportProps = modulegen - ? [] - : typeof exportOpt === "object" - && exportOpt !== null - && "keys" in exportOpt - && (exportOpt as { name: string; keys: "path" | "camelCase" }).keys === "path" - ? withIdentifiers.map((i) => `${JSON.stringify(i.file)}: ${i.identifier}`) - : withIdentifiers.map((i) => i.identifier) - - let exportPrefix: string - if (exportOpt === undefined) { - exportPrefix = "export" - } else if (exportOpt === "default") { - exportPrefix = "export default" - } else if (typeof exportOpt === "object" && "name" in exportOpt && exportOpt.name === "default") { - exportPrefix = "export default" - } else if (typeof exportOpt === "string") { - exportPrefix = `export const ${exportOpt} =` - } else if (typeof exportOpt === "object" && "name" in exportOpt) { - exportPrefix = `export const ${exportOpt.name} =` - } else { - exportPrefix = "" - } - - const exports = exportProps.join(",\n ") - - const moduleGen = withIdentifiers - .map((i) => { - const up = `${i.identifier[0]!.toUpperCase()}${i.identifier.slice(1)}` - return `export interface ${up} extends Id {} -export const ${up}: ${up} = ${i.identifier}` - }) - .join("\n") - - const exportss = modulegen ? "" : `\n${exportPrefix} {\n ${exports}\n}` - expectedContent = `${imports}\n${exportss}\n${ - modulegen && moduleGen - ? "type Id = T\n/* eslint-disable @typescript-eslint/no-empty-object-type */\n\n" + moduleGen - : "" - }` - } - - // Fast path: exact match after trimming (avoids AST parse) - if (expectedContent.trim() === meta.existingContent.trim()) { - return meta.existingContent - } - - // Slow path: AST-based comparison (handles /index equivalence etc.) - try { - if ( - normaliseModuleForBarrel(expectedContent, meta.filename) - === normaliseModuleForBarrel(meta.existingContent, meta.filename) - ) { - return meta.existingContent - } - } catch {} - - return expectedContent -} diff --git a/packages/eslint-codegen-model/src/presets/index.ts b/packages/eslint-codegen-model/src/presets/index.ts deleted file mode 100644 index 11f4b7d69..000000000 --- a/packages/eslint-codegen-model/src/presets/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -// codegen:start {preset: barrel, include: ./*.ts} -export * from "./barrel.ts" -export * from "./meta.ts" -export * from "./model-facade.ts" -export * from "./model.ts" -// codegen:end diff --git a/packages/eslint-codegen-model/src/presets/meta.ts b/packages/eslint-codegen-model/src/presets/meta.ts deleted file mode 100644 index dc0dec56e..000000000 --- a/packages/eslint-codegen-model/src/presets/meta.ts +++ /dev/null @@ -1,48 +0,0 @@ -type PresetFn> = (args: { - meta: { filename: string; existingContent: string } - options: T -}, context?: unknown) => string - -type MetaPresetOptions = { - sourcePrefix?: string - stripSuffixes?: ReadonlyArray -} - -const filterAdjacent = (input: string[]) => input.filter((i, idx) => input[idx - 1] !== i) - -const stripConfiguredSuffix = (input: string, suffixes: ReadonlyArray) => { - const match = suffixes.find((_) => input.endsWith(_)) - return match ? input.slice(0, -match.length) : input -} - -const moduleNameFromFilename = (filename: string, sourcePrefix: string, stripSuffixes: ReadonlyArray) => { - const modulePath = stripConfiguredSuffix( - filename - .substring(filename.indexOf(sourcePrefix) + sourcePrefix.length, filename.length - 3) - .split("/") - .join("/"), - stripSuffixes - ) - - return filterAdjacent(modulePath.split("/")) - .filter((_) => _ !== "resources") - .join("/") -} - -/** - * Adds file meta - */ -export const meta: PresetFn = ({ meta, options }) => { - const sourcePrefix = options.sourcePrefix || "src/" - const stripSuffixes = options.stripSuffixes ?? [] - const moduleName = moduleNameFromFilename(meta.filename, sourcePrefix, stripSuffixes) - const expectedContent = `const Req = TaggedRequestFor("${moduleName}")` - - try { - if (expectedContent === meta.existingContent) { - return meta.existingContent - } - } catch {} - - return expectedContent -} diff --git a/packages/eslint-codegen-model/src/presets/model-facade.ts b/packages/eslint-codegen-model/src/presets/model-facade.ts deleted file mode 100644 index f787535b3..000000000 --- a/packages/eslint-codegen-model/src/presets/model-facade.ts +++ /dev/null @@ -1,48 +0,0 @@ -export type ModelFacadeOptions = { - readonly className?: string - readonly name?: string - readonly schema?: string - /** - * Base mode: emit a non-exported base `class __X extends OpaqueFacade<...>()(_X) {}` - * instead of `export class X`. The user owns `export class X extends __X { ...statics... }`, - * so static/instance members live on the public class while `_X` stays a light schema. - */ - readonly base?: boolean -} - -// Whitespace-insensitive equality: the generated class line is long, so dprint wraps the -// `extends OpaqueFacade<...>` type args across multiple lines. Comparing stripped of -// all whitespace lets a dprint-formatted block match the single-line form, so codegen leaves -// it alone instead of reverting it (which would just re-wrap → codegen/dprint oscillation). -const stripWs = (s: string): string => s.replace(/\s+/g, "") - -export function modelFacade( - { meta, options }: { meta?: { existingContent: string }; options: ModelFacadeOptions } -): string { - const className = options.className - if (typeof className !== "string" || className.length === 0) { - return "/** modelFacade requires `className` */" - } - const name = typeof options.name === "string" && options.name.length > 0 - ? options.name - : className.startsWith("_") - ? className.slice(1) - : className - const schema = typeof options.schema === "string" ? options.schema : "S" - const prefix = schema.length > 0 ? `${schema}.` : "" - const lhs = options.base === true ? `class __${name}` : `export class ${name}` - const decl = - `${lhs} extends ${prefix}OpaqueFacade<${name}, ${name}.Encoded, ${name}.Make, ${name}.DecodingServices, ${name}.EncodingServices>()(${className}) {}` - // The exported facade `class ${name}` merges with the generated `export interface ${name}` - // (the top-level instance shape from the `model` facade preset) — that merge is intentional, - // so suppress no-unsafe-declaration-merging. Base mode emits a private `class __${name}` that - // doesn't merge (the user's own `export class ${name} extends __${name}` owns the disable). - const expected = options.base === true - ? decl - : `// eslint-disable-next-line typescript/no-unsafe-declaration-merging\n${decl}` - // Preserve the dprint-formatted block when it's equivalent (see stripWs above). - if (meta && stripWs(meta.existingContent) === stripWs(expected)) { - return meta.existingContent - } - return expected -} diff --git a/packages/eslint-codegen-model/src/presets/model.ts b/packages/eslint-codegen-model/src/presets/model.ts deleted file mode 100644 index bbaa52901..000000000 --- a/packages/eslint-codegen-model/src/presets/model.ts +++ /dev/null @@ -1,194 +0,0 @@ -import * as fs from "fs" -import type { ModelTypeResolver } from "../shared/type-resolver.ts" - -// Detects `export class Foo` whose extends clause contains e.g. `Class { - const result: Array = [] - const add = (name: string) => { - if (!result.includes(name)) result.push(name) - } - const classRe = /(^|\n)\s*export\s+class\s+(\w+)/g - const matches = Array.from(code.matchAll(classRe)) - for (const [index, match] of matches.entries()) { - const name = match[2]! - const start = match.index + match[1]!.length - // Take up to the next `export class` or 500 chars, whichever comes first, - // then trim further to only the extends clause (before the first `{`). - const nextClass = matches[index + 1]?.index - const rawWindow = code.slice(start, nextClass === undefined ? start + 500 : nextClass) - // Only look at the part before the class body opens. - const braceIdx = rawWindow.indexOf("{") - const extendsWindow = braceIdx === -1 ? rawWindow : rawWindow.slice(0, braceIdx) - if ( - baseClassWithEncodedRe.test(extendsWindow) - || (opaqueWithEncodedRe.test(extendsWindow) && !contextOpaqueRe.test(extendsWindow)) - || opaqueFacadeRe.test(extendsWindow) - // base mode: `export class X extends __X` (facade lives on the generated `__X`) - || new RegExp(`extends\\s+__${name}\\b`).test(extendsWindow) - ) { - add(name) - } - } - const facadeRe = /(^|\n)\s*export\s+const\s+(\w+)\s*:\s*\2\.Schema\s*=/g - for (const match of code.matchAll(facadeRe)) { - add(match[2]!) - } - return result -} - -// The extends-clause text of a model's defining class — checks the private `_X` -// (post-rewrite) first, then the exported `X` (pre-rewrite / already-facade). -function modelExtendsWindow(code: string, name: string): string | null { - // `class __X` first: base mode (`export class X extends __X`) where the facade - // lives on the generated base `class __X extends OpaqueFacade<...>()(_X)`. - for (const decl of [`class __${name}`, `class _${name}`, `export class ${name}`, `class ${name}`]) { - const re = new RegExp(`(^|\\n)\\s*${decl.replace(/[$]/g, "\\$&")}\\b`) - const m = re.exec(code) - if (!m) continue - const start = m.index + m[1]!.length - const window = code.slice(start, start + 500) - const braceIdx = window.indexOf("{") - return braceIdx === -1 ? window : window.slice(0, braceIdx) - } - return null -} - -// Models that can be turned into a shallow facade: those whose underlying schema -// is `S.Opaque(...)` (or already an `OpaqueFacade`). `Class`/`TaggedClass`/etc. -// models are nominal (and may carry instance methods) — leave them standard. -export function getFacadeableModelNames(code: string): Array { - return getExportedModelNames(code).filter((name) => { - const w = modelExtendsWindow(code, name) - if (w === null) return false - if (baseClassWithEncodedRe.test(w)) return false - return opaqueFacadeRe.test(w) || (/(?:^|[\s.])Opaque\s*`. Greatly reduces instantiation - * on Encoded-touching consumers. Requires a type resolver (CLI only); without one (e.g. the - * oxlint rule) static blocks are left untouched. - */ - static?: boolean - /** - * With `static`, also emit a literal `Type` interface (decoded side); the class is - * rewritten to `S.OpaqueType` so the instance uses it. - */ - type?: boolean - /** - * With `static`, also emit a literal `Make` interface (make-input side); the class is - * rewritten to `S.OpaqueShape`. Implies `type`. - */ - make?: boolean - /** - * With `static`, emit a shallow exported facade for private model classes. Implies - * `type` and `make`; the CLI rewrites `export class X` into private `class _X` - * plus `export class X extends S.OpaqueFacade()(_X) {}`. - */ - facade?: boolean - /** @deprecated unused */ - writeFullTypes?: boolean -} - -export function model( - { meta, options }: { meta: { filename: string; existingContent: string }; options: ModelOptions }, - context?: unknown, - resolver?: ModelTypeResolver -): string { - try { - const targetContent = typeof context === "string" && context.length > 0 - ? context - : fs.readFileSync(meta.filename).toString() - - const modelNames: Array = [] - const seen = new Set() - for (const modelName of getExportedModelNames(targetContent)) { - if (seen.has(modelName)) continue - seen.add(modelName) - modelNames.push(modelName) - } - - let expectedContent: string - // Any facade option (static/type/make/facade) needs the type checker. Without a - // resolver (e.g. the oxlint rule, no checker) leave the block untouched so we never - // revert CLI-generated static Encoded/Type/Make interfaces to the conditional form. - const needsResolver = !!(options?.static || options?.type || options?.make || options?.facade) - if (needsResolver) { - if (!resolver) { - return meta.existingContent - } - // In facade mode, only Opaque-struct models become facades; Class-based - // models (nominal, may carry methods) keep the standard namespace so a - // mixed file still converts its facade-able models. - const facadeable = options.facade ? new Set(getFacadeableModelNames(targetContent)) : null - const resolveNames = facadeable ? modelNames.filter((n) => facadeable.has(n)) : modelNames - const standardNames = facadeable ? modelNames.filter((n) => !facadeable.has(n)) : [] - const block = resolveNames.length > 0 - ? resolver.generate(meta.filename, resolveNames, { - facade: options.facade ?? false, - make: options.facade || (options.make ?? false), - type: options.facade || options.type || options.make || false - }) - : "" - if (block === null) { - // Could not resolve (file outside program, etc.) — leave existing content. - return meta.existingContent - } - const standardBlock = standardNames - .map((n) => - `export namespace ${n} {\n export interface Encoded extends S.StructNestedEncoded {}\n}` - ) - .join("\n") - expectedContent = ["//", [block, standardBlock].filter((s) => s.length > 0).join("\n"), "//"].join("\n") - } else { - const them = modelNames.map((modelName) => [ - `export namespace ${modelName} {`, - ` export interface Encoded extends S.StructNestedEncoded {}`, - "}" - ]) - expectedContent = ["//", ...them.flat(), "//"].join("\n") - } - - // Fast path: whitespace-normalised comparison (avoids AST parse) - if (normaliseLines(meta.existingContent) === normaliseLines(expectedContent)) { - return meta.existingContent - } - return expectedContent - } catch (e) { - return ( - "/** Got exception: " - + ("stack" in (e as any) ? (e as any).stack : "") - + JSON.stringify(e) - + "*/" - ) - } -} diff --git a/packages/eslint-codegen-model/src/shared/codegen-block.ts b/packages/eslint-codegen-model/src/shared/codegen-block.ts deleted file mode 100644 index cc6e6335b..000000000 --- a/packages/eslint-codegen-model/src/shared/codegen-block.ts +++ /dev/null @@ -1,101 +0,0 @@ -import yaml from "js-yaml" -import { barrel } from "../presets/barrel.ts" -import { meta as metaPreset } from "../presets/meta.ts" -import { modelFacade } from "../presets/model-facade.ts" -import { model } from "../presets/model.ts" -import type { ModelTypeResolver } from "./type-resolver.ts" - -export type CodegenMeta = { - filename: string - existingContent: string -} - -export type BlockOptions = Record & { - preset: string -} - -export const blockRe = /^([ \t]*)\/\/ codegen:start[ \t]*(\{.*\})[ \t]*$\n?([\s\S]*?)^([ \t]*)\/\/ codegen:end[ \t]*$/gm - -const tsSourceRe = /\.[cm]?tsx?$/ -const jsExtRe = /(["'])(\.{1,2}\/[^"']+)\.js\1/g - -export function isRecord(input: unknown): input is Record { - return typeof input === "object" && input !== null && !Array.isArray(input) -} - -export function isBlockOptions(input: unknown): input is BlockOptions { - return isRecord(input) && typeof input["preset"] === "string" -} - -export function parseBlockOptions(input: string): BlockOptions { - const parsed = yaml.load(input) - if (!isBlockOptions(parsed)) { - throw new Error(`Invalid codegen options: ${input}`) - } - return parsed -} - -export function trimTrailingNewline(input: string): string { - return input.endsWith("\n") ? input.slice(0, -1) : input -} - -export function isTypeScriptSource(filePath: string): boolean { - return tsSourceRe.test(filePath) -} - -export function shouldStripJsExtensions(options: BlockOptions, filePath: string): boolean { - return options.preset === "barrel" - && options["jsExtensions"] === false - && isTypeScriptSource(filePath) -} - -export function normaliseGeneratedContent( - options: BlockOptions, - filePath: string, - content: string -): string { - if (!shouldStripJsExtensions(options, filePath)) { - return content - } - return content.replace(jsExtRe, "$1$2$1") -} - -export function indentBlock(content: string, indent: string): string { - if (indent.length === 0) { - return content - } - return content - .split("\n") - .map((line) => line.length === 0 ? line : `${indent}${line}`) - .join("\n") -} - -export type CodegenDefaults = Partial>> - -export function applyDefaults(options: BlockOptions, defaults?: CodegenDefaults): BlockOptions { - if (!defaults) return options - const presetDefaults = defaults[options.preset] - if (!presetDefaults) return options - return { ...presetDefaults, ...options, preset: options.preset } -} - -export function renderPreset( - options: BlockOptions, - meta: CodegenMeta, - fullSource?: string, - resolver?: ModelTypeResolver -): string { - const { preset, ...rest } = options - switch (preset) { - case "barrel": - return barrel({ meta, options: rest as Parameters[0]["options"] }, undefined) - case "meta": - return metaPreset({ meta, options: rest as Parameters[0]["options"] }, undefined) - case "model": - return model({ meta, options: rest as Parameters[0]["options"] }, fullSource, resolver) - case "modelFacade": - return modelFacade({ meta, options: rest as Parameters[0]["options"] }) - default: - throw new Error(`Unknown codegen preset: ${preset}`) - } -} diff --git a/packages/eslint-codegen-model/src/shared/native-type-resolver.ts b/packages/eslint-codegen-model/src/shared/native-type-resolver.ts deleted file mode 100644 index 833bdd45d..000000000 --- a/packages/eslint-codegen-model/src/shared/native-type-resolver.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Native (tsgo-backed) implementation of {@link ModelTypeResolver}. - * - * Where {@link createModelTypeResolver} drives the classic `typescript` Compiler - * API in-process, this resolver shells out to a forked `tsgolint` binary - * (`model-codegen` subcommand) that runs the type query on `typescript-go`. The - * binary builds the program once per invocation and answers a batch of model - * names over a one-shot JSON-on-stdio protocol. - * - * Selected via the CLI `--native` flag; the classic resolver remains the default. - * - * Vertical slice: only the `Encoded` member is ported. For any option that needs - * `Type`/`Make`/services/facade the resolver returns `null`, so the caller falls - * back to leaving the block untouched (same contract as "no resolver"). - */ -import { execFileSync } from "node:child_process" -import { createRequire } from "node:module" -import * as path from "node:path" -import type { ModelTypeResolver, ResolveOptions } from "./type-resolver.ts" - -const require_ = createRequire(import.meta.url) - -/** - * Resolve the forked tsgolint binary (the one that also backs `oxlint - * --type-aware`). Precedence: - * 1. `TSGOLINT_CODEGEN_BIN` (explicit override), - * 2. the `oxlint-tsgolint` package — repo-wide overridden to `repos/tsgolint-fork` - * via pnpm, whose shim extracts and returns the platform binary. - * - * Using the same package as oxlint guarantees one binary serves both the editor - * lint path (`headless`) and model codegen (`model-codegen`). - */ -function resolveBinary(): string { - const fromEnv = process.env["TSGOLINT_CODEGEN_BIN"] - if (fromEnv) return fromEnv - try { - const shimPath = require_.resolve("oxlint-tsgolint/bin/tsgolint.js") - const { ensureBinary } = require_(shimPath) as { ensureBinary: () => string } - return ensureBinary() - } catch (e) { - throw new Error( - `native model codegen: could not resolve the tsgolint-fork binary via oxlint-tsgolint (${ - (e as Error).message - }). Ensure the pnpm override is installed, or set TSGOLINT_CODEGEN_BIN.` - ) - } -} - -interface NativeResponse { - readonly ok: boolean - readonly blocks?: Record - readonly error?: string -} - -export function createNativeModelTypeResolver(args: { - readonly tsconfigPath: string - readonly binary?: string -}): ModelTypeResolver { - const tsconfig = path.resolve(args.tsconfigPath) - - // Resolve (and, on first use, fetch/extract) the binary lazily — only once a - // codegen block actually needs the type checker. Creating a resolver for a - // file that turns out to have no static/facade block costs nothing. Memoized. - let binary: string | undefined - const getBinary = () => (binary ??= args.binary ?? resolveBinary()) - - return { - generate(filename, modelNames, options: ResolveOptions): string | null { - const request = JSON.stringify({ - tsconfig, - fileName: path.resolve(filename), - models: modelNames, - options: { - type: options.type ?? false, - make: options.make ?? false, - facade: options.facade ?? false - } - }) - - let stdout: string - try { - stdout = execFileSync(getBinary(), ["model-codegen"], { - input: request, - encoding: "utf8", - maxBuffer: 64 * 1024 * 1024 - }) - } catch (e) { - const err = e as { stdout?: string } - // The binary still emits a JSON error payload on a non-zero exit. - stdout = err.stdout ?? "" - } - - let parsed: NativeResponse - try { - parsed = JSON.parse(stdout) as NativeResponse - } catch { - return null - } - if (!parsed.ok || !parsed.blocks) return null - - const blocks: Array = [] - for (const name of modelNames) { - const block = parsed.blocks[name] - if (block === undefined) return null - blocks.push(block) - } - return blocks.join("\n") - } - } -} diff --git a/packages/eslint-codegen-model/src/shared/type-resolver.ts b/packages/eslint-codegen-model/src/shared/type-resolver.ts deleted file mode 100644 index 6d8ab54e7..000000000 --- a/packages/eslint-codegen-model/src/shared/type-resolver.ts +++ /dev/null @@ -1,631 +0,0 @@ -/** - * Type-checker-backed resolver for the `model` preset's `static` mode. - * - * The text-only codegen emits `interface Encoded extends StructNestedEncoded` - * — a conditional type that TypeScript re-resolves on first property access, once per - * checker. For large schema trees that is a major instantiation cost (and, under the - * parallel checker pool, a depth-limit trigger). This resolver instead emits the - * *expanded* literal `Encoded` (and optionally `Type`) interface, with nested model - * fields referenced by name (`Item.Encoded`), which TypeScript resolves once and reuses. - * - * It uses the classic `typescript` Compiler API (loaded lazily) so the package's - * text-only path (oxlint rule) never needs a type checker. Only the CLI builds a program. - */ -import { createRequire } from "node:module" -import * as path from "node:path" - -const require_ = createRequire(import.meta.url) - -// `typescript` is an optional peer; only required for static mode (CLI). -type TS = typeof import("typescript") -type Type = import("typescript").Type -type Symbol_ = import("typescript").Symbol -type Node = import("typescript").Node -type TypeChecker = import("typescript").TypeChecker -type Program = import("typescript").Program - -export interface ResolveOptions { - /** Also emit a static `Type` interface (decoded side), enabling `S.OpaqueType`. */ - readonly type?: boolean - /** Also emit a static `Make` interface (make-input side), enabling `S.OpaqueShape`. Implies `type`. */ - readonly make?: boolean - /** Emit a shallow public `Schema` facade and top-level instance interface. Implies `type` and `make`. */ - readonly facade?: boolean -} - -export interface ModelTypeResolver { - /** - * Generate the `export namespace X { export interface Encoded {...} }` blocks for the - * given models in `filename`. Returns the joined block body, or `null` when the file - * is not part of the program / a model can't be resolved. - */ - generate(filename: string, modelNames: ReadonlyArray, options: ResolveOptions): string | null -} - -let tsModule: TS | undefined -function loadTs(): TS { - if (!tsModule) { - try { - tsModule = require_("typescript") as TS - } catch { - throw new Error("static model codegen requires the `typescript` package to be installed") - } - } - return tsModule -} - -function parseTsConfig( - ts: TS, - tsconfigPath: string -): { options: import("typescript").CompilerOptions; fileNames: Array } { - const read = ts.readConfigFile(tsconfigPath, ts.sys.readFile) - if (read.error) { - throw new Error( - `Failed to read tsconfig ${tsconfigPath}: ${ts.flattenDiagnosticMessageText(read.error.messageText, "\n")}` - ) - } - const parsed = ts.parseJsonConfigFileContent(read.config, ts.sys, path.dirname(tsconfigPath)) - // `stableTypeOrdering` makes tsc order union/intersection constituents by a - // structural compare (the same order typescript-go uses), instead of by type - // id (creation/source order). Set it so the classic resolver's output matches - // the native (tsgo) resolver's — no divergence when switching backends. It is - // an internal compiler option (not in the public `CompilerOptions` type). - return { - options: { - ...parsed.options, - noEmit: true, - composite: false, - incremental: false, - skipLibCheck: true, - declaration: false, - stableTypeOrdering: true - } as import("typescript").CompilerOptions, - fileNames: parsed.fileNames - } -} - -export function createModelTypeResolver(args: { - readonly tsconfigPath: string - /** Extra files to include as program roots (the files being codegen'd). */ - readonly files?: ReadonlyArray -}): ModelTypeResolver { - const ts = loadTs() - const { fileNames, options } = parseTsConfig(ts, args.tsconfigPath) - const roots = Array.from(new Set([...fileNames, ...(args.files ?? [])].map((f) => path.resolve(f)))) - - let program: Program | undefined - let checker: TypeChecker | undefined - const getProgram = () => { - if (!program) { - program = ts.createProgram(roots, options) - checker = program.getTypeChecker() - } - return { program: program!, checker: checker! } - } - - return { - generate(filename, modelNames, opts) { - const { program, checker } = getProgram() - const sf = program.getSourceFile(path.resolve(filename)) - if (!sf) return null - - const wanted = new Set(modelNames) - // Name identifier of the schema that backs each model. The private `_X` - // (class `class _X extends S.Opaque(...)` OR const `const _X = S.Struct(...)`, - // the base-mode form) holds the real schema; the exported facade - // `X extends OpaqueFacade` / `extends __X` is - // self-referential and can't resolve `Encoded`/`Type`/`Make`. Prefer `_X`. - const schemaByName = new Map() - const privateNames = new Set() - const consider = (text: string, nameNode: import("typescript").Node) => { - if (text.startsWith("_") && !text.startsWith("__") && wanted.has(text.slice(1))) { - schemaByName.set(text.slice(1), nameNode) - privateNames.add(text.slice(1)) - } else if (wanted.has(text) && !privateNames.has(text)) { - schemaByName.set(text, nameNode) - } - } - sf.forEachChild((n) => { - if (ts.isClassDeclaration(n) && n.name) consider(n.name.text, n.name) - else if (ts.isVariableStatement(n)) { - for (const d of n.declarationList.declarations) { - if (ts.isIdentifier(d.name)) consider(d.name.text, d.name) - } - } - }) - if (schemaByName.size === 0) return null - - const printer = makePrinter(ts, checker, wanted) - const blocks: Array = [] - const facadeType = (body: string) => - body.replace(/\.Type\b/g, "").replace(/\n /g, "\n ").replace(/\n }$/, "\n}") - for (const name of modelNames) { - const nameNode = schemaByName.get(name) - if (!nameNode) return null - const sym = checker.getSymbolAtLocation(nameNode) - if (!sym) return null - const schemaType = checker.getTypeOfSymbolAtLocation(sym, nameNode) - const encoded = printer.member(schemaType, "Encoded", nameNode) - if (encoded === null) return null - const emitType = opts.facade || opts.type || opts.make - const emitMake = opts.facade || opts.make - const lines = opts.facade - ? [] - : [`export namespace ${name} {`, ` export interface Encoded ${encoded}`] - if (emitType) { - const typ = printer.member(schemaType, "Type", nameNode) - if (typ === null) return null - if (opts.facade) { - // Note: instance getters/methods are already included by `member(...)` - // above — an Opaque/Class `Self` is the class instance type, so the - // checker reports getters as properties of `Type`. No re-attach needed. - lines.push(`export interface ${name} ${facadeType(typ)}`) - lines.push(`export namespace ${name} {`) - lines.push(` export interface Encoded ${encoded}`) - } else { - lines.push(` export interface Type ${typ}`) - } - } - if (emitMake) { - const mk = printer.makeMember(schemaType, nameNode) - if (mk === null) return null - // A leading `= ` marks a type-alias emission (e.g. `{...} | void`, which - // an interface can't express); otherwise it's an interface body. - lines.push(mk.startsWith("=") ? ` export type Make ${mk}` : ` export interface Make ${mk}`) - } - if (opts.facade) { - const decodingServices = printer.serviceMember(schemaType, "DecodingServices", nameNode) - const encodingServices = printer.serviceMember(schemaType, "EncodingServices", nameNode) - if (decodingServices === null || encodingServices === null) return null - lines.push(` export type DecodingServices = ${decodingServices}`) - lines.push(` export type EncodingServices = ${encodingServices}`) - } - lines.push("}") - blocks.push(lines.join("\n")) - } - return blocks.join("\n") - } - } -} - -interface SchemaRef { - readonly sym: Symbol_ - /** The exact in-scope reference the author wrote (`X`, `ProcessingStates.X`). */ - readonly name: string -} -interface FieldRef { - readonly refs: ReadonlyArray - wrapper: "" | "nonempty" | "array" - nullable: boolean -} - -function makePrinter(ts: TS, checker: TypeChecker, modelNames: ReadonlySet) { - // Note: deliberately NOT using `InTypeAlias` — that flag expands the alias being - // printed (turning `NonEmptyString255` into `string & ...Brand`). Without it, - // typeToString prefers the named alias symbol when one exists. - const FF = ts.TypeFormatFlags.NoTruncation | ts.TypeFormatFlags.UseFullyQualifiedType - // A field whose printed expansion is this big (or multi-line) is worth replacing - // with a const reference, when one is available. - const FIELD_REDIRECT_LIMIT = 200 - - const skipAlias = (s: Symbol_): Symbol_ => (s.flags & ts.SymbolFlags.Alias) !== 0 ? checker.getAliasedSymbol(s) : s - - // Prefix a model symbol with its enclosing namespace(s): a model `Label` nested in - // `namespace ProcessingStates` is referenced as `ProcessingStates.Label`. Walks up - // namespace/module parents, stopping at the source-file module (a quoted path). - function qualify(sym: Symbol_): string { - let name = sym.name - let p = (sym as Symbol_ & { parent?: Symbol_ }).parent - while (p) { - if ((p.flags & (ts.SymbolFlags.ValueModule | ts.SymbolFlags.NamespaceModule)) === 0) break - if (!p.name || p.name.startsWith("\"") || p.name.startsWith("'")) break - name = `${p.name}.${name}` - p = (p as Symbol_ & { parent?: Symbol_ }).parent - } - return name - } - - // A symbol whose `X.Encoded`/`X.Type` resolves in this file: one of this file's - // models, or any imported class/interface/namespace. - function isModelParent(p: Symbol_): boolean { - if (modelNames.has(p.name)) return true - return (p.flags & (ts.SymbolFlags.Class | ts.SymbolFlags.Interface | ts.SymbolFlags.ValueModule | ts.SymbolFlags.NamespaceModule)) !== 0 - } - - // If `t` is a model's `Encoded` namespace interface -> "Ns.Name.Encoded". - function modelEncodedName(t: Type): string | null { - const sym = (t.aliasSymbol ?? t.symbol) as (Symbol_ & { parent?: Symbol_ }) | undefined - if (!sym || sym.name !== "Encoded" || !sym.parent) return null - if (isModelParent(sym.parent)) return `${qualify(sym.parent)}.Encoded` - return null - } - - // If `t` is a model's instance type -> "Ns.Name.Type". Two shapes occur: - // - Self = the class (before/without the self-rewrite): symbol name === ModelName. - // - Self = `X.Type` (after the self-rewrite): symbol is the `Type` interface, - // name === "Type", parent === ModelName. - function modelTypeName(t: Type): string | null { - const sym = (t.aliasSymbol ?? t.symbol) as (Symbol_ & { parent?: Symbol_ }) | undefined - if (!sym) return null - if (sym.name === "Type" && sym.parent && isModelParent(sym.parent)) return `${qualify(sym.parent)}.Type` - if (modelNames.has(sym.name)) return `${sym.name}.Type` - return null - } - - // An anonymous object literal type (inline struct), as opposed to a named - // interface/class (Date, branded scalars, library types) which we keep by name. - function isAnonymousObject(t: Type): boolean { - if ((t.flags & ts.TypeFlags.Object) === 0) return false - if ((t as import("typescript").ObjectType).objectFlags & ts.ObjectFlags.Anonymous) { - const sym = t.symbol as Symbol_ | undefined - // TypeLiteral / ObjectLiteral symbols are inline; a named interface is not. - return !sym || (sym.flags & (ts.SymbolFlags.TypeLiteral | ts.SymbolFlags.ObjectLiteral)) !== 0 - } - return false - } - - // Wrap a printed element in parens when used as an array/tuple element and it - // contains a top-level union/intersection (precedence). - function asElement(s: string): string { - // Parenthesize unions/intersections AND `readonly`-prefixed elements (nested - // arrays/tuples) so `ReadonlyArray` prints as - // `readonly (readonly [..])[]`, not the invalid `readonly readonly [..][]`. - return /[|&]/.test(s) || s.startsWith("readonly ") ? `(${s})` : s - } - // Parenthesize a reference used as an array element where precedence matters. - const parenElem = (s: string): string => - /[|&]/.test(s) || s.startsWith("typeof ") || s.startsWith("readonly ") ? `(${s})` : s - - // A printed field type large enough to be worth replacing with a const reference: - // a multi-line object expansion, or a long single line (a huge union that would - // otherwise be one formatter-crashing line). - const wouldExpandBig = (printed: string): boolean => printed.includes("\n") || printed.length > FIELD_REDIRECT_LIMIT - - // --- schema-AST capture: recover named references for a field, so a big expansion - // can be replaced by `X.Encoded` / `typeof X.Encoded` / a union/wrapper of those --- - - const PASSTHROUGH = new Set(["withConstructorDefault", "withDefault", "withDecodingDefault", "annotations"]) - const isPassthrough = (n: Node | undefined): boolean => - !!n && ts.isIdentifier(n) && PASSTHROUGH.has(n.text) - - function wrapperKind(name: string): "" | "nonempty" | "array" | "nullor" { - switch (name) { - case "NonEmptyArray": - case "NonEmptyReadonlyArray": - case "NonEmptyChunk": - return "nonempty" - case "Array": - case "ReadonlyArray": - case "Chunk": - return "array" - case "NullOr": - case "NullishOr": - return "nullor" - } - return "" - } - - const calleeName = (e: Node | undefined): string => - !e ? "" : ts.isIdentifier(e) ? e.text : ts.isPropertyAccessExpression(e) ? e.name.text : "" - - // The exact source reference (`X`, `ProcessingStates.X`) of an identifier / property - // access — guaranteed resolvable in the file we emit into. - function nodeRefName(node: Node): string { - if (ts.isIdentifier(node)) return node.text - if (ts.isPropertyAccessExpression(node)) { - const base = nodeRefName(node.expression) - return base ? `${base}.${node.name.text}` : "" - } - return "" - } - - // Resolve an uppercase-named schema const a node refers to; null for method names - // (`withConstructorDefault`) or non-consts (`Struct`). - function resolveConst(node: Node): SchemaRef | null { - let s = checker.getSymbolAtLocation(node) - if (!s) return null - s = skipAlias(s) - if (!s.name || s.name[0]! < "A" || s.name[0]! > "Z") return null - const name = nodeRefName(node) - return name ? { sym: s, name } : null - } - - // Recover named references from a field value: a bare/namespaced identifier, a - // recognised wrapper (`NonEmptyArray(X)`, `NullOr(X)`), a `Union([A, B, …])`, or any - // of those behind a type-preserving accessor (`.withConstructorDefault`). - function fieldRefOf(val: Node): FieldRef | null { - if (ts.isIdentifier(val) || ts.isPropertyAccessExpression(val)) { - const r = resolveConst(val) - if (r) return { refs: [r], wrapper: "", nullable: false } - if (ts.isPropertyAccessExpression(val) && isPassthrough(val.name)) return fieldRefOf(val.expression) - return null - } - if (ts.isCallExpression(val)) { - const callee = val.expression - const name = calleeName(callee) - const args = val.arguments - const wk = wrapperKind(name) - if (wk === "nonempty" || wk === "array") { - if (args.length === 1) { - const inner = fieldRefOf(args[0]!) - if (inner && inner.wrapper === "" && !inner.nullable) { - inner.wrapper = wk - return inner - } - } - return null - } - if (wk === "nullor") { - if (args.length === 1) { - const inner = fieldRefOf(args[0]!) - if (inner && !inner.nullable) { - inner.nullable = true - return inner - } - } - return null - } - const arg0 = args[0] - if (name === "Union" && args.length === 1 && arg0 && ts.isArrayLiteralExpression(arg0)) { - const refs: Array = [] - for (const el of arg0.elements) { - const r = resolveConst(el) - if (!r) return null // a non-const member -> can't name them all - refs.push(r) - } - return refs.length > 0 ? { refs, wrapper: "", nullable: false } : null - } - // fluent method on a schema value: `X.withConstructorDefault(...)` -> receiver - if (ts.isPropertyAccessExpression(callee) && isPassthrough(callee.name)) return fieldRefOf(callee.expression) - } - return null - } - - // Map each field of the model's backing schema to its named reference(s), by walking - // the `_X` declaration's source AST. Follows object spreads (`...projectedFields`) so - // fields merged in by spread are captured too. Robust to `.pipe(encodeKeys/…)`. - function structFieldSymbols(nameNode: Node): Map { - const out = new Map() - const nsym = checker.getSymbolAtLocation(nameNode) - const decl = nsym?.valueDeclaration - if (!decl || !ts.isVariableDeclaration(decl) || !decl.initializer) return out - const visited = new Set() - const walk = (n: Node): void => { - n.forEachChild((c) => { - if (ts.isPropertyAssignment(c)) { - const pn = c.name - const fn = ts.isIdentifier(pn) || ts.isStringLiteral(pn) || ts.isNumericLiteral(pn) ? pn.text : undefined - if (fn !== undefined && c.initializer && !out.has(fn)) { - const ref = fieldRefOf(c.initializer) - if (ref) out.set(fn, ref) - } - } else if (ts.isSpreadAssignment(c) && ts.isIdentifier(c.expression)) { - let s = checker.getSymbolAtLocation(c.expression) - if (s) { - s = skipAlias(s) - if (!visited.has(s) && s.valueDeclaration && ts.isVariableDeclaration(s.valueDeclaration) && s.valueDeclaration.initializer) { - visited.add(s) - walk(s.valueDeclaration.initializer) - } - } - } - walk(c) - return undefined - }) - } - walk(decl.initializer) - return out - } - - // The const-reference fallback chain for one ref (per `key`): - // 1. `X.Encoded` / `X` / `X.Make` when the declaration exists (namespace `Encoded`, - // a `type X` alias / class, namespace `Make`), - // 2. else `typeof X.Encoded` / `typeof X.Type` / `typeof X["~type.make.in"]`. - function constLeaf(r: SchemaRef, key: "Encoded" | "Type" | "Make"): string { - const { name, sym } = r - const exports = (sym as Symbol_ & { exports?: import("typescript").SymbolTable }).exports - switch (key) { - case "Encoded": - if (exports?.has("Encoded" as import("typescript").__String)) return `${name}.Encoded` - return `typeof ${name}.Encoded` - case "Type": - // A class/interface/alias name already denotes the decoded type directly. - if ((sym.flags & (ts.SymbolFlags.TypeAlias | ts.SymbolFlags.Class | ts.SymbolFlags.Interface)) !== 0) return name - return `typeof ${name}.Type` - case "Make": - if (exports?.has("Make" as import("typescript").__String)) return `${name}.Make` - return `typeof ${name}["~type.make.in"]` - } - } - - // Build the reference type for a field backed by named const(s), rebuilding the shape - // (`null | A.Encoded | typeof B.Encoded`, `readonly [X.Encoded, ...]`) around the - // leaves. Returns "" when any leaf isn't nameable. - function fieldConstRef(ref: FieldRef | undefined, key: "Encoded" | "Type" | "Make"): string { - if (!ref || ref.refs.length === 0) return "" - const parts: Array = [] - for (const r of ref.refs) { - const leaf = constLeaf(r, key) - if (!leaf) return "" - parts.push(leaf) - } - let core = parts.join(" | ") - if (ref.wrapper === "nonempty") core = `readonly [${core}, ...${parenElem(core)}[]]` - else if (ref.wrapper === "array") core = `readonly ${parenElem(core)}[]` - if (ref.nullable) core = `null | ${core}` - return core - } - - function print(t: Type, atNode: Node, side: "Encoded" | "Type"): string { - if (side === "Encoded") { - const mn = modelEncodedName(t) - if (mn) return mn - } else { - const mn = modelTypeName(t) - if (mn) return mn - } - // union - if (t.isUnion()) return t.types.map((x) => print(x, atNode, side)).join(" | ") - // tuple (e.g. NonEmptyArray -> readonly [E, ...(E)[]]) - if (checker.isTupleType(t)) { - const target = (t as import("typescript").TupleTypeReference).target - const args = checker.getTypeArguments(t as import("typescript").TypeReference) - const parts = args.map((a, i) => { - const flag = target.elementFlags[i]! - const isRest = (flag & ts.ElementFlags.Rest) !== 0 - const isOpt = (flag & ts.ElementFlags.Optional) !== 0 - const el = print(a, atNode, side) - return isRest ? `...${asElement(el)}[]` : `${el}${isOpt ? "?" : ""}` - }) - return `readonly [${parts.join(", ")}]` - } - // array - if (checker.isArrayType(t)) { - const el = print(checker.getTypeArguments(t as import("typescript").TypeReference)[0]!, atNode, side) - return `readonly ${asElement(el)}[]` - } - // anonymous inline object -> expand structurally; named objects (Date, etc.) by name. - // Multi-line: a deeply-nested inline object on one line can reach 50KB+ and crash the - // formatter; the whitespace-insensitive codegen compare keeps this stable vs dprint. - if (isAnonymousObject(t)) { - const props = t.getProperties() - if (props.length > 0) return expandObject(props, atNode, side) - } - // primitives, literals, branded scalars, named library types, etc. - const printed = checker.typeToString(t, atNode, FF) - // Safety net: a large object dump that `isAnonymousObject` didn't catch — expand it - // structurally so it's multi-line and the formatter can't OOM on a giant single line. - if (printed.length > FIELD_REDIRECT_LIMIT && (t.flags & ts.TypeFlags.Object) !== 0) { - const props = t.getProperties() - if (props.length > 0) return expandObject(props, atNode, side) - } - // On the Type side a branded scalar prints as `string & Ns.FooBrand`; prefer the - // schema's companion type alias `Ns.Foo` (nominal, cheaper, what authors wrote). - if (side === "Type") return namedScalar(printed) - return printed - } - - function expandObject(props: ReadonlyArray, atNode: Node, side: "Encoded" | "Type"): string { - const parts = props.map((p) => { - const pt = checker.getTypeOfSymbolAtLocation(p, atNode) - const opt = (p.flags & ts.SymbolFlags.Optional) !== 0 ? "?" : "" - return `readonly ${propKey(p.name)}${opt}: ${print(pt, atNode, side)}` - }) - return `{\n${parts.join("\n")}\n}` - } - - // ` & Brand` -> `` (the schema's companion scalar type). - function namedScalar(s: string): string { - const m = /^[\w.[\]"'| ]+ & ([\w.$]+)Brand$/.exec(s) - return m ? m[1]! : s - } - - return { - /** - * Non-static instance getters/methods declared on the model class body. They - * live on the runtime `_X` (inherited by the facade `X`) but are not schema - * fields, so they must be re-attached to the generated `Self` interface. - */ - instanceMembers(cls: import("typescript").ClassDeclaration): Array { - const out: Array = [] - for (const m of cls.members) { - const isStatic = (ts.getCombinedModifierFlags(m) & ts.ModifierFlags.Static) !== 0 - if (isStatic || !m.name || !ts.isIdentifier(m.name)) continue - const memberName = m.name.text - if (ts.isGetAccessorDeclaration(m)) { - const t = checker.getTypeAtLocation(m) - out.push(`readonly ${memberName}: ${checker.typeToString(t, m, FF)}`) - } else if (ts.isMethodDeclaration(m)) { - const t = checker.getTypeAtLocation(m) - out.push(`readonly ${memberName}: ${checker.typeToString(t, m, FF)}`) - } - } - return out - }, - - /** Expand the top-level `Encoded`/`Type` interface of `schemaType` one level, nested by name. */ - member(schemaType: Type, key: "Encoded" | "Type", atNode: Node): string | null { - const memberSym = checker.getPropertyOfType(schemaType, key) - if (!memberSym) return null - const memberType = checker.getTypeOfSymbolAtLocation(memberSym, atNode) - const props = memberType.getProperties() - if (props.length === 0) { - // Not an expandable object (e.g. opaque already); fall back to a printed reference. - return `extends ${checker.typeToString(memberType, atNode, FF)} {}` - } - const fieldSyms = structFieldSymbols(atNode) - const body = props - .map((p) => { - const pt = checker.getTypeOfSymbolAtLocation(p, atNode) - const opt = (p.flags & ts.SymbolFlags.Optional) !== 0 ? "?" : "" - // A field that expands big AND is backed by named schema const(s) -> reference - // them (`X.Encoded` / `typeof X.Encoded` / wrapper shape) instead of expanding. - let val = print(pt, atNode, key) - if (wouldExpandBig(val)) { - const ref = fieldConstRef(fieldSyms.get(p.name), key) - if (ref) val = ref - } - return ` readonly ${propKey(p.name)}${opt}: ${val}` - }) - .join("\n") - return `{\n${body}\n }` - }, - - /** - * Expand the `make`-input interface (`~type.make.in`). Keys + optionality come from the - * make-input member (so defaulted fields and `_tag` are optional); each value is the - * Type-side shape with nested model refs rewritten `.Type` -> `.Make`. - */ - makeMember(schemaType: Type, atNode: Node): string | null { - const makeSym = checker.getPropertyOfType(schemaType, "~type.make.in") - const typeSym = checker.getPropertyOfType(schemaType, "Type") - if (!makeSym || !typeSym) return null - const rawMakeType = checker.getTypeOfSymbolAtLocation(makeSym, atNode) - const typeType = checker.getTypeOfSymbolAtLocation(typeSym, atNode) - // `withConstructorDefault` makes the make-input `void | { ...all optional }`. - // The `void` is NOT cosmetic: effect-app's `make`/`makeEffect` key off it to - // make the input argument optional (a no-arg call). So we must preserve it. - // A union has no own properties and `interface Make extends void | {...}` is a - // syntax error, so when `void`/`undefined` is present we emit a TYPE ALIAS - // (`export type Make = { ... } | void`) — signalled by a leading `= `. - const isVoidish = (t: Type) => (t.flags & (ts.TypeFlags.Void | ts.TypeFlags.Undefined)) !== 0 - const hasVoid = rawMakeType.isUnion() && rawMakeType.types.some(isVoidish) - const makeType = rawMakeType.isUnion() - ? (rawMakeType.types.find((t) => t.getProperties().length > 0) ?? rawMakeType) - : rawMakeType - const makeProps = makeType.getProperties() - if (makeProps.length === 0) { - const printed = checker.typeToString(rawMakeType, atNode, FF) - return `= ${printed}` - } - const typeByName = new Map(typeType.getProperties().map((p) => [p.name, p] as const)) - const fieldSyms = structFieldSymbols(atNode) - const body = makeProps - .map((p) => { - const opt = (p.flags & ts.SymbolFlags.Optional) !== 0 ? "?" : "" - const source = typeByName.get(p.name) ?? p - const printed = print(checker.getTypeOfSymbolAtLocation(source, atNode), atNode, "Type") - // nested model `Foo.Type` becomes `Foo.Make`; scalars / Date / primitives untouched. - let value = printed.replace(/\.Type\b/g, ".Make") - if (wouldExpandBig(value)) { - const ref = fieldConstRef(fieldSyms.get(p.name), "Make") - if (ref) value = ref - } - return ` readonly ${propKey(p.name)}${opt}: ${value}` - }) - .join("\n") - // Leading `= ` marks a type-alias emission (model.ts emits `export type Make = ...`). - return hasVoid ? `= {\n${body}\n } | void` : `{\n${body}\n }` - }, - - serviceMember(schemaType: Type, key: "DecodingServices" | "EncodingServices", atNode: Node): string | null { - const memberSym = checker.getPropertyOfType(schemaType, key) - if (!memberSym) return null - return checker.typeToString(checker.getTypeOfSymbolAtLocation(memberSym, atNode), atNode, FF) - } - } - - function propKey(name: string): string { - return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name) ? name : JSON.stringify(name) - } -} diff --git a/packages/eslint-codegen-model/tsconfig.json b/packages/eslint-codegen-model/tsconfig.json deleted file mode 100644 index 83420995f..000000000 --- a/packages/eslint-codegen-model/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./dist", - "tsBuildInfoFile": "./dist/.tsbuildinfo", - "rootDir": "./src", - "target": "ES2018", - "emitDecoratorMetadata": true, - "experimentalDecorators": true - }, - "include": [ - "src/**/*" - ] -} diff --git a/packages/eslint-shared-config/CHANGELOG.md b/packages/eslint-shared-config/CHANGELOG.md deleted file mode 100644 index 83f123d9b..000000000 --- a/packages/eslint-shared-config/CHANGELOG.md +++ /dev/null @@ -1,535 +0,0 @@ -# @effect-app/eslint-shared-config - -## 0.6.0-beta.36 - -### Patch Changes - -- c63c0af: Run configured Effect diagnostics through Oxlint's type-aware lint integration. - - @effect-app/eslint-codegen-model@2.0.0-beta.27 - -## 0.6.0-beta.35 - -### Patch Changes - -- Updated dependencies [a354345] -- Updated dependencies [a69da09] - - @effect-app/eslint-codegen-model@2.0.0-beta.27 - -## 0.6.0-beta.34 - -### Patch Changes - -- Updated dependencies [e71b67a] - - @effect-app/eslint-codegen-model@2.0.0-beta.26 - -## 0.6.0-beta.33 - -### Patch Changes - -- Updated dependencies [21ac90a] -- Updated dependencies [d605f3d] -- Updated dependencies [82655fa] - - @effect-app/eslint-codegen-model@2.0.0-beta.25 - -## 0.6.0-beta.32 - -### Patch Changes - -- Updated dependencies [50b022e] -- Updated dependencies [50b022e] - - @effect-app/eslint-codegen-model@2.0.0-beta.24 - -## 0.6.0-beta.31 - -### Patch Changes - -- 55c6572: update packages -- Updated dependencies [55c6572] - - @effect-app/eslint-codegen-model@2.0.0-beta.23 - -## 0.6.0-beta.30 - -### Patch Changes - -- Updated dependencies [b2e0f62] - - @effect-app/eslint-codegen-model@2.0.0-beta.22 - -## 0.6.0-beta.29 - -### Patch Changes - -- 22be885: Add `stripSuffixes` option to the meta codegen preset and configure `.Queries` stripping in the shared oxlint config. -- Updated dependencies [22be885] - - @effect-app/eslint-codegen-model@2.0.0-beta.21 - -## 0.6.0-beta.28 - -### Patch Changes - -- bogus -- Updated dependencies - - @effect-app/eslint-codegen-model@2.0.0-beta.20 - -## 0.6.0-beta.27 - -### Patch Changes - -- b8b9080: update packages -- Updated dependencies [b8b9080] - - @effect-app/eslint-codegen-model@2.0.0-beta.19 - -## 0.6.0-beta.26 - -### Patch Changes - -- Updated dependencies [34ab818] -- Updated dependencies [ccd4845] - - @effect-app/eslint-codegen-model@2.0.0-beta.18 - -## 0.6.0-beta.25 - -### Patch Changes - -- Updated dependencies [f04327a] - - @effect-app/eslint-codegen-model@2.0.0-beta.17 - -## 0.6.0-beta.24 - -### Patch Changes - -- c991be1: update packages -- Updated dependencies [c991be1] - - @effect-app/eslint-codegen-model@2.0.0-beta.15 - -## 0.6.0-beta.23 - -### Patch Changes - -- Updated dependencies [830e1ce] - - @effect-app/eslint-codegen-model@2.0.0-beta.14 - -## 0.6.0-beta.22 - -### Patch Changes - -- b3ea988: update dprint plugins - - @effect-app/eslint-codegen-model@2.0.0-beta.13 - -## 0.6.0-beta.21 - -### Patch Changes - -- dba5779: namespaces - - @effect-app/eslint-codegen-model@2.0.0-beta.13 - -## 0.6.0-beta.20 - -### Patch Changes - -- Updated dependencies [8c753cb] - - @effect-app/eslint-codegen-model@2.0.0-beta.13 - -## 0.6.0-beta.19 - -### Minor Changes - -- 50ce7e6: Replace typescript-eslint with oxlint-tsgolint for type-aware lint. Drop ESLint entirely from non-vue packages (cli, effect-app, infra) — they now use only `oxlint --type-aware`. Vue packages keep ESLint to run `@effect-app/no-await-effect` (no tsgolint equivalent) via `@typescript-eslint/parser` + `vue-eslint-parser`. - -### Patch Changes - -- 50ce7e6: Cleanup after tsgolint + oxlint-codegen-plugin migration: - - Wire `@effect-app/eslint-codegen-model/oxlint` via `jsPlugins` object form (`{ name: "codegen", specifier: ... }`) so the `codegen/codegen` rule key resolves. - - Drop `eslint-plugin-codegen` dep, patch, and `augmentedConfig` helper — codegen now runs through oxlint. - - Break cyclic workspace dep between `eslint-codegen-model` and `eslint-shared-config`; remove dead `eslint.config.mjs` from `eslint-codegen-model`. - - Switch `@effect-app/vue` to oxlint-only (no `.vue` files in `src`); drop its ESLint config and `eslint-shared-config` devDep. - - Restore `@typescript-eslint` plugin and rules in shared `baseConfig` so inline `eslint-disable @typescript-eslint/...` directives resolve in `@effect-app/vue-components` (the only remaining ESLint consumer, for `.vue` files). - - Add `globals.browser` to `vueConfig` so browser globals (`window`, `console`, `URL`, etc.) resolve. -- Updated dependencies [50ce7e6] - - @effect-app/eslint-codegen-model@2.0.0-beta.12 - -## 0.6.0-beta.18 - -### Patch Changes - -- 16b1cf9: update oxlint rule - - @effect-app/eslint-codegen-model@2.0.0-beta.11 - -## 0.6.0-beta.17 - -### Patch Changes - -- c1e73de: -- Updated dependencies [c1e73de] - - @effect-app/eslint-codegen-model@2.0.0-beta.11 - -## 0.6.0-beta.16 - -### Patch Changes - -- Updated dependencies [6fff09c] - - @effect-app/eslint-codegen-model@2.0.0-beta.10 - -## 0.6.0-beta.15 - -### Patch Changes - -- 16bbd9c: ship shared dprint config and wire oxlint and dprint into package lint scripts - - @effect-app/eslint-codegen-model@2.0.0-beta.9 - -## 0.6.0-beta.14 - -### Patch Changes - -- f58e58a: Add shared oxlintrc.json base config. Consumers extend via `"extends": ["./node_modules/@effect-app/eslint-shared-config/src/oxlintrc.json"]`. Note: oxlint does not merge `ignorePatterns` — repeat the base patterns and add project-specific ones. - - @effect-app/eslint-codegen-model@2.0.0-beta.9 - -## 0.6.0-beta.13 - -### Patch Changes - -- Updated dependencies [25008fb] -- Updated dependencies [77efa95] - - @effect-app/eslint-codegen-model@2.0.0-beta.9 - -## 0.6.0-beta.12 - -### Patch Changes - -- Updated dependencies [025de47] - - @effect-app/eslint-codegen-model@2.0.0-beta.8 - -## 0.6.0-beta.11 - -### Minor Changes - -- 4b91f31: Add oxlint integration: run oxlint before ESLint, with `eslint-plugin-oxlint` disabling ESLint rules already covered by oxlint. Add repo-root `.oxlintrc.json` with shared rule config. Update `lint`/`lint-fix` scripts in cli, effect-app, and infra packages. - -### Patch Changes - -- c3299f7: update packages -- Updated dependencies [c3299f7] - - @effect-app/eslint-codegen-model@2.0.0-beta.7 - -## 0.6.0-beta.10 - -### Minor Changes - -- af43f2f: Add `no-await-effect` lint rule that errors when awaiting Effect, Option, Result, or Fiber values from the effect library. Enabled when type-checked linting is active (`ESLINT_TS=1`). - -### Patch Changes - -- @effect-app/eslint-codegen-model@2.0.0-beta.6 - -## 0.5.7-beta.9 - -### Patch Changes - -- Updated dependencies [3b27909] - - @effect-app/eslint-codegen-model@2.0.0-beta.6 - -## 0.5.7-beta.8 - -### Patch Changes - -- Updated dependencies [3613e87] - - @effect-app/eslint-codegen-model@2.0.0-beta.5 - -## 0.5.7-beta.7 - -### Patch Changes - -- cec026d: update packages -- Updated dependencies [cec026d] - - @effect-app/eslint-codegen-model@2.0.0-beta.4 - -## 0.5.7-beta.6 - -### Patch Changes - -- 784c732: bs - - @effect-app/eslint-codegen-model@2.0.0-beta.3 - -## 0.5.7-beta.5 - -### Patch Changes - -- 68c3ba6: fml - - @effect-app/eslint-codegen-model@2.0.0-beta.3 - -## 0.5.7-beta.5 - -### Patch Changes - -- c82d746: dprint bs - - @effect-app/eslint-codegen-model@2.0.0-beta.3 - -## 0.5.7-beta.4 - -### Patch Changes - -- 10b55ff: update packages -- Updated dependencies [10b55ff] - - @effect-app/eslint-codegen-model@2.0.0-beta.3 - -## 0.5.7-beta.3 - -### Patch Changes - -- c9caa37: pin dprint/formatter - - @effect-app/eslint-codegen-model@2.0.0-beta.2 - -## 0.5.7-beta.2 - -### Patch Changes - -- 01c70d0: update all teh tings -- Updated dependencies [01c70d0] - - @effect-app/eslint-codegen-model@2.0.0-beta.2 - -## 0.5.7-beta.1 - -### Patch Changes - -- 64786af: Beta25 -- Updated dependencies [64786af] - - @effect-app/eslint-codegen-model@2.0.0-beta.1 - -## 0.5.7-beta.0 - -### Patch Changes - -- Updated dependencies [880df28] - - @effect-app/eslint-codegen-model@2.0.0-beta.0 - -## 0.5.6 - -### Patch Changes - -- dcb2df4: bump down formatter - - @effect-app/eslint-codegen-model@1.47.0 - -## 0.5.5 - -### Patch Changes - -- 43334b4: try again -- d315086: patch dprint - - @effect-app/eslint-codegen-model@1.47.0 - -## 0.5.2 - -### Patch Changes - -- 344f332: bump to latest version again - - @effect-app/eslint-codegen-model@1.47.0 - -## 0.5.3 - -### Patch Changes - -- 8adb2df: downgrade dprint plugin - - @effect-app/eslint-codegen-model@1.47.0 - -## 0.5.2 - -### Patch Changes - -- 6a8546b: bump dprint plugin - - @effect-app/eslint-codegen-model@1.47.0 - -## 0.5.1 - -### Patch Changes - -- 2c0dc9d: patch fix? - - @effect-app/eslint-codegen-model@1.47.0 - -## 0.5.0 - -### Minor Changes - -- 1a102e2: update packages - -### Patch Changes - -- Updated dependencies [1a102e2] - - @effect-app/eslint-codegen-model@1.47.0 - -## 0.4.1 - -### Patch Changes - -- 358782e: update packages -- Updated dependencies [358782e] - - @effect-app/eslint-codegen-model@1.46.1 - -## 0.4.0 - -### Minor Changes - -- 07f1de5: update packages and tsconfigs - -### Patch Changes - -- Updated dependencies [07f1de5] - - @effect-app/eslint-codegen-model@1.46.0 - -## 0.3.4 - -### Patch Changes - -- eb86b8e: oops - - @effect-app/eslint-codegen-model@1.45.0 - -## 0.3.3 - -### Patch Changes - -- 46faf2c: update dprint plugin, removing custom hack - - @effect-app/eslint-codegen-model@1.45.0 - -## 0.3.2 - -### Patch Changes - -- m - - @effect-app/eslint-codegen-model@1.45.0 - -## 0.3.2 - -### Patch Changes - -- 6592c9e: improve: turn floating promises to error - - @effect-app/eslint-codegen-model@1.45.0 - -## 0.3.1 - -### Patch Changes - -- 587bc7b: bump patch - - @effect-app/eslint-codegen-model@1.45.0 - -## 0.3.0 - -### Minor Changes - -- b8f5e30: update packages - -### Patch Changes - -- Updated dependencies [b8f5e30] - - @effect-app/eslint-codegen-model@1.45.0 - -## 0.2.1 - -### Patch Changes - -- cec6576: set @typescript-eslint/unbound-method as error (note: it's a type aware rule) - - @effect-app/eslint-codegen-model@1.44.0 - -## 0.2.0 - -### Minor Changes - -- 6d8c512: update packages - -### Patch Changes - -- Updated dependencies [6d8c512] - - @effect-app/eslint-codegen-model@1.44.0 - -## 0.1.1 - -### Patch Changes - -- f5358fe: update plugin - - @effect-app/eslint-codegen-model@1.43.0 - -## 0.1.0 - -### Minor Changes - -- 3d49d81: update packages - -### Patch Changes - -- Updated dependencies [3d49d81] - - @effect-app/eslint-codegen-model@1.43.0 - -## 0.0.13 - -### Patch Changes - -- e366964: 120 line width - - @effect-app/eslint-codegen-model@1.42.3 - -## 0.0.12 - -### Patch Changes - -- 885a76f: enableTS is now defined again - - @effect-app/eslint-codegen-model@1.42.3 - -## 0.0.11 - -### Patch Changes - -- 3454a27: enable projectService only when ENV var is set - - @effect-app/eslint-codegen-model@1.42.3 - -## 0.0.10 - -### Patch Changes - -- 01e379a: always set tsconfigRootDir - - @effect-app/eslint-codegen-model@1.42.3 - -## 0.0.9 - -### Patch Changes - -- d6a394c: fix jsonc-parser - - @effect-app/eslint-codegen-model@1.42.3 - -## 0.0.8 - -### Patch Changes - -- f503246: fix missing dep - - @effect-app/eslint-codegen-model@1.42.3 - -## 0.0.7 - -### Patch Changes - -- 569fec4: trying to have an autonomous shared-config eslint - - @effect-app/eslint-codegen-model@1.42.3 - -## 0.0.6 - -### Patch Changes - -- 41ba3e9: fix publication - - @effect-app/eslint-codegen-model@1.42.3 - -## 0.0.5 - -### Patch Changes - -- 9c1de6c: trying to internally patch benten+2 - - @effect-app/eslint-codegen-model@1.42.3 - -## 0.0.4 - -### Patch Changes - -- f35da3c: porting more to eslint shared config package - - @effect-app/eslint-codegen-model@1.42.3 - -## 0.0.2 - -### Patch Changes - -- 8096576: new eslint shared config package -- Updated dependencies [8096576] - - @effect-app/eslint-codegen-model@1.42.3 diff --git a/packages/eslint-shared-config/package.json b/packages/eslint-shared-config/package.json deleted file mode 100644 index c11b19fec..000000000 --- a/packages/eslint-shared-config/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "@effect-app/eslint-shared-config", - "version": "0.6.0-beta.36", - "description": "Shared flat ESLint base & vue configs for effect-app monorepo", - "license": "MIT", - "private": false, - "type": "module", - "repository": { - "type": "git", - "url": "https://github.com/effect-app/libs.git", - "directory": "packages/eslint-shared-config" - }, - "sideEffects": false, - "scripts": { - "watch": "pnpm build -w", - "build": "echo 'Nothing to build (config only)'", - "pub": "pnpm prepublish && npm publish --access public", - "prepublish": "echo 'No build step for config package'", - "postpublish": "echo 'Published @effect-app/eslint-shared-config'", - "prepack": "echo 'ready'" - }, - "exports": { - "./eslint.base.config": { - "default": "./src/eslint.base.config.mjs" - }, - "./eslint.vue.config": { - "default": "./src/eslint.vue.config.mjs" - }, - "./oxlintrc.json": "./src/oxlintrc.json", - "./dprint.jsonc": "./src/dprint.jsonc" - }, - "dependencies": { - "@effect-app/eslint-codegen-model": "workspace:*", - "oxlint": "1.67.0", - "oxlint-tsgolint": "0.23.0", - "@eslint/js": "10.0.1", - "@eslint/eslintrc": "3.3.5", - "eslint-plugin-import": "2.32.0", - "eslint-plugin-sort-destructure-keys": "3.0.0", - "eslint-plugin-unused-imports": "4.4.1", - "eslint-plugin-formatjs": "6.4.13", - "eslint-plugin-vue": "10.9.1", - "vue-eslint-parser": "10.4.0", - "@typescript-eslint/parser": "8.60.0", - "@typescript-eslint/eslint-plugin": "8.60.0", - "globals": "17.6.0", - "dprint-plugin-malva": "0.16.0", - "dprint-plugin-markup": "0.27.2", - "dprint-plugin-yaml": "0.6.0", - "@dprint/typescript": "0.96.1", - "@dprint/formatter": "~0.5.1", - "jsonc-parser": "3.3.1" - }, - "devDependencies": {}, - "peerDependencies": { - "eslint": "^10.4.1", - "typescript": "~6.0.3" - } -} diff --git a/packages/eslint-shared-config/src/dprint.jsonc b/packages/eslint-shared-config/src/dprint.jsonc deleted file mode 100644 index 6551ad162..000000000 --- a/packages/eslint-shared-config/src/dprint.jsonc +++ /dev/null @@ -1,36 +0,0 @@ -{ - "typescript": { - "indentWidth": 2, - "semiColons": "asi", - "quoteStyle": "alwaysDouble", - "trailingCommas": "never", - "arrowFunction.useParentheses": "force", - "memberExpression.linePerExpression": true, - "binaryExpression.linePerExpression": true, - "importDeclaration.forceSingleLine": true, - "exportDeclaration.forceSingleLine": true, - "lineWidth": 120, - }, - "json": {}, - "markdown": {}, - "toml": {}, - "malva": {}, - "markup": { - "printWidth": 120, - }, - "yaml": {}, - // excludes overwrites (not merges) when extended — consumers must repeat these plus their own entries. - "excludes": [ - "**/node_modules", - "**/*-lock.json", - ], - "plugins": [ - "https://plugins.dprint.dev/typescript-0.95.15.wasm", - "https://plugins.dprint.dev/json-0.21.3.wasm", - "https://plugins.dprint.dev/markdown-0.21.1.wasm", - "https://plugins.dprint.dev/toml-0.7.0.wasm", - "https://plugins.dprint.dev/g-plane/malva-v0.15.3.wasm", - "https://plugins.dprint.dev/g-plane/markup_fmt-v0.27.0.wasm", - "https://plugins.dprint.dev/g-plane/pretty_yaml-v0.6.0.wasm", - ], -} diff --git a/packages/eslint-shared-config/src/eslint.base.config.mjs b/packages/eslint-shared-config/src/eslint.base.config.mjs deleted file mode 100644 index f18c67d48..000000000 --- a/packages/eslint-shared-config/src/eslint.base.config.mjs +++ /dev/null @@ -1,114 +0,0 @@ -// @ts-nocheck -import js from "@eslint/js" -import tsPlugin from "@typescript-eslint/eslint-plugin" -import tsParser from "@typescript-eslint/parser" -import _import from "eslint-plugin-import" -import sortDestructureKeys from "eslint-plugin-sort-destructure-keys" -import unusedImports from "eslint-plugin-unused-imports" -import effectAppPlugin from "./plugin-effect-app.mjs" - -/** - * Minimal ESLint config. Type-aware TS rules and codegen also run via - * `oxlint --type-aware` (powered by tsgolint + the - * `@effect-app/eslint-codegen-model/oxlint` JS plugin) for non-vue packages. - * - * ESLint here is needed for vue packages (oxlint can't lint `.vue` files) and - * runs JS-based plugins (import, unused-imports, sort-destructure-keys), the - * `@typescript-eslint` plugin (so inline `eslint-disable @typescript-eslint/...` - * directives resolve and a small set of type-aware rules run on `.vue` files), - * plus the local `@effect-app/no-await-effect` rule (no tsgolint equivalent). - * Type-aware rules activate when ESLINT_TS=1 (or `forceTS`). - * - * @param {string} dirName - * @param {boolean} [forceTS=false] - * @returns {import("eslint").Linter.FlatConfig[]} - */ -export function baseConfig(dirName, forceTS = false) { - // eslint-disable-next-line no-undef - const enableTS = !!dirName && (forceTS || process.env["ESLINT_TS"]) - return [ - { - ignores: [ - "**/*.js", - "**/*.jsx", - "**/*.d.ts", - "**/node_modules/**", - "vitest.config.ts", - "vitest.config.test.ts", - "vite.config.ts", - "eslint.*.mjs" - ] - }, - js.configs.recommended, - { - name: "base", - files: ["**/*.ts", "**/*.tsx", "**/*.mts", "**/*.cts", "**/*.vue"], - languageOptions: { - parser: tsParser, - parserOptions: { - extraFileExtensions: [".vue"], - tsconfigRootDir: dirName, - ...(enableTS && { - projectService: true - }) - } - }, - linterOptions: { - reportUnusedDisableDirectives: "off" - }, - plugins: { - import: _import, - "sort-destructure-keys": sortDestructureKeys, - "unused-imports": unusedImports, - "@typescript-eslint": tsPlugin, - "@effect-app": effectAppPlugin - }, - rules: { - "no-unexpected-multiline": "off", - "no-unused-vars": "off", - "unused-imports/no-unused-imports": "error", - "unused-imports/no-unused-vars": [ - "warn", - { - "vars": "all", - "varsIgnorePattern": "^_", - "args": "after-used", - "argsIgnorePattern": "^_", - "ignoreRestSiblings": true - } - ], - "sort-destructure-keys/sort-destructure-keys": "error", - "require-yield": "off", - "sort-imports": "off", - "import/first": "error", - "import/newline-after-import": "error", - "import/no-duplicates": ["error", { "prefer-inline": true }], - "import/no-unresolved": "off", - "import/order": "off", - "object-shorthand": "error", - "@typescript-eslint/no-namespace": "off", - "@typescript-eslint/no-unused-vars": "off", - "@typescript-eslint/no-use-before-define": ["warn", { functions: false, classes: true, variables: true }], - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/interface-name-prefix": "off", - "@typescript-eslint/no-empty-object-type": "off", - "@typescript-eslint/consistent-type-imports": ["error", { fixStyle: "inline-type-imports" }], - ...(enableTS && { - "@effect-app/no-await-effect": "error", - "@typescript-eslint/restrict-template-expressions": "warn", - "@typescript-eslint/restrict-plus-operands": "off", - "@typescript-eslint/no-unsafe-assignment": "warn", - "@typescript-eslint/no-unsafe-call": "warn", - "@typescript-eslint/no-unsafe-return": "warn", - "@typescript-eslint/no-unsafe-argument": "warn", - "@typescript-eslint/no-unsafe-member-access": "warn", - "@typescript-eslint/no-misused-promises": "warn", - "@typescript-eslint/unbound-method": "error", - "@typescript-eslint/only-throw-error": "off", - "@typescript-eslint/no-base-to-string": "warn", - "@typescript-eslint/no-floating-promises": "error" - }) - } - } - ] -} diff --git a/packages/eslint-shared-config/src/eslint.vue.config.mjs b/packages/eslint-shared-config/src/eslint.vue.config.mjs deleted file mode 100644 index fddfca4e0..000000000 --- a/packages/eslint-shared-config/src/eslint.vue.config.mjs +++ /dev/null @@ -1,79 +0,0 @@ -import tsParser from "@typescript-eslint/parser" -import formatjs from "eslint-plugin-formatjs" -import pluginVue from "eslint-plugin-vue" -import globals from "globals" -import vueParser from "vue-eslint-parser" -import { baseConfig } from "./eslint.base.config.mjs" -import effectAppPlugin from "./plugin-effect-app.mjs" - -/** - * Vue ESLint config. Most type-aware TS rules are handled by `oxlint --type-aware` - * (powered by tsgolint). ESLint here is retained because oxlint cannot lint - * `.vue` files; it runs `eslint-plugin-vue` for template/SFC checks, `formatjs` - * for ICU messages, and the local `@effect-app/no-await-effect` type-aware rule - * (which has no tsgolint equivalent). `@typescript-eslint/parser` is used as a - * parser so vue-eslint-parser can read ` - ``` - -## 0.3.3 - -### Patch Changes - -- df2e948: Fixes meta.required wrong inheritance and adds at least storybook story, waiting for unit tests - -## 0.3.2 - -### Patch Changes - -- e7c3aff: deep merge default values which comes from persistency wrt tanstack def values - -## 0.3.1 - -### Patch Changes - -- c8e5220: update OmegaForm persistency configuration to use policies array and add query params option - -## 0.3.0 - -### Minor Changes - -- 6f33b83: Enhance OmegaForm functionality with persistency support and improved input handling. Added clear and reset methods to the form API, updated internal input state management, and refined form stories for better demonstration of features. - -## 0.2.8 - -### Patch Changes - -- 7fcd006: feat: add showErrorOn props in OmegaForm Wrapper components, to manage when to show the errors - -## 0.2.7 - -### Patch Changes - -- f7909fc: Explicitly pass down model-value - -## 0.2.6 - -### Patch Changes - -- 34abab7: Changes spread order in OmegaFormVuetify - -## 0.2.5 - -### Patch Changes - -- f6043f4: manually pass clear function - -## 0.2.4 - -### Patch Changes - -- b9efc9f: Moves from custom ui to standard vuetify ui for clearable selects -- 587a06a: Fixes model value reference inside vuetify components - -## 0.2.3 - -### Patch Changes - -- Updated dependencies [d3b05cb] -- Updated dependencies [4627c7b] -- Updated dependencies [1e1f32b] - - effect-app@2.39.1 - - @effect-app/vue@2.40.1 - -## 0.2.2 - -### Patch Changes - -- Updated dependencies [bdc9d5c] - - effect-app@2.39.0 - - @effect-app/vue@2.40.0 - -## 0.2.1 - -### Patch Changes - -- d01c3e9: Manages focus in OmegaInput - -## 0.2.0 - -### Minor Changes - -- 7ac3d9d: Adds checkbox default to OmegaForm - -## 0.1.3 - -### Patch Changes - -- 21b0696: Fix: OmegaInput Attributes spreading - -## 0.1.2 - -### Patch Changes - -- Updated dependencies [8b7fdbe] - - effect-app@2.38.5 - - @effect-app/vue@2.39.9 - -## 0.1.1 - -### Patch Changes - -- b7cfa49: Fixes default styling for reset in select and autocomplete - -## 0.1.0 - -### Minor Changes - -- 98d5344: Enhance OmegaForm components with new input types and improved structure - - Added support to CSS inside JS bundle both for modules than for custom elements - - OmegaFormInput now fully support children as input, so vuetify it's only a default for environments that globally import that library - - Updated OmegaInput.vue to support autocomplete and autocompletemultiple types. - - Refactored OmegaInternalInput.vue to streamline input handling and improve slot usage. - - Modified OmegaErrors.vue to utilize slots for better flexibility in error display. - - Added new types to OmegaFormStuff.ts for enhanced type safety. - - Adjusted Vite configuration to support custom elements in Vue components. - -## 0.0.9 - -### Patch Changes - -- Updated dependencies - - effect-app@2.38.4 - - @effect-app/vue@2.39.8 - -## 0.0.8 - -### Patch Changes - -- Updated dependencies - - effect-app@2.38.3 - - @effect-app/vue@2.39.7 - -## 0.0.7 - -### Patch Changes - -- Updated dependencies [c0ed28a] -- Updated dependencies [0fcab38] - - effect-app@2.38.2 - - @effect-app/vue@2.39.6 - -## 0.0.6 - -### Patch Changes - -- Updated dependencies [cd15a8e] - - effect-app@2.38.1 - - @effect-app/vue@2.39.5 - -## 0.0.5 - -### Patch Changes - -- Updated dependencies [81479bf] - - effect-app@2.38.0 - - @effect-app/vue@2.39.4 - -## 0.0.4 - -### Patch Changes - -- 6e7dc86: add support for textarea and pass attrs to input. - -## 0.0.3 - -### Patch Changes - -- Updated dependencies [7bedb13] - - effect-app@2.37.1 - - @effect-app/vue@2.39.3 - -## 0.0.2 - -### Patch Changes - -- ce0bfca: fix style - -## 0.0.1 - -### Patch Changes - -- c3a730c: initial vue-components diff --git a/packages/vue-components/README.md b/packages/vue-components/README.md deleted file mode 100644 index b7cea449f..000000000 --- a/packages/vue-components/README.md +++ /dev/null @@ -1,233 +0,0 @@ -[![Netlify Status](https://api.netlify.com/api/v1/badges/b1b84831-789e-4629-a9e3-55a36e136653/deploy-status)](https://app.netlify.com/sites/sharp-babbage-154f0a/deploys) - -# Vue Component Library Starter - -> Create your own [Vue 3](https://v3.vuejs.org/) component library with TypeScript, [Vite](https://vitejs.dev) and [VitePress](https://vitepress.vuejs.org/). - -Sooner or later, you will find that creating a component library is much better than having all components inside your app project. A component library force to you remove app specific logic from your components, making it easier to test and reuse them in other apps. - -Once the components are in a library, documentation becomes critical. This starter project includes a documentation app powered by VitePress. It not only documents the usage of the component, but also provides a testing bed during the development of components. See the generated documentation app [here](https://sharp-babbage-154f0a.netlify.com/). - -## Setup - -> When running `docs:dev` for the first time, you may encounter error like `vitepress data not properly injected in app` in your browser. Restart the server and reload the browser. Please refer to [issue #30](https://github.com/wuruoyun/vue-component-lib-starter/issues/30) for more details. - -```bash -# install dependencies -npm install - -# start the doc app with hot reload, great for testing components -npm run docs:dev - -# build the library, available under dist -npm run build - -# build the doc app, available under docs/.vitepress/dist -npm run docs:build - -# preview the doc app locally from docs/.vitepress/dist -npm run docs:serve -``` - -You may use [Netlify](https://www.netlify.com/) to auto build and deploy the doc app like this project does. - -## Develop and test locally - -The best way to develop and test your component is by creating demos in `docs/components/demo` folder, as shown by the example components. - -If you want to test the library in your Vue3 app locally: - -- In the root folder of this library, run `npm link`. This will create a symbolic link to the library. -- In the root folder of your client app, run `npm link my-lib`. This will add the symbolic link to the `node_modules` folder in your client app. -- You can now import `my-lib` in your client app. - -There is no need to add `my-lib` to your client app's dependency in this case. - -If you made changes to the library, you will need to rebuild the library. Your Vue3 app shall hot reload when the building of library is completed. - -## How it works - -### Components - -The library is a [Vue plugin](https://v3.vuejs.org/guide/plugins.html). The `install` function in [index.ts](src/index.ts) registers all components under [components](src/components) to Vue globably. - -The components are also exported by [index.ts](src/index.ts) so that the client app can import them individually and register them locally, instead of using the library as a plugin. This may be a better option if the client app only use a small set of components in your library. - -As there are already many UI component libraries for Vue 3, you may just want to build on top of one of them and create components for your specific needs. The Component B in this starter shows the example of using [PrimeVue](https://www.primefaces.org/primevue/) as the fundation library. However, this means the client app shall also use the same fundation component library as your library does. - -The doc app itself is a client app of the libary, therefore PrimeVue is imported in [docs/.vitepress/theme/index.js](docs/.vitepress/theme/index.js). The configuration in [docs/.vitepress/config.js](docs/.vitepress/config.js) below forces VitePress to resolve these modules with no duplication, avoiding error at runtime, as PrimeVue also has Vue in its dependency. - -```js -module.exports = { - vite: { - resolve: { - dedupe: ["vue", /primevue\/.+/] - } - } -} -``` - -> In [vite.config.ts](vite.config.ts), format 'umd' is not present in `build.lib.formats` option. This is because the PrimeVue components used by this library are externalized, and therefore requiring corresponding options in `rollupOptions.output.globals`. To avoid adding global varaibles for PrimeVue components, 'umd' is removed for simplicity. - -### Utilities and constants - -The library includes example utilities and constants. They are also exported in [index.ts](src/index.ts). The client app may use them as below: - -```js - -``` - -### Styling - -Individual components may have styles defined in its `.vue` file. They will be processed, combined and minified into `dist/style.css`, which is included in the `exports` list in [package.json](package.json). - -If you have library level styles shared by all components in the library, you may add them to [src/assets/main.scss](src/assets/main.scss). This file is imported in [index.ts](src/index.ts), therefore the processed styles are also included into `dist/style.css`. To avoid conflicting with other global styles, consider pre-fixing the class names or wrapping them into a namespace class. - -If you have your own special set of SVG icons, you may create a font file (`.woff` format) using tools like [Icomoon](https://icomoon.io/) or [Fontello](https://fontello.com/). This starter includes an example font file [src/assets/fonts/myfont.woff](src/assets/fonts/myfont.woff) and references it in [src/assets/main.scss](src/assets/main.scss), with utility icon CSS classes. An icon from the font file is used in Component A. Vite will include the font file into the build, see [https://vitejs.dev/guide/assets.html](https://vitejs.dev/guide/assets.html). - -The client app shall import `style.css`, usually in the entry file: - -```js -import "my-lib/dist/style.css" -``` - -### Third-party dependencies - -Third-party libraries used by you library may bloat up the size of your library, if you simply add them to the `dependencies` in [package.json](package.json). - -The following are some strategies to reduce the size of your library: - -#### Externalization - -If you expect the client app of your library may also need the same dependency, you may externalize the dependency. For example, to exclude PrimeVue from your library build artifact, in [vite.config.ts](vite.config.ts), you may have - -```js -module.exports = defineConfig({ - rollupOptions: { - external: ['vue', /primevue\/.+/] - } - } -}) -``` - -The dependency to be externalized may be declared as peer dependency in your library. - -#### Cherry picking - -If you don't expect the client app of your library also needing the same dependency, you may embed cherry-picked functions. For example, to embed the `fill` function of popular library [lodash](https://lodash.com), import the `fill` function like the following: - -```js -import fill from "lodash/fill" -``` - -Even with tree-shaking, the codes being brought into your library may still be large, as the function may have its own dependencies. - -Note that `import { fill } from 'lodash'` or `import _ from 'lodash'` will not work and will embed the whole `lodash` library. - -Finally, if your client app also use `lodash` and you don't want `lodash` to be in both the client app and your libraries, even after cherry-picking, you may consider cherry-picking in component library and re-export them as utils for client to consume, so that the client does not need to depend on `lodash`, therefore avoiding duplication. - -### Type generation - -In [tsconfig.json](tsconfig.json), the following options instructs `tsc` to emit declaration (`.d.ts` files) only, as `vite build` handles the `.js` file generation. The generated `.d.ts` files are sent to `dist/types` folder. - -```json -"compilerOptions": { - "declaration": true, - "emitDeclarationOnly": true, - "declarationDir": "./dist/types" -} -``` - -In [package.json](package.json), the line below locates the generated types for library client. - -```json -"types": "./dist/types/index.d.ts", -``` - -> In [vite.config.ts](vite.config.ts), `build.emptyOutDir` is set to `false` and `rimraf` is used instead to remove the `dist` folder before the build. This is to avoid the `dist/types` folder generated by `tsc` being deleted when running `vite build`. - -### Configuration - -#### TypeScript - -In [tsconfig.json](tsconfig.js), set the following as recommended by Vite (since esbuild is used). However, enableing this option leads to https://github.com/vitejs/vite/issues/5814. The workaround is to also enable `compilerOptions.skipLibCheck`. - -```json -"compilerOptions": { - "isolatedModules": true -} -``` - -In [tsconfig.json](tsconfig.js), set the following to address [Issue #32](https://github.com/wuruoyun/vue-component-lib-starter/issues/32). The solution is from https://github.com/johnsoncodehk/volar/discussions/592. - -```json -"compilerOptions": { - "types": [ - "vite/client" - ] -} -``` - -## v4 Breaking Changes (from v3) - -### 1. Vuetify 4 CSS Reset Removed - -Vuetify 4 removed the aggressive global CSS reset that v3 included (universal `margin: 0; padding: 0`, list/heading/input resets, etc.). If your app relied on these defaults, opt in to the supplemental reset: - -```ts -import "@effect-app/vue-components/reset.css" -``` - -### 2. Nested union `_tag` handling - -`S.TaggedStruct` produces a bare `Literal` AST node, while legacy `S.Struct({ _tag: S.Literal("X") })` produces `Union([Literal("X")])` after `AST.toType`. Both patterns now correctly produce `"select"` metadata thanks to the `unwrapSingleLiteralUnion` helper. A `console.warn` is emitted for the legacy pattern to encourage migration to `TaggedStruct`. - -### 3. `UndefinedOr` defaults include the key with explicit `undefined` - -- **v3**: `defaultsValueFromSchema` skipped keys where the recursive call returned `undefined`, so `UndefinedOr` fields were omitted from the result object entirely. -- **v4**: The key is present in the result with an explicit `undefined` value. - -### 4. `S.optionalKey(X).pipe(S.withDecodingDefault(...))` support - -- **v3**: Not supported. The v3 equivalent `S.optionalWith` encoded defaults inside a `PropertySignatureTransformation`, opaque to AST inspection. -- **v4**: `defaultsValueFromSchema` detects `PropertySignatureTransformation` and extracts defaults, enabling `withDecodingDefault` as a new pattern for declaring field defaults directly on the schema. - -### On Submit event - -The :on-submit event could be tricky in `` component. -This is a prop that is basically a map of Tanstack Form `onSubmit` option and accept a function that return a Promise. If you want to use it as an event, you have to manage the state of loading yourself with `@submit` with a function returning `void` - -E.g. - -to use it as a Promise based Tanstack way: - -```html - -``` - -to use it as an event: - -```html - -``` - -this will give you a type error instead, because `:is-loading` is only accepted in event mode - -```html - -``` diff --git a/packages/vue-components/__tests__/FixedNuxtErrorBoundary.test.ts b/packages/vue-components/__tests__/FixedNuxtErrorBoundary.test.ts deleted file mode 100644 index 2e88b1f55..000000000 --- a/packages/vue-components/__tests__/FixedNuxtErrorBoundary.test.ts +++ /dev/null @@ -1,213 +0,0 @@ -import { mount } from "@vue/test-utils" -import { CauseException } from "effect-app/client" -import * as Cause from "effect/Cause" -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest" -import { defineComponent, h, nextTick, onErrorCaptured, ref } from "vue" -import { createMemoryHistory, createRouter, type Router } from "vue-router" -import FixedNuxtErrorBoundary from "../src/components/FixedNuxtErrorBoundary.vue" - -/** - * Behavior contract of the shared error boundary (extracted from the two - * app-local copies — this pins the "no behavior change" claim of the dedup): - * - a supported error (e.g. thrown in setup) renders the error slot and - * emits "error"; it is NOT reported via captureException - * - an unsupported error (e.g. native event handler) is reported via - * captureException (+ toast when debug) and does NOT take over the page - * - an interrupts-only Effect CauseException is ignored entirely - * - a route change clears the error state - * - scheduleAfterReady defers handling (backend hydration path) - * - enabled=false registers no handler, so errors propagate to the parent - */ - -const noopWarn = () => {} - -// Throws in setup only while `active` is true — a supported error ("setup -// function"), and togglable so the route-change test can stop re-throwing. -const makeThrowingChild = (active: { value: boolean }, err: unknown) => - defineComponent({ - name: "ThrowingChild", - setup() { - if (active.value) throw err - return () => h("div", { id: "child-ok" }, "ok") - } - }) - -// Throws from a native click handler — an unsupported error info. -const ClickThrowChild = defineComponent({ - name: "ClickThrowChild", - setup() { - return () => - h("button", { - id: "boom", - onClick: () => { - throw new Error("click boom") - } - }, "boom") - } -}) - -const makeRouter = () => - createRouter({ - history: createMemoryHistory(), - routes: [ - { path: "/", component: { render: () => null } }, - { path: "/other", component: { render: () => null } } - ] - }) - -describe("FixedNuxtErrorBoundary", () => { - let captureException: ReturnType - let toastError: ReturnType - let router: Router - let warnSpy: ReturnType - - beforeEach(() => { - captureException = vi.fn() - toastError = vi.fn() - router = makeRouter() - warnSpy = vi.spyOn(console, "warn").mockImplementation(noopWarn) - }) - - afterEach(() => { - warnSpy.mockRestore() - }) - - // Mount through a host component that renders the boundary with its slots, - // mirroring real usage (Suspender wraps it). Mounting the boundary directly - // as the test root breaks error propagation into its own onErrorCaptured. - const mountBoundary = ( - child: ReturnType, - props: Record = {} - ) => { - const emitted: Error[] = [] - const Host = defineComponent({ - name: "Host", - setup() { - return () => - h(FixedNuxtErrorBoundary, { - captureException, - toastError, - debug: true, - onError: (e: Error) => emitted.push(e), - ...props - }, { - default: () => h(child), - error: (params: { error: Error; clearError: () => void }) => - h("div", { id: "error-slot" }, params.error.message) - }) - } - }) - const wrapper = mount(Host, { global: { plugins: [router] } }) - return { wrapper, emitted } - } - - it("renders the error slot and emits on a supported (setup) error, without reporting it", async () => { - const active = ref(true) - const { emitted, wrapper } = mountBoundary(makeThrowingChild(active, new Error("setup boom"))) - await nextTick() - - expect(wrapper.find("#error-slot").exists()).toBe(true) - expect(wrapper.find("#error-slot").text()).toBe("setup boom") - expect(emitted).toHaveLength(1) - expect(captureException).not.toHaveBeenCalled() - expect(warnSpy).toHaveBeenCalled() - }) - - it("reports an unsupported (native handler) error via captureException + toast, without taking over the page", async () => { - const { emitted, wrapper } = mountBoundary(ClickThrowChild) - await wrapper.find("#boom").trigger("click") - await nextTick() - - expect(captureException).toHaveBeenCalledTimes(1) - expect(captureException.mock.calls[0][0]).toBeInstanceOf(Error) - expect(toastError).toHaveBeenCalledWith("An unexpected error has occurred: Error: click boom") - expect(wrapper.find("#error-slot").exists()).toBe(false) - expect(emitted).toHaveLength(0) - }) - - it("does not toast an unsupported error when debug is off", async () => { - const { wrapper } = mountBoundary(ClickThrowChild, { debug: false }) - await wrapper.find("#boom").trigger("click") - - expect(captureException).toHaveBeenCalledTimes(1) - expect(toastError).not.toHaveBeenCalled() - }) - - it("ignores an interrupts-only Effect CauseException", async () => { - const interrupted = new CauseException(Cause.interrupt(), "Interrupted") - const { emitted, wrapper } = mountBoundary(makeThrowingChild(ref(true), interrupted)) - await nextTick() - - expect(wrapper.find("#error-slot").exists()).toBe(false) - expect(emitted).toHaveLength(0) - expect(captureException).not.toHaveBeenCalled() - }) - - it("clears the error on route change", async () => { - const active = ref(true) - const { wrapper } = mountBoundary(makeThrowingChild(active, new Error("boom"))) - await nextTick() - expect(wrapper.find("#error-slot").exists()).toBe(true) - - active.value = false - await router.push("/other") - await nextTick() - - expect(wrapper.find("#error-slot").exists()).toBe(false) - expect(wrapper.find("#child-ok").exists()).toBe(true) - }) - - it("defers handling through scheduleAfterReady when provided", async () => { - const queue: (() => void)[] = [] - const { wrapper } = mountBoundary(makeThrowingChild(ref(true), new Error("deferred boom")), { - scheduleAfterReady: (fn: () => void) => queue.push(fn) - }) - await nextTick() - - expect(wrapper.find("#error-slot").exists()).toBe(false) - expect(queue).toHaveLength(1) - - queue.forEach((fn) => fn()) - await nextTick() - expect(wrapper.find("#error-slot").text()).toBe("deferred boom") - }) - - it("calls onHandled after emitting, before rendering the error slot", async () => { - const onHandled = vi.fn() - const { wrapper } = mountBoundary(makeThrowingChild(ref(true), new Error("hooked boom")), { onHandled }) - await nextTick() - - expect(onHandled).toHaveBeenCalledTimes(1) - expect(onHandled.mock.calls[0][0]).toBeInstanceOf(Error) - expect(onHandled.mock.calls[0][2]).toBe("setup function") - expect(wrapper.find("#error-slot").exists()).toBe(true) - }) - - it("registers no handler when enabled is false, letting the error propagate", async () => { - const parentCaught = vi.fn() - const Host = defineComponent({ - name: "Host", - setup() { - onErrorCaptured((err) => { - parentCaught(err) - return false - }) - return () => - h(FixedNuxtErrorBoundary, { - captureException, - toastError, - debug: true, - enabled: false - }, { - default: () => h(makeThrowingChild(ref(true), new Error("escaped boom"))), - error: () => h("div", { id: "error-slot" }) - }) - } - }) - const wrapper = mount(Host, { global: { plugins: [router] } }) - await nextTick() - - expect(parentCaught).toHaveBeenCalledTimes(1) - expect(wrapper.find("#error-slot").exists()).toBe(false) - }) -}) diff --git a/packages/vue-components/__tests__/IntegerValidation.test.ts b/packages/vue-components/__tests__/IntegerValidation.test.ts deleted file mode 100644 index 8ed3d9935..000000000 --- a/packages/vue-components/__tests__/IntegerValidation.test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { generateMetaFromSchema, type NumberFieldMeta, toLocalizedStandardSchemaV1 } from "../src/components/OmegaForm" - -const germanTranslations: Record = { - "validation.integer.expected": "Es wird eine ganze Zahl erwartet, tatsächlich: {actualValue}", - "validation.number.expected": "Es wird eine Zahl erwartet, tatsächlich: {actualValue}", - "validation.empty": "Das Feld darf nicht leer sein" -} - -const germanTrans = (id: string, values?: Record) => { - let text = germanTranslations[id] || id - if (values) { - for (const [k, v] of Object.entries(values)) text = text.replace(`{${k}}`, String(v)) - } - return text -} - -describe("Integer validation with German translations (form-level localized schema)", () => { - it("should generate number metadata with int refinement for S.Int fields", () => { - const TestSchema = S.Struct({ value: S.Int }) - const { meta } = generateMetaFromSchema(TestSchema) - expect(meta.value?.type).toBe("number") - expect((meta.value as NumberFieldMeta).refinement).toBe("int") - }) - - it("shows German error for decimal value at form-level validation", async () => { - const standardSchema = toLocalizedStandardSchemaV1(S.Struct({ value: S.Int }) as any, germanTrans) - const result = await standardSchema["~standard"].validate({ value: 59.5 }) - expect(result.issues).toBeDefined() - const issue = result.issues?.find((i: any) => i.path?.[0] === "value") - expect(issue?.message).toContain("ganze Zahl") - }) - - it("shows German empty message for undefined required int at form-level validation", async () => { - const standardSchema = toLocalizedStandardSchemaV1(S.Struct({ value: S.Int }) as any, germanTrans) - const result = await standardSchema["~standard"].validate({ value: undefined }) - expect(result.issues).toBeDefined() - const issue = result.issues?.find((i: any) => i.path?.[0] === "value") - expect(issue?.message).toBe("Das Feld darf nicht leer sein") - }) - - it("accepts valid integer at form-level validation", async () => { - const standardSchema = toLocalizedStandardSchemaV1(S.Struct({ value: S.Int }) as any, germanTrans) - const result = await standardSchema["~standard"].validate({ value: 59 }) - expect(result.issues).toBeUndefined() - expect("value" in result && (result as any).value).toEqual({ value: 59 }) - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm.test.ts b/packages/vue-components/__tests__/OmegaForm.test.ts deleted file mode 100644 index cc5925957..000000000 --- a/packages/vue-components/__tests__/OmegaForm.test.ts +++ /dev/null @@ -1,205 +0,0 @@ -import { mount } from "@vue/test-utils" -import * as S from "effect-app/Schema" -import { NonEmptyString255 } from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { generateMetaFromSchema, type MetaRecord } from "../src/components/OmegaForm" -import OmegaForm from "./OmegaFormTest.vue" -import OmegaIntlProvider from "./OmegaIntlProvider.vue" - -class kkk extends S.Class("kkk")({ - lll: S.String.pipe(S.check(S.isMinLength(10)), S.check(S.isMaxLength(21))), - mmm: S.Finite.pipe(S.check(S.isBetween({ minimum: 10, maximum: 20 }))) -}) {} - -class bbb extends S.Class("bbb")({ - ccc: S.String.pipe(S.check(S.isMinLength(1)), S.check(S.isMaxLength(2))), - ddd: S.NullOr(S.String.pipe(S.check(S.isMaxLength(3)))), - jjj: S.UndefinedOr(S.String.pipe(S.check(S.isMaxLength(4)))), - nnn: S.Finite.pipe(S.check(S.isBetween({ minimum: 10, maximum: 20 }))), - kkk, - ooo: S.String.pipe(S.check(S.isMinLength(1)), S.check(S.isMaxLength(23))) -}) {} - -describe("OmegaForm", () => { - describe("addRecursiveAnnotations", () => { - it("should properly extract metadata from complex schema", () => { - const testSchema = S.Struct({ - aaa: NonEmptyString255, - bbb: S.NullOr(bbb), - eee: S.Finite.pipe(S.check(S.isBetween({ minimum: 10, maximum: 20 }))), - fff: S.Union([S.Literal("left"), S.Literal("right"), S.Literal("both")]), - zzz: S.NullOr(S.Finite.pipe(S.check(S.isBetween({ minimum: 10, maximum: 20 })))).pipe( - S.annotate({ - message: () => "foobar" - }) - ) - }) - - const expectedMeta = { - aaa: { - maxLength: 255, - minLength: 1, - nullableOrUndefined: false, - required: true, - type: "string" - }, - "bbb.ccc": { - maxLength: 2, - minLength: 1, - nullableOrUndefined: false, - required: true, - type: "string" - }, - "bbb.ddd": { - maxLength: 3, - nullableOrUndefined: "null", - required: false, - type: "string" - }, - "bbb.jjj": { - maxLength: 4, - nullableOrUndefined: "undefined", - required: false, - type: "string" - }, - "bbb.kkk.lll": { - maxLength: 21, - minLength: 10, - nullableOrUndefined: false, - required: true, - type: "string" - }, - "bbb.kkk.mmm": { - maximum: 20, - minimum: 10, - nullableOrUndefined: false, - required: true, - type: "number" - }, - "bbb.nnn": { - maximum: 20, - minimum: 10, - nullableOrUndefined: false, - required: true, - type: "number" - }, - "bbb.ooo": { - maxLength: 23, - minLength: 1, - nullableOrUndefined: false, - required: true, - type: "string" - }, - eee: { - maximum: 20, - minimum: 10, - nullableOrUndefined: false, - required: true, - type: "number" - }, - fff: { - members: ["left", "right", "both"], - - nullableOrUndefined: false, - required: true, - type: "select" - }, - zzz: { - maximum: 20, - minimum: 10, - nullableOrUndefined: "null", - required: false, - type: "number" - } - } - - const result = generateMetaFromSchema(testSchema) - - expect(result).toHaveProperty("schema") - expect(result).toHaveProperty("meta") - - expect(result.schema).toBe(testSchema) - - expect(result.meta).toEqual(expectedMeta) - }) - }) - - describe("generateMetaFromSchema", () => { - it("should generate meta from schema", () => { - const testSchema = S.Struct({ - aaa: S.String, - bbb: S.NullOr( - S.Struct({ - ccc: S.String.pipe(S.check(S.isMinLength(1)), S.check(S.isMaxLength(2))), - ddd: S.NullOr(S.String.pipe(S.check(S.isMaxLength(3)))), - jjj: S.UndefinedOr(S.String.pipe(S.check(S.isMaxLength(4)))), - nnn: S.Finite.pipe(S.check(S.isBetween({ minimum: 10, maximum: 20 }))), - kkk: S.Struct({ - lll: S.String.pipe(S.check(S.isMinLength(10)), S.check(S.isMaxLength(21))), - mmm: S.Finite.pipe(S.check(S.isBetween({ minimum: 10, maximum: 20 }))) - }), - ooo: S.String.pipe(S.check(S.isMinLength(1)), S.check(S.isMaxLength(23))) - }) - ), - eee: S.Finite.pipe(S.check(S.isBetween({ minimum: 10, maximum: 20 }))), - fff: S.Union([S.Literal("left"), S.Literal("right"), S.Literal("both")]), - zzz: S.NullOr(S.Finite.pipe(S.check(S.isBetween({ minimum: 10, maximum: 20 })))) - }) - - const result = generateMetaFromSchema(testSchema) - - // Type check: ensure the meta record has the correct keys - type TestType = typeof testSchema extends S.Codec ? T : never - const meta: MetaRecord = result.meta - - // Value check - expect(meta["aaa"]).toBeDefined() - expect(meta["bbb.ccc"]).toBeDefined() - expect(meta["bbb.kkk.lll"]).toBeDefined() - expect(meta["eee"]).toBeDefined() - expect(meta["fff"]).toBeDefined() - expect(result.schema).toBe(testSchema) - }) - }) -}) - -// Create a wrapper component that includes the OmegaIntlProvider -const OmegaFormWithProvider = { - components: { OmegaForm, OmegaIntlProvider }, - template: ` - - - - ` -} - -describe("OmegaForm UI", () => { - it("renders", () => { - const wrapper = mount(OmegaFormWithProvider) - expect(wrapper.exists()).toBe(true) - }) - - it("should display the sum of first and second inputs", async () => { - const wrapper = mount(OmegaFormWithProvider) - - // Find the input elements - const firstInput = wrapper.find("input[id=\"first\"]") - const secondInput = wrapper.find("input[id=\"second\"]") - - console.log(firstInput) - - // Set values - await firstInput.setValue(10) - await secondInput.setValue(20) - - // Trigger change events - await firstInput.trigger("change") - await secondInput.trigger("change") - - // Get the element showing the sum - const sumElement = wrapper.find("[data-testid=\"valuez\"]") - - // Assert the sum is correct (10 + 20 = 30) - expect(sumElement.text()).toBe("30") - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/CustomFilterFieldSchema.test.ts b/packages/vue-components/__tests__/OmegaForm/CustomFilterFieldSchema.test.ts deleted file mode 100644 index c893d391e..000000000 --- a/packages/vue-components/__tests__/OmegaForm/CustomFilterFieldSchema.test.ts +++ /dev/null @@ -1,37 +0,0 @@ -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { toLocalizedStandardSchemaV1 } from "../../src/components/OmegaForm" - -const identityTrans = (id: string, values?: Record) => { - if (!values) return id - return Object.entries(values).reduce( - (acc, [k, v]) => acc.replaceAll(`{${k}}`, String(v)), - id - ) -} - -const maxLineLengthCheck = (max: number) => - S.makeFilter((value: string) => { - const tooLong = value.split("\n").find((line) => line.length > max) - return tooLong !== undefined ? `Line "${tooLong}" exceeds ${max} chars` : undefined - }) - -describe("OmegaForm form-level schema custom checks", () => { - it("includes custom filter checks in the form-level localized schema", async () => { - const schema = S.Struct({ - height: S.NonEmptyString100.pipe( - S.check(S.isMinLength(10)), - S.check(maxLineLengthCheck(20)) - ) - }) - - const standardSchema = toLocalizedStandardSchemaV1(schema as any, identityTrans) - const invalid = "1234567890\n123456789012345678901" - const result = await standardSchema["~standard"].validate({ height: invalid }) - - expect(result.issues).toBeDefined() - const issue = result.issues?.find((i: any) => i.path?.[0] === "height") - expect(issue).toBeDefined() - expect(issue?.message).toContain("exceeds 20 chars") - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/DateValidation.test.ts b/packages/vue-components/__tests__/OmegaForm/DateValidation.test.ts deleted file mode 100644 index 9d794a84d..000000000 --- a/packages/vue-components/__tests__/OmegaForm/DateValidation.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { mount } from "@vue/test-utils" -import * as S from "effect-app/Schema" -import { describe, expect, it, vi } from "vitest" -import { useOmegaForm } from "../../src/components/OmegaForm" -import OmegaIntlProvider from "../OmegaIntlProvider.vue" - -describe("Date field validation", () => { - it("accepts a raw YYYY-MM-DD string and decodes it to Date on submit", async () => { - let submittedValue: { date: Date } | null = null - - const wrapper = mount({ - components: { - OmegaIntlProvider - }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm( - S.Struct({ - date: S.DateFromString - }), - { - onSubmit: async ({ value }) => { - submittedValue = value - } - } - ) - - return { form } - } - }) - - await wrapper.find("[data-testid='date-input']").setValue("2024-06-01") - await wrapper.find("[data-testid='submit']").trigger("click") - - await vi.waitFor(() => { - expect(submittedValue).not.toBeNull() - }) - - expect(submittedValue?.date).toBeInstanceOf(Date) - expect(submittedValue?.date.toISOString()).toContain("2024-06-01") - expect(wrapper.find("[data-testid='errors']").text()).toBe("[]") - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/DecimalSeparatorInput.test.ts b/packages/vue-components/__tests__/OmegaForm/DecimalSeparatorInput.test.ts deleted file mode 100644 index 9b2d7045c..000000000 --- a/packages/vue-components/__tests__/OmegaForm/DecimalSeparatorInput.test.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { describe, expect, it } from "vitest" -import { handleDecimalSeparatorBeforeinput } from "../../src/components/OmegaForm/decimalSeparatorInput" - -// Simulates typing into a VNumberInput: the handler is attached in capture -// phase on the component root, the native input is the event target. -const setup = ( - value: string, - separator: string, - cursor?: { start: number; end: number } -) => { - const root = document.createElement("div") - const input = document.createElement("input") - root.appendChild(input) - document.body.appendChild(root) - input.value = value - const start = cursor?.start ?? value.length - const end = cursor?.end ?? value.length - input.setSelectionRange(start, end) - - let vuetifySawBeforeinput = false - let inputEventFired = false - input.addEventListener("beforeinput", () => { - vuetifySawBeforeinput = true - }) - input.addEventListener("input", () => { - inputEventFired = true - }) - root.addEventListener( - "beforeinput", - (e) => handleDecimalSeparatorBeforeinput(e, separator), - { capture: true } - ) - - const type = (data: string) => { - const e = new InputEvent("beforeinput", { - data, - inputType: "insertText", - bubbles: true, - cancelable: true - }) - input.dispatchEvent(e) - return e - } - - return { - input, - type, - sawVuetifyHandler: () => vuetifySawBeforeinput, - sawInputEvent: () => inputEventFired - } -} - -describe("handleDecimalSeparatorBeforeinput", () => { - it("translates '.' into ',' when the active separator is ','", () => { - const t = setup("1", ",") - const e = t.type(".") - expect(e.defaultPrevented).toBe(true) - expect(t.sawVuetifyHandler()).toBe(false) - expect(t.input.value).toBe("1,") - expect(t.sawInputEvent()).toBe(true) - }) - - it("translates ',' into '.' when the active separator is '.'", () => { - const t = setup("1", ".") - t.type(",") - expect(t.input.value).toBe("1.") - }) - - it("translates both '.' and ',' when the active separator is a custom one", () => { - const dot = setup("1", "٫") - dot.type(".") - expect(dot.input.value).toBe("1٫") - - const comma = setup("2", "٫") - comma.type(",") - expect(comma.input.value).toBe("2٫") - }) - - it("leaves the event alone when the typed char is the active separator", () => { - const t = setup("1", ",") - const e = t.type(",") - expect(e.defaultPrevented).toBe(false) - expect(t.sawVuetifyHandler()).toBe(true) - expect(t.input.value).toBe("1") - }) - - it("leaves plain digits alone", () => { - const t = setup("1", ",") - const e = t.type("5") - expect(e.defaultPrevented).toBe(false) - expect(t.sawVuetifyHandler()).toBe(true) - }) - - it("swallows the wrong separator when the value already has one", () => { - const t = setup("1,5", ",") - const e = t.type(".") - expect(e.defaultPrevented).toBe(true) - expect(t.input.value).toBe("1,5") - expect(t.sawInputEvent()).toBe(false) - }) - - it("inserts at the cursor position and replaces the selection", () => { - const t = setup("15", ",", { start: 1, end: 1 }) - t.type(".") - expect(t.input.value).toBe("1,5") - expect(t.input.selectionStart).toBe(2) - expect(t.input.selectionEnd).toBe(2) - }) - - it("normalizes the wrong separator inside pasted data", () => { - const t = setup("", ",") - t.type("1.5") - expect(t.input.value).toBe("1,5") - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/DecodeTransformFallback.test.ts b/packages/vue-components/__tests__/OmegaForm/DecodeTransformFallback.test.ts deleted file mode 100644 index 3abd2812c..000000000 --- a/packages/vue-components/__tests__/OmegaForm/DecodeTransformFallback.test.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { mount } from "@vue/test-utils" -import * as S from "effect-app/Schema" -import * as SchemaGetter from "effect/SchemaGetter" -import { describe, expect, it } from "vitest" -import { createUseFormWithCustomInput, generateMetaFromSchema, type NumberFieldMeta, useOmegaForm } from "../../src/components/OmegaForm" -import OmegaIntlProvider from "../OmegaIntlProvider.vue" - -const CustomNumberInput = { - template: ` -
- - {{ inputProps.errorMessages.join(', ') }} -
- `, - props: ["inputProps", "field"], - inheritAttrs: false -} - -describe("OmegaForm decodeTo fallback transform", () => { - const inputSchema = S.Struct({ amount: S.PositiveInt }) - - const transformedSchema = S.Struct({ amount: S.NonNegativeInt }).pipe( - S.decodeTo(inputSchema, { - decode: SchemaGetter.transform((input: { amount: number }) => input.amount === 0 ? { amount: 666 } : input), - encode: SchemaGetter.passthrough({ strict: false }) - }) - ) - - const createWrapper = (defaultValues: { amount: number }) => { - let submittedValue: any = null - - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(transformedSchema, { - defaultValues, - onSubmit: async ({ value }) => { - submittedValue = value - } - }) - return { form, getSubmittedValue: () => submittedValue } - } - }) - - return wrapper - } - - it("should accept 0 at the input boundary and pass 666 to onSubmit via decode", async () => { - const wrapper = createWrapper({ amount: 0 }) - await wrapper.vm.$nextTick() - - await wrapper.find("[data-testid=\"submit\"]").trigger("click") - await wrapper.vm.$nextTick() - await new Promise((resolve) => setTimeout(resolve, 100)) - - const vm = wrapper.vm as any - expect(vm.getSubmittedValue()).toEqual({ amount: 666 }) - }) - - it("should pass through a positive amount unchanged", async () => { - const wrapper = createWrapper({ amount: 5 }) - await wrapper.vm.$nextTick() - - await wrapper.find("[data-testid=\"submit\"]").trigger("click") - await wrapper.vm.$nextTick() - await new Promise((resolve) => setTimeout(resolve, 100)) - - const vm = wrapper.vm as any - expect(vm.getSubmittedValue()).toEqual({ amount: 5 }) - }) - - it("meta extraction should reflect the outer (source) schema, not the inner decoded one", () => { - const { meta } = generateMetaFromSchema(transformedSchema) - const amount = meta.amount as NumberFieldMeta | undefined - - expect(amount).toBeDefined() - expect(amount!.type).toBe("number") - expect(amount!.refinement).toBe("int") - // NonNegativeInt ⇒ minimum: 0 (not exclusiveMinimum: 0 from PositiveInt) - expect(amount!.minimum).toBe(0) - expect(amount!.exclusiveMinimum).toBeUndefined() - }) - - it("should allow 0 typed into form.Input and submit with 666 via decode", async () => { - const useForm = createUseFormWithCustomInput(CustomNumberInput) - let submittedValue: any = null - - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useForm(transformedSchema, { - defaultValues: { amount: 1 }, - onSubmit: async ({ value }) => { - submittedValue = value - } - }) - return { form, getSubmittedValue: () => submittedValue } - } - }, { - global: { stubs: { CustomNumberInput } } - }) - - await wrapper.vm.$nextTick() - - const input = wrapper.find("[data-testid=\"custom-input-field\"]") - await input.setValue("0") - await wrapper.vm.$nextTick() - - expect(wrapper.find("[data-testid=\"custom-input-error\"]").exists()).toBe(false) - - await wrapper.find("[data-testid=\"submit\"]").trigger("click") - await wrapper.vm.$nextTick() - await new Promise((resolve) => setTimeout(resolve, 100)) - - const vm = wrapper.vm as any - expect(vm.getSubmittedValue()).toEqual({ amount: 666 }) - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/DefaultValuesPriority.test.ts b/packages/vue-components/__tests__/OmegaForm/DefaultValuesPriority.test.ts deleted file mode 100644 index cce2d6ff4..000000000 --- a/packages/vue-components/__tests__/OmegaForm/DefaultValuesPriority.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -// __tests__/OmegaForm/DefaultValuesPriority.test.ts -import { describe, expect, it } from "vitest" -import { deepMerge } from "../../src/components/OmegaForm" - -describe("deepMerge", () => { - it("treats arrays as values, not as merged structures", () => { - expect(deepMerge({ xs: [1, 2, 3] }, { xs: [9] })).toEqual({ xs: [9] }) - }) - - it("recursively merges objects", () => { - expect(deepMerge({ a: { b: 1, c: 2 } }, { a: { c: 9, d: 3 } })) - .toEqual({ a: { b: 1, c: 9, d: 3 } }) - }) - - it("source wins for primitives", () => { - expect(deepMerge({ x: 1 }, { x: 2 })).toEqual({ x: 2 }) - }) -}) - -// NOTE: defaultValuesPriority resolution lives inside useOmegaForm's -// `defaultValues` computed and isn't exported. A behavioral test would mount -// a form. The deepMerge unit tests above pin the merge mechanic; the priority -// resolution itself is exercised indirectly by the Meta and Defaults stories. diff --git a/packages/vue-components/__tests__/OmegaForm/Defaults.test.ts b/packages/vue-components/__tests__/OmegaForm/Defaults.test.ts deleted file mode 100644 index 320d85dcd..000000000 --- a/packages/vue-components/__tests__/OmegaForm/Defaults.test.ts +++ /dev/null @@ -1,551 +0,0 @@ -import { mount } from "@vue/test-utils" -import * as Effect from "effect-app/Effect" -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { useOmegaForm } from "../../src/components/OmegaForm" -import OmegaIntlProvider from "../OmegaIntlProvider.vue" - -describe("OmegaForm Defaults", () => { - // Setup the same schemas as in Defaults.vue story - const struct = { - a: S.NonEmptyString.pipe(S.withConstructorDefault(Effect.succeed(S.NonEmptyString("default")))), - b: S.NonEmptyString, - c: S.NonEmptyArray(S.String).pipe( - S.withConstructorDefault(Effect.sync(() => [S.NonEmptyString("C"), S.NonEmptyString("Non Empty Array")])) - ), - d: S - .NonEmptyArray(S.Struct({ - e: S.NonEmptyString - })) - .pipe( - S.withConstructorDefault(Effect.sync(() => [{ e: S.NonEmptyString("default") }])) - ), - f: S.Union([ - S.Struct({ - _tag: S.Literal("taggo1").pipe(S.withConstructorDefault(Effect.succeed("taggo1"))), - g: S.NonEmptyString.pipe(S.withConstructorDefault(Effect.succeed(S.NonEmptyString("default")))), - i: S.NonEmptyString.pipe(S.withConstructorDefault(Effect.succeed(S.NonEmptyString("default")))) - }), - S.Struct({ - _tag: S.Literal("taggo2").pipe(S.withConstructorDefault(Effect.succeed("taggo2"))), - h: S.NonEmptyString.pipe(S.withConstructorDefault(Effect.succeed(S.NonEmptyString("default")))), - i: S.NonEmptyString.pipe(S.withConstructorDefault(Effect.succeed(S.NonEmptyString("default")))) - }) - ]), - j: S.Finite.pipe(S.withConstructorDefault(Effect.succeed(0))), - k: S.Boolean.pipe(S.withConstructorDefault(Effect.succeed(true))), - l: S.NullOr( - S.Union([ - S.Struct({ - a: S.NonEmptyString255, - common: S.NonEmptyString255, - _tag: S.Literal("A") - }), - S.Struct({ - b: S.NonEmptyString255, - common: S.NonEmptyString255, - _tag: S.Literal("B") - }) - ]) - ), - m: S.Struct({ - n: S.NullOr(S.Struct({ q: S.String })), - o: S.UndefinedOr(S.Struct({ q: S.String })) - }), - p: S.NullOr(S.Struct({ z: S.String })), - q: S.UndefinedOr(S.Struct({ z: S.String })), - r: S - .NullOr(S.Struct({ - p: S.NullOr(S.Struct({ z: S.String })), - r: S.UndefinedOr(S.Struct({ z: S.String })) - })) - .withConstructorDefault, - s: S.NullOr(S.Struct({ z: S.String })).withConstructorDefault, - t: S.FiniteFromString.pipe(S.withConstructorDefault(Effect.succeed(1000))), - u: S.NullOr(S.NonEmptyString), - v: S.UndefinedOr(S.NonEmptyString) - } - - class ClassSchema extends S.Class("ClassSchema")(struct) {} - const schema = S.Struct(struct) - - const Union = S.Union([ - S.Struct({ - _tag: S.Literal("tag1").pipe(S.withConstructorDefault(Effect.succeed("tag1"))), - a: S.NonEmptyString.pipe(S.withConstructorDefault(Effect.succeed(S.NonEmptyString("default")))), - b: schema - }), - S.Struct({ - _tag: S.Literal("tag2"), - a: S.NonEmptyString.pipe(S.withConstructorDefault(Effect.succeed(S.NonEmptyString("default")))), - b: S.NonEmptyString.pipe(S.withConstructorDefault(Effect.succeed(S.NonEmptyString("default")))), - c: schema - }) - ]) - - it("should have correct default values for form zero (ClassSchema)", async () => { - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(ClassSchema) - return { form } - } - }) - - await wrapper.vm.$nextTick() - const valuesText = wrapper.find("[data-testid=\"values\"]").text() - const values = JSON.parse(valuesText) - - expect(values).toEqual({ - "a": "default", - "b": "", - "c": ["C", "Non Empty Array"], - "d": [{ "e": "default" }], - "f": { "_tag": "taggo1", "g": "default", "i": "default", "h": "default" }, - "j": 0, - "k": true, - "l": null, - "m": { "n": null }, - "p": null, - "r": null, - "s": null, - "t": 1000, - "u": null - }) - }) - - it("should have correct default values for form one (schema)", async () => { - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(schema) - return { form } - } - }) - - await wrapper.vm.$nextTick() - const valuesText = wrapper.find("[data-testid=\"values\"]").text() - const values = JSON.parse(valuesText) - - expect(values).toEqual({ - "a": "default", - "b": "", - "c": ["C", "Non Empty Array"], - "d": [{ "e": "default" }], - "f": { "_tag": "taggo1", "g": "default", "i": "default", "h": "default" }, - "j": 0, - "k": true, - "l": null, - "m": { "n": null }, - "p": null, - "r": null, - "s": null, - "t": 1000, - "u": null - }) - }) - - it("should have correct default values for form two (Union)", async () => { - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(Union) - return { form } - } - }) - - await wrapper.vm.$nextTick() - const valuesText = wrapper.find("[data-testid=\"values\"]").text() - const values = JSON.parse(valuesText) - - expect(values).toEqual({ - "_tag": "tag1", - "a": "default", - "b": "default", - "c": { - "a": "default", - "b": "", - "c": ["C", "Non Empty Array"], - "d": [{ "e": "default" }], - "f": { "_tag": "taggo1", "g": "default", "i": "default", "h": "default" }, - "j": 0, - "k": true, - "l": null, - "m": { "n": null }, - "p": null, - "r": null, - "s": null, - "t": 1000, - "u": null - } - }) - }) - - it("should not initialize _tag for a root union without explicit defaults", async () => { - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(S.Union([ - S.Struct({ - _tag: S.Literal("one"), - a: S.Struct({ z: S.NonEmptyString100 }) - }), - S.Struct({ - _tag: S.Literal("two"), - a: S.Struct({ y: S.NonNegativeInt }) - }) - ])) - - return { form } - } - }) - - await wrapper.vm.$nextTick() - - const valuesText = wrapper.find("[data-testid=\"values\"]").text() - expect(JSON.parse(valuesText)).not.toHaveProperty("_tag") - }) - - it("should have correct default values for form three (with defaultValues merged)", async () => { - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(schema, { - defaultValues: { - a: "aaaaah" - } - }) - return { form } - } - }) - - await wrapper.vm.$nextTick() - const valuesText = wrapper.find("[data-testid=\"values\"]").text() - const values = JSON.parse(valuesText) - - expect(values).toEqual({ - "a": "aaaaah", - "b": "", - "c": ["C", "Non Empty Array"], - "d": [{ "e": "default" }], - "f": { "_tag": "taggo1", "g": "default", "i": "default", "h": "default" }, - "j": 0, - "k": true, - "l": null, - "m": { "n": null }, - "p": null, - "r": null, - "s": null, - "t": 1000, - "u": null - }) - }) - - it("should have correct default values for form four (defaultFromSchema: only)", async () => { - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(schema, { - defaultValues: { - a: "aaaaah" - } - }, { - defaultValuesPriority: ["schema"] - }) - return { form } - } - }) - - await wrapper.vm.$nextTick() - const valuesText = wrapper.find("[data-testid=\"values\"]").text() - const values = JSON.parse(valuesText) - - expect(values).toEqual({ - "a": "default", - "b": "", - "c": ["C", "Non Empty Array"], - "d": [{ "e": "default" }], - "f": { "_tag": "taggo1", "g": "default", "i": "default", "h": "default" }, - "j": 0, - "k": true, - "l": null, - "m": { "n": null }, - "p": null, - "r": null, - "s": null, - "t": 1000, - "u": null - }) - }) - - it("should have correct default values for form five (defaultFromSchema: nope)", async () => { - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(schema, { - defaultValues: { - a: "aaaaah" - } - }, { - defaultValuesPriority: ["tanstack"] - }) - return { form } - } - }) - - await wrapper.vm.$nextTick() - const valuesText = wrapper.find("[data-testid=\"values\"]").text() - const values = JSON.parse(valuesText) - - expect(values).toEqual({ - "a": "aaaaah" - }) - }) - - it("should have correct default values for form six (defaultFromSchema: merge)", async () => { - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(schema, { - defaultValues: { - a: "aaaaah" - } - }, { - defaultValuesPriority: ["tanstack", "schema"] - }) - return { form } - } - }) - - await wrapper.vm.$nextTick() - const valuesText = wrapper.find("[data-testid=\"values\"]").text() - const values = JSON.parse(valuesText) - - expect(values).toEqual({ - "a": "aaaaah", - "b": "", - "c": ["C", "Non Empty Array"], - "d": [{ "e": "default" }], - "f": { "_tag": "taggo1", "g": "default", "i": "default", "h": "default" }, - "j": 0, - "k": true, - "l": null, - "m": { "n": null }, - "p": null, - "r": null, - "s": null, - "t": 1000, - "u": null - }) - }) - - it("should have correct default values for form seven (Union with different structure)", async () => { - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(S.Union([ - S.Struct({ - _tag: S.Literal("tag1").pipe(S.withConstructorDefault(Effect.succeed("tag1"))), - a: S.NonEmptyString, - s: S.NullOr(S.Finite).withConstructorDefault - }), - S.Struct({ - _tag: S.Literal("tag2"), - b: S.NonEmptyString, - t: S.Finite - }) - ])) - return { form } - } - }) - - await wrapper.vm.$nextTick() - const valuesText = wrapper.find("[data-testid=\"values\"]").text() - const values = JSON.parse(valuesText) - - expect(values).toEqual({ - "_tag": "tag1", - "a": "", - "s": null, - "b": "" - }) - }) - - it("should have correct default values for form eight (ClassSchema with filter)", async () => { - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(ClassSchema - .pipe( - S.check(S.makeFilter((form) => { - if (form.a !== form.b) { - return { - path: ["a"], - message: "Email and confirmation must match!" - } - } - })) - )) - return { form } - } - }) - - await wrapper.vm.$nextTick() - const valuesText = wrapper.find("[data-testid=\"values\"]").text() - const values = JSON.parse(valuesText) - - expect(values).toEqual({ - "a": "default", - "b": "", - "c": ["C", "Non Empty Array"], - "d": [{ "e": "default" }], - "f": { "_tag": "taggo1", "g": "default", "i": "default", "h": "default" }, - "j": 0, - "k": true, - "l": null, - "m": { "n": null }, - "p": null, - "r": null, - "s": null, - "t": 1000, - "u": null - }) - }) - - it("should have correct default values for form nine (ClassSchema with filter inline)", async () => { - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(ClassSchema.pipe(S.check(S.makeFilter((form) => { - if (form.a !== form.b) { - return { - path: ["a"], - message: "Email and confirmation must match!" - } - } - })))) - return { form } - } - }) - - await wrapper.vm.$nextTick() - const valuesText = wrapper.find("[data-testid=\"values\"]").text() - const values = JSON.parse(valuesText) - - expect(values).toEqual({ - "a": "default", - "b": "", - "c": ["C", "Non Empty Array"], - "d": [{ "e": "default" }], - "f": { "_tag": "taggo1", "g": "default", "i": "default", "h": "default" }, - "j": 0, - "k": true, - "l": null, - "m": { "n": null }, - "p": null, - "r": null, - "s": null, - "t": 1000, - "u": null - }) - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/Defaults.values.test.ts b/packages/vue-components/__tests__/OmegaForm/Defaults.values.test.ts deleted file mode 100644 index dec4f4981..000000000 --- a/packages/vue-components/__tests__/OmegaForm/Defaults.values.test.ts +++ /dev/null @@ -1,114 +0,0 @@ -// __tests__/OmegaForm/Defaults.values.test.ts -import * as Effect from "effect-app/Effect" -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { defaultsValueFromSchema } from "../../src/components/OmegaForm" -import { fillNestedDefaults } from "../../src/components/OmegaForm/meta/defaults" - -describe("defaultsValueFromSchema", () => { - it("extracts withConstructorDefault values", () => { - const schema = S.Struct({ - name: S.String.pipe(S.withConstructorDefault(Effect.succeed("Bob"))) - }) - expect(defaultsValueFromSchema(schema)).toEqual({ name: "Bob" }) - }) - - it("extracts withDecodingDefault on optionalKey", () => { - const schema = S.Struct({ - flag: S.optionalKey(S.String).pipe(S.withDecodingDefault(Effect.succeed("on"))) - }) - expect(defaultsValueFromSchema(schema)).toEqual({ flag: "on" }) - }) - - it("returns null for NullOr fields without explicit default", () => { - const schema = S.Struct({ - x: S.NullOr(S.String) - }) - expect(defaultsValueFromSchema(schema)).toEqual({ x: null }) - }) - - it("returns undefined for UndefinedOr fields without explicit default", () => { - const schema = S.Struct({ - x: S.UndefinedOr(S.Finite) - }) - expect(defaultsValueFromSchema(schema)).toEqual({ x: undefined }) - }) - - it("returns empty string for plain S.String at the leaf", () => { - const schema = S.Struct({ x: S.String }) - expect(defaultsValueFromSchema(schema)).toEqual({ x: "" }) - }) - - it("returns false for plain S.Boolean at the leaf", () => { - const schema = S.Struct({ x: S.Boolean }) - expect(defaultsValueFromSchema(schema)).toEqual({ x: false }) - }) - - it("preserves values passed via the record argument", () => { - const schema = S.Struct({ x: S.String, y: S.String }) - expect(defaultsValueFromSchema(schema, { x: "preset" })).toEqual({ x: "preset", y: "" }) - }) - - it("merges fields across union members, picking explicit defaults", () => { - const schema = S.Union([ - S.TaggedStruct("A", { v: S.String.pipe(S.withConstructorDefault(Effect.succeed("a-default"))) }), - S.TaggedStruct("B", { v: S.String, extra: S.String }) - ]) - expect(defaultsValueFromSchema(schema)).toEqual({ _tag: "A", v: "a-default", extra: "" }) - }) -}) - -describe("fillNestedDefaults", () => { - it("fills missing nullable children for a materialized nullable struct", () => { - const schema = S.Struct({ - override: S.NullOr(S.Struct({ - min: S.NullOr(S.NonNegativeNumber), - max: S.NullOr(S.NonNegativeNumber) - })) - }) - - expect(fillNestedDefaults(schema.ast, { override: { min: 100 } })).toEqual({ - override: { - min: 100, - max: null - } - }) - }) - - it("does not add fields from another tagged union branch", () => { - const schema = S.Union([ - S.TaggedStruct("A", { a: S.NullOr(S.String), common: S.String }), - S.TaggedStruct("B", { b: S.Number, nullableB: S.NullOr(S.Number) }) - ]) - - expect(fillNestedDefaults(schema.ast, { _tag: "B", b: 1 })).toEqual({ - _tag: "B", - b: 1 - }) - }) - - it("fills missing nullable children for materialized struct elements of an array", () => { - const schema = S.Struct({ - items: S.Array(S.NullOr(S.Struct({ - a: S.NullOr(S.String), - b: S.NullOr(S.String) - }))) - }) - - expect(fillNestedDefaults(schema.ast, { items: [{ a: "x" }, null] })).toEqual({ - items: [{ a: "x", b: null }, null] - }) - }) - - it("returns the same reference when there is nothing to fill", () => { - const schema = S.Struct({ - items: S.Array(S.NullOr(S.Struct({ - a: S.NullOr(S.String), - b: S.NullOr(S.String) - }))) - }) - - const value = { items: [{ a: "x", b: null }, null] } - expect(fillNestedDefaults(schema.ast, value)).toBe(value) - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/DialogBlockingI18n.test.ts b/packages/vue-components/__tests__/OmegaForm/DialogBlockingI18n.test.ts deleted file mode 100644 index 234848dc5..000000000 --- a/packages/vue-components/__tests__/OmegaForm/DialogBlockingI18n.test.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { mount } from "@vue/test-utils" -import { describe, expect, it, vi } from "vitest" -import { defineComponent, h, ref } from "vue" -import { provideBus, usePreventClose } from "../../src/components/OmegaForm/blockDialog" -import { useIntlKey } from "../../src/utils" - -// Regression: when the dialog-closing handler ran with a dirty form, the -// previous fix destructured `formatMessage` from `useIntl()`. The storybook -// mocks shipped a shape without a top-level `formatMessage`, so the -// destructured value was `undefined` and triggered "formatMessage is not a -// function". This test pins the production wiring: as long as `useIntl()` -// exposes `formatMessage` directly (real shape from `@effect-app/vue`), -// the confirm message is the formatted string. -describe("usePreventClose i18n", () => { - it("calls window.confirm with the formatted message when dirty and dialog is closing", () => { - const confirmSpy = vi.spyOn(window, "confirm").mockReturnValue(true) - const formatMessage = vi.fn( - (descriptor: { id: string; defaultMessage?: string }) => `de:${descriptor.id}` - ) - - let bus: ReturnType | undefined - const Outer = defineComponent({ - setup() { - bus = provideBus() - return () => h(Inner) - } - }) - const Inner = defineComponent({ - setup() { - usePreventClose(() => ref(true)) - return () => h("div") - } - }) - - mount(Outer, { - global: { - provide: { - [useIntlKey as unknown as symbol]: () => ({ - trans: (id: string) => id, - formatMessage - }) - } - } - }) - - bus!.emit("dialog-closing", {}) - - expect(formatMessage).toHaveBeenCalledTimes(1) - expect(formatMessage.mock.calls[0]?.[0]).toMatchObject({ id: "form.unsaved_changes_confirm" }) - expect(confirmSpy).toHaveBeenCalledWith("de:form.unsaved_changes_confirm") - - confirmSpy.mockRestore() - }) - - it("skips the confirm entirely when the form is not dirty", () => { - const confirmSpy = vi.spyOn(window, "confirm") - - let bus: ReturnType | undefined - const Outer = defineComponent({ - setup() { - bus = provideBus() - return () => h(Inner) - } - }) - const Inner = defineComponent({ - setup() { - usePreventClose(() => ref(false)) - return () => h("div") - } - }) - - mount(Outer) - - const evt: { prevent?: boolean | Promise } = {} - bus!.emit("dialog-closing", evt) - - expect(confirmSpy).not.toHaveBeenCalled() - expect(evt.prevent).toBeUndefined() - - confirmSpy.mockRestore() - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/EmailFormatDetection.test.ts b/packages/vue-components/__tests__/OmegaForm/EmailFormatDetection.test.ts deleted file mode 100644 index ff1a800bf..000000000 --- a/packages/vue-components/__tests__/OmegaForm/EmailFormatDetection.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { generateMetaFromSchema } from "../../src/components/OmegaForm" - -describe("S.Email format detection", () => { - it("flags S.Email fields with format: 'email' on their meta", () => { - const schema = S.Struct({ x: S.Email }) - const { meta } = generateMetaFromSchema(schema) - expect((meta.x as any)?.format).toBe("email") - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/EmptyStringValidation.test.ts b/packages/vue-components/__tests__/OmegaForm/EmptyStringValidation.test.ts deleted file mode 100644 index be930ee75..000000000 --- a/packages/vue-components/__tests__/OmegaForm/EmptyStringValidation.test.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { flushPromises, mount } from "@vue/test-utils" -import * as S from "effect-app/Schema" -import { describe, it } from "vitest" -import { useOmegaForm } from "../../src/components/OmegaForm" -import OmegaIntlProvider from "../OmegaIntlProvider.vue" - -describe("Empty string validation for nested NonEmptyString fields", () => { - it("demonstrates current empty string behavior", async () => { - const schema = S.Struct({ - asder2: S.Struct({ - value: S.NonEmptyString100 - }) - }) - - const wrapper = mount({ - components: { - OmegaIntlProvider - }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(schema, { - defaultValues: { - asder2: { - value: "" - } - }, - onSubmit: async ({ value }) => { - console.log("Form submitted with:", value) - } - }) - return { form } - } - }) - - await wrapper.vm.$nextTick() - - // Click submit with empty string - await wrapper.find("[data-testid='submit']").trigger("click") - await wrapper.vm.$nextTick() - await flushPromises() - - // Check for validation error - expect(wrapper.text()).toContain("validation.empty") - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/GeneralErrors.test.ts b/packages/vue-components/__tests__/OmegaForm/GeneralErrors.test.ts deleted file mode 100644 index 33a03f7ea..000000000 --- a/packages/vue-components/__tests__/OmegaForm/GeneralErrors.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { mount } from "@vue/test-utils" -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { defineComponent, h, nextTick } from "vue" -import { useOmegaForm } from "../../src/components/OmegaForm" -import OmegaErrorsInternal from "../../src/components/OmegaForm/OmegaErrorsInternal.vue" - -describe("OmegaForm general errors", () => { - it("renders a string returned by an onSubmit validator and clears it after correction", async () => { - const message = "Passwörter stimmen nicht überein" - const Inner = defineComponent({ - setup() { - const form = useOmegaForm(S.Struct({ password: S.String, confirmation: S.String }), { - defaultValues: { password: "secret", confirmation: "different" }, - validators: { - onSubmit: ({ value }) => value.password === value.confirmation ? undefined : message - } - }) - return { form } - }, - template: `` - }) - const wrapper = mount(Inner) - - await wrapper.vm.form.handleSubmit() - await nextTick() - expect(wrapper.get("[role=\"alert\"]").text()).toContain(message) - - wrapper.vm.form.setFieldValue("confirmation", "secret") - await wrapper.vm.form.handleSubmit() - await nextTick() - expect(wrapper.find("[role=\"alert\"]").exists()).toBe(false) - wrapper.unmount() - }) - - it("preserves schema messages alongside strings and ignores unsupported values", () => { - const wrapper = mount(OmegaErrorsInternal, { - props: { - errors: [], - generalErrors: [ - "Form error", - { rows: [{ message: "Schema error" }, null, 42, { message: 123 }, { message: "" }] }, - null, - undefined, - false, - 42, - "", - { rows: "unsupported", other: null } - ] - }, - slots: { - default: ({ showedGeneralErrors }) => h("div", JSON.stringify(showedGeneralErrors)) - } - }) - - expect(wrapper.text()).toBe(JSON.stringify(["Form error", "Schema error"])) - wrapper.unmount() - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/IndexedInputErrors.test.ts b/packages/vue-components/__tests__/OmegaForm/IndexedInputErrors.test.ts deleted file mode 100644 index 5023651bd..000000000 --- a/packages/vue-components/__tests__/OmegaForm/IndexedInputErrors.test.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { mount } from "@vue/test-utils" -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { defineComponent, nextTick, ref } from "vue" -import { useOmegaForm } from "../../src/components/OmegaForm" - -describe("OmegaForm indexed inputs", () => { - it.each([0, 13])("renders rows[%i].text outside form.Array with one labelled error", async (index) => { - const wrapper = mount(defineComponent({ - setup() { - const form = useOmegaForm( - S.Struct({ - rows: S.Array(S.Struct({ text: S.String.pipe(S.check(S.isMinLength(2))) })) - }), - { - defaultValues: { - rows: Array.from({ length: index + 1 }, (_, i) => ({ text: i === index ? "" : "valid" })) - } - } - ) - return { form, name: `rows[${index}].text`, visible: ref(true) } - }, - template: ` - - - - - - - ` - })) - - const input = wrapper.get("input") - await wrapper.vm.form.handleSubmit() - await nextTick() - - expect(wrapper.get("[data-testid=\"field-errors\"]").text()).not.toBe("") - const entries = wrapper.findAll("[role=\"alert\"] .error-item") - expect(entries).toHaveLength(1) - expect(entries[0].get("label").text()).toBe("Row text") - expect(entries[0].get("label").attributes("for")).toBe(input.attributes("id")) - - wrapper.vm.visible = false - await nextTick() - await wrapper.vm.form.handleSubmit() - await nextTick() - - const unregistered = wrapper.findAll("[role=\"alert\"] .error-item") - expect(unregistered).toHaveLength(1) - expect(unregistered[0].get("label").attributes("for")).toBe(`rows.${index}.text`) - wrapper.unmount() - }) - - it("still resolves indexed metadata inside form.Array", () => { - const wrapper = mount(defineComponent({ - setup() { - return { - form: useOmegaForm(S.Struct({ rows: S.Array(S.Struct({ text: S.String })) }), { - defaultValues: { rows: [{ text: "existing" }] } - }) - } - }, - template: ` - - - - - - ` - })) - - expect(wrapper.get("input").element.value).toBe("existing") - wrapper.unmount() - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/InputAttributes.test.ts b/packages/vue-components/__tests__/OmegaForm/InputAttributes.test.ts deleted file mode 100644 index 6e8441959..000000000 --- a/packages/vue-components/__tests__/OmegaForm/InputAttributes.test.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { mount } from "@vue/test-utils" -import * as S from "effect-app/Schema" -import { describe, expect, it, vi } from "vitest" -import { defineComponent } from "vue" -import { useOmegaForm } from "../../src/components/OmegaForm" -import OmegaIntlProvider from "../OmegaIntlProvider.vue" - -const VTextField = defineComponent({ - props: { - modelValue: { - type: String, - default: "" - } - }, - emits: ["update:modelValue"], - template: ` - - ` -}) - -const VSelect = defineComponent({ - props: { - items: { - type: Array, - default: () => [] - }, - modelValue: { - type: String, - default: "" - } - }, - emits: ["update:modelValue"], - template: ` - - ` -}) - -describe("OmegaForm input attributes", () => { - it("does not forward the internal form object as a native form attribute", async () => { - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - - `, - setup() { - const form = useOmegaForm( - S.Struct({ - password: S.NonEmptyString255 - }), - { - defaultValues: { - password: "" - } - } - ) - - return { form } - } - }, { - global: { - components: { VTextField, VSelect } - } - }) - - await wrapper.vm.$nextTick() - - const input = wrapper.find("input") - const nativeForm = wrapper.find("form").element - - expect(input.attributes("form")).toBeUndefined() - expect(input.attributes("validators")).toBeUndefined() - expect(Object.values(input.attributes())).not.toContain("[object Object]") - expect((input.element as HTMLInputElement).form).toBe(nativeForm) - }) - - it("renders a newly-supported native input type (tel) on the text-field branch", async () => { - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm( - S.Struct({ phone: S.String }), - { defaultValues: { phone: "" } } - ) - - return { form } - } - }, { - global: { - components: { VTextField } - } - }) - - await wrapper.vm.$nextTick() - - expect(wrapper.find("input").attributes("type")).toBe("tel") - }) - - it("falls back to a text input and warns for a type no branch handles", async () => { - const warn = vi.spyOn(console, "warn").mockImplementation(() => {}) - - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm( - S.Struct({ mystery: S.String }), - { defaultValues: { mystery: "" } } - ) - - return { form } - } - }, { - global: { - components: { VTextField } - } - }) - - await wrapper.vm.$nextTick() - - // unhandled type → getInputType maps it to "text" - expect(wrapper.find("input").attributes("type")).toBe("text") - expect(warn).toHaveBeenCalledWith(expect.stringContaining("totally-custom")) - - warn.mockRestore() - }) - - it("keeps input configuration props off the renderer attrs", async () => { - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm( - S.Struct({ - choice: S.Literal("one") - }), - { - defaultValues: { - choice: "one" - } - } - ) - - return { form } - } - }, { - global: { - components: { VTextField, VSelect } - } - }) - - await wrapper.vm.$nextTick() - - const select = wrapper.find("select") - - expect(select.attributes("options")).toBeUndefined() - expect(select.attributes("items")).toBeUndefined() - expect(Object.values(select.attributes())).not.toContain("[object Object]") - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/InputReactivity.test.ts b/packages/vue-components/__tests__/OmegaForm/InputReactivity.test.ts deleted file mode 100644 index 37b2b4996..000000000 --- a/packages/vue-components/__tests__/OmegaForm/InputReactivity.test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { mount } from "@vue/test-utils" -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { useOmegaForm } from "../../src/components/OmegaForm" -import OmegaIntlProvider from "../OmegaIntlProvider.vue" - -describe("OmegaForm input reactivity", () => { - it("reflects value changes from the slot `state` in the view", async () => { - const schema = S.Struct({ - name: S.String - }) - - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - - - `, - setup() { - const form = useOmegaForm(schema, { - defaultValues: { name: "" } - }) - return { form } - } - }) - - await wrapper.vm.$nextTick() - - const input = wrapper.find("[data-testid='input']") - await input.setValue("hello") - await wrapper.vm.$nextTick() - - // The slot `state` must stay in sync with the form store - expect(wrapper.find("[data-testid='display']").text()).toBe("hello") - expect((input.element as HTMLInputElement).value).toBe("hello") - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/InputRegistry.test.ts b/packages/vue-components/__tests__/OmegaForm/InputRegistry.test.ts deleted file mode 100644 index 822fd6555..000000000 --- a/packages/vue-components/__tests__/OmegaForm/InputRegistry.test.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { mount } from "@vue/test-utils" -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { defineComponent } from "vue" -import { createUseFormWithCustomInput, useOmegaForm } from "../../src/components/OmegaForm" -import OmegaIntlProvider from "../OmegaIntlProvider.vue" - -const VTextField = defineComponent({ - props: { modelValue: { type: String, default: "" } }, - emits: ["update:modelValue"], - template: `` -}) - -const RatingInput = defineComponent({ - props: { - inputProps: { type: Object, required: true }, - field: { type: Object, required: true }, - state: { type: Object, required: true } - }, - template: `
{{ inputProps.label }}
` -}) - -const UniversalInput = defineComponent({ - props: { - inputProps: { type: Object, required: true }, - field: { type: Object, required: true }, - state: { type: Object, required: true } - }, - template: `
{{ inputProps.label }}
` -}) - -const mountWith = (omegaConfig: any, type: string, name = "x") => - mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - `, - setup() { - const form = useOmegaForm(S.Struct({ x: S.String }), { defaultValues: { x: "" } }, omegaConfig) - return { form } - } - }, { global: { components: { VTextField } } }) - -describe("OmegaForm input registry", () => { - it("renders the registered component for a custom type", async () => { - const wrapper = mountWith({ inputs: { rating: RatingInput } }, "rating") - await wrapper.vm.$nextTick() - expect(wrapper.find("[data-testid=\"rating\"]").exists()).toBe(true) - }) - - it("overrides a built-in type when registered", async () => { - const wrapper = mountWith({ inputs: { string: RatingInput } }, "string") - await wrapper.vm.$nextTick() - expect(wrapper.find("[data-testid=\"rating\"]").exists()).toBe(true) - }) - - it("falls back to the built-in renderer when no entry matches", async () => { - const wrapper = mountWith({ inputs: { rating: RatingInput } }, "string") - await wrapper.vm.$nextTick() - expect(wrapper.find("[data-testid=\"rating\"]").exists()).toBe(false) - expect(wrapper.find("input").exists()).toBe(true) - }) -}) - -describe("createUseFormWithCustomInput + inputs", () => { - it("uses a per-type registered component, else the universal custom input", async () => { - const useForm = createUseFormWithCustomInput(UniversalInput) - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useForm( - S.Struct({ score: S.Number, nickname: S.String }), - { defaultValues: { score: 0, nickname: "" } }, - { inputs: { rating: RatingInput } } - ) - return { form } - } - }, { global: { components: { VTextField } } }) - await wrapper.vm.$nextTick() - // `score` (type="rating") resolves the registered component... - expect(wrapper.find("[data-testid=\"rating\"]").exists()).toBe(true) - // ...while `nickname` falls back to the universal custom input. - expect(wrapper.find("[data-testid=\"universal\"]").exists()).toBe(true) - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/IntersectionError.test.ts b/packages/vue-components/__tests__/OmegaForm/IntersectionError.test.ts deleted file mode 100644 index 00e3ba9a5..000000000 --- a/packages/vue-components/__tests__/OmegaForm/IntersectionError.test.ts +++ /dev/null @@ -1,223 +0,0 @@ -import { flushPromises, mount } from "@vue/test-utils" -import * as S from "effect-app/Schema" -import { beforeEach, describe, expect, it } from "vitest" -import { useOmegaForm } from "../../src/components/OmegaForm" -import OmegaIntlProvider from "../OmegaIntlProvider.vue" - -// Mock components that integrate with TanStack Form -const mockComponents = { - CustomInput: { - template: ` -
- - - -
- `, - props: ["form", "name", "field", "label", "type", "options"], - inheritAttrs: false - }, - OmegaErrors: { - template: `
{{ JSON.stringify(errors) }}
`, - props: ["errors", "generalErrors", "showErrors"] - } -} - -describe("OmegaForm Intersection/Union", () => { - const AlphaSchema = S.Struct({ - first: S.Literal("alpha"), - alpha: S.NonEmptyString - }) - - const BetaSchema = S.Struct({ - first: S.Literal("beta"), - beta: S.NonEmptyString - }) - - const MySchema = S.Struct({ - myUnion: S.Union([AlphaSchema, BetaSchema]) - }) - - const createWrapper = () => - mount({ - components: { - OmegaIntlProvider, - CustomInput: mockComponents.CustomInput - }, - template: ` - - - - - - `, - setup() { - let submittedValue: any = null - const form = useOmegaForm(MySchema, { - onSubmit: async ({ value }) => { - submittedValue = value - } - }) - return { form, getSubmittedValue: () => submittedValue } - } - }, { - global: { - stubs: { - CustomInput: mockComponents.CustomInput, - OmegaErrorsInternal: mockComponents.OmegaErrors - } - } - }) - - let wrapper: ReturnType - - beforeEach(() => { - wrapper = createWrapper() - }) - - it("handles discriminated union with conditional fields", async () => { - // Initially, neither alpha nor beta input should be visible - expect(wrapper.find("[data-testid='alpha-input']").exists()).toBe(false) - expect(wrapper.find("[data-testid='beta-input']").exists()).toBe(false) - - // Select "alpha" from the dropdown - const selectInput = wrapper.find("select[name='myUnion.first']") - await selectInput.setValue("alpha") - await wrapper.vm.$nextTick() - - // Alpha input should now be visible, beta should not - expect(wrapper.find("[data-testid='alpha-input']").exists()).toBe(true) - expect(wrapper.find("[data-testid='beta-input']").exists()).toBe(false) - - // Switch to "beta" - await selectInput.setValue("beta") - await wrapper.vm.$nextTick() - - // Beta input should now be visible, alpha should not - expect(wrapper.find("[data-testid='alpha-input']").exists()).toBe(false) - expect(wrapper.find("[data-testid='beta-input']").exists()).toBe(true) - }) - - it("clears validation errors when switching union types", async () => { - const selectInput = wrapper.find("select[name='myUnion.first']") - - // Select "alpha" and submit without filling required field to trigger error - await selectInput.setValue("alpha") - - const submitButton = wrapper.find("[data-testid='submit']") - await submitButton.trigger("submit") - await wrapper.vm.$nextTick() - await flushPromises() - - // Verify error exists for alpha field - const errorDiv = wrapper.find(".mock-omega-errors") - expect(errorDiv.exists()).toBe(true) - expect(errorDiv.text()).toContain("alpha") - - // Switch to "beta" - error should be cleared - await selectInput.setValue("beta") - await wrapper.vm.$nextTick() - - const errorDivAfter = wrapper.find(".mock-omega-errors") - expect(errorDivAfter.text()).not.toContain("alpha") - }) - - it("clears form values when switching union types and handles submission", async () => { - const selectInput = wrapper.find("select[name='myUnion.first']") - - // Select "alpha" and fill the input - await selectInput.setValue("alpha") - await wrapper.vm.$nextTick() - - const alphaInput = wrapper.find("input[name='myUnion.alpha']") - await alphaInput.setValue("test") - await wrapper.vm.$nextTick() - - // Check that "test" is in the values - const valuesText = wrapper.find("[data-testid='values']").text() - expect(valuesText).toContain("test") - - // Switch to "beta" - await selectInput.setValue("beta") - await wrapper.vm.$nextTick() - - // // Check that alpha "test" value is not there anymore - // const valuesAfterSwitch = wrapper.find("[data-testid='values']").text() - // expect(valuesAfterSwitch).not.toContain("test") - - // Fill beta with "here we go" - const betaInput = wrapper.find("input[name='myUnion.beta']") - await betaInput.setValue("here we go") - await wrapper.vm.$nextTick() - - // Click submit and check submission works - const form = wrapper.find("form") - await form.trigger("submit") - await wrapper.vm.$nextTick() - // Wait a bit for async operations - await new Promise((resolve) => setTimeout(resolve, 100)) - - // Verify the form data was submitted with the correct beta values - const vm = wrapper.vm as any - expect(vm.getSubmittedValue()).toEqual({ - myUnion: { - first: "beta", - beta: "here we go" - } - }) - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/Meta.test.ts b/packages/vue-components/__tests__/OmegaForm/Meta.test.ts deleted file mode 100644 index 0ed85b1b1..000000000 --- a/packages/vue-components/__tests__/OmegaForm/Meta.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -// __tests__/OmegaForm/Meta.test.ts -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { generateMetaFromSchema } from "../../src/components/OmegaForm" - -const subStruct = { - a: S.NullOr(S.String), - b: S.UndefinedOr(S.Finite), - c: S.NullishOr(S.Finite), - d: S.String, - e: S.Finite, - f: S.Boolean -} - -const schema = S.Struct({ - ...subStruct, - struct: S.Struct(subStruct), - nullableStruct: S.NullOr(S.Struct(subStruct)) -}) - -const expectedSubMeta = { - a: { required: false, nullableOrUndefined: "null", type: "string" }, - b: { required: false, nullableOrUndefined: "undefined", type: "number" }, - c: { required: false, nullableOrUndefined: "undefined", type: "number" }, - d: { type: "string", required: false, nullableOrUndefined: false }, - e: { type: "number", required: true, nullableOrUndefined: false }, - f: { type: "boolean", required: true, nullableOrUndefined: false } -} - -describe("Meta story characterization", () => { - it("matches the rendered meta keys and values", () => { - const { meta } = generateMetaFromSchema(schema) - - for (const [key, value] of Object.entries(expectedSubMeta)) { - expect(meta[key as keyof typeof meta], `root.${key}`).toMatchObject(value) - expect(meta[`struct.${key}` as keyof typeof meta], `struct.${key}`).toMatchObject(value) - expect(meta[`nullableStruct.${key}` as keyof typeof meta], `nullableStruct.${key}`).toMatchObject(value) - } - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/NullableFieldInitialization.test.ts b/packages/vue-components/__tests__/OmegaForm/NullableFieldInitialization.test.ts deleted file mode 100644 index a59acb468..000000000 --- a/packages/vue-components/__tests__/OmegaForm/NullableFieldInitialization.test.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { mount } from "@vue/test-utils" -import * as S from "effect-app/Schema" -import { describe, expect, it, vi } from "vitest" -import { useOmegaForm } from "../../src/components/OmegaForm" -import OmegaIntlProvider from "../OmegaIntlProvider.vue" - -describe("Nullable field initialization", () => { - it("should initialize nullable fields with null when missing from defaultValues", async () => { - const schema = S.Struct({ - aString: S.NullOr(S.NonEmptyString255).withConstructorDefault, - bString: S.NullOr(S.NonEmptyString255).withConstructorDefault, - cStruct: S - .NullOr(S.Struct({ - dString: S.NullOr(S.NonEmptyString255).withConstructorDefault - })) - .withConstructorDefault, - cLiteral: S.NullOr(S.Literal("test", "test2")).withConstructorDefault - }) - - let submittedValue: Record | null = null - let submitError = null - - const wrapper = mount({ - components: { - OmegaIntlProvider - }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(schema, { - defaultValues: { - aString: null - }, - onSubmit: async ({ value }) => { - try { - submittedValue = value - } catch (error) { - submitError = error - } - } - }) - return { form } - } - }) - - // Check that both fields are initialized with null (not empty string) - await vi.waitFor(() => { - const valuesText = wrapper.find("[data-testid=\"values\"]").text() - expect(valuesText).toContain("\"aString\":null") - expect(valuesText).toContain("\"bString\":null") - expect(valuesText).toContain("\"cStruct\":null") - }) - - // Submit the form - await wrapper.find("[data-testid=\"submit\"]").trigger("click") - - // Wait for the submission to complete - await vi.waitFor(() => { - expect(submittedValue).not.toBeNull() - }) - - // Check that form submitted successfully without errors - expect(submitError).toBeNull() - expect(submittedValue).toEqual({ - aString: null, - bString: null, - cStruct: null, - cLiteral: null - }) - }) - - it("should convert empty string to null for nullable fields", async () => { - const schema = S.Struct({ - aString: S.NullOr(S.NonEmptyString255).withConstructorDefault, - bString: S.NonEmptyString255 - }) - - const wrapper = mount({ - components: { - OmegaIntlProvider - }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(schema, { - onSubmit: async () => { - // Should not be called since bString is required and missing - } - }) - return { form } - } - }) - - await wrapper.vm.$nextTick() - - // aString should be null (nullable field with empty string) - const valuesText = wrapper.find("[data-testid=\"values\"]").text() - expect(valuesText).toContain("\"aString\":null") - - // Submit the form - should fail because bString is required - await wrapper.find("[data-testid=\"submit\"]").trigger("click") - await wrapper.vm.$nextTick() - - // Check that there's an error for bString - const errors = wrapper.find("[data-testid=\"omega-errors\"]") - if (errors.exists()) { - expect(errors.text()).toContain("bString") - } - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/NullableNestedStructValidation.test.ts b/packages/vue-components/__tests__/OmegaForm/NullableNestedStructValidation.test.ts deleted file mode 100644 index 7e8b487f3..000000000 --- a/packages/vue-components/__tests__/OmegaForm/NullableNestedStructValidation.test.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { mount } from "@vue/test-utils" -import * as S from "effect-app/Schema" -import { describe, expect, it, vi } from "vitest" -import { useOmegaForm } from "../../src/components/OmegaForm" -import OmegaIntlProvider from "../OmegaIntlProvider.vue" - -/** - * Regression repro for the configurator `LinkedOption.override` schema. - * - * `override` is a nullable struct (`S.NullOr(S.Struct({...})).withConstructorDefault`) - * whose own children are themselves nullable (`S.NullOr(...)`). The form starts - * with `override === null`. As soon as the user fills ONE child (`override.min`), - * the struct materialises while its siblings (`override.max`, `override.readOnly`) - * are still `undefined`. - * - * `undefined` is not a valid member of `S.NullOr(...)`, so validation rejected the - * untouched siblings with "field must not be empty" and the form couldn't submit. - * The configurator worked around this by making every child `S.optional`; the - * correct behaviour is for OmegaForm to treat an untouched nullable child as - * `null` once its nullable parent struct materialises. - */ -describe("Nullable nested struct validation", () => { - const schema = S.Struct({ - optionId: S.NullOr(S.String), - override: S - .NullOr(S.Struct({ - min: S.NullOr(S.NonNegativeNumber), - max: S.NullOr(S.NonNegativeNumber), - readOnly: S.NullOr(S.Boolean).withConstructorDefault, - isInteger: S.optional(S.NullOr(S.Boolean)) - })) - .withConstructorDefault - }) - - it("submits when only one child of a nullable struct is filled", async () => { - let submittedValue: Record | null = null - - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(schema, { - onSubmit: async ({ value }) => { - submittedValue = value as Record - } - }) - return { form } - } - }) - - // The whole struct starts null. - await vi.waitFor(() => { - expect(wrapper.find("[data-testid=\"values\"]").text()).toContain("\"override\":null") - }) - - // User fills only `override.min`. - await wrapper.find("[data-testid=\"min-input\"]").setValue("100") - - // The struct materialised: its untouched nullable siblings are backfilled - // into the live form state, not left `undefined`. - await vi.waitFor(() => { - const valuesText = wrapper.find("[data-testid=\"values\"]").text() - expect(valuesText).toContain("\"min\":100") - expect(valuesText).toContain("\"max\":null") - expect(valuesText).toContain("\"readOnly\":null") - }) - - // Submit. - await wrapper.find("[data-testid=\"submit\"]").trigger("click") - - // The untouched nullable siblings must NOT block submission; they decode as null. - await vi.waitFor(() => { - expect(submittedValue).not.toBeNull() - }) - - expect(submittedValue).toMatchObject({ - override: { - min: 100, - max: null, - readOnly: null - } - }) - }) - - it("keeps an untouched nullable struct as null", async () => { - let submittedValue: Record | null = null - - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(schema, { - onSubmit: async ({ value }) => { - submittedValue = value as Record - } - }) - return { form } - } - }) - - await wrapper.find("[data-testid=\"submit\"]").trigger("click") - - await vi.waitFor(() => { - expect(submittedValue).not.toBeNull() - }) - - // Nothing was filled — `override` must stay null, not materialise. - expect(submittedValue).toMatchObject({ override: null }) - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/OmegaAutoGen.test.ts b/packages/vue-components/__tests__/OmegaForm/OmegaAutoGen.test.ts deleted file mode 100644 index 2884bfb4c..000000000 --- a/packages/vue-components/__tests__/OmegaForm/OmegaAutoGen.test.ts +++ /dev/null @@ -1,331 +0,0 @@ -import { mount } from "@vue/test-utils" -import * as S from "effect-app/Schema" -import * as Order from "effect/Order" -import { describe, expect, it } from "vitest" -import { useOmegaForm } from "../../src/components/OmegaForm" -import OmegaIntlProvider from "../OmegaIntlProvider.vue" - -// We need to mock the components used by OmegaAutoGen.vue since they depend on Vuetify -const mockComponents = { - OmegaInput: { - template: ` -
- - -
- `, - props: ["form", "name", "label"] - } -} - -describe("OmegaAutoGen", () => { - it("generates components from schema with the correct props", () => { - const wrapper = mount( - { - components: { - OmegaIntlProvider - }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm( - S.Struct({ - string: S.String, - number: S.Finite - }) - ) - return { form } - } - }, - { - global: { - stubs: { - OmegaInput: mockComponents.OmegaInput - } - } - } - ) - - const inputs = wrapper.findAll(".mock-omega-input") - expect(inputs.length).toBe(2) // Should generate 2 inputs - - const firstInput = inputs[0] - expect(firstInput.find("label").attributes("for")).toBe("string") - expect(firstInput.find("input").attributes("name")).toBe("string") - - const secondInput = inputs[1] - expect(secondInput.find("label").attributes("for")).toBe("number") - expect(secondInput.find("input").attributes("name")).toBe("number") - }) - - // Pick option test - it("uses the pick option to include only specific fields", () => { - const wrapper = mount( - { - components: { - OmegaIntlProvider - }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm( - S.Struct({ - string: S.String, - number: S.Finite, - boolean: S.Boolean - }) - ) - return { form } - } - }, - { - global: { - stubs: { - OmegaInput: mockComponents.OmegaInput - } - } - } - ) - - // Should only have inputs for fields in the pick array - const inputs = wrapper.findAll(".mock-omega-input") - expect(inputs.length).toBe(1) - expect(inputs[0].find("input").attributes("name")).toBe("string") - }) - - // Omit option test - it("uses the omit option to exclude specific fields", () => { - const wrapper = mount( - { - components: { - OmegaIntlProvider - }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm( - S.Struct({ - string: S.String, - number: S.Finite, - boolean: S.Boolean - }) - ) - return { form } - } - }, - { - global: { - stubs: { - OmegaInput: mockComponents.OmegaInput - } - } - } - ) - - // Should only have inputs for fields not in the omit array - const inputs = wrapper.findAll(".mock-omega-input") - expect(inputs.length).toBe(1) - expect(inputs[0].find("input").attributes("name")).toBe("string") - }) - - // Order option test - it("uses the order option to control field order", () => { - const wrapper = mount( - { - components: { - OmegaIntlProvider - }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm( - S.Struct({ - string: S.String, - number: S.Finite, - boolean: S.Boolean - }) - ) - return { form } - } - }, - { - global: { - stubs: { - OmegaInput: mockComponents.OmegaInput - } - } - } - ) - - // Check that the fields are ordered according to the specified order - const inputs = wrapper.findAll(".mock-omega-input input") - const inputNames = inputs.map((input) => input.attributes("name")) - - // The order should match the specified order - expect(inputNames[0]).toBe("boolean") - expect(inputNames[1]).toBe("number") - expect(inputNames[2]).toBe("string") - }) - - // Sort option test - it("uses the sort option to sort fields", () => { - const wrapper = mount( - { - components: { - OmegaIntlProvider - }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm( - S.Struct({ - charlie: S.String, - alpha: S.String, - bravo: S.String - }) - ) - - // Create a sorter that sorts by name alphabetically - const sortByName = Order.mapInput( - Order.String, - (item: { name: string }) => item.name - ) - - return { form, sortByName } - } - }, - { - global: { - stubs: { - OmegaInput: mockComponents.OmegaInput - } - } - } - ) - - // Check that the fields are sorted alphabetically by name - const inputs = wrapper.findAll(".mock-omega-input input") - const inputNames = inputs.map((input) => input.attributes("name")) - - // The fields should be sorted alphabetically - expect(inputNames[0]).toBe("alpha") - expect(inputNames[1]).toBe("bravo") - expect(inputNames[2]).toBe("charlie") - }) - - // LabelMap - it("applies the labelMap option", () => { - const wrapper = mount( - { - components: { - OmegaIntlProvider - }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm( - S.Struct({ - string: S.String, - number: S.Finite - }) - ) - return { form } - } - }, - { - global: { - stubs: { - OmegaInput: mockComponents.OmegaInput - } - } - } - ) - - const labels = wrapper.findAll("label") - expect(labels[0].text()).toBe("Custom String Label") - expect(labels[1].text()).toBe("number") // Default label is the key - }) - - // Custom slot - it("allows custom slot content", () => { - const wrapper = mount({ - components: { - OmegaIntlProvider - }, - template: ` - - - - - - - - `, - setup() { - const form = useOmegaForm( - S.Struct({ - string: S.String, - number: S.Finite - }) - ) - return { form } - } - }) - - const customElements = wrapper.findAll(".custom-slot") - expect(customElements.length).toBe(2) - - expect(wrapper.find("[data-testid=\"string-custom\"]").exists()).toBe(true) - expect(wrapper.find("[data-testid=\"number-custom\"]").exists()).toBe(true) - - const labels = wrapper.findAll("label") - expect(labels[0].text()).toBe("Custom string") - expect(labels[1].text()).toBe("Custom number") - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/OptionalKey.test.ts b/packages/vue-components/__tests__/OmegaForm/OptionalKey.test.ts deleted file mode 100644 index 03363ab36..000000000 --- a/packages/vue-components/__tests__/OmegaForm/OptionalKey.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -import * as Effect from "effect-app/Effect" -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { generateMetaFromSchema } from "../../src/components/OmegaForm" - -describe("optionalKey required handling", () => { - it("should mark optionalKey fields as not required", () => { - const schema = S.Struct({ - number: S.optionalKey(S.Int.pipe(S.check(S.isBetween({ minimum: 1, maximum: 20 })))), - height: S.NonEmptyString100.pipe(S.check(S.isMinLength(10))) - }) - - const { meta } = generateMetaFromSchema(schema) - - // optionalKey field should NOT be required - expect(meta.number?.required).toBe(false) - - // regular field should still be required - expect(meta.height?.required).toBe(true) - }) - - it("should mark optionalKey with decodingDefault as not required", () => { - const schema = S.Struct({ - name: S.optionalKey(S.String).pipe(S.withDecodingDefault(Effect.succeed("defaultName"))), - age: S.NonEmptyString255 - }) - - const { meta } = generateMetaFromSchema(schema) - - expect(meta.name?.required).toBe(false) - expect(meta.age?.required).toBe(true) - }) - - it("should handle optionalKey in tagged union branches", () => { - const schema = S.Union([ - S.TaggedStruct("one", { - a: S.Struct({ - number: S.optionalKey(S.Int.pipe(S.check(S.isBetween({ minimum: 1, maximum: 20 })))), - height: S.NonEmptyString100.pipe(S.check(S.isMinLength(10))), - z: S.NonEmptyString100.pipe(S.check(S.isMinLength(10))) - }) - }), - S.TaggedStruct("two", { - a: S.Struct({ - number: S.optionalKey(S.Int.pipe(S.check(S.isBetween({ minimum: 1, maximum: 20 })))), - height: S.NonEmptyString100.pipe(S.check(S.isMinLength(10))), - y: S.NonEmptyString100.pipe(S.check(S.isMinLength(10))) - }) - }) - ]) - - const { meta } = generateMetaFromSchema(schema) - - // optionalKey in both union branches should not be required - expect(meta["a.number"]?.required).toBe(false) - - // regular fields should be required - expect(meta["a.height"]?.required).toBe(true) - expect(meta["a.z"]?.required).toBe(true) - expect(meta["a.y"]?.required).toBe(true) - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/RedactedMeta.test.ts b/packages/vue-components/__tests__/OmegaForm/RedactedMeta.test.ts deleted file mode 100644 index e2d46c0a5..000000000 --- a/packages/vue-components/__tests__/OmegaForm/RedactedMeta.test.ts +++ /dev/null @@ -1,181 +0,0 @@ -import * as S from "effect-app/Schema" -import * as Redacted from "effect/Redacted" -import { describe, expect, it } from "vitest" -import { generateMetaFromSchema, toFormSchema } from "../../src/components/OmegaForm" - -describe("S.Redacted meta generation", () => { - it("should generate correct meta for S.Redacted(S.NonEmptyString255)", () => { - const schema = S.Struct({ - email: S.NonEmptyString255, - password: S.Redacted(S.NonEmptyString255) - }) - - const result = generateMetaFromSchema(schema) - - expect(result.meta["email"]).toMatchObject({ - type: "string", - minLength: 1, - maxLength: 255, - required: true, - nullableOrUndefined: false - }) - - expect(result.meta["password"]).toMatchObject({ - type: "string", - minLength: 1, - maxLength: 255, - required: true, - nullableOrUndefined: false - }) - }) - - it("should generate correct meta for S.Redacted(S.String) — not required since empty string is valid", () => { - const schema = S.Struct({ - secret: S.Redacted(S.String) - }) - - const result = generateMetaFromSchema(schema) - - expect(result.meta["secret"]).toMatchObject({ - type: "string", - required: false, - nullableOrUndefined: false - }) - }) - - it("should generate correct meta for S.NullOr(S.Redacted(S.NonEmptyString255))", () => { - const schema = S.Struct({ - optionalSecret: S.NullOr(S.Redacted(S.NonEmptyString255)) - }) - - const result = generateMetaFromSchema(schema) - - expect(result.meta["optionalSecret"]).toMatchObject({ - type: "string", - required: false, - nullableOrUndefined: "null" - }) - }) -}) - -describe("toFormSchema — S.Redacted validation", () => { - it("should accept plain strings for S.Redacted fields and decode to Redacted", () => { - const schema = S.Struct({ - email: S.NonEmptyString255, - password: S.Redacted(S.NonEmptyString255) - }) - - const formSchema = toFormSchema(schema) - const result = S.decodeUnknownSync(formSchema)({ - email: "test@test.com", - password: "secret123" - }) - - expect(result.email).toBe("test@test.com") - expect(Redacted.isRedacted(result.password)).toBe(true) - expect(Redacted.value(result.password as Redacted.Redacted)).toBe("secret123") - }) - - it("should accept plain strings for S.Redacted(S.String)", () => { - const schema = S.Struct({ - secret: S.Redacted(S.String) - }) - - const formSchema = toFormSchema(schema) - const result = S.decodeUnknownSync(formSchema)({ secret: "hello" }) - - expect(Redacted.isRedacted(result.secret)).toBe(true) - }) - - it("should pass standard schema validation with plain string values", () => { - const schema = S.Struct({ - email: S.NonEmptyString255, - password: S.Redacted(S.NonEmptyString255) - }) - - const formSchema = toFormSchema(schema) - const ssv = S.toStandardSchemaV1(formSchema) - const result = (ssv as any)["~standard"].validate({ - email: "test@test.com", - password: "secret123" - }) - - expect(result.issues).toBeUndefined() - }) - - it("should still reject invalid inner values", () => { - const schema = S.Struct({ - password: S.Redacted(S.NonEmptyString255) - }) - - const formSchema = toFormSchema(schema) - expect(() => S.decodeUnknownSync(formSchema)({ password: "" })).toThrow() - }) - - it("should handle NullOr(S.Redacted(...))", () => { - const schema = S.Struct({ - secret: S.NullOr(S.Redacted(S.NonEmptyString255)) - }) - - const formSchema = toFormSchema(schema) - - const result1 = S.decodeUnknownSync(formSchema)({ secret: "hello" }) - expect(Redacted.isRedacted(result1.secret)).toBe(true) - - const result2 = S.decodeUnknownSync(formSchema)({ secret: null }) - expect(result2.secret).toBeNull() - }) - - it("should return the original schema when no S.Redacted fields exist", () => { - const schema = S.Struct({ - email: S.NonEmptyString255, - name: S.String - }) - - const formSchema = toFormSchema(schema) - expect(formSchema).toBe(schema) - }) - - it("should work with S.Class schemas", () => { - class Credentials extends S.Class("Credentials")({ - email: S.NonEmptyString255, - password: S.Redacted(S.NonEmptyString255) - }) {} - - const formSchema = toFormSchema(Credentials) - const result = S.decodeUnknownSync(formSchema)({ - email: "test@test.com", - password: "secret" - }) - - expect(Redacted.isRedacted(result.password)).toBe(true) - }) - - it("toFormSchema rewrites NullOr(Redacted)", () => { - const schema = S.Struct({ - secret: S.NullOr(S.Redacted(S.String)) - }) - const formSchema = toFormSchema(schema) - // formSchema must accept a plain string (encoded side) for the secret field - const decoded = S.decodeUnknownSync(formSchema)({ secret: "hello" }) - expect(decoded.secret).toBeDefined() - }) - - it("toFormSchema rewrites UndefinedOr(Redacted)", () => { - const schema = S.Struct({ - secret: S.UndefinedOr(S.Redacted(S.String)) - }) - const formSchema = toFormSchema(schema) - const decoded = S.decodeUnknownSync(formSchema)({ secret: "hello" }) - expect(decoded.secret).toBeDefined() - }) - - it("toFormSchema rewrites NullishOr(Redacted)", () => { - const schema = S.Struct({ - secret: S.NullishOr(S.Redacted(S.String)) - }) - const formSchema = toFormSchema(schema) - const decoded = S.decodeUnknownSync(formSchema)({ secret: "hello" }) - expect(decoded.secret).toBeDefined() - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/SelectMultipleLocalization.test.ts b/packages/vue-components/__tests__/OmegaForm/SelectMultipleLocalization.test.ts deleted file mode 100644 index 542a0b302..000000000 --- a/packages/vue-components/__tests__/OmegaForm/SelectMultipleLocalization.test.ts +++ /dev/null @@ -1,123 +0,0 @@ -// __tests__/OmegaForm/SelectMultipleLocalization.test.ts -import { mount } from "@vue/test-utils" -import * as Effect from "effect-app/Effect" -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { defineComponent } from "vue" -import { useOmegaForm } from "../../src/components/OmegaForm" -import OmegaIntlProvider from "../OmegaIntlProvider.vue" - -const mountForm = (setup: () => T): T => { - let captured: T | undefined - const Inner = defineComponent({ - setup() { - captured = setup() - return {} - }, - template: "
" - }) - mount(defineComponent({ - components: { OmegaIntlProvider, Inner }, - template: "" - })) - if (!captured) throw new Error("no capture") - return captured -} - -const firstFieldError = (form: any, name: string): string | undefined => { - const errs = form.getAllErrors().fields[name]?.errors - if (!errs) return undefined - const flat = errs.flat ? errs.flat() : errs - return flat[0]?.message -} - -describe("select / multiple validation messages carry localized payload", () => { - it("S.Literals — invalid (non-empty) member emits 'select' message with members", async () => { - const schema = S.Struct({ color: S.Literals(["red", "blue", "green"]) }) - const form = mountForm(() => - useOmegaForm(schema, { - defaultValues: { color: "purple" } as any, - onSubmit: async () => undefined - }) - ) - await Effect.runPromise(form.handleSubmitEffect()) - const msg = firstFieldError(form, "color") - // OmegaIntlProvider's mock `trans` returns `${key}_translated` and - // ignores variables — so we just need the i18n key to flow, not the - // substituted variables. - expect(msg, `got: ${msg}`).toBe("validation.not_a_valid_translated") - }) - - it("S.Array(S.Literals) — non-array value emits 'multiple' message", async () => { - const schema = S.Struct({ tags: S.Array(S.Literals(["a", "b", "c"])) }) - const form = mountForm(() => - useOmegaForm(schema, { - defaultValues: { tags: "not-an-array" } as any, - onSubmit: async () => undefined - }) - ) - await Effect.runPromise(form.handleSubmitEffect()) - const msg = firstFieldError(form, "tags") - expect(msg, `got: ${msg}`).toBe("validation.not_a_valid_translated") - }) - - it("S.NullOr(S.Literals) — invalid member emits localized select message", async () => { - const schema = S.Struct({ color: S.NullOr(S.Literals(["red", "blue", "green"])) }) - const form = mountForm(() => - useOmegaForm(schema, { - defaultValues: { color: "purple" } as any, - onSubmit: async () => undefined - }) - ) - await Effect.runPromise(form.handleSubmitEffect()) - const msg = firstFieldError(form, "color") - expect(msg, `got: ${msg}`).toBe("validation.not_a_valid_translated") - }) - - it("S.UndefinedOr(S.Literals) — invalid member emits localized select message", async () => { - const schema = S.Struct({ color: S.UndefinedOr(S.Literals(["red", "blue", "green"])) }) - const form = mountForm(() => - useOmegaForm(schema, { - defaultValues: { color: "purple" } as any, - onSubmit: async () => undefined - }) - ) - await Effect.runPromise(form.handleSubmitEffect()) - const msg = firstFieldError(form, "color") - expect(msg, `got: ${msg}`).toBe("validation.not_a_valid_translated") - }) - - it("user-supplied .annotate({ message }) on S.Literals is preserved", async () => { - const schema = S.Struct({ - color: S.Literals(["red", "blue", "green"]).annotate({ - message: "user.custom.message" - }) - }) - const form = mountForm(() => - useOmegaForm(schema, { - defaultValues: { color: "purple" } as any, - onSubmit: async () => undefined - }) - ) - await Effect.runPromise(form.handleSubmitEffect()) - const msg = firstFieldError(form, "color") - // User annotation wins — verbatim, not piped through trans. - expect(msg).toBe("user.custom.message") - }) - - it("empty value on a required select also emits the localized 'select' message (matches main)", async () => { - // Main's `generateInputStandardSchemaFromFieldMeta` annotated the entire - // S.Literals schema with a `validation.not_a_valid` message, so any - // failure (including undefined) surfaced it. We preserve that behavior. - const schema = S.Struct({ color: S.Literals(["red", "blue", "green"]) }) - const form = mountForm(() => - useOmegaForm(schema, { - defaultValues: { color: undefined } as any, - onSubmit: async () => undefined - }) - ) - await Effect.runPromise(form.handleSubmitEffect()) - const msg = firstFieldError(form, "color") - expect(msg).toBe("validation.not_a_valid_translated") - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/SubmitEffect.test.ts b/packages/vue-components/__tests__/OmegaForm/SubmitEffect.test.ts deleted file mode 100644 index 2c4fd11fb..000000000 --- a/packages/vue-components/__tests__/OmegaForm/SubmitEffect.test.ts +++ /dev/null @@ -1,142 +0,0 @@ -// __tests__/OmegaForm/SubmitEffect.test.ts -import { mount } from "@vue/test-utils" -import * as Effect from "effect-app/Effect" -import * as S from "effect-app/Schema" -import * as Cause from "effect/Cause" -import * as Exit from "effect/Exit" -import { describe, expect, it } from "vitest" -import { defineComponent } from "vue" -import { FormErrors, useOmegaForm } from "../../src/components/OmegaForm" -import OmegaIntlProvider from "../OmegaIntlProvider.vue" - -const mountForm = (setupForm: () => T): T => { - let captured: T | undefined - const Inner = defineComponent({ - setup() { - captured = setupForm() - return {} - }, - template: "
" - }) - const Wrapper = defineComponent({ - components: { OmegaIntlProvider, Inner }, - template: "" - }) - mount(Wrapper) - if (!captured) throw new Error("setupForm did not return") - return captured -} - -describe("handleSubmitEffect", () => { - it("succeeds with void on valid input (no checkErrors)", async () => { - const form = mountForm(() => - useOmegaForm( - S.Struct({ x: S.String.pipe(S.check(S.isMinLength(2))) }), - { defaultValues: { x: "ok" }, onSubmit: async () => undefined } - ) - ) - const exit = await Effect.runPromise(Effect.exit(form.handleSubmitEffect())) - expect(Exit.isSuccess(exit)).toBe(true) - }) - - it("succeeds with void even on invalid input without checkErrors", async () => { - const form = mountForm(() => - useOmegaForm( - S.Struct({ x: S.String.pipe(S.check(S.isMinLength(2))) }), - { defaultValues: { x: "" }, onSubmit: async () => undefined } - ) - ) - const exit = await Effect.runPromise(Effect.exit(form.handleSubmitEffect())) - expect(Exit.isSuccess(exit)).toBe(true) - }) - - it("fails with FormErrors when checkErrors and validation fails", async () => { - const form = mountForm(() => - useOmegaForm( - S.Struct({ x: S.String.pipe(S.check(S.isMinLength(2))) }), - { defaultValues: { x: "" }, onSubmit: async () => undefined } - ) - ) - const exit = await Effect.runPromise( - Effect.exit(form.handleSubmitEffect({ checkErrors: true })) - ) - expect(Exit.isFailure(exit)).toBe(true) - if (Exit.isFailure(exit)) { - const failReason = exit.cause.reasons.find(Cause.isFailReason) - expect(failReason?.error).toBeInstanceOf(FormErrors) - } - }) - - it("delivers decoded To to onSubmit (not raw From)", async () => { - let received: unknown - const form = mountForm(() => - useOmegaForm( - S.Struct({ n: S.FiniteFromString }), - { - defaultValues: { n: "42" }, - onSubmit: async ({ value }) => { - received = value - } - } - ) - ) - await Effect.runPromise(form.handleSubmitEffect()) - expect(received).toEqual({ n: 42 }) - }) - - it("awaits Promise-returning onSubmit", async () => { - let resolved = false - const form = mountForm(() => - useOmegaForm( - S.Struct({ x: S.String }), - { - defaultValues: { x: "" }, - onSubmit: async () => { - await new Promise((r) => setTimeout(r, 5)) - resolved = true - } - } - ) - ) - await Effect.runPromise(form.handleSubmitEffect()) - expect(resolved).toBe(true) - }) - - it("awaits Effect-returning onSubmit", async () => { - let resolved = false - const form = mountForm(() => - useOmegaForm( - S.Struct({ x: S.String }), - { - defaultValues: { x: "" }, - onSubmit: () => - Effect.sync(() => { - resolved = true - }) - } - ) - ) - await Effect.runPromise(form.handleSubmitEffect()) - expect(resolved).toBe(true) - }) - - it("awaits Fiber-returning onSubmit", async () => { - let resolved = false - const form = mountForm(() => - useOmegaForm( - S.Struct({ x: S.String }), - { - defaultValues: { x: "" }, - onSubmit: () => - Effect.runFork( - Effect.sync(() => { - resolved = true - }) - ) - } - ) - ) - await Effect.runPromise(form.handleSubmitEffect()) - expect(resolved).toBe(true) - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/SubmitErrorClear.test.ts b/packages/vue-components/__tests__/OmegaForm/SubmitErrorClear.test.ts deleted file mode 100644 index 7d4bb7200..000000000 --- a/packages/vue-components/__tests__/OmegaForm/SubmitErrorClear.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -// __tests__/OmegaForm/SubmitErrorClear.test.ts -import { mount } from "@vue/test-utils" -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { defineComponent, nextTick } from "vue" -import { useOmegaForm } from "../../src/components/OmegaForm" -import OmegaIntlProvider from "../OmegaIntlProvider.vue" - -describe("post-submit revalidation (TanStack default)", () => { - it("revalidates the form-level schema on value change after a failed submit", async () => { - const schema = S.Struct({ - a: S.String.pipe(S.check(S.isMinLength(2))), - b: S.String.pipe(S.check(S.isMinLength(2))) - }) - - let captured: ReturnType> | undefined - const Inner = defineComponent({ - setup() { - const form = useOmegaForm(schema, { defaultValues: { a: "", b: "" } }) - captured = form as any - return { form } - }, - // Render fields so they register with the form. Without mounted fields, - // setFieldValue cannot trigger validation (FormApi.validateField bails - // when fieldInfo[name].instance is undefined). - template: ` - - - - - ` - }) - const Wrapper = defineComponent({ - components: { OmegaIntlProvider, Inner }, - template: "" - }) - mount(Wrapper) - if (!captured) throw new Error("setupForm did not return") - const form = captured - - await form.handleSubmit() - await nextTick() - - // After failed submit, fix only field a; field b should still fail validation - // because TanStack revalidates the entire form-level schema. - form.setFieldValue("a", "ok") - await nextTick() - await nextTick() - - // canSubmit should still be false because b is still invalid - expect(form.store.state.canSubmit).toBe(false) - - // Now fix b too - form.setFieldValue("b", "ok") - await nextTick() - await nextTick() - expect(form.store.state.canSubmit).toBe(true) - }) -}) diff --git a/packages/vue-components/__tests__/OmegaForm/TaggedUnionBehavior.test.ts b/packages/vue-components/__tests__/OmegaForm/TaggedUnionBehavior.test.ts deleted file mode 100644 index 7e229904e..000000000 --- a/packages/vue-components/__tests__/OmegaForm/TaggedUnionBehavior.test.ts +++ /dev/null @@ -1,251 +0,0 @@ -import { mount } from "@vue/test-utils" -import * as Effect from "effect-app/Effect" -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { defineComponent, nextTick } from "vue" -import { createUseFormWithCustomInput } from "../../src/components/OmegaForm" -import OmegaIntlProvider from "../OmegaIntlProvider.vue" - -const HeadlessInput = defineComponent({ - inheritAttrs: false, - props: ["inputProps", "field", "state", "options"], - template: ` -
- - - {{ inputProps.errorMessages?.join(', ') }} -
- `, - methods: { - onInput(this: any, e: Event) { - const target = e.target as HTMLInputElement - const value = target.value - if (this.inputProps.type === "number") { - this.field.handleChange(value === "" ? null : Number(value)) - } else { - this.field.handleChange(value) - } - } - } -}) - -const useForm = createUseFormWithCustomInput(HeadlessInput) - -const flushAfterTagChange = async () => { - // OmegaTaggedUnionInternal watches _tag and on change calls form.reset(), - // then setTimeout(validate, 0). Give it room. - await nextTick() - await nextTick() - await new Promise((r) => setTimeout(r, 10)) - await nextTick() -} - -describe("RootLevelTaggedUnion behavior", () => { - const schema = S.Union([ - S.TaggedStruct("A", { - a: S.NonEmptyString255.pipe( - S.withConstructorDefault(Effect.succeed(S.NonEmptyString255("aaaa"))) - ), - common: S.NonEmptyString255 - }), - S.TaggedStruct("B", { - b: S.Finite, - nullableB: S.NullOr(S.Finite), - common: S.NullOr(S.String) - }) - ]) - - const mountForm = (onSubmit?: (value: any) => void) => { - return mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useForm(schema as any, { - defaultValues: { _tag: "A" } as any, - onSubmit: async ({ value }: any) => onSubmit?.(value) - }) - const tagOptions = [ - { value: "A", title: "Option A" }, - { value: "B", title: "Option B" } - ] - return { form, tagOptions } - } - }) - } - - it("renders branch A's slot by default and not B's", async () => { - const wrapper = mountForm() - await nextTick() - - expect(wrapper.find("[data-testid=\"input-a\"]").exists()).toBe(true) - expect(wrapper.find("[data-testid=\"input-common\"]").exists()).toBe(true) - expect(wrapper.find("[data-testid=\"input-b\"]").exists()).toBe(false) - expect(wrapper.find("[data-testid=\"input-nullableB\"]").exists()).toBe(false) - }) - - it("toggling _tag from A to B swaps the rendered branch slot", async () => { - const wrapper = mountForm() - await nextTick() - - const select = wrapper.find("[data-testid=\"select-_tag\"]") - expect(select.exists()).toBe(true) // Drive the change through the form API to mirror what the UI handler - // produces. setValue + change events on the bare - {{ inputProps.errorMessages.join(', ') }} - - `, - props: ["inputProps", "field"], - inheritAttrs: false -} - -describe("createUseFormWithCustomInput", () => { - const useForm = createUseFormWithCustomInput(CustomTestInput) - const schema = S.Struct({ testField: S.String }) - - const createWrapper = (options?: { - defaultValues?: any - onSubmit?: (data: any) => void | Promise - }) => { - let submittedValue: any = null - - const wrapper = mount({ - components: { - OmegaIntlProvider - }, - template: ` - - - - - - `, - setup() { - const form = useForm(schema, { - defaultValues: options?.defaultValues || { testField: "" }, - onSubmit: async ({ value }) => { - submittedValue = value - options?.onSubmit?.(value) - } - }) - return { form, getSubmittedValue: () => submittedValue } - } - }, { - global: { - stubs: { - CustomTestInput - } - } - }) - - return wrapper - } - - it("should render custom input component with correct props", async () => { - const wrapper = createWrapper({ defaultValues: { testField: "test value" } }) - await wrapper.vm.$nextTick() - - // Check that custom input was rendered - const customInput = wrapper.find("[data-testid=\"custom-input\"]") - expect(customInput.exists()).toBe(true) - expect(customInput.classes()).toContain("custom-test-input") - - // Verify the input has the correct value - const inputElement = wrapper.find("[data-testid=\"custom-input-field\"]") - expect(inputElement.exists()).toBe(true) - expect((inputElement.element as HTMLInputElement).value).toBe("test value") - - // Verify the label is rendered - const label = customInput.find("label") - expect(label.exists()).toBe(true) - expect(label.text()).toContain("Test Field") - }) - - it("should handle input changes and submission", async () => { - const wrapper = createWrapper({ defaultValues: { testField: "initial" } }) - await wrapper.vm.$nextTick() - - // Verify initial value - const input = wrapper.find("[data-testid=\"custom-input-field\"]") - expect((input.element as HTMLInputElement).value).toBe("initial") - - // Change the value - await input.setValue("changed value") - await wrapper.vm.$nextTick() - - // Verify the value changed in the form state - const valuesDiv = wrapper.find("[data-testid=\"values\"]") - expect(valuesDiv.text()).toContain("\"testField\":\"changed value\"") - - // Submit the form - await wrapper.find("[data-testid=\"submit\"]").trigger("click") - await wrapper.vm.$nextTick() - await new Promise((resolve) => setTimeout(resolve, 100)) - - // Check that the form received the changed value - const vm = wrapper.vm as any - expect(vm.getSubmittedValue()).toEqual({ testField: "changed value" }) - }) - - it("should pass inputProps to custom component", async () => { - // Custom component that validates props - const PropsValidatingInput = { - template: ` -
-
{{ !!inputProps }}
-
{{ !!field }}
-
{{ inputProps.label }}
-
{{ field.name }}
-
{{ inputProps.id }}
-
- `, - props: ["inputProps", "field"] - } - - const useFormWithValidator = createUseFormWithCustomInput(PropsValidatingInput) - const validationSchema = S.Struct({ myField: S.String }) - - const wrapper = mount({ - components: { - OmegaIntlProvider - }, - template: ` - - - - - - `, - setup() { - const form = useFormWithValidator(validationSchema, { - defaultValues: { myField: "test-value" } - }) - return { form } - } - }, { - global: { - stubs: { - PropsValidatingInput - } - } - }) - - await wrapper.vm.$nextTick() - - const validator = wrapper.find("[data-testid=\"props-validator\"]") - expect(validator.exists()).toBe(true) - - // Check all required props are passed - expect(wrapper.find("[data-testid=\"has-inputprops\"]").text()).toBe("true") - expect(wrapper.find("[data-testid=\"has-field\"]").text()).toBe("true") - expect(wrapper.find("[data-testid=\"has-label\"]").text()).toContain("My Label") - expect(wrapper.find("[data-testid=\"has-id\"]").text()).toBeTruthy() - }) - - it("forwards an explicit `required` override to inputProps (survives OmegaInput's prop whitelist)", async () => { - const RequiredProbe = { - template: `
{{ inputProps.required }}
`, - props: ["inputProps", "field"] - } - - const useFormWithProbe = createUseFormWithCustomInput(RequiredProbe) - // optionalKey field => meta.required is false, so a `true` result proves the - // explicit prop overrode meta AND was not dropped on the way to the input. - const optionalSchema = S.Struct({ maybe: S.optionalKey(S.Number) }) - - const wrapper = mount({ - components: { - OmegaIntlProvider - }, - template: ` - - - - - - `, - setup() { - const form = useFormWithProbe(optionalSchema, { defaultValues: {} }) - return { form } - } - }, { - global: { - stubs: { - RequiredProbe - } - } - }) - - await wrapper.vm.$nextTick() - - expect(wrapper.find("[data-testid=\"required-probe\"]").text()).toBe("true") - }) - - it("falls back to schema-derived required when the prop is omitted", async () => { - const RequiredProbe = { - template: ` -
-
{{ inputProps.required }}
-
{{ inputProps.label }}
-
- `, - props: ["inputProps", "field"] - } - - const useFormWithProbe = createUseFormWithCustomInput(RequiredProbe) - const requiredSchema = S.Struct({ number: S.Number }) - - const wrapper = mount({ - components: { - OmegaIntlProvider - }, - template: ` - - - - - - `, - setup() { - const form = useFormWithProbe(requiredSchema) - return { form } - } - }, { - global: { - stubs: { - RequiredProbe - } - } - }) - - await wrapper.vm.$nextTick() - - expect(wrapper.find("[data-testid=\"required-probe\"]").text()).toBe("true") - expect(wrapper.find("[data-testid=\"label-probe\"]").text()).toBe("Number *") - }) - - it("should pass event listeners to custom input component", async () => { - // Custom component that emits focus and blur events - const EventEmittingInput = { - template: ` -
- -
- `, - props: ["inputProps", "field"], - emits: ["focus", "blur"], - inheritAttrs: false - } - - const useFormWithEvents = createUseFormWithCustomInput(EventEmittingInput) - const eventSchema = S.Struct({ eventField: S.String }) - - let focusCount = 0 - let blurCount = 0 - - const wrapper = mount({ - components: { - OmegaIntlProvider - }, - template: ` - - - - - - `, - setup() { - const form = useFormWithEvents(eventSchema, { - defaultValues: { eventField: "" } - }) - - const handleFocus = () => { - focusCount++ - } - - const handleBlur = () => { - blurCount++ - } - - return { form, handleFocus, handleBlur } - } - }, { - global: { - stubs: { - EventEmittingInput - } - } - }) - - await wrapper.vm.$nextTick() - - // Verify the custom input was rendered - const eventInput = wrapper.find("[data-testid=\"event-input\"]") - expect(eventInput.exists()).toBe(true) - - // Trigger focus event - await eventInput.trigger("focusin") - await wrapper.vm.$nextTick() - - // Verify focus handler was called - expect(focusCount).toBe(1) - - // Trigger blur event - await eventInput.trigger("focusout") - await wrapper.vm.$nextTick() - - // Verify blur handler was called - expect(blurCount).toBe(1) - - // Trigger multiple times to ensure it keeps working - await eventInput.trigger("focusin") - await eventInput.trigger("focusout") - await wrapper.vm.$nextTick() - - expect(focusCount).toBe(2) - expect(blurCount).toBe(2) - }) -}) diff --git a/packages/vue-components/__tests__/OmegaFormTest.vue b/packages/vue-components/__tests__/OmegaFormTest.vue deleted file mode 100644 index b84195d3f..000000000 --- a/packages/vue-components/__tests__/OmegaFormTest.vue +++ /dev/null @@ -1,62 +0,0 @@ - - - diff --git a/packages/vue-components/__tests__/OmegaIntlProvider.vue b/packages/vue-components/__tests__/OmegaIntlProvider.vue deleted file mode 100644 index bfcf31cbc..000000000 --- a/packages/vue-components/__tests__/OmegaIntlProvider.vue +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/packages/vue-components/__tests__/migration/schema-v4-migration.test.ts b/packages/vue-components/__tests__/migration/schema-v4-migration.test.ts deleted file mode 100644 index ad5f1393c..000000000 --- a/packages/vue-components/__tests__/migration/schema-v4-migration.test.ts +++ /dev/null @@ -1,703 +0,0 @@ -/** - * OmegaForm Schema Tests - * - * These tests pin the current behavior of generateMetaFromSchema and defaultsValueFromSchema, - * ensuring regression safety during refactors. - * - * Strategy: - * 1. "current" tests → pin behavior with current schema patterns - * 2. When refactoring internals, ALL tests must stay green - * - * NOTE: Uses `S.withConstructorDefault` from effect-app (wraps in Effect), - * NOT `S.withConstructorDefault` from native effect (expects raw Option return). - * - * ---- v4 breaking changes (from v3) ---- - * - * 1. Nested union _tag: FIXED — both patterns now produce "select" - * S.TaggedStruct produces a bare Literal AST node. - * Legacy S.Struct({ _tag: S.Literal("X") }) produces Union([Literal("X")]) - * after AST.toType. Fixed via unwrapSingleLiteralUnion helper. - * A console.warn is emitted for the legacy pattern to encourage migration. - * - * 2. Root-level union unionMeta: FIXED — both patterns now generate unionMeta - * Same root cause as #1: single-element Union wrapping prevented tag extraction. - * Fixed via the same unwrapSingleLiteralUnion helper in metadataFromAst. - * - * 3. UndefinedOr defaults include the key with explicit undefined - * v3: defaultsValueFromSchema skips keys where the recursive call returns - * undefined (if fieldValue !== undefined), so UndefinedOr fields are - * omitted from the result object entirely. - * v4: the key will be present in the result with an explicit undefined value. - * - * 4. S.optionalKey(X).pipe(S.withDecodingDefault(...)) support in defaultsValueFromSchema - * v3: not supported (v3 equivalent was S.optionalWith which encoded defaults - * inside a PropertySignatureTransformation, opaque to AST inspection). - * v4: defaultsValueFromSchema detects PropertySignatureTransformation - * and extracts defaults, enabling withDecodingDefault as a new pattern for - * declaring field defaults directly on the schema. - * - * ---- API mapping ---- - * - * | v4 | v3 | - * |--------------------------------------------|--------------------------------| - * | `S.check(S.isGreaterThanOrEqualTo(x))` | `S.greaterThanOrEqualTo(x)` | - * | `S.check(S.isLessThanOrEqualTo(x))` | `S.lessThanOrEqualTo(x)` | - * | `S.check(S.isGreaterThan(x))` | `S.greaterThan(x)` | - * | `S.check(S.isLessThan(x))` | `S.lessThan(x)` | - * | `S.check(S.isBetween({minimum, maximum}))` | `S.between(minimum, maximum)` | - * | `S.check(S.isInt())` | `S.int()` | - * | `S.check(S.isMinLength(x))` | `S.minLength(x)` | - * | `S.check(S.isMaxLength(x))` | `S.maxLength(x)` | - * | `S.Union([...members])` | `S.Union(...members)` | - * | `S.optionalKey(S.X)` | `S.optionalWith` | - * | `.pipe(S.withDecodingDefault(...))` | `(S.X, { default: ... })` | - */ - -import { mount } from "@vue/test-utils" -import * as Effect from "effect-app/Effect" -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { defaultsValueFromSchema, generateMetaFromSchema, useOmegaForm } from "../../src/components/OmegaForm" -import OmegaIntlProvider from "../OmegaIntlProvider.vue" - -// --------------------------------------------------------------------------- -// Helpers -// --------------------------------------------------------------------------- - -/** Mount a form and extract its default values */ -const mountAndGetDefaults = async (schema: S.Schema, opts?: any) => { - const wrapper = mount({ - components: { OmegaIntlProvider }, - template: ` - - - - - - `, - setup() { - const form = useOmegaForm(schema as any, opts) - return { form } - } - }) - await wrapper.vm.$nextTick() - return JSON.parse(wrapper.find("[data-testid=\"values\"]").text()) -} - -// ============================================================================ -// 1. generateMetaFromSchema — pin current behavior -// ============================================================================ - -describe("generateMetaFromSchema", () => { - describe("simple struct", () => { - const schema = S.Struct({ - name: S.NonEmptyString255, - age: S.Finite.pipe(S.check(S.isGreaterThanOrEqualTo(0))), - active: S.Boolean - }) - - it("produces correct metadata for basic types", () => { - const { meta } = generateMetaFromSchema(schema) - expect(meta.name?.type).toBe("string") - expect(meta.name?.required).toBe(true) - expect(meta.name?.minLength).toBe(1) - expect(meta.name?.maxLength).toBe(255) - expect(meta.age?.type).toBe("number") - expect(meta.age?.required).toBe(true) - expect(meta.age?.minimum).toBe(0) - expect(meta.active?.type).toBe("boolean") - expect(meta.active?.required).toBe(true) - }) - }) - - describe("nullable fields", () => { - const schema = S.Struct({ - required: S.NonEmptyString255, - nullable: S.NullOr(S.String), - optional: S.UndefinedOr(S.String) - }) - - it("nullable/undefined fields are not required", () => { - const { meta } = generateMetaFromSchema(schema) - expect(meta.required?.required).toBe(true) - expect(meta.nullable?.required).toBe(false) - expect(meta.nullable?.nullableOrUndefined).toBe("null") - expect(meta.optional?.required).toBe(false) - expect(meta.optional?.nullableOrUndefined).toBe("undefined") - }) - }) - - describe("nested struct", () => { - const schema = S.Struct({ - outer: S.Struct({ - inner: S.NonEmptyString255, - deep: S.Struct({ - value: S.Finite - }) - }) - }) - - it("produces dot-notation keys for nested fields", () => { - const { meta } = generateMetaFromSchema(schema) - expect(meta["outer.inner"]).toBeDefined() - expect(meta["outer.inner"]?.type).toBe("string") - expect(meta["outer.deep.value"]).toBeDefined() - expect(meta["outer.deep.value"]?.type).toBe("number") - }) - }) - - describe("discriminated union (nested in struct)", () => { - const schema = S.Struct({ - union: S.Union([ - S.Struct({ _tag: S.tag("A"), a: S.NonEmptyString255 }), - S.Struct({ _tag: S.tag("B"), b: S.Finite }) - ]) - }) - - it("generates _tag as select with member values", () => { - const { meta } = generateMetaFromSchema(schema) - // Works for both S.TaggedStruct and legacy S.Struct({ _tag: S.Literal(...) }) - // thanks to single-element Union unwrapping in createMeta - expect(meta["union._tag"]?.type).toBe("select") - expect(meta["union._tag"]?.required).toBe(true) - expect(meta["union._tag"]?.members).toBeDefined() - }) - - it("generates field metadata for each union branch", () => { - const { meta } = generateMetaFromSchema(schema) - expect(meta["union.a"]?.type).toBe("string") - expect(meta["union.b"]?.type).toBe("number") - }) - - it("nested union now populates unionMeta after unification (Phase 2.4)", () => { - // After unification of root + nested union handling, nested unions also - // populate unionMeta, mirroring root-level behavior. - const { unionMeta } = generateMetaFromSchema(schema) - expect(Object.keys(unionMeta).length).toBe(2) - expect(unionMeta["A"]).toBeDefined() - expect(unionMeta["B"]).toBeDefined() - }) - }) - - describe("nullable discriminated union", () => { - const schema = S.Struct({ - union: S.NullOr( - S.Union([ - S.Struct({ _tag: S.Literal("A"), a: S.NonEmptyString255, common: S.String }), - S.Struct({ _tag: S.Literal("B"), b: S.Finite, common: S.String }) - ]) - ) - }) - - it("_tag is not required, other fields are required based on their type", () => { - const { meta } = generateMetaFromSchema(schema) - expect(meta["union._tag"]?.required).toBe(false) - expect(meta["union.a"]?.required).toBe(true) - expect(meta["union.b"]?.required).toBe(true) - }) - }) - - describe("root-level discriminated union (legacy Literal pattern)", () => { - const schema = S.Union([ - S.Struct({ _tag: S.Literal("A"), a: S.NonEmptyString255 }), - S.Struct({ _tag: S.Literal("B"), b: S.Finite }) - ]) - - it("generates _tag select and per-member fields with unionMeta", () => { - const { meta, unionMeta } = generateMetaFromSchema(schema) - - expect(meta["_tag"]?.type).toBe("select") - expect(meta["_tag"]?.required).toBe(true) - expect(meta.a?.type).toBe("string") - expect(meta.b?.type).toBe("number") - expect(Object.keys(unionMeta).length).toBe(2) - }) - }) - - describe("root-level discriminated union (TaggedStruct pattern)", () => { - const schema = S.Union([ - S.TaggedStruct("A", { a: S.NonEmptyString255 }), - S.TaggedStruct("B", { b: S.Finite }) - ]) - - it("generates _tag select and per-member fields with unionMeta", () => { - const { meta, unionMeta } = generateMetaFromSchema(schema) - - expect(meta["_tag"]?.type).toBe("select") - expect(meta["_tag"]?.required).toBe(true) - expect(meta["_tag"]?.members).toEqual(["A", "B"]) - expect(meta.a?.type).toBe("string") - expect(meta.b?.type).toBe("number") - expect(Object.keys(unionMeta).length).toBe(2) - expect(unionMeta["A"]).toBeDefined() - expect(unionMeta["B"]).toBeDefined() - }) - - it("unionMeta contains per-branch field metadata", () => { - const { unionMeta } = generateMetaFromSchema(schema) - - expect(unionMeta["A"]?.["a"]?.type).toBe("string") - expect(unionMeta["A"]?.["a"]?.required).toBe(true) - expect(unionMeta["B"]?.["b"]?.type).toBe("number") - expect(unionMeta["B"]?.["b"]?.required).toBe(true) - // Each branch should NOT contain the other branch's fields - expect(unionMeta["A"]?.["b"]).toBeUndefined() - expect(unionMeta["B"]?.["a"]).toBeUndefined() - }) - }) - - describe("literal union (select)", () => { - const schema = S.Struct({ - direction: S.Union([S.Literal("left"), S.Literal("right"), S.Literal("both")]) - }) - - it("generates select type with members", () => { - const { meta } = generateMetaFromSchema(schema) - expect(meta.direction?.type).toBe("select") - expect(meta.direction?.members).toEqual(["left", "right", "both"]) - }) - }) -}) - -// ============================================================================ -// 2. defaultsValueFromSchema — pin current behavior -// ============================================================================ - -describe("defaultsValueFromSchema", () => { - describe("primitive defaults", () => { - it("String defaults to empty string", () => { - const schema = S.Struct({ name: S.String }) - expect(defaultsValueFromSchema(schema)).toEqual({ name: "" }) - }) - - it("Boolean defaults to false", () => { - const schema = S.Struct({ active: S.Boolean }) - expect(defaultsValueFromSchema(schema)).toEqual({ active: false }) - }) - - it("NullOr defaults to null", () => { - const schema = S.Struct({ value: S.NullOr(S.String) }) - expect(defaultsValueFromSchema(schema)).toEqual({ value: null }) - }) - - it("UndefinedOr defaults include the key with undefined value", () => { - const schema = S.Struct({ value: S.UndefinedOr(S.String) }) - const result = defaultsValueFromSchema(schema) - expect("value" in result).toBe(true) - expect(result.value).toBeUndefined() - }) - }) - - describe("withConstructorDefault (effect-app wrapper)", () => { - it("respects constructor defaults", () => { - const schema = S.Struct({ - name: S.String.pipe(S.withConstructorDefault(Effect.succeed("hello"))), - count: S.Finite.pipe(S.withConstructorDefault(Effect.succeed(42))) - }) - const defaults = defaultsValueFromSchema(schema) - expect(defaults.name).toBe("hello") - expect(defaults.count).toBe(42) - }) - - it("constructor defaults in union members", () => { - const schema = S.Union([ - S.Struct({ - _tag: S.Literal("A").pipe(S.withConstructorDefault(Effect.succeed("A"))), - a: S.String.pipe(S.withConstructorDefault(Effect.succeed("defaultA"))) - }), - S.Struct({ - _tag: S.Literal("B"), - b: S.String - }) - ]) - const defaults = defaultsValueFromSchema(schema) - expect(defaults._tag).toBe("A") - expect(defaults.a).toBe("defaultA") - }) - }) - - describe("nested struct defaults", () => { - it("recursively extracts defaults from nested structs", () => { - const schema = S.Struct({ - outer: S.Struct({ - name: S.String.pipe(S.withConstructorDefault(Effect.succeed("nested"))), - value: S.Boolean - }) - }) - const defaults = defaultsValueFromSchema(schema) - expect(defaults.outer.name).toBe("nested") - expect(defaults.outer.value).toBe(false) - }) - }) - - describe("NullOr struct defaults", () => { - it("NullOr struct defaults to null", () => { - const schema = S.Struct({ - nested: S.NullOr(S.Struct({ x: S.String })) - }) - expect(defaultsValueFromSchema(schema)).toEqual({ nested: null }) - }) - }) -}) - -// ============================================================================ -// 3. withDecodingDefault — decoding defaults -// ============================================================================ - -describe("withDecodingDefault decoding defaults", () => { - it("withDecodingDefault fills value during decoding", () => { - const schema = S.Struct({ - name: S.optionalKey(S.String).pipe(S.withDecodingDefault(Effect.succeed("defaultName"))), - age: S.optionalKey(S.Finite).pipe(S.withDecodingDefault(Effect.succeed(0))) - }) - - const decoded = S.decodeUnknownSync(schema)({}) - expect(decoded).toEqual({ name: "defaultName", age: 0 }) - }) - - it("withDecodingDefault respects provided values", () => { - const schema = S.Struct({ - name: S.optionalKey(S.String).pipe(S.withDecodingDefault(Effect.succeed("defaultName"))) - }) - - const decoded = S.decodeUnknownSync(schema)({ name: "provided" }) - expect(decoded).toEqual({ name: "provided" }) - }) - - it("mixed withConstructorDefault and withDecodingDefault", () => { - const schema = S.Struct({ - constructorDefault: S.String.pipe(S.withConstructorDefault(Effect.succeed("fromConstructor"))), - decodingDefault: S.optionalKey(S.String).pipe(S.withDecodingDefault(Effect.succeed("fromDecoding"))) - }) - - // defaultsValueFromSchema should pick up constructor default - const defaults = defaultsValueFromSchema(schema) - expect(defaults.constructorDefault).toBe("fromConstructor") - - // Decoding should pick up decoding default - const decoded = S.decodeUnknownSync(schema)({ constructorDefault: "x" }) - expect(decoded).toEqual({ constructorDefault: "x", decodingDefault: "fromDecoding" }) - }) - - it("defaultsValueFromSchema extracts withDecodingDefault alongside regular fields", () => { - const schema = S.Struct({ - name: S.optionalKey(S.String).pipe(S.withDecodingDefault(Effect.succeed("decodingDefault"))), - required: S.String - }) - - const defaults = defaultsValueFromSchema(schema) - expect(defaults.required).toBe("") - expect(defaults.name).toBe("decodingDefault") - }) - - it("withDecodingDefault can replace manual form default initialization", () => { - const schema = S.Struct({ - name: S.optionalKey(S.String).pipe(S.withDecodingDefault(Effect.succeed("John"))), - age: S.optionalKey(S.Finite).pipe(S.withDecodingDefault(Effect.succeed(25))), - active: S.optionalKey(S.Boolean).pipe(S.withDecodingDefault(Effect.succeed(true))) - }) - - // Single decode call produces all defaults — no AST walking needed - const defaults = S.decodeUnknownSync(schema)({}) - expect(defaults).toEqual({ name: "John", age: 25, active: true }) - - // Partial input fills in missing defaults - const partial = S.decodeUnknownSync(schema)({ name: "Dave" }) - expect(partial).toEqual({ name: "Dave", age: 25, active: true }) - }) -}) - -// ============================================================================ -// 4. Form-level integration tests — defaults flow end-to-end -// ============================================================================ - -describe("Form defaults integration", () => { - it("schema defaults flow into form values", async () => { - const schema = S.Struct({ - name: S.String.pipe(S.withConstructorDefault(Effect.succeed("hello"))), - active: S.Boolean, - nullable: S.NullOr(S.String) - }) - - const values = await mountAndGetDefaults(schema) - expect(values.name).toBe("hello") - expect(values.active).toBe(false) - expect(values.nullable).toBe(null) - }) - - it("union defaults flow into form values", async () => { - const schema = S.Union([ - S.Struct({ - _tag: S.Literal("A").pipe(S.withConstructorDefault(Effect.succeed("A"))), - value: S.String.pipe(S.withConstructorDefault(Effect.succeed("default"))) - }), - S.Struct({ - _tag: S.Literal("B"), - value: S.Finite - }) - ]) - - const values = await mountAndGetDefaults(schema) - expect(values._tag).toBe("A") - expect(values.value).toBe("default") - }) - - it("tanstack defaultValues override schema defaults", async () => { - const schema = S.Struct({ - name: S.String.pipe(S.withConstructorDefault(Effect.succeed("fromSchema"))), - age: S.Finite.pipe(S.withConstructorDefault(Effect.succeed(0))) - }) - - const values = await mountAndGetDefaults(schema, { - defaultValues: { name: "fromTanstack" } - }) - expect(values.name).toBe("fromTanstack") - expect(values.age).toBe(0) - }) -}) - -// ============================================================================ -// 5. Meta generation for number constraints -// ============================================================================ - -describe("number constraint metadata", () => { - it("separate isGreaterThanOrEqualTo + isLessThanOrEqualTo extracts min and max", () => { - const schema = S.Struct({ - value: S.Finite.pipe( - S.check(S.isGreaterThanOrEqualTo(10)), - S.check(S.isLessThanOrEqualTo(20)) - ) - }) - const { meta } = generateMetaFromSchema(schema) - expect(meta.value?.type).toBe("number") - expect(meta.value?.minimum).toBe(10) - expect(meta.value?.maximum).toBe(20) - }) - - it("isBetween extracts min and max", () => { - const schema = S.Struct({ - value: S.Finite.pipe(S.check(S.isBetween({ minimum: 10, maximum: 20 }))) - }) - const { meta } = generateMetaFromSchema(schema) - expect(meta.value?.type).toBe("number") - expect(meta.value?.minimum).toBe(10) - expect(meta.value?.maximum).toBe(20) - }) - - it("isInt extracts refinement", () => { - const schema = S.Struct({ - value: S.Finite.pipe(S.check(S.isInt())) - }) - const { meta } = generateMetaFromSchema(schema) - expect(meta.value?.refinement).toBe("int") - }) - - it("isGreaterThan extracts exclusive minimum", () => { - const schema = S.Struct({ - value: S.Finite.pipe(S.check(S.isGreaterThan(5))) - }) - const { meta } = generateMetaFromSchema(schema) - expect(meta.value?.exclusiveMinimum).toBe(5) - }) - - it("isLessThan extracts exclusive maximum", () => { - const schema = S.Struct({ - value: S.Finite.pipe(S.check(S.isLessThan(100))) - }) - const { meta } = generateMetaFromSchema(schema) - expect(meta.value?.exclusiveMaximum).toBe(100) - }) -}) - -// ============================================================================ -// 6. Meta generation for string constraints -// ============================================================================ - -describe("string constraint metadata", () => { - it("isMinLength and isMaxLength", () => { - const schema = S.Struct({ - value: S.String.pipe(S.check(S.isMinLength(3)), S.check(S.isMaxLength(50))) - }) - const { meta } = generateMetaFromSchema(schema) - expect(meta.value?.minLength).toBe(3) - expect(meta.value?.maxLength).toBe(50) - }) - - it("Email format detection", () => { - const schema = S.Struct({ - email: S.Email - }) - const { meta } = generateMetaFromSchema(schema) - expect(meta.email?.format).toBe("email") - expect(meta.email?.type).toBe("string") - }) -}) - -// ============================================================================ -// 7. TaggedStruct API -// ============================================================================ - -describe("TaggedStruct API", () => { - it("TaggedStruct creates struct with _tag literal", () => { - const ts = S.TaggedStruct("A", { a: S.String }) - expect(ts.fields._tag).toBeDefined() - expect(ts.fields.a).toBeDefined() - - const tagProp = ts.ast.propertySignatures.find((p: any) => p.name === "_tag") - expect(S.AST.isLiteral(tagProp!.type)).toBe(true) - expect((tagProp!.type as any).literal).toBe("A") - }) - - it("Union([TaggedStruct, TaggedStruct]) generates field metadata", () => { - const taggedSchema = S.Struct({ - union: S.Union([ - S.TaggedStruct("A", { a: S.NonEmptyString255 }), - S.TaggedStruct("B", { b: S.Finite }) - ]) - }) - - const { meta } = generateMetaFromSchema(taggedSchema) - - expect(meta["union.a"]?.type).toBe("string") - expect(meta["union.b"]?.type).toBe("number") - expect(meta["union._tag"]).toBeDefined() - }) - - it("NullOr(Union([TaggedStruct])) works for nullable discriminated unions", () => { - const schema = S.Struct({ - union: S.NullOr( - S.Union([ - S.TaggedStruct("A", { a: S.NonEmptyString255, common: S.String }), - S.TaggedStruct("B", { b: S.Finite, common: S.String }) - ]) - ) - }) - - const { meta } = generateMetaFromSchema(schema) - expect(meta["union._tag"]?.required).toBe(false) - expect(meta["union.a"]?.required).toBe(true) - expect(meta["union.b"]?.required).toBe(true) - }) - - it("TaggedStruct defaults work with withConstructorDefault", () => { - const schema = S.Union([ - S.TaggedStruct("A", { - a: S.String.pipe(S.withConstructorDefault(Effect.succeed("defaultA"))) - }), - S.TaggedStruct("B", { b: S.Finite }) - ]) - - const defaults = defaultsValueFromSchema(schema) - expect(defaults.a).toBe("defaultA") - }) - - it("TaggedStruct decoding works correctly", () => { - const schema = S.Union([ - S.TaggedStruct("A", { a: S.String }), - S.TaggedStruct("B", { b: S.Finite }) - ]) - - const decoded = S.decodeUnknownSync(schema)({ _tag: "A", a: "hello" }) - expect(decoded).toEqual({ _tag: "A", a: "hello" }) - - const decoded2 = S.decodeUnknownSync(schema)({ _tag: "B", b: 42 }) - expect(decoded2).toEqual({ _tag: "B", b: 42 }) - }) -}) - -// ============================================================================ -// 8. Array metadata -// ============================================================================ - -describe("array metadata", () => { - it("Array of primitives generates multiple type", () => { - const schema = S.Struct({ - tags: S.Array(S.String) - }) - const { meta } = generateMetaFromSchema(schema) - expect(meta.tags?.type).toBe("multiple") - }) - - it("Array of structs generates nested field metadata", () => { - const schema = S.Struct({ - items: S.Array(S.Struct({ - name: S.NonEmptyString255, - value: S.Finite - })) - }) - const { meta } = generateMetaFromSchema(schema) - expect(meta["items.name"]).toBeDefined() - expect(meta["items.name"]?.type).toBe("string") - expect(meta["items.value"]?.type).toBe("number") - }) -}) - -// ============================================================================ -// 9. withDecodingDefault form integration -// ============================================================================ - -describe("withDecodingDefault form integration", () => { - it("withDecodingDefault defaults flow into form values", async () => { - const schema = S.Struct({ - name: S.optionalKey(S.String).pipe(S.withDecodingDefault(Effect.succeed("John"))), - age: S.optionalKey(S.Finite).pipe(S.withDecodingDefault(Effect.succeed(25))), - active: S.Boolean - }) - - const values = await mountAndGetDefaults(schema) - expect(values.name).toBe("John") - expect(values.age).toBe(25) - expect(values.active).toBe(false) - }) - - it("withDecodingDefault mixed with withConstructorDefault", async () => { - const schema = S.Struct({ - fromDecoding: S.optionalKey(S.String).pipe(S.withDecodingDefault(Effect.succeed("decoding"))), - fromConstructor: S.String.pipe(S.withConstructorDefault(Effect.succeed("constructor"))), - plain: S.Boolean - }) - - const values = await mountAndGetDefaults(schema) - expect(values.fromDecoding).toBe("decoding") - expect(values.fromConstructor).toBe("constructor") - expect(values.plain).toBe(false) - }) - - it("tanstack defaultValues override withDecodingDefault", async () => { - const schema = S.Struct({ - name: S.optionalKey(S.String).pipe(S.withDecodingDefault(Effect.succeed("fromSchema"))), - other: S.optionalKey(S.Finite).pipe(S.withDecodingDefault(Effect.succeed(99))) - }) - - const values = await mountAndGetDefaults(schema, { - defaultValues: { name: "fromTanstack" } - }) - expect(values.name).toBe("fromTanstack") - expect(values.other).toBe(99) - }) -}) - -// ============================================================================ -// 10. Regression guards -// ============================================================================ - -describe("regression guards", () => { - it("isBetween extracts min and max metadata", () => { - const schema = S.Struct({ - value: S.Finite.pipe(S.check(S.isBetween({ minimum: 5, maximum: 15 }))) - }) - const { meta } = generateMetaFromSchema(schema) - expect(meta.value?.minimum).toBe(5) - expect(meta.value?.maximum).toBe(15) - }) - - it("withDecodingDefault extracted by defaultsValueFromSchema", () => { - const schema = S.Struct({ - name: S.optionalKey(S.String).pipe(S.withDecodingDefault(Effect.succeed("myDefault"))) - }) - const defaults = defaultsValueFromSchema(schema) - expect(defaults.name).toBe("myDefault") - }) -}) diff --git a/packages/vue-components/__tests__/setup.ts b/packages/vue-components/__tests__/setup.ts deleted file mode 100644 index 45a27c16d..000000000 --- a/packages/vue-components/__tests__/setup.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { config } from "@vue/test-utils" -import { useIntlKey } from "../src/utils" - -const mockUseIntl = () => - ({ - trans: (k: string) => `${k}_translated`, - formatMessage: ( - descriptor: { id?: string; defaultMessage?: string }, - _values?: Record - ) => `${descriptor.id ?? descriptor.defaultMessage ?? ""}_formatted` - }) as any - -config.global.provide = { - ...(config.global.provide ?? {}), - [useIntlKey]: mockUseIntl -} diff --git a/packages/vue-components/__tests__/test-array-meta.test.ts b/packages/vue-components/__tests__/test-array-meta.test.ts deleted file mode 100644 index ec3566229..000000000 --- a/packages/vue-components/__tests__/test-array-meta.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { generateMetaFromSchema } from "../src/components/OmegaForm" - -const schema = S.Struct({ - a: S.Array(S.Struct({ - b: S.String, - c: S.Array(S.Struct({ - d: S.String - })), - e: S.Array(S.Finite) - })), - aMultiple: S.Array(S.String), - aNullable: S.NullOr(S.Struct({ - a: S.String - })), - foo: S - .NullOr( - S.Struct({ - bar: S.UndefinedOr(S.Array(S.Struct({ - baz: S.String, - items: S.NonEmptyArray(S.Struct({ - baz: S.String, - value: S.Finite - })) - }))) - }) - ) -}) - -describe("test-array-meta", () => { - it("should generate metadata for arrays", () => { - const result = generateMetaFromSchema(schema) - console.log("Generated metadata:", JSON.stringify(result.meta, null, 2)) - console.log("Keys:", Object.keys(result.meta)) - - expect(result.meta).toHaveProperty("a.b") - expect(result.meta["a.b"].type).toBe("string") - expect(result.meta).toHaveProperty("a.c.d") - expect(result.meta["a.c.d"].type).toBe("string") - expect(result.meta).toHaveProperty("a.e") - expect(result.meta["a.e"].type).toBe("multiple") - expect(result.meta).toHaveProperty("aMultiple") - expect(result.meta["aMultiple"]?.type).toBe("multiple") - expect(result.meta).toHaveProperty("aNullable.a") - expect(result.meta["aNullable.a"]?.type).toBe("string") - expect(result.meta).not.toHaveProperty("aNullable") - expect(result.meta).toHaveProperty("foo.bar.items.baz") - expect(result.meta["foo.bar.items.baz"]?.type).toBe("string") - expect(result.meta).toHaveProperty("foo.bar.items.value") - expect(result.meta["foo.bar.items.value"]?.type).toBe("number") - expect(result.meta).toHaveProperty("foo.bar.baz") - expect(result.meta["foo.bar.baz"]?.type).toBe("string") - }) -}) diff --git a/packages/vue-components/__tests__/test-nullor-duplicate.test.ts b/packages/vue-components/__tests__/test-nullor-duplicate.test.ts deleted file mode 100644 index 9a39284e9..000000000 --- a/packages/vue-components/__tests__/test-nullor-duplicate.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { generateMetaFromSchema } from "../src/components/OmegaForm" - -// Test schema from Array.vue story -const schema = S.Struct({ - height: S - .NullOr( - S.Struct({ - left: S.String, - right: S.String, - internal: S.String - }) - ), - width: S.Struct({ - left: S.String, - right: S.String - }) -}) - -describe("test-nullor-duplicate", () => { - it("should not create duplicate height keys for NullOr struct", () => { - const result = generateMetaFromSchema(schema) - console.log("Generated metadata:", JSON.stringify(result.meta, null, 2)) - console.log("Keys:", Object.keys(result.meta)) - - // Should have nested fields for height - expect(result.meta).toHaveProperty("height.left") - expect(result.meta).toHaveProperty("height.right") - expect(result.meta).toHaveProperty("height.internal") - - // Should have nested fields for width - expect(result.meta).toHaveProperty("width.left") - expect(result.meta).toHaveProperty("width.right") - - // Should NOT have a parent "height" key (this was the duplicate issue) - expect(result.meta).not.toHaveProperty("height") - - // Regular structs also don't get parent keys, only their nested fields - expect(result.meta).not.toHaveProperty("width") - }) -}) diff --git a/packages/vue-components/__tests__/test-union-meta.test.ts b/packages/vue-components/__tests__/test-union-meta.test.ts deleted file mode 100644 index 5e11fe6cc..000000000 --- a/packages/vue-components/__tests__/test-union-meta.test.ts +++ /dev/null @@ -1,17 +0,0 @@ -import * as S from "effect-app/Schema" -import { describe, expect, it } from "vitest" -import { generateMetaFromSchema } from "../src/components/OmegaForm" - -const schema = S.Struct({ - mine: S.Struct({ their: S.Union([S.String, S.Struct({ yours: S.String })]) }) -}) - -describe("test-union-meta", () => { - it("should generate metadata for union", () => { - const result = generateMetaFromSchema(schema) - console.log("Generated metadata:", JSON.stringify(result.meta, null, 2)) - - expect(result.meta).toHaveProperty("mine.their") - expect(result.meta).toHaveProperty("mine.their.yours") - }) -}) diff --git a/packages/vue-components/__tests__/tsconfig.json b/packages/vue-components/__tests__/tsconfig.json deleted file mode 100644 index be9137dfa..000000000 --- a/packages/vue-components/__tests__/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "types": [ - "vite/client", - "vitest/globals" - ] - } -} diff --git a/packages/vue-components/docs/superpowers/plans/2026-04-27-omegaform-refactor.md b/packages/vue-components/docs/superpowers/plans/2026-04-27-omegaform-refactor.md deleted file mode 100644 index db53cdf8e..000000000 --- a/packages/vue-components/docs/superpowers/plans/2026-04-27-omegaform-refactor.md +++ /dev/null @@ -1,2655 +0,0 @@ -# OmegaForm Refactor Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Decompose `OmegaFormStuff.ts` (1422 lines) and `useOmegaForm.ts` (1022 lines) into focused modules, slim the schema-meta extraction, centralize validation onto a single localized form-level schema, and remove dead workarounds. Public API unchanged. - -**Architecture:** Five sequential phases. Phase 0 writes characterization tests against current behavior. Phase 1 splits files by concern (no behavior change). Phase 2 slims `createMeta` and adopts the v4 `format` annotation for email detection. Phase 3 centralizes validation and deletes the per-field schema and the errorMap-clearing workaround. Phase 4 is independent cleanup. Each task makes one self-contained, atomically committable change. - -**Tech Stack:** - -- TypeScript, Vue 3 (` -``` - -And replace the template's `` with: - -```vue - -``` - -Note the deletions: `:key="fieldKey"`, `:validators="{ ...validators, onSubmit: schema }"`, the `schema` computed, the `composeStandardSchemas` helper, the `hasIssues` helper, the `useIntl` call, the `fieldKey` computed. - -- [ ] **Step 2: Run tests + smoke** - -Run: `pnpm test:run` -Expected: green. - -Manually open the `IntegerValidationGerman` story and verify German validation messages still appear. They should — they now come from the form-level localized schema, not the per-field one. If they don't appear, debug Task 3.1. - -- [ ] **Step 3: Commit** - -```bash -git add src/components/OmegaForm/OmegaInput.vue -git commit -m "refactor(omegaform): delete per-field schema and fieldKey re-mount" -``` - ---- - -### Task 3.5: Delete `originalSchema` plumbing and `generateInputStandardSchemaFromFieldMeta` - -**Files:** - -- Modify: `src/components/OmegaForm/meta/types.ts` -- Modify: `src/components/OmegaForm/meta/createMeta.ts` -- Modify: `src/components/OmegaForm/validation/localized.ts` -- Modify: `src/components/OmegaForm/index.ts` -- Delete: `__tests__/OmegaForm/DiscriminatorFieldValidation.test.ts` - -- [ ] **Step 1: Delete the type field** - -In `meta/types.ts`, remove the `originalSchema?: StandardSchemaV1` field from `BaseFieldMeta`. - -- [ ] **Step 2: Delete the attachment plumbing** - -In `meta/createMeta.ts`, delete: - -- `attachOriginalSchemas` -- `toFieldStandardSchema` -- `fieldAstByPath` collection variable everywhere it's plumbed through `createMeta` / `walk` -- All call sites of `attachOriginalSchemas(...)` - -- [ ] **Step 3: Delete the per-field schema generator** - -In `validation/localized.ts`, delete `generateInputStandardSchemaFromFieldMeta` (~150 lines). - -- [ ] **Step 4: Update `index.ts`** - -Remove the export of `generateInputStandardSchemaFromFieldMeta`. - -- [ ] **Step 5: Delete `DiscriminatorFieldValidation.test.ts`** - -This test directly references `originalSchema` / `originalCodec` / `generateInputStandardSchemaFromFieldMeta` via `Reflect.get`. With those gone, the test is testing a deleted API. The form-level schema already validates discriminator values; that's covered by `TaggedUnionRoot.test.ts`'s `_tag` assertions plus the runtime story. - -```bash -git rm __tests__/OmegaForm/DiscriminatorFieldValidation.test.ts -``` - -- [ ] **Step 6: Run tests + tsc + lint** - -Run: `pnpm test:run && pnpm check && pnpm lint` -Expected: green. - -- [ ] **Step 7: Commit** - -```bash -git add -A -git commit -m "refactor(omegaform): delete originalSchema plumbing and per-field schema generator" -``` - ---- - -### Task 3.6: Phase 3 green-bar checkpoint - -- [ ] **Step 1: Full test suite** - -Run: `pnpm test:run && pnpm check && pnpm lint` -Expected: green. - -- [ ] **Step 2: Smoke check all five stories** - -Especially `IntegerValidationGerman` (proves form-level localization works) and `RootLevelTaggedUnion` (proves union meta still drives the right-required-flag-per-tag behavior). - -- [ ] **Step 3: Tag** - -```bash -git tag omegaform-refactor-phase3-green -``` - ---- - -## Phase 4 — Cleanup (each task is an independent commit) - -These tasks can be done in any order or interleaved with bug-fix work; they don't have inter-dependencies. - -### Task 4.1: Translate the German confirm dialog - -**Files:** - -- Modify: `src/components/OmegaForm/blockDialog.ts` -- Modify: `stories/OmegaForm.stories.ts` (add the translation key to the German mock) - -- [ ] **Step 1: Modify `blockDialog.ts`** - -Find the line: - -```ts -if (!confirm("Es sind ungespeicherte Änderungen vorhanden. Wirklich schließen?")) { -``` - -Replace with: - -```ts -const message = formatMessage({ - id: "form.unsaved_changes_confirm", - defaultMessage: "There are unsaved changes. Are you sure you want to close?" -}) -if (!confirm(message)) { -``` - -You'll need to inject `useIntl` at the top of the function: - -```ts -import { useIntl } from "../../utils" -``` - -(Or accept `formatMessage` as an optional dependency injected by the caller — match the existing pattern in `errors.ts`.) - -- [ ] **Step 2: Add the German translation in storybook decorator** - -In `stories/OmegaForm.stories.ts`, add to `germanTranslations`: - -```ts -"form.unsaved_changes_confirm": "Es sind ungespeicherte Änderungen vorhanden. Wirklich schließen?" -``` - -- [ ] **Step 3: Smoke-check** - -Open the `DialogBlockingExamples` story (with German locale toggled on) and trigger the confirm dialog by editing a field then attempting to close. Confirm the German text appears. - -- [ ] **Step 4: Commit** - -```bash -git add src/components/OmegaForm/blockDialog.ts stories/OmegaForm.stories.ts -git commit -m "i18n(omegaform): translate unsaved changes confirm dialog" -``` - ---- - -### Task 4.2: Drop deprecated string-typed fields _(conditional on consumer audit)_ - -**Files:** - -- Modify: `src/components/OmegaForm/types.ts` (formerly `OmegaFormStuff.ts`) -- Modify: `src/components/OmegaForm/useOmegaForm.ts` - -- [ ] **Step 1: Audit consumer apps** - -Run from the repo root: - -```bash -grep -rn 'overrideDefaultValues\|"deprecated:' apps/ 2>/dev/null -grep -rn 'defaultFromSchema' apps/ 2>/dev/null -grep -rn 'OmegaArrayProps.*items' apps/ 2>/dev/null -``` - -If any matches: skip this task, file an issue, keep the deprecated field one more cycle. - -If no matches: proceed. - -- [ ] **Step 2: Remove the deprecated string-typed fields** - -In `OmegaConfig` (in `useOmegaForm.ts` or wherever it landed): - -- Remove `overrideDefaultValues?: "deprecated: use defaultValuesPriority"` -- Remove `defaultFromSchema?: "deprecated: use defaultValuesPriority"` - -In `OmegaArrayProps`: - -- Remove `items?: "please use \`defaultItems\` instead"` - -- [ ] **Step 3: Run tests + tsc** - -Run: `pnpm test:run && pnpm check` -Expected: green. - -- [ ] **Step 4: Commit** - -```bash -git add -A -git commit -m "refactor(omegaform): drop deprecated string-typed config fields" -``` - ---- - -### Task 4.3: Drop legacy `field` slot in OmegaArray.vue _(conditional)_ - -**Files:** - -- Modify: `src/components/OmegaForm/OmegaArray.vue` - -- [ ] **Step 1: Audit consumer apps** - -```bash -grep -rn '

: P - -export const nominal: >() => Constructor = < - A extends B.Brand ->(): Constructor< - A -> => B.nominal() as any diff --git a/packages/effect-app/src/Schema/email.ts b/packages/effect-app/src/Schema/email.ts deleted file mode 100644 index dc1f93330..000000000 --- a/packages/effect-app/src/Schema/email.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { Refinement } from "effect-app/Function" -import { isValidEmail } from "effect-app/validation" -import * as S from "effect/Schema" -import type { Simplify } from "effect/Types" -import type { B } from "./schema.ts" -import type { NonEmptyStringBrand } from "./strings.ts" - -export interface EmailBrand extends Simplify> {} - -export type Email = string & EmailBrand - -export const Email = S - .String - .pipe( - S.annotate({ - title: "Email", - description: "an email according to RFC 5322", - format: "email" - }), - S.check(S.isMinLength(3), /* a@b */ S.isMaxLength(998)), - S.refine(isValidEmail as Refinement, { - identifier: "Email", - description: "an email according to RFC 5322", - jsonSchema: { format: "email", minLength: 3, maxLength: 998 } - }) - ) diff --git a/packages/effect-app/src/Schema/ext.ts b/packages/effect-app/src/Schema/ext.ts deleted file mode 100644 index 5981a1185..000000000 --- a/packages/effect-app/src/Schema/ext.ts +++ /dev/null @@ -1,680 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/no-unsafe-return */ -/** - * # `withConstructorDefault` policy - * - * The `withConstructorDefault` properties exported throughout this module - * (and from `numbers.ts`, `moreStrings.ts`, `ids.ts`) attach a default value - * that is **only** applied during construction — i.e. when the field is - * omitted from the input to a Schema constructor / `.make(...)` call. - * - * They are **NOT** applied during `decode` (JSON, database rows, RPC payloads, - * etc.). Decoding a payload with a missing field will still fail with a parse - * error, exactly as if the default were not present. - * - * Concretely this means `withConstructorDefault` MUST NOT be relied on as a - * just-in-time migration mechanism for database fields. If a stored record is - * missing a newly added field, the constructor default will not fill it in on - * read — decoding will fail. - * - * ## Don't reach for `withDecodingDefault*` either - * - * The sibling `withDecodingDefaultType` (and `withDecodingDefault`) extensions - * exist, but they are discouraged for migrating persisted data. A missing - * field in a stored record is just as likely to be data corruption as it is - * an old-shape document; silently substituting a default hides the problem - * and can poison downstream aggregates. - * - * Prefer an **explicit, preferably versioned** migration of database data - * (a schema-version field, a one-shot backfill, or a transform on read that - * is gated on an explicit version marker) over shoving missing fields under - * the rug with a decode-time default. - */ -import * as Config from "effect/Config" -import * as Effect from "effect/Effect" -import { pipe } from "effect/Function" -import * as Function from "effect/Function" -import * as Option from "effect/Option" -import * as S from "effect/Schema" -import * as SchemaIssue from "effect/SchemaIssue" -import * as SchemaTransformation from "effect/SchemaTransformation" -import * as Struct from "effect/Struct" -import { type NonEmptyReadonlyArray } from "../Array.ts" -import * as Context from "../Context.ts" -import * as SchemaAST from "../SchemaAST.ts" -import { extendM, typedKeysOf } from "../utils.ts" -import { type AST } from "./schema.ts" - -type ProvidedCodec = S.Codec< - Self["Type"], - Self["Encoded"], - Exclude, - Exclude -> - -const concurrencySetting = Effect.runSync( - Config - .Literal("unbounded", "SCHEMA_CONCURRENCY") - .pipe(Config.orElse(() => Config.Number("SCHEMA_CONCURRENCY")), Config.option) -) - -export const DefaultParseOptions: SchemaAST.ParseOptions = { - concurrency: Option.getOrElse(concurrencySetting, () => "unbounded" as const) -} - -/** - * Parse-options annotation used on schema constructors for decode paths where callers - * cannot currently pass parse options (notably some RPC / HttpApi integration paths). - * - * Keep this annotation in place so those framework-managed decodes still run with - * unbounded concurrency by default. - */ -export const concurrencyUnbounded = { parseOptions: DefaultParseOptions } as const - -type DecodeLike = (schema: any) => (input: any, options?: SchemaAST.ParseOptions) => any - -export const withDefaultParseOptions = ( - decode: Decode, - defaultParseOptions: SchemaAST.ParseOptions = DefaultParseOptions -): Decode => - ((schema: any) => { - const run = decode(schema) - return (input: any, options?: SchemaAST.ParseOptions) => run(input, { ...defaultParseOptions, ...options }) - }) as Decode - -const DateString = S.String.annotate({ - identifier: "DateOrInvalid", - description: "an ISO 8601 date string that will be decoded as a Date (may be invalid)", - format: "date-time" -}) - -/** - * Schema type for {@link DateFromString}. - * - * @category Schemas - * @since 4.0.0 - */ -export interface DateFromString extends S.decodeTo {} - -/** - * A transformation schema that parses an ISO 8601 string into a `Date`. - * - * Decoding: - * - A `string` is decoded as a `Date`. - * - * Encoding: - * - A `Date` is encoded as a `string`. - * - * Use this when the Encoded form must be JSON (`string`). Domain models should - * prefer {@link Date}, whose Encoded form is `Date`; JSON stores convert via - * `Schema.toCodecJson`. - * - * @since 4.0.0 - */ -export const DateFromString: DateFromString = DateString.pipe(S.decodeTo(S.Date, SchemaTransformation.dateFromString)) - -const dateHelpers = (s: S.Date) => ({ - /** - * Construction-only default `new Date()`. Applied only when the field is - * omitted from `.make(...)` input. NOT applied during decode — cannot be - * used to JIT-migrate database fields. See file-level note. - */ - withConstructorDefault: s.pipe(S.withConstructorDefault(Effect.sync(() => new globalThis.Date()))), - /** - * Decode-time default `new Date()`. **Discouraged for persisted data:** a - * missing field may be data corruption, not an old-shape document; silently - * substituting `new Date()` hides the problem. Prefer an explicit, - * preferably versioned migration over a decode-time fallback. See - * file-level note. - */ - withDecodingDefaultType: s.pipe(S.withDecodingDefaultType(Effect.sync(() => new globalThis.Date()))) -}) - -/** Like the default Schema `Date` (Encoded is `Date`) with default helpers. */ -export const Date = extendM(S.Date, dateHelpers) - -/** - * Alias of {@link Date}. Core `Schema.Date` already rejects invalid Dates. - * - * @deprecated Use {@link Date}. - */ -export const DateValid = Date - -/** Like the default Schema `Boolean` but with default helpers. */ -export const Boolean = Object.assign(S.Boolean, { - /** - * Construction-only default `false`. Applied only when the field is - * omitted from `.make(...)` input. NOT applied during decode — cannot be - * used to JIT-migrate database fields. See file-level note. - */ - withConstructorDefault: S.Boolean.pipe(S.withConstructorDefault(Effect.succeed(false))), - /** - * Decode-time default `false`. **Discouraged for persisted data:** a - * missing field may be data corruption, not an old-shape document; silently - * substituting `false` hides the problem. Prefer an explicit, preferably - * versioned migration over a decode-time fallback. See file-level note. - */ - withDecodingDefaultType: S.Boolean.pipe(S.withDecodingDefaultType(Effect.succeed(false))) -}) - -/** - * You probably want to use `Finite` instead of this. Like the default Schema - * `Number` but with default helpers. - */ -export const Number = Object.assign(S.Number, { - /** - * Construction-only default `0`. Applied only when the field is omitted - * from `.make(...)` input. NOT applied during decode — cannot be used to - * JIT-migrate database fields. See file-level note. - */ - withConstructorDefault: S.Number.pipe(S.withConstructorDefault(Effect.succeed(0))), - /** - * Decode-time default `0`. **Discouraged for persisted data:** a missing - * field may be data corruption, not an old-shape document; silently - * substituting `0` hides the problem. Prefer an explicit, preferably - * versioned migration over a decode-time fallback. See file-level note. - */ - withDecodingDefaultType: S.Number.pipe(S.withDecodingDefaultType(Effect.succeed(0))) -}) - -/** Like the default Schema `Finite` but with default helpers. */ -export const Finite = Object.assign(S.Finite, { - /** - * Construction-only default `0`. Applied only when the field is omitted - * from `.make(...)` input. NOT applied during decode — cannot be used to - * JIT-migrate database fields. See file-level note. - */ - withConstructorDefault: S.Finite.pipe(S.withConstructorDefault(Effect.succeed(0))), - /** - * Decode-time default `0`. **Discouraged for persisted data:** a missing - * field may be data corruption, not an old-shape document; silently - * substituting `0` hides the problem. Prefer an explicit, preferably - * versioned migration over a decode-time fallback. See file-level note. - */ - withDecodingDefaultType: S.Finite.pipe(S.withDecodingDefaultType(Effect.succeed(0))) -}) - -/** Like the default Schema `Literals` but with default helpers. Default value is `literals[0]`. */ -export const Literals = >(literals: Literals) => - pipe( - S.Literals(literals), - (s) => - Object.assign(s, { - /** Override the default literal value used by `withConstructorDefault` / `withDecodingDefaultType`. */ - changeDefault: (a: A) => { - return Object.assign(S.Literals(literals), { - Default: a, - /** - * Construction-only default. Applied only when the field is - * omitted from `.make(...)` input. NOT applied during decode — - * cannot be used to JIT-migrate database fields. See file-level - * note. - */ - withConstructorDefault: s.pipe(S.withConstructorDefault(Effect.succeed(a))), - /** - * Decode-time default. **Discouraged for persisted data:** a - * missing field may be data corruption, not an old-shape - * document; silently substituting hides the problem. Prefer an - * explicit, preferably versioned migration over a decode-time - * fallback. See file-level note. - */ - withDecodingDefaultType: s.pipe(S.withDecodingDefaultType(Effect.succeed(a))) - }) // todo: copy annotations from original? - }, - // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion -- load-bearing: Object.assign widens the field type without it, breaking `expectTypeOf(l.Default).toEqualTypeOf<"a">()` in tests - Default: literals[0] as Literals[0], - /** - * Construction-only default `literals[0]`. Applied only when the - * field is omitted from `.make(...)` input. NOT applied during - * decode — cannot be used to JIT-migrate database fields. See - * file-level note. - */ - withConstructorDefault: s.pipe(S.withConstructorDefault(Effect.succeed(literals[0]))), - /** - * Decode-time default `literals[0]`. **Discouraged for persisted - * data:** a missing field may be data corruption, not an old-shape - * document; silently substituting hides the problem. Prefer an - * explicit, preferably versioned migration over a decode-time - * fallback. See file-level note. - */ - withDecodingDefaultType: s.pipe(S.withDecodingDefaultType(Effect.succeed(literals[0]))) - }) - ) - -/** Like the default Schema `Array` but with default helpers. */ -export function Array(value: ValueSchema) { - return pipe( - S.Array(value).annotate(concurrencyUnbounded), - (s) => - Object.assign(s, { - /** - * Construction-only default `[]`. Applied only when the field is - * omitted from `.make(...)` input. NOT applied during decode — - * cannot be used to JIT-migrate database fields. See file-level - * note. - */ - withConstructorDefault: s.pipe(S.withConstructorDefault(Effect.sync(() => []))), - /** - * Decode-time default `[]`. **Discouraged for persisted data:** a - * missing field may be data corruption, not an old-shape document; - * silently substituting `[]` hides the problem. Prefer an explicit, - * preferably versioned migration over a decode-time fallback. See - * file-level note. - */ - withDecodingDefaultType: s.pipe(S.withDecodingDefaultType(Effect.sync(() => []))) - }) - ) -} - -/** - * An annotated `S.Array` of unique items that decodes to a `ReadonlySet`. - */ -export const ReadonlySetFromArray = (value: ValueSchema) => { - const from = S - .Array(value) - .annotate({ ...concurrencyUnbounded, expected: "an array of unique items that will be decoded as a ReadonlySet" }) - const to = S.instanceOf(Set) as S.instanceOf> - const schema = from.pipe( - S.decodeTo( - to, - SchemaTransformation.transform({ - decode: (arr) => new Set(arr) as ReadonlySet, - encode: (set) => [...set] - }) - ) - ) - return schema -} - -/** - * An annotated `S.Array` of key-value tuples that decodes to a `ReadonlyMap`. - */ -export const ReadonlyMapFromArray = (pair: { - readonly key: KeySchema - readonly value: ValueSchema -}) => { - const from = S - .Array(S.Tuple([pair.key, pair.value])) - .annotate({ - ...concurrencyUnbounded, - expected: "an array of key-value tuples that will be decoded as a ReadonlyMap" - }) - const to = S.instanceOf(Map) as S.instanceOf< - ReadonlyMap - > - const schema = from.pipe( - S.decodeTo( - to, - SchemaTransformation.transform({ - decode: ( - arr - ) => new Map(arr) as ReadonlyMap, - encode: ( - map - ) => [...map.entries()] as any // fu - }) - ) - ) - return schema -} - -/** Like the default Schema `ReadonlySet` (Encoded is `Set`) with default helpers. */ -export const ReadonlySet = (value: ValueSchema) => - pipe( - S.ReadonlySet(value), - (s) => - Object.assign(s, { - /** - * Construction-only default `new Set()`. Applied only when the field - * is omitted from `.make(...)` input. NOT applied during decode — - * cannot be used to JIT-migrate database fields. See file-level - * note. - */ - withConstructorDefault: s.pipe( - S.withConstructorDefault(Effect.sync(() => new Set())) - ), - /** - * Decode-time default `new Set()`. **Discouraged for persisted - * data:** a missing field may be data corruption, not an old-shape - * document; silently substituting an empty set hides the problem. - * Prefer an explicit, preferably versioned migration over a - * decode-time fallback. See file-level note. - */ - withDecodingDefaultType: s.pipe( - S.withDecodingDefaultType(Effect.sync(() => new Set())) - ) - }) - ) - -/** Like the default Schema `ReadonlyMap` (Encoded is `Map`) with default helpers. */ -export const ReadonlyMap = (pair: { - readonly key: KeySchema - readonly value: ValueSchema -}) => - pipe( - S.ReadonlyMap(pair.key, pair.value), - (s) => - Object.assign(s, { - /** - * Construction-only default `new Map()`. Applied only when the field - * is omitted from `.make(...)` input. NOT applied during decode — - * cannot be used to JIT-migrate database fields. See file-level - * note. - */ - withConstructorDefault: s.pipe(S.withConstructorDefault(Effect.sync(() => new Map()))), - /** - * Decode-time default `new Map()`. **Discouraged for persisted - * data:** a missing field may be data corruption, not an old-shape - * document; silently substituting an empty map hides the problem. - * Prefer an explicit, preferably versioned migration over a - * decode-time fallback. See file-level note. - */ - withDecodingDefaultType: s.pipe(S.withDecodingDefaultType(Effect.sync(() => new Map()))) - }) - ) - -/** Like the default Schema `NullOr` but with default helpers. */ -export const NullOr = (self: Schema) => - pipe( - S.NullOr(self), - (s) => - Object.assign(s, { - /** - * Construction-only default `null`. Applied only when the field is - * omitted from `.make(...)` input. NOT applied during decode — - * cannot be used to JIT-migrate database fields. See file-level - * note. - */ - withConstructorDefault: s.pipe(S.withConstructorDefault(Effect.succeed(null))), - /** - * Decode-time default `null`. **Discouraged for persisted data:** a - * missing field may be data corruption, not an old-shape document; - * silently substituting `null` hides the problem. Prefer an - * explicit, preferably versioned migration over a decode-time - * fallback. See file-level note. - */ - withDecodingDefaultType: s.pipe(S.withDecodingDefaultType(Effect.succeed(null))) - }) - ) - -/** - * Attach a `withConstructorDefault` of `new Date()` to any schema. - * - * **Construction-only.** Applied only when the field is omitted from - * `.make(...)` input. NOT applied during decode — cannot be used to - * JIT-migrate database fields. See file-level note. - */ -export const defaultDate = (schema: Schema) => - schema.pipe(S.withConstructorDefault(Effect.sync(() => new global.Date()))) - -/** - * Attach a `withConstructorDefault` of `false` to any schema. - * - * **Construction-only.** Applied only when the field is omitted from - * `.make(...)` input. NOT applied during decode — cannot be used to - * JIT-migrate database fields. See file-level note. - */ -export const defaultBool = (schema: Schema) => - schema.pipe(S.withConstructorDefault(Effect.succeed(false))) - -/** - * Attach a `withConstructorDefault` of `null` to any schema. - * - * **Construction-only.** Applied only when the field is omitted from - * `.make(...)` input. NOT applied during decode — cannot be used to - * JIT-migrate database fields. See file-level note. - */ -export const defaultNullable = (schema: Schema) => - schema.pipe(S.withConstructorDefault(Effect.succeed(null))) - -/** - * Attach a `withConstructorDefault` of `[]` to any schema. - * - * **Construction-only.** Applied only when the field is omitted from - * `.make(...)` input. NOT applied during decode — cannot be used to - * JIT-migrate database fields. See file-level note. - */ -export const defaultArray = (schema: Schema) => - schema.pipe(S.withConstructorDefault(Effect.sync(() => []))) - -/** - * Attach a `withConstructorDefault` of `new Map()` to any schema. - * - * **Construction-only.** Applied only when the field is omitted from - * `.make(...)` input. NOT applied during decode — cannot be used to - * JIT-migrate database fields. See file-level note. - */ -export const defaultMap = (schema: Schema) => - schema.pipe(S.withConstructorDefault(Effect.sync(() => new Map()))) - -/** - * Attach a `withConstructorDefault` of `new Set()` to any schema. - * - * **Construction-only.** Applied only when the field is omitted from - * `.make(...)` input. NOT applied during decode — cannot be used to - * JIT-migrate database fields. See file-level note. - */ -export const defaultSet = (schema: Schema) => - schema.pipe(S.withConstructorDefault(Effect.sync(() => new Set()))) - -export const withDefaultMake = (s: Self) => { - const a = Object.assign(S.decodeSync(s as any) as WithDefaults, s) - Object.setPrototypeOf(a, s) - return a - - // return s as Self & WithDefaults -} - -export type WithDefaults = ( - i: Self["Encoded"], - options?: SchemaAST.ParseOptions -) => Self["Type"] - -// type GetKeys = U extends Record ? K : never -// type UnionToIntersection2 = { -// readonly [K in GetKeys]: U extends Record ? T : never -// } - -// export type Test