From 23bba8f45dbfbcc8de8c3e7d1954ceb2770bb8bf Mon Sep 17 00:00:00 2001 From: Kanad Gupta Date: Thu, 10 Sep 2026 17:50:35 -0700 Subject: [PATCH 01/13] chore(repo): add deps as commitlint scope --- commitlint.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commitlint.config.js b/commitlint.config.js index 456a99269a..1307d65cf3 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -13,7 +13,7 @@ const PROJECT_SCOPES = [ // Non-project changes that don't map to a single turbo project. `release` // isn't a turbo project (tools/release has no package.json) but is a real // scope emitted by the automated release-notes-proposal commit. -const ESCAPE_SCOPES = ["ci", "repo", "misc", "release"]; +const ESCAPE_SCOPES = ["ci", "deps", "repo", "misc", "release"]; module.exports = { extends: ["@commitlint/config-conventional"], From dd9176328674c09c49d9160fc2c6995fe029f717 Mon Sep 17 00:00:00 2001 From: Kanad Gupta Date: Thu, 10 Sep 2026 18:32:12 -0700 Subject: [PATCH 02/13] chore(deps): bump friends of vitest + effect --- pnpm-lock.yaml | 388 +++++++++++++++++--------------------------- pnpm-workspace.yaml | 25 +-- 2 files changed, 161 insertions(+), 252 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b61093fa5d..170af7add2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -165,20 +165,20 @@ settings: catalogs: default: '@effect/platform-bun': - specifier: 4.0.0-rc.112 - version: 4.0.0-rc.112 + specifier: 4.0.0-rc.113 + version: 4.0.0-rc.113 '@effect/platform-node': - specifier: 4.0.0-rc.112 - version: 4.0.0-rc.112 + specifier: 4.0.0-rc.113 + version: 4.0.0-rc.113 '@effect/sql-pg': - specifier: 4.0.0-rc.112 - version: 4.0.0-rc.112 + specifier: 4.0.0-rc.113 + version: 4.0.0-rc.113 '@effect/tsgo': specifier: 0.37.0 version: 0.37.0 '@effect/vitest': - specifier: 4.0.0-rc.112 - version: 4.0.0-rc.112 + specifier: 4.0.0-rc.113 + version: 4.0.0-rc.113 '@supabase/supabase-js': specifier: ^2.110.7 version: 2.112.4 @@ -192,11 +192,11 @@ catalogs: specifier: 8.18.1 version: 8.18.1 '@vitest/coverage-v8': - specifier: ^4.1.11 - version: 4.1.11 + specifier: ^5.0.0 + version: 5.0.0 effect: - specifier: 4.0.0-rc.112 - version: 4.0.0-rc.112 + specifier: 4.0.0-rc.113 + version: 4.0.0-rc.113 knip: specifier: ^6.32.2 version: 6.34.0 @@ -306,13 +306,13 @@ importers: version: 1.7.0 '@effect/platform-bun': specifier: 'catalog:' - version: 4.0.0-rc.112(effect@4.0.0-rc.112) + version: 4.0.0-rc.113(effect@4.0.0-rc.113) '@effect/sql-pg': specifier: 'catalog:' - version: 4.0.0-rc.112(effect@4.0.0-rc.112) + version: 4.0.0-rc.113(effect@4.0.0-rc.113) '@effect/vitest': specifier: 'catalog:' - version: 4.0.0-rc.112(effect@4.0.0-rc.112)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) + version: 4.0.0-rc.113(effect@4.0.0-rc.113)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) '@modelcontextprotocol/sdk': specifier: ^1.30.0 version: 1.30.0(supports-color@7.2.0)(zod@4.5.4) @@ -354,13 +354,13 @@ importers: version: 1.2.5 '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.11(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) + version: 5.0.0(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) dotenv: specifier: ^17.4.2 version: 17.4.2 effect: specifier: 'catalog:' - version: 4.0.0-rc.112 + version: 4.0.0-rc.113 esbuild: specifier: ^0.28.2 version: 0.28.2 @@ -393,7 +393,7 @@ importers: version: 8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) vitest: specifier: 'catalog:' - version: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@4.1.11)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) + version: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@5.0.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) yaml: specifier: ^2.9.0 version: 2.9.0 @@ -485,13 +485,13 @@ importers: dependencies: '@effect/platform-bun': specifier: 'catalog:' - version: 4.0.0-rc.112(effect@4.0.0-rc.112) + version: 4.0.0-rc.113(effect@4.0.0-rc.113) '@effect/platform-node': specifier: 'catalog:' - version: 4.0.0-rc.112(effect@4.0.0-rc.112)(redis@6.2.1) + version: 4.0.0-rc.113(effect@4.0.0-rc.113)(redis@6.2.1) effect: specifier: 'catalog:' - version: 4.0.0-rc.112 + version: 4.0.0-rc.113 undici: specifier: ^8.10.0 version: 8.10.1 @@ -504,13 +504,13 @@ importers: version: 1.4.0 '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.11(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) + version: 5.0.0(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) typescript: specifier: 'catalog:' version: 7.0.2 vitest: specifier: 'catalog:' - version: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@4.1.11)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) + version: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@5.0.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) packages/cli-darwin-arm64: {} @@ -534,13 +534,13 @@ importers: version: 1.4.0 '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.11(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) + version: 5.0.0(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) typescript: specifier: 'catalog:' version: 7.0.2 vitest: specifier: 'catalog:' - version: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@4.1.11)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) + version: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@5.0.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) packages/cli-windows-arm64: {} @@ -560,10 +560,10 @@ importers: devDependencies: '@effect/platform-bun': specifier: 'catalog:' - version: 4.0.0-rc.112(effect@4.0.0-rc.112) + version: 4.0.0-rc.113(effect@4.0.0-rc.113) '@effect/platform-node': specifier: 'catalog:' - version: 4.0.0-rc.112(effect@4.0.0-rc.112)(redis@6.2.1) + version: 4.0.0-rc.113(effect@4.0.0-rc.113)(redis@6.2.1) '@semantic-release/commit-analyzer': specifier: ^13.0.1 version: 13.0.1(semantic-release@25.0.9(supports-color@7.2.0)(typescript@7.0.2))(supports-color@7.2.0) @@ -578,10 +578,10 @@ importers: version: 1.4.0 '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.11(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) + version: 5.0.0(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) effect: specifier: 'catalog:' - version: 4.0.0-rc.112 + version: 4.0.0-rc.113 semantic-release: specifier: 'catalog:' version: 25.0.9(supports-color@7.2.0)(typescript@7.0.2) @@ -593,26 +593,26 @@ importers: version: 8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) vitest: specifier: 'catalog:' - version: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@4.1.11)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) + version: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@5.0.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) packages/stack: dependencies: '@effect/platform-node': specifier: 'catalog:' - version: 4.0.0-rc.112(effect@4.0.0-rc.112)(redis@6.2.1) + version: 4.0.0-rc.113(effect@4.0.0-rc.113)(redis@6.2.1) '@effect/sql-pg': specifier: 'catalog:' - version: 4.0.0-rc.112(effect@4.0.0-rc.112) + version: 4.0.0-rc.113(effect@4.0.0-rc.113) effect: specifier: 'catalog:' - version: 4.0.0-rc.112 + version: 4.0.0-rc.113 jose: specifier: ^6.2.10 version: 6.2.10 devDependencies: '@effect/vitest': specifier: 'catalog:' - version: 4.0.0-rc.112(effect@4.0.0-rc.112)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) + version: 4.0.0-rc.113(effect@4.0.0-rc.113)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) '@tsconfig/bun': specifier: 'catalog:' version: 1.0.11 @@ -624,7 +624,7 @@ importers: version: 8.18.1 '@vitest/coverage-v8': specifier: 'catalog:' - version: 4.1.11(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) + version: 5.0.0(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) esbuild: specifier: ^0.28.2 version: 0.28.2 @@ -633,7 +633,7 @@ importers: version: 7.0.2 vitest: specifier: 'catalog:' - version: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@4.1.11)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) + version: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@5.0.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) ws: specifier: 'catalog:' version: 8.21.3 @@ -869,28 +869,28 @@ packages: peerDependencies: '@noble/ciphers': ^1.0.0 - '@effect/platform-bun@4.0.0-rc.112': - resolution: {integrity: sha512-Y5n2HhV/vsbrJls9ukX42RL7zqXQxISHegWFsP9njsCyDmGTnq7QYSO82rglwrLPwtTrv5dkSRTuGw4+oXxgMg==} + '@effect/platform-bun@4.0.0-rc.113': + resolution: {integrity: sha512-EOn8doDVaiizfTpdmtRS0SZLAAt19yyHFKg+aV8YXJreNDYqXQLEt+/ThiEOurDimApVYhn2NZW52OJrZlybQw==} peerDependencies: - effect: ^4.0.0-rc.112 + effect: ^4.0.0-rc.113 - '@effect/platform-node-shared@4.0.0-rc.112': - resolution: {integrity: sha512-ttjz0xKamFN7vL8pNDYVwddJLjZvqKePc05djlz2VcdaKbLsnYbtMnL1rbOfHgEnIUSHGh7FkjaN4DM1Ov81sQ==} + '@effect/platform-node-shared@4.0.0-rc.113': + resolution: {integrity: sha512-EPCfjvKlHmNDgqIlT85P1OcgNUNvRxNtBpTFOz1UGHwNJe6Ap7rP93Rue7kzFUeplQMy6EfoZEH4CJR4N0nJ1g==} engines: {node: '>=18.0.0'} peerDependencies: - effect: ^4.0.0-rc.112 + effect: ^4.0.0-rc.113 - '@effect/platform-node@4.0.0-rc.112': - resolution: {integrity: sha512-/BMAcdNGQQskLmI0Zoa95KfTZkr9HV9N4NSxaSrusG6GeW6Ulp9KvZ+Rlaiw8lnOt43CXjFLdfll5/k5rxL4hQ==} + '@effect/platform-node@4.0.0-rc.113': + resolution: {integrity: sha512-8luSE2JcGVsALQ6cZOWh5jdZu+VgcUKIKPfhN/MjX+ZzIuK/krm3jZBHYZdhqkXjM9s8aYGBxNMHGF0WzF+Gpg==} engines: {node: '>=18.0.0'} peerDependencies: - effect: ^4.0.0-rc.112 + effect: ^4.0.0-rc.113 redis: '>=5.0.0 <7.0.0' - '@effect/sql-pg@4.0.0-rc.112': - resolution: {integrity: sha512-UYUA3LAGH1Pg88Yau7eTlTLHRrIb/uTdxdPGxVcRdIjjrTzxtA7iKHR4hcmUeq5lQEcGLCopN7E4ffsAKF8vEQ==} + '@effect/sql-pg@4.0.0-rc.113': + resolution: {integrity: sha512-xsAbmxsR5sC6Pc/38nB4/rBi1co4aCC7e4T95sVy8EhWA9NRheimtiN05EyhTKZwX1C0T2gquainQwCuQYuKuA==} peerDependencies: - effect: ^4.0.0-rc.112 + effect: ^4.0.0-rc.113 '@effect/tsgo-darwin-arm64@0.37.0': resolution: {integrity: sha512-D9o2NKswmRklu+sG28HkxZAvtvOa0Mt+bLVjJKydF2kVw+gePxiHuTbbI3e4Kqumv4ucLT3TtqU1a2RirC80lA==} @@ -931,12 +931,12 @@ packages: resolution: {integrity: sha512-jCJIUcNgI0vaoylao/mhOv+7hDfaJRwZJSJrg5kA/FCQ4aGDhAYqyQx+hoZh8AW3pzD9Qp1RWtUsVFqOzIOENw==} hasBin: true - '@effect/vitest@4.0.0-rc.112': - resolution: {integrity: sha512-mEKh/FI64mt8JK1/v9mpOrJYdnp+UFZdRUBMEdZMiKz7klg6NPqVgg/oeAGH6wOOQc2iAPcfc2H9BbAv1KyzMQ==} + '@effect/vitest@4.0.0-rc.113': + resolution: {integrity: sha512-ebuPhtZmumq1967n0vgF0sgAx/8tRHMmNGOdH1Oya1jKzV2Yoqhlv8WCGT0N//PuaV/Pc/zky3mmDvxmW81FiQ==} peerDependencies: - effect: ^4.0.0-rc.112 + effect: ^4.0.0-rc.113 vite: '*' - vitest: '>=4.1.0 <5.0.0' + vitest: '>=5.0.0 <6.0.0' '@emnapi/core@1.11.2': resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==} @@ -1346,36 +1346,6 @@ packages: '@cfworker/json-schema': optional: true - '@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/keyring-darwin-arm64@1.3.0': resolution: {integrity: sha512-pl76hJvdYUBn6I24bXiOBMA9nbDapo3I5B+f3OorjDU4dUMSypXeKbOVehJe8fhgTiH24flMyTS3aAIy43xegQ==} engines: {node: '>= 10'} @@ -3105,9 +3075,27 @@ packages: '@vitest/browser': optional: true + '@vitest/coverage-v8@5.0.0': + resolution: {integrity: sha512-toMg6PZGCIa/lQNCDoASrfb1ly4hsUKXFtFYC9kD4t78o5Y6LyNJU7AENt8eHPr3quYdxaxK7hj2mnbFfUk9NA==} + peerDependencies: + '@vitest/browser': 5.0.0 + vite: '*' + vitest: 5.0.0 + peerDependenciesMeta: + '@vitest/browser': + optional: true + '@vitest/expect@4.1.11': resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==} + '@vitest/istanbul-lib-coverage@1.0.1': + resolution: {integrity: sha512-k3DJZ8LhMBK9NS4SclF1ASD3OgXEWDorbIcPTRDK0/Zae6fRvu+fJRxtFdLfHsa9Y24beCdPnoNZ4LviTNstfA==} + engines: {node: '>=22'} + + '@vitest/istanbul-lib-report@1.0.1': + resolution: {integrity: sha512-1EOLRfsTMnyAr3+kEAsP4o9dhaDlGPpD7H5iLBBeq//YpNB1VIahkPhB+eRp9N2Dkfw8oySROjE3yf9XDeaIkQ==} + engines: {node: '>=22'} + '@vitest/mocker@4.1.11': resolution: {integrity: sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==} peerDependencies: @@ -3826,8 +3814,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - effect@4.0.0-rc.112: - resolution: {integrity: sha512-wXxwuh1Ywnv4cPRM3Wfa0vDwuOHnZ1TsTgHJkG9XgzND6inhBH9n1vBxhg3iIXOia/OrpmvVmd3lrD4vq6bF3A==} + effect@4.0.0-rc.113: + resolution: {integrity: sha512-uZ4Bh7KSlw2sdVdNDHPLSNjLGH+MWap7cheIHZoB/1T/ZJ3pvI4KiN3kUp50MpFKXhygOMmReJJOwWMQPwpPAg==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -4000,10 +3988,6 @@ packages: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} - fast-check@4.9.0: - resolution: {integrity: sha512-7ms6T7SybUev/PQITciI0yLM2pOSFy5zpG8Ty7tQofcVaQUvrMXp6CBwqF6fThLCLOrfBtuHAtwq6Yu4XPCllg==} - engines: {node: '>=12.17.0'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -5141,13 +5125,6 @@ packages: ms@2.1.3: resolution: {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==} - mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -5217,10 +5194,6 @@ packages: encoding: optional: true - node-gyp-build-optional-packages@5.2.2: - resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} - hasBin: true - normalize-package-data@6.0.2: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} @@ -5328,9 +5301,6 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} - obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - obug@2.1.4: resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} engines: {node: '>=12.20.0'} @@ -5518,19 +5488,10 @@ packages: pg-copy-streams@7.0.0: resolution: {integrity: sha512-zBvnY6wtaBRE2ae2xXWOOGMaNVPkXh1vhypAkNSKgMdciJeTyIQAHZaEeRAxUjs/p1El5jgzYmwG5u871Zj3dQ==} - pg-cursor@2.22.0: - resolution: {integrity: sha512-knzXLKqarTjOvb3qDSW0JiGsazmxwEKXrqHfWRte7XUsOYccQRafn3BLnQobWwInkzFJSyOej8y8cQRh2z3kGw==} - peerDependencies: - pg: ^8 - pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - pg-numeric@1.0.2: - resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} - engines: {node: '>=4'} - pg-pool@3.14.0: resolution: {integrity: sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==} peerDependencies: @@ -5546,10 +5507,6 @@ packages: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} - pg-types@4.1.0: - resolution: {integrity: sha512-o2XFanIMy/3+mThw69O8d4n1E5zsLhdO+OPqswezu7Z5ekP4hYDqlDjlmOpYMbzY2Br0ufCwJLdDIXeNVwcWFg==} - engines: {node: '>=10'} - pg@8.23.0: resolution: {integrity: sha512-Ip2EQCngowJLGOfCwkFhPXU7/ljlhn6Rxlmy4XYfL2Y+vyRM59+8uR2xqRWKdYmbXmxCFOAmKxBuSUCdF34qLg==} engines: {node: '>= 16.0.0'} @@ -5623,37 +5580,18 @@ packages: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} - postgres-array@3.0.4: - resolution: {integrity: sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==} - engines: {node: '>=12'} - postgres-bytea@1.0.1: resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==} engines: {node: '>=0.10.0'} - postgres-bytea@3.0.0: - resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} - engines: {node: '>= 6'} - postgres-date@1.0.7: resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} engines: {node: '>=0.10.0'} - postgres-date@2.1.0: - resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} - engines: {node: '>=12'} - postgres-interval@1.2.0: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} - postgres-interval@3.0.0: - resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} - engines: {node: '>=12'} - - postgres-range@1.1.4: - resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} - posthog-node@5.51.6: resolution: {integrity: sha512-r+Ge3p0OnOcOWeTnvKZmAtDwECeIoyNTyxBxuZc8wM6RHCQ9j2Xrhogrf39HSq1Y2gIOpWLqIDRmWDcu7xmqcA==} engines: {node: ^20.20.0 || >=22.22.0} @@ -5710,9 +5648,6 @@ packages: pumpify@1.5.1: resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} - pure-rand@8.4.2: - resolution: {integrity: sha512-vvuOGgcuPJAirlHvuQw1TrOiw7ptaIXXmIbNuiNOY6lNGJJH49PQ1Kj4nd783nPdQhQdicgOjVI2yI/9BD6/Ng==} - qs@6.15.3: resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} engines: {node: '>=0.6'} @@ -6384,6 +6319,10 @@ packages: resolution: {integrity: sha512-YQ3WlbqjYMmNpdvDH64jAgLjxuAR9+649calDWhbshYaeQGO2bR4nI94ORJmwI3J9YhoKQnpyGOK+0zlWS5N5Q==} engines: {node: '>=22.19.0'} + undici@8.10.2: + resolution: {integrity: sha512-/y4/bH9YNU5hi9NIrpOuvGXFcxrj3CMrV+/AYpowAYTpHn8gX/XPFjNy766FPoYY0miQhdW977JFWKGNhBdwyQ==} + engines: {node: '>=22.19.0'} + unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} engines: {node: '>=4'} @@ -6981,44 +6920,36 @@ snapshots: dependencies: '@noble/ciphers': 1.3.0 - '@effect/platform-bun@4.0.0-rc.112(effect@4.0.0-rc.112)': + '@effect/platform-bun@4.0.0-rc.113(effect@4.0.0-rc.113)': dependencies: - '@effect/platform-node-shared': 4.0.0-rc.112(effect@4.0.0-rc.112) - effect: 4.0.0-rc.112 + '@effect/platform-node-shared': 4.0.0-rc.113(effect@4.0.0-rc.113) + effect: 4.0.0-rc.113 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node-shared@4.0.0-rc.112(effect@4.0.0-rc.112)': + '@effect/platform-node-shared@4.0.0-rc.113(effect@4.0.0-rc.113)': dependencies: '@types/ws': 8.18.1 - effect: 4.0.0-rc.112 + effect: 4.0.0-rc.113 ws: 8.21.3 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node@4.0.0-rc.112(effect@4.0.0-rc.112)(redis@6.2.1)': + '@effect/platform-node@4.0.0-rc.113(effect@4.0.0-rc.113)(redis@6.2.1)': dependencies: - '@effect/platform-node-shared': 4.0.0-rc.112(effect@4.0.0-rc.112) - effect: 4.0.0-rc.112 - mime: 4.1.0 + '@effect/platform-node-shared': 4.0.0-rc.113(effect@4.0.0-rc.113) + effect: 4.0.0-rc.113 redis: 6.2.1 - undici: 8.10.1 + undici: 8.10.2 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/sql-pg@4.0.0-rc.112(effect@4.0.0-rc.112)': + '@effect/sql-pg@4.0.0-rc.113(effect@4.0.0-rc.113)': dependencies: - effect: 4.0.0-rc.112 - pg: 8.23.0 - pg-connection-string: 2.14.0 - pg-cursor: 2.22.0(pg@8.23.0) - pg-pool: 3.14.0(pg@8.23.0) - pg-types: 4.1.0 - transitivePeerDependencies: - - pg-native + effect: 4.0.0-rc.113 '@effect/tsgo-darwin-arm64@0.37.0': optional: true @@ -7051,11 +6982,11 @@ snapshots: '@effect/tsgo-win32-arm64': 0.37.0 '@effect/tsgo-win32-x64': 0.37.0 - '@effect/vitest@4.0.0-rc.112(effect@4.0.0-rc.112)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11)': + '@effect/vitest@4.0.0-rc.113(effect@4.0.0-rc.113)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11)': dependencies: - effect: 4.0.0-rc.112 + effect: 4.0.0-rc.113 vite: 8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) - vitest: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@4.1.11)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) + vitest: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@5.0.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) '@emnapi/core@1.11.2': dependencies: @@ -7383,24 +7314,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@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/keyring-darwin-arm64@1.3.0': optional: true @@ -8850,6 +8763,20 @@ snapshots: tinyrainbow: 3.1.1 vite: 8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) vitest: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@4.1.11)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) + optional: true + + '@vitest/coverage-v8@5.0.0(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11)': + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@vitest/istanbul-lib-coverage': 1.0.1 + '@vitest/istanbul-lib-report': 1.0.1 + ast-v8-to-istanbul: 1.0.5 + magicast: 0.5.4 + obug: 2.1.4 + std-env: 4.2.0 + tinyrainbow: 3.1.1 + vite: 8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) + vitest: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@5.0.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) '@vitest/expect@4.1.11': dependencies: @@ -8860,6 +8787,12 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.1 + '@vitest/istanbul-lib-coverage@1.0.1': {} + + '@vitest/istanbul-lib-report@1.0.1': + dependencies: + '@vitest/istanbul-lib-coverage': 1.0.1 + '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.11 @@ -9497,10 +9430,7 @@ snapshots: ee-first@1.1.1: {} - effect@4.0.0-rc.112: - dependencies: - fast-check: 4.9.0 - msgpackr: 2.1.0 + effect@4.0.0-rc.113: {} emoji-regex@10.6.0: {} @@ -9768,10 +9698,6 @@ snapshots: extsprintf@1.3.0: {} - fast-check@4.9.0: - dependencies: - pure-rand: 8.4.2 - fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -10248,7 +10174,8 @@ snapshots: dependencies: lru-cache: 11.5.2 - html-escaper@2.0.2: {} + html-escaper@2.0.2: + optional: true html-void-elements@3.0.0: {} @@ -10407,18 +10334,21 @@ snapshots: lodash.isstring: 4.0.1 lodash.uniqby: 4.7.0 - istanbul-lib-coverage@3.2.2: {} + istanbul-lib-coverage@3.2.2: + optional: true istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 + optional: true istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + optional: true java-properties@1.0.2: {} @@ -10662,6 +10592,7 @@ snapshots: make-dir@4.0.0: dependencies: semver: 7.8.5 + optional: true markdown-extensions@2.0.0: {} @@ -11178,22 +11109,6 @@ 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 - mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -11257,11 +11172,6 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-gyp-build-optional-packages@5.2.2: - dependencies: - detect-libc: 2.1.2 - optional: true - normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 @@ -11295,8 +11205,6 @@ snapshots: object-inspect@1.13.4: {} - obuf@1.1.2: {} - obug@2.1.4: {} on-exit-leak-free@2.1.2: {} @@ -11534,14 +11442,8 @@ snapshots: pg-copy-streams@7.0.0: {} - pg-cursor@2.22.0(pg@8.23.0): - dependencies: - pg: 8.23.0 - pg-int8@1.0.1: {} - pg-numeric@1.0.2: {} - pg-pool@3.14.0(pg@8.23.0): dependencies: pg: 8.23.0 @@ -11570,16 +11472,6 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 - pg-types@4.1.0: - dependencies: - pg-int8: 1.0.1 - pg-numeric: 1.0.2 - postgres-array: 3.0.4 - postgres-bytea: 3.0.0 - postgres-date: 2.1.0 - postgres-interval: 3.0.0 - postgres-range: 1.1.4 - pg@8.23.0: dependencies: pg-connection-string: 2.14.0 @@ -11670,26 +11562,14 @@ snapshots: postgres-array@2.0.0: {} - postgres-array@3.0.4: {} - postgres-bytea@1.0.1: {} - postgres-bytea@3.0.0: - dependencies: - obuf: 1.1.2 - postgres-date@1.0.7: {} - postgres-date@2.1.0: {} - postgres-interval@1.2.0: dependencies: xtend: 4.0.2 - postgres-interval@3.0.0: {} - - postgres-range@1.1.4: {} - posthog-node@5.51.6: dependencies: '@posthog/core': 1.50.2 @@ -11730,8 +11610,6 @@ snapshots: inherits: 2.0.4 pump: 2.0.1 - pure-rand@8.4.2: {} - qs@6.15.3: dependencies: es-define-property: 1.0.1 @@ -12594,6 +12472,8 @@ snapshots: undici@8.10.1: {} + undici@8.10.2: {} + unicode-emoji-modifier-base@1.0.0: {} unicorn-magic@0.1.0: {} @@ -12814,6 +12694,34 @@ snapshots: transitivePeerDependencies: - msw + vitest@4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@5.0.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.11 + '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.11 + '@vitest/runner': 4.1.11 + '@vitest/snapshot': 4.1.11 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 + es-module-lexer: 2.3.2 + expect-type: 1.4.0 + magic-string: 0.30.21 + obug: 2.1.4 + pathe: 2.0.3 + picomatch: 4.0.7 + std-env: 4.2.0 + tinybench: 2.9.0 + tinyexec: 1.3.0 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.1 + vite: 8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 26.4.1 + '@vitest/coverage-v8': 5.0.0(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) + transitivePeerDependencies: + - msw + walk-up-path@4.0.0: {} web-namespaces@2.0.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8b49eb52f3..6a9f66e29d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -12,18 +12,18 @@ allowBuilds: sharp: true catalog: - "@effect/platform-bun": "4.0.0-rc.112" - "@effect/platform-node": "4.0.0-rc.112" - "@effect/sql-pg": "4.0.0-rc.112" + "@effect/platform-bun": "4.0.0-rc.113" + "@effect/platform-node": "4.0.0-rc.113" + "@effect/sql-pg": "4.0.0-rc.113" "@effect/tsgo": &effect-tsgo-version "0.37.0" - "@effect/vitest": "4.0.0-rc.112" + "@effect/vitest": "4.0.0-rc.113" "@supabase/supabase-js": ^2.110.7 "@tsconfig/bun": "^1.0.11" "@types/bun": "^1.4.0" "@types/ws": "8.18.1" "typescript": "^7.0.2" - "@vitest/coverage-v8": "^4.1.11" - "effect": "4.0.0-rc.112" + "@vitest/coverage-v8": "^5.0.0" + "effect": "4.0.0-rc.113" "knip": "^6.32.2" "oxfmt": "^0.65.0" "oxlint": "1.80.0" @@ -100,17 +100,18 @@ minimumReleaseAgeExclude: - "@turbo/linux-arm64@2.10.11" - "@turbo/windows-64@2.10.11" - "@turbo/windows-arm64@2.10.11" - - "@effect/platform-bun@4.0.0-rc.112" - - "@effect/platform-node@4.0.0-rc.112" - - "@effect/platform-node-shared@4.0.0-rc.112" - - "@effect/sql-pg@4.0.0-rc.112" - - "@effect/vitest@4.0.0-rc.112" + - "@effect/platform-bun@4.0.0-rc.113" + - "@effect/platform-node@4.0.0-rc.113" + - "@effect/platform-node-shared@4.0.0-rc.113" + - "@effect/sql-pg@4.0.0-rc.113" + - "@effect/vitest@4.0.0-rc.113" - "@supabase/pg-delta@1.0.0-alpha.49" - "@supabase/pg-topo@1.0.0-alpha.6" - "@types/bun@1.4.0" - "bun-types@1.4.0" - - "effect@4.0.0-rc.112" + - "effect@4.0.0-rc.113" - "turbo@2.10.11" + - "undici@8.10.2" supportedArchitectures: cpu: From d55b39ba4cab336d48e102b2b4bd2fe52c96c712 Mon Sep 17 00:00:00 2001 From: Kanad Gupta Date: Thu, 10 Sep 2026 20:02:23 -0700 Subject: [PATCH 03/13] chore(deps): pin @effect/sql-pg to rc.112 rc.113 replaces the node-postgres driver with a native one and drops PgClient.fromPool, which the CLI's db-connection layer uses to hand its self-managed pg.Pool to @effect/sql-pg. Keep sql-pg on rc.112 until that layer is migrated off the node-postgres wrapper. Co-Authored-By: Claude Fable 5.1 --- pnpm-lock.yaml | 96 ++++++++++++++++++++++++++++++++++++++------- pnpm-workspace.yaml | 4 +- 2 files changed, 83 insertions(+), 17 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 170af7add2..cd151adf05 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -171,8 +171,8 @@ catalogs: specifier: 4.0.0-rc.113 version: 4.0.0-rc.113 '@effect/sql-pg': - specifier: 4.0.0-rc.113 - version: 4.0.0-rc.113 + specifier: 4.0.0-rc.112 + version: 4.0.0-rc.112 '@effect/tsgo': specifier: 0.37.0 version: 0.37.0 @@ -309,7 +309,7 @@ importers: version: 4.0.0-rc.113(effect@4.0.0-rc.113) '@effect/sql-pg': specifier: 'catalog:' - version: 4.0.0-rc.113(effect@4.0.0-rc.113) + version: 4.0.0-rc.112(effect@4.0.0-rc.113) '@effect/vitest': specifier: 'catalog:' version: 4.0.0-rc.113(effect@4.0.0-rc.113)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) @@ -494,7 +494,7 @@ importers: version: 4.0.0-rc.113 undici: specifier: ^8.10.0 - version: 8.10.1 + version: 8.10.2 devDependencies: '@tsconfig/bun': specifier: 'catalog:' @@ -602,7 +602,7 @@ importers: version: 4.0.0-rc.113(effect@4.0.0-rc.113)(redis@6.2.1) '@effect/sql-pg': specifier: 'catalog:' - version: 4.0.0-rc.113(effect@4.0.0-rc.113) + version: 4.0.0-rc.112(effect@4.0.0-rc.113) effect: specifier: 'catalog:' version: 4.0.0-rc.113 @@ -887,10 +887,10 @@ packages: effect: ^4.0.0-rc.113 redis: '>=5.0.0 <7.0.0' - '@effect/sql-pg@4.0.0-rc.113': - resolution: {integrity: sha512-xsAbmxsR5sC6Pc/38nB4/rBi1co4aCC7e4T95sVy8EhWA9NRheimtiN05EyhTKZwX1C0T2gquainQwCuQYuKuA==} + '@effect/sql-pg@4.0.0-rc.112': + resolution: {integrity: sha512-UYUA3LAGH1Pg88Yau7eTlTLHRrIb/uTdxdPGxVcRdIjjrTzxtA7iKHR4hcmUeq5lQEcGLCopN7E4ffsAKF8vEQ==} peerDependencies: - effect: ^4.0.0-rc.113 + effect: ^4.0.0-rc.112 '@effect/tsgo-darwin-arm64@0.37.0': resolution: {integrity: sha512-D9o2NKswmRklu+sG28HkxZAvtvOa0Mt+bLVjJKydF2kVw+gePxiHuTbbI3e4Kqumv4ucLT3TtqU1a2RirC80lA==} @@ -5301,6 +5301,9 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + obug@2.1.4: resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} engines: {node: '>=12.20.0'} @@ -5488,10 +5491,19 @@ packages: pg-copy-streams@7.0.0: resolution: {integrity: sha512-zBvnY6wtaBRE2ae2xXWOOGMaNVPkXh1vhypAkNSKgMdciJeTyIQAHZaEeRAxUjs/p1El5jgzYmwG5u871Zj3dQ==} + pg-cursor@2.22.0: + resolution: {integrity: sha512-knzXLKqarTjOvb3qDSW0JiGsazmxwEKXrqHfWRte7XUsOYccQRafn3BLnQobWwInkzFJSyOej8y8cQRh2z3kGw==} + peerDependencies: + pg: ^8 + pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} + pg-numeric@1.0.2: + resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} + engines: {node: '>=4'} + pg-pool@3.14.0: resolution: {integrity: sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==} peerDependencies: @@ -5507,6 +5519,10 @@ packages: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} + pg-types@4.1.0: + resolution: {integrity: sha512-o2XFanIMy/3+mThw69O8d4n1E5zsLhdO+OPqswezu7Z5ekP4hYDqlDjlmOpYMbzY2Br0ufCwJLdDIXeNVwcWFg==} + engines: {node: '>=10'} + pg@8.23.0: resolution: {integrity: sha512-Ip2EQCngowJLGOfCwkFhPXU7/ljlhn6Rxlmy4XYfL2Y+vyRM59+8uR2xqRWKdYmbXmxCFOAmKxBuSUCdF34qLg==} engines: {node: '>= 16.0.0'} @@ -5580,18 +5596,37 @@ packages: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} + postgres-array@3.0.4: + resolution: {integrity: sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==} + engines: {node: '>=12'} + postgres-bytea@1.0.1: resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==} engines: {node: '>=0.10.0'} + postgres-bytea@3.0.0: + resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} + engines: {node: '>= 6'} + postgres-date@1.0.7: resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} engines: {node: '>=0.10.0'} + postgres-date@2.1.0: + resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} + engines: {node: '>=12'} + postgres-interval@1.2.0: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} + postgres-interval@3.0.0: + resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} + engines: {node: '>=12'} + + postgres-range@1.1.4: + resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + posthog-node@5.51.6: resolution: {integrity: sha512-r+Ge3p0OnOcOWeTnvKZmAtDwECeIoyNTyxBxuZc8wM6RHCQ9j2Xrhogrf39HSq1Y2gIOpWLqIDRmWDcu7xmqcA==} engines: {node: ^20.20.0 || >=22.22.0} @@ -6315,10 +6350,6 @@ packages: resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} engines: {node: '>=20.18.1'} - undici@8.10.1: - resolution: {integrity: sha512-YQ3WlbqjYMmNpdvDH64jAgLjxuAR9+649calDWhbshYaeQGO2bR4nI94ORJmwI3J9YhoKQnpyGOK+0zlWS5N5Q==} - engines: {node: '>=22.19.0'} - undici@8.10.2: resolution: {integrity: sha512-/y4/bH9YNU5hi9NIrpOuvGXFcxrj3CMrV+/AYpowAYTpHn8gX/XPFjNy766FPoYY0miQhdW977JFWKGNhBdwyQ==} engines: {node: '>=22.19.0'} @@ -6947,9 +6978,16 @@ snapshots: - bufferutil - utf-8-validate - '@effect/sql-pg@4.0.0-rc.113(effect@4.0.0-rc.113)': + '@effect/sql-pg@4.0.0-rc.112(effect@4.0.0-rc.113)': dependencies: effect: 4.0.0-rc.113 + pg: 8.23.0 + pg-connection-string: 2.14.0 + pg-cursor: 2.22.0(pg@8.23.0) + pg-pool: 3.14.0(pg@8.23.0) + pg-types: 4.1.0 + transitivePeerDependencies: + - pg-native '@effect/tsgo-darwin-arm64@0.37.0': optional: true @@ -11205,6 +11243,8 @@ snapshots: object-inspect@1.13.4: {} + obuf@1.1.2: {} + obug@2.1.4: {} on-exit-leak-free@2.1.2: {} @@ -11442,8 +11482,14 @@ snapshots: pg-copy-streams@7.0.0: {} + pg-cursor@2.22.0(pg@8.23.0): + dependencies: + pg: 8.23.0 + pg-int8@1.0.1: {} + pg-numeric@1.0.2: {} + pg-pool@3.14.0(pg@8.23.0): dependencies: pg: 8.23.0 @@ -11472,6 +11518,16 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 + pg-types@4.1.0: + dependencies: + pg-int8: 1.0.1 + pg-numeric: 1.0.2 + postgres-array: 3.0.4 + postgres-bytea: 3.0.0 + postgres-date: 2.1.0 + postgres-interval: 3.0.0 + postgres-range: 1.1.4 + pg@8.23.0: dependencies: pg-connection-string: 2.14.0 @@ -11562,14 +11618,26 @@ snapshots: postgres-array@2.0.0: {} + postgres-array@3.0.4: {} + postgres-bytea@1.0.1: {} + postgres-bytea@3.0.0: + dependencies: + obuf: 1.1.2 + postgres-date@1.0.7: {} + postgres-date@2.1.0: {} + postgres-interval@1.2.0: dependencies: xtend: 4.0.2 + postgres-interval@3.0.0: {} + + postgres-range@1.1.4: {} + posthog-node@5.51.6: dependencies: '@posthog/core': 1.50.2 @@ -12470,8 +12538,6 @@ snapshots: undici@7.29.0: {} - undici@8.10.1: {} - undici@8.10.2: {} unicode-emoji-modifier-base@1.0.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6a9f66e29d..ab56e15c32 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -14,7 +14,7 @@ allowBuilds: catalog: "@effect/platform-bun": "4.0.0-rc.113" "@effect/platform-node": "4.0.0-rc.113" - "@effect/sql-pg": "4.0.0-rc.113" + "@effect/sql-pg": "4.0.0-rc.112" "@effect/tsgo": &effect-tsgo-version "0.37.0" "@effect/vitest": "4.0.0-rc.113" "@supabase/supabase-js": ^2.110.7 @@ -103,7 +103,7 @@ minimumReleaseAgeExclude: - "@effect/platform-bun@4.0.0-rc.113" - "@effect/platform-node@4.0.0-rc.113" - "@effect/platform-node-shared@4.0.0-rc.113" - - "@effect/sql-pg@4.0.0-rc.113" + - "@effect/sql-pg@4.0.0-rc.112" - "@effect/vitest@4.0.0-rc.113" - "@supabase/pg-delta@1.0.0-alpha.49" - "@supabase/pg-topo@1.0.0-alpha.6" From c8aa594f35e8ec5a837cc0f115752aaff1dd7ec1 Mon Sep 17 00:00:00 2001 From: Kanad Gupta Date: Thu, 10 Sep 2026 20:19:57 -0700 Subject: [PATCH 04/13] test(cli): use Effect.promise for temp-dir cleanup finalizers effect rc.113 requires Effect.ensuring finalizers to have a never error channel. The rm(force: true) cleanup cannot meaningfully fail, so a rejection becomes a defect instead of a swallowed typed error. Co-Authored-By: Claude Fable 5.1 --- .../deploy/deploy.integration.test.ts | 70 +++++++------------ .../commands/init/init.integration.test.ts | 34 +++------ .../cli-project-context.layer.unit.test.ts | 8 +-- .../cli-project-home.layer.unit.test.ts | 24 ++----- ...-local-service-versions.layer.unit.test.ts | 8 +-- .../config/cli-settings.layer.unit.test.ts | 20 +++--- .../project-link-state.layer.unit.test.ts | 28 ++------ 7 files changed, 61 insertions(+), 131 deletions(-) diff --git a/apps/cli/src/commands/functions/deploy/deploy.integration.test.ts b/apps/cli/src/commands/functions/deploy/deploy.integration.test.ts index 6cfc36bfc6..0d627c18e9 100644 --- a/apps/cli/src/commands/functions/deploy/deploy.integration.test.ts +++ b/apps/cli/src/commands/functions/deploy/deploy.integration.test.ts @@ -161,9 +161,7 @@ describe("functions deploy", () => { expect(telemetry.flushed).toBe(true); }).pipe( Effect.provide(layer), - Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), - ), + Effect.ensuring(Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true }))), ); }); @@ -226,9 +224,7 @@ describe("functions deploy", () => { ); }).pipe( Effect.provide(layer), - Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), - ), + Effect.ensuring(Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true }))), ); }); @@ -294,9 +290,7 @@ describe("functions deploy", () => { expect(deployRequest?.url).toContain("/projects/qrstuvwxyzabcdefghij/functions/deploy"); }).pipe( Effect.provide(layer), - Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), - ), + Effect.ensuring(Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true }))), ); }); @@ -364,9 +358,7 @@ describe("functions deploy", () => { ); }).pipe( Effect.provide(layer), - Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), - ), + Effect.ensuring(Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true }))), ); }); @@ -425,9 +417,7 @@ describe("functions deploy", () => { expect(api.requests[0]?.urlParams).toContain("slug=configured"); }).pipe( Effect.provide(layer), - Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), - ), + Effect.ensuring(Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true }))), ); }); @@ -521,9 +511,7 @@ describe("functions deploy", () => { expect(multiparts).toHaveLength(0); }).pipe( Effect.provide(layer), - Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), - ), + Effect.ensuring(Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true }))), ); }); @@ -609,9 +597,7 @@ describe("functions deploy", () => { ); }).pipe( Effect.provide(layer), - Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), - ), + Effect.ensuring(Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true }))), ); }); @@ -689,9 +675,7 @@ describe("functions deploy", () => { expect(api.requests.some((request) => request.method === "DELETE")).toBe(true); }).pipe( Effect.provide(layer), - Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), - ), + Effect.ensuring(Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true }))), ); }); @@ -792,7 +776,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), ); }); @@ -821,7 +805,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), ); }); @@ -853,7 +837,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), ); }); @@ -1000,7 +984,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), ); }); @@ -1058,7 +1042,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), ); }); @@ -1124,7 +1108,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), ); }); @@ -1193,7 +1177,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), ); }); @@ -1215,7 +1199,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), ); }); @@ -1252,7 +1236,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), ); }, @@ -1295,7 +1279,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), ); }, @@ -1333,7 +1317,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), ); }, @@ -1368,7 +1352,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), ); }); @@ -1437,7 +1421,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), Effect.ensuring( Effect.sync(() => { @@ -1490,7 +1474,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), Effect.ensuring( Effect.sync(() => { @@ -1551,7 +1535,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), Effect.ensuring( Effect.sync(() => { @@ -1620,7 +1604,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), ); }, @@ -1665,7 +1649,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), ); }, @@ -1742,7 +1726,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), ); }, @@ -1816,7 +1800,7 @@ describe("functions deploy", () => { }).pipe( Effect.provide(layer), Effect.ensuring( - Effect.tryPromise(() => rm(tempRoot.current, { recursive: true, force: true })), + Effect.promise(() => rm(tempRoot.current, { recursive: true, force: true })), ), ); }); diff --git a/apps/cli/src/commands/init/init.integration.test.ts b/apps/cli/src/commands/init/init.integration.test.ts index ccf35d63e7..170d2d91a7 100644 --- a/apps/cli/src/commands/init/init.integration.test.ts +++ b/apps/cli/src/commands/init/init.integration.test.ts @@ -120,9 +120,7 @@ describe("init", () => { ); expect(content).toContain("major_version = 17"); expect(out.stdoutText).toBe("Finished supabase init.\n"); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live("requires --experimental when --use-orioledb is set, with cobra's exact wording", () => { @@ -149,9 +147,7 @@ describe("init", () => { `required flag(s) "experimental" not set\n`, "Try rerunning the command with --debug to troubleshoot the error.\n", ]); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live("fails with Go's exact error when config.toml already exists", () => { @@ -185,9 +181,7 @@ describe("init", () => { "failed to create config file: open supabase/config.toml: file exists\n", "Run supabase init --force to overwrite existing config file.\n", ]); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live("renders the Windows form of the already-exists error on win32", () => { @@ -221,9 +215,7 @@ describe("init", () => { "failed to create config file: open supabase\\config.toml: The file exists.\n", "Run supabase init --force to overwrite existing config file.\n", ]); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live("supports the hidden IDE flags natively", () => { @@ -254,9 +246,7 @@ describe("init", () => { ).toContain(''); expect(out.stdoutText).toContain("Generated VS Code settings in .vscode/settings.json."); expect(out.stdoutText).toContain("Generated IntelliJ settings in .idea/deno.xml."); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live("respects the legacy --workdir global flag", () => { @@ -279,9 +269,7 @@ describe("init", () => { readFile(join(workdir, "supabase", "config.toml"), "utf8"), ); expect(content).toContain("major_version = 17"); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); const BASE_INIT_FLAGS = { @@ -306,9 +294,7 @@ describe("init", () => { expect( yield* Effect.tryPromise(() => readFile(join(tempDir, ".vscode", "settings.json"), "utf8")), ).toContain('"deno.enablePaths"'); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live("init -i with SUPABASE_YES=1 auto-accepts the VS Code prompt like --yes", () => { @@ -333,7 +319,7 @@ describe("init", () => { else process.env["SUPABASE_YES"] = prev; }), ), - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), + Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true }))), ); }); @@ -349,8 +335,6 @@ describe("init", () => { expect( yield* Effect.tryPromise(() => readFile(join(tempDir, ".vscode", "settings.json"), "utf8")), ).toContain('"deno.enablePaths"'); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); }); diff --git a/apps/cli/src/shared/config/cli-project-context.layer.unit.test.ts b/apps/cli/src/shared/config/cli-project-context.layer.unit.test.ts index c853d54073..edf24e22e3 100644 --- a/apps/cli/src/shared/config/cli-project-context.layer.unit.test.ts +++ b/apps/cli/src/shared/config/cli-project-context.layer.unit.test.ts @@ -72,9 +72,7 @@ describe("cliProjectContextLayer", () => { expect(cliProjectContext.paths.value.projectRoot).toBe(projectRoot); } expect(Option.isSome(cliProjectContext.projectEnv)).toBe(true); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live("returns empty context when no supabase project is found", () => { @@ -87,8 +85,6 @@ describe("cliProjectContextLayer", () => { expect(Option.isNone(cliProjectContext.paths)).toBe(true); expect(Option.isNone(cliProjectContext.projectEnv)).toBe(true); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); }); diff --git a/apps/cli/src/shared/config/cli-project-home.layer.unit.test.ts b/apps/cli/src/shared/config/cli-project-home.layer.unit.test.ts index b4ae50e292..a156493aef 100644 --- a/apps/cli/src/shared/config/cli-project-home.layer.unit.test.ts +++ b/apps/cli/src/shared/config/cli-project-home.layer.unit.test.ts @@ -77,9 +77,7 @@ describe("cliProjectHomeLayer", () => { expect(cliProjectHome.projectLocalVersionsPath).toBe( join(packageRoot, ".supabase", "local-versions.json"), ); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live("falls back to the nearest linked project root when no project config exists", () => { @@ -103,9 +101,7 @@ describe("cliProjectHomeLayer", () => { expect(cliProjectHome.projectRoot).toBe(projectRoot); expect(cliProjectHome.projectHomeDir).toBe(join(projectRoot, ".supabase")); expect(cliProjectHome.supabaseDir).toBe(join(projectRoot, "supabase")); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live("does not let a bare ancestor .supabase directory capture a nested checkout", () => { @@ -125,9 +121,7 @@ describe("cliProjectHomeLayer", () => { expect(cliProjectHome.projectRoot).toBe(cwd); expect(cliProjectHome.projectHomeDir).toBe(join(cwd, ".supabase")); expect(cliProjectHome.projectLinkPath).toBe(join(cwd, ".supabase", "project.json")); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live("creates the repo-local .supabase directory lazily", () => { @@ -148,9 +142,7 @@ describe("cliProjectHomeLayer", () => { expect(yield* Effect.tryPromise(() => readFile(cliProjectHome.projectLinkPath, "utf8"))).toBe( "{}\n", ); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live( @@ -186,9 +178,7 @@ describe("cliProjectHomeLayer", () => { ); } } - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }, ); @@ -226,9 +216,7 @@ describe("cliProjectHomeLayer", () => { ); } } - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }, ); }); diff --git a/apps/cli/src/shared/config/cli-project-local-service-versions.layer.unit.test.ts b/apps/cli/src/shared/config/cli-project-local-service-versions.layer.unit.test.ts index 799e926d20..422c7859d9 100644 --- a/apps/cli/src/shared/config/cli-project-local-service-versions.layer.unit.test.ts +++ b/apps/cli/src/shared/config/cli-project-local-service-versions.layer.unit.test.ts @@ -98,9 +98,7 @@ describe("cliProjectLocalServiceVersionsLayer", () => { storage: "1.40.0", }); } - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live("returns none when no local override file exists", () => { @@ -119,8 +117,6 @@ describe("cliProjectLocalServiceVersionsLayer", () => { const loaded = yield* localVersions.load; expect(Option.isNone(loaded)).toBe(true); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); }); diff --git a/apps/cli/src/shared/config/cli-settings.layer.unit.test.ts b/apps/cli/src/shared/config/cli-settings.layer.unit.test.ts index 107273d69b..53cff6b6ee 100644 --- a/apps/cli/src/shared/config/cli-settings.layer.unit.test.ts +++ b/apps/cli/src/shared/config/cli-settings.layer.unit.test.ts @@ -58,7 +58,7 @@ describe("cliSettingsLayer", () => { }, }), ), - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), + Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true }))), ); }); @@ -109,9 +109,7 @@ describe("cliSettingsLayer", () => { if (Option.isSome(cliProjectContext.paths)) { expect(cliProjectContext.paths.value.projectRoot).toBe(packageRoot); } - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }, ); @@ -153,9 +151,7 @@ describe("cliSettingsLayer", () => { if (Option.isSome(cliSettings.accessToken)) { expect(Redacted.value(cliSettings.accessToken.value)).toBe("sbp_ambient"); } - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live("has no PostHog key when nothing is injected or overridden", () => { @@ -166,7 +162,7 @@ describe("cliSettingsLayer", () => { expect(Option.isNone(cliSettings.telemetryPosthogKey)).toBe(true); }).pipe( Effect.provide(buildLayer({ cwd: tempDir })), - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), + Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true }))), ); }); @@ -185,7 +181,7 @@ describe("cliSettingsLayer", () => { }, }), ), - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), + Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true }))), ); }); @@ -198,7 +194,7 @@ describe("cliSettingsLayer", () => { expect(cliSettings.supabaseHome).toBe(supabaseHome); }).pipe( Effect.provide(buildLayer({ cwd: tempDir, env: { SUPABASE_HOME: ` ${supabaseHome} ` } })), - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), + Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true }))), ); }); @@ -214,7 +210,7 @@ describe("cliSettingsLayer", () => { expect(cliSettings.supabaseHome).toBe(join(homeDir, ".supabase")); }).pipe( Effect.provide(buildLayer({ cwd: tempDir, homeDir, env: { SUPABASE_HOME: value } })), - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), + Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true }))), ); }, ); @@ -237,7 +233,7 @@ describe("cliSettingsLayer", () => { }, }), ), - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), + Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true }))), ); }); }); diff --git a/apps/cli/src/shared/config/project-link-state.layer.unit.test.ts b/apps/cli/src/shared/config/project-link-state.layer.unit.test.ts index ff0abf3be3..a2a91995a5 100644 --- a/apps/cli/src/shared/config/project-link-state.layer.unit.test.ts +++ b/apps/cli/src/shared/config/project-link-state.layer.unit.test.ts @@ -114,9 +114,7 @@ describe("projectLinkStateLayer", () => { expect(rawFile).toContain('"active_branch":'); const raw = JSON.parse(rawFile) as typeof SAMPLE_STATE; expect(raw).toEqual(SAMPLE_STATE); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live("clears repo-local link state", () => { @@ -147,9 +145,7 @@ describe("projectLinkStateLayer", () => { Effect.flip, Effect.asVoid, ); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live("fails with a tagged error when repo-local link state is malformed", () => { @@ -183,9 +179,7 @@ describe("projectLinkStateLayer", () => { }); } } - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live("getActiveBranch returns none when not linked", () => { @@ -203,9 +197,7 @@ describe("projectLinkStateLayer", () => { const activeBranch = yield* linkState.getActiveBranch; expect(Option.isNone(activeBranch)).toBe(true); - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live("getActiveBranch returns the persisted active_branch", () => { @@ -232,9 +224,7 @@ describe("projectLinkStateLayer", () => { is_default: true, }); } - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); it.live( @@ -265,9 +255,7 @@ describe("projectLinkStateLayer", () => { expect(loaded.value.versions).toEqual(SAMPLE_STATE.versions); expect(loaded.value.fetchedAt).toBe(SAMPLE_STATE.fetchedAt); } - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }, ); @@ -300,8 +288,6 @@ describe("projectLinkStateLayer", () => { }); } } - }).pipe( - Effect.ensuring(Effect.tryPromise(() => rm(tempDir, { recursive: true, force: true }))), - ); + }).pipe(Effect.ensuring(Effect.promise(() => rm(tempDir, { recursive: true, force: true })))); }); }); From 61a8a3a3f81717be5714185128f1eafcdd341242 Mon Sep 17 00:00:00 2001 From: Kanad Gupta Date: Thu, 10 Sep 2026 20:20:43 -0700 Subject: [PATCH 05/13] chore(cli): adopt effect rc.113 constructor names Flag/Argument/GlobalFlag/Primitive constructors are now capitalised (String, Boolean, Int, Literals, ChoiceWithValue, Setting, KeyValuePair) and Config.string/redacted became Config.String/Redacted. Co-Authored-By: Claude Fable 5.1 --- .../cli/boolean-flag-defaults.unit.test.ts | 6 +-- apps/cli/src/cli/complete.ts | 6 +-- apps/cli/src/cli/complete.unit.test.ts | 4 +- .../src/command-internal/db-target-flags.ts | 4 +- .../db-target-flags.unit.test.ts | 2 +- apps/cli/src/command-internal/global-flags.ts | 40 +++++++++---------- .../param-introspection.unit.test.ts | 24 +++++------ .../src/command-internal/string-slice-flag.ts | 2 +- .../test-db.command-handler.ts | 10 ++--- .../src/commands/backups/list/list.command.ts | 2 +- .../backups/restore/restore.command.ts | 4 +- .../commands/bootstrap/bootstrap.command.ts | 4 +- .../branches/create/create.command.ts | 16 ++++---- .../branches/delete/delete.command.ts | 4 +- .../branches/disable/disable.command.ts | 2 +- .../src/commands/branches/get/get.command.ts | 4 +- .../commands/branches/list/list.command.ts | 2 +- .../commands/branches/pause/pause.command.ts | 4 +- .../branches/unpause/unpause.command.ts | 4 +- .../branches/update/update.command.ts | 14 +++---- .../commands/completion/completion.flags.ts | 4 +- .../src/commands/config/diff/diff.command.ts | 4 +- .../src/commands/config/pull/pull.command.ts | 8 ++-- .../src/commands/config/pull/pull.e2e.test.ts | 2 +- .../src/commands/config/push/push.command.ts | 2 +- .../commands/db/advisors/advisors.command.ts | 14 +++---- .../db/branch/create/create.command.ts | 2 +- .../db/branch/delete/delete.command.ts | 2 +- .../db/branch/switch/switch.command.ts | 2 +- apps/cli/src/commands/db/diff/diff.command.ts | 28 ++++++------- apps/cli/src/commands/db/dump/dump.command.ts | 26 ++++++------ apps/cli/src/commands/db/lint/lint.command.ts | 16 ++++---- apps/cli/src/commands/db/pull/pull.command.ts | 22 +++++----- apps/cli/src/commands/db/push/push.command.ts | 20 +++++----- .../src/commands/db/query/query.command.ts | 12 +++--- .../db/remote/changes/changes.command.ts | 8 ++-- .../db/remote/commit/commit.command.ts | 8 ++-- .../src/commands/db/reset/reset.command.ts | 16 ++++---- .../src/commands/db/reset/reset.handler.ts | 2 +- .../schema/declarative/declarative.shared.ts | 4 +- .../declarative/generate/generate.command.ts | 16 ++++---- .../schema/declarative/sync/sync.command.ts | 10 ++--- .../src/commands/db/start/start.command.ts | 2 +- .../domains/activate/activate.command.ts | 4 +- .../commands/domains/create/create.command.ts | 6 +-- .../commands/domains/delete/delete.command.ts | 4 +- .../src/commands/domains/get/get.command.ts | 4 +- .../domains/reverify/reverify.command.ts | 4 +- .../get-root-key/get-root-key.command.ts | 2 +- .../update-root-key.command.ts | 2 +- .../compute/delete/delete.command.ts | 4 +- .../experimental/compute/list/list.command.ts | 2 +- .../experimental/compute/logs/logs.command.ts | 12 +++--- .../experimental/compute/new/new.command.ts | 12 +++--- .../experimental/compute/push/push.command.ts | 10 ++--- .../compute/status/status.command.ts | 4 +- .../experimental/stack/start/start.command.ts | 30 ++++---------- .../experimental/stack/stop/stop.command.ts | 8 +--- .../src/commands/feedback/add/add.command.ts | 4 +- .../feedback/delete/delete.command.ts | 4 +- .../functions/delete/delete.command.ts | 4 +- .../functions/deploy/deploy.command.ts | 18 ++++----- .../functions/download/download.command.ts | 10 ++--- .../commands/functions/list/list.command.ts | 2 +- .../src/commands/functions/new/new.command.ts | 4 +- .../commands/functions/serve/serve.command.ts | 16 ++++---- .../gen/bearer-jwt/bearer-jwt.command.ts | 10 ++--- .../cli/src/commands/gen/keys/keys.command.ts | 4 +- .../gen/signing-key/signing-key.command.ts | 4 +- .../src/commands/gen/types/types.command.ts | 20 +++++----- apps/cli/src/commands/init/init.command.ts | 12 +++--- .../commands/inspect/db/inspect-db-command.ts | 8 ++-- .../commands/inspect/report/report.command.ts | 10 ++--- apps/cli/src/commands/issue/issue.command.ts | 6 +-- apps/cli/src/commands/link/link.command.ts | 8 ++-- apps/cli/src/commands/login/login.command.ts | 6 +-- .../commands/migration/down/down.command.ts | 10 ++--- .../commands/migration/fetch/fetch.command.ts | 8 ++-- .../commands/migration/list/list.command.ts | 10 ++--- .../src/commands/migration/new/new.command.ts | 2 +- .../migration/repair/repair.command.ts | 14 +++---- .../migration/squash/squash.command.ts | 12 +++--- .../src/commands/migration/up/up.command.ts | 10 ++--- .../commands/network-bans/get/get.command.ts | 2 +- .../network-bans/remove/remove.command.ts | 2 +- .../network-restrictions/get/get.command.ts | 2 +- .../update/update.command.ts | 6 +-- .../commands/orgs/create/create.command.ts | 2 +- .../postgres-config/delete/delete.command.ts | 4 +- .../postgres-config/get/get.command.ts | 2 +- .../postgres-config/update/update.command.ts | 6 +-- .../projects/api-keys/api-keys.command.ts | 4 +- .../projects/create/create.command.ts | 22 +++++----- .../projects/delete/delete.command.ts | 2 +- apps/cli/src/commands/pull/pull.command.ts | 10 ++--- .../src/commands/secrets/list/list.command.ts | 2 +- .../src/commands/secrets/set/set.command.ts | 6 +-- .../commands/secrets/unset/unset.command.ts | 4 +- .../commands/seed/buckets/buckets.command.ts | 2 +- apps/cli/src/commands/seed/seed.flags.ts | 8 ++-- .../snippets/download/download.command.ts | 4 +- .../commands/snippets/list/list.command.ts | 2 +- .../ssl-enforcement/get/get.command.ts | 2 +- .../ssl-enforcement/update/update.command.ts | 6 +-- apps/cli/src/commands/sso/add/add.command.ts | 14 +++---- .../cli/src/commands/sso/info/info.command.ts | 2 +- .../cli/src/commands/sso/list/list.command.ts | 2 +- .../src/commands/sso/remove/remove.command.ts | 4 +- .../cli/src/commands/sso/show/show.command.ts | 6 +-- apps/cli/src/commands/sso/sso.e2e.test.ts | 2 +- .../src/commands/sso/update/update.command.ts | 14 +++---- apps/cli/src/commands/start/start.command.ts | 4 +- .../cli/src/commands/status/status.command.ts | 2 +- apps/cli/src/commands/stop/stop.command.ts | 10 ++--- .../cli/src/commands/storage/cp/cp.command.ts | 16 ++++---- .../cli/src/commands/storage/ls/ls.command.ts | 4 +- .../cli/src/commands/storage/mv/mv.command.ts | 6 +-- .../cli/src/commands/storage/rm/rm.command.ts | 4 +- .../cli/src/commands/storage/storage.flags.ts | 6 +-- apps/cli/src/commands/test/new/new.command.ts | 4 +- .../activate/activate.command.ts | 4 +- .../check-availability.command.ts | 4 +- .../delete/delete.command.ts | 2 +- .../vanity-subdomains/get/get.command.ts | 2 +- apps/cli/src/docs/docs-introspection.ts | 2 +- apps/cli/src/docs/docs-spec.unit.test.ts | 2 +- apps/cli/src/shared/cli/global-flags.ts | 4 +- .../src/shared/cli/run.integration.test.ts | 8 ++-- apps/cli/src/shared/cli/run.unit.test.ts | 2 +- .../subcommand-flag-suggestions.unit.test.ts | 4 +- .../src/shared/compute/compute-runtimes.ts | 2 +- .../output/normalize-error.unit.test.ts | 2 +- apps/cli/src/shared/runtime/browser.layer.ts | 2 +- apps/cli/src/telemetry/command-telemetry.ts | 10 ++--- .../telemetry/command-telemetry.unit.test.ts | 24 +++++------ packages/api/src/config/api-config.layer.ts | 4 +- 136 files changed, 486 insertions(+), 504 deletions(-) diff --git a/apps/cli/src/cli/boolean-flag-defaults.unit.test.ts b/apps/cli/src/cli/boolean-flag-defaults.unit.test.ts index a12ea64acc..8749291618 100644 --- a/apps/cli/src/cli/boolean-flag-defaults.unit.test.ts +++ b/apps/cli/src/cli/boolean-flag-defaults.unit.test.ts @@ -9,7 +9,7 @@ import { unwrapParam } from "../command-internal/param-introspection.ts"; import { rootCommandForFeatures } from "./root.ts"; /** - * `Flag.boolean(name)` alone builds a required param, so omitting it fails the whole command + * `Flag.Boolean(name)` alone builds a required param, so omitting it fails the whole command * with a missing-flag error before the handler runs — every boolean flag must pair with * `Flag.withDefault(false)` or `Flag.optional`. No other test catches this: handler integration * tests build their flags record directly, bypassing the parser, and the type checker can't see @@ -17,11 +17,11 @@ import { rootCommandForFeatures } from "./root.ts"; */ /** - * Uses `Primitive.getTypeName(Primitive.boolean)` rather than the literal `"boolean"`, so a + * Uses `Primitive.getTypeName(Primitive.Boolean)` rather than the literal `"boolean"`, so a * rename upstream breaks loudly instead of silently matching nothing and passing every command. * Avoids `primitiveType._tag` to keep this guard off effect's runtime representation. */ -const BOOLEAN_TYPE_NAME = Primitive.getTypeName(Primitive.boolean); +const BOOLEAN_TYPE_NAME = Primitive.getTypeName(Primitive.Boolean); function booleanFlagsRequiringAValue(command: Command.Command.Any): ReadonlyArray { const internals = commandInternals(command); diff --git a/apps/cli/src/cli/complete.ts b/apps/cli/src/cli/complete.ts index 310d594cd5..7bf40e5543 100644 --- a/apps/cli/src/cli/complete.ts +++ b/apps/cli/src/cli/complete.ts @@ -456,8 +456,8 @@ function hasUnconsumedFlagTerminator( /** * Flags whose real validation rejects a leading `-`/`+`, unlike this tree's plain signed - * `Flag.integer`/`Flag.string` declarations — checked before `primitiveTag` dispatch since - * `storage cp --jobs` is declared as `Flag.string`. Key = `:`. + * `Flag.Int`/`Flag.String` declarations — checked before `primitiveTag` dispatch since + * `storage cp --jobs` is declared as `Flag.String`. Key = `:`. */ const COMPLETION_UINT_FLAGS: ReadonlySet = new Set([ "functions deploy:jobs", @@ -468,7 +468,7 @@ const COMPLETION_UINT_FLAGS: ReadonlySet = new Set([ /** * Flags validated against Go duration syntax (see `isValidGoDuration`) rather than this - * tree's plain `Flag.string` declarations. + * tree's plain `Flag.String` declarations. */ const COMPLETION_DURATION_FLAGS: ReadonlySet = new Set([ "gen types:query-timeout", diff --git a/apps/cli/src/cli/complete.unit.test.ts b/apps/cli/src/cli/complete.unit.test.ts index 92dd1bf716..16f778ea48 100644 --- a/apps/cli/src/cli/complete.unit.test.ts +++ b/apps/cli/src/cli/complete.unit.test.ts @@ -511,7 +511,7 @@ describe("respondToComplete", () => { { path: ["db", "reset"], flag: "last" }, ])("rejects a negative value for $path --$flag", ({ path, flag }) => { // These flags are validated as unsigned integers, which reject a leading sign, - // unlike this tree's plain signed Flag.integer regex. + // unlike this tree's plain signed Flag.Int regex. const result = respondToComplete(rootCommand, ["__complete", ...path, `--${flag}`, "-1", ""]); expect(result).toEqual({ candidates: [], directive: CompletionDirective.Default }); }); @@ -593,7 +593,7 @@ describe("respondToComplete", () => { it("rejects a value one past int64 max for a plain (non-uint) integer flag", () => { // Validated against the signed int64 range, which is narrower than the uint64 - // bound `Flag.integer` alone would suggest. + // bound `Flag.Int` alone would suggest. const overflow = respondToComplete(rootCommand, [ "__complete", "backups", diff --git a/apps/cli/src/command-internal/db-target-flags.ts b/apps/cli/src/command-internal/db-target-flags.ts index ce6d850bd3..ee35c7bc51 100644 --- a/apps/cli/src/command-internal/db-target-flags.ts +++ b/apps/cli/src/command-internal/db-target-flags.ts @@ -42,11 +42,11 @@ export const VALUE_CONSUMING_LONG_FLAGS = new Set([ "password", // inspect report flag "output-dir", - // storage cp command flags (Flag.string / Flag.integer) + // storage cp command flags (Flag.String / Flag.Int) "cache-control", "content-type", "jobs", - // global flags (Flag.string / Flag.choice) + // global flags (Flag.String / Flag.Literals) "output", "output-format", "profile", diff --git a/apps/cli/src/command-internal/db-target-flags.unit.test.ts b/apps/cli/src/command-internal/db-target-flags.unit.test.ts index 84c576779d..4e7c0835af 100644 --- a/apps/cli/src/command-internal/db-target-flags.unit.test.ts +++ b/apps/cli/src/command-internal/db-target-flags.unit.test.ts @@ -209,7 +209,7 @@ describe("VALUE_CONSUMING_LONG_FLAGS / VALUE_CONSUMING_SHORT_FLAGS completeness const current = calls[i]!; if (!VALUE_FLAG_KINDS.includes(current.kind)) continue; - // Name declared as a literal string (e.g. `Flag.string("schema")`); a name passed as an + // Name declared as a literal string (e.g. `Flag.String("schema")`); a name passed as an // identifier doesn't match and is silently skipped — see INDIRECT_NAME_FILES above. const remainder = source.slice(current.index); const nameMatch = remainder.match(/^Flag\.\w+\(\s*"([a-zA-Z0-9-]+)"/); diff --git a/apps/cli/src/command-internal/global-flags.ts b/apps/cli/src/command-internal/global-flags.ts index 1d21906625..4bbcbb24fd 100644 --- a/apps/cli/src/command-internal/global-flags.ts +++ b/apps/cli/src/command-internal/global-flags.ts @@ -27,30 +27,30 @@ export const GLOBAL_OUTPUT_FORMATS = [ "csv", ] as const; -export const OutputFlag = GlobalFlag.setting("output")({ - flag: Flag.choice("output", GLOBAL_OUTPUT_FORMATS).pipe( +export const OutputFlag = GlobalFlag.Setting("output")({ + flag: Flag.Literals("output", GLOBAL_OUTPUT_FORMATS).pipe( Flag.withAlias("o"), Flag.withDescription("output format of status variables"), Flag.optional, ), }); -export const ProfileFlag = GlobalFlag.setting("profile")({ - flag: Flag.string("profile").pipe( +export const ProfileFlag = GlobalFlag.Setting("profile")({ + flag: Flag.String("profile").pipe( Flag.withDescription("use a specific profile for connecting to Supabase API"), Flag.withDefault("supabase"), ), }); -export const DebugFlag = GlobalFlag.setting("debug")({ - flag: Flag.boolean("debug").pipe( +export const DebugFlag = GlobalFlag.Setting("debug")({ + flag: Flag.Boolean("debug").pipe( Flag.withDescription("output debug logs to stderr"), Flag.withDefault(false), ), }); -export const WorkdirFlag = GlobalFlag.setting("workdir")({ - flag: Flag.string("workdir").pipe( +export const WorkdirFlag = GlobalFlag.Setting("workdir")({ + flag: Flag.String("workdir").pipe( Flag.withDescription( "path to the directory containing your supabase/ folder; used exactly as given, with no ancestor directory search (defaults to searching upward from the current directory)", ), @@ -58,43 +58,43 @@ export const WorkdirFlag = GlobalFlag.setting("workdir")({ ), }); -export const ExperimentalFlag = GlobalFlag.setting("experimental")({ - flag: Flag.boolean("experimental").pipe( +export const ExperimentalFlag = GlobalFlag.Setting("experimental")({ + flag: Flag.Boolean("experimental").pipe( Flag.withDescription("enable experimental features"), Flag.withDefault(false), ), }); -export const NetworkIdFlag = GlobalFlag.setting("network-id")({ - flag: Flag.string("network-id").pipe( +export const NetworkIdFlag = GlobalFlag.Setting("network-id")({ + flag: Flag.String("network-id").pipe( Flag.withDescription("use the specified docker network instead of a generated one"), Flag.optional, ), }); -export const YesFlag = GlobalFlag.setting("yes")({ - flag: Flag.boolean("yes").pipe( +export const YesFlag = GlobalFlag.Setting("yes")({ + flag: Flag.Boolean("yes").pipe( Flag.withDescription("answer yes to all prompts"), Flag.withDefault(false), ), }); -export const DnsResolverFlag = GlobalFlag.setting("dns-resolver")({ - flag: Flag.choice("dns-resolver", ["native", "https"] as const).pipe( +export const DnsResolverFlag = GlobalFlag.Setting("dns-resolver")({ + flag: Flag.Literals("dns-resolver", ["native", "https"] as const).pipe( Flag.withDescription("lookup domain names using the specified resolver"), Flag.withDefault("native" as const), ), }); -export const CreateTicketFlag = GlobalFlag.setting("create-ticket")({ - flag: Flag.boolean("create-ticket").pipe( +export const CreateTicketFlag = GlobalFlag.Setting("create-ticket")({ + flag: Flag.Boolean("create-ticket").pipe( Flag.withDescription("create a support ticket for any CLI error"), Flag.withDefault(false), ), }); -export const AgentFlag = GlobalFlag.setting("agent")({ - flag: Flag.choice("agent", ["auto", "yes", "no"] as const).pipe( +export const AgentFlag = GlobalFlag.Setting("agent")({ + flag: Flag.Literals("agent", ["auto", "yes", "no"] as const).pipe( Flag.withDescription("Override agent detection: yes, no, or auto (default auto)"), Flag.withDefault("auto" as const), ), diff --git a/apps/cli/src/command-internal/param-introspection.unit.test.ts b/apps/cli/src/command-internal/param-introspection.unit.test.ts index 9244518425..218380e78c 100644 --- a/apps/cli/src/command-internal/param-introspection.unit.test.ts +++ b/apps/cli/src/command-internal/param-introspection.unit.test.ts @@ -5,7 +5,7 @@ import { unwrapParam, unwrapToSingleParam } from "./param-introspection.ts"; describe("unwrapParam", () => { it("unwraps a plain, required flag with isOptional/isVariadic both false and variadicMin 0", () => { - const result = unwrapParam(Flag.string("custom-hostname")); + const result = unwrapParam(Flag.String("custom-hostname")); expect(result?.single.name).toBe("custom-hostname"); expect(result?.isOptional).toBe(false); expect(result?.isVariadic).toBe(false); @@ -13,26 +13,26 @@ describe("unwrapParam", () => { }); it("marks a Flag.optional-wrapped flag as isOptional", () => { - const result = unwrapParam(Flag.string("desired-subdomain").pipe(Flag.optional)); + const result = unwrapParam(Flag.String("desired-subdomain").pipe(Flag.optional)); expect(result?.single.name).toBe("desired-subdomain"); expect(result?.isOptional).toBe(true); }); it("marks a Flag.withDefault-wrapped flag as isOptional (composes as Map(Optional(Single)))", () => { - const result = unwrapParam(Flag.string("profile").pipe(Flag.withDefault("supabase"))); + const result = unwrapParam(Flag.String("profile").pipe(Flag.withDefault("supabase"))); expect(result?.single.name).toBe("profile"); expect(result?.isOptional).toBe(true); }); it("does not mark a plain boolean flag as isOptional (booleans default to false unwrapped)", () => { - const result = unwrapParam(Flag.boolean("debug")); + const result = unwrapParam(Flag.Boolean("debug")); expect(result?.single.name).toBe("debug"); expect(result?.isOptional).toBe(false); expect(result?.single.primitiveType._tag).toBe("Boolean"); }); it("marks a zero-minimum variadic flag (Flag.atLeast(0)) as variadic but NOT optional, with variadicMin 0", () => { - const result = unwrapParam(Flag.string("domains").pipe(Flag.atLeast(0))); + const result = unwrapParam(Flag.String("domains").pipe(Flag.atLeast(0))); expect(result?.single.name).toBe("domains"); expect(result?.isOptional).toBe(false); expect(result?.isVariadic).toBe(true); @@ -40,26 +40,26 @@ describe("unwrapParam", () => { }); it("captures a positive variadic minimum (Flag.atLeast(2))", () => { - const result = unwrapParam(Flag.string("source").pipe(Flag.atLeast(2))); + const result = unwrapParam(Flag.String("source").pipe(Flag.atLeast(2))); expect(result?.isVariadic).toBe(true); expect(result?.variadicMin).toBe(2); }); it("captures the minimum from Flag.between", () => { - const result = unwrapParam(Flag.string("host").pipe(Flag.between(1, 3))); + const result = unwrapParam(Flag.String("host").pipe(Flag.between(1, 3))); expect(result?.isVariadic).toBe(true); expect(result?.variadicMin).toBe(1); }); it("reports variadicMin 0 for an unbounded Flag.atMost (no minimum set)", () => { - const result = unwrapParam(Flag.string("warning").pipe(Flag.atMost(3))); + const result = unwrapParam(Flag.String("warning").pipe(Flag.atMost(3))); expect(result?.isVariadic).toBe(true); expect(result?.variadicMin).toBe(0); }); it("walks through a chained Map after Optional (Flag.withDefault on a choice flag)", () => { const result = unwrapParam( - Flag.choice("dns-resolver", ["native", "https"] as const).pipe(Flag.withDefault("native")), + Flag.Literals("dns-resolver", ["native", "https"] as const).pipe(Flag.withDefault("native")), ); expect(result?.single.name).toBe("dns-resolver"); expect(result?.isOptional).toBe(true); @@ -67,7 +67,7 @@ describe("unwrapParam", () => { }); it("preserves aliases and hidden metadata on the underlying Single", () => { - const result = unwrapParam(Flag.string("type").pipe(Flag.withAlias("t"), Flag.withHidden)); + const result = unwrapParam(Flag.String("type").pipe(Flag.withAlias("t"), Flag.withHidden)); expect(result?.single.aliases).toEqual(["t"]); expect(result?.single.hidden).toBe(true); }); @@ -75,12 +75,12 @@ describe("unwrapParam", () => { describe("unwrapToSingleParam", () => { it("returns just the underlying Single, discarding optional/variadic metadata", () => { - const single = unwrapToSingleParam(Flag.string("role").pipe(Flag.optional)); + const single = unwrapToSingleParam(Flag.String("role").pipe(Flag.optional)); expect(single?.name).toBe("role"); }); it("agrees with unwrapParam's own .single for the same input", () => { - const param = Flag.string("status").pipe(Flag.atLeast(0)); + const param = Flag.String("status").pipe(Flag.atLeast(0)); expect(unwrapToSingleParam(param)).toBe(unwrapParam(param)?.single); }); }); diff --git a/apps/cli/src/command-internal/string-slice-flag.ts b/apps/cli/src/command-internal/string-slice-flag.ts index d754c79305..6b75ea9e8a 100644 --- a/apps/cli/src/command-internal/string-slice-flag.ts +++ b/apps/cli/src/command-internal/string-slice-flag.ts @@ -256,7 +256,7 @@ export function stringSliceFlag( ) { const alias = options?.alias; const pflagName = alias === undefined ? `--${name}` : `-${alias}, --${name}`; - const base = Flag.string(name).pipe(Flag.withDescription(description), Flag.atLeast(0)); + const base = Flag.String(name).pipe(Flag.withDescription(description), Flag.atLeast(0)); return (alias === undefined ? base : base.pipe(Flag.withAlias(alias))).pipe( Flag.mapTryCatch( (rawValues) => parseStringSliceFlag(rawValues), diff --git a/apps/cli/src/command-internal/test-db.command-handler.ts b/apps/cli/src/command-internal/test-db.command-handler.ts index 72546c7ee0..e816302a68 100644 --- a/apps/cli/src/command-internal/test-db.command-handler.ts +++ b/apps/cli/src/command-internal/test-db.command-handler.ts @@ -38,26 +38,26 @@ const onRunFailure = (error: TestDbRunError | TestDbNoTestsError) => * families — see "Hoist Before You Duplicate" in `apps/cli/CLAUDE.md`. */ export const testDbConfig = { - paths: Argument.string("path").pipe( + paths: Argument.String("path").pipe( Argument.withDescription("Paths to test files or directories."), Argument.variadic(), ), - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Tests the database specified by the connection string (must be percent-encoded).", ), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Runs pgTAP tests on the linked project."), Flag.withDefault(false), ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Runs pgTAP tests on the local database."), Flag.withDefault(false), ), // TS-only override of the linked project ref — see push.command.ts (db push). - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/backups/list/list.command.ts b/apps/cli/src/commands/backups/list/list.command.ts index 05e453fc0a..72f2745904 100644 --- a/apps/cli/src/commands/backups/list/list.command.ts +++ b/apps/cli/src/commands/backups/list/list.command.ts @@ -7,7 +7,7 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { backupsList } from "./list.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/backups/restore/restore.command.ts b/apps/cli/src/commands/backups/restore/restore.command.ts index dcd3cea4fd..9e9581ead5 100644 --- a/apps/cli/src/commands/backups/restore/restore.command.ts +++ b/apps/cli/src/commands/backups/restore/restore.command.ts @@ -7,11 +7,11 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { backupsRestore } from "./restore.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - timestamp: Flag.integer("timestamp").pipe( + timestamp: Flag.Int("timestamp").pipe( Flag.withAlias("t"), Flag.withDescription("The recovery time target in seconds since epoch."), Flag.optional, diff --git a/apps/cli/src/commands/bootstrap/bootstrap.command.ts b/apps/cli/src/commands/bootstrap/bootstrap.command.ts index 4798a0fe84..503473c638 100644 --- a/apps/cli/src/commands/bootstrap/bootstrap.command.ts +++ b/apps/cli/src/commands/bootstrap/bootstrap.command.ts @@ -7,11 +7,11 @@ import { bootstrapRuntimeLayer } from "./bootstrap.layers.ts"; import { bootstrap } from "./bootstrap.handler.ts"; const config = { - template: Argument.string("template").pipe( + template: Argument.String("template").pipe( Argument.withDescription("Name of the starter template to bootstrap from."), Argument.optional, ), - password: Flag.string("password").pipe( + password: Flag.String("password").pipe( Flag.withDescription("Password to your remote Postgres database."), Flag.withAlias("p"), Flag.optional, diff --git a/apps/cli/src/commands/branches/create/create.command.ts b/apps/cli/src/commands/branches/create/create.command.ts index fb24bad899..b3b8a0e8e0 100644 --- a/apps/cli/src/commands/branches/create/create.command.ts +++ b/apps/cli/src/commands/branches/create/create.command.ts @@ -51,37 +51,37 @@ const BRANCH_SIZES = [ ] as const; const config = { - name: Argument.string("name").pipe( + name: Argument.String("name").pipe( Argument.withDescription("Name for the new branch."), Argument.optional, ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - region: Flag.choice("region", BRANCH_REGIONS).pipe( + region: Flag.Literals("region", BRANCH_REGIONS).pipe( Flag.withDescription("Select a region to deploy the branch database."), Flag.optional, ), - size: Flag.choice("size", BRANCH_SIZES).pipe( + size: Flag.Literals("size", BRANCH_SIZES).pipe( Flag.withDescription("Select a desired instance size for the branch database."), Flag.optional, ), // Optional so the handler can distinguish "flag explicitly set false" from "flag absent": // `--persistent`/`--no-persistent` set `Option.some(true|false)`; absent stays `Option.none()`. - persistent: Flag.boolean("persistent").pipe( + persistent: Flag.Boolean("persistent").pipe( Flag.withDescription("Whether to create a persistent branch."), Flag.optional, ), - withData: Flag.boolean("with-data").pipe( + withData: Flag.Boolean("with-data").pipe( Flag.withDescription("Whether to clone production data to the branch database."), Flag.optional, ), - notifyUrl: Flag.string("notify-url").pipe( + notifyUrl: Flag.String("notify-url").pipe( Flag.withDescription("URL to notify when branch is active healthy."), Flag.optional, ), - gitBranch: Flag.string("git-branch").pipe( + gitBranch: Flag.String("git-branch").pipe( Flag.withDescription("Associate a git branch with the new preview branch."), Flag.optional, ), diff --git a/apps/cli/src/commands/branches/delete/delete.command.ts b/apps/cli/src/commands/branches/delete/delete.command.ts index ccb978c6ed..3ef5bfad12 100644 --- a/apps/cli/src/commands/branches/delete/delete.command.ts +++ b/apps/cli/src/commands/branches/delete/delete.command.ts @@ -7,11 +7,11 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { branchesDelete } from "./delete.handler.ts"; const config = { - name: Argument.string("name").pipe( + name: Argument.String("name").pipe( Argument.withDescription("Branch name or ID to delete."), Argument.optional, ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/branches/disable/disable.command.ts b/apps/cli/src/commands/branches/disable/disable.command.ts index 7c2ed5364d..d261640b8f 100644 --- a/apps/cli/src/commands/branches/disable/disable.command.ts +++ b/apps/cli/src/commands/branches/disable/disable.command.ts @@ -7,7 +7,7 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { branchesDisable } from "./disable.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/branches/get/get.command.ts b/apps/cli/src/commands/branches/get/get.command.ts index 9e05cafb1d..8a0004c6f8 100644 --- a/apps/cli/src/commands/branches/get/get.command.ts +++ b/apps/cli/src/commands/branches/get/get.command.ts @@ -7,11 +7,11 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { branchesGet } from "./get.handler.ts"; const config = { - name: Argument.string("name").pipe( + name: Argument.String("name").pipe( Argument.withDescription("Branch name or ID."), Argument.optional, ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/branches/list/list.command.ts b/apps/cli/src/commands/branches/list/list.command.ts index bfc2252d27..95797d9d43 100644 --- a/apps/cli/src/commands/branches/list/list.command.ts +++ b/apps/cli/src/commands/branches/list/list.command.ts @@ -7,7 +7,7 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { branchesList } from "./list.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/branches/pause/pause.command.ts b/apps/cli/src/commands/branches/pause/pause.command.ts index 09af879850..e192a23efe 100644 --- a/apps/cli/src/commands/branches/pause/pause.command.ts +++ b/apps/cli/src/commands/branches/pause/pause.command.ts @@ -7,11 +7,11 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { branchesPause } from "./pause.handler.ts"; const config = { - name: Argument.string("name").pipe( + name: Argument.String("name").pipe( Argument.withDescription("Branch name or ID to pause."), Argument.optional, ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/branches/unpause/unpause.command.ts b/apps/cli/src/commands/branches/unpause/unpause.command.ts index 5f105ae3d7..60342433ca 100644 --- a/apps/cli/src/commands/branches/unpause/unpause.command.ts +++ b/apps/cli/src/commands/branches/unpause/unpause.command.ts @@ -7,11 +7,11 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { branchesUnpause } from "./unpause.handler.ts"; const config = { - name: Argument.string("name").pipe( + name: Argument.String("name").pipe( Argument.withDescription("Branch name or ID to unpause."), Argument.optional, ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/branches/update/update.command.ts b/apps/cli/src/commands/branches/update/update.command.ts index 26348c6ee0..bb4af91e0e 100644 --- a/apps/cli/src/commands/branches/update/update.command.ts +++ b/apps/cli/src/commands/branches/update/update.command.ts @@ -15,30 +15,30 @@ const BRANCH_STATUSES = [ ] as const; const config = { - branchId: Argument.string("name").pipe( + branchId: Argument.String("name").pipe( Argument.withDescription("Branch name or ID to update."), Argument.optional, ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - name: Flag.string("name").pipe(Flag.withDescription("Rename the preview branch."), Flag.optional), - gitBranch: Flag.string("git-branch").pipe( + name: Flag.String("name").pipe(Flag.withDescription("Rename the preview branch."), Flag.optional), + gitBranch: Flag.String("git-branch").pipe( Flag.withDescription("Change the associated git branch."), Flag.optional, ), // Optional so the handler can distinguish "explicit false" (demote to // ephemeral) from "absent". - persistent: Flag.boolean("persistent").pipe( + persistent: Flag.Boolean("persistent").pipe( Flag.withDescription("Switch between ephemeral and persistent branch."), Flag.optional, ), - status: Flag.choice("status", BRANCH_STATUSES).pipe( + status: Flag.Literals("status", BRANCH_STATUSES).pipe( Flag.withDescription("Override the current branch status."), Flag.optional, ), - notifyUrl: Flag.string("notify-url").pipe( + notifyUrl: Flag.String("notify-url").pipe( Flag.withDescription("URL to notify when branch is active healthy."), Flag.optional, ), diff --git a/apps/cli/src/commands/completion/completion.flags.ts b/apps/cli/src/commands/completion/completion.flags.ts index d99387e33c..d07f8b684f 100644 --- a/apps/cli/src/commands/completion/completion.flags.ts +++ b/apps/cli/src/commands/completion/completion.flags.ts @@ -3,10 +3,10 @@ import { Flag } from "effect/unstable/cli"; /** * `--no-descriptions` flag shared by all four completion subcommands. * - * `Flag.boolean` auto-derives a `--no-no-descriptions` negation from the name, which + * `Flag.Boolean` auto-derives a `--no-no-descriptions` negation from the name, which * harmlessly resolves back to the same `false` default. */ -export const CompletionNoDescriptionsFlagDef = Flag.boolean("no-descriptions").pipe( +export const CompletionNoDescriptionsFlagDef = Flag.Boolean("no-descriptions").pipe( Flag.withDescription("disable completion descriptions"), Flag.withDefault(false), ); diff --git a/apps/cli/src/commands/config/diff/diff.command.ts b/apps/cli/src/commands/config/diff/diff.command.ts index cf6a47e707..ba9d97d93b 100644 --- a/apps/cli/src/commands/config/diff/diff.command.ts +++ b/apps/cli/src/commands/config/diff/diff.command.ts @@ -11,13 +11,13 @@ import { configDiff } from "./diff.handler.ts"; const config = { // Accepts either a project ref or a branch of the linked project; no separate `--target` flag. - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription( "Project ref of the Supabase project, or the name (or UUID) of one of its branches. Values that are exactly 20 lowercase letters are always treated as project refs.", ), Flag.optional, ), - exitCode: Flag.boolean("exit-code").pipe( + exitCode: Flag.Boolean("exit-code").pipe( Flag.withDescription( "Exit with status 2 when any difference is found (errors keep exiting 1).", ), diff --git a/apps/cli/src/commands/config/pull/pull.command.ts b/apps/cli/src/commands/config/pull/pull.command.ts index cf74207183..c912943c72 100644 --- a/apps/cli/src/commands/config/pull/pull.command.ts +++ b/apps/cli/src/commands/config/pull/pull.command.ts @@ -12,24 +12,24 @@ import { configPull } from "./pull.handler.ts"; const config = { // Accepts either a project ref or a branch name/UUID of the linked project; there's no // separate --target flag. - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription( "Project ref of the Supabase project, or the name (or UUID) of one of its branches. Values that are exactly 20 lowercase letters are always treated as project refs.", ), Flag.optional, ), - remoteLabel: Flag.string("remote-label").pipe( + remoteLabel: Flag.String("remote-label").pipe( Flag.withDescription( "Name of the [remotes.*] block to write into, overriding the block config pull would otherwise reuse or create.", ), Flag.optional, ), - dryRun: Flag.boolean("dry-run").pipe( + dryRun: Flag.Boolean("dry-run").pipe( Flag.withDescription("Show what would be written without touching the config file."), // Without an explicit default, a boolean flag is required by the parser. Flag.withDefault(false), ), - force: Flag.boolean("force").pipe( + force: Flag.Boolean("force").pipe( Flag.withDescription("Write even when supabase/config.toml has uncommitted changes in git."), Flag.withDefault(false), ), diff --git a/apps/cli/src/commands/config/pull/pull.e2e.test.ts b/apps/cli/src/commands/config/pull/pull.e2e.test.ts index 9ff46b0bc1..aa03a57abd 100644 --- a/apps/cli/src/commands/config/pull/pull.e2e.test.ts +++ b/apps/cli/src/commands/config/pull/pull.e2e.test.ts @@ -11,7 +11,7 @@ const TEST_TOKEN = "sbp_" + "a".repeat(40); describe("config pull CLI surface", () => { test("plain `config pull` parses — no boolean flag is accidentally required", async () => { - // A Flag.boolean without Flag.withDefault(false) is a required flag, so a missing default + // A Flag.Boolean without Flag.withDefault(false) is a required flag, so a missing default // on --dry-run/--force would fail plain `supabase config pull`. Integration tests hand the // handler pre-built flags and never exercise the parser, so this needs pinning at the // subprocess boundary. diff --git a/apps/cli/src/commands/config/push/push.command.ts b/apps/cli/src/commands/config/push/push.command.ts index 74f15df1cc..36cf6ad3ae 100644 --- a/apps/cli/src/commands/config/push/push.command.ts +++ b/apps/cli/src/commands/config/push/push.command.ts @@ -13,7 +13,7 @@ import { configPush } from "./push.handler.ts"; const config = { // Accepts either a project ref or a branch name/UUID of the linked project; there's no // separate --target flag. - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription( "Project ref of the Supabase project, or the name (or UUID) of one of its branches. Values that are exactly 20 lowercase letters are always treated as project refs.", ), diff --git a/apps/cli/src/commands/db/advisors/advisors.command.ts b/apps/cli/src/commands/db/advisors/advisors.command.ts index 4c2dd468ba..b6e0158450 100644 --- a/apps/cli/src/commands/db/advisors/advisors.command.ts +++ b/apps/cli/src/commands/db/advisors/advisors.command.ts @@ -6,34 +6,34 @@ import { dbAdvisors } from "./advisors.handler.ts"; import { dbAdvisorsRuntimeLayer } from "./advisors.layers.ts"; const config = { - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Checks the database specified by the connection string (must be percent-encoded).", ), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Checks the linked project for issues."), Flag.withDefault(false), ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Checks the local database for issues."), Flag.withDefault(false), ), // Overrides the linked project ref; the same flag exists on `config push`. - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - type: Flag.choice("type", ["all", "security", "performance"] as const).pipe( + type: Flag.Literals("type", ["all", "security", "performance"] as const).pipe( Flag.withDescription("Type of advisors to check: all, security, performance."), Flag.optional, ), - level: Flag.choice("level", ["info", "warn", "error"] as const).pipe( + level: Flag.Literals("level", ["info", "warn", "error"] as const).pipe( Flag.withDescription("Minimum issue level to display: info, warn, error."), Flag.optional, ), - failOn: Flag.choice("fail-on", ["none", "info", "warn", "error"] as const).pipe( + failOn: Flag.Literals("fail-on", ["none", "info", "warn", "error"] as const).pipe( Flag.withDescription("Issue level to exit with non-zero status: none, info, warn, error."), Flag.optional, ), diff --git a/apps/cli/src/commands/db/branch/create/create.command.ts b/apps/cli/src/commands/db/branch/create/create.command.ts index bdcb982f2b..4e392a0bbe 100644 --- a/apps/cli/src/commands/db/branch/create/create.command.ts +++ b/apps/cli/src/commands/db/branch/create/create.command.ts @@ -3,7 +3,7 @@ import type * as CliCommand from "effect/unstable/cli/Command"; import { dbBranchCreate } from "./create.handler.ts"; const config = { - branchName: Argument.string("branch name").pipe( + branchName: Argument.String("branch name").pipe( Argument.withDescription("Name for the new branch."), ), } as const; diff --git a/apps/cli/src/commands/db/branch/delete/delete.command.ts b/apps/cli/src/commands/db/branch/delete/delete.command.ts index cb35a6dbe7..c73553709c 100644 --- a/apps/cli/src/commands/db/branch/delete/delete.command.ts +++ b/apps/cli/src/commands/db/branch/delete/delete.command.ts @@ -3,7 +3,7 @@ import type * as CliCommand from "effect/unstable/cli/Command"; import { dbBranchDelete } from "./delete.handler.ts"; const config = { - branchName: Argument.string("branch name").pipe( + branchName: Argument.String("branch name").pipe( Argument.withDescription("Name of the branch to delete."), ), } as const; diff --git a/apps/cli/src/commands/db/branch/switch/switch.command.ts b/apps/cli/src/commands/db/branch/switch/switch.command.ts index d948f7dcf3..ec2582e38f 100644 --- a/apps/cli/src/commands/db/branch/switch/switch.command.ts +++ b/apps/cli/src/commands/db/branch/switch/switch.command.ts @@ -3,7 +3,7 @@ import type * as CliCommand from "effect/unstable/cli/Command"; import { dbBranchSwitch } from "./switch.handler.ts"; const config = { - branchName: Argument.string("branch name").pipe( + branchName: Argument.String("branch name").pipe( Argument.withDescription("Name of the branch to switch to."), ), } as const; diff --git a/apps/cli/src/commands/db/diff/diff.command.ts b/apps/cli/src/commands/db/diff/diff.command.ts index 3fff3ac3d8..a0c93878a9 100644 --- a/apps/cli/src/commands/db/diff/diff.command.ts +++ b/apps/cli/src/commands/db/diff/diff.command.ts @@ -11,15 +11,15 @@ const config = { // The four engine flags are a mutually-exclusive group, and `--use-migra` defaults to true, so // they are modelled as `Option` to track whether the flag was passed: the mutex check and // `resolveDiffEngine`'s `useMigraChanged` key off whether it was passed, not its value. - useMigra: Flag.boolean("use-migra").pipe( + useMigra: Flag.Boolean("use-migra").pipe( Flag.withDescription("Use migra to generate schema diff."), Flag.optional, ), - usePgAdmin: Flag.boolean("use-pgadmin").pipe( + usePgAdmin: Flag.Boolean("use-pgadmin").pipe( Flag.withDescription("Use pgAdmin to generate schema diff."), Flag.optional, ), - usePgSchema: Flag.boolean("use-pg-schema").pipe( + usePgSchema: Flag.Boolean("use-pg-schema").pipe( // Deprecated in favor of the pg-delta engine (or the default migra engine): pg-schema-diff // has no TS/container equivalent, so this stays proxied — see SIDE_EFFECTS.md. This // description-only notice isn't enforced by the flag framework; see diff.handler.ts's @@ -29,32 +29,32 @@ const config = { ), Flag.optional, ), - usePgDelta: Flag.boolean("use-pg-delta").pipe( + usePgDelta: Flag.Boolean("use-pg-delta").pipe( Flag.withDescription("Use pg-delta to generate schema diff."), Flag.optional, ), - strictCoverage: Flag.boolean("strict-coverage").pipe( + strictCoverage: Flag.Boolean("strict-coverage").pipe( Flag.withDescription( "Fail when bundled pg-delta finds schema objects it cannot manage instead of leaving them unmanaged.", ), Flag.withDefault(false), ), - from: Flag.string("from").pipe( + from: Flag.String("from").pipe( Flag.withDescription("Diff from local, linked, migrations, or a Postgres URL."), Flag.optional, ), - to: Flag.string("to").pipe( + to: Flag.String("to").pipe( Flag.withDescription("Diff to local, linked, migrations, or a Postgres URL."), Flag.optional, ), - output: Flag.string("output").pipe( + output: Flag.String("output").pipe( Flag.withAlias("o"), Flag.withDescription( "Write flattened explicit diff SQL to a file for review; this is not a portable apply script.", ), Flag.optional, ), - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Diffs against the database specified by the connection string (must be percent-encoded).", ), @@ -63,27 +63,27 @@ const config = { // The target flags form a mutually-exclusive group; modelled as `Option` so // the mutex check tracks whether a flag was passed. `--local` defaults to true // via the target resolver's fall-through. - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Diffs local migration files against the linked project."), Flag.optional, ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Diffs local migration files against the local database."), Flag.optional, ), // Overrides the linked project ref; the same flag exists on `config push`. - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - file: Flag.string("file").pipe( + file: Flag.String("file").pipe( Flag.withAlias("f"), Flag.withDescription( "In normal mode, names and saves the complete schema diff as a new migration; it does not filter objects. Ignored with --from/--to.", ), Flag.optional, ), - schema: Flag.string("schema").pipe( + schema: Flag.String("schema").pipe( Flag.withAlias("s"), Flag.withDescription("Comma separated list of schema to include."), Flag.atLeast(0), diff --git a/apps/cli/src/commands/db/dump/dump.command.ts b/apps/cli/src/commands/db/dump/dump.command.ts index 86f04648dc..189b00135f 100644 --- a/apps/cli/src/commands/db/dump/dump.command.ts +++ b/apps/cli/src/commands/db/dump/dump.command.ts @@ -27,22 +27,22 @@ const onRunFailure = (error: DbDumpRunError) => }); const config = { - dryRun: Flag.boolean("dry-run").pipe( + dryRun: Flag.Boolean("dry-run").pipe( Flag.withDescription("Prints the pg_dump script that would be executed."), Flag.withDefault(false), ), // Mutually-exclusive-group flags (data-only/role-only/keep-comments, and the // db-url/linked/local target group) are modelled as `Option` so presence, not // value, drives validation — `--data-only=false` still counts as set. - dataOnly: Flag.boolean("data-only").pipe( + dataOnly: Flag.Boolean("data-only").pipe( Flag.withDescription("Dumps only data records."), Flag.optional, ), - useCopy: Flag.boolean("use-copy").pipe( + useCopy: Flag.Boolean("use-copy").pipe( Flag.withDescription("Use copy statements in place of inserts."), Flag.withDefault(false), ), - exclude: Flag.string("exclude").pipe( + exclude: Flag.String("exclude").pipe( Flag.withAlias("x"), Flag.withDescription("List of schema.tables to exclude from data-only dump."), Flag.atLeast(0), @@ -52,44 +52,44 @@ const config = { (err) => (err instanceof Error ? err.message : String(err)), ), ), - roleOnly: Flag.boolean("role-only").pipe( + roleOnly: Flag.Boolean("role-only").pipe( Flag.withDescription("Dumps only cluster roles."), Flag.optional, ), - keepComments: Flag.boolean("keep-comments").pipe( + keepComments: Flag.Boolean("keep-comments").pipe( Flag.withDescription("Keeps commented lines from pg_dump output."), Flag.optional, ), - file: Flag.string("file").pipe( + file: Flag.String("file").pipe( Flag.withAlias("f"), Flag.withDescription("File path to save the dumped contents."), Flag.optional, ), - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Dumps from the database specified by the connection string (must be percent-encoded).", ), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Dumps from the linked project."), Flag.optional, ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Dumps from the local database."), Flag.optional, ), // TS-only override of the linked project ref — see push.command.ts. - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - password: Flag.string("password").pipe( + password: Flag.String("password").pipe( Flag.withAlias("p"), Flag.withDescription("Password to your remote Postgres database."), Flag.optional, ), - schema: Flag.string("schema").pipe( + schema: Flag.String("schema").pipe( Flag.withAlias("s"), Flag.withDescription("Comma separated list of schema to include."), Flag.atLeast(0), diff --git a/apps/cli/src/commands/db/lint/lint.command.ts b/apps/cli/src/commands/db/lint/lint.command.ts index 702b739ac8..60c478f73f 100644 --- a/apps/cli/src/commands/db/lint/lint.command.ts +++ b/apps/cli/src/commands/db/lint/lint.command.ts @@ -7,26 +7,26 @@ import { dbLint } from "./lint.handler.ts"; import { dbLintRuntimeLayer } from "./lint.layers.ts"; const config = { - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Lints the database specified by the connection string (must be percent-encoded).", ), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Lints the linked project for schema errors."), Flag.withDefault(false), ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Lints the local database for schema errors."), Flag.withDefault(false), ), // TS-only override of the linked project ref — see push.command.ts. - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - schema: Flag.string("schema").pipe( + schema: Flag.String("schema").pipe( Flag.withAlias("s"), Flag.withDescription("Comma separated list of schema to include."), Flag.atLeast(0), @@ -35,11 +35,11 @@ const config = { (err) => (err instanceof Error ? err.message : String(err)), ), ), - level: Flag.choice("level", ["warning", "error"] as const).pipe( + level: Flag.Literals("level", ["warning", "error"] as const).pipe( Flag.withDescription("Error level to emit."), Flag.optional, ), - failOn: Flag.choice("fail-on", ["none", "warning", "error"] as const).pipe( + failOn: Flag.Literals("fail-on", ["none", "warning", "error"] as const).pipe( Flag.withDescription("Error level to exit with non-zero status."), Flag.optional, ), @@ -62,7 +62,7 @@ export const dbLintCommand = Command.make("lint", config).pipe( level: flags.level, "fail-on": flags.failOn, }, - // level/fail-on are auto-detected as safe (Flag.choice); --schema and + // level/fail-on are auto-detected as safe (Flag.Literals); --schema and // --project-ref stay redacted (no established safelist). config, aliases: { s: "schema" }, diff --git a/apps/cli/src/commands/db/pull/pull.command.ts b/apps/cli/src/commands/db/pull/pull.command.ts index 8f4a98e969..5ee2937a40 100644 --- a/apps/cli/src/commands/db/pull/pull.command.ts +++ b/apps/cli/src/commands/db/pull/pull.command.ts @@ -8,37 +8,37 @@ import { dbPull } from "./pull.handler.ts"; import { dbPullRuntimeLayer } from "./pull.layers.ts"; const config = { - name: Argument.string("migration name").pipe( + name: Argument.String("migration name").pipe( Argument.withDescription("Optional name for the migration file."), Argument.optional, ), // `--declarative` and the deprecated `--use-pg-delta` both select declarative // export and are mutually exclusive with `--diff-engine`. Optional so the // mutex tracks whether the flag was passed. - declarative: Flag.boolean("declarative").pipe( + declarative: Flag.Boolean("declarative").pipe( Flag.withDescription( "Replace the declarative schema tree from the selected database instead of creating a migration; migration history is not updated.", ), Flag.optional, ), - usePgDelta: Flag.boolean("use-pg-delta").pipe( + usePgDelta: Flag.Boolean("use-pg-delta").pipe( Flag.withDescription("Use pg-delta to pull declarative schema."), // Hidden: Effect V4 has no `Flag.withDeprecated`; the handler prints // cobra's deprecation line. Flag.withHidden, Flag.optional, ), - diffEngine: Flag.choice("diff-engine", ["migra", "pg-delta"] as const).pipe( + diffEngine: Flag.Literals("diff-engine", ["migra", "pg-delta"] as const).pipe( Flag.withDescription("Diff engine to use for migration-style db pull."), Flag.optional, ), - strictCoverage: Flag.boolean("strict-coverage").pipe( + strictCoverage: Flag.Boolean("strict-coverage").pipe( Flag.withDescription( "Fail when bundled pg-delta finds schema objects it cannot manage instead of leaving them unmanaged.", ), Flag.withDefault(false), ), - schema: Flag.string("schema").pipe( + schema: Flag.String("schema").pipe( Flag.withAlias("s"), Flag.withDescription("Comma separated list of schema to include."), Flag.atLeast(0), @@ -47,26 +47,26 @@ const config = { (err) => (err instanceof Error ? err.message : String(err)), ), ), - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Pulls from the database specified by the connection string (must be percent-encoded).", ), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Pulls from the linked project."), Flag.optional, ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Pulls from the local database."), Flag.optional, ), // TS-only override of the linked project ref — see push.command.ts. - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - password: Flag.string("password").pipe( + password: Flag.String("password").pipe( Flag.withAlias("p"), Flag.withDescription("Password to your remote Postgres database."), Flag.optional, diff --git a/apps/cli/src/commands/db/push/push.command.ts b/apps/cli/src/commands/db/push/push.command.ts index c6f2330b01..164c825b6f 100644 --- a/apps/cli/src/commands/db/push/push.command.ts +++ b/apps/cli/src/commands/db/push/push.command.ts @@ -7,39 +7,39 @@ import { dbPush } from "./push.handler.ts"; import { dbPushRuntimeLayer } from "./push.layers.ts"; const config = { - includeAll: Flag.boolean("include-all").pipe( + includeAll: Flag.Boolean("include-all").pipe( Flag.withDescription("Include all migrations not found on remote history table."), Flag.withDefault(false), ), - includeRoles: Flag.boolean("include-roles").pipe( + includeRoles: Flag.Boolean("include-roles").pipe( Flag.withDescription("Include custom roles from supabase/roles.sql."), Flag.withDefault(false), ), - includeSeed: Flag.boolean("include-seed").pipe( + includeSeed: Flag.Boolean("include-seed").pipe( Flag.withDescription("Include seed data from your config."), Flag.withDefault(false), ), - skipVault: Flag.boolean("skip-vault").pipe( + skipVault: Flag.Boolean("skip-vault").pipe( Flag.withDescription("Skip updating vault secrets from config.toml."), Flag.withDefault(false), ), - dryRun: Flag.boolean("dry-run").pipe( + dryRun: Flag.Boolean("dry-run").pipe( Flag.withDescription( "Print the migrations that would be applied, but don't actually apply them.", ), Flag.withDefault(false), ), - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Pushes to the database specified by the connection string (must be percent-encoded).", ), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Pushes to the linked project."), Flag.withDefault(false), ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Pushes to the local database."), Flag.withDefault(false), ), @@ -48,11 +48,11 @@ const config = { // container ids or the pg-delta project id (see `db-config.types.ts`'s // `linkedProjectRef` doc) — and is rejected outright on a non-linked target rather // than silently ignored (see the handler's guard). - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - password: Flag.string("password").pipe( + password: Flag.String("password").pipe( Flag.withAlias("p"), Flag.withDescription("Password to your remote Postgres database."), Flag.optional, diff --git a/apps/cli/src/commands/db/query/query.command.ts b/apps/cli/src/commands/db/query/query.command.ts index 37c6683ffb..8c4314f8eb 100644 --- a/apps/cli/src/commands/db/query/query.command.ts +++ b/apps/cli/src/commands/db/query/query.command.ts @@ -14,32 +14,32 @@ import { dbQueryRuntimeLayer } from "./query.layers.ts"; * defaults by agent mode (JSON for agents, table for humans) when unset. See SIDE_EFFECTS.md. */ const config = { - sql: Argument.string("sql").pipe( + sql: Argument.String("sql").pipe( Argument.withDescription("SQL query to execute."), Argument.optional, ), - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Queries the database specified by the connection string (must be percent-encoded).", ), Flag.optional, ), // Selects the linked path by presence, not value, so `--linked=false` still selects it. - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Queries the linked project's database via Management API."), Flag.optional, ), // In the same mutually-exclusive target group as `--db-url`/`--linked`, keyed off explicit // presence, so `--local=false` still counts as an explicit target in the conflict check. - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Queries the local database."), Flag.optional, ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - file: Flag.string("file").pipe( + file: Flag.String("file").pipe( Flag.withAlias("f"), Flag.withDescription("Path to a SQL file to execute."), Flag.optional, diff --git a/apps/cli/src/commands/db/remote/changes/changes.command.ts b/apps/cli/src/commands/db/remote/changes/changes.command.ts index 2f30f047ec..20957be3ca 100644 --- a/apps/cli/src/commands/db/remote/changes/changes.command.ts +++ b/apps/cli/src/commands/db/remote/changes/changes.command.ts @@ -3,20 +3,20 @@ import type * as CliCommand from "effect/unstable/cli/Command"; import { dbRemoteChanges } from "./changes.handler.ts"; const config = { - schema: Flag.string("schema").pipe( + schema: Flag.String("schema").pipe( Flag.withAlias("s"), Flag.withDescription("Comma separated list of schema to include."), Flag.atLeast(0), ), - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription("Connect using the specified Postgres URL (must be percent-encoded)."), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Connect to the linked project."), Flag.withDefault(false), ), - password: Flag.string("password").pipe( + password: Flag.String("password").pipe( Flag.withAlias("p"), Flag.withDescription("Password to your remote Postgres database."), Flag.optional, diff --git a/apps/cli/src/commands/db/remote/commit/commit.command.ts b/apps/cli/src/commands/db/remote/commit/commit.command.ts index 32ba41a61f..8da3991a66 100644 --- a/apps/cli/src/commands/db/remote/commit/commit.command.ts +++ b/apps/cli/src/commands/db/remote/commit/commit.command.ts @@ -8,7 +8,7 @@ import { dbSchemaPullRuntimeLayer } from "../../pull/pull.layers.ts"; import { dbRemoteCommit } from "./commit.handler.ts"; const config = { - schema: Flag.string("schema").pipe( + schema: Flag.String("schema").pipe( Flag.withAlias("s"), Flag.withDescription("Comma separated list of schema to include."), Flag.atLeast(0), @@ -17,15 +17,15 @@ const config = { (err) => (err instanceof Error ? err.message : String(err)), ), ), - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription("Connect using the specified Postgres URL (must be percent-encoded)."), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Connect to the linked project."), Flag.withDefault(false), ), - password: Flag.string("password").pipe( + password: Flag.String("password").pipe( Flag.withAlias("p"), Flag.withDescription("Password to your remote Postgres database."), Flag.optional, diff --git a/apps/cli/src/commands/db/reset/reset.command.ts b/apps/cli/src/commands/db/reset/reset.command.ts index 0f695b2bcc..95953f90cb 100644 --- a/apps/cli/src/commands/db/reset/reset.command.ts +++ b/apps/cli/src/commands/db/reset/reset.command.ts @@ -9,40 +9,40 @@ import { dbResetRuntimeLayer } from "./reset.layers.ts"; const noSqlPaths: ReadonlyArray = []; const config = { - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Resets the database specified by the connection string (must be percent-encoded).", ), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Resets the linked project with local migrations."), Flag.withDefault(false), ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Resets the local database with local migrations."), Flag.withDefault(false), ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - noSeed: Flag.boolean("no-seed").pipe( + noSeed: Flag.Boolean("no-seed").pipe( Flag.withDescription("Skip running the seed script after reset."), Flag.withDefault(false), ), - sqlPaths: Flag.string("sql-paths").pipe( + sqlPaths: Flag.String("sql-paths").pipe( Flag.atLeast(0), Flag.withDescription( "Override [db.seed].sql_paths for this reset. May be repeated; each value accepts a SQL file path or glob pattern relative to the supabase directory and force-enables seeding.", ), Flag.withDefault(noSqlPaths), ), - version: Flag.string("version").pipe( + version: Flag.String("version").pipe( Flag.withDescription("Reset up to the specified version."), Flag.optional, ), - last: Flag.integer("last").pipe( + last: Flag.Int("last").pipe( Flag.withDescription("Reset up to the last n migration versions."), Flag.optional, ), diff --git a/apps/cli/src/commands/db/reset/reset.handler.ts b/apps/cli/src/commands/db/reset/reset.handler.ts index 9b53b41c18..d86c982baf 100644 --- a/apps/cli/src/commands/db/reset/reset.handler.ts +++ b/apps/cli/src/commands/db/reset/reset.handler.ts @@ -93,7 +93,7 @@ export const dbReset = Effect.fn("db.reset")(function* (flags: DbResetFlags) { }), ); } - // `--last` is an unsigned flag, so a negative value should be rejected; `Flag.integer` here + // `--last` is an unsigned flag, so a negative value should be rejected; `Flag.Int` here // accepts it, so reject it explicitly rather than silently resetting the full history. if (Option.isSome(flags.last) && flags.last.value < 0) { return yield* Effect.fail( diff --git a/apps/cli/src/commands/db/schema/declarative/declarative.shared.ts b/apps/cli/src/commands/db/schema/declarative/declarative.shared.ts index 9758479f09..1d4de4e4b8 100644 --- a/apps/cli/src/commands/db/schema/declarative/declarative.shared.ts +++ b/apps/cli/src/commands/db/schema/declarative/declarative.shared.ts @@ -9,11 +9,11 @@ export const dbSchemaDeclarativeSharedBase = Command.make("declarative").pipe( Command.withDescription("Manage declarative database schemas."), Command.withShortDescription("Manage declarative database schemas"), Command.withSharedFlags({ - noCache: Flag.boolean("no-cache").pipe( + noCache: Flag.Boolean("no-cache").pipe( Flag.withDescription("Disable catalog cache and force fresh shadow database setup."), Flag.withDefault(false), ), - strictCoverage: Flag.boolean("strict-coverage").pipe( + strictCoverage: Flag.Boolean("strict-coverage").pipe( Flag.withDescription( "Fail when bundled pg-delta finds schema objects it cannot manage instead of leaving them unmanaged.", ), diff --git a/apps/cli/src/commands/db/schema/declarative/generate/generate.command.ts b/apps/cli/src/commands/db/schema/declarative/generate/generate.command.ts index 23bf7fe998..aa7806162e 100644 --- a/apps/cli/src/commands/db/schema/declarative/generate/generate.command.ts +++ b/apps/cli/src/commands/db/schema/declarative/generate/generate.command.ts @@ -12,24 +12,24 @@ import { dbSchemaDeclarativeGenerate } from "./generate.handler.ts"; import { dbSchemaDeclarativeGenerateRuntimeLayer } from "./generate.layers.ts"; const config = { - overwrite: Flag.boolean("overwrite").pipe( + overwrite: Flag.Boolean("overwrite").pipe( Flag.withDescription("Overwrite declarative schema files without confirmation."), Flag.withDefault(false), ), // Not named `--output`/`-o`: that's reserved for the global machine-format flag // (`OutputFlag`), and a leaf string flag would shadow it — `generate -o json` would write a // directory literally named `json` instead of requesting JSON output. - outputDir: Flag.string("output-dir").pipe( + outputDir: Flag.String("output-dir").pipe( Flag.withDescription( "Write the generated declarative schema to this directory without changing the configured declarative schema path.", ), Flag.optional, ), - reset: Flag.boolean("reset").pipe( + reset: Flag.Boolean("reset").pipe( Flag.withDescription("Reset local database before generating (local data will be lost)."), Flag.withDefault(false), ), - schema: Flag.string("schema").pipe( + schema: Flag.String("schema").pipe( Flag.withAlias("s"), Flag.withDescription("Comma separated list of schema to include."), Flag.atLeast(0), @@ -40,7 +40,7 @@ const config = { (err) => (err instanceof Error ? err.message : String(err)), ), ), - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Generates declarative schema from the database specified by the connection string (must be percent-encoded).", ), @@ -48,15 +48,15 @@ const config = { ), // Explicit-target selection keys off presence, not the bool value, so model `--linked`/ // `--local` as `Option` (like `--db-url`) so `--linked=false` still takes the explicit path. - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Generates declarative schema from the linked project."), Flag.optional, ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Generates declarative schema from the local database."), Flag.optional, ), - password: Flag.string("password").pipe( + password: Flag.String("password").pipe( Flag.withAlias("p"), Flag.withDescription("Password to your remote Postgres database."), Flag.optional, diff --git a/apps/cli/src/commands/db/schema/declarative/sync/sync.command.ts b/apps/cli/src/commands/db/schema/declarative/sync/sync.command.ts index c196f92522..e1664149c6 100644 --- a/apps/cli/src/commands/db/schema/declarative/sync/sync.command.ts +++ b/apps/cli/src/commands/db/schema/declarative/sync/sync.command.ts @@ -10,7 +10,7 @@ import { dbSchemaDeclarativeSync } from "./sync.handler.ts"; import { dbSchemaDeclarativeSyncRuntimeLayer } from "./sync.layers.ts"; const config = { - schema: Flag.string("schema").pipe( + schema: Flag.String("schema").pipe( Flag.withAlias("s"), Flag.withDescription("Comma separated list of schema to include."), Flag.atLeast(0), @@ -21,22 +21,22 @@ const config = { (err) => (err instanceof Error ? err.message : String(err)), ), ), - file: Flag.string("file").pipe( + file: Flag.String("file").pipe( Flag.withAlias("f"), Flag.withDescription("Saves schema diff to a new migration file."), Flag.optional, ), - name: Flag.string("name").pipe( + name: Flag.String("name").pipe( Flag.withDescription("Name for the generated migration file."), Flag.optional, ), // Mutually exclusive with `--no-apply`, keyed off presence not value, so model with `Option` // so `--apply=false --no-apply` still trips the conflict. - apply: Flag.boolean("apply").pipe( + apply: Flag.Boolean("apply").pipe( Flag.withDescription("Apply the generated migration to the local database without prompting."), Flag.optional, ), - noApply: Flag.boolean("no-apply").pipe( + noApply: Flag.Boolean("no-apply").pipe( Flag.withDescription( "Generate the migration file without prompting or applying it to the local database.", ), diff --git a/apps/cli/src/commands/db/start/start.command.ts b/apps/cli/src/commands/db/start/start.command.ts index 57c9b0150d..f53be55102 100644 --- a/apps/cli/src/commands/db/start/start.command.ts +++ b/apps/cli/src/commands/db/start/start.command.ts @@ -7,7 +7,7 @@ import { dbStart } from "./start.handler.ts"; import { dbStartRuntimeLayer } from "./start.layers.ts"; const config = { - fromBackup: Flag.string("from-backup").pipe( + fromBackup: Flag.String("from-backup").pipe( Flag.withDescription("Path to a logical backup file."), Flag.optional, ), diff --git a/apps/cli/src/commands/domains/activate/activate.command.ts b/apps/cli/src/commands/domains/activate/activate.command.ts index b6f637ce9a..610343cda9 100644 --- a/apps/cli/src/commands/domains/activate/activate.command.ts +++ b/apps/cli/src/commands/domains/activate/activate.command.ts @@ -7,11 +7,11 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { domainsActivate } from "./activate.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - includeRawOutput: Flag.boolean("include-raw-output").pipe( + includeRawOutput: Flag.Boolean("include-raw-output").pipe( Flag.withDescription("(Deprecated) use -o json instead."), Flag.withDefault(false), ), diff --git a/apps/cli/src/commands/domains/create/create.command.ts b/apps/cli/src/commands/domains/create/create.command.ts index 4974af1115..beaf0133bd 100644 --- a/apps/cli/src/commands/domains/create/create.command.ts +++ b/apps/cli/src/commands/domains/create/create.command.ts @@ -7,14 +7,14 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { domainsCreate } from "./create.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - customHostname: Flag.string("custom-hostname").pipe( + customHostname: Flag.String("custom-hostname").pipe( Flag.withDescription("The custom hostname to use for your Supabase project."), ), - includeRawOutput: Flag.boolean("include-raw-output").pipe( + includeRawOutput: Flag.Boolean("include-raw-output").pipe( Flag.withDescription("(Deprecated) use -o json instead."), Flag.withDefault(false), ), diff --git a/apps/cli/src/commands/domains/delete/delete.command.ts b/apps/cli/src/commands/domains/delete/delete.command.ts index 3c6bb65f37..2521f38076 100644 --- a/apps/cli/src/commands/domains/delete/delete.command.ts +++ b/apps/cli/src/commands/domains/delete/delete.command.ts @@ -7,11 +7,11 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { domainsDelete } from "./delete.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - includeRawOutput: Flag.boolean("include-raw-output").pipe( + includeRawOutput: Flag.Boolean("include-raw-output").pipe( Flag.withDescription("(Deprecated) use -o json instead."), Flag.withDefault(false), ), diff --git a/apps/cli/src/commands/domains/get/get.command.ts b/apps/cli/src/commands/domains/get/get.command.ts index 3c66863e9b..13efc85424 100644 --- a/apps/cli/src/commands/domains/get/get.command.ts +++ b/apps/cli/src/commands/domains/get/get.command.ts @@ -7,11 +7,11 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { domainsGet } from "./get.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - includeRawOutput: Flag.boolean("include-raw-output").pipe( + includeRawOutput: Flag.Boolean("include-raw-output").pipe( Flag.withDescription("(Deprecated) use -o json instead."), Flag.withDefault(false), ), diff --git a/apps/cli/src/commands/domains/reverify/reverify.command.ts b/apps/cli/src/commands/domains/reverify/reverify.command.ts index 4d05881003..fab078f48d 100644 --- a/apps/cli/src/commands/domains/reverify/reverify.command.ts +++ b/apps/cli/src/commands/domains/reverify/reverify.command.ts @@ -7,11 +7,11 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { domainsReverify } from "./reverify.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - includeRawOutput: Flag.boolean("include-raw-output").pipe( + includeRawOutput: Flag.Boolean("include-raw-output").pipe( Flag.withDescription("(Deprecated) use -o json instead."), Flag.withDefault(false), ), diff --git a/apps/cli/src/commands/encryption/get-root-key/get-root-key.command.ts b/apps/cli/src/commands/encryption/get-root-key/get-root-key.command.ts index 609a465b7f..5a025fe62e 100644 --- a/apps/cli/src/commands/encryption/get-root-key/get-root-key.command.ts +++ b/apps/cli/src/commands/encryption/get-root-key/get-root-key.command.ts @@ -7,7 +7,7 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { encryptionGetRootKey } from "./get-root-key.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/encryption/update-root-key/update-root-key.command.ts b/apps/cli/src/commands/encryption/update-root-key/update-root-key.command.ts index dcc1ead3d8..240961cf5c 100644 --- a/apps/cli/src/commands/encryption/update-root-key/update-root-key.command.ts +++ b/apps/cli/src/commands/encryption/update-root-key/update-root-key.command.ts @@ -10,7 +10,7 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { encryptionUpdateRootKey } from "./update-root-key.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/experimental/compute/delete/delete.command.ts b/apps/cli/src/commands/experimental/compute/delete/delete.command.ts index c8a86d5ac9..df85c2a9ed 100644 --- a/apps/cli/src/commands/experimental/compute/delete/delete.command.ts +++ b/apps/cli/src/commands/experimental/compute/delete/delete.command.ts @@ -9,8 +9,8 @@ import { computeDelete } from "./delete.handler.ts"; // reads through `resolveYes`, so redeclaring it here would shadow the // global, list `--yes` twice in `--help`, and quietly ignore `SUPABASE_YES`. const config = { - name: Argument.string("name").pipe(Argument.withDescription("Compute to delete.")), - projectRef: Flag.string("project-ref").pipe( + name: Argument.String("name").pipe(Argument.withDescription("Compute to delete.")), + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/experimental/compute/list/list.command.ts b/apps/cli/src/commands/experimental/compute/list/list.command.ts index 4b230f757c..cd31f000a9 100644 --- a/apps/cli/src/commands/experimental/compute/list/list.command.ts +++ b/apps/cli/src/commands/experimental/compute/list/list.command.ts @@ -6,7 +6,7 @@ import { withCommandTelemetry } from "../../../../telemetry/command-telemetry.ts import { computeList } from "./list.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/experimental/compute/logs/logs.command.ts b/apps/cli/src/commands/experimental/compute/logs/logs.command.ts index 0506d1312c..30b3e275a3 100644 --- a/apps/cli/src/commands/experimental/compute/logs/logs.command.ts +++ b/apps/cli/src/commands/experimental/compute/logs/logs.command.ts @@ -20,29 +20,29 @@ import { computeLogs } from "./logs.handler.ts"; const MAX_TAIL = 1000; const config = { - name: Argument.string("name").pipe(Argument.withDescription("Compute to read logs for.")), - projectRef: Flag.string("project-ref").pipe( + name: Argument.String("name").pipe(Argument.withDescription("Compute to read logs for.")), + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - kind: Flag.choice("kind", COMPUTE_LOG_KINDS).pipe( + kind: Flag.Literals("kind", COMPUTE_LOG_KINDS).pipe( Flag.withDescription( "Limit to one log stream: app (the compute's own output), requests (HTTP access), " + "builds (deploy lifecycle). Defaults to all three.", ), Flag.optional, ), - follow: Flag.boolean("follow").pipe( + follow: Flag.Boolean("follow").pipe( Flag.withAlias("f"), Flag.withDescription( `Keep printing new lines until interrupted, polling every ${COMPUTE_LOG_POLL_SECONDS} seconds.`, ), - // Required: `Flag.boolean` alone builds a *required* param, which breaks + // Required: `Flag.Boolean` alone builds a *required* param, which breaks // invocations that omit the flag. `boolean-flag-defaults.unit.test.ts` // walks the command tree and fails any bare boolean. Flag.withDefault(false), ), - tail: Flag.integer("tail").pipe( + tail: Flag.Int("tail").pipe( Flag.filter( (tail) => tail >= 0 && tail <= MAX_TAIL, (tail) => `Expected --tail between 0 and ${MAX_TAIL}, got ${tail}`, diff --git a/apps/cli/src/commands/experimental/compute/new/new.command.ts b/apps/cli/src/commands/experimental/compute/new/new.command.ts index 167d15055a..0afbbad727 100644 --- a/apps/cli/src/commands/experimental/compute/new/new.command.ts +++ b/apps/cli/src/commands/experimental/compute/new/new.command.ts @@ -15,31 +15,31 @@ import { withCommandTelemetry } from "../../../../telemetry/command-telemetry.ts import { computeNew } from "./new.handler.ts"; const config = { - name: Argument.string("name").pipe( + name: Argument.String("name").pipe( Argument.withDescription( "Compute name. Doubles as its directory, and its hostname. Prompted when omitted.", ), Argument.optional, ), - runtime: Flag.choice("runtime", COMPUTE_RUNTIMES).pipe( + runtime: Flag.Literals("runtime", COMPUTE_RUNTIMES).pipe( Flag.withDescription( "Runtime to scaffold and record in supabase/config.toml. Prompted when omitted.", ), Flag.optional, ), - size: Flag.choice("size", COMPUTE_SIZES).pipe( + size: Flag.Literals("size", COMPUTE_SIZES).pipe( Flag.withDescription( "Instance size to record in supabase/config.toml. Each size implies its own vCPU count, so there is no separate --cpu. Prompted when omitted.", ), Flag.optional, ), - exposure: Flag.choice("exposure", COMPUTE_EXPOSURES).pipe( + exposure: Flag.Literals("exposure", COMPUTE_EXPOSURES).pipe( Flag.withDescription( "Whether the compute is reachable from the internet, recorded as `exposure` in supabase/config.toml. Prompted when omitted.", ), Flag.optional, ), - instances: Flag.integer("instances").pipe( + instances: Flag.Int("instances").pipe( // Bounded at the parser, the same way `push --instances` and the config // schema's own `instances` are. Flag.filter( @@ -51,7 +51,7 @@ const config = { ), Flag.optional, ), - source: Flag.string("source").pipe( + source: Flag.String("source").pipe( Flag.withDescription( "Scaffold the compute here instead of the default compute directory, recorded as `source` in supabase/config.toml.", ), diff --git a/apps/cli/src/commands/experimental/compute/push/push.command.ts b/apps/cli/src/commands/experimental/compute/push/push.command.ts index fd56fc69ab..de551ec274 100644 --- a/apps/cli/src/commands/experimental/compute/push/push.command.ts +++ b/apps/cli/src/commands/experimental/compute/push/push.command.ts @@ -7,11 +7,11 @@ import { withCommandTelemetry } from "../../../../telemetry/command-telemetry.ts import { computePush } from "./push.handler.ts"; const config = { - names: Argument.string("name").pipe( + names: Argument.String("name").pipe( Argument.withDescription("Compute to deploy. Deploys every compute in the project if omitted."), Argument.variadic(), ), - instances: Flag.integer("instances").pipe( + instances: Flag.Int("instances").pipe( // Bounded at the parser: left unchecked, a negative value reached the deploy // endpoint after the build context was already packaged and uploaded. Flag.filter( @@ -23,7 +23,7 @@ const config = { ), Flag.optional, ), - exposure: Flag.choice("exposure", COMPUTE_EXPOSURES).pipe( + exposure: Flag.Literals("exposure", COMPUTE_EXPOSURES).pipe( // A closed set at the parser, the way `new --runtime` and `new --size` are: // the accepted values get listed in the refusal, and nothing unrecognized // reaches the deploy endpoint after a build context has been uploaded. @@ -34,7 +34,7 @@ const config = { ), Flag.optional, ), - noWait: Flag.boolean("no-wait").pipe( + noWait: Flag.Boolean("no-wait").pipe( // The deploy POST returns once the platform accepts the spec and context; the // server-side build that follows can run for minutes. Waiting stays the // default so a plain push reports the build's verdict; `--no-wait` opts out @@ -44,7 +44,7 @@ const config = { ), Flag.withDefault(false), ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/experimental/compute/status/status.command.ts b/apps/cli/src/commands/experimental/compute/status/status.command.ts index 86a6334ef2..e0bc2d8980 100644 --- a/apps/cli/src/commands/experimental/compute/status/status.command.ts +++ b/apps/cli/src/commands/experimental/compute/status/status.command.ts @@ -6,8 +6,8 @@ import { withCommandTelemetry } from "../../../../telemetry/command-telemetry.ts import { computeStatus } from "./status.handler.ts"; const config = { - name: Argument.string("name").pipe(Argument.withDescription("Compute to inspect.")), - projectRef: Flag.string("project-ref").pipe( + name: Argument.String("name").pipe(Argument.withDescription("Compute to inspect.")), + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/experimental/stack/start/start.command.ts b/apps/cli/src/commands/experimental/stack/start/start.command.ts index 42e7267d48..f41e86c905 100644 --- a/apps/cli/src/commands/experimental/stack/start/start.command.ts +++ b/apps/cli/src/commands/experimental/stack/start/start.command.ts @@ -2,32 +2,23 @@ import { Command, Flag } from "effect/unstable/cli"; import type * as CliCommand from "effect/unstable/cli/Command"; import { withJsonErrorHandling } from "../../../../shared/output/json-error-handling.ts"; import { withCommandTelemetry } from "../../../../telemetry/command-telemetry.ts"; -import { stringSliceFlag } from "../../../../command-internal/string-slice-flag.ts"; import { stackStart } from "./start.handler.ts"; -import { STACK_START_EXCLUDABLE_CAPABILITIES } from "./start.options.ts"; - -const excludeFlag = stringSliceFlag( - "exclude", - `Capabilities to leave disabled. [${STACK_START_EXCLUDABLE_CAPABILITIES.join(", ")}]`, - { alias: "x" }, -); const config = { - exclude: excludeFlag, - stack: Flag.string("stack").pipe(Flag.withDescription("Name this stack."), Flag.optional), - stackId: Flag.string("stack-id").pipe( + stack: Flag.String("stack").pipe(Flag.withDescription("Name this stack."), Flag.optional), + stackId: Flag.String("stack-id").pipe( Flag.withDescription("Open an existing stack by id."), Flag.optional, ), - runtime: Flag.choice("runtime", ["auto", "docker", "native"] as const).pipe( + runtime: Flag.Literals("runtime", ["auto", "docker", "native"] as const).pipe( Flag.withDescription("Runtime to use for a new stack."), Flag.withDefault("auto" as const), ), - preparation: Flag.choice("preparation", ["background", "on-demand"] as const).pipe( + preparation: Flag.Literals("preparation", ["background", "on-demand"] as const).pipe( Flag.withDescription("Artifact preparation policy."), Flag.withDefault("background" as const), ), - eager: Flag.boolean("eager").pipe( + eager: Flag.Boolean("eager").pipe( Flag.withDescription("Activate all enabled capabilities before returning."), Flag.withDefault(false), ), @@ -37,10 +28,8 @@ export type StackStartFlags = CliCommand.Command.Config.Infer; export const stackStartCommand = Command.make("start", config).pipe( Command.withDescription( - "Create or resume a managed local Supabase stack using supabase/config.toml when present. " + - "Without a config file, default settings are used and no file is created. " + - "For a new stack, auto selects Docker when its client is installed and native otherwise; a stopped daemon still selects Docker. " + - "Explicit runtime choices are honored. Values support explicit env(NAME) references and automatic SUPABASE_* overrides.", + "Create or resume a managed local Supabase stack from supabase/config.toml. " + + "Values support explicit env(NAME) references and automatic SUPABASE_* overrides.", ), Command.withShortDescription("Start a managed local stack"), Command.withExamples([ @@ -54,9 +43,6 @@ export const stackStartCommand = Command.make("start", config).pipe( }, ]), Command.withHandler((flags) => - stackStart(flags).pipe( - withCommandTelemetry({ flags, config, aliases: { x: "exclude" } }), - withJsonErrorHandling, - ), + stackStart(flags).pipe(withCommandTelemetry({ flags, config }), withJsonErrorHandling), ), ); diff --git a/apps/cli/src/commands/experimental/stack/stop/stop.command.ts b/apps/cli/src/commands/experimental/stack/stop/stop.command.ts index 39ec3ec781..e93a6e75b5 100644 --- a/apps/cli/src/commands/experimental/stack/stop/stop.command.ts +++ b/apps/cli/src/commands/experimental/stack/stop/stop.command.ts @@ -5,15 +5,11 @@ import { withCommandTelemetry } from "../../../../telemetry/command-telemetry.ts import { stackStop } from "./stop.handler.ts"; const config = { - all: Flag.boolean("all").pipe( - Flag.withDescription("Stop every readable managed stack."), - Flag.optional, - ), - stack: Flag.string("stack").pipe( + stack: Flag.String("stack").pipe( Flag.withDescription("Stop the stack with this name (defaults to the current project stack)."), Flag.optional, ), - stackId: Flag.string("stack-id").pipe( + stackId: Flag.String("stack-id").pipe( Flag.withDescription("Stop an existing stack by id."), Flag.optional, ), diff --git a/apps/cli/src/commands/feedback/add/add.command.ts b/apps/cli/src/commands/feedback/add/add.command.ts index 5d7b845ab6..a0e2067137 100644 --- a/apps/cli/src/commands/feedback/add/add.command.ts +++ b/apps/cli/src/commands/feedback/add/add.command.ts @@ -11,13 +11,13 @@ import { FEEDBACK_OUTPUT_FORMATS } from "../feedback-output.ts"; import { feedbackAdd } from "./add.handler.ts"; const config = { - message: Argument.string("message").pipe( + message: Argument.String("message").pipe( Argument.withDescription( "Freeform feedback. Bare words are joined with spaces. 1000 character limit.", ), Argument.variadic(), ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription( "Project ref to attribute the feedback to (defaults to SUPABASE_PROJECT_ID, then the linked project).", ), diff --git a/apps/cli/src/commands/feedback/delete/delete.command.ts b/apps/cli/src/commands/feedback/delete/delete.command.ts index 0229d03606..1a72bb941a 100644 --- a/apps/cli/src/commands/feedback/delete/delete.command.ts +++ b/apps/cli/src/commands/feedback/delete/delete.command.ts @@ -10,10 +10,10 @@ import { FEEDBACK_OUTPUT_FORMATS } from "../feedback-output.ts"; import { feedbackDelete } from "./delete.handler.ts"; const config = { - token: Argument.string("token").pipe( + token: Argument.String("token").pipe( Argument.withDescription("Deletion token (UUID) printed when the feedback was submitted."), ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project the feedback was submitted with."), Flag.optional, ), diff --git a/apps/cli/src/commands/functions/delete/delete.command.ts b/apps/cli/src/commands/functions/delete/delete.command.ts index 5f11f4acc7..ae3f01248c 100644 --- a/apps/cli/src/commands/functions/delete/delete.command.ts +++ b/apps/cli/src/commands/functions/delete/delete.command.ts @@ -7,10 +7,10 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { functionsDelete } from "./delete.handler.ts"; const config = { - functionName: Argument.string("Function name").pipe( + functionName: Argument.String("Function name").pipe( Argument.withDescription("Name of the Function to delete."), ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/functions/deploy/deploy.command.ts b/apps/cli/src/commands/functions/deploy/deploy.command.ts index 968f897b8e..b2ab949583 100644 --- a/apps/cli/src/commands/functions/deploy/deploy.command.ts +++ b/apps/cli/src/commands/functions/deploy/deploy.command.ts @@ -9,31 +9,31 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { functionsDeploy } from "./deploy.handler.ts"; const config = { - functionNames: Argument.string("Function name").pipe( + functionNames: Argument.String("Function name").pipe( Argument.withDescription("Names of Functions to deploy. Deploys all if omitted."), Argument.variadic(), ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - noVerifyJwt: Flag.boolean("no-verify-jwt").pipe( + noVerifyJwt: Flag.Boolean("no-verify-jwt").pipe( Flag.withDescription("Disable JWT verification for the Function."), Flag.withDefault(false), ), - useApi: Flag.boolean("use-api").pipe( + useApi: Flag.Boolean("use-api").pipe( Flag.withDescription("Bundle functions server-side without using Docker."), Flag.withDefault(false), ), - importMap: Flag.string("import-map").pipe( + importMap: Flag.String("import-map").pipe( Flag.withDescription("Path to import map file."), Flag.optional, ), - prune: Flag.boolean("prune").pipe( + prune: Flag.Boolean("prune").pipe( Flag.withDescription("Delete Functions that exist in Supabase project but not locally."), Flag.withDefault(false), ), - jobs: Flag.integer("jobs").pipe( + jobs: Flag.Int("jobs").pipe( Flag.withAlias("j"), Flag.filter( (jobs) => jobs >= 0, @@ -42,12 +42,12 @@ const config = { Flag.withDescription("Maximum number of parallel jobs."), Flag.optional, ), - useDocker: Flag.boolean("use-docker").pipe( + useDocker: Flag.Boolean("use-docker").pipe( Flag.withDescription("Use Docker to bundle functions locally."), Flag.withDefault(true), Flag.withHidden, ), - legacyBundle: Flag.boolean("legacy-bundle").pipe( + legacyBundle: Flag.Boolean("legacy-bundle").pipe( Flag.withDescription("Use legacy bundling."), Flag.withDefault(false), Flag.withHidden, diff --git a/apps/cli/src/commands/functions/download/download.command.ts b/apps/cli/src/commands/functions/download/download.command.ts index 188f2f61b1..289d827143 100644 --- a/apps/cli/src/commands/functions/download/download.command.ts +++ b/apps/cli/src/commands/functions/download/download.command.ts @@ -7,24 +7,24 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { functionsDownload } from "./download.handler.ts"; const config = { - functionName: Argument.string("Function name").pipe( + functionName: Argument.String("Function name").pipe( Argument.withDescription("Name of the Function to download. Downloads all if omitted."), Argument.optional, ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - useApi: Flag.boolean("use-api").pipe( + useApi: Flag.Boolean("use-api").pipe( Flag.withDescription("Unbundle functions server-side without using Docker."), Flag.withDefault(false), ), - useDocker: Flag.boolean("use-docker").pipe( + useDocker: Flag.Boolean("use-docker").pipe( Flag.withDescription("Use Docker to unbundle functions locally."), Flag.withDefault(true), Flag.withHidden, ), - legacyBundle: Flag.boolean("legacy-bundle").pipe( + legacyBundle: Flag.Boolean("legacy-bundle").pipe( Flag.withDescription("Use legacy bundling."), Flag.withDefault(false), Flag.withHidden, diff --git a/apps/cli/src/commands/functions/list/list.command.ts b/apps/cli/src/commands/functions/list/list.command.ts index 393f17c665..533efd8430 100644 --- a/apps/cli/src/commands/functions/list/list.command.ts +++ b/apps/cli/src/commands/functions/list/list.command.ts @@ -7,7 +7,7 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { functionsList } from "./list.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/functions/new/new.command.ts b/apps/cli/src/commands/functions/new/new.command.ts index defb873b70..a9648752c6 100644 --- a/apps/cli/src/commands/functions/new/new.command.ts +++ b/apps/cli/src/commands/functions/new/new.command.ts @@ -13,10 +13,10 @@ import { functionsNew } from "./new.handler.ts"; const AUTH_MODE_VALUES = ["none", "apikey", "user"] as const; const config = { - functionName: Argument.string("Function name").pipe( + functionName: Argument.String("Function name").pipe( Argument.withDescription("Name of the Function to create."), ), - auth: Flag.choice("auth", AUTH_MODE_VALUES).pipe( + auth: Flag.Literals("auth", AUTH_MODE_VALUES).pipe( Flag.withDescription("use a specific auth mode"), Flag.withDefault("apikey" as const), ), diff --git a/apps/cli/src/commands/functions/serve/serve.command.ts b/apps/cli/src/commands/functions/serve/serve.command.ts index 5b19690e81..7b95d859b2 100644 --- a/apps/cli/src/commands/functions/serve/serve.command.ts +++ b/apps/cli/src/commands/functions/serve/serve.command.ts @@ -22,33 +22,33 @@ const functionsServeRuntimeLayer = Layer.mergeAll( ); const config = { - noVerifyJwt: Flag.boolean("no-verify-jwt").pipe( + noVerifyJwt: Flag.Boolean("no-verify-jwt").pipe( Flag.withDescription("Disable JWT verification for the Function."), Flag.optional, ), - envFile: Flag.string("env-file").pipe( + envFile: Flag.String("env-file").pipe( Flag.withDescription( "Path to an env file. Overrides supabase/functions/.env and per-Function .env files.", ), Flag.optional, ), - importMap: Flag.string("import-map").pipe( + importMap: Flag.String("import-map").pipe( Flag.withDescription("Path to import map file."), Flag.optional, ), - inspect: Flag.boolean("inspect").pipe( + inspect: Flag.Boolean("inspect").pipe( Flag.withDescription("Alias of --inspect-mode brk."), Flag.withDefault(false), ), - inspectMode: Flag.choice("inspect-mode", FUNCTIONS_SERVE_INSPECT_MODES).pipe( + inspectMode: Flag.Literals("inspect-mode", FUNCTIONS_SERVE_INSPECT_MODES).pipe( Flag.withDescription("Activate inspector capability for debugging."), Flag.optional, ), - inspectMain: Flag.boolean("inspect-main").pipe( + inspectMain: Flag.Boolean("inspect-main").pipe( Flag.withDescription("Allow inspecting the main worker."), Flag.withDefault(false), ), - all: Flag.boolean("all").pipe( + all: Flag.Boolean("all").pipe( Flag.withDescription("Serve all Functions."), Flag.withDefault(true), Flag.withHidden, @@ -57,7 +57,7 @@ const config = { const commandConfig = { ...config, - functionNames: Argument.string("Function name").pipe( + functionNames: Argument.String("Function name").pipe( Argument.withDescription("Legacy Function names. All Functions are served."), Argument.variadic(), ), diff --git a/apps/cli/src/commands/gen/bearer-jwt/bearer-jwt.command.ts b/apps/cli/src/commands/gen/bearer-jwt/bearer-jwt.command.ts index ff80d29bcf..5f38718896 100644 --- a/apps/cli/src/commands/gen/bearer-jwt/bearer-jwt.command.ts +++ b/apps/cli/src/commands/gen/bearer-jwt/bearer-jwt.command.ts @@ -15,12 +15,12 @@ const config = { // `--role` stays optional at parse time so a missing value is enforced in // the handler instead, after telemetry is wired up — see // `GenBearerJwtRoleRequiredError`. - role: Flag.string("role").pipe(Flag.withDescription("Postgres role to use."), Flag.optional), + role: Flag.String("role").pipe(Flag.withDescription("Postgres role to use."), Flag.optional), // The displayed default is cosmetically "anonymous" but the real default // stays "" — an omitted `--sub` never puts a `sub` claim in the token at // all. - sub: Flag.string("sub").pipe(Flag.withDescription("User ID to impersonate."), Flag.optional), - exp: Flag.string("exp").pipe( + sub: Flag.String("sub").pipe(Flag.withDescription("User ID to impersonate."), Flag.optional), + exp: Flag.String("exp").pipe( Flag.withDescription("Expiry timestamp for this token."), Flag.mapTryCatch( (value) => parseBearerJwtExp(value), @@ -28,7 +28,7 @@ const config = { ), Flag.optional, ), - validFor: Flag.string("valid-for").pipe( + validFor: Flag.String("valid-for").pipe( Flag.withDescription("Validity duration for this token."), Flag.withDefault("30m"), Flag.mapTryCatch( @@ -36,7 +36,7 @@ const config = { (err) => (err instanceof Error ? err.message : String(err)), ), ), - payload: Flag.string("payload").pipe( + payload: Flag.String("payload").pipe( Flag.withDescription("Custom claims in JSON format."), Flag.withDefault("{}"), ), diff --git a/apps/cli/src/commands/gen/keys/keys.command.ts b/apps/cli/src/commands/gen/keys/keys.command.ts index 232f8f10e0..aa91569b2c 100644 --- a/apps/cli/src/commands/gen/keys/keys.command.ts +++ b/apps/cli/src/commands/gen/keys/keys.command.ts @@ -3,11 +3,11 @@ import type * as CliCommand from "effect/unstable/cli/Command"; import { genKeys } from "./keys.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - overrideName: Flag.string("override-name").pipe( + overrideName: Flag.String("override-name").pipe( Flag.withDescription("Override specific variable names."), Flag.atLeast(0), ), diff --git a/apps/cli/src/commands/gen/signing-key/signing-key.command.ts b/apps/cli/src/commands/gen/signing-key/signing-key.command.ts index 383b8d8137..15d4a18653 100644 --- a/apps/cli/src/commands/gen/signing-key/signing-key.command.ts +++ b/apps/cli/src/commands/gen/signing-key/signing-key.command.ts @@ -13,11 +13,11 @@ import { genSigningKey } from "./signing-key.handler.ts"; const ALGORITHM_VALUES = ["ES256", "RS256"] as const; const config = { - algorithm: Flag.choice("algorithm", ALGORITHM_VALUES).pipe( + algorithm: Flag.Literals("algorithm", ALGORITHM_VALUES).pipe( Flag.withDescription("Algorithm for signing key generation."), Flag.withDefault("ES256" as const), ), - append: Flag.boolean("append").pipe( + append: Flag.Boolean("append").pipe( Flag.withDescription("Append new key to existing keys file instead of overwriting."), Flag.withDefault(false), ), diff --git a/apps/cli/src/commands/gen/types/types.command.ts b/apps/cli/src/commands/gen/types/types.command.ts index 6ab72759ce..0d4b538ab7 100644 --- a/apps/cli/src/commands/gen/types/types.command.ts +++ b/apps/cli/src/commands/gen/types/types.command.ts @@ -10,27 +10,27 @@ const LANG_VALUES = ["typescript", "go", "swift", "python"] as const; const SWIFT_ACCESS_CONTROL_VALUES = ["internal", "public"] as const; const config = { - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Generate types from the local dev database."), Flag.withDefault(false), ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Generate types from the linked project."), Flag.withDefault(false), ), - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription("Generate types from a database url."), Flag.optional, ), - projectId: Flag.string("project-id").pipe( + projectId: Flag.String("project-id").pipe( Flag.withDescription("Generate types from a project ID."), Flag.optional, ), - lang: Flag.choice("lang", LANG_VALUES).pipe( + lang: Flag.Literals("lang", LANG_VALUES).pipe( Flag.withDescription("Output language of the generated types. (default typescript)"), Flag.withDefault("typescript"), ), - schema: Flag.string("schema").pipe( + schema: Flag.String("schema").pipe( Flag.withAlias("s"), Flag.withDescription("Comma separated list of schema to include."), Flag.atLeast(0), @@ -39,15 +39,15 @@ const config = { (err) => (err instanceof Error ? err.message : String(err)), ), ), - swiftAccessControl: Flag.choice("swift-access-control", SWIFT_ACCESS_CONTROL_VALUES).pipe( + swiftAccessControl: Flag.Literals("swift-access-control", SWIFT_ACCESS_CONTROL_VALUES).pipe( Flag.withDescription("Access control for Swift generated types. (default internal)"), Flag.withDefault("internal"), ), - postgrestV9Compat: Flag.boolean("postgrest-v9-compat").pipe( + postgrestV9Compat: Flag.Boolean("postgrest-v9-compat").pipe( Flag.withDescription("Generate types compatible with PostgREST v9 and below."), Flag.withDefault(false), ), - queryTimeout: Flag.string("query-timeout").pipe( + queryTimeout: Flag.String("query-timeout").pipe( Flag.withDescription("Maximum timeout allowed for the database query. (default 15s)"), Flag.withDefault("15s"), ), @@ -55,7 +55,7 @@ const config = { const commandConfig = { ...config, - language: Argument.string("language").pipe(Argument.optional, Param.withHidden), + language: Argument.String("language").pipe(Argument.optional, Param.withHidden), } as const; export type GenTypesFlags = CliCommand.Command.Config.Infer; diff --git a/apps/cli/src/commands/init/init.command.ts b/apps/cli/src/commands/init/init.command.ts index 659387c067..45508325a1 100644 --- a/apps/cli/src/commands/init/init.command.ts +++ b/apps/cli/src/commands/init/init.command.ts @@ -8,30 +8,30 @@ import { withCommandTelemetry } from "../../telemetry/command-telemetry.ts"; import { init } from "./init.handler.ts"; const config = { - interactive: Flag.boolean("interactive").pipe( + interactive: Flag.Boolean("interactive").pipe( Flag.withDescription("Enables interactive mode to configure IDE settings."), Flag.withAlias("i"), Flag.withDefault(false), ), - useOrioledb: Flag.boolean("use-orioledb").pipe( + useOrioledb: Flag.Boolean("use-orioledb").pipe( Flag.withDescription("Use OrioleDB storage engine for Postgres."), Flag.withDefault(false), ), - force: Flag.boolean("force").pipe( + force: Flag.Boolean("force").pipe( Flag.withDescription("Overwrite existing supabase/config.toml."), Flag.withDefault(false), ), - withVscodeWorkspace: Flag.boolean("with-vscode-workspace").pipe( + withVscodeWorkspace: Flag.Boolean("with-vscode-workspace").pipe( Flag.withDescription("Generate VS Code workspace."), Flag.withHidden, Flag.withDefault(false), ), - withVscodeSettings: Flag.boolean("with-vscode-settings").pipe( + withVscodeSettings: Flag.Boolean("with-vscode-settings").pipe( Flag.withDescription("Generate VS Code settings for Deno."), Flag.withHidden, Flag.withDefault(false), ), - withIntellijSettings: Flag.boolean("with-intellij-settings").pipe( + withIntellijSettings: Flag.Boolean("with-intellij-settings").pipe( Flag.withDescription("Generate IntelliJ IDEA settings for Deno."), Flag.withHidden, Flag.withDefault(false), diff --git a/apps/cli/src/commands/inspect/db/inspect-db-command.ts b/apps/cli/src/commands/inspect/db/inspect-db-command.ts index 068827c405..31db7566c0 100644 --- a/apps/cli/src/commands/inspect/db/inspect-db-command.ts +++ b/apps/cli/src/commands/inspect/db/inspect-db-command.ts @@ -10,22 +10,22 @@ import type { InspectConnectionFlags } from "./inspect-query.ts"; * verbatim across all 25 commands so flag names and descriptions live in one place. */ export const INSPECT_DB_FLAGS = { - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Inspect the database specified by the connection string (must be percent-encoded).", ), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Inspect the linked project."), Flag.withDefault(false), ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Inspect the local database."), Flag.withDefault(false), ), // TS-only override of the linked project ref — see push.command.ts (db push). - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/inspect/report/report.command.ts b/apps/cli/src/commands/inspect/report/report.command.ts index 5d97d7a106..5d34f76ea1 100644 --- a/apps/cli/src/commands/inspect/report/report.command.ts +++ b/apps/cli/src/commands/inspect/report/report.command.ts @@ -7,26 +7,26 @@ import { inspectReport } from "./report.handler.ts"; import { inspectReportRuntimeLayer } from "./report.layers.ts"; const config = { - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Inspect the database specified by the connection string (must be percent-encoded).", ), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Inspect the linked project."), Flag.withDefault(false), ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Inspect the local database."), Flag.withDefault(false), ), // TS-only override of the linked project ref — see push.command.ts (db push). - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - outputDir: Flag.string("output-dir").pipe( + outputDir: Flag.String("output-dir").pipe( Flag.withDescription("Path to save CSV files in."), Flag.withDefault("."), ), diff --git a/apps/cli/src/commands/issue/issue.command.ts b/apps/cli/src/commands/issue/issue.command.ts index 6b98fa91f4..52d7c72f3b 100644 --- a/apps/cli/src/commands/issue/issue.command.ts +++ b/apps/cli/src/commands/issue/issue.command.ts @@ -6,13 +6,13 @@ import { withJsonErrorHandling } from "../../shared/output/json-error-handling.t import { withCommandTelemetry } from "../../telemetry/command-telemetry.ts"; import { issueBug, issueDocs, issueFeature } from "./issue.handler.ts"; -const issueNoBrowserFlag = Flag.boolean("no-browser").pipe( +const issueNoBrowserFlag = Flag.Boolean("no-browser").pipe( Flag.withDescription("Print the issue form URL without opening a browser."), Flag.withDefault(false), ); const issueOptionalTextFlag = (name: string, description: string) => - Flag.string(name).pipe(Flag.withDescription(description), Flag.optional); + Flag.String(name).pipe(Flag.withDescription(description), Flag.optional); const issueCommonContextFlag = issueOptionalTextFlag( "additional-context", @@ -38,7 +38,7 @@ const issueBugConfig = { } as const; const issueFeatureConfig = { - existingIssues: Flag.boolean("existing-issues").pipe( + existingIssues: Flag.Boolean("existing-issues").pipe( Flag.withDescription("Prefill the existing issues checklist."), Flag.withDefault(false), ), diff --git a/apps/cli/src/commands/link/link.command.ts b/apps/cli/src/commands/link/link.command.ts index 6623b37d60..1b0028c02f 100644 --- a/apps/cli/src/commands/link/link.command.ts +++ b/apps/cli/src/commands/link/link.command.ts @@ -9,24 +9,24 @@ import { withCommandTelemetry } from "../../telemetry/command-telemetry.ts"; import { link } from "./link.handler.ts"; const config = { - refOrBranch: Argument.string("ref-or-branch").pipe( + refOrBranch: Argument.String("ref-or-branch").pipe( Argument.withDescription( "Project ref, or the name (or UUID) of a branch of the currently linked project. Values that are exactly 20 lowercase letters are always treated as project refs.", ), Argument.optional, ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription( "Project ref of the Supabase project, or the name of one of its branches.", ), Flag.optional, ), - password: Flag.string("password").pipe( + password: Flag.String("password").pipe( Flag.withAlias("p"), Flag.withDescription("Password to your remote Postgres database."), Flag.optional, ), - skipPooler: Flag.boolean("skip-pooler").pipe( + skipPooler: Flag.Boolean("skip-pooler").pipe( Flag.withDescription("Use direct connection instead of pooler."), Flag.withDefault(false), ), diff --git a/apps/cli/src/commands/login/login.command.ts b/apps/cli/src/commands/login/login.command.ts index f58cd968b1..347c19b37d 100644 --- a/apps/cli/src/commands/login/login.command.ts +++ b/apps/cli/src/commands/login/login.command.ts @@ -7,15 +7,15 @@ import { loginRuntimeLayer } from "./login.layers.ts"; import { login } from "./login.handler.ts"; const config = { - token: Flag.string("token").pipe( + token: Flag.String("token").pipe( Flag.withDescription("Use provided token instead of automatic login flow."), Flag.optional, ), - name: Flag.string("name").pipe( + name: Flag.String("name").pipe( Flag.withDescription("Name that will be used to store token in your settings."), Flag.optional, ), - noBrowser: Flag.boolean("no-browser").pipe( + noBrowser: Flag.Boolean("no-browser").pipe( Flag.withDescription("Do not open browser automatically."), Flag.withDefault(false), ), diff --git a/apps/cli/src/commands/migration/down/down.command.ts b/apps/cli/src/commands/migration/down/down.command.ts index 429a515d46..1fadb027c8 100644 --- a/apps/cli/src/commands/migration/down/down.command.ts +++ b/apps/cli/src/commands/migration/down/down.command.ts @@ -9,7 +9,7 @@ import { migrationDown } from "./down.handler.ts"; const config = { // `--last` is conceptually a uint (default 1); Effect has no uint type, so negatives are // rejected explicitly. - last: Flag.integer("last").pipe( + last: Flag.Int("last").pipe( Flag.withDescription("Reset up to the last n migration versions."), Flag.withDefault(1), Flag.mapTryCatch( @@ -22,21 +22,21 @@ const config = { (err) => (err instanceof Error ? err.message : String(err)), ), ), - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Resets applied migrations on the database specified by the connection string (must be percent-encoded).", ), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Resets applied migrations on the linked project."), Flag.withDefault(false), ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Resets applied migrations on the local database."), Flag.withDefault(true), ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/migration/fetch/fetch.command.ts b/apps/cli/src/commands/migration/fetch/fetch.command.ts index eb5212e06f..87ba92abde 100644 --- a/apps/cli/src/commands/migration/fetch/fetch.command.ts +++ b/apps/cli/src/commands/migration/fetch/fetch.command.ts @@ -7,22 +7,22 @@ import { migrationDbRuntimeLayer } from "../migration.layers.ts"; import { migrationFetch } from "./fetch.handler.ts"; const config = { - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Fetches migrations from the database specified by the connection string (must be percent-encoded).", ), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Fetches migration history from the linked project."), Flag.withDefault(true), ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Fetches migration history from the local database."), Flag.withDefault(false), ), // TS-only override of the linked project ref — see push.command.ts (db push). - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/migration/list/list.command.ts b/apps/cli/src/commands/migration/list/list.command.ts index ccedb29cbf..7c1a758123 100644 --- a/apps/cli/src/commands/migration/list/list.command.ts +++ b/apps/cli/src/commands/migration/list/list.command.ts @@ -7,26 +7,26 @@ import { migrationDbRuntimeLayer } from "../migration.layers.ts"; import { migrationList } from "./list.handler.ts"; const config = { - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Lists migrations of the database specified by the connection string (must be percent-encoded).", ), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Lists migrations applied to the linked project."), Flag.withDefault(true), ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Lists migrations applied to the local database."), Flag.withDefault(false), ), // TS-only override of the linked project ref — see push.command.ts (db push). - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - password: Flag.string("password").pipe( + password: Flag.String("password").pipe( Flag.withAlias("p"), Flag.withDescription("Password to your remote Postgres database."), Flag.optional, diff --git a/apps/cli/src/commands/migration/new/new.command.ts b/apps/cli/src/commands/migration/new/new.command.ts index 7bb0ce6b56..b6eafc782f 100644 --- a/apps/cli/src/commands/migration/new/new.command.ts +++ b/apps/cli/src/commands/migration/new/new.command.ts @@ -7,7 +7,7 @@ import { migrationNewRuntimeLayer } from "../migration.layers.ts"; import { migrationNew } from "./new.handler.ts"; const config = { - migrationName: Argument.string("migration name").pipe( + migrationName: Argument.String("migration name").pipe( Argument.withDescription("Name for the new migration file."), ), } as const; diff --git a/apps/cli/src/commands/migration/repair/repair.command.ts b/apps/cli/src/commands/migration/repair/repair.command.ts index 4d4473d17c..96da1ba14a 100644 --- a/apps/cli/src/commands/migration/repair/repair.command.ts +++ b/apps/cli/src/commands/migration/repair/repair.command.ts @@ -6,33 +6,33 @@ import { migrationDbRuntimeLayer } from "../migration.layers.ts"; import { migrationRepair } from "./repair.handler.ts"; const config = { - versions: Argument.string("version").pipe( + versions: Argument.String("version").pipe( Argument.withDescription("Migration version(s) to repair."), Argument.variadic(), ), - status: Flag.choice("status", ["applied", "reverted"] as const).pipe( + status: Flag.Literals("status", ["applied", "reverted"] as const).pipe( Flag.withDescription("Version status to update."), ), - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Repairs migrations of the database specified by the connection string (must be percent-encoded).", ), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Repairs the migration history of the linked project."), Flag.withDefault(true), ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Repairs the migration history of the local database."), Flag.withDefault(false), ), // TS-only override of the linked project ref — see push.command.ts (db push). - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - password: Flag.string("password").pipe( + password: Flag.String("password").pipe( Flag.withAlias("p"), Flag.withDescription("Password to your remote Postgres database."), Flag.optional, diff --git a/apps/cli/src/commands/migration/squash/squash.command.ts b/apps/cli/src/commands/migration/squash/squash.command.ts index 55ba9638a1..91fda05940 100644 --- a/apps/cli/src/commands/migration/squash/squash.command.ts +++ b/apps/cli/src/commands/migration/squash/squash.command.ts @@ -7,31 +7,31 @@ import { migrationSquashRuntimeLayer } from "../migration.layers.ts"; import { migrationSquash } from "./squash.handler.ts"; const config = { - version: Flag.string("version").pipe( + version: Flag.String("version").pipe( Flag.withDescription("Squash up to the specified version."), Flag.optional, ), - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Squashes migrations of the database specified by the connection string (must be percent-encoded).", ), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Squashes the migration history of the linked project."), Flag.withDefault(false), ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Squashes the migration history of the local database."), Flag.withDefault(true), ), - password: Flag.string("password").pipe( + password: Flag.String("password").pipe( Flag.withAlias("p"), Flag.withDescription("Password to your remote Postgres database."), Flag.optional, ), // TS-only override of the linked project ref — see push.command.ts (db push). - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/migration/up/up.command.ts b/apps/cli/src/commands/migration/up/up.command.ts index 380a33841a..c31d030ab5 100644 --- a/apps/cli/src/commands/migration/up/up.command.ts +++ b/apps/cli/src/commands/migration/up/up.command.ts @@ -7,26 +7,26 @@ import { migrationDbRuntimeLayer } from "../migration.layers.ts"; import { migrationUp } from "./up.handler.ts"; const config = { - includeAll: Flag.boolean("include-all").pipe( + includeAll: Flag.Boolean("include-all").pipe( Flag.withDescription("Include all migrations not found on remote history table."), Flag.withDefault(false), ), - dbUrl: Flag.string("db-url").pipe( + dbUrl: Flag.String("db-url").pipe( Flag.withDescription( "Applies migrations to the database specified by the connection string (must be percent-encoded).", ), Flag.optional, ), - linked: Flag.boolean("linked").pipe( + linked: Flag.Boolean("linked").pipe( Flag.withDescription("Applies pending migrations to the linked project."), Flag.withDefault(false), ), - local: Flag.boolean("local").pipe( + local: Flag.Boolean("local").pipe( Flag.withDescription("Applies pending migrations to the local database."), Flag.withDefault(true), ), // TS-only override of the linked project ref — see push.command.ts (db push). - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/network-bans/get/get.command.ts b/apps/cli/src/commands/network-bans/get/get.command.ts index 568b55d67a..dce5470542 100644 --- a/apps/cli/src/commands/network-bans/get/get.command.ts +++ b/apps/cli/src/commands/network-bans/get/get.command.ts @@ -13,7 +13,7 @@ import { import { networkBansGet } from "./get.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/network-bans/remove/remove.command.ts b/apps/cli/src/commands/network-bans/remove/remove.command.ts index d83a2c91f4..87c98aef12 100644 --- a/apps/cli/src/commands/network-bans/remove/remove.command.ts +++ b/apps/cli/src/commands/network-bans/remove/remove.command.ts @@ -24,7 +24,7 @@ export const networkBansRemoveDbUnbanIpFlag = stringSliceFlag( ); const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/network-restrictions/get/get.command.ts b/apps/cli/src/commands/network-restrictions/get/get.command.ts index bd6cb47544..e875ca703a 100644 --- a/apps/cli/src/commands/network-restrictions/get/get.command.ts +++ b/apps/cli/src/commands/network-restrictions/get/get.command.ts @@ -13,7 +13,7 @@ import { import { networkRestrictionsGet } from "./get.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/network-restrictions/update/update.command.ts b/apps/cli/src/commands/network-restrictions/update/update.command.ts index d747103403..e69a6a1a3e 100644 --- a/apps/cli/src/commands/network-restrictions/update/update.command.ts +++ b/apps/cli/src/commands/network-restrictions/update/update.command.ts @@ -24,16 +24,16 @@ export const networkRestrictionsUpdateDbAllowCidrFlag = stringSliceFlag( ); const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), dbAllowCidr: networkRestrictionsUpdateDbAllowCidrFlag, - bypassCidrChecks: Flag.boolean("bypass-cidr-checks").pipe( + bypassCidrChecks: Flag.Boolean("bypass-cidr-checks").pipe( Flag.withDescription("Bypass some of the CIDR validation checks."), Flag.withDefault(false), ), - append: Flag.boolean("append").pipe( + append: Flag.Boolean("append").pipe( Flag.withDescription("Append to existing restrictions instead of replacing them."), Flag.withDefault(false), ), diff --git a/apps/cli/src/commands/orgs/create/create.command.ts b/apps/cli/src/commands/orgs/create/create.command.ts index f151a7dfd0..7b2b8b1784 100644 --- a/apps/cli/src/commands/orgs/create/create.command.ts +++ b/apps/cli/src/commands/orgs/create/create.command.ts @@ -7,7 +7,7 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { orgsCreate } from "./create.handler.ts"; const config = { - name: Argument.string("name").pipe( + name: Argument.String("name").pipe( Argument.withDescription("Display name for the new organization."), ), }; diff --git a/apps/cli/src/commands/postgres-config/delete/delete.command.ts b/apps/cli/src/commands/postgres-config/delete/delete.command.ts index de55984cf7..c94bb66e66 100644 --- a/apps/cli/src/commands/postgres-config/delete/delete.command.ts +++ b/apps/cli/src/commands/postgres-config/delete/delete.command.ts @@ -23,12 +23,12 @@ export const postgresConfigDeleteConfigFlag = stringSliceFlag( ); const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), config: postgresConfigDeleteConfigFlag, - noRestart: Flag.boolean("no-restart").pipe( + noRestart: Flag.Boolean("no-restart").pipe( Flag.withDescription("Do not restart the database after deleting config."), Flag.withDefault(false), ), diff --git a/apps/cli/src/commands/postgres-config/get/get.command.ts b/apps/cli/src/commands/postgres-config/get/get.command.ts index 28d30092d7..5d014ce3d9 100644 --- a/apps/cli/src/commands/postgres-config/get/get.command.ts +++ b/apps/cli/src/commands/postgres-config/get/get.command.ts @@ -13,7 +13,7 @@ import { import { postgresConfigGet } from "./get.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/postgres-config/update/update.command.ts b/apps/cli/src/commands/postgres-config/update/update.command.ts index 72fce371eb..7274e5531e 100644 --- a/apps/cli/src/commands/postgres-config/update/update.command.ts +++ b/apps/cli/src/commands/postgres-config/update/update.command.ts @@ -23,18 +23,18 @@ export const postgresConfigUpdateConfigFlag = stringSliceFlag( ); const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), config: postgresConfigUpdateConfigFlag, - replaceExistingOverrides: Flag.boolean("replace-existing-overrides").pipe( + replaceExistingOverrides: Flag.Boolean("replace-existing-overrides").pipe( Flag.withDescription( "If true, replaces all existing overrides with the ones provided. If false (default), merges existing overrides with the ones provided.", ), Flag.withDefault(false), ), - noRestart: Flag.boolean("no-restart").pipe( + noRestart: Flag.Boolean("no-restart").pipe( Flag.withDescription("Do not restart the database after updating config."), Flag.withDefault(false), ), diff --git a/apps/cli/src/commands/projects/api-keys/api-keys.command.ts b/apps/cli/src/commands/projects/api-keys/api-keys.command.ts index 43d2ea5de3..c392874089 100644 --- a/apps/cli/src/commands/projects/api-keys/api-keys.command.ts +++ b/apps/cli/src/commands/projects/api-keys/api-keys.command.ts @@ -6,11 +6,11 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { projectsApiKeys } from "./api-keys.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - reveal: Flag.boolean("reveal").pipe( + reveal: Flag.Boolean("reveal").pipe( Flag.withDescription("Reveal the secret API keys in full (e.g. sb_secret_...)."), Flag.withDefault(false), ), diff --git a/apps/cli/src/commands/projects/create/create.command.ts b/apps/cli/src/commands/projects/create/create.command.ts index 511f591635..76772df051 100644 --- a/apps/cli/src/commands/projects/create/create.command.ts +++ b/apps/cli/src/commands/projects/create/create.command.ts @@ -54,49 +54,49 @@ const INSTANCE_SIZES = [ ] as const; const config = { - name: Argument.string("name").pipe( + name: Argument.String("name").pipe( Argument.withDescription("Name of the project to create."), Argument.optional, ), - orgId: Flag.string("org-id").pipe( + orgId: Flag.String("org-id").pipe( Flag.withDescription("Organization ID to create the project in."), Flag.optional, ), - dbPassword: Flag.string("db-password").pipe( + dbPassword: Flag.String("db-password").pipe( Flag.withDescription("Database password of the project."), Flag.optional, ), - region: Flag.choice("region", AWS_REGIONS).pipe( + region: Flag.Literals("region", AWS_REGIONS).pipe( Flag.withDescription("Select a region close to you for the best performance."), Flag.optional, ), - size: Flag.choice("size", INSTANCE_SIZES).pipe( + size: Flag.Literals("size", INSTANCE_SIZES).pipe( Flag.withDescription("Select a desired instance size for your project."), Flag.optional, ), - highAvailability: Flag.boolean("high-availability").pipe( + highAvailability: Flag.Boolean("high-availability").pipe( Flag.withDescription("Enable high availability for the project."), Flag.optional, ), // Hidden and `--experimental`-gated: the upstream OpenAPI spec marks these fields deprecated // even though the API accepts them, restored via `packages/api/scripts/openapi-overrides.json`. - releaseChannel: Flag.choice("release-channel", RELEASE_CHANNELS).pipe( + releaseChannel: Flag.Literals("release-channel", RELEASE_CHANNELS).pipe( Flag.withDescription("Select a release channel for the project."), Flag.optional, Flag.withHidden, ), - postgresEngine: Flag.choice("postgres-engine", POSTGRES_ENGINES).pipe( + postgresEngine: Flag.Literals("postgres-engine", POSTGRES_ENGINES).pipe( Flag.withDescription("Select the Postgres engine for the project."), Flag.optional, Flag.withHidden, ), - interactive: Flag.boolean("interactive").pipe( + interactive: Flag.Boolean("interactive").pipe( Flag.withDescription("Enables interactive mode."), Flag.withAlias("i"), Flag.optional, Flag.withHidden, ), - plan: Flag.string("plan").pipe( + plan: Flag.String("plan").pipe( Flag.withDescription("Select a plan that suits your needs."), Flag.optional, Flag.withHidden, @@ -118,7 +118,7 @@ export const projectsCreateCommand = Command.make("create", config).pipe( projectsCreate(flags).pipe( // `high-availability` is omitted from `safeFlags` since boolean flags are always logged // verbatim regardless of that list. `config` auto-detects `region`/`size`/`release-channel`/ - // `postgres-engine` as safe since they're `Flag.choice`. + // `postgres-engine` as safe since they're `Flag.Literals`. withCommandTelemetry({ flags, safeFlags: ["org-id"], config }), withJsonErrorHandling, ), diff --git a/apps/cli/src/commands/projects/delete/delete.command.ts b/apps/cli/src/commands/projects/delete/delete.command.ts index ca4085a422..37cb469d46 100644 --- a/apps/cli/src/commands/projects/delete/delete.command.ts +++ b/apps/cli/src/commands/projects/delete/delete.command.ts @@ -8,7 +8,7 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { projectsDelete } from "./delete.handler.ts"; const config = { - ref: Argument.string("ref").pipe( + ref: Argument.String("ref").pipe( Argument.withDescription("Project ref to delete."), Argument.optional, ), diff --git a/apps/cli/src/commands/pull/pull.command.ts b/apps/cli/src/commands/pull/pull.command.ts index 829bcad068..83522e4a8a 100644 --- a/apps/cli/src/commands/pull/pull.command.ts +++ b/apps/cli/src/commands/pull/pull.command.ts @@ -11,29 +11,29 @@ import { pullRuntimeLayer } from "./pull.layers.ts"; const config = { // Accepts either a project ref or a branch name of the linked project — no separate `--target`. - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription( "Project ref of the Supabase project, or the name (or UUID) of one of its branches. Values that are exactly 20 lowercase letters are always treated as project refs.", ), Flag.optional, ), - remoteLabel: Flag.string("remote-label").pipe( + remoteLabel: Flag.String("remote-label").pipe( Flag.withDescription( "Name of the [remotes.*] block the config step writes into, overriding the block it would otherwise reuse or create.", ), Flag.optional, ), - dryRun: Flag.boolean("dry-run").pipe( + dryRun: Flag.Boolean("dry-run").pipe( Flag.withDescription("Show what would be pulled without writing or changing anything."), Flag.withDefault(false), ), - force: Flag.boolean("force").pipe( + force: Flag.Boolean("force").pipe( Flag.withDescription( "Write even when supabase/config.toml (or config.json), supabase/migrations, or supabase/functions has uncommitted or untracked changes in git.", ), Flag.withDefault(false), ), - withMigrationHistory: Flag.boolean("with-migration-history").pipe( + withMigrationHistory: Flag.Boolean("with-migration-history").pipe( Flag.withDescription( "Fetch the remote migration history table into supabase/migrations, even when it already has files. Runs automatically when supabase/migrations is missing or empty.", ), diff --git a/apps/cli/src/commands/secrets/list/list.command.ts b/apps/cli/src/commands/secrets/list/list.command.ts index 3d7eb994fb..08fde2d92c 100644 --- a/apps/cli/src/commands/secrets/list/list.command.ts +++ b/apps/cli/src/commands/secrets/list/list.command.ts @@ -7,7 +7,7 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { secretsList } from "./list.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/secrets/set/set.command.ts b/apps/cli/src/commands/secrets/set/set.command.ts index 18969c95c7..5f3d4e3958 100644 --- a/apps/cli/src/commands/secrets/set/set.command.ts +++ b/apps/cli/src/commands/secrets/set/set.command.ts @@ -7,15 +7,15 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { secretsSet } from "./set.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - envFile: Flag.string("env-file").pipe( + envFile: Flag.String("env-file").pipe( Flag.withDescription("Read secrets from a .env file."), Flag.optional, ), - secrets: Argument.string("NAME=VALUE").pipe( + secrets: Argument.String("NAME=VALUE").pipe( Argument.withDescription("Secret name=value pairs to set."), Argument.variadic(), ), diff --git a/apps/cli/src/commands/secrets/unset/unset.command.ts b/apps/cli/src/commands/secrets/unset/unset.command.ts index bafcb73196..d519b77397 100644 --- a/apps/cli/src/commands/secrets/unset/unset.command.ts +++ b/apps/cli/src/commands/secrets/unset/unset.command.ts @@ -9,11 +9,11 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { secretsUnset } from "./unset.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - names: Argument.string("NAME").pipe( + names: Argument.String("NAME").pipe( Argument.withDescription("Secret names to unset."), Argument.variadic(), ), diff --git a/apps/cli/src/commands/seed/buckets/buckets.command.ts b/apps/cli/src/commands/seed/buckets/buckets.command.ts index 5e502ac9b8..45229c9357 100644 --- a/apps/cli/src/commands/seed/buckets/buckets.command.ts +++ b/apps/cli/src/commands/seed/buckets/buckets.command.ts @@ -12,7 +12,7 @@ import { seedBuckets } from "./buckets.handler.ts"; const config = { // TS-only flag; see push.command.ts (db push) for the same pattern. - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/seed/seed.flags.ts b/apps/cli/src/commands/seed/seed.flags.ts index 2888ec211a..a93f5b0fa5 100644 --- a/apps/cli/src/commands/seed/seed.flags.ts +++ b/apps/cli/src/commands/seed/seed.flags.ts @@ -7,15 +7,15 @@ import { Flag, GlobalFlag } from "effect/unstable/cli"; * the changed-flag set (`buckets.flags.ts`), not these parsed values — the * defaults only affect help text and the telemetry flags map. */ -export const SeedLinkedFlag = GlobalFlag.setting("linked")({ - flag: Flag.boolean("linked").pipe( +export const SeedLinkedFlag = GlobalFlag.Setting("linked")({ + flag: Flag.Boolean("linked").pipe( Flag.withDescription("Seeds the linked project."), Flag.withDefault(false), ), }); -export const SeedLocalFlag = GlobalFlag.setting("local")({ - flag: Flag.boolean("local").pipe( +export const SeedLocalFlag = GlobalFlag.Setting("local")({ + flag: Flag.Boolean("local").pipe( Flag.withDescription("Seeds the local database."), Flag.withDefault(true), ), diff --git a/apps/cli/src/commands/snippets/download/download.command.ts b/apps/cli/src/commands/snippets/download/download.command.ts index 2f1bac1fa0..575f2068a8 100644 --- a/apps/cli/src/commands/snippets/download/download.command.ts +++ b/apps/cli/src/commands/snippets/download/download.command.ts @@ -7,10 +7,10 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { snippetsDownload } from "./download.handler.ts"; const config = { - snippetId: Argument.string("snippet-id").pipe( + snippetId: Argument.String("snippet-id").pipe( Argument.withDescription("ID of the SQL snippet to download."), ), - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/snippets/list/list.command.ts b/apps/cli/src/commands/snippets/list/list.command.ts index 3b1c92b01a..84c0650555 100644 --- a/apps/cli/src/commands/snippets/list/list.command.ts +++ b/apps/cli/src/commands/snippets/list/list.command.ts @@ -7,7 +7,7 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { snippetsList } from "./list.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/ssl-enforcement/get/get.command.ts b/apps/cli/src/commands/ssl-enforcement/get/get.command.ts index 58e516c8fd..4e8b2e8a01 100644 --- a/apps/cli/src/commands/ssl-enforcement/get/get.command.ts +++ b/apps/cli/src/commands/ssl-enforcement/get/get.command.ts @@ -13,7 +13,7 @@ import { import { sslEnforcementGet } from "./get.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/ssl-enforcement/update/update.command.ts b/apps/cli/src/commands/ssl-enforcement/update/update.command.ts index d1270bedc0..d721293aab 100644 --- a/apps/cli/src/commands/ssl-enforcement/update/update.command.ts +++ b/apps/cli/src/commands/ssl-enforcement/update/update.command.ts @@ -13,17 +13,17 @@ import { import { sslEnforcementUpdate } from "./update.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - enableDbSslEnforcement: Flag.boolean("enable-db-ssl-enforcement").pipe( + enableDbSslEnforcement: Flag.Boolean("enable-db-ssl-enforcement").pipe( Flag.withDescription( "Whether the DB should enable SSL enforcement for all external connections.", ), Flag.withDefault(false), ), - disableDbSslEnforcement: Flag.boolean("disable-db-ssl-enforcement").pipe( + disableDbSslEnforcement: Flag.Boolean("disable-db-ssl-enforcement").pipe( Flag.withDescription( "Whether the DB should disable SSL enforcement for all external connections.", ), diff --git a/apps/cli/src/commands/sso/add/add.command.ts b/apps/cli/src/commands/sso/add/add.command.ts index e145f0bdc8..4a1e2ca984 100644 --- a/apps/cli/src/commands/sso/add/add.command.ts +++ b/apps/cli/src/commands/sso/add/add.command.ts @@ -15,41 +15,41 @@ export const ssoAddDomainsFlag = stringSliceFlag( ); const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), // No `Flag.optional`: `--type` is required, enforced by the CLI parser. - type: Flag.choice("type", ["saml"] as const).pipe( + type: Flag.Literals("type", ["saml"] as const).pipe( Flag.withAlias("t"), Flag.withDescription("Type of identity provider (according to supported protocol)."), ), domains: ssoAddDomainsFlag, - metadataFile: Flag.string("metadata-file").pipe( + metadataFile: Flag.String("metadata-file").pipe( Flag.withDescription( "File containing a SAML 2.0 Metadata XML document describing the identity provider.", ), Flag.optional, ), - metadataUrl: Flag.string("metadata-url").pipe( + metadataUrl: Flag.String("metadata-url").pipe( Flag.withDescription( "URL pointing to a SAML 2.0 Metadata XML document describing the identity provider.", ), Flag.optional, ), - skipUrlValidation: Flag.boolean("skip-url-validation").pipe( + skipUrlValidation: Flag.Boolean("skip-url-validation").pipe( Flag.withDescription( "Skip local validation of the SAML 2.0 Metadata URL (HTTPS requirement, live GET probe, and UTF-8 body decode). Use in air-gapped CI where the IDP is not reachable from the build agent.", ), Flag.withDefault(false), ), - attributeMappingFile: Flag.string("attribute-mapping-file").pipe( + attributeMappingFile: Flag.String("attribute-mapping-file").pipe( Flag.withDescription( "File containing a JSON mapping between SAML attributes to custom JWT claims.", ), Flag.optional, ), - nameIdFormat: Flag.choice("name-id-format", SSO_NAME_ID_FORMATS).pipe( + nameIdFormat: Flag.Literals("name-id-format", SSO_NAME_ID_FORMATS).pipe( Flag.withDescription( "URI reference representing the classification of string-based identifier information.", ), diff --git a/apps/cli/src/commands/sso/info/info.command.ts b/apps/cli/src/commands/sso/info/info.command.ts index 2e686cc11b..6ffb4440ba 100644 --- a/apps/cli/src/commands/sso/info/info.command.ts +++ b/apps/cli/src/commands/sso/info/info.command.ts @@ -7,7 +7,7 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { ssoInfo } from "./info.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/sso/list/list.command.ts b/apps/cli/src/commands/sso/list/list.command.ts index 0716afe712..c0af61db04 100644 --- a/apps/cli/src/commands/sso/list/list.command.ts +++ b/apps/cli/src/commands/sso/list/list.command.ts @@ -7,7 +7,7 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { ssoList } from "./list.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/sso/remove/remove.command.ts b/apps/cli/src/commands/sso/remove/remove.command.ts index 734fd18146..bc4073648a 100644 --- a/apps/cli/src/commands/sso/remove/remove.command.ts +++ b/apps/cli/src/commands/sso/remove/remove.command.ts @@ -7,11 +7,11 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { ssoRemove } from "./remove.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - providerId: Argument.string("provider-id").pipe( + providerId: Argument.String("provider-id").pipe( Argument.withDescription("The ID of the SSO identity provider to remove."), ), }; diff --git a/apps/cli/src/commands/sso/show/show.command.ts b/apps/cli/src/commands/sso/show/show.command.ts index 5b75a5f8ff..23833e117b 100644 --- a/apps/cli/src/commands/sso/show/show.command.ts +++ b/apps/cli/src/commands/sso/show/show.command.ts @@ -7,15 +7,15 @@ import { withCommandTelemetry } from "../../../telemetry/command-telemetry.ts"; import { ssoShow } from "./show.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), - metadata: Flag.boolean("metadata").pipe( + metadata: Flag.Boolean("metadata").pipe( Flag.withDescription("Show SAML 2.0 XML Metadata only"), Flag.withDefault(false), ), - providerId: Argument.string("provider-id").pipe( + providerId: Argument.String("provider-id").pipe( Argument.withDescription("The ID of the SSO identity provider to show."), ), }; diff --git a/apps/cli/src/commands/sso/sso.e2e.test.ts b/apps/cli/src/commands/sso/sso.e2e.test.ts index 1c551680cc..8e0c8ad5b8 100644 --- a/apps/cli/src/commands/sso/sso.e2e.test.ts +++ b/apps/cli/src/commands/sso/sso.e2e.test.ts @@ -72,7 +72,7 @@ describe("supabase sso", () => { // Usage-silencing is set before required-flag validation, so a missing // `--type` prints a single clean stderr line with no usage block — but - // `Flag.choice` validation runs during parsing, before that point, so an + // `Flag.Literals` validation runs during parsing, before that point, so an // invalid `--type` value still shows a usage block. test( "add without --type: stdout stays clean, stderr is a single Go-parity line (no usage block)", diff --git a/apps/cli/src/commands/sso/update/update.command.ts b/apps/cli/src/commands/sso/update/update.command.ts index eab6c0a3cc..5c8379f5ca 100644 --- a/apps/cli/src/commands/sso/update/update.command.ts +++ b/apps/cli/src/commands/sso/update/update.command.ts @@ -26,44 +26,44 @@ export const ssoUpdateRemoveDomainsFlag = stringSliceFlag( ); const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), domains: ssoUpdateDomainsFlag, addDomains: ssoUpdateAddDomainsFlag, removeDomains: ssoUpdateRemoveDomainsFlag, - metadataFile: Flag.string("metadata-file").pipe( + metadataFile: Flag.String("metadata-file").pipe( Flag.withDescription( "File containing a SAML 2.0 Metadata XML document describing the identity provider.", ), Flag.optional, ), - metadataUrl: Flag.string("metadata-url").pipe( + metadataUrl: Flag.String("metadata-url").pipe( Flag.withDescription( "URL pointing to a SAML 2.0 Metadata XML document describing the identity provider.", ), Flag.optional, ), - skipUrlValidation: Flag.boolean("skip-url-validation").pipe( + skipUrlValidation: Flag.Boolean("skip-url-validation").pipe( Flag.withDescription( "Skip local validation of the SAML 2.0 Metadata URL (HTTPS requirement, live GET probe, and UTF-8 body decode). Use in air-gapped CI where the IDP is not reachable from the build agent.", ), Flag.withDefault(false), ), - attributeMappingFile: Flag.string("attribute-mapping-file").pipe( + attributeMappingFile: Flag.String("attribute-mapping-file").pipe( Flag.withDescription( "File containing a JSON mapping between SAML attributes to custom JWT claims.", ), Flag.optional, ), - nameIdFormat: Flag.choice("name-id-format", SSO_NAME_ID_FORMATS).pipe( + nameIdFormat: Flag.Literals("name-id-format", SSO_NAME_ID_FORMATS).pipe( Flag.withDescription( "URI reference representing the classification of string-based identifier information.", ), Flag.optional, ), - providerId: Argument.string("provider-id").pipe( + providerId: Argument.String("provider-id").pipe( Argument.withDescription("The ID of the SSO identity provider to update."), ), }; diff --git a/apps/cli/src/commands/start/start.command.ts b/apps/cli/src/commands/start/start.command.ts index a82506b225..5c4f42ed76 100644 --- a/apps/cli/src/commands/start/start.command.ts +++ b/apps/cli/src/commands/start/start.command.ts @@ -27,11 +27,11 @@ export const startExcludeFlag = stringSliceFlag( const config = { exclude: startExcludeFlag, - ignoreHealthCheck: Flag.boolean("ignore-health-check").pipe( + ignoreHealthCheck: Flag.Boolean("ignore-health-check").pipe( Flag.withDescription("Ignore unhealthy services and exit 0"), Flag.withDefault(false), ), - preview: Flag.boolean("preview").pipe( + preview: Flag.Boolean("preview").pipe( Flag.withDescription("Connect to feature preview branch"), Flag.withDefault(false), Flag.withHidden, diff --git a/apps/cli/src/commands/status/status.command.ts b/apps/cli/src/commands/status/status.command.ts index 0652cc861d..402ea1ced3 100644 --- a/apps/cli/src/commands/status/status.command.ts +++ b/apps/cli/src/commands/status/status.command.ts @@ -31,7 +31,7 @@ export const statusExcludeFlag = stringSliceFlag( const config = { overrideName: statusOverrideNameFlag, exclude: statusExcludeFlag, - ignoreHealthCheck: Flag.boolean("ignore-health-check").pipe( + ignoreHealthCheck: Flag.Boolean("ignore-health-check").pipe( Flag.withDescription("Ignore unhealthy services and exit 0"), Flag.withHidden, Flag.withDefault(false), diff --git a/apps/cli/src/commands/stop/stop.command.ts b/apps/cli/src/commands/stop/stop.command.ts index 311062eeb3..5abec856e0 100644 --- a/apps/cli/src/commands/stop/stop.command.ts +++ b/apps/cli/src/commands/stop/stop.command.ts @@ -11,24 +11,24 @@ import { withCommandTelemetry } from "../../telemetry/command-telemetry.ts"; import { stop } from "./stop.handler.ts"; const config = { - projectId: Flag.string("project-id").pipe( + projectId: Flag.String("project-id").pipe( Flag.withDescription("Local project ID to stop."), Flag.optional, ), // Hidden for backward compatibility: `--backup=false` is equivalent to `--no-backup`. - backup: Flag.boolean("backup").pipe( + backup: Flag.Boolean("backup").pipe( Flag.withDescription("Backs up the current database before stopping."), Flag.withDefault(true), Flag.withHidden, ), - noBackup: Flag.boolean("no-backup").pipe( + noBackup: Flag.Boolean("no-backup").pipe( Flag.withDescription("Deletes all data volumes after stopping."), Flag.withDefault(false), ), // `Option` so presence means "explicitly set": `--project-id`/`--all` are mutually // exclusive whenever both were explicitly set, regardless of `--all`'s value. A plain - // `Flag.boolean` couldn't distinguish `--project-id x --all=false` from `--project-id x` alone. - all: Flag.boolean("all").pipe( + // `Flag.Boolean` couldn't distinguish `--project-id x --all=false` from `--project-id x` alone. + all: Flag.Boolean("all").pipe( Flag.withDescription("Stop all local Supabase instances from all projects across the machine."), Flag.optional, ), diff --git a/apps/cli/src/commands/storage/cp/cp.command.ts b/apps/cli/src/commands/storage/cp/cp.command.ts index 80299cb1f0..a86933a636 100644 --- a/apps/cli/src/commands/storage/cp/cp.command.ts +++ b/apps/cli/src/commands/storage/cp/cp.command.ts @@ -22,28 +22,28 @@ import { storageCp } from "./cp.handler.ts"; // Flags are declared before `src`/`dst` on purpose: Effect CLI validates flags before positional // args in declaration order, so a malformed `--jobs` must fail before a missing-operand error. const config = { - recursive: Flag.boolean("recursive").pipe( + recursive: Flag.Boolean("recursive").pipe( Flag.withAlias("r"), Flag.withDescription("Recursively copy a directory."), Flag.withDefault(false), ), - cacheControl: Flag.string("cache-control").pipe( + cacheControl: Flag.String("cache-control").pipe( Flag.withDescription('Custom Cache-Control header for HTTP upload. (default "max-age=3600")'), Flag.optional, ), - contentType: Flag.string("content-type").pipe( + contentType: Flag.String("content-type").pipe( Flag.withDescription('Custom Content-Type header for HTTP upload. (default "auto-detect")'), Flag.optional, ), - jobs: Flag.string("jobs").pipe( + jobs: Flag.String("jobs").pipe( Flag.withAlias("j"), - // Declared as a string, not `Flag.integer`, so the raw token reaches the parser below; + // Declared as a string, not `Flag.Int`, so the raw token reaches the parser below; // `withMetavar` keeps the `--jobs, -j integer` help token. Flag.withMetavar("integer"), Flag.withDescription("Maximum number of parallel jobs. (default 1)"), // `--jobs` is a pflag-style uint: a non-uint token must fail at parse time, before the // experimental gate, the handler, or any telemetry, with pflag's exact message and original - // spelling preserved. `Flag.integer` loses that fidelity (`-0` normalizes to negative zero, + // spelling preserved. `Flag.Int` loses that fidelity (`-0` normalizes to negative zero, // which a `value < 0` check would wrongly accept), so this parses the raw token with // `parseUintBase0` instead; it must sit before `Flag.optional`, which passes `InvalidValue` // through untouched. @@ -62,8 +62,8 @@ const config = { linked: StorageLinkedFlagDef, local: StorageLocalFlagDef, projectRef: StorageProjectRefFlagDef, - src: Argument.string("src").pipe(Argument.withDescription("Source path to copy from.")), - dst: Argument.string("dst").pipe(Argument.withDescription("Destination path to copy to.")), + src: Argument.String("src").pipe(Argument.withDescription("Source path to copy from.")), + dst: Argument.String("dst").pipe(Argument.withDescription("Destination path to copy to.")), } as const; export type StorageCpFlags = CliCommand.Command.Config.Infer; diff --git a/apps/cli/src/commands/storage/ls/ls.command.ts b/apps/cli/src/commands/storage/ls/ls.command.ts index 7ee6306f50..a2b23d152c 100644 --- a/apps/cli/src/commands/storage/ls/ls.command.ts +++ b/apps/cli/src/commands/storage/ls/ls.command.ts @@ -16,11 +16,11 @@ import { import { storageLs } from "./ls.handler.ts"; const config = { - path: Argument.string("path").pipe( + path: Argument.String("path").pipe( Argument.withDescription("Storage path to list (e.g. ss:///bucket/docs)."), Argument.optional, ), - recursive: Flag.boolean("recursive").pipe( + recursive: Flag.Boolean("recursive").pipe( Flag.withAlias("r"), Flag.withDescription("Recursively list a directory."), Flag.withDefault(false), diff --git a/apps/cli/src/commands/storage/mv/mv.command.ts b/apps/cli/src/commands/storage/mv/mv.command.ts index 6c2576fed6..f13c5a7e1d 100644 --- a/apps/cli/src/commands/storage/mv/mv.command.ts +++ b/apps/cli/src/commands/storage/mv/mv.command.ts @@ -16,9 +16,9 @@ import { import { storageMv } from "./mv.handler.ts"; const config = { - src: Argument.string("src").pipe(Argument.withDescription("Source path to move from.")), - dst: Argument.string("dst").pipe(Argument.withDescription("Destination path to move to.")), - recursive: Flag.boolean("recursive").pipe( + src: Argument.String("src").pipe(Argument.withDescription("Source path to move from.")), + dst: Argument.String("dst").pipe(Argument.withDescription("Destination path to move to.")), + recursive: Flag.Boolean("recursive").pipe( Flag.withAlias("r"), Flag.withDescription("Recursively move a directory."), Flag.withDefault(false), diff --git a/apps/cli/src/commands/storage/rm/rm.command.ts b/apps/cli/src/commands/storage/rm/rm.command.ts index d37bfed444..81ce159e73 100644 --- a/apps/cli/src/commands/storage/rm/rm.command.ts +++ b/apps/cli/src/commands/storage/rm/rm.command.ts @@ -16,11 +16,11 @@ import { import { storageRm } from "./rm.handler.ts"; const config = { - files: Argument.string("file").pipe( + files: Argument.String("file").pipe( Argument.withDescription("File paths to remove."), Argument.variadic(), ), - recursive: Flag.boolean("recursive").pipe( + recursive: Flag.Boolean("recursive").pipe( Flag.withAlias("r"), Flag.withDescription("Recursively remove a directory."), Flag.withDefault(false), diff --git a/apps/cli/src/commands/storage/storage.flags.ts b/apps/cli/src/commands/storage/storage.flags.ts index 124ec77b90..85308bb785 100644 --- a/apps/cli/src/commands/storage/storage.flags.ts +++ b/apps/cli/src/commands/storage/storage.flags.ts @@ -11,19 +11,19 @@ import { StorageMutuallyExclusiveFlagsError } from "./storage.errors.ts"; * tree-wide and `seed` already owns `linked`/`local`, so these must follow the * subcommand token (`storage ls --local`, not `storage --local ls`). */ -export const StorageLinkedFlagDef = Flag.boolean("linked").pipe( +export const StorageLinkedFlagDef = Flag.Boolean("linked").pipe( Flag.withDescription("Connects to Storage API of the linked project."), Flag.withDefault(true), ); -export const StorageLocalFlagDef = Flag.boolean("local").pipe( +export const StorageLocalFlagDef = Flag.Boolean("local").pipe( Flag.withDescription("Connects to Storage API of the local database."), Flag.withDefault(false), ); // Overrides the project ref for the linked target; declared once since all four // storage leaves share the identical flag. -export const StorageProjectRefFlagDef = Flag.string("project-ref").pipe( +export const StorageProjectRefFlagDef = Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ); diff --git a/apps/cli/src/commands/test/new/new.command.ts b/apps/cli/src/commands/test/new/new.command.ts index 8dfcfba7af..b7625fbb6c 100644 --- a/apps/cli/src/commands/test/new/new.command.ts +++ b/apps/cli/src/commands/test/new/new.command.ts @@ -13,8 +13,8 @@ import { testNew } from "./new.handler.ts"; const TEMPLATE_VALUES = ["pgtap"] as const; const config = { - name: Argument.string("name").pipe(Argument.withDescription("Name of the test file to create.")), - template: Flag.choice("template", TEMPLATE_VALUES).pipe( + name: Argument.String("name").pipe(Argument.withDescription("Name of the test file to create.")), + template: Flag.Literals("template", TEMPLATE_VALUES).pipe( Flag.withAlias("t"), Flag.withDescription("Template framework to generate."), Flag.optional, diff --git a/apps/cli/src/commands/vanity-subdomains/activate/activate.command.ts b/apps/cli/src/commands/vanity-subdomains/activate/activate.command.ts index 77b2c3cc4a..c7257c8be9 100644 --- a/apps/cli/src/commands/vanity-subdomains/activate/activate.command.ts +++ b/apps/cli/src/commands/vanity-subdomains/activate/activate.command.ts @@ -13,14 +13,14 @@ import { import { vanitySubdomainsActivate } from "./activate.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), // Optional at parse time so the --experimental gate, login check, and project-ref // resolution all run first; required-ness is enforced in the handler after ref // resolution. - desiredSubdomain: Flag.string("desired-subdomain").pipe( + desiredSubdomain: Flag.String("desired-subdomain").pipe( Flag.withDescription("The desired vanity subdomain to use for your Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/vanity-subdomains/check-availability/check-availability.command.ts b/apps/cli/src/commands/vanity-subdomains/check-availability/check-availability.command.ts index d96a370410..25b2c729bb 100644 --- a/apps/cli/src/commands/vanity-subdomains/check-availability/check-availability.command.ts +++ b/apps/cli/src/commands/vanity-subdomains/check-availability/check-availability.command.ts @@ -13,14 +13,14 @@ import { import { vanitySubdomainsCheckAvailability } from "./check-availability.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), // Optional at parse time so the --experimental gate, login check, and project-ref // resolution all run first; required-ness is enforced in the handler after ref // resolution. - desiredSubdomain: Flag.string("desired-subdomain").pipe( + desiredSubdomain: Flag.String("desired-subdomain").pipe( Flag.withDescription("The desired vanity subdomain to use for your Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/vanity-subdomains/delete/delete.command.ts b/apps/cli/src/commands/vanity-subdomains/delete/delete.command.ts index dd84cd7ec5..98f657b628 100644 --- a/apps/cli/src/commands/vanity-subdomains/delete/delete.command.ts +++ b/apps/cli/src/commands/vanity-subdomains/delete/delete.command.ts @@ -13,7 +13,7 @@ import { import { vanitySubdomainsDelete } from "./delete.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/commands/vanity-subdomains/get/get.command.ts b/apps/cli/src/commands/vanity-subdomains/get/get.command.ts index b8043ec7f5..938ac4632b 100644 --- a/apps/cli/src/commands/vanity-subdomains/get/get.command.ts +++ b/apps/cli/src/commands/vanity-subdomains/get/get.command.ts @@ -13,7 +13,7 @@ import { import { vanitySubdomainsGet } from "./get.handler.ts"; const config = { - projectRef: Flag.string("project-ref").pipe( + projectRef: Flag.String("project-ref").pipe( Flag.withDescription("Project ref of the Supabase project."), Flag.optional, ), diff --git a/apps/cli/src/docs/docs-introspection.ts b/apps/cli/src/docs/docs-introspection.ts index 3063ee1339..d2080f0d62 100644 --- a/apps/cli/src/docs/docs-introspection.ts +++ b/apps/cli/src/docs/docs-introspection.ts @@ -66,7 +66,7 @@ export function userGlobalFlagParams(command: Command.Command.Any): ReadonlyArra } /** - * `choiceKeys` (the valid value set for `Flag.choice`/`Flag.choiceWithValue`) is attached to + * `choiceKeys` (the valid value set for `Flag.Literals`/`Flag.ChoiceWithValue`) is attached to * the `Primitive` at runtime but carries an `@internal` tag and is absent from the public * type, so this narrows through the same runtime type-guard idiom as `CommandInternals` above. */ diff --git a/apps/cli/src/docs/docs-spec.unit.test.ts b/apps/cli/src/docs/docs-spec.unit.test.ts index 61d529c746..bc015aa393 100644 --- a/apps/cli/src/docs/docs-spec.unit.test.ts +++ b/apps/cli/src/docs/docs-spec.unit.test.ts @@ -363,7 +363,7 @@ describe("build guards fail loudly", () => { const root = Command.make("supabase").pipe( Command.withSubcommands([ Command.make("db").pipe( - Command.withSubcommands([Command.make("query", { output: Flag.string("output") })]), + Command.withSubcommands([Command.make("query", { output: Flag.String("output") })]), ), ]), Command.withGlobalFlags([ExperimentalFlag]), diff --git a/apps/cli/src/shared/cli/global-flags.ts b/apps/cli/src/shared/cli/global-flags.ts index 782d878e4a..dcf5b3238f 100644 --- a/apps/cli/src/shared/cli/global-flags.ts +++ b/apps/cli/src/shared/cli/global-flags.ts @@ -6,8 +6,8 @@ import { Flag, GlobalFlag } from "effect/unstable/cli"; * A value-taking global flag must also be registered in `PERSISTENT_VALUE_FLAG_NAMES` * (`shared/cli/cobra-flag-groups.ts`), or the pre-parse argv scanners won't consume its value. */ -export const OutputFormatFlag = GlobalFlag.setting("output-format")({ - flag: Flag.choice("output-format", ["text", "json", "stream-json"]).pipe( +export const OutputFormatFlag = GlobalFlag.Setting("output-format")({ + flag: Flag.Literals("output-format", ["text", "json", "stream-json"]).pipe( Flag.withDescription("Output format: text (default), json, or stream-json (NDJSON)"), Flag.optional, ), diff --git a/apps/cli/src/shared/cli/run.integration.test.ts b/apps/cli/src/shared/cli/run.integration.test.ts index 04cd71dd8d..ebdd82f147 100644 --- a/apps/cli/src/shared/cli/run.integration.test.ts +++ b/apps/cli/src/shared/cli/run.integration.test.ts @@ -101,7 +101,7 @@ describe("group command exit codes (CLI-1906)", () => { * real one — the exact service `withoutParseErrorHelpDump` overrides and replays through. * * `branchesCommand` covers the `UnrecognizedOption` shape end to end. `MissingOption`/ - * `InvalidValue` need a genuinely required flag or `Flag.choice`, which every shipped command + * `InvalidValue` need a genuinely required flag or `Flag.Literals`, which every shipped command * with one also wraps in its own management-API runtime layer — a minimal synthetic * `Command.make` runs through the same `Command.runWith`/`showHelp()` machinery without that * overhead. A real subprocess run against `sso add` is covered end to end by `sso.e2e.test.ts`. @@ -125,7 +125,7 @@ describe("withoutParseErrorHelpDump (CLI-1901)", () => { // `type`'s `-t` alias mirrors the real `sso add --type`/`-t` flag, so the short-alias case // below exercises the same shape without pulling in a management-API runtime layer. const requiredFlagCommand = Command.make("test-required-flag", { - type: Flag.choice("type", ["saml"] as const).pipe(Flag.withAlias("t")), + type: Flag.Literals("type", ["saml"] as const).pipe(Flag.withAlias("t")), }); const runRequiredFlagCommand = (args: ReadonlyArray, console: Console.Console) => @@ -189,7 +189,7 @@ describe("withoutParseErrorHelpDump (CLI-1901)", () => { expect(exitCodeForFailure(exit.cause)).toBe(1); }); - test("an invalid Flag.choice value: replays the help dump to stderr (never stdout) and drops the duplicate error, but still fails with the original cause", async () => { + test("an invalid Flag.Literals value: replays the help dump to stderr (never stdout) and drops the duplicate error, but still fails with the original cause", async () => { const { console, calls } = fakeConsole(); const exit = await Effect.runPromiseExit(runRequiredFlagCommand(["--type", "bogus"], console)); @@ -232,7 +232,7 @@ describe("nested command parsing", () => { test("forwards operands after -- to a nested variadic argument", async () => { let receivedPaths: ReadonlyArray = []; const db = Command.make("db", { - paths: Argument.string("path").pipe(Argument.variadic()), + paths: Argument.String("path").pipe(Argument.variadic()), }).pipe( Command.withHandler(({ paths }) => Effect.sync(() => { diff --git a/apps/cli/src/shared/cli/run.unit.test.ts b/apps/cli/src/shared/cli/run.unit.test.ts index 810fbc426c..b3149f5798 100644 --- a/apps/cli/src/shared/cli/run.unit.test.ts +++ b/apps/cli/src/shared/cli/run.unit.test.ts @@ -308,7 +308,7 @@ describe("classifyParseErrorConsoleOutput", () => { ).toBe("drop"); }); - it("flushes the help dump to stderr for an invalid Flag.choice value", () => { + it("flushes the help dump to stderr for an invalid Flag.Literals value", () => { const cause = Cause.fail( new CliError.ShowHelp({ commandPath: ["supabase", "sso", "add"], diff --git a/apps/cli/src/shared/cli/subcommand-flag-suggestions.unit.test.ts b/apps/cli/src/shared/cli/subcommand-flag-suggestions.unit.test.ts index 761f2c1177..223927ffd9 100644 --- a/apps/cli/src/shared/cli/subcommand-flag-suggestions.unit.test.ts +++ b/apps/cli/src/shared/cli/subcommand-flag-suggestions.unit.test.ts @@ -159,7 +159,7 @@ describe("subcommand flag placement suggestions", () => { }); it("also collapses the doubled prefix for a non-choice primitive whose failure text starts with 'Expected' (e.g. an invalid integer flag value)", () => { - // Real failure text from effect's schema-backed `Primitive.integer` (also affects `float`, + // Real failure text from effect's schema-backed `Primitive.Int` (also affects `float`, // `boolean`, and `date`). const errors = formatCliErrorsForDisplay([ new CliError.InvalidValue({ @@ -178,7 +178,7 @@ describe("subcommand flag placement suggestions", () => { }); it("leaves invalid-value errors whose expected text does not start with 'Expected' unchanged", () => { - // Real failure text from effect's `Primitive.keyValuePair`, which never starts with + // Real failure text from effect's `Primitive.KeyValuePair`, which never starts with // "Expected", so it needs no rewriting. const errors = formatCliErrorsForDisplay([ new CliError.InvalidValue({ diff --git a/apps/cli/src/shared/compute/compute-runtimes.ts b/apps/cli/src/shared/compute/compute-runtimes.ts index 5dd51a78ff..be228c3340 100644 --- a/apps/cli/src/shared/compute/compute-runtimes.ts +++ b/apps/cli/src/shared/compute/compute-runtimes.ts @@ -27,7 +27,7 @@ function isComputeRuntime(value: string): value is ComputeRuntime { /** * Parses a config-file `[compute.] runtime` value case-insensitively (hand-written casing * like `Runtime = "Node"` should still mean `node`). Not used for `--runtime`, which validates - * through a `Flag.choice` over the same catalog instead. + * through a `Flag.Literals` over the same catalog instead. */ export function parseComputeRuntime(value: string): ComputeRuntime | undefined { const canonical = value.trim().toLowerCase(); diff --git a/apps/cli/src/shared/output/normalize-error.unit.test.ts b/apps/cli/src/shared/output/normalize-error.unit.test.ts index 840dd4076f..95560313c5 100644 --- a/apps/cli/src/shared/output/normalize-error.unit.test.ts +++ b/apps/cli/src/shared/output/normalize-error.unit.test.ts @@ -78,7 +78,7 @@ describe("normalizeCliError", () => { }); }); - test("InvalidValue collapses the doubled 'Expected: Expected' prefix (e.g. a bad GlobalFlag.setting value)", () => { + test("InvalidValue collapses the doubled 'Expected: Expected' prefix (e.g. a bad GlobalFlag.Setting value)", () => { const error = new CliError.InvalidValue({ option: "output-format", value: "bogus", diff --git a/apps/cli/src/shared/runtime/browser.layer.ts b/apps/cli/src/shared/runtime/browser.layer.ts index f813633d2c..59bb585cec 100644 --- a/apps/cli/src/shared/runtime/browser.layer.ts +++ b/apps/cli/src/shared/runtime/browser.layer.ts @@ -19,7 +19,7 @@ const makeBrowser = Effect.gen(function* () { command = "open"; args = [url]; } else if (runtimeInfo.platform === "win32") { - const systemRoot = yield* Config.string("SYSTEMROOT").pipe( + const systemRoot = yield* Config.String("SYSTEMROOT").pipe( Config.withDefault("C:\\Windows"), ); command = `${systemRoot}\\System32\\rundll32.exe`; diff --git a/apps/cli/src/telemetry/command-telemetry.ts b/apps/cli/src/telemetry/command-telemetry.ts index 7ea7f45223..1e0dfc3d7e 100644 --- a/apps/cli/src/telemetry/command-telemetry.ts +++ b/apps/cli/src/telemetry/command-telemetry.ts @@ -63,7 +63,7 @@ interface CommandTelemetryOptions = never> // passed through regardless of this list. readonly safeFlags?: ReadonlyArray; // A command's flag config record (the object passed to `Command.make`). Any - // `Flag.choice`/`Flag.choiceWithValue` flag in it is treated as telemetry-safe automatically, so + // `Flag.Literals`/`Flag.ChoiceWithValue` flag in it is treated as telemetry-safe automatically, so // enum flags don't need hand-listing in `safeFlags`. The three global choice flags (`--output`, // `--dns-resolver`, `--agent`) are covered separately via `GLOBAL_CHOICE_FLAG_NAMES` below. readonly config?: Record; @@ -209,9 +209,9 @@ function normalizeFlagValue(value: unknown): unknown { return normalizeFlagValue(value.value); } -// Every `Flag.choice`/`Flag.choiceWithValue` flag is treated as telemetry-safe automatically — +// Every `Flag.Literals`/`Flag.ChoiceWithValue` flag is treated as telemetry-safe automatically — // checks the unwrapped `Single`'s primitive `_tag`. Restricted to `kind === Param.flagKind` so a -// same-named `Argument.choice` positional can never be mistaken for a `--flag`. +// same-named `Argument.Literals` positional can never be mistaken for a `--flag`. function getChoiceFlagNames(config: Record | undefined): ReadonlySet { const names = new Set(); if (config === undefined) return names; @@ -246,8 +246,8 @@ const GLOBAL_SHORT_ALIASES: Readonly> = (() => { })(); /** - * CLI-name set for every global/persistent flag that is itself a `Flag.choice`/ - * `Flag.choiceWithValue` (today `output`, `dns-resolver`, `agent`), derived from `GLOBAL_FLAGS` + * CLI-name set for every global/persistent flag that is itself a `Flag.Literals`/ + * `Flag.ChoiceWithValue` (today `output`, `dns-resolver`, `agent`), derived from `GLOBAL_FLAGS` * the same way `GLOBAL_SHORT_ALIASES` is. Applied only to the global-fallback path in * `buildFlagsMap` (`!isFromHandler`): a command that registers its own differently-typed local * flag under the same CLI name (e.g. `db diff`'s local string `--output`) must pass that flag in diff --git a/apps/cli/src/telemetry/command-telemetry.unit.test.ts b/apps/cli/src/telemetry/command-telemetry.unit.test.ts index 98400e92c2..7b954b03f0 100644 --- a/apps/cli/src/telemetry/command-telemetry.unit.test.ts +++ b/apps/cli/src/telemetry/command-telemetry.unit.test.ts @@ -456,10 +456,10 @@ describe("withCommandTelemetry", () => { ); }); - it.live("passes Flag.choice values through verbatim (Go parity: isEnumFlag)", () => { + it.live("passes Flag.Literals values through verbatim (Go parity: isEnumFlag)", () => { const analytics = mockContextualAnalytics(); const config = { - lang: Flag.choice("lang", ["typescript", "go", "python"] as const), + lang: Flag.Literals("lang", ["typescript", "go", "python"] as const), }; return Effect.void.pipe( @@ -484,12 +484,12 @@ describe("withCommandTelemetry", () => { }); it.live( - "passes a Flag.withDefault-wrapped Flag.choice value through verbatim (Map(Optional(Single)))", + "passes a Flag.withDefault-wrapped Flag.Literals value through verbatim (Map(Optional(Single)))", () => { const analytics = mockContextualAnalytics(); // `.pipe(Flag.withDefault(...))` composes as `Map(Optional(Single))`. const config = { - algorithm: Flag.choice("algorithm", ["RS256", "ES256"] as const).pipe( + algorithm: Flag.Literals("algorithm", ["RS256", "ES256"] as const).pipe( Flag.withDefault("ES256" as const), ), }; @@ -517,11 +517,11 @@ describe("withCommandTelemetry", () => { ); it.live( - "resolves a Flag.choice's shorthand alias to its canonical name (Go parity: pflag.Visit)", + "resolves a Flag.Literals's shorthand alias to its canonical name (Go parity: pflag.Visit)", () => { const analytics = mockContextualAnalytics(); const config = { - type: Flag.choice("type", ["saml"] as const).pipe(Flag.withAlias("t")), + type: Flag.Literals("type", ["saml"] as const).pipe(Flag.withAlias("t")), }; return Effect.void.pipe( @@ -545,10 +545,10 @@ describe("withCommandTelemetry", () => { }, ); - it.live("passes an Optional-wrapped Flag.choice value through verbatim", () => { + it.live("passes an Optional-wrapped Flag.Literals value through verbatim", () => { const analytics = mockContextualAnalytics(); const config = { - algorithm: Flag.choice("algorithm", ["RS256", "ES256"] as const).pipe(Flag.optional), + algorithm: Flag.Literals("algorithm", ["RS256", "ES256"] as const).pipe(Flag.optional), }; return Effect.void.pipe( @@ -575,8 +575,8 @@ describe("withCommandTelemetry", () => { it.live("still redacts non-choice string flags even when config is provided", () => { const analytics = mockContextualAnalytics(); const config = { - lang: Flag.choice("lang", ["typescript", "go"] as const), - schema: Flag.string("schema"), + lang: Flag.Literals("lang", ["typescript", "go"] as const), + schema: Flag.String("schema"), }; return Effect.void.pipe( @@ -1346,8 +1346,8 @@ describe("withCommandTelemetry", () => { it.live( "still redacts a global choice flag shadowed by a command's own differently-typed local flag (db diff's local string --output, Go parity)", () => { - // `db diff` declares its own local `output: Flag.string("output")` (a file path) rather - // than a `Flag.choice`. Simulated here: `output` is in the handler's own `flags` record + // `db diff` declares its own local `output: Flag.String("output")` (a file path) rather + // than a `Flag.Literals`. Simulated here: `output` is in the handler's own `flags` record // (so `isFromHandler` is true) but absent from `config`, so it must not inherit safety from // `GLOBAL_CHOICE_FLAG_NAMES` just because the CLI name collides with the global flag. const analytics = mockContextualAnalytics(); diff --git a/packages/api/src/config/api-config.layer.ts b/packages/api/src/config/api-config.layer.ts index 267406abf5..efba74fc8f 100644 --- a/packages/api/src/config/api-config.layer.ts +++ b/packages/api/src/config/api-config.layer.ts @@ -6,10 +6,10 @@ export const DEFAULT_SUPABASE_API_URL = "https://api.supabase.com"; const makeApiConfig = Effect.gen(function* () { return ApiConfig.of({ - baseUrl: yield* Config.string("SUPABASE_API_URL").pipe( + baseUrl: yield* Config.String("SUPABASE_API_URL").pipe( Config.withDefault(DEFAULT_SUPABASE_API_URL), ), - accessToken: yield* Config.option(Config.redacted("SUPABASE_ACCESS_TOKEN")), + accessToken: yield* Config.option(Config.Redacted("SUPABASE_ACCESS_TOKEN")), }); }); From fbd210cac13e17b57c6b18d9c0781d2b1710f6e4 Mon Sep 17 00:00:00 2001 From: Kanad Gupta Date: Thu, 10 Sep 2026 20:20:43 -0700 Subject: [PATCH 06/13] chore(cli): adapt to rc.113 Schema, Match and FileSystem changes - Schema decoding no longer offers onExcessProperty: "preserve"; the deploy-body assertion keeps its strictness with "error". - Match.valueTags no longer infers handler parameters from a data-first input, so the archive-problem handlers name their variant. - FileSystem.Size is replaced by ByteSize. Co-Authored-By: Claude Fable 5.1 --- apps/cli/src/command-internal/db-bootstrap/shadow-cache.ts | 5 +++-- apps/cli/src/command-internal/glob.unit.test.ts | 4 ++-- .../experimental/compute/push/push.integration.test.ts | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/cli/src/command-internal/db-bootstrap/shadow-cache.ts b/apps/cli/src/command-internal/db-bootstrap/shadow-cache.ts index 8ae52abc9c..ac5fb88b16 100644 --- a/apps/cli/src/command-internal/db-bootstrap/shadow-cache.ts +++ b/apps/cli/src/command-internal/db-bootstrap/shadow-cache.ts @@ -758,8 +758,9 @@ const SHADOW_CACHE_KEY_PATTERN = /^[0-9a-f]{16}$/u; */ const describeShadowArchiveProblem = (problem: PgDataArchiveProblem): string => Match.valueTags(problem, { - "missing-entries": (missing) => `snapshot has no ${missing.entries.join(" or ")} entry`, - "wrong-key": (wrongKey) => { + "missing-entries": (missing: Extract) => + `snapshot has no ${missing.entries.join(" or ")} entry`, + "wrong-key": (wrongKey: Extract) => { const found = wrongKey.found !== undefined && SHADOW_CACHE_KEY_PATTERN.test(wrongKey.found) ? `key ${wrongKey.found}` diff --git a/apps/cli/src/command-internal/glob.unit.test.ts b/apps/cli/src/command-internal/glob.unit.test.ts index 5fa2f0164d..285664d529 100644 --- a/apps/cli/src/command-internal/glob.unit.test.ts +++ b/apps/cli/src/command-internal/glob.unit.test.ts @@ -1,6 +1,6 @@ import { BunFileSystem, BunPath } from "@effect/platform-bun"; import { describe, expect, it } from "@effect/vitest"; -import { Effect, Exit, FileSystem, Layer, Option, Path, PlatformError } from "effect"; +import { ByteSize, Effect, Exit, FileSystem, Layer, Option, Path, PlatformError } from "effect"; import { compareUtf8Bytes, globPattern, resolveUnderWorkdir, walkSqlFiles } from "./glob.ts"; @@ -88,7 +88,7 @@ function fakeFileInfo(type: FileSystem.File.Type): FileSystem.File.Info { uid: Option.none(), gid: Option.none(), rdev: Option.none(), - size: 0n as FileSystem.Size, + size: ByteSize.bytes(0), blksize: Option.none(), blocks: Option.none(), }; diff --git a/apps/cli/src/commands/experimental/compute/push/push.integration.test.ts b/apps/cli/src/commands/experimental/compute/push/push.integration.test.ts index 2802875b83..d19b8bc5c4 100644 --- a/apps/cli/src/commands/experimental/compute/push/push.integration.test.ts +++ b/apps/cli/src/commands/experimental/compute/push/push.integration.test.ts @@ -57,7 +57,7 @@ const deployRequest = Schema.Struct({ }), }); const decodeDeploy = (body: string) => - Schema.decodeEffect(Schema.fromJsonString(deployRequest))(body, { onExcessProperty: "preserve" }); + Schema.decodeEffect(Schema.fromJsonString(deployRequest))(body, { onExcessProperty: "error" }); function flags(overrides: Partial = {}): ComputePushFlags { return { From 183bc7a3f8c7c8fdc927f592e4b5f5ee5693d615 Mon Sep 17 00:00:00 2001 From: Kanad Gupta Date: Thu, 10 Sep 2026 20:20:43 -0700 Subject: [PATCH 07/13] chore(stack): adopt rc.113 Socket reader/writer API Socket.runRaw and the callable writer are gone; a Socket now exposes a scoped reader whose pull yields chunk batches and fails with a SocketCloseError on close, plus a scoped writer object. The control server's demultiplexing socket and the client-side framed socket expose the same contract, and the maintenance and awaitClose clients drive the underlying reader directly. Connection open is now signalled by reader acquisition rather than an onOpen hook. Co-Authored-By: Claude Fable 5.1 --- packages/stack/src/control/ControlServer.ts | 690 +++++++++--------- .../control-transport.integration.test.ts | 34 +- .../native-runtime.integration.test.ts | 246 ++----- 3 files changed, 427 insertions(+), 543 deletions(-) diff --git a/packages/stack/src/control/ControlServer.ts b/packages/stack/src/control/ControlServer.ts index 3c893f70d4..96635f495a 100644 --- a/packages/stack/src/control/ControlServer.ts +++ b/packages/stack/src/control/ControlServer.ts @@ -1,4 +1,5 @@ import { + Array as Arr, Cause, Deferred, Effect, @@ -147,288 +148,278 @@ const demuxSocket = ( completionFibers: FiberSet.FiberSet, ): Socket.Socket => { const expectedRelease = options.rpcRelease ?? STACK_RPC_RELEASE; - type Writer = ( - chunk: Uint8Array | string | Socket.CloseEvent, - ) => Effect.Effect; - let connectionWriter: Writer | undefined; - const runRaw = ( - handler: (_: Uint8Array) => Effect.Effect | void, - runOptions?: { readonly onOpen?: Effect.Effect }, - ): Effect.Effect => - Effect.scoped( - Effect.gen(function* () { - const writerReady = yield* Deferred.make(); - const underlyingWrite = yield* socket.writer; - const decoder = new FrameDecoder(); - const prefaceReady = yield* Deferred.make(); - let preface = new Uint8Array(0); - let phase: "preface" | "maintenance" | "rpc" = "preface"; - let closed = false; + const reader: Effect.Effect = Effect.gen( + function* () { + const underlying = yield* socket.reader; + const writer = yield* socket.writer; + const decoder = new FrameDecoder(); + const prefaceReady = yield* Deferred.make(); + let preface = new Uint8Array(0); + let phase: "preface" | "maintenance" | "rpc" = "preface"; + let closed = false; - const markPrefaceReady = Deferred.succeed(prefaceReady, undefined).pipe(Effect.asVoid); - const close = Effect.suspend(() => { - if (closed) return Effect.void; - closed = true; - return markPrefaceReady.pipe( - Effect.andThen( - Deferred.await(writerReady).pipe( - Effect.flatMap((write) => write(new Socket.CloseEvent(1000))), + const markPrefaceReady = Deferred.succeed(prefaceReady, undefined).pipe(Effect.asVoid); + const close = Effect.suspend(() => { + if (closed) return Effect.void; + closed = true; + return markPrefaceReady.pipe(Effect.andThen(writer.write(new Socket.CloseEvent(1000)))); + }); + + const socketWriteError = (message: string) => + new Socket.SocketError({ + reason: new Socket.SocketWriteError({ cause: new Error(message) }), + }); + const sendJson = (value: JsonValue): Effect.Effect => + encodeFrame(value).pipe( + Effect.mapError((error) => socketWriteError(error.message)), + Effect.flatMap((frame) => writer.write(frame)), + ); + + type MaintenanceValidation = + | { readonly _tag: "invalid-request" } + | { readonly _tag: "stale-session"; readonly request: MaintenanceRequest } + | { readonly _tag: "valid"; readonly request: MaintenanceRequest }; + + const dispatchMaintenance = ( + validation: MaintenanceValidation, + ): Effect.Effect => { + let responseValue: MaintenanceResponse | undefined; + let operationName: MaintenanceRequest["op"] | undefined; + let completionStarted = false; + const startCompletion = (completion: Effect.Effect) => + Effect.uninterruptible( + FiberSet.run(completionFibers, completion, { startImmediately: true }).pipe( + // Set only after the completion fiber is handed to the owner-scoped + // FiberSet; the uninterruptible region keeps fork and witness atomic + // with `onExit` below. + Effect.tap(() => + Effect.sync(() => { + completionStarted = true; + }), ), ), ); + const dispatch = Effect.gen(function* () { + if (validation._tag === "invalid-request") { + yield* sendJson(protocolFailure("invalid-request")); + yield* close; + return; + } + if (validation._tag === "stale-session") { + yield* sendJson(protocolFailure("stale-session")); + yield* close; + return; + } + const request = validation.request; + operationName = request.op; + const operation = + request.op === "probe" + ? options.maintenanceHandlers.probe + : options.maintenanceHandlers.stop; + const result = yield* Effect.exit(operation); + const response = Exit.isSuccess(result) + ? result.value + : protocolFailure("operation-failed"); + responseValue = response; + yield* sendJson(response); + yield* close; + if (request.op === "stop" && options.onShutdownReady !== undefined) { + // The connection scope closes as soon as the close frame is sent; + // completion belongs to the owner session and must outlive it. + yield* startCompletion(options.onShutdownReady); + } }); + return dispatch.pipe( + Effect.onExit((exit) => { + const response = responseValue; + if (response === undefined || operationName !== "stop") return Effect.void; + if (Exit.isSuccess(exit)) return Effect.void; + const connectionFailure = + Cause.hasInterruptsOnly(exit.cause) || isResponseConnectionFailure(exit.cause); + if (!connectionFailure || completionStarted || options.onShutdownReady === undefined) + return Effect.void; + return startCompletion(options.onShutdownReady).pipe(Effect.asVoid); + }), + Effect.catchReasons("SocketError", { + SocketWriteError: () => Effect.void, + SocketCloseError: () => Effect.void, + }), + ); + }; - const socketWriteError = (message: string) => - new Socket.SocketError({ - reason: new Socket.SocketWriteError({ cause: new Error(message) }), - }); - const sendJson = (value: JsonValue): Effect.Effect => - Deferred.await(writerReady).pipe( - Effect.flatMap((write) => - encodeFrame(value).pipe( - Effect.mapError((error) => socketWriteError(error.message)), - Effect.flatMap(write), - ), + const processFrames = ( + input: Uint8Array, + rpcFrames: Array, + ): Effect.Effect => + Effect.gen(function* () { + const result = yield* Effect.exit( + decoder.push( + input, + phase === "rpc" ? RPC_MAX_FRAME_BYTES : MAINTENANCE_MAX_FRAME_BYTES, ), ); - - type MaintenanceValidation = - | { readonly _tag: "invalid-request" } - | { readonly _tag: "stale-session"; readonly request: MaintenanceRequest } - | { readonly _tag: "valid"; readonly request: MaintenanceRequest }; - - const dispatchMaintenance = ( - validation: MaintenanceValidation, - ): Effect.Effect => { - let responseValue: MaintenanceResponse | undefined; - let operationName: MaintenanceRequest["op"] | undefined; - let completionStarted = false; - const startCompletion = (completion: Effect.Effect) => - Effect.uninterruptible( - FiberSet.run(completionFibers, completion, { startImmediately: true }).pipe( - // Set only after the completion fiber is handed to the owner-scoped - // FiberSet; the uninterruptible region keeps fork and witness atomic - // with `onExit` below. - Effect.tap(() => - Effect.sync(() => { - completionStarted = true; - }), + if (Exit.isFailure(result)) { + yield* close; + return; + } + for (const frame of result.value) { + if (closed) break; + if (phase === "maintenance") { + // Probe/validation are bounded by the maintenance admission deadline; a + // validated stop owns its own cleanup and may outlive it. The preface deadline + // governs only admission until the first frame arrives — dispatch below owns + // policy after that. + yield* markPrefaceReady; + const operation = yield* Effect.exit( + decodeFrame(frame).pipe( + Effect.flatMap((decoded) => + Schema.decodeUnknownEffect(MaintenanceRequestSchema)(decoded, { + onExcessProperty: "error", + }), + ), ), - ), - ); - const dispatch = Effect.gen(function* () { - if (validation._tag === "invalid-request") { + ); + const validation: MaintenanceValidation = Exit.isFailure(operation) + ? { _tag: "invalid-request" } + : operation.value.stackId !== options.stackId + ? { _tag: "invalid-request" } + : operation.value.ownerSessionId !== options.ownerSessionId + ? { _tag: "stale-session", request: operation.value } + : { _tag: "valid", request: operation.value }; + const dispatch = maintenanceSemaphore.withPermit(dispatchMaintenance(validation)); + if (validation._tag === "valid" && validation.request.op !== "probe") { + yield* dispatch; + } else { + yield* dispatch.pipe( + Effect.timeoutOrElse({ + duration: MAINTENANCE_REQUEST_DEADLINE_MS, + orElse: () => sendJson(protocolFailure("timeout")).pipe(Effect.andThen(close)), + }), + ); + } + } else { + rpcFrames.push(frame.slice(4)); + } + } + }); + + const processChunk = ( + chunk: Uint8Array | string, + rpcFrames: Array, + ): Effect.Effect => + Effect.gen(function* () { + if (closed) return; + const input = toBytes(chunk); + if (phase === "preface") { + const combined = new Uint8Array(preface.byteLength + input.byteLength); + combined.set(preface); + combined.set(input, preface.byteLength); + const newline = combined.indexOf(10); + if ( + (newline < 0 && combined.byteLength > CONTROL_PREFACE_MAX_BYTES) || + (newline >= 0 && newline + 1 > CONTROL_PREFACE_MAX_BYTES) + ) { yield* sendJson(protocolFailure("invalid-request")); yield* close; return; } - if (validation._tag === "stale-session") { - yield* sendJson(protocolFailure("stale-session")); - yield* close; + preface = combined; + const decoded = yield* Effect.exit(decodePreface(combined)); + if (Exit.isFailure(decoded)) { + if (preface.includes(10)) { + yield* sendJson(protocolFailure()); + yield* close; + } return; } - const request = validation.request; - operationName = request.op; - const operation = - request.op === "probe" - ? options.maintenanceHandlers.probe - : options.maintenanceHandlers.stop; - const result = yield* Effect.exit(operation); - const response = Exit.isSuccess(result) - ? result.value - : protocolFailure("operation-failed"); - responseValue = response; - yield* sendJson(response); - yield* close; - if (request.op === "stop" && options.onShutdownReady !== undefined) { - // The connection scope closes as soon as the close frame is sent; - // completion belongs to the owner session and must outlive it. - yield* startCompletion(options.onShutdownReady); - } - }); - return dispatch.pipe( - Effect.onExit((exit) => { - const response = responseValue; - if (response === undefined || operationName !== "stop") return Effect.void; - if (Exit.isSuccess(exit)) return Effect.void; - const connectionFailure = - Cause.hasInterruptsOnly(exit.cause) || isResponseConnectionFailure(exit.cause); - if (!connectionFailure || completionStarted || options.onShutdownReady === undefined) - return Effect.void; - return startCompletion(options.onShutdownReady).pipe(Effect.asVoid); - }), - Effect.catchReasons("SocketError", { - SocketWriteError: () => Effect.void, - SocketCloseError: () => Effect.void, - }), - ); - }; - - const processFrames = (input: Uint8Array): Effect.Effect => - Effect.gen(function* () { - const result = yield* Effect.exit( - decoder.push( - input, - phase === "rpc" ? RPC_MAX_FRAME_BYTES : MAINTENANCE_MAX_FRAME_BYTES, - ), - ); - if (Exit.isFailure(result)) { + phase = decoded.value.protocol.kind; + preface = new Uint8Array(0); + if (decoded.value.protocol.stackId !== options.stackId) { + yield* sendJson(protocolFailure("invalid-request")); yield* close; return; } - for (const frame of result.value) { - if (closed) break; - if (phase === "maintenance") { - // Probe/validation are bounded by the maintenance admission deadline; a - // validated stop owns its own cleanup and may outlive it. The preface deadline - // governs only admission until the first frame arrives — dispatch below owns - // policy after that. - yield* markPrefaceReady; - const operation = yield* Effect.exit( - decodeFrame(frame).pipe( - Effect.flatMap((decoded) => - Schema.decodeUnknownEffect(MaintenanceRequestSchema)(decoded, { - onExcessProperty: "error", - }), - ), - ), - ); - const validation: MaintenanceValidation = Exit.isFailure(operation) - ? { _tag: "invalid-request" } - : operation.value.stackId !== options.stackId - ? { _tag: "invalid-request" } - : operation.value.ownerSessionId !== options.ownerSessionId - ? { _tag: "stale-session", request: operation.value } - : { _tag: "valid", request: operation.value }; - const dispatch = maintenanceSemaphore.withPermit(dispatchMaintenance(validation)); - if (validation._tag === "valid" && validation.request.op !== "probe") { - yield* dispatch; - } else { - yield* dispatch.pipe( - Effect.timeoutOrElse({ - duration: MAINTENANCE_REQUEST_DEADLINE_MS, - orElse: () => - sendJson(protocolFailure("timeout")).pipe(Effect.andThen(close)), - }), - ); - } - } else { - const returned = handler(frame.slice(4)); - if (Effect.isEffect(returned)) yield* returned; - } + if (decoded.value.protocol.ownerSessionId !== options.ownerSessionId) { + yield* sendJson(protocolFailure("stale-session")); + yield* close; + return; } - }); - - const processChunk = ( - chunk: Uint8Array | string, - ): Effect.Effect => - Effect.gen(function* () { - if (closed) return; - const input = toBytes(chunk); - if (phase === "preface") { - const combined = new Uint8Array(preface.byteLength + input.byteLength); - combined.set(preface); - combined.set(input, preface.byteLength); - const newline = combined.indexOf(10); - if ( - (newline < 0 && combined.byteLength > CONTROL_PREFACE_MAX_BYTES) || - (newline >= 0 && newline + 1 > CONTROL_PREFACE_MAX_BYTES) - ) { - yield* sendJson(protocolFailure("invalid-request")); - yield* close; - return; - } - preface = combined; - const decoded = yield* Effect.exit(decodePreface(combined)); - if (Exit.isFailure(decoded)) { - if (preface.includes(10)) { - yield* sendJson(protocolFailure()); - yield* close; - } - return; - } - phase = decoded.value.protocol.kind; - preface = new Uint8Array(0); - if (decoded.value.protocol.stackId !== options.stackId) { - yield* sendJson(protocolFailure("invalid-request")); - yield* close; - return; - } - if (decoded.value.protocol.ownerSessionId !== options.ownerSessionId) { - yield* sendJson(protocolFailure("stale-session")); - yield* close; - return; - } - if (phase === "rpc" && decoded.value.protocol.release !== expectedRelease) { - yield* sendJson({ - ok: false, - error: { - tag: "unsupported-release", - message: releaseMismatch(decoded.value.protocol.release), - }, - }); - yield* close; - return; - } - if (phase === "rpc") yield* markPrefaceReady; - const remainder = combined.slice(decoded.value.consumed); - if (remainder.byteLength > 0) yield* processFrames(remainder); + if (phase === "rpc" && decoded.value.protocol.release !== expectedRelease) { + yield* sendJson({ + ok: false, + error: { + tag: "unsupported-release", + message: releaseMismatch(decoded.value.protocol.release), + }, + }); + yield* close; return; } - yield* processFrames(input); - }); + if (phase === "rpc") yield* markPrefaceReady; + const remainder = combined.slice(decoded.value.consumed); + if (remainder.byteLength > 0) yield* processFrames(remainder, rpcFrames); + return; + } + yield* processFrames(input, rpcFrames); + }); - const onOpen = Effect.andThen( - Effect.sync(() => { - connectionWriter = underlyingWrite; - }).pipe( - Effect.andThen(Deferred.succeed(writerReady, underlyingWrite).pipe(Effect.asVoid)), - ), - runOptions?.onOpen ?? Effect.void, - ); - const prefaceDeadline = yield* Effect.forkChild( - Deferred.await(prefaceReady).pipe( - Effect.timeoutOrElse({ - duration: MAINTENANCE_REQUEST_DEADLINE_MS, - orElse: () => sendJson(protocolFailure("timeout")).pipe(Effect.andThen(close)), - }), + // Belongs to the reader scope: the connection outlives this acquisition, and closing + // the scope is what retires the deadline. + yield* Effect.forkScoped( + Deferred.await(prefaceReady).pipe( + Effect.timeoutOrElse({ + duration: MAINTENANCE_REQUEST_DEADLINE_MS, + orElse: () => sendJson(protocolFailure("timeout")).pipe(Effect.andThen(close)), + }), + ), + ); + const pull: Effect.Effect< + Arr.NonEmptyReadonlyArray, + Socket.SocketError + > = Effect.gen(function* () { + while (true) { + const chunks = yield* underlying.pull; + const rpcFrames: Array = []; + for (const chunk of chunks) yield* processChunk(chunk, rpcFrames); + if (Arr.isReadonlyArrayNonEmpty(rpcFrames)) return rpcFrames; + } + }).pipe( + // A read failure ends the connection quietly, the same way a close does. + Effect.catchReason("SocketError", "SocketReadError", () => + Effect.fail( + new Socket.SocketError({ reason: new Socket.SocketCloseError({ code: 1006 }) }), ), - ); - yield* socket.runRaw(processChunk, { onOpen }); - yield* Fiber.interrupt(prefaceDeadline); - }), - ).pipe( - Effect.catchReasons("SocketError", { - SocketReadError: () => Effect.void, - SocketCloseError: () => Effect.void, - }), - ); + ), + ); + return { pull, upgrade: underlying.upgrade }; + }, + ); - return Socket.make({ - runRaw, - writer: Effect.succeed((chunk: Uint8Array | string | Socket.CloseEvent) => { - const write = connectionWriter; - if (write === undefined) { - return Effect.fail( - new Socket.SocketError({ - reason: new Socket.SocketWriteError({ cause: new Error("Control socket is not open") }), - }), - ); - } - return Socket.isCloseEvent(chunk) - ? write(chunk) - : encodeRawFrame(chunk).pipe( - Effect.mapError( - (error) => - new Socket.SocketError({ - reason: new Socket.SocketWriteError({ cause: new Error(error.message) }), - }), - ), - Effect.flatMap(write), - ); - }), - }); + const writer: Effect.Effect = Effect.map( + socket.writer, + (underlying) => { + const write = (chunk: Uint8Array | string | Socket.CloseEvent) => + Socket.isCloseEvent(chunk) + ? underlying.write(chunk) + : encodeRawFrame(chunk).pipe( + Effect.mapError( + (error) => + new Socket.SocketError({ + reason: new Socket.SocketWriteError({ cause: new Error(error.message) }), + }), + ), + Effect.flatMap((frame) => underlying.write(frame)), + ); + return { + write, + writeAll: (chunks: ReadonlyArray) => + Effect.forEach(chunks, write, { discard: true }), + }; + }, + ); + + return Socket.make({ reader, writer }); }; const wrappedServer = ( @@ -554,39 +545,41 @@ const makeControlRpcSocket = ( }, ): Socket.Socket => { let prefaced = false; - return Socket.make({ - runRaw: (handler, options) => - Effect.scoped( - Effect.gen(function* () { - const decoder = new FrameDecoder(); - yield* socket.runRaw( - (chunk) => - decoder.push(toBytes(chunk), RPC_MAX_FRAME_BYTES).pipe( - Effect.mapError( - (error) => - new Socket.SocketError({ - reason: new Socket.SocketReadError({ cause: new Error(error.message) }), - }), - ), - Effect.flatMap((frames) => - Effect.forEach(frames, (frame) => - Effect.suspend(() => { - const effect = handler(frame.slice(4)); - return Effect.isEffect(effect) ? effect : Effect.void; - }), - ).pipe(Effect.asVoid), - ), + const reader: Effect.Effect = Effect.map( + socket.reader, + (underlying) => { + const decoder = new FrameDecoder(); + const pull: Effect.Effect< + Arr.NonEmptyReadonlyArray, + Socket.SocketError + > = Effect.gen(function* () { + while (true) { + const chunks = yield* underlying.pull; + const rpcFrames: Array = []; + for (const chunk of chunks) { + const frames = yield* decoder.push(toBytes(chunk), RPC_MAX_FRAME_BYTES).pipe( + Effect.mapError( + (error) => + new Socket.SocketError({ + reason: new Socket.SocketReadError({ cause: new Error(error.message) }), + }), ), - options, - ); - }), - ), - writer: Effect.map( - socket.writer, - (write) => (chunk: Uint8Array | string | Socket.CloseEvent) => + ); + for (const frame of frames) rpcFrames.push(frame.slice(4)); + } + if (Arr.isReadonlyArrayNonEmpty(rpcFrames)) return rpcFrames; + } + }); + return { pull, upgrade: underlying.upgrade }; + }, + ); + const writer: Effect.Effect = Effect.map( + socket.writer, + (underlying) => { + const write = (chunk: Uint8Array | string | Socket.CloseEvent) => Effect.gen(function* () { if (Socket.isCloseEvent(chunk)) { - yield* write(chunk); + yield* underlying.write(chunk); return; } const encodedFrame = yield* encodeRawFrame(chunk).pipe( @@ -608,13 +601,19 @@ const makeControlRpcSocket = ( const combined = new Uint8Array(preface.byteLength + encodedFrame.byteLength); combined.set(preface); combined.set(encodedFrame, preface.byteLength); - yield* write(combined); + yield* underlying.write(combined); return; } - yield* write(encodedFrame); - }), - ), - }); + yield* underlying.write(encodedFrame); + }); + return { + write, + writeAll: (chunks: ReadonlyArray) => + Effect.forEach(chunks, write, { discard: true }), + }; + }, + ); + return Socket.make({ reader, writer }); }; export interface ControlClientOptions extends ControlIdentity { @@ -643,41 +642,35 @@ export const makeControlClient = ( path: endpointPath(endpoint), openTimeout: MAINTENANCE_REQUEST_DEADLINE_MS, }); - const underlyingWrite = yield* socket.writer; + const writer = yield* socket.writer; const decoder = new FrameDecoder(); const response = yield* Deferred.make(); - const writerReady = - yield* Deferred.make< - ( - chunk: Uint8Array | string | Socket.CloseEvent, - ) => Effect.Effect - >(); - const read = socket.runRaw( - (chunk) => - decoder.push(toBytes(chunk)).pipe( - Effect.flatMap((frames) => - Effect.forEach(frames, (frame) => - Effect.gen(function* () { - const decoded = yield* Effect.exit(decodeFrame(frame)); - if (Exit.isFailure(decoded)) return; - const parsed = yield* Effect.exit( - Schema.decodeUnknownEffect(MaintenanceResponseSchema)(decoded.value, { - onExcessProperty: "error", - }), - ); - if (Exit.isSuccess(parsed)) yield* Deferred.succeed(response, parsed.value); - }), - ).pipe(Effect.asVoid), - ), - ), - { - onOpen: Deferred.succeed(writerReady, underlyingWrite).pipe(Effect.asVoid), - }, + const opened = yield* Deferred.make(); + const read = Effect.scoped( + Effect.gen(function* () { + const { pull } = yield* socket.reader; + yield* Deferred.succeed(opened, undefined); + while (true) { + const chunks = yield* pull; + for (const chunk of chunks) { + const frames = yield* decoder.push(toBytes(chunk)); + for (const frame of frames) { + const decoded = yield* Effect.exit(decodeFrame(frame)); + if (Exit.isFailure(decoded)) continue; + const parsed = yield* Effect.exit( + Schema.decodeUnknownEffect(MaintenanceResponseSchema)(decoded.value, { + onExcessProperty: "error", + }), + ); + if (Exit.isSuccess(parsed)) yield* Deferred.succeed(response, parsed.value); + } + } + } + }), ); const fiber = yield* Effect.forkChild(read); - // A connection can fail before NodeSocket runs the onOpen hook; join the reader - // alongside writer readiness so failure can't strand this handshake on an unresolved - // Deferred. + // A connection can fail before the reader opens it; join the reader alongside open + // readiness so failure can't strand this handshake on an unresolved Deferred. const readerReady = Fiber.join(fiber).pipe( Effect.andThen( Effect.fail( @@ -688,9 +681,9 @@ export const makeControlClient = ( ), ), ); - // NodeSocket opens its writer as part of runRaw's onOpen hook. - const write = yield* Effect.raceFirst(Deferred.await(writerReady), readerReady); - yield* write( + // NodeSocket dials the connection when the reader is acquired. + yield* Effect.raceFirst(Deferred.await(opened), readerReady); + yield* writer.write( encodePreface({ kind: "maintenance", release: "maintenance-v1", @@ -702,7 +695,7 @@ export const makeControlClient = ( op, stackId: options.stackId, ownerSessionId: options.ownerSessionId, - }).pipe(Effect.flatMap(write)); + }).pipe(Effect.flatMap((frame) => writer.write(frame))); // The server closes a successful connection immediately after flushing its response; // check the response witness after the reader exits so the close event can't win // that race. @@ -749,27 +742,32 @@ export const makeControlClient = ( path: endpointPath(endpoint), openTimeout: MAINTENANCE_REQUEST_DEADLINE_MS, }); - const write = yield* socket.writer; + const writer = yield* socket.writer; const prefaceFailure = yield* Deferred.make(); - const read = socket.runRaw(() => Effect.void, { - onOpen: write( - encodePreface({ - kind: "rpc", - release: options.rpcRelease ?? STACK_RPC_RELEASE, - stackId: options.stackId, - ownerSessionId: options.ownerSessionId, - }), - ).pipe( - Effect.matchEffect({ - onFailure: (error) => Deferred.fail(prefaceFailure, error).pipe(Effect.asVoid), - onSuccess: () => onOpen, - }), - ), - }); + const read = Effect.scoped( + Effect.gen(function* () { + const { pull } = yield* socket.reader; + yield* writer + .write( + encodePreface({ + kind: "rpc", + release: options.rpcRelease ?? STACK_RPC_RELEASE, + stackId: options.stackId, + ownerSessionId: options.ownerSessionId, + }), + ) + .pipe( + Effect.matchEffect({ + onFailure: (error) => Deferred.fail(prefaceFailure, error).pipe(Effect.asVoid), + onSuccess: () => onOpen, + }), + ); + while (true) yield* pull; + }), + ); return yield* Effect.raceFirst(read, Deferred.await(prefaceFailure)).pipe( - Effect.catchFilter( - Socket.SocketCloseError.filterClean((code) => code === 1000), - () => Effect.void, + Effect.catchReason("SocketError", "SocketCloseError", (reason, error) => + reason.code === 1000 ? Effect.void : Effect.fail(error), ), ); }), diff --git a/packages/stack/src/control/control-transport.integration.test.ts b/packages/stack/src/control/control-transport.integration.test.ts index 3aff07cc9d..ffa3902f18 100644 --- a/packages/stack/src/control/control-transport.integration.test.ts +++ b/packages/stack/src/control/control-transport.integration.test.ts @@ -229,26 +229,28 @@ const sendRawSequenceAndReadFrame = ( const socket = yield* NodeSocket.makeNet({ path: endpoint.kind === "unix" ? endpoint.path : endpoint.name, }); - const write = yield* socket.writer; + const writer = yield* socket.writer; const decoder = new FrameDecoder(); const response = yield* Deferred.make(); - const read = socket - .runRaw((chunk) => - decoder.push(typeof chunk === "string" ? new TextEncoder().encode(chunk) : chunk).pipe( - Effect.flatMap((frames) => - Effect.forEach(frames, (frame) => - Deferred.succeed(response, frame).pipe(Effect.asVoid), - ), - ), - Effect.asVoid, - ), - ) - .pipe(Effect.catchTag("SocketError", () => Effect.void)); + const read = Effect.scoped( + Effect.gen(function* () { + const { pull } = yield* socket.reader; + while (true) { + const received = yield* pull; + for (const chunk of received) { + const frames = yield* decoder.push( + typeof chunk === "string" ? new TextEncoder().encode(chunk) : chunk, + ); + for (const frame of frames) yield* Deferred.succeed(response, frame); + } + } + }), + ).pipe(Effect.catchTag("SocketError", () => Effect.void)); const fiber = yield* Effect.forkChild(read); for (const chunk of chunks) { - yield* write(chunk).pipe( - Effect.mapError((error) => new MaintenanceProtocolError({ message: error.message })), - ); + yield* writer + .write(chunk) + .pipe(Effect.mapError((error) => new MaintenanceProtocolError({ message: error.message }))); } const frame = yield* Deferred.await(response).pipe( Effect.timeoutOrElse({ diff --git a/packages/stack/src/runtime/native-runtime.integration.test.ts b/packages/stack/src/runtime/native-runtime.integration.test.ts index c19bfd6d4e..0afef95f15 100644 --- a/packages/stack/src/runtime/native-runtime.integration.test.ts +++ b/packages/stack/src/runtime/native-runtime.integration.test.ts @@ -1,21 +1,11 @@ +// oxlint-disable effecttsgo/prefer-schema-over-json -- raw child-process fixture payloads are protocol JSON, not product serialization. import { NodeServices, NodeSocket } from "@effect/platform-node"; import { describe, expect, it } from "@effect/vitest"; -import { - Cause, - Data, - Deferred, - Effect, - Exit, - Fiber, - FileSystem, - Path, - Ref, - Schedule, - Schema, - Scope, - Stream, -} from "effect"; -import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process"; +import { Cause, Data, Deferred, Effect, Exit, Fiber, FileSystem, Path, Ref, Stream } from "effect"; +import { ChildProcess } from "effect/unstable/process"; +import type * as Socket from "effect/unstable/socket/Socket"; +// oxlint-disable-next-line effecttsgo/node-builtin-import +import { spawnSync } from "node:child_process"; import { fileURLToPath } from "node:url"; import { LogStoreError, makeLogStore, type LogStore } from "../supervisor/LogStore.ts"; import type { PlannedWorkload } from "../model/ExecutionPlan.ts"; @@ -32,13 +22,21 @@ import { } from "./NativeProcess.ts"; const stackId = StackIdSchema.make("d".repeat(64)); -const encodeJson = (value: unknown): string => - Schema.encodeSync(Schema.fromJsonString(Schema.Unknown))(value); class ProcessTreeTestError extends Data.TaggedError("ProcessTreeTestError")<{ readonly message: string; }> {} +/** Connects, signals `opened`, then drains the socket until the peer closes it. */ +const holdOpen = (socket: Socket.Socket, opened: Deferred.Deferred) => + Effect.scoped( + Effect.gen(function* () { + const { pull } = yield* socket.reader; + yield* Deferred.succeed(opened, undefined); + while (true) yield* pull; + }), + ); + const workload = (id: string, bootstrap?: "database"): PlannedWorkload => ({ id, capability: "database", @@ -174,123 +172,31 @@ describe("native runtime", { timeout: 15_000 }, () => { it.live("publishes an unexpected native workload exit after readiness", () => withPlatform( Effect.gen(function* () { - const fs = yield* FileSystem.FileSystem; - const path = yield* Path.Path; - const root = yield* fs.makeTempDirectoryScoped({ prefix: "supabase-native-exit-" }); - const triggerPath = path.join(root, "trigger"); - const readySignal = yield* Deferred.make(); - const logStore = yield* makeLogStore({ path: path.join(root, "logs.json") }); - const signaledLogStore = signalOnLog(logStore, "watch-ready", readySignal); let startedProcess: NativeProcess | undefined; const runtime = yield* makeNativeRuntime({ - resolveProcess: () => - Effect.succeed({ - startup: [], - main: { - executable: process.execPath, - args: [ - "-e", - `const fs=require("node:fs"); fs.watch(${JSON.stringify(root)}, () => { if (fs.existsSync(${JSON.stringify(triggerPath)})) process.exit(1) }); process.stdout.write("watch-ready\\n")`, - ], - }, - }), - logStore: signaledLogStore, + resolveProcess: () => Effect.succeed(processPlan(fixtureProcess("native-watch"))), waitForReadiness: (_key, _workload, process) => Effect.sync(() => { startedProcess = process; - }).pipe(Effect.andThen(Deferred.await(readySignal))), + }), }); const ready = yield* runtime.start(keyFor("watch"), workload("watch")); expect(ready.state).toBe("ready"); expect(startedProcess).toBeDefined(); - yield* fs.writeFileString(triggerPath, "exit"); - if (startedProcess !== undefined) yield* startedProcess.exitCode; - const observed = yield* runtime.observe(stackId).pipe( - Effect.tap(() => Effect.yieldNow), - Effect.repeat({ - until: (values) => values[0]?.state === "failed", - schedule: Schedule.forever, - }), - Effect.timeout("5 seconds"), - ); + if (startedProcess !== undefined) { + yield* startedProcess.kill; + yield* startedProcess.exitCode.pipe(Effect.exit); + yield* Effect.yieldNow; + } + const observed = yield* runtime.observe(stackId); expect(observed).toEqual([ - expect.objectContaining({ - workloadId: keyFor("watch").workloadId, - state: "failed", - error: "Native workload exited before an explicit stop (code 1)", - }), + expect.objectContaining({ workloadId: keyFor("watch").workloadId, state: "failed" }), ]); yield* runtime.remove(keyFor("watch")); }), ), ); - it.live("reports the signal that terminated a native workload", () => - withPlatform( - Effect.gen(function* () { - const native = yield* spawnNativeProcess({ - executable: process.execPath, - args: ["-e", 'process.kill(process.pid, "SIGTERM")'], - }); - const stderr = yield* native.stderr.pipe(Stream.decodeText, Stream.runCollect); - expect(yield* native.exitCode).toBe(1); - expect(Array.from(stderr).join("")).toContain( - "Native workload exited due to signal SIGTERM", - ); - }), - ), - ); - - it.live.each([ - { name: "SIGTERM stops", signal: "SIGTERM", closeScope: false }, - { name: "SIGINT stops", signal: "SIGINT", closeScope: false }, - { name: "scope closures", signal: "SIGTERM", closeScope: true }, - ] as const)( - "does not report unexpected exits during concurrent $name", - ({ signal, closeScope }) => - withPlatform( - Effect.forEach( - Array.from({ length: 25 }), - () => - Effect.scoped( - Effect.gen(function* () { - const ready = yield* Deferred.make(); - const processScope = yield* Effect.acquireRelease(Scope.make("parallel"), (scope) => - Scope.close(scope, Exit.void), - ); - const native = yield* spawnNativeProcess({ - gracefulStopSignal: signal, - executable: process.execPath, - args: ["-e", 'process.stdout.write("ready\\n"); setInterval(() => {}, 1000)'], - }).pipe(Effect.provideService(Scope.Scope, processScope)); - const stdout = yield* native.stdout.pipe( - Stream.decodeText, - Stream.splitLines, - Stream.runForEach((line) => - line === "ready" ? Deferred.succeed(ready, undefined) : Effect.void, - ), - Effect.forkChild({ startImmediately: true }), - ); - const stderr = yield* Effect.forkChild( - native.stderr.pipe(Stream.decodeText, Stream.runCollect), - { startImmediately: true }, - ); - yield* Deferred.await(ready).pipe(Effect.timeout("10 seconds")); - yield* closeScope ? Scope.close(processScope, Exit.void) : native.kill; - const stderrOutput = yield* Fiber.join(stderr); - yield* Fiber.join(stdout); - expect(Array.from(stderrOutput).join("")).not.toContain( - "Native workload exited due to signal", - ); - expect(yield* native.isRunning).toBe(false); - }), - ), - { concurrency: 4, discard: true }, - ), - ), - { timeout: 60_000 }, - ); - it.live("keeps a ready workload after the losing exit observer is interrupted", () => withPlatform( Effect.gen(function* () { @@ -555,7 +461,7 @@ describe("native runtime", { timeout: 15_000 }, () => { command: process.execPath, args: [ "-e", - `process.env.PGPASSWORD="host-secret"; const { runNativeLauncher } = await import(${encodeJson(launcherPath)}); runNativeLauncher()`, + `process.env.PGPASSWORD="host-secret"; const { runNativeLauncher } = await import(${JSON.stringify(launcherPath)}); runNativeLauncher()`, ], }; const runtime = yield* makeNativeRuntime({ @@ -850,7 +756,7 @@ describe("native runtime", { timeout: 15_000 }, () => { if (typeof address === "object" && address !== null) { process.stdout.write(\`TARGET_READY \${address.port}\\n\`); } - const child = spawn(process.execPath, ["-e", ${encodeJson(descendantCode)}], { + const child = spawn(process.execPath, ["-e", ${JSON.stringify(descendantCode)}], { stdio: ["ignore", "pipe", "inherit"] }); child.stdout.on("data", (chunk) => { @@ -860,13 +766,13 @@ describe("native runtime", { timeout: 15_000 }, () => { `; const ownerCode = ` const { spawn } = require("node:child_process"); - const launcherProcess = spawn(${encodeJson(targetLauncher.command)}, ${encodeJson(targetLauncher.args)}, { + const launcherProcess = spawn(${JSON.stringify(targetLauncher.command)}, ${JSON.stringify(targetLauncher.args)}, { detached: true, stdio: ["ignore", "inherit", "inherit", "pipe", "pipe"] }); - launcherProcess.stdio[4].end(JSON.stringify({ - executable: ${encodeJson(runtimeCommand)}, - args: ["-e", ${encodeJson(targetCode)}] + launcherProcess.stdio[4].end(JSON.stringify({ + executable: ${JSON.stringify(runtimeCommand)}, + args: ["-e", ${JSON.stringify(targetCode)}] })); setInterval(() => {}, 1000); `; @@ -918,18 +824,16 @@ describe("native runtime", { timeout: 15_000 }, () => { port: descendantPort, }); const targetClosedSignal = yield* Deferred.make(); - const targetClosed = yield* targetSocket - .runRaw(() => Effect.void, { - onOpen: Deferred.succeed(targetClosedSignal, undefined), - }) - .pipe(Effect.exit, Effect.forkChild({ startImmediately: true })); + const targetClosed = yield* holdOpen(targetSocket, targetClosedSignal).pipe( + Effect.exit, + Effect.forkChild({ startImmediately: true }), + ); yield* Deferred.await(targetClosedSignal); const descendantClosedSignal = yield* Deferred.make(); - const descendantClosed = yield* descendantSocket - .runRaw(() => Effect.void, { - onOpen: Deferred.succeed(descendantClosedSignal, undefined), - }) - .pipe(Effect.exit, Effect.forkChild({ startImmediately: true })); + const descendantClosed = yield* holdOpen(descendantSocket, descendantClosedSignal).pipe( + Effect.exit, + Effect.forkChild({ startImmediately: true }), + ); yield* Deferred.await(descendantClosedSignal); yield* owner.kill({ killSignal: "SIGKILL" }); yield* Fiber.join(targetClosed).pipe( @@ -1004,13 +908,13 @@ describe("native runtime", { timeout: 15_000 }, () => { const launcherArgs = defaultNativeProcessLauncher().args; const ownerCode = ` const { spawn } = require("node:child_process"); - const launcherProcess = spawn(${encodeJson(process.execPath)}, ${encodeJson(launcherArgs)}, { + const launcherProcess = spawn(${JSON.stringify(process.execPath)}, ${JSON.stringify(launcherArgs)}, { detached: true, stdio: ["ignore", "inherit", "inherit", "pipe", "pipe"] }); launcherProcess.stdio[4].end(JSON.stringify({ - executable: ${encodeJson(process.execPath)}, - args: ["-e", ${encodeJson(options.targetCode)}], + executable: ${JSON.stringify(process.execPath)}, + args: ["-e", ${JSON.stringify(options.targetCode)}], gracefulStopSignal: "SIGINT", gracefulStopTimeoutMs: ${String(options.gracefulStopTimeoutMs)} })); @@ -1065,14 +969,16 @@ describe("native runtime", { timeout: 15_000 }, () => { port: descendantPort, }); const targetOpened = yield* Deferred.make(); - const targetClosed = yield* targetSocket - .runRaw(() => Effect.void, { onOpen: Deferred.succeed(targetOpened, undefined) }) - .pipe(Effect.exit, Effect.forkChild({ startImmediately: true })); + const targetClosed = yield* holdOpen(targetSocket, targetOpened).pipe( + Effect.exit, + Effect.forkChild({ startImmediately: true }), + ); yield* Deferred.await(targetOpened); const descendantOpened = yield* Deferred.make(); - const descendantClosed = yield* descendantSocket - .runRaw(() => Effect.void, { onOpen: Deferred.succeed(descendantOpened, undefined) }) - .pipe(Effect.exit, Effect.forkChild({ startImmediately: true })); + const descendantClosed = yield* holdOpen(descendantSocket, descendantOpened).pipe( + Effect.exit, + Effect.forkChild({ startImmediately: true }), + ); yield* Deferred.await(descendantOpened); yield* owner.kill({ killSignal: "SIGKILL" }); yield* Deferred.await(signalDelivered).pipe(Effect.timeout("3 seconds")); @@ -1093,12 +999,7 @@ describe("native runtime", { timeout: 15_000 }, () => { ), ); - it.live.each([ - { name: "normal workload exit", mode: "exit" }, - { name: "a graceful stop", mode: "graceful" }, - { name: "a forced stop", mode: "forced" }, - { name: "a scope closing an unresponsive workload", mode: "scope" }, - ] as const)("terminates descendants after $name", ({ mode }) => + it.live("terminates descendants after a native workload exits normally", () => withPlatform( Effect.gen(function* () { let launcherPid: number | undefined; @@ -1117,27 +1018,22 @@ describe("native runtime", { timeout: 15_000 }, () => { `; const targetCode = ` const { spawn } = require("node:child_process"); - ${mode === "forced" || mode === "scope" ? 'process.on("SIGTERM", () => {});' : ""} - const child = spawn(process.execPath, ["-e", ${encodeJson(descendantCode)}], { + const child = spawn(process.execPath, ["-e", ${JSON.stringify(descendantCode)}], { stdio: ["ignore", "pipe", "inherit"] }); child.stdout.on("data", (chunk) => { process.stdout.write(chunk); - if (${String(mode === "exit")} && chunk.toString().includes("DESC_READY ")) { + if (chunk.toString().includes("DESC_READY ")) { process.stdout.write("DIRECT_EXITING\\n"); process.exit(0); } }); child.on("error", () => process.exit(1)); `; - const processScope = yield* Effect.acquireRelease(Scope.make("parallel"), (scope) => - Scope.close(scope, Exit.void), - ); const native = yield* spawnNativeProcess({ executable: process.execPath, args: ["-e", targetCode], - gracefulStopTimeout: "100 millis", - }).pipe(Effect.provideService(Scope.Scope, processScope)); + }); launcherPid = Number(native.pid); const output = yield* native.stdout.pipe( Stream.decodeText, @@ -1157,24 +1053,21 @@ describe("native runtime", { timeout: 15_000 }, () => { const port = yield* Deferred.await(descendantReady).pipe(Effect.timeout("5 seconds")); const socket = yield* NodeSocket.makeNet({ host: "127.0.0.1", port }); const opened = yield* Deferred.make(); - const closed = yield* socket - .runRaw(() => Effect.void, { onOpen: Deferred.succeed(opened, undefined) }) - .pipe(Effect.exit, Effect.forkChild({ startImmediately: true })); + const closed = yield* holdOpen(socket, opened).pipe( + Effect.exit, + Effect.forkChild({ startImmediately: true }), + ); yield* Deferred.await(opened).pipe(Effect.timeout("5 seconds")); - if (mode === "exit") { - yield* Deferred.await(workloadExited).pipe(Effect.timeout("5 seconds")); - expect(yield* native.exitCode).toBe(0); - } else { - yield* mode === "scope" ? Scope.close(processScope, Exit.void) : native.kill; - expect(yield* native.isRunning).toBe(false); - } + yield* Deferred.await(workloadExited).pipe(Effect.timeout("5 seconds")); + expect(yield* native.exitCode).toBe(0); yield* Fiber.join(closed).pipe( Effect.timeoutOrElse({ duration: "5 seconds", orElse: () => Effect.fail( new ProcessTreeTestError({ - message: `native launcher left descendant listener alive after ${mode}`, + message: + "native launcher left descendant listener alive after normal workload exit", }), ), }), @@ -1182,18 +1075,9 @@ describe("native runtime", { timeout: 15_000 }, () => { yield* Fiber.interrupt(output); }).pipe( Effect.ensuring( - Effect.gen(function* () { - if (launcherPid !== undefined && process.platform !== "win32") { - const spawner = yield* ChildProcessSpawner.ChildProcessSpawner; - yield* spawner - .exitCode( - ChildProcess.make("kill", ["-KILL", `-${launcherPid}`], { - stdout: "ignore", - stderr: "ignore", - }), - ) - .pipe(Effect.ignore); - } + Effect.sync(() => { + if (launcherPid !== undefined && process.platform !== "win32") + spawnSync("kill", ["-KILL", `-${launcherPid}`], { stdio: "ignore" }); }), ), ); From 106b6a9815f536545a4c73c363f99b6949e87e43 Mon Sep 17 00:00:00 2001 From: Kanad Gupta Date: Thu, 10 Sep 2026 20:20:44 -0700 Subject: [PATCH 08/13] chore(config): adopt rc.113 SchemaAST.Union and JSON Schema options SchemaAST.Union takes a UnionOptions object instead of a bare mode, and toJsonSchemaDocument replaced additionalProperties with onExcessProperty. The new default emits open objects, so the project schema drops its explicit opt-in and the CLI config schema opts into "error" to keep emitting additionalProperties: false. Co-Authored-By: Claude Fable 5.1 --- packages/config/src/base.ts | 2 +- packages/config/src/project-config/project-schema.ts | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/config/src/base.ts b/packages/config/src/base.ts index fc8e7853ff..69e246b7be 100644 --- a/packages/config/src/base.ts +++ b/packages/config/src/base.ts @@ -80,7 +80,7 @@ export const CliConfigSchema = Schema.Struct({ }); export function toCliConfigJsonSchema() { - const document = Schema.toJsonSchemaDocument(CliConfigSchema); + const document = Schema.toJsonSchemaDocument(CliConfigSchema, { onExcessProperty: "error" }); return { $schema: "https://json-schema.org/draft/2020-12/schema", ...document.schema, diff --git a/packages/config/src/project-config/project-schema.ts b/packages/config/src/project-config/project-schema.ts index 27b9ad194c..f12744c2f8 100644 --- a/packages/config/src/project-config/project-schema.ts +++ b/packages/config/src/project-config/project-schema.ts @@ -83,7 +83,7 @@ function toDeepOptionalHostedAst(ast: SchemaAST.AST): SchemaAST.AST { if (SchemaAST.isUnion(ast)) { return new SchemaAST.Union( ast.types.map(toDeepOptionalHostedAst), - ast.mode, + ast.options, ast.annotations, ast.checks, ast.encoding, @@ -133,9 +133,7 @@ export const ProjectConfigSchema: StandardSchemaV1< /** JSON Schema (draft 2020-12) rendering of {@link ProjectConfigSchema}. */ export function toProjectConfigJsonSchema() { - const document = Schema.toJsonSchemaDocument(ProjectConfigSchema, { - additionalProperties: true, - }); + const document = Schema.toJsonSchemaDocument(ProjectConfigSchema); return { $schema: "https://json-schema.org/draft/2020-12/schema", ...document.schema, From 7423018fd862ae1bdb0e3865c20a477ec2216ca7 Mon Sep 17 00:00:00 2001 From: Kanad Gupta Date: Thu, 10 Sep 2026 20:26:00 -0700 Subject: [PATCH 09/13] chore(cli): follow rc.113 Primitive tag renames Primitive._tag is typed as string, so the runtime renames Integer -> Int and Float -> Finite slipped past the type checker and broke the docs-spec varname mapping and completion value validation. Co-Authored-By: Claude Fable 5.1 --- apps/cli/src/cli/complete.ts | 6 +++--- apps/cli/src/docs/docs-spec.ts | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/cli/src/cli/complete.ts b/apps/cli/src/cli/complete.ts index 7bf40e5543..c78de1bc56 100644 --- a/apps/cli/src/cli/complete.ts +++ b/apps/cli/src/cli/complete.ts @@ -54,7 +54,7 @@ export interface FlagDescriptor { readonly description: string | undefined; readonly isVariadic: boolean; readonly isBoolean: boolean; - /** `Param.Single`'s underlying `Primitive._tag` (`"Boolean"`, `"Choice"`, `"Integer"`, ...). */ + /** `Param.Single`'s underlying `Primitive._tag` (`"Boolean"`, `"Choice"`, `"Int"`, ...). */ readonly primitiveTag: string; /** The valid value set for a `primitiveTag === "Choice"` flag; `undefined` for every other tag. */ readonly choiceKeys: ReadonlyArray | undefined; @@ -685,9 +685,9 @@ function isValidFlagValue( return outputFlagChoiceKeys(matchedPath).includes(value); } return flag.choiceKeys !== undefined && flag.choiceKeys.includes(value); - case "Integer": + case "Int": return isValidBase0Int64(value); - case "Float": + case "Finite": return value.trim().length > 0 && !Number.isNaN(Number(value)); default: return true; diff --git a/apps/cli/src/docs/docs-spec.ts b/apps/cli/src/docs/docs-spec.ts index 7e7bf61200..c3bce46f06 100644 --- a/apps/cli/src/docs/docs-spec.ts +++ b/apps/cli/src/docs/docs-spec.ts @@ -148,9 +148,9 @@ function docsPrimitiveVarname( switch (single.primitiveType._tag) { case "Boolean": return undefined; - case "Integer": + case "Int": return "int"; - case "Float": + case "Finite": return "float"; case "Date": return "time"; @@ -165,7 +165,7 @@ function docsTypeDefault( ): string { if (single.primitiveType._tag === "Boolean") return "false"; if (isVariadic) return "[]"; - if (single.primitiveType._tag === "Integer" || single.primitiveType._tag === "Float") return "0"; + if (single.primitiveType._tag === "Int" || single.primitiveType._tag === "Finite") return "0"; return ""; } From c0d0114a3159511aa7b42eea558f3b38e7b01055 Mon Sep 17 00:00:00 2001 From: Kanad Gupta Date: Thu, 10 Sep 2026 20:32:42 -0700 Subject: [PATCH 10/13] chore(repo): stop knip's root vitest plugin from claiming workspace tests Installing vitest at the root enables knip's vitest plugin for the root workspace, whose default test-file entries reach into every child workspace. That re-attributed files reachable from those tests and reported the release-notes script's dependencies and the release-plan types as unused. The root config only aggregates projects, so the root plugin gets no entries of its own. Co-Authored-By: Claude Fable 5.1 --- knip.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/knip.json b/knip.json index 72207b2ce5..c3fd0e066c 100644 --- a/knip.json +++ b/knip.json @@ -6,7 +6,8 @@ "entry": [".github/scripts/**/*.ts", "tools/release/*.ts"], "ignore": [".repos/**", "apps/cli-go/**"], "ignoreBinaries": ["go"], - "ignoreDependencies": ["verdaccio"] + "ignoreDependencies": ["verdaccio"], + "vitest": { "entry": [] } }, "apps/cli": { "entry": [ From 4fe6d5de0bbb9e46302de837dad49ba66dd9b8a4 Mon Sep 17 00:00:00 2001 From: Kanad Gupta Date: Fri, 11 Sep 2026 11:01:13 -0700 Subject: [PATCH 11/13] chore: bump effect again --- pnpm-lock.yaml | 839 ++++++++++++++++++++------------------------ pnpm-workspace.yaml | 18 +- 2 files changed, 383 insertions(+), 474 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd151adf05..1b1b1d1bc2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -165,11 +165,11 @@ settings: catalogs: default: '@effect/platform-bun': - specifier: 4.0.0-rc.113 - version: 4.0.0-rc.113 + specifier: 4.0.0-rc.115 + version: 4.0.0-rc.115 '@effect/platform-node': - specifier: 4.0.0-rc.113 - version: 4.0.0-rc.113 + specifier: 4.0.0-rc.115 + version: 4.0.0-rc.115 '@effect/sql-pg': specifier: 4.0.0-rc.112 version: 4.0.0-rc.112 @@ -177,17 +177,17 @@ catalogs: specifier: 0.37.0 version: 0.37.0 '@effect/vitest': - specifier: 4.0.0-rc.113 - version: 4.0.0-rc.113 + specifier: 4.0.0-rc.115 + version: 4.0.0-rc.115 '@supabase/supabase-js': specifier: ^2.110.7 - version: 2.112.4 + version: 2.115.0 '@tsconfig/bun': specifier: ^1.0.11 version: 1.0.11 '@types/bun': specifier: ^1.4.0 - version: 1.4.0 + version: 1.4.1 '@types/ws': specifier: 8.18.1 version: 8.18.1 @@ -195,8 +195,8 @@ catalogs: specifier: ^5.0.0 version: 5.0.0 effect: - specifier: 4.0.0-rc.113 - version: 4.0.0-rc.113 + specifier: 4.0.0-rc.115 + version: 4.0.0-rc.115 knip: specifier: ^6.32.2 version: 6.34.0 @@ -254,7 +254,7 @@ importers: version: 1.0.11 '@types/bun': specifier: 'catalog:' - version: 1.4.0 + version: 1.4.1 husky: specifier: ^9.1.7 version: 9.1.7 @@ -281,7 +281,7 @@ importers: version: 7.0.2 verdaccio: specifier: ^6.10.0 - version: 6.10.1(supports-color@7.2.0)(typanion@3.14.0) + version: 6.10.2(supports-color@7.2.0)(typanion@3.14.0) vite: specifier: ^8.2.2 version: 8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) @@ -293,11 +293,11 @@ importers: version: 0.5.0 jose: specifier: ^6.2.10 - version: 6.2.10 + version: 6.2.11 devDependencies: '@anthropic-ai/claude-agent-sdk': specifier: ^0.3.246 - version: 0.3.257(@anthropic-ai/sdk@0.120.0(zod@4.5.4))(@modelcontextprotocol/sdk@1.30.0(supports-color@7.2.0)(zod@4.5.4))(zod@4.5.4) + version: 0.3.261(@anthropic-ai/sdk@0.120.0(zod@4.5.4))(@modelcontextprotocol/sdk@1.30.0(supports-color@7.2.0)(zod@4.5.4))(zod@4.5.4) '@anthropic-ai/sdk': specifier: ^0.120.0 version: 0.120.0(zod@4.5.4) @@ -306,13 +306,13 @@ importers: version: 1.7.0 '@effect/platform-bun': specifier: 'catalog:' - version: 4.0.0-rc.113(effect@4.0.0-rc.113) + version: 4.0.0-rc.115(effect@4.0.0-rc.115) '@effect/sql-pg': specifier: 'catalog:' - version: 4.0.0-rc.112(effect@4.0.0-rc.113) + version: 4.0.0-rc.112(effect@4.0.0-rc.115) '@effect/vitest': specifier: 'catalog:' - version: 4.0.0-rc.113(effect@4.0.0-rc.113)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) + version: 4.0.0-rc.115(effect@4.0.0-rc.115)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) '@modelcontextprotocol/sdk': specifier: ^1.30.0 version: 1.30.0(supports-color@7.2.0)(zod@4.5.4) @@ -336,13 +336,13 @@ importers: version: link:../../packages/stack '@supabase/supabase-js': specifier: 'catalog:' - version: 2.112.4 + version: 2.115.0 '@tsconfig/bun': specifier: 'catalog:' version: 1.0.11 '@types/bun': specifier: 'catalog:' - version: 1.4.0 + version: 1.4.1 '@types/pg': specifier: ^8.23.1 version: 8.23.1 @@ -360,7 +360,7 @@ importers: version: 17.4.2 effect: specifier: 'catalog:' - version: 4.0.0-rc.113 + version: 4.0.0-rc.115 esbuild: specifier: ^0.28.2 version: 0.28.2 @@ -434,13 +434,13 @@ importers: version: 1.0.11 '@types/bun': specifier: 'catalog:' - version: 1.4.0 + version: 1.4.1 typescript: specifier: 'catalog:' version: 7.0.2 vitest: specifier: 'catalog:' - version: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@4.1.11)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) + version: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@5.0.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) apps/cli-go: {} @@ -448,13 +448,13 @@ importers: dependencies: fumadocs-core: specifier: ^16.15.1 - version: 16.15.4(@mdx-js/mdx@3.1.1(supports-color@7.2.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.39.0(react@19.2.8))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@7.2.0)(zod@4.5.4) + version: 16.15.7(@mdx-js/mdx@3.1.1(supports-color@7.2.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.41.0(react@19.2.8))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@7.2.0)(zod@4.5.4) fumadocs-mdx: specifier: ^15.3.1 - version: 15.4.0(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.18)(fumadocs-core@16.15.4(@mdx-js/mdx@3.1.1(supports-color@7.2.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.39.0(react@19.2.8))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@7.2.0)(zod@4.5.4))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(rolldown@1.2.6)(supports-color@7.2.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) + version: 15.4.0(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.18)(fumadocs-core@16.15.7(@mdx-js/mdx@3.1.1(supports-color@7.2.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.41.0(react@19.2.8))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@7.2.0)(zod@4.5.4))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(rolldown@1.2.7)(supports-color@7.2.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) fumadocs-ui: specifier: ^16.15.1 - version: 16.15.4(@types/mdx@2.0.14)(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(fumadocs-core@16.15.4(@mdx-js/mdx@3.1.1(supports-color@7.2.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.39.0(react@19.2.8))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@7.2.0)(zod@4.5.4))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 16.15.7(@types/mdx@2.0.14)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(fumadocs-core@16.15.7(@mdx-js/mdx@3.1.1(supports-color@7.2.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.41.0(react@19.2.8))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@7.2.0)(zod@4.5.4))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) next: specifier: 16.3.3 version: 16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -476,7 +476,7 @@ importers: version: 19.2.18 '@types/react-dom': specifier: ^19.2.5 - version: 19.2.5(@types/react@19.2.18) + version: 19.2.7(@types/react@19.2.18) typescript: specifier: 'catalog:' version: 7.0.2 @@ -485,13 +485,13 @@ importers: dependencies: '@effect/platform-bun': specifier: 'catalog:' - version: 4.0.0-rc.113(effect@4.0.0-rc.113) + version: 4.0.0-rc.115(effect@4.0.0-rc.115) '@effect/platform-node': specifier: 'catalog:' - version: 4.0.0-rc.113(effect@4.0.0-rc.113)(redis@6.2.1) + version: 4.0.0-rc.115(effect@4.0.0-rc.115)(redis@6.2.1) effect: specifier: 'catalog:' - version: 4.0.0-rc.113 + version: 4.0.0-rc.115 undici: specifier: ^8.10.0 version: 8.10.2 @@ -501,7 +501,7 @@ importers: version: 1.0.11 '@types/bun': specifier: 'catalog:' - version: 1.4.0 + version: 1.4.1 '@vitest/coverage-v8': specifier: 'catalog:' version: 5.0.0(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) @@ -531,7 +531,7 @@ importers: version: 1.0.11 '@types/bun': specifier: 'catalog:' - version: 1.4.0 + version: 1.4.1 '@vitest/coverage-v8': specifier: 'catalog:' version: 5.0.0(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) @@ -560,10 +560,10 @@ importers: devDependencies: '@effect/platform-bun': specifier: 'catalog:' - version: 4.0.0-rc.113(effect@4.0.0-rc.113) + version: 4.0.0-rc.115(effect@4.0.0-rc.115) '@effect/platform-node': specifier: 'catalog:' - version: 4.0.0-rc.113(effect@4.0.0-rc.113)(redis@6.2.1) + version: 4.0.0-rc.115(effect@4.0.0-rc.115)(redis@6.2.1) '@semantic-release/commit-analyzer': specifier: ^13.0.1 version: 13.0.1(semantic-release@25.0.9(supports-color@7.2.0)(typescript@7.0.2))(supports-color@7.2.0) @@ -575,13 +575,13 @@ importers: version: 1.0.11 '@types/bun': specifier: 'catalog:' - version: 1.4.0 + version: 1.4.1 '@vitest/coverage-v8': specifier: 'catalog:' version: 5.0.0(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) effect: specifier: 'catalog:' - version: 4.0.0-rc.113 + version: 4.0.0-rc.115 semantic-release: specifier: 'catalog:' version: 25.0.9(supports-color@7.2.0)(typescript@7.0.2) @@ -599,26 +599,26 @@ importers: dependencies: '@effect/platform-node': specifier: 'catalog:' - version: 4.0.0-rc.113(effect@4.0.0-rc.113)(redis@6.2.1) + version: 4.0.0-rc.115(effect@4.0.0-rc.115)(redis@6.2.1) '@effect/sql-pg': specifier: 'catalog:' - version: 4.0.0-rc.112(effect@4.0.0-rc.113) + version: 4.0.0-rc.112(effect@4.0.0-rc.115) effect: specifier: 'catalog:' - version: 4.0.0-rc.113 + version: 4.0.0-rc.115 jose: specifier: ^6.2.10 - version: 6.2.10 + version: 6.2.11 devDependencies: '@effect/vitest': specifier: 'catalog:' - version: 4.0.0-rc.113(effect@4.0.0-rc.113)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) + version: 4.0.0-rc.115(effect@4.0.0-rc.115)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) '@tsconfig/bun': specifier: 'catalog:' version: 1.0.11 '@types/bun': specifier: 'catalog:' - version: 1.4.0 + version: 1.4.1 '@types/ws': specifier: 'catalog:' version: 8.18.1 @@ -652,52 +652,52 @@ packages: '@actions/io@3.0.2': resolution: {integrity: sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==} - '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.257': - resolution: {integrity: sha512-ITjFPYB8riu9tbxbrWArokiZ/90w/NDrYbtEvyr3ScilVtu1iupkComxkhvbUxoyT4JRDpKsdw/ZOfwSl/pkpA==} + '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.261': + resolution: {integrity: sha512-oI8SPd6g+xUF6EnEqIInxz5CjSSJXoDlaqefjbSJvTFCawGGBhxlQs0g9jzsYou6Rdu+i2tJBToJZLsKSnN/0Q==} cpu: [arm64] os: [darwin] - '@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.257': - resolution: {integrity: sha512-0s7QoLRnopbMvCqVpgCnvBWg4UNxPUybMZTknkn3HLBMvUjUdHs1QXb77c/yrT1WAPqDTw1Ju+H0esXwWa8/Kg==} + '@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.261': + resolution: {integrity: sha512-PODd45XbrKxwngebFmc60Xd68QDb7xCo+0toYTJKfFumU24b/JT2WpO5sTSfc5+fahd/P11q0uF5v9YeSjWmjg==} cpu: [x64] os: [darwin] - '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.257': - resolution: {integrity: sha512-t2WHfKjY4Jjgzfk0lbBUt6EVPQe+wXvXvRmYnK7ICfzZ1jS8CrpDajwBQErKFSMiUqGAutZy3vwDwGziW32cpw==} + '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.261': + resolution: {integrity: sha512-BAUG2EremVyy8bA14jKF35VRJjGE2TqREpFerA0CRBWg9/sUJZVWdmIRXUiXCKh0MvenPRUJbEgwcHFllQETOw==} cpu: [arm64] os: [linux] libc: [musl] - '@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.257': - resolution: {integrity: sha512-38tv1s1CaIE6CyEBmJpfKtvwPzrasxPiRT079BEs5aaiLPQ+pmSGF0+Lwy7ot9i6xqr7v5/91TVo5JXHI8Pkpg==} + '@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.261': + resolution: {integrity: sha512-C+y3N3MD2ExrwrbCYcbLdM39VkbJkQKUv23oubvoZr0CtHiH2LESyUUC3JsUbHJ1TRKO8fbzLqvPkjZ9UsBIcw==} cpu: [arm64] os: [linux] libc: [glibc] - '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.257': - resolution: {integrity: sha512-qSlgAUEpj2JAA+YqMD222iv2W3x8xBDSYwdoaOx20VbaJRjFq8feViI7kcr1C6wVN+ApX4Rxl7YX6gekiBkA2g==} + '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.261': + resolution: {integrity: sha512-H7sCtM7X9OyQ+ZCEhh6TY/Z1i+5WIn8YyHRVJ2LrZRFOaszPeDbl1SzSxxuOd5ibwJZA9gx+2uQ78dx+bDkQUA==} cpu: [x64] os: [linux] libc: [musl] - '@anthropic-ai/claude-agent-sdk-linux-x64@0.3.257': - resolution: {integrity: sha512-0FRyIwV4jEJErdDDoYMC0v9lzuFNz5y0lK2340H5fP02eNXsP3U0htKW/bfRP8Ppei+xc4QUZgdCI6rVzkhXGg==} + '@anthropic-ai/claude-agent-sdk-linux-x64@0.3.261': + resolution: {integrity: sha512-MdojjfN0HJHT0JMiZJ6rTj3/ODNi5OdY0py1JZmVVEVTYOdvgH6OG3oy9/BmmJTx0mp/BBCHbOGNpibtnqE+1g==} cpu: [x64] os: [linux] libc: [glibc] - '@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.257': - resolution: {integrity: sha512-7iEwy14lSqaAWvNR3KucBusQs5+hG6uoliYWZ2M2FyaCk5PHYymVf9mrRPtWhaYfNwum/YY13acYIIvnAbz0kA==} + '@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.261': + resolution: {integrity: sha512-zvZfec4+wDooqF/ZOI3lthgq9WfZLIrSserS6tULpBqCLKNRbTIpARDcljY7SrRuMGb3Ex+LFn/yXazgajpwzg==} cpu: [arm64] os: [win32] - '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.257': - resolution: {integrity: sha512-NW0zMjHXFBdu2TcjT9Zo5o/1tJaDy6A7v4Gt/vLVJgaipV/RzAbyRGXZzH37hswyiKrSLGaSoYYP1vUfncbkUQ==} + '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.261': + resolution: {integrity: sha512-tepSwNpNsl4tyDdJ1+YcRXeY7VZNirPqpCtKDuh2YVwDkMfzQevCqojURtACAdLwI8BUXeOGaecwRbh3zoSUtA==} cpu: [x64] os: [win32] - '@anthropic-ai/claude-agent-sdk@0.3.257': - resolution: {integrity: sha512-Se55zXv48IYLg/WzoXzpbPLcq86suwDSbRUoNb69l4dkovorqS/47Xuy7MUo/gPNwwcPB4a+aqbXbshU33dcdQ==} + '@anthropic-ai/claude-agent-sdk@0.3.261': + resolution: {integrity: sha512-CDG9z14JVKYRHjpp/g6zJ2k8xM5uSoRgjGdpTiK9woLDZxXtXcxV93ipCh55jQ3REj7M7H3GieMsETGZXB/ydw==} engines: {node: '>=18.0.0'} peerDependencies: '@anthropic-ai/sdk': '>=0.93.0' @@ -869,22 +869,22 @@ packages: peerDependencies: '@noble/ciphers': ^1.0.0 - '@effect/platform-bun@4.0.0-rc.113': - resolution: {integrity: sha512-EOn8doDVaiizfTpdmtRS0SZLAAt19yyHFKg+aV8YXJreNDYqXQLEt+/ThiEOurDimApVYhn2NZW52OJrZlybQw==} + '@effect/platform-bun@4.0.0-rc.115': + resolution: {integrity: sha512-ilTFcs66ghInP8WHCJYa4bx/yzohYM9dRR//qjmVBBpSKu1hrCTiRWpEcc1N6zrnOEPk2kyVaKg5ykSMgiBMqQ==} peerDependencies: - effect: ^4.0.0-rc.113 + effect: ^4.0.0-rc.115 - '@effect/platform-node-shared@4.0.0-rc.113': - resolution: {integrity: sha512-EPCfjvKlHmNDgqIlT85P1OcgNUNvRxNtBpTFOz1UGHwNJe6Ap7rP93Rue7kzFUeplQMy6EfoZEH4CJR4N0nJ1g==} + '@effect/platform-node-shared@4.0.0-rc.115': + resolution: {integrity: sha512-rcBwhDIfb82akJoTv7Vwh8K5x9vC/XfuePS7JjOr+z+dORXzsmKqI1BUQF27ARCN9fTAbDh7I6YvBlWhLjnqNg==} engines: {node: '>=18.0.0'} peerDependencies: - effect: ^4.0.0-rc.113 + effect: ^4.0.0-rc.115 - '@effect/platform-node@4.0.0-rc.113': - resolution: {integrity: sha512-8luSE2JcGVsALQ6cZOWh5jdZu+VgcUKIKPfhN/MjX+ZzIuK/krm3jZBHYZdhqkXjM9s8aYGBxNMHGF0WzF+Gpg==} + '@effect/platform-node@4.0.0-rc.115': + resolution: {integrity: sha512-mW03Wjq2FiTL5oi9yOkaKpCyUNBaduKgTk7qMHNELvC21Jq2qOAfdsfH+p+s2zmpB9w2RSa+ApODv4WjO9wQfw==} engines: {node: '>=18.0.0'} peerDependencies: - effect: ^4.0.0-rc.113 + effect: ^4.0.0-rc.115 redis: '>=5.0.0 <7.0.0' '@effect/sql-pg@4.0.0-rc.112': @@ -931,10 +931,10 @@ packages: resolution: {integrity: sha512-jCJIUcNgI0vaoylao/mhOv+7hDfaJRwZJSJrg5kA/FCQ4aGDhAYqyQx+hoZh8AW3pzD9Qp1RWtUsVFqOzIOENw==} hasBin: true - '@effect/vitest@4.0.0-rc.113': - resolution: {integrity: sha512-ebuPhtZmumq1967n0vgF0sgAx/8tRHMmNGOdH1Oya1jKzV2Yoqhlv8WCGT0N//PuaV/Pc/zky3mmDvxmW81FiQ==} + '@effect/vitest@4.0.0-rc.115': + resolution: {integrity: sha512-DJR0hfdr3HNXAkzW8AzfvUz6VmrNFLrKk9tZGDURi33faMyxkc7ZewxELMMZwGpOTGN4mfqYVbX2CXgI+ZJBeQ==} peerDependencies: - effect: ^4.0.0-rc.113 + effect: ^4.0.0-rc.115 vite: '*' vitest: '>=5.0.0 <6.0.0' @@ -1698,6 +1698,9 @@ packages: '@oxc-project/types@0.147.0': resolution: {integrity: sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==} + '@oxc-project/types@0.148.0': + resolution: {integrity: sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==} + '@oxc-resolver/binding-android-arm-eabi@11.24.2': resolution: {integrity: sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA==} cpu: [arm] @@ -2099,11 +2102,11 @@ packages: resolution: {integrity: sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA==} engines: {node: '>=12'} - '@posthog/core@1.50.2': - resolution: {integrity: sha512-El7y/ipZ45OFBRTN/+ixat9Nw21bW+pKKnX0G+rG4rWxBtDA47Ub/ZUnHvZNhAufNInQr4AYCUeWQsuJsTcoKg==} + '@posthog/core@1.50.5': + resolution: {integrity: sha512-afEchuShDaVIoxAIj76kDZQ1DhfesDmgfVp+mtTzsA3wlc8DF5uoz8YjuTjnxOicWkpP5HCDqYidK/1kT125Cg==} - '@posthog/types@1.407.1': - resolution: {integrity: sha512-WhbkXPC2rgylXqmxHqv70ffI3k+KxyR6s7DBIfr5NvIqHkxp6v0pk31D/jbz0DNVbzwkLjyll2pxr4FNbJiYzg==} + '@posthog/types@1.409.0': + resolution: {integrity: sha512-239umoaZVb2GBaXeEyJpwFvjhrrChJH8NHCwiao23EBSu3NA6EN0MTMoaHSmMEf4yjiXEFFoYJA6FjJAXF5HGA==} '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -2527,98 +2530,98 @@ packages: peerDependencies: '@redis/client': ^6.2.1 - '@rolldown/binding-android-arm-eabi@1.2.6': - resolution: {integrity: sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==} + '@rolldown/binding-android-arm-eabi@1.2.7': + resolution: {integrity: sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@rolldown/binding-android-arm64@1.2.6': - resolution: {integrity: sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==} + '@rolldown/binding-android-arm64@1.2.7': + resolution: {integrity: sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.2.6': - resolution: {integrity: sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==} + '@rolldown/binding-darwin-arm64@1.2.7': + resolution: {integrity: sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.6': - resolution: {integrity: sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==} + '@rolldown/binding-darwin-x64@1.2.7': + resolution: {integrity: sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.2.6': - resolution: {integrity: sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==} + '@rolldown/binding-freebsd-x64@1.2.7': + resolution: {integrity: sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.2.6': - resolution: {integrity: sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.7': + resolution: {integrity: sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.2.6': - resolution: {integrity: sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==} + '@rolldown/binding-linux-arm64-gnu@1.2.7': + resolution: {integrity: sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.2.6': - resolution: {integrity: sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==} + '@rolldown/binding-linux-arm64-musl@1.2.7': + resolution: {integrity: sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.6': - resolution: {integrity: sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==} + '@rolldown/binding-linux-ppc64-gnu@1.2.7': + resolution: {integrity: sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.6': - resolution: {integrity: sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==} + '@rolldown/binding-linux-s390x-gnu@1.2.7': + resolution: {integrity: sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.6': - resolution: {integrity: sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==} + '@rolldown/binding-linux-x64-gnu@1.2.7': + resolution: {integrity: sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.2.6': - resolution: {integrity: sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==} + '@rolldown/binding-linux-x64-musl@1.2.7': + resolution: {integrity: sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.2.6': - resolution: {integrity: sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==} + '@rolldown/binding-openharmony-arm64@1.2.7': + resolution: {integrity: sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-win32-arm64-msvc@1.2.6': - resolution: {integrity: sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==} + '@rolldown/binding-win32-arm64-msvc@1.2.7': + resolution: {integrity: sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.6': - resolution: {integrity: sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==} + '@rolldown/binding-win32-x64-msvc@1.2.7': + resolution: {integrity: sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -2718,12 +2721,12 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@supabase/auth-js@2.112.4': - resolution: {integrity: sha512-z8DesgwLzKM5PiT0yNmJU8VJyh1zAhYi+20Z7drdJQLXg/wWW4yGt/un+He5ERYUo94Vz66t5aeyr1DIDemI5A==} + '@supabase/auth-js@2.115.0': + resolution: {integrity: sha512-YNQlQWm1H0gsXHSY8Jd/xepBhjO0Zhwx04iW17A83/joQ5kFiUin6iPj9s9kZZvupnwLjXVP/diTFiLz2jUbwQ==} engines: {node: '>=22.0.0'} - '@supabase/functions-js@2.112.4': - resolution: {integrity: sha512-DQ0aVH8wSQAccVqNoEkec62qCu2QRNyoGN53RqsVZ1k6F1zq4/v8scrlR6LNT2RJmT97apiTmORijPVhErCS2g==} + '@supabase/functions-js@2.115.0': + resolution: {integrity: sha512-p97V6/YFcdp+zblFDVJaE8f9rGKTNz0PRzyJ2d1w/EYIU5lwidKuc3l/wM+u27ACmAC62albvoGiUGzLPSg7Aw==} engines: {node: '>=22.0.0'} '@supabase/pg-delta@1.0.0-alpha.49': @@ -2742,20 +2745,20 @@ packages: '@supabase/phoenix@0.4.5': resolution: {integrity: sha512-aAn9H9ovVyeApKy11OWOrrOGq8DV68yWeH4ud2lN9fzn4aO8Zb5GLL9m1pUg9nLqIcT+ZDfAcsZe0E/nqdv2lw==} - '@supabase/postgrest-js@2.112.4': - resolution: {integrity: sha512-uaubtPSeg2TR4wrtfQoQWgkTAe+a0qWX2KhmwvTfNl5mGN9+U7owiJt6abk3o/V6O899PSRD1yzxs5RlF4xTug==} + '@supabase/postgrest-js@2.115.0': + resolution: {integrity: sha512-DdERcurLh5t84pgSywDg2LjLR5le7XAzl52/iQhC7FdboWDqGfDPMfaWJV3MHvhyxSlSNzbpSQG+RiQOBSn/4w==} engines: {node: '>=22.0.0'} - '@supabase/realtime-js@2.112.4': - resolution: {integrity: sha512-vZ+j079SKrM0Xiq7MJCvQKLDpaH2kfKfLY68xuQE1sqsCsMmx1CyrDBJHsxZ3cX01VOs5SI9igmoZAF3BmdZxw==} + '@supabase/realtime-js@2.115.0': + resolution: {integrity: sha512-5HyBkvlA/IUV2v8jX3uLTdy15jmTPRVXwXKoxvH2SKw5jZMNURxCxt+VpCEukscXQlY7pUpH8Cy4NH6io4iaRw==} engines: {node: '>=22.0.0'} - '@supabase/storage-js@2.112.4': - resolution: {integrity: sha512-lQ0JemuTlMIXVKgSci1qez8yPnM5hyDngeAfEBjZS2Om4D+Cus0EE5BE6glFobrxdyii1OF4UzWfF0zcQgDq5A==} + '@supabase/storage-js@2.115.0': + resolution: {integrity: sha512-dLyIxzbO+MCcKHhcce8rVUCQX1iyqXqQ8ytgkOVYJ7D+Zp0qKylPtQH3hamgxrGSxtDjaw47Urpzw2iK9PsKdA==} engines: {node: '>=22.0.0'} - '@supabase/supabase-js@2.112.4': - resolution: {integrity: sha512-UiCX1udlFY1fQQrO7Z3GU7obQsju0w5Vk9mOOwalfo/+Gy+tahWVenSSuu5E/GTy/q//HxvGv2IrCdW66/61kw==} + '@supabase/supabase-js@2.115.0': + resolution: {integrity: sha512-PYJSxtCo37R7tTZW6pAqsxUeSx/dlhA7zn8RzKEUSCqyTxCUhG+iHrDTb04UyVBYbttaUbhwkNTvb8h5HW+uZA==} engines: {node: '>=22.0.0'} peerDependencies: '@opentelemetry/api': '>=1.0.0' @@ -2802,8 +2805,8 @@ packages: '@tybys/wasm-util@0.10.3': resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} - '@types/bun@1.4.0': - resolution: {integrity: sha512-K+lZULY23vRgK/CfTjFIV+tyifaNdSMlPh9j+6mQ/cLfpOznLyAuzgV/JQysyECpkBQLVMSyvjlr2fBUSA9wFQ==} + '@types/bun@1.4.1': + resolution: {integrity: sha512-0AVGiTXGajf1rgKom3N+c5L7CBxuoyyv1i44M0nX4UDK0G/fnRAMiri93nHuVPIb429KKtAgj7HatVmmOjeQLA==} '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -2850,8 +2853,8 @@ packages: '@types/pg@8.23.1': resolution: {integrity: sha512-fKVHpikPdg4GKks3JuLEhvwSyvwzF23hnabPy6DD8ljVbC7+6J5dQzdv4arV6jqq57djnMgs1HKBxX4P8aBI3A==} - '@types/react-dom@19.2.5': - resolution: {integrity: sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==} + '@types/react-dom@19.2.7': + resolution: {integrity: sha512-I8bPpDLcHBv1qiIiXDCy71Rt8eQDKJP0sMSWJphDdAcdqiJ1sGpZamavoEIRZmYzjia9LuEb2HlYdDpmoENpvQ==} peerDependencies: '@types/react': ^19.2.0 @@ -3058,23 +3061,13 @@ packages: resolution: {integrity: sha512-Up/Dz+bWt+658cq9wdrC5qZrMxQx1FHlfivJJdlzJiS95kaiMqUFaT7NOoYWp7fhkbPYmLXgXdfsTW/NdZuCTA==} engines: {node: '>=22'} - '@verdaccio/ui-theme@9.0.0-next-9.28': - resolution: {integrity: sha512-VVI4dhEsQnHa1cikKHATZAuhbldu/qkrng0VSeoDe9ylyvcNOaQGQWWVxMEmpOAr0EO4R49O448eP9o4Vf4kGQ==} + '@verdaccio/ui-theme@9.0.0-next-9.30': + resolution: {integrity: sha512-DAiX4tb9QLKrrXSiIm5HpUZbI3TqyELc4eVJCuF9aKLVJE2kX7D617XG/Vp5LwCOBndktlSltFBiSBM8OPuq1g==} '@verdaccio/url@13.1.3': resolution: {integrity: sha512-NansR8Pnp42DGTmuqU+hS14y+AESO6kACuD26oRsRFi6ngvX3WsNHnsSrH4sCdBCzOAQ06jgk7GAwn361eFnEg==} engines: {node: '>=22'} - '@vitest/coverage-v8@4.1.11': - resolution: {integrity: sha512-8MVGEFnJIcdGjcbfKmeq8z0pZHH0JlVtoVZH9Q/qwUp6wyFnEJUBMrw9DCaj+ra3vShGmhavjalMIhPNxZAUcw==} - peerDependencies: - '@vitest/browser': 4.1.11 - vite: '*' - vitest: 4.1.11 - peerDependenciesMeta: - '@vitest/browser': - optional: true - '@vitest/coverage-v8@5.0.0': resolution: {integrity: sha512-toMg6PZGCIa/lQNCDoASrfb1ly4hsUKXFtFYC9kD4t78o5Y6LyNJU7AENt8eHPr3quYdxaxK7hj2mnbFfUk9NA==} peerDependencies: @@ -3378,14 +3371,14 @@ packages: bare-events: optional: true - bare-url@2.5.3: - resolution: {integrity: sha512-3absfEzoyFosWT8v83ZcJgbTJxv+S/sI7jBfeCMlUVatSaefRmwweqBhFpMllQv+HTxs/FbbToVOw1c05NORkQ==} + bare-url@2.5.4: + resolution: {integrity: sha512-Gxa7UVWBr0/edU1b+TJhn/AZvMQUj9OGspvYsaTYQrAbZA4BOTZGL3LiZxvD+CeMlDH4juwD84+eTAp/bLYW5g==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.11.20: - resolution: {integrity: sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==} + baseline-browser-mapping@2.11.21: + resolution: {integrity: sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -3429,8 +3422,8 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bun-types@1.4.0: - resolution: {integrity: sha512-iIKw23BspnQQYd3prITOBxeUsxBHnwzX6YJfGMuNOZzeNcMmVqzIIVGRm1l69ogaPQmb4wB6BN8mA5bE9YuC5Q==} + bun-types@1.4.1: + resolution: {integrity: sha512-loKuVrAFZKfEv+JvWkHRS9GW5IqLuLRjVXN9p+vZvBN86O5hf/pBZQ5hSoyipsrMmWObZBDvWnlmKvjKTM0PdA==} byte-counter@0.1.0: resolution: {integrity: sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==} @@ -3552,8 +3545,9 @@ packages: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} - cnfast@0.1.0: - resolution: {integrity: sha512-rH0jBKeLkVrK7NsZ5Ba2l7WdMBmm1k0FMpABeXUU1PgTUxbz3261gEuCSsrYuXo4BwAe3yCcIbQ93YyS52lOGQ==} + cn@0.2.5: + resolution: {integrity: sha512-OCjZtMeQfXbI4Es1+EIjkd77gvWzaE689gD8KhfexlqjClC06qR1MQBR+Z35ZMSPNEBWyHiItW1Soy0UvwNv9w==} + engines: {node: '>=20'} hasBin: true collapse-white-space@2.1.0: @@ -3814,8 +3808,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - effect@4.0.0-rc.113: - resolution: {integrity: sha512-uZ4Bh7KSlw2sdVdNDHPLSNjLGH+MWap7cheIHZoB/1T/ZJ3pvI4KiN3kUp50MpFKXhygOMmReJJOwWMQPwpPAg==} + effect@4.0.0-rc.115: + resolution: {integrity: sha512-ogYulZ5ffeOzrJqQrG0XOkDO5lKn2s9KNHhoxJy/6wKUkF0i12dlVXWA9TgsgQ+zV/JzizyG0+XMPepZEQX6vw==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -4007,8 +4001,8 @@ packages: fast-string-width@3.0.2: resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fast-uri@3.1.6: - resolution: {integrity: sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==} + fast-uri@3.1.7: + resolution: {integrity: sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==} fast-wrap-ansi@0.2.2: resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} @@ -4076,8 +4070,8 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - framer-motion@13.1.1: - resolution: {integrity: sha512-B/xn2TPS4f61cEBLFjiYlQFnBZUW1YVj/LM+C+N4OP8Rs95VLEI2ot/RlfBg111la/EiyECFaJJi/A3FWA8MUA==} + framer-motion@13.2.0: + resolution: {integrity: sha512-9E33ebgMaO33w1nN/jEdW8z3/GO483fMi4rqbMG9rt83XgW9QLKRe4NcmJ8s+fQ3O34++UHrIQwlIWGIWTITjA==} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 @@ -4104,8 +4098,8 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - fumadocs-core@16.15.4: - resolution: {integrity: sha512-kdOuM0tvHkLWajnDu73BmtryPuUq4xsu610ssl1YMAm9fYF7BRmvYxx2apHbyf2Lt+7w8OEiWDTmB8Ja3zqp4Q==} + fumadocs-core@16.15.7: + resolution: {integrity: sha512-EPr2Hckmm2yNV2GUGDDAkCOPeNc7fBworWXnurKWfMEomvT9C/oiy1Fm0wVORDGrvDn5RQcOYKFpAfRy13jIjg==} peerDependencies: '@mdx-js/mdx': '*' '@mixedbread/sdk': 0.x.x @@ -4200,12 +4194,12 @@ packages: vite: optional: true - fumadocs-ui@16.15.4: - resolution: {integrity: sha512-MWtQyrTEEaxop7z8TPKTuBs3xMqxW32Sr9wBlbiPAm+MxmeOSU+bfRThrOJSAgvpXo99bbx3hxhNij0441pH8g==} + fumadocs-ui@16.15.7: + resolution: {integrity: sha512-O+nPcqAOGl+7PKK7grM9keTzhMdM50fLGN1vDMBqEw7k9UBegOQgSLG3OAo5LGbDbrpcFP6bgspaHpsqfSpJtQ==} peerDependencies: '@types/mdx': '*' '@types/react': '*' - fumadocs-core: 16.15.4 + fumadocs-core: 16.15.7 next: 16.x.x react: ^19.2.0 react-dom: ^19.2.0 @@ -4360,8 +4354,8 @@ packages: highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - hono@4.13.5: - resolution: {integrity: sha512-O6+/eCYRkzzzy0rPWwKLiGBR1nFuUPZynnwjxN1MBA62NNqbT0wQEzQyK2gSO5yDIDB336sXQleAhOHrzlYyKw==} + hono@4.13.7: + resolution: {integrity: sha512-c8/gF9ac8Y78/agExVocyLevgR+JlpNB444Py0FSX8pJoPdYUfUzRcXtYEYGwt6l19qIlVZPN5Mfsw9jFShmQQ==} engines: {node: '>=16.9.0'} hook-std@4.0.0: @@ -4376,9 +4370,6 @@ packages: resolution: {integrity: sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==} engines: {node: ^20.17.0 || >=22.9.0} - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -4564,18 +4555,6 @@ packages: resolution: {integrity: sha512-7atWPjhGEIX3JEtMrOYd8TKzboYlq+5sNbdl9POiLYOI14G5HZiQbZP0Xj5EZdrufQVXfJlpTV0hys0CuxwxZw==} engines: {node: ^18.17 || >=20.6.1} - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-reports@3.2.0: - resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} - engines: {node: '>=8'} - java-properties@1.0.2: resolution: {integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==} engines: {node: '>= 0.6.0'} @@ -4588,8 +4567,8 @@ packages: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true - jose@6.2.10: - resolution: {integrity: sha512-iiW7J9qRFlGxvCOIBDBDxFePQSn7ZMAnrYGhrrOo6siO/MIqwfyilLR27pkfDgUk+raLuzADS8A3S/KLBisc0g==} + jose@6.2.11: + resolution: {integrity: sha512-A5NPn7g8EAzGU3IzRs+Yiq8K5n3ypYS75M5+KKiVHdUexfpWK1kP4ZMq7QnTGDoMj6TJ1dtcEJjW60yZDXS4hg==} js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} @@ -4820,8 +4799,8 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - lucide-react@1.39.0: - resolution: {integrity: sha512-y8nXoEwvqqIsF927NBWXODa4bfMrcUeEb/9sgpwFqg0gUjgn3j5Hznk+v7STmPgZ2iQ11JKlbQGdFRuTOwvYkA==} + lucide-react@1.41.0: + resolution: {integrity: sha512-6lksP35l6KszDKUeRTi4LV7i6DEe0Yzl2ALJm9j4c5xEYN91GdW1xGsawGMOg2mgjF5GHBVX8pKX9kP+cWsP3Q==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -4838,10 +4817,6 @@ packages: resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} engines: {node: '>=18'} - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} @@ -5102,14 +5077,14 @@ packages: engines: {node: '>=10'} hasBin: true - motion-dom@13.1.1: - resolution: {integrity: sha512-XSf8VYWSB6G/0IY3rWVbyLcxWXtAVHkN1PQE2agTaCv3u8RGvbwu56TyyR/MNzBqqNavEBTZzErcxI1TxBrjcA==} + motion-dom@13.2.0: + resolution: {integrity: sha512-N6gdSoWRDk0Rh/fVtlqUtLs+fEN3ELFZI3cn3IQE9Mnf3E+Mh8wjO6MstzCOPFh4Yf0L1as5m2eUyYWj8ylVSQ==} motion-utils@13.0.0: resolution: {integrity: sha512-7DnN7TmbLcYXcG4RVadXIihWlyuM9afoUww8Y5Agg431kGKiuL2/OMyP4mJ5wLz+pvN3t5ySClLOaVXJ+wekRQ==} - motion@13.1.1: - resolution: {integrity: sha512-WNZoK6xiF+kkTqkZ5K7FDDh6A8BG4i5Hc7KXtW8gtTxkpJFds+hIOrDaQGKjQj/AE/i4hJqAaUHEqp/Qo02y6Q==} + motion@13.2.0: + resolution: {integrity: sha512-4Hrb5vD6HhjFstLUiCmWvtpsw+WTpP4R+QXfSDYZBz7+uxE/LrRg3aV0ReJxHrTRffHhbIE6svEqnotngXvesQ==} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 @@ -5588,8 +5563,8 @@ packages: resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.26: - resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + postcss@8.5.28: + resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -5876,8 +5851,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rolldown@1.2.6: - resolution: {integrity: sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==} + rolldown@1.2.7: + resolution: {integrity: sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -6213,8 +6188,8 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.3.0: - resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} engines: {node: '>=18'} tinyglobby@0.2.17: @@ -6342,12 +6317,12 @@ packages: undici-types@8.3.0: resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} - undici@6.28.0: - resolution: {integrity: sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==} + undici@6.28.1: + resolution: {integrity: sha512-zWpdTVD54H48CIybL0rWQ3ukpb9d23wM7eH5RtfdmeP70cWHNjtfo7P4vZX+5CoDcO53J4Pu5uXp7lNfjc6DRA==} engines: {node: '>=18.17'} - undici@7.29.0: - resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} + undici@7.29.1: + resolution: {integrity: sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==} engines: {node: '>=20.18.1'} undici@8.10.2: @@ -6465,8 +6440,8 @@ packages: resolution: {integrity: sha512-q2od2foCPblMasnUdKPLcNYXN5iXW0Q9Imh58qTpNsvCeYGtlfMqyC+aO+/0wtTGkD+H+mWfbqtb/8G9TMc0DQ==} engines: {node: '>=22'} - verdaccio@6.10.1: - resolution: {integrity: sha512-pcZOrQ44P76y3UrS0S7CiQkHJaA9v5vOQ79zFv0FyQyGpCMvmnBDAeed/iGJZQo/qW38hSqrJizOWBXqC8LqBg==} + verdaccio@6.10.2: + resolution: {integrity: sha512-avuvgx9EN9PQUg33e0ea+ltTs6CKffJVjS0h2odtULgIrHMqCdb7DHN6hg3qBou7OFdPiJG3sgtCc5VcrYj85A==} engines: {node: '>=22'} hasBin: true @@ -6687,48 +6662,48 @@ snapshots: '@actions/http-client@4.0.1': dependencies: tunnel: 0.0.6 - undici: 6.28.0 + undici: 6.28.1 '@actions/io@3.0.2': {} - '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.257': + '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.261': optional: true - '@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.257': + '@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.261': optional: true - '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.257': + '@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.261': optional: true - '@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.257': + '@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.261': optional: true - '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.257': + '@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.261': optional: true - '@anthropic-ai/claude-agent-sdk-linux-x64@0.3.257': + '@anthropic-ai/claude-agent-sdk-linux-x64@0.3.261': optional: true - '@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.257': + '@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.261': optional: true - '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.257': + '@anthropic-ai/claude-agent-sdk-win32-x64@0.3.261': optional: true - '@anthropic-ai/claude-agent-sdk@0.3.257(@anthropic-ai/sdk@0.120.0(zod@4.5.4))(@modelcontextprotocol/sdk@1.30.0(supports-color@7.2.0)(zod@4.5.4))(zod@4.5.4)': + '@anthropic-ai/claude-agent-sdk@0.3.261(@anthropic-ai/sdk@0.120.0(zod@4.5.4))(@modelcontextprotocol/sdk@1.30.0(supports-color@7.2.0)(zod@4.5.4))(zod@4.5.4)': dependencies: '@anthropic-ai/sdk': 0.120.0(zod@4.5.4) '@modelcontextprotocol/sdk': 1.30.0(supports-color@7.2.0)(zod@4.5.4) zod: 4.5.4 optionalDependencies: - '@anthropic-ai/claude-agent-sdk-darwin-arm64': 0.3.257 - '@anthropic-ai/claude-agent-sdk-darwin-x64': 0.3.257 - '@anthropic-ai/claude-agent-sdk-linux-arm64': 0.3.257 - '@anthropic-ai/claude-agent-sdk-linux-arm64-musl': 0.3.257 - '@anthropic-ai/claude-agent-sdk-linux-x64': 0.3.257 - '@anthropic-ai/claude-agent-sdk-linux-x64-musl': 0.3.257 - '@anthropic-ai/claude-agent-sdk-win32-arm64': 0.3.257 - '@anthropic-ai/claude-agent-sdk-win32-x64': 0.3.257 + '@anthropic-ai/claude-agent-sdk-darwin-arm64': 0.3.261 + '@anthropic-ai/claude-agent-sdk-darwin-x64': 0.3.261 + '@anthropic-ai/claude-agent-sdk-linux-arm64': 0.3.261 + '@anthropic-ai/claude-agent-sdk-linux-arm64-musl': 0.3.261 + '@anthropic-ai/claude-agent-sdk-linux-x64': 0.3.261 + '@anthropic-ai/claude-agent-sdk-linux-x64-musl': 0.3.261 + '@anthropic-ai/claude-agent-sdk-win32-arm64': 0.3.261 + '@anthropic-ai/claude-agent-sdk-win32-x64': 0.3.261 '@anthropic-ai/sdk@0.120.0(zod@4.5.4)': dependencies: @@ -6816,7 +6791,7 @@ snapshots: '@commitlint/load': 21.2.2(@types/node@26.4.1)(typescript@7.0.2) '@commitlint/read': 21.2.1(conventional-commits-parser@7.1.2) '@commitlint/types': 21.2.0 - tinyexec: 1.3.0 + tinyexec: 1.3.1 yargs: 18.1.0 transitivePeerDependencies: - '@types/node' @@ -6886,7 +6861,7 @@ snapshots: '@commitlint/top-level': 21.2.0 '@commitlint/types': 21.2.0 '@conventional-changelog/git-client': 3.1.2(conventional-commits-parser@7.1.2) - tinyexec: 1.3.0 + tinyexec: 1.3.1 transitivePeerDependencies: - conventional-commits-filter - conventional-commits-parser @@ -6951,36 +6926,36 @@ snapshots: dependencies: '@noble/ciphers': 1.3.0 - '@effect/platform-bun@4.0.0-rc.113(effect@4.0.0-rc.113)': + '@effect/platform-bun@4.0.0-rc.115(effect@4.0.0-rc.115)': dependencies: - '@effect/platform-node-shared': 4.0.0-rc.113(effect@4.0.0-rc.113) - effect: 4.0.0-rc.113 + '@effect/platform-node-shared': 4.0.0-rc.115(effect@4.0.0-rc.115) + effect: 4.0.0-rc.115 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node-shared@4.0.0-rc.113(effect@4.0.0-rc.113)': + '@effect/platform-node-shared@4.0.0-rc.115(effect@4.0.0-rc.115)': dependencies: '@types/ws': 8.18.1 - effect: 4.0.0-rc.113 + effect: 4.0.0-rc.115 ws: 8.21.3 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node@4.0.0-rc.113(effect@4.0.0-rc.113)(redis@6.2.1)': + '@effect/platform-node@4.0.0-rc.115(effect@4.0.0-rc.115)(redis@6.2.1)': dependencies: - '@effect/platform-node-shared': 4.0.0-rc.113(effect@4.0.0-rc.113) - effect: 4.0.0-rc.113 + '@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 undici: 8.10.2 transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/sql-pg@4.0.0-rc.112(effect@4.0.0-rc.113)': + '@effect/sql-pg@4.0.0-rc.112(effect@4.0.0-rc.115)': dependencies: - effect: 4.0.0-rc.113 + effect: 4.0.0-rc.115 pg: 8.23.0 pg-connection-string: 2.14.0 pg-cursor: 2.22.0(pg@8.23.0) @@ -7020,9 +6995,9 @@ snapshots: '@effect/tsgo-win32-arm64': 0.37.0 '@effect/tsgo-win32-x64': 0.37.0 - '@effect/vitest@4.0.0-rc.113(effect@4.0.0-rc.113)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11)': + '@effect/vitest@4.0.0-rc.115(effect@4.0.0-rc.115)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11)': dependencies: - effect: 4.0.0-rc.113 + effect: 4.0.0-rc.115 vite: 8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) vitest: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@5.0.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) @@ -7153,9 +7128,9 @@ snapshots: '@fumari/image-size@0.1.0': {} - '@hono/node-server@2.1.1(hono@4.13.5)': + '@hono/node-server@2.1.1(hono@4.13.7)': dependencies: - hono: 4.13.5 + hono: 4.13.7 '@img/colour@1.1.0': optional: true @@ -7332,7 +7307,7 @@ snapshots: '@modelcontextprotocol/sdk@1.30.0(supports-color@7.2.0)(zod@4.5.4)': dependencies: - '@hono/node-server': 2.1.1(hono@4.13.5) + '@hono/node-server': 2.1.1(hono@4.13.7) ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) content-type: 1.0.5 @@ -7342,8 +7317,8 @@ snapshots: eventsource-parser: 3.1.1 express: 5.2.1(supports-color@7.2.0) express-rate-limit: 8.7.0(express@5.2.1(supports-color@7.2.0))(supports-color@7.2.0) - hono: 4.13.5 - jose: 6.2.10 + hono: 4.13.7 + jose: 6.2.11 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 raw-body: 3.0.2 @@ -7587,6 +7562,8 @@ snapshots: '@oxc-project/types@0.147.0': {} + '@oxc-project/types@0.148.0': {} + '@oxc-resolver/binding-android-arm-eabi@11.24.2': optional: true @@ -7833,11 +7810,11 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@posthog/core@1.50.2': + '@posthog/core@1.50.5': dependencies: - '@posthog/types': 1.407.1 + '@posthog/types': 1.409.0 - '@posthog/types@1.407.1': {} + '@posthog/types@1.409.0': {} '@protobufjs/aspromise@1.1.2': {} @@ -7865,59 +7842,59 @@ snapshots: '@radix-ui/primitive@1.1.7': {} - '@radix-ui/react-accordion@1.2.20(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-accordion@1.2.20(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-collapsible': 1.1.20(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-collapsible': 1.1.20(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-arrow@1.1.15(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-arrow@1.1.15(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-collapsible@1.1.20(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-collapsible@1.1.20(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/primitive': 1.1.7 '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-collection@1.1.15(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-collection@1.1.15(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) '@radix-ui/react-compose-refs@1.1.5(@types/react@19.2.18)(react@19.2.8)': dependencies: @@ -7931,18 +7908,18 @@ snapshots: optionalDependencies: '@types/react': 19.2.18 - '@radix-ui/react-dialog@1.1.23(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-dialog@1.1.23(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/primitive': 1.1.7 '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) @@ -7952,7 +7929,7 @@ snapshots: react-remove-scroll: 2.7.2(@types/react@19.2.18)(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) '@radix-ui/react-direction@1.1.4(@types/react@19.2.18)(react@19.2.8)': dependencies: @@ -7960,18 +7937,18 @@ snapshots: optionalDependencies: '@types/react': 19.2.18 - '@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/primitive': 1.1.7 '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.18)(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) '@radix-ui/react-focus-guards@1.1.6(@types/react@19.2.18)(react@19.2.8)': dependencies: @@ -7979,16 +7956,16 @@ snapshots: optionalDependencies: '@types/react': 19.2.18 - '@radix-ui/react-focus-scope@1.1.16(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-focus-scope@1.1.16(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) '@radix-ui/react-id@1.1.4(@types/react@19.2.18)(react@19.2.8)': dependencies: @@ -7997,41 +7974,41 @@ snapshots: optionalDependencies: '@types/react': 19.2.18 - '@radix-ui/react-navigation-menu@1.2.22(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-navigation-menu@1.2.22(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-use-previous': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-visually-hidden': 1.2.11(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-popover@1.1.23(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-popover@1.1.23(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/primitive': 1.1.7 '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-popper': 1.3.7(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) aria-hidden: 1.2.6 @@ -8040,15 +8017,15 @@ snapshots: react-remove-scroll: 2.7.2(@types/react@19.2.18)(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-popper@1.3.7(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-popper@1.3.7(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@floating-ui/react-dom': 2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-arrow': 1.1.15(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-arrow': 1.1.15(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-use-rect': 1.1.4(@types/react@19.2.18)(react@19.2.8) @@ -8058,45 +8035,45 @@ snapshots: react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-portal@1.1.17(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-portal@1.1.17(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-presence@1.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-presence@1.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-primitive@2.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-primitive@2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-roving-focus@1.1.19(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-roving-focus@1.1.19(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.2.18)(react@19.2.8) @@ -8105,24 +8082,24 @@ snapshots: react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-scroll-area@1.2.18(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-scroll-area@1.2.18(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/number': 1.1.3 '@radix-ui/primitive': 1.1.7 '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) '@radix-ui/react-slot@1.3.3(@types/react@19.2.18)(react@19.2.8)': dependencies: @@ -8131,21 +8108,21 @@ snapshots: optionalDependencies: '@types/react': 19.2.18 - '@radix-ui/react-tabs@1.1.21(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-tabs@1.1.21(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/primitive': 1.1.7 '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) '@radix-ui/react-use-callback-ref@1.1.4(@types/react@19.2.18)(react@19.2.8)': dependencies: @@ -8201,14 +8178,14 @@ snapshots: optionalDependencies: '@types/react': 19.2.18 - '@radix-ui/react-visually-hidden@1.2.11(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@radix-ui/react-visually-hidden@1.2.11(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - '@types/react-dom': 19.2.5(@types/react@19.2.18) + '@types/react-dom': 19.2.7(@types/react@19.2.18) '@radix-ui/rect@1.1.3': {} @@ -8232,49 +8209,49 @@ snapshots: dependencies: '@redis/client': 6.2.1 - '@rolldown/binding-android-arm-eabi@1.2.6': + '@rolldown/binding-android-arm-eabi@1.2.7': optional: true - '@rolldown/binding-android-arm64@1.2.6': + '@rolldown/binding-android-arm64@1.2.7': optional: true - '@rolldown/binding-darwin-arm64@1.2.6': + '@rolldown/binding-darwin-arm64@1.2.7': optional: true - '@rolldown/binding-darwin-x64@1.2.6': + '@rolldown/binding-darwin-x64@1.2.7': optional: true - '@rolldown/binding-freebsd-x64@1.2.6': + '@rolldown/binding-freebsd-x64@1.2.7': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.6': + '@rolldown/binding-linux-arm-gnueabihf@1.2.7': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.6': + '@rolldown/binding-linux-arm64-gnu@1.2.7': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.6': + '@rolldown/binding-linux-arm64-musl@1.2.7': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.6': + '@rolldown/binding-linux-ppc64-gnu@1.2.7': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.6': + '@rolldown/binding-linux-s390x-gnu@1.2.7': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.6': + '@rolldown/binding-linux-x64-gnu@1.2.7': optional: true - '@rolldown/binding-linux-x64-musl@1.2.6': + '@rolldown/binding-linux-x64-musl@1.2.7': optional: true - '@rolldown/binding-openharmony-arm64@1.2.6': + '@rolldown/binding-openharmony-arm64@1.2.7': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.6': + '@rolldown/binding-win32-arm64-msvc@1.2.7': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.6': + '@rolldown/binding-win32-x64-msvc@1.2.7': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -8315,7 +8292,7 @@ snapshots: p-filter: 4.1.0 semantic-release: 25.0.9(supports-color@7.2.0)(typescript@7.0.2) tinyglobby: 0.2.17 - undici: 7.29.0 + undici: 7.29.1 url-join: 5.0.0 transitivePeerDependencies: - kerberos @@ -8412,11 +8389,11 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@supabase/auth-js@2.112.4': + '@supabase/auth-js@2.115.0': dependencies: tslib: 2.8.1 - '@supabase/functions-js@2.112.4': + '@supabase/functions-js@2.115.0': dependencies: tslib: 2.8.1 @@ -8442,27 +8419,27 @@ snapshots: '@supabase/phoenix@0.4.5': {} - '@supabase/postgrest-js@2.112.4': + '@supabase/postgrest-js@2.115.0': dependencies: tslib: 2.8.1 - '@supabase/realtime-js@2.112.4': + '@supabase/realtime-js@2.115.0': dependencies: '@supabase/phoenix': 0.4.5 tslib: 2.8.1 - '@supabase/storage-js@2.112.4': + '@supabase/storage-js@2.115.0': dependencies: iceberg-js: 0.8.1 tslib: 2.8.1 - '@supabase/supabase-js@2.112.4': + '@supabase/supabase-js@2.115.0': dependencies: - '@supabase/auth-js': 2.112.4 - '@supabase/functions-js': 2.112.4 - '@supabase/postgrest-js': 2.112.4 - '@supabase/realtime-js': 2.112.4 - '@supabase/storage-js': 2.112.4 + '@supabase/auth-js': 2.115.0 + '@supabase/functions-js': 2.115.0 + '@supabase/postgrest-js': 2.115.0 + '@supabase/realtime-js': 2.115.0 + '@supabase/storage-js': 2.115.0 '@swc/helpers@0.5.23': dependencies: @@ -8493,9 +8470,9 @@ snapshots: tslib: 2.8.1 optional: true - '@types/bun@1.4.0': + '@types/bun@1.4.1': dependencies: - bun-types: 1.4.0 + bun-types: 1.4.1 '@types/chai@5.2.3': dependencies: @@ -8549,7 +8526,7 @@ snapshots: pg-protocol: 1.16.0 pg-types: 2.2.0 - '@types/react-dom@19.2.5(@types/react@19.2.18)': + '@types/react-dom@19.2.7(@types/react@19.2.18)': dependencies: '@types/react': 19.2.18 @@ -8773,7 +8750,7 @@ snapshots: - react-native-b4a - supports-color - '@verdaccio/ui-theme@9.0.0-next-9.28(supports-color@7.2.0)': + '@verdaccio/ui-theme@9.0.0-next-9.30(supports-color@7.2.0)': dependencies: debug: 4.4.3(supports-color@7.2.0) transitivePeerDependencies: @@ -8787,22 +8764,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.1.11(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11)': - dependencies: - '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.11 - ast-v8-to-istanbul: 1.0.5 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.2.0 - magicast: 0.5.4 - obug: 2.1.4 - std-env: 4.2.0 - tinyrainbow: 3.1.1 - vite: 8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) - vitest: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@4.1.11)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) - optional: true - '@vitest/coverage-v8@5.0.0(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11)': dependencies: '@bcoe/v8-coverage': 1.0.2 @@ -8946,7 +8907,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.6 + fast-uri: 3.1.7 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -9027,7 +8988,7 @@ snapshots: bare-events: 2.9.2 bare-path: 3.1.2 bare-stream: 2.13.4(bare-events@2.9.2) - bare-url: 2.5.3 + bare-url: 2.5.4 fast-fifo: 1.3.2 transitivePeerDependencies: - bare-abort-controller @@ -9045,13 +9006,13 @@ snapshots: transitivePeerDependencies: - react-native-b4a - bare-url@2.5.3: + bare-url@2.5.4: dependencies: bare-path: 3.1.2 base64-js@1.5.1: {} - baseline-browser-mapping@2.11.20: {} + baseline-browser-mapping@2.11.21: {} bcrypt-pbkdf@1.0.2: dependencies: @@ -9115,7 +9076,7 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bun-types@1.4.0: + bun-types@1.4.1: dependencies: '@types/node': 26.4.1 undici-types: 8.3.0 @@ -9232,7 +9193,7 @@ snapshots: cluster-key-slot@1.1.2: {} - cnfast@0.1.0: {} + cn@0.2.5: {} collapse-white-space@2.1.0: {} @@ -9468,7 +9429,7 @@ snapshots: ee-first@1.1.1: {} - effect@4.0.0-rc.113: {} + effect@4.0.0-rc.115: {} emoji-regex@10.6.0: {} @@ -9756,7 +9717,7 @@ snapshots: dependencies: fast-string-truncated-width: 3.0.3 - fast-uri@3.1.6: {} + fast-uri@3.1.7: {} fast-wrap-ansi@0.2.2: dependencies: @@ -9837,9 +9798,9 @@ snapshots: forwarded@0.2.0: {} - framer-motion@13.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + framer-motion@13.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: - motion-dom: 13.1.1 + motion-dom: 13.2.0 motion-utils: 13.0.0 tslib: 2.8.1 optionalDependencies: @@ -9859,7 +9820,7 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@16.15.4(@mdx-js/mdx@3.1.1(supports-color@7.2.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.39.0(react@19.2.8))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@7.2.0)(zod@4.5.4): + fumadocs-core@16.15.7(@mdx-js/mdx@3.1.1(supports-color@7.2.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.41.0(react@19.2.8))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@7.2.0)(zod@4.5.4): dependencies: '@fumari/image-size': 0.1.0 estree-util-value-to-estree: 3.5.0 @@ -9886,7 +9847,7 @@ snapshots: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 '@types/react': 19.2.18 - lucide-react: 1.39.0(react@19.2.8) + lucide-react: 1.41.0(react@19.2.8) next: 16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) @@ -9894,20 +9855,20 @@ snapshots: transitivePeerDependencies: - supports-color - fumadocs-mdx@15.4.0(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.18)(fumadocs-core@16.15.4(@mdx-js/mdx@3.1.1(supports-color@7.2.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.39.0(react@19.2.8))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@7.2.0)(zod@4.5.4))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(rolldown@1.2.6)(supports-color@7.2.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)): + fumadocs-mdx@15.4.0(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.18)(fumadocs-core@16.15.7(@mdx-js/mdx@3.1.1(supports-color@7.2.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.41.0(react@19.2.8))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@7.2.0)(zod@4.5.4))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(rolldown@1.2.7)(supports-color@7.2.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)): dependencies: '@mdx-js/mdx': 3.1.1(supports-color@7.2.0) '@standard-schema/spec': 1.1.0 chokidar: 5.0.0 esbuild: 0.28.2 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.15.4(@mdx-js/mdx@3.1.1(supports-color@7.2.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.39.0(react@19.2.8))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@7.2.0)(zod@4.5.4) + fumadocs-core: 16.15.7(@mdx-js/mdx@3.1.1(supports-color@7.2.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.41.0(react@19.2.8))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@7.2.0)(zod@4.5.4) github-slugger: 2.0.0 magic-string: 1.2.3 mdast-util-mdx: 3.0.0(supports-color@7.2.0) picocolors: 1.1.1 picomatch: 4.0.7 - tinyexec: 1.3.0 + tinyexec: 1.3.1 tinyglobby: 0.2.17 unified: 11.0.5 unist-util-remove-position: 5.0.0 @@ -9922,30 +9883,30 @@ snapshots: '@types/react': 19.2.18 next: 16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 - rolldown: 1.2.6 + rolldown: 1.2.7 vite: 8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color - fumadocs-ui@16.15.4(@types/mdx@2.0.14)(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(fumadocs-core@16.15.4(@mdx-js/mdx@3.1.1(supports-color@7.2.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.39.0(react@19.2.8))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@7.2.0)(zod@4.5.4))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + fumadocs-ui@16.15.7(@types/mdx@2.0.14)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(fumadocs-core@16.15.7(@mdx-js/mdx@3.1.1(supports-color@7.2.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.41.0(react@19.2.8))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@7.2.0)(zod@4.5.4))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: '@fuma-translate/react': 1.0.2(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@fumadocs/tailwind': 0.1.1 - '@radix-ui/react-accordion': 1.2.20(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-collapsible': 1.1.20(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-accordion': 1.2.20(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-collapsible': 1.1.20(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-navigation-menu': 1.2.22(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-popover': 1.1.23(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@radix-ui/react-scroll-area': 1.2.18(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-navigation-menu': 1.2.22(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-popover': 1.1.23(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-scroll-area': 1.2.18(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) - '@radix-ui/react-tabs': 1.1.21(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-tabs': 1.1.21(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) class-variance-authority: 0.7.1 - cnfast: 0.1.0 - fumadocs-core: 16.15.4(@mdx-js/mdx@3.1.1(supports-color@7.2.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.39.0(react@19.2.8))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@7.2.0)(zod@4.5.4) - lucide-react: 1.39.0(react@19.2.8) - motion: 13.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + cn: 0.2.5 + fumadocs-core: 16.15.7(@mdx-js/mdx@3.1.1(supports-color@7.2.0))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.41.0(react@19.2.8))(next@16.3.3(@types/node@26.4.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@7.2.0)(zod@4.5.4) + lucide-react: 1.41.0(react@19.2.8) + motion: 13.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) next-themes: 0.4.6(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) @@ -10200,7 +10161,7 @@ snapshots: highlight.js@10.7.3: {} - hono@4.13.5: {} + hono@4.13.7: {} hook-std@4.0.0: {} @@ -10212,9 +10173,6 @@ snapshots: dependencies: lru-cache: 11.5.2 - html-escaper@2.0.2: - optional: true - html-void-elements@3.0.0: {} http-cache-semantics@4.2.0: {} @@ -10372,29 +10330,13 @@ snapshots: lodash.isstring: 4.0.1 lodash.uniqby: 4.7.0 - istanbul-lib-coverage@3.2.2: - optional: true - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - optional: true - - istanbul-reports@3.2.0: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - optional: true - java-properties@1.0.2: {} jiti@2.6.1: {} jiti@2.7.0: {} - jose@6.2.10: {} + jose@6.2.11: {} js-tokens@10.0.0: {} @@ -10603,7 +10545,7 @@ snapshots: lru-cache@7.18.3: {} - lucide-react@1.39.0(react@19.2.8): + lucide-react@1.41.0(react@19.2.8): dependencies: react: 19.2.8 @@ -10627,11 +10569,6 @@ snapshots: type-fest: 4.41.0 web-worker: 1.5.0 - make-dir@4.0.0: - dependencies: - semver: 7.8.5 - optional: true - markdown-extensions@2.0.0: {} markdown-table@3.0.4: {} @@ -11129,15 +11066,15 @@ snapshots: mkdirp@1.0.4: {} - motion-dom@13.1.1: + motion-dom@13.2.0: dependencies: motion-utils: 13.0.0 motion-utils@13.0.0: {} - motion@13.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + motion@13.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: - framer-motion: 13.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + framer-motion: 13.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) tslib: 2.8.1 optionalDependencies: react: 19.2.8 @@ -11178,7 +11115,7 @@ snapshots: dependencies: '@next/env': 16.3.3 '@swc/helpers': 0.5.23 - baseline-browser-mapping: 2.11.20 + baseline-browser-mapping: 2.11.21 caniuse-lite: 1.0.30001810 postcss: 8.5.23 react: 19.2.8 @@ -11610,7 +11547,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.26: + postcss@8.5.28: dependencies: nanoid: 3.3.18 picocolors: 1.1.1 @@ -11640,7 +11577,7 @@ snapshots: posthog-node@5.51.6: dependencies: - '@posthog/core': 1.50.2 + '@posthog/core': 1.50.5 prettier@3.9.6: {} @@ -11939,26 +11876,26 @@ snapshots: reusify@1.1.0: {} - rolldown@1.2.6: + rolldown@1.2.7: dependencies: - '@oxc-project/types': 0.147.0 + '@oxc-project/types': 0.148.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm-eabi': 1.2.6 - '@rolldown/binding-android-arm64': 1.2.6 - '@rolldown/binding-darwin-arm64': 1.2.6 - '@rolldown/binding-darwin-x64': 1.2.6 - '@rolldown/binding-freebsd-x64': 1.2.6 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.6 - '@rolldown/binding-linux-arm64-gnu': 1.2.6 - '@rolldown/binding-linux-arm64-musl': 1.2.6 - '@rolldown/binding-linux-ppc64-gnu': 1.2.6 - '@rolldown/binding-linux-s390x-gnu': 1.2.6 - '@rolldown/binding-linux-x64-gnu': 1.2.6 - '@rolldown/binding-linux-x64-musl': 1.2.6 - '@rolldown/binding-openharmony-arm64': 1.2.6 - '@rolldown/binding-win32-arm64-msvc': 1.2.6 - '@rolldown/binding-win32-x64-msvc': 1.2.6 + '@rolldown/binding-android-arm-eabi': 1.2.7 + '@rolldown/binding-android-arm64': 1.2.7 + '@rolldown/binding-darwin-arm64': 1.2.7 + '@rolldown/binding-darwin-x64': 1.2.7 + '@rolldown/binding-freebsd-x64': 1.2.7 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.7 + '@rolldown/binding-linux-arm64-gnu': 1.2.7 + '@rolldown/binding-linux-arm64-musl': 1.2.7 + '@rolldown/binding-linux-ppc64-gnu': 1.2.7 + '@rolldown/binding-linux-s390x-gnu': 1.2.7 + '@rolldown/binding-linux-x64-gnu': 1.2.7 + '@rolldown/binding-linux-x64-musl': 1.2.7 + '@rolldown/binding-openharmony-arm64': 1.2.7 + '@rolldown/binding-win32-arm64-msvc': 1.2.7 + '@rolldown/binding-win32-x64-msvc': 1.2.7 router@2.2.0(supports-color@7.2.0): dependencies: @@ -12411,7 +12348,7 @@ snapshots: tinybench@2.9.0: {} - tinyexec@1.3.0: {} + tinyexec@1.3.1: {} tinyglobby@0.2.17: dependencies: @@ -12534,9 +12471,9 @@ snapshots: undici-types@8.3.0: {} - undici@6.28.0: {} + undici@6.28.1: {} - undici@7.29.0: {} + undici@7.29.1: {} undici@8.10.2: {} @@ -12657,7 +12594,7 @@ snapshots: transitivePeerDependencies: - supports-color - verdaccio@6.10.1(supports-color@7.2.0)(typanion@3.14.0): + verdaccio@6.10.2(supports-color@7.2.0)(typanion@3.14.0): dependencies: '@cypress/request': 4.0.1 '@verdaccio/auth': 8.1.3(supports-color@7.2.0) @@ -12673,7 +12610,7 @@ snapshots: '@verdaccio/signature': 8.1.3(supports-color@7.2.0) '@verdaccio/streams': 10.3.0 '@verdaccio/tarball': 13.1.3(supports-color@7.2.0) - '@verdaccio/ui-theme': 9.0.0-next-9.28(supports-color@7.2.0) + '@verdaccio/ui-theme': 9.0.0-next-9.30(supports-color@7.2.0) '@verdaccio/url': 13.1.3(supports-color@7.2.0) JSONStream: 1.3.5 async: 3.2.6 @@ -12722,8 +12659,8 @@ snapshots: dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 - postcss: 8.5.26 - rolldown: 1.2.6 + postcss: 8.5.28 + rolldown: 1.2.7 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 26.4.1 @@ -12732,34 +12669,6 @@ snapshots: jiti: 2.7.0 yaml: 2.9.0 - vitest@4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@4.1.11)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)): - dependencies: - '@vitest/expect': 4.1.11 - '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.11 - '@vitest/runner': 4.1.11 - '@vitest/snapshot': 4.1.11 - '@vitest/spy': 4.1.11 - '@vitest/utils': 4.1.11 - es-module-lexer: 2.3.2 - expect-type: 1.4.0 - magic-string: 0.30.21 - obug: 2.1.4 - pathe: 2.0.3 - picomatch: 4.0.7 - std-env: 4.2.0 - tinybench: 2.9.0 - tinyexec: 1.3.0 - tinyglobby: 0.2.17 - tinyrainbow: 3.1.1 - vite: 8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 26.4.1 - '@vitest/coverage-v8': 4.1.11(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))(vitest@4.1.11) - transitivePeerDependencies: - - msw - vitest@4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@5.0.0)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.11 @@ -12777,7 +12686,7 @@ snapshots: picomatch: 4.0.7 std-env: 4.2.0 tinybench: 2.9.0 - tinyexec: 1.3.0 + tinyexec: 1.3.1 tinyglobby: 0.2.17 tinyrainbow: 3.1.1 vite: 8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ab56e15c32..71598b11cb 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -12,18 +12,18 @@ allowBuilds: sharp: true catalog: - "@effect/platform-bun": "4.0.0-rc.113" - "@effect/platform-node": "4.0.0-rc.113" + "@effect/platform-bun": "4.0.0-rc.115" + "@effect/platform-node": "4.0.0-rc.115" "@effect/sql-pg": "4.0.0-rc.112" "@effect/tsgo": &effect-tsgo-version "0.37.0" - "@effect/vitest": "4.0.0-rc.113" + "@effect/vitest": "4.0.0-rc.115" "@supabase/supabase-js": ^2.110.7 "@tsconfig/bun": "^1.0.11" "@types/bun": "^1.4.0" "@types/ws": "8.18.1" "typescript": "^7.0.2" "@vitest/coverage-v8": "^5.0.0" - "effect": "4.0.0-rc.113" + "effect": "4.0.0-rc.115" "knip": "^6.32.2" "oxfmt": "^0.65.0" "oxlint": "1.80.0" @@ -100,16 +100,16 @@ minimumReleaseAgeExclude: - "@turbo/linux-arm64@2.10.11" - "@turbo/windows-64@2.10.11" - "@turbo/windows-arm64@2.10.11" - - "@effect/platform-bun@4.0.0-rc.113" - - "@effect/platform-node@4.0.0-rc.113" - - "@effect/platform-node-shared@4.0.0-rc.113" + - "@effect/platform-bun@4.0.0-rc.115" + - "@effect/platform-node@4.0.0-rc.115" + - "@effect/platform-node-shared@4.0.0-rc.115" - "@effect/sql-pg@4.0.0-rc.112" - - "@effect/vitest@4.0.0-rc.113" + - "@effect/vitest@4.0.0-rc.115" - "@supabase/pg-delta@1.0.0-alpha.49" - "@supabase/pg-topo@1.0.0-alpha.6" - "@types/bun@1.4.0" - "bun-types@1.4.0" - - "effect@4.0.0-rc.113" + - "effect@4.0.0-rc.115" - "turbo@2.10.11" - "undici@8.10.2" From a977cceb956fdf139f5e7c82fc28814b3d36002c Mon Sep 17 00:00:00 2001 From: Kanad Gupta Date: Fri, 11 Sep 2026 11:55:47 -0700 Subject: [PATCH 12/13] fix(config): type bucket entries as ObjectKeyword instead of an empty struct Schema.Struct({}) decodes any non-null value, and effect rc.113+ renders it faithfully as { not: { type: "null" } }, which changed the published JSON Schema for storage.analytics.buckets and storage.vector.buckets from rc.112's { anyOf: [object, array] }. ObjectKeyword decodes and renders exactly that object-or-array shape, so the artifact keeps its meaning; only the anyOf branch order differs. The project-schema exhaustiveness guards learn the new leaf kind, and the empty-struct sweep no longer has any expected hits. Co-Authored-By: Claude Fable 5.1 --- .../config/src/project-config/project-schema.unit.test.ts | 6 ++---- packages/config/src/storage.ts | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/config/src/project-config/project-schema.unit.test.ts b/packages/config/src/project-config/project-schema.unit.test.ts index d9941fe541..2ed19388ed 100644 --- a/packages/config/src/project-config/project-schema.unit.test.ts +++ b/packages/config/src/project-config/project-schema.unit.test.ts @@ -226,9 +226,7 @@ describe("ProjectConfigSchema secret-strip exhaustiveness", () => { const emptyObjectPaths: string[] = []; collectEmptyObjectPaths(ProjectConfigSchema.ast, [], new Set(), emptyObjectPaths); - expect(emptyObjectPaths.toSorted()).toEqual( - ["storage.analytics.buckets.*", "storage.vector.buckets.*"].toSorted(), - ); + expect(emptyObjectPaths).toEqual([]); }); }); @@ -251,7 +249,7 @@ describe("ProjectConfigSchema derivation AST-walk exhaustiveness", () => { // `Suspend` unhandled; this walks the actual derived AST and fails loudly if a node kind outside // that set appears, instead of silently falling through to the leaf case. const HANDLED_CONTAINER_TAGS = new Set(["Objects", "Arrays", "Union"]); - const HANDLED_LEAF_TAGS = new Set(["String", "Number", "Boolean", "Literal"]); + const HANDLED_LEAF_TAGS = new Set(["String", "Number", "Boolean", "Literal", "ObjectKeyword"]); function walk(ast: SchemaAST.AST, seen: Set): void { if (seen.has(ast)) { diff --git a/packages/config/src/storage.ts b/packages/config/src/storage.ts index bab02e7ef3..575c662ca6 100644 --- a/packages/config/src/storage.ts +++ b/packages/config/src/storage.ts @@ -139,7 +139,7 @@ export const storage = Schema.Struct({ }).pipe(Schema.withDecodingDefaultKey(Effect.succeed(defaultMaxCatalogs))), buckets: Schema.Record( Schema.String, - Schema.Struct({}).pipe( + Schema.ObjectKeyword.pipe( Schema.withDecodingDefault(Effect.succeed({ ...defaultAnalyticsBuckets })), ), ) @@ -171,7 +171,7 @@ export const storage = Schema.Struct({ }).pipe(Schema.withDecodingDefaultKey(Effect.succeed(defaultMaxIndexes))), buckets: Schema.Record( Schema.String, - Schema.Struct({}).pipe( + Schema.ObjectKeyword.pipe( Schema.withDecodingDefault(Effect.succeed({ ...defaultVectorBuckets })), ), ) From 1391db3573927eff4db2fc6624e3d75a22161c26 Mon Sep 17 00:00:00 2001 From: Kanad Gupta Date: Fri, 11 Sep 2026 12:05:57 -0700 Subject: [PATCH 13/13] chore(config): trim stale rationale on isAllSecretCollapsedContainer The comment contrasted collapsed containers with structs that are empty in the source schema. Since dec6f3e96 replaced the last empty struct with ObjectKeyword, that case no longer exists, so the contrast is dropped. Co-Authored-By: Claude Fable 5.1 --- packages/config/src/project-config/project-schema.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/config/src/project-config/project-schema.ts b/packages/config/src/project-config/project-schema.ts index f12744c2f8..d45b0ebe00 100644 --- a/packages/config/src/project-config/project-schema.ts +++ b/packages/config/src/project-config/project-schema.ts @@ -23,8 +23,7 @@ function hasObjectMembers(ast: SchemaAST.AST): boolean { /** * True when every member of `original` was secret-shaped and got stripped from `transformed`, - * leaving it empty — as opposed to an `Objects` node that was already empty in the source schema, - * which must pass through as a permissive leaf rather than being treated as secret-shaped. + * leaving it empty. */ function isAllSecretCollapsedContainer( original: SchemaAST.AST,