From 281c6337547bf245910618010c9ed97bafa9c6d4 Mon Sep 17 00:00:00 2001 From: Pedro Rodrigues <44656907+Rodriguespn@users.noreply.github.com> Date: Tue, 1 Oct 2024 22:22:40 +0100 Subject: [PATCH] Fix/branch clean up for pr drizzle kit (#29) * branch clean up for pr * wip [last visited drizzle-kit/src/cli/validations/common.ts * wip [last visited drizzle-kit/src/schemaValidator.ts * drizzle kit cleaning * lint fix * remove unecessary readme.md --- changelogs/drizzle-kit/0.25.0.md | 144 - changelogs/drizzle-orm/0.34.0.md | 255 - drizzle-kit/build.ts | 3 - drizzle-kit/package.json | 5 +- drizzle-kit/pnpm-lock.yaml | 7603 +++++++++++++++++ drizzle-kit/schema.ts | 0 drizzle-kit/src/cli/commands/introspect.ts | 113 - .../src/cli/commands/libSqlPushUtils.ts | 346 - drizzle-kit/src/cli/commands/migrate.ts | 93 +- drizzle-kit/src/cli/commands/push.ts | 113 +- .../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 | 91 +- drizzle-kit/src/cli/utils.ts | 2 +- drizzle-kit/src/cli/validations/common.ts | 3 +- drizzle-kit/src/cli/validations/libsql.ts | 27 - drizzle-kit/src/cli/validations/outputs.ts | 2 +- drizzle-kit/src/cli/validations/sqlite.ts | 5 + drizzle-kit/src/index.ts | 7 +- drizzle-kit/src/jsonStatements.ts | 198 +- drizzle-kit/src/schemaValidator.ts | 2 +- .../src/serializer/sqliteSerializer.ts | 1 + drizzle-kit/src/serializer/studio.ts | 29 +- drizzle-kit/src/snapshotsDiffer.ts | 429 +- drizzle-kit/src/sqlgenerator.ts | 509 +- drizzle-kit/src/statementCombiner.ts | 450 - drizzle-kit/src/utils.ts | 21 +- 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 --- pnpm-lock.yaml | 276 +- 48 files changed, 8725 insertions(+), 9940 deletions(-) delete mode 100644 changelogs/drizzle-kit/0.25.0.md delete mode 100644 changelogs/drizzle-orm/0.34.0.md create mode 100644 drizzle-kit/pnpm-lock.yaml create mode 100644 drizzle-kit/schema.ts delete mode 100644 drizzle-kit/src/cli/commands/libSqlPushUtils.ts delete mode 100644 drizzle-kit/src/cli/validations/libsql.ts 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/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)) - } -}) -``` 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/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/introspect.ts b/drizzle-kit/src/cli/commands/introspect.ts index 9b5a044f6..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'; @@ -203,7 +202,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); @@ -471,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/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/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/commands/push.ts b/drizzle-kit/src/cli/commands/push.ts index 0cb3a8d28..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, @@ -436,12 +434,11 @@ export const sqlitePush = async ( tablesToRemove, tablesToTruncate, infoToPrint, - schemasToRemove, } = await sqliteSuggestions( db, statements.statements, - statements.squashedPrev, statements.squashedCur, + statements.squashedPrev, statements.meta!, ); @@ -521,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..d8958f7c1 100644 --- a/drizzle-kit/src/cli/schema.ts +++ b/drizzle-kit/src/cli/schema.ts @@ -1,20 +1,11 @@ -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 { checkHandler } from './commands/check'; +import { assertOrmCoreVersion, assertPackages, assertStudioNodeVersion, ormVersionGt } from './utils'; import '../@types/utils'; -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, @@ -25,14 +16,22 @@ 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') .enum(...dialects) - .desc(`Database dialect: 'postgresql', 'mysql', 'sqlite' or 'turso'`); + .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( @@ -79,7 +78,7 @@ export const generate = command({ prepareAndMigratePg, prepareAndMigrateMysql, prepareAndMigrateSqlite, - prepareAndMigrateLibSQL, + prepareAndMigrateSingleStore, } = await import('./commands/migrate'); const dialect = opts.dialect; @@ -89,10 +88,8 @@ export const generate = command({ await prepareAndMigrateMysql(opts); } else if (dialect === 'sqlite') { await prepareAndMigrateSqlite(opts); - } else if (dialect === 'turso') { - await prepareAndMigrateLibSQL(opts); } else if (dialect === 'singlestore') { - await prepareAndMigrateSingleStore(opts); + await prepareAndMigrateSqlite(opts); } else { assertUnreachable(dialect); } @@ -155,20 +152,20 @@ export const migrate = command({ migrationsSchema: schema, }), ); - } else if (dialect === 'sqlite') { - const { connectToSQLite } = await import('./connections'); - const { migrate } = await connectToSQLite(credentials); + } else if (dialect === 'singlestore') { + const { connectToSingleStore } = await import('./connections'); + const { migrate } = await connectToSingleStore(credentials); await renderWithTask( new MigrateProgress(), migrate({ - migrationsFolder: opts.out, + migrationsFolder: out, migrationsTable: table, migrationsSchema: schema, }), ); - } else if (dialect === 'turso') { - const { connectToLibSQL } = await import('./connections'); - const { migrate } = await connectToLibSQL(credentials); + } else if (dialect === 'sqlite') { + const { connectToSQLite } = await import('./connections'); + const { migrate } = await connectToSQLite(credentials); await renderWithTask( new MigrateProgress(), migrate({ @@ -177,17 +174,6 @@ export const migrate = command({ 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 { assertUnreachable(dialect); } @@ -333,16 +319,6 @@ export const push = command({ 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( @@ -408,12 +384,12 @@ export const up = command({ upMysqlHandler(out); } - if (dialect === 'singlestore') { - upSinglestoreHandler(out); + if (dialect === 'sqlite') { + upSqliteHandler(out); } - if (dialect === 'sqlite' || dialect === 'turso') { - upSqliteHandler(out); + if (dialect === 'singlestore') { + upSinglestoreHandler(out); } }, }); @@ -536,16 +512,6 @@ export const pull = command({ 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( @@ -616,6 +582,8 @@ export const studio = command({ drizzleForMySQL, prepareSQLiteSchema, drizzleForSQLite, + prepareSingleStoreSchema, + drizzleForSingleStore, } = await import('../serializer/studio'); let setup: Setup; @@ -656,11 +624,6 @@ export const studio = command({ ? 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) 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/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/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/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..090b0cdde 100644 --- a/drizzle-kit/src/jsonStatements.ts +++ b/drizzle-kit/src/jsonStatements.ts @@ -1,16 +1,10 @@ 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'; import { Index, PgSchema, PgSquasher } from './serializer/pgSchema'; import { SingleStoreKitInternals, SingleStoreSchema, SingleStoreSquasher } from './serializer/singlestoreSchema'; -import { - SQLiteKitInternals, - SQLiteSchemaInternal, - SQLiteSchemaSquashed, - SQLiteSquasher, -} from './serializer/sqliteSchema'; +import { SQLiteKitInternals, SQLiteSquasher } from './serializer/sqliteSchema'; import { AlteredColumn, Column, Sequence, Table } from './snapshotsDiffer'; export interface JsonSqliteCreateTableStatement { @@ -41,23 +35,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 +173,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 +519,6 @@ export type JsonAlterColumnStatement = | JsonAlterColumnDropIdentityStatement; export type JsonStatement = - | JsonRecreateTableStatement | JsonAlterColumnStatement | JsonCreateTableStatement | JsonDropTableStatement @@ -2050,55 +2022,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 +2329,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 +2344,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 = ( 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/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..11d126013 100644 --- a/drizzle-kit/src/snapshotsDiffer.ts +++ b/drizzle-kit/src/snapshotsDiffer.ts @@ -63,8 +63,6 @@ import { prepareDropReferencesJson, prepareDropSequenceJson, prepareDropTableJson, - prepareLibSQLCreateReferencesJson, - prepareLibSQLDropReferencesJson, prepareMoveEnumJson, prepareMoveSequenceJson, prepareMySqlCreateTableJson, @@ -87,7 +85,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 +2468,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 +2484,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..07b24b6c9 100644 --- a/drizzle-kit/src/sqlgenerator.ts +++ b/drizzle-kit/src/sqlgenerator.ts @@ -42,7 +42,6 @@ import { JsonDropTableStatement, JsonMoveSequenceStatement, JsonPgCreateIndexStatement, - JsonRecreateTableStatement, JsonRenameColumnStatement, JsonRenameSchema, JsonRenameSequenceStatement, @@ -55,7 +54,7 @@ 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,11 @@ 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 +3175,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 +3195,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 +3236,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/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 }; -} 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, - ); -}); 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