From a1a6f8040d59ad45d171ce0842b889a1b16418eb Mon Sep 17 00:00:00 2001 From: prodrigues Date: Tue, 1 Oct 2024 13:06:47 +0100 Subject: [PATCH 1/8] branch clean up for pr --- drizzle-kit/pnpm-lock.yaml | 7603 ++++++++++++++++++++++++++ drizzle-kit/schema.ts | 0 drizzle-kit/src/cli/commands/push.ts | 3 +- 3 files changed, 7604 insertions(+), 2 deletions(-) create mode 100644 drizzle-kit/pnpm-lock.yaml create mode 100644 drizzle-kit/schema.ts diff --git a/drizzle-kit/pnpm-lock.yaml b/drizzle-kit/pnpm-lock.yaml new file mode 100644 index 000000000..8f4d58f55 --- /dev/null +++ b/drizzle-kit/pnpm-lock.yaml @@ -0,0 +1,7603 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +patchedDependencies: + difflib@0.2.4: + hash: jq4t3ysdpnbunjeje4v7nrqn2q + path: patches/difflib@0.2.4.patch + +importers: + + .: + dependencies: + '@esbuild-kit/esm-loader': + specifier: ^2.5.5 + version: 2.6.5 + esbuild: + specifier: ^0.19.7 + version: 0.19.12 + esbuild-register: + specifier: ^3.5.0 + version: 3.5.0(esbuild@0.19.12) + devDependencies: + '@arethetypeswrong/cli': + specifier: ^0.15.3 + version: 0.15.3 + '@aws-sdk/client-rds-data': + specifier: ^3.556.0 + version: 3.577.0 + '@cloudflare/workers-types': + specifier: ^4.20230518.0 + version: 4.20240512.0 + '@electric-sql/pglite': + specifier: ^0.1.5 + version: 0.1.5 + '@hono/node-server': + specifier: ^1.9.0 + version: 1.11.1 + '@hono/zod-validator': + specifier: ^0.2.1 + version: 0.2.1(hono@4.3.9)(zod@3.23.8) + '@libsql/client': + specifier: ^0.4.2 + version: 0.4.3(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@neondatabase/serverless': + specifier: ^0.9.1 + version: 0.9.3 + '@originjs/vite-plugin-commonjs': + specifier: ^1.0.3 + version: 1.0.3 + '@planetscale/database': + specifier: ^1.16.0 + version: 1.18.0 + '@types/better-sqlite3': + specifier: ^7.6.4 + version: 7.6.10 + '@types/dockerode': + specifier: ^3.3.28 + version: 3.3.29 + '@types/glob': + specifier: ^8.1.0 + version: 8.1.0 + '@types/json-diff': + specifier: ^1.0.3 + version: 1.0.3 + '@types/minimatch': + specifier: ^5.1.2 + version: 5.1.2 + '@types/node': + specifier: ^18.11.15 + version: 18.19.33 + '@types/pg': + specifier: ^8.10.7 + version: 8.11.6 + '@types/pluralize': + specifier: ^0.0.33 + version: 0.0.33 + '@types/semver': + specifier: ^7.5.5 + version: 7.5.8 + '@types/uuid': + specifier: ^9.0.8 + version: 9.0.8 + '@types/ws': + specifier: ^8.5.10 + version: 8.5.10 + '@typescript-eslint/eslint-plugin': + specifier: ^7.2.0 + version: 7.10.0(@typescript-eslint/parser@7.10.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^7.2.0 + version: 7.10.0(eslint@8.57.0)(typescript@5.4.5) + '@vercel/postgres': + specifier: ^0.8.0 + version: 0.8.0 + ava: + specifier: ^5.1.0 + version: 5.3.1 + better-sqlite3: + specifier: ^9.4.3 + version: 9.6.0 + camelcase: + specifier: ^7.0.1 + version: 7.0.1 + chalk: + specifier: ^5.2.0 + version: 5.3.0 + commander: + specifier: ^12.1.0 + version: 12.1.0 + dockerode: + specifier: ^3.3.4 + version: 3.3.5 + dotenv: + specifier: ^16.0.3 + version: 16.4.5 + drizzle-kit: + specifier: 0.21.2 + version: 0.21.2 + drizzle-orm: + specifier: 0.32.0-85c8008 + version: 0.32.0-85c8008(@aws-sdk/client-rds-data@3.577.0)(@cloudflare/workers-types@4.20240512.0)(@electric-sql/pglite@0.1.5)(@libsql/client@0.4.3(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@neondatabase/serverless@0.9.3)(@planetscale/database@1.18.0)(@types/better-sqlite3@7.6.10)(@types/pg@8.11.6)(@vercel/postgres@0.8.0)(better-sqlite3@9.6.0)(mysql2@2.3.3)(pg@8.11.5)(postgres@3.4.4) + env-paths: + specifier: ^3.0.0 + version: 3.0.0 + esbuild-node-externals: + specifier: ^1.9.0 + version: 1.13.1(esbuild@0.19.12) + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: ^5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8) + get-port: + specifier: ^6.1.2 + version: 6.1.2 + glob: + specifier: ^8.1.0 + version: 8.1.0 + hanji: + specifier: ^0.0.5 + version: 0.0.5 + hono: + specifier: ^4.1.5 + version: 4.3.9 + json-diff: + specifier: 1.0.6 + version: 1.0.6 + minimatch: + specifier: ^7.4.3 + version: 7.4.6 + mysql2: + specifier: 2.3.3 + version: 2.3.3 + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 + pg: + specifier: ^8.11.5 + version: 8.11.5 + pluralize: + specifier: ^8.0.0 + version: 8.0.0 + postgres: + specifier: ^3.4.4 + version: 3.4.4 + prettier: + specifier: ^2.8.1 + version: 2.8.8 + semver: + specifier: ^7.5.4 + version: 7.6.2 + superjson: + specifier: ^2.2.1 + version: 2.2.1 + tsup: + specifier: ^8.0.2 + version: 8.0.2(postcss@8.4.38)(typescript@5.4.5) + tsx: + specifier: ^3.12.1 + version: 3.14.0 + typescript: + specifier: ^5.4.3 + version: 5.4.5 + uuid: + specifier: ^9.0.1 + version: 9.0.1 + vite-tsconfig-paths: + specifier: ^4.3.2 + version: 4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@18.19.33)) + vitest: + specifier: ^1.4.0 + version: 1.6.0(@types/node@18.19.33) + wrangler: + specifier: ^3.22.1 + version: 3.57.0(@cloudflare/workers-types@4.20240512.0)(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: + specifier: ^8.16.0 + version: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + zod: + specifier: ^3.20.2 + version: 3.23.8 + zx: + specifier: ^7.2.2 + version: 7.2.3 + +packages: + + '@andrewbranch/untar.js@1.0.3': + resolution: {integrity: sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==} + + '@arethetypeswrong/cli@0.15.3': + resolution: {integrity: sha512-sIMA9ZJBWDEg1+xt5RkAEflZuf8+PO8SdKj17x6PtETuUho+qlZJg4DgmKc3q+QwQ9zOB5VLK6jVRbFdNLdUIA==} + engines: {node: '>=18'} + hasBin: true + + '@arethetypeswrong/core@0.15.1': + resolution: {integrity: sha512-FYp6GBAgsNz81BkfItRz8RLZO03w5+BaeiPma1uCfmxTnxbtuMrI/dbzGiOk8VghO108uFI0oJo0OkewdSHw7g==} + engines: {node: '>=18'} + + '@aws-crypto/ie11-detection@3.0.0': + resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} + + '@aws-crypto/sha256-browser@3.0.0': + resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} + + '@aws-crypto/sha256-js@3.0.0': + resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} + + '@aws-crypto/supports-web-crypto@3.0.0': + resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} + + '@aws-crypto/util@3.0.0': + resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} + + '@aws-sdk/client-rds-data@3.577.0': + resolution: {integrity: sha512-24a27II6UkNhe2RB6ZwtQPcM3QB/DuRcKvzMmfvipgWS72Q5FEtuq3CO66IObWUel/pxi3ucE6mSvVCFnm7tBQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sso-oidc@3.577.0': + resolution: {integrity: sha512-njmKSPDWueWWYVFpFcZ2P3fI6/pdQVDa0FgCyYZhOnJLgEHZIcBBg1AsnkVWacBuLopp9XVt2m+7hO6ugY1/1g==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sso@3.577.0': + resolution: {integrity: sha512-BwujdXrydlk6UEyPmewm5GqG4nkQ6OVyRhS/SyZP/6UKSFv2/sf391Cmz0hN0itUTH1rR4XeLln8XCOtarkrzg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/client-sts@3.577.0': + resolution: {integrity: sha512-509Kklimva1XVlhGbpTpeX3kOP6ORpm44twJxDHpa9TURbmoaxj7veWlnLCbDorxDTrbsDghvYZshvcLsojVpg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/core@3.576.0': + resolution: {integrity: sha512-KDvDlbeipSTIf+ffKtTg1m419TK7s9mZSWC8bvuZ9qx6/sjQFOXIKOVqyuli6DnfxGbvRcwoRuY99OcCH1N/0w==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-env@3.577.0': + resolution: {integrity: sha512-Jxu255j0gToMGEiqufP8ZtKI8HW90lOLjwJ3LrdlD/NLsAY0tOQf1fWc53u28hWmmNGMxmCrL2p66IOgMDhDUw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-http@3.577.0': + resolution: {integrity: sha512-n++yhCp67b9+ZRGEdY1jhamB5E/O+QsIDOPSuRmdaSGMCOd82oUEKPgIVEU1bkqxDsBxgiEWuvtfhK6sNiDS0A==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-ini@3.577.0': + resolution: {integrity: sha512-q7lHPtv6BjRvChUE3m0tIaEZKxPTaZ1B3lKxGYsFl3VLAu5N8yGCUKwuA1izf4ucT+LyKscVGqK6VDZx1ev3nw==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.577.0 + + '@aws-sdk/credential-provider-node@3.577.0': + resolution: {integrity: sha512-epZ1HOMsrXBNczc0HQpv0VMjqAEpc09DUA7Rg3gUJfn8umhML7A7bXnUyqPA+S54q397UYg1leQKdSn23OiwQQ==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-process@3.577.0': + resolution: {integrity: sha512-Gin6BWtOiXxIgITrJ3Nwc+Y2P1uVT6huYR4EcbA/DJUPWyO0n9y5UFLewPvVbLkRn15JeEqErBLUrHclkiOKtw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-sso@3.577.0': + resolution: {integrity: sha512-iVm5SQvS7EgZTJsRaqUOmDQpBQPPPat42SCbWFvFQOLrl8qewq8OP94hFS5w2mP62zngeYzqhJnDel79HXbxew==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.577.0': + resolution: {integrity: sha512-ZGHGNRaCtJJmszb9UTnC7izNCtRUttdPlLdMkh41KPS32vfdrBDHs1JrpbZijItRj1xKuOXsiYSXLAaHGcLh8Q==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sts': ^3.577.0 + + '@aws-sdk/middleware-host-header@3.577.0': + resolution: {integrity: sha512-9ca5MJz455CODIVXs0/sWmJm7t3QO4EUa1zf8pE8grLpzf0J94bz/skDWm37Pli13T3WaAQBHCTiH2gUVfCsWg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-logger@3.577.0': + resolution: {integrity: sha512-aPFGpGjTZcJYk+24bg7jT4XdIp42mFXSuPt49lw5KygefLyJM/sB0bKKqPYYivW0rcuZ9brQ58eZUNthrzYAvg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.577.0': + resolution: {integrity: sha512-pn3ZVEd2iobKJlR3H+bDilHjgRnNrQ6HMmK9ZzZw89Ckn3Dcbv48xOv4RJvu0aU8SDLl/SNCxppKjeLDTPGBNA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/middleware-user-agent@3.577.0': + resolution: {integrity: sha512-P55HAXgwmiHHpFx5JEPvOnAbfhN7v6sWv9PBQs+z2tC7QiBcPS0cdJR6PfV7J1n4VPK52/OnrK3l9VxdQ7Ms0g==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/region-config-resolver@3.577.0': + resolution: {integrity: sha512-4ChCFACNwzqx/xjg3zgFcW8Ali6R9C95cFECKWT/7CUM1D0MGvkclSH2cLarmHCmJgU6onKkJroFtWp0kHhgyg==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/token-providers@3.577.0': + resolution: {integrity: sha512-0CkIZpcC3DNQJQ1hDjm2bdSy/Xjs7Ny5YvSsacasGOkNfk+FdkiQy6N67bZX3Zbc9KIx+Nz4bu3iDeNSNplnnQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@aws-sdk/client-sso-oidc': ^3.577.0 + + '@aws-sdk/types@3.577.0': + resolution: {integrity: sha512-FT2JZES3wBKN/alfmhlo+3ZOq/XJ0C7QOZcDNrpKjB0kqYoKjhVKZ/Hx6ArR0czkKfHzBBEs6y40ebIHx2nSmA==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-endpoints@3.577.0': + resolution: {integrity: sha512-FjuUz1Kdy4Zly2q/c58tpdqHd6z7iOdU/caYzoc8jwgAHBDBbIJNQLCU9hXJnPV2M8pWxQDyIZsoVwtmvErPzw==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-locate-window@3.568.0': + resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} + engines: {node: '>=16.0.0'} + + '@aws-sdk/util-user-agent-browser@3.577.0': + resolution: {integrity: sha512-zEAzHgR6HWpZOH7xFgeJLc6/CzMcx4nxeQolZxVZoB5pPaJd3CjyRhZN0xXeZB0XIRCWmb4yJBgyiugXLNMkLA==} + + '@aws-sdk/util-user-agent-node@3.577.0': + resolution: {integrity: sha512-XqvtFjbSMtycZTWVwDe8DRWovuoMbA54nhUoZwVU6rW9OSD6NZWGR512BUGHFaWzW0Wg8++Dj10FrKTG2XtqfA==} + engines: {node: '>=16.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/util-utf8-browser@3.259.0': + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + + '@balena/dockerignore@1.0.2': + resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} + + '@cloudflare/kv-asset-handler@0.3.2': + resolution: {integrity: sha512-EeEjMobfuJrwoctj7FA1y1KEbM0+Q1xSjobIEyie9k4haVEBB7vkDvsasw1pM3rO39mL2akxIAzLMUAtrMHZhA==} + engines: {node: '>=16.13'} + + '@cloudflare/workerd-darwin-64@1.20240512.0': + resolution: {integrity: sha512-VMp+CsSHFALQiBzPdQ5dDI4T1qwLu0mQ0aeKVNDosXjueN0f3zj/lf+mFil5/9jBbG3t4mG0y+6MMnalP9Lobw==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + + '@cloudflare/workerd-darwin-arm64@1.20240512.0': + resolution: {integrity: sha512-lZktXGmzMrB5rJqY9+PmnNfv1HKlj/YLZwMjPfF0WVKHUFdvQbAHsi7NlKv6mW9uIvlZnS+K4sIkWc0MDXcRnA==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + + '@cloudflare/workerd-linux-64@1.20240512.0': + resolution: {integrity: sha512-wrHvqCZZqXz6Y3MUTn/9pQNsvaoNjbJpuA6vcXsXu8iCzJi911iVW2WUEBX+MpUWD+mBIP0oXni5tTlhkokOPw==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + + '@cloudflare/workerd-linux-arm64@1.20240512.0': + resolution: {integrity: sha512-YPezHMySL9J9tFdzxz390eBswQ//QJNYcZolz9Dgvb3FEfdpK345cE/bsWbMOqw5ws2f82l388epoenghtYvAg==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + + '@cloudflare/workerd-windows-64@1.20240512.0': + resolution: {integrity: sha512-SxKapDrIYSscMR7lGIp/av0l6vokjH4xQ9ACxHgXh+OdOus9azppSmjaPyw4/ePvg7yqpkaNjf9o258IxWtvKQ==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + + '@cloudflare/workers-types@4.20240512.0': + resolution: {integrity: sha512-o2yTEWg+YK/I1t/Me+dA0oarO0aCbjibp6wSeaw52DSE9tDyKJ7S+Qdyw/XsMrKn4t8kF6f/YOba+9O4MJfW9w==} + + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@electric-sql/pglite@0.1.5': + resolution: {integrity: sha512-eymv4ONNvoPZQTvOQIi5dbpR+J5HzEv0qQH9o/y3gvNheJV/P/NFcrbsfJZYTsDKoq7DKrTiFNexsRkJKy8x9Q==} + + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + + '@esbuild-plugins/node-globals-polyfill@0.2.3': + resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} + peerDependencies: + esbuild: '*' + + '@esbuild-plugins/node-modules-polyfill@0.2.2': + resolution: {integrity: sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==} + peerDependencies: + esbuild: '*' + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.17.19': + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.17.19': + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.17.19': + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.17.19': + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.17.19': + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.17.19': + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.17.19': + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.17.19': + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.17.19': + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.17.19': + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.14.54': + resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.17.19': + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.17.19': + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.17.19': + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.17.19': + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.17.19': + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.17.19': + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.17.19': + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.17.19': + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.17.19': + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.17.19': + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.17.19': + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.17.19': + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@ewoudenberg/difflib@0.1.0': + resolution: {integrity: sha512-OU5P5mJyD3OoWYMWY+yIgwvgNS9cFAU10f+DDuvtogcWQOoJIsQ4Hy2McSfUfhKjq8L0FuWVb4Rt7kgA+XK86A==} + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@hono/node-server@1.11.1': + resolution: {integrity: sha512-GW1Iomhmm1o4Z+X57xGby8A35Cu9UZLL7pSMdqDBkD99U5cywff8F+8hLk5aBTzNubnsFAvWQ/fZjNwPsEn9lA==} + engines: {node: '>=18.14.1'} + + '@hono/zod-validator@0.2.1': + resolution: {integrity: sha512-HFoxln7Q6JsE64qz2WBS28SD33UB2alp3aRKmcWnNLDzEL1BLsWfbdX6e1HIiUprHYTIXf5y7ax8eYidKUwyaA==} + peerDependencies: + hono: '>=3.9.0' + zod: ^3.19.1 + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@libsql/client@0.4.3': + resolution: {integrity: sha512-AUYKnSPqAsFBVWBvmtrb4dG3pQlvTKT92eztAest9wQU2iJkabH8WzHLDb3dKFWKql7/kiCqvBQUVpozDwhekQ==} + + '@libsql/core@0.4.3': + resolution: {integrity: sha512-r28iYBtaLBW9RRgXPFh6cGCsVI/rwRlOzSOpAu/1PVTm6EJ3t233pUf97jETVHU0vjdr1d8VvV6fKAvJkokqCw==} + + '@libsql/darwin-arm64@0.2.0': + resolution: {integrity: sha512-+qyT2W/n5CFH1YZWv2mxW4Fsoo4dX9Z9M/nvbQqZ7H84J8hVegvVAsIGYzcK8xAeMEcpU5yGKB1Y9NoDY4hOSQ==} + cpu: [arm64] + os: [darwin] + + '@libsql/darwin-x64@0.2.0': + resolution: {integrity: sha512-hwmO2mF1n8oDHKFrUju6Jv+n9iFtTf5JUK+xlnIE3Td0ZwGC/O1R/Z/btZTd9nD+vsvakC8SJT7/Q6YlWIkhEw==} + cpu: [x64] + os: [darwin] + + '@libsql/hrana-client@0.5.6': + resolution: {integrity: sha512-mjQoAmejZ1atG+M3YR2ZW+rg6ceBByH/S/h17ZoYZkqbWrvohFhXyz2LFxj++ARMoY9m6w3RJJIRdJdmnEUlFg==} + + '@libsql/isomorphic-fetch@0.1.12': + resolution: {integrity: sha512-MRo4UcmjAGAa3ac56LoD5OE13m2p0lu0VEtZC2NZMcogM/jc5fU9YtMQ3qbPjFJ+u2BBjFZgMPkQaLS1dlMhpg==} + + '@libsql/isomorphic-ws@0.1.5': + resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} + + '@libsql/linux-arm64-gnu@0.2.0': + resolution: {integrity: sha512-1w2lPXIYtnBaK5t/Ej5E8x7lPiE+jP3KATI/W4yei5Z/ONJh7jQW5PJ7sYU95vTME3hWEM1FXN6kvzcpFAte7w==} + cpu: [arm64] + os: [linux] + + '@libsql/linux-arm64-musl@0.2.0': + resolution: {integrity: sha512-lkblBEJ7xuNiWNjP8DDq0rqoWccszfkUS7Efh5EjJ+GDWdCBVfh08mPofIZg0fZVLWQCY3j+VZCG1qZfATBizg==} + cpu: [arm64] + os: [linux] + + '@libsql/linux-x64-gnu@0.2.0': + resolution: {integrity: sha512-+x/d289KeJydwOhhqSxKT+6MSQTCfLltzOpTzPccsvdt5fxg8CBi+gfvEJ4/XW23Sa+9bc7zodFP0i6MOlxX7w==} + cpu: [x64] + os: [linux] + + '@libsql/linux-x64-musl@0.2.0': + resolution: {integrity: sha512-5Xn0c5A6vKf9D1ASpgk7mef//FuY7t5Lktj/eiU4n3ryxG+6WTpqstTittJUgepVjcleLPYxIhQAYeYwTYH1IQ==} + cpu: [x64] + os: [linux] + + '@libsql/win32-x64-msvc@0.2.0': + resolution: {integrity: sha512-rpK+trBIpRST15m3cMYg5aPaX7kvCIottxY7jZPINkKAaScvfbn9yulU/iZUM9YtuK96Y1ZmvwyVIK/Y5DzoMQ==} + cpu: [x64] + os: [win32] + + '@neon-rs/load@0.0.4': + resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} + + '@neondatabase/serverless@0.7.2': + resolution: {integrity: sha512-wU3WA2uTyNO7wjPs3Mg0G01jztAxUxzd9/mskMmtPwPTjf7JKWi9AW5/puOGXLxmZ9PVgRFeBVRVYq5nBPhsCg==} + + '@neondatabase/serverless@0.9.3': + resolution: {integrity: sha512-6ZBK8asl2Z3+ADEaELvbaVVGVlmY1oAzkxxZfpmXPKFuJhbDN+5fU3zYBamsahS/Ch1zE+CVWB3R+8QEI2LMSw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@originjs/vite-plugin-commonjs@1.0.3': + resolution: {integrity: sha512-KuEXeGPptM2lyxdIEJ4R11+5ztipHoE7hy8ClZt3PYaOVQ/pyngd2alaSrPnwyFeOW1UagRBaQ752aA1dTMdOQ==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@planetscale/database@1.18.0': + resolution: {integrity: sha512-t2XdOfrVgcF7AW791FtdPS27NyNqcE1SpoXgk3HpziousvUMsJi4Q6NL3JyOBpsMOrvk94749o8yyonvX5quPw==} + engines: {node: '>=16'} + + '@rollup/rollup-android-arm-eabi@4.17.2': + resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.17.2': + resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.17.2': + resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.17.2': + resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': + resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.17.2': + resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.17.2': + resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.17.2': + resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': + resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.17.2': + resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.17.2': + resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.17.2': + resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.17.2': + resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.17.2': + resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.17.2': + resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.17.2': + resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} + cpu: [x64] + os: [win32] + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@smithy/abort-controller@3.0.0': + resolution: {integrity: sha512-p6GlFGBt9K4MYLu72YuJ523NVR4A8oHlC5M2JO6OmQqN8kAc/uh1JqLE+FizTokrSJGg0CSvC+BrsmGzKtsZKA==} + engines: {node: '>=16.0.0'} + + '@smithy/config-resolver@3.0.0': + resolution: {integrity: sha512-2GzOfADwYLQugYkKQhIyZyQlM05K+tMKvRnc6eFfZcpJGRfKoMUMYdPlBKmqHwQFXQKBrGV6cxL9oymWgDzvFw==} + engines: {node: '>=16.0.0'} + + '@smithy/core@2.0.1': + resolution: {integrity: sha512-rcMkjvwxH/bER+oZUPR0yTA0ELD6m3A+d92+CFkdF6HJFCBB1bXo7P5pm21L66XwTN01B6bUhSCQ7cymWRD8zg==} + engines: {node: '>=16.0.0'} + + '@smithy/credential-provider-imds@3.0.0': + resolution: {integrity: sha512-lfmBiFQcA3FsDAPxNfY0L7CawcWtbyWsBOHo34nF095728JLkBX4Y9q/VPPE2r7fqMVK+drmDigqE2/SSQeVRA==} + engines: {node: '>=16.0.0'} + + '@smithy/fetch-http-handler@3.0.1': + resolution: {integrity: sha512-uaH74i5BDj+rBwoQaXioKpI0SHBJFtOVwzrCpxZxphOW0ki5jhj7dXvDMYM2IJem8TpdFvS2iC08sjOblfFGFg==} + + '@smithy/hash-node@3.0.0': + resolution: {integrity: sha512-84qXstNemP3XS5jcof0el6+bDfjzuvhJPQTEfro3lgtbCtKgzPm3MgiS6ehXVPjeQ5+JS0HqmTz8f/RYfzHVxw==} + engines: {node: '>=16.0.0'} + + '@smithy/invalid-dependency@3.0.0': + resolution: {integrity: sha512-F6wBBaEFgJzj0s4KUlliIGPmqXemwP6EavgvDqYwCH40O5Xr2iMHvS8todmGVZtuJCorBkXsYLyTu4PuizVq5g==} + + '@smithy/is-array-buffer@3.0.0': + resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-content-length@3.0.0': + resolution: {integrity: sha512-3C4s4d/iGobgCtk2tnWW6+zSTOBg1PRAm2vtWZLdriwTroFbbWNSr3lcyzHdrQHnEXYCC5K52EbpfodaIUY8sg==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-endpoint@3.0.0': + resolution: {integrity: sha512-aXOAWztw/5qAfp0NcA2OWpv6ZI/E+Dh9mByif7i91D/0iyYNUcKvskmXiowKESFkuZ7PIMd3VOR4fTibZDs2OQ==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-retry@3.0.1': + resolution: {integrity: sha512-hBhSEuL841FhJBK/19WpaGk5YWSzFk/P2UaVjANGKRv3eYNO8Y1lANWgqnuPWjOyCEWMPr58vELFDWpxvRKANw==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-serde@3.0.0': + resolution: {integrity: sha512-I1vKG1foI+oPgG9r7IMY1S+xBnmAn1ISqployvqkwHoSb8VPsngHDTOgYGYBonuOKndaWRUGJZrKYYLB+Ane6w==} + engines: {node: '>=16.0.0'} + + '@smithy/middleware-stack@3.0.0': + resolution: {integrity: sha512-+H0jmyfAyHRFXm6wunskuNAqtj7yfmwFB6Fp37enytp2q047/Od9xetEaUbluyImOlGnGpaVGaVfjwawSr+i6Q==} + engines: {node: '>=16.0.0'} + + '@smithy/node-config-provider@3.0.0': + resolution: {integrity: sha512-buqfaSdDh0zo62EPLf8rGDvcpKwGpO5ho4bXS2cdFhlOta7tBkWJt+O5uiaAeICfIOfPclNOndshDNSanX2X9g==} + engines: {node: '>=16.0.0'} + + '@smithy/node-http-handler@3.0.0': + resolution: {integrity: sha512-3trD4r7NOMygwLbUJo4eodyQuypAWr7uvPnebNJ9a70dQhVn+US8j/lCnvoJS6BXfZeF7PkkkI0DemVJw+n+eQ==} + engines: {node: '>=16.0.0'} + + '@smithy/property-provider@3.0.0': + resolution: {integrity: sha512-LmbPgHBswdXCrkWWuUwBm9w72S2iLWyC/5jet9/Y9cGHtzqxi+GVjfCfahkvNV4KXEwgnH8EMpcrD9RUYe0eLQ==} + engines: {node: '>=16.0.0'} + + '@smithy/protocol-http@4.0.0': + resolution: {integrity: sha512-qOQZOEI2XLWRWBO9AgIYuHuqjZ2csyr8/IlgFDHDNuIgLAMRx2Bl8ck5U5D6Vh9DPdoaVpuzwWMa0xcdL4O/AQ==} + engines: {node: '>=16.0.0'} + + '@smithy/querystring-builder@3.0.0': + resolution: {integrity: sha512-bW8Fi0NzyfkE0TmQphDXr1AmBDbK01cA4C1Z7ggwMAU5RDz5AAv/KmoRwzQAS0kxXNf/D2ALTEgwK0U2c4LtRg==} + engines: {node: '>=16.0.0'} + + '@smithy/querystring-parser@3.0.0': + resolution: {integrity: sha512-UzHwthk0UEccV4dHzPySnBy34AWw3V9lIqUTxmozQ+wPDAO9csCWMfOLe7V9A2agNYy7xE+Pb0S6K/J23JSzfQ==} + engines: {node: '>=16.0.0'} + + '@smithy/service-error-classification@3.0.0': + resolution: {integrity: sha512-3BsBtOUt2Gsnc3X23ew+r2M71WwtpHfEDGhHYHSDg6q1t8FrWh15jT25DLajFV1H+PpxAJ6gqe9yYeRUsmSdFA==} + engines: {node: '>=16.0.0'} + + '@smithy/shared-ini-file-loader@3.0.0': + resolution: {integrity: sha512-REVw6XauXk8xE4zo5aGL7Rz4ywA8qNMUn8RtWeTRQsgAlmlvbJ7CEPBcaXU2NDC3AYBgYAXrGyWD8XrN8UGDog==} + engines: {node: '>=16.0.0'} + + '@smithy/signature-v4@3.0.0': + resolution: {integrity: sha512-kXFOkNX+BQHe2qnLxpMEaCRGap9J6tUGLzc3A9jdn+nD4JdMwCKTJ+zFwQ20GkY+mAXGatyTw3HcoUlR39HwmA==} + engines: {node: '>=16.0.0'} + + '@smithy/smithy-client@3.0.1': + resolution: {integrity: sha512-KAiFY4Y4jdHxR+4zerH/VBhaFKM8pbaVmJZ/CWJRwtM/CmwzTfXfvYwf6GoUwiHepdv+lwiOXCuOl6UBDUEINw==} + engines: {node: '>=16.0.0'} + + '@smithy/types@3.0.0': + resolution: {integrity: sha512-VvWuQk2RKFuOr98gFhjca7fkBS+xLLURT8bUjk5XQoV0ZLm7WPwWPPY3/AwzTLuUBDeoKDCthfe1AsTUWaSEhw==} + engines: {node: '>=16.0.0'} + + '@smithy/url-parser@3.0.0': + resolution: {integrity: sha512-2XLazFgUu+YOGHtWihB3FSLAfCUajVfNBXGGYjOaVKjLAuAxx3pSBY3hBgLzIgB17haf59gOG3imKqTy8mcrjw==} + + '@smithy/util-base64@3.0.0': + resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-body-length-browser@3.0.0': + resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} + + '@smithy/util-body-length-node@3.0.0': + resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-buffer-from@3.0.0': + resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-config-provider@3.0.0': + resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-defaults-mode-browser@3.0.1': + resolution: {integrity: sha512-nW5kEzdJn1Bn5TF+gOPHh2rcPli8JU9vSSXLbfg7uPnfR1TMRQqs9zlYRhIb87NeSxIbpdXOI94tvXSy+fvDYg==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-defaults-mode-node@3.0.1': + resolution: {integrity: sha512-TFk+Qb+elLc/MOhtSp+50fstyfZ6avQbgH2d96xUBpeScu+Al9elxv+UFAjaTHe0HQe5n+wem8ZLpXvU8lwV6Q==} + engines: {node: '>= 10.0.0'} + + '@smithy/util-endpoints@2.0.0': + resolution: {integrity: sha512-+exaXzEY3DNt2qtA2OtRNSDlVrE4p32j1JSsQkzA5AdP0YtJNjkYbYhJxkFmPYcjI1abuwopOZCwUmv682QkiQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-hex-encoding@3.0.0': + resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-middleware@3.0.0': + resolution: {integrity: sha512-q5ITdOnV2pXHSVDnKWrwgSNTDBAMHLptFE07ua/5Ty5WJ11bvr0vk2a7agu7qRhrCFRQlno5u3CneU5EELK+DQ==} + engines: {node: '>=16.0.0'} + + '@smithy/util-retry@3.0.0': + resolution: {integrity: sha512-nK99bvJiziGv/UOKJlDvFF45F00WgPLKVIGUfAK+mDhzVN2hb/S33uW2Tlhg5PVBoqY7tDVqL0zmu4OxAHgo9g==} + engines: {node: '>=16.0.0'} + + '@smithy/util-stream@3.0.1': + resolution: {integrity: sha512-7F7VNNhAsfMRA8I986YdOY5fE0/T1/ZjFF6OLsqkvQVNP3vZ/szYDfGCyphb7ioA09r32K/0qbSFfNFU68aSzA==} + engines: {node: '>=16.0.0'} + + '@smithy/util-uri-escape@3.0.0': + resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} + engines: {node: '>=16.0.0'} + + '@smithy/util-utf8@3.0.0': + resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} + engines: {node: '>=16.0.0'} + + '@types/better-sqlite3@7.6.10': + resolution: {integrity: sha512-TZBjD+yOsyrUJGmcUj6OS3JADk3+UZcNv3NOBqGkM09bZdi28fNZw8ODqbMOLfKCu7RYCO62/ldq1iHbzxqoPw==} + + '@types/docker-modem@3.0.6': + resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} + + '@types/dockerode@3.3.29': + resolution: {integrity: sha512-5PRRq/yt5OT/Jf77ltIdz4EiR9+VLnPF+HpU4xGFwUqmV24Co2HKBNW3w+slqZ1CYchbcDeqJASHDYWzZCcMiQ==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/glob@8.1.0': + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + + '@types/json-diff@1.0.3': + resolution: {integrity: sha512-Qvxm8fpRMv/1zZR3sQWImeRK2mBYJji20xF51Fq9Gt//Ed18u0x6/FNLogLS1xhfUWTEmDyqveJqn95ltB6Kvw==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/node-fetch@2.6.11': + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + + '@types/node-forge@1.3.11': + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + + '@types/node@18.19.33': + resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} + + '@types/pg@8.11.6': + resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} + + '@types/pg@8.6.6': + resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} + + '@types/pluralize@0.0.33': + resolution: {integrity: sha512-JOqsl+ZoCpP4e8TDke9W79FDcSgPAR0l6pixx2JHkhnRjvShyYiAYw2LVsnA7K08Y6DeOnaU6ujmENO4os/cYg==} + + '@types/ps-tree@1.1.6': + resolution: {integrity: sha512-PtrlVaOaI44/3pl3cvnlK+GxOM3re2526TJvPvh7W+keHIXdV4TE0ylpPBAcvFQCbGitaTXwL9u+RF7qtVeazQ==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/ssh2@1.15.0': + resolution: {integrity: sha512-YcT8jP5F8NzWeevWvcyrrLB3zcneVjzYY9ZDSMAMboI+2zR1qYWFhwsyOFVzT7Jorn67vqxC0FRiw8YyG9P1ww==} + + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + + '@types/which@3.0.3': + resolution: {integrity: sha512-2C1+XoY0huExTbs8MQv1DuS5FS86+SEjdM9F/+GS61gg5Hqbtj8ZiDSx8MfWcyei907fIPbfPGCOrNUTnVHY1g==} + + '@types/ws@8.5.10': + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + + '@typescript-eslint/eslint-plugin@7.10.0': + resolution: {integrity: sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.10.0': + resolution: {integrity: sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@7.10.0': + resolution: {integrity: sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.10.0': + resolution: {integrity: sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@7.10.0': + resolution: {integrity: sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@7.10.0': + resolution: {integrity: sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.10.0': + resolution: {integrity: sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@7.10.0': + resolution: {integrity: sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vercel/postgres@0.8.0': + resolution: {integrity: sha512-/QUV9ExwaNdKooRjOQqvrKNVnRvsaXeukPNI5DB1ovUTesglfR/fparw7ngo1KUWWKIVpEj2TRrA+ObRHRdaLg==} + engines: {node: '>=14.6'} + + '@vitest/expect@1.6.0': + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + + '@vitest/runner@1.6.0': + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + + '@vitest/snapshot@1.6.0': + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + + '@vitest/spy@1.6.0': + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + + '@vitest/utils@1.6.0': + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + aggregate-error@4.0.1: + resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} + engines: {node: '>=12'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} + engines: {node: '>=14.16'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + ansicolors@0.3.2: + resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + arrgv@1.0.2: + resolution: {integrity: sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==} + engines: {node: '>=8.0.0'} + + arrify@3.0.0: + resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} + engines: {node: '>=12'} + + as-table@1.0.55: + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + ava@5.3.1: + resolution: {integrity: sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg==} + engines: {node: '>=14.19 <15 || >=16.15 <17 || >=18'} + hasBin: true + peerDependencies: + '@ava/typescript': '*' + peerDependenciesMeta: + '@ava/typescript': + optional: true + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + better-sqlite3@9.6.0: + resolution: {integrity: sha512-yR5HATnqeYNVnkaUTf4bOP2dJSnyhP4puJN/QPRyx4YkBEEUxib422n2XzPqDEHjQQqazoYoADdAm5vE15+dAQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + blake3-wasm@2.1.5: + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + + blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + engines: {node: '>=6.14.2'} + + buildcheck@0.0.6: + resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} + engines: {node: '>=10.0.0'} + + bundle-require@4.1.0: + resolution: {integrity: sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + callsites@4.1.0: + resolution: {integrity: sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw==} + engines: {node: '>=12.20'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + capnp-ts@0.7.0: + resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} + + cardinal@2.1.1: + resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} + hasBin: true + + cbor@8.1.0: + resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} + engines: {node: '>=12.19'} + + chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chunkd@2.0.1: + resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + ci-parallel-vars@1.0.1: + resolution: {integrity: sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==} + + clean-stack@4.2.0: + resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} + engines: {node: '>=12'} + + clean-yaml-object@0.1.0: + resolution: {integrity: sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==} + engines: {node: '>=0.10.0'} + + cli-color@2.0.4: + resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} + engines: {node: '>=0.10'} + + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + + cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + code-excerpt@4.0.0: + resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concordance@5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + + confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + + convert-to-spaces@2.0.1: + resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + + cpu-features@0.0.10: + resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} + engines: {node: '>=10.0.0'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + currently-unhandled@0.4.1: + resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} + engines: {node: '>=0.10.0'} + + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + data-uri-to-buffer@2.0.2: + resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + date-time@3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + difflib@0.2.4: + resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + docker-modem@3.0.8: + resolution: {integrity: sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==} + engines: {node: '>= 8.0'} + + dockerode@3.3.5: + resolution: {integrity: sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==} + engines: {node: '>= 8.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + dreamopt@0.8.0: + resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} + engines: {node: '>=0.4.0'} + + drizzle-kit@0.21.2: + resolution: {integrity: sha512-U87IhZyCt/9d0ZT/Na3KFJVY31tSxtTx/n9UMcWFpW/5c2Ede39xiCG5efNV/0iimsv97UIRtDI0ldLBW5lbcg==} + hasBin: true + + drizzle-orm@0.32.0-85c8008: + resolution: {integrity: sha512-gHLqGZz0eqAvSw4vq46sHRV8qLHxrbuCVlwaVZ1t4ntyH8csyCKEXTWO78cBJwYUpz7BCSzqVX+5ZYa/QM+/Gw==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=3' + '@electric-sql/pglite': '>=0.1.1' + '@libsql/client': '*' + '@neondatabase/serverless': '>=0.1' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/react': '>=18' + '@types/sql.js': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=13.2.0' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + react: '>=18' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/react': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + react: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emittery@1.0.3: + resolution: {integrity: sha512-tJdCJitoy2lrC2ldJcqN4vkqJ00lT+tOWNT1hBJjO/3FDMJa5TTIiYGCKGkn/WfCyOzUMObeohbVTj00fhiLiA==} + engines: {node: '>=14.16'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + + esbuild-android-64@0.14.54: + resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + esbuild-android-arm64@0.14.54: + resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + esbuild-darwin-64@0.14.54: + resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + esbuild-darwin-arm64@0.14.54: + resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + esbuild-freebsd-64@0.14.54: + resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + esbuild-freebsd-arm64@0.14.54: + resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + esbuild-linux-32@0.14.54: + resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + esbuild-linux-64@0.14.54: + resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + esbuild-linux-arm64@0.14.54: + resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + esbuild-linux-arm@0.14.54: + resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + esbuild-linux-mips64le@0.14.54: + resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + esbuild-linux-ppc64le@0.14.54: + resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + esbuild-linux-riscv64@0.14.54: + resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + esbuild-linux-s390x@0.14.54: + resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + esbuild-netbsd-64@0.14.54: + resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + esbuild-node-externals@1.13.1: + resolution: {integrity: sha512-ho4Lokc6iMB1lWbb2tWJ6otien+3Kfoaxe0fy7NUNgVuLnfmlW+GRINftTVUGtTVY/dapuwUu/CvFylYNwzkMA==} + engines: {node: '>=12'} + peerDependencies: + esbuild: 0.12 - 0.21 + + esbuild-openbsd-64@0.14.54: + resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + esbuild-register@3.5.0: + resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild-sunos-64@0.14.54: + resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + esbuild-windows-32@0.14.54: + resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + esbuild-windows-64@0.14.54: + resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + esbuild-windows-arm64@0.14.54: + resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + esbuild@0.14.54: + resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.1.3: + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + event-stream@3.3.4: + resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-xml-parser@4.2.5: + resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} + hasBin: true + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + from@0.1.7: + resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + fx@34.0.0: + resolution: {integrity: sha512-/fZih3/WLsrtlaj2mahjWxAmyuikmcl3D5kKPqLtFmEilLsy9wp0+/vEmfvYXXhwJc+ajtCFDCf+yttXmPMHSQ==} + hasBin: true + + generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-port@6.1.2: + resolution: {integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + get-source@2.0.12: + resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.3.15: + resolution: {integrity: sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==} + engines: {node: '>=16 || 14 >=14.18'} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + hanji@0.0.5: + resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + + hono@4.3.9: + resolution: {integrity: sha512-6c5LVE23HnIS8iBhY+XPmYJlPeeClznOi7mBNsAsJCgxo8Ciz75LTjqRUf5wv4RYq8kL+1KPLUZHCtKmbZssNg==} + engines: {node: '>=16.0.0'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore-by-default@2.1.0: + resolution: {integrity: sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==} + engines: {node: '>=10 <11 || >=12 <13 || >=14'} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + irregular-plurals@3.5.0: + resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} + engines: {node: '>=8'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-error@2.2.2: + resolution: {integrity: sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + + js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + + js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-diff@0.9.0: + resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==} + hasBin: true + + json-diff@1.0.6: + resolution: {integrity: sha512-tcFIPRdlc35YkYdGxcamJjllUhXWv4n2rK9oJ2RsAzV4FBkuV4ojKEDgcZ+kpKxDmJKv+PFK65+1tVVOnSeEqA==} + hasBin: true + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + libsql@0.2.0: + resolution: {integrity: sha512-ELBRqhpJx5Dap0187zKQnntZyk4EjlDHSrjIVL8t+fQ5e8IxbQTeYgZgigMjB1EvrETdkm0Y0VxBGhzPQ+t0Jg==} + cpu: [x64, arm64] + os: [darwin, linux, win32] + + lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-json-file@7.0.1: + resolution: {integrity: sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + engines: {node: 14 || >=16.14} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lru-queue@0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + + map-age-cleaner@0.1.3: + resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} + engines: {node: '>=6'} + + map-stream@0.1.0: + resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} + + marked-terminal@6.2.0: + resolution: {integrity: sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw==} + engines: {node: '>=16.0.0'} + peerDependencies: + marked: '>=1 <12' + + marked@9.1.6: + resolution: {integrity: sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==} + engines: {node: '>= 16'} + hasBin: true + + matcher@5.0.0: + resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + md5-hex@3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + + mem@9.0.2: + resolution: {integrity: sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==} + engines: {node: '>=12.20'} + + memoizee@0.4.15: + resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + miniflare@3.20240512.0: + resolution: {integrity: sha512-X0PlKR0AROKpxFoJNmRtCMIuJxj+ngEcyTOlEokj2rAQ0TBwUhB4/1uiPvdI6ofW5NugPOD1uomAv+gLjwsLDQ==} + engines: {node: '>=16.13'} + hasBin: true + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.1: + resolution: {integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mlly@1.7.0: + resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + + mysql2@2.3.3: + resolution: {integrity: sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==} + engines: {node: '>= 8.0'} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + named-placeholders@1.1.3: + resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} + engines: {node: '>=12.0.0'} + + nan@2.19.0: + resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + node-abi@3.62.0: + resolution: {integrity: sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g==} + engines: {node: '>=10'} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-emoji@2.1.3: + resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} + engines: {node: '>=18'} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@3.3.1: + resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-gyp-build@4.8.1: + resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} + hasBin: true + + nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-defer@1.0.0: + resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + engines: {node: '>=4'} + + p-event@5.0.1: + resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@5.5.0: + resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} + engines: {node: '>=12'} + + p-timeout@5.1.0: + resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} + engines: {node: '>=12'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-ms@3.0.0: + resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} + engines: {node: '>=12'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pause-stream@0.0.11: + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + + pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + + pg-connection-string@2.6.4: + resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} + + 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.6.2: + resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} + peerDependencies: + pg: '>=8.0' + + pg-protocol@1.6.1: + resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + pg-types@4.0.2: + resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} + engines: {node: '>=10'} + + pg@8.11.5: + resolution: {integrity: sha512-jqgNHSKL5cbDjFlHyYsCXmQDrfIX/3RsNwYqpd4N0Kt8niLuNoRNH+aazv6cOd43gPh9Y4DjQCtb+X0MH0Hvnw==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-conf@4.0.0: + resolution: {integrity: sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + pkg-types@1.1.1: + resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} + + plur@5.1.0: + resolution: {integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-array@3.0.2: + resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} + engines: {node: '>=12'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + 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==} + + postgres@3.4.4: + resolution: {integrity: sha512-IbyN+9KslkqcXa8AO9fxpk97PA4pzewvpi2B3Dwy9u4zpV32QicaEdgmF3eSQUzdRk7ttDHQejNgAEr4XoeH4A==} + engines: {node: '>=12'} + + prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + engines: {node: '>=10'} + hasBin: true + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-ms@8.0.0: + resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} + engines: {node: '>=14.16'} + + printable-characters@1.0.42: + resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} + + ps-tree@1.2.0: + resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} + engines: {node: '>= 0.10'} + hasBin: true + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + redeyed@2.1.1: + resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rollup-plugin-inject@3.0.2: + resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. + + rollup-plugin-node-polyfills@0.2.1: + resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==} + + rollup-pluginutils@2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + + rollup@4.17.2: + resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + split-ca@1.0.1: + resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + split@0.3.3: + resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + + ssh2@1.15.0: + resolution: {integrity: sha512-C0PHgX4h6lBxYx7hcXwu3QWdh4tg6tZZsTfXcdvc5caW/EMxaB4H9dWsl7qk+F7LAW762hp8VbXOX7x4xUYvEw==} + engines: {node: '>=10.16.0'} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + stacktracey@2.1.8: + resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + + stream-combiner@0.0.4: + resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + + strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + superjson@2.2.1: + resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + engines: {node: '>=16'} + + supertap@3.0.1: + resolution: {integrity: sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-hyperlinks@3.0.0: + resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==} + engines: {node: '>=14.18'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + + tar-fs@2.0.1: + resolution: {integrity: sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==} + + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + time-zone@1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + + timers-ext@0.1.7: + resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + + tinybench@2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-expose-internals-conditionally@1.0.0-empty.0: + resolution: {integrity: sha512-F8m9NOF6ZhdOClDVdlM8gj3fDCav4ZIFSs/EI3ksQbAAXVSCN/Jh5OCJDDZWBuBy9psFc6jULGDlPwjMYMhJDw==} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfck@3.0.3: + resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tsup@8.0.2: + resolution: {integrity: sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tsx@3.14.0: + resolution: {integrity: sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==} + hasBin: true + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + + typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + + unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + utf-8-validate@6.0.3: + resolution: {integrity: sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==} + engines: {node: '>=6.14.2'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-tsconfig-paths@4.3.2: + resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@5.2.11: + resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@1.6.0: + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webpod@0.0.2: + resolution: {integrity: sha512-cSwwQIeg8v4i3p4ajHhwgR7N6VyxAf+KYSSsY6Pd3aETE+xEU4vbitz7qQkB0I321xnhDdgtxuiSfk5r/FVtjg==} + hasBin: true + + well-known-symbols@2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@3.0.1: + resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + workerd@1.20240512.0: + resolution: {integrity: sha512-VUBmR1PscAPHEE0OF/G2K7/H1gnr9aDWWZzdkIgWfNKkv8dKFCT75H+GJtUHjfwqz3rYCzaNZmatSXOpLGpF8A==} + engines: {node: '>=16'} + hasBin: true + + wrangler@3.57.0: + resolution: {integrity: sha512-izK3AZtlFoTq8N0EZjLOQ7hqwsjaXCc1cbNKuhsLJjDX1jB1YZBDPhIhtXL4VVzkJAcH+0Zw2gguOePFCHNaxw==} + engines: {node: '>=16.17.0'} + hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^4.20240512.0 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.17.0: + resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + xxhash-wasm@1.0.2: + resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.4.2: + resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + youch@3.3.3: + resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + + zx@7.2.3: + resolution: {integrity: sha512-QODu38nLlYXg/B/Gw7ZKiZrvPkEsjPN3LQ5JFXM7h0JvwhEdPNNl+4Ao1y4+o3CLNiDUNcwzQYZ4/Ko7kKzCMA==} + engines: {node: '>= 16.0.0'} + hasBin: true + +snapshots: + + '@andrewbranch/untar.js@1.0.3': {} + + '@arethetypeswrong/cli@0.15.3': + dependencies: + '@arethetypeswrong/core': 0.15.1 + chalk: 4.1.2 + cli-table3: 0.6.5 + commander: 10.0.1 + marked: 9.1.6 + marked-terminal: 6.2.0(marked@9.1.6) + semver: 7.6.2 + + '@arethetypeswrong/core@0.15.1': + dependencies: + '@andrewbranch/untar.js': 1.0.3 + fflate: 0.8.2 + semver: 7.6.2 + ts-expose-internals-conditionally: 1.0.0-empty.0 + typescript: 5.3.3 + validate-npm-package-name: 5.0.1 + + '@aws-crypto/ie11-detection@3.0.0': + dependencies: + tslib: 1.14.1 + + '@aws-crypto/sha256-browser@3.0.0': + dependencies: + '@aws-crypto/ie11-detection': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-crypto/supports-web-crypto': 3.0.0 + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-locate-window': 3.568.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + + '@aws-crypto/sha256-js@3.0.0': + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.577.0 + tslib: 1.14.1 + + '@aws-crypto/supports-web-crypto@3.0.0': + dependencies: + tslib: 1.14.1 + + '@aws-crypto/util@3.0.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + + '@aws-sdk/client-rds-data@3.577.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sso-oidc': 3.577.0(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/client-sts': 3.577.0 + '@aws-sdk/core': 3.576.0 + '@aws-sdk/credential-provider-node': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0))(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.577.0 + '@aws-sdk/region-config-resolver': 3.577.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.577.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.577.0 + '@smithy/config-resolver': 3.0.0 + '@smithy/core': 2.0.1 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.0 + '@smithy/middleware-retry': 3.0.1 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.0.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.0.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.1 + '@smithy/util-defaults-mode-node': 3.0.1 + '@smithy/util-endpoints': 2.0.0 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0)': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.577.0 + '@aws-sdk/core': 3.576.0 + '@aws-sdk/credential-provider-node': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0))(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.577.0 + '@aws-sdk/region-config-resolver': 3.577.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.577.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.577.0 + '@smithy/config-resolver': 3.0.0 + '@smithy/core': 2.0.1 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.0 + '@smithy/middleware-retry': 3.0.1 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.0.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.0.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.1 + '@smithy/util-defaults-mode-node': 3.0.1 + '@smithy/util-endpoints': 2.0.0 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sts' + - aws-crt + + '@aws-sdk/client-sso@3.577.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/core': 3.576.0 + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.577.0 + '@aws-sdk/region-config-resolver': 3.577.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.577.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.577.0 + '@smithy/config-resolver': 3.0.0 + '@smithy/core': 2.0.1 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.0 + '@smithy/middleware-retry': 3.0.1 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.0.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.0.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.1 + '@smithy/util-defaults-mode-node': 3.0.1 + '@smithy/util-endpoints': 2.0.0 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sts@3.577.0': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sso-oidc': 3.577.0(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/core': 3.576.0 + '@aws-sdk/credential-provider-node': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0))(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/middleware-host-header': 3.577.0 + '@aws-sdk/middleware-logger': 3.577.0 + '@aws-sdk/middleware-recursion-detection': 3.577.0 + '@aws-sdk/middleware-user-agent': 3.577.0 + '@aws-sdk/region-config-resolver': 3.577.0 + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.577.0 + '@aws-sdk/util-user-agent-browser': 3.577.0 + '@aws-sdk/util-user-agent-node': 3.577.0 + '@smithy/config-resolver': 3.0.0 + '@smithy/core': 2.0.1 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/hash-node': 3.0.0 + '@smithy/invalid-dependency': 3.0.0 + '@smithy/middleware-content-length': 3.0.0 + '@smithy/middleware-endpoint': 3.0.0 + '@smithy/middleware-retry': 3.0.1 + '@smithy/middleware-serde': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/node-config-provider': 3.0.0 + '@smithy/node-http-handler': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.0.1 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-body-length-browser': 3.0.0 + '@smithy/util-body-length-node': 3.0.0 + '@smithy/util-defaults-mode-browser': 3.0.1 + '@smithy/util-defaults-mode-node': 3.0.1 + '@smithy/util-endpoints': 2.0.0 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.576.0': + dependencies: + '@smithy/core': 2.0.1 + '@smithy/protocol-http': 4.0.0 + '@smithy/signature-v4': 3.0.0 + '@smithy/smithy-client': 3.0.1 + '@smithy/types': 3.0.0 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + + '@aws-sdk/credential-provider-env@3.577.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/credential-provider-http@3.577.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/node-http-handler': 3.0.0 + '@smithy/property-provider': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.0.1 + '@smithy/types': 3.0.0 + '@smithy/util-stream': 3.0.1 + tslib: 2.6.2 + + '@aws-sdk/credential-provider-ini@3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0))(@aws-sdk/client-sts@3.577.0)': + dependencies: + '@aws-sdk/client-sts': 3.577.0 + '@aws-sdk/credential-provider-env': 3.577.0 + '@aws-sdk/credential-provider-process': 3.577.0 + '@aws-sdk/credential-provider-sso': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0)) + '@aws-sdk/credential-provider-web-identity': 3.577.0(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.0.0 + '@smithy/property-provider': 3.0.0 + '@smithy/shared-ini-file-loader': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-node@3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0))(@aws-sdk/client-sts@3.577.0)': + dependencies: + '@aws-sdk/credential-provider-env': 3.577.0 + '@aws-sdk/credential-provider-http': 3.577.0 + '@aws-sdk/credential-provider-ini': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0))(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/credential-provider-process': 3.577.0 + '@aws-sdk/credential-provider-sso': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0)) + '@aws-sdk/credential-provider-web-identity': 3.577.0(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/types': 3.577.0 + '@smithy/credential-provider-imds': 3.0.0 + '@smithy/property-provider': 3.0.0 + '@smithy/shared-ini-file-loader': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + + '@aws-sdk/credential-provider-process@3.577.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.0.0 + '@smithy/shared-ini-file-loader': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/credential-provider-sso@3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0))': + dependencies: + '@aws-sdk/client-sso': 3.577.0 + '@aws-sdk/token-providers': 3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0)) + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.0.0 + '@smithy/shared-ini-file-loader': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.577.0(@aws-sdk/client-sts@3.577.0)': + dependencies: + '@aws-sdk/client-sts': 3.577.0 + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/middleware-host-header@3.577.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/middleware-logger@3.577.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/middleware-recursion-detection@3.577.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/middleware-user-agent@3.577.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@aws-sdk/util-endpoints': 3.577.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/region-config-resolver@3.577.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/node-config-provider': 3.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/token-providers@3.577.0(@aws-sdk/client-sso-oidc@3.577.0(@aws-sdk/client-sts@3.577.0))': + dependencies: + '@aws-sdk/client-sso-oidc': 3.577.0(@aws-sdk/client-sts@3.577.0) + '@aws-sdk/types': 3.577.0 + '@smithy/property-provider': 3.0.0 + '@smithy/shared-ini-file-loader': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/types@3.577.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/util-endpoints@3.577.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/types': 3.0.0 + '@smithy/util-endpoints': 2.0.0 + tslib: 2.6.2 + + '@aws-sdk/util-locate-window@3.568.0': + dependencies: + tslib: 2.6.2 + + '@aws-sdk/util-user-agent-browser@3.577.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/types': 3.0.0 + bowser: 2.11.0 + tslib: 2.6.2 + + '@aws-sdk/util-user-agent-node@3.577.0': + dependencies: + '@aws-sdk/types': 3.577.0 + '@smithy/node-config-provider': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@aws-sdk/util-utf8-browser@3.259.0': + dependencies: + tslib: 2.6.2 + + '@balena/dockerignore@1.0.2': {} + + '@cloudflare/kv-asset-handler@0.3.2': + dependencies: + mime: 3.0.0 + + '@cloudflare/workerd-darwin-64@1.20240512.0': + optional: true + + '@cloudflare/workerd-darwin-arm64@1.20240512.0': + optional: true + + '@cloudflare/workerd-linux-64@1.20240512.0': + optional: true + + '@cloudflare/workerd-linux-arm64@1.20240512.0': + optional: true + + '@cloudflare/workerd-windows-64@1.20240512.0': + optional: true + + '@cloudflare/workers-types@4.20240512.0': {} + + '@colors/colors@1.5.0': + optional: true + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@electric-sql/pglite@0.1.5': {} + + '@esbuild-kit/core-utils@3.3.2': + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + + '@esbuild-kit/esm-loader@2.6.5': + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.7.5 + + '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19)': + dependencies: + esbuild: 0.17.19 + + '@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.17.19)': + dependencies: + esbuild: 0.17.19 + escape-string-regexp: 4.0.0 + rollup-plugin-node-polyfills: 0.2.1 + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.17.19': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm@0.17.19': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-x64@0.17.19': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.17.19': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.17.19': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.17.19': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.17.19': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.17.19': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm@0.17.19': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.17.19': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.14.54': + optional: true + + '@esbuild/linux-loong64@0.17.19': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.17.19': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.17.19': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.17.19': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.17.19': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-x64@0.17.19': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.17.19': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.17.19': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.17.19': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.17.19': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.17.19': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-x64@0.17.19': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.10.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@ewoudenberg/difflib@0.1.0': + dependencies: + heap: 0.2.7 + + '@fastify/busboy@2.1.1': {} + + '@hono/node-server@1.11.1': {} + + '@hono/zod-validator@0.2.1(hono@4.3.9)(zod@3.23.8)': + dependencies: + hono: 4.3.9 + zod: 3.23.8 + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@libsql/client@0.4.3(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@libsql/core': 0.4.3 + '@libsql/hrana-client': 0.5.6(bufferutil@4.0.8)(utf-8-validate@6.0.3) + js-base64: 3.7.7 + optionalDependencies: + libsql: 0.2.0 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@libsql/core@0.4.3': + dependencies: + js-base64: 3.7.7 + + '@libsql/darwin-arm64@0.2.0': + optional: true + + '@libsql/darwin-x64@0.2.0': + optional: true + + '@libsql/hrana-client@0.5.6(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@libsql/isomorphic-fetch': 0.1.12 + '@libsql/isomorphic-ws': 0.1.5(bufferutil@4.0.8)(utf-8-validate@6.0.3) + js-base64: 3.7.7 + node-fetch: 3.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@libsql/isomorphic-fetch@0.1.12': + dependencies: + '@types/node-fetch': 2.6.11 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + '@libsql/isomorphic-ws@0.1.5(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + dependencies: + '@types/ws': 8.5.10 + ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@libsql/linux-arm64-gnu@0.2.0': + optional: true + + '@libsql/linux-arm64-musl@0.2.0': + optional: true + + '@libsql/linux-x64-gnu@0.2.0': + optional: true + + '@libsql/linux-x64-musl@0.2.0': + optional: true + + '@libsql/win32-x64-msvc@0.2.0': + optional: true + + '@neon-rs/load@0.0.4': + optional: true + + '@neondatabase/serverless@0.7.2': + dependencies: + '@types/pg': 8.6.6 + + '@neondatabase/serverless@0.9.3': + dependencies: + '@types/pg': 8.11.6 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@originjs/vite-plugin-commonjs@1.0.3': + dependencies: + esbuild: 0.14.54 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.1.1': {} + + '@planetscale/database@1.18.0': {} + + '@rollup/rollup-android-arm-eabi@4.17.2': + optional: true + + '@rollup/rollup-android-arm64@4.17.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.17.2': + optional: true + + '@rollup/rollup-darwin-x64@4.17.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.17.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.17.2': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.17.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.17.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.17.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.17.2': + optional: true + + '@sinclair/typebox@0.27.8': {} + + '@sindresorhus/is@4.6.0': {} + + '@smithy/abort-controller@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/config-resolver@3.0.0': + dependencies: + '@smithy/node-config-provider': 3.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-config-provider': 3.0.0 + '@smithy/util-middleware': 3.0.0 + tslib: 2.6.2 + + '@smithy/core@2.0.1': + dependencies: + '@smithy/middleware-endpoint': 3.0.0 + '@smithy/middleware-retry': 3.0.1 + '@smithy/middleware-serde': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/smithy-client': 3.0.1 + '@smithy/types': 3.0.0 + '@smithy/util-middleware': 3.0.0 + tslib: 2.6.2 + + '@smithy/credential-provider-imds@3.0.0': + dependencies: + '@smithy/node-config-provider': 3.0.0 + '@smithy/property-provider': 3.0.0 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + tslib: 2.6.2 + + '@smithy/fetch-http-handler@3.0.1': + dependencies: + '@smithy/protocol-http': 4.0.0 + '@smithy/querystring-builder': 3.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-base64': 3.0.0 + tslib: 2.6.2 + + '@smithy/hash-node@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + + '@smithy/invalid-dependency@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/is-array-buffer@3.0.0': + dependencies: + tslib: 2.6.2 + + '@smithy/middleware-content-length@3.0.0': + dependencies: + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/middleware-endpoint@3.0.0': + dependencies: + '@smithy/middleware-serde': 3.0.0 + '@smithy/node-config-provider': 3.0.0 + '@smithy/shared-ini-file-loader': 3.0.0 + '@smithy/types': 3.0.0 + '@smithy/url-parser': 3.0.0 + '@smithy/util-middleware': 3.0.0 + tslib: 2.6.2 + + '@smithy/middleware-retry@3.0.1': + dependencies: + '@smithy/node-config-provider': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/service-error-classification': 3.0.0 + '@smithy/smithy-client': 3.0.1 + '@smithy/types': 3.0.0 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-retry': 3.0.0 + tslib: 2.6.2 + uuid: 9.0.1 + + '@smithy/middleware-serde@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/middleware-stack@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/node-config-provider@3.0.0': + dependencies: + '@smithy/property-provider': 3.0.0 + '@smithy/shared-ini-file-loader': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/node-http-handler@3.0.0': + dependencies: + '@smithy/abort-controller': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/querystring-builder': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/property-provider@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/protocol-http@4.0.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/querystring-builder@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + '@smithy/util-uri-escape': 3.0.0 + tslib: 2.6.2 + + '@smithy/querystring-parser@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/service-error-classification@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + + '@smithy/shared-ini-file-loader@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/signature-v4@3.0.0': + dependencies: + '@smithy/is-array-buffer': 3.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-middleware': 3.0.0 + '@smithy/util-uri-escape': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + + '@smithy/smithy-client@3.0.1': + dependencies: + '@smithy/middleware-endpoint': 3.0.0 + '@smithy/middleware-stack': 3.0.0 + '@smithy/protocol-http': 4.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-stream': 3.0.1 + tslib: 2.6.2 + + '@smithy/types@3.0.0': + dependencies: + tslib: 2.6.2 + + '@smithy/url-parser@3.0.0': + dependencies: + '@smithy/querystring-parser': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/util-base64@3.0.0': + dependencies: + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + + '@smithy/util-body-length-browser@3.0.0': + dependencies: + tslib: 2.6.2 + + '@smithy/util-body-length-node@3.0.0': + dependencies: + tslib: 2.6.2 + + '@smithy/util-buffer-from@3.0.0': + dependencies: + '@smithy/is-array-buffer': 3.0.0 + tslib: 2.6.2 + + '@smithy/util-config-provider@3.0.0': + dependencies: + tslib: 2.6.2 + + '@smithy/util-defaults-mode-browser@3.0.1': + dependencies: + '@smithy/property-provider': 3.0.0 + '@smithy/smithy-client': 3.0.1 + '@smithy/types': 3.0.0 + bowser: 2.11.0 + tslib: 2.6.2 + + '@smithy/util-defaults-mode-node@3.0.1': + dependencies: + '@smithy/config-resolver': 3.0.0 + '@smithy/credential-provider-imds': 3.0.0 + '@smithy/node-config-provider': 3.0.0 + '@smithy/property-provider': 3.0.0 + '@smithy/smithy-client': 3.0.1 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/util-endpoints@2.0.0': + dependencies: + '@smithy/node-config-provider': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/util-hex-encoding@3.0.0': + dependencies: + tslib: 2.6.2 + + '@smithy/util-middleware@3.0.0': + dependencies: + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/util-retry@3.0.0': + dependencies: + '@smithy/service-error-classification': 3.0.0 + '@smithy/types': 3.0.0 + tslib: 2.6.2 + + '@smithy/util-stream@3.0.1': + dependencies: + '@smithy/fetch-http-handler': 3.0.1 + '@smithy/node-http-handler': 3.0.0 + '@smithy/types': 3.0.0 + '@smithy/util-base64': 3.0.0 + '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-hex-encoding': 3.0.0 + '@smithy/util-utf8': 3.0.0 + tslib: 2.6.2 + + '@smithy/util-uri-escape@3.0.0': + dependencies: + tslib: 2.6.2 + + '@smithy/util-utf8@3.0.0': + dependencies: + '@smithy/util-buffer-from': 3.0.0 + tslib: 2.6.2 + + '@types/better-sqlite3@7.6.10': + dependencies: + '@types/node': 18.19.33 + + '@types/docker-modem@3.0.6': + dependencies: + '@types/node': 18.19.33 + '@types/ssh2': 1.15.0 + + '@types/dockerode@3.3.29': + dependencies: + '@types/docker-modem': 3.0.6 + '@types/node': 18.19.33 + '@types/ssh2': 1.15.0 + + '@types/estree@1.0.5': {} + + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 18.19.33 + + '@types/glob@8.1.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 18.19.33 + + '@types/json-diff@1.0.3': {} + + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 18.19.33 + + '@types/minimatch@5.1.2': {} + + '@types/minimist@1.2.5': {} + + '@types/node-fetch@2.6.11': + dependencies: + '@types/node': 18.19.33 + form-data: 4.0.0 + + '@types/node-forge@1.3.11': + dependencies: + '@types/node': 18.19.33 + + '@types/node@18.19.33': + dependencies: + undici-types: 5.26.5 + + '@types/pg@8.11.6': + dependencies: + '@types/node': 18.19.33 + pg-protocol: 1.6.1 + pg-types: 4.0.2 + + '@types/pg@8.6.6': + dependencies: + '@types/node': 18.19.33 + pg-protocol: 1.6.1 + pg-types: 2.2.0 + + '@types/pluralize@0.0.33': {} + + '@types/ps-tree@1.1.6': {} + + '@types/semver@7.5.8': {} + + '@types/ssh2@1.15.0': + dependencies: + '@types/node': 18.19.33 + + '@types/uuid@9.0.8': {} + + '@types/which@3.0.3': {} + + '@types/ws@8.5.10': + dependencies: + '@types/node': 18.19.33 + + '@typescript-eslint/eslint-plugin@7.10.0(@typescript-eslint/parser@7.10.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.10.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.10.0 + '@typescript-eslint/type-utils': 7.10.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.10.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.10.0 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.10.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/scope-manager': 7.10.0 + '@typescript-eslint/types': 7.10.0 + '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.10.0 + debug: 4.3.4 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.10.0': + dependencies: + '@typescript-eslint/types': 7.10.0 + '@typescript-eslint/visitor-keys': 7.10.0 + + '@typescript-eslint/type-utils@7.10.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.10.0(eslint@8.57.0)(typescript@5.4.5) + debug: 4.3.4 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@7.10.0': {} + + '@typescript-eslint/typescript-estree@7.10.0(typescript@5.4.5)': + dependencies: + '@typescript-eslint/types': 7.10.0 + '@typescript-eslint/visitor-keys': 7.10.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.10.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@typescript-eslint/scope-manager': 7.10.0 + '@typescript-eslint/types': 7.10.0 + '@typescript-eslint/typescript-estree': 7.10.0(typescript@5.4.5) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@7.10.0': + dependencies: + '@typescript-eslint/types': 7.10.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.0': {} + + '@vercel/postgres@0.8.0': + dependencies: + '@neondatabase/serverless': 0.7.2 + bufferutil: 4.0.8 + utf-8-validate: 6.0.3 + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + + '@vitest/expect@1.6.0': + dependencies: + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + chai: 4.4.1 + + '@vitest/runner@1.6.0': + dependencies: + '@vitest/utils': 1.6.0 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/snapshot@1.6.0': + dependencies: + magic-string: 0.30.10 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.6.0': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.6.0': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + acorn-jsx@5.3.2(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + + acorn-walk@8.3.2: {} + + acorn@8.11.3: {} + + aggregate-error@4.0.1: + dependencies: + clean-stack: 4.2.0 + indent-string: 5.0.0 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-escapes@6.2.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + ansicolors@0.3.2: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-find-index@1.0.2: {} + + array-union@2.1.0: {} + + arrgv@1.0.2: {} + + arrify@3.0.0: {} + + as-table@1.0.55: + dependencies: + printable-characters: 1.0.42 + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assertion-error@1.1.0: {} + + asynckit@0.4.0: {} + + ava@5.3.1: + dependencies: + acorn: 8.11.3 + acorn-walk: 8.3.2 + ansi-styles: 6.2.1 + arrgv: 1.0.2 + arrify: 3.0.0 + callsites: 4.1.0 + cbor: 8.1.0 + chalk: 5.3.0 + chokidar: 3.6.0 + chunkd: 2.0.1 + ci-info: 3.9.0 + ci-parallel-vars: 1.0.1 + clean-yaml-object: 0.1.0 + cli-truncate: 3.1.0 + code-excerpt: 4.0.0 + common-path-prefix: 3.0.0 + concordance: 5.0.4 + currently-unhandled: 0.4.1 + debug: 4.3.4 + emittery: 1.0.3 + figures: 5.0.0 + globby: 13.2.2 + ignore-by-default: 2.1.0 + indent-string: 5.0.0 + is-error: 2.2.2 + is-plain-object: 5.0.0 + is-promise: 4.0.0 + matcher: 5.0.0 + mem: 9.0.2 + ms: 2.1.3 + p-event: 5.0.1 + p-map: 5.5.0 + picomatch: 2.3.1 + pkg-conf: 4.0.0 + plur: 5.1.0 + pretty-ms: 8.0.0 + resolve-cwd: 3.0.0 + stack-utils: 2.0.6 + strip-ansi: 7.1.0 + supertap: 3.0.1 + temp-dir: 3.0.0 + write-file-atomic: 5.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + better-sqlite3@9.6.0: + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.2 + + binary-extensions@2.3.0: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + blake3-wasm@2.1.5: {} + + blueimp-md5@2.19.0: {} + + bowser@2.11.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.2: + dependencies: + fill-range: 7.1.1 + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bufferutil@4.0.8: + dependencies: + node-gyp-build: 4.8.1 + + buildcheck@0.0.6: + optional: true + + bundle-require@4.1.0(esbuild@0.19.12): + dependencies: + esbuild: 0.19.12 + load-tsconfig: 0.2.5 + + cac@6.7.14: {} + + callsites@3.1.0: {} + + callsites@4.1.0: {} + + camelcase@7.0.1: {} + + capnp-ts@0.7.0: + dependencies: + debug: 4.3.4 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + + cardinal@2.1.1: + dependencies: + ansicolors: 0.3.2 + redeyed: 2.1.1 + + cbor@8.1.0: + dependencies: + nofilter: 3.1.0 + + chai@4.4.1: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.3.0: {} + + char-regex@1.0.2: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@1.1.4: {} + + chunkd@2.0.1: {} + + ci-info@3.9.0: {} + + ci-parallel-vars@1.0.1: {} + + clean-stack@4.2.0: + dependencies: + escape-string-regexp: 5.0.0 + + clean-yaml-object@0.1.0: {} + + cli-color@2.0.4: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + memoizee: 0.4.15 + timers-ext: 0.1.7 + + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + cli-truncate@3.1.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + code-excerpt@4.0.0: + dependencies: + convert-to-spaces: 2.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colors@1.4.0: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + commander@12.1.0: {} + + commander@4.1.1: {} + + commander@9.5.0: {} + + common-path-prefix@3.0.0: {} + + concat-map@0.0.1: {} + + concordance@5.0.4: + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.3.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.6.2 + well-known-symbols: 2.0.0 + + confbox@0.1.7: {} + + convert-to-spaces@2.0.1: {} + + cookie@0.5.0: {} + + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + + cpu-features@0.0.10: + dependencies: + buildcheck: 0.0.6 + nan: 2.19.0 + optional: true + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + currently-unhandled@0.4.1: + dependencies: + array-find-index: 1.0.2 + + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.2 + + data-uri-to-buffer@2.0.2: {} + + data-uri-to-buffer@4.0.1: {} + + date-time@3.1.0: + dependencies: + time-zone: 1.0.0 + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-eql@4.1.3: + dependencies: + type-detect: 4.0.8 + + deep-extend@0.6.0: {} + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + denque@2.1.0: {} + + detect-libc@2.0.2: + optional: true + + detect-libc@2.0.3: {} + + diff-sequences@29.6.3: {} + + difflib@0.2.4(patch_hash=jq4t3ysdpnbunjeje4v7nrqn2q): + dependencies: + heap: 0.2.7 + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + docker-modem@3.0.8: + dependencies: + debug: 4.3.4 + readable-stream: 3.6.2 + split-ca: 1.0.1 + ssh2: 1.15.0 + transitivePeerDependencies: + - supports-color + + dockerode@3.3.5: + dependencies: + '@balena/dockerignore': 1.0.2 + docker-modem: 3.0.8 + tar-fs: 2.0.1 + transitivePeerDependencies: + - supports-color + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dotenv@16.4.5: {} + + dreamopt@0.8.0: + dependencies: + wordwrap: 1.0.0 + + drizzle-kit@0.21.2: + dependencies: + '@esbuild-kit/esm-loader': 2.6.5 + commander: 9.5.0 + env-paths: 3.0.0 + esbuild: 0.19.12 + esbuild-register: 3.5.0(esbuild@0.19.12) + glob: 8.1.0 + hanji: 0.0.5 + json-diff: 0.9.0 + zod: 3.23.8 + transitivePeerDependencies: + - supports-color + + drizzle-orm@0.32.0-85c8008(@aws-sdk/client-rds-data@3.577.0)(@cloudflare/workers-types@4.20240512.0)(@electric-sql/pglite@0.1.5)(@libsql/client@0.4.3(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@neondatabase/serverless@0.9.3)(@planetscale/database@1.18.0)(@types/better-sqlite3@7.6.10)(@types/pg@8.11.6)(@vercel/postgres@0.8.0)(better-sqlite3@9.6.0)(mysql2@2.3.3)(pg@8.11.5)(postgres@3.4.4): + optionalDependencies: + '@aws-sdk/client-rds-data': 3.577.0 + '@cloudflare/workers-types': 4.20240512.0 + '@electric-sql/pglite': 0.1.5 + '@libsql/client': 0.4.3(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@neondatabase/serverless': 0.9.3 + '@planetscale/database': 1.18.0 + '@types/better-sqlite3': 7.6.10 + '@types/pg': 8.11.6 + '@vercel/postgres': 0.8.0 + better-sqlite3: 9.6.0 + mysql2: 2.3.3 + pg: 8.11.5 + postgres: 3.4.4 + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + emittery@1.0.3: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojilib@2.4.0: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + env-paths@3.0.0: {} + + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + es6-weak-map@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + + esbuild-android-64@0.14.54: + optional: true + + esbuild-android-arm64@0.14.54: + optional: true + + esbuild-darwin-64@0.14.54: + optional: true + + esbuild-darwin-arm64@0.14.54: + optional: true + + esbuild-freebsd-64@0.14.54: + optional: true + + esbuild-freebsd-arm64@0.14.54: + optional: true + + esbuild-linux-32@0.14.54: + optional: true + + esbuild-linux-64@0.14.54: + optional: true + + esbuild-linux-arm64@0.14.54: + optional: true + + esbuild-linux-arm@0.14.54: + optional: true + + esbuild-linux-mips64le@0.14.54: + optional: true + + esbuild-linux-ppc64le@0.14.54: + optional: true + + esbuild-linux-riscv64@0.14.54: + optional: true + + esbuild-linux-s390x@0.14.54: + optional: true + + esbuild-netbsd-64@0.14.54: + optional: true + + esbuild-node-externals@1.13.1(esbuild@0.19.12): + dependencies: + esbuild: 0.19.12 + find-up: 5.0.0 + tslib: 2.6.2 + + esbuild-openbsd-64@0.14.54: + optional: true + + esbuild-register@3.5.0(esbuild@0.19.12): + dependencies: + debug: 4.3.4 + esbuild: 0.19.12 + transitivePeerDependencies: + - supports-color + + esbuild-sunos-64@0.14.54: + optional: true + + esbuild-windows-32@0.14.54: + optional: true + + esbuild-windows-64@0.14.54: + optional: true + + esbuild-windows-arm64@0.14.54: + optional: true + + esbuild@0.14.54: + optionalDependencies: + '@esbuild/linux-loong64': 0.14.54 + esbuild-android-64: 0.14.54 + esbuild-android-arm64: 0.14.54 + esbuild-darwin-64: 0.14.54 + esbuild-darwin-arm64: 0.14.54 + esbuild-freebsd-64: 0.14.54 + esbuild-freebsd-arm64: 0.14.54 + esbuild-linux-32: 0.14.54 + esbuild-linux-64: 0.14.54 + esbuild-linux-arm: 0.14.54 + esbuild-linux-arm64: 0.14.54 + esbuild-linux-mips64le: 0.14.54 + esbuild-linux-ppc64le: 0.14.54 + esbuild-linux-riscv64: 0.14.54 + esbuild-linux-s390x: 0.14.54 + esbuild-netbsd-64: 0.14.54 + esbuild-openbsd-64: 0.14.54 + esbuild-sunos-64: 0.14.54 + esbuild-windows-32: 0.14.54 + esbuild-windows-64: 0.14.54 + esbuild-windows-arm64: 0.14.54 + + esbuild@0.17.19: + optionalDependencies: + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + escalade@3.1.2: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-prettier@9.1.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8): + dependencies: + eslint: 8.57.0 + prettier: 2.8.8 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.57.0) + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.2 + + espree@9.6.1: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@0.6.1: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + + esutils@2.0.3: {} + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + + event-stream@3.3.4: + dependencies: + duplexer: 0.1.2 + from: 0.1.7 + map-stream: 0.1.0 + pause-stream: 0.0.11 + split: 0.3.3 + stream-combiner: 0.0.4 + through: 2.3.8 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + exit-hook@2.2.1: {} + + expand-template@2.0.3: {} + + ext@1.7.0: + dependencies: + type: 2.7.2 + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-xml-parser@4.2.5: + dependencies: + strnum: 1.0.5 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + fflate@0.8.2: {} + + figures@5.0.0: + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-up@6.3.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.1: {} + + foreground-child@3.1.1: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + from@0.1.7: {} + + fs-constants@1.0.0: {} + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + fx@34.0.0: {} + + generate-function@2.3.1: + dependencies: + is-property: 1.0.2 + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-port@6.1.2: {} + + get-source@2.0.12: + dependencies: + data-uri-to-buffer: 2.0.2 + source-map: 0.6.1 + + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + get-tsconfig@4.7.5: + dependencies: + resolve-pkg-maps: 1.0.0 + + github-from-package@0.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@10.3.15: + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.1.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + globby@13.2.2: + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 4.0.0 + + globrex@0.1.2: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + hanji@0.0.5: + dependencies: + lodash.throttle: 4.1.1 + sisteransi: 1.0.5 + + has-flag@4.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + heap@0.2.7: {} + + hono@4.3.9: {} + + human-signals@2.1.0: {} + + human-signals@5.0.0: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore-by-default@2.1.0: {} + + ignore@5.3.1: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@5.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + irregular-plurals@3.5.0: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.2 + + is-error@2.2.2: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-object@5.0.0: {} + + is-promise@2.2.2: {} + + is-promise@4.0.0: {} + + is-property@1.0.2: {} + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-unicode-supported@1.3.0: {} + + is-what@4.1.16: {} + + isexe@2.0.0: {} + + jackspeak@2.3.6: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + joycon@3.1.1: {} + + js-base64@3.7.7: {} + + js-string-escape@1.0.1: {} + + js-tokens@9.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-diff@0.9.0: + dependencies: + cli-color: 2.0.4 + difflib: 0.2.4(patch_hash=jq4t3ysdpnbunjeje4v7nrqn2q) + dreamopt: 0.8.0 + + json-diff@1.0.6: + dependencies: + '@ewoudenberg/difflib': 0.1.0 + colors: 1.4.0 + dreamopt: 0.8.0 + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + libsql@0.2.0: + dependencies: + '@neon-rs/load': 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + '@libsql/darwin-arm64': 0.2.0 + '@libsql/darwin-x64': 0.2.0 + '@libsql/linux-arm64-gnu': 0.2.0 + '@libsql/linux-arm64-musl': 0.2.0 + '@libsql/linux-x64-gnu': 0.2.0 + '@libsql/linux-x64-musl': 0.2.0 + '@libsql/win32-x64-msvc': 0.2.0 + optional: true + + lilconfig@3.1.1: {} + + lines-and-columns@1.2.4: {} + + load-json-file@7.0.1: {} + + load-tsconfig@0.2.5: {} + + local-pkg@0.5.0: + dependencies: + mlly: 1.7.0 + pkg-types: 1.1.1 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash.merge@4.6.2: {} + + lodash.sortby@4.7.0: {} + + lodash.throttle@4.1.1: {} + + lodash@4.17.21: {} + + long@4.0.0: {} + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lru-cache@10.2.2: {} + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + lru-cache@7.18.3: {} + + lru-queue@0.1.0: + dependencies: + es5-ext: 0.10.64 + + magic-string@0.25.9: + dependencies: + sourcemap-codec: 1.4.8 + + magic-string@0.30.10: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + map-age-cleaner@0.1.3: + dependencies: + p-defer: 1.0.0 + + map-stream@0.1.0: {} + + marked-terminal@6.2.0(marked@9.1.6): + dependencies: + ansi-escapes: 6.2.1 + cardinal: 2.1.1 + chalk: 5.3.0 + cli-table3: 0.6.5 + marked: 9.1.6 + node-emoji: 2.1.3 + supports-hyperlinks: 3.0.0 + + marked@9.1.6: {} + + matcher@5.0.0: + dependencies: + escape-string-regexp: 5.0.0 + + md5-hex@3.0.1: + dependencies: + blueimp-md5: 2.19.0 + + mem@9.0.2: + dependencies: + map-age-cleaner: 0.1.3 + mimic-fn: 4.0.0 + + memoizee@0.4.15: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-weak-map: 2.0.3 + event-emitter: 0.3.5 + is-promise: 2.2.2 + lru-queue: 0.1.0 + next-tick: 1.1.0 + timers-ext: 0.1.7 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.5: + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@3.0.0: {} + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + mimic-response@3.1.0: {} + + miniflare@3.20240512.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + acorn: 8.11.3 + acorn-walk: 8.3.2 + capnp-ts: 0.7.0 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + stoppable: 1.1.0 + undici: 5.28.4 + workerd: 1.20240512.0 + ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + youch: 3.3.3 + zod: 3.23.8 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@7.4.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.1: {} + + mkdirp-classic@0.5.3: {} + + mlly@1.7.0: + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.1.1 + ufo: 1.5.3 + + ms@2.1.2: {} + + ms@2.1.3: {} + + mustache@4.2.0: {} + + mysql2@2.3.3: + dependencies: + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.6.3 + long: 4.0.0 + lru-cache: 6.0.0 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + named-placeholders@1.1.3: + dependencies: + lru-cache: 7.18.3 + + nan@2.19.0: + optional: true + + nanoid@3.3.7: {} + + napi-build-utils@1.0.2: {} + + natural-compare@1.4.0: {} + + next-tick@1.1.0: {} + + node-abi@3.62.0: + dependencies: + semver: 7.6.2 + + node-domexception@1.0.0: {} + + node-emoji@2.1.3: + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-fetch@3.3.1: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-forge@1.3.1: {} + + node-gyp-build@4.8.1: {} + + nofilter@3.1.0: {} + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + object-assign@4.1.1: {} + + obuf@1.1.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-defer@1.0.0: {} + + p-event@5.0.1: + dependencies: + p-timeout: 5.1.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.0.0 + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.0.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-map@5.5.0: + dependencies: + aggregate-error: 4.0.1 + + p-timeout@5.1.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-ms@3.0.0: {} + + path-exists@4.0.0: {} + + path-exists@5.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.2.2 + minipass: 7.1.1 + + path-to-regexp@6.2.2: {} + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathval@1.1.1: {} + + pause-stream@0.0.11: + dependencies: + through: 2.3.8 + + pg-cloudflare@1.1.1: + optional: true + + pg-connection-string@2.6.4: {} + + pg-int8@1.0.1: {} + + pg-numeric@1.0.2: {} + + pg-pool@3.6.2(pg@8.11.5): + dependencies: + pg: 8.11.5 + + pg-protocol@1.6.1: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + pg-types@4.0.2: + dependencies: + pg-int8: 1.0.1 + pg-numeric: 1.0.2 + postgres-array: 3.0.2 + postgres-bytea: 3.0.0 + postgres-date: 2.1.0 + postgres-interval: 3.0.0 + postgres-range: 1.1.4 + + pg@8.11.5: + dependencies: + pg-connection-string: 2.6.4 + pg-pool: 3.6.2(pg@8.11.5) + pg-protocol: 1.6.1 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 + + pgpass@1.0.5: + dependencies: + split2: 4.2.0 + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pirates@4.0.6: {} + + pkg-conf@4.0.0: + dependencies: + find-up: 6.3.0 + load-json-file: 7.0.1 + + pkg-types@1.1.1: + dependencies: + confbox: 0.1.7 + mlly: 1.7.0 + pathe: 1.1.2 + + plur@5.1.0: + dependencies: + irregular-plurals: 3.5.0 + + pluralize@8.0.0: {} + + postcss-load-config@4.0.2(postcss@8.4.38): + dependencies: + lilconfig: 3.1.1 + yaml: 2.4.2 + optionalDependencies: + postcss: 8.4.38 + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + postgres-array@2.0.0: {} + + postgres-array@3.0.2: {} + + postgres-bytea@1.0.0: {} + + 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: {} + + postgres@3.4.4: {} + + prebuild-install@7.1.2: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.62.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@2.8.8: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + pretty-ms@8.0.0: + dependencies: + parse-ms: 3.0.0 + + printable-characters@1.0.42: {} + + ps-tree@1.2.0: + dependencies: + event-stream: 3.3.4 + + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-is@18.3.1: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + redeyed@2.1.1: + dependencies: + esprima: 4.0.1 + + require-directory@2.1.1: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve.exports@2.0.2: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup-plugin-inject@3.0.2: + dependencies: + estree-walker: 0.6.1 + magic-string: 0.25.9 + rollup-pluginutils: 2.8.2 + + rollup-plugin-node-polyfills@0.2.1: + dependencies: + rollup-plugin-inject: 3.0.2 + + rollup-pluginutils@2.8.2: + dependencies: + estree-walker: 0.6.1 + + rollup@4.17.2: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.17.2 + '@rollup/rollup-android-arm64': 4.17.2 + '@rollup/rollup-darwin-arm64': 4.17.2 + '@rollup/rollup-darwin-x64': 4.17.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 + '@rollup/rollup-linux-arm-musleabihf': 4.17.2 + '@rollup/rollup-linux-arm64-gnu': 4.17.2 + '@rollup/rollup-linux-arm64-musl': 4.17.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 + '@rollup/rollup-linux-riscv64-gnu': 4.17.2 + '@rollup/rollup-linux-s390x-gnu': 4.17.2 + '@rollup/rollup-linux-x64-gnu': 4.17.2 + '@rollup/rollup-linux-x64-musl': 4.17.2 + '@rollup/rollup-win32-arm64-msvc': 4.17.2 + '@rollup/rollup-win32-ia32-msvc': 4.17.2 + '@rollup/rollup-win32-x64-msvc': 4.17.2 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + selfsigned@2.4.1: + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + + semver@7.6.2: {} + + seq-queue@0.0.5: {} + + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + sisteransi@1.0.5: {} + + skin-tone@2.0.0: + dependencies: + unicode-emoji-modifier-base: 1.0.0 + + slash@3.0.0: {} + + slash@4.0.0: {} + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + source-map-js@1.2.0: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + sourcemap-codec@1.4.8: {} + + split-ca@1.0.1: {} + + split2@4.2.0: {} + + split@0.3.3: + dependencies: + through: 2.3.8 + + sprintf-js@1.0.3: {} + + sqlstring@2.3.3: {} + + ssh2@1.15.0: + dependencies: + asn1: 0.2.6 + bcrypt-pbkdf: 1.0.2 + optionalDependencies: + cpu-features: 0.0.10 + nan: 2.19.0 + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + stackback@0.0.2: {} + + stacktracey@2.1.8: + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + + std-env@3.7.0: {} + + stoppable@1.1.0: {} + + stream-combiner@0.0.4: + dependencies: + duplexer: 0.1.2 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-final-newline@2.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-json-comments@2.0.1: {} + + strip-json-comments@3.1.1: {} + + strip-literal@2.1.0: + dependencies: + js-tokens: 9.0.0 + + strnum@1.0.5: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.3.15 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + superjson@2.2.1: + dependencies: + copy-anything: 3.0.5 + + supertap@3.0.1: + dependencies: + indent-string: 5.0.0 + js-yaml: 3.14.1 + serialize-error: 7.0.1 + strip-ansi: 7.1.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-hyperlinks@3.0.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + synckit@0.8.8: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.2 + + tar-fs@2.0.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + + tar-fs@2.1.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + temp-dir@3.0.0: {} + + text-table@0.2.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + through@2.3.8: {} + + time-zone@1.0.0: {} + + timers-ext@0.1.7: + dependencies: + es5-ext: 0.10.64 + next-tick: 1.1.0 + + tinybench@2.8.0: {} + + tinypool@0.8.4: {} + + tinyspy@2.2.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tr46@0.0.3: {} + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + ts-api-utils@1.3.0(typescript@5.4.5): + dependencies: + typescript: 5.4.5 + + ts-expose-internals-conditionally@1.0.0-empty.0: {} + + ts-interface-checker@0.1.13: {} + + tsconfck@3.0.3(typescript@5.4.5): + optionalDependencies: + typescript: 5.4.5 + + tslib@1.14.1: {} + + tslib@2.6.2: {} + + tsup@8.0.2(postcss@8.4.38)(typescript@5.4.5): + dependencies: + bundle-require: 4.1.0(esbuild@0.19.12) + cac: 6.7.14 + chokidar: 3.6.0 + debug: 4.3.4 + esbuild: 0.19.12 + execa: 5.1.1 + globby: 11.1.0 + joycon: 3.1.1 + postcss-load-config: 4.0.2(postcss@8.4.38) + resolve-from: 5.0.0 + rollup: 4.17.2 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.4.38 + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + - ts-node + + tsx@3.14.0: + dependencies: + esbuild: 0.18.20 + get-tsconfig: 4.7.5 + source-map-support: 0.5.21 + optionalDependencies: + fsevents: 2.3.3 + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-fest@0.13.1: {} + + type-fest@0.20.2: {} + + type@2.7.2: {} + + typescript@5.3.3: {} + + typescript@5.4.5: {} + + ufo@1.5.3: {} + + undici-types@5.26.5: {} + + undici@5.28.4: + dependencies: + '@fastify/busboy': 2.1.1 + + unicode-emoji-modifier-base@1.0.0: {} + + universalify@2.0.1: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + utf-8-validate@6.0.3: + dependencies: + node-gyp-build: 4.8.1 + + util-deprecate@1.0.2: {} + + uuid@9.0.1: {} + + validate-npm-package-name@5.0.1: {} + + vite-node@1.6.0(@types/node@18.19.33): + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.1 + vite: 5.2.11(@types/node@18.19.33) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@18.19.33)): + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 3.0.3(typescript@5.4.5) + optionalDependencies: + vite: 5.2.11(@types/node@18.19.33) + transitivePeerDependencies: + - supports-color + - typescript + + vite@5.2.11(@types/node@18.19.33): + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.17.2 + optionalDependencies: + '@types/node': 18.19.33 + fsevents: 2.3.3 + + vitest@1.6.0(@types/node@18.19.33): + dependencies: + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.10 + pathe: 1.1.2 + picocolors: 1.0.1 + std-env: 3.7.0 + strip-literal: 2.1.0 + tinybench: 2.8.0 + tinypool: 0.8.4 + vite: 5.2.11(@types/node@18.19.33) + vite-node: 1.6.0(@types/node@18.19.33) + why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 18.19.33 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + web-streams-polyfill@3.3.3: {} + + webidl-conversions@3.0.1: {} + + webidl-conversions@4.0.2: {} + + webpod@0.0.2: {} + + well-known-symbols@2.0.0: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@3.0.1: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.2.2: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + word-wrap@1.2.5: {} + + wordwrap@1.0.0: {} + + workerd@1.20240512.0: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20240512.0 + '@cloudflare/workerd-darwin-arm64': 1.20240512.0 + '@cloudflare/workerd-linux-64': 1.20240512.0 + '@cloudflare/workerd-linux-arm64': 1.20240512.0 + '@cloudflare/workerd-windows-64': 1.20240512.0 + + wrangler@3.57.0(@cloudflare/workers-types@4.20240512.0)(bufferutil@4.0.8)(utf-8-validate@6.0.3): + dependencies: + '@cloudflare/kv-asset-handler': 0.3.2 + '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) + '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) + blake3-wasm: 2.1.5 + chokidar: 3.6.0 + esbuild: 0.17.19 + miniflare: 3.20240512.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + nanoid: 3.3.7 + path-to-regexp: 6.2.2 + resolve: 1.22.8 + resolve.exports: 2.0.2 + selfsigned: 2.4.1 + source-map: 0.6.1 + xxhash-wasm: 1.0.2 + optionalDependencies: + '@cloudflare/workers-types': 4.20240512.0 + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + ws@8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.3): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 6.0.3 + + ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 6.0.3 + + xtend@4.0.2: {} + + xxhash-wasm@1.0.2: {} + + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yaml@2.4.2: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + yocto-queue@1.0.0: {} + + youch@3.3.3: + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + + zod@3.23.8: {} + + zx@7.2.3: + dependencies: + '@types/fs-extra': 11.0.4 + '@types/minimist': 1.2.5 + '@types/node': 18.19.33 + '@types/ps-tree': 1.1.6 + '@types/which': 3.0.3 + chalk: 5.3.0 + fs-extra: 11.2.0 + fx: 34.0.0 + globby: 13.2.2 + minimist: 1.2.8 + node-fetch: 3.3.1 + ps-tree: 1.2.0 + webpod: 0.0.2 + which: 3.0.1 + yaml: 2.4.2 diff --git a/drizzle-kit/schema.ts b/drizzle-kit/schema.ts new file mode 100644 index 000000000..e69de29bb diff --git a/drizzle-kit/src/cli/commands/push.ts b/drizzle-kit/src/cli/commands/push.ts index 0cb3a8d28..f23e95594 100644 --- a/drizzle-kit/src/cli/commands/push.ts +++ b/drizzle-kit/src/cli/commands/push.ts @@ -436,12 +436,11 @@ export const sqlitePush = async ( tablesToRemove, tablesToTruncate, infoToPrint, - schemasToRemove, } = await sqliteSuggestions( db, statements.statements, - statements.squashedPrev, statements.squashedCur, + statements.squashedPrev, statements.meta!, ); From f41ba415be41c8f13b43439b3748b2da36e91a3a Mon Sep 17 00:00:00 2001 From: prodrigues Date: Tue, 1 Oct 2024 13:43:26 +0100 Subject: [PATCH 2/8] wip [last visited drizzle-kit/src/cli/validations/common.ts --- drizzle-kit/build.ts | 3 - drizzle-kit/package.json | 5 +- drizzle-kit/src/cli/commands/introspect.ts | 1 - .../src/cli/commands/libSqlPushUtils.ts | 346 ---- drizzle-kit/src/cli/commands/push.ts | 110 +- .../src/cli/commands/sqlitePushUtils.ts | 340 ++-- drizzle-kit/src/cli/commands/utils.ts | 88 - drizzle-kit/src/cli/connections.ts | 120 +- drizzle-kit/src/cli/schema.ts | 1457 +++++++++-------- drizzle-kit/src/cli/utils.ts | 2 +- drizzle-kit/src/cli/validations/common.ts | 3 +- drizzle-kit/src/cli/validations/sqlite.ts | 5 + drizzle-kit/src/schemaValidator.ts | 2 +- drizzle-kit/src/utils.ts | 21 +- 14 files changed, 1041 insertions(+), 1462 deletions(-) delete mode 100644 drizzle-kit/src/cli/commands/libSqlPushUtils.ts diff --git a/drizzle-kit/build.ts b/drizzle-kit/build.ts index ec7fc76c0..701e9c84c 100644 --- a/drizzle-kit/build.ts +++ b/drizzle-kit/build.ts @@ -1,4 +1,3 @@ -/// import * as esbuild from 'esbuild'; import { readFileSync, writeFileSync } from 'node:fs'; import * as tsup from 'tsup'; @@ -17,7 +16,6 @@ const driversPackages = [ // sqlite drivers '@libsql/client', 'better-sqlite3', - 'bun:sqlite', ]; esbuild.buildSync({ @@ -84,7 +82,6 @@ const main = async () => { await tsup.build({ entryPoints: ['./src/index.ts', './src/api.ts'], outDir: './dist', - external: ['bun:sqlite'], splitting: false, dts: true, format: ['cjs', 'esm'], diff --git a/drizzle-kit/package.json b/drizzle-kit/package.json index 66f19e6be..9d9e1d227 100644 --- a/drizzle-kit/package.json +++ b/drizzle-kit/package.json @@ -1,6 +1,6 @@ { "name": "drizzle-kit", - "version": "0.25.0", + "version": "0.24.2", "homepage": "https://orm.drizzle.team", "keywords": [ "drizzle", @@ -54,7 +54,7 @@ "@electric-sql/pglite": "^0.1.5", "@hono/node-server": "^1.9.0", "@hono/zod-validator": "^0.2.1", - "@libsql/client": "^0.10.0", + "@libsql/client": "^0.4.2", "@neondatabase/serverless": "^0.9.1", "@originjs/vite-plugin-commonjs": "^1.0.3", "@planetscale/database": "^1.16.0", @@ -74,7 +74,6 @@ "@vercel/postgres": "^0.8.0", "ava": "^5.1.0", "better-sqlite3": "^9.4.3", - "bun-types": "^0.6.6", "camelcase": "^7.0.1", "chalk": "^5.2.0", "commander": "^12.1.0", diff --git a/drizzle-kit/src/cli/commands/introspect.ts b/drizzle-kit/src/cli/commands/introspect.ts index 9b5a044f6..7e7185a58 100644 --- a/drizzle-kit/src/cli/commands/introspect.ts +++ b/drizzle-kit/src/cli/commands/introspect.ts @@ -203,7 +203,6 @@ export const introspectMysql = async ( const schema = { id: originUUID, prevId: '', ...res } as MySqlSchema; const ts = mysqlSchemaToTypeScript(schema, casing); const relationsTs = relationsToTypeScript(schema, casing); - const { internal, ...schemaWithoutInternals } = schema; const schemaFile = join(out, 'schema.ts'); writeFileSync(schemaFile, ts.file); diff --git a/drizzle-kit/src/cli/commands/libSqlPushUtils.ts b/drizzle-kit/src/cli/commands/libSqlPushUtils.ts deleted file mode 100644 index 01bb61334..000000000 --- a/drizzle-kit/src/cli/commands/libSqlPushUtils.ts +++ /dev/null @@ -1,346 +0,0 @@ -import chalk from 'chalk'; - -import { JsonStatement } from 'src/jsonStatements'; -import { findAddedAndRemoved, SQLiteDB } from 'src/utils'; -import { SQLiteSchemaInternal, SQLiteSchemaSquashed, SQLiteSquasher } from '../../serializer/sqliteSchema'; -import { - CreateSqliteIndexConvertor, - fromJson, - LibSQLModifyColumn, - SQLiteCreateTableConvertor, - SQLiteDropTableConvertor, - SqliteRenameTableConvertor, -} from '../../sqlgenerator'; - -export const getOldTableName = ( - tableName: string, - meta: SQLiteSchemaInternal['_meta'], -) => { - for (const key of Object.keys(meta.tables)) { - const value = meta.tables[key]; - if (`"${tableName}"` === value) { - return key.substring(1, key.length - 1); - } - } - return tableName; -}; - -export const _moveDataStatements = ( - tableName: string, - json: SQLiteSchemaSquashed, - dataLoss: boolean = false, -) => { - const statements: string[] = []; - - const newTableName = `__new_${tableName}`; - - // create table statement from a new json2 with proper name - const tableColumns = Object.values(json.tables[tableName].columns); - const referenceData = Object.values(json.tables[tableName].foreignKeys); - const compositePKs = Object.values( - json.tables[tableName].compositePrimaryKeys, - ).map((it) => SQLiteSquasher.unsquashPK(it)); - - const fks = referenceData.map((it) => SQLiteSquasher.unsquashPushFK(it)); - - // create new table - statements.push( - new SQLiteCreateTableConvertor().convert({ - type: 'sqlite_create_table', - tableName: newTableName, - columns: tableColumns, - referenceData: fks, - compositePKs, - }), - ); - - // move data - if (!dataLoss) { - const columns = Object.keys(json.tables[tableName].columns).map( - (c) => `"${c}"`, - ); - - statements.push( - `INSERT INTO \`${newTableName}\`(${ - columns.join( - ', ', - ) - }) SELECT ${columns.join(', ')} FROM \`${tableName}\`;`, - ); - } - - statements.push( - new SQLiteDropTableConvertor().convert({ - type: 'drop_table', - tableName: tableName, - schema: '', - }), - ); - - // rename table - statements.push( - new SqliteRenameTableConvertor().convert({ - fromSchema: '', - tableNameFrom: newTableName, - tableNameTo: tableName, - toSchema: '', - type: 'rename_table', - }), - ); - - for (const idx of Object.values(json.tables[tableName].indexes)) { - statements.push( - new CreateSqliteIndexConvertor().convert({ - type: 'create_index', - tableName: tableName, - schema: '', - data: idx, - }), - ); - } - return statements; -}; - -export const libSqlLogSuggestionsAndReturn = async ( - connection: SQLiteDB, - statements: JsonStatement[], - json1: SQLiteSchemaSquashed, - json2: SQLiteSchemaSquashed, - meta: SQLiteSchemaInternal['_meta'], -) => { - let shouldAskForApprove = false; - const statementsToExecute: string[] = []; - const infoToPrint: string[] = []; - - const tablesToRemove: string[] = []; - const columnsToRemove: string[] = []; - const tablesToTruncate: string[] = []; - - for (const statement of statements) { - if (statement.type === 'drop_table') { - const res = await connection.query<{ count: string }>( - `select count(*) as count from \`${statement.tableName}\``, - ); - const count = Number(res[0].count); - if (count > 0) { - infoToPrint.push( - `· You're about to delete ${ - chalk.underline( - statement.tableName, - ) - } table with ${count} items`, - ); - tablesToRemove.push(statement.tableName); - shouldAskForApprove = true; - } - const fromJsonStatement = fromJson([statement], 'turso', 'push', json2); - statementsToExecute.push( - ...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]), - ); - } else if (statement.type === 'alter_table_drop_column') { - const tableName = statement.tableName; - - const res = await connection.query<{ count: string }>( - `select count(*) as count from \`${tableName}\``, - ); - const count = Number(res[0].count); - if (count > 0) { - infoToPrint.push( - `· You're about to delete ${ - chalk.underline( - statement.columnName, - ) - } column in ${tableName} table with ${count} items`, - ); - columnsToRemove.push(`${tableName}_${statement.columnName}`); - shouldAskForApprove = true; - } - - const fromJsonStatement = fromJson([statement], 'turso', 'push', json2); - statementsToExecute.push( - ...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]), - ); - } else if ( - statement.type === 'sqlite_alter_table_add_column' - && statement.column.notNull - && !statement.column.default - ) { - const newTableName = statement.tableName; - const res = await connection.query<{ count: string }>( - `select count(*) as count from \`${newTableName}\``, - ); - const count = Number(res[0].count); - if (count > 0) { - infoToPrint.push( - `· You're about to add not-null ${ - chalk.underline( - statement.column.name, - ) - } column without default value, which contains ${count} items`, - ); - - tablesToTruncate.push(newTableName); - statementsToExecute.push(`delete from ${newTableName};`); - - shouldAskForApprove = true; - } - - const fromJsonStatement = fromJson([statement], 'turso', 'push', json2); - statementsToExecute.push( - ...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]), - ); - } else if (statement.type === 'alter_table_alter_column_set_notnull') { - const tableName = statement.tableName; - - if ( - statement.type === 'alter_table_alter_column_set_notnull' - && typeof statement.columnDefault === 'undefined' - ) { - const res = await connection.query<{ count: string }>( - `select count(*) as count from \`${tableName}\``, - ); - const count = Number(res[0].count); - if (count > 0) { - infoToPrint.push( - `· You're about to add not-null constraint to ${ - chalk.underline( - statement.columnName, - ) - } column without default value, which contains ${count} items`, - ); - - tablesToTruncate.push(tableName); - statementsToExecute.push(`delete from \`${tableName}\``); - shouldAskForApprove = true; - } - } - - const modifyStatements = new LibSQLModifyColumn().convert(statement, json2); - - statementsToExecute.push( - ...(Array.isArray(modifyStatements) ? modifyStatements : [modifyStatements]), - ); - } else if (statement.type === 'recreate_table') { - const tableName = statement.tableName; - - let dataLoss = false; - - const oldTableName = getOldTableName(tableName, meta); - - const prevColumnNames = Object.keys(json1.tables[oldTableName].columns); - const currentColumnNames = Object.keys(json2.tables[tableName].columns); - const { removedColumns, addedColumns } = findAddedAndRemoved( - prevColumnNames, - currentColumnNames, - ); - - if (removedColumns.length) { - for (const removedColumn of removedColumns) { - const res = await connection.query<{ count: string }>( - `select count(\`${tableName}\`.\`${removedColumn}\`) as count from \`${tableName}\``, - ); - - const count = Number(res[0].count); - if (count > 0) { - infoToPrint.push( - `· You're about to delete ${ - chalk.underline( - removedColumn, - ) - } column in ${tableName} table with ${count} items`, - ); - columnsToRemove.push(removedColumn); - shouldAskForApprove = true; - } - } - } - - if (addedColumns.length) { - for (const addedColumn of addedColumns) { - const [res] = await connection.query<{ count: string }>( - `select count(*) as count from \`${tableName}\``, - ); - - const columnConf = json2.tables[tableName].columns[addedColumn]; - - const count = Number(res.count); - if (count > 0 && columnConf.notNull && !columnConf.default) { - dataLoss = true; - - infoToPrint.push( - `· You're about to add not-null ${ - chalk.underline( - addedColumn, - ) - } column without default value to table, which contains ${count} items`, - ); - shouldAskForApprove = true; - tablesToTruncate.push(tableName); - - statementsToExecute.push(`DELETE FROM \`${tableName}\`;`); - } - } - } - - // check if some tables referencing current for pragma - const tablesReferencingCurrent: string[] = []; - - for (const table of Object.values(json2.tables)) { - const tablesRefs = Object.values(json2.tables[table.name].foreignKeys) - .filter((t) => SQLiteSquasher.unsquashPushFK(t).tableTo === tableName) - .map((it) => SQLiteSquasher.unsquashPushFK(it).tableFrom); - - tablesReferencingCurrent.push(...tablesRefs); - } - - if (!tablesReferencingCurrent.length) { - statementsToExecute.push(..._moveDataStatements(tableName, json2, dataLoss)); - continue; - } - - // recreate table - statementsToExecute.push( - ..._moveDataStatements(tableName, json2, dataLoss), - ); - } else if ( - statement.type === 'alter_table_alter_column_set_generated' - || statement.type === 'alter_table_alter_column_drop_generated' - ) { - const tableName = statement.tableName; - - const res = await connection.query<{ count: string }>( - `select count("${statement.columnName}") as count from \`${tableName}\``, - ); - const count = Number(res[0].count); - if (count > 0) { - infoToPrint.push( - `· You're about to delete ${ - chalk.underline( - statement.columnName, - ) - } column in ${tableName} table with ${count} items`, - ); - columnsToRemove.push(`${tableName}_${statement.columnName}`); - shouldAskForApprove = true; - } - const fromJsonStatement = fromJson([statement], 'turso', 'push', json2); - statementsToExecute.push( - ...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]), - ); - } else { - const fromJsonStatement = fromJson([statement], 'turso', 'push', json2); - statementsToExecute.push( - ...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]), - ); - } - } - - return { - statementsToExecute: [...new Set(statementsToExecute)], - shouldAskForApprove, - infoToPrint, - columnsToRemove: [...new Set(columnsToRemove)], - tablesToTruncate: [...new Set(tablesToTruncate)], - tablesToRemove: [...new Set(tablesToRemove)], - }; -}; diff --git a/drizzle-kit/src/cli/commands/push.ts b/drizzle-kit/src/cli/commands/push.ts index f23e95594..f1b6f7739 100644 --- a/drizzle-kit/src/cli/commands/push.ts +++ b/drizzle-kit/src/cli/commands/push.ts @@ -2,13 +2,11 @@ import chalk from 'chalk'; import { render } from 'hanji'; import { fromJson } from '../../sqlgenerator'; import { Select } from '../selector-ui'; -import { LibSQLCredentials } from '../validations/libsql'; import type { MysqlCredentials } from '../validations/mysql'; import { withStyle } from '../validations/outputs'; import type { PostgresCredentials } from '../validations/postgres'; import { SingleStoreCredentials } from '../validations/singlestore'; import type { SqliteCredentials } from '../validations/sqlite'; -import { libSqlLogSuggestionsAndReturn } from './libSqlPushUtils'; import { filterStatements as mySqlFilterStatements, logSuggestionsAndReturn as mySqlLogSuggestionsAndReturn, @@ -520,114 +518,10 @@ export const sqlitePush = async ( await db.query('rollback'); process.exit(1); } + } else if (credentials.driver === 'turso') { + await db.batch!(statementsToExecute.map((it) => ({ query: it }))); } render(`[${chalk.green('✓')}] Changes applied`); } } }; - -export const libSQLPush = async ( - schemaPath: string | string[], - verbose: boolean, - strict: boolean, - credentials: LibSQLCredentials, - tablesFilter: string[], - force: boolean, -) => { - const { connectToLibSQL } = await import('../connections'); - const { sqlitePushIntrospect } = await import('./sqliteIntrospect'); - - const db = await connectToLibSQL(credentials); - const { schema } = await sqlitePushIntrospect(db, tablesFilter); - - const { prepareLibSQLPush } = await import('./migrate'); - - const statements = await prepareLibSQLPush(schemaPath, schema); - - if (statements.sqlStatements.length === 0) { - render(`\n[${chalk.blue('i')}] No changes detected`); - } else { - const { - shouldAskForApprove, - statementsToExecute, - columnsToRemove, - tablesToRemove, - tablesToTruncate, - infoToPrint, - } = await libSqlLogSuggestionsAndReturn( - db, - statements.statements, - statements.squashedPrev, - statements.squashedCur, - statements.meta!, - ); - - if (verbose && statementsToExecute.length > 0) { - console.log(); - console.log( - withStyle.warning('You are about to execute current statements:'), - ); - console.log(); - console.log(statementsToExecute.map((s) => chalk.blue(s)).join('\n')); - console.log(); - } - - if (!force && strict) { - if (!shouldAskForApprove) { - const { status, data } = await render( - new Select(['No, abort', `Yes, I want to execute all statements`]), - ); - if (data?.index === 0) { - render(`[${chalk.red('x')}] All changes were aborted`); - process.exit(0); - } - } - } - - if (!force && shouldAskForApprove) { - console.log(withStyle.warning('Found data-loss statements:')); - console.log(infoToPrint.join('\n')); - console.log(); - console.log( - chalk.red.bold( - 'THIS ACTION WILL CAUSE DATA LOSS AND CANNOT BE REVERTED\n', - ), - ); - - console.log(chalk.white('Do you still want to push changes?')); - - const { status, data } = await render( - new Select([ - 'No, abort', - `Yes, I want to${ - tablesToRemove.length > 0 - ? ` remove ${tablesToRemove.length} ${tablesToRemove.length > 1 ? 'tables' : 'table'},` - : ' ' - }${ - columnsToRemove.length > 0 - ? ` remove ${columnsToRemove.length} ${columnsToRemove.length > 1 ? 'columns' : 'column'},` - : ' ' - }${ - tablesToTruncate.length > 0 - ? ` truncate ${tablesToTruncate.length} ${tablesToTruncate.length > 1 ? 'tables' : 'table'}` - : '' - }` - .trimEnd() - .replace(/(^,)|(,$)/g, '') - .replace(/ +(?= )/g, ''), - ]), - ); - if (data?.index === 0) { - render(`[${chalk.red('x')}] All changes were aborted`); - process.exit(0); - } - } - - if (statementsToExecute.length === 0) { - render(`\n[${chalk.blue('i')}] No changes detected`); - } else { - await db.batchWithPragma!(statementsToExecute); - render(`[${chalk.green('✓')}] Changes applied`); - } - } -}; diff --git a/drizzle-kit/src/cli/commands/sqlitePushUtils.ts b/drizzle-kit/src/cli/commands/sqlitePushUtils.ts index bcc2d19db..d11a4ce62 100644 --- a/drizzle-kit/src/cli/commands/sqlitePushUtils.ts +++ b/drizzle-kit/src/cli/commands/sqlitePushUtils.ts @@ -10,7 +10,7 @@ import { } from '../../sqlgenerator'; import type { JsonStatement } from '../../jsonStatements'; -import { findAddedAndRemoved, type SQLiteDB } from '../../utils'; +import type { SQLiteDB } from '../../utils'; export const _moveDataStatements = ( tableName: string, @@ -19,7 +19,16 @@ export const _moveDataStatements = ( ) => { const statements: string[] = []; - const newTableName = `__new_${tableName}`; + // rename table to __old_${tablename} + statements.push( + new SqliteRenameTableConvertor().convert({ + type: 'rename_table', + tableNameFrom: tableName, + tableNameTo: `__old_push_${tableName}`, + fromSchema: '', + toSchema: '', + }), + ); // create table statement from a new json2 with proper name const tableColumns = Object.values(json.tables[tableName].columns); @@ -30,11 +39,10 @@ export const _moveDataStatements = ( const fks = referenceData.map((it) => SQLiteSquasher.unsquashPushFK(it)); - // create new table statements.push( new SQLiteCreateTableConvertor().convert({ type: 'sqlite_create_table', - tableName: newTableName, + tableName: tableName, columns: tableColumns, referenceData: fks, compositePKs, @@ -43,38 +51,19 @@ export const _moveDataStatements = ( // move data if (!dataLoss) { - const columns = Object.keys(json.tables[tableName].columns).map( - (c) => `"${c}"`, - ); - statements.push( - `INSERT INTO \`${newTableName}\`(${ - columns.join( - ', ', - ) - }) SELECT ${columns.join(', ')} FROM \`${tableName}\`;`, + `INSERT INTO "${tableName}" SELECT * FROM "__old_push_${tableName}";`, ); } - + // drop table with name __old_${tablename} statements.push( new SQLiteDropTableConvertor().convert({ type: 'drop_table', - tableName: tableName, + tableName: `__old_push_${tableName}`, schema: '', }), ); - // rename table - statements.push( - new SqliteRenameTableConvertor().convert({ - fromSchema: '', - tableNameFrom: newTableName, - tableNameTo: tableName, - toSchema: '', - type: 'rename_table', - }), - ); - for (const idx of Object.values(json.tables[tableName].indexes)) { statements.push( new CreateSqliteIndexConvertor().convert({ @@ -131,6 +120,8 @@ export const logSuggestionsAndReturn = async ( const schemasToRemove: string[] = []; const tablesToTruncate: string[] = []; + const tablesContext: Record = {}; + for (const statement of statements) { if (statement.type === 'drop_table') { const res = await connection.query<{ count: string }>( @@ -148,159 +139,248 @@ export const logSuggestionsAndReturn = async ( tablesToRemove.push(statement.tableName); shouldAskForApprove = true; } + const stmnt = fromJson([statement], 'sqlite')[0]; + statementsToExecute.push(stmnt); + } else if (statement.type === 'alter_table_drop_column') { + const newTableName = getOldTableName(statement.tableName, meta); - const fromJsonStatement = fromJson([statement], 'sqlite', 'push'); - statementsToExecute.push( - ...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]), + const columnIsPartOfPk = Object.values( + json1.tables[newTableName].compositePrimaryKeys, + ).find((c) => SQLiteSquasher.unsquashPK(c).includes(statement.columnName)); + + const columnIsPartOfIndex = Object.values( + json1.tables[newTableName].indexes, + ).find((c) => SQLiteSquasher.unsquashIdx(c).columns.includes(statement.columnName)); + + const columnIsPk = json1.tables[newTableName].columns[statement.columnName].primaryKey; + + const columnIsPartOfFk = Object.values( + json1.tables[newTableName].foreignKeys, + ).find((t) => + SQLiteSquasher.unsquashPushFK(t).columnsFrom.includes( + statement.columnName, + ) ); - } else if (statement.type === 'alter_table_drop_column') { - const tableName = statement.tableName; - const columnName = statement.columnName; const res = await connection.query<{ count: string }>( - `select count(\`${tableName}\`.\`${columnName}\`) as count from \`${tableName}\``, + `select count(*) as count from \`${newTableName}\``, ); const count = Number(res[0].count); if (count > 0) { infoToPrint.push( `· You're about to delete ${ chalk.underline( - columnName, + statement.columnName, ) - } column in ${tableName} table with ${count} items`, + } column in ${newTableName} table with ${count} items`, ); - columnsToRemove.push(`${tableName}_${statement.columnName}`); + columnsToRemove.push(`${newTableName}_${statement.columnName}`); shouldAskForApprove = true; } - const fromJsonStatement = fromJson([statement], 'sqlite', 'push'); - statementsToExecute.push( - ...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]), - ); - } else if ( - statement.type === 'sqlite_alter_table_add_column' - && (statement.column.notNull && !statement.column.default) - ) { - const tableName = statement.tableName; - const columnName = statement.column.name; - const res = await connection.query<{ count: string }>( - `select count(*) as count from \`${tableName}\``, - ); - const count = Number(res[0].count); - if (count > 0) { - infoToPrint.push( - `· You're about to add not-null ${ - chalk.underline( - columnName, + if ( + columnIsPk + || columnIsPartOfPk + || columnIsPartOfIndex + || columnIsPartOfFk + ) { + tablesContext[newTableName] = [ + ..._moveDataStatements(statement.tableName, json2, true), + ]; + // check table that have fk to this table + + const tablesReferncingCurrent: string[] = []; + + for (const table of Object.values(json1.tables)) { + const tablesRefs = Object.values(json1.tables[table.name].foreignKeys) + .filter( + (t) => SQLiteSquasher.unsquashPushFK(t).tableTo === newTableName, ) - } column without default value, which contains ${count} items`, - ); + .map((t) => SQLiteSquasher.unsquashPushFK(t).tableFrom); - tablesToTruncate.push(tableName); - statementsToExecute.push(`delete from ${tableName};`); + tablesReferncingCurrent.push(...tablesRefs); + } - shouldAskForApprove = true; + const uniqueTableRefs = [...new Set(tablesReferncingCurrent)]; + + for (const table of uniqueTableRefs) { + if (typeof tablesContext[table] === 'undefined') { + tablesContext[table] = [..._moveDataStatements(table, json2)]; + } + } + } else { + if (typeof tablesContext[newTableName] === 'undefined') { + const stmnt = fromJson([statement], 'sqlite')[0]; + statementsToExecute.push(stmnt); + } } + } else if (statement.type === 'sqlite_alter_table_add_column') { + const newTableName = getOldTableName(statement.tableName, meta); + if (statement.column.notNull && !statement.column.default) { + const res = await connection.query<{ count: string }>( + `select count(*) as count from \`${newTableName}\``, + ); + const count = Number(res[0].count); + if (count > 0) { + infoToPrint.push( + `· You're about to add not-null ${ + chalk.underline( + statement.column.name, + ) + } column without default value, which contains ${count} items`, + ); - const fromJsonStatement = fromJson([statement], 'sqlite', 'push'); - statementsToExecute.push( - ...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]), - ); - } else if (statement.type === 'recreate_table') { - const tableName = statement.tableName; - const oldTableName = getOldTableName(tableName, meta); + tablesToTruncate.push(newTableName); + statementsToExecute.push(`delete from ${newTableName};`); - let dataLoss = false; + shouldAskForApprove = true; + } + } + if (statement.column.primaryKey) { + tablesContext[newTableName] = [ + ..._moveDataStatements(statement.tableName, json2, true), + ]; + const tablesReferncingCurrent: string[] = []; + + for (const table of Object.values(json1.tables)) { + const tablesRefs = Object.values(json1.tables[table.name].foreignKeys) + .filter( + (t) => SQLiteSquasher.unsquashPushFK(t).tableTo === newTableName, + ) + .map((t) => SQLiteSquasher.unsquashPushFK(t).tableFrom); - const prevColumnNames = Object.keys(json1.tables[oldTableName].columns); - const currentColumnNames = Object.keys(json2.tables[tableName].columns); - const { removedColumns, addedColumns } = findAddedAndRemoved( - prevColumnNames, - currentColumnNames, - ); + tablesReferncingCurrent.push(...tablesRefs); + } + + const uniqueTableRefs = [...new Set(tablesReferncingCurrent)]; - if (removedColumns.length) { - for (const removedColumn of removedColumns) { + for (const table of uniqueTableRefs) { + if (typeof tablesContext[table] === 'undefined') { + tablesContext[table] = [..._moveDataStatements(table, json2)]; + } + } + } else { + if (typeof tablesContext[newTableName] === 'undefined') { + const stmnt = fromJson([statement], 'sqlite')[0]; + statementsToExecute.push(stmnt); + } + } + } else if ( + statement.type === 'alter_table_alter_column_set_type' + || statement.type === 'alter_table_alter_column_set_default' + || statement.type === 'alter_table_alter_column_drop_default' + || statement.type === 'alter_table_alter_column_set_notnull' + || statement.type === 'alter_table_alter_column_drop_notnull' + || statement.type === 'alter_table_alter_column_drop_autoincrement' + || statement.type === 'alter_table_alter_column_set_autoincrement' + || statement.type === 'alter_table_alter_column_drop_pk' + || statement.type === 'alter_table_alter_column_set_pk' + ) { + if ( + !( + statement.type === 'alter_table_alter_column_set_notnull' + && statement.columnPk + ) + ) { + const newTableName = getOldTableName(statement.tableName, meta); + if ( + statement.type === 'alter_table_alter_column_set_notnull' + && typeof statement.columnDefault === 'undefined' + ) { const res = await connection.query<{ count: string }>( - `select count(\`${tableName}\`.\`${removedColumn}\`) as count from \`${tableName}\``, + `select count(*) as count from \`${newTableName}\``, ); - const count = Number(res[0].count); if (count > 0) { infoToPrint.push( - `· You're about to delete ${ + `· You're about to add not-null constraint to ${ chalk.underline( - removedColumn, + statement.columnName, ) - } column in ${tableName} table with ${count} items`, + } column without default value, which contains ${count} items`, ); - columnsToRemove.push(removedColumn); + + tablesToTruncate.push(newTableName); shouldAskForApprove = true; } - } - } - - if (addedColumns.length) { - for (const addedColumn of addedColumns) { - const [res] = await connection.query<{ count: string }>( - `select count(*) as count from \`${tableName}\``, + tablesContext[newTableName] = _moveDataStatements( + statement.tableName, + json1, + true, ); - - const columnConf = json2.tables[tableName].columns[addedColumn]; - - const count = Number(res.count); - if (count > 0 && columnConf.notNull && !columnConf.default) { - dataLoss = true; - infoToPrint.push( - `· You're about to add not-null ${ - chalk.underline( - addedColumn, - ) - } column without default value to table, which contains ${count} items`, + } else { + if (typeof tablesContext[newTableName] === 'undefined') { + tablesContext[newTableName] = _moveDataStatements( + statement.tableName, + json1, ); - shouldAskForApprove = true; - tablesToTruncate.push(tableName); - - statementsToExecute.push(`DELETE FROM \`${tableName}\`;`); } } - } - // check if some tables referencing current for pragma - const tablesReferencingCurrent: string[] = []; + const tablesReferncingCurrent: string[] = []; - for (const table of Object.values(json2.tables)) { - const tablesRefs = Object.values(json2.tables[table.name].foreignKeys) - .filter((t) => SQLiteSquasher.unsquashPushFK(t).tableTo === tableName) - .map((it) => SQLiteSquasher.unsquashPushFK(it).tableFrom); + for (const table of Object.values(json1.tables)) { + const tablesRefs = Object.values(json1.tables[table.name].foreignKeys) + .filter( + (t) => SQLiteSquasher.unsquashPushFK(t).tableTo === newTableName, + ) + .map((t) => { + return getNewTableName( + SQLiteSquasher.unsquashPushFK(t).tableFrom, + meta, + ); + }); + + tablesReferncingCurrent.push(...tablesRefs); + } - tablesReferencingCurrent.push(...tablesRefs); - } + const uniqueTableRefs = [...new Set(tablesReferncingCurrent)]; - if (!tablesReferencingCurrent.length) { - statementsToExecute.push(..._moveDataStatements(tableName, json2, dataLoss)); - continue; + for (const table of uniqueTableRefs) { + if (typeof tablesContext[table] === 'undefined') { + tablesContext[table] = [..._moveDataStatements(table, json1)]; + } + } } + } else if ( + statement.type === 'create_reference' + || statement.type === 'delete_reference' + || statement.type === 'alter_reference' + ) { + const fk = SQLiteSquasher.unsquashPushFK(statement.data); - const [{ foreign_keys: pragmaState }] = await connection.query<{ - foreign_keys: number; - }>(`PRAGMA foreign_keys;`); - - if (pragmaState) { - statementsToExecute.push(`PRAGMA foreign_keys=OFF;`); + if (typeof tablesContext[statement.tableName] === 'undefined') { + tablesContext[statement.tableName] = _moveDataStatements( + statement.tableName, + json2, + ); } - statementsToExecute.push(..._moveDataStatements(tableName, json2, dataLoss)); - if (pragmaState) { - statementsToExecute.push(`PRAGMA foreign_keys=ON;`); + } else if ( + statement.type === 'create_composite_pk' + || statement.type === 'alter_composite_pk' + || statement.type === 'delete_composite_pk' + || statement.type === 'create_unique_constraint' + || statement.type === 'delete_unique_constraint' + ) { + const newTableName = getOldTableName(statement.tableName, meta); + if (typeof tablesContext[newTableName] === 'undefined') { + tablesContext[newTableName] = _moveDataStatements( + statement.tableName, + json2, + ); } } else { - const fromJsonStatement = fromJson([statement], 'sqlite', 'push'); - statementsToExecute.push( - ...(Array.isArray(fromJsonStatement) ? fromJsonStatement : [fromJsonStatement]), - ); + const stmnt = fromJson([statement], 'sqlite'); + if (typeof stmnt !== 'undefined') { + statementsToExecute.push(...stmnt); + } } } + for (const context of Object.values(tablesContext)) { + statementsToExecute.push(...context); + } + return { statementsToExecute, shouldAskForApprove, diff --git a/drizzle-kit/src/cli/commands/utils.ts b/drizzle-kit/src/cli/commands/utils.ts index 25e80ed4d..e8a8f2b95 100644 --- a/drizzle-kit/src/cli/commands/utils.ts +++ b/drizzle-kit/src/cli/commands/utils.ts @@ -16,11 +16,6 @@ import { Prefix, wrapParam, } from '../validations/common'; -import { - LibSQLCredentials, - libSQLCredentials, - printConfigConnectionIssues as printIssuesLibSql, -} from '../validations/libsql'; import { MysqlCredentials, mysqlCredentials, @@ -221,14 +216,6 @@ export const preparePushConfig = async ( dialect: 'sqlite'; credentials: SqliteCredentials; } - | { - dialect: 'turso'; - credentials: LibSQLCredentials; - } - | { - dialect: 'singlestore'; - credentials: SingleStoreCredentials; - } | { dialect: 'singlestore'; credentials: SingleStoreCredentials; @@ -368,24 +355,6 @@ export const preparePushConfig = async ( }; } - if (config.dialect === 'turso') { - const parsed = libSQLCredentials.safeParse(config); - if (!parsed.success) { - printIssuesSqlite(config, 'pull'); - process.exit(1); - } - return { - dialect: 'turso', - schemaPath: config.schema, - strict: config.strict ?? false, - verbose: config.verbose ?? false, - force: (options.force as boolean) ?? false, - credentials: parsed.data, - tablesFilter, - schemasFilter, - }; - } - assertUnreachable(config.dialect); }; @@ -410,14 +379,6 @@ export const preparePullConfig = async ( dialect: 'singlestore'; credentials: SingleStoreCredentials; } - | { - dialect: 'turso'; - credentials: LibSQLCredentials; - } - | { - dialect: 'singlestore'; - credentials: SingleStoreCredentials; - } ) & { out: string; breakpoints: boolean; @@ -542,24 +503,6 @@ export const preparePullConfig = async ( }; } - if (dialect === 'turso') { - const parsed = libSQLCredentials.safeParse(config); - if (!parsed.success) { - printIssuesLibSql(config, 'pull'); - process.exit(1); - } - return { - dialect, - out: config.out, - breakpoints: config.breakpoints, - casing: config.casing, - credentials: parsed.data, - tablesFilter, - schemasFilter, - prefix: config.migrations?.prefix || 'index', - }; - } - assertUnreachable(dialect); }; @@ -646,22 +589,6 @@ export const prepareStudioConfig = async (options: Record) => { }; } - if (dialect === 'turso') { - const parsed = libSQLCredentials.safeParse(flattened); - if (!parsed.success) { - printIssuesLibSql(flattened as Record, 'studio'); - process.exit(1); - } - const credentials = parsed.data; - return { - dialect, - schema, - host, - port, - credentials, - }; - } - assertUnreachable(dialect); }; @@ -747,21 +674,6 @@ export const prepareMigrateConfig = async (configPath: string | undefined) => { table, }; } - if (dialect === 'turso') { - const parsed = libSQLCredentials.safeParse(flattened); - if (!parsed.success) { - printIssuesLibSql(flattened as Record, 'migrate'); - process.exit(1); - } - const credentials = parsed.data; - return { - dialect, - out, - credentials, - schema, - table, - }; - } assertUnreachable(dialect); }; diff --git a/drizzle-kit/src/cli/connections.ts b/drizzle-kit/src/cli/connections.ts index fccc7def8..3357bf146 100644 --- a/drizzle-kit/src/cli/connections.ts +++ b/drizzle-kit/src/cli/connections.ts @@ -5,17 +5,8 @@ import fetch from 'node-fetch'; import ws from 'ws'; import { assertUnreachable } from '../global'; import type { ProxyParams } from '../serializer/studio'; -import { - type DB, - LibSQLDB, - normalisePGliteUrl, - normaliseSQLiteUrl, - type Proxy, - type SQLiteDB, - type SqliteProxy, -} from '../utils'; +import { type DB, normalisePGliteUrl, normaliseSQLiteUrl, type Proxy, type SQLiteDB, type SqliteProxy } from '../utils'; import { assertPackages, checkPackage } from './utils'; -import { LibSQLCredentials } from './validations/libsql'; import type { MysqlCredentials } from './validations/mysql'; import { withStyle } from './validations/outputs'; import type { PostgresCredentials } from './validations/postgres'; @@ -492,7 +483,56 @@ export const connectToSQLite = async ( > => { if ('driver' in credentials) { const { driver } = credentials; - if (driver === 'd1-http') { + if (driver === 'turso') { + assertPackages('@libsql/client'); + const { createClient } = await import('@libsql/client'); + const { drizzle } = await import('drizzle-orm/libsql'); + const { migrate } = await import('drizzle-orm/libsql/migrator'); + + const client = createClient({ + url: credentials.url, + authToken: credentials.authToken, + }); + + const drzl = drizzle(client); + const migrateFn = async (config: MigrationConfig) => { + return migrate(drzl, config); + }; + + const db: SQLiteDB = { + query: async (sql: string, params?: any[]) => { + const res = await client.execute({ sql, args: params || [] }); + return res.rows as T[]; + }, + run: async (query: string) => { + await client.execute(query); + }, + batch: async ( + queries: { query: string; values?: any[] | undefined }[], + ) => { + await client.batch( + queries.map((it) => ({ sql: it.query, args: it.values ?? [] })), + ); + }, + }; + const proxy: SqliteProxy = { + proxy: async (params: ProxyParams) => { + const preparedParams = prepareSqliteParams(params.params); + const result = await client.execute({ + sql: params.sql, + args: preparedParams, + }); + + if (params.mode === 'array') { + return result.rows.map((row) => Object.values(row)); + } else { + return result.rows; + } + }, + }; + + return { ...db, ...proxy, migrate: migrateFn }; + } else if (driver === 'd1-http') { const { drizzle } = await import('drizzle-orm/sqlite-proxy'); const { migrate } = await import('drizzle-orm/sqlite-proxy/migrator'); @@ -669,70 +709,12 @@ export const connectToSQLite = async ( }; return { ...db, ...proxy, migrate: migrateFn }; } - console.log( "Please install either 'better-sqlite3' or '@libsql/client' for Drizzle Kit to connect to SQLite databases", ); process.exit(1); }; -export const connectToLibSQL = async (credentials: LibSQLCredentials): Promise< - & LibSQLDB - & SqliteProxy - & { migrate: (config: MigrationConfig) => Promise } -> => { - if (await checkPackage('@libsql/client')) { - const { createClient } = await import('@libsql/client'); - const { drizzle } = await import('drizzle-orm/libsql'); - const { migrate } = await import('drizzle-orm/libsql/migrator'); - - const client = createClient({ - url: normaliseSQLiteUrl(credentials.url, 'libsql'), - authToken: credentials.authToken, - }); - const drzl = drizzle(client); - const migrateFn = async (config: MigrationConfig) => { - return migrate(drzl, config); - }; - - const db: LibSQLDB = { - query: async (sql: string, params?: any[]) => { - const res = await client.execute({ sql, args: params || [] }); - return res.rows as T[]; - }, - run: async (query: string) => { - await client.execute(query); - }, - batchWithPragma: async (queries: string[]) => { - await client.migrate(queries); - }, - }; - - const proxy: SqliteProxy = { - proxy: async (params: ProxyParams) => { - const preparedParams = prepareSqliteParams(params.params); - const result = await client.execute({ - sql: params.sql, - args: preparedParams, - }); - - if (params.mode === 'array') { - return result.rows.map((row) => Object.values(row)); - } else { - return result.rows; - } - }, - }; - - return { ...db, ...proxy, migrate: migrateFn }; - } - - console.log( - "Please install '@libsql/client' for Drizzle Kit to connect to LibSQL databases", - ); - process.exit(1); -}; - const parseSingleStoreCredentials = (credentials: SingleStoreCredentials) => { if ('url' in credentials) { const url = credentials.url; diff --git a/drizzle-kit/src/cli/schema.ts b/drizzle-kit/src/cli/schema.ts index 6b7bcb560..16999da86 100644 --- a/drizzle-kit/src/cli/schema.ts +++ b/drizzle-kit/src/cli/schema.ts @@ -1,724 +1,795 @@ -import { boolean, command, number, string } from '@drizzle-team/brocli'; -import chalk from 'chalk'; -import 'dotenv/config'; -import { mkdirSync } from 'fs'; -import { renderWithTask } from 'hanji'; -import { dialects } from 'src/schemaValidator'; -import '../@types/utils'; +import type { AwsDataApiPgQueryResult, AwsDataApiSessionOptions } from 'drizzle-orm/aws-data-api/pg'; +import type { MigrationConfig } from 'drizzle-orm/migrator'; +import type { PreparedQueryConfig } from 'drizzle-orm/pg-core'; +import fetch from 'node-fetch'; +import ws from 'ws'; import { assertUnreachable } from '../global'; -import { drizzleForLibSQL, drizzleForSingleStore, prepareSingleStoreSchema, type Setup } from '../serializer/studio'; -import { assertV1OutFolder } from '../utils'; -import { certs } from '../utils/certs'; -import { checkHandler } from './commands/check'; -import { dropMigration } from './commands/drop'; -import { prepareAndMigrateSingleStore } from './commands/migrate'; -import { upMysqlHandler } from './commands/mysqlUp'; -import { upPgHandler } from './commands/pgUp'; -import { upSinglestoreHandler } from './commands/singlestoreUp'; -import { upSqliteHandler } from './commands/sqliteUp'; -import { - prepareCheckParams, - prepareDropParams, - prepareGenerateConfig, - prepareMigrateConfig, - preparePullConfig, - preparePushConfig, - prepareStudioConfig, -} from './commands/utils'; -import { assertOrmCoreVersion, assertPackages, assertStudioNodeVersion, ormVersionGt } from './utils'; -import { assertCollisions, drivers, prefixes } from './validations/common'; +import type { ProxyParams } from '../serializer/studio'; +import { type DB, normalisePGliteUrl, normaliseSQLiteUrl, type Proxy, type SQLiteDB, type SqliteProxy } from '../utils'; +import { assertPackages, checkPackage } from './utils'; +import type { MysqlCredentials } from './validations/mysql'; import { withStyle } from './validations/outputs'; -import { grey, MigrateProgress } from './views'; - -const optionDialect = string('dialect') - .enum(...dialects) - .desc(`Database dialect: 'postgresql', 'mysql', 'sqlite' or 'turso'`); -const optionOut = string().desc("Output folder, 'drizzle' by default"); -const optionConfig = string().desc('Path to drizzle config file'); -const optionBreakpoints = boolean().desc( - `Prepare SQL statements with breakpoints`, -); - -const optionDriver = string() - .enum(...drivers) - .desc('Database driver'); - -export const generate = command({ - name: 'generate', - options: { - config: optionConfig, - dialect: optionDialect, - driver: optionDriver, - schema: string().desc('Path to a schema file or folder'), - out: optionOut, - name: string().desc('Migration file name'), - breakpoints: optionBreakpoints, - custom: boolean() - .desc('Prepare empty migration file for custom SQL') - .default(false), - prefix: string() - .enum(...prefixes) - .default('index'), - }, - transform: async (opts) => { - const from = assertCollisions( - 'generate', - opts, - ['prefix', 'name', 'custom'], - ['driver', 'breakpoints', 'schema', 'out', 'dialect'], - ); - return prepareGenerateConfig(opts, from); - }, - handler: async (opts) => { - await assertOrmCoreVersion(); - await assertPackages('drizzle-orm'); - - // const parsed = cliConfigGenerate.parse(opts); - - const { - prepareAndMigratePg, - prepareAndMigrateMysql, - prepareAndMigrateSqlite, - prepareAndMigrateLibSQL, - } = await import('./commands/migrate'); - - const dialect = opts.dialect; - if (dialect === 'postgresql') { - await prepareAndMigratePg(opts); - } else if (dialect === 'mysql') { - await prepareAndMigrateMysql(opts); - } else if (dialect === 'sqlite') { - await prepareAndMigrateSqlite(opts); - } else if (dialect === 'turso') { - await prepareAndMigrateLibSQL(opts); - } else if (dialect === 'singlestore') { - await prepareAndMigrateSingleStore(opts); - } else { - assertUnreachable(dialect); - } - }, -}); - -export const migrate = command({ - name: 'migrate', - options: { - config: optionConfig, - }, - transform: async (opts) => { - return await prepareMigrateConfig(opts.config); - }, - handler: async (opts) => { - await assertOrmCoreVersion(); - await assertPackages('drizzle-orm'); - - const { dialect, schema, table, out, credentials } = opts; - try { - if (dialect === 'postgresql') { - if ('driver' in credentials) { - const { driver } = credentials; - if (driver === 'aws-data-api') { - if (!(await ormVersionGt('0.30.10'))) { - console.log( - "To use 'aws-data-api' driver - please update drizzle-orm to the latest version", - ); - process.exit(1); - } - } else if (driver === 'pglite') { - if (!(await ormVersionGt('0.30.6'))) { - console.log( - "To use 'pglite' driver - please update drizzle-orm to the latest version", - ); - process.exit(1); - } - } else { - assertUnreachable(driver); - } - } - const { preparePostgresDB } = await import('./connections'); - const { migrate } = await preparePostgresDB(credentials); - await renderWithTask( - new MigrateProgress(), - migrate({ - migrationsFolder: out, - migrationsTable: table, - migrationsSchema: schema, - }), - ); - } else if (dialect === 'mysql') { - const { connectToMySQL } = await import('./connections'); - const { migrate } = await connectToMySQL(credentials); - await renderWithTask( - new MigrateProgress(), - migrate({ - migrationsFolder: out, - migrationsTable: table, - migrationsSchema: schema, - }), - ); - } else if (dialect === 'sqlite') { - const { connectToSQLite } = await import('./connections'); - const { migrate } = await connectToSQLite(credentials); - await renderWithTask( - new MigrateProgress(), - migrate({ - migrationsFolder: opts.out, - migrationsTable: table, - migrationsSchema: schema, - }), - ); - } else if (dialect === 'turso') { - const { connectToLibSQL } = await import('./connections'); - const { migrate } = await connectToLibSQL(credentials); - await renderWithTask( - new MigrateProgress(), - migrate({ - migrationsFolder: opts.out, - migrationsTable: table, - migrationsSchema: schema, - }), +import type { PostgresCredentials } from './validations/postgres'; +import type { SingleStoreCredentials } from './validations/singlestore'; +import type { SqliteCredentials } from './validations/sqlite'; + +export const preparePostgresDB = async ( + credentials: PostgresCredentials, +): Promise< + DB & { + proxy: Proxy; + migrate: (config: string | MigrationConfig) => Promise; + } +> => { + if ('driver' in credentials) { + const { driver } = credentials; + if (driver === 'aws-data-api') { + assertPackages('@aws-sdk/client-rds-data'); + const { RDSDataClient, ExecuteStatementCommand, TypeHint } = await import( + '@aws-sdk/client-rds-data' + ); + const { AwsDataApiSession, drizzle } = await import( + 'drizzle-orm/aws-data-api/pg' + ); + const { migrate } = await import('drizzle-orm/aws-data-api/pg/migrator'); + const { PgDialect } = await import('drizzle-orm/pg-core'); + + const config: AwsDataApiSessionOptions = { + database: credentials.database, + resourceArn: credentials.resourceArn, + secretArn: credentials.secretArn, + }; + const rdsClient = new RDSDataClient(); + const session = new AwsDataApiSession( + rdsClient, + new PgDialect(), + undefined, + config, + undefined, + ); + + const db = drizzle(rdsClient, config); + const migrateFn = async (config: string | MigrationConfig) => { + return migrate(db, config); + }; + + const query = async (sql: string, params: any[]) => { + const prepared = session.prepareQuery( + { sql, params: params ?? [] }, + undefined, + undefined, + false, ); - } else if (dialect === 'singlestore') { - const { connectToSingleStore } = await import('./connections'); - const { migrate } = await connectToSingleStore(credentials); - await renderWithTask( - new MigrateProgress(), - migrate({ - migrationsFolder: out, - migrationsTable: table, - migrationsSchema: schema, - }), + const result = await prepared.all(); + return result as any[]; + }; + const proxy = async (params: ProxyParams) => { + const prepared = session.prepareQuery< + PreparedQueryConfig & { + execute: AwsDataApiPgQueryResult; + values: AwsDataApiPgQueryResult; + } + >( + { + sql: params.sql, + params: params.params ?? [], + typings: params.typings, + }, + undefined, + undefined, + params.mode === 'array', ); - } else { - assertUnreachable(dialect); - } - } catch (e) { - console.error(e); - process.exit(1); + if (params.mode === 'array') { + const result = await prepared.values(); + return result.rows; + } + const result = await prepared.execute(); + return result.rows; + }; + + return { + query, + proxy, + migrate: migrateFn, + }; } - process.exit(0); - }, -}); - -const optionsFilters = { - tablesFilter: string().desc('Table name filters'), - schemaFilters: string().desc('Schema name filters'), - extensionsFilters: string().desc( - '`Database extensions internal database filters', - ), -} as const; - -const optionsDatabaseCredentials = { - url: string().desc('Database connection URL'), - host: string().desc('Database host'), - port: string().desc('Database port'), - user: string().desc('Database user'), - password: string().desc('Database password'), - database: string().desc('Database name'), - ssl: string().desc('ssl mode'), - // Turso - authToken: string('auth-token').desc('Database auth token [Turso]'), - // specific cases - driver: optionDriver, -} as const; - -export const push = command({ - name: 'push', - options: { - config: optionConfig, - dialect: optionDialect, - schema: string().desc('Path to a schema file or folder'), - ...optionsFilters, - ...optionsDatabaseCredentials, - verbose: boolean() - .desc('Print all statements for each push') - .default(false), - strict: boolean().desc('Always ask for confirmation').default(false), - force: boolean() - .desc( - 'Auto-approve all data loss statements. Note: Data loss statements may truncate your tables and data', - ) - .default(false), - }, - transform: async (opts) => { - const from = assertCollisions( - 'push', - opts, - ['force', 'verbose', 'strict'], - [ - 'schema', - 'dialect', - 'driver', - 'url', - 'host', - 'port', - 'user', - 'password', - 'database', - 'ssl', - 'authToken', - 'schemaFilters', - 'extensionsFilters', - 'tablesFilter', - ], - ); - - return preparePushConfig(opts, from); - }, - handler: async (config) => { - await assertPackages('drizzle-orm'); - await assertOrmCoreVersion(); - - const { - dialect, - schemaPath, - strict, - verbose, - credentials, - tablesFilter, - schemasFilter, - force, - } = config; - - try { - if (dialect === 'mysql') { - const { mysqlPush } = await import('./commands/push'); - await mysqlPush( - schemaPath, - credentials, - tablesFilter, - strict, - verbose, - force, - ); - } else if (dialect === 'postgresql') { - if ('driver' in credentials) { - const { driver } = credentials; - if (driver === 'aws-data-api') { - if (!(await ormVersionGt('0.30.10'))) { - console.log( - "To use 'aws-data-api' driver - please update drizzle-orm to the latest version", - ); - process.exit(1); - } - } else if (driver === 'pglite') { - if (!(await ormVersionGt('0.30.6'))) { - console.log( - "To use 'pglite' driver - please update drizzle-orm to the latest version", - ); - process.exit(1); - } - } else { - assertUnreachable(driver); - } + if (driver === 'pglite') { + assertPackages('@electric-sql/pglite'); + const { PGlite } = await import('@electric-sql/pglite'); + const { drizzle } = await import('drizzle-orm/pglite'); + const { migrate } = await import('drizzle-orm/pglite/migrator'); + + const pglite = new PGlite(normalisePGliteUrl(credentials.url)); + await pglite.waitReady; + const drzl = drizzle(pglite); + const migrateFn = async (config: MigrationConfig) => { + return migrate(drzl, config); + }; + + const query = async (sql: string, params: any[] = []) => { + const result = await pglite.query(sql, params); + return result.rows as T[]; + }; + + const proxy = async (params: ProxyParams) => { + const preparedParams = preparePGliteParams(params.params); + if ( + params.method === 'values' + || params.method === 'get' + || params.method === 'all' + ) { + const result = await pglite.query(params.sql, preparedParams, { + rowMode: params.mode, + }); + return result.rows; } - const { pgPush } = await import('./commands/push'); - await pgPush( - schemaPath, - verbose, - strict, - credentials, - tablesFilter, - schemasFilter, - force, - ); - } else if (dialect === 'sqlite') { - const { sqlitePush } = await import('./commands/push'); - await sqlitePush( - schemaPath, - verbose, - strict, - credentials, - tablesFilter, - force, - ); - } else if (dialect === 'turso') { - const { libSQLPush } = await import('./commands/push'); - await libSQLPush( - schemaPath, - verbose, - strict, - credentials, - tablesFilter, - force, - ); - } else if (dialect === 'singlestore') { - const { singlestorePush } = await import('./commands/push'); - await singlestorePush( - schemaPath, - credentials, - tablesFilter, - strict, - verbose, - force, - ); - } else { - assertUnreachable(dialect); - } - } catch (e) { - console.error(e); - } - process.exit(0); - }, -}); - -export const check = command({ - name: 'check', - options: { - config: optionConfig, - dialect: optionDialect, - out: optionOut, - }, - transform: async (opts) => { - const from = assertCollisions('check', opts, [], ['dialect', 'out']); - return prepareCheckParams(opts, from); - }, - handler: async (config) => { - await assertOrmCoreVersion(); - - const { out, dialect } = config; - checkHandler(out, dialect); - console.log("Everything's fine 🐶🔥"); - }, -}); - -export const up = command({ - name: 'up', - options: { - config: optionConfig, - dialect: optionDialect, - out: optionOut, - }, - transform: async (opts) => { - const from = assertCollisions('check', opts, [], ['dialect', 'out']); - return prepareCheckParams(opts, from); - }, - handler: async (config) => { - await assertOrmCoreVersion(); - - const { out, dialect } = config; - await assertPackages('drizzle-orm'); - - if (dialect === 'postgresql') { - upPgHandler(out); - } + const result = await pglite.query(params.sql, preparedParams); + return result.rows; + }; - if (dialect === 'mysql') { - upMysqlHandler(out); + return { query, proxy, migrate: migrateFn }; } - if (dialect === 'singlestore') { - upSinglestoreHandler(out); - } + assertUnreachable(driver); + } + + if (await checkPackage('pg')) { + console.log(withStyle.info(`Using 'pg' driver for database querying`)); + const pg = await import('pg'); + const { drizzle } = await import('drizzle-orm/node-postgres'); + const { migrate } = await import('drizzle-orm/node-postgres/migrator'); + + const ssl = 'ssl' in credentials + ? credentials.ssl === 'prefer' + || credentials.ssl === 'require' + || credentials.ssl === 'allow' + ? { rejectUnauthorized: false } + : credentials.ssl === 'verify-full' + ? {} + : credentials.ssl + : {}; + + const client = 'url' in credentials + ? new pg.default.Pool({ connectionString: credentials.url, max: 1 }) + : new pg.default.Pool({ ...credentials, ssl, max: 1 }); + + const db = drizzle(client); + const migrateFn = async (config: string | MigrationConfig) => { + return migrate(db, config); + }; + + const query = async (sql: string, params?: any[]) => { + const result = await client.query(sql, params ?? []); + return result.rows; + }; + + const proxy: Proxy = async (params: ProxyParams) => { + const result = await client.query({ + text: params.sql, + values: params.params, + ...(params.mode === 'array' && { rowMode: 'array' }), + }); + return result.rows; + }; - if (dialect === 'sqlite' || dialect === 'turso') { - upSqliteHandler(out); - } - }, -}); - -export const pull = command({ - name: 'introspect', - aliases: ['pull'], - options: { - config: optionConfig, - dialect: optionDialect, - out: optionOut, - breakpoints: optionBreakpoints, - casing: string('introspect-casing').enum('camel', 'preserve'), - ...optionsFilters, - ...optionsDatabaseCredentials, - }, - transform: async (opts) => { - const from = assertCollisions( - 'introspect', - opts, - [], - [ - 'dialect', - 'driver', - 'out', - 'url', - 'host', - 'port', - 'user', - 'password', - 'database', - 'ssl', - 'authToken', - 'casing', - 'breakpoints', - 'tablesFilter', - 'schemaFilters', - 'extensionsFilters', - ], + return { query, proxy, migrate: migrateFn }; + } + + if (await checkPackage('postgres')) { + console.log( + withStyle.info(`Using 'postgres' driver for database querying`), ); - return preparePullConfig(opts, from); - }, - handler: async (config) => { - await assertPackages('drizzle-orm'); - await assertOrmCoreVersion(); - - const { - dialect, - credentials, - out, - casing, - breakpoints, - tablesFilter, - schemasFilter, - prefix, - } = config; - mkdirSync(out, { recursive: true }); + const postgres = await import('postgres'); + + const { drizzle } = await import('drizzle-orm/postgres-js'); + const { migrate } = await import('drizzle-orm/postgres-js/migrator'); + + const client = 'url' in credentials + ? postgres.default(credentials.url, { max: 1 }) + : postgres.default({ ...credentials, max: 1 }); + + const db = drizzle(client); + const migrateFn = async (config: string | MigrationConfig) => { + return migrate(db, config); + }; + + const query = async (sql: string, params?: any[]) => { + const result = await client.unsafe(sql, params ?? []); + return result as any[]; + }; + const proxy = async (params: ProxyParams) => { + if (params.mode === 'object') { + return await client.unsafe(params.sql, params.params); + } + return await client.unsafe(params.sql, params.params).values(); + }; + + return { query, proxy, migrate: migrateFn }; + } + + if (await checkPackage('@vercel/postgres')) { console.log( - grey( - `Pulling from [${ - schemasFilter - .map((it) => `'${it}'`) - .join(', ') - }] list of schemas`, + withStyle.info(`Using '@vercel/postgres' driver for database querying`), + ); + console.log( + withStyle.fullWarning( + "'@vercel/postgres' can only connect to remote Neon/Vercel Postgres/Supabase instances through a websocket", ), ); - console.log(); - - try { - if (dialect === 'postgresql') { - if ('driver' in credentials) { - const { driver } = credentials; - if (driver === 'aws-data-api') { - if (!(await ormVersionGt('0.30.10'))) { - console.log( - "To use 'aws-data-api' driver - please update drizzle-orm to the latest version", - ); - process.exit(1); - } - } else if (driver === 'pglite') { - if (!(await ormVersionGt('0.30.6'))) { - console.log( - "To use 'pglite' driver - please update drizzle-orm to the latest version", - ); - process.exit(1); - } - } else { - assertUnreachable(driver); - } - } + const { VercelPool } = await import('@vercel/postgres'); + const { drizzle } = await import('drizzle-orm/vercel-postgres'); + const { migrate } = await import('drizzle-orm/vercel-postgres/migrator'); + const ssl = 'ssl' in credentials + ? credentials.ssl === 'prefer' + || credentials.ssl === 'require' + || credentials.ssl === 'allow' + ? { rejectUnauthorized: false } + : credentials.ssl === 'verify-full' + ? {} + : credentials.ssl + : {}; + + const client = 'url' in credentials + ? new VercelPool({ connectionString: credentials.url }) + : new VercelPool({ ...credentials, ssl }); + + await client.connect(); + + const db = drizzle(client); + const migrateFn = async (config: string | MigrationConfig) => { + return migrate(db, config); + }; + + const query = async (sql: string, params?: any[]) => { + const result = await client.query(sql, params ?? []); + return result.rows; + }; + + const proxy: Proxy = async (params: ProxyParams) => { + const result = await client.query({ + text: params.sql, + values: params.params, + ...(params.mode === 'array' && { rowMode: 'array' }), + }); + return result.rows; + }; - const { introspectPostgres } = await import('./commands/introspect'); - await introspectPostgres( - casing, - out, - breakpoints, - credentials, - tablesFilter, - schemasFilter, - prefix, - ); - } else if (dialect === 'mysql') { - const { introspectMysql } = await import('./commands/introspect'); - await introspectMysql( - casing, - out, - breakpoints, - credentials, - tablesFilter, - prefix, - ); - } else if (dialect === 'sqlite') { - const { introspectSqlite } = await import('./commands/introspect'); - await introspectSqlite( - casing, - out, - breakpoints, - credentials, - tablesFilter, - prefix, - ); - } else if (dialect === 'turso') { - const { introspectLibSQL } = await import('./commands/introspect'); - await introspectLibSQL( - casing, - out, - breakpoints, - credentials, - tablesFilter, - prefix, - ); - } else if (dialect === 'singlestore') { - const { introspectSingleStore } = await import('./commands/introspect'); - await introspectSingleStore( - casing, - out, - breakpoints, - credentials, - tablesFilter, - prefix, - ); - } else { - assertUnreachable(dialect); - } - } catch (e) { - console.error(e); + return { query, proxy, migrate: migrateFn }; + } + + if (await checkPackage('@neondatabase/serverless')) { + console.log( + withStyle.info( + `Using '@neondatabase/serverless' driver for database querying`, + ), + ); + console.log( + withStyle.fullWarning( + "'@neondatabase/serverless' can only connect to remote Neon/Vercel Postgres/Supabase instances through a websocket", + ), + ); + const { Pool, neonConfig } = await import('@neondatabase/serverless'); + const { drizzle } = await import('drizzle-orm/neon-serverless'); + const { migrate } = await import('drizzle-orm/neon-serverless/migrator'); + + const ssl = 'ssl' in credentials + ? credentials.ssl === 'prefer' + || credentials.ssl === 'require' + || credentials.ssl === 'allow' + ? { rejectUnauthorized: false } + : credentials.ssl === 'verify-full' + ? {} + : credentials.ssl + : {}; + + const client = 'url' in credentials + ? new Pool({ connectionString: credentials.url, max: 1 }) + : new Pool({ ...credentials, max: 1, ssl }); + neonConfig.webSocketConstructor = ws; + + const db = drizzle(client); + const migrateFn = async (config: string | MigrationConfig) => { + return migrate(db, config); + }; + + const query = async (sql: string, params?: any[]) => { + const result = await client.query(sql, params ?? []); + return result.rows; + }; + + const proxy: Proxy = async (params: ProxyParams) => { + const result = await client.query({ + text: params.sql, + values: params.params, + ...(params.mode === 'array' && { rowMode: 'array' }), + }); + return result.rows; + }; + + return { query, proxy, migrate: migrateFn }; + } + + console.error( + "To connect to Postgres database - please install either of 'pg', 'postgres', '@neondatabase/serverless' or '@vercel/postgres' drivers", + ); + process.exit(1); +}; + +const parseMysqlCredentials = (credentials: MysqlCredentials) => { + if ('url' in credentials) { + const url = credentials.url; + + const connectionUrl = new URL(url); + const pathname = connectionUrl.pathname; + + const database = pathname.split('/')[pathname.split('/').length - 1]; + if (!database) { + console.error( + 'You should specify a database name in connection string (mysql://USER:PASSWORD@HOST:PORT/DATABASE)', + ); + process.exit(1); } - process.exit(0); - }, -}); - -export const drop = command({ - name: 'drop', - options: { - config: optionConfig, - out: optionOut, - driver: optionDriver, - }, - transform: async (opts) => { - const from = assertCollisions('check', opts, [], ['driver', 'out']); - return prepareDropParams(opts, from); - }, - handler: async (config) => { - await assertOrmCoreVersion(); - - assertV1OutFolder(config.out); - await dropMigration(config); - }, -}); - -export const studio = command({ - name: 'studio', - options: { - config: optionConfig, - port: number().desc('Custom port for drizzle studio [default=4983]'), - host: string().desc('Custom host for drizzle studio [default=0.0.0.0]'), - verbose: boolean() - .default(false) - .desc('Print all stataments that are executed by Studio'), - }, - handler: async (opts) => { - await assertOrmCoreVersion(); - await assertPackages('drizzle-orm'); - - assertStudioNodeVersion(); - - const { - dialect, - schema: schemaPath, - port, - host, + return { database, url }; + } else { + return { + database: credentials.database, credentials, - } = await prepareStudioConfig(opts); - - const { - drizzleForPostgres, - preparePgSchema, - prepareMySqlSchema, - drizzleForMySQL, - prepareSQLiteSchema, - drizzleForSQLite, - } = await import('../serializer/studio'); - - let setup: Setup; - try { - if (dialect === 'postgresql') { - if ('driver' in credentials) { - const { driver } = credentials; - if (driver === 'aws-data-api') { - if (!(await ormVersionGt('0.30.10'))) { - console.log( - "To use 'aws-data-api' driver - please update drizzle-orm to the latest version", - ); - process.exit(1); - } - } else if (driver === 'pglite') { - if (!(await ormVersionGt('0.30.6'))) { - console.log( - "To use 'pglite' driver - please update drizzle-orm to the latest version", - ); - process.exit(1); - } - } else { - assertUnreachable(driver); - } - } + }; + } +}; + +export const connectToMySQL = async ( + it: MysqlCredentials, +): Promise<{ + db: DB; + proxy: Proxy; + database: string; + migrate: (config: MigrationConfig) => Promise; +}> => { + const result = parseMysqlCredentials(it); + + if (await checkPackage('mysql2')) { + const { createConnection } = await import('mysql2/promise'); + const { drizzle } = await import('drizzle-orm/mysql2'); + const { migrate } = await import('drizzle-orm/mysql2/migrator'); + + const connection = result.url + ? await createConnection(result.url) + : await createConnection(result.credentials!); // needed for some reason! + + const db = drizzle(connection); + const migrateFn = async (config: MigrationConfig) => { + return migrate(db, config); + }; + + await connection.connect(); + const query: DB['query'] = async ( + sql: string, + params?: any[], + ): Promise => { + const res = await connection.execute(sql, params); + return res[0] as any; + }; + + const proxy: Proxy = async (params: ProxyParams) => { + const result = await connection.query({ + sql: params.sql, + values: params.params, + rowsAsArray: params.mode === 'array', + }); + return result[0] as any[]; + }; + + return { + db: { query }, + proxy, + database: result.database, + migrate: migrateFn, + }; + } + + if (await checkPackage('@planetscale/database')) { + const { connect } = await import('@planetscale/database'); + const { drizzle } = await import('drizzle-orm/planetscale-serverless'); + const { migrate } = await import( + 'drizzle-orm/planetscale-serverless/migrator' + ); - const { schema, relations, files } = schemaPath - ? await preparePgSchema(schemaPath) - : { schema: {}, relations: {}, files: [] }; - setup = await drizzleForPostgres(credentials, schema, relations, files); - } else if (dialect === 'mysql') { - const { schema, relations, files } = schemaPath - ? await prepareMySqlSchema(schemaPath) - : { schema: {}, relations: {}, files: [] }; - setup = await drizzleForMySQL(credentials, schema, relations, files); - } else if (dialect === 'sqlite') { - const { schema, relations, files } = schemaPath - ? await prepareSQLiteSchema(schemaPath) - : { schema: {}, relations: {}, files: [] }; - setup = await drizzleForSQLite(credentials, schema, relations, files); - } else if (dialect === 'turso') { - const { schema, relations, files } = schemaPath - ? await prepareSQLiteSchema(schemaPath) - : { schema: {}, relations: {}, files: [] }; - setup = await drizzleForLibSQL(credentials, schema, relations, files); - } else if (dialect === 'singlestore') { - const { schema, relations, files } = schemaPath - ? await prepareSingleStoreSchema(schemaPath) - : { schema: {}, relations: {}, files: [] }; - setup = await drizzleForSingleStore(credentials, schema, relations, files); - } else { - assertUnreachable(dialect); + const connection = connect(result); + + const db = drizzle(connection); + const migrateFn = async (config: MigrationConfig) => { + return migrate(db, config); + }; + + const query = async (sql: string, params?: any[]): Promise => { + const res = await connection.execute(sql, params); + return res.rows as T[]; + }; + const proxy: Proxy = async (params: ProxyParams) => { + const result = params.mode === 'object' + ? await connection.execute(params.sql, params.params) + : await connection.execute(params.sql, params.params, { + as: 'array', + }); + return result.rows; + }; + + return { + db: { query }, + proxy, + database: result.database, + migrate: migrateFn, + }; + } + + console.error( + "To connect to SingleStore database - please install the 'mysql2' driver", + ); + process.exit(1); +}; + +const parseSingleStoreCredentials = (credentials: SingleStoreCredentials) => { + if ('url' in credentials) { + const url = credentials.url; + + const connectionUrl = new URL(url); + const pathname = connectionUrl.pathname; + + const database = pathname.split('/')[pathname.split('/').length - 1]; + if (!database) { + console.error( + 'You should specify a database name in connection string (singlestore://USER:PASSWORD@HOST:PORT/DATABASE)', + ); + process.exit(1); + } + return { database, url }; + } else { + return { + database: credentials.database, + credentials, + }; + } +}; + +export const connectToSingleStore = async ( + it: SingleStoreCredentials, +): Promise<{ + db: DB; + proxy: Proxy; + database: string; + migrate: (config: MigrationConfig) => Promise; +}> => { + const result = parseSingleStoreCredentials(it); + + if (await checkPackage('mysql2')) { + const { createConnection } = await import('mysql2/promise'); + const { drizzle } = await import('drizzle-orm/singlestore'); + const { migrate } = await import('drizzle-orm/singlestore/migrator'); + + const connection = result.url + ? await createConnection(result.url) + : await createConnection(result.credentials!); // needed for some reason! + + const db = drizzle(connection); + const migrateFn = async (config: MigrationConfig) => { + return migrate(db, config); + }; + + await connection.connect(); + const query: DB['query'] = async ( + sql: string, + params?: any[], + ): Promise => { + const res = await connection.execute(sql, params); + return res[0] as any; + }; + + const proxy: Proxy = async (params: ProxyParams) => { + const result = await connection.query({ + sql: params.sql, + values: params.params, + rowsAsArray: params.mode === 'array', + }); + return result[0] as any[]; + }; + + return { + db: { query }, + proxy, + database: result.database, + migrate: migrateFn, + }; + } + + console.error( + "To connect to SingleStore database - please install the 'mysql2' driver", + ); + process.exit(1); +}; + +const prepareSqliteParams = (params: any[], driver?: string) => { + return params.map((param) => { + if ( + param + && typeof param === 'object' + && 'type' in param + && 'value' in param + && param.type === 'binary' + ) { + const value = typeof param.value === 'object' + ? JSON.stringify(param.value) + : (param.value as string); + + if (driver === 'd1-http') { + return value; } - const { prepareServer } = await import('../serializer/studio'); - - const server = await prepareServer(setup); + return Buffer.from(value); + } + return param; + }); +}; + +const preparePGliteParams = (params: any[]) => { + return params.map((param) => { + if ( + param + && typeof param === 'object' + && 'type' in param + && 'value' in param + && param.type === 'binary' + ) { + const value = typeof param.value === 'object' + ? JSON.stringify(param.value) + : (param.value as string); + + return value; + } + return param; + }); +}; + +export const connectToSQLite = async ( + credentials: SqliteCredentials, +): Promise< + & SQLiteDB + & SqliteProxy + & { migrate: (config: MigrationConfig) => Promise } +> => { + if ('driver' in credentials) { + const { driver } = credentials; + if (driver === 'turso') { + assertPackages('@libsql/client'); + const { createClient } = await import('@libsql/client'); + const { drizzle } = await import('drizzle-orm/libsql'); + const { migrate } = await import('drizzle-orm/libsql/migrator'); + + const client = createClient({ + url: credentials.url, + authToken: credentials.authToken, + }); - console.log(); - console.log( - withStyle.fullWarning( - 'Drizzle Studio is currently in Beta. If you find anything that is not working as expected or should be improved, feel free to create an issue on GitHub: https://github.com/drizzle-team/drizzle-kit-mirror/issues/new or write to us on Discord: https://discord.gg/WcRKz2FFxN', - ), - ); + const drzl = drizzle(client); + const migrateFn = async (config: MigrationConfig) => { + return migrate(drzl, config); + }; - const { key, cert } = (await certs()) || {}; - server.start({ - host, - port, - key, - cert, - cb: (err, address) => { - if (err) { - console.error(err); + const db: SQLiteDB = { + query: async (sql: string, params?: any[]) => { + const res = await client.execute({ sql, args: params || [] }); + return res.rows as T[]; + }, + run: async (query: string) => { + await client.execute(query); + }, + batch: async ( + queries: { query: string; values?: any[] | undefined }[], + ) => { + await client.batch( + queries.map((it) => ({ sql: it.query, args: it.values ?? [] })), + ); + }, + }; + const proxy: SqliteProxy = { + proxy: async (params: ProxyParams) => { + const preparedParams = prepareSqliteParams(params.params); + const result = await client.execute({ + sql: params.sql, + args: preparedParams, + }); + + if (params.mode === 'array') { + return result.rows.map((row) => Object.values(row)); } else { - const queryParams: { port?: number; host?: string } = {}; - if (port !== 4983) { - queryParams.port = port; - } + return result.rows; + } + }, + }; + + return { ...db, ...proxy, migrate: migrateFn }; + } else if (driver === 'd1-http') { + const { drizzle } = await import('drizzle-orm/sqlite-proxy'); + const { migrate } = await import('drizzle-orm/sqlite-proxy/migrator'); + + const remoteCallback: Parameters[0] = async ( + sql, + params, + method, + ) => { + const res = await fetch( + `https://api.cloudflare.com/client/v4/accounts/${credentials.accountId}/d1/database/${credentials.databaseId}/${ + method === 'values' ? 'raw' : 'query' + }`, + { + method: 'POST', + body: JSON.stringify({ sql, params }), + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${credentials.token}`, + }, + }, + ); - if (host !== '127.0.0.1') { - queryParams.host = host; + const data = (await res.json()) as + | { + success: true; + result: { + results: + | any[] + | { + columns: string[]; + rows: any[][]; + }; + }[]; + } + | { + success: false; + errors: { code: number; message: string }[]; + }; + + if (!data.success) { + throw new Error( + data.errors.map((it) => `${it.code}: ${it.message}`).join('\n'), + ); + } + + const result = data.result[0].results; + const rows = Array.isArray(result) ? result : result.rows; + + return { + rows, + }; + }; + + const drzl = drizzle(remoteCallback); + const migrateFn = async (config: MigrationConfig) => { + return migrate( + drzl, + async (queries) => { + for (const query of queries) { + await remoteCallback(query, [], 'run'); } + }, + config, + ); + }; - const queryString = Object.keys(queryParams) - .map((key: keyof { port?: number; host?: string }) => { - return `${key}=${queryParams[key]}`; - }) - .join('&'); - - console.log( - `\nDrizzle Studio is up and running on ${ - chalk.blue( - `https://local.drizzle.studio${queryString ? `?${queryString}` : ''}`, - ) - }`, - ); - } + const db: SQLiteDB = { + query: async (sql: string, params?: any[]) => { + const res = await remoteCallback(sql, params || [], 'all'); + return res.rows as T[]; }, - }); - } catch (e) { - console.error(e); - process.exit(0); + run: async (query: string) => { + await remoteCallback(query, [], 'run'); + }, + }; + const proxy: SqliteProxy = { + proxy: async (params: ProxyParams) => { + const preparedParams = prepareSqliteParams(params.params, 'd1-http'); + const result = await remoteCallback( + params.sql, + preparedParams, + params.mode === 'array' ? 'values' : 'all', + ); + + return result.rows; + }, + }; + return { ...db, ...proxy, migrate: migrateFn }; + } else { + assertUnreachable(driver); } - }, -}); + } + + if (await checkPackage('@libsql/client')) { + const { createClient } = await import('@libsql/client'); + const { drizzle } = await import('drizzle-orm/libsql'); + const { migrate } = await import('drizzle-orm/libsql/migrator'); + + const client = createClient({ + url: normaliseSQLiteUrl(credentials.url, 'libsql'), + }); + const drzl = drizzle(client); + const migrateFn = async (config: MigrationConfig) => { + return migrate(drzl, config); + }; + + const db: SQLiteDB = { + query: async (sql: string, params?: any[]) => { + const res = await client.execute({ sql, args: params || [] }); + return res.rows as T[]; + }, + run: async (query: string) => { + await client.execute(query); + }, + }; + + const proxy: SqliteProxy = { + proxy: async (params: ProxyParams) => { + const preparedParams = prepareSqliteParams(params.params); + const result = await client.execute({ + sql: params.sql, + args: preparedParams, + }); + + if (params.mode === 'array') { + return result.rows.map((row) => Object.values(row)); + } else { + return result.rows; + } + }, + }; + + return { ...db, ...proxy, migrate: migrateFn }; + } + + if (await checkPackage('better-sqlite3')) { + const { default: Database } = await import('better-sqlite3'); + const { drizzle } = await import('drizzle-orm/better-sqlite3'); + const { migrate } = await import('drizzle-orm/better-sqlite3/migrator'); + + const sqlite = new Database( + normaliseSQLiteUrl(credentials.url, 'better-sqlite'), + ); + const drzl = drizzle(sqlite); + const migrateFn = async (config: MigrationConfig) => { + return migrate(drzl, config); + }; + + const db: SQLiteDB = { + query: async (sql: string, params: any[] = []) => { + return sqlite.prepare(sql).bind(params).all() as T[]; + }, + run: async (query: string) => { + sqlite.prepare(query).run(); + }, + }; + + const proxy: SqliteProxy = { + proxy: async (params: ProxyParams) => { + const preparedParams = prepareSqliteParams(params.params); + if ( + params.method === 'values' + || params.method === 'get' + || params.method === 'all' + ) { + return sqlite + .prepare(params.sql) + .raw(params.mode === 'array') + .all(preparedParams); + } + + return sqlite.prepare(params.sql).run(preparedParams); + }, + }; + return { ...db, ...proxy, migrate: migrateFn }; + } + console.log( + "Please install either 'better-sqlite3' or '@libsql/client' for Drizzle Kit to connect to SQLite databases", + ); + process.exit(1); +}; diff --git a/drizzle-kit/src/cli/utils.ts b/drizzle-kit/src/cli/utils.ts index 0a5d7862e..f7e7a2ae9 100644 --- a/drizzle-kit/src/cli/utils.ts +++ b/drizzle-kit/src/cli/utils.ts @@ -74,7 +74,7 @@ export const assertEitherPackage = async ( process.exit(1); }; -const requiredApiVersion = 8; +const requiredApiVersion = 7; export const assertOrmCoreVersion = async () => { try { const { compatibilityVersion } = await import('drizzle-orm/version'); diff --git a/drizzle-kit/src/cli/validations/common.ts b/drizzle-kit/src/cli/validations/common.ts index 3a2701e37..a7307f4d6 100644 --- a/drizzle-kit/src/cli/validations/common.ts +++ b/drizzle-kit/src/cli/validations/common.ts @@ -61,6 +61,7 @@ export const assertCollisions = < }; export const sqliteDriversLiterals = [ + literal('turso'), literal('d1-http'), literal('expo'), ] as const; @@ -155,7 +156,7 @@ export const configPushSchema = object({ }); export type CliConfig = TypeOf; -export const drivers = ['d1-http', 'expo', 'aws-data-api', 'pglite'] as const; +export const drivers = ['turso', 'd1-http', 'expo', 'aws-data-api', 'pglite'] as const; export type Driver = (typeof drivers)[number]; const _: Driver = '' as TypeOf; diff --git a/drizzle-kit/src/cli/validations/sqlite.ts b/drizzle-kit/src/cli/validations/sqlite.ts index 54178fd4a..b6ad062d5 100644 --- a/drizzle-kit/src/cli/validations/sqlite.ts +++ b/drizzle-kit/src/cli/validations/sqlite.ts @@ -25,6 +25,11 @@ export const sqliteCredentials = union([ ]); export type SqliteCredentials = + | { + driver: 'turso'; + url: string; + authToken: string; + } | { driver: 'd1-http'; accountId: string; diff --git a/drizzle-kit/src/schemaValidator.ts b/drizzle-kit/src/schemaValidator.ts index e91b5ab11..712252f37 100644 --- a/drizzle-kit/src/schemaValidator.ts +++ b/drizzle-kit/src/schemaValidator.ts @@ -4,7 +4,7 @@ import { pgSchema, pgSchemaSquashed } from './serializer/pgSchema'; import { singlestoreSchema, singlestoreSchemaSquashed } from './serializer/singlestoreSchema'; import { sqliteSchema, SQLiteSchemaSquashed } from './serializer/sqliteSchema'; -export const dialects = ['postgresql', 'mysql', 'sqlite', 'turso', 'singlestore'] as const; +export const dialects = ['postgresql', 'mysql', 'sqlite', 'singlestore'] as const; export const dialect = enumType(dialects); export type Dialect = (typeof dialects)[number]; diff --git a/drizzle-kit/src/utils.ts b/drizzle-kit/src/utils.ts index 71454550e..b14bad5b2 100644 --- a/drizzle-kit/src/utils.ts +++ b/drizzle-kit/src/utils.ts @@ -26,12 +26,9 @@ export type DB = { export type SQLiteDB = { query: (sql: string, params?: any[]) => Promise; run(query: string): Promise; -}; - -export type LibSQLDB = { - query: (sql: string, params?: any[]) => Promise; - run(query: string): Promise; - batchWithPragma?(queries: string[]): Promise; + batch?( + queries: { query: string; values?: any[] | undefined }[], + ): Promise; }; export const copy = (it: T): T => { @@ -119,8 +116,6 @@ const validatorForDialect = (dialect: Dialect) => { return { validator: backwardCompatiblePgSchema, version: 7 }; case 'sqlite': return { validator: backwardCompatibleSqliteSchema, version: 6 }; - case 'turso': - return { validator: backwardCompatibleSqliteSchema, version: 6 }; case 'mysql': return { validator: backwardCompatibleMysqlSchema, version: 5 }; case 'singlestore': @@ -349,13 +344,3 @@ export const normalisePGliteUrl = ( export function isPgArrayType(sqlType: string) { return sqlType.match(/.*\[\d*\].*|.*\[\].*/g) !== null; } - -export function findAddedAndRemoved(columnNames1: string[], columnNames2: string[]) { - const set1 = new Set(columnNames1); - const set2 = new Set(columnNames2); - - const addedColumns = columnNames2.filter((it) => !set1.has(it)); - const removedColumns = columnNames1.filter((it) => !set2.has(it)); - - return { addedColumns, removedColumns }; -} From 56fd347219d3ad61fb7df1ae0138976293ddf592 Mon Sep 17 00:00:00 2001 From: prodrigues Date: Tue, 1 Oct 2024 13:56:02 +0100 Subject: [PATCH 3/8] wip [last visited drizzle-kit/src/schemaValidator.ts --- drizzle-kit/src/cli/validations/libsql.ts | 27 --- drizzle-kit/src/cli/validations/outputs.ts | 2 +- drizzle-kit/src/index.ts | 7 +- drizzle-kit/src/jsonStatements.ts | 195 +-------------------- 4 files changed, 6 insertions(+), 225 deletions(-) delete mode 100644 drizzle-kit/src/cli/validations/libsql.ts diff --git a/drizzle-kit/src/cli/validations/libsql.ts b/drizzle-kit/src/cli/validations/libsql.ts deleted file mode 100644 index a9b03c168..000000000 --- a/drizzle-kit/src/cli/validations/libsql.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { softAssertUnreachable } from 'src/global'; -import { object, string, TypeOf } from 'zod'; -import { error } from '../views'; -import { wrapParam } from './common'; - -export const libSQLCredentials = object({ - url: string().min(1), - authToken: string().min(1).optional(), -}); - -export type LibSQLCredentials = { - url: string; - authToken?: string; -}; - -const _: LibSQLCredentials = {} as TypeOf; - -export const printConfigConnectionIssues = ( - options: Record, - command: 'generate' | 'migrate' | 'push' | 'pull' | 'studio', -) => { - let text = `Please provide required params for 'turso' dialect:\n`; - console.log(error(text)); - console.log(wrapParam('url', options.url)); - console.log(wrapParam('authToken', options.authToken, true, 'secret')); - process.exit(1); -}; diff --git a/drizzle-kit/src/cli/validations/outputs.ts b/drizzle-kit/src/cli/validations/outputs.ts index 8bb0f08ef..ad0423b97 100644 --- a/drizzle-kit/src/cli/validations/outputs.ts +++ b/drizzle-kit/src/cli/validations/outputs.ts @@ -26,7 +26,7 @@ export const outputs = { ), noDialect: () => withStyle.error( - `Please specify 'dialect' param in config, either of 'pg', 'mysql', 'sqlite' of 'singlestore'. It will help drizzle to know how to query you database. You can read more about drizzle.config: https://orm.drizzle.team/kit-docs/config-reference`, + `Please specify 'dialect' param in config, either of 'pg', 'mysql', 'sqlite' or singlestore`, ), }, common: { diff --git a/drizzle-kit/src/index.ts b/drizzle-kit/src/index.ts index dc0c6274c..9fab4bcb8 100644 --- a/drizzle-kit/src/index.ts +++ b/drizzle-kit/src/index.ts @@ -128,7 +128,8 @@ export type Config = } & ( | { - dialect: Verify; + dialect: Verify; + driver: Verify; dbCredentials: { url: string; authToken?: string; @@ -230,7 +231,7 @@ export type Config = * **Config** usage: * * `dialect` - mandatory and is responsible for explicitly providing a databse dialect you are using for all the commands - * *Possible values*: `postgresql`, `mysql`, `sqlite` + * *Possible values*: `postgresql`, `mysql`, `sqlite`, `singlestore` * * See https://orm.drizzle.team/kit-docs/config-reference#dialect * @@ -271,7 +272,7 @@ export type Config = * * `breakpoints` - param lets you enable/disable SQL statement breakpoints in generated migrations. * It’s optional and true by default, it’s necessary to properly apply migrations on databases, - * that do not support multiple DDL alternation statements in one transaction(MySQL, SQLite) and + * that do not support multiple DDL alternation statements in one transaction(MySQL, SQLite, SingleStore) and * Drizzle ORM has to apply them sequentially one by one. * * See https://orm.drizzle.team/kit-docs/config-reference#breakpoints diff --git a/drizzle-kit/src/jsonStatements.ts b/drizzle-kit/src/jsonStatements.ts index b27785d9a..c7115fb07 100644 --- a/drizzle-kit/src/jsonStatements.ts +++ b/drizzle-kit/src/jsonStatements.ts @@ -1,5 +1,4 @@ import chalk from 'chalk'; -import { getNewTableName } from './cli/commands/sqlitePushUtils'; import { warning } from './cli/views'; import { CommonSquashedSchema } from './schemaValidator'; import { MySqlKitInternals, MySqlSchema, MySqlSquasher } from './serializer/mysqlSchema'; @@ -7,9 +6,7 @@ import { Index, PgSchema, PgSquasher } from './serializer/pgSchema'; import { SingleStoreKitInternals, SingleStoreSchema, SingleStoreSquasher } from './serializer/singlestoreSchema'; import { SQLiteKitInternals, - SQLiteSchemaInternal, - SQLiteSchemaSquashed, - SQLiteSquasher, + SQLiteSquasher } from './serializer/sqliteSchema'; import { AlteredColumn, Column, Sequence, Table } from './snapshotsDiffer'; @@ -41,23 +38,6 @@ export interface JsonCreateTableStatement { internals?: MySqlKitInternals | SingleStoreKitInternals; } -export interface JsonRecreateTableStatement { - type: 'recreate_table'; - tableName: string; - columns: Column[]; - referenceData: { - name: string; - tableFrom: string; - columnsFrom: string[]; - tableTo: string; - columnsTo: string[]; - onUpdate?: string | undefined; - onDelete?: string | undefined; - }[]; - compositePKs: string[][]; - uniqueConstraints?: string[]; -} - export interface JsonDropTableStatement { type: 'drop_table'; tableName: string; @@ -196,10 +176,6 @@ export interface JsonReferenceStatement { data: string; schema: string; tableName: string; - isMulticolumn?: boolean; - columnNotNull?: boolean; - columnDefault?: string; - columnType?: string; // fromTable: string; // fromColumns: string[]; // toTable: string; @@ -546,7 +522,6 @@ export type JsonAlterColumnStatement = | JsonAlterColumnDropIdentityStatement; export type JsonStatement = - | JsonRecreateTableStatement | JsonAlterColumnStatement | JsonCreateTableStatement | JsonDropTableStatement @@ -2050,55 +2025,6 @@ export const prepareSqliteAlterColumns = ( `${tableName}_${columnName}` ]; - if (column.autoincrement?.type === 'added') { - statements.push({ - type: 'alter_table_alter_column_set_autoincrement', - tableName, - columnName, - schema, - newDataType: columnType, - columnDefault, - columnOnUpdate, - columnNotNull, - columnAutoIncrement, - columnPk, - }); - } - - if (column.autoincrement?.type === 'changed') { - const type = column.autoincrement.new - ? 'alter_table_alter_column_set_autoincrement' - : 'alter_table_alter_column_drop_autoincrement'; - - statements.push({ - type, - tableName, - columnName, - schema, - newDataType: columnType, - columnDefault, - columnOnUpdate, - columnNotNull, - columnAutoIncrement, - columnPk, - }); - } - - if (column.autoincrement?.type === 'deleted') { - statements.push({ - type: 'alter_table_alter_column_drop_autoincrement', - tableName, - columnName, - schema, - newDataType: columnType, - columnDefault, - columnOnUpdate, - columnNotNull, - columnAutoIncrement, - columnPk, - }); - } - if (typeof column.name !== 'string') { statements.push({ type: 'alter_table_rename_column', @@ -2406,54 +2332,6 @@ export const prepareCreateReferencesJson = ( }; }); }; -export const prepareLibSQLCreateReferencesJson = ( - tableName: string, - schema: string, - foreignKeys: Record, - json2: SQLiteSchemaSquashed, - action?: 'push', -): JsonCreateReferenceStatement[] => { - return Object.values(foreignKeys).map((fkData) => { - const { columnsFrom, tableFrom, columnsTo } = action === 'push' - ? SQLiteSquasher.unsquashPushFK(fkData) - : SQLiteSquasher.unsquashFK(fkData); - - // When trying to alter table in lib sql it is necessary to pass all config for column like "NOT NULL", "DEFAULT", etc. - // If it is multicolumn reference it is not possible to pass this data for all columns - // Pass multicolumn flag for sql statements to not generate migration - let isMulticolumn = false; - - if (columnsFrom.length > 1 || columnsTo.length > 1) { - isMulticolumn = true; - - return { - type: 'create_reference', - tableName, - data: fkData, - schema, - isMulticolumn, - }; - } - - const columnFrom = columnsFrom[0]; - - const { - notNull: columnNotNull, - default: columnDefault, - type: columnType, - } = json2.tables[tableFrom].columns[columnFrom]; - - return { - type: 'create_reference', - tableName, - data: fkData, - schema, - columnNotNull, - columnDefault, - columnType, - }; - }); -}; export const prepareDropReferencesJson = ( tableName: string, @@ -2469,77 +2347,6 @@ export const prepareDropReferencesJson = ( }; }); }; -export const prepareLibSQLDropReferencesJson = ( - tableName: string, - schema: string, - foreignKeys: Record, - json2: SQLiteSchemaSquashed, - meta: SQLiteSchemaInternal['_meta'], - action?: 'push', -): JsonDeleteReferenceStatement[] => { - const statements = Object.values(foreignKeys).map((fkData) => { - const { columnsFrom, tableFrom, columnsTo, name, tableTo, onDelete, onUpdate } = action === 'push' - ? SQLiteSquasher.unsquashPushFK(fkData) - : SQLiteSquasher.unsquashFK(fkData); - - // If all columns from where were references were deleted -> skip this logic - // Drop columns will cover this scenario - const keys = Object.keys(json2.tables[tableName].columns); - const filtered = columnsFrom.filter((it) => keys.includes(it)); - const fullDrop = filtered.length === 0; - if (fullDrop) return; - - // When trying to alter table in lib sql it is necessary to pass all config for column like "NOT NULL", "DEFAULT", etc. - // If it is multicolumn reference it is not possible to pass this data for all columns - // Pass multicolumn flag for sql statements to not generate migration - let isMulticolumn = false; - - if (columnsFrom.length > 1 || columnsTo.length > 1) { - isMulticolumn = true; - - return { - type: 'delete_reference', - tableName, - data: fkData, - schema, - isMulticolumn, - }; - } - - const columnFrom = columnsFrom[0]; - const newTableName = getNewTableName(tableFrom, meta); - - const { - notNull: columnNotNull, - default: columnDefault, - type: columnType, - } = json2.tables[newTableName].columns[columnFrom]; - - const fkToSquash = { - columnsFrom, - columnsTo, - name, - tableFrom: newTableName, - tableTo, - onDelete, - onUpdate, - }; - const foreignKey = action === 'push' - ? SQLiteSquasher.squashPushFK(fkToSquash) - : SQLiteSquasher.squashFK(fkToSquash); - return { - type: 'delete_reference', - tableName, - data: foreignKey, - schema, - columnNotNull, - columnDefault, - columnType, - }; - }); - - return statements.filter((it) => it) as JsonDeleteReferenceStatement[]; -}; // alter should create 2 statements. It's important to make only 1 sql per statement(for breakpoints) export const prepareAlterReferencesJson = ( From aacc5fe1dfcdc383d2a216a20e44d563f9cd488e Mon Sep 17 00:00:00 2001 From: prodrigues Date: Tue, 1 Oct 2024 22:13:48 +0100 Subject: [PATCH 4/8] drizzle kit cleaning --- drizzle-kit/src/cli/commands/introspect.ts | 112 -- drizzle-kit/src/cli/commands/migrate.ts | 93 +- drizzle-kit/src/cli/schema.ts | 1422 +++++++------- drizzle-kit/src/jsonStatements.ts | 5 +- .../src/serializer/sqliteSerializer.ts | 1 + drizzle-kit/src/serializer/studio.ts | 29 +- drizzle-kit/src/snapshotsDiffer.ts | 434 +--- drizzle-kit/src/sqlgenerator.ts | 510 ++--- drizzle-kit/src/statementCombiner.ts | 450 ----- drizzle-kit/tests/cli-generate.test.ts | 1 - drizzle-kit/tests/cli-migrate.test.ts | 3 +- drizzle-kit/tests/cli-push.test.ts | 3 +- drizzle-kit/tests/cli/turso.config.ts | 3 +- drizzle-kit/tests/libsql-statements.test.ts | 982 --------- drizzle-kit/tests/migrate/libsq-schema.ts | 6 - .../tests/migrate/libsql-migrate.test.ts | 58 - .../migrations/0000_little_blizzard.sql | 4 - .../migrations/0001_nebulous_storm.sql | 10 - .../migrations/meta/0000_snapshot.json | 40 - .../migrations/meta/0001_snapshot.json | 40 - .../migrate/migrations/meta/_journal.json | 20 - drizzle-kit/tests/push/libsql.test.ts | 1049 ---------- drizzle-kit/tests/push/sqlite.test.ts | 1556 ++++----------- drizzle-kit/tests/schemaDiffer.ts | 259 +-- drizzle-kit/tests/sqlite-columns.test.ts | 423 +--- drizzle-kit/tests/sqlite-tables.test.ts | 14 +- .../libsql-statements-combiner.test.ts | 1749 ----------------- .../sqlite-statements-combiner.test.ts | 1170 ----------- 28 files changed, 1317 insertions(+), 9129 deletions(-) delete mode 100644 drizzle-kit/src/statementCombiner.ts delete mode 100644 drizzle-kit/tests/libsql-statements.test.ts delete mode 100644 drizzle-kit/tests/migrate/libsq-schema.ts delete mode 100644 drizzle-kit/tests/migrate/libsql-migrate.test.ts delete mode 100644 drizzle-kit/tests/migrate/migrations/0000_little_blizzard.sql delete mode 100644 drizzle-kit/tests/migrate/migrations/0001_nebulous_storm.sql delete mode 100644 drizzle-kit/tests/migrate/migrations/meta/0000_snapshot.json delete mode 100644 drizzle-kit/tests/migrate/migrations/meta/0001_snapshot.json delete mode 100644 drizzle-kit/tests/migrate/migrations/meta/_journal.json delete mode 100644 drizzle-kit/tests/push/libsql.test.ts delete mode 100644 drizzle-kit/tests/statements-combiner/libsql-statements-combiner.test.ts delete mode 100644 drizzle-kit/tests/statements-combiner/sqlite-statements-combiner.test.ts diff --git a/drizzle-kit/src/cli/commands/introspect.ts b/drizzle-kit/src/cli/commands/introspect.ts index 7e7185a58..3558bf83c 100644 --- a/drizzle-kit/src/cli/commands/introspect.ts +++ b/drizzle-kit/src/cli/commands/introspect.ts @@ -25,7 +25,6 @@ import { } from '../../snapshotsDiffer'; import { prepareOutFolder } from '../../utils'; import type { Casing, Prefix } from '../validations/common'; -import { LibSQLCredentials } from '../validations/libsql'; import type { MysqlCredentials } from '../validations/mysql'; import type { PostgresCredentials } from '../validations/postgres'; import { SingleStoreCredentials } from '../validations/singlestore'; @@ -470,117 +469,6 @@ export const introspectSqlite = async ( process.exit(0); }; -export const introspectLibSQL = async ( - casing: Casing, - out: string, - breakpoints: boolean, - credentials: LibSQLCredentials, - tablesFilter: string[], - prefix: Prefix, -) => { - const { connectToLibSQL } = await import('../connections'); - const db = await connectToLibSQL(credentials); - - const matchers = tablesFilter.map((it) => { - return new Minimatch(it); - }); - - const filter = (tableName: string) => { - if (matchers.length === 0) return true; - - let flags: boolean[] = []; - - for (let matcher of matchers) { - if (matcher.negate) { - if (!matcher.match(tableName)) { - flags.push(false); - } - } - - if (matcher.match(tableName)) { - flags.push(true); - } - } - - if (flags.length > 0) { - return flags.every(Boolean); - } - return false; - }; - - const progress = new IntrospectProgress(); - const res = await renderWithTask( - progress, - fromSqliteDatabase(db, filter, (stage, count, status) => { - progress.update(stage, count, status); - }), - ); - - const schema = { id: originUUID, prevId: '', ...res } as SQLiteSchema; - const ts = sqliteSchemaToTypeScript(schema, casing); - const relationsTs = relationsToTypeScript(schema, casing); - - // check orm and orm-pg api version - - const schemaFile = join(out, 'schema.ts'); - writeFileSync(schemaFile, ts.file); - const relationsFile = join(out, 'relations.ts'); - writeFileSync(relationsFile, relationsTs.file); - console.log(); - - const { snapshots, journal } = prepareOutFolder(out, 'sqlite'); - - if (snapshots.length === 0) { - const { sqlStatements, _meta } = await applySqliteSnapshotsDiff( - squashSqliteScheme(drySQLite), - squashSqliteScheme(schema), - tablesResolver, - columnsResolver, - drySQLite, - schema, - ); - - writeResult({ - cur: schema, - sqlStatements, - journal, - _meta, - outFolder: out, - breakpoints, - type: 'introspect', - prefixMode: prefix, - }); - } else { - render( - `[${ - chalk.blue( - 'i', - ) - }] No SQL generated, you already have migrations in project`, - ); - } - - render( - `[${ - chalk.green( - '✓', - ) - }] You schema file is ready ➜ ${chalk.bold.underline.blue(schemaFile)} 🚀`, - ); - render( - `[${ - chalk.green( - '✓', - ) - }] You relations file is ready ➜ ${ - chalk.bold.underline.blue( - relationsFile, - ) - } 🚀`, - ); - process.exit(0); -}; - const withCasing = (value: string, casing: Casing) => { if (casing === 'preserve') { return value; diff --git a/drizzle-kit/src/cli/commands/migrate.ts b/drizzle-kit/src/cli/commands/migrate.ts index 6fd9120ae..726c8ed4b 100644 --- a/drizzle-kit/src/cli/commands/migrate.ts +++ b/drizzle-kit/src/cli/commands/migrate.ts @@ -20,7 +20,6 @@ import { MySqlSchema, mysqlSchema, squashMysqlScheme } from '../../serializer/my import { PgSchema, pgSchema, squashPgScheme } from '../../serializer/pgSchema'; import { SQLiteSchema, sqliteSchema, squashSqliteScheme } from '../../serializer/sqliteSchema'; import { - applyLibSQLSnapshotsDiff, applyMysqlSnapshotsDiff, applyPgSnapshotsDiff, applySingleStoreSnapshotsDiff, @@ -397,7 +396,7 @@ export const prepareAndMigrateMysql = async (config: GenerateConfig) => { }; // Not needed for now -function mySingleStoreSchemaSuggestions( +function singleStoreSchemaSuggestions( curSchema: TypeOf, prevSchema: TypeOf, ) { @@ -599,65 +598,6 @@ export const prepareAndMigrateSqlite = async (config: GenerateConfig) => { } }; -export const prepareAndMigrateLibSQL = async (config: GenerateConfig) => { - const outFolder = config.out; - const schemaPath = config.schema; - - try { - assertV1OutFolder(outFolder); - - const { snapshots, journal } = prepareMigrationFolder(outFolder, 'sqlite'); - const { prev, cur, custom } = await prepareSqliteMigrationSnapshot( - snapshots, - schemaPath, - ); - - const validatedPrev = sqliteSchema.parse(prev); - const validatedCur = sqliteSchema.parse(cur); - - if (config.custom) { - writeResult({ - cur: custom, - sqlStatements: [], - journal, - outFolder, - name: config.name, - breakpoints: config.breakpoints, - bundle: config.bundle, - type: 'custom', - prefixMode: config.prefix, - }); - return; - } - - const squashedPrev = squashSqliteScheme(validatedPrev); - const squashedCur = squashSqliteScheme(validatedCur); - - const { sqlStatements, _meta } = await applyLibSQLSnapshotsDiff( - squashedPrev, - squashedCur, - tablesResolver, - columnsResolver, - validatedPrev, - validatedCur, - ); - - writeResult({ - cur, - sqlStatements, - journal, - _meta, - outFolder, - name: config.name, - breakpoints: config.breakpoints, - bundle: config.bundle, - prefixMode: config.prefix, - }); - } catch (e) { - console.error(e); - } -}; - export const prepareSQLitePush = async ( schemaPath: string | string[], snapshot: SQLiteSchema, @@ -689,37 +629,6 @@ export const prepareSQLitePush = async ( }; }; -export const prepareLibSQLPush = async ( - schemaPath: string | string[], - snapshot: SQLiteSchema, -) => { - const { prev, cur } = await prepareSQLiteDbPushSnapshot(snapshot, schemaPath); - - const validatedPrev = sqliteSchema.parse(prev); - const validatedCur = sqliteSchema.parse(cur); - - const squashedPrev = squashSqliteScheme(validatedPrev, 'push'); - const squashedCur = squashSqliteScheme(validatedCur, 'push'); - - const { sqlStatements, statements, _meta } = await applyLibSQLSnapshotsDiff( - squashedPrev, - squashedCur, - tablesResolver, - columnsResolver, - validatedPrev, - validatedCur, - 'push', - ); - - return { - sqlStatements, - statements, - squashedPrev, - squashedCur, - meta: _meta, - }; -}; - const freeeeeeze = (obj: any) => { Object.freeze(obj); for (let key in obj) { diff --git a/drizzle-kit/src/cli/schema.ts b/drizzle-kit/src/cli/schema.ts index 16999da86..7538237a4 100644 --- a/drizzle-kit/src/cli/schema.ts +++ b/drizzle-kit/src/cli/schema.ts @@ -1,795 +1,687 @@ -import type { AwsDataApiPgQueryResult, AwsDataApiSessionOptions } from 'drizzle-orm/aws-data-api/pg'; -import type { MigrationConfig } from 'drizzle-orm/migrator'; -import type { PreparedQueryConfig } from 'drizzle-orm/pg-core'; -import fetch from 'node-fetch'; -import ws from 'ws'; -import { assertUnreachable } from '../global'; -import type { ProxyParams } from '../serializer/studio'; -import { type DB, normalisePGliteUrl, normaliseSQLiteUrl, type Proxy, type SQLiteDB, type SqliteProxy } from '../utils'; -import { assertPackages, checkPackage } from './utils'; -import type { MysqlCredentials } from './validations/mysql'; +import chalk from 'chalk'; +import { checkHandler } from './commands/check'; +import { assertOrmCoreVersion, assertPackages, assertStudioNodeVersion, ormVersionGt } from './utils'; +import '../@types/utils'; +import { assertV1OutFolder } from '../utils'; +import { dropMigration } from './commands/drop'; +import { upMysqlHandler } from './commands/mysqlUp'; +import { upPgHandler } from './commands/pgUp'; +import { upSqliteHandler } from './commands/sqliteUp'; +import { + prepareCheckParams, + prepareDropParams, + prepareGenerateConfig, + prepareMigrateConfig, + preparePullConfig, + preparePushConfig, + prepareStudioConfig, +} from './commands/utils'; +import { assertCollisions, drivers, prefixes } from './validations/common'; import { withStyle } from './validations/outputs'; -import type { PostgresCredentials } from './validations/postgres'; -import type { SingleStoreCredentials } from './validations/singlestore'; -import type { SqliteCredentials } from './validations/sqlite'; - -export const preparePostgresDB = async ( - credentials: PostgresCredentials, -): Promise< - DB & { - proxy: Proxy; - migrate: (config: string | MigrationConfig) => Promise; - } -> => { - if ('driver' in credentials) { - const { driver } = credentials; - if (driver === 'aws-data-api') { - assertPackages('@aws-sdk/client-rds-data'); - const { RDSDataClient, ExecuteStatementCommand, TypeHint } = await import( - '@aws-sdk/client-rds-data' - ); - const { AwsDataApiSession, drizzle } = await import( - 'drizzle-orm/aws-data-api/pg' - ); - const { migrate } = await import('drizzle-orm/aws-data-api/pg/migrator'); - const { PgDialect } = await import('drizzle-orm/pg-core'); - - const config: AwsDataApiSessionOptions = { - database: credentials.database, - resourceArn: credentials.resourceArn, - secretArn: credentials.secretArn, - }; - const rdsClient = new RDSDataClient(); - const session = new AwsDataApiSession( - rdsClient, - new PgDialect(), - undefined, - config, - undefined, - ); - - const db = drizzle(rdsClient, config); - const migrateFn = async (config: string | MigrationConfig) => { - return migrate(db, config); - }; - - const query = async (sql: string, params: any[]) => { - const prepared = session.prepareQuery( - { sql, params: params ?? [] }, - undefined, - undefined, - false, - ); - const result = await prepared.all(); - return result as any[]; - }; - const proxy = async (params: ProxyParams) => { - const prepared = session.prepareQuery< - PreparedQueryConfig & { - execute: AwsDataApiPgQueryResult; - values: AwsDataApiPgQueryResult; - } - >( - { - sql: params.sql, - params: params.params ?? [], - typings: params.typings, - }, - undefined, - undefined, - params.mode === 'array', - ); - if (params.mode === 'array') { - const result = await prepared.values(); - return result.rows; - } - const result = await prepared.execute(); - return result.rows; - }; - - return { - query, - proxy, - migrate: migrateFn, - }; +import 'dotenv/config'; +import { boolean, command, number, string } from '@drizzle-team/brocli'; +import { mkdirSync } from 'fs'; +import { renderWithTask } from 'hanji'; +import { dialects } from 'src/schemaValidator'; +import { assertUnreachable } from '../global'; +import { drizzleForSingleStore, prepareSingleStoreSchema, type Setup } from '../serializer/studio'; +import { certs } from '../utils/certs'; +import { grey, MigrateProgress } from './views'; +import { upSinglestoreHandler } from './commands/singlestoreUp'; + +const optionDialect = string('dialect') + .enum(...dialects) + .desc(`Database dialect: 'postgresql', 'mysql', 'sqlite' or 'singlestore'`); +const optionOut = string().desc("Output folder, 'drizzle' by default"); +const optionConfig = string().desc('Path to drizzle config file'); +const optionBreakpoints = boolean().desc( + `Prepare SQL statements with breakpoints`, +); + +const optionDriver = string() + .enum(...drivers) + .desc('Database driver'); + +export const generate = command({ + name: 'generate', + options: { + config: optionConfig, + dialect: optionDialect, + driver: optionDriver, + schema: string().desc('Path to a schema file or folder'), + out: optionOut, + name: string().desc('Migration file name'), + breakpoints: optionBreakpoints, + custom: boolean() + .desc('Prepare empty migration file for custom SQL') + .default(false), + prefix: string() + .enum(...prefixes) + .default('index'), + }, + transform: async (opts) => { + const from = assertCollisions( + 'generate', + opts, + ['prefix', 'name', 'custom'], + ['driver', 'breakpoints', 'schema', 'out', 'dialect'], + ); + return prepareGenerateConfig(opts, from); + }, + handler: async (opts) => { + await assertOrmCoreVersion(); + await assertPackages('drizzle-orm'); + + // const parsed = cliConfigGenerate.parse(opts); + + const { + prepareAndMigratePg, + prepareAndMigrateMysql, + prepareAndMigrateSqlite, + prepareAndMigrateSingleStore, + } = await import('./commands/migrate'); + + const dialect = opts.dialect; + if (dialect === 'postgresql') { + await prepareAndMigratePg(opts); + } else if (dialect === 'mysql') { + await prepareAndMigrateMysql(opts); + } else if (dialect === 'sqlite') { + await prepareAndMigrateSqlite(opts); + } else if (dialect === 'singlestore') { + await prepareAndMigrateSqlite(opts); + } else { + assertUnreachable(dialect); } - - if (driver === 'pglite') { - assertPackages('@electric-sql/pglite'); - const { PGlite } = await import('@electric-sql/pglite'); - const { drizzle } = await import('drizzle-orm/pglite'); - const { migrate } = await import('drizzle-orm/pglite/migrator'); - - const pglite = new PGlite(normalisePGliteUrl(credentials.url)); - await pglite.waitReady; - const drzl = drizzle(pglite); - const migrateFn = async (config: MigrationConfig) => { - return migrate(drzl, config); - }; - - const query = async (sql: string, params: any[] = []) => { - const result = await pglite.query(sql, params); - return result.rows as T[]; - }; - - const proxy = async (params: ProxyParams) => { - const preparedParams = preparePGliteParams(params.params); - if ( - params.method === 'values' - || params.method === 'get' - || params.method === 'all' - ) { - const result = await pglite.query(params.sql, preparedParams, { - rowMode: params.mode, - }); - return result.rows; + }, +}); + +export const migrate = command({ + name: 'migrate', + options: { + config: optionConfig, + }, + transform: async (opts) => { + return await prepareMigrateConfig(opts.config); + }, + handler: async (opts) => { + await assertOrmCoreVersion(); + await assertPackages('drizzle-orm'); + + const { dialect, schema, table, out, credentials } = opts; + try { + if (dialect === 'postgresql') { + if ('driver' in credentials) { + const { driver } = credentials; + if (driver === 'aws-data-api') { + if (!(await ormVersionGt('0.30.10'))) { + console.log( + "To use 'aws-data-api' driver - please update drizzle-orm to the latest version", + ); + process.exit(1); + } + } else if (driver === 'pglite') { + if (!(await ormVersionGt('0.30.6'))) { + console.log( + "To use 'pglite' driver - please update drizzle-orm to the latest version", + ); + process.exit(1); + } + } else { + assertUnreachable(driver); + } } - - const result = await pglite.query(params.sql, preparedParams); - return result.rows; - }; - - return { query, proxy, migrate: migrateFn }; + const { preparePostgresDB } = await import('./connections'); + const { migrate } = await preparePostgresDB(credentials); + await renderWithTask( + new MigrateProgress(), + migrate({ + migrationsFolder: out, + migrationsTable: table, + migrationsSchema: schema, + }), + ); + } else if (dialect === 'mysql') { + const { connectToMySQL } = await import('./connections'); + const { migrate } = await connectToMySQL(credentials); + await renderWithTask( + new MigrateProgress(), + migrate({ + migrationsFolder: out, + migrationsTable: table, + migrationsSchema: schema, + }), + ); + } else if (dialect === 'singlestore') { + const { connectToSingleStore } = await import('./connections'); + const { migrate } = await connectToSingleStore(credentials); + await renderWithTask( + new MigrateProgress(), + migrate({ + migrationsFolder: out, + migrationsTable: table, + migrationsSchema: schema, + }), + ); + } else if (dialect === 'sqlite') { + const { connectToSQLite } = await import('./connections'); + const { migrate } = await connectToSQLite(credentials); + await renderWithTask( + new MigrateProgress(), + migrate({ + migrationsFolder: opts.out, + migrationsTable: table, + migrationsSchema: schema, + }), + ); + } else { + assertUnreachable(dialect); + } + } catch (e) { + console.error(e); + process.exit(1); } - assertUnreachable(driver); - } - - if (await checkPackage('pg')) { - console.log(withStyle.info(`Using 'pg' driver for database querying`)); - const pg = await import('pg'); - const { drizzle } = await import('drizzle-orm/node-postgres'); - const { migrate } = await import('drizzle-orm/node-postgres/migrator'); - - const ssl = 'ssl' in credentials - ? credentials.ssl === 'prefer' - || credentials.ssl === 'require' - || credentials.ssl === 'allow' - ? { rejectUnauthorized: false } - : credentials.ssl === 'verify-full' - ? {} - : credentials.ssl - : {}; - - const client = 'url' in credentials - ? new pg.default.Pool({ connectionString: credentials.url, max: 1 }) - : new pg.default.Pool({ ...credentials, ssl, max: 1 }); - - const db = drizzle(client); - const migrateFn = async (config: string | MigrationConfig) => { - return migrate(db, config); - }; - - const query = async (sql: string, params?: any[]) => { - const result = await client.query(sql, params ?? []); - return result.rows; - }; - - const proxy: Proxy = async (params: ProxyParams) => { - const result = await client.query({ - text: params.sql, - values: params.params, - ...(params.mode === 'array' && { rowMode: 'array' }), - }); - return result.rows; - }; - - return { query, proxy, migrate: migrateFn }; - } - - if (await checkPackage('postgres')) { - console.log( - withStyle.info(`Using 'postgres' driver for database querying`), + process.exit(0); + }, +}); + +const optionsFilters = { + tablesFilter: string().desc('Table name filters'), + schemaFilters: string().desc('Schema name filters'), + extensionsFilters: string().desc( + '`Database extensions internal database filters', + ), +} as const; + +const optionsDatabaseCredentials = { + url: string().desc('Database connection URL'), + host: string().desc('Database host'), + port: string().desc('Database port'), + user: string().desc('Database user'), + password: string().desc('Database password'), + database: string().desc('Database name'), + ssl: string().desc('ssl mode'), + // Turso + authToken: string('auth-token').desc('Database auth token [Turso]'), + // specific cases + driver: optionDriver, +} as const; + +export const push = command({ + name: 'push', + options: { + config: optionConfig, + dialect: optionDialect, + schema: string().desc('Path to a schema file or folder'), + ...optionsFilters, + ...optionsDatabaseCredentials, + verbose: boolean() + .desc('Print all statements for each push') + .default(false), + strict: boolean().desc('Always ask for confirmation').default(false), + force: boolean() + .desc( + 'Auto-approve all data loss statements. Note: Data loss statements may truncate your tables and data', + ) + .default(false), + }, + transform: async (opts) => { + const from = assertCollisions( + 'push', + opts, + ['force', 'verbose', 'strict'], + [ + 'schema', + 'dialect', + 'driver', + 'url', + 'host', + 'port', + 'user', + 'password', + 'database', + 'ssl', + 'authToken', + 'schemaFilters', + 'extensionsFilters', + 'tablesFilter', + ], ); - const postgres = await import('postgres'); - - const { drizzle } = await import('drizzle-orm/postgres-js'); - const { migrate } = await import('drizzle-orm/postgres-js/migrator'); - const client = 'url' in credentials - ? postgres.default(credentials.url, { max: 1 }) - : postgres.default({ ...credentials, max: 1 }); - - const db = drizzle(client); - const migrateFn = async (config: string | MigrationConfig) => { - return migrate(db, config); - }; - - const query = async (sql: string, params?: any[]) => { - const result = await client.unsafe(sql, params ?? []); - return result as any[]; - }; + return preparePushConfig(opts, from); + }, + handler: async (config) => { + await assertPackages('drizzle-orm'); + await assertOrmCoreVersion(); + + const { + dialect, + schemaPath, + strict, + verbose, + credentials, + tablesFilter, + schemasFilter, + force, + } = config; + + try { + if (dialect === 'mysql') { + const { mysqlPush } = await import('./commands/push'); + await mysqlPush( + schemaPath, + credentials, + tablesFilter, + strict, + verbose, + force, + ); + } else if (dialect === 'postgresql') { + if ('driver' in credentials) { + const { driver } = credentials; + if (driver === 'aws-data-api') { + if (!(await ormVersionGt('0.30.10'))) { + console.log( + "To use 'aws-data-api' driver - please update drizzle-orm to the latest version", + ); + process.exit(1); + } + } else if (driver === 'pglite') { + if (!(await ormVersionGt('0.30.6'))) { + console.log( + "To use 'pglite' driver - please update drizzle-orm to the latest version", + ); + process.exit(1); + } + } else { + assertUnreachable(driver); + } + } - const proxy = async (params: ProxyParams) => { - if (params.mode === 'object') { - return await client.unsafe(params.sql, params.params); + const { pgPush } = await import('./commands/push'); + await pgPush( + schemaPath, + verbose, + strict, + credentials, + tablesFilter, + schemasFilter, + force, + ); + } else if (dialect === 'sqlite') { + const { sqlitePush } = await import('./commands/push'); + await sqlitePush( + schemaPath, + verbose, + strict, + credentials, + tablesFilter, + force, + ); + } else if (dialect === 'singlestore') { + const { singlestorePush } = await import('./commands/push'); + await singlestorePush( + schemaPath, + credentials, + tablesFilter, + strict, + verbose, + force, + ); + } else { + assertUnreachable(dialect); } - return await client.unsafe(params.sql, params.params).values(); - }; - - return { query, proxy, migrate: migrateFn }; - } + } catch (e) { + console.error(e); + } + process.exit(0); + }, +}); + +export const check = command({ + name: 'check', + options: { + config: optionConfig, + dialect: optionDialect, + out: optionOut, + }, + transform: async (opts) => { + const from = assertCollisions('check', opts, [], ['dialect', 'out']); + return prepareCheckParams(opts, from); + }, + handler: async (config) => { + await assertOrmCoreVersion(); + + const { out, dialect } = config; + checkHandler(out, dialect); + console.log("Everything's fine 🐶🔥"); + }, +}); + +export const up = command({ + name: 'up', + options: { + config: optionConfig, + dialect: optionDialect, + out: optionOut, + }, + transform: async (opts) => { + const from = assertCollisions('check', opts, [], ['dialect', 'out']); + return prepareCheckParams(opts, from); + }, + handler: async (config) => { + await assertOrmCoreVersion(); + + const { out, dialect } = config; + await assertPackages('drizzle-orm'); + + if (dialect === 'postgresql') { + upPgHandler(out); + } - if (await checkPackage('@vercel/postgres')) { - console.log( - withStyle.info(`Using '@vercel/postgres' driver for database querying`), - ); - console.log( - withStyle.fullWarning( - "'@vercel/postgres' can only connect to remote Neon/Vercel Postgres/Supabase instances through a websocket", - ), - ); - const { VercelPool } = await import('@vercel/postgres'); - const { drizzle } = await import('drizzle-orm/vercel-postgres'); - const { migrate } = await import('drizzle-orm/vercel-postgres/migrator'); - const ssl = 'ssl' in credentials - ? credentials.ssl === 'prefer' - || credentials.ssl === 'require' - || credentials.ssl === 'allow' - ? { rejectUnauthorized: false } - : credentials.ssl === 'verify-full' - ? {} - : credentials.ssl - : {}; - - const client = 'url' in credentials - ? new VercelPool({ connectionString: credentials.url }) - : new VercelPool({ ...credentials, ssl }); - - await client.connect(); - - const db = drizzle(client); - const migrateFn = async (config: string | MigrationConfig) => { - return migrate(db, config); - }; - - const query = async (sql: string, params?: any[]) => { - const result = await client.query(sql, params ?? []); - return result.rows; - }; - - const proxy: Proxy = async (params: ProxyParams) => { - const result = await client.query({ - text: params.sql, - values: params.params, - ...(params.mode === 'array' && { rowMode: 'array' }), - }); - return result.rows; - }; + if (dialect === 'mysql') { + upMysqlHandler(out); + } - return { query, proxy, migrate: migrateFn }; - } + if (dialect === 'sqlite') { + upSqliteHandler(out); + } - if (await checkPackage('@neondatabase/serverless')) { - console.log( - withStyle.info( - `Using '@neondatabase/serverless' driver for database querying`, - ), + if (dialect === 'singlestore') { + upSinglestoreHandler(out); + } + }, +}); + +export const pull = command({ + name: 'introspect', + aliases: ['pull'], + options: { + config: optionConfig, + dialect: optionDialect, + out: optionOut, + breakpoints: optionBreakpoints, + casing: string('introspect-casing').enum('camel', 'preserve'), + ...optionsFilters, + ...optionsDatabaseCredentials, + }, + transform: async (opts) => { + const from = assertCollisions( + 'introspect', + opts, + [], + [ + 'dialect', + 'driver', + 'out', + 'url', + 'host', + 'port', + 'user', + 'password', + 'database', + 'ssl', + 'authToken', + 'casing', + 'breakpoints', + 'tablesFilter', + 'schemaFilters', + 'extensionsFilters', + ], ); + return preparePullConfig(opts, from); + }, + handler: async (config) => { + await assertPackages('drizzle-orm'); + await assertOrmCoreVersion(); + + const { + dialect, + credentials, + out, + casing, + breakpoints, + tablesFilter, + schemasFilter, + prefix, + } = config; + mkdirSync(out, { recursive: true }); + console.log( - withStyle.fullWarning( - "'@neondatabase/serverless' can only connect to remote Neon/Vercel Postgres/Supabase instances through a websocket", + grey( + `Pulling from [${ + schemasFilter + .map((it) => `'${it}'`) + .join(', ') + }] list of schemas`, ), ); - const { Pool, neonConfig } = await import('@neondatabase/serverless'); - const { drizzle } = await import('drizzle-orm/neon-serverless'); - const { migrate } = await import('drizzle-orm/neon-serverless/migrator'); - - const ssl = 'ssl' in credentials - ? credentials.ssl === 'prefer' - || credentials.ssl === 'require' - || credentials.ssl === 'allow' - ? { rejectUnauthorized: false } - : credentials.ssl === 'verify-full' - ? {} - : credentials.ssl - : {}; - - const client = 'url' in credentials - ? new Pool({ connectionString: credentials.url, max: 1 }) - : new Pool({ ...credentials, max: 1, ssl }); - neonConfig.webSocketConstructor = ws; - - const db = drizzle(client); - const migrateFn = async (config: string | MigrationConfig) => { - return migrate(db, config); - }; - - const query = async (sql: string, params?: any[]) => { - const result = await client.query(sql, params ?? []); - return result.rows; - }; - - const proxy: Proxy = async (params: ProxyParams) => { - const result = await client.query({ - text: params.sql, - values: params.params, - ...(params.mode === 'array' && { rowMode: 'array' }), - }); - return result.rows; - }; - - return { query, proxy, migrate: migrateFn }; - } - - console.error( - "To connect to Postgres database - please install either of 'pg', 'postgres', '@neondatabase/serverless' or '@vercel/postgres' drivers", - ); - process.exit(1); -}; - -const parseMysqlCredentials = (credentials: MysqlCredentials) => { - if ('url' in credentials) { - const url = credentials.url; - - const connectionUrl = new URL(url); - const pathname = connectionUrl.pathname; + console.log(); + + try { + if (dialect === 'postgresql') { + if ('driver' in credentials) { + const { driver } = credentials; + if (driver === 'aws-data-api') { + if (!(await ormVersionGt('0.30.10'))) { + console.log( + "To use 'aws-data-api' driver - please update drizzle-orm to the latest version", + ); + process.exit(1); + } + } else if (driver === 'pglite') { + if (!(await ormVersionGt('0.30.6'))) { + console.log( + "To use 'pglite' driver - please update drizzle-orm to the latest version", + ); + process.exit(1); + } + } else { + assertUnreachable(driver); + } + } - const database = pathname.split('/')[pathname.split('/').length - 1]; - if (!database) { - console.error( - 'You should specify a database name in connection string (mysql://USER:PASSWORD@HOST:PORT/DATABASE)', - ); - process.exit(1); + const { introspectPostgres } = await import('./commands/introspect'); + await introspectPostgres( + casing, + out, + breakpoints, + credentials, + tablesFilter, + schemasFilter, + prefix, + ); + } else if (dialect === 'mysql') { + const { introspectMysql } = await import('./commands/introspect'); + await introspectMysql( + casing, + out, + breakpoints, + credentials, + tablesFilter, + prefix, + ); + } else if (dialect === 'sqlite') { + const { introspectSqlite } = await import('./commands/introspect'); + await introspectSqlite( + casing, + out, + breakpoints, + credentials, + tablesFilter, + prefix, + ); + } else if (dialect === 'singlestore') { + const { introspectSingleStore } = await import('./commands/introspect'); + await introspectSingleStore( + casing, + out, + breakpoints, + credentials, + tablesFilter, + prefix, + ); + } else { + assertUnreachable(dialect); + } + } catch (e) { + console.error(e); } - return { database, url }; - } else { - return { - database: credentials.database, + process.exit(0); + }, +}); + +export const drop = command({ + name: 'drop', + options: { + config: optionConfig, + out: optionOut, + driver: optionDriver, + }, + transform: async (opts) => { + const from = assertCollisions('check', opts, [], ['driver', 'out']); + return prepareDropParams(opts, from); + }, + handler: async (config) => { + await assertOrmCoreVersion(); + + assertV1OutFolder(config.out); + await dropMigration(config); + }, +}); + +export const studio = command({ + name: 'studio', + options: { + config: optionConfig, + port: number().desc('Custom port for drizzle studio [default=4983]'), + host: string().desc('Custom host for drizzle studio [default=0.0.0.0]'), + verbose: boolean() + .default(false) + .desc('Print all stataments that are executed by Studio'), + }, + handler: async (opts) => { + await assertOrmCoreVersion(); + await assertPackages('drizzle-orm'); + + assertStudioNodeVersion(); + + const { + dialect, + schema: schemaPath, + port, + host, credentials, - }; - } -}; - -export const connectToMySQL = async ( - it: MysqlCredentials, -): Promise<{ - db: DB; - proxy: Proxy; - database: string; - migrate: (config: MigrationConfig) => Promise; -}> => { - const result = parseMysqlCredentials(it); - - if (await checkPackage('mysql2')) { - const { createConnection } = await import('mysql2/promise'); - const { drizzle } = await import('drizzle-orm/mysql2'); - const { migrate } = await import('drizzle-orm/mysql2/migrator'); - - const connection = result.url - ? await createConnection(result.url) - : await createConnection(result.credentials!); // needed for some reason! - - const db = drizzle(connection); - const migrateFn = async (config: MigrationConfig) => { - return migrate(db, config); - }; - - await connection.connect(); - const query: DB['query'] = async ( - sql: string, - params?: any[], - ): Promise => { - const res = await connection.execute(sql, params); - return res[0] as any; - }; - - const proxy: Proxy = async (params: ProxyParams) => { - const result = await connection.query({ - sql: params.sql, - values: params.params, - rowsAsArray: params.mode === 'array', - }); - return result[0] as any[]; - }; - - return { - db: { query }, - proxy, - database: result.database, - migrate: migrateFn, - }; - } - - if (await checkPackage('@planetscale/database')) { - const { connect } = await import('@planetscale/database'); - const { drizzle } = await import('drizzle-orm/planetscale-serverless'); - const { migrate } = await import( - 'drizzle-orm/planetscale-serverless/migrator' - ); + } = await prepareStudioConfig(opts); + + const { + drizzleForPostgres, + preparePgSchema, + prepareMySqlSchema, + drizzleForMySQL, + prepareSQLiteSchema, + drizzleForSQLite, + prepareSingleStoreSchema, + drizzleForSingleStore, + } = await import('../serializer/studio'); + + let setup: Setup; + try { + if (dialect === 'postgresql') { + if ('driver' in credentials) { + const { driver } = credentials; + if (driver === 'aws-data-api') { + if (!(await ormVersionGt('0.30.10'))) { + console.log( + "To use 'aws-data-api' driver - please update drizzle-orm to the latest version", + ); + process.exit(1); + } + } else if (driver === 'pglite') { + if (!(await ormVersionGt('0.30.6'))) { + console.log( + "To use 'pglite' driver - please update drizzle-orm to the latest version", + ); + process.exit(1); + } + } else { + assertUnreachable(driver); + } + } - const connection = connect(result); - - const db = drizzle(connection); - const migrateFn = async (config: MigrationConfig) => { - return migrate(db, config); - }; - - const query = async (sql: string, params?: any[]): Promise => { - const res = await connection.execute(sql, params); - return res.rows as T[]; - }; - const proxy: Proxy = async (params: ProxyParams) => { - const result = params.mode === 'object' - ? await connection.execute(params.sql, params.params) - : await connection.execute(params.sql, params.params, { - as: 'array', - }); - return result.rows; - }; - - return { - db: { query }, - proxy, - database: result.database, - migrate: migrateFn, - }; - } - - console.error( - "To connect to SingleStore database - please install the 'mysql2' driver", - ); - process.exit(1); -}; - -const parseSingleStoreCredentials = (credentials: SingleStoreCredentials) => { - if ('url' in credentials) { - const url = credentials.url; - - const connectionUrl = new URL(url); - const pathname = connectionUrl.pathname; - - const database = pathname.split('/')[pathname.split('/').length - 1]; - if (!database) { - console.error( - 'You should specify a database name in connection string (singlestore://USER:PASSWORD@HOST:PORT/DATABASE)', - ); - process.exit(1); - } - return { database, url }; - } else { - return { - database: credentials.database, - credentials, - }; - } -}; - -export const connectToSingleStore = async ( - it: SingleStoreCredentials, -): Promise<{ - db: DB; - proxy: Proxy; - database: string; - migrate: (config: MigrationConfig) => Promise; -}> => { - const result = parseSingleStoreCredentials(it); - - if (await checkPackage('mysql2')) { - const { createConnection } = await import('mysql2/promise'); - const { drizzle } = await import('drizzle-orm/singlestore'); - const { migrate } = await import('drizzle-orm/singlestore/migrator'); - - const connection = result.url - ? await createConnection(result.url) - : await createConnection(result.credentials!); // needed for some reason! - - const db = drizzle(connection); - const migrateFn = async (config: MigrationConfig) => { - return migrate(db, config); - }; - - await connection.connect(); - const query: DB['query'] = async ( - sql: string, - params?: any[], - ): Promise => { - const res = await connection.execute(sql, params); - return res[0] as any; - }; - - const proxy: Proxy = async (params: ProxyParams) => { - const result = await connection.query({ - sql: params.sql, - values: params.params, - rowsAsArray: params.mode === 'array', - }); - return result[0] as any[]; - }; - - return { - db: { query }, - proxy, - database: result.database, - migrate: migrateFn, - }; - } - - console.error( - "To connect to SingleStore database - please install the 'mysql2' driver", - ); - process.exit(1); -}; - -const prepareSqliteParams = (params: any[], driver?: string) => { - return params.map((param) => { - if ( - param - && typeof param === 'object' - && 'type' in param - && 'value' in param - && param.type === 'binary' - ) { - const value = typeof param.value === 'object' - ? JSON.stringify(param.value) - : (param.value as string); - - if (driver === 'd1-http') { - return value; + const { schema, relations, files } = schemaPath + ? await preparePgSchema(schemaPath) + : { schema: {}, relations: {}, files: [] }; + setup = await drizzleForPostgres(credentials, schema, relations, files); + } else if (dialect === 'mysql') { + const { schema, relations, files } = schemaPath + ? await prepareMySqlSchema(schemaPath) + : { schema: {}, relations: {}, files: [] }; + setup = await drizzleForMySQL(credentials, schema, relations, files); + } else if (dialect === 'sqlite') { + const { schema, relations, files } = schemaPath + ? await prepareSQLiteSchema(schemaPath) + : { schema: {}, relations: {}, files: [] }; + setup = await drizzleForSQLite(credentials, schema, relations, files); + } else if (dialect === 'singlestore') { + const { schema, relations, files } = schemaPath + ? await prepareSingleStoreSchema(schemaPath) + : { schema: {}, relations: {}, files: [] }; + setup = await drizzleForSingleStore(credentials, schema, relations, files); + } else { + assertUnreachable(dialect); } - return Buffer.from(value); - } - return param; - }); -}; - -const preparePGliteParams = (params: any[]) => { - return params.map((param) => { - if ( - param - && typeof param === 'object' - && 'type' in param - && 'value' in param - && param.type === 'binary' - ) { - const value = typeof param.value === 'object' - ? JSON.stringify(param.value) - : (param.value as string); - - return value; - } - return param; - }); -}; - -export const connectToSQLite = async ( - credentials: SqliteCredentials, -): Promise< - & SQLiteDB - & SqliteProxy - & { migrate: (config: MigrationConfig) => Promise } -> => { - if ('driver' in credentials) { - const { driver } = credentials; - if (driver === 'turso') { - assertPackages('@libsql/client'); - const { createClient } = await import('@libsql/client'); - const { drizzle } = await import('drizzle-orm/libsql'); - const { migrate } = await import('drizzle-orm/libsql/migrator'); - - const client = createClient({ - url: credentials.url, - authToken: credentials.authToken, - }); + const { prepareServer } = await import('../serializer/studio'); - const drzl = drizzle(client); - const migrateFn = async (config: MigrationConfig) => { - return migrate(drzl, config); - }; + const server = await prepareServer(setup); - const db: SQLiteDB = { - query: async (sql: string, params?: any[]) => { - const res = await client.execute({ sql, args: params || [] }); - return res.rows as T[]; - }, - run: async (query: string) => { - await client.execute(query); - }, - batch: async ( - queries: { query: string; values?: any[] | undefined }[], - ) => { - await client.batch( - queries.map((it) => ({ sql: it.query, args: it.values ?? [] })), - ); - }, - }; - const proxy: SqliteProxy = { - proxy: async (params: ProxyParams) => { - const preparedParams = prepareSqliteParams(params.params); - const result = await client.execute({ - sql: params.sql, - args: preparedParams, - }); - - if (params.mode === 'array') { - return result.rows.map((row) => Object.values(row)); - } else { - return result.rows; - } - }, - }; - - return { ...db, ...proxy, migrate: migrateFn }; - } else if (driver === 'd1-http') { - const { drizzle } = await import('drizzle-orm/sqlite-proxy'); - const { migrate } = await import('drizzle-orm/sqlite-proxy/migrator'); - - const remoteCallback: Parameters[0] = async ( - sql, - params, - method, - ) => { - const res = await fetch( - `https://api.cloudflare.com/client/v4/accounts/${credentials.accountId}/d1/database/${credentials.databaseId}/${ - method === 'values' ? 'raw' : 'query' - }`, - { - method: 'POST', - body: JSON.stringify({ sql, params }), - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${credentials.token}`, - }, - }, - ); - - const data = (await res.json()) as - | { - success: true; - result: { - results: - | any[] - | { - columns: string[]; - rows: any[][]; - }; - }[]; - } - | { - success: false; - errors: { code: number; message: string }[]; - }; - - if (!data.success) { - throw new Error( - data.errors.map((it) => `${it.code}: ${it.message}`).join('\n'), - ); - } + console.log(); + console.log( + withStyle.fullWarning( + 'Drizzle Studio is currently in Beta. If you find anything that is not working as expected or should be improved, feel free to create an issue on GitHub: https://github.com/drizzle-team/drizzle-kit-mirror/issues/new or write to us on Discord: https://discord.gg/WcRKz2FFxN', + ), + ); - const result = data.result[0].results; - const rows = Array.isArray(result) ? result : result.rows; - - return { - rows, - }; - }; - - const drzl = drizzle(remoteCallback); - const migrateFn = async (config: MigrationConfig) => { - return migrate( - drzl, - async (queries) => { - for (const query of queries) { - await remoteCallback(query, [], 'run'); + const { key, cert } = (await certs()) || {}; + server.start({ + host, + port, + key, + cert, + cb: (err, address) => { + if (err) { + console.error(err); + } else { + const queryParams: { port?: number; host?: string } = {}; + if (port !== 4983) { + queryParams.port = port; } - }, - config, - ); - }; - const db: SQLiteDB = { - query: async (sql: string, params?: any[]) => { - const res = await remoteCallback(sql, params || [], 'all'); - return res.rows as T[]; - }, - run: async (query: string) => { - await remoteCallback(query, [], 'run'); - }, - }; - const proxy: SqliteProxy = { - proxy: async (params: ProxyParams) => { - const preparedParams = prepareSqliteParams(params.params, 'd1-http'); - const result = await remoteCallback( - params.sql, - preparedParams, - params.mode === 'array' ? 'values' : 'all', - ); + if (host !== '127.0.0.1') { + queryParams.host = host; + } - return result.rows; + const queryString = Object.keys(queryParams) + .map((key: keyof { port?: number; host?: string }) => { + return `${key}=${queryParams[key]}`; + }) + .join('&'); + + console.log( + `\nDrizzle Studio is up and running on ${ + chalk.blue( + `https://local.drizzle.studio${queryString ? `?${queryString}` : ''}`, + ) + }`, + ); + } }, - }; - return { ...db, ...proxy, migrate: migrateFn }; - } else { - assertUnreachable(driver); + }); + } catch (e) { + console.error(e); + process.exit(0); } - } - - if (await checkPackage('@libsql/client')) { - const { createClient } = await import('@libsql/client'); - const { drizzle } = await import('drizzle-orm/libsql'); - const { migrate } = await import('drizzle-orm/libsql/migrator'); - - const client = createClient({ - url: normaliseSQLiteUrl(credentials.url, 'libsql'), - }); - const drzl = drizzle(client); - const migrateFn = async (config: MigrationConfig) => { - return migrate(drzl, config); - }; - - const db: SQLiteDB = { - query: async (sql: string, params?: any[]) => { - const res = await client.execute({ sql, args: params || [] }); - return res.rows as T[]; - }, - run: async (query: string) => { - await client.execute(query); - }, - }; - - const proxy: SqliteProxy = { - proxy: async (params: ProxyParams) => { - const preparedParams = prepareSqliteParams(params.params); - const result = await client.execute({ - sql: params.sql, - args: preparedParams, - }); - - if (params.mode === 'array') { - return result.rows.map((row) => Object.values(row)); - } else { - return result.rows; - } - }, - }; - - return { ...db, ...proxy, migrate: migrateFn }; - } - - if (await checkPackage('better-sqlite3')) { - const { default: Database } = await import('better-sqlite3'); - const { drizzle } = await import('drizzle-orm/better-sqlite3'); - const { migrate } = await import('drizzle-orm/better-sqlite3/migrator'); - - const sqlite = new Database( - normaliseSQLiteUrl(credentials.url, 'better-sqlite'), - ); - const drzl = drizzle(sqlite); - const migrateFn = async (config: MigrationConfig) => { - return migrate(drzl, config); - }; - - const db: SQLiteDB = { - query: async (sql: string, params: any[] = []) => { - return sqlite.prepare(sql).bind(params).all() as T[]; - }, - run: async (query: string) => { - sqlite.prepare(query).run(); - }, - }; - - const proxy: SqliteProxy = { - proxy: async (params: ProxyParams) => { - const preparedParams = prepareSqliteParams(params.params); - if ( - params.method === 'values' - || params.method === 'get' - || params.method === 'all' - ) { - return sqlite - .prepare(params.sql) - .raw(params.mode === 'array') - .all(preparedParams); - } - - return sqlite.prepare(params.sql).run(preparedParams); - }, - }; - return { ...db, ...proxy, migrate: migrateFn }; - } - console.log( - "Please install either 'better-sqlite3' or '@libsql/client' for Drizzle Kit to connect to SQLite databases", - ); - process.exit(1); -}; + }, +}); diff --git a/drizzle-kit/src/jsonStatements.ts b/drizzle-kit/src/jsonStatements.ts index c7115fb07..090b0cdde 100644 --- a/drizzle-kit/src/jsonStatements.ts +++ b/drizzle-kit/src/jsonStatements.ts @@ -4,10 +4,7 @@ import { CommonSquashedSchema } from './schemaValidator'; import { MySqlKitInternals, MySqlSchema, MySqlSquasher } from './serializer/mysqlSchema'; import { Index, PgSchema, PgSquasher } from './serializer/pgSchema'; import { SingleStoreKitInternals, SingleStoreSchema, SingleStoreSquasher } from './serializer/singlestoreSchema'; -import { - SQLiteKitInternals, - SQLiteSquasher -} from './serializer/sqliteSchema'; +import { SQLiteKitInternals, SQLiteSquasher } from './serializer/sqliteSchema'; import { AlteredColumn, Column, Sequence, Table } from './snapshotsDiffer'; export interface JsonSqliteCreateTableStatement { diff --git a/drizzle-kit/src/serializer/sqliteSerializer.ts b/drizzle-kit/src/serializer/sqliteSerializer.ts index 41edd78a9..ce544235b 100644 --- a/drizzle-kit/src/serializer/sqliteSerializer.ts +++ b/drizzle-kit/src/serializer/sqliteSerializer.ts @@ -363,6 +363,7 @@ export const fromDatabase = async ( ) => void, ): Promise => { const result: Record = {}; + const columns = await db.query<{ tableName: string; columnName: string; diff --git a/drizzle-kit/src/serializer/studio.ts b/drizzle-kit/src/serializer/studio.ts index 12ea8207c..5515e6f59 100644 --- a/drizzle-kit/src/serializer/studio.ts +++ b/drizzle-kit/src/serializer/studio.ts @@ -25,7 +25,6 @@ import fs from 'fs'; import { Hono } from 'hono'; import { cors } from 'hono/cors'; import { createServer } from 'node:https'; -import { LibSQLCredentials } from 'src/cli/validations/libsql'; import { assertUnreachable } from 'src/global'; import superjson from 'superjson'; import { z } from 'zod'; @@ -343,6 +342,8 @@ export const drizzleForSQLite = async ( const { driver } = credentials; if (driver === 'd1-http') { dbUrl = `d1-http://${credentials.accountId}/${credentials.databaseId}/${credentials.token}`; + } else if (driver === 'turso') { + dbUrl = `turso://${credentials.url}/${credentials.authToken}`; } else { assertUnreachable(driver); } @@ -363,32 +364,6 @@ export const drizzleForSQLite = async ( schemaFiles, }; }; -export const drizzleForLibSQL = async ( - credentials: LibSQLCredentials, - sqliteSchema: Record>, - relations: Record, - schemaFiles?: SchemaFile[], -): Promise => { - const { connectToLibSQL } = await import('../cli/connections'); - - const sqliteDB = await connectToLibSQL(credentials); - const customDefaults = getCustomDefaults(sqliteSchema); - - let dbUrl: string = `turso://${credentials.url}/${credentials.authToken}`; - - const dbHash = createHash('sha256').update(dbUrl).digest('hex'); - - return { - dbHash, - dialect: 'sqlite', - driver: undefined, - proxy: sqliteDB.proxy, - customDefaults, - schema: sqliteSchema, - relations, - schemaFiles, - }; -}; export const drizzleForSingleStore = async ( credentials: SingleStoreCredentials, diff --git a/drizzle-kit/src/snapshotsDiffer.ts b/drizzle-kit/src/snapshotsDiffer.ts index 6f27a2505..7ccb13a26 100644 --- a/drizzle-kit/src/snapshotsDiffer.ts +++ b/drizzle-kit/src/snapshotsDiffer.ts @@ -1,3 +1,4 @@ + import { any, array, @@ -10,7 +11,7 @@ import { string, TypeOf, union, - ZodTypeAny, + ZodTypeAny } from 'zod'; import { applyJsonDiff, diffColumns, diffSchemasOrTables } from './jsonDiffer'; import { fromJson } from './sqlgenerator'; @@ -56,15 +57,13 @@ import { prepareDeleteCompositePrimaryKeyPg, prepareDeleteCompositePrimaryKeySingleStore, prepareDeleteCompositePrimaryKeySqlite, - prepareDeleteSchemasJson as prepareDropSchemasJson, prepareDeleteUniqueConstraintPg as prepareDeleteUniqueConstraint, prepareDropEnumJson, prepareDropIndexesJson, prepareDropReferencesJson, + prepareDeleteSchemasJson as prepareDropSchemasJson, prepareDropSequenceJson, prepareDropTableJson, - prepareLibSQLCreateReferencesJson, - prepareLibSQLDropReferencesJson, prepareMoveEnumJson, prepareMoveSequenceJson, prepareMySqlCreateTableJson, @@ -87,7 +86,6 @@ import { MySqlSchema, MySqlSchemaSquashed, MySqlSquasher } from './serializer/my import { PgSchema, PgSchemaSquashed, sequenceSquashed } from './serializer/pgSchema'; import { SingleStoreSchema, SingleStoreSchemaSquashed, SingleStoreSquasher } from './serializer/singlestoreSchema'; import { SQLiteSchema, SQLiteSchemaSquashed, SQLiteSquasher } from './serializer/sqliteSchema'; -import { libSQLCombineStatements, sqliteCombineStatements } from './statementCombiner'; import { copy, prepareMigrationMeta } from './utils'; const makeChanged = (schema: T) => { @@ -2471,8 +2469,7 @@ export const applySqliteSnapshotsDiff = async ( jsonStatements.push(...jsonAlteredUniqueConstraints); - const combinedJsonStatements = sqliteCombineStatements(jsonStatements, json2, action); - const sqlStatements = fromJson(combinedJsonStatements, 'sqlite'); + const sqlStatements = fromJson(jsonStatements, 'sqlite'); const uniqueSqlStatements: string[] = []; sqlStatements.forEach((ss) => { @@ -2488,428 +2485,7 @@ export const applySqliteSnapshotsDiff = async ( const _meta = prepareMigrationMeta([], rTables, rColumns); return { - statements: combinedJsonStatements, - sqlStatements: uniqueSqlStatements, - _meta, - }; -}; - -export const applyLibSQLSnapshotsDiff = async ( - json1: SQLiteSchemaSquashed, - json2: SQLiteSchemaSquashed, - tablesResolver: ( - input: ResolverInput, - ) => Promise>, - columnsResolver: ( - input: ColumnsResolverInput, - ) => Promise>, - prevFull: SQLiteSchema, - curFull: SQLiteSchema, - action?: 'push', -): Promise<{ - statements: JsonStatement[]; - sqlStatements: string[]; - _meta: - | { - schemas: {}; - tables: {}; - columns: {}; - } - | undefined; -}> => { - const tablesDiff = diffSchemasOrTables(json1.tables, json2.tables); - const { - created: createdTables, - deleted: deletedTables, - renamed: renamedTables, - } = await tablesResolver({ - created: tablesDiff.added, - deleted: tablesDiff.deleted, - }); - - const tablesPatchedSnap1 = copy(json1); - tablesPatchedSnap1.tables = mapEntries(tablesPatchedSnap1.tables, (_, it) => { - const { name } = nameChangeFor(it, renamedTables); - it.name = name; - return [name, it]; - }); - - const res = diffColumns(tablesPatchedSnap1.tables, json2.tables); - - const columnRenames = [] as { - table: string; - renames: { from: Column; to: Column }[]; - }[]; - - const columnCreates = [] as { - table: string; - columns: Column[]; - }[]; - - const columnDeletes = [] as { - table: string; - columns: Column[]; - }[]; - - for (let entry of Object.values(res)) { - const { renamed, created, deleted } = await columnsResolver({ - tableName: entry.name, - schema: entry.schema, - deleted: entry.columns.deleted, - created: entry.columns.added, - }); - - if (created.length > 0) { - columnCreates.push({ - table: entry.name, - columns: created, - }); - } - - if (deleted.length > 0) { - columnDeletes.push({ - table: entry.name, - columns: deleted, - }); - } - - if (renamed.length > 0) { - columnRenames.push({ - table: entry.name, - renames: renamed, - }); - } - } - - const columnRenamesDict = columnRenames.reduce( - (acc, it) => { - acc[it.table] = it.renames; - return acc; - }, - {} as Record< - string, - { - from: Named; - to: Named; - }[] - >, - ); - - const columnsPatchedSnap1 = copy(tablesPatchedSnap1); - columnsPatchedSnap1.tables = mapEntries( - columnsPatchedSnap1.tables, - (tableKey, tableValue) => { - const patchedColumns = mapKeys( - tableValue.columns, - (columnKey, column) => { - const rens = columnRenamesDict[tableValue.name] || []; - const newName = columnChangeFor(columnKey, rens); - column.name = newName; - return newName; - }, - ); - - tableValue.columns = patchedColumns; - return [tableKey, tableValue]; - }, - ); - - const diffResult = applyJsonDiff(columnsPatchedSnap1, json2); - - const typedResult = diffResultSchemeSQLite.parse(diffResult); - - // Map array of objects to map - const tablesMap: { - [key: string]: (typeof typedResult.alteredTablesWithColumns)[number]; - } = {}; - - typedResult.alteredTablesWithColumns.forEach((obj) => { - tablesMap[obj.name] = obj; - }); - - const jsonCreateTables = createdTables.map((it) => { - return prepareSQLiteCreateTable(it, action); - }); - - const jsonCreateIndexesForCreatedTables = createdTables - .map((it) => { - return prepareCreateIndexesJson( - it.name, - it.schema, - it.indexes, - curFull.internal, - ); - }) - .flat(); - - const jsonDropTables = deletedTables.map((it) => { - return prepareDropTableJson(it); - }); - - const jsonRenameTables = renamedTables.map((it) => { - return prepareRenameTableJson(it.from, it.to); - }); - - const jsonRenameColumnsStatements: JsonRenameColumnStatement[] = columnRenames - .map((it) => prepareRenameColumns(it.table, '', it.renames)) - .flat(); - - const jsonDropColumnsStatemets: JsonDropColumnStatement[] = columnDeletes - .map((it) => _prepareDropColumns(it.table, '', it.columns)) - .flat(); - - const jsonAddColumnsStatemets: JsonSqliteAddColumnStatement[] = columnCreates - .map((it) => { - return _prepareSqliteAddColumns( - it.table, - it.columns, - tablesMap[it.table] && tablesMap[it.table].addedForeignKeys - ? Object.values(tablesMap[it.table].addedForeignKeys) - : [], - ); - }) - .flat(); - - const rColumns = jsonRenameColumnsStatements.map((it) => { - const tableName = it.tableName; - const schema = it.schema; - return { - from: { schema, table: tableName, column: it.oldColumnName }, - to: { schema, table: tableName, column: it.newColumnName }, - }; - }); - - const rTables = renamedTables.map((it) => { - return { from: it.from, to: it.to }; - }); - - const _meta = prepareMigrationMeta([], rTables, rColumns); - - const allAltered = typedResult.alteredTablesWithColumns; - - const jsonAddedCompositePKs: JsonCreateCompositePK[] = []; - const jsonDeletedCompositePKs: JsonDeleteCompositePK[] = []; - const jsonAlteredCompositePKs: JsonAlterCompositePK[] = []; - - const jsonAddedUniqueConstraints: JsonCreateUniqueConstraint[] = []; - const jsonDeletedUniqueConstraints: JsonDeleteUniqueConstraint[] = []; - const jsonAlteredUniqueConstraints: JsonAlterUniqueConstraint[] = []; - - allAltered.forEach((it) => { - // This part is needed to make sure that same columns in a table are not triggered for change - // there is a case where orm and kit are responsible for pk name generation and one of them is not sorting name - // We double-check that pk with same set of columns are both in added and deleted diffs - let addedColumns: string[] = []; - for (const addedPkName of Object.keys(it.addedCompositePKs)) { - const addedPkColumns = it.addedCompositePKs[addedPkName]; - addedColumns = SQLiteSquasher.unsquashPK(addedPkColumns); - } - - let deletedColumns: string[] = []; - for (const deletedPkName of Object.keys(it.deletedCompositePKs)) { - const deletedPkColumns = it.deletedCompositePKs[deletedPkName]; - deletedColumns = SQLiteSquasher.unsquashPK(deletedPkColumns); - } - - // Don't need to sort, but need to add tests for it - // addedColumns.sort(); - // deletedColumns.sort(); - - const doPerformDeleteAndCreate = JSON.stringify(addedColumns) !== JSON.stringify(deletedColumns); - - let addedCompositePKs: JsonCreateCompositePK[] = []; - let deletedCompositePKs: JsonDeleteCompositePK[] = []; - let alteredCompositePKs: JsonAlterCompositePK[] = []; - if (doPerformDeleteAndCreate) { - addedCompositePKs = prepareAddCompositePrimaryKeySqlite( - it.name, - it.addedCompositePKs, - ); - deletedCompositePKs = prepareDeleteCompositePrimaryKeySqlite( - it.name, - it.deletedCompositePKs, - ); - } - alteredCompositePKs = prepareAlterCompositePrimaryKeySqlite( - it.name, - it.alteredCompositePKs, - ); - - // add logic for unique constraints - let addedUniqueConstraints: JsonCreateUniqueConstraint[] = []; - let deletedUniqueConstraints: JsonDeleteUniqueConstraint[] = []; - let alteredUniqueConstraints: JsonAlterUniqueConstraint[] = []; - - addedUniqueConstraints = prepareAddUniqueConstraint( - it.name, - it.schema, - it.addedUniqueConstraints, - ); - - deletedUniqueConstraints = prepareDeleteUniqueConstraint( - it.name, - it.schema, - it.deletedUniqueConstraints, - ); - if (it.alteredUniqueConstraints) { - const added: Record = {}; - const deleted: Record = {}; - for (const k of Object.keys(it.alteredUniqueConstraints)) { - added[k] = it.alteredUniqueConstraints[k].__new; - deleted[k] = it.alteredUniqueConstraints[k].__old; - } - addedUniqueConstraints.push( - ...prepareAddUniqueConstraint(it.name, it.schema, added), - ); - deletedUniqueConstraints.push( - ...prepareDeleteUniqueConstraint(it.name, it.schema, deleted), - ); - } - - jsonAddedCompositePKs.push(...addedCompositePKs); - jsonDeletedCompositePKs.push(...deletedCompositePKs); - jsonAlteredCompositePKs.push(...alteredCompositePKs); - - jsonAddedUniqueConstraints.push(...addedUniqueConstraints); - jsonDeletedUniqueConstraints.push(...deletedUniqueConstraints); - jsonAlteredUniqueConstraints.push(...alteredUniqueConstraints); - }); - - const jsonTableAlternations = allAltered - .map((it) => { - return prepareSqliteAlterColumns(it.name, it.schema, it.altered, json2); - }) - .flat(); - - const jsonCreateIndexesForAllAlteredTables = allAltered - .map((it) => { - return prepareCreateIndexesJson( - it.name, - it.schema, - it.addedIndexes || {}, - curFull.internal, - ); - }) - .flat(); - - const jsonDropIndexesForAllAlteredTables = allAltered - .map((it) => { - return prepareDropIndexesJson( - it.name, - it.schema, - it.deletedIndexes || {}, - ); - }) - .flat(); - - allAltered.forEach((it) => { - const droppedIndexes = Object.keys(it.alteredIndexes).reduce( - (current, item: string) => { - current[item] = it.alteredIndexes[item].__old; - return current; - }, - {} as Record, - ); - const createdIndexes = Object.keys(it.alteredIndexes).reduce( - (current, item: string) => { - current[item] = it.alteredIndexes[item].__new; - return current; - }, - {} as Record, - ); - - jsonCreateIndexesForAllAlteredTables.push( - ...prepareCreateIndexesJson( - it.name, - it.schema, - createdIndexes || {}, - curFull.internal, - ), - ); - jsonDropIndexesForAllAlteredTables.push( - ...prepareDropIndexesJson(it.name, it.schema, droppedIndexes || {}), - ); - }); - - const jsonReferencesForAllAlteredTables: JsonReferenceStatement[] = allAltered - .map((it) => { - const forAdded = prepareLibSQLCreateReferencesJson( - it.name, - it.schema, - it.addedForeignKeys, - json2, - action, - ); - - const forAltered = prepareLibSQLDropReferencesJson( - it.name, - it.schema, - it.deletedForeignKeys, - json2, - _meta, - action, - ); - - const alteredFKs = prepareAlterReferencesJson(it.name, it.schema, it.alteredForeignKeys); - - return [...forAdded, ...forAltered, ...alteredFKs]; - }) - .flat(); - - const jsonCreatedReferencesForAlteredTables = jsonReferencesForAllAlteredTables.filter( - (t) => t.type === 'create_reference', - ); - const jsonDroppedReferencesForAlteredTables = jsonReferencesForAllAlteredTables.filter( - (t) => t.type === 'delete_reference', - ); - - const jsonStatements: JsonStatement[] = []; - jsonStatements.push(...jsonCreateTables); - - jsonStatements.push(...jsonDropTables); - jsonStatements.push(...jsonRenameTables); - jsonStatements.push(...jsonRenameColumnsStatements); - - jsonStatements.push(...jsonDroppedReferencesForAlteredTables); - - // Will need to drop indexes before changing any columns in table - // Then should go column alternations and then index creation - jsonStatements.push(...jsonDropIndexesForAllAlteredTables); - - jsonStatements.push(...jsonDeletedCompositePKs); - jsonStatements.push(...jsonTableAlternations); - jsonStatements.push(...jsonAddedCompositePKs); - jsonStatements.push(...jsonAddColumnsStatemets); - - jsonStatements.push(...jsonCreateIndexesForCreatedTables); - jsonStatements.push(...jsonCreateIndexesForAllAlteredTables); - - jsonStatements.push(...jsonCreatedReferencesForAlteredTables); - - jsonStatements.push(...jsonDropColumnsStatemets); - - jsonStatements.push(...jsonAlteredCompositePKs); - - jsonStatements.push(...jsonAlteredUniqueConstraints); - - const combinedJsonStatements = libSQLCombineStatements(jsonStatements, json2, action); - - const sqlStatements = fromJson( - combinedJsonStatements, - 'turso', - action, - json2, - ); - - const uniqueSqlStatements: string[] = []; - sqlStatements.forEach((ss) => { - if (!uniqueSqlStatements.includes(ss)) { - uniqueSqlStatements.push(ss); - } - }); - - return { - statements: combinedJsonStatements, + statements: jsonStatements, sqlStatements: uniqueSqlStatements, _meta, }; diff --git a/drizzle-kit/src/sqlgenerator.ts b/drizzle-kit/src/sqlgenerator.ts index f1e783a50..c54ea014a 100644 --- a/drizzle-kit/src/sqlgenerator.ts +++ b/drizzle-kit/src/sqlgenerator.ts @@ -42,20 +42,19 @@ import { JsonDropTableStatement, JsonMoveSequenceStatement, JsonPgCreateIndexStatement, - JsonRecreateTableStatement, JsonRenameColumnStatement, JsonRenameSchema, JsonRenameSequenceStatement, JsonRenameTableStatement, JsonSqliteAddColumnStatement, JsonSqliteCreateTableStatement, - JsonStatement, + JsonStatement } from './jsonStatements'; import { Dialect } from './schemaValidator'; import { MySqlSquasher } from './serializer/mysqlSchema'; import { PgSquasher } from './serializer/pgSchema'; import { SingleStoreSquasher } from './serializer/singlestoreSchema'; -import { SQLiteSchemaSquashed, SQLiteSquasher } from './serializer/sqliteSchema'; +import { SQLiteSquasher } from './serializer/sqliteSchema'; export const pgNativeTypes = new Set([ 'uuid', @@ -128,15 +127,8 @@ const isPgNativeType = (it: string) => { }; abstract class Convertor { - abstract can( - statement: JsonStatement, - dialect: Dialect, - ): boolean; - abstract convert( - statement: JsonStatement, - json2?: SQLiteSchemaSquashed, - action?: 'push', - ): string | string[]; + abstract can(statement: JsonStatement, dialect: Dialect): boolean; + abstract convert(statement: JsonStatement): string | string[]; } class PgCreateTableConvertor extends Convertor { @@ -390,7 +382,7 @@ class SingleStoreCreateTableConvertor extends Convertor { export class SQLiteCreateTableConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { - return statement.type === 'sqlite_create_table' && (dialect === 'sqlite' || dialect === 'turso'); + return statement.type === 'sqlite_create_table' && dialect === 'sqlite'; } convert(st: JsonSqliteCreateTableStatement) { @@ -896,7 +888,7 @@ class SingleStoreDropTableConvertor extends Convertor { export class SQLiteDropTableConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { - return statement.type === 'drop_table' && (dialect === 'sqlite' || dialect === 'turso'); + return statement.type === 'drop_table' && dialect === 'sqlite'; } convert(statement: JsonDropTableStatement) { @@ -922,7 +914,7 @@ class PgRenameTableConvertor extends Convertor { export class SqliteRenameTableConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { - return statement.type === 'rename_table' && (dialect === 'sqlite' || dialect === 'turso'); + return statement.type === 'rename_table' && dialect === 'sqlite'; } convert(statement: JsonRenameTableStatement) { @@ -1000,13 +992,13 @@ class SingleStoreAlterTableRenameColumnConvertor extends Convertor { class SQLiteAlterTableRenameColumnConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { return ( - statement.type === 'alter_table_rename_column' && (dialect === 'sqlite' || dialect === 'turso') + statement.type === 'alter_table_rename_column' && dialect === 'sqlite' ); } convert(statement: JsonRenameColumnStatement) { const { tableName, oldColumnName, newColumnName } = statement; - return `ALTER TABLE \`${tableName}\` RENAME COLUMN "${oldColumnName}" TO "${newColumnName}";`; + return `ALTER TABLE \`${tableName}\` RENAME COLUMN \`${oldColumnName}\` TO \`${newColumnName}\`;`; } } @@ -1052,7 +1044,7 @@ class SingleStoreAlterTableDropColumnConvertor extends Convertor { class SQLiteAlterTableDropColumnConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { - return statement.type === 'alter_table_drop_column' && (dialect === 'sqlite' || dialect === 'turso'); + return statement.type === 'alter_table_drop_column' && dialect === 'sqlite'; } convert(statement: JsonDropColumnStatement) { @@ -1193,7 +1185,7 @@ class SingleStoreAlterTableAddColumnConvertor extends Convertor { export class SQLiteAlterTableAddColumnConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { return ( - statement.type === 'sqlite_alter_table_add_column' && (dialect === 'sqlite' || dialect === 'turso') + statement.type === 'sqlite_alter_table_add_column' && dialect === 'sqlite' ); } @@ -1240,6 +1232,26 @@ class PgAlterTableAlterColumnSetTypeConvertor extends Convertor { } } +class SQLiteAlterTableAlterColumnSetTypeConvertor extends Convertor { + can(statement: JsonStatement, dialect: Dialect): boolean { + return ( + statement.type === 'alter_table_alter_column_set_type' + && dialect === 'sqlite' + ); + } + + convert(statement: JsonAlterColumnTypeStatement) { + return ( + '/*\n SQLite does not support "Changing existing column type" out of the box, we do not generate automatic migration for that, so it has to be done manually' + + '\n Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php' + + '\n https://www.sqlite.org/lang_altertable.html' + + '\n https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3' + + "\n\n Due to that we don't generate migration automatically and it has to be done manually" + + '\n*/' + ); + } +} + class PgAlterTableAlterColumnSetDefaultConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { return ( @@ -1259,6 +1271,26 @@ class PgAlterTableAlterColumnSetDefaultConvertor extends Convertor { } } +class SqliteAlterTableAlterColumnSetDefaultConvertor extends Convertor { + can(statement: JsonStatement, dialect: Dialect): boolean { + return ( + statement.type === 'alter_table_alter_column_set_default' + && dialect === 'sqlite' + ); + } + + convert(statement: JsonAlterColumnSetDefaultStatement) { + return ( + '/*\n SQLite does not support "Set default to column" out of the box, we do not generate automatic migration for that, so it has to be done manually' + + '\n Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php' + + '\n https://www.sqlite.org/lang_altertable.html' + + '\n https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3' + + "\n\n Due to that we don't generate migration automatically and it has to be done manually" + + '\n*/' + ); + } +} + class PgAlterTableAlterColumnDropDefaultConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { return ( @@ -1398,7 +1430,7 @@ class SqliteAlterTableAlterColumnDropGeneratedConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { return ( statement.type === 'alter_table_alter_column_drop_generated' - && (dialect === 'sqlite' || dialect === 'turso') + && dialect === 'sqlite' ); } @@ -1447,7 +1479,7 @@ class SqliteAlterTableAlterColumnSetExpressionConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { return ( statement.type === 'alter_table_alter_column_set_generated' - && (dialect === 'sqlite' || dialect === 'turso') + && dialect === 'sqlite' ); } @@ -1496,7 +1528,7 @@ class SqliteAlterTableAlterColumnAlterGeneratedConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { return ( statement.type === 'alter_table_alter_column_alter_generated' - && (dialect === 'sqlite' || dialect === 'turso') + && dialect === 'sqlite' ); } @@ -1643,119 +1675,6 @@ class MySqlAlterTableDropPk extends Convertor { } } -type LibSQLModifyColumnStatement = - | JsonAlterColumnTypeStatement - | JsonAlterColumnDropNotNullStatement - | JsonAlterColumnSetNotNullStatement - | JsonAlterColumnSetDefaultStatement - | JsonAlterColumnDropDefaultStatement; - -export class LibSQLModifyColumn extends Convertor { - can(statement: JsonStatement, dialect: Dialect): boolean { - return ( - (statement.type === 'alter_table_alter_column_set_type' - || statement.type === 'alter_table_alter_column_drop_notnull' - || statement.type === 'alter_table_alter_column_set_notnull' - || statement.type === 'alter_table_alter_column_set_default' - || statement.type === 'alter_table_alter_column_drop_default') - && dialect === 'turso' - ); - } - - convert(statement: LibSQLModifyColumnStatement, json2: SQLiteSchemaSquashed) { - const { tableName, columnName } = statement; - - let columnType = ``; - let columnDefault: any = ''; - let columnNotNull = ''; - - const sqlStatements: string[] = []; - - // collect index info - const indexes: { - name: string; - tableName: string; - columns: string[]; - isUnique: boolean; - where?: string | undefined; - }[] = []; - for (const table of Object.values(json2.tables)) { - for (const index of Object.values(table.indexes)) { - const unsquashed = SQLiteSquasher.unsquashIdx(index); - sqlStatements.push(`DROP INDEX IF EXISTS "${unsquashed.name}";`); - indexes.push({ ...unsquashed, tableName: table.name }); - } - } - - switch (statement.type) { - case 'alter_table_alter_column_set_type': - columnType = ` ${statement.newDataType}`; - - columnDefault = statement.columnDefault - ? ` DEFAULT ${statement.columnDefault}` - : ''; - - columnNotNull = statement.columnNotNull ? ` NOT NULL` : ''; - - break; - case 'alter_table_alter_column_drop_notnull': - columnType = ` ${statement.newDataType}`; - - columnDefault = statement.columnDefault - ? ` DEFAULT ${statement.columnDefault}` - : ''; - - columnNotNull = ''; - break; - case 'alter_table_alter_column_set_notnull': - columnType = ` ${statement.newDataType}`; - - columnDefault = statement.columnDefault - ? ` DEFAULT ${statement.columnDefault}` - : ''; - - columnNotNull = ` NOT NULL`; - break; - case 'alter_table_alter_column_set_default': - columnType = ` ${statement.newDataType}`; - - columnDefault = ` DEFAULT ${statement.newDefaultValue}`; - - columnNotNull = statement.columnNotNull ? ` NOT NULL` : ''; - break; - case 'alter_table_alter_column_drop_default': - columnType = ` ${statement.newDataType}`; - - columnDefault = ''; - - columnNotNull = statement.columnNotNull ? ` NOT NULL` : ''; - break; - } - - // Seems like getting value from simple json2 shanpshot makes dates be dates - columnDefault = columnDefault instanceof Date - ? columnDefault.toISOString() - : columnDefault; - - sqlStatements.push( - `ALTER TABLE \`${tableName}\` ALTER COLUMN "${columnName}" TO "${columnName}"${columnType}${columnNotNull}${columnDefault};`, - ); - - for (const index of indexes) { - const indexPart = index.isUnique ? 'UNIQUE INDEX' : 'INDEX'; - const whereStatement = index.where ? ` WHERE ${index.where}` : ''; - const uniqueString = index.columns.map((it) => `\`${it}\``).join(','); - const tableName = index.tableName; - - sqlStatements.push( - `CREATE ${indexPart} \`${index.name}\` ON \`${tableName}\` (${uniqueString})${whereStatement};`, - ); - } - - return sqlStatements; - } -} - type MySqlModifyColumnStatement = | JsonAlterColumnDropNotNullStatement | JsonAlterColumnSetNotNullStatement @@ -2362,6 +2281,7 @@ class PgAlterTableCreateCompositePrimaryKeyConvertor extends Convertor { }");`; } } + class PgAlterTableDeleteCompositePrimaryKeyConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { return statement.type === 'delete_composite_pk' && dialect === 'postgresql'; @@ -2621,6 +2541,66 @@ class PgAlterTableAlterColumnSetNotNullConvertor extends Convertor { } } +class SqliteAlterTableAlterColumnSetNotNullConvertor extends Convertor { + can(statement: JsonStatement, dialect: Dialect): boolean { + return ( + statement.type === 'alter_table_alter_column_set_notnull' + && dialect === 'sqlite' + ); + } + + convert(statement: JsonAlterColumnSetNotNullStatement) { + return ( + '/*\n SQLite does not support "Set not null to column" out of the box, we do not generate automatic migration for that, so it has to be done manually' + + '\n Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php' + + '\n https://www.sqlite.org/lang_altertable.html' + + '\n https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3' + + "\n\n Due to that we don't generate migration automatically and it has to be done manually" + + '\n*/' + ); + } +} + +class SqliteAlterTableAlterColumnSetAutoincrementConvertor extends Convertor { + can(statement: JsonStatement, dialect: Dialect): boolean { + return ( + statement.type === 'alter_table_alter_column_set_autoincrement' + && dialect === 'sqlite' + ); + } + + convert(statement: JsonAlterColumnSetAutoincrementStatement) { + return ( + '/*\n SQLite does not support "Set autoincrement to a column" out of the box, we do not generate automatic migration for that, so it has to be done manually' + + '\n Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php' + + '\n https://www.sqlite.org/lang_altertable.html' + + '\n https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3' + + "\n\n Due to that we don't generate migration automatically and it has to be done manually" + + '\n*/' + ); + } +} + +class SqliteAlterTableAlterColumnDropAutoincrementConvertor extends Convertor { + can(statement: JsonStatement, dialect: Dialect): boolean { + return ( + statement.type === 'alter_table_alter_column_drop_autoincrement' + && dialect === 'sqlite' + ); + } + + convert(statement: JsonAlterColumnDropAutoincrementStatement) { + return ( + '/*\n SQLite does not support "Drop autoincrement from a column" out of the box, we do not generate automatic migration for that, so it has to be done manually' + + '\n Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php' + + '\n https://www.sqlite.org/lang_altertable.html' + + '\n https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3' + + "\n\n Due to that we don't generate migration automatically and it has to be done manually" + + '\n*/' + ); + } +} + class PgAlterTableAlterColumnDropNotNullConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { return ( @@ -2640,6 +2620,26 @@ class PgAlterTableAlterColumnDropNotNullConvertor extends Convertor { } } +class SqliteAlterTableAlterColumnDropNotNullConvertor extends Convertor { + can(statement: JsonStatement, dialect: Dialect): boolean { + return ( + statement.type === 'alter_table_alter_column_drop_notnull' + && dialect === 'sqlite' + ); + } + + convert(statement: JsonAlterColumnDropNotNullStatement) { + return ( + '/*\n SQLite does not support "Drop not null from column" out of the box, we do not generate automatic migration for that, so it has to be done manually' + + '\n Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php' + + '\n https://www.sqlite.org/lang_altertable.html' + + '\n https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3' + + "\n\n Due to that we don't generate migration automatically and it has to be done manually" + + '\n*/' + ); + } +} + // FK class PgCreateForeignKeyConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { @@ -2682,36 +2682,19 @@ class PgCreateForeignKeyConvertor extends Convertor { } } -class LibSQLCreateForeignKeyConvertor extends Convertor { +class SqliteCreateForeignKeyConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { - return ( - statement.type === 'create_reference' - && dialect === 'turso' - ); + return statement.type === 'create_reference' && dialect === 'sqlite'; } - convert( - statement: JsonCreateReferenceStatement, - json2?: SQLiteSchemaSquashed, - action?: 'push', - ): string { - const { columnsFrom, columnsTo, tableFrom, onDelete, onUpdate, tableTo } = action === 'push' - ? SQLiteSquasher.unsquashPushFK(statement.data) - : SQLiteSquasher.unsquashFK(statement.data); - const { columnDefault, columnNotNull, columnType } = statement; - - const onDeleteStatement = onDelete ? ` ON DELETE ${onDelete}` : ''; - const onUpdateStatement = onUpdate ? ` ON UPDATE ${onUpdate}` : ''; - const columnsDefaultValue = columnDefault - ? ` DEFAULT ${columnDefault}` - : ''; - const columnNotNullValue = columnNotNull ? ` NOT NULL` : ''; - const columnTypeValue = columnType ? ` ${columnType}` : ''; - - const columnFrom = columnsFrom[0]; - const columnTo = columnsTo[0]; - - return `ALTER TABLE \`${tableFrom}\` ALTER COLUMN "${columnFrom}" TO "${columnFrom}"${columnTypeValue}${columnNotNullValue}${columnsDefaultValue} REFERENCES ${tableTo}(${columnTo})${onDeleteStatement}${onUpdateStatement};`; + convert(statement: JsonCreateReferenceStatement): string { + return ( + '/*\n SQLite does not support "Creating foreign key on existing column" out of the box, we do not generate automatic migration for that, so it has to be done manually' + + '\n Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php' + + '\n https://www.sqlite.org/lang_altertable.html' + + "\n\n Due to that we don't generate migration automatically and it has to be done manually" + + '\n*/' + ); } } @@ -2786,6 +2769,22 @@ class PgAlterForeignKeyConvertor extends Convertor { } } +class SqliteAlterForeignKeyConvertor extends Convertor { + can(statement: JsonStatement, dialect: Dialect): boolean { + return statement.type === 'alter_reference' && dialect === 'sqlite'; + } + + convert(statement: JsonAlterReferenceStatement): string { + return ( + '/*\n SQLite does not support "Changing existing foreign key" out of the box, we do not generate automatic migration for that, so it has to be done manually' + + '\n Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php' + + '\n https://www.sqlite.org/lang_altertable.html' + + "\n\n Due to that we don't generate migration automatically and it has to be done manually" + + '\n*/' + ); + } +} + class PgDeleteForeignKeyConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { return statement.type === 'delete_reference' && dialect === 'postgresql'; @@ -2803,6 +2802,22 @@ class PgDeleteForeignKeyConvertor extends Convertor { } } +class SqliteDeleteForeignKeyConvertor extends Convertor { + can(statement: JsonStatement, dialect: Dialect): boolean { + return statement.type === 'delete_reference' && dialect === 'sqlite'; + } + + convert(statement: JsonDeleteReferenceStatement): string { + return ( + '/*\n SQLite does not support "Dropping foreign key" out of the box, we do not generate automatic migration for that, so it has to be done manually' + + '\n Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php' + + '\n https://www.sqlite.org/lang_altertable.html' + + "\n\n Due to that we don't generate migration automatically and it has to be done manually" + + '\n*/' + ); + } +} + class MySqlDeleteForeignKeyConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { return statement.type === 'delete_reference' && dialect === 'mysql'; @@ -2924,7 +2939,7 @@ class CreateSingleStoreIndexConvertor extends Convertor { export class CreateSqliteIndexConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { - return statement.type === 'create_index' && (dialect === 'sqlite' || dialect === 'turso'); + return statement.type === 'create_index' && dialect === 'sqlite'; } convert(statement: JsonCreateIndexStatement): string { @@ -3046,7 +3061,7 @@ class PgAlterTableRemoveFromSchemaConvertor extends Convertor { export class SqliteDropIndexConvertor extends Convertor { can(statement: JsonStatement, dialect: Dialect): boolean { - return statement.type === 'drop_index' && (dialect === 'sqlite' || dialect === 'turso'); + return statement.type === 'drop_index' && dialect === 'sqlite'; } convert(statement: JsonDropIndexStatement): string { @@ -3077,132 +3092,12 @@ class SingleStoreDropIndexConvertor extends Convertor { } } -class SQLiteRecreateTableConvertor extends Convertor { - can(statement: JsonStatement, dialect: Dialect): boolean { - return ( - statement.type === 'recreate_table' && dialect === 'sqlite' - ); - } - - convert(statement: JsonRecreateTableStatement): string | string[] { - const { tableName, columns, compositePKs, referenceData } = statement; - - const columnNames = columns.map((it) => `"${it.name}"`).join(', '); - const newTableName = `__new_${tableName}`; - - const sqlStatements: string[] = []; - - sqlStatements.push(`PRAGMA foreign_keys=OFF;`); - - // create new table - sqlStatements.push( - new SQLiteCreateTableConvertor().convert({ - type: 'sqlite_create_table', - tableName: newTableName, - columns, - referenceData, - compositePKs, - }), - ); - - // migrate data - sqlStatements.push( - `INSERT INTO \`${newTableName}\`(${columnNames}) SELECT ${columnNames} FROM \`${tableName}\`;`, - ); - - // drop table - sqlStatements.push( - new SQLiteDropTableConvertor().convert({ - type: 'drop_table', - tableName: tableName, - schema: '', - }), - ); - - // rename table - sqlStatements.push( - new SqliteRenameTableConvertor().convert({ - fromSchema: '', - tableNameFrom: newTableName, - tableNameTo: tableName, - toSchema: '', - type: 'rename_table', - }), - ); - - sqlStatements.push(`PRAGMA foreign_keys=ON;`); - - return sqlStatements; - } -} - -class LibSQLRecreateTableConvertor extends Convertor { - can(statement: JsonStatement, dialect: Dialect): boolean { - return ( - statement.type === 'recreate_table' - && dialect === 'turso' - ); - } - - convert(statement: JsonRecreateTableStatement): string[] { - const { tableName, columns, compositePKs, referenceData } = statement; - - const columnNames = columns.map((it) => `"${it.name}"`).join(', '); - const newTableName = `__new_${tableName}`; - - const sqlStatements: string[] = []; - - sqlStatements.push(`PRAGMA foreign_keys=OFF;`); - - // create new table - sqlStatements.push( - new SQLiteCreateTableConvertor().convert({ - type: 'sqlite_create_table', - tableName: newTableName, - columns, - referenceData, - compositePKs, - }), - ); - - // migrate data - sqlStatements.push( - `INSERT INTO \`${newTableName}\`(${columnNames}) SELECT ${columnNames} FROM \`${tableName}\`;`, - ); - - // drop table - sqlStatements.push( - new SQLiteDropTableConvertor().convert({ - type: 'drop_table', - tableName: tableName, - schema: '', - }), - ); - - // rename table - sqlStatements.push( - new SqliteRenameTableConvertor().convert({ - fromSchema: '', - tableNameFrom: newTableName, - tableNameTo: tableName, - toSchema: '', - type: 'rename_table', - }), - ); - - sqlStatements.push(`PRAGMA foreign_keys=ON;`); - - return sqlStatements; - } -} const convertors: Convertor[] = []; convertors.push(new PgCreateTableConvertor()); convertors.push(new MySqlCreateTableConvertor()); convertors.push(new SingleStoreCreateTableConvertor()); convertors.push(new SQLiteCreateTableConvertor()); -convertors.push(new SQLiteRecreateTableConvertor()); -convertors.push(new LibSQLRecreateTableConvertor()); convertors.push(new CreateTypeEnumConvertor()); @@ -3281,7 +3176,6 @@ convertors.push(new SqliteAlterTableAlterColumnAlterGeneratedConvertor()); convertors.push(new SqliteAlterTableAlterColumnSetExpressionConvertor()); convertors.push(new MySqlModifyColumn()); -convertors.push(new LibSQLModifyColumn()); // convertors.push(new MySqlAlterTableAlterColumnSetDefaultConvertor()); // convertors.push(new MySqlAlterTableAlterColumnDropDefaultConvertor()); @@ -3302,12 +3196,31 @@ convertors.push(new PgAlterTableSetSchemaConvertor()); convertors.push(new PgAlterTableSetNewSchemaConvertor()); convertors.push(new PgAlterTableRemoveFromSchemaConvertor()); -convertors.push(new LibSQLCreateForeignKeyConvertor()); +// Unhandled sqlite queries, so they will appear last +convertors.push(new SQLiteAlterTableAlterColumnSetTypeConvertor()); +convertors.push(new SqliteAlterForeignKeyConvertor()); +convertors.push(new SqliteDeleteForeignKeyConvertor()); +convertors.push(new SqliteCreateForeignKeyConvertor()); + +convertors.push(new SQLiteAlterTableAddUniqueConstraintConvertor()); +convertors.push(new SQLiteAlterTableDropUniqueConstraintConvertor()); convertors.push(new PgAlterTableAlterColumnDropGenerated()); convertors.push(new PgAlterTableAlterColumnSetGenerated()); convertors.push(new PgAlterTableAlterColumnAlterGenerated()); +convertors.push(new SqliteAlterTableAlterColumnSetNotNullConvertor()); +convertors.push(new SqliteAlterTableAlterColumnDropNotNullConvertor()); +convertors.push(new SqliteAlterTableAlterColumnSetDefaultConvertor()); +convertors.push(new SqliteAlterTableAlterColumnDropDefaultConvertor()); + +convertors.push(new SqliteAlterTableAlterColumnSetAutoincrementConvertor()); +convertors.push(new SqliteAlterTableAlterColumnDropAutoincrementConvertor()); + +convertors.push(new SqliteAlterTableCreateCompositePrimaryKeyConvertor()); +convertors.push(new SqliteAlterTableDeleteCompositePrimaryKeyConvertor()); +convertors.push(new SqliteAlterTableAlterCompositePrimaryKeyConvertor()); + convertors.push(new PgAlterTableCreateCompositePrimaryKeyConvertor()); convertors.push(new PgAlterTableDeleteCompositePrimaryKeyConvertor()); convertors.push(new PgAlterTableAlterCompositePrimaryKeyConvertor()); @@ -3324,41 +3237,26 @@ convertors.push(new SingleStoreAlterTableCreateCompositePrimaryKeyConvertor()); convertors.push(new SingleStoreAlterTableAddPk()); convertors.push(new SingleStoreAlterTableAlterCompositePrimaryKeyConvertor()); -// overloads for turso driver -export function fromJson( - statements: JsonStatement[], - dialect: Exclude, -): string[]; -export function fromJson( - statements: JsonStatement[], - dialect: 'sqlite' | 'turso', - action?: 'push', - json2?: SQLiteSchemaSquashed, -): string[]; - -export function fromJson( - statements: JsonStatement[], - dialect: Dialect, - action?: 'push', - json2?: SQLiteSchemaSquashed, -) { +export const fromJson = (statements: JsonStatement[], dialect: Dialect) => { const result = statements .flatMap((statement) => { const filtered = convertors.filter((it) => { + // console.log(statement, dialect) return it.can(statement, dialect); }); const convertor = filtered.length === 1 ? filtered[0] : undefined; if (!convertor) { + // console.log("no convertor:", statement.type, dialect); return ''; } - return convertor.convert(statement, json2, action); + return convertor.convert(statement); }) .filter((it) => it !== ''); return result; -} +}; // blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/ // test case for enum altering diff --git a/drizzle-kit/src/statementCombiner.ts b/drizzle-kit/src/statementCombiner.ts deleted file mode 100644 index 2f7b6ddbe..000000000 --- a/drizzle-kit/src/statementCombiner.ts +++ /dev/null @@ -1,450 +0,0 @@ -import { - JsonCreateIndexStatement, - JsonRecreateTableStatement, - JsonStatement, - prepareCreateIndexesJson, -} from './jsonStatements'; -import { SQLiteSchemaSquashed, SQLiteSquasher } from './serializer/sqliteSchema'; - -export const prepareLibSQLRecreateTable = ( - table: SQLiteSchemaSquashed['tables'][keyof SQLiteSchemaSquashed['tables']], - action?: 'push', -): (JsonRecreateTableStatement | JsonCreateIndexStatement)[] => { - const { name, columns, uniqueConstraints, indexes } = table; - - const composites: string[][] = Object.values(table.compositePrimaryKeys).map( - (it) => SQLiteSquasher.unsquashPK(it), - ); - - const references: string[] = Object.values(table.foreignKeys); - const fks = references.map((it) => - action === 'push' ? SQLiteSquasher.unsquashPushFK(it) : SQLiteSquasher.unsquashFK(it) - ); - - const statements: (JsonRecreateTableStatement | JsonCreateIndexStatement)[] = [ - { - type: 'recreate_table', - tableName: name, - columns: Object.values(columns), - compositePKs: composites, - referenceData: fks, - uniqueConstraints: Object.values(uniqueConstraints), - }, - ]; - - if (Object.keys(indexes).length) { - statements.push(...prepareCreateIndexesJson(name, '', indexes)); - } - return statements; -}; - -export const prepareSQLiteRecreateTable = ( - table: SQLiteSchemaSquashed['tables'][keyof SQLiteSchemaSquashed['tables']], - action?: 'push', -): JsonStatement[] => { - const { name, columns, uniqueConstraints, indexes } = table; - - const composites: string[][] = Object.values(table.compositePrimaryKeys).map( - (it) => SQLiteSquasher.unsquashPK(it), - ); - - const references: string[] = Object.values(table.foreignKeys); - const fks = references.map((it) => - action === 'push' ? SQLiteSquasher.unsquashPushFK(it) : SQLiteSquasher.unsquashFK(it) - ); - - const statements: JsonStatement[] = [ - { - type: 'recreate_table', - tableName: name, - columns: Object.values(columns), - compositePKs: composites, - referenceData: fks, - uniqueConstraints: Object.values(uniqueConstraints), - }, - ]; - - if (Object.keys(indexes).length) { - statements.push(...prepareCreateIndexesJson(name, '', indexes)); - } - return statements; -}; - -export const libSQLCombineStatements = ( - statements: JsonStatement[], - json2: SQLiteSchemaSquashed, - action?: 'push', -) => { - // const tablesContext: Record = {}; - const newStatements: Record = {}; - for (const statement of statements) { - if ( - statement.type === 'alter_table_alter_column_drop_autoincrement' - || statement.type === 'alter_table_alter_column_set_autoincrement' - || statement.type === 'alter_table_alter_column_drop_pk' - || statement.type === 'alter_table_alter_column_set_pk' - || statement.type === 'create_composite_pk' - || statement.type === 'alter_composite_pk' - || statement.type === 'delete_composite_pk' - ) { - const tableName = statement.tableName; - - const statementsForTable = newStatements[tableName]; - - if (!statementsForTable) { - newStatements[tableName] = prepareLibSQLRecreateTable(json2.tables[tableName], action); - - continue; - } - - if (!statementsForTable.some(({ type }) => type === 'recreate_table')) { - const wasRename = statementsForTable.some(({ type }) => type === 'rename_table'); - const preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName], action); - - if (wasRename) { - newStatements[tableName].push(...preparedStatements); - } else { - newStatements[tableName] = preparedStatements; - } - - continue; - } - - continue; - } - - if ( - statement.type === 'alter_table_alter_column_set_type' - || statement.type === 'alter_table_alter_column_drop_notnull' - || statement.type === 'alter_table_alter_column_set_notnull' - || statement.type === 'alter_table_alter_column_set_default' - || statement.type === 'alter_table_alter_column_drop_default' - ) { - const { tableName, columnName, columnPk } = statement; - - // const columnIsPartOfUniqueIndex = Object.values( - // json2.tables[tableName].indexes, - // ).some((it) => { - // const unsquashIndex = SQLiteSquasher.unsquashIdx(it); - - // return ( - // unsquashIndex.columns.includes(columnName) && unsquashIndex.isUnique - // ); - // }); - - const columnIsPartOfForeignKey = Object.values( - json2.tables[tableName].foreignKeys, - ).some((it) => { - const unsquashFk = action === 'push' ? SQLiteSquasher.unsquashPushFK(it) : SQLiteSquasher.unsquashFK(it); - - return ( - unsquashFk.columnsFrom.includes(columnName) - ); - }); - - const statementsForTable = newStatements[tableName]; - - if ( - !statementsForTable && (columnIsPartOfForeignKey || columnPk) - ) { - newStatements[tableName] = prepareLibSQLRecreateTable(json2.tables[tableName], action); - continue; - } - - if ( - statementsForTable && (columnIsPartOfForeignKey || columnPk) - ) { - if (!statementsForTable.some(({ type }) => type === 'recreate_table')) { - const wasRename = statementsForTable.some(({ type }) => type === 'rename_table'); - const preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName], action); - - if (wasRename) { - newStatements[tableName].push(...preparedStatements); - } else { - newStatements[tableName] = preparedStatements; - } - } - continue; - } - if ( - statementsForTable && !(columnIsPartOfForeignKey || columnPk) - ) { - if (!statementsForTable.some(({ type }) => type === 'recreate_table')) { - newStatements[tableName].push(statement); - } - continue; - } - - newStatements[tableName] = [statement]; - - continue; - } - - if (statement.type === 'create_reference') { - const tableName = statement.tableName; - - const data = action === 'push' - ? SQLiteSquasher.unsquashPushFK(statement.data) - : SQLiteSquasher.unsquashFK(statement.data); - - const statementsForTable = newStatements[tableName]; - - if (!statementsForTable) { - newStatements[tableName] = statement.isMulticolumn - ? prepareLibSQLRecreateTable(json2.tables[tableName], action) - : [statement]; - - continue; - } - - // if add column with reference -> skip create_reference statement - if ( - !statement.isMulticolumn - && statementsForTable.some((st) => - st.type === 'sqlite_alter_table_add_column' && st.column.name === data.columnsFrom[0] - ) - ) { - continue; - } - - if (statement.isMulticolumn) { - if (!statementsForTable.some(({ type }) => type === 'recreate_table')) { - const wasRename = statementsForTable.some(({ type }) => type === 'rename_table'); - const preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName], action); - - if (wasRename) { - newStatements[tableName].push(...preparedStatements); - } else { - newStatements[tableName] = preparedStatements; - } - - continue; - } - - continue; - } - - if (!statementsForTable.some(({ type }) => type === 'recreate_table')) { - newStatements[tableName].push(statement); - } - - continue; - } - - if (statement.type === 'delete_reference') { - const tableName = statement.tableName; - - const statementsForTable = newStatements[tableName]; - - if (!statementsForTable) { - newStatements[tableName] = prepareLibSQLRecreateTable(json2.tables[tableName], action); - continue; - } - - if (!statementsForTable.some(({ type }) => type === 'recreate_table')) { - const wasRename = statementsForTable.some(({ type }) => type === 'rename_table'); - const preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName], action); - - if (wasRename) { - newStatements[tableName].push(...preparedStatements); - } else { - newStatements[tableName] = preparedStatements; - } - - continue; - } - - continue; - } - - if (statement.type === 'sqlite_alter_table_add_column' && statement.column.primaryKey) { - const tableName = statement.tableName; - - const statementsForTable = newStatements[tableName]; - - if (!statementsForTable) { - newStatements[tableName] = prepareLibSQLRecreateTable(json2.tables[tableName], action); - continue; - } - - if (!statementsForTable.some(({ type }) => type === 'recreate_table')) { - const wasRename = statementsForTable.some(({ type }) => type === 'rename_table'); - const preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName], action); - - if (wasRename) { - newStatements[tableName].push(...preparedStatements); - } else { - newStatements[tableName] = preparedStatements; - } - - continue; - } - - continue; - } - - const tableName = statement.type === 'rename_table' - ? statement.tableNameTo - : (statement as { tableName: string }).tableName; - const statementsForTable = newStatements[tableName]; - - if (!statementsForTable) { - newStatements[tableName] = [statement]; - continue; - } - - if (!statementsForTable.some(({ type }) => type === 'recreate_table')) { - newStatements[tableName].push(statement); - } - } - - const combinedStatements = Object.values(newStatements).flat(); - const renamedTables = combinedStatements.filter((it) => it.type === 'rename_table'); - const renamedColumns = combinedStatements.filter((it) => it.type === 'alter_table_rename_column'); - - const rest = combinedStatements.filter((it) => it.type !== 'rename_table' && it.type !== 'alter_table_rename_column'); - - return [...renamedTables, ...renamedColumns, ...rest]; -}; - -export const sqliteCombineStatements = ( - statements: JsonStatement[], - json2: SQLiteSchemaSquashed, - action?: 'push', -) => { - // const tablesContext: Record = {}; - const newStatements: Record = {}; - for (const statement of statements) { - if ( - statement.type === 'alter_table_alter_column_set_type' - || statement.type === 'alter_table_alter_column_set_default' - || statement.type === 'alter_table_alter_column_drop_default' - || statement.type === 'alter_table_alter_column_set_notnull' - || statement.type === 'alter_table_alter_column_drop_notnull' - || statement.type === 'alter_table_alter_column_drop_autoincrement' - || statement.type === 'alter_table_alter_column_set_autoincrement' - || statement.type === 'alter_table_alter_column_drop_pk' - || statement.type === 'alter_table_alter_column_set_pk' - || statement.type === 'delete_reference' - || statement.type === 'alter_reference' - || statement.type === 'create_composite_pk' - || statement.type === 'alter_composite_pk' - || statement.type === 'delete_composite_pk' - || statement.type === 'create_unique_constraint' - || statement.type === 'delete_unique_constraint' - ) { - const tableName = statement.tableName; - - const statementsForTable = newStatements[tableName]; - - if (!statementsForTable) { - newStatements[tableName] = prepareLibSQLRecreateTable(json2.tables[tableName], action); - continue; - } - - if (!statementsForTable.some(({ type }) => type === 'recreate_table')) { - const wasRename = statementsForTable.some(({ type }) => type === 'rename_table'); - const preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName], action); - - if (wasRename) { - newStatements[tableName].push(...preparedStatements); - } else { - newStatements[tableName] = preparedStatements; - } - - continue; - } - - continue; - } - - if (statement.type === 'sqlite_alter_table_add_column' && statement.column.primaryKey) { - const tableName = statement.tableName; - - const statementsForTable = newStatements[tableName]; - - if (!statementsForTable) { - newStatements[tableName] = prepareLibSQLRecreateTable(json2.tables[tableName], action); - continue; - } - - if (!statementsForTable.some(({ type }) => type === 'recreate_table')) { - const wasRename = statementsForTable.some(({ type }) => type === 'rename_table'); - const preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName], action); - - if (wasRename) { - newStatements[tableName].push(...preparedStatements); - } else { - newStatements[tableName] = preparedStatements; - } - - continue; - } - - continue; - } - - if (statement.type === 'create_reference') { - const tableName = statement.tableName; - - const data = action === 'push' - ? SQLiteSquasher.unsquashPushFK(statement.data) - : SQLiteSquasher.unsquashFK(statement.data); - const statementsForTable = newStatements[tableName]; - - if (!statementsForTable) { - newStatements[tableName] = prepareSQLiteRecreateTable(json2.tables[tableName], action); - continue; - } - - // if add column with reference -> skip create_reference statement - if ( - data.columnsFrom.length === 1 - && statementsForTable.some((st) => - st.type === 'sqlite_alter_table_add_column' && st.column.name === data.columnsFrom[0] - ) - ) { - continue; - } - - if (!statementsForTable.some(({ type }) => type === 'recreate_table')) { - const wasRename = statementsForTable.some(({ type }) => type === 'rename_table'); - const preparedStatements = prepareLibSQLRecreateTable(json2.tables[tableName], action); - - if (wasRename) { - newStatements[tableName].push(...preparedStatements); - } else { - newStatements[tableName] = preparedStatements; - } - - continue; - } - - continue; - } - - const tableName = statement.type === 'rename_table' - ? statement.tableNameTo - : (statement as { tableName: string }).tableName; - - const statementsForTable = newStatements[tableName]; - - if (!statementsForTable) { - newStatements[tableName] = [statement]; - continue; - } - - if (!statementsForTable.some(({ type }) => type === 'recreate_table')) { - newStatements[tableName].push(statement); - } - } - - const combinedStatements = Object.values(newStatements).flat(); - - const renamedTables = combinedStatements.filter((it) => it.type === 'rename_table'); - const renamedColumns = combinedStatements.filter((it) => it.type === 'alter_table_rename_column'); - - const rest = combinedStatements.filter((it) => it.type !== 'rename_table' && it.type !== 'alter_table_rename_column'); - - return [...renamedTables, ...renamedColumns, ...rest]; -}; diff --git a/drizzle-kit/tests/cli-generate.test.ts b/drizzle-kit/tests/cli-generate.test.ts index 56a3a0d04..3e5c0fc22 100644 --- a/drizzle-kit/tests/cli-generate.test.ts +++ b/drizzle-kit/tests/cli-generate.test.ts @@ -62,7 +62,6 @@ test('generate #2', async (t) => { test('generate #3', async (t) => { const res = await brotest(generate, ''); - if (res.type !== 'handler') assert.fail(res.type, 'handler'); expect(res.options).toStrictEqual({ dialect: 'postgresql', diff --git a/drizzle-kit/tests/cli-migrate.test.ts b/drizzle-kit/tests/cli-migrate.test.ts index 1425691f0..a4ffec2f0 100644 --- a/drizzle-kit/tests/cli-migrate.test.ts +++ b/drizzle-kit/tests/cli-migrate.test.ts @@ -31,10 +31,11 @@ test('migrate #2', async (t) => { const res = await brotest(migrate, '--config=turso.config.ts'); if (res.type !== 'handler') assert.fail(res.type, 'handler'); expect(res.options).toStrictEqual({ - dialect: 'turso', + dialect: 'sqlite', out: 'drizzle', credentials: { authToken: 'token', + driver: 'turso', url: 'turso.dev', }, schema: undefined, // drizzle migrations table schema diff --git a/drizzle-kit/tests/cli-push.test.ts b/drizzle-kit/tests/cli-push.test.ts index f5b84fdce..1a4bde66d 100644 --- a/drizzle-kit/tests/cli-push.test.ts +++ b/drizzle-kit/tests/cli-push.test.ts @@ -34,9 +34,10 @@ test('push #2', async (t) => { const res = await brotest(push, '--config=turso.config.ts'); if (res.type !== 'handler') assert.fail(res.type, 'handler'); expect(res.options).toStrictEqual({ - dialect: 'turso', + dialect: 'sqlite', credentials: { authToken: 'token', + driver: 'turso', url: 'turso.dev', }, force: false, diff --git a/drizzle-kit/tests/cli/turso.config.ts b/drizzle-kit/tests/cli/turso.config.ts index 85efe5934..089e4d216 100644 --- a/drizzle-kit/tests/cli/turso.config.ts +++ b/drizzle-kit/tests/cli/turso.config.ts @@ -2,7 +2,8 @@ import { defineConfig } from '../../src'; export default defineConfig({ schema: './schema.ts', - dialect: 'turso', + dialect: 'sqlite', + driver: 'turso', dbCredentials: { url: 'turso.dev', authToken: 'token', diff --git a/drizzle-kit/tests/libsql-statements.test.ts b/drizzle-kit/tests/libsql-statements.test.ts deleted file mode 100644 index 8221e52e0..000000000 --- a/drizzle-kit/tests/libsql-statements.test.ts +++ /dev/null @@ -1,982 +0,0 @@ -import { foreignKey, index, int, integer, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core'; -import { JsonRecreateTableStatement } from 'src/jsonStatements'; -import { expect, test } from 'vitest'; -import { diffTestSchemasLibSQL } from './schemaDiffer'; - -test('drop autoincrement', async (t) => { - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - }), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: false }), - }), - }; - - const { statements } = await diffTestSchemasLibSQL(schema1, schema2, []); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - columns: [{ - autoincrement: false, - generated: undefined, - name: 'id', - notNull: true, - primaryKey: true, - type: 'integer', - }], - compositePKs: [], - referenceData: [], - tableName: 'users', - type: 'recreate_table', - uniqueConstraints: [], - }); -}); - -test('set autoincrement', async (t) => { - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: false }), - }), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - }), - }; - - const { statements } = await diffTestSchemasLibSQL(schema1, schema2, []); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - columns: [{ - autoincrement: true, - generated: undefined, - name: 'id', - notNull: true, - primaryKey: true, - type: 'integer', - }], - compositePKs: [], - referenceData: [], - tableName: 'users', - type: 'recreate_table', - uniqueConstraints: [], - }); -}); - -test('set not null', async (t) => { - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - }), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name').notNull(), - }), - }; - - const { statements, sqlStatements } = await diffTestSchemasLibSQL( - schema1, - schema2, - [], - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - type: 'alter_table_alter_column_set_notnull', - tableName: 'users', - columnName: 'name', - schema: '', - newDataType: 'text', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: true, - columnAutoIncrement: false, - columnPk: false, - }); - - expect(sqlStatements.length).toBe(1); - expect(sqlStatements[0]).toBe( - `ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" text NOT NULL;`, - ); -}); - -test('drop not null', async (t) => { - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name').notNull(), - }), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - }), - }; - - const { statements, sqlStatements } = await diffTestSchemasLibSQL( - schema1, - schema2, - [], - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - type: 'alter_table_alter_column_drop_notnull', - tableName: 'users', - columnName: 'name', - schema: '', - newDataType: 'text', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - }); - - expect(sqlStatements.length).toBe(1); - expect(sqlStatements[0]).toBe( - `ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" text;`, - ); -}); - -test('set default. set not null. add column', async (t) => { - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - }), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name').notNull().default('name'), - age: int('age').notNull(), - }), - }; - - const { statements, sqlStatements } = await diffTestSchemasLibSQL( - schema1, - schema2, - [], - ); - - expect(statements.length).toBe(3); - expect(statements[0]).toStrictEqual({ - type: 'alter_table_alter_column_set_default', - tableName: 'users', - columnName: 'name', - newDefaultValue: "'name'", - schema: '', - newDataType: 'text', - columnOnUpdate: undefined, - columnNotNull: true, - columnAutoIncrement: false, - columnPk: false, - }); - expect(statements[1]).toStrictEqual({ - type: 'alter_table_alter_column_set_notnull', - tableName: 'users', - columnName: 'name', - schema: '', - newDataType: 'text', - columnDefault: "'name'", - columnOnUpdate: undefined, - columnNotNull: true, - columnAutoIncrement: false, - columnPk: false, - }); - expect(statements[2]).toStrictEqual({ - type: 'sqlite_alter_table_add_column', - tableName: 'users', - referenceData: undefined, - column: { - name: 'age', - type: 'integer', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - }); - - expect(sqlStatements.length).toBe(2); - expect(sqlStatements[0]).toBe( - `ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" text NOT NULL DEFAULT 'name';`, - ); - expect(sqlStatements[1]).toBe( - `ALTER TABLE \`users\` ADD \`age\` integer NOT NULL;`, - ); -}); - -test('drop default. drop not null', async (t) => { - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name').notNull().default('name'), - }), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - }), - }; - - const { statements, sqlStatements } = await diffTestSchemasLibSQL( - schema1, - schema2, - [], - ); - - expect(statements.length).toBe(2); - expect(statements[0]).toStrictEqual({ - type: 'alter_table_alter_column_drop_default', - tableName: 'users', - columnName: 'name', - schema: '', - newDataType: 'text', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - }); - expect(statements[1]).toStrictEqual({ - type: 'alter_table_alter_column_drop_notnull', - tableName: 'users', - columnName: 'name', - schema: '', - newDataType: 'text', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - }); - - expect(sqlStatements.length).toBe(1); - expect(sqlStatements[0]).toBe( - `ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" text;`, - ); -}); - -test('set data type. set default', async (t) => { - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - }), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: int('name').default(123), - }), - }; - - const { statements, sqlStatements } = await diffTestSchemasLibSQL( - schema1, - schema2, - [], - ); - - expect(statements.length).toBe(2); - expect(statements[0]).toStrictEqual({ - type: 'alter_table_alter_column_set_type', - tableName: 'users', - columnName: 'name', - newDataType: 'integer', - oldDataType: 'text', - schema: '', - columnDefault: 123, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - }); - expect(statements[1]).toStrictEqual({ - type: 'alter_table_alter_column_set_default', - tableName: 'users', - columnName: 'name', - schema: '', - newDataType: 'integer', - newDefaultValue: 123, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - }); - - expect(sqlStatements.length).toBe(1); - expect(sqlStatements[0]).toBe( - `ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" integer DEFAULT 123;`, - ); -}); - -test('add foriegn key', async (t) => { - const schema = { - table: sqliteTable('table', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - }), - }; - - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - tableId: int('table_id'), - }), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - tableId: int('table_id').references(() => schema.table.id), - }), - }; - - const { statements, sqlStatements } = await diffTestSchemasLibSQL( - schema1, - schema2, - [], - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - type: 'create_reference', - tableName: 'users', - data: 'users_table_id_table_id_fk;users;table_id;table;id;no action;no action', - schema: '', - columnNotNull: false, - columnDefault: undefined, - columnType: 'integer', - }); - - expect(sqlStatements.length).toBe(1); - expect(sqlStatements[0]).toBe( - `ALTER TABLE \`users\` ALTER COLUMN "table_id" TO "table_id" integer REFERENCES table(id) ON DELETE no action ON UPDATE no action;`, - ); -}); - -test('drop foriegn key', async (t) => { - const schema = { - table: sqliteTable('table', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - }), - }; - - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - tableId: int('table_id').references(() => schema.table.id, { - onDelete: 'cascade', - }), - }), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - tableId: int('table_id'), - }), - }; - - const { statements, sqlStatements } = await diffTestSchemasLibSQL( - schema1, - schema2, - [], - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - columns: [ - { - autoincrement: true, - generated: undefined, - name: 'id', - notNull: true, - primaryKey: true, - type: 'integer', - }, - { - autoincrement: false, - generated: undefined, - name: 'table_id', - notNull: false, - primaryKey: false, - type: 'integer', - }, - ], - compositePKs: [], - referenceData: [], - tableName: 'users', - type: 'recreate_table', - uniqueConstraints: [], - }); - - expect(sqlStatements.length).toBe(6); - expect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`); - expect(sqlStatements[1]).toBe(`CREATE TABLE \`__new_users\` ( -\t\`id\` integer PRIMARY KEY AUTOINCREMENT NOT NULL, -\t\`table_id\` integer -);\n`); - expect(sqlStatements[2]).toBe( - `INSERT INTO \`__new_users\`("id", "table_id") SELECT "id", "table_id" FROM \`users\`;`, - ); - expect(sqlStatements[3]).toBe(`DROP TABLE \`users\`;`); - expect(sqlStatements[4]).toBe( - `ALTER TABLE \`__new_users\` RENAME TO \`users\`;`, - ); - expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`); -}); - -test('alter foriegn key', async (t) => { - const tableRef = sqliteTable('table', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - }); - const tableRef2 = sqliteTable('table2', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - }); - - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - tableId: int('table_id').references(() => tableRef.id, { - onDelete: 'cascade', - }), - }), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - tableId: int('table_id').references(() => tableRef2.id), - }), - }; - - const { statements, sqlStatements } = await diffTestSchemasLibSQL( - schema1, - schema2, - [], - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - columns: [ - { - autoincrement: true, - generated: undefined, - name: 'id', - notNull: true, - primaryKey: true, - type: 'integer', - }, - { - autoincrement: false, - generated: undefined, - name: 'table_id', - notNull: false, - primaryKey: false, - type: 'integer', - }, - ], - compositePKs: [], - referenceData: [ - { - columnsFrom: ['table_id'], - columnsTo: ['id'], - name: 'users_table_id_table2_id_fk', - onDelete: 'no action', - onUpdate: 'no action', - tableFrom: 'users', - tableTo: 'table2', - }, - ], - tableName: 'users', - type: 'recreate_table', - uniqueConstraints: [], - }); - - expect(sqlStatements.length).toBe(6); - expect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`); - expect(sqlStatements[1]).toBe(`CREATE TABLE \`__new_users\` ( -\t\`id\` integer PRIMARY KEY AUTOINCREMENT NOT NULL, -\t\`table_id\` integer, -\tFOREIGN KEY (\`table_id\`) REFERENCES \`table2\`(\`id\`) ON UPDATE no action ON DELETE no action -);\n`); - expect(sqlStatements[2]).toBe( - `INSERT INTO \`__new_users\`("id", "table_id") SELECT "id", "table_id" FROM \`users\`;`, - ); - expect(sqlStatements[3]).toBe( - 'DROP TABLE `users`;', - ); - expect(sqlStatements[4]).toBe( - 'ALTER TABLE `__new_users` RENAME TO `users`;', - ); - expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`); -}); - -test('add foriegn key for multiple columns', async (t) => { - const tableRef = sqliteTable('table', { - id: int('id').primaryKey({ autoIncrement: true }), - age: int('age'), - age1: int('age_1'), - }); - - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - column: int('column'), - column1: int('column_1'), - }), - tableRef, - }; - - const schema2 = { - tableRef, - users: sqliteTable( - 'users', - { - id: int('id').primaryKey({ autoIncrement: true }), - column: int('column'), - column1: int('column_1'), - }, - (table) => ({ - foreignKey: foreignKey({ - columns: [table.column, table.column1], - foreignColumns: [tableRef.age, tableRef.age1], - }), - }), - ), - }; - const { statements, sqlStatements } = await diffTestSchemasLibSQL( - schema1, - schema2, - [], - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - columns: [ - { - autoincrement: true, - generated: undefined, - name: 'id', - notNull: true, - primaryKey: true, - type: 'integer', - }, - { - autoincrement: false, - generated: undefined, - name: 'column', - notNull: false, - primaryKey: false, - type: 'integer', - }, - { - autoincrement: false, - generated: undefined, - name: 'column_1', - notNull: false, - primaryKey: false, - type: 'integer', - }, - ], - compositePKs: [], - referenceData: [ - { - columnsFrom: ['column', 'column_1'], - columnsTo: ['age', 'age_1'], - name: 'users_column_column_1_table_age_age_1_fk', - onDelete: 'no action', - onUpdate: 'no action', - tableFrom: 'users', - tableTo: 'table', - }, - ], - tableName: 'users', - type: 'recreate_table', - uniqueConstraints: [], - } as JsonRecreateTableStatement); - - expect(sqlStatements.length).toBe(6); - expect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`); - expect(sqlStatements[1]).toBe( - `CREATE TABLE \`__new_users\` ( -\t\`id\` integer PRIMARY KEY AUTOINCREMENT NOT NULL, -\t\`column\` integer, -\t\`column_1\` integer, -\tFOREIGN KEY (\`column\`,\`column_1\`) REFERENCES \`table\`(\`age\`,\`age_1\`) ON UPDATE no action ON DELETE no action -);\n`, - ); - expect(sqlStatements[2]).toBe( - `INSERT INTO \`__new_users\`("id", "column", "column_1") SELECT "id", "column", "column_1" FROM \`users\`;`, - ); - expect(sqlStatements[3]).toBe(`DROP TABLE \`users\`;`); - expect(sqlStatements[4]).toBe( - `ALTER TABLE \`__new_users\` RENAME TO \`users\`;`, - ); - expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`); -}); - -test('drop foriegn key for multiple columns', async (t) => { - const tableRef = sqliteTable('table', { - id: int('id').primaryKey({ autoIncrement: true }), - age: int('age'), - age1: int('age_1'), - }); - - const schema1 = { - users: sqliteTable( - 'users', - { - id: int('id').primaryKey({ autoIncrement: true }), - column: int('column'), - column1: int('column_1'), - }, - (table) => ({ - foreignKey: foreignKey({ - columns: [table.column, table.column1], - foreignColumns: [tableRef.age, tableRef.age1], - }), - }), - ), - tableRef, - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - column: int('column'), - column1: int('column_1'), - }), - tableRef, - }; - const { statements, sqlStatements } = await diffTestSchemasLibSQL( - schema1, - schema2, - [], - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - columns: [ - { - autoincrement: true, - generated: undefined, - name: 'id', - notNull: true, - primaryKey: true, - type: 'integer', - }, - { - autoincrement: false, - generated: undefined, - name: 'column', - notNull: false, - primaryKey: false, - type: 'integer', - }, - { - autoincrement: false, - generated: undefined, - name: 'column_1', - notNull: false, - primaryKey: false, - type: 'integer', - }, - ], - compositePKs: [], - referenceData: [], - tableName: 'users', - type: 'recreate_table', - uniqueConstraints: [], - }); - - expect(sqlStatements.length).toBe(6); - expect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`); - expect(sqlStatements[1]).toBe( - `CREATE TABLE \`__new_users\` ( -\t\`id\` integer PRIMARY KEY AUTOINCREMENT NOT NULL, -\t\`column\` integer, -\t\`column_1\` integer -);\n`, - ); - expect(sqlStatements[2]).toBe( - `INSERT INTO \`__new_users\`("id", "column", "column_1") SELECT "id", "column", "column_1" FROM \`users\`;`, - ); - expect(sqlStatements[3]).toBe(`DROP TABLE \`users\`;`); - expect(sqlStatements[4]).toBe( - `ALTER TABLE \`__new_users\` RENAME TO \`users\`;`, - ); - expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`); -}); - -test('alter column drop generated', async (t) => { - const from = { - users: sqliteTable('table', { - id: int('id').primaryKey().notNull(), - name: text('name').generatedAlwaysAs('drizzle is the best').notNull(), - }), - }; - - const to = { - users: sqliteTable('table', { - id: int('id').primaryKey().notNull(), - name: text('name').notNull(), - }), - }; - - const { statements, sqlStatements } = await diffTestSchemasLibSQL( - from, - to, - [], - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - columnAutoIncrement: false, - columnDefault: undefined, - columnGenerated: undefined, - columnName: 'name', - columnNotNull: true, - columnOnUpdate: undefined, - columnPk: false, - newDataType: 'text', - schema: '', - tableName: 'table', - type: 'alter_table_alter_column_drop_generated', - }); - - expect(sqlStatements.length).toBe(2); - expect(sqlStatements[0]).toBe(`ALTER TABLE \`table\` DROP COLUMN \`name\`;`); - expect(sqlStatements[1]).toBe( - `ALTER TABLE \`table\` ADD \`name\` text NOT NULL;`, - ); -}); - -test('recreate table with nested references', async (t) => { - let users = sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - age: integer('age'), - }); - let subscriptions = sqliteTable('subscriptions', { - id: int('id').primaryKey({ autoIncrement: true }), - userId: integer('user_id').references(() => users.id), - customerId: text('customer_id'), - }); - const schema1 = { - users: users, - subscriptions: subscriptions, - subscriptionMetadata: sqliteTable('subscriptions_metadata', { - id: int('id').primaryKey({ autoIncrement: true }), - subscriptionId: text('subscription_id').references( - () => subscriptions.id, - ), - }), - }; - - users = sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: false }), - name: text('name'), - age: integer('age'), - }); - const schema2 = { - users: users, - subscriptions: subscriptions, - subscriptionMetadata: sqliteTable('subscriptions_metadata', { - id: int('id').primaryKey({ autoIncrement: true }), - subscriptionId: text('subscription_id').references( - () => subscriptions.id, - ), - }), - }; - - const { statements, sqlStatements } = await diffTestSchemasLibSQL( - schema1, - schema2, - [], - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - columns: [ - { - autoincrement: false, - generated: undefined, - name: 'id', - notNull: true, - primaryKey: true, - type: 'integer', - }, - { - autoincrement: false, - generated: undefined, - name: 'name', - notNull: false, - primaryKey: false, - type: 'text', - }, - { - autoincrement: false, - generated: undefined, - name: 'age', - notNull: false, - primaryKey: false, - type: 'integer', - }, - ], - compositePKs: [], - referenceData: [], - tableName: 'users', - type: 'recreate_table', - uniqueConstraints: [], - }); - - expect(sqlStatements.length).toBe(6); - expect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`); - expect(sqlStatements[1]).toBe(`CREATE TABLE \`__new_users\` ( -\t\`id\` integer PRIMARY KEY NOT NULL, -\t\`name\` text, -\t\`age\` integer -);\n`); - expect(sqlStatements[2]).toBe( - `INSERT INTO \`__new_users\`("id", "name", "age") SELECT "id", "name", "age" FROM \`users\`;`, - ); - expect(sqlStatements[3]).toBe(`DROP TABLE \`users\`;`); - expect(sqlStatements[4]).toBe( - `ALTER TABLE \`__new_users\` RENAME TO \`users\`;`, - ); - expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`); -}); - -test('set not null with index', async (t) => { - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - }, (table) => ({ - someIndex: index('users_name_index').on(table.name), - })), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name').notNull(), - }, (table) => ({ - someIndex: index('users_name_index').on(table.name), - })), - }; - - const { statements, sqlStatements } = await diffTestSchemasLibSQL( - schema1, - schema2, - [], - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - type: 'alter_table_alter_column_set_notnull', - tableName: 'users', - columnName: 'name', - schema: '', - newDataType: 'text', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: true, - columnAutoIncrement: false, - columnPk: false, - }); - - expect(sqlStatements.length).toBe(3); - expect(sqlStatements[0]).toBe( - `DROP INDEX IF EXISTS "users_name_index";`, - ); - expect(sqlStatements[1]).toBe( - `ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" text NOT NULL;`, - ); - expect(sqlStatements[2]).toBe( - `CREATE INDEX \`users_name_index\` ON \`users\` (\`name\`);`, - ); -}); - -test('drop not null with two indexes', async (t) => { - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name').notNull(), - age: int('age').notNull(), - }, (table) => ({ - someUniqeIndex: uniqueIndex('users_name_unique').on(table.name), - someIndex: index('users_age_index').on(table.age), - })), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - age: int('age').notNull(), - }, (table) => ({ - someUniqeIndex: uniqueIndex('users_name_unique').on(table.name), - someIndex: index('users_age_index').on(table.age), - })), - }; - - const { statements, sqlStatements } = await diffTestSchemasLibSQL( - schema1, - schema2, - [], - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - type: 'alter_table_alter_column_drop_notnull', - tableName: 'users', - columnName: 'name', - schema: '', - newDataType: 'text', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - }); - - expect(sqlStatements.length).toBe(5); - expect(sqlStatements[0]).toBe( - `DROP INDEX IF EXISTS "users_name_unique";`, - ); - expect(sqlStatements[1]).toBe( - `DROP INDEX IF EXISTS "users_age_index";`, - ); - expect(sqlStatements[2]).toBe( - `ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" text;`, - ); - expect(sqlStatements[3]).toBe( - `CREATE UNIQUE INDEX \`users_name_unique\` ON \`users\` (\`name\`);`, - ); - expect(sqlStatements[4]).toBe( - `CREATE INDEX \`users_age_index\` ON \`users\` (\`age\`);`, - ); -}); diff --git a/drizzle-kit/tests/migrate/libsq-schema.ts b/drizzle-kit/tests/migrate/libsq-schema.ts deleted file mode 100644 index 5cb344d51..000000000 --- a/drizzle-kit/tests/migrate/libsq-schema.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'; - -export const users = sqliteTable('users', { - id: integer('id').primaryKey().notNull(), - name: text('name').notNull(), -}); diff --git a/drizzle-kit/tests/migrate/libsql-migrate.test.ts b/drizzle-kit/tests/migrate/libsql-migrate.test.ts deleted file mode 100644 index b937b644f..000000000 --- a/drizzle-kit/tests/migrate/libsql-migrate.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { createClient } from '@libsql/client'; -import { connectToLibSQL } from 'src/cli/connections'; -import { expect, test } from 'vitest'; - -test('validate migrate function', async () => { - const credentials = { - url: ':memory:', - }; - const { migrate, query } = await connectToLibSQL(credentials); - - await migrate({ migrationsFolder: 'tests/migrate/migrations' }); - - const res = await query(`PRAGMA table_info("users");`); - - expect(res).toStrictEqual([{ - cid: 0, - name: 'id', - type: 'INTEGER', - notnull: 0, - dflt_value: null, - pk: 0, - }, { - cid: 1, - name: 'name', - type: 'INTEGER', - notnull: 1, - dflt_value: null, - pk: 0, - }]); -}); - -// test('validate migrate function', async () => { -// const credentials = { -// url: '', -// authToken: '', -// }; -// const { migrate, query } = await connectToLibSQL(credentials); - -// await migrate({ migrationsFolder: 'tests/migrate/migrations' }); - -// const res = await query(`PRAGMA table_info("users");`); - -// expect(res).toStrictEqual([{ -// cid: 0, -// name: 'id', -// type: 'INTEGER', -// notnull: 0, -// dflt_value: null, -// pk: 0, -// }, { -// cid: 1, -// name: 'name', -// type: 'INTEGER', -// notnull: 1, -// dflt_value: null, -// pk: 0, -// }]); -// }); diff --git a/drizzle-kit/tests/migrate/migrations/0000_little_blizzard.sql b/drizzle-kit/tests/migrate/migrations/0000_little_blizzard.sql deleted file mode 100644 index 9de0a139d..000000000 --- a/drizzle-kit/tests/migrate/migrations/0000_little_blizzard.sql +++ /dev/null @@ -1,4 +0,0 @@ -CREATE TABLE `users` ( - `id` integer PRIMARY KEY NOT NULL, - `name` text NOT NULL -); diff --git a/drizzle-kit/tests/migrate/migrations/0001_nebulous_storm.sql b/drizzle-kit/tests/migrate/migrations/0001_nebulous_storm.sql deleted file mode 100644 index 4309a05c2..000000000 --- a/drizzle-kit/tests/migrate/migrations/0001_nebulous_storm.sql +++ /dev/null @@ -1,10 +0,0 @@ -PRAGMA foreign_keys=OFF;--> statement-breakpoint -CREATE TABLE `__new_users` ( - `id` integer, - `name` integer NOT NULL -); ---> statement-breakpoint -INSERT INTO `__new_users`("id", "name") SELECT "id", "name" FROM `users`;--> statement-breakpoint -DROP TABLE `users`;--> statement-breakpoint -ALTER TABLE `__new_users` RENAME TO `users`;--> statement-breakpoint -PRAGMA foreign_keys=ON; \ No newline at end of file diff --git a/drizzle-kit/tests/migrate/migrations/meta/0000_snapshot.json b/drizzle-kit/tests/migrate/migrations/meta/0000_snapshot.json deleted file mode 100644 index 599d02b91..000000000 --- a/drizzle-kit/tests/migrate/migrations/meta/0000_snapshot.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "version": "6", - "dialect": "sqlite", - "id": "2bd46776-9e41-4a6c-b617-5c600bb176f2", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "users": { - "name": "users", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} - } -} \ No newline at end of file diff --git a/drizzle-kit/tests/migrate/migrations/meta/0001_snapshot.json b/drizzle-kit/tests/migrate/migrations/meta/0001_snapshot.json deleted file mode 100644 index e3b26ba14..000000000 --- a/drizzle-kit/tests/migrate/migrations/meta/0001_snapshot.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "version": "6", - "dialect": "sqlite", - "id": "6c0ec455-42fd-47fd-a22c-4bb4551e1358", - "prevId": "2bd46776-9e41-4a6c-b617-5c600bb176f2", - "tables": { - "users": { - "name": "users", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} - } -} \ No newline at end of file diff --git a/drizzle-kit/tests/migrate/migrations/meta/_journal.json b/drizzle-kit/tests/migrate/migrations/meta/_journal.json deleted file mode 100644 index c836eb194..000000000 --- a/drizzle-kit/tests/migrate/migrations/meta/_journal.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "version": "7", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "6", - "when": 1725358702427, - "tag": "0000_little_blizzard", - "breakpoints": true - }, - { - "idx": 1, - "version": "6", - "when": 1725358713033, - "tag": "0001_nebulous_storm", - "breakpoints": true - } - ] -} \ No newline at end of file diff --git a/drizzle-kit/tests/push/libsql.test.ts b/drizzle-kit/tests/push/libsql.test.ts deleted file mode 100644 index 89ec008ca..000000000 --- a/drizzle-kit/tests/push/libsql.test.ts +++ /dev/null @@ -1,1049 +0,0 @@ -import { createClient } from '@libsql/client'; -import chalk from 'chalk'; -import { sql } from 'drizzle-orm'; -import { - blob, - foreignKey, - getTableConfig, - index, - int, - integer, - numeric, - real, - sqliteTable, - text, - uniqueIndex, -} from 'drizzle-orm/sqlite-core'; -import { diffTestSchemasPushLibSQL } from 'tests/schemaDiffer'; -import { expect, test } from 'vitest'; - -test('nothing changed in schema', async (t) => { - const turso = createClient({ - url: ':memory:', - }); - - const users = sqliteTable('users', { - id: integer('id').primaryKey().notNull(), - name: text('name').notNull(), - email: text('email'), - textJson: text('text_json', { mode: 'json' }), - blobJon: blob('blob_json', { mode: 'json' }), - blobBigInt: blob('blob_bigint', { mode: 'bigint' }), - numeric: numeric('numeric'), - createdAt: integer('created_at', { mode: 'timestamp' }), - createdAtMs: integer('created_at_ms', { mode: 'timestamp_ms' }), - real: real('real'), - text: text('text', { length: 255 }), - role: text('role', { enum: ['admin', 'user'] }).default('user'), - isConfirmed: integer('is_confirmed', { - mode: 'boolean', - }), - }); - - const schema1 = { - users, - - customers: sqliteTable('customers', { - id: integer('id').primaryKey(), - address: text('address').notNull(), - isConfirmed: integer('is_confirmed', { mode: 'boolean' }), - registrationDate: integer('registration_date', { mode: 'timestamp_ms' }) - .notNull() - .$defaultFn(() => new Date()), - userId: integer('user_id') - .references(() => users.id) - .notNull(), - }), - - posts: sqliteTable('posts', { - id: integer('id').primaryKey(), - content: text('content'), - authorId: integer('author_id'), - }), - }; - - const { - sqlStatements, - statements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushLibSQL(turso, schema1, schema1, [], false); - expect(sqlStatements.length).toBe(0); - expect(statements.length).toBe(0); - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); -}); - -test('added, dropped index', async (t) => { - const turso = createClient({ - url: ':memory:', - }); - - const users = sqliteTable('users', { - id: integer('id').primaryKey().notNull(), - name: text('name').notNull(), - email: text('email'), - textJson: text('text_json', { mode: 'json' }), - blobJon: blob('blob_json', { mode: 'json' }), - blobBigInt: blob('blob_bigint', { mode: 'bigint' }), - numeric: numeric('numeric'), - createdAt: integer('created_at', { mode: 'timestamp' }), - createdAtMs: integer('created_at_ms', { mode: 'timestamp_ms' }), - real: real('real'), - text: text('text', { length: 255 }), - role: text('role', { enum: ['admin', 'user'] }).default('user'), - isConfirmed: integer('is_confirmed', { - mode: 'boolean', - }), - }); - - const schema1 = { - users, - customers: sqliteTable( - 'customers', - { - id: integer('id').primaryKey(), - address: text('address').notNull(), - isConfirmed: integer('is_confirmed', { mode: 'boolean' }), - registrationDate: integer('registration_date', { mode: 'timestamp_ms' }) - .notNull() - .$defaultFn(() => new Date()), - userId: integer('user_id').notNull(), - }, - (table) => ({ - uniqueIndex: uniqueIndex('customers_address_unique').on(table.address), - }), - ), - - posts: sqliteTable('posts', { - id: integer('id').primaryKey(), - content: text('content'), - authorId: integer('author_id'), - }), - }; - - const schema2 = { - users, - customers: sqliteTable( - 'customers', - { - id: integer('id').primaryKey(), - address: text('address').notNull(), - isConfirmed: integer('is_confirmed', { mode: 'boolean' }), - registrationDate: integer('registration_date', { mode: 'timestamp_ms' }) - .notNull() - .$defaultFn(() => new Date()), - userId: integer('user_id').notNull(), - }, - (table) => ({ - uniqueIndex: uniqueIndex('customers_is_confirmed_unique').on( - table.isConfirmed, - ), - }), - ), - - posts: sqliteTable('posts', { - id: integer('id').primaryKey(), - content: text('content'), - authorId: integer('author_id'), - }), - }; - - const { - sqlStatements, - statements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushLibSQL(turso, schema1, schema2, [], false); - - expect(statements.length).toBe(2); - expect(statements[0]).toStrictEqual({ - type: 'drop_index', - tableName: 'customers', - data: 'customers_address_unique;address;true;', - schema: '', - }); - expect(statements[1]).toStrictEqual({ - type: 'create_index', - tableName: 'customers', - data: 'customers_is_confirmed_unique;is_confirmed;true;', - schema: '', - internal: { indexes: {} }, - }); - - expect(sqlStatements.length).toBe(2); - expect(sqlStatements[0]).toBe( - `DROP INDEX IF EXISTS \`customers_address_unique\`;`, - ); - expect(sqlStatements[1]).toBe( - `CREATE UNIQUE INDEX \`customers_is_confirmed_unique\` ON \`customers\` (\`is_confirmed\`);`, - ); - - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); - -test('added column not null and without default to table with data', async (t) => { - const turso = createClient({ - url: ':memory:', - }); - - const schema1 = { - companies: sqliteTable('companies', { - id: integer('id').primaryKey(), - name: text('name').notNull(), - }), - }; - - const schema2 = { - companies: sqliteTable('companies', { - id: integer('id').primaryKey(), - name: text('name').notNull(), - age: integer('age').notNull(), - }), - }; - - const table = getTableConfig(schema1.companies); - - const seedStatements = [ - `INSERT INTO \`${table.name}\` ("${schema1.companies.name.name}") VALUES ('drizzle');`, - `INSERT INTO \`${table.name}\` ("${schema1.companies.name.name}") VALUES ('turso');`, - ]; - - const { - statements, - sqlStatements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushLibSQL( - turso, - schema1, - schema2, - [], - false, - seedStatements, - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - type: 'sqlite_alter_table_add_column', - tableName: 'companies', - column: { - name: 'age', - type: 'integer', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - referenceData: undefined, - }); - - expect(sqlStatements.length).toBe(2); - expect(sqlStatements[0]).toBe(`delete from companies;`); - expect(sqlStatements[1]).toBe( - `ALTER TABLE \`companies\` ADD \`age\` integer NOT NULL;`, - ); - - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(1); - expect(infoToPrint![0]).toBe( - `· You're about to add not-null ${ - chalk.underline( - 'age', - ) - } column without default value, which contains 2 items`, - ); - expect(shouldAskForApprove).toBe(true); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(1); - expect(tablesToTruncate![0]).toBe('companies'); -}); - -test('added column not null and without default to table without data', async (t) => { - const turso = createClient({ - url: ':memory:', - }); - - const schema1 = { - companies: sqliteTable('companies', { - id: integer('id').primaryKey(), - name: text('name').notNull(), - }), - }; - - const schema2 = { - companies: sqliteTable('companies', { - id: integer('id').primaryKey(), - name: text('name').notNull(), - age: integer('age').notNull(), - }), - }; - - const { - sqlStatements, - statements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushLibSQL(turso, schema1, schema2, [], false); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - type: 'sqlite_alter_table_add_column', - tableName: 'companies', - column: { - name: 'age', - type: 'integer', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - referenceData: undefined, - }); - - expect(sqlStatements.length).toBe(1); - expect(sqlStatements[0]).toBe( - `ALTER TABLE \`companies\` ADD \`age\` integer NOT NULL;`, - ); - - expect(infoToPrint!.length).toBe(0); - expect(columnsToRemove!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); - -test('drop autoincrement. drop column with data', async (t) => { - const turso = createClient({ - url: ':memory:', - }); - - const schema1 = { - companies: sqliteTable('companies', { - id: integer('id').primaryKey({ autoIncrement: true }), - name: text('name'), - }), - }; - - const schema2 = { - companies: sqliteTable('companies', { - id: integer('id').primaryKey({ autoIncrement: false }), - }), - }; - - const table = getTableConfig(schema1.companies); - const seedStatements = [ - `INSERT INTO \`${table.name}\` ("${schema1.companies.id.name}", "${schema1.companies.name.name}") VALUES (1, 'drizzle');`, - `INSERT INTO \`${table.name}\` ("${schema1.companies.id.name}", "${schema1.companies.name.name}") VALUES (2, 'turso');`, - ]; - - const { - sqlStatements, - statements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushLibSQL( - turso, - schema1, - schema2, - [], - false, - seedStatements, - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - type: 'recreate_table', - tableName: 'companies', - columns: [ - { - name: 'id', - type: 'integer', - autoincrement: false, - notNull: true, - primaryKey: true, - generated: undefined, - }, - ], - compositePKs: [], - referenceData: [], - uniqueConstraints: [], - }); - - expect(sqlStatements.length).toBe(4); - expect(sqlStatements[0]).toBe( - `CREATE TABLE \`__new_companies\` ( -\t\`id\` integer PRIMARY KEY NOT NULL -);\n`, - ); - expect(sqlStatements[1]).toBe(`INSERT INTO \`__new_companies\`("id") SELECT "id" FROM \`companies\`;`); - expect(sqlStatements[2]).toBe(`DROP TABLE \`companies\`;`); - expect(sqlStatements[3]).toBe( - `ALTER TABLE \`__new_companies\` RENAME TO \`companies\`;`, - ); - - expect(columnsToRemove!.length).toBe(1); - expect(infoToPrint!.length).toBe(1); - expect(infoToPrint![0]).toBe( - `· You're about to delete ${ - chalk.underline( - 'name', - ) - } column in companies table with 2 items`, - ); - expect(shouldAskForApprove).toBe(true); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); - -test('change autoincrement. table is part of foreign key', async (t) => { - const turso = createClient({ - url: ':memory:', - }); - - const companies1 = sqliteTable('companies', { - id: integer('id').primaryKey({ autoIncrement: true }), - }); - const users1 = sqliteTable('users', { - id: integer('id').primaryKey({ autoIncrement: true }), - name: text('name').unique(), - companyId: integer('company_id').references(() => companies1.id), - }); - const schema1 = { - companies: companies1, - users: users1, - }; - - const companies2 = sqliteTable('companies', { - id: integer('id').primaryKey({ autoIncrement: false }), - }); - const users2 = sqliteTable('users', { - id: integer('id').primaryKey({ autoIncrement: true }), - name: text('name').unique(), - companyId: integer('company_id').references(() => companies2.id), - }); - const schema2 = { - companies: companies2, - users: users2, - }; - - const { name: usersTableName } = getTableConfig(users1); - const { name: companiesTableName } = getTableConfig(companies1); - const seedStatements = [ - `INSERT INTO \`${usersTableName}\` ("${schema1.users.name.name}") VALUES ('drizzle');`, - `INSERT INTO \`${usersTableName}\` ("${schema1.users.name.name}") VALUES ('turso');`, - `INSERT INTO \`${companiesTableName}\` ("${schema1.companies.id.name}") VALUES (1);`, - `INSERT INTO \`${companiesTableName}\` ("${schema1.companies.id.name}") VALUES (2);`, - ]; - - const { - statements, - sqlStatements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushLibSQL( - turso, - schema1, - schema2, - [], - false, - seedStatements, - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - type: 'recreate_table', - tableName: 'companies', - columns: [ - { - name: 'id', - type: 'integer', - autoincrement: false, - notNull: true, - primaryKey: true, - generated: undefined, - }, - ], - compositePKs: [], - referenceData: [], - uniqueConstraints: [], - }); - - expect(sqlStatements.length).toBe(4); - expect(sqlStatements[0]).toBe( - `CREATE TABLE \`__new_companies\` ( -\t\`id\` integer PRIMARY KEY NOT NULL -);\n`, - ); - expect(sqlStatements[1]).toBe( - `INSERT INTO \`__new_companies\`("id") SELECT "id" FROM \`companies\`;`, - ); - expect(sqlStatements[2]).toBe(`DROP TABLE \`companies\`;`); - expect(sqlStatements[3]).toBe( - `ALTER TABLE \`__new_companies\` RENAME TO \`companies\`;`, - ); - - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); - -test('drop not null, add not null', async (t) => { - const turso = createClient({ - url: ':memory:', - }); - - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name').notNull(), - }), - posts: sqliteTable( - 'posts', - { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - userId: int('user_id'), - }, - ), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - }), - posts: sqliteTable( - 'posts', - { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name').notNull(), - userId: int('user_id'), - }, - ), - }; - const { - statements, - sqlStatements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushLibSQL( - turso, - schema1, - schema2, - [], - ); - - expect(statements!.length).toBe(2); - expect(statements![0]).toStrictEqual({ - columnAutoIncrement: false, - columnDefault: undefined, - columnName: 'name', - columnNotNull: false, - columnOnUpdate: undefined, - columnPk: false, - newDataType: 'text', - schema: '', - tableName: 'users', - type: 'alter_table_alter_column_drop_notnull', - }); - expect(statements![1]).toStrictEqual({ - columnAutoIncrement: false, - columnDefault: undefined, - columnName: 'name', - columnNotNull: true, - columnOnUpdate: undefined, - columnPk: false, - newDataType: 'text', - schema: '', - tableName: 'posts', - type: 'alter_table_alter_column_set_notnull', - }); - expect(sqlStatements!.length).toBe(2); - expect(sqlStatements![0]).toBe(`ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" text;`); - expect(sqlStatements![1]).toBe(`ALTER TABLE \`posts\` ALTER COLUMN "name" TO "name" text NOT NULL;`); - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); - -test('drop table with data', async (t) => { - const turso = createClient({ - url: ':memory:', - }); - - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name').notNull(), - }), - posts: sqliteTable( - 'posts', - { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - userId: int('user_id'), - }, - ), - }; - - const schema2 = { - posts: sqliteTable( - 'posts', - { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - userId: int('user_id'), - }, - ), - }; - - const seedStatements = [ - `INSERT INTO \`users\` ("name") VALUES ('drizzle')`, - ]; - const { - statements, - sqlStatements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushLibSQL( - turso, - schema1, - schema2, - [], - false, - seedStatements, - ); - - expect(statements!.length).toBe(1); - expect(statements![0]).toStrictEqual({ - schema: undefined, - tableName: 'users', - type: 'drop_table', - }); - - expect(sqlStatements!.length).toBe(1); - expect(sqlStatements![0]).toBe(`DROP TABLE \`users\`;`); - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(1); - expect(infoToPrint![0]).toBe(`· You're about to delete ${chalk.underline('users')} table with 1 items`); - expect(shouldAskForApprove).toBe(true); - expect(tablesToRemove!.length).toBe(1); - expect(tablesToRemove![0]).toBe('users'); - expect(tablesToTruncate!.length).toBe(0); -}); - -test('recreate table with nested references', async (t) => { - const turso = createClient({ - url: ':memory:', - }); - - let users = sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - age: integer('age'), - }); - let subscriptions = sqliteTable('subscriptions', { - id: int('id').primaryKey({ autoIncrement: true }), - userId: integer('user_id').references(() => users.id), - customerId: text('customer_id'), - }); - const schema1 = { - users: users, - subscriptions: subscriptions, - subscriptionMetadata: sqliteTable('subscriptions_metadata', { - id: int('id').primaryKey({ autoIncrement: true }), - subscriptionId: text('subscription_id').references( - () => subscriptions.id, - ), - }), - }; - - users = sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: false }), - name: text('name'), - age: integer('age'), - }); - const schema2 = { - users: users, - subscriptions: subscriptions, - subscriptionMetadata: sqliteTable('subscriptions_metadata', { - id: int('id').primaryKey({ autoIncrement: true }), - subscriptionId: text('subscription_id').references( - () => subscriptions.id, - ), - }), - }; - - const { - statements, - sqlStatements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushLibSQL(turso, schema1, schema2, []); - - expect(statements!.length).toBe(1); - expect(statements![0]).toStrictEqual({ - columns: [ - { - autoincrement: false, - name: 'id', - notNull: true, - generated: undefined, - primaryKey: true, - type: 'integer', - }, - { - autoincrement: false, - name: 'name', - notNull: false, - generated: undefined, - primaryKey: false, - type: 'text', - }, - { - autoincrement: false, - name: 'age', - notNull: false, - generated: undefined, - primaryKey: false, - type: 'integer', - }, - ], - compositePKs: [], - referenceData: [], - tableName: 'users', - type: 'recreate_table', - uniqueConstraints: [], - }); - - expect(sqlStatements!.length).toBe(4); - expect(sqlStatements![0]).toBe(`CREATE TABLE \`__new_users\` ( -\t\`id\` integer PRIMARY KEY NOT NULL, -\t\`name\` text, -\t\`age\` integer -);\n`); - expect(sqlStatements![1]).toBe( - `INSERT INTO \`__new_users\`("id", "name", "age") SELECT "id", "name", "age" FROM \`users\`;`, - ); - expect(sqlStatements![2]).toBe(`DROP TABLE \`users\`;`); - expect(sqlStatements![3]).toBe( - `ALTER TABLE \`__new_users\` RENAME TO \`users\`;`, - ); - - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); - -test('recreate table with added column not null and without default', async (t) => { - const turso = createClient({ - url: ':memory:', - }); - - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - age: integer('age'), - }), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: false }), - name: text('name'), - age: integer('age'), - newColumn: text('new_column').notNull(), - }), - }; - - const seedStatements = [ - `INSERT INTO \`users\` ("name", "age") VALUES ('drizzle', 12)`, - `INSERT INTO \`users\` ("name", "age") VALUES ('turso', 12)`, - ]; - - const { - statements, - sqlStatements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushLibSQL( - turso, - schema1, - schema2, - [], - false, - seedStatements, - ); - - expect(statements!.length).toBe(1); - expect(statements![0]).toStrictEqual({ - columns: [ - { - autoincrement: false, - name: 'id', - notNull: true, - generated: undefined, - primaryKey: true, - type: 'integer', - }, - { - autoincrement: false, - name: 'name', - notNull: false, - generated: undefined, - primaryKey: false, - type: 'text', - }, - { - autoincrement: false, - name: 'age', - notNull: false, - generated: undefined, - primaryKey: false, - type: 'integer', - }, - { - autoincrement: false, - name: 'new_column', - notNull: true, - generated: undefined, - primaryKey: false, - type: 'text', - }, - ], - compositePKs: [], - referenceData: [], - tableName: 'users', - type: 'recreate_table', - uniqueConstraints: [], - }); - - expect(sqlStatements!.length).toBe(4); - expect(sqlStatements[0]).toBe('DELETE FROM \`users\`;'); - expect(sqlStatements![1]).toBe(`CREATE TABLE \`__new_users\` ( -\t\`id\` integer PRIMARY KEY NOT NULL, -\t\`name\` text, -\t\`age\` integer, -\t\`new_column\` text NOT NULL -);\n`); - expect(sqlStatements![2]).toBe(`DROP TABLE \`users\`;`); - expect(sqlStatements![3]).toBe( - `ALTER TABLE \`__new_users\` RENAME TO \`users\`;`, - ); - - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(1); - expect(infoToPrint![0]).toBe( - `· You're about to add not-null ${ - chalk.underline('new_column') - } column without default value to table, which contains 2 items`, - ); - expect(shouldAskForApprove).toBe(true); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(1); - expect(tablesToTruncate![0]).toBe('users'); -}); - -test('set not null with index', async (t) => { - const turso = createClient({ - url: ':memory:', - }); - - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - }, (table) => ({ - someIndex: index('users_name_index').on(table.name), - })), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name').notNull(), - }, (table) => ({ - someIndex: index('users_name_index').on(table.name), - })), - }; - - const { - statements, - sqlStatements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushLibSQL( - turso, - schema1, - schema2, - [], - ); - - expect(statements!.length).toBe(1); - expect(statements![0]).toStrictEqual({ - columnAutoIncrement: false, - columnDefault: undefined, - columnName: 'name', - columnNotNull: true, - columnOnUpdate: undefined, - columnPk: false, - newDataType: 'text', - schema: '', - tableName: 'users', - type: 'alter_table_alter_column_set_notnull', - }); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - type: 'alter_table_alter_column_set_notnull', - tableName: 'users', - columnName: 'name', - schema: '', - newDataType: 'text', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: true, - columnAutoIncrement: false, - columnPk: false, - }); - - expect(sqlStatements.length).toBe(3); - expect(sqlStatements[0]).toBe( - `DROP INDEX IF EXISTS "users_name_index";`, - ); - expect(sqlStatements[1]).toBe( - `ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" text NOT NULL;`, - ); - expect(sqlStatements[2]).toBe( - `CREATE INDEX \`users_name_index\` ON \`users\` (\`name\`);`, - ); - expect(columnsToRemove!.length).toBe(0), expect(infoToPrint!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); - -test('drop not null with two indexes', async (t) => { - const turso = createClient({ - url: ':memory:', - }); - - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name').notNull(), - age: int('age').notNull(), - }, (table) => ({ - someUniqeIndex: uniqueIndex('users_name_unique').on(table.name), - someIndex: index('users_age_index').on(table.age), - })), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - age: int('age').notNull(), - }, (table) => ({ - someUniqeIndex: uniqueIndex('users_name_unique').on(table.name), - someIndex: index('users_age_index').on(table.age), - })), - }; - - const { - statements, - sqlStatements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushLibSQL( - turso, - schema1, - schema2, - [], - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - type: 'alter_table_alter_column_drop_notnull', - tableName: 'users', - columnName: 'name', - schema: '', - newDataType: 'text', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - }); - - expect(sqlStatements.length).toBe(5); - expect(sqlStatements[0]).toBe( - `DROP INDEX IF EXISTS "users_name_unique";`, - ); - expect(sqlStatements[1]).toBe( - `DROP INDEX IF EXISTS "users_age_index";`, - ); - expect(sqlStatements[2]).toBe( - `ALTER TABLE \`users\` ALTER COLUMN "name" TO "name" text;`, - ); - expect(sqlStatements[3]).toBe( - `CREATE UNIQUE INDEX \`users_name_unique\` ON \`users\` (\`name\`);`, - ); - expect(sqlStatements[4]).toBe( - `CREATE INDEX \`users_age_index\` ON \`users\` (\`age\`);`, - ); - expect(columnsToRemove!.length).toBe(0), expect(infoToPrint!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); diff --git a/drizzle-kit/tests/push/sqlite.test.ts b/drizzle-kit/tests/push/sqlite.test.ts index aea5cd379..cf468d3ec 100644 --- a/drizzle-kit/tests/push/sqlite.test.ts +++ b/drizzle-kit/tests/push/sqlite.test.ts @@ -1,630 +1,384 @@ import Database from 'better-sqlite3'; -import chalk from 'chalk'; -import { - blob, - foreignKey, - getTableConfig, - int, - integer, - numeric, - real, - sqliteTable, - text, - uniqueIndex, -} from 'drizzle-orm/sqlite-core'; +import { SQL, sql } from 'drizzle-orm'; +import { blob, foreignKey, int, integer, numeric, real, sqliteTable, text } from 'drizzle-orm/sqlite-core'; import { diffTestSchemasPushSqlite } from 'tests/schemaDiffer'; import { expect, test } from 'vitest'; +import { DialectSuite, run } from './common'; + +const sqliteSuite: DialectSuite = { + addBasicIndexes: function(context?: any): Promise { + return {} as any; + }, + changeIndexFields: function(context?: any): Promise { + return {} as any; + }, + dropIndex: function(context?: any): Promise { + return {} as any; + }, + + async allTypes() { + const sqlite = new Database(':memory:'); + + const Users = sqliteTable('users', { + id: integer('id').primaryKey().notNull(), + name: text('name').notNull(), + email: text('email'), + textJson: text('text_json', { mode: 'json' }), + blobJon: blob('blob_json', { mode: 'json' }), + blobBigInt: blob('blob_bigint', { mode: 'bigint' }), + numeric: numeric('numeric'), + createdAt: integer('created_at', { mode: 'timestamp' }), + createdAtMs: integer('created_at_ms', { mode: 'timestamp_ms' }), + real: real('real'), + text: text('text', { length: 255 }), + role: text('role', { enum: ['admin', 'user'] }).default('user'), + isConfirmed: integer('is_confirmed', { + mode: 'boolean', + }), + }); -test('nothing changed in schema', async (t) => { - const client = new Database(':memory:'); - - const users = sqliteTable('users', { - id: integer('id').primaryKey().notNull(), - name: text('name').notNull(), - email: text('email'), - textJson: text('text_json', { mode: 'json' }), - blobJon: blob('blob_json', { mode: 'json' }), - blobBigInt: blob('blob_bigint', { mode: 'bigint' }), - numeric: numeric('numeric'), - createdAt: integer('created_at', { mode: 'timestamp' }), - createdAtMs: integer('created_at_ms', { mode: 'timestamp_ms' }), - real: real('real'), - text: text('text', { length: 255 }), - role: text('role', { enum: ['admin', 'user'] }).default('user'), - isConfirmed: integer('is_confirmed', { - mode: 'boolean', - }), - }); - - const schema1 = { - users, - - customers: sqliteTable('customers', { - id: integer('id').primaryKey(), - address: text('address').notNull(), - isConfirmed: integer('is_confirmed', { mode: 'boolean' }), - registrationDate: integer('registration_date', { mode: 'timestamp_ms' }) - .notNull() - .$defaultFn(() => new Date()), - userId: integer('user_id') - .references(() => users.id) - .notNull(), - }), - - posts: sqliteTable('posts', { - id: integer('id').primaryKey(), - content: text('content'), - authorId: integer('author_id'), - }), - }; - - const { - sqlStatements, - statements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushSqlite(client, schema1, schema1, [], false); - expect(sqlStatements.length).toBe(0); - expect(statements.length).toBe(0); - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); -}); - -test('dropped, added unique index', async (t) => { - const client = new Database(':memory:'); - - const users = sqliteTable('users', { - id: integer('id').primaryKey().notNull(), - name: text('name').notNull(), - email: text('email'), - textJson: text('text_json', { mode: 'json' }), - blobJon: blob('blob_json', { mode: 'json' }), - blobBigInt: blob('blob_bigint', { mode: 'bigint' }), - numeric: numeric('numeric'), - createdAt: integer('created_at', { mode: 'timestamp' }), - createdAtMs: integer('created_at_ms', { mode: 'timestamp_ms' }), - real: real('real'), - text: text('text', { length: 255 }), - role: text('role', { enum: ['admin', 'user'] }).default('user'), - isConfirmed: integer('is_confirmed', { - mode: 'boolean', - }), - }); + const schema1 = { + Users, - const schema1 = { - users, - - customers: sqliteTable( - 'customers', - { + Customers: sqliteTable('customers', { id: integer('id').primaryKey(), - address: text('address').notNull().unique(), + address: text('address').notNull(), isConfirmed: integer('is_confirmed', { mode: 'boolean' }), registrationDate: integer('registration_date', { mode: 'timestamp_ms' }) .notNull() .$defaultFn(() => new Date()), - userId: integer('user_id').notNull(), - }, - (table) => ({ - uniqueIndex: uniqueIndex('customers_address_unique').on(table.address), + userId: integer('user_id') + .references(() => Users.id) + .notNull(), }), - ), - - posts: sqliteTable('posts', { - id: integer('id').primaryKey(), - content: text('content'), - authorId: integer('author_id'), - }), - }; - - const schema2 = { - users, - customers: sqliteTable( - 'customers', - { + Posts: sqliteTable('posts', { id: integer('id').primaryKey(), - address: text('address').notNull(), - isConfirmed: integer('is_confirmed', { mode: 'boolean' }), - registrationDate: integer('registration_date', { mode: 'timestamp_ms' }) + content: text('content'), + authorId: integer('author_id'), + }), + }; + + const { statements } = await diffTestSchemasPushSqlite( + sqlite, + schema1, + schema1, + [], + false, + ); + expect(statements.length).toBe(0); + }, + indexesToBeNotTriggered: function(context?: any): Promise { + return {} as any; + }, + indexesTestCase1: function(context?: any): Promise { + return {} as any; + }, + async case1(): Promise { + const sqlite = new Database(':memory:'); + + const schema1 = { + users: sqliteTable('users', { + id: text('id').notNull().primaryKey(), + firstName: text('first_name').notNull(), + lastName: text('last_name').notNull(), + username: text('username').notNull().unique(), + email: text('email').notNull().unique(), + password: text('password').notNull(), + avatarUrl: text('avatar_url').notNull(), + postsCount: integer('posts_count').notNull().default(0), + followersCount: integer('followers_count').notNull().default(0), + followingsCount: integer('followings_count').notNull().default(0), + createdAt: integer('created_at').notNull(), + }), + }; + + const schema2 = { + users: sqliteTable('users', { + id: text('id').notNull().primaryKey(), + firstName: text('first_name').notNull(), + lastName: text('last_name').notNull(), + username: text('username').notNull().unique(), + email: text('email').notNull().unique(), + password: text('password').notNull(), + avatarUrl: text('avatar_url').notNull(), + followersCount: integer('followers_count').notNull().default(0), + followingsCount: integer('followings_count').notNull().default(0), + createdAt: integer('created_at').notNull(), + }), + }; + + const { statements } = await diffTestSchemasPushSqlite( + sqlite, + schema1, + schema2, + [], + false, + ); + expect(statements.length).toBe(1); + expect(statements[0]).toStrictEqual({ + type: 'alter_table_drop_column', + tableName: 'users', + columnName: 'posts_count', + schema: '', + }); + }, + addNotNull: function(context?: any): Promise { + return {} as any; + }, + addNotNullWithDataNoRollback: function(context?: any): Promise { + return {} as any; + }, + addBasicSequences: function(context?: any): Promise { + return {} as any; + }, + // --- + addGeneratedColumn: async function(context?: any): Promise { + const sqlite = new Database(':memory:'); + + const from = { + users: sqliteTable('users', { + id: int('id'), + id2: int('id2'), + name: text('name'), + }), + }; + const to = { + users: sqliteTable('users', { + id: int('id'), + id2: int('id2'), + name: text('name'), + generatedName: text('gen_name').generatedAlwaysAs( + (): SQL => sql`${to.users.name} || 'hello'`, + { mode: 'stored' }, + ), + }), + }; + + const { statements, sqlStatements } = await diffTestSchemasPushSqlite( + sqlite, + from, + to, + [], + ); + + expect(statements).toStrictEqual([]); + expect(sqlStatements).toStrictEqual([]); + }, + addGeneratedToColumn: async function(context?: any): Promise { + const sqlite = new Database(':memory:'); + + const from = { + users: sqliteTable('users', { + id: int('id'), + id2: int('id2'), + name: text('name'), + generatedName: text('gen_name').notNull(), + generatedName1: text('gen_name1'), + }), + }; + const to = { + users: sqliteTable('users', { + id: int('id'), + id2: int('id2'), + name: text('name'), + generatedName: text('gen_name') .notNull() - .$defaultFn(() => new Date()), - userId: integer('user_id').notNull(), - }, - (table) => ({ - uniqueIndex: uniqueIndex('customers_is_confirmed_unique').on( - table.isConfirmed, + .generatedAlwaysAs((): SQL => sql`${to.users.name} || 'hello'`, { + mode: 'stored', + }), + generatedName1: text('gen_name1').generatedAlwaysAs( + (): SQL => sql`${to.users.name} || 'hello'`, + { mode: 'virtual' }, ), }), - ), - - posts: sqliteTable('posts', { - id: integer('id').primaryKey(), - content: text('content'), - authorId: integer('author_id'), - }), - }; - - const { - sqlStatements, - statements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushSqlite(client, schema1, schema2, [], false); - expect(statements.length).toBe(2); - expect(statements[0]).toStrictEqual({ - type: 'drop_index', - tableName: 'customers', - data: 'customers_address_unique;address;true;', - schema: '', - }); - expect(statements[1]).toStrictEqual({ - type: 'create_index', - tableName: 'customers', - data: 'customers_is_confirmed_unique;is_confirmed;true;', - schema: '', - internal: { - indexes: {}, - }, - }); - - expect(sqlStatements.length).toBe(2); - expect(sqlStatements[0]).toBe( - `DROP INDEX IF EXISTS \`customers_address_unique\`;`, - ); - expect(sqlStatements[1]).toBe( - `CREATE UNIQUE INDEX \`customers_is_confirmed_unique\` ON \`customers\` (\`is_confirmed\`);`, - ); - - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); - -test('added column not null and without default to table with data', async (t) => { - const client = new Database(':memory:'); - - const schema1 = { - companies: sqliteTable('companies', { - id: integer('id').primaryKey(), - name: text('name').notNull(), - }), - }; - - const schema2 = { - companies: sqliteTable('companies', { - id: integer('id').primaryKey(), - name: text('name').notNull(), - age: integer('age').notNull(), - }), - }; - - const table = getTableConfig(schema1.companies); - const seedStatements = [ - `INSERT INTO \`${table.name}\` ("${schema1.companies.name.name}") VALUES ('drizzle');`, - `INSERT INTO \`${table.name}\` ("${schema1.companies.name.name}") VALUES ('turso');`, - ]; - - const { - statements, - sqlStatements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushSqlite( - client, - schema1, - schema2, - [], - false, - seedStatements, - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - type: 'sqlite_alter_table_add_column', - tableName: 'companies', - column: { - name: 'age', - type: 'integer', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - referenceData: undefined, - }); - expect(sqlStatements.length).toBe(2); - expect(sqlStatements[0]).toBe(`delete from companies;`); - expect(sqlStatements[1]).toBe( - `ALTER TABLE \`companies\` ADD \`age\` integer NOT NULL;`, - ); - - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(1); - expect(infoToPrint![0]).toBe( - `· You're about to add not-null ${ - chalk.underline( - 'age', - ) - } column without default value, which contains 2 items`, - ); - expect(shouldAskForApprove).toBe(true); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(1); - expect(tablesToTruncate![0]).toBe('companies'); -}); - -test('added column not null and without default to table without data', async (t) => { - const turso = new Database(':memory:'); - - const schema1 = { - companies: sqliteTable('companies', { - id: integer('id').primaryKey(), - name: text('name').notNull(), - }), - }; - - const schema2 = { - companies: sqliteTable('companies', { - id: integer('id').primaryKey(), - name: text('name').notNull(), - age: integer('age').notNull(), - }), - }; - - const { - sqlStatements, - statements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushSqlite(turso, schema1, schema2, [], false); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - type: 'sqlite_alter_table_add_column', - tableName: 'companies', - column: { - name: 'age', - type: 'integer', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - referenceData: undefined, - }); - - expect(sqlStatements.length).toBe(1); - expect(sqlStatements[0]).toBe( - `ALTER TABLE \`companies\` ADD \`age\` integer NOT NULL;`, - ); - - expect(infoToPrint!.length).toBe(0); - expect(columnsToRemove!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); - -test('drop autoincrement. drop column with data', async (t) => { - const turso = new Database(':memory:'); - - const schema1 = { - companies: sqliteTable('companies', { - id: integer('id').primaryKey({ autoIncrement: true }), - name: text('name'), - }), - }; - - const schema2 = { - companies: sqliteTable('companies', { - id: integer('id').primaryKey({ autoIncrement: false }), - }), - }; + }; - const table = getTableConfig(schema1.companies); - const seedStatements = [ - `INSERT INTO \`${table.name}\` ("${schema1.companies.id.name}", "${schema1.companies.name.name}") VALUES (1, 'drizzle');`, - `INSERT INTO \`${table.name}\` ("${schema1.companies.id.name}", "${schema1.companies.name.name}") VALUES (2, 'turso');`, - ]; + const { statements, sqlStatements } = await diffTestSchemasPushSqlite( + sqlite, + from, + to, + [], + ); - const { - sqlStatements, - statements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushSqlite( - turso, - schema1, - schema2, - [], - false, - seedStatements, - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - type: 'recreate_table', - tableName: 'companies', - columns: [ + expect(statements).toStrictEqual([ { - name: 'id', - type: 'integer', - autoincrement: false, - notNull: true, - primaryKey: true, - generated: undefined, + columnAutoIncrement: false, + columnDefault: undefined, + columnGenerated: { + as: '("name" || \'hello\')', + type: 'virtual', + }, + columnName: 'gen_name1', + columnNotNull: false, + columnOnUpdate: undefined, + columnPk: false, + newDataType: 'text', + schema: '', + tableName: 'users', + type: 'alter_table_alter_column_set_generated', }, - ], - compositePKs: [], - referenceData: [], - uniqueConstraints: [], - }); - - expect(sqlStatements.length).toBe(4); - expect(sqlStatements[0]).toBe( - `CREATE TABLE \`__new_companies\` ( -\t\`id\` integer PRIMARY KEY NOT NULL -);\n`, - ); - expect(sqlStatements[1]).toBe( - `INSERT INTO \`__new_companies\`("id") SELECT "id" FROM \`companies\`;`, - ); - expect(sqlStatements[2]).toBe(`DROP TABLE \`companies\`;`); - expect(sqlStatements[3]).toBe( - `ALTER TABLE \`__new_companies\` RENAME TO \`companies\`;`, - ); - - expect(columnsToRemove!.length).toBe(1); - expect(columnsToRemove![0]).toBe('name'); - expect(infoToPrint!.length).toBe(1); - expect(infoToPrint![0]).toBe( - `· You're about to delete ${ - chalk.underline( - 'name', - ) - } column in companies table with 2 items`, - ); - expect(shouldAskForApprove).toBe(true); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); - -test('drop autoincrement. drop column with data with pragma off', async (t) => { - const client = new Database(':memory:'); - - client.exec('PRAGMA foreign_keys=OFF;'); - - const users = sqliteTable('users', { - id: integer('id').primaryKey({ autoIncrement: true }), - }); - const schema1 = { - companies: sqliteTable('companies', { - id: integer('id').primaryKey({ autoIncrement: true }), - name: text('name'), - user_id: integer('user_id').references(() => users.id), - }), - }; - - const schema2 = { - companies: sqliteTable('companies', { - id: integer('id').primaryKey({ autoIncrement: false }), - user_id: integer('user_id').references(() => users.id), - }), - }; + ]); + expect(sqlStatements).toStrictEqual([ + 'ALTER TABLE `users` DROP COLUMN `gen_name1`;', + 'ALTER TABLE `users` ADD `gen_name1` text GENERATED ALWAYS AS ("name" || \'hello\') VIRTUAL;', + ]); + + for (const st of sqlStatements) { + sqlite.exec(st); + } + }, + dropGeneratedConstraint: async function(context?: any): Promise { + const sqlite = new Database(':memory:'); + + const from = { + users: sqliteTable('users', { + id: int('id'), + id2: int('id2'), + name: text('name'), + generatedName: text('gen_name').generatedAlwaysAs( + (): SQL => sql`${to.users.name} || 'hello'`, + { mode: 'stored' }, + ), + generatedName1: text('gen_name1').generatedAlwaysAs( + (): SQL => sql`${to.users.name} || 'hello'`, + { mode: 'virtual' }, + ), + }), + }; + const to = { + users: sqliteTable('users', { + id: int('id'), + id2: int('id2'), + name: text('name'), + generatedName: text('gen_name'), + generatedName1: text('gen_name1'), + }), + }; - const table = getTableConfig(schema1.companies); - const seedStatements = [ - `INSERT INTO \`${table.name}\` ("${schema1.companies.id.name}", "${schema1.companies.name.name}") VALUES (1, 'drizzle');`, - `INSERT INTO \`${table.name}\` ("${schema1.companies.id.name}", "${schema1.companies.name.name}") VALUES (2, 'turso');`, - ]; + const { statements, sqlStatements } = await diffTestSchemasPushSqlite( + sqlite, + from, + to, + [], + ); - const { - sqlStatements, - statements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushSqlite( - client, - schema1, - schema2, - [], - false, - seedStatements, - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - type: 'recreate_table', - tableName: 'companies', - columns: [ - { - name: 'id', - type: 'integer', - autoincrement: false, - notNull: true, - primaryKey: true, - generated: undefined, - }, + expect(statements).toStrictEqual([ { - name: 'user_id', - type: 'integer', - autoincrement: false, - notNull: false, - primaryKey: false, - generated: undefined, + columnAutoIncrement: false, + columnDefault: undefined, + columnGenerated: undefined, + columnName: 'gen_name', + columnNotNull: false, + columnOnUpdate: undefined, + columnPk: false, + newDataType: 'text', + schema: '', + tableName: 'users', + type: 'alter_table_alter_column_drop_generated', }, - ], - compositePKs: [], - referenceData: [ { - columnsFrom: [ - 'user_id', - ], - columnsTo: [ - 'id', - ], - name: '', - onDelete: 'no action', - onUpdate: 'no action', - tableFrom: 'companies', - tableTo: 'users', + columnAutoIncrement: false, + columnDefault: undefined, + columnGenerated: undefined, + columnName: 'gen_name1', + columnNotNull: false, + columnOnUpdate: undefined, + columnPk: false, + newDataType: 'text', + schema: '', + tableName: 'users', + type: 'alter_table_alter_column_drop_generated', }, - ], - uniqueConstraints: [], - }); - - expect(sqlStatements.length).toBe(4); - expect(sqlStatements[0]).toBe( - `CREATE TABLE \`__new_companies\` ( -\t\`id\` integer PRIMARY KEY NOT NULL, -\t\`user_id\` integer, -\tFOREIGN KEY (\`user_id\`) REFERENCES \`users\`(\`id\`) ON UPDATE no action ON DELETE no action -);\n`, - ); - expect(sqlStatements[1]).toBe( - `INSERT INTO \`__new_companies\`("id", "user_id") SELECT "id", "user_id" FROM \`companies\`;`, - ); - expect(sqlStatements[2]).toBe(`DROP TABLE \`companies\`;`); - expect(sqlStatements[3]).toBe( - `ALTER TABLE \`__new_companies\` RENAME TO \`companies\`;`, - ); - - expect(columnsToRemove!.length).toBe(1); - expect(infoToPrint!.length).toBe(1); - expect(infoToPrint![0]).toBe( - `· You're about to delete ${ - chalk.underline( - 'name', - ) - } column in companies table with 2 items`, - ); - expect(shouldAskForApprove).toBe(true); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); - -test('change autoincrement. other table references current', async (t) => { - const client = new Database(':memory:'); - - const companies1 = sqliteTable('companies', { - id: integer('id').primaryKey({ autoIncrement: true }), - }); - const users1 = sqliteTable('users', { - id: integer('id').primaryKey({ autoIncrement: true }), - name: text('name').unique(), - companyId: text('company_id').references(() => companies1.id), - }); - const schema1 = { - companies: companies1, - users: users1, - }; - - const companies2 = sqliteTable('companies', { - id: integer('id').primaryKey({ autoIncrement: false }), - }); - const users2 = sqliteTable('users', { - id: integer('id').primaryKey({ autoIncrement: true }), - name: text('name').unique(), - companyId: text('company_id').references(() => companies1.id), - }); - const schema2 = { - companies: companies2, - users: users2, - }; - - const { name: usersTableName } = getTableConfig(users1); - const { name: companiesTableName } = getTableConfig(companies1); - const seedStatements = [ - `INSERT INTO \`${usersTableName}\` ("${schema1.users.name.name}") VALUES ('drizzle');`, - `INSERT INTO \`${usersTableName}\` ("${schema1.users.name.name}") VALUES ('turso');`, - `INSERT INTO \`${companiesTableName}\` ("${schema1.companies.id.name}") VALUES ('1');`, - `INSERT INTO \`${companiesTableName}\` ("${schema1.companies.id.name}") VALUES ('2');`, - ]; + ]); + expect(sqlStatements).toStrictEqual([ + 'ALTER TABLE `users` DROP COLUMN `gen_name`;', + 'ALTER TABLE `users` ADD `gen_name` text;', + 'ALTER TABLE `users` DROP COLUMN `gen_name1`;', + 'ALTER TABLE `users` ADD `gen_name1` text;', + ]); + + for (const st of sqlStatements) { + sqlite.exec(st); + } + }, + alterGeneratedConstraint: async function(context?: any): Promise { + const sqlite = new Database(':memory:'); + + const from = { + users: sqliteTable('users', { + id: int('id'), + id2: int('id2'), + name: text('name'), + generatedName: text('gen_name').generatedAlwaysAs( + (): SQL => sql`${to.users.name} || 'hello'`, + { mode: 'stored' }, + ), + generatedName1: text('gen_name1').generatedAlwaysAs( + (): SQL => sql`${to.users.name} || 'hello'`, + { mode: 'virtual' }, + ), + }), + }; + const to = { + users: sqliteTable('users', { + id: int('id'), + id2: int('id2'), + name: text('name'), + generatedName: text('gen_name').generatedAlwaysAs( + (): SQL => sql`${to.users.name}`, + { mode: 'stored' }, + ), + generatedName1: text('gen_name1').generatedAlwaysAs( + (): SQL => sql`${to.users.name}`, + { mode: 'virtual' }, + ), + }), + }; - const { - statements, - sqlStatements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushSqlite( - client, - schema1, - schema2, - [], - false, - seedStatements, - ); + const { statements, sqlStatements } = await diffTestSchemasPushSqlite( + sqlite, + from, + to, + [], + ); - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - type: 'recreate_table', - tableName: 'companies', - columns: [ + expect(statements).toStrictEqual([ { - name: 'id', - type: 'integer', - autoincrement: false, - notNull: true, - primaryKey: true, - generated: undefined, + columnAutoIncrement: false, + columnDefault: undefined, + columnGenerated: { + as: '("name")', + type: 'virtual', + }, + columnName: 'gen_name1', + columnNotNull: false, + columnOnUpdate: undefined, + columnPk: false, + newDataType: 'text', + schema: '', + tableName: 'users', + type: 'alter_table_alter_column_alter_generated', }, - ], - compositePKs: [], - referenceData: [], - uniqueConstraints: [], - }); - - expect(sqlStatements.length).toBe(6); - expect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`); - expect(sqlStatements[1]).toBe( - `CREATE TABLE \`__new_companies\` ( -\t\`id\` integer PRIMARY KEY NOT NULL -);\n`, - ); - expect(sqlStatements[2]).toBe( - `INSERT INTO \`__new_companies\`("id") SELECT "id" FROM \`companies\`;`, - ); - expect(sqlStatements[3]).toBe(`DROP TABLE \`companies\`;`); - expect(sqlStatements[4]).toBe( - `ALTER TABLE \`__new_companies\` RENAME TO \`companies\`;`, - ); - expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`); - - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); + ]); + expect(sqlStatements).toStrictEqual([ + 'ALTER TABLE `users` DROP COLUMN `gen_name1`;', + 'ALTER TABLE `users` ADD `gen_name1` text GENERATED ALWAYS AS ("name") VIRTUAL;', + ]); + + for (const st of sqlStatements) { + sqlite.exec(st); + } + }, + createTableWithGeneratedConstraint: function(context?: any): Promise { + return {} as any; + }, +}; + +run(sqliteSuite); test('create table with custom name references', async (t) => { - const client = new Database(':memory:'); + const sqlite = new Database(':memory:'); const users = sqliteTable('users', { id: int('id').primaryKey({ autoIncrement: true }), @@ -670,7 +424,7 @@ test('create table with custom name references', async (t) => { }; const { sqlStatements } = await diffTestSchemasPushSqlite( - client, + sqlite, schema1, schema2, [], @@ -678,613 +432,3 @@ test('create table with custom name references', async (t) => { expect(sqlStatements!.length).toBe(0); }); - -test('drop not null, add not null', async (t) => { - const client = new Database(':memory:'); - - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name').notNull(), - }), - posts: sqliteTable('posts', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - userId: int('user_id'), - }), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - }), - posts: sqliteTable('posts', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name').notNull(), - userId: int('user_id'), - }), - }; - const { - statements, - sqlStatements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushSqlite(client, schema1, schema2, []); - - expect(statements!.length).toBe(2); - expect(statements![0]).toStrictEqual({ - columns: [ - { - autoincrement: true, - generated: undefined, - name: 'id', - notNull: true, - primaryKey: true, - type: 'integer', - }, - { - autoincrement: false, - generated: undefined, - name: 'name', - notNull: false, - primaryKey: false, - type: 'text', - }, - ], - compositePKs: [], - referenceData: [], - tableName: 'users', - type: 'recreate_table', - uniqueConstraints: [], - }); - expect(statements![1]).toStrictEqual({ - columns: [ - { - autoincrement: true, - generated: undefined, - name: 'id', - notNull: true, - primaryKey: true, - type: 'integer', - }, - { - autoincrement: false, - generated: undefined, - name: 'name', - notNull: true, - primaryKey: false, - type: 'text', - }, - { - autoincrement: false, - generated: undefined, - name: 'user_id', - notNull: false, - primaryKey: false, - type: 'integer', - }, - ], - compositePKs: [], - referenceData: [], - tableName: 'posts', - type: 'recreate_table', - uniqueConstraints: [], - }); - - expect(sqlStatements.length).toBe(8); - expect(sqlStatements[0]).toBe(`CREATE TABLE \`__new_users\` ( -\t\`id\` integer PRIMARY KEY AUTOINCREMENT NOT NULL, -\t\`name\` text -);\n`); - expect(sqlStatements[1]).toBe( - `INSERT INTO \`__new_users\`("id", "name") SELECT "id", "name" FROM \`users\`;`, - ); - expect(sqlStatements[2]).toBe(`DROP TABLE \`users\`;`); - expect(sqlStatements[3]).toBe( - `ALTER TABLE \`__new_users\` RENAME TO \`users\`;`, - ); - - expect(sqlStatements![4]).toBe(`CREATE TABLE \`__new_posts\` ( -\t\`id\` integer PRIMARY KEY AUTOINCREMENT NOT NULL, -\t\`name\` text NOT NULL, -\t\`user_id\` integer -);\n`); - expect(sqlStatements![5]).toBe( - `INSERT INTO \`__new_posts\`("id", "name", "user_id") SELECT "id", "name", "user_id" FROM \`posts\`;`, - ); - expect(sqlStatements![6]).toBe(`DROP TABLE \`posts\`;`); - expect(sqlStatements![7]).toBe( - `ALTER TABLE \`__new_posts\` RENAME TO \`posts\`;`, - ); - - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); - -test('rename table and change data type', async (t) => { - const client = new Database(':memory:'); - - const schema1 = { - users: sqliteTable('old_users', { - id: int('id').primaryKey({ autoIncrement: true }), - age: text('age'), - }), - }; - - const schema2 = { - users: sqliteTable('new_users', { - id: int('id').primaryKey({ autoIncrement: true }), - age: integer('age'), - }), - }; - const { - statements, - sqlStatements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushSqlite(client, schema1, schema2, [ - 'public.old_users->public.new_users', - ]); - - expect(statements!.length).toBe(2); - expect(statements![0]).toStrictEqual({ - fromSchema: undefined, - tableNameFrom: 'old_users', - tableNameTo: 'new_users', - toSchema: undefined, - type: 'rename_table', - }); - expect(statements![1]).toStrictEqual({ - columns: [ - { - autoincrement: true, - name: 'id', - notNull: true, - generated: undefined, - primaryKey: true, - type: 'integer', - }, - { - autoincrement: false, - name: 'age', - notNull: false, - generated: undefined, - primaryKey: false, - type: 'integer', - }, - ], - compositePKs: [], - referenceData: [], - tableName: 'new_users', - type: 'recreate_table', - uniqueConstraints: [], - }); - - expect(sqlStatements!.length).toBe(5); - expect(sqlStatements![0]).toBe( - `ALTER TABLE \`old_users\` RENAME TO \`new_users\`;`, - ); - expect(sqlStatements[1]).toBe(`CREATE TABLE \`__new_new_users\` ( -\t\`id\` integer PRIMARY KEY AUTOINCREMENT NOT NULL, -\t\`age\` integer -);\n`); - expect(sqlStatements![2]).toBe( - `INSERT INTO \`__new_new_users\`("id", "age") SELECT "id", "age" FROM \`new_users\`;`, - ); - expect(sqlStatements![3]).toBe(`DROP TABLE \`new_users\`;`); - expect(sqlStatements![4]).toBe( - `ALTER TABLE \`__new_new_users\` RENAME TO \`new_users\`;`, - ); - - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); - -test('rename column and change data type', async (t) => { - const client = new Database(':memory:'); - - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - }), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - age: integer('age'), - }), - }; - const { - statements, - sqlStatements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushSqlite(client, schema1, schema2, [ - 'public.users.name->public.users.age', - ]); - - expect(statements!.length).toBe(1); - expect(statements![0]).toStrictEqual({ - columns: [ - { - autoincrement: true, - name: 'id', - notNull: true, - generated: undefined, - primaryKey: true, - type: 'integer', - }, - { - autoincrement: false, - name: 'age', - notNull: false, - generated: undefined, - primaryKey: false, - type: 'integer', - }, - ], - compositePKs: [], - referenceData: [], - tableName: 'users', - type: 'recreate_table', - uniqueConstraints: [], - }); - - expect(sqlStatements!.length).toBe(4); - expect(sqlStatements![0]).toBe(`CREATE TABLE \`__new_users\` ( -\t\`id\` integer PRIMARY KEY AUTOINCREMENT NOT NULL, -\t\`age\` integer -);\n`); - expect(sqlStatements![1]).toBe( - `INSERT INTO \`__new_users\`("id", "age") SELECT "id", "age" FROM \`users\`;`, - ); - expect(sqlStatements![2]).toBe(`DROP TABLE \`users\`;`); - expect(sqlStatements![3]).toBe( - `ALTER TABLE \`__new_users\` RENAME TO \`users\`;`, - ); - - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); - -test('recreate table with nested references', async (t) => { - const client = new Database(':memory:'); - - let users = sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - age: integer('age'), - }); - let subscriptions = sqliteTable('subscriptions', { - id: int('id').primaryKey({ autoIncrement: true }), - userId: integer('user_id').references(() => users.id), - customerId: text('customer_id'), - }); - const schema1 = { - users: users, - subscriptions: subscriptions, - subscriptionMetadata: sqliteTable('subscriptions_metadata', { - id: int('id').primaryKey({ autoIncrement: true }), - subscriptionId: text('subscription_id').references( - () => subscriptions.id, - ), - }), - }; - - users = sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: false }), - name: text('name'), - age: integer('age'), - }); - const schema2 = { - users: users, - subscriptions: subscriptions, - subscriptionMetadata: sqliteTable('subscriptions_metadata', { - id: int('id').primaryKey({ autoIncrement: true }), - subscriptionId: text('subscription_id').references( - () => subscriptions.id, - ), - }), - }; - - const { - statements, - sqlStatements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushSqlite(client, schema1, schema2, [ - 'public.users.name->public.users.age', - ]); - - expect(statements!.length).toBe(1); - expect(statements![0]).toStrictEqual({ - columns: [ - { - autoincrement: false, - name: 'id', - notNull: true, - generated: undefined, - primaryKey: true, - type: 'integer', - }, - { - autoincrement: false, - name: 'name', - notNull: false, - generated: undefined, - primaryKey: false, - type: 'text', - }, - { - autoincrement: false, - name: 'age', - notNull: false, - generated: undefined, - primaryKey: false, - type: 'integer', - }, - ], - compositePKs: [], - referenceData: [], - tableName: 'users', - type: 'recreate_table', - uniqueConstraints: [], - }); - - expect(sqlStatements!.length).toBe(6); - expect(sqlStatements[0]).toBe('PRAGMA foreign_keys=OFF;'); - expect(sqlStatements![1]).toBe(`CREATE TABLE \`__new_users\` ( -\t\`id\` integer PRIMARY KEY NOT NULL, -\t\`name\` text, -\t\`age\` integer -);\n`); - expect(sqlStatements![2]).toBe( - `INSERT INTO \`__new_users\`("id", "name", "age") SELECT "id", "name", "age" FROM \`users\`;`, - ); - expect(sqlStatements![3]).toBe(`DROP TABLE \`users\`;`); - expect(sqlStatements![4]).toBe( - `ALTER TABLE \`__new_users\` RENAME TO \`users\`;`, - ); - expect(sqlStatements[5]).toBe('PRAGMA foreign_keys=ON;'); - - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); - -test('recreate table with added column not null and without default with data', async (t) => { - const client = new Database(':memory:'); - - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - age: integer('age'), - }), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: false }), - name: text('name'), - age: integer('age'), - newColumn: text('new_column').notNull(), - }), - }; - - const seedStatements = [ - `INSERT INTO \`users\` ("name", "age") VALUES ('drizzle', 12)`, - `INSERT INTO \`users\` ("name", "age") VALUES ('turso', 12)`, - ]; - - const { - statements, - sqlStatements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushSqlite( - client, - schema1, - schema2, - [], - false, - seedStatements, - ); - - expect(statements!.length).toBe(1); - expect(statements![0]).toStrictEqual({ - columns: [ - { - autoincrement: false, - name: 'id', - notNull: true, - generated: undefined, - primaryKey: true, - type: 'integer', - }, - { - autoincrement: false, - name: 'name', - notNull: false, - generated: undefined, - primaryKey: false, - type: 'text', - }, - { - autoincrement: false, - name: 'age', - notNull: false, - generated: undefined, - primaryKey: false, - type: 'integer', - }, - { - autoincrement: false, - name: 'new_column', - notNull: true, - generated: undefined, - primaryKey: false, - type: 'text', - }, - ], - compositePKs: [], - referenceData: [], - tableName: 'users', - type: 'recreate_table', - uniqueConstraints: [], - }); - - expect(sqlStatements!.length).toBe(4); - expect(sqlStatements[0]).toBe('DELETE FROM \`users\`;'); - expect(sqlStatements![1]).toBe(`CREATE TABLE \`__new_users\` ( -\t\`id\` integer PRIMARY KEY NOT NULL, -\t\`name\` text, -\t\`age\` integer, -\t\`new_column\` text NOT NULL -);\n`); - expect(sqlStatements![2]).toBe(`DROP TABLE \`users\`;`); - expect(sqlStatements![3]).toBe( - `ALTER TABLE \`__new_users\` RENAME TO \`users\`;`, - ); - - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(1); - expect(infoToPrint![0]).toBe( - `· You're about to add not-null ${ - chalk.underline('new_column') - } column without default value to table, which contains 2 items`, - ); - expect(shouldAskForApprove).toBe(true); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(1); - expect(tablesToTruncate![0]).toBe('users'); -}); - -test('recreate table with added column not null and without default with data', async (t) => { - const client = new Database(':memory:'); - - const schema1 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - age: integer('age'), - }), - }; - - const schema2 = { - users: sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: false }), - name: text('name'), - age: integer('age'), - newColumn: text('new_column').notNull(), - }), - }; - - const { - statements, - sqlStatements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await diffTestSchemasPushSqlite( - client, - schema1, - schema2, - [], - ); - - expect(statements!.length).toBe(1); - expect(statements![0]).toStrictEqual({ - columns: [ - { - autoincrement: false, - name: 'id', - notNull: true, - generated: undefined, - primaryKey: true, - type: 'integer', - }, - { - autoincrement: false, - name: 'name', - notNull: false, - generated: undefined, - primaryKey: false, - type: 'text', - }, - { - autoincrement: false, - name: 'age', - notNull: false, - generated: undefined, - primaryKey: false, - type: 'integer', - }, - { - autoincrement: false, - name: 'new_column', - notNull: true, - generated: undefined, - primaryKey: false, - type: 'text', - }, - ], - compositePKs: [], - referenceData: [], - tableName: 'users', - type: 'recreate_table', - uniqueConstraints: [], - }); - - expect(sqlStatements!.length).toBe(4); - expect(sqlStatements![0]).toBe(`CREATE TABLE \`__new_users\` ( -\t\`id\` integer PRIMARY KEY NOT NULL, -\t\`name\` text, -\t\`age\` integer, -\t\`new_column\` text NOT NULL -);\n`); - expect(sqlStatements[1]).toBe( - 'INSERT INTO `__new_users`("id", "name", "age", "new_column") SELECT "id", "name", "age", "new_column" FROM `users`;', - ); - expect(sqlStatements![2]).toBe(`DROP TABLE \`users\`;`); - expect(sqlStatements![3]).toBe( - `ALTER TABLE \`__new_users\` RENAME TO \`users\`;`, - ); - - expect(columnsToRemove!.length).toBe(0); - expect(infoToPrint!.length).toBe(0); - expect(shouldAskForApprove).toBe(false); - expect(tablesToRemove!.length).toBe(0); - expect(tablesToTruncate!.length).toBe(0); -}); diff --git a/drizzle-kit/tests/schemaDiffer.ts b/drizzle-kit/tests/schemaDiffer.ts index 3223ca5e7..f300fc68c 100644 --- a/drizzle-kit/tests/schemaDiffer.ts +++ b/drizzle-kit/tests/schemaDiffer.ts @@ -1,5 +1,4 @@ import { PGlite } from '@electric-sql/pglite'; -import { Client } from '@libsql/client/.'; import { Database } from 'better-sqlite3'; import { is } from 'drizzle-orm'; import { MySqlSchema, MySqlTable } from 'drizzle-orm/mysql-core'; @@ -8,7 +7,6 @@ import { SingleStoreSchema, SingleStoreTable } from 'drizzle-orm/singlestore-cor import { SQLiteTable } from 'drizzle-orm/sqlite-core'; import * as fs from 'fs'; import { Connection } from 'mysql2/promise'; -import { libSqlLogSuggestionsAndReturn } from 'src/cli/commands/libSqlPushUtils'; import { columnsResolver, enumsResolver, @@ -38,7 +36,6 @@ import { prepareFromSqliteImports } from 'src/serializer/sqliteImports'; import { sqliteSchema, squashSqliteScheme } from 'src/serializer/sqliteSchema'; import { fromDatabase as fromSqliteDatabase, generateSqliteSnapshot } from 'src/serializer/sqliteSerializer'; import { - applyLibSQLSnapshotsDiff, applyMysqlSnapshotsDiff, applyPgSnapshotsDiff, applySingleStoreSnapshotsDiff, @@ -961,18 +958,11 @@ export const diffTestSchemasPushSqlite = async ( right: SqliteSchema, renamesArr: string[], cli: boolean = false, - seedStatements: string[] = [], ) => { const { sqlStatements } = await applySqliteDiffs(left, 'push'); - for (const st of sqlStatements) { client.exec(st); } - - for (const st of seedStatements) { - client.exec(st); - } - // do introspect into PgSchemaInternal const introspectedSchema = await fromSqliteDatabase( { @@ -986,9 +976,9 @@ export const diffTestSchemasPushSqlite = async ( undefined, ); - const rightTables = Object.values(right).filter((it) => is(it, SQLiteTable)) as SQLiteTable[]; + const leftTables = Object.values(right).filter((it) => is(it, SQLiteTable)) as SQLiteTable[]; - const serialized2 = generateSqliteSnapshot(rightTables); + const serialized2 = generateSqliteSnapshot(leftTables); const { version: v1, dialect: d1, ...rest1 } = introspectedSchema; const { version: v2, dialect: d2, ...rest2 } = serialized2; @@ -1025,15 +1015,7 @@ export const diffTestSchemasPushSqlite = async ( 'push', ); - const { - statementsToExecute, - columnsToRemove, - infoToPrint, - schemasToRemove, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await logSuggestionsAndReturn( + const { statementsToExecute } = await logSuggestionsAndReturn( { query: async (sql: string, params: any[] = []) => { return client.prepare(sql).bind(params).all() as T[]; @@ -1048,16 +1030,7 @@ export const diffTestSchemasPushSqlite = async ( _meta!, ); - return { - sqlStatements: statementsToExecute, - statements, - columnsToRemove, - infoToPrint, - schemasToRemove, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - }; + return { sqlStatements: statementsToExecute, statements }; } else { const { sqlStatements, statements } = await applySqliteSnapshotsDiff( sn1, @@ -1072,122 +1045,6 @@ export const diffTestSchemasPushSqlite = async ( } }; -export async function diffTestSchemasPushLibSQL( - client: Client, - left: SqliteSchema, - right: SqliteSchema, - renamesArr: string[], - cli: boolean = false, - seedStatements: string[] = [], -) { - const { sqlStatements } = await applyLibSQLDiffs(left, 'push'); - - for (const st of sqlStatements) { - await client.execute(st); - } - - for (const st of seedStatements) { - await client.execute(st); - } - - const introspectedSchema = await fromSqliteDatabase( - { - query: async (sql: string, params?: any[]) => { - const res = await client.execute({ sql, args: params || [] }); - return res.rows as T[]; - }, - run: async (query: string) => { - await client.execute(query); - }, - }, - undefined, - ); - - const leftTables = Object.values(right).filter((it) => is(it, SQLiteTable)) as SQLiteTable[]; - - const serialized2 = generateSqliteSnapshot(leftTables); - - const { version: v1, dialect: d1, ...rest1 } = introspectedSchema; - const { version: v2, dialect: d2, ...rest2 } = serialized2; - - const sch1 = { - version: '6', - dialect: 'sqlite', - id: '0', - prevId: '0', - ...rest1, - } as const; - - const sch2 = { - version: '6', - dialect: 'sqlite', - id: '0', - prevId: '0', - ...rest2, - } as const; - - const sn1 = squashSqliteScheme(sch1, 'push'); - const sn2 = squashSqliteScheme(sch2, 'push'); - - const renames = new Set(renamesArr); - - if (!cli) { - const { sqlStatements, statements, _meta } = await applyLibSQLSnapshotsDiff( - sn1, - sn2, - testTablesResolver(renames), - testColumnsResolver(renames), - sch1, - sch2, - 'push', - ); - - const { - statementsToExecute, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - } = await libSqlLogSuggestionsAndReturn( - { - query: async (sql: string, params?: any[]) => { - const res = await client.execute({ sql, args: params || [] }); - return res.rows as T[]; - }, - run: async (query: string) => { - await client.execute(query); - }, - }, - statements, - sn1, - sn2, - _meta!, - ); - - return { - sqlStatements: statementsToExecute, - statements, - columnsToRemove, - infoToPrint, - shouldAskForApprove, - tablesToRemove, - tablesToTruncate, - }; - } else { - const { sqlStatements, statements } = await applyLibSQLSnapshotsDiff( - sn1, - sn2, - tablesResolver, - columnsResolver, - sch1, - sch2, - 'push', - ); - return { sqlStatements, statements }; - } -} - export const applySqliteDiffs = async ( sn: SqliteSchema, action?: 'push' | undefined, @@ -1236,54 +1093,6 @@ export const applySqliteDiffs = async ( return { sqlStatements, statements }; }; -export const applyLibSQLDiffs = async ( - sn: SqliteSchema, - action?: 'push' | undefined, -) => { - const dryRun = { - version: '6', - dialect: 'sqlite', - id: '0', - prevId: '0', - tables: {}, - enums: {}, - schemas: {}, - _meta: { - schemas: {}, - tables: {}, - columns: {}, - }, - } as const; - - const tables = Object.values(sn).filter((it) => is(it, SQLiteTable)) as SQLiteTable[]; - - const serialized1 = generateSqliteSnapshot(tables); - - const { version: v1, dialect: d1, ...rest1 } = serialized1; - - const sch1 = { - version: '6', - dialect: 'sqlite', - id: '0', - prevId: '0', - ...rest1, - } as const; - - const sn1 = squashSqliteScheme(sch1, action); - - const { sqlStatements, statements } = await applyLibSQLSnapshotsDiff( - dryRun, - sn1, - testTablesResolver(new Set()), - testColumnsResolver(new Set()), - dryRun, - sch1, - action, - ); - - return { sqlStatements, statements }; -}; - export const diffTestSchemasSqlite = async ( left: SqliteSchema, right: SqliteSchema, @@ -1344,66 +1153,6 @@ export const diffTestSchemasSqlite = async ( return { sqlStatements, statements }; }; -export const diffTestSchemasLibSQL = async ( - left: SqliteSchema, - right: SqliteSchema, - renamesArr: string[], - cli: boolean = false, -) => { - const leftTables = Object.values(left).filter((it) => is(it, SQLiteTable)) as SQLiteTable[]; - - const rightTables = Object.values(right).filter((it) => is(it, SQLiteTable)) as SQLiteTable[]; - - const serialized1 = generateSqliteSnapshot(leftTables); - const serialized2 = generateSqliteSnapshot(rightTables); - - const { version: v1, dialect: d1, ...rest1 } = serialized1; - const { version: v2, dialect: d2, ...rest2 } = serialized2; - - const sch1 = { - version: '6', - dialect: 'sqlite', - id: '0', - prevId: '0', - ...rest1, - } as const; - - const sch2 = { - version: '6', - dialect: 'sqlite', - id: '0', - prevId: '0', - ...rest2, - } as const; - - const sn1 = squashSqliteScheme(sch1); - const sn2 = squashSqliteScheme(sch2); - - const renames = new Set(renamesArr); - - if (!cli) { - const { sqlStatements, statements } = await applyLibSQLSnapshotsDiff( - sn1, - sn2, - testTablesResolver(renames), - testColumnsResolver(renames), - sch1, - sch2, - ); - return { sqlStatements, statements }; - } - - const { sqlStatements, statements } = await applyLibSQLSnapshotsDiff( - sn1, - sn2, - tablesResolver, - columnsResolver, - sch1, - sch2, - ); - return { sqlStatements, statements }; -}; - // --- Introspect to file helpers --- export const introspectPgToFile = async ( diff --git a/drizzle-kit/tests/sqlite-columns.test.ts b/drizzle-kit/tests/sqlite-columns.test.ts index 04dbb940c..8a258072a 100644 --- a/drizzle-kit/tests/sqlite-columns.test.ts +++ b/drizzle-kit/tests/sqlite-columns.test.ts @@ -8,7 +8,6 @@ import { sqliteTable, text, } from 'drizzle-orm/sqlite-core'; -import { JsonCreateIndexStatement, JsonRecreateTableStatement } from 'src/jsonStatements'; import { expect, test } from 'vitest'; import { diffTestSchemasSqlite } from './schemaDiffer'; @@ -224,7 +223,7 @@ test('add columns #5', async (t) => { const { statements } = await diffTestSchemasSqlite(schema1, schema2, []); // TODO: Fix here - expect(statements.length).toBe(1); + expect(statements.length).toBe(2); expect(statements[0]).toStrictEqual({ type: 'sqlite_alter_table_add_column', tableName: 'users', @@ -333,38 +332,12 @@ test('add foreign key #1', async (t) => { const { statements } = await diffTestSchemasSqlite(schema1, schema2, []); expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual( - { - type: 'recreate_table', - columns: [{ - autoincrement: true, - generated: undefined, - name: 'id', - notNull: true, - primaryKey: true, - type: 'integer', - }, { - autoincrement: false, - generated: undefined, - name: 'report_to', - notNull: false, - primaryKey: false, - type: 'integer', - }], - compositePKs: [], - referenceData: [{ - columnsFrom: ['report_to'], - columnsTo: ['id'], - name: 'users_report_to_users_id_fk', - tableFrom: 'users', - tableTo: 'users', - onDelete: 'no action', - onUpdate: 'no action', - }], - tableName: 'users', - uniqueConstraints: [], - } as JsonRecreateTableStatement, - ); + expect(statements[0]).toStrictEqual({ + type: 'create_reference', + tableName: 'users', + schema: '', + data: 'users_report_to_users_id_fk;users;report_to;users;id;no action;no action', + }); }); test('add foreign key #2', async (t) => { @@ -398,35 +371,11 @@ test('add foreign key #2', async (t) => { expect(statements.length).toBe(1); expect(statements[0]).toStrictEqual({ - type: 'recreate_table', - columns: [{ - autoincrement: true, - generated: undefined, - name: 'id', - notNull: true, - primaryKey: true, - type: 'integer', - }, { - autoincrement: false, - generated: undefined, - name: 'report_to', - notNull: false, - primaryKey: false, - type: 'integer', - }], - compositePKs: [], - referenceData: [{ - columnsFrom: ['report_to'], - columnsTo: ['id'], - name: 'reportee_fk', - tableFrom: 'users', - tableTo: 'users', - onDelete: 'no action', - onUpdate: 'no action', - }], + type: 'create_reference', tableName: 'users', - uniqueConstraints: [], - } as JsonRecreateTableStatement); + schema: '', + data: 'reportee_fk;users;report_to;users;id;no action;no action', + }); }); test('alter column change name #1', async (t) => { @@ -564,26 +513,9 @@ test('alter table add composite pk', async (t) => { expect(statements.length).toBe(1); expect(statements[0]).toStrictEqual({ - type: 'recreate_table', - columns: [{ - autoincrement: false, - generated: undefined, - name: 'id1', - notNull: false, - primaryKey: false, - type: 'integer', - }, { - autoincrement: false, - generated: undefined, - name: 'id2', - notNull: false, - primaryKey: false, - type: 'integer', - }], - compositePKs: [['id1', 'id2']], - referenceData: [], + type: 'create_composite_pk', tableName: 'table', - uniqueConstraints: [], + data: 'id1,id2', }); }); @@ -608,19 +540,16 @@ test('alter column drop not null', async (t) => { expect(statements.length).toBe(1); expect(statements[0]).toStrictEqual({ - type: 'recreate_table', - columns: [{ - autoincrement: false, - generated: undefined, - name: 'name', - notNull: false, - primaryKey: false, - type: 'text', - }], - compositePKs: [], - referenceData: [], + type: 'alter_table_alter_column_drop_notnull', tableName: 'table', - uniqueConstraints: [], + columnName: 'name', + schema: '', + newDataType: 'text', + columnDefault: undefined, + columnOnUpdate: undefined, + columnNotNull: false, + columnAutoIncrement: false, + columnPk: false, }); }); @@ -645,19 +574,16 @@ test('alter column add not null', async (t) => { expect(statements.length).toBe(1); expect(statements[0]).toStrictEqual({ - type: 'recreate_table', - columns: [{ - autoincrement: false, - generated: undefined, - name: 'name', - notNull: true, - primaryKey: false, - type: 'text', - }], - compositePKs: [], - referenceData: [], + type: 'alter_table_alter_column_set_notnull', tableName: 'table', - uniqueConstraints: [], + columnName: 'name', + schema: '', + newDataType: 'text', + columnDefault: undefined, + columnOnUpdate: undefined, + columnNotNull: true, + columnAutoIncrement: false, + columnPk: false, }); }); @@ -682,20 +608,16 @@ test('alter column add default', async (t) => { expect(statements.length).toBe(1); expect(statements[0]).toStrictEqual({ - type: 'recreate_table', - columns: [{ - autoincrement: false, - generated: undefined, - name: 'name', - notNull: false, - primaryKey: false, - type: 'text', - default: "'dan'", - }], - compositePKs: [], - referenceData: [], + type: 'alter_table_alter_column_set_default', tableName: 'table', - uniqueConstraints: [], + columnName: 'name', + schema: '', + newDataType: 'text', + columnNotNull: false, + columnOnUpdate: undefined, + columnAutoIncrement: false, + newDefaultValue: "'dan'", + columnPk: false, }); }); @@ -720,19 +642,16 @@ test('alter column drop default', async (t) => { expect(statements.length).toBe(1); expect(statements[0]).toStrictEqual({ - type: 'recreate_table', - columns: [{ - autoincrement: false, - generated: undefined, - name: 'name', - notNull: false, - primaryKey: false, - type: 'text', - }], - compositePKs: [], - referenceData: [], + type: 'alter_table_alter_column_drop_default', tableName: 'table', - uniqueConstraints: [], + columnName: 'name', + schema: '', + newDataType: 'text', + columnNotNull: false, + columnOnUpdate: undefined, + columnDefault: undefined, + columnAutoIncrement: false, + columnPk: false, }); }); @@ -755,84 +674,32 @@ test('alter column add default not null', async (t) => { [], ); - expect(statements.length).toBe(1); + expect(statements.length).toBe(2); expect(statements[0]).toStrictEqual({ - type: 'recreate_table', - columns: [{ - autoincrement: false, - generated: undefined, - name: 'name', - notNull: true, - primaryKey: false, - type: 'text', - default: "'dan'", - }], - compositePKs: [], - referenceData: [], + columnAutoIncrement: false, + columnName: 'name', + columnNotNull: true, + columnOnUpdate: undefined, + columnPk: false, + newDataType: 'text', + newDefaultValue: "'dan'", + schema: '', tableName: 'table', - uniqueConstraints: [], + type: 'alter_table_alter_column_set_default', }); -}); -test('alter column add default not null with indexes', async (t) => { - const from = { - users: sqliteTable('table', { - name: text('name'), - }, (table) => ({ - someIndex: index('index_name').on(table.name), - })), - }; - - const to = { - users: sqliteTable('table', { - name: text('name').notNull().default('dan'), - }, (table) => ({ - someIndex: index('index_name').on(table.name), - })), - }; - - const { statements, sqlStatements } = await diffTestSchemasSqlite( - from, - to, - [], - ); - - expect(statements.length).toBe(2); expect(statements[0]).toStrictEqual({ - type: 'recreate_table', - columns: [{ - autoincrement: false, - generated: undefined, - name: 'name', - notNull: true, - primaryKey: false, - type: 'text', - default: "'dan'", - }], - compositePKs: [], - referenceData: [], - tableName: 'table', - uniqueConstraints: [], - }); - expect(statements[1]).toStrictEqual({ - data: 'index_name;name;false;', + columnAutoIncrement: false, + columnName: 'name', + columnNotNull: true, + columnOnUpdate: undefined, + columnPk: false, + newDataType: 'text', + newDefaultValue: "'dan'", schema: '', tableName: 'table', - type: 'create_index', - internal: undefined, + type: 'alter_table_alter_column_set_default', }); - expect(sqlStatements.length).toBe(7); - expect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`); - expect(sqlStatements[1]).toBe(`CREATE TABLE \`__new_table\` ( -\t\`name\` text DEFAULT 'dan' NOT NULL -);\n`); - expect(sqlStatements[2]).toBe( - `INSERT INTO \`__new_table\`("name") SELECT "name" FROM \`table\`;`, - ); - expect(sqlStatements[3]).toBe(`DROP TABLE \`table\`;`); - expect(sqlStatements[4]).toBe(`ALTER TABLE \`__new_table\` RENAME TO \`table\`;`); - expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`); - expect(sqlStatements[6]).toBe(`CREATE INDEX \`index_name\` ON \`table\` (\`name\`);`); }); test('alter column drop default not null', async (t) => { @@ -854,162 +721,30 @@ test('alter column drop default not null', async (t) => { [], ); - expect(statements.length).toBe(1); + expect(statements.length).toBe(2); expect(statements[0]).toStrictEqual({ - type: 'recreate_table', - columns: [{ - autoincrement: false, - generated: undefined, - name: 'name', - notNull: false, - primaryKey: false, - type: 'text', - }], - compositePKs: [], - referenceData: [], + columnAutoIncrement: false, + columnDefault: undefined, + columnName: 'name', + columnNotNull: false, + columnOnUpdate: undefined, + columnPk: false, + newDataType: 'text', + schema: '', tableName: 'table', - uniqueConstraints: [], + type: 'alter_table_alter_column_drop_default', }); - expect(sqlStatements.length).toBe(6); - expect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`); - expect(sqlStatements[1]).toBe(`CREATE TABLE \`__new_table\` ( -\t\`name\` text -);\n`); - expect(sqlStatements[2]).toBe( - `INSERT INTO \`__new_table\`("name") SELECT "name" FROM \`table\`;`, - ); - expect(sqlStatements[3]).toBe(`DROP TABLE \`table\`;`); - expect(sqlStatements[4]).toBe(`ALTER TABLE \`__new_table\` RENAME TO \`table\`;`); - expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`); -}); -test('alter column drop generated', async (t) => { - const from = { - users: sqliteTable('table', { - id: int('id').primaryKey().notNull(), - name: text('name').generatedAlwaysAs('drizzle is the best').notNull(), - }), - }; - - const to = { - users: sqliteTable('table', { - id: int('id').primaryKey().notNull(), - name: text('name').notNull(), - }), - }; - - const { statements, sqlStatements } = await diffTestSchemasSqlite( - from, - to, - [], - ); - - expect(statements.length).toBe(1); expect(statements[0]).toStrictEqual({ columnAutoIncrement: false, columnDefault: undefined, - columnGenerated: undefined, columnName: 'name', - columnNotNull: true, + columnNotNull: false, columnOnUpdate: undefined, columnPk: false, newDataType: 'text', schema: '', tableName: 'table', - type: 'alter_table_alter_column_drop_generated', + type: 'alter_table_alter_column_drop_default', }); - - expect(sqlStatements.length).toBe(2); - expect(sqlStatements[0]).toBe(`ALTER TABLE \`table\` DROP COLUMN \`name\`;`); - expect(sqlStatements[1]).toBe(`ALTER TABLE \`table\` ADD \`name\` text NOT NULL;`); -}); - -test('recreate table with nested references', async (t) => { - let users = sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: true }), - name: text('name'), - age: integer('age'), - }); - let subscriptions = sqliteTable('subscriptions', { - id: int('id').primaryKey({ autoIncrement: true }), - userId: integer('user_id').references(() => users.id), - customerId: text('customer_id'), - }); - const schema1 = { - users: users, - subscriptions: subscriptions, - subscriptionMetadata: sqliteTable('subscriptions_metadata', { - id: int('id').primaryKey({ autoIncrement: true }), - subscriptionId: text('subscription_id').references(() => subscriptions.id), - }), - }; - - users = sqliteTable('users', { - id: int('id').primaryKey({ autoIncrement: false }), - name: text('name'), - age: integer('age'), - }); - const schema2 = { - users: users, - subscriptions: subscriptions, - subscriptionMetadata: sqliteTable('subscriptions_metadata', { - id: int('id').primaryKey({ autoIncrement: true }), - subscriptionId: text('subscription_id').references(() => subscriptions.id), - }), - }; - - const { statements, sqlStatements } = await diffTestSchemasSqlite( - schema1, - schema2, - [], - ); - - expect(statements.length).toBe(1); - expect(statements[0]).toStrictEqual({ - columns: [ - { - autoincrement: false, - generated: undefined, - name: 'id', - notNull: true, - primaryKey: true, - type: 'integer', - }, - { - autoincrement: false, - generated: undefined, - name: 'name', - notNull: false, - primaryKey: false, - type: 'text', - }, - { - autoincrement: false, - generated: undefined, - name: 'age', - notNull: false, - primaryKey: false, - type: 'integer', - }, - ], - compositePKs: [], - referenceData: [], - tableName: 'users', - type: 'recreate_table', - uniqueConstraints: [], - }); - - expect(sqlStatements.length).toBe(6); - expect(sqlStatements[0]).toBe(`PRAGMA foreign_keys=OFF;`); - expect(sqlStatements[1]).toBe(`CREATE TABLE \`__new_users\` ( -\t\`id\` integer PRIMARY KEY NOT NULL, -\t\`name\` text, -\t\`age\` integer -);\n`); - expect(sqlStatements[2]).toBe( - `INSERT INTO \`__new_users\`("id", "name", "age") SELECT "id", "name", "age" FROM \`users\`;`, - ); - expect(sqlStatements[3]).toBe(`DROP TABLE \`users\`;`); - expect(sqlStatements[4]).toBe(`ALTER TABLE \`__new_users\` RENAME TO \`users\`;`); - expect(sqlStatements[5]).toBe(`PRAGMA foreign_keys=ON;`); }); diff --git a/drizzle-kit/tests/sqlite-tables.test.ts b/drizzle-kit/tests/sqlite-tables.test.ts index aa44908ba..d7781f150 100644 --- a/drizzle-kit/tests/sqlite-tables.test.ts +++ b/drizzle-kit/tests/sqlite-tables.test.ts @@ -162,13 +162,6 @@ test('add table #7', async () => { expect(statements.length).toBe(2); expect(statements[0]).toStrictEqual({ - type: 'rename_table', - tableNameFrom: 'users1', - tableNameTo: 'users2', - fromSchema: undefined, - toSchema: undefined, - }); - expect(statements[1]).toStrictEqual({ type: 'sqlite_create_table', tableName: 'users', columns: [], @@ -176,6 +169,13 @@ test('add table #7', async () => { uniqueConstraints: [], referenceData: [], }); + expect(statements[1]).toStrictEqual({ + type: 'rename_table', + tableNameFrom: 'users1', + tableNameTo: 'users2', + fromSchema: undefined, + toSchema: undefined, + }); }); test('add table #8', async () => { diff --git a/drizzle-kit/tests/statements-combiner/libsql-statements-combiner.test.ts b/drizzle-kit/tests/statements-combiner/libsql-statements-combiner.test.ts deleted file mode 100644 index 47447decd..000000000 --- a/drizzle-kit/tests/statements-combiner/libsql-statements-combiner.test.ts +++ /dev/null @@ -1,1749 +0,0 @@ -import { JsonAddColumnStatement, JsonSqliteAddColumnStatement, JsonStatement } from 'src/jsonStatements'; -import { SQLiteSchemaSquashed } from 'src/serializer/sqliteSchema'; -import { SQLiteAlterTableAddColumnConvertor } from 'src/sqlgenerator'; -import { libSQLCombineStatements } from 'src/statementCombiner'; -import { expect, test } from 'vitest'; - -/** - * ! before: - * - * user: { - * id INT; - * first_name INT; - * iq INT; - * PRIMARY KEY (id, iq) - * INDEXES: { - * UNIQUE id; - * } - * } - * - * ! after: - * - * new_user: { - * id INT; - * first_name INT; - * iq INT; - * PRIMARY KEY (id, iq) - * INDEXES: {} - * } - * - * rename table and drop unique index - * expect to get "rename_table" statement and then "recreate_table" - */ -test(`rename table and drop index`, async (t) => { - const statements: JsonStatement[] = [ - { - type: 'rename_table', - fromSchema: '', - toSchema: '', - tableNameFrom: 'user', - tableNameTo: 'new_user', - }, - { - type: 'drop_index', - tableName: 'new_user', - data: 'user_first_name_unique;first_name;true;', - schema: '', - }, - ]; - const json1: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - user: { - name: 'user', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - first_name: { - name: 'first_name', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - iq: { - name: 'iq', - type: 'int', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - }, - indexes: { - user_first_name_unique: 'user_first_name_unique;first_name;true;', - }, - foreignKeys: {}, - compositePrimaryKeys: { - user_id_iq_pk: 'id,iq', - }, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - const json2: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - new_user: { - name: 'new_user', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - first_name: { - name: 'first_name', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - iq: { - name: 'iq', - type: 'int', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: { - new_user_id_iq_pk: 'id,iq', - }, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - - const newJsonStatements = [ - { - type: 'rename_table', - fromSchema: '', - toSchema: '', - tableNameFrom: 'user', - tableNameTo: 'new_user', - }, - { - type: 'drop_index', - tableName: 'new_user', - data: 'user_first_name_unique;first_name;true;', - schema: '', - }, - ]; - expect(libSQLCombineStatements(statements, json2)).toStrictEqual( - newJsonStatements, - ); -}); - -/** - * ! before: - * - * autoincrement1: { - * id INT PRIMARY KEY; - * } - * - * autoincrement2: { - * id INT PRIMARY KEY AUTOINCREMENT; - * } - * - * dropNotNull: { - * id INT NOT NULL; - * } - * - * ! after: - * - * autoincrement1: { - * id INT PRIMARY KEY AUTOINCREMENT; - * } - * - * autoincrement2: { - * id INT PRI { - const statements: JsonStatement[] = [ - { - type: 'alter_table_alter_column_set_autoincrement', - tableName: 'autoincrement1', - columnName: 'id', - schema: '', - newDataType: 'int', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: true, - columnAutoIncrement: true, - columnPk: true, - } as unknown as JsonStatement, - { - type: 'alter_table_alter_column_drop_autoincrement', - tableName: 'autoincrement2', - columnName: 'id', - schema: '', - newDataType: 'int', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: true, - columnAutoIncrement: false, - columnPk: true, - } as unknown as JsonStatement, - { - type: 'alter_table_alter_column_drop_notnull', - tableName: 'dropNotNull', - columnName: 'id', - schema: '', - newDataType: 'int', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - } as unknown as JsonStatement, - ]; - const json1: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - autoincrement1: { - name: 'autoincrement1', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - autoincrement2: { - name: 'autoincrement2', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: true, - notNull: false, - autoincrement: true, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - dropNotNull: { - name: 'dropNotNull', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - const json2: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - autoincrement1: { - name: 'autoincrement1', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: true, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - autoincrement2: { - name: 'autoincrement2', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - dropNotNull: { - name: 'dropNotNull', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - - const newJsonStatements = [ - { - type: 'recreate_table', - tableName: 'autoincrement1', - columns: [ - { - name: 'id', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: true, - }, - ], - compositePKs: [], - referenceData: [], - uniqueConstraints: [], - }, - { - type: 'recreate_table', - tableName: 'autoincrement2', - columns: [ - { - name: 'id', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - ], - compositePKs: [], - referenceData: [], - uniqueConstraints: [], - }, - { - type: 'alter_table_alter_column_drop_notnull', - tableName: 'dropNotNull', - columnName: 'id', - schema: '', - newDataType: 'int', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - }, - ]; - expect(libSQLCombineStatements(statements, json2)).toStrictEqual( - newJsonStatements, - ); -}); - -/** - * ! before: - * - * pk1: { - * id INT; - * } - * - * pk2: { - * id INT PRIMARY KEY; - * } - * - * ref_table: { - * id INT; - * } - * - * create_reference: { - * id INT; - * } - * - * ! after: - * - * pk1: { - * id INT PRIMARY KEY; - * } - * - * pk2: { - * id INT; - * } - * - * ref_table: { - * id INT; - * } - * - * create_reference: { - * id INT -> ref_table INT; - * } - * - * drop primary key for pk2 - * set primary key for pk1 - * "create_reference" reference on "ref_table" - * - * expect to: - * - "recreate_table" statement for pk1 - * - "recreate_table" statement for pk2 - * - "create_reference" statement for create_reference - */ -test(`drop and set primary key. create reference`, async (t) => { - const statements: JsonStatement[] = [ - { - type: 'alter_table_alter_column_set_pk', - tableName: 'pk1', - schema: '', - columnName: 'id', - }, - { - type: 'alter_table_alter_column_set_notnull', - tableName: 'pk1', - columnName: 'id', - schema: '', - newDataType: 'int', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: true, - columnAutoIncrement: false, - columnPk: true, - } as unknown as JsonStatement, - { - type: 'alter_table_alter_column_drop_pk', - tableName: 'pk2', - columnName: 'id', - schema: '', - }, - { - type: 'alter_table_alter_column_drop_notnull', - tableName: 'pk2', - columnName: 'id', - schema: '', - newDataType: 'int', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - } as unknown as JsonStatement, - { - type: 'create_reference', - tableName: 'create_reference', - data: 'create_reference_id_ref_table_id_fk;create_reference;id;ref_table;id;no action;no action', - schema: '', - columnNotNull: false, - columnDefault: undefined, - columnType: 'int', - }, - ]; - const json1: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - create_reference: { - name: 'create_reference', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - pk1: { - name: 'pk1', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - pk2: { - name: 'pk2', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - ref_table: { - name: 'ref_table', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - const json2: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - create_reference: { - name: 'create_reference', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: { - create_reference_id_ref_table_id_fk: - 'create_reference_id_ref_table_id_fk;create_reference;id;ref_table;id;no action;no action', - }, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - pk1: { - name: 'pk1', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - pk2: { - name: 'pk2', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - ref_table: { - name: 'ref_table', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - - const newJsonStatements = [ - { - type: 'recreate_table', - tableName: 'pk1', - columns: [ - { - name: 'id', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - ], - compositePKs: [], - referenceData: [], - uniqueConstraints: [], - }, - { - type: 'recreate_table', - tableName: 'pk2', - columns: [ - { - name: 'id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - ], - compositePKs: [], - referenceData: [], - uniqueConstraints: [], - }, - { - type: 'create_reference', - tableName: 'create_reference', - data: 'create_reference_id_ref_table_id_fk;create_reference;id;ref_table;id;no action;no action', - schema: '', - columnNotNull: false, - columnDefault: undefined, - columnType: 'int', - }, - ]; - expect(libSQLCombineStatements(statements, json2)).toStrictEqual( - newJsonStatements, - ); -}); - -/** - * ! before: - * - * fk1: { - * fk_id INT; - * fk_id1 INT; - * } - * - * fk2: { - * fk2_id INT; -> composite reference on ref_table id INT - * fk2_id1 INT; -> composite reference on ref_table id1 INT - * } - * - * ref_table: { - * id INT; - * id1 INT; - * } - * - * ! after: - * - * fk1: { - * fk_id INT; -> composite reference on ref_table id INT - * fk_id1 INT; -> composite reference on ref_table id1 INT - * } - * - * fk2: { - * fk2_id INT; - * fk2_id1 INT; - * } - * - * ref_table: { - * id INT; - * id1 INT; - * } - * - * set multi column reference for fk1 - * drop multi column reference for fk2 - * - * expect to: - * - "recreate_table" statement for fk1 - * - "recreate_table" statement for fk2 - */ -test(`set and drop multiple columns reference`, async (t) => { - const statements: JsonStatement[] = [ - { - type: 'delete_reference', - tableName: 'fk1', - data: 'fk1_fk_id_fk_id1_ref_table_id_id1_fk;fk1;fk_id,fk_id1;ref_table;id,id1;no action;no action', - schema: '', - isMulticolumn: true, - }, - { - type: 'create_reference', - tableName: 'fk2', - data: 'fk2_fk2_id_fk2_id1_ref_table_id_id1_fk;fk2;fk2_id,fk2_id1;ref_table;id,id1;no action;no action', - schema: '', - isMulticolumn: true, - }, - ]; - const json1: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - fk1: { - name: 'fk1', - columns: { - fk_id: { - name: 'fk_id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - fk_id1: { - name: 'fk_id1', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: { - fk1_fk_id_fk_id1_ref_table_id_id1_fk: - 'fk1_fk_id_fk_id1_ref_table_id_id1_fk;fk1;fk_id,fk_id1;ref_table;id,id1;no action;no action', - }, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - fk2: { - name: 'fk2', - columns: { - fk2_id: { - name: 'fk2_id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - fk2_id1: { - name: 'fk2_id1', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - ref_table: { - name: 'ref_table', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - id1: { - name: 'id1', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - const json2: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - fk1: { - name: 'fk1', - columns: { - fk_id: { - name: 'fk_id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - fk_id1: { - name: 'fk_id1', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - fk2: { - name: 'fk2', - columns: { - fk2_id: { - name: 'fk2_id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - fk2_id1: { - name: 'fk2_id1', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: { - fk2_fk2_id_fk2_id1_ref_table_id_id1_fk: - 'fk2_fk2_id_fk2_id1_ref_table_id_id1_fk;fk2;fk2_id,fk2_id1;ref_table;id,id1;no action;no action', - }, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - ref_table: { - name: 'ref_table', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - id1: { - name: 'id1', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - - const newJsonStatements = [ - { - type: 'recreate_table', - tableName: 'fk1', - columns: [ - { - name: 'fk_id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - { - name: 'fk_id1', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - ], - compositePKs: [], - referenceData: [], - uniqueConstraints: [], - }, - { - type: 'recreate_table', - tableName: 'fk2', - columns: [ - { - name: 'fk2_id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - { - name: 'fk2_id1', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - ], - compositePKs: [], - referenceData: [ - { - name: 'fk2_fk2_id_fk2_id1_ref_table_id_id1_fk', - tableFrom: 'fk2', - tableTo: 'ref_table', - columnsFrom: ['fk2_id', 'fk2_id1'], - columnsTo: ['id', 'id1'], - onDelete: 'no action', - onUpdate: 'no action', - }, - ], - uniqueConstraints: [], - }, - ]; - expect(libSQLCombineStatements(statements, json2)).toStrictEqual( - newJsonStatements, - ); -}); - -/** - * ! before: - * - * pk: { - * pk TEXT PRIMARY KEY; - * } - * - * simple: { - * simple TEXT; - * } - * - * unique: { - * unique INT UNIQUE; - * } - * - * ! after: - * - * pk: { - * pk INT PRIMARY KEY; - * } - * - * simple: { - * simple INT; - * } - * - * unique: { - * unique TEXT UNIQUE; - * } - * - * set new type for primary key column - * set new type for unique column - * set new type for column without pk or unique - * - * expect to: - * - "recreate_table" statement for pk - * - "recreate_table" statement for unique - * - "alter_table_alter_column_set_type" statement for simple - * - "create_index" statement for unique - */ -test(`set new type for primary key, unique and normal column`, async (t) => { - const statements: JsonStatement[] = [ - { - type: 'alter_table_alter_column_set_type', - tableName: 'pk', - columnName: 'pk', - newDataType: 'int', - oldDataType: 'text', - schema: '', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: true, - columnAutoIncrement: false, - columnPk: true, - } as unknown as JsonStatement, - { - type: 'alter_table_alter_column_set_type', - tableName: 'simple', - columnName: 'simple', - newDataType: 'int', - oldDataType: 'text', - schema: '', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - } as unknown as JsonStatement, - { - type: 'alter_table_alter_column_set_type', - tableName: 'unique', - columnName: 'unique', - newDataType: 'text', - oldDataType: 'int', - schema: '', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - } as unknown as JsonStatement, - ]; - const json1: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - pk: { - name: 'pk', - columns: { - pk: { - name: 'pk', - type: 'text', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - simple: { - name: 'simple', - columns: { - simple: { - name: 'simple', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - unique: { - name: 'unique', - columns: { - unique: { - name: 'unique', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: { - unique_unique_unique: 'unique_unique_unique;unique;true;', - }, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - const json2: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - pk: { - name: 'pk', - columns: { - pk: { - name: 'pk', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - simple: { - name: 'simple', - columns: { - simple: { - name: 'simple', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - unique: { - name: 'unique', - columns: { - unique: { - name: 'unique', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: { - unique_unique_unique: 'unique_unique_unique;unique;true;', - }, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - - const newJsonStatements = [ - { - type: 'recreate_table', - tableName: 'pk', - columns: [ - { - name: 'pk', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - ], - compositePKs: [], - referenceData: [], - uniqueConstraints: [], - }, - { - type: 'alter_table_alter_column_set_type', - tableName: 'simple', - columnName: 'simple', - newDataType: 'int', - oldDataType: 'text', - schema: '', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - }, - { - type: 'alter_table_alter_column_set_type', - tableName: 'unique', - columnName: 'unique', - newDataType: 'text', - oldDataType: 'int', - schema: '', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - }, - ]; - expect(libSQLCombineStatements(statements, json2)).toStrictEqual( - newJsonStatements, - ); -}); - -test(`add columns. set fk`, async (t) => { - const statements: JsonStatement[] = [ - { - type: 'sqlite_alter_table_add_column', - tableName: 'ref', - column: { - name: 'test', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - referenceData: undefined, - }, - { - type: 'sqlite_alter_table_add_column', - tableName: 'ref', - column: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - referenceData: undefined, - }, - { - type: 'create_reference', - tableName: 'ref', - data: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action', - schema: '', - columnNotNull: false, - columnDefault: undefined, - columnType: 'integer', - }, - ]; - const json1: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - ref: { - name: 'ref', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - user: { - name: 'user', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - const json2: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - ref: { - name: 'ref', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test: { - name: 'test', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test1: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: { - ref_new_age_user_new_age_fk: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action', - }, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - user: { - name: 'user', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - - const newJsonStatements = [ - { - type: 'sqlite_alter_table_add_column', - tableName: 'ref', - column: { - name: 'test', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - referenceData: undefined, - }, - { - type: 'sqlite_alter_table_add_column', - tableName: 'ref', - column: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - referenceData: undefined, - }, - { - type: 'create_reference', - tableName: 'ref', - data: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action', - schema: '', - columnNotNull: false, - columnDefault: undefined, - columnType: 'integer', - }, - ]; - expect(libSQLCombineStatements(statements, json2)).toStrictEqual( - newJsonStatements, - ); -}); - -test(`add column and fk`, async (t) => { - const statements: JsonStatement[] = [ - { - type: 'sqlite_alter_table_add_column', - tableName: 'ref', - column: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - referenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action', - }, - { - type: 'create_reference', - tableName: 'ref', - data: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action', - schema: '', - columnNotNull: false, - columnDefault: undefined, - columnType: 'integer', - }, - ]; - const json1: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - ref: { - name: 'ref', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test1: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: { - ref_test1_user_new_age_fk: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action', - }, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - user: { - name: 'user', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - const json2: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - ref: { - name: 'ref', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test: { - name: 'test', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test1: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: { - ref_new_age_user_new_age_fk: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action', - }, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - user: { - name: 'user', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - - const newJsonStatements = [ - { - type: 'sqlite_alter_table_add_column', - tableName: 'ref', - column: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - referenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action', - }, - ]; - expect(libSQLCombineStatements(statements, json2)).toStrictEqual( - newJsonStatements, - ); -}); - -test(`add column and fk`, async (t) => { - const statements: JsonStatement[] = [ - { - type: 'sqlite_alter_table_add_column', - tableName: 'ref', - column: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - referenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action', - }, - { - type: 'create_reference', - tableName: 'ref', - data: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action', - schema: '', - columnNotNull: false, - columnDefault: undefined, - columnType: 'integer', - }, - ]; - const json1: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - ref: { - name: 'ref', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test1: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: { - ref_test1_user_new_age_fk: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action', - }, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - user: { - name: 'user', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - const json2: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - ref: { - name: 'ref', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test: { - name: 'test', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test1: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: { - ref_new_age_user_new_age_fk: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action', - }, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - user: { - name: 'user', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - - const newJsonStatements = [ - { - type: 'sqlite_alter_table_add_column', - tableName: 'ref', - column: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - referenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action', - }, - ]; - expect(libSQLCombineStatements(statements, json2)).toStrictEqual( - newJsonStatements, - ); -}); diff --git a/drizzle-kit/tests/statements-combiner/sqlite-statements-combiner.test.ts b/drizzle-kit/tests/statements-combiner/sqlite-statements-combiner.test.ts deleted file mode 100644 index 2fcaf6436..000000000 --- a/drizzle-kit/tests/statements-combiner/sqlite-statements-combiner.test.ts +++ /dev/null @@ -1,1170 +0,0 @@ -import { JsonStatement } from 'src/jsonStatements'; -import { SQLiteSchemaSquashed } from 'src/serializer/sqliteSchema'; -import { sqliteCombineStatements } from 'src/statementCombiner'; -import { expect, test } from 'vitest'; - -test(`renamed column and altered this column type`, async (t) => { - const statements: JsonStatement[] = [ - { - type: 'alter_table_rename_column', - tableName: 'user', - oldColumnName: 'lastName', - newColumnName: 'lastName123', - schema: '', - }, - { - type: 'alter_table_alter_column_set_type', - tableName: 'user', - columnName: 'lastName123', - newDataType: 'int', - oldDataType: 'text', - schema: '', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - columnIsUnique: false, - } as unknown as JsonStatement, - ]; - const json1: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - user: { - name: 'user', - columns: { - firstName: { - name: 'firstName', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - lastName: { - name: 'lastName', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test: { - name: 'test', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - const json2: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - user: { - name: 'user', - columns: { - firstName: { - name: 'firstName', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - lastName: { - name: 'lastName123', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test: { - name: 'test', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - - const newJsonStatements = [ - { - type: 'recreate_table', - tableName: 'user', - columns: [ - { - name: 'firstName', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - { - name: 'lastName123', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - { - name: 'test', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - ], - compositePKs: [], - referenceData: [], - uniqueConstraints: [], - }, - ]; - expect(sqliteCombineStatements(statements, json2)).toStrictEqual( - newJsonStatements, - ); -}); - -test(`renamed column and droped column "test"`, async (t) => { - const statements: JsonStatement[] = [ - { - type: 'alter_table_rename_column', - tableName: 'user', - oldColumnName: 'lastName', - newColumnName: 'lastName123', - schema: '', - }, - { - type: 'alter_table_drop_column', - tableName: 'user', - columnName: 'test', - schema: '', - }, - ]; - const json1: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - user: { - name: 'user', - columns: { - firstName: { - name: 'firstName', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - lastName: { - name: 'lastName', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test: { - name: 'test', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - const json2: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - user: { - name: 'user', - columns: { - firstName: { - name: 'firstName', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - lastName: { - name: 'lastName123', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test: { - name: 'test', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - - const newJsonStatements: JsonStatement[] = [ - { - type: 'alter_table_rename_column', - tableName: 'user', - oldColumnName: 'lastName', - newColumnName: 'lastName123', - schema: '', - }, - { - type: 'alter_table_drop_column', - tableName: 'user', - columnName: 'test', - schema: '', - }, - ]; - expect(sqliteCombineStatements(statements, json2)).toStrictEqual( - newJsonStatements, - ); -}); - -test(`droped column that is part of composite pk`, async (t) => { - const statements: JsonStatement[] = [ - { type: 'delete_composite_pk', tableName: 'user', data: 'id,iq' }, - { - type: 'alter_table_alter_column_set_pk', - tableName: 'user', - schema: '', - columnName: 'id', - }, - { - type: 'alter_table_drop_column', - tableName: 'user', - columnName: 'iq', - schema: '', - }, - ]; - const json1: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - user: { - name: 'user', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - first_nam: { - name: 'first_nam', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - iq: { - name: 'iq', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: { - user_id_iq_pk: 'id,iq', - }, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - const json2: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - user: { - name: 'user', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: true, - notNull: false, - autoincrement: false, - }, - first_nam: { - name: 'first_nam', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - - const newJsonStatements: JsonStatement[] = [ - { - type: 'recreate_table', - tableName: 'user', - columns: [ - { - name: 'id', - type: 'int', - primaryKey: true, - notNull: false, - autoincrement: false, - }, - { - name: 'first_nam', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - ], - compositePKs: [], - referenceData: [], - uniqueConstraints: [], - }, - ]; - expect(sqliteCombineStatements(statements, json2)).toStrictEqual( - newJsonStatements, - ); -}); - -test(`drop column "ref"."name", rename column "ref"."age". dropped primary key "user"."id". Set not null to "user"."iq"`, async (t) => { - const statements: JsonStatement[] = [ - { - type: 'alter_table_rename_column', - tableName: 'ref', - oldColumnName: 'age', - newColumnName: 'age1', - schema: '', - }, - { - type: 'alter_table_alter_column_drop_pk', - tableName: 'user', - columnName: 'id', - schema: '', - }, - { - type: 'alter_table_alter_column_drop_autoincrement', - tableName: 'user', - columnName: 'id', - schema: '', - newDataType: 'int', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - } as unknown as JsonStatement, - { - type: 'alter_table_alter_column_drop_notnull', - tableName: 'user', - columnName: 'id', - schema: '', - newDataType: 'int', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: false, - columnAutoIncrement: false, - columnPk: false, - } as unknown as JsonStatement, - { - type: 'alter_table_alter_column_set_notnull', - tableName: 'user', - columnName: 'iq', - schema: '', - newDataType: 'int', - columnDefault: undefined, - columnOnUpdate: undefined, - columnNotNull: true, - columnAutoIncrement: false, - columnPk: false, - } as unknown as JsonStatement, - { - type: 'alter_table_drop_column', - tableName: 'ref', - columnName: 'text', - schema: '', - }, - ]; - const json1: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - ref: { - name: 'ref', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: true, - }, - user_iq: { - name: 'user_iq', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - name: { - name: 'name', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - age: { - name: 'age', - type: 'int', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: { - ref_user_iq_user_iq_fk: 'ref_user_iq_user_iq_fk;ref;user_iq;user;iq;no action;no action', - }, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - user: { - name: 'user', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: true, - }, - first_name: { - name: 'first_name', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - iq: { - name: 'iq', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - const json2: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - ref: { - name: 'ref', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - user_iq: { - name: 'user_iq', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - age1: { - name: 'age1', - type: 'int', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: { - ref_user_iq_user_iq_fk: 'ref_user_iq_user_iq_fk;ref;user_iq;user;iq;no action;no action', - }, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - user: { - name: 'user', - columns: { - id: { - name: 'id', - type: 'int', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - first_name: { - name: 'first_name', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - iq: { - name: 'iq', - type: 'int', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - - const newJsonStatements: JsonStatement[] = [ - { - type: 'alter_table_rename_column', - tableName: 'ref', - oldColumnName: 'age', - newColumnName: 'age1', - schema: '', - }, - { - type: 'alter_table_drop_column', - tableName: 'ref', - columnName: 'text', - schema: '', - }, - { - type: 'recreate_table', - tableName: 'user', - columns: [ - { - name: 'id', - type: 'int', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - { - name: 'first_name', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - { - name: 'iq', - type: 'int', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - ], - compositePKs: [], - referenceData: [], - uniqueConstraints: [], - }, - ]; - - expect(sqliteCombineStatements(statements, json2)).toStrictEqual( - newJsonStatements, - ); -}); - -test(`create reference on exising column (table includes unique index). expect to recreate column and recreate index`, async (t) => { - const statements: JsonStatement[] = [ - { - type: 'create_reference', - tableName: 'unique', - data: 'unique_ref_pk_pk_pk_fk;unique;ref_pk;pk;pk;no action;no action', - schema: '', - }, - ]; - const json1: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - pk: { - name: 'pk', - columns: { - pk: { - name: 'pk', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - unique: { - name: 'unique', - columns: { - unique: { - name: 'unique', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - ref_pk: { - name: 'ref_pk', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: { - unique_unique_unique: 'unique_unique_unique;unique;true;', - }, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - const json2: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - pk: { - name: 'pk', - columns: { - pk: { - name: 'pk', - type: 'int', - primaryKey: true, - notNull: true, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - unique: { - name: 'unique', - columns: { - unique: { - name: 'unique', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - ref_pk: { - name: 'ref_pk', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: { - unique_unique_unique: 'unique_unique_unique;unique;true;', - }, - foreignKeys: { - unique_ref_pk_pk_pk_fk: 'unique_ref_pk_pk_pk_fk;unique;ref_pk;pk;pk;no action;no action', - }, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - - const newJsonStatements: JsonStatement[] = [ - { - type: 'recreate_table', - tableName: 'unique', - columns: [ - { - name: 'unique', - type: 'text', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - { - name: 'ref_pk', - type: 'int', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - ], - compositePKs: [], - referenceData: [ - { - name: 'unique_ref_pk_pk_pk_fk', - tableFrom: 'unique', - tableTo: 'pk', - columnsFrom: ['ref_pk'], - columnsTo: ['pk'], - onDelete: 'no action', - onUpdate: 'no action', - }, - ], - uniqueConstraints: [], - }, - { - data: 'unique_unique_unique;unique;true;', - internal: undefined, - schema: '', - tableName: 'unique', - type: 'create_index', - }, - ]; - - expect(sqliteCombineStatements(statements, json2)).toStrictEqual( - newJsonStatements, - ); -}); - -test(`add columns. set fk`, async (t) => { - const statements: JsonStatement[] = [ - { - type: 'sqlite_alter_table_add_column', - tableName: 'ref', - column: { - name: 'test', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - referenceData: undefined, - }, - { - type: 'sqlite_alter_table_add_column', - tableName: 'ref', - column: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - referenceData: undefined, - }, - { - type: 'create_reference', - tableName: 'ref', - data: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action', - schema: '', - columnNotNull: false, - columnDefault: undefined, - columnType: 'integer', - }, - ]; - const json1: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - ref: { - name: 'ref', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - user: { - name: 'user', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - const json2: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - ref: { - name: 'ref', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test: { - name: 'test', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test1: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: { - ref_new_age_user_new_age_fk: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action', - }, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - user: { - name: 'user', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - - const newJsonStatements = [ - { - columns: [ - { - autoincrement: false, - name: 'id1', - notNull: true, - primaryKey: false, - type: 'text', - }, - { - autoincrement: false, - name: 'new_age', - notNull: false, - primaryKey: false, - type: 'integer', - }, - { - autoincrement: false, - name: 'test', - notNull: false, - primaryKey: false, - type: 'integer', - }, - { - autoincrement: false, - name: 'test1', - notNull: false, - primaryKey: false, - type: 'integer', - }, - ], - compositePKs: [], - referenceData: [ - { - columnsFrom: [ - 'new_age', - ], - columnsTo: [ - 'new_age', - ], - name: 'ref_new_age_user_new_age_fk', - onDelete: 'no action', - onUpdate: 'no action', - tableFrom: 'ref', - tableTo: 'user', - }, - ], - tableName: 'ref', - type: 'recreate_table', - uniqueConstraints: [], - }, - ]; - expect(sqliteCombineStatements(statements, json2)).toStrictEqual( - newJsonStatements, - ); -}); - -test(`add column and fk`, async (t) => { - const statements: JsonStatement[] = [ - { - type: 'sqlite_alter_table_add_column', - tableName: 'ref', - column: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - referenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action', - }, - { - type: 'create_reference', - tableName: 'ref', - data: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action', - schema: '', - columnNotNull: false, - columnDefault: undefined, - columnType: 'integer', - }, - ]; - const json1: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - ref: { - name: 'ref', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test1: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: { - ref_test1_user_new_age_fk: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action', - }, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - user: { - name: 'user', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - const json2: SQLiteSchemaSquashed = { - version: '6', - dialect: 'sqlite', - tables: { - ref: { - name: 'ref', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test: { - name: 'test', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - test1: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: { - ref_new_age_user_new_age_fk: 'ref_new_age_user_new_age_fk;ref;new_age;user;new_age;no action;no action', - }, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - user: { - name: 'user', - columns: { - id1: { - name: 'id1', - type: 'text', - primaryKey: false, - notNull: true, - autoincrement: false, - }, - new_age: { - name: 'new_age', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - }, - indexes: {}, - foreignKeys: {}, - compositePrimaryKeys: {}, - uniqueConstraints: {}, - }, - }, - enums: {}, - }; - - const newJsonStatements = [ - { - type: 'sqlite_alter_table_add_column', - tableName: 'ref', - column: { - name: 'test1', - type: 'integer', - primaryKey: false, - notNull: false, - autoincrement: false, - }, - referenceData: 'ref_test1_user_new_age_fk;ref;test1;user;new_age;no action;no action', - }, - ]; - expect(sqliteCombineStatements(statements, json2)).toStrictEqual( - newJsonStatements, - ); -}); From 9120a18006d823adee01043481a94b88ace7eb0c Mon Sep 17 00:00:00 2001 From: prodrigues Date: Tue, 1 Oct 2024 22:19:12 +0100 Subject: [PATCH 5/8] lint fix --- drizzle-kit/src/cli/schema.ts | 20 +-- drizzle-kit/src/snapshotsDiffer.ts | 5 +- drizzle-kit/src/sqlgenerator.ts | 3 +- pnpm-lock.yaml | 276 ++++++++++++++++------------- 4 files changed, 169 insertions(+), 135 deletions(-) diff --git a/drizzle-kit/src/cli/schema.ts b/drizzle-kit/src/cli/schema.ts index 7538237a4..d8958f7c1 100644 --- a/drizzle-kit/src/cli/schema.ts +++ b/drizzle-kit/src/cli/schema.ts @@ -26,8 +26,8 @@ import { dialects } from 'src/schemaValidator'; import { assertUnreachable } from '../global'; import { drizzleForSingleStore, prepareSingleStoreSchema, type Setup } from '../serializer/studio'; import { certs } from '../utils/certs'; -import { grey, MigrateProgress } from './views'; import { upSinglestoreHandler } from './commands/singlestoreUp'; +import { grey, MigrateProgress } from './views'; const optionDialect = string('dialect') .enum(...dialects) @@ -320,15 +320,15 @@ export const push = command({ force, ); } else if (dialect === 'singlestore') { - const { singlestorePush } = await import('./commands/push'); - await singlestorePush( - schemaPath, - credentials, - tablesFilter, - strict, - verbose, - force, - ); + const { singlestorePush } = await import('./commands/push'); + await singlestorePush( + schemaPath, + credentials, + tablesFilter, + strict, + verbose, + force, + ); } else { assertUnreachable(dialect); } diff --git a/drizzle-kit/src/snapshotsDiffer.ts b/drizzle-kit/src/snapshotsDiffer.ts index 7ccb13a26..11d126013 100644 --- a/drizzle-kit/src/snapshotsDiffer.ts +++ b/drizzle-kit/src/snapshotsDiffer.ts @@ -1,4 +1,3 @@ - import { any, array, @@ -11,7 +10,7 @@ import { string, TypeOf, union, - ZodTypeAny + ZodTypeAny, } from 'zod'; import { applyJsonDiff, diffColumns, diffSchemasOrTables } from './jsonDiffer'; import { fromJson } from './sqlgenerator'; @@ -57,11 +56,11 @@ import { prepareDeleteCompositePrimaryKeyPg, prepareDeleteCompositePrimaryKeySingleStore, prepareDeleteCompositePrimaryKeySqlite, + prepareDeleteSchemasJson as prepareDropSchemasJson, prepareDeleteUniqueConstraintPg as prepareDeleteUniqueConstraint, prepareDropEnumJson, prepareDropIndexesJson, prepareDropReferencesJson, - prepareDeleteSchemasJson as prepareDropSchemasJson, prepareDropSequenceJson, prepareDropTableJson, prepareMoveEnumJson, diff --git a/drizzle-kit/src/sqlgenerator.ts b/drizzle-kit/src/sqlgenerator.ts index c54ea014a..07b24b6c9 100644 --- a/drizzle-kit/src/sqlgenerator.ts +++ b/drizzle-kit/src/sqlgenerator.ts @@ -48,7 +48,7 @@ import { JsonRenameTableStatement, JsonSqliteAddColumnStatement, JsonSqliteCreateTableStatement, - JsonStatement + JsonStatement, } from './jsonStatements'; import { Dialect } from './schemaValidator'; import { MySqlSquasher } from './serializer/mysqlSchema'; @@ -3092,7 +3092,6 @@ class SingleStoreDropIndexConvertor extends Convertor { } } - const convertors: Convertor[] = []; convertors.push(new PgCreateTableConvertor()); convertors.push(new MySqlCreateTableConvertor()); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ae78961d..7e8189ffe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,7 +45,7 @@ importers: version: link:drizzle-orm/dist drizzle-orm-old: specifier: npm:drizzle-orm@^0.27.2 - version: drizzle-orm@0.27.2(@aws-sdk/client-rds-data@3.583.0)(@cloudflare/workers-types@4.20240524.0)(@libsql/client@0.10.0)(@neondatabase/serverless@0.9.3)(@opentelemetry/api@1.8.0)(@planetscale/database@1.18.0)(@types/better-sqlite3@7.6.10)(@types/pg@8.11.6)(@types/sql.js@1.4.9)(@vercel/postgres@0.8.0)(better-sqlite3@9.6.0)(bun-types@1.0.3)(knex@2.5.1(better-sqlite3@9.6.0)(mysql2@3.11.0)(pg@8.11.5)(sqlite3@5.1.7))(kysely@0.25.0)(mysql2@3.11.0)(pg@8.11.5)(postgres@3.4.4)(sql.js@1.10.3)(sqlite3@5.1.7) + version: drizzle-orm@0.27.2(@aws-sdk/client-rds-data@3.583.0)(@cloudflare/workers-types@4.20240524.0)(@libsql/client@0.10.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@neondatabase/serverless@0.9.3)(@opentelemetry/api@1.8.0)(@planetscale/database@1.18.0)(@types/better-sqlite3@7.6.10)(@types/pg@8.11.6)(@types/sql.js@1.4.9)(@vercel/postgres@0.8.0)(better-sqlite3@9.6.0)(bun-types@1.0.3)(knex@2.5.1(better-sqlite3@9.6.0)(mysql2@3.11.0)(pg@8.11.5)(sqlite3@5.1.7))(kysely@0.25.0)(mysql2@3.11.0)(pg@8.11.5)(postgres@3.4.4)(sql.js@1.10.3)(sqlite3@5.1.7) eslint: specifier: ^8.50.0 version: 8.50.0 @@ -78,7 +78,7 @@ importers: version: 0.8.16(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)) tsup: specifier: ^7.2.0 - version: 7.2.0(postcss@8.4.39)(ts-node@10.9.2(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)))(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)) + version: 7.2.0(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)))(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)) tsx: specifier: ^4.10.5 version: 4.10.5 @@ -123,8 +123,8 @@ importers: specifier: ^0.2.1 version: 0.2.2(hono@4.5.0)(zod@3.23.7) '@libsql/client': - specifier: ^0.10.0 - version: 0.10.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + specifier: ^0.4.2 + version: 0.4.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) '@neondatabase/serverless': specifier: ^0.9.1 version: 0.9.3 @@ -182,9 +182,6 @@ importers: better-sqlite3: specifier: ^9.4.3 version: 9.6.0 - bun-types: - specifier: ^0.6.6 - version: 0.6.14 camelcase: specifier: ^7.0.1 version: 7.0.1 @@ -3084,22 +3081,44 @@ packages: '@libsql/client@0.10.0': resolution: {integrity: sha512-2ERn08T4XOVx34yBtUPq0RDjAdd9TJ5qNH/izugr208ml2F94mk92qC64kXyDVQINodWJvp3kAdq6P4zTtCZ7g==} + '@libsql/client@0.4.3': + resolution: {integrity: sha512-AUYKnSPqAsFBVWBvmtrb4dG3pQlvTKT92eztAest9wQU2iJkabH8WzHLDb3dKFWKql7/kiCqvBQUVpozDwhekQ==} + '@libsql/core@0.10.0': resolution: {integrity: sha512-rqynAXGaiSpTsykOZdBtI1N4z4O+KZ6mt33K/aHeXAY0gSIfK/ctxuWa0Y1Bjo4FMz1idBTCXz4Ps5kITOvZZw==} + '@libsql/core@0.4.3': + resolution: {integrity: sha512-r28iYBtaLBW9RRgXPFh6cGCsVI/rwRlOzSOpAu/1PVTm6EJ3t233pUf97jETVHU0vjdr1d8VvV6fKAvJkokqCw==} + + '@libsql/darwin-arm64@0.2.0': + resolution: {integrity: sha512-+qyT2W/n5CFH1YZWv2mxW4Fsoo4dX9Z9M/nvbQqZ7H84J8hVegvVAsIGYzcK8xAeMEcpU5yGKB1Y9NoDY4hOSQ==} + cpu: [arm64] + os: [darwin] + '@libsql/darwin-arm64@0.4.5': resolution: {integrity: sha512-xLdnn0NrgSk6OMi716FFs/27Hs33jtSd2fkKi/72Ey/qBtPWcB1BMurDQekzi0yAcfQTjGqIz7tpOibyjiEPyQ==} cpu: [arm64] os: [darwin] + '@libsql/darwin-x64@0.2.0': + resolution: {integrity: sha512-hwmO2mF1n8oDHKFrUju6Jv+n9iFtTf5JUK+xlnIE3Td0ZwGC/O1R/Z/btZTd9nD+vsvakC8SJT7/Q6YlWIkhEw==} + cpu: [x64] + os: [darwin] + '@libsql/darwin-x64@0.4.5': resolution: {integrity: sha512-rZsEWj0H7oCqd5Y2pe0RzKmuQXC2OB1RbnFy4CvjeAjT6MP6mFp+Vx9mTCAUuJMhuoSVMsFPUJRpAQznl9E3Tg==} cpu: [x64] os: [darwin] + '@libsql/hrana-client@0.5.6': + resolution: {integrity: sha512-mjQoAmejZ1atG+M3YR2ZW+rg6ceBByH/S/h17ZoYZkqbWrvohFhXyz2LFxj++ARMoY9m6w3RJJIRdJdmnEUlFg==} + '@libsql/hrana-client@0.6.2': resolution: {integrity: sha512-MWxgD7mXLNf9FXXiM0bc90wCjZSpErWKr5mGza7ERy2FJNNMXd7JIOv+DepBA1FQTIfI8TFO4/QDYgaQC0goNw==} + '@libsql/isomorphic-fetch@0.1.12': + resolution: {integrity: sha512-MRo4UcmjAGAa3ac56LoD5OE13m2p0lu0VEtZC2NZMcogM/jc5fU9YtMQ3qbPjFJ+u2BBjFZgMPkQaLS1dlMhpg==} + '@libsql/isomorphic-fetch@0.2.5': resolution: {integrity: sha512-8s/B2TClEHms2yb+JGpsVRTPBfy1ih/Pq6h6gvyaNcYnMVJvgQRY7wAa8U2nD0dppbCuDU5evTNMEhrQ17ZKKg==} engines: {node: '>=18.0.0'} @@ -3107,26 +3126,51 @@ packages: '@libsql/isomorphic-ws@0.1.5': resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} + '@libsql/linux-arm64-gnu@0.2.0': + resolution: {integrity: sha512-1w2lPXIYtnBaK5t/Ej5E8x7lPiE+jP3KATI/W4yei5Z/ONJh7jQW5PJ7sYU95vTME3hWEM1FXN6kvzcpFAte7w==} + cpu: [arm64] + os: [linux] + '@libsql/linux-arm64-gnu@0.4.5': resolution: {integrity: sha512-VR09iu6KWGJ6fauCn59u/jJ9OA+/A2yQ0dr2HDN2zkRueLC6D2oGYt4gPfLZPFKf+WJpVMtIhNfd+Ru9MMaFkA==} cpu: [arm64] os: [linux] + '@libsql/linux-arm64-musl@0.2.0': + resolution: {integrity: sha512-lkblBEJ7xuNiWNjP8DDq0rqoWccszfkUS7Efh5EjJ+GDWdCBVfh08mPofIZg0fZVLWQCY3j+VZCG1qZfATBizg==} + cpu: [arm64] + os: [linux] + '@libsql/linux-arm64-musl@0.4.5': resolution: {integrity: sha512-74hvD5ej4rBshhxFGNYU16a3m8B/NjIPvhlZ/flG1Oeydfo6AuUXSSNFi+H5+zi9/uWuzyz5TLVeQcraoUV10A==} cpu: [arm64] os: [linux] + '@libsql/linux-x64-gnu@0.2.0': + resolution: {integrity: sha512-+x/d289KeJydwOhhqSxKT+6MSQTCfLltzOpTzPccsvdt5fxg8CBi+gfvEJ4/XW23Sa+9bc7zodFP0i6MOlxX7w==} + cpu: [x64] + os: [linux] + '@libsql/linux-x64-gnu@0.4.5': resolution: {integrity: sha512-gb5WObGO3+rbuG8h9font1N02iF+zgYAgY0wNa8BNiZ5A9UolZKFxiqGFS7eHaAYfemHJKKTT+aAt3X2p5TibA==} cpu: [x64] os: [linux] + '@libsql/linux-x64-musl@0.2.0': + resolution: {integrity: sha512-5Xn0c5A6vKf9D1ASpgk7mef//FuY7t5Lktj/eiU4n3ryxG+6WTpqstTittJUgepVjcleLPYxIhQAYeYwTYH1IQ==} + cpu: [x64] + os: [linux] + '@libsql/linux-x64-musl@0.4.5': resolution: {integrity: sha512-JfyE6OVC5X4Nr4cFF77VhB1o+hBRxAqYT9YdeqnWdAQSYc/ASi5HnRALLAQEsGacFPZZ32pixfraQmPE3iJFfw==} cpu: [x64] os: [linux] + '@libsql/win32-x64-msvc@0.2.0': + resolution: {integrity: sha512-rpK+trBIpRST15m3cMYg5aPaX7kvCIottxY7jZPINkKAaScvfbn9yulU/iZUM9YtuK96Y1ZmvwyVIK/Y5DzoMQ==} + cpu: [x64] + os: [win32] + '@libsql/win32-x64-msvc@0.4.5': resolution: {integrity: sha512-57GGurNJhOhq3XIopLdGnCoQ4kQAcmbmzzFoC4tpvDE/KSbwZ/13zqJWhQA41nMGk/PKM1XKfKmbIybKx1+eqA==} cpu: [x64] @@ -4019,6 +4063,9 @@ packages: '@types/minimist@1.2.2': resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + '@types/node-fetch@2.6.11': + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + '@types/node-forge@1.3.11': resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} @@ -7052,9 +7099,13 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + libsql@0.2.0: + resolution: {integrity: sha512-ELBRqhpJx5Dap0187zKQnntZyk4EjlDHSrjIVL8t+fQ5e8IxbQTeYgZgigMjB1EvrETdkm0Y0VxBGhzPQ+t0Jg==} + cpu: [x64, arm64] + os: [darwin, linux, win32] + libsql@0.4.5: resolution: {integrity: sha512-sorTJV6PNt94Wap27Sai5gtVLIea4Otb2LUiAUyr3p6BPOScGMKGt5F1b5X/XgkNtcsDKeX5qfeBDj+PdShclQ==} - cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lighthouse-logger@1.4.2: @@ -10071,7 +10122,7 @@ snapshots: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 '@aws-sdk/client-sso-oidc': 3.569.0 - '@aws-sdk/client-sts': 3.569.0 + '@aws-sdk/client-sts': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0) '@aws-sdk/core': 3.567.0 '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0) '@aws-sdk/middleware-host-header': 3.567.0 @@ -10166,8 +10217,8 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.583.0(@aws-sdk/client-sts@3.583.0) - '@aws-sdk/client-sts': 3.583.0 + '@aws-sdk/client-sso-oidc': 3.583.0 + '@aws-sdk/client-sts': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0) '@aws-sdk/core': 3.582.0 '@aws-sdk/credential-provider-node': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0) '@aws-sdk/middleware-host-header': 3.577.0 @@ -10212,7 +10263,7 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.569.0 + '@aws-sdk/client-sts': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0) '@aws-sdk/core': 3.567.0 '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0) '@aws-sdk/middleware-host-header': 3.567.0 @@ -10253,11 +10304,11 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.583.0(@aws-sdk/client-sts@3.583.0)': + '@aws-sdk/client-sso-oidc@3.583.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.583.0 + '@aws-sdk/client-sts': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0) '@aws-sdk/core': 3.582.0 '@aws-sdk/credential-provider-node': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0) '@aws-sdk/middleware-host-header': 3.577.0 @@ -10296,7 +10347,6 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - - '@aws-sdk/client-sts' - aws-crt '@aws-sdk/client-sso@3.478.0': @@ -10472,58 +10522,13 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.569.0': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.569.0 - '@aws-sdk/core': 3.567.0 - '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0) - '@aws-sdk/middleware-host-header': 3.567.0 - '@aws-sdk/middleware-logger': 3.568.0 - '@aws-sdk/middleware-recursion-detection': 3.567.0 - '@aws-sdk/middleware-user-agent': 3.567.0 - '@aws-sdk/region-config-resolver': 3.567.0 - '@aws-sdk/types': 3.567.0 - '@aws-sdk/util-endpoints': 3.567.0 - '@aws-sdk/util-user-agent-browser': 3.567.0 - '@aws-sdk/util-user-agent-node': 3.568.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.2 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 '@aws-sdk/client-sso-oidc': 3.569.0 '@aws-sdk/core': 3.567.0 - '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) + '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0) '@aws-sdk/middleware-host-header': 3.567.0 '@aws-sdk/middleware-logger': 3.568.0 '@aws-sdk/middleware-recursion-detection': 3.567.0 @@ -10563,11 +10568,11 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/client-sts@3.583.0': + '@aws-sdk/client-sts@3.583.0(@aws-sdk/client-sso-oidc@3.583.0)': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.583.0(@aws-sdk/client-sts@3.583.0) + '@aws-sdk/client-sso-oidc': 3.583.0 '@aws-sdk/core': 3.582.0 '@aws-sdk/credential-provider-node': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0) '@aws-sdk/middleware-host-header': 3.577.0 @@ -10606,6 +10611,7 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' - aws-crt '@aws-sdk/core@3.477.0': @@ -10707,23 +10713,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-ini@3.568.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0))': - dependencies: - '@aws-sdk/client-sts': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0) - '@aws-sdk/credential-provider-env': 3.568.0 - '@aws-sdk/credential-provider-process': 3.568.0 - '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.569.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) - '@aws-sdk/types': 3.567.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - '@aws-sdk/credential-provider-ini@3.568.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0)': dependencies: '@aws-sdk/client-sts': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0) @@ -10747,7 +10736,7 @@ snapshots: '@aws-sdk/credential-provider-env': 3.568.0 '@aws-sdk/credential-provider-process': 3.568.0 '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.583.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) + '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0) '@aws-sdk/types': 3.567.0 '@smithy/credential-provider-imds': 2.3.0 '@smithy/property-provider': 2.2.0 @@ -10760,7 +10749,7 @@ snapshots: '@aws-sdk/credential-provider-ini@3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0)': dependencies: - '@aws-sdk/client-sts': 3.583.0 + '@aws-sdk/client-sts': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0) '@aws-sdk/credential-provider-env': 3.577.0 '@aws-sdk/credential-provider-process': 3.577.0 '@aws-sdk/credential-provider-sso': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0) @@ -10791,25 +10780,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0))': - dependencies: - '@aws-sdk/credential-provider-env': 3.568.0 - '@aws-sdk/credential-provider-http': 3.568.0 - '@aws-sdk/credential-provider-ini': 3.568.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) - '@aws-sdk/credential-provider-process': 3.568.0 - '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.569.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) - '@aws-sdk/types': 3.567.0 - '@smithy/credential-provider-imds': 2.3.0 - '@smithy/property-provider': 2.2.0 - '@smithy/shared-ini-file-loader': 2.4.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt - '@aws-sdk/credential-provider-node@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0)': dependencies: '@aws-sdk/credential-provider-env': 3.568.0 @@ -10836,7 +10806,7 @@ snapshots: '@aws-sdk/credential-provider-ini': 3.568.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) '@aws-sdk/credential-provider-process': 3.568.0 '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.583.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) + '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0) '@aws-sdk/types': 3.567.0 '@smithy/credential-provider-imds': 2.3.0 '@smithy/property-provider': 2.2.0 @@ -10949,17 +10919,9 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.6.2 - '@aws-sdk/credential-provider-web-identity@3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0))': - dependencies: - '@aws-sdk/client-sts': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0) - '@aws-sdk/types': 3.567.0 - '@smithy/property-provider': 2.2.0 - '@smithy/types': 2.12.0 - tslib: 2.6.2 - '@aws-sdk/credential-provider-web-identity@3.568.0(@aws-sdk/client-sts@3.569.0)': dependencies: - '@aws-sdk/client-sts': 3.569.0 + '@aws-sdk/client-sts': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0) '@aws-sdk/types': 3.567.0 '@smithy/property-provider': 2.2.0 '@smithy/types': 2.12.0 @@ -10967,7 +10929,7 @@ snapshots: '@aws-sdk/credential-provider-web-identity@3.577.0(@aws-sdk/client-sts@3.583.0)': dependencies: - '@aws-sdk/client-sts': 3.583.0 + '@aws-sdk/client-sts': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0) '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/types': 3.0.0 @@ -10985,7 +10947,7 @@ snapshots: '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) '@aws-sdk/credential-provider-process': 3.568.0 '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.583.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) + '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0) '@aws-sdk/types': 3.567.0 '@smithy/credential-provider-imds': 2.3.0 '@smithy/property-provider': 2.2.0 @@ -11168,7 +11130,7 @@ snapshots: '@aws-sdk/token-providers@3.568.0(@aws-sdk/client-sso-oidc@3.583.0)': dependencies: - '@aws-sdk/client-sso-oidc': 3.583.0(@aws-sdk/client-sts@3.583.0) + '@aws-sdk/client-sso-oidc': 3.583.0 '@aws-sdk/types': 3.567.0 '@smithy/property-provider': 2.2.0 '@smithy/shared-ini-file-loader': 2.4.0 @@ -11177,7 +11139,7 @@ snapshots: '@aws-sdk/token-providers@3.577.0(@aws-sdk/client-sso-oidc@3.583.0)': dependencies: - '@aws-sdk/client-sso-oidc': 3.583.0(@aws-sdk/client-sts@3.583.0) + '@aws-sdk/client-sso-oidc': 3.583.0 '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/shared-ini-file-loader': 3.0.0 @@ -13298,16 +13260,49 @@ snapshots: - bufferutil - utf-8-validate + '@libsql/client@0.4.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + dependencies: + '@libsql/core': 0.4.3 + '@libsql/hrana-client': 0.5.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + js-base64: 3.7.7 + optionalDependencies: + libsql: 0.2.0 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + '@libsql/core@0.10.0': dependencies: js-base64: 3.7.7 + '@libsql/core@0.4.3': + dependencies: + js-base64: 3.7.7 + + '@libsql/darwin-arm64@0.2.0': + optional: true + '@libsql/darwin-arm64@0.4.5': optional: true + '@libsql/darwin-x64@0.2.0': + optional: true + '@libsql/darwin-x64@0.4.5': optional: true + '@libsql/hrana-client@0.5.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + dependencies: + '@libsql/isomorphic-fetch': 0.1.12(encoding@0.1.13) + '@libsql/isomorphic-ws': 0.1.5(bufferutil@4.0.8)(utf-8-validate@6.0.3) + js-base64: 3.7.7 + node-fetch: 3.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + '@libsql/hrana-client@0.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.3)': dependencies: '@libsql/isomorphic-fetch': 0.2.5 @@ -13318,6 +13313,13 @@ snapshots: - bufferutil - utf-8-validate + '@libsql/isomorphic-fetch@0.1.12(encoding@0.1.13)': + dependencies: + '@types/node-fetch': 2.6.11 + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + '@libsql/isomorphic-fetch@0.2.5': {} '@libsql/isomorphic-ws@0.1.5(bufferutil@4.0.8)(utf-8-validate@6.0.3)': @@ -13328,18 +13330,33 @@ snapshots: - bufferutil - utf-8-validate + '@libsql/linux-arm64-gnu@0.2.0': + optional: true + '@libsql/linux-arm64-gnu@0.4.5': optional: true + '@libsql/linux-arm64-musl@0.2.0': + optional: true + '@libsql/linux-arm64-musl@0.4.5': optional: true + '@libsql/linux-x64-gnu@0.2.0': + optional: true + '@libsql/linux-x64-gnu@0.4.5': optional: true + '@libsql/linux-x64-musl@0.2.0': + optional: true + '@libsql/linux-x64-musl@0.4.5': optional: true + '@libsql/win32-x64-msvc@0.2.0': + optional: true + '@libsql/win32-x64-msvc@0.4.5': optional: true @@ -14600,6 +14617,11 @@ snapshots: '@types/minimist@1.2.2': {} + '@types/node-fetch@2.6.11': + dependencies: + '@types/node': 20.12.12 + form-data: 4.0.0 + '@types/node-forge@1.3.11': dependencies: '@types/node': 20.12.12 @@ -15035,7 +15057,7 @@ snapshots: pathe: 1.1.2 picocolors: 1.0.1 sirv: 2.0.4 - vitest: 1.6.0(@types/node@20.12.12)(@vitest/ui@1.6.0)(lightningcss@1.25.1)(terser@5.31.0) + vitest: 1.6.0(@types/node@18.19.33)(@vitest/ui@1.6.0)(lightningcss@1.25.1)(terser@5.31.0) '@vitest/utils@1.6.0': dependencies: @@ -16224,7 +16246,7 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.27.2(@aws-sdk/client-rds-data@3.583.0)(@cloudflare/workers-types@4.20240524.0)(@libsql/client@0.10.0)(@neondatabase/serverless@0.9.3)(@opentelemetry/api@1.8.0)(@planetscale/database@1.18.0)(@types/better-sqlite3@7.6.10)(@types/pg@8.11.6)(@types/sql.js@1.4.9)(@vercel/postgres@0.8.0)(better-sqlite3@9.6.0)(bun-types@1.0.3)(knex@2.5.1(better-sqlite3@9.6.0)(mysql2@3.11.0)(pg@8.11.5)(sqlite3@5.1.7))(kysely@0.25.0)(mysql2@3.11.0)(pg@8.11.5)(postgres@3.4.4)(sql.js@1.10.3)(sqlite3@5.1.7): + drizzle-orm@0.27.2(@aws-sdk/client-rds-data@3.583.0)(@cloudflare/workers-types@4.20240524.0)(@libsql/client@0.10.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@neondatabase/serverless@0.9.3)(@opentelemetry/api@1.8.0)(@planetscale/database@1.18.0)(@types/better-sqlite3@7.6.10)(@types/pg@8.11.6)(@types/sql.js@1.4.9)(@vercel/postgres@0.8.0)(better-sqlite3@9.6.0)(bun-types@1.0.3)(knex@2.5.1(better-sqlite3@9.6.0)(mysql2@3.11.0)(pg@8.11.5)(sqlite3@5.1.7))(kysely@0.25.0)(mysql2@3.11.0)(pg@8.11.5)(postgres@3.4.4)(sql.js@1.10.3)(sqlite3@5.1.7): optionalDependencies: '@aws-sdk/client-rds-data': 3.583.0 '@cloudflare/workers-types': 4.20240524.0 @@ -18265,6 +18287,20 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + libsql@0.2.0: + dependencies: + '@neon-rs/load': 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + '@libsql/darwin-arm64': 0.2.0 + '@libsql/darwin-x64': 0.2.0 + '@libsql/linux-arm64-gnu': 0.2.0 + '@libsql/linux-arm64-musl': 0.2.0 + '@libsql/linux-x64-gnu': 0.2.0 + '@libsql/linux-x64-musl': 0.2.0 + '@libsql/win32-x64-msvc': 0.2.0 + optional: true + libsql@0.4.5: dependencies: '@neon-rs/load': 0.0.4 @@ -19424,7 +19460,7 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-load-config@4.0.1(postcss@8.4.39)(ts-node@10.9.2(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme))): + postcss-load-config@4.0.1(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme))): dependencies: lilconfig: 2.1.0 yaml: 2.3.1 @@ -20685,7 +20721,7 @@ snapshots: tslib@2.6.2: {} - tsup@7.2.0(postcss@8.4.39)(ts-node@10.9.2(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)))(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)): + tsup@7.2.0(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)))(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)): dependencies: bundle-require: 4.0.2(esbuild@0.18.20) cac: 6.7.14 @@ -20695,7 +20731,7 @@ snapshots: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.1(postcss@8.4.39)(ts-node@10.9.2(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme))) + postcss-load-config: 4.0.1(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme))) resolve-from: 5.0.0 rollup: 3.27.2 source-map: 0.8.0-beta.0 From 4882ce73b09ccac47aa2ca54341957de2b08e76a Mon Sep 17 00:00:00 2001 From: prodrigues Date: Tue, 1 Oct 2024 22:21:24 +0100 Subject: [PATCH 6/8] remove unecessary readme.md --- changelogs/drizzle-kit/0.25.0.md | 144 ----------------- changelogs/drizzle-orm/0.34.0.md | 255 ------------------------------- 2 files changed, 399 deletions(-) delete mode 100644 changelogs/drizzle-kit/0.25.0.md delete mode 100644 changelogs/drizzle-orm/0.34.0.md diff --git a/changelogs/drizzle-kit/0.25.0.md b/changelogs/drizzle-kit/0.25.0.md deleted file mode 100644 index fc4b36c83..000000000 --- a/changelogs/drizzle-kit/0.25.0.md +++ /dev/null @@ -1,144 +0,0 @@ -## Breaking changes and migrate guide for Turso users - -If you are using Turso and libsql, you will need to upgrade your `drizzle.config` and `@libsql/client` package. - -1. This version of drizzle-orm will only work with `@libsql/client@0.10.0` or higher if you are using the `migrate` function. For other use cases, you can continue using previous versions(But the suggestion is to upgrade) -To install the latest version, use the command: - -```bash -npm i @libsql/client@latest -``` - -2. Previously, we had a common `drizzle.config` for SQLite and Turso users, which allowed a shared strategy for both dialects. Starting with this release, we are introducing the turso dialect in drizzle-kit. We will evolve and improve Turso as a separate dialect with its own migration strategies. - -**Before** - -```ts -import { defineConfig } from "drizzle-kit"; - -export default defineConfig({ - dialect: "sqlite", - schema: "./schema.ts", - out: "./drizzle", - dbCredentials: { - url: "database.db", - }, - breakpoints: true, - verbose: true, - strict: true, -}); -``` - -**After** - -```ts -import { defineConfig } from "drizzle-kit"; - -export default defineConfig({ - dialect: "turso", - schema: "./schema.ts", - out: "./drizzle", - dbCredentials: { - url: "database.db", - }, - breakpoints: true, - verbose: true, - strict: true, -}); -``` - -If you are using only SQLite, you can use `dialect: "sqlite"` - -## LibSQL/Turso and Sqlite migration updates - -### SQLite "generate" and "push" statements updates - -Starting from this release, we will no longer generate comments like this: - -```sql - '/*\n SQLite does not support "Changing existing column type" out of the box, we do not generate automatic migration for that, so it has to be done manually' - + '\n Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php' - + '\n https://www.sqlite.org/lang_altertable.html' - + '\n https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3' - + "\n\n Due to that we don't generate migration automatically and it has to be done manually" - + '\n*/' -``` - -We will generate a set of statements, and you can decide if it's appropriate to create data-moving statements instead. Here is an example of the SQL file you'll receive now: - -```sql -PRAGMA foreign_keys=OFF; ---> statement-breakpoint -CREATE TABLE `__new_worker` ( - `id` integer PRIMARY KEY NOT NULL, - `name` text NOT NULL, - `salary` text NOT NULL, - `job_id` integer, - FOREIGN KEY (`job_id`) REFERENCES `job`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -INSERT INTO `__new_worker`("id", "name", "salary", "job_id") SELECT "id", "name", "salary", "job_id" FROM `worker`; ---> statement-breakpoint -DROP TABLE `worker`; ---> statement-breakpoint -ALTER TABLE `__new_worker` RENAME TO `worker`; ---> statement-breakpoint -PRAGMA foreign_keys=ON; -``` - -### LibSQL/Turso "generate" and "push" statements updates - -Since LibSQL supports more ALTER statements than SQLite, we can generate more statements without recreating your schema and moving all the data, which can be potentially dangerous for production environments. - -LibSQL and Turso will now have a separate dialect in the Drizzle config file, meaning that we will evolve Turso and LibSQL independently from SQLite and will aim to support as many features as Turso/LibSQL offer. - -With the updated LibSQL migration strategy, you will have the ability to: - -- **Change Data Type**: Set a new data type for existing columns. -- **Set and Drop Default Values**: Add or remove default values for existing columns. -- **Set and Drop NOT NULL**: Add or remove the NOT NULL constraint on existing columns. -- **Add References to Existing Columns**: Add foreign key references to existing columns - -You can find more information in the [LibSQL documentation](https://github.com/tursodatabase/libsql/blob/main/libsql-sqlite3/doc/libsql_extensions.md#altering-columns) - -### LIMITATIONS - -- Dropping or altering an index will cause table recreation. - -This is because LibSQL/Turso does not support dropping this type of index. - -```sql -CREATE TABLE `users` ( - `id` integer NOT NULL, - `name` integer, - `age` integer PRIMARY KEY NOT NULL - FOREIGN KEY (`name`) REFERENCES `users1`("id") ON UPDATE no action ON DELETE no action -); -``` - -- If the table has indexes, altering columns will cause table recreation. -- Drizzle-Kit will drop the indexes, modify the columns, and then recreate the indexes. -- Adding or dropping composite foreign keys is not supported and will cause table recreation - -### NOTES - -- You can create a reference on any column type, but if you want to insert values, the referenced column must have a unique index or primary key. - -```sql -CREATE TABLE parent(a PRIMARY KEY, b UNIQUE, c, d, e, f); -CREATE UNIQUE INDEX i1 ON parent(c, d); -CREATE INDEX i2 ON parent(e); -CREATE UNIQUE INDEX i3 ON parent(f COLLATE nocase); - -CREATE TABLE child1(f, g REFERENCES parent(a)); -- Ok -CREATE TABLE child2(h, i REFERENCES parent(b)); -- Ok -CREATE TABLE child3(j, k, FOREIGN KEY(j, k) REFERENCES parent(c, d)); -- Ok -CREATE TABLE child4(l, m REFERENCES parent(e)); -- Error! -CREATE TABLE child5(n, o REFERENCES parent(f)); -- Error! -CREATE TABLE child6(p, q, FOREIGN KEY(p, q) REFERENCES parent(b, c)); -- Error! -CREATE TABLE child7(r REFERENCES parent(c)); -- Error! -``` - -> **NOTE**: The foreign key for the table child5 is an error because, although the parent key column has a unique index, the index uses a different collating sequence. - -See more: https://www.sqlite.org/foreignkeys.html \ No newline at end of file diff --git a/changelogs/drizzle-orm/0.34.0.md b/changelogs/drizzle-orm/0.34.0.md deleted file mode 100644 index 490422628..000000000 --- a/changelogs/drizzle-orm/0.34.0.md +++ /dev/null @@ -1,255 +0,0 @@ -## Breaking changes and migrate guide for Turso users - -If you are using Turso and libsql, you will need to upgrade your `drizzle.config` and `@libsql/client` package. - -1. This version of drizzle-orm will only work with `@libsql/client@0.10.0` or higher if you are using the `migrate` function. For other use cases, you can continue using previous versions(But the suggestion is to upgrade) -To install the latest version, use the command: - -```bash -npm i @libsql/client@latest -``` - -2. Previously, we had a common `drizzle.config` for SQLite and Turso users, which allowed a shared strategy for both dialects. Starting with this release, we are introducing the turso dialect in drizzle-kit. We will evolve and improve Turso as a separate dialect with its own migration strategies. - -**Before** - -```ts -import { defineConfig } from "drizzle-kit"; - -export default defineConfig({ - dialect: "sqlite", - schema: "./schema.ts", - out: "./drizzle", - dbCredentials: { - url: "database.db", - }, - breakpoints: true, - verbose: true, - strict: true, -}); -``` - -**After** - -```ts -import { defineConfig } from "drizzle-kit"; - -export default defineConfig({ - dialect: "turso", - schema: "./schema.ts", - out: "./drizzle", - dbCredentials: { - url: "database.db", - }, - breakpoints: true, - verbose: true, - strict: true, -}); -``` - -If you are using only SQLite, you can use `dialect: "sqlite"` - -## LibSQL/Turso and Sqlite migration updates - -### SQLite "generate" and "push" statements updates - -Starting from this release, we will no longer generate comments like this: - -```sql - '/*\n SQLite does not support "Changing existing column type" out of the box, we do not generate automatic migration for that, so it has to be done manually' - + '\n Please refer to: https://www.techonthenet.com/sqlite/tables/alter_table.php' - + '\n https://www.sqlite.org/lang_altertable.html' - + '\n https://stackoverflow.com/questions/2083543/modify-a-columns-type-in-sqlite3' - + "\n\n Due to that we don't generate migration automatically and it has to be done manually" - + '\n*/' -``` - -We will generate a set of statements, and you can decide if it's appropriate to create data-moving statements instead. Here is an example of the SQL file you'll receive now: - -```sql -PRAGMA foreign_keys=OFF; ---> statement-breakpoint -CREATE TABLE `__new_worker` ( - `id` integer PRIMARY KEY NOT NULL, - `name` text NOT NULL, - `salary` text NOT NULL, - `job_id` integer, - FOREIGN KEY (`job_id`) REFERENCES `job`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -INSERT INTO `__new_worker`("id", "name", "salary", "job_id") SELECT "id", "name", "salary", "job_id" FROM `worker`; ---> statement-breakpoint -DROP TABLE `worker`; ---> statement-breakpoint -ALTER TABLE `__new_worker` RENAME TO `worker`; ---> statement-breakpoint -PRAGMA foreign_keys=ON; -``` - -### LibSQL/Turso "generate" and "push" statements updates - -Since LibSQL supports more ALTER statements than SQLite, we can generate more statements without recreating your schema and moving all the data, which can be potentially dangerous for production environments. - -LibSQL and Turso will now have a separate dialect in the Drizzle config file, meaning that we will evolve Turso and LibSQL independently from SQLite and will aim to support as many features as Turso/LibSQL offer. - -With the updated LibSQL migration strategy, you will have the ability to: - -- **Change Data Type**: Set a new data type for existing columns. -- **Set and Drop Default Values**: Add or remove default values for existing columns. -- **Set and Drop NOT NULL**: Add or remove the NOT NULL constraint on existing columns. -- **Add References to Existing Columns**: Add foreign key references to existing columns - -You can find more information in the [LibSQL documentation](https://github.com/tursodatabase/libsql/blob/main/libsql-sqlite3/doc/libsql_extensions.md#altering-columns) - -### LIMITATIONS - -- Dropping or altering an index will cause table recreation. - -This is because LibSQL/Turso does not support dropping this type of index. - -```sql -CREATE TABLE `users` ( - `id` integer NOT NULL, - `name` integer, - `age` integer PRIMARY KEY NOT NULL - FOREIGN KEY (`name`) REFERENCES `users1`("id") ON UPDATE no action ON DELETE no action -); -``` - -- If the table has indexes, altering columns will cause table recreation. -- Drizzle-Kit will drop the indexes, modify the columns, and then recreate the indexes. -- Adding or dropping composite foreign keys is not supported and will cause table recreation - -### NOTES - -- You can create a reference on any column type, but if you want to insert values, the referenced column must have a unique index or primary key. - -```sql -CREATE TABLE parent(a PRIMARY KEY, b UNIQUE, c, d, e, f); -CREATE UNIQUE INDEX i1 ON parent(c, d); -CREATE INDEX i2 ON parent(e); -CREATE UNIQUE INDEX i3 ON parent(f COLLATE nocase); - -CREATE TABLE child1(f, g REFERENCES parent(a)); -- Ok -CREATE TABLE child2(h, i REFERENCES parent(b)); -- Ok -CREATE TABLE child3(j, k, FOREIGN KEY(j, k) REFERENCES parent(c, d)); -- Ok -CREATE TABLE child4(l, m REFERENCES parent(e)); -- Error! -CREATE TABLE child5(n, o REFERENCES parent(f)); -- Error! -CREATE TABLE child6(p, q, FOREIGN KEY(p, q) REFERENCES parent(b, c)); -- Error! -CREATE TABLE child7(r REFERENCES parent(c)); -- Error! -``` - -> **NOTE**: The foreign key for the table child5 is an error because, although the parent key column has a unique index, the index uses a different collating sequence. - -See more: https://www.sqlite.org/foreignkeys.html - -## A new and easy way to start using drizzle - -Current and the only way to do, is to define client yourself and pass it to drizzle - -```ts -const client = new Pool({ url: '' }); -drizzle(client, { logger: true }); -``` - -But we want to introduce you to a new API, which is a simplified method in addition to the existing one. - -Most clients will have a few options to connect, starting with the easiest and most common one, and allowing you to control your client connection as needed. - -Let's use `node-postgres` as an example, but the same pattern can be applied to all other clients - -```ts -// Finally, one import for all available clients and dialects! -import { drizzle } from 'drizzle-orm' - -// Choose a client and use a connection URL — nothing else is needed! -const db1 = await drizzle("node-postgres", process.env.POSTGRES_URL); - -// If you need to pass a logger, schema, or other configurations, you can use an object and specify the client-specific URL in the connection -const db2 = await drizzle("node-postgres", { - connection: process.env.POSTGRES_URL, - logger: true -}); - -// And finally, if you need to use full client/driver-specific types in connections, you can use a URL or host/port/etc. as an object inferred from the underlying client connection types -const db3 = await drizzle("node-postgres", { - connection: { - connectionString: process.env.POSTGRES_URL, - }, -}); - -const db4 = await drizzle("node-postgres", { - connection: { - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - host: process.env.DB_HOST, - port: process.env.DB_PORT, - database: process.env.DB_NAME, - ssl: true, - }, -}); -``` - -A few clients will have a slightly different API due to their specific behavior. Let's take a look at them: - -For `aws-data-api-pg`, Drizzle will require `resourceArn`, `database`, and `secretArn`, along with any other AWS Data API client types for the connection, such as credentials, region, etc. - -```ts -drizzle("aws-data-api-pg", { - connection: { - resourceArn: "", - database: "", - secretArn: "", - }, -}); -``` - -For `d1`, the Cloudflare Worker types as described in the [documentation](https://developers.cloudflare.com/d1/get-started/) here will be required. - -```ts -drizzle("d1", { - connection: env.DB // Cloudflare Worker Types -}) -``` - -For `vercel-postgres`, nothing is needed since Vercel automatically retrieves the `POSTGRES_URL` from the `.env` file. You can check this [documentation](https://vercel.com/docs/storage/vercel-postgres/quickstart) for more info - -```ts -drizzle("vercel-postgres") -``` - -> Note that the first example with the client is still available and not deprecated. You can use it if you don't want to await the drizzle object. The new way of defining drizzle is designed to make it easier to import from one place and get autocomplete for all the available clients - -## New "count" API - -Befor this release to count entities in a table, you would need to do this: - -```ts -const res = await db.select({ count: sql`count(*)` }).from(users); -const count = res[0].count; -``` - -The new API will look like this: - -```ts -// how many users are in the database -const count: number = await db.$count(users); - -// how many users with the name "Dan" are in the database -const count: number = await db.$count(users, eq(name, "Dan")); -``` - -This can also work as a subquery and within relational queries - -```ts -const users = await db.select({ - ...users, - postsCount: db.$count(posts, eq(posts.authorId, users.id)) -}); - -const users = await db.query.users.findMany({ - extras: { - postsCount: db.$count(posts, eq(posts.authorId, users.id)) - } -}) -``` From d01d4e4288a481384a54178d29179b73b66f70e0 Mon Sep 17 00:00:00 2001 From: prodrigues Date: Tue, 1 Oct 2024 22:58:12 +0100 Subject: [PATCH 7/8] lint fix --- drizzle-kit/src/cli/schema.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/drizzle-kit/src/cli/schema.ts b/drizzle-kit/src/cli/schema.ts index d8958f7c1..256ee6ffd 100644 --- a/drizzle-kit/src/cli/schema.ts +++ b/drizzle-kit/src/cli/schema.ts @@ -1,11 +1,19 @@ +import { boolean, command, number, string } from '@drizzle-team/brocli'; import chalk from 'chalk'; -import { checkHandler } from './commands/check'; -import { assertOrmCoreVersion, assertPackages, assertStudioNodeVersion, ormVersionGt } from './utils'; +import 'dotenv/config'; +import { mkdirSync } from 'fs'; +import { renderWithTask } from 'hanji'; +import { dialects } from 'src/schemaValidator'; import '../@types/utils'; +import { assertUnreachable } from '../global'; +import { type Setup } from '../serializer/studio'; import { assertV1OutFolder } from '../utils'; +import { certs } from '../utils/certs'; +import { checkHandler } from './commands/check'; import { dropMigration } from './commands/drop'; import { upMysqlHandler } from './commands/mysqlUp'; import { upPgHandler } from './commands/pgUp'; +import { upSinglestoreHandler } from './commands/singlestoreUp'; import { upSqliteHandler } from './commands/sqliteUp'; import { prepareCheckParams, @@ -16,17 +24,9 @@ import { preparePushConfig, prepareStudioConfig, } from './commands/utils'; +import { assertOrmCoreVersion, assertPackages, assertStudioNodeVersion, ormVersionGt } from './utils'; import { assertCollisions, drivers, prefixes } from './validations/common'; import { withStyle } from './validations/outputs'; -import 'dotenv/config'; -import { boolean, command, number, string } from '@drizzle-team/brocli'; -import { mkdirSync } from 'fs'; -import { renderWithTask } from 'hanji'; -import { dialects } from 'src/schemaValidator'; -import { assertUnreachable } from '../global'; -import { drizzleForSingleStore, prepareSingleStoreSchema, type Setup } from '../serializer/studio'; -import { certs } from '../utils/certs'; -import { upSinglestoreHandler } from './commands/singlestoreUp'; import { grey, MigrateProgress } from './views'; const optionDialect = string('dialect') From 4447f14468853f9904f95937ab05f9a4c2ba40e2 Mon Sep 17 00:00:00 2001 From: prodrigues Date: Tue, 1 Oct 2024 23:04:41 +0100 Subject: [PATCH 8/8] integration-tests cleaning --- integration-tests/package.json | 3 +- integration-tests/tests/mysql/mysql-common.ts | 244 +---------- integration-tests/tests/pg/awsdatapi.test.ts | 14 +- integration-tests/tests/pg/neon-http.test.ts | 14 +- integration-tests/tests/pg/pg-common.ts | 216 +--------- integration-tests/tests/pg/vercel-pg.test.ts | 14 +- .../tests/sqlite/sqlite-common.ts | 208 --------- integration-tests/vitest.config.ts | 1 + pnpm-lock.yaml | 403 ++++++++++-------- 9 files changed, 278 insertions(+), 839 deletions(-) diff --git a/integration-tests/package.json b/integration-tests/package.json index 92df0dc8f..a4fcab0b2 100644 --- a/integration-tests/package.json +++ b/integration-tests/package.json @@ -15,7 +15,6 @@ "license": "Apache-2.0", "private": true, "devDependencies": { - "@libsql/client": "^0.10.0", "@neondatabase/serverless": "0.9.0", "@originjs/vite-plugin-commonjs": "^1.0.3", "@paralleldrive/cuid2": "^2.2.2", @@ -42,7 +41,7 @@ "@aws-sdk/client-rds-data": "^3.549.0", "@aws-sdk/credential-providers": "^3.549.0", "@electric-sql/pglite": "^0.1.1", - "@libsql/client": "^0.10.0", + "@libsql/client": "^0.5.6", "@miniflare/d1": "^2.14.2", "@miniflare/shared": "^2.14.2", "@planetscale/database": "^1.16.0", diff --git a/integration-tests/tests/mysql/mysql-common.ts b/integration-tests/tests/mysql/mysql-common.ts index 8a2fb768b..58f7a1e2c 100644 --- a/integration-tests/tests/mysql/mysql-common.ts +++ b/integration-tests/tests/mysql/mysql-common.ts @@ -3577,237 +3577,29 @@ export function tests(driver?: string) { await db.execute(sql`drop view ${newYorkers1}`); }); + }); - test('$count separate', async (ctx) => { - const { db } = ctx.mysql; - - const countTestTable = mysqlTable('count_test', { - id: int('id').notNull(), - name: text('name').notNull(), - }); - - await db.execute(sql`drop table if exists ${countTestTable}`); - await db.execute(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = await db.$count(countTestTable); - - await db.execute(sql`drop table ${countTestTable}`); - - expect(count).toStrictEqual(4); - }); - - test('$count embedded', async (ctx) => { - const { db } = ctx.mysql; - - const countTestTable = mysqlTable('count_test', { - id: int('id').notNull(), - name: text('name').notNull(), - }); - - await db.execute(sql`drop table if exists ${countTestTable}`); - await db.execute(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = await db.select({ - count: db.$count(countTestTable), - }).from(countTestTable); - - await db.execute(sql`drop table ${countTestTable}`); - - expect(count).toStrictEqual([ - { count: 4 }, - { count: 4 }, - { count: 4 }, - { count: 4 }, - ]); - }); - - test('$count separate reuse', async (ctx) => { - const { db } = ctx.mysql; - - const countTestTable = mysqlTable('count_test', { - id: int('id').notNull(), - name: text('name').notNull(), - }); - - await db.execute(sql`drop table if exists ${countTestTable}`); - await db.execute(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = db.$count(countTestTable); - - const count1 = await count; - - await db.insert(countTestTable).values({ id: 5, name: 'fifth' }); - - const count2 = await count; - - await db.insert(countTestTable).values({ id: 6, name: 'sixth' }); - - const count3 = await count; - - await db.execute(sql`drop table ${countTestTable}`); - - expect(count1).toStrictEqual(4); - expect(count2).toStrictEqual(5); - expect(count3).toStrictEqual(6); - }); - - test('$count embedded reuse', async (ctx) => { - const { db } = ctx.mysql; - - const countTestTable = mysqlTable('count_test', { - id: int('id').notNull(), - name: text('name').notNull(), - }); - - await db.execute(sql`drop table if exists ${countTestTable}`); - await db.execute(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = db.select({ - count: db.$count(countTestTable), - }).from(countTestTable); - - const count1 = await count; - - await db.insert(countTestTable).values({ id: 5, name: 'fifth' }); - - const count2 = await count; - - await db.insert(countTestTable).values({ id: 6, name: 'sixth' }); - - const count3 = await count; - - await db.execute(sql`drop table ${countTestTable}`); - - expect(count1).toStrictEqual([ - { count: 4 }, - { count: 4 }, - { count: 4 }, - { count: 4 }, - ]); - expect(count2).toStrictEqual([ - { count: 5 }, - { count: 5 }, - { count: 5 }, - { count: 5 }, - { count: 5 }, - ]); - expect(count3).toStrictEqual([ - { count: 6 }, - { count: 6 }, - { count: 6 }, - { count: 6 }, - { count: 6 }, - { count: 6 }, - ]); - }); - - test('$count separate with filters', async (ctx) => { - const { db } = ctx.mysql; - - const countTestTable = mysqlTable('count_test', { - id: int('id').notNull(), - name: text('name').notNull(), - }); - - await db.execute(sql`drop table if exists ${countTestTable}`); - await db.execute(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = await db.$count(countTestTable, gt(countTestTable.id, 1)); - - await db.execute(sql`drop table ${countTestTable}`); - - expect(count).toStrictEqual(3); - }); - - test('$count embedded with filters', async (ctx) => { - const { db } = ctx.mysql; - - const countTestTable = mysqlTable('count_test', { - id: int('id').notNull(), - name: text('name').notNull(), - }); - - await db.execute(sql`drop table if exists ${countTestTable}`); - await db.execute(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = await db.select({ - count: db.$count(countTestTable, gt(countTestTable.id, 1)), - }).from(countTestTable); - - await db.execute(sql`drop table ${countTestTable}`); - - expect(count).toStrictEqual([ - { count: 3 }, - { count: 3 }, - { count: 3 }, - { count: 3 }, - ]); - }); - - test('limit 0', async (ctx) => { - const { db } = ctx.mysql; + test('limit 0', async (ctx) => { + const { db } = ctx.mysql; - await db.insert(usersTable).values({ name: 'John' }); - const users = await db - .select() - .from(usersTable) - .limit(0); + await db.insert(usersTable).values({ name: 'John' }); + const users = await db + .select() + .from(usersTable) + .limit(0); - expect(users).toEqual([]); - }); + expect(users).toEqual([]); + }); - test('limit -1', async (ctx) => { - const { db } = ctx.mysql; + test('limit -1', async (ctx) => { + const { db } = ctx.mysql; - await db.insert(usersTable).values({ name: 'John' }); - const users = await db - .select() - .from(usersTable) - .limit(-1); + await db.insert(usersTable).values({ name: 'John' }); + const users = await db + .select() + .from(usersTable) + .limit(-1); - expect(users.length).toBeGreaterThan(0); - }); + expect(users.length).toBeGreaterThan(0); }); } diff --git a/integration-tests/tests/pg/awsdatapi.test.ts b/integration-tests/tests/pg/awsdatapi.test.ts index 3bb884c0c..8ee39cf12 100644 --- a/integration-tests/tests/pg/awsdatapi.test.ts +++ b/integration-tests/tests/pg/awsdatapi.test.ts @@ -799,18 +799,19 @@ test('migrator : default migration strategy', async () => { }); test('migrator : migrate with custom schema', async () => { + const customSchema = randomString(); await db.execute(sql`drop table if exists all_columns`); await db.execute(sql`drop table if exists users12`); await db.execute(sql`drop table if exists "drizzle"."__drizzle_migrations"`); await migrate(db, { migrationsFolder: './drizzle2/pg', - migrationsSchema: 'custom_migrations', + migrationsSchema: customSchema, }); // test if the custom migrations table was created const { rows } = await db.execute( - sql`select * from custom_migrations."__drizzle_migrations";`, + sql`select * from ${sql.identifier(customSchema)}."__drizzle_migrations";`, ); expect(rows).toBeTruthy(); expect(rows!.length).toBeGreaterThan(0); @@ -823,7 +824,7 @@ test('migrator : migrate with custom schema', async () => { await db.execute(sql`drop table all_columns`); await db.execute(sql`drop table users12`); await db.execute( - sql`drop table custom_migrations."__drizzle_migrations"`, + sql`drop table ${sql.identifier(customSchema)}."__drizzle_migrations"`, ); }); @@ -857,6 +858,7 @@ test('migrator : migrate with custom table', async () => { test('migrator : migrate with custom table and custom schema', async () => { const customTable = randomString(); + const customSchema = randomString(); await db.execute(sql`drop table if exists all_columns`); await db.execute(sql`drop table if exists users12`); await db.execute(sql`drop table if exists "drizzle"."__drizzle_migrations"`); @@ -864,12 +866,12 @@ test('migrator : migrate with custom table and custom schema', async () => { await migrate(db, { migrationsFolder: './drizzle2/pg', migrationsTable: customTable, - migrationsSchema: 'custom_migrations', + migrationsSchema: customSchema, }); // test if the custom migrations table was created const { rows } = await db.execute( - sql`select * from custom_migrations.${ + sql`select * from ${sql.identifier(customSchema)}.${ sql.identifier( customTable, ) @@ -886,7 +888,7 @@ test('migrator : migrate with custom table and custom schema', async () => { await db.execute(sql`drop table all_columns`); await db.execute(sql`drop table users12`); await db.execute( - sql`drop table custom_migrations.${ + sql`drop table ${sql.identifier(customSchema)}.${ sql.identifier( customTable, ) diff --git a/integration-tests/tests/pg/neon-http.test.ts b/integration-tests/tests/pg/neon-http.test.ts index 319c84f40..1476e9628 100644 --- a/integration-tests/tests/pg/neon-http.test.ts +++ b/integration-tests/tests/pg/neon-http.test.ts @@ -68,14 +68,15 @@ test('migrator : default migration strategy', async () => { }); test('migrator : migrate with custom schema', async () => { + const customSchema = randomString(); await db.execute(sql`drop table if exists all_columns`); await db.execute(sql`drop table if exists users12`); await db.execute(sql`drop table if exists "drizzle"."__drizzle_migrations"`); - await migrate(db, { migrationsFolder: './drizzle2/pg', migrationsSchema: 'custom_migrations' }); + await migrate(db, { migrationsFolder: './drizzle2/pg', migrationsSchema: customSchema }); // test if the custom migrations table was created - const { rowCount } = await db.execute(sql`select * from custom_migrations."__drizzle_migrations";`); + const { rowCount } = await db.execute(sql`select * from ${sql.identifier(customSchema)}."__drizzle_migrations";`); expect(rowCount && rowCount > 0).toBeTruthy(); // test if the migrated table are working as expected @@ -85,7 +86,7 @@ test('migrator : migrate with custom schema', async () => { await db.execute(sql`drop table all_columns`); await db.execute(sql`drop table users12`); - await db.execute(sql`drop table custom_migrations."__drizzle_migrations"`); + await db.execute(sql`drop table ${sql.identifier(customSchema)}."__drizzle_migrations"`); }); test('migrator : migrate with custom table', async () => { @@ -112,6 +113,7 @@ test('migrator : migrate with custom table', async () => { test('migrator : migrate with custom table and custom schema', async () => { const customTable = randomString(); + const customSchema = randomString(); await db.execute(sql`drop table if exists all_columns`); await db.execute(sql`drop table if exists users12`); await db.execute(sql`drop table if exists "drizzle"."__drizzle_migrations"`); @@ -119,12 +121,12 @@ test('migrator : migrate with custom table and custom schema', async () => { await migrate(db, { migrationsFolder: './drizzle2/pg', migrationsTable: customTable, - migrationsSchema: 'custom_migrations', + migrationsSchema: customSchema, }); // test if the custom migrations table was created const { rowCount } = await db.execute( - sql`select * from custom_migrations.${sql.identifier(customTable)};`, + sql`select * from ${sql.identifier(customSchema)}.${sql.identifier(customTable)};`, ); expect(rowCount && rowCount > 0).toBeTruthy(); @@ -135,7 +137,7 @@ test('migrator : migrate with custom table and custom schema', async () => { await db.execute(sql`drop table all_columns`); await db.execute(sql`drop table users12`); - await db.execute(sql`drop table custom_migrations.${sql.identifier(customTable)}`); + await db.execute(sql`drop table ${sql.identifier(customSchema)}.${sql.identifier(customTable)}`); }); test('all date and time columns without timezone first case mode string', async () => { diff --git a/integration-tests/tests/pg/pg-common.ts b/integration-tests/tests/pg/pg-common.ts index 8550f5ae4..c48a533f9 100644 --- a/integration-tests/tests/pg/pg-common.ts +++ b/integration-tests/tests/pg/pg-common.ts @@ -74,7 +74,7 @@ import { } from 'drizzle-orm/pg-core'; import getPort from 'get-port'; import { v4 as uuidV4 } from 'uuid'; -import { afterAll, afterEach, beforeEach, describe, expect, test } from 'vitest'; +import { afterAll, beforeEach, describe, expect, test } from 'vitest'; import { Expect } from '~/utils'; import type { schema } from './neon-http-batch.test'; // eslint-disable-next-line @typescript-eslint/no-import-type-side-effects @@ -246,7 +246,6 @@ export function tests() { await db.execute(sql`drop schema if exists public cascade`); await db.execute(sql`drop schema if exists ${mySchema} cascade`); await db.execute(sql`create schema public`); - await db.execute(sql`create schema if not exists custom_migrations`); await db.execute(sql`create schema ${mySchema}`); // public users await db.execute( @@ -378,11 +377,6 @@ export function tests() { ); }); - afterEach(async (ctx) => { - const { db } = ctx.pg; - await db.execute(sql`drop schema if exists custom_migrations cascade`); - }); - async function setupSetOperationTest(db: PgDatabase) { await db.execute(sql`drop table if exists users2`); await db.execute(sql`drop table if exists cities`); @@ -4666,213 +4660,5 @@ export function tests() { jsonbNumberField: testNumber, }]); }); - - test('$count separate', async (ctx) => { - const { db } = ctx.pg; - - const countTestTable = pgTable('count_test', { - id: integer('id').notNull(), - name: text('name').notNull(), - }); - - await db.execute(sql`drop table if exists ${countTestTable}`); - await db.execute(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = await db.$count(countTestTable); - - await db.execute(sql`drop table ${countTestTable}`); - - expect(count).toStrictEqual(4); - }); - - test('$count embedded', async (ctx) => { - const { db } = ctx.pg; - - const countTestTable = pgTable('count_test', { - id: integer('id').notNull(), - name: text('name').notNull(), - }); - - await db.execute(sql`drop table if exists ${countTestTable}`); - await db.execute(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = await db.select({ - count: db.$count(countTestTable), - }).from(countTestTable); - - await db.execute(sql`drop table ${countTestTable}`); - - expect(count).toStrictEqual([ - { count: 4 }, - { count: 4 }, - { count: 4 }, - { count: 4 }, - ]); - }); - - test('$count separate reuse', async (ctx) => { - const { db } = ctx.pg; - - const countTestTable = pgTable('count_test', { - id: integer('id').notNull(), - name: text('name').notNull(), - }); - - await db.execute(sql`drop table if exists ${countTestTable}`); - await db.execute(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = db.$count(countTestTable); - - const count1 = await count; - - await db.insert(countTestTable).values({ id: 5, name: 'fifth' }); - - const count2 = await count; - - await db.insert(countTestTable).values({ id: 6, name: 'sixth' }); - - const count3 = await count; - - await db.execute(sql`drop table ${countTestTable}`); - - expect(count1).toStrictEqual(4); - expect(count2).toStrictEqual(5); - expect(count3).toStrictEqual(6); - }); - - test('$count embedded reuse', async (ctx) => { - const { db } = ctx.pg; - - const countTestTable = pgTable('count_test', { - id: integer('id').notNull(), - name: text('name').notNull(), - }); - - await db.execute(sql`drop table if exists ${countTestTable}`); - await db.execute(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = db.select({ - count: db.$count(countTestTable), - }).from(countTestTable); - - const count1 = await count; - - await db.insert(countTestTable).values({ id: 5, name: 'fifth' }); - - const count2 = await count; - - await db.insert(countTestTable).values({ id: 6, name: 'sixth' }); - - const count3 = await count; - - await db.execute(sql`drop table ${countTestTable}`); - - expect(count1).toStrictEqual([ - { count: 4 }, - { count: 4 }, - { count: 4 }, - { count: 4 }, - ]); - expect(count2).toStrictEqual([ - { count: 5 }, - { count: 5 }, - { count: 5 }, - { count: 5 }, - { count: 5 }, - ]); - expect(count3).toStrictEqual([ - { count: 6 }, - { count: 6 }, - { count: 6 }, - { count: 6 }, - { count: 6 }, - { count: 6 }, - ]); - }); - - test('$count separate with filters', async (ctx) => { - const { db } = ctx.pg; - - const countTestTable = pgTable('count_test', { - id: integer('id').notNull(), - name: text('name').notNull(), - }); - - await db.execute(sql`drop table if exists ${countTestTable}`); - await db.execute(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = await db.$count(countTestTable, gt(countTestTable.id, 1)); - - await db.execute(sql`drop table ${countTestTable}`); - - expect(count).toStrictEqual(3); - }); - - test('$count embedded with filters', async (ctx) => { - const { db } = ctx.pg; - - const countTestTable = pgTable('count_test', { - id: integer('id').notNull(), - name: text('name').notNull(), - }); - - await db.execute(sql`drop table if exists ${countTestTable}`); - await db.execute(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = await db.select({ - count: db.$count(countTestTable, gt(countTestTable.id, 1)), - }).from(countTestTable); - - await db.execute(sql`drop table ${countTestTable}`); - - expect(count).toStrictEqual([ - { count: 3 }, - { count: 3 }, - { count: 3 }, - { count: 3 }, - ]); - }); }); } diff --git a/integration-tests/tests/pg/vercel-pg.test.ts b/integration-tests/tests/pg/vercel-pg.test.ts index ecf1d22ac..3f1248d9b 100644 --- a/integration-tests/tests/pg/vercel-pg.test.ts +++ b/integration-tests/tests/pg/vercel-pg.test.ts @@ -77,14 +77,15 @@ test('migrator : default migration strategy', async () => { }); test('migrator : migrate with custom schema', async () => { + const customSchema = randomString(); await db.execute(sql`drop table if exists all_columns`); await db.execute(sql`drop table if exists users12`); await db.execute(sql`drop table if exists "drizzle"."__drizzle_migrations"`); - await migrate(db, { migrationsFolder: './drizzle2/pg', migrationsSchema: 'custom_migrations' }); + await migrate(db, { migrationsFolder: './drizzle2/pg', migrationsSchema: customSchema }); // test if the custom migrations table was created - const { rowCount } = await db.execute(sql`select * from custom_migrations."__drizzle_migrations";`); + const { rowCount } = await db.execute(sql`select * from ${sql.identifier(customSchema)}."__drizzle_migrations";`); expect(rowCount && rowCount > 0).toBeTruthy(); // test if the migrated table are working as expected @@ -94,7 +95,7 @@ test('migrator : migrate with custom schema', async () => { await db.execute(sql`drop table all_columns`); await db.execute(sql`drop table users12`); - await db.execute(sql`drop table custom_migrations."__drizzle_migrations"`); + await db.execute(sql`drop table ${sql.identifier(customSchema)}."__drizzle_migrations"`); }); test('migrator : migrate with custom table', async () => { @@ -121,6 +122,7 @@ test('migrator : migrate with custom table', async () => { test('migrator : migrate with custom table and custom schema', async () => { const customTable = randomString(); + const customSchema = randomString(); await db.execute(sql`drop table if exists all_columns`); await db.execute(sql`drop table if exists users12`); await db.execute(sql`drop table if exists "drizzle"."__drizzle_migrations"`); @@ -128,12 +130,12 @@ test('migrator : migrate with custom table and custom schema', async () => { await migrate(db, { migrationsFolder: './drizzle2/pg', migrationsTable: customTable, - migrationsSchema: 'custom_migrations', + migrationsSchema: customSchema, }); // test if the custom migrations table was created const { rowCount } = await db.execute( - sql`select * from custom_migrations.${sql.identifier(customTable)};`, + sql`select * from ${sql.identifier(customSchema)}.${sql.identifier(customTable)};`, ); expect(rowCount && rowCount > 0).toBeTruthy(); @@ -144,7 +146,7 @@ test('migrator : migrate with custom table and custom schema', async () => { await db.execute(sql`drop table all_columns`); await db.execute(sql`drop table users12`); - await db.execute(sql`drop table custom_migrations.${sql.identifier(customTable)}`); + await db.execute(sql`drop table ${sql.identifier(customSchema)}.${sql.identifier(customTable)}`); }); test('all date and time columns without timezone first case mode string', async () => { diff --git a/integration-tests/tests/sqlite/sqlite-common.ts b/integration-tests/tests/sqlite/sqlite-common.ts index e8ddb86e6..be452bcf1 100644 --- a/integration-tests/tests/sqlite/sqlite-common.ts +++ b/integration-tests/tests/sqlite/sqlite-common.ts @@ -2679,214 +2679,6 @@ export function tests() { expect(eachUser.updatedAt!.valueOf()).toBeGreaterThan(Date.now() - msDelay); } }); - - test('$count separate', async (ctx) => { - const { db } = ctx.sqlite; - - const countTestTable = sqliteTable('count_test', { - id: int('id').notNull(), - name: text('name').notNull(), - }); - - await db.run(sql`drop table if exists ${countTestTable}`); - await db.run(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = await db.$count(countTestTable); - - await db.run(sql`drop table ${countTestTable}`); - - expect(count).toStrictEqual(4); - }); - - test('$count embedded', async (ctx) => { - const { db } = ctx.sqlite; - - const countTestTable = sqliteTable('count_test', { - id: int('id').notNull(), - name: text('name').notNull(), - }); - - await db.run(sql`drop table if exists ${countTestTable}`); - await db.run(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = await db.select({ - count: db.$count(countTestTable), - }).from(countTestTable); - - await db.run(sql`drop table ${countTestTable}`); - - expect(count).toStrictEqual([ - { count: 4 }, - { count: 4 }, - { count: 4 }, - { count: 4 }, - ]); - }); - - test('$count separate reuse', async (ctx) => { - const { db } = ctx.sqlite; - - const countTestTable = sqliteTable('count_test', { - id: int('id').notNull(), - name: text('name').notNull(), - }); - - await db.run(sql`drop table if exists ${countTestTable}`); - await db.run(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = db.$count(countTestTable); - - const count1 = await count; - - await db.insert(countTestTable).values({ id: 5, name: 'fifth' }); - - const count2 = await count; - - await db.insert(countTestTable).values({ id: 6, name: 'sixth' }); - - const count3 = await count; - - await db.run(sql`drop table ${countTestTable}`); - - expect(count1).toStrictEqual(4); - expect(count2).toStrictEqual(5); - expect(count3).toStrictEqual(6); - }); - - test('$count embedded reuse', async (ctx) => { - const { db } = ctx.sqlite; - - const countTestTable = sqliteTable('count_test', { - id: int('id').notNull(), - name: text('name').notNull(), - }); - - await db.run(sql`drop table if exists ${countTestTable}`); - await db.run(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = db.select({ - count: db.$count(countTestTable), - }).from(countTestTable); - - const count1 = await count; - - await db.insert(countTestTable).values({ id: 5, name: 'fifth' }); - - const count2 = await count; - - await db.insert(countTestTable).values({ id: 6, name: 'sixth' }); - - const count3 = await count; - - await db.run(sql`drop table ${countTestTable}`); - - expect(count1).toStrictEqual([ - { count: 4 }, - { count: 4 }, - { count: 4 }, - { count: 4 }, - ]); - expect(count2).toStrictEqual([ - { count: 5 }, - { count: 5 }, - { count: 5 }, - { count: 5 }, - { count: 5 }, - ]); - expect(count3).toStrictEqual([ - { count: 6 }, - { count: 6 }, - { count: 6 }, - { count: 6 }, - { count: 6 }, - { count: 6 }, - ]); - }); - - test('$count separate with filters', async (ctx) => { - const { db } = ctx.sqlite; - - const countTestTable = sqliteTable('count_test', { - id: int('id').notNull(), - name: text('name').notNull(), - }); - - await db.run(sql`drop table if exists ${countTestTable}`); - await db.run(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = await db.$count(countTestTable, gt(countTestTable.id, 1)); - - await db.run(sql`drop table ${countTestTable}`); - - expect(count).toStrictEqual(3); - }); - - test('$count embedded with filters', async (ctx) => { - const { db } = ctx.sqlite; - - const countTestTable = sqliteTable('count_test', { - id: int('id').notNull(), - name: text('name').notNull(), - }); - - await db.run(sql`drop table if exists ${countTestTable}`); - await db.run(sql`create table ${countTestTable} (id int, name text)`); - - await db.insert(countTestTable).values([ - { id: 1, name: 'First' }, - { id: 2, name: 'Second' }, - { id: 3, name: 'Third' }, - { id: 4, name: 'Fourth' }, - ]); - - const count = await db.select({ - count: db.$count(countTestTable, gt(countTestTable.id, 1)), - }).from(countTestTable); - - await db.run(sql`drop table ${countTestTable}`); - - expect(count).toStrictEqual([ - { count: 3 }, - { count: 3 }, - { count: 3 }, - { count: 3 }, - ]); - }); }); test('table configs: unique third param', () => { diff --git a/integration-tests/vitest.config.ts b/integration-tests/vitest.config.ts index cd4ddf621..6cefab280 100644 --- a/integration-tests/vitest.config.ts +++ b/integration-tests/vitest.config.ts @@ -26,6 +26,7 @@ export default defineConfig({ 'tests/sqlite/libsql.test.ts', 'tests/mysql/tidb-serverless.test.ts', 'tests/sqlite/libsql-batch.test.ts', + 'tests/pg/neon-http.test.ts', 'tests/pg/neon-http-batch.test.ts', ] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7e8189ffe..d2d091ad6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,7 +45,7 @@ importers: version: link:drizzle-orm/dist drizzle-orm-old: specifier: npm:drizzle-orm@^0.27.2 - version: drizzle-orm@0.27.2(@aws-sdk/client-rds-data@3.583.0)(@cloudflare/workers-types@4.20240524.0)(@libsql/client@0.10.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@neondatabase/serverless@0.9.3)(@opentelemetry/api@1.8.0)(@planetscale/database@1.18.0)(@types/better-sqlite3@7.6.10)(@types/pg@8.11.6)(@types/sql.js@1.4.9)(@vercel/postgres@0.8.0)(better-sqlite3@9.6.0)(bun-types@1.0.3)(knex@2.5.1(better-sqlite3@9.6.0)(mysql2@3.11.0)(pg@8.11.5)(sqlite3@5.1.7))(kysely@0.25.0)(mysql2@3.11.0)(pg@8.11.5)(postgres@3.4.4)(sql.js@1.10.3)(sqlite3@5.1.7) + version: drizzle-orm@0.27.2(@aws-sdk/client-rds-data@3.583.0)(@cloudflare/workers-types@4.20240524.0)(@libsql/client@0.5.6)(@neondatabase/serverless@0.9.3)(@opentelemetry/api@1.8.0)(@planetscale/database@1.18.0)(@types/better-sqlite3@7.6.10)(@types/pg@8.11.6)(@types/sql.js@1.4.9)(@vercel/postgres@0.8.0)(better-sqlite3@9.6.0)(bun-types@1.0.3)(knex@2.5.1(better-sqlite3@9.6.0)(mysql2@3.11.0)(pg@8.11.5)(sqlite3@5.1.7))(kysely@0.25.0)(mysql2@3.11.0)(pg@8.11.5)(postgres@3.4.4)(sql.js@1.10.3)(sqlite3@5.1.7) eslint: specifier: ^8.50.0 version: 8.50.0 @@ -78,7 +78,7 @@ importers: version: 0.8.16(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)) tsup: specifier: ^7.2.0 - version: 7.2.0(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)))(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)) + version: 7.2.0(postcss@8.4.39)(ts-node@10.9.2(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)))(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)) tsx: specifier: ^4.10.5 version: 4.10.5 @@ -303,14 +303,14 @@ importers: specifier: ^0.1.1 version: 0.1.5 '@libsql/client': - specifier: ^0.10.0 - version: 0.10.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + specifier: ^0.5.6 + version: 0.5.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) '@neondatabase/serverless': specifier: ^0.9.0 version: 0.9.0 '@op-engineering/op-sqlite': specifier: ^2.0.16 - version: 2.0.22(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + version: 2.0.22(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) '@opentelemetry/api': specifier: ^1.4.1 version: 1.8.0 @@ -358,7 +358,7 @@ importers: version: 10.1.0 expo-sqlite: specifier: ^13.2.0 - version: 13.4.0(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)) + version: 13.4.0(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)) knex: specifier: ^2.4.2 version: 2.5.1(better-sqlite3@8.7.0)(mysql2@3.3.3)(pg@8.11.5)(sqlite3@5.1.7) @@ -552,8 +552,8 @@ importers: specifier: ^0.1.1 version: 0.1.5 '@libsql/client': - specifier: ^0.10.0 - version: 0.10.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + specifier: ^0.5.6 + version: 0.5.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) '@miniflare/d1': specifier: ^2.14.2 version: 2.14.2 @@ -3078,25 +3078,25 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@libsql/client@0.10.0': - resolution: {integrity: sha512-2ERn08T4XOVx34yBtUPq0RDjAdd9TJ5qNH/izugr208ml2F94mk92qC64kXyDVQINodWJvp3kAdq6P4zTtCZ7g==} - '@libsql/client@0.4.3': resolution: {integrity: sha512-AUYKnSPqAsFBVWBvmtrb4dG3pQlvTKT92eztAest9wQU2iJkabH8WzHLDb3dKFWKql7/kiCqvBQUVpozDwhekQ==} - '@libsql/core@0.10.0': - resolution: {integrity: sha512-rqynAXGaiSpTsykOZdBtI1N4z4O+KZ6mt33K/aHeXAY0gSIfK/ctxuWa0Y1Bjo4FMz1idBTCXz4Ps5kITOvZZw==} + '@libsql/client@0.5.6': + resolution: {integrity: sha512-UBjmDoxz75Z2sHdP+ETCROpeLA/77VMesiff8R4UWK1rnaWbh6/YoCLDILMJL3Rh0udQeKxjL8MjXthqohax+g==} '@libsql/core@0.4.3': resolution: {integrity: sha512-r28iYBtaLBW9RRgXPFh6cGCsVI/rwRlOzSOpAu/1PVTm6EJ3t233pUf97jETVHU0vjdr1d8VvV6fKAvJkokqCw==} + '@libsql/core@0.5.6': + resolution: {integrity: sha512-3vicUAydq6jPth410n4AsHHm1n2psTwvkSf94nfJlSXutGSZsl0updn2N/mJBgqUHkbuFoWZtlMifF0SwBj1xQ==} + '@libsql/darwin-arm64@0.2.0': resolution: {integrity: sha512-+qyT2W/n5CFH1YZWv2mxW4Fsoo4dX9Z9M/nvbQqZ7H84J8hVegvVAsIGYzcK8xAeMEcpU5yGKB1Y9NoDY4hOSQ==} cpu: [arm64] os: [darwin] - '@libsql/darwin-arm64@0.4.5': - resolution: {integrity: sha512-xLdnn0NrgSk6OMi716FFs/27Hs33jtSd2fkKi/72Ey/qBtPWcB1BMurDQekzi0yAcfQTjGqIz7tpOibyjiEPyQ==} + '@libsql/darwin-arm64@0.3.18': + resolution: {integrity: sha512-Zt49dt+cwhPCkuoWgvjbQd4ckNfCJR5xzIAyhgHl3CBZqZaEuaXTOGKLNQT7bnFRPuQcdLt5PBT1cenKu2N6pA==} cpu: [arm64] os: [darwin] @@ -3105,24 +3105,17 @@ packages: cpu: [x64] os: [darwin] - '@libsql/darwin-x64@0.4.5': - resolution: {integrity: sha512-rZsEWj0H7oCqd5Y2pe0RzKmuQXC2OB1RbnFy4CvjeAjT6MP6mFp+Vx9mTCAUuJMhuoSVMsFPUJRpAQznl9E3Tg==} + '@libsql/darwin-x64@0.3.18': + resolution: {integrity: sha512-faq6HUGDaNaueeqPei5cypHaD/hhazUyfHo094CXiEeRZq6ZKtNl5PHdlr8jE/Uw8USNpVVQaLdnvSgKcpRPHw==} cpu: [x64] os: [darwin] '@libsql/hrana-client@0.5.6': resolution: {integrity: sha512-mjQoAmejZ1atG+M3YR2ZW+rg6ceBByH/S/h17ZoYZkqbWrvohFhXyz2LFxj++ARMoY9m6w3RJJIRdJdmnEUlFg==} - '@libsql/hrana-client@0.6.2': - resolution: {integrity: sha512-MWxgD7mXLNf9FXXiM0bc90wCjZSpErWKr5mGza7ERy2FJNNMXd7JIOv+DepBA1FQTIfI8TFO4/QDYgaQC0goNw==} - '@libsql/isomorphic-fetch@0.1.12': resolution: {integrity: sha512-MRo4UcmjAGAa3ac56LoD5OE13m2p0lu0VEtZC2NZMcogM/jc5fU9YtMQ3qbPjFJ+u2BBjFZgMPkQaLS1dlMhpg==} - '@libsql/isomorphic-fetch@0.2.5': - resolution: {integrity: sha512-8s/B2TClEHms2yb+JGpsVRTPBfy1ih/Pq6h6gvyaNcYnMVJvgQRY7wAa8U2nD0dppbCuDU5evTNMEhrQ17ZKKg==} - engines: {node: '>=18.0.0'} - '@libsql/isomorphic-ws@0.1.5': resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} @@ -3131,8 +3124,8 @@ packages: cpu: [arm64] os: [linux] - '@libsql/linux-arm64-gnu@0.4.5': - resolution: {integrity: sha512-VR09iu6KWGJ6fauCn59u/jJ9OA+/A2yQ0dr2HDN2zkRueLC6D2oGYt4gPfLZPFKf+WJpVMtIhNfd+Ru9MMaFkA==} + '@libsql/linux-arm64-gnu@0.3.18': + resolution: {integrity: sha512-5m9xtDAhoyLSV54tho9uQ2ZIDeJWc0vU3Xpe/VK4+6bpURISs23qNhXiCrZnnq3oV0hFlBfcIgQUIATmb6jD2A==} cpu: [arm64] os: [linux] @@ -3141,8 +3134,8 @@ packages: cpu: [arm64] os: [linux] - '@libsql/linux-arm64-musl@0.4.5': - resolution: {integrity: sha512-74hvD5ej4rBshhxFGNYU16a3m8B/NjIPvhlZ/flG1Oeydfo6AuUXSSNFi+H5+zi9/uWuzyz5TLVeQcraoUV10A==} + '@libsql/linux-arm64-musl@0.3.18': + resolution: {integrity: sha512-oYD5+oM2gPEalp+EoR5DVQBRtdGjLsocjsRbQs5O2m4WOBJKER7VUfDYZHsifLGZoBSc11Yo6s9IR9rjGWy20w==} cpu: [arm64] os: [linux] @@ -3151,8 +3144,8 @@ packages: cpu: [x64] os: [linux] - '@libsql/linux-x64-gnu@0.4.5': - resolution: {integrity: sha512-gb5WObGO3+rbuG8h9font1N02iF+zgYAgY0wNa8BNiZ5A9UolZKFxiqGFS7eHaAYfemHJKKTT+aAt3X2p5TibA==} + '@libsql/linux-x64-gnu@0.3.18': + resolution: {integrity: sha512-QDSSP60nS8KIldGE7H3bpEflQHiL1erwED6huoVJdmDFxsyDJX2CYdWUWW8Za0ZUOvUbnEWAOyMhp6j1dBbZqw==} cpu: [x64] os: [linux] @@ -3161,8 +3154,8 @@ packages: cpu: [x64] os: [linux] - '@libsql/linux-x64-musl@0.4.5': - resolution: {integrity: sha512-JfyE6OVC5X4Nr4cFF77VhB1o+hBRxAqYT9YdeqnWdAQSYc/ASi5HnRALLAQEsGacFPZZ32pixfraQmPE3iJFfw==} + '@libsql/linux-x64-musl@0.3.18': + resolution: {integrity: sha512-5SXwTlaLCUPzxYyq+P0c7Ko7tcEjpd1X6RZKe1DuRFmJPg6f7j2+LrPEhMSIbqKcrl5ACUUAyoKmGZqNYwz23w==} cpu: [x64] os: [linux] @@ -3171,8 +3164,8 @@ packages: cpu: [x64] os: [win32] - '@libsql/win32-x64-msvc@0.4.5': - resolution: {integrity: sha512-57GGurNJhOhq3XIopLdGnCoQ4kQAcmbmzzFoC4tpvDE/KSbwZ/13zqJWhQA41nMGk/PKM1XKfKmbIybKx1+eqA==} + '@libsql/win32-x64-msvc@0.3.18': + resolution: {integrity: sha512-9EEIHz+e8tTbx9TMkb8ByZnzxc0pYFirK1nSbqC6cFEST95fiY0NCfQ/zAzJxe90KckbjifX6BbO69eWIi3TAg==} cpu: [x64] os: [win32] @@ -7104,8 +7097,8 @@ packages: cpu: [x64, arm64] os: [darwin, linux, win32] - libsql@0.4.5: - resolution: {integrity: sha512-sorTJV6PNt94Wap27Sai5gtVLIea4Otb2LUiAUyr3p6BPOScGMKGt5F1b5X/XgkNtcsDKeX5qfeBDj+PdShclQ==} + libsql@0.3.18: + resolution: {integrity: sha512-lvhKr7WV3NLWRbXkjn/MeKqXOAqWKU0PX9QYrvDh7fneukapj+iUQ4qgJASrQyxcCrEsClXCQiiK5W6OoYPAlA==} os: [darwin, linux, win32] lighthouse-logger@1.4.2: @@ -8309,9 +8302,6 @@ packages: bluebird: optional: true - promise-limit@2.7.0: - resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} - promise-retry@2.0.1: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} @@ -10122,7 +10112,7 @@ snapshots: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 '@aws-sdk/client-sso-oidc': 3.569.0 - '@aws-sdk/client-sts': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0) + '@aws-sdk/client-sts': 3.569.0 '@aws-sdk/core': 3.567.0 '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0) '@aws-sdk/middleware-host-header': 3.567.0 @@ -10217,10 +10207,10 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.583.0 - '@aws-sdk/client-sts': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0) + '@aws-sdk/client-sso-oidc': 3.583.0(@aws-sdk/client-sts@3.583.0) + '@aws-sdk/client-sts': 3.583.0 '@aws-sdk/core': 3.582.0 - '@aws-sdk/credential-provider-node': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0) + '@aws-sdk/credential-provider-node': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0(@aws-sdk/client-sts@3.583.0))(@aws-sdk/client-sts@3.583.0) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -10263,7 +10253,7 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0) + '@aws-sdk/client-sts': 3.569.0 '@aws-sdk/core': 3.567.0 '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0) '@aws-sdk/middleware-host-header': 3.567.0 @@ -10304,13 +10294,13 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.583.0': + '@aws-sdk/client-sso-oidc@3.583.0(@aws-sdk/client-sts@3.583.0)': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0) + '@aws-sdk/client-sts': 3.583.0 '@aws-sdk/core': 3.582.0 - '@aws-sdk/credential-provider-node': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0) + '@aws-sdk/credential-provider-node': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0(@aws-sdk/client-sts@3.583.0))(@aws-sdk/client-sts@3.583.0) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -10347,6 +10337,7 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 transitivePeerDependencies: + - '@aws-sdk/client-sts' - aws-crt '@aws-sdk/client-sso@3.478.0': @@ -10522,7 +10513,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)': + '@aws-sdk/client-sts@3.569.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 @@ -10564,17 +10555,62 @@ snapshots: '@smithy/util-retry': 2.2.0 '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)': + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sso-oidc': 3.569.0 + '@aws-sdk/core': 3.567.0 + '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) + '@aws-sdk/middleware-host-header': 3.567.0 + '@aws-sdk/middleware-logger': 3.568.0 + '@aws-sdk/middleware-recursion-detection': 3.567.0 + '@aws-sdk/middleware-user-agent': 3.567.0 + '@aws-sdk/region-config-resolver': 3.567.0 + '@aws-sdk/types': 3.567.0 + '@aws-sdk/util-endpoints': 3.567.0 + '@aws-sdk/util-user-agent-browser': 3.567.0 + '@aws-sdk/util-user-agent-node': 3.568.0 + '@smithy/config-resolver': 2.2.0 + '@smithy/core': 1.4.2 + '@smithy/fetch-http-handler': 2.5.0 + '@smithy/hash-node': 2.2.0 + '@smithy/invalid-dependency': 2.2.0 + '@smithy/middleware-content-length': 2.2.0 + '@smithy/middleware-endpoint': 2.5.1 + '@smithy/middleware-retry': 2.3.1 + '@smithy/middleware-serde': 2.3.0 + '@smithy/middleware-stack': 2.2.0 + '@smithy/node-config-provider': 2.3.0 + '@smithy/node-http-handler': 2.5.0 + '@smithy/protocol-http': 3.3.0 + '@smithy/smithy-client': 2.5.1 + '@smithy/types': 2.12.0 + '@smithy/url-parser': 2.2.0 + '@smithy/util-base64': 2.3.0 + '@smithy/util-body-length-browser': 2.2.0 + '@smithy/util-body-length-node': 2.3.0 + '@smithy/util-defaults-mode-browser': 2.2.1 + '@smithy/util-defaults-mode-node': 2.3.1 + '@smithy/util-endpoints': 1.2.0 + '@smithy/util-middleware': 2.2.0 + '@smithy/util-retry': 2.2.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.6.2 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/client-sts@3.583.0(@aws-sdk/client-sso-oidc@3.583.0)': + '@aws-sdk/client-sts@3.583.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.583.0 + '@aws-sdk/client-sso-oidc': 3.583.0(@aws-sdk/client-sts@3.583.0) '@aws-sdk/core': 3.582.0 - '@aws-sdk/credential-provider-node': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0) + '@aws-sdk/credential-provider-node': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0(@aws-sdk/client-sts@3.583.0))(@aws-sdk/client-sts@3.583.0) '@aws-sdk/middleware-host-header': 3.577.0 '@aws-sdk/middleware-logger': 3.577.0 '@aws-sdk/middleware-recursion-detection': 3.577.0 @@ -10611,7 +10647,6 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.6.2 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt '@aws-sdk/core@3.477.0': @@ -10713,6 +10748,23 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-ini@3.568.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0))': + dependencies: + '@aws-sdk/client-sts': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0) + '@aws-sdk/credential-provider-env': 3.568.0 + '@aws-sdk/credential-provider-process': 3.568.0 + '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.569.0) + '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) + '@aws-sdk/types': 3.567.0 + '@smithy/credential-provider-imds': 2.3.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - aws-crt + '@aws-sdk/credential-provider-ini@3.568.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0)': dependencies: '@aws-sdk/client-sts': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0) @@ -10736,7 +10788,7 @@ snapshots: '@aws-sdk/credential-provider-env': 3.568.0 '@aws-sdk/credential-provider-process': 3.568.0 '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.583.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0) + '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) '@aws-sdk/types': 3.567.0 '@smithy/credential-provider-imds': 2.3.0 '@smithy/property-provider': 2.2.0 @@ -10747,12 +10799,12 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-ini@3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0)': + '@aws-sdk/credential-provider-ini@3.583.0(@aws-sdk/client-sso-oidc@3.583.0(@aws-sdk/client-sts@3.583.0))(@aws-sdk/client-sts@3.583.0)': dependencies: - '@aws-sdk/client-sts': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0) + '@aws-sdk/client-sts': 3.583.0 '@aws-sdk/credential-provider-env': 3.577.0 '@aws-sdk/credential-provider-process': 3.577.0 - '@aws-sdk/credential-provider-sso': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0) + '@aws-sdk/credential-provider-sso': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0(@aws-sdk/client-sts@3.583.0)) '@aws-sdk/credential-provider-web-identity': 3.577.0(@aws-sdk/client-sts@3.583.0) '@aws-sdk/types': 3.577.0 '@smithy/credential-provider-imds': 3.0.0 @@ -10780,6 +10832,25 @@ snapshots: transitivePeerDependencies: - aws-crt + '@aws-sdk/credential-provider-node@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0))': + dependencies: + '@aws-sdk/credential-provider-env': 3.568.0 + '@aws-sdk/credential-provider-http': 3.568.0 + '@aws-sdk/credential-provider-ini': 3.568.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) + '@aws-sdk/credential-provider-process': 3.568.0 + '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.569.0) + '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) + '@aws-sdk/types': 3.567.0 + '@smithy/credential-provider-imds': 2.3.0 + '@smithy/property-provider': 2.2.0 + '@smithy/shared-ini-file-loader': 2.4.0 + '@smithy/types': 2.12.0 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/client-sso-oidc' + - '@aws-sdk/client-sts' + - aws-crt + '@aws-sdk/credential-provider-node@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)(@aws-sdk/client-sts@3.569.0)': dependencies: '@aws-sdk/credential-provider-env': 3.568.0 @@ -10806,7 +10877,7 @@ snapshots: '@aws-sdk/credential-provider-ini': 3.568.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) '@aws-sdk/credential-provider-process': 3.568.0 '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.583.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0) + '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) '@aws-sdk/types': 3.567.0 '@smithy/credential-provider-imds': 2.3.0 '@smithy/property-provider': 2.2.0 @@ -10818,13 +10889,13 @@ snapshots: - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/credential-provider-node@3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0)': + '@aws-sdk/credential-provider-node@3.583.0(@aws-sdk/client-sso-oidc@3.583.0(@aws-sdk/client-sts@3.583.0))(@aws-sdk/client-sts@3.583.0)': dependencies: '@aws-sdk/credential-provider-env': 3.577.0 '@aws-sdk/credential-provider-http': 3.582.0 - '@aws-sdk/credential-provider-ini': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.583.0) + '@aws-sdk/credential-provider-ini': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0(@aws-sdk/client-sts@3.583.0))(@aws-sdk/client-sts@3.583.0) '@aws-sdk/credential-provider-process': 3.577.0 - '@aws-sdk/credential-provider-sso': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0) + '@aws-sdk/credential-provider-sso': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0(@aws-sdk/client-sts@3.583.0)) '@aws-sdk/credential-provider-web-identity': 3.577.0(@aws-sdk/client-sts@3.583.0) '@aws-sdk/types': 3.577.0 '@smithy/credential-provider-imds': 3.0.0 @@ -10899,10 +10970,10 @@ snapshots: - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-sso@3.583.0(@aws-sdk/client-sso-oidc@3.583.0)': + '@aws-sdk/credential-provider-sso@3.583.0(@aws-sdk/client-sso-oidc@3.583.0(@aws-sdk/client-sts@3.583.0))': dependencies: '@aws-sdk/client-sso': 3.583.0 - '@aws-sdk/token-providers': 3.577.0(@aws-sdk/client-sso-oidc@3.583.0) + '@aws-sdk/token-providers': 3.577.0(@aws-sdk/client-sso-oidc@3.583.0(@aws-sdk/client-sts@3.583.0)) '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/shared-ini-file-loader': 3.0.0 @@ -10919,7 +10990,7 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.6.2 - '@aws-sdk/credential-provider-web-identity@3.568.0(@aws-sdk/client-sts@3.569.0)': + '@aws-sdk/credential-provider-web-identity@3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0))': dependencies: '@aws-sdk/client-sts': 3.569.0(@aws-sdk/client-sso-oidc@3.569.0) '@aws-sdk/types': 3.567.0 @@ -10927,9 +10998,17 @@ snapshots: '@smithy/types': 2.12.0 tslib: 2.6.2 + '@aws-sdk/credential-provider-web-identity@3.568.0(@aws-sdk/client-sts@3.569.0)': + dependencies: + '@aws-sdk/client-sts': 3.569.0 + '@aws-sdk/types': 3.567.0 + '@smithy/property-provider': 2.2.0 + '@smithy/types': 2.12.0 + tslib: 2.6.2 + '@aws-sdk/credential-provider-web-identity@3.577.0(@aws-sdk/client-sts@3.583.0)': dependencies: - '@aws-sdk/client-sts': 3.583.0(@aws-sdk/client-sso-oidc@3.583.0) + '@aws-sdk/client-sts': 3.583.0 '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/types': 3.0.0 @@ -10947,7 +11026,7 @@ snapshots: '@aws-sdk/credential-provider-node': 3.569.0(@aws-sdk/client-sso-oidc@3.583.0)(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) '@aws-sdk/credential-provider-process': 3.568.0 '@aws-sdk/credential-provider-sso': 3.568.0(@aws-sdk/client-sso-oidc@3.583.0) - '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0) + '@aws-sdk/credential-provider-web-identity': 3.568.0(@aws-sdk/client-sts@3.569.0(@aws-sdk/client-sso-oidc@3.569.0)) '@aws-sdk/types': 3.567.0 '@smithy/credential-provider-imds': 2.3.0 '@smithy/property-provider': 2.2.0 @@ -11130,16 +11209,16 @@ snapshots: '@aws-sdk/token-providers@3.568.0(@aws-sdk/client-sso-oidc@3.583.0)': dependencies: - '@aws-sdk/client-sso-oidc': 3.583.0 + '@aws-sdk/client-sso-oidc': 3.583.0(@aws-sdk/client-sts@3.583.0) '@aws-sdk/types': 3.567.0 '@smithy/property-provider': 2.2.0 '@smithy/shared-ini-file-loader': 2.4.0 '@smithy/types': 2.12.0 tslib: 2.6.2 - '@aws-sdk/token-providers@3.577.0(@aws-sdk/client-sso-oidc@3.583.0)': + '@aws-sdk/token-providers@3.577.0(@aws-sdk/client-sso-oidc@3.583.0(@aws-sdk/client-sts@3.583.0))': dependencies: - '@aws-sdk/client-sso-oidc': 3.583.0 + '@aws-sdk/client-sso-oidc': 3.583.0(@aws-sdk/client-sts@3.583.0) '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.0.0 '@smithy/shared-ini-file-loader': 3.0.0 @@ -12811,7 +12890,7 @@ snapshots: mv: 2.1.1 safe-json-stringify: 1.2.0 - '@expo/cli@0.18.13(bufferutil@4.0.8)(encoding@0.1.13)(expo-modules-autolinking@1.11.1)(utf-8-validate@6.0.3)': + '@expo/cli@0.18.13(bufferutil@4.0.8)(encoding@0.1.13)(expo-modules-autolinking@1.11.1)': dependencies: '@babel/runtime': 7.24.6 '@expo/code-signing-certificates': 0.0.5 @@ -12829,7 +12908,7 @@ snapshots: '@expo/rudder-sdk-node': 1.1.1(encoding@0.1.13) '@expo/spawn-async': 1.7.2 '@expo/xcpretty': 4.3.1 - '@react-native/dev-middleware': 0.74.83(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + '@react-native/dev-middleware': 0.74.83(bufferutil@4.0.8)(encoding@0.1.13) '@urql/core': 2.3.6(graphql@15.8.0) '@urql/exchange-retry': 0.3.0(graphql@15.8.0) accepts: 1.3.8 @@ -13249,47 +13328,47 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@libsql/client@0.10.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)': + '@libsql/client@0.4.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': dependencies: - '@libsql/core': 0.10.0 - '@libsql/hrana-client': 0.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@libsql/core': 0.4.3 + '@libsql/hrana-client': 0.5.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) js-base64: 3.7.7 - libsql: 0.4.5 - promise-limit: 2.7.0 + optionalDependencies: + libsql: 0.2.0 transitivePeerDependencies: - bufferutil + - encoding - utf-8-validate - '@libsql/client@0.4.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@libsql/client@0.5.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': dependencies: - '@libsql/core': 0.4.3 + '@libsql/core': 0.5.6 '@libsql/hrana-client': 0.5.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) js-base64: 3.7.7 - optionalDependencies: - libsql: 0.2.0 + libsql: 0.3.18 transitivePeerDependencies: - bufferutil - encoding - utf-8-validate - '@libsql/core@0.10.0': + '@libsql/core@0.4.3': dependencies: js-base64: 3.7.7 - '@libsql/core@0.4.3': + '@libsql/core@0.5.6': dependencies: js-base64: 3.7.7 '@libsql/darwin-arm64@0.2.0': optional: true - '@libsql/darwin-arm64@0.4.5': + '@libsql/darwin-arm64@0.3.18': optional: true '@libsql/darwin-x64@0.2.0': optional: true - '@libsql/darwin-x64@0.4.5': + '@libsql/darwin-x64@0.3.18': optional: true '@libsql/hrana-client@0.5.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': @@ -13303,16 +13382,6 @@ snapshots: - encoding - utf-8-validate - '@libsql/hrana-client@0.6.2(bufferutil@4.0.8)(utf-8-validate@6.0.3)': - dependencies: - '@libsql/isomorphic-fetch': 0.2.5 - '@libsql/isomorphic-ws': 0.1.5(bufferutil@4.0.8)(utf-8-validate@6.0.3) - js-base64: 3.7.7 - node-fetch: 3.3.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@libsql/isomorphic-fetch@0.1.12(encoding@0.1.13)': dependencies: '@types/node-fetch': 2.6.11 @@ -13320,12 +13389,10 @@ snapshots: transitivePeerDependencies: - encoding - '@libsql/isomorphic-fetch@0.2.5': {} - '@libsql/isomorphic-ws@0.1.5(bufferutil@4.0.8)(utf-8-validate@6.0.3)': dependencies: '@types/ws': 8.5.11 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -13333,31 +13400,31 @@ snapshots: '@libsql/linux-arm64-gnu@0.2.0': optional: true - '@libsql/linux-arm64-gnu@0.4.5': + '@libsql/linux-arm64-gnu@0.3.18': optional: true '@libsql/linux-arm64-musl@0.2.0': optional: true - '@libsql/linux-arm64-musl@0.4.5': + '@libsql/linux-arm64-musl@0.3.18': optional: true '@libsql/linux-x64-gnu@0.2.0': optional: true - '@libsql/linux-x64-gnu@0.4.5': + '@libsql/linux-x64-gnu@0.3.18': optional: true '@libsql/linux-x64-musl@0.2.0': optional: true - '@libsql/linux-x64-musl@0.4.5': + '@libsql/linux-x64-musl@0.3.18': optional: true '@libsql/win32-x64-msvc@0.2.0': optional: true - '@libsql/win32-x64-msvc@0.4.5': + '@libsql/win32-x64-msvc@0.3.18': optional: true '@miniflare/core@2.14.2': @@ -13437,10 +13504,10 @@ snapshots: rimraf: 3.0.2 optional: true - '@op-engineering/op-sqlite@2.0.22(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)': + '@op-engineering/op-sqlite@2.0.22(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)': dependencies: react: 18.3.1 - react-native: 0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) + react-native: 0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1) '@opentelemetry/api@1.8.0': {} @@ -13577,7 +13644,7 @@ snapshots: transitivePeerDependencies: - encoding - '@react-native-community/cli-server-api@13.6.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@react-native-community/cli-server-api@13.6.6(bufferutil@4.0.8)(encoding@0.1.13)': dependencies: '@react-native-community/cli-debugger-ui': 13.6.6 '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) @@ -13587,7 +13654,7 @@ snapshots: nocache: 3.0.4 pretty-format: 26.6.2 serve-static: 1.15.0 - ws: 6.2.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 6.2.2(bufferutil@4.0.8) transitivePeerDependencies: - bufferutil - encoding @@ -13614,14 +13681,14 @@ snapshots: dependencies: joi: 17.13.1 - '@react-native-community/cli@13.6.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@react-native-community/cli@13.6.6(bufferutil@4.0.8)(encoding@0.1.13)': dependencies: '@react-native-community/cli-clean': 13.6.6(encoding@0.1.13) '@react-native-community/cli-config': 13.6.6(encoding@0.1.13) '@react-native-community/cli-debugger-ui': 13.6.6 '@react-native-community/cli-doctor': 13.6.6(encoding@0.1.13) '@react-native-community/cli-hermes': 13.6.6(encoding@0.1.13) - '@react-native-community/cli-server-api': 13.6.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + '@react-native-community/cli-server-api': 13.6.6(bufferutil@4.0.8)(encoding@0.1.13) '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) '@react-native-community/cli-types': 13.6.6 chalk: 4.1.2 @@ -13710,16 +13777,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@react-native/community-cli-plugin@0.74.83(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@react-native/community-cli-plugin@0.74.83(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)': dependencies: - '@react-native-community/cli-server-api': 13.6.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + '@react-native-community/cli-server-api': 13.6.6(bufferutil@4.0.8)(encoding@0.1.13) '@react-native-community/cli-tools': 13.6.6(encoding@0.1.13) - '@react-native/dev-middleware': 0.74.83(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + '@react-native/dev-middleware': 0.74.83(bufferutil@4.0.8)(encoding@0.1.13) '@react-native/metro-babel-transformer': 0.74.83(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6)) chalk: 4.1.2 execa: 5.1.1 - metro: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - metro-config: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + metro: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13) + metro-config: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13) metro-core: 0.80.9 node-fetch: 2.7.0(encoding@0.1.13) querystring: 0.2.1 @@ -13734,7 +13801,7 @@ snapshots: '@react-native/debugger-frontend@0.74.83': {} - '@react-native/dev-middleware@0.74.83(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)': + '@react-native/dev-middleware@0.74.83(bufferutil@4.0.8)(encoding@0.1.13)': dependencies: '@isaacs/ttlcache': 1.4.1 '@react-native/debugger-frontend': 0.74.83 @@ -13748,7 +13815,7 @@ snapshots: selfsigned: 2.4.1 serve-static: 1.15.0 temp-dir: 2.0.0 - ws: 6.2.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 6.2.2(bufferutil@4.0.8) transitivePeerDependencies: - bufferutil - encoding @@ -13771,12 +13838,12 @@ snapshots: '@react-native/normalize-colors@0.74.83': {} - '@react-native/virtualized-lists@0.74.83(@types/react@18.3.1)(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1)': + '@react-native/virtualized-lists@0.74.83(@types/react@18.3.1)(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 18.3.1 - react-native: 0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3) + react-native: 0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1) optionalDependencies: '@types/react': 18.3.1 @@ -16246,11 +16313,11 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.27.2(@aws-sdk/client-rds-data@3.583.0)(@cloudflare/workers-types@4.20240524.0)(@libsql/client@0.10.0(bufferutil@4.0.8)(utf-8-validate@6.0.3))(@neondatabase/serverless@0.9.3)(@opentelemetry/api@1.8.0)(@planetscale/database@1.18.0)(@types/better-sqlite3@7.6.10)(@types/pg@8.11.6)(@types/sql.js@1.4.9)(@vercel/postgres@0.8.0)(better-sqlite3@9.6.0)(bun-types@1.0.3)(knex@2.5.1(better-sqlite3@9.6.0)(mysql2@3.11.0)(pg@8.11.5)(sqlite3@5.1.7))(kysely@0.25.0)(mysql2@3.11.0)(pg@8.11.5)(postgres@3.4.4)(sql.js@1.10.3)(sqlite3@5.1.7): + drizzle-orm@0.27.2(@aws-sdk/client-rds-data@3.583.0)(@cloudflare/workers-types@4.20240524.0)(@libsql/client@0.5.6)(@neondatabase/serverless@0.9.3)(@opentelemetry/api@1.8.0)(@planetscale/database@1.18.0)(@types/better-sqlite3@7.6.10)(@types/pg@8.11.6)(@types/sql.js@1.4.9)(@vercel/postgres@0.8.0)(better-sqlite3@9.6.0)(bun-types@1.0.3)(knex@2.5.1(better-sqlite3@9.6.0)(mysql2@3.11.0)(pg@8.11.5)(sqlite3@5.1.7))(kysely@0.25.0)(mysql2@3.11.0)(pg@8.11.5)(postgres@3.4.4)(sql.js@1.10.3)(sqlite3@5.1.7): optionalDependencies: '@aws-sdk/client-rds-data': 3.583.0 '@cloudflare/workers-types': 4.20240524.0 - '@libsql/client': 0.10.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + '@libsql/client': 0.5.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) '@neondatabase/serverless': 0.9.3 '@opentelemetry/api': 1.8.0 '@planetscale/database': 1.18.0 @@ -17087,35 +17154,35 @@ snapshots: expand-template@2.0.3: {} - expo-asset@10.0.6(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)): + expo-asset@10.0.6(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)): dependencies: '@react-native/assets-registry': 0.74.83 - expo: 51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) - expo-constants: 16.0.1(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)) + expo: 51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13) + expo-constants: 16.0.1(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)) invariant: 2.2.4 md5-file: 3.2.3 transitivePeerDependencies: - supports-color - expo-constants@16.0.1(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)): + expo-constants@16.0.1(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)): dependencies: '@expo/config': 9.0.2 - expo: 51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + expo: 51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13) transitivePeerDependencies: - supports-color - expo-file-system@17.0.1(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)): + expo-file-system@17.0.1(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)): dependencies: - expo: 51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + expo: 51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13) - expo-font@12.0.5(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)): + expo-font@12.0.5(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)): dependencies: - expo: 51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + expo: 51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13) fontfaceobserver: 2.3.0 - expo-keep-awake@13.0.2(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)): + expo-keep-awake@13.0.2(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)): dependencies: - expo: 51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + expo: 51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13) expo-modules-autolinking@1.11.1: dependencies: @@ -17129,24 +17196,24 @@ snapshots: dependencies: invariant: 2.2.4 - expo-sqlite@13.4.0(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)): + expo-sqlite@13.4.0(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)): dependencies: '@expo/websql': 1.0.1 - expo: 51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + expo: 51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13) - expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3): + expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13): dependencies: '@babel/runtime': 7.24.6 - '@expo/cli': 0.18.13(bufferutil@4.0.8)(encoding@0.1.13)(expo-modules-autolinking@1.11.1)(utf-8-validate@6.0.3) + '@expo/cli': 0.18.13(bufferutil@4.0.8)(encoding@0.1.13)(expo-modules-autolinking@1.11.1) '@expo/config': 9.0.2 '@expo/config-plugins': 8.0.4 '@expo/metro-config': 0.18.4 '@expo/vector-icons': 14.0.2 babel-preset-expo: 11.0.6(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6)) - expo-asset: 10.0.6(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)) - expo-file-system: 17.0.1(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)) - expo-font: 12.0.5(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)) - expo-keep-awake: 13.0.2(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3)) + expo-asset: 10.0.6(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)) + expo-file-system: 17.0.1(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)) + expo-font: 12.0.5(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)) + expo-keep-awake: 13.0.2(expo@51.0.8(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)) expo-modules-autolinking: 1.11.1 expo-modules-core: 1.12.11 fbemitter: 3.0.0(encoding@0.1.13) @@ -18301,18 +18368,18 @@ snapshots: '@libsql/win32-x64-msvc': 0.2.0 optional: true - libsql@0.4.5: + libsql@0.3.18: dependencies: '@neon-rs/load': 0.0.4 detect-libc: 2.0.2 optionalDependencies: - '@libsql/darwin-arm64': 0.4.5 - '@libsql/darwin-x64': 0.4.5 - '@libsql/linux-arm64-gnu': 0.4.5 - '@libsql/linux-arm64-musl': 0.4.5 - '@libsql/linux-x64-gnu': 0.4.5 - '@libsql/linux-x64-musl': 0.4.5 - '@libsql/win32-x64-msvc': 0.4.5 + '@libsql/darwin-arm64': 0.3.18 + '@libsql/darwin-x64': 0.3.18 + '@libsql/linux-arm64-gnu': 0.3.18 + '@libsql/linux-arm64-musl': 0.3.18 + '@libsql/linux-x64-gnu': 0.3.18 + '@libsql/linux-x64-musl': 0.3.18 + '@libsql/win32-x64-msvc': 0.3.18 lighthouse-logger@1.4.2: dependencies: @@ -18622,12 +18689,12 @@ snapshots: metro-core: 0.80.9 rimraf: 3.0.2 - metro-config@0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3): + metro-config@0.80.9(bufferutil@4.0.8)(encoding@0.1.13): dependencies: connect: 3.7.0 cosmiconfig: 5.2.1 jest-validate: 29.7.0 - metro: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + metro: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13) metro-cache: 0.80.9 metro-core: 0.80.9 metro-runtime: 0.80.9 @@ -18703,13 +18770,13 @@ snapshots: transitivePeerDependencies: - supports-color - metro-transform-worker@0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3): + metro-transform-worker@0.80.9(bufferutil@4.0.8)(encoding@0.1.13): dependencies: '@babel/core': 7.24.6 '@babel/generator': 7.24.6 '@babel/parser': 7.24.6 '@babel/types': 7.24.6 - metro: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + metro: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13) metro-babel-transformer: 0.80.9 metro-cache: 0.80.9 metro-cache-key: 0.80.9 @@ -18723,7 +18790,7 @@ snapshots: - supports-color - utf-8-validate - metro@0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3): + metro@0.80.9(bufferutil@4.0.8)(encoding@0.1.13): dependencies: '@babel/code-frame': 7.24.6 '@babel/core': 7.24.6 @@ -18749,7 +18816,7 @@ snapshots: metro-babel-transformer: 0.80.9 metro-cache: 0.80.9 metro-cache-key: 0.80.9 - metro-config: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + metro-config: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13) metro-core: 0.80.9 metro-file-map: 0.80.9 metro-resolver: 0.80.9 @@ -18757,7 +18824,7 @@ snapshots: metro-source-map: 0.80.9 metro-symbolicate: 0.80.9 metro-transform-plugins: 0.80.9 - metro-transform-worker: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + metro-transform-worker: 0.80.9(bufferutil@4.0.8)(encoding@0.1.13) mime-types: 2.1.35 node-fetch: 2.7.0(encoding@0.1.13) nullthrows: 1.1.1 @@ -18766,7 +18833,7 @@ snapshots: source-map: 0.5.7 strip-ansi: 6.0.1 throat: 5.0.0 - ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 7.5.9(bufferutil@4.0.8) yargs: 17.7.2 transitivePeerDependencies: - bufferutil @@ -19460,7 +19527,7 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-load-config@4.0.1(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme))): + postcss-load-config@4.0.1(postcss@8.4.39)(ts-node@10.9.2(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme))): dependencies: lilconfig: 2.1.0 yaml: 2.3.1 @@ -19571,8 +19638,6 @@ snapshots: promise-inflight@1.0.1: optional: true - promise-limit@2.7.0: {} - promise-retry@2.0.1: dependencies: err-code: 2.0.3 @@ -19652,10 +19717,10 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-devtools-core@5.2.0(bufferutil@4.0.8)(utf-8-validate@6.0.3): + react-devtools-core@5.2.0(bufferutil@4.0.8): dependencies: shell-quote: 1.8.1 - ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 7.5.9(bufferutil@4.0.8) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -19668,19 +19733,19 @@ snapshots: react-is@18.3.1: {} - react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3): + react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1): dependencies: '@jest/create-cache-key-function': 29.7.0 - '@react-native-community/cli': 13.6.6(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + '@react-native-community/cli': 13.6.6(bufferutil@4.0.8)(encoding@0.1.13) '@react-native-community/cli-platform-android': 13.6.6(encoding@0.1.13) '@react-native-community/cli-platform-ios': 13.6.6(encoding@0.1.13) '@react-native/assets-registry': 0.74.83 '@react-native/codegen': 0.74.83(@babel/preset-env@7.24.6(@babel/core@7.24.6)) - '@react-native/community-cli-plugin': 0.74.83(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@6.0.3) + '@react-native/community-cli-plugin': 0.74.83(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(bufferutil@4.0.8)(encoding@0.1.13) '@react-native/gradle-plugin': 0.74.83 '@react-native/js-polyfills': 0.74.83 '@react-native/normalize-colors': 0.74.83 - '@react-native/virtualized-lists': 0.74.83(@types/react@18.3.1)(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@6.0.3))(react@18.3.1) + '@react-native/virtualized-lists': 0.74.83(@types/react@18.3.1)(react-native@0.74.1(@babel/core@7.24.6)(@babel/preset-env@7.24.6(@babel/core@7.24.6))(@types/react@18.3.1)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1))(react@18.3.1) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 @@ -19699,14 +19764,14 @@ snapshots: pretty-format: 26.6.2 promise: 8.3.0 react: 18.3.1 - react-devtools-core: 5.2.0(bufferutil@4.0.8)(utf-8-validate@6.0.3) + react-devtools-core: 5.2.0(bufferutil@4.0.8) react-refresh: 0.14.2 react-shallow-renderer: 16.15.0(react@18.3.1) regenerator-runtime: 0.13.11 scheduler: 0.24.0-canary-efb381bbf-20230505 stacktrace-parser: 0.1.10 whatwg-fetch: 3.6.20 - ws: 6.2.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + ws: 6.2.2(bufferutil@4.0.8) yargs: 17.7.2 optionalDependencies: '@types/react': 18.3.1 @@ -20721,7 +20786,7 @@ snapshots: tslib@2.6.2: {} - tsup@7.2.0(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)))(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)): + tsup@7.2.0(postcss@8.4.39)(ts-node@10.9.2(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)))(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme)): dependencies: bundle-require: 4.0.2(esbuild@0.18.20) cac: 6.7.14 @@ -20731,7 +20796,7 @@ snapshots: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.1(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.12.12)(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme))) + postcss-load-config: 4.0.1(postcss@8.4.39)(ts-node@10.9.2(typescript@5.4.5(patch_hash=q3iy4fwdhi5sis3wty7d4nbsme))) resolve-from: 5.0.0 rollup: 3.27.2 source-map: 0.8.0-beta.0 @@ -21559,17 +21624,15 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.0.2 - ws@6.2.2(bufferutil@4.0.8)(utf-8-validate@6.0.3): + ws@6.2.2(bufferutil@4.0.8): dependencies: async-limiter: 1.0.1 optionalDependencies: bufferutil: 4.0.8 - utf-8-validate: 6.0.3 - ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3): + ws@7.5.9(bufferutil@4.0.8): optionalDependencies: bufferutil: 4.0.8 - utf-8-validate: 6.0.3 ws@8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.3): optionalDependencies: