diff --git a/.gitignore b/.gitignore index ed4d41093b..3098feb9d6 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,10 @@ meta_shared.json # Ignore test directory media folder/files /media test/media +*payloadtests.db +*payloadtests.db-journal +*payloadtests.db-shm +*payloadtests.db-wal /versions # Created by https://www.toptal.com/developers/gitignore/api/node,macos,windows,webstorm,sublimetext,visualstudiocode diff --git a/.idea/payload.iml b/.idea/payload.iml index b5f41b2a2d..8590770759 100644 --- a/.idea/payload.iml +++ b/.idea/payload.iml @@ -75,8 +75,12 @@ + + + + - \ No newline at end of file + diff --git a/docs/database/postgres.mdx b/docs/database/postgres.mdx index 538bf404a2..09da6d2e6f 100644 --- a/docs/database/postgres.mdx +++ b/docs/database/postgres.mdx @@ -33,18 +33,18 @@ export default buildConfig({ ## Options -| Option | Description | -|-----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `pool` \* | [Pool connection options](https://orm.drizzle.team/docs/quick-postgresql/node-postgres) that will be passed to Drizzle and `node-postgres`. | -| `push` | Disable Drizzle's [`db push`](https://orm.drizzle.team/kit-docs/overview#prototyping-with-db-push) in development mode. By default, `push` is enabled for development mode only. | -| `migrationDir` | Customize the directory that migrations are stored. | -| `logger` | The instance of the logger to be passed to drizzle. By default Payload's will be used. | -| `schemaName` | A string for the postgres schema to use, defaults to 'public'. | -| `localesSuffix` | A string appended to the end of table names for storing localized fields. Default is '_locales'. | -| `relationshipsSuffix` | A string appended to the end of table names for storing relationships. Default is '_rels'. | -| `versionsSuffix` | A string appended to the end of table names for storing versions. Defaults to '_v'. | - - +| Option | Description | +|-----------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `pool` \* | [Pool connection options](https://orm.drizzle.team/docs/quick-postgresql/node-postgres) that will be passed to Drizzle and `node-postgres`. | +| `push` | Disable Drizzle's [`db push`](https://orm.drizzle.team/kit-docs/overview#prototyping-with-db-push) in development mode. By default, `push` is enabled for development mode only. | +| `migrationDir` | Customize the directory that migrations are stored. | +| `logger` | The instance of the logger to be passed to drizzle. By default Payload's will be used. | +| `schemaName` (experimental) | A string for the postgres schema to use, defaults to 'public'. | +| `idType` | A string of 'serial', or 'uuid' that is used for the data type given to id columns. | +| `transactionOptions` | A PgTransactionConfig object for transactions, or set to `false` to disable using transactions. [More details](https://orm.drizzle.team/docs/transactions) | +| `localesSuffix` | A string appended to the end of table names for storing localized fields. Default is '_locales'. | +| `relationshipsSuffix` | A string appended to the end of table names for storing relationships. Default is '_rels'. | +| `versionsSuffix` | A string appended to the end of table names for storing versions. Defaults to '_v'. | ## Access to Drizzle diff --git a/docs/database/sqlite.mdx b/docs/database/sqlite.mdx new file mode 100644 index 0000000000..a92ef4787c --- /dev/null +++ b/docs/database/sqlite.mdx @@ -0,0 +1,81 @@ +--- +title: SQLite +label: SQLite +order: 60 +desc: Payload supports SQLite through an officially supported Drizzle Database Adapter. +keywords: SQLite, documentation, typescript, Content Management System, cms, headless, javascript, node, react, nextjs +--- + +To use Payload with SQLite, install the package `@payloadcms/db-sqlite`. It leverages Drizzle ORM and `libSQL` to interact with a SQLite database that you provide. + +It automatically manages changes to your database for you in development mode, and exposes a full suite of migration controls for you to leverage in order to keep other database environments in sync with your schema. DDL transformations are automatically generated. + +To configure Payload to use SQLite, pass the `sqliteAdapter` to your Payload Config as follows: + +```ts +import { sqliteAdapter } from '@payloadcms/db-sqlite' + +export default buildConfig({ + // Your config goes here + collections: [ + // Collections go here + ], + // Configure the SQLite adapter here + db: sqliteAdapter({ + // SQLite-specific arguments go here. + // `client.url` is required. + client: { + url: process.env.DATABASE_URL, + authToken: process.env.DATABASE_AUTH_TOKEN, + } + }), +}) +``` + +## Options + +| Option | Description | +|-----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `client` \* | [Client connection options](https://orm.drizzle.team/docs/get-started-sqlite#turso) that will be passed to `createClient` from `@libsql/client`. | +| `push` | Disable Drizzle's [`db push`](https://orm.drizzle.team/kit-docs/overview#prototyping-with-db-push) in development mode. By default, `push` is enabled for development mode only. | +| `migrationDir` | Customize the directory that migrations are stored. | +| `logger` | The instance of the logger to be passed to drizzle. By default Payload's will be used. | +| `transactionOptions` | A SQLiteTransactionConfig object for transactions, or set to `false` to disable using transactions. [More details](https://orm.drizzle.team/docs/transactions) | +| `localesSuffix` | A string appended to the end of table names for storing localized fields. Default is '_locales'. | +| `relationshipsSuffix` | A string appended to the end of table names for storing relationships. Default is '_rels'. | +| `versionsSuffix` | A string appended to the end of table names for storing versions. Defaults to '_v'. | + + + +## Access to Drizzle + +After Payload is initialized, this adapter will expose the full power of Drizzle to you for use if you need it. + +You can access Drizzle as follows: + +```text +payload.db.drizzle +``` + +## Tables and relations + +In addition to exposing Drizzle directly, all of the tables and Drizzle relations are exposed for you via the `payload.db` property as well. + +- Tables - `payload.db.tables` +- Relations - `payload.db.relations` + +## Prototyping in development mode + +Drizzle exposes two ways to work locally in development mode. + +The first is [`db push`](https://orm.drizzle.team/kit-docs/overview#prototyping-with-db-push), which automatically pushes changes you make to your Payload Config (and therefore, Drizzle schema) to your database so you don't have to manually migrate every time you change your Payload Config. This only works in development mode, and should not be mixed with manually running [`migrate`](/docs/database/migrations) commands. + +You will be warned if any changes that you make will entail data loss while in development mode. Push is enabled by default, but you can opt out if you'd like. + +Alternatively, you can disable `push` and rely solely on migrations to keep your local database in sync with your Payload Config. + +## Migration workflows + +In SQLite, migrations are a fundamental aspect of working with Payload and you should become familiar with how they work. + +For more information about migrations, [click here](/docs/beta/database/migrations#when-to-run-migrations). diff --git a/docs/database/transactions.mdx b/docs/database/transactions.mdx index c066e7b1d9..703a8b12c3 100644 --- a/docs/database/transactions.mdx +++ b/docs/database/transactions.mdx @@ -68,3 +68,7 @@ The following functions can be used for managing transactions: `payload.db.beginTransaction` - Starts a new session and returns a transaction ID for use in other Payload Local API calls. `payload.db.commitTransaction` - Takes the identifier for the transaction, finalizes any changes. `payload.db.rollbackTransaction` - Takes the identifier for the transaction, discards any changes. + +## Disabling Transactions + +If you wish to disable transactions entirely, you can do so by passing `false` as the `transactionOptions` in your database adapter configuration. All the official Payload database adapters support this option. diff --git a/package.json b/package.json index 8acfb1987f..2a34ab5eb8 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,8 @@ "build:create-payload-app": "turbo build --filter create-payload-app", "build:db-mongodb": "turbo build --filter db-mongodb", "build:db-postgres": "turbo build --filter db-postgres", + "build:db-sqlite": "turbo build --filter db-sqlite", + "build:drizzle": "turbo build --filter drizzle", "build:email-nodemailer": "turbo build --filter email-nodemailer", "build:email-resend": "turbo build --filter email-resend", "build:eslint-config": "turbo build --filter eslint-config", @@ -93,6 +95,7 @@ }, "devDependencies": { "@jest/globals": "29.7.0", + "@libsql/client": "0.6.2", "@next/bundle-analyzer": "15.0.0-canary.53", "@payloadcms/eslint-config": "workspace:*", "@payloadcms/eslint-plugin": "workspace:*", @@ -116,7 +119,6 @@ "create-payload-app": "workspace:*", "cross-env": "7.0.3", "dotenv": "16.4.5", - "drizzle-kit": "0.20.14-1f2c838", "drizzle-orm": "0.29.4", "escape-html": "^1.0.3", "execa": "5.1.1", diff --git a/packages/db-postgres/bundle.js b/packages/db-postgres/bundle.js index 7b1718bda2..007a3a1243 100644 --- a/packages/db-postgres/bundle.js +++ b/packages/db-postgres/bundle.js @@ -5,7 +5,7 @@ import { fileURLToPath } from 'url' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) import { commonjs } from '@hyrious/esbuild-plugin-commonjs' - +throw new Error('asfdadsf') async function build() { const resultServer = await esbuild.build({ entryPoints: ['src/index.ts'], @@ -18,9 +18,9 @@ async function build() { '*.scss', '*.css', 'drizzle-kit', - 'libsql', 'pg', '@payloadcms/translations', + '@payloadcms/drizzle', 'payload', 'payload/*', ], diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index ce9c09d0e6..34a1144dc7 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -40,11 +40,12 @@ "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths", "build:types": "tsc --emitDeclarationOnly --outDir dist", "clean": "rimraf {dist,*.tsbuildinfo}", + "prepack": "pnpm clean && pnpm turbo build", "prepublishOnly": "pnpm clean && pnpm turbo build", "renamePredefinedMigrations": "tsx ./scripts/renamePredefinedMigrations.ts" }, "dependencies": { - "@libsql/client": "^0.5.2", + "@payloadcms/drizzle": "workspace:*", "console-table-printer": "2.11.2", "drizzle-kit": "0.20.14-1f2c838", "drizzle-orm": "0.29.4", diff --git a/packages/db-postgres/src/connect.ts b/packages/db-postgres/src/connect.ts index a8ba989a91..b05c0c74cc 100644 --- a/packages/db-postgres/src/connect.ts +++ b/packages/db-postgres/src/connect.ts @@ -1,13 +1,12 @@ +import type { DrizzleAdapter } from '@payloadcms/drizzle/types' import type { Connect, Payload } from 'payload' -import { sql } from 'drizzle-orm' +import { pushDevSchema } from '@payloadcms/drizzle' import { drizzle } from 'drizzle-orm/node-postgres' import pg from 'pg' import type { PostgresAdapter } from './types.js' -import { pushDevSchema } from './utilities/pushDevSchema.js' - const connectWithReconnect = async function ({ adapter, payload, @@ -71,12 +70,7 @@ export const connect: Connect = async function connect( if (!hotReload) { if (process.env.PAYLOAD_DROP_DATABASE === 'true') { this.payload.logger.info(`---- DROPPING TABLES SCHEMA(${this.schemaName || 'public'}) ----`) - await this.drizzle.execute( - sql.raw(` - drop schema if exists ${this.schemaName || 'public'} cascade; - create schema ${this.schemaName || 'public'}; - `), - ) + await this.dropDatabase({ adapter: this }) this.payload.logger.info('---- DROPPED TABLES ----') } } @@ -92,7 +86,7 @@ export const connect: Connect = async function connect( process.env.PAYLOAD_MIGRATING !== 'true' && this.push !== false ) { - await pushDevSchema(this) + await pushDevSchema(this as unknown as DrizzleAdapter) } if (typeof this.resolveInitializing === 'function') this.resolveInitializing() diff --git a/packages/db-postgres/src/count.ts b/packages/db-postgres/src/count.ts deleted file mode 100644 index ed8b5b8a24..0000000000 --- a/packages/db-postgres/src/count.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { Count, SanitizedCollectionConfig } from 'payload' - -import { sql } from 'drizzle-orm' -import toSnakeCase from 'to-snake-case' - -import type { ChainedMethods } from './find/chainMethods.js' -import type { PostgresAdapter } from './types.js' - -import { chainMethods } from './find/chainMethods.js' -import buildQuery from './queries/buildQuery.js' - -export const count: Count = async function count( - this: PostgresAdapter, - { collection, locale, req, where: whereArg }, -) { - const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config - - const tableName = this.tableNameMap.get(toSnakeCase(collectionConfig.slug)) - - const db = this.sessions[await req.transactionID]?.db || this.drizzle - const table = this.tables[tableName] - - const { joins, where } = await buildQuery({ - adapter: this, - fields: collectionConfig.fields, - locale, - tableName, - where: whereArg, - }) - - const selectCountMethods: ChainedMethods = [] - - Object.entries(joins).forEach(([joinTable, condition]) => { - if (joinTable) { - selectCountMethods.push({ - args: [this.tables[joinTable], condition], - method: 'leftJoin', - }) - } - }) - - const countResult = await chainMethods({ - methods: selectCountMethods, - query: db - .select({ - count: sql`count - (DISTINCT ${this.tables[tableName].id})`, - }) - .from(table) - .where(where), - }) - - return { totalDocs: Number(countResult[0].count) } -} diff --git a/packages/db-postgres/src/countDistinct.ts b/packages/db-postgres/src/countDistinct.ts new file mode 100644 index 0000000000..4a12a6a6fc --- /dev/null +++ b/packages/db-postgres/src/countDistinct.ts @@ -0,0 +1,33 @@ +import type { ChainedMethods, TransactionPg } from '@payloadcms/drizzle/types' + +import { chainMethods } from '@payloadcms/drizzle' +import { sql } from 'drizzle-orm' + +import type { CountDistinct, PostgresAdapter } from './types.js' + +export const countDistinct: CountDistinct = async function countDistinct( + this: PostgresAdapter, + { db, joins, tableName, where }, +) { + const chainedMethods: ChainedMethods = [] + + joins.forEach(({ condition, table }) => { + chainedMethods.push({ + args: [table, condition], + method: 'leftJoin', + }) + }) + + const countResult = await chainMethods({ + methods: chainedMethods, + query: (db as TransactionPg) + .select({ + count: sql`count + (DISTINCT ${this.tables[tableName].id})`, + }) + .from(this.tables[tableName]) + .where(where), + }) + + return Number(countResult[0].count) +} diff --git a/packages/db-postgres/src/queries/createJSONQuery/convertPathToJSONTraversal.ts b/packages/db-postgres/src/createJSONQuery/convertPathToJSONTraversal.ts similarity index 100% rename from packages/db-postgres/src/queries/createJSONQuery/convertPathToJSONTraversal.ts rename to packages/db-postgres/src/createJSONQuery/convertPathToJSONTraversal.ts diff --git a/packages/db-postgres/src/queries/createJSONQuery/formatJSONPathSegment.ts b/packages/db-postgres/src/createJSONQuery/formatJSONPathSegment.ts similarity index 100% rename from packages/db-postgres/src/queries/createJSONQuery/formatJSONPathSegment.ts rename to packages/db-postgres/src/createJSONQuery/formatJSONPathSegment.ts diff --git a/packages/db-postgres/src/queries/createJSONQuery/index.ts b/packages/db-postgres/src/createJSONQuery/index.ts similarity index 100% rename from packages/db-postgres/src/queries/createJSONQuery/index.ts rename to packages/db-postgres/src/createJSONQuery/index.ts diff --git a/packages/db-postgres/src/createMigration.ts b/packages/db-postgres/src/createMigration.ts index c80ee79adb..765cf01bd4 100644 --- a/packages/db-postgres/src/createMigration.ts +++ b/packages/db-postgres/src/createMigration.ts @@ -1,6 +1,5 @@ -/* eslint-disable no-restricted-syntax, no-await-in-loop */ import type { DrizzleSnapshotJSON } from 'drizzle-kit/payload' -import type { CreateMigration, MigrationTemplateArgs } from 'payload' +import type { CreateMigration } from 'payload' import fs from 'fs' import { createRequire } from 'module' @@ -11,38 +10,11 @@ import { fileURLToPath } from 'url' import type { PostgresAdapter } from './types.js' +import { defaultDrizzleSnapshot } from './defaultSnapshot.js' +import { getMigrationTemplate } from './getMigrationTemplate.js' + const require = createRequire(import.meta.url) -const migrationTemplate = ({ - downSQL, - imports, - upSQL, -}: MigrationTemplateArgs): string => `import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres' -${imports ? `${imports}\n` : ''} -export async function up({ payload, req }: MigrateUpArgs): Promise { -${upSQL} -}; - -export async function down({ payload, req }: MigrateDownArgs): Promise { -${downSQL} -}; -` - -const getDefaultDrizzleSnapshot = (): DrizzleSnapshotJSON => ({ - id: '00000000-0000-0000-0000-000000000000', - _meta: { - columns: {}, - schemas: {}, - tables: {}, - }, - dialect: 'pg', - enums: {}, - prevId: '00000000-0000-0000-0000-00000000000', - schemas: {}, - tables: {}, - version: '5', -}) - export const createMigration: CreateMigration = async function createMigration( this: PostgresAdapter, { file, forceAcceptWarning, migrationName, payload }, @@ -75,7 +47,7 @@ export const createMigration: CreateMigration = async function createMigration( const filePath = `${dir}/${fileName}` - let drizzleJsonBefore = getDefaultDrizzleSnapshot() + let drizzleJsonBefore = defaultDrizzleSnapshot if (!upSQL) { // Get latest migration snapshot @@ -93,7 +65,7 @@ export const createMigration: CreateMigration = async function createMigration( const sqlStatementsUp = await generateMigration(drizzleJsonBefore, drizzleJsonAfter) const sqlStatementsDown = await generateMigration(drizzleJsonAfter, drizzleJsonBefore) - const sqlExecute = 'await payload.db.drizzle.execute(sql`' + const sqlExecute = 'await db.execute(sql`' if (sqlStatementsUp?.length) { upSQL = `${sqlExecute}\n ${sqlStatementsUp?.join('\n')}\`)` @@ -121,15 +93,15 @@ export const createMigration: CreateMigration = async function createMigration( process.exit(0) } } - } - // write schema - fs.writeFileSync(`${filePath}.json`, JSON.stringify(drizzleJsonAfter, null, 2)) + // write schema + fs.writeFileSync(`${filePath}.json`, JSON.stringify(drizzleJsonAfter, null, 2)) + } // write migration fs.writeFileSync( `${filePath}.ts`, - migrationTemplate({ + getMigrationTemplate({ downSQL: downSQL || ` // Migration code`, imports, upSQL: upSQL || ` // Migration code`, diff --git a/packages/db-postgres/src/defaultSnapshot.ts b/packages/db-postgres/src/defaultSnapshot.ts new file mode 100644 index 0000000000..e3453c35d4 --- /dev/null +++ b/packages/db-postgres/src/defaultSnapshot.ts @@ -0,0 +1,16 @@ +import type { DrizzleSnapshotJSON } from 'drizzle-kit/payload' + +export const defaultDrizzleSnapshot: DrizzleSnapshotJSON = { + id: '00000000-0000-0000-0000-000000000000', + _meta: { + columns: {}, + schemas: {}, + tables: {}, + }, + dialect: 'pg', + enums: {}, + prevId: '00000000-0000-0000-0000-00000000000', + schemas: {}, + tables: {}, + version: '5', +} diff --git a/packages/db-postgres/src/deleteWhere.ts b/packages/db-postgres/src/deleteWhere.ts new file mode 100644 index 0000000000..c7fd178374 --- /dev/null +++ b/packages/db-postgres/src/deleteWhere.ts @@ -0,0 +1,8 @@ +import type { TransactionPg } from '@payloadcms/drizzle/types' + +import type { DeleteWhere } from './types.js' + +export const deleteWhere: DeleteWhere = async function deleteWhere({ db, tableName, where }) { + const table = this.tables[tableName] + await (db as TransactionPg).delete(table).where(where) +} diff --git a/packages/db-postgres/src/dropDatabase.ts b/packages/db-postgres/src/dropDatabase.ts new file mode 100644 index 0000000000..f019575a75 --- /dev/null +++ b/packages/db-postgres/src/dropDatabase.ts @@ -0,0 +1,9 @@ +import type { DropDatabase } from './types.js' + +export const dropDatabase: DropDatabase = async function dropDatabase({ adapter }) { + await adapter.execute({ + drizzle: adapter.drizzle, + raw: `drop schema if exists ${this.schemaName || 'public'} cascade; + create schema ${this.schemaName || 'public'};`, + }) +} diff --git a/packages/db-postgres/src/execute.ts b/packages/db-postgres/src/execute.ts new file mode 100644 index 0000000000..3b311617c0 --- /dev/null +++ b/packages/db-postgres/src/execute.ts @@ -0,0 +1,13 @@ +import { sql } from 'drizzle-orm' + +import type { Execute } from './types.js' + +export const execute: Execute = function execute({ db, drizzle, raw, sql: statement }) { + const executeFrom = db ?? drizzle + + if (raw) { + return executeFrom.execute(sql.raw(raw)) + } else { + return executeFrom.execute(sql`${statement}`) + } +} diff --git a/packages/db-postgres/src/getMigrationTemplate.ts b/packages/db-postgres/src/getMigrationTemplate.ts new file mode 100644 index 0000000000..2c6f07b08a --- /dev/null +++ b/packages/db-postgres/src/getMigrationTemplate.ts @@ -0,0 +1,16 @@ +import type { MigrationTemplateArgs } from 'payload' + +export const getMigrationTemplate = ({ + downSQL, + imports, + upSQL, +}: MigrationTemplateArgs): string => `import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres' +${imports ? `${imports}\n` : ''} +export async function up({ db, payload, req }: MigrateUpArgs): Promise { +${upSQL} +} + +export async function down({ db, payload, req }: MigrateDownArgs): Promise { +${downSQL} +} +` diff --git a/packages/db-postgres/src/index.ts b/packages/db-postgres/src/index.ts index f28875735f..c426753670 100644 --- a/packages/db-postgres/src/index.ts +++ b/packages/db-postgres/src/index.ts @@ -1,42 +1,54 @@ import type { DatabaseAdapterObj, Payload } from 'payload' -import fs from 'fs' -import path from 'path' +import { + beginTransaction, + commitTransaction, + count, + create, + createGlobal, + createGlobalVersion, + createVersion, + deleteMany, + deleteOne, + deleteVersions, + destroy, + find, + findGlobal, + findGlobalVersions, + findMigrationDir, + findOne, + findVersions, + migrate, + migrateDown, + migrateFresh, + migrateRefresh, + migrateReset, + migrateStatus, + operatorMap, + queryDrafts, + rollbackTransaction, + updateGlobal, + updateGlobalVersion, + updateOne, + updateVersion, +} from '@payloadcms/drizzle' import { createDatabaseAdapter } from 'payload' import type { Args, PostgresAdapter } from './types.js' import { connect } from './connect.js' -import { count } from './count.js' -import { create } from './create.js' -import { createGlobal } from './createGlobal.js' -import { createGlobalVersion } from './createGlobalVersion.js' +import { countDistinct } from './countDistinct.js' +import { convertPathToJSONTraversal } from './createJSONQuery/convertPathToJSONTraversal.js' +import { createJSONQuery } from './createJSONQuery/index.js' import { createMigration } from './createMigration.js' -import { createVersion } from './createVersion.js' -import { deleteMany } from './deleteMany.js' -import { deleteOne } from './deleteOne.js' -import { deleteVersions } from './deleteVersions.js' -import { destroy } from './destroy.js' -import { find } from './find.js' -import { findGlobal } from './findGlobal.js' -import { findGlobalVersions } from './findGlobalVersions.js' -import { findOne } from './findOne.js' -import { findVersions } from './findVersions.js' +import { defaultDrizzleSnapshot } from './defaultSnapshot.js' +import { deleteWhere } from './deleteWhere.js' +import { dropDatabase } from './dropDatabase.js' +import { execute } from './execute.js' +import { getMigrationTemplate } from './getMigrationTemplate.js' import { init } from './init.js' -import { migrate } from './migrate.js' -import { migrateDown } from './migrateDown.js' -import { migrateFresh } from './migrateFresh.js' -import { migrateRefresh } from './migrateRefresh.js' -import { migrateReset } from './migrateReset.js' -import { migrateStatus } from './migrateStatus.js' -import { queryDrafts } from './queryDrafts.js' -import { beginTransaction } from './transactions/beginTransaction.js' -import { commitTransaction } from './transactions/commitTransaction.js' -import { rollbackTransaction } from './transactions/rollbackTransaction.js' -import { updateOne } from './update.js' -import { updateGlobal } from './updateGlobal.js' -import { updateGlobalVersion } from './updateGlobalVersion.js' -import { updateVersion } from './updateVersion.js' +import { insert } from './insert.js' +import { requireDrizzleKit } from './requireDrizzleKit.js' export type { MigrateDownArgs, MigrateUpArgs } from './types.js' @@ -58,13 +70,19 @@ export function postgresAdapter(args: Args): DatabaseAdapterObj return createDatabaseAdapter({ name: 'postgres', + defaultDrizzleSnapshot, drizzle: undefined, enums: {}, + features: { + json: true, + }, fieldConstraints: {}, + getMigrationTemplate, idType: postgresIDType, initializing, localesSuffix: args.localesSuffix || '_locales', logger: args.logger, + operators: operatorMap, pgSchema: undefined, pool: undefined, poolOptions: args.pool, @@ -76,29 +94,37 @@ export function postgresAdapter(args: Args): DatabaseAdapterObj sessions: {}, tableNameMap: new Map(), tables: {}, + transactionOptions: args.transactionOptions || undefined, versionsSuffix: args.versionsSuffix || '_v', // DatabaseAdapter - beginTransaction, + beginTransaction: args.transactionOptions === false ? undefined : beginTransaction, commitTransaction, connect, + convertPathToJSONTraversal, count, + countDistinct, create, createGlobal, createGlobalVersion, + createJSONQuery, createMigration, createVersion, defaultIDType: payloadIDType, deleteMany, deleteOne, deleteVersions, + deleteWhere, destroy, + dropDatabase, + execute, find, findGlobal, findGlobalVersions, findOne, findVersions, init, + insert, migrate, migrateDown, migrateFresh, @@ -109,6 +135,7 @@ export function postgresAdapter(args: Args): DatabaseAdapterObj payload, queryDrafts, rejectInitializing, + requireDrizzleKit, resolveInitializing, rollbackTransaction, updateGlobal, @@ -123,42 +150,3 @@ export function postgresAdapter(args: Args): DatabaseAdapterObj init: adapter, } } - -/** - * Attempt to find migrations directory. - * - * Checks for the following directories in order: - * - `migrationDir` argument from Payload config - * - `src/migrations` - * - `dist/migrations` - * - `migrations` - * - * Defaults to `src/migrations` - * - * @param migrationDir - * @returns - */ -function findMigrationDir(migrationDir?: string): string { - const cwd = process.cwd() - const srcDir = path.resolve(cwd, 'src/migrations') - const distDir = path.resolve(cwd, 'dist/migrations') - const relativeMigrations = path.resolve(cwd, 'migrations') - - // Use arg if provided - if (migrationDir) return migrationDir - - // Check other common locations - if (fs.existsSync(srcDir)) { - return srcDir - } - - if (fs.existsSync(distDir)) { - return distDir - } - - if (fs.existsSync(relativeMigrations)) { - return relativeMigrations - } - - return srcDir -} diff --git a/packages/db-postgres/src/init.ts b/packages/db-postgres/src/init.ts index 35c87c71d9..f41548355e 100644 --- a/packages/db-postgres/src/init.ts +++ b/packages/db-postgres/src/init.ts @@ -8,8 +8,8 @@ import toSnakeCase from 'to-snake-case' import type { PostgresAdapter } from './types.js' +import { createTableName } from '../../drizzle/src/createTableName.js' import { buildTable } from './schema/build.js' -import { createTableName } from './schema/createTableName.js' export const init: Init = function init(this: PostgresAdapter) { if (this.schemaName) { @@ -17,7 +17,6 @@ export const init: Init = function init(this: PostgresAdapter) { } else { this.pgSchema = { table: pgTable } } - if (this.payload.config.localization) { this.enums.enum__locales = pgEnum( '_locales', diff --git a/packages/db-postgres/src/insert.ts b/packages/db-postgres/src/insert.ts new file mode 100644 index 0000000000..9f6fd0a06a --- /dev/null +++ b/packages/db-postgres/src/insert.ts @@ -0,0 +1,25 @@ +import type { TransactionPg } from '@payloadcms/drizzle/types' + +import type { Insert } from './types.js' + +export const insert: Insert = async function insert({ + db, + onConflictDoUpdate, + tableName, + values, +}): Promise[]> { + const table = this.tables[tableName] + let result + + if (onConflictDoUpdate) { + result = await (db as TransactionPg) + .insert(table) + .values(values) + .onConflictDoUpdate(onConflictDoUpdate) + .returning() + } else { + result = await (db as TransactionPg).insert(table).values(values).returning() + } + + return result +} diff --git a/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/index.ts b/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/index.ts index f1514c4492..751bf540a4 100644 --- a/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/index.ts +++ b/packages/db-postgres/src/predefinedMigrations/v2-v3/fetchAndResave/index.ts @@ -1,15 +1,17 @@ +import type { TransactionPg } from '@payloadcms/drizzle/types' import type { Field, Payload, PayloadRequest } from 'payload' -import type { DrizzleTransaction, PostgresAdapter } from '../../../types.js' +import { upsertRow } from '@payloadcms/drizzle' + +import type { PostgresAdapter } from '../../../types.js' import type { DocsToResave } from '../types.js' -import { upsertRow } from '../../../upsertRow/index.js' import { traverseFields } from './traverseFields.js' type Args = { adapter: PostgresAdapter collectionSlug?: string - db: DrizzleTransaction + db: TransactionPg debug: boolean docsToResave: DocsToResave fields: Field[] diff --git a/packages/db-postgres/src/predefinedMigrations/v2-v3/index.ts b/packages/db-postgres/src/predefinedMigrations/v2-v3/index.ts index 46836e10e9..fe10820b9e 100644 --- a/packages/db-postgres/src/predefinedMigrations/v2-v3/index.ts +++ b/packages/db-postgres/src/predefinedMigrations/v2-v3/index.ts @@ -1,3 +1,4 @@ +import type { TransactionPg } from '@payloadcms/drizzle/types' import type { DrizzleSnapshotJSON } from 'drizzle-kit/payload' import type { Payload, PayloadRequest } from 'payload' @@ -37,8 +38,8 @@ type Args = { * @param req */ export const migratePostgresV2toV3 = async ({ debug, payload, req }: Args) => { - const adapter = payload.db as PostgresAdapter - const db = adapter.sessions[await req.transactionID]?.db + const adapter = payload.db as unknown as PostgresAdapter + const db = adapter.sessions[await req.transactionID].db as TransactionPg const dir = payload.db.migrationDir // get the drizzle migrateUpSQL from drizzle using the last schema diff --git a/packages/db-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts b/packages/db-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts index ddc4ed4446..3415da7412 100644 --- a/packages/db-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts +++ b/packages/db-postgres/src/predefinedMigrations/v2-v3/migrateRelationships.ts @@ -1,8 +1,9 @@ +import type { TransactionPg } from '@payloadcms/drizzle/types' import type { Field, Payload, PayloadRequest } from 'payload' import { sql } from 'drizzle-orm' -import type { DrizzleTransaction, PostgresAdapter } from '../../types.js' +import type { PostgresAdapter } from '../../types.js' import type { DocsToResave, PathsToQuery } from './types.js' import { fetchAndResave } from './fetchAndResave/index.js' @@ -10,7 +11,7 @@ import { fetchAndResave } from './fetchAndResave/index.js' type Args = { adapter: PostgresAdapter collectionSlug?: string - db: DrizzleTransaction + db: TransactionPg debug: boolean fields: Field[] globalSlug?: string diff --git a/packages/db-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts b/packages/db-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts index 905e47b7c4..5b751eaef3 100644 --- a/packages/db-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts +++ b/packages/db-postgres/src/predefinedMigrations/v2-v3/traverseFields.ts @@ -1,16 +1,17 @@ +import type { TransactionPg } from '@payloadcms/drizzle/types' import type { Field, Payload } from 'payload' import { tabHasName } from 'payload/shared' import toSnakeCase from 'to-snake-case' -import type { DrizzleTransaction, PostgresAdapter } from '../../types.js' +import type { PostgresAdapter } from '../../types.js' import type { PathsToQuery } from './types.js' type Args = { adapter: PostgresAdapter collectionSlug?: string columnPrefix: string - db: DrizzleTransaction + db: TransactionPg disableNotNull: boolean fields: Field[] globalSlug?: string diff --git a/packages/db-postgres/src/requireDrizzleKit.ts b/packages/db-postgres/src/requireDrizzleKit.ts new file mode 100644 index 0000000000..3dd52c1d69 --- /dev/null +++ b/packages/db-postgres/src/requireDrizzleKit.ts @@ -0,0 +1,5 @@ +import type { RequireDrizzleKit } from '@payloadcms/drizzle/types' + +import { createRequire } from 'module' +const require = createRequire(import.meta.url) +export const requireDrizzleKit: RequireDrizzleKit = () => require('drizzle-kit/payload') diff --git a/packages/db-postgres/src/schema/build.ts b/packages/db-postgres/src/schema/build.ts index fe09f8b236..f8391af768 100644 --- a/packages/db-postgres/src/schema/build.ts +++ b/packages/db-postgres/src/schema/build.ts @@ -9,6 +9,7 @@ import type { } from 'drizzle-orm/pg-core' import type { Field } from 'payload' +import { createTableName } from '@payloadcms/drizzle' import { relations } from 'drizzle-orm' import { foreignKey, @@ -24,7 +25,6 @@ import toSnakeCase from 'to-snake-case' import type { GenericColumns, GenericTable, IDType, PostgresAdapter } from '../types.js' -import { createTableName } from './createTableName.js' import { parentIDColumnMap } from './parentIDColumnMap.js' import { setColumnID } from './setColumnID.js' import { traverseFields } from './traverseFields.js' diff --git a/packages/db-postgres/src/schema/traverseFields.ts b/packages/db-postgres/src/schema/traverseFields.ts index 0d3fc4f4d0..be46f665c9 100644 --- a/packages/db-postgres/src/schema/traverseFields.ts +++ b/packages/db-postgres/src/schema/traverseFields.ts @@ -3,6 +3,11 @@ import type { Relation } from 'drizzle-orm' import type { IndexBuilder, PgColumnBuilder } from 'drizzle-orm/pg-core' import type { Field, TabAsField } from 'payload' +import { + createTableName, + hasLocalesTable, + validateExistingBlockIsIdentical, +} from '@payloadcms/drizzle' import { relations } from 'drizzle-orm' import { PgNumericBuilder, @@ -26,13 +31,10 @@ import toSnakeCase from 'to-snake-case' import type { GenericColumns, IDType, PostgresAdapter } from '../types.js' import type { BaseExtraConfig, RelationMap } from './build.js' -import { hasLocalesTable } from '../utilities/hasLocalesTable.js' import { buildTable } from './build.js' import { createIndex } from './createIndex.js' -import { createTableName } from './createTableName.js' import { idToUUID } from './idToUUID.js' import { parentIDColumnMap } from './parentIDColumnMap.js' -import { validateExistingBlockIsIdentical } from './validateExistingBlockIsIdentical.js' type Args = { adapter: PostgresAdapter diff --git a/packages/db-postgres/src/types.ts b/packages/db-postgres/src/types.ts index 1be568826d..60d4236575 100644 --- a/packages/db-postgres/src/types.ts +++ b/packages/db-postgres/src/types.ts @@ -1,24 +1,30 @@ +import type { Operators } from '@payloadcms/drizzle' +import type { + BuildQueryJoinAliases, + DrizzleAdapter, + TransactionPg, +} from '@payloadcms/drizzle/types' +import type { DrizzleSnapshotJSON } from 'drizzle-kit/payload' import type { ColumnBaseConfig, ColumnDataType, DrizzleConfig, - ExtractTablesWithRelations, Relation, Relations, + SQL, } from 'drizzle-orm' -import type { NodePgDatabase, NodePgQueryResultHKT } from 'drizzle-orm/node-postgres' +import type { NodePgDatabase } from 'drizzle-orm/node-postgres' import type { PgColumn, PgEnum, + PgInsertOnConflictDoUpdateConfig, PgSchema, PgTableWithColumns, - PgTransaction, + PgTransactionConfig, } from 'drizzle-orm/pg-core' import type { PgTableFn } from 'drizzle-orm/pg-core/table' -import type { BaseDatabaseAdapter, Payload, PayloadRequest } from 'payload' -import type { Pool, PoolConfig } from 'pg' - -export type DrizzleDB = NodePgDatabase> +import type { Payload, PayloadRequest } from 'payload' +import type { Pool, PoolConfig, QueryResult } from 'pg' export type Args = { idType?: 'serial' | 'uuid' @@ -28,7 +34,12 @@ export type Args = { pool: PoolConfig push?: boolean relationshipsSuffix?: string + /** + * The schema name to use for the database + * @experimental This only works when there are not other tables or enums of the same name in the database under a different schema. Awaiting fix from Drizzle. + */ schemaName?: string + transactionOptions?: PgTransactionConfig | false versionsSuffix?: string } @@ -45,22 +56,64 @@ export type GenericTable = PgTableWithColumns<{ columns: GenericColumns dialect: string name: string - schema: undefined + schema: string }> export type GenericEnum = PgEnum<[string, ...string[]]> export type GenericRelation = Relations>> -export type DrizzleTransaction = PgTransaction< - NodePgQueryResultHKT, - Record, - ExtractTablesWithRelations> +export type PostgresDB = NodePgDatabase> + +export type CountDistinct = (args: { + db: PostgresDB | TransactionPg + joins: BuildQueryJoinAliases + tableName: string + where: SQL +}) => Promise + +export type DeleteWhere = (args: { + db: PostgresDB | TransactionPg + tableName: string + where: SQL +}) => Promise + +export type DropDatabase = (args: { adapter: PostgresAdapter }) => Promise + +export type Execute = (args: { + db?: PostgresDB | TransactionPg + drizzle?: PostgresDB + raw?: string + sql?: SQL +}) => Promise>> + +export type Insert = (args: { + db: PostgresDB | TransactionPg + onConflictDoUpdate?: PgInsertOnConflictDoUpdateConfig + tableName: string + values: Record | Record[] +}) => Promise[]> + +type PostgresDrizzleAdapter = Omit< + DrizzleAdapter, + | 'countDistinct' + | 'deleteWhere' + | 'drizzle' + | 'dropDatabase' + | 'execute' + | 'insert' + | 'operators' + | 'relations' > -export type PostgresAdapter = BaseDatabaseAdapter & { - drizzle: DrizzleDB +export type PostgresAdapter = { + countDistinct: CountDistinct + defaultDrizzleSnapshot: DrizzleSnapshotJSON + deleteWhere: DeleteWhere + drizzle: PostgresDB + dropDatabase: DropDatabase enums: Record + execute: Execute /** * An object keyed on each table, with a key value pair where the constraint name is the key, followed by the dot-notation field name * Used for returning properly formed errors from unique fields @@ -68,8 +121,10 @@ export type PostgresAdapter = BaseDatabaseAdapter & { fieldConstraints: Record> idType: Args['idType'] initializing: Promise + insert: Insert localesSuffix?: string logger: DrizzleConfig['logger'] + operators: Operators pgSchema?: { table: PgTableFn } | PgSchema pool: Pool poolOptions: Args['pool'] @@ -82,44 +137,45 @@ export type PostgresAdapter = BaseDatabaseAdapter & { schemaName?: Args['schemaName'] sessions: { [id: string]: { - db: DrizzleTransaction + db: PostgresDB | TransactionPg reject: () => Promise resolve: () => Promise } } tableNameMap: Map - tables: Record> + tables: Record versionsSuffix?: string -} +} & PostgresDrizzleAdapter export type IDType = 'integer' | 'numeric' | 'uuid' | 'varchar' -export type PostgresAdapterResult = (args: { payload: Payload }) => PostgresAdapter - export type MigrateUpArgs = { payload: Payload; req?: Partial } export type MigrateDownArgs = { payload: Payload; req?: Partial } declare module 'payload' { export interface DatabaseAdapter - extends Omit, - BaseDatabaseAdapter { - drizzle: DrizzleDB + extends Omit, + DrizzleAdapter { enums: Record + /** + * An object keyed on each table, with a key value pair where the constraint name is the key, followed by the dot-notation field name + * Used for returning properly formed errors from unique fields + */ fieldConstraints: Record> - localeSuffix?: string + idType: Args['idType'] + initializing: Promise + localesSuffix?: string + logger: DrizzleConfig['logger'] + pgSchema?: { table: PgTableFn } | PgSchema pool: Pool + poolOptions: Args['pool'] push: boolean - relations: Record + rejectInitializing: () => void relationshipsSuffix?: string + resolveInitializing: () => void schema: Record - sessions: { - [id: string]: { - db: DrizzleTransaction - reject: () => Promise - resolve: () => Promise - } - } - tables: Record + schemaName?: Args['schemaName'] + tableNameMap: Map versionsSuffix?: string } } diff --git a/packages/db-postgres/src/utilities/createMigrationTable.ts b/packages/db-postgres/src/utilities/createMigrationTable.ts deleted file mode 100644 index 7dcfb60553..0000000000 --- a/packages/db-postgres/src/utilities/createMigrationTable.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { sql } from 'drizzle-orm' - -import type { PostgresAdapter } from '../types.js' - -export const createMigrationTable = async (adapter: PostgresAdapter): Promise => { - const prependSchema = adapter.schemaName ? `"${adapter.schemaName}".` : '' - - await adapter.drizzle.execute( - sql.raw(`CREATE TABLE IF NOT EXISTS ${prependSchema}"payload_migrations" ( - "id" serial PRIMARY KEY NOT NULL, - "name" varchar, - "batch" numeric, - "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, - "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL -);`), - ) -} diff --git a/packages/db-postgres/src/utilities/migrationTableExists.ts b/packages/db-postgres/src/utilities/migrationTableExists.ts deleted file mode 100644 index 520b56530f..0000000000 --- a/packages/db-postgres/src/utilities/migrationTableExists.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { sql } from 'drizzle-orm' - -import type { DrizzleDB } from '../types.js' - -export const migrationTableExists = async (db: DrizzleDB): Promise => { - const queryRes = await db.execute(sql`SELECT to_regclass('public.payload_migrations');`) - - // Returns table name 'payload_migrations' or null - const exists = queryRes.rows?.[0]?.to_regclass === 'payload_migrations' - return exists -} diff --git a/packages/db-postgres/src/utilities/pushDevSchema.ts b/packages/db-postgres/src/utilities/pushDevSchema.ts deleted file mode 100644 index 6b7a101dcb..0000000000 --- a/packages/db-postgres/src/utilities/pushDevSchema.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { eq } from 'drizzle-orm' -import { numeric, timestamp, varchar } from 'drizzle-orm/pg-core' -import { createRequire } from 'module' -import prompts from 'prompts' - -import type { PostgresAdapter } from '../types.js' - -const require = createRequire(import.meta.url) - -/** - * Pushes the development schema to the database using Drizzle. - * - * @param {PostgresAdapter} db - The PostgresAdapter instance connected to the database. - * @returns {Promise} - A promise that resolves once the schema push is complete. - */ -export const pushDevSchema = async (db: PostgresAdapter) => { - const { pushSchema } = require('drizzle-kit/payload') - - // This will prompt if clarifications are needed for Drizzle to push new schema - const { apply, hasDataLoss, warnings } = await pushSchema(db.schema, db.drizzle) - - if (warnings.length) { - let message = `Warnings detected during schema push: \n\n${warnings.join('\n')}\n\n` - - if (hasDataLoss) { - message += `DATA LOSS WARNING: Possible data loss detected if schema is pushed.\n\n` - } - - message += `Accept warnings and push schema to database?` - - const { confirm: acceptWarnings } = await prompts( - { - name: 'confirm', - type: 'confirm', - initial: false, - message, - }, - { - onCancel: () => { - process.exit(0) - }, - }, - ) - - // Exit if user does not accept warnings. - // Q: Is this the right type of exit for this interaction? - if (!acceptWarnings) { - process.exit(0) - } - } - - await apply() - - // Migration table def in order to use query using drizzle - const migrationsSchema = db.pgSchema.table('payload_migrations', { - name: varchar('name'), - batch: numeric('batch'), - created_at: timestamp('created_at'), - updated_at: timestamp('updated_at'), - }) - - const devPush = await db.drizzle - .select() - .from(migrationsSchema) - .where(eq(migrationsSchema.batch, '-1')) - - if (!devPush.length) { - await db.drizzle.insert(migrationsSchema).values({ - name: 'dev', - batch: '-1', - }) - } else { - await db.drizzle - .update(migrationsSchema) - .set({ - updated_at: new Date(), - }) - .where(eq(migrationsSchema.batch, '-1')) - } -} diff --git a/packages/db-postgres/tsconfig.json b/packages/db-postgres/tsconfig.json index d3ac9f33c6..470098fe44 100644 --- a/packages/db-postgres/tsconfig.json +++ b/packages/db-postgres/tsconfig.json @@ -1,11 +1,15 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "composite": true, // Make sure typescript knows that this module depends on their references - "noEmit": false /* Do not emit outputs. */, + // Make sure typescript knows that this module depends on their references + "composite": true, + /* Do not emit outputs. */ + "noEmit": false, "emitDeclarationOnly": true, - "outDir": "./dist" /* Specify an output folder for all emitted files. */, - "rootDir": "./src" /* Specify the root folder within your source files. */ + /* Specify an output folder for all emitted files. */ + "outDir": "./dist", + /* Specify the root folder within your source files. */ + "rootDir": "./src" }, "exclude": [ "dist", @@ -19,6 +23,19 @@ "src/**/*.spec.ts", "src/**/*.spec.tsx" ], - "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.d.ts", "src/**/*.json"], - "references": [{ "path": "../payload" }, { "path": "../translations" }] + "include": [ + "src", + "src/**/*.ts", + ], + "references": [ + { + "path": "../payload" + }, + { + "path": "../translations" + }, + { + "path": "../drizzle" + } + ] } diff --git a/packages/db-sqlite/.eslintignore b/packages/db-sqlite/.eslintignore new file mode 100644 index 0000000000..247f3f12de --- /dev/null +++ b/packages/db-sqlite/.eslintignore @@ -0,0 +1,10 @@ +.tmp +**/.git +**/.hg +**/.pnp.* +**/.svn +**/.yarn/** +**/build +**/dist/** +**/node_modules +**/temp diff --git a/packages/db-sqlite/.eslintrc.cjs b/packages/db-sqlite/.eslintrc.cjs new file mode 100644 index 0000000000..d6b3a476b8 --- /dev/null +++ b/packages/db-sqlite/.eslintrc.cjs @@ -0,0 +1,7 @@ +/** @type {import('eslint').Linter.Config} */ +module.exports = { + parserOptions: { + project: ['./tsconfig.json'], + tsconfigRootDir: __dirname, + }, +} diff --git a/packages/db-sqlite/.gitignore b/packages/db-sqlite/.gitignore new file mode 100644 index 0000000000..fc99080017 --- /dev/null +++ b/packages/db-sqlite/.gitignore @@ -0,0 +1 @@ +/migrations diff --git a/packages/db-sqlite/.prettierignore b/packages/db-sqlite/.prettierignore new file mode 100644 index 0000000000..247f3f12de --- /dev/null +++ b/packages/db-sqlite/.prettierignore @@ -0,0 +1,10 @@ +.tmp +**/.git +**/.hg +**/.pnp.* +**/.svn +**/.yarn/** +**/build +**/dist/** +**/node_modules +**/temp diff --git a/packages/db-sqlite/.swcrc b/packages/db-sqlite/.swcrc new file mode 100644 index 0000000000..14463f4b08 --- /dev/null +++ b/packages/db-sqlite/.swcrc @@ -0,0 +1,15 @@ +{ + "$schema": "https://json.schemastore.org/swcrc", + "sourceMaps": true, + "jsc": { + "target": "esnext", + "parser": { + "syntax": "typescript", + "tsx": true, + "dts": true + } + }, + "module": { + "type": "es6" + } +} diff --git a/packages/db-sqlite/README.md b/packages/db-sqlite/README.md new file mode 100644 index 0000000000..0d32938467 --- /dev/null +++ b/packages/db-sqlite/README.md @@ -0,0 +1,30 @@ +# Payload Postgres Adapter + +Official SQLite adapter for [Payload](https://payloadcms.com). + +- [Main Repository](https://github.com/payloadcms/payload) +- [Payload Docs](https://payloadcms.com/docs) + +## Installation + +```bash +npm install @payloadcms/db-sqlite +``` + +## Usage + +```ts +import { buildConfig } from 'payload/config' +import { sqliteAdapter } from '@payloadcms/db-sqlite' + +export default buildConfig({ + db: sqliteAdapter({ + client: { + url: process.env.DATABASE_URI, + }, + }), + // ...rest of config +}) +``` + +More detailed usage can be found in the [Payload Docs](https://payloadcms.com/docs/configuration/overview). diff --git a/packages/db-sqlite/bundle.js b/packages/db-sqlite/bundle.js new file mode 100644 index 0000000000..a1de2fd294 --- /dev/null +++ b/packages/db-sqlite/bundle.js @@ -0,0 +1,38 @@ +import * as esbuild from 'esbuild' +import fs from 'fs' +import path from 'path' +import { fileURLToPath } from 'url' +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) +import { commonjs } from '@hyrious/esbuild-plugin-commonjs' + +async function build() { + const resultServer = await esbuild.build({ + entryPoints: ['src/index.ts'], + bundle: true, + platform: 'node', + format: 'esm', + outfile: 'dist/index.js', + splitting: false, + external: [ + '*.scss', + '*.css', + 'drizzle-kit', + 'libsql', + 'pg', + '@payloadcms/translations', + '@payloadcms/drizzle', + 'payload', + 'payload/*', + ], + minify: true, + metafile: true, + tsconfig: path.resolve(dirname, './tsconfig.json'), + plugins: [commonjs()], + sourcemap: true, + }) + console.log('db-sqlite bundled successfully') + + fs.writeFileSync('meta_server.json', JSON.stringify(resultServer.metafile)) +} +await build() diff --git a/packages/db-sqlite/package.json b/packages/db-sqlite/package.json new file mode 100644 index 0000000000..78a0ef5478 --- /dev/null +++ b/packages/db-sqlite/package.json @@ -0,0 +1,85 @@ +{ + "name": "@payloadcms/db-sqlite", + "version": "3.0.0-beta.36", + "description": "The officially supported SQLite database adapter for Payload", + "homepage": "https://payloadcms.com", + "repository": { + "type": "git", + "url": "https://github.com/payloadcms/payload.git", + "directory": "packages/db-sqlite" + }, + "license": "MIT", + "author": "Payload (https://payloadcms.com)", + "type": "module", + "exports": { + ".": { + "import": "./src/index.ts", + "require": "./src/index.ts", + "types": "./src/index.ts" + }, + "./types": { + "import": "./src/types.ts", + "require": "./src/types.ts", + "types": "./src/types.ts" + }, + "./migration-utils": { + "import": "./src/exports/migration-utils.ts", + "require": "./src/exports/migration-utils.ts", + "types": "./src/exports/migration-utils.ts" + } + }, + "main": "./src/index.ts", + "types": "./src/types.ts", + "files": [ + "dist", + "mock.js" + ], + "scripts": { + "build": "pnpm build:swc && pnpm build:types", + "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths", + "build:types": "tsc --emitDeclarationOnly --outDir dist", + "clean": "rimraf {dist,*.tsbuildinfo}", + "prepack": "pnpm clean && pnpm turbo build", + "prepublishOnly": "pnpm clean && pnpm turbo build" + }, + "dependencies": { + "@libsql/client": "^0.6.2", + "@payloadcms/drizzle": "workspace:*", + "console-table-printer": "2.11.2", + "drizzle-kit": "0.20.14-1f2c838", + "drizzle-orm": "0.29.4", + "prompts": "2.4.2", + "to-snake-case": "1.0.0", + "uuid": "9.0.0" + }, + "devDependencies": { + "@payloadcms/eslint-config": "workspace:*", + "@types/pg": "8.10.2", + "@types/to-snake-case": "1.0.0", + "payload": "workspace:*" + }, + "peerDependencies": { + "payload": "workspace:*" + }, + "publishConfig": { + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.js", + "types": "./dist/index.d.ts" + }, + "./types": { + "import": "./dist/types.js", + "require": "./dist/types.js", + "types": "./dist/types.d.ts" + }, + "./migration-utils": { + "import": "./dist/exports/migration-utils.js", + "require": "./dist/exports/migration-utils.js", + "types": "./dist/exports/migration-utils.d.ts" + } + }, + "main": "./dist/index.js", + "types": "./dist/index.d.ts" + } +} diff --git a/packages/db-sqlite/src/connect.ts b/packages/db-sqlite/src/connect.ts new file mode 100644 index 0000000000..19e340a82b --- /dev/null +++ b/packages/db-sqlite/src/connect.ts @@ -0,0 +1,55 @@ +import type { DrizzleAdapter } from '@payloadcms/drizzle/types' +import type { LibSQLDatabase } from 'drizzle-orm/libsql' +import type { Connect } from 'payload' + +import { createClient } from '@libsql/client' +import { pushDevSchema } from '@payloadcms/drizzle' +import { drizzle } from 'drizzle-orm/libsql' + +import type { SQLiteAdapter } from './types.js' + +export const connect: Connect = async function connect( + this: SQLiteAdapter, + options = { + hotReload: false, + }, +) { + const { hotReload } = options + + this.schema = { + ...this.tables, + ...this.relations, + } + + try { + if (!this.client) { + this.client = createClient(this.clientConfig) + } + + const logger = this.logger || false + this.drizzle = drizzle(this.client, { logger, schema: this.schema }) as LibSQLDatabase + + if (!hotReload) { + if (process.env.PAYLOAD_DROP_DATABASE === 'true') { + this.payload.logger.info(`---- DROPPING TABLES ----`) + await this.dropDatabase({ adapter: this }) + this.payload.logger.info('---- DROPPED TABLES ----') + } + } + } catch (err) { + this.payload.logger.error(`Error: cannot connect to SQLite. Details: ${err.message}`, err) + if (typeof this.rejectInitializing === 'function') this.rejectInitializing() + process.exit(1) + } + + // Only push schema if not in production + if ( + process.env.NODE_ENV !== 'production' && + process.env.PAYLOAD_MIGRATING !== 'true' && + this.push !== false + ) { + await pushDevSchema(this as unknown as DrizzleAdapter) + } + + if (typeof this.resolveInitializing === 'function') this.resolveInitializing() +} diff --git a/packages/db-sqlite/src/countDistinct.ts b/packages/db-sqlite/src/countDistinct.ts new file mode 100644 index 0000000000..43994191cd --- /dev/null +++ b/packages/db-sqlite/src/countDistinct.ts @@ -0,0 +1,33 @@ +import type { ChainedMethods } from '@payloadcms/drizzle/types' + +import { chainMethods } from '@payloadcms/drizzle' +import { sql } from 'drizzle-orm' + +import type { CountDistinct, SQLiteAdapter } from './types.js' + +export const countDistinct: CountDistinct = async function countDistinct( + this: SQLiteAdapter, + { db, joins, tableName, where }, +) { + const chainedMethods: ChainedMethods = [] + + joins.forEach(({ condition, table }) => { + chainedMethods.push({ + args: [table, condition], + method: 'leftJoin', + }) + }) + + const countResult = await chainMethods({ + methods: chainedMethods, + query: db + .select({ + count: sql`count + (DISTINCT ${this.tables[tableName].id})`, + }) + .from(this.tables[tableName]) + .where(where), + }) + + return Number(countResult[0].count) +} diff --git a/packages/db-sqlite/src/createJSONQuery/convertPathToJSONTraversal.ts b/packages/db-sqlite/src/createJSONQuery/convertPathToJSONTraversal.ts new file mode 100644 index 0000000000..d7ec458a31 --- /dev/null +++ b/packages/db-sqlite/src/createJSONQuery/convertPathToJSONTraversal.ts @@ -0,0 +1,9 @@ +export const convertPathToJSONTraversal = (incomingSegments: string[]): string => { + const segments = [...incomingSegments] + segments.shift() + + return segments.reduce((res, segment) => { + const formattedSegment = Number.isNaN(parseInt(segment)) ? `'${segment}'` : segment + return `${res}->>${formattedSegment}` + }, '') +} diff --git a/packages/db-sqlite/src/createJSONQuery/index.ts b/packages/db-sqlite/src/createJSONQuery/index.ts new file mode 100644 index 0000000000..891503f401 --- /dev/null +++ b/packages/db-sqlite/src/createJSONQuery/index.ts @@ -0,0 +1,86 @@ +import type { CreateJSONQueryArgs } from '@payloadcms/drizzle/types' + +type FromArrayArgs = { + isRoot?: true + operator: string + pathSegments: string[] + table: string + treatAsArray?: string[] + value: boolean | number | string +} + +const fromArray = ({ + isRoot, + operator, + pathSegments, + table, + treatAsArray, + value, +}: FromArrayArgs) => { + const newPathSegments = pathSegments.slice(1) + const alias = `${pathSegments[isRoot ? 0 : 1]}_alias_${newPathSegments.length}` + + return `EXISTS ( + SELECT 1 + FROM json_each(${table}.${pathSegments[0]}) AS ${alias} + WHERE ${createJSONQuery({ + operator, + pathSegments: newPathSegments, + table: alias, + treatAsArray, + value, + })} + )` +} + +type CreateConstraintArgs = { + alias?: string + operator: string + pathSegments: string[] + treatAsArray?: string[] + value: boolean | number | string +} + +const createConstraint = ({ + alias, + operator, + pathSegments, + value, +}: CreateConstraintArgs): string => { + const newAlias = `${pathSegments[0]}_alias_${pathSegments.length - 1}` + let formattedValue = value + let formattedOperator = operator + + if (['contains', 'like'].includes(operator)) { + formattedOperator = 'like' + formattedValue = `%${value}%` + } else if (operator === 'equals') { + formattedOperator = '=' + } + + return `EXISTS ( + SELECT 1 + FROM json_each(${alias}.value -> '${pathSegments[0]}') AS ${newAlias} + WHERE ${newAlias}.value ->> '${pathSegments[1]}' ${formattedOperator} '${formattedValue}' + )` +} + +export const createJSONQuery = ({ + operator, + pathSegments, + table, + treatAsArray, + value, +}: CreateJSONQueryArgs): string => { + if (treatAsArray.includes(pathSegments[1])) { + return fromArray({ + operator, + pathSegments, + table, + treatAsArray, + value, + }) + } + + return createConstraint({ alias: table, operator, pathSegments, treatAsArray, value }) +} diff --git a/packages/db-sqlite/src/createMigration.ts b/packages/db-sqlite/src/createMigration.ts new file mode 100644 index 0000000000..5daec88280 --- /dev/null +++ b/packages/db-sqlite/src/createMigration.ts @@ -0,0 +1,116 @@ +import type { DrizzleSnapshotJSON } from 'drizzle-kit/payload' +import type { CreateMigration } from 'payload' + +import fs from 'fs' +import { createRequire } from 'module' +import path from 'path' +import { getPredefinedMigration } from 'payload' +import prompts from 'prompts' +import { fileURLToPath } from 'url' + +import type { SQLiteAdapter } from './types.js' + +import { defaultDrizzleSnapshot } from './defaultSnapshot.js' +import { getMigrationTemplate } from './getMigrationTemplate.js' + +const require = createRequire(import.meta.url) + +export const createMigration: CreateMigration = async function createMigration( + this: SQLiteAdapter, + { file, forceAcceptWarning, migrationName, payload }, +) { + const filename = fileURLToPath(import.meta.url) + const dirname = path.dirname(filename) + const dir = payload.db.migrationDir + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir) + } + const { generateSQLiteDrizzleJson, generateSQLiteMigration } = require('drizzle-kit/payload') + const drizzleJsonAfter = await generateSQLiteDrizzleJson(this.schema) + const [yyymmdd, hhmmss] = new Date().toISOString().split('T') + const formattedDate = yyymmdd.replace(/\D/g, '') + const formattedTime = hhmmss.split('.')[0].replace(/\D/g, '') + let imports: string = '' + let downSQL: string + let upSQL: string + ;({ downSQL, imports, upSQL } = await getPredefinedMigration({ + dirname, + file, + migrationName, + payload, + })) + + const timestamp = `${formattedDate}_${formattedTime}` + + const name = migrationName || file?.split('/').slice(2).join('/') + const fileName = `${timestamp}${name ? `_${name.replace(/\W/g, '_')}` : ''}` + + const filePath = `${dir}/${fileName}` + + let drizzleJsonBefore = defaultDrizzleSnapshot as any + + if (!upSQL) { + // Get latest migration snapshot + const latestSnapshot = fs + .readdirSync(dir) + .filter((file) => file.endsWith('.json')) + .sort() + .reverse()?.[0] + + if (latestSnapshot) { + drizzleJsonBefore = JSON.parse( + fs.readFileSync(`${dir}/${latestSnapshot}`, 'utf8'), + ) as DrizzleSnapshotJSON + } + + const sqlStatementsUp = await generateSQLiteMigration(drizzleJsonBefore, drizzleJsonAfter) + const sqlStatementsDown = await generateSQLiteMigration(drizzleJsonAfter, drizzleJsonBefore) + // need to create tables as separate statements + const sqlExecute = 'await db.run(sql`' + + if (sqlStatementsUp?.length) { + upSQL = sqlStatementsUp + .map((statement) => `${sqlExecute}${statement?.replaceAll('`', '\\`')}\`)`) + .join('\n') + } + if (sqlStatementsDown?.length) { + downSQL = sqlStatementsDown + .map((statement) => `${sqlExecute}${statement?.replaceAll('`', '\\`')}\`)`) + .join('\n') + } + + if (!upSQL?.length && !downSQL?.length && !forceAcceptWarning) { + const { confirm: shouldCreateBlankMigration } = await prompts( + { + name: 'confirm', + type: 'confirm', + initial: false, + message: 'No schema changes detected. Would you like to create a blank migration file?', + }, + { + onCancel: () => { + process.exit(0) + }, + }, + ) + + if (!shouldCreateBlankMigration) { + process.exit(0) + } + } + + // write schema + fs.writeFileSync(`${filePath}.json`, JSON.stringify(drizzleJsonAfter, null, 2)) + } + + // write migration + fs.writeFileSync( + `${filePath}.ts`, + getMigrationTemplate({ + downSQL: downSQL || ` // Migration code`, + imports, + upSQL: upSQL || ` // Migration code`, + }), + ) + payload.logger.info({ msg: `Migration created at ${filePath}.ts` }) +} diff --git a/packages/db-sqlite/src/defaultSnapshot.ts b/packages/db-sqlite/src/defaultSnapshot.ts new file mode 100644 index 0000000000..f229c05346 --- /dev/null +++ b/packages/db-sqlite/src/defaultSnapshot.ts @@ -0,0 +1,14 @@ +import type { DrizzleSQLiteSnapshotJSON } from 'drizzle-kit/payload' + +export const defaultDrizzleSnapshot: DrizzleSQLiteSnapshotJSON = { + id: '00000000-0000-0000-0000-000000000000', + _meta: { + columns: {}, + tables: {}, + }, + dialect: 'sqlite', + enums: {}, + prevId: '00000000-0000-0000-0000-00000000000', + tables: {}, + version: '3', +} diff --git a/packages/db-sqlite/src/deleteWhere.ts b/packages/db-sqlite/src/deleteWhere.ts new file mode 100644 index 0000000000..7a1d0ac1c7 --- /dev/null +++ b/packages/db-sqlite/src/deleteWhere.ts @@ -0,0 +1,6 @@ +import type { DeleteWhere } from './types.js' + +export const deleteWhere: DeleteWhere = async function deleteWhere({ db, tableName, where }) { + const table = this.tables[tableName] + await db.delete(table).where(where) +} diff --git a/packages/db-sqlite/src/dropDatabase.ts b/packages/db-sqlite/src/dropDatabase.ts new file mode 100644 index 0000000000..81ae88db7a --- /dev/null +++ b/packages/db-sqlite/src/dropDatabase.ts @@ -0,0 +1,21 @@ +import type { DropDatabase } from './types.js' + +const getTables = (adapter) => { + return adapter.client.execute(`SELECT name + FROM sqlite_master + WHERE type = 'table' + AND name NOT LIKE 'sqlite_%';`) +} + +const dropTables = (adapter, rows) => { + const multi = ` + PRAGMA foreign_keys = OFF;\n + ${rows.map(({ name }) => `DROP TABLE IF EXISTS ${name}`).join(';\n ')};\n + PRAGMA foreign_keys = ON;` + return adapter.client.executeMultiple(multi) +} + +export const dropDatabase: DropDatabase = async function dropDatabase({ adapter }) { + const result = await getTables(adapter) + await dropTables(adapter, result.rows) +} diff --git a/packages/db-sqlite/src/execute.ts b/packages/db-sqlite/src/execute.ts new file mode 100644 index 0000000000..398c6f4b74 --- /dev/null +++ b/packages/db-sqlite/src/execute.ts @@ -0,0 +1,15 @@ +import { sql } from 'drizzle-orm' + +import type { Execute } from './types.js' + +export const execute: Execute = function execute({ db, drizzle, raw, sql: statement }) { + const executeFrom = db ?? drizzle + + if (raw) { + const result = executeFrom.run(sql.raw(raw)) + return result + } else { + const result = executeFrom.run(statement) + return result + } +} diff --git a/packages/db-sqlite/src/getMigrationTemplate.ts b/packages/db-sqlite/src/getMigrationTemplate.ts new file mode 100644 index 0000000000..69ae4c560e --- /dev/null +++ b/packages/db-sqlite/src/getMigrationTemplate.ts @@ -0,0 +1,16 @@ +import type { MigrationTemplateArgs } from 'payload' + +export const getMigrationTemplate = ({ + downSQL, + imports, + upSQL, +}: MigrationTemplateArgs): string => `import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-sqlite' +${imports ? `${imports}\n` : ''} +export async function up({ db, payload, req }: MigrateUpArgs): Promise { +${upSQL} +} + +export async function down({ db, payload, req }: MigrateDownArgs): Promise { +${downSQL} +} +` diff --git a/packages/db-sqlite/src/index.ts b/packages/db-sqlite/src/index.ts new file mode 100644 index 0000000000..834f70e503 --- /dev/null +++ b/packages/db-sqlite/src/index.ts @@ -0,0 +1,159 @@ +import type { Operators } from '@payloadcms/drizzle' +import type { DatabaseAdapterObj, Payload } from 'payload' + +import { + beginTransaction, + commitTransaction, + count, + create, + createGlobal, + createGlobalVersion, + createVersion, + deleteMany, + deleteOne, + deleteVersions, + destroy, + find, + findGlobal, + findGlobalVersions, + findMigrationDir, + findOne, + findVersions, + migrate, + migrateDown, + migrateFresh, + migrateRefresh, + migrateReset, + migrateStatus, + operatorMap, + queryDrafts, + rollbackTransaction, + updateGlobal, + updateGlobalVersion, + updateOne, + updateVersion, +} from '@payloadcms/drizzle' +import { like } from 'drizzle-orm' +import { createDatabaseAdapter } from 'payload' + +import type { Args, SQLiteAdapter } from './types.js' + +import { connect } from './connect.js' +import { countDistinct } from './countDistinct.js' +import { convertPathToJSONTraversal } from './createJSONQuery/convertPathToJSONTraversal.js' +import { createJSONQuery } from './createJSONQuery/index.js' +import { createMigration } from './createMigration.js' +import { defaultDrizzleSnapshot } from './defaultSnapshot.js' +import { deleteWhere } from './deleteWhere.js' +import { dropDatabase } from './dropDatabase.js' +import { execute } from './execute.js' +import { getMigrationTemplate } from './getMigrationTemplate.js' +import { init } from './init.js' +import { insert } from './insert.js' +import { requireDrizzleKit } from './requireDrizzleKit.js' + +export type { MigrateDownArgs, MigrateUpArgs } from './types.js' + +export { sql } from 'drizzle-orm' + +export function sqliteAdapter(args: Args): DatabaseAdapterObj { + const postgresIDType = args.idType || 'serial' + const payloadIDType = postgresIDType === 'serial' ? 'number' : 'text' + + function adapter({ payload }: { payload: Payload }) { + const migrationDir = findMigrationDir(args.migrationDir) + let resolveInitializing + let rejectInitializing + + const initializing = new Promise((res, rej) => { + resolveInitializing = res + rejectInitializing = rej + }) + + // sqlite's like operator is case-insensitive, so we overwrite the DrizzleAdapter operators to not use ilike + const operators = { + ...operatorMap, + contains: like, + like, + } as unknown as Operators + + return createDatabaseAdapter({ + name: 'sqlite', + client: undefined, + clientConfig: args.client, + defaultDrizzleSnapshot, + drizzle: undefined, + features: { + json: true, + }, + fieldConstraints: {}, + getMigrationTemplate, + idType: postgresIDType, + initializing, + localesSuffix: args.localesSuffix || '_locales', + logger: args.logger, + operators, + push: args.push, + relations: {}, + relationshipsSuffix: args.relationshipsSuffix || '_rels', + schema: {}, + schemaName: args.schemaName, + sessions: {}, + tableNameMap: new Map(), + tables: {}, + transactionOptions: args.transactionOptions || undefined, + versionsSuffix: args.versionsSuffix || '_v', + + // DatabaseAdapter + beginTransaction: args.transactionOptions === false ? undefined : beginTransaction, + commitTransaction, + connect, + convertPathToJSONTraversal, + count, + countDistinct, + create, + createGlobal, + createGlobalVersion, + createJSONQuery, + createMigration, + createVersion, + defaultIDType: payloadIDType, + deleteMany, + deleteOne, + deleteVersions, + deleteWhere, + destroy, + dropDatabase, + execute, + find, + findGlobal, + findGlobalVersions, + findOne, + findVersions, + init, + insert, + migrate, + migrateDown, + migrateFresh, + migrateRefresh, + migrateReset, + migrateStatus, + migrationDir, + payload, + queryDrafts, + rejectInitializing, + requireDrizzleKit, + resolveInitializing, + rollbackTransaction, + updateGlobal, + updateGlobalVersion, + updateOne, + updateVersion, + }) + } + + return { + defaultIDType: payloadIDType, + init: adapter, + } +} diff --git a/packages/db-sqlite/src/init.ts b/packages/db-sqlite/src/init.ts new file mode 100644 index 0000000000..14891c0b5d --- /dev/null +++ b/packages/db-sqlite/src/init.ts @@ -0,0 +1,108 @@ +/* eslint-disable no-param-reassign */ +import type { DrizzleAdapter } from '@payloadcms/drizzle/types' +import type { Init, SanitizedCollectionConfig } from 'payload' + +import { createTableName } from '@payloadcms/drizzle' +import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload' +import toSnakeCase from 'to-snake-case' + +import type { SQLiteAdapter } from './types.js' + +import { buildTable } from './schema/build.js' + +export const init: Init = function init(this: SQLiteAdapter) { + let locales: [string, ...string[]] | undefined + if (this.payload.config.localization) { + locales = this.payload.config.localization.locales.map(({ code }) => code) as [ + string, + ...string[], + ] + } + + this.payload.config.collections.forEach((collection: SanitizedCollectionConfig) => { + createTableName({ + adapter: this as unknown as DrizzleAdapter, + config: collection, + }) + + if (collection.versions) { + createTableName({ + adapter: this as unknown as DrizzleAdapter, + config: collection, + versions: true, + versionsCustomName: true, + }) + } + }) + this.payload.config.collections.forEach((collection: SanitizedCollectionConfig) => { + const tableName = this.tableNameMap.get(toSnakeCase(collection.slug)) + + buildTable({ + adapter: this, + disableNotNull: !!collection?.versions?.drafts, + disableUnique: false, + fields: collection.fields, + locales, + tableName, + timestamps: collection.timestamps, + versions: false, + }) + + if (collection.versions) { + const versionsTableName = this.tableNameMap.get( + `_${toSnakeCase(collection.slug)}${this.versionsSuffix}`, + ) + const versionFields = buildVersionCollectionFields(collection) + + buildTable({ + adapter: this, + disableNotNull: !!collection.versions?.drafts, + disableUnique: true, + fields: versionFields, + locales, + tableName: versionsTableName, + timestamps: true, + versions: true, + }) + } + }) + + this.payload.config.globals.forEach((global) => { + const tableName = createTableName({ + adapter: this as unknown as DrizzleAdapter, + config: global, + }) + + buildTable({ + adapter: this, + disableNotNull: !!global?.versions?.drafts, + disableUnique: false, + fields: global.fields, + locales, + tableName, + timestamps: false, + versions: false, + }) + + if (global.versions) { + const versionsTableName = createTableName({ + adapter: this as unknown as DrizzleAdapter, + config: global, + versions: true, + versionsCustomName: true, + }) + const versionFields = buildVersionGlobalFields(global) + + buildTable({ + adapter: this, + disableNotNull: !!global.versions?.drafts, + disableUnique: true, + fields: versionFields, + locales, + tableName: versionsTableName, + timestamps: true, + versions: true, + }) + } + }) +} diff --git a/packages/db-sqlite/src/insert.ts b/packages/db-sqlite/src/insert.ts new file mode 100644 index 0000000000..11060f10a2 --- /dev/null +++ b/packages/db-sqlite/src/insert.ts @@ -0,0 +1,19 @@ +import type { Insert } from './types.js' + +export const insert: Insert = async function insert({ + db, + onConflictDoUpdate, + tableName, + values, +}): Promise[]> { + const table = this.tables[tableName] + let result + + if (onConflictDoUpdate) { + result = db.insert(table).values(values).onConflictDoUpdate(onConflictDoUpdate).returning() + } else { + result = db.insert(table).values(values).returning() + } + result = await result + return result +} diff --git a/packages/db-sqlite/src/requireDrizzleKit.ts b/packages/db-sqlite/src/requireDrizzleKit.ts new file mode 100644 index 0000000000..dade50eaf1 --- /dev/null +++ b/packages/db-sqlite/src/requireDrizzleKit.ts @@ -0,0 +1,15 @@ +import type { RequireDrizzleKit } from '@payloadcms/drizzle/types' + +import { createRequire } from 'module' +const require = createRequire(import.meta.url) + +/** + * Dynamically requires the `drizzle-kit` package to access the `generateSQLiteDrizzleJson` and `pushSQLiteSchema` functions and exports them generically to call them from @payloadcms/drizzle. + */ +export const requireDrizzleKit: RequireDrizzleKit = () => { + const { + generateSQLiteDrizzleJson: generateDrizzleJson, + pushSQLiteSchema: pushSchema, + } = require('drizzle-kit/payload') + return { generateDrizzleJson, pushSchema } +} diff --git a/packages/db-sqlite/src/schema/build.ts b/packages/db-sqlite/src/schema/build.ts new file mode 100644 index 0000000000..9622c33760 --- /dev/null +++ b/packages/db-sqlite/src/schema/build.ts @@ -0,0 +1,490 @@ +/* eslint-disable no-param-reassign */ +import type { ColumnDataType, Relation } from 'drizzle-orm' +import type { + ForeignKeyBuilder, + IndexBuilder, + SQLiteColumn, + SQLiteColumnBuilder, + SQLiteTableWithColumns, + UniqueConstraintBuilder, +} from 'drizzle-orm/sqlite-core' +import type { Field } from 'payload' + +import { createTableName } from '@payloadcms/drizzle' +import { relations, sql } from 'drizzle-orm' +import { + foreignKey, + index, + integer, + numeric, + sqliteTable, + text, + unique, +} from 'drizzle-orm/sqlite-core' +import toSnakeCase from 'to-snake-case' + +import type { GenericColumns, GenericTable, IDType, SQLiteAdapter } from '../types.js' + +import { getIDColumn } from './getIDColumn.js' +import { setColumnID } from './setColumnID.js' +import { traverseFields } from './traverseFields.js' + +export type BaseExtraConfig = Record< + string, + (cols: { + [x: string]: SQLiteColumn<{ + baseColumn: never + columnType: string + data: unknown + dataType: ColumnDataType + driverParam: unknown + enumValues: string[] + hasDefault: false + name: string + notNull: false + tableName: string + }> + }) => ForeignKeyBuilder | IndexBuilder | UniqueConstraintBuilder +> + +export type RelationMap = Map + +type Args = { + adapter: SQLiteAdapter + baseColumns?: Record + baseExtraConfig?: BaseExtraConfig + buildNumbers?: boolean + buildRelationships?: boolean + disableNotNull: boolean + disableUnique: boolean + fields: Field[] + locales?: [string, ...string[]] + rootRelationsToBuild?: RelationMap + rootRelationships?: Set + rootTableIDColType?: IDType + rootTableName?: string + tableName: string + timestamps?: boolean + versions: boolean +} + +type Result = { + hasManyNumberField: 'index' | boolean + hasManyTextField: 'index' | boolean + relationsToBuild: RelationMap +} + +export const buildTable = ({ + adapter, + baseColumns = {}, + baseExtraConfig = {}, + disableNotNull, + disableUnique = false, + fields, + locales, + rootRelationsToBuild, + rootRelationships, + rootTableIDColType, + rootTableName: incomingRootTableName, + tableName, + timestamps, + versions, +}: Args): Result => { + const isRoot = !incomingRootTableName + const rootTableName = incomingRootTableName || tableName + const columns: Record = baseColumns + const indexes: Record IndexBuilder> = {} + + const localesColumns: Record = {} + const localesIndexes: Record IndexBuilder> = {} + let localesTable: GenericTable | SQLiteTableWithColumns + let textsTable: GenericTable | SQLiteTableWithColumns + let numbersTable: GenericTable | SQLiteTableWithColumns + + // Relationships to the base collection + const relationships: Set = rootRelationships || new Set() + + let relationshipsTable: GenericTable | SQLiteTableWithColumns + + // Drizzle relations + const relationsToBuild: RelationMap = new Map() + + const idColType: IDType = setColumnID({ columns, fields }) + + const { + hasLocalizedField, + hasLocalizedManyNumberField, + hasLocalizedManyTextField, + hasLocalizedRelationshipField, + hasManyNumberField, + hasManyTextField, + } = traverseFields({ + adapter, + columns, + disableNotNull, + disableUnique, + fields, + indexes, + locales, + localesColumns, + localesIndexes, + newTableName: tableName, + parentTableName: tableName, + relationsToBuild, + relationships, + rootRelationsToBuild: rootRelationsToBuild || relationsToBuild, + rootTableIDColType: rootTableIDColType || idColType, + rootTableName, + versions, + }) + + // split the relationsToBuild by localized and non-localized + const localizedRelations = new Map() + const nonLocalizedRelations = new Map() + + relationsToBuild.forEach(({ type, localized, target }, key) => { + const map = localized ? localizedRelations : nonLocalizedRelations + map.set(key, { type, target }) + }) + + if (timestamps) { + columns.createdAt = text('created_at') + .default(sql`(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))`) + .notNull() + columns.updatedAt = text('updated_at') + .default(sql`(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))`) + .notNull() + } + + const table = sqliteTable(tableName, columns, (cols) => { + const extraConfig = Object.entries(baseExtraConfig).reduce((config, [key, func]) => { + config[key] = func(cols) + return config + }, {}) + + const result = Object.entries(indexes).reduce((acc, [colName, func]) => { + acc[colName] = func(cols) + return acc + }, extraConfig) + + return result + }) + + adapter.tables[tableName] = table + + if (hasLocalizedField || localizedRelations.size) { + const localeTableName = `${tableName}${adapter.localesSuffix}` + localesColumns.id = integer('id', { mode: 'number' }).primaryKey({ autoIncrement: true }) + localesColumns._locale = text('_locale', { enum: locales }).notNull() + localesColumns._parentID = getIDColumn({ + name: '_parent_id', + type: idColType, + notNull: true, + primaryKey: false, + }) + + localesTable = sqliteTable(localeTableName, localesColumns, (cols) => { + return Object.entries(localesIndexes).reduce( + (acc, [colName, func]) => { + acc[colName] = func(cols) + return acc + }, + { + _localeParent: unique(`${localeTableName}_locale_parent_id_unique`).on( + cols._locale, + cols._parentID, + ), + _parentIdFk: foreignKey({ + name: `${localeTableName}_parent_id_fk`, + columns: [cols._parentID], + foreignColumns: [table.id], + }).onDelete('cascade'), + }, + ) + }) + + adapter.tables[localeTableName] = localesTable + + adapter.relations[`relations_${localeTableName}`] = relations(localesTable, ({ many, one }) => { + const result: Record> = {} + + result._parentID = one(table, { + fields: [localesTable._parentID], + references: [table.id], + // name the relationship by what the many() relationName is + relationName: '_locales', + }) + + localizedRelations.forEach(({ type, target }, key) => { + if (type === 'one') { + result[key] = one(adapter.tables[target], { + fields: [localesTable[key]], + references: [adapter.tables[target].id], + relationName: key, + }) + } + if (type === 'many') { + result[key] = many(adapter.tables[target], { + relationName: key, + }) + } + }) + + return result + }) + } + + if (isRoot) { + if (hasManyTextField) { + const textsTableName = `${rootTableName}_texts` + const columns: Record = { + id: integer('id', { mode: 'number' }).primaryKey({ autoIncrement: true }), + order: integer('order').notNull(), + parent: getIDColumn({ + name: 'parent_id', + type: idColType, + notNull: true, + primaryKey: false, + }), + path: text('path').notNull(), + text: text('text'), + } + + if (hasLocalizedManyTextField) { + columns.locale = text('locale', { enum: locales }) + } + + textsTable = sqliteTable(textsTableName, columns, (cols) => { + const config: Record = { + orderParentIdx: index(`${textsTableName}_order_parent_idx`).on(cols.order, cols.parent), + parentFk: foreignKey({ + name: `${textsTableName}_parent_fk`, + columns: [cols.parent], + foreignColumns: [table.id], + }).onDelete('cascade'), + } + + if (hasManyTextField === 'index') { + config.text_idx = index(`${textsTableName}_text_idx`).on(cols.text) + } + + if (hasLocalizedManyTextField) { + config.localeParent = index(`${textsTableName}_locale_parent`).on( + cols.locale, + cols.parent, + ) + } + + return config + }) + + adapter.tables[textsTableName] = textsTable + + adapter.relations[`relations_${textsTableName}`] = relations(textsTable, ({ one }) => ({ + parent: one(table, { + fields: [textsTable.parent], + references: [table.id], + relationName: '_texts', + }), + })) + } + + if (hasManyNumberField) { + const numbersTableName = `${rootTableName}_numbers` + const columns: Record = { + id: integer('id', { mode: 'number' }).primaryKey({ autoIncrement: true }), + number: numeric('number'), + order: integer('order').notNull(), + parent: getIDColumn({ + name: 'parent_id', + type: idColType, + notNull: true, + primaryKey: false, + }), + path: text('path').notNull(), + } + + if (hasLocalizedManyNumberField) { + columns.locale = text('locale', { enum: locales }) + } + + numbersTable = sqliteTable(numbersTableName, columns, (cols) => { + const config: Record = { + orderParentIdx: index(`${numbersTableName}_order_parent_idx`).on(cols.order, cols.parent), + parentFk: foreignKey({ + name: `${numbersTableName}_parent_fk`, + columns: [cols.parent], + foreignColumns: [table.id], + }).onDelete('cascade'), + } + + if (hasManyNumberField === 'index') { + config.numberIdx = index(`${numbersTableName}_number_idx`).on(cols.number) + } + + if (hasLocalizedManyNumberField) { + config.localeParent = index(`${numbersTableName}_locale_parent`).on( + cols.locale, + cols.parent, + ) + } + + return config + }) + + adapter.tables[numbersTableName] = numbersTable + + adapter.relations[`relations_${numbersTableName}`] = relations(numbersTable, ({ one }) => ({ + parent: one(table, { + fields: [numbersTable.parent], + references: [table.id], + relationName: '_numbers', + }), + })) + } + + if (relationships.size) { + const relationshipColumns: Record = { + id: integer('id', { mode: 'number' }).primaryKey({ autoIncrement: true }), + order: integer('order'), + parent: getIDColumn({ + name: 'parent_id', + type: idColType, + notNull: true, + primaryKey: false, + }), + path: text('path').notNull(), + } + + if (hasLocalizedRelationshipField) { + relationshipColumns.locale = text('locale', { enum: locales }) + } + + const relationExtraConfig: BaseExtraConfig = {} + const relationshipsTableName = `${tableName}${adapter.relationshipsSuffix}` + + relationships.forEach((relationTo) => { + const relationshipConfig = adapter.payload.collections[relationTo].config + const formattedRelationTo = createTableName({ + adapter, + config: relationshipConfig, + }) + let colType: IDType = 'integer' + const relatedCollectionCustomIDType = + adapter.payload.collections[relationshipConfig.slug]?.customIDType + + if (relatedCollectionCustomIDType === 'number') colType = 'numeric' + if (relatedCollectionCustomIDType === 'text') colType = 'text' + + relationshipColumns[`${relationTo}ID`] = getIDColumn({ + name: `${formattedRelationTo}_id`, + type: colType, + primaryKey: false, + }) + + relationExtraConfig[`${relationTo}IdFk`] = (cols) => + foreignKey({ + name: `${relationshipsTableName}_${toSnakeCase(relationTo)}_fk`, + columns: [cols[`${relationTo}ID`]], + foreignColumns: [adapter.tables[formattedRelationTo].id], + }).onDelete('cascade') + }) + + relationshipsTable = sqliteTable(relationshipsTableName, relationshipColumns, (cols) => { + const result: Record = Object.entries( + relationExtraConfig, + ).reduce( + (config, [key, func]) => { + config[key] = func(cols) + return config + }, + { + order: index(`${relationshipsTableName}_order_idx`).on(cols.order), + parentFk: foreignKey({ + name: `${relationshipsTableName}_parent_fk`, + columns: [cols.parent], + foreignColumns: [table.id], + }).onDelete('cascade'), + parentIdx: index(`${relationshipsTableName}_parent_idx`).on(cols.parent), + pathIdx: index(`${relationshipsTableName}_path_idx`).on(cols.path), + }, + ) + + if (hasLocalizedRelationshipField) { + result.localeIdx = index(`${relationshipsTableName}_locale_idx`).on(cols.locale) + } + + return result + }) + + adapter.tables[relationshipsTableName] = relationshipsTable + + adapter.relations[`relations_${relationshipsTableName}`] = relations( + relationshipsTable, + ({ one }) => { + const result: Record> = { + parent: one(table, { + fields: [relationshipsTable.parent], + references: [table.id], + relationName: '_rels', + }), + } + + relationships.forEach((relationTo) => { + const relatedTableName = createTableName({ + adapter, + config: adapter.payload.collections[relationTo].config, + }) + const idColumnName = `${relationTo}ID` + result[idColumnName] = one(adapter.tables[relatedTableName], { + fields: [relationshipsTable[idColumnName]], + references: [adapter.tables[relatedTableName].id], + relationName: relationTo, + }) + }) + + return result + }, + ) + } + } + + adapter.relations[`relations_${tableName}`] = relations(table, ({ many, one }) => { + const result: Record> = {} + + nonLocalizedRelations.forEach(({ type, target }, key) => { + if (type === 'one') { + result[key] = one(adapter.tables[target], { + fields: [table[key]], + references: [adapter.tables[target].id], + relationName: key, + }) + } + if (type === 'many') { + result[key] = many(adapter.tables[target], { relationName: key }) + } + }) + + if (hasLocalizedField) { + result._locales = many(localesTable, { relationName: '_locales' }) + } + + if (hasManyTextField) { + result._texts = many(textsTable, { relationName: '_texts' }) + } + + if (hasManyNumberField) { + result._numbers = many(numbersTable, { relationName: '_numbers' }) + } + + if (relationships.size && relationshipsTable) { + result._rels = many(relationshipsTable, { + relationName: '_rels', + }) + } + + return result + }) + + return { hasManyNumberField, hasManyTextField, relationsToBuild } +} diff --git a/packages/db-sqlite/src/schema/createIndex.ts b/packages/db-sqlite/src/schema/createIndex.ts new file mode 100644 index 0000000000..e96d7c45f2 --- /dev/null +++ b/packages/db-sqlite/src/schema/createIndex.ts @@ -0,0 +1,28 @@ +/* eslint-disable no-param-reassign */ +import { index, uniqueIndex } from 'drizzle-orm/sqlite-core' + +import type { GenericColumn } from '../types.js' + +type CreateIndexArgs = { + columnName: string + name: string | string[] + tableName: string + unique?: boolean +} + +export const createIndex = ({ name, columnName, tableName, unique }: CreateIndexArgs) => { + return (table: { [x: string]: GenericColumn }) => { + let columns + if (Array.isArray(name)) { + columns = name + .map((columnName) => table[columnName]) + // exclude fields were included in compound indexes but do not exist on the table + .filter((col) => typeof col !== 'undefined') + } else { + columns = [table[name]] + } + if (unique) + return uniqueIndex(`${tableName}_${columnName}_idx`).on(columns[0], ...columns.slice(1)) + return index(`${tableName}_${columnName}_idx`).on(columns[0], ...columns.slice(1)) + } +} diff --git a/packages/db-sqlite/src/schema/getIDColumn.ts b/packages/db-sqlite/src/schema/getIDColumn.ts new file mode 100644 index 0000000000..e5356a9e93 --- /dev/null +++ b/packages/db-sqlite/src/schema/getIDColumn.ts @@ -0,0 +1,38 @@ +import { integer, numeric, text } from 'drizzle-orm/sqlite-core' + +import type { IDType } from '../types.js' + +export const getIDColumn = ({ + name, + type, + notNull, + primaryKey, +}: { + name: string + notNull?: boolean + primaryKey: boolean + type: IDType +}) => { + let column + switch (type) { + case 'integer': + column = integer(name) + break + case 'numeric': + column = numeric(name) + break + case 'text': + column = text(name) + break + } + + if (notNull) { + column.notNull() + } + + if (primaryKey) { + column.primaryKey() + } + + return column +} diff --git a/packages/db-sqlite/src/schema/idToUUID.ts b/packages/db-sqlite/src/schema/idToUUID.ts new file mode 100644 index 0000000000..466ec63b3d --- /dev/null +++ b/packages/db-sqlite/src/schema/idToUUID.ts @@ -0,0 +1,13 @@ +import type { Field } from 'payload' + +export const idToUUID = (fields: Field[]): Field[] => + fields.map((field) => { + if ('name' in field && field.name === 'id') { + return { + ...field, + name: '_uuid', + } + } + + return field + }) diff --git a/packages/db-sqlite/src/schema/setColumnID.ts b/packages/db-sqlite/src/schema/setColumnID.ts new file mode 100644 index 0000000000..f92adb32b0 --- /dev/null +++ b/packages/db-sqlite/src/schema/setColumnID.ts @@ -0,0 +1,31 @@ +import type { SQLiteColumnBuilder } from 'drizzle-orm/sqlite-core' + +import { integer, numeric, text } from 'drizzle-orm/sqlite-core' +import { type Field, flattenTopLevelFields } from 'payload' +import { fieldAffectsData } from 'payload/shared' + +import type { IDType } from '../types.js' + +type Args = { + columns: Record + fields: Field[] +} +export const setColumnID = ({ columns, fields }: Args): IDType => { + const idField = flattenTopLevelFields(fields).find( + (field) => fieldAffectsData(field) && field.name === 'id', + ) + if (idField) { + if (idField.type === 'number') { + columns.id = numeric('id').primaryKey() + return 'numeric' + } + + if (idField.type === 'text') { + columns.id = text('id').primaryKey() + return 'text' + } + } + + columns.id = integer('id').primaryKey() + return 'integer' +} diff --git a/packages/db-sqlite/src/schema/traverseFields.ts b/packages/db-sqlite/src/schema/traverseFields.ts new file mode 100644 index 0000000000..2f4f95524d --- /dev/null +++ b/packages/db-sqlite/src/schema/traverseFields.ts @@ -0,0 +1,787 @@ +/* eslint-disable no-param-reassign */ +import type { Relation } from 'drizzle-orm' +import type { IndexBuilder, SQLiteColumnBuilder } from 'drizzle-orm/sqlite-core' +import type { Field, TabAsField } from 'payload' + +import { + createTableName, + hasLocalesTable, + validateExistingBlockIsIdentical, +} from '@payloadcms/drizzle' +import { relations } from 'drizzle-orm' +import { + SQLiteIntegerBuilder, + SQLiteNumericBuilder, + SQLiteTextBuilder, + foreignKey, + index, + integer, + numeric, + text, +} from 'drizzle-orm/sqlite-core' +import { InvalidConfiguration } from 'payload' +import { fieldAffectsData, optionIsObject } from 'payload/shared' +import toSnakeCase from 'to-snake-case' + +import type { GenericColumns, IDType, SQLiteAdapter } from '../types.js' +import type { BaseExtraConfig, RelationMap } from './build.js' + +import { buildTable } from './build.js' +import { createIndex } from './createIndex.js' +import { getIDColumn } from './getIDColumn.js' +import { idToUUID } from './idToUUID.js' + +type Args = { + adapter: SQLiteAdapter + columnPrefix?: string + columns: Record + disableNotNull: boolean + disableUnique?: boolean + fieldPrefix?: string + fields: (Field | TabAsField)[] + forceLocalized?: boolean + indexes: Record IndexBuilder> + locales: [string, ...string[]] + localesColumns: Record + localesIndexes: Record IndexBuilder> + newTableName: string + parentTableName: string + relationsToBuild: RelationMap + relationships: Set + rootRelationsToBuild?: RelationMap + rootTableIDColType: IDType + rootTableName: string + versions: boolean +} + +type Result = { + hasLocalizedField: boolean + hasLocalizedManyNumberField: boolean + hasLocalizedManyTextField: boolean + hasLocalizedRelationshipField: boolean + hasManyNumberField: 'index' | boolean + hasManyTextField: 'index' | boolean +} + +export const traverseFields = ({ + adapter, + columnPrefix, + columns, + disableNotNull, + disableUnique = false, + fieldPrefix, + fields, + forceLocalized, + indexes, + locales, + localesColumns, + localesIndexes, + newTableName, + parentTableName, + relationsToBuild, + relationships, + rootRelationsToBuild, + rootTableIDColType, + rootTableName, + versions, +}: Args): Result => { + let hasLocalizedField = false + let hasLocalizedRelationshipField = false + let hasManyTextField: 'index' | boolean = false + let hasLocalizedManyTextField = false + let hasManyNumberField: 'index' | boolean = false + let hasLocalizedManyNumberField = false + + let parentIDColType: IDType = 'integer' + if (columns.id instanceof SQLiteIntegerBuilder) parentIDColType = 'integer' + if (columns.id instanceof SQLiteNumericBuilder) parentIDColType = 'numeric' + if (columns.id instanceof SQLiteTextBuilder) parentIDColType = 'text' + + fields.forEach((field) => { + if ('name' in field && field.name === 'id') return + let columnName: string + let fieldName: string + + let targetTable = columns + let targetIndexes = indexes + + if (fieldAffectsData(field)) { + columnName = `${columnPrefix || ''}${field.name[0] === '_' ? '_' : ''}${toSnakeCase( + field.name, + )}` + fieldName = `${fieldPrefix?.replace('.', '_') || ''}${field.name}` + + // If field is localized, + // add the column to the locale table instead of main table + if ( + adapter.payload.config.localization && + (field.localized || forceLocalized) && + field.type !== 'array' && + field.type !== 'blocks' && + (('hasMany' in field && field.hasMany !== true) || !('hasMany' in field)) + ) { + hasLocalizedField = true + targetTable = localesColumns + targetIndexes = localesIndexes + } + + if ( + (field.unique || field.index) && + !['array', 'blocks', 'group', 'point', 'relationship', 'upload'].includes(field.type) && + !('hasMany' in field && field.hasMany === true) + ) { + const unique = disableUnique !== true && field.unique + if (unique) { + const constraintValue = `${fieldPrefix || ''}${field.name}` + if (!adapter.fieldConstraints?.[rootTableName]) { + adapter.fieldConstraints[rootTableName] = {} + } + adapter.fieldConstraints[rootTableName][`${columnName}_idx`] = constraintValue + } + targetIndexes[`${newTableName}_${field.name}Idx`] = createIndex({ + name: fieldName, + columnName, + tableName: newTableName, + unique, + }) + } + } + + switch (field.type) { + case 'text': { + if (field.hasMany) { + if (field.localized) { + hasLocalizedManyTextField = true + } + + if (field.index) { + hasManyTextField = 'index' + } else if (!hasManyTextField) { + hasManyTextField = true + } + + if (field.unique) { + throw new InvalidConfiguration( + 'Unique is not supported in SQLite for hasMany text fields.', + ) + } + } else { + targetTable[fieldName] = text(columnName) + } + break + } + case 'email': + case 'code': + case 'textarea': { + targetTable[fieldName] = text(columnName) + break + } + + case 'number': { + if (field.hasMany) { + if (field.localized) { + hasLocalizedManyNumberField = true + } + + if (field.index) { + hasManyNumberField = 'index' + } else if (!hasManyNumberField) { + hasManyNumberField = true + } + + if (field.unique) { + throw new InvalidConfiguration( + 'Unique is not supported in Postgres for hasMany number fields.', + ) + } + } else { + targetTable[fieldName] = numeric(columnName) + } + break + } + + case 'richText': + case 'json': { + targetTable[fieldName] = text(columnName, { mode: 'json' }) + break + } + + case 'date': { + targetTable[fieldName] = text(columnName) + break + } + + case 'point': { + break + } + + case 'radio': + case 'select': { + const options = field.options.map((option) => { + if (optionIsObject(option)) { + return option.value + } + + return option + }) as [string, ...string[]] + + if (field.type === 'select' && field.hasMany) { + const selectTableName = createTableName({ + adapter, + config: field, + parentTableName: newTableName, + prefix: `${newTableName}_`, + versionsCustomName: versions, + }) + const baseColumns: Record = { + order: integer('order').notNull(), + parent: getIDColumn({ + name: 'parent_id', + type: parentIDColType, + notNull: true, + primaryKey: false, + }), + value: text('value', { enum: options }), + } + + const baseExtraConfig: BaseExtraConfig = { + orderIdx: (cols) => index(`${selectTableName}_order_idx`).on(cols.order), + parentFk: (cols) => + foreignKey({ + name: `${selectTableName}_parent_fk`, + columns: [cols.parent], + foreignColumns: [adapter.tables[parentTableName].id], + }).onDelete('cascade'), + parentIdx: (cols) => index(`${selectTableName}_parent_idx`).on(cols.parent), + } + + if (field.localized) { + baseColumns.locale = text('locale', { enum: locales }).notNull() + baseExtraConfig.localeIdx = (cols) => + index(`${selectTableName}_locale_idx`).on(cols.locale) + } + + if (field.index) { + baseExtraConfig.value = (cols) => index(`${selectTableName}_value_idx`).on(cols.value) + } + + buildTable({ + adapter, + baseColumns, + baseExtraConfig, + disableNotNull, + disableUnique, + fields: [], + rootTableName, + tableName: selectTableName, + versions, + }) + + relationsToBuild.set(fieldName, { + type: 'many', + // selects have their own localized table, independent of the base table. + localized: false, + target: selectTableName, + }) + + adapter.relations[`relations_${selectTableName}`] = relations( + adapter.tables[selectTableName], + ({ one }) => ({ + parent: one(adapter.tables[parentTableName], { + fields: [adapter.tables[selectTableName].parent], + references: [adapter.tables[parentTableName].id], + relationName: fieldName, + }), + }), + ) + } else { + targetTable[fieldName] = text(fieldName, { enum: options }) + } + break + } + + case 'checkbox': { + targetTable[fieldName] = integer(columnName, { mode: 'boolean' }) + break + } + + case 'array': { + const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull + + const arrayTableName = createTableName({ + adapter, + config: field, + parentTableName: newTableName, + prefix: `${newTableName}_`, + versionsCustomName: versions, + }) + + const baseColumns: Record = { + _order: integer('_order').notNull(), + _parentID: getIDColumn({ + name: '_parent_id', + type: parentIDColType, + notNull: true, + primaryKey: false, + }), + } + + const baseExtraConfig: BaseExtraConfig = { + _orderIdx: (cols) => index(`${arrayTableName}_order_idx`).on(cols._order), + _parentIDFk: (cols) => + foreignKey({ + name: `${arrayTableName}_parent_id_fk`, + columns: [cols['_parentID']], + foreignColumns: [adapter.tables[parentTableName].id], + }).onDelete('cascade'), + _parentIDIdx: (cols) => index(`${arrayTableName}_parent_id_idx`).on(cols._parentID), + } + + if (field.localized && adapter.payload.config.localization) { + baseColumns._locale = text('_locale', { enum: locales }).notNull() + baseExtraConfig._localeIdx = (cols) => + index(`${arrayTableName}_locale_idx`).on(cols._locale) + } + + const { + hasManyNumberField: subHasManyNumberField, + hasManyTextField: subHasManyTextField, + relationsToBuild: subRelationsToBuild, + } = buildTable({ + adapter, + baseColumns, + baseExtraConfig, + disableNotNull: disableNotNullFromHere, + disableUnique, + fields: disableUnique ? idToUUID(field.fields) : field.fields, + rootRelationsToBuild, + rootRelationships: relationships, + rootTableIDColType, + rootTableName, + tableName: arrayTableName, + versions, + }) + + if (subHasManyTextField) { + if (!hasManyTextField || subHasManyTextField === 'index') + hasManyTextField = subHasManyTextField + } + if (subHasManyNumberField) { + if (!hasManyNumberField || subHasManyNumberField === 'index') + hasManyNumberField = subHasManyNumberField + } + + relationsToBuild.set(fieldName, { + type: 'many', + // arrays have their own localized table, independent of the base table. + localized: false, + target: arrayTableName, + }) + + adapter.relations[`relations_${arrayTableName}`] = relations( + adapter.tables[arrayTableName], + ({ many, one }) => { + const result: Record> = { + _parentID: one(adapter.tables[parentTableName], { + fields: [adapter.tables[arrayTableName]._parentID], + references: [adapter.tables[parentTableName].id], + relationName: fieldName, + }), + } + + if (hasLocalesTable(field.fields)) { + result._locales = many(adapter.tables[`${arrayTableName}${adapter.localesSuffix}`], { + relationName: '_locales', + }) + } + + subRelationsToBuild.forEach(({ type, localized, target }, key) => { + if (type === 'one') { + const arrayWithLocalized = localized + ? `${arrayTableName}${adapter.localesSuffix}` + : arrayTableName + result[key] = one(adapter.tables[target], { + fields: [adapter.tables[arrayWithLocalized][key]], + references: [adapter.tables[target].id], + relationName: key, + }) + } + if (type === 'many') { + result[key] = many(adapter.tables[target], { relationName: key }) + } + }) + + return result + }, + ) + + break + } + + case 'blocks': { + const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull + + field.blocks.forEach((block) => { + const blockTableName = createTableName({ + adapter, + config: block, + parentTableName: rootTableName, + prefix: `${rootTableName}_blocks_`, + versionsCustomName: versions, + }) + if (!adapter.tables[blockTableName]) { + const baseColumns: Record = { + _order: integer('_order').notNull(), + _parentID: getIDColumn({ + name: '_parent_id', + type: rootTableIDColType, + notNull: true, + primaryKey: false, + }), + _path: text('_path').notNull(), + } + + const baseExtraConfig: BaseExtraConfig = { + _orderIdx: (cols) => index(`${blockTableName}_order_idx`).on(cols._order), + _parentIDIdx: (cols) => index(`${blockTableName}_parent_id_idx`).on(cols._parentID), + _parentIdFk: (cols) => + foreignKey({ + name: `${blockTableName}_parent_id_fk`, + columns: [cols._parentID], + foreignColumns: [adapter.tables[rootTableName].id], + }).onDelete('cascade'), + _pathIdx: (cols) => index(`${blockTableName}_path_idx`).on(cols._path), + } + + if (field.localized && adapter.payload.config.localization) { + baseColumns._locale = text('_locale', { enum: locales }).notNull() + baseExtraConfig._localeIdx = (cols) => + index(`${blockTableName}_locale_idx`).on(cols._locale) + } + + const { + hasManyNumberField: subHasManyNumberField, + hasManyTextField: subHasManyTextField, + relationsToBuild: subRelationsToBuild, + } = buildTable({ + adapter, + baseColumns, + baseExtraConfig, + disableNotNull: disableNotNullFromHere, + disableUnique, + fields: disableUnique ? idToUUID(block.fields) : block.fields, + rootRelationsToBuild, + rootRelationships: relationships, + rootTableIDColType, + rootTableName, + tableName: blockTableName, + versions, + }) + + if (subHasManyTextField) { + if (!hasManyTextField || subHasManyTextField === 'index') + hasManyTextField = subHasManyTextField + } + + if (subHasManyNumberField) { + if (!hasManyNumberField || subHasManyNumberField === 'index') + hasManyNumberField = subHasManyNumberField + } + + adapter.relations[`relations_${blockTableName}`] = relations( + adapter.tables[blockTableName], + ({ many, one }) => { + const result: Record> = { + _parentID: one(adapter.tables[rootTableName], { + fields: [adapter.tables[blockTableName]._parentID], + references: [adapter.tables[rootTableName].id], + relationName: `_blocks_${block.slug}`, + }), + } + + if (hasLocalesTable(block.fields)) { + result._locales = many( + adapter.tables[`${blockTableName}${adapter.localesSuffix}`], + { relationName: '_locales' }, + ) + } + + subRelationsToBuild.forEach(({ type, localized, target }, key) => { + if (type === 'one') { + const blockWithLocalized = localized + ? `${blockTableName}${adapter.localesSuffix}` + : blockTableName + result[key] = one(adapter.tables[target], { + fields: [adapter.tables[blockWithLocalized][key]], + references: [adapter.tables[target].id], + relationName: key, + }) + } + if (type === 'many') { + result[key] = many(adapter.tables[target], { relationName: key }) + } + }) + + return result + }, + ) + } else if (process.env.NODE_ENV !== 'production' && !versions) { + validateExistingBlockIsIdentical({ + block, + localized: field.localized, + rootTableName, + table: adapter.tables[blockTableName], + tableLocales: adapter.tables[`${blockTableName}${adapter.localesSuffix}`], + }) + } + // blocks relationships are defined from the collection or globals table down to the block, bypassing any subBlocks + rootRelationsToBuild.set(`_blocks_${block.slug}`, { + type: 'many', + // blocks are not localized on the parent table + localized: false, + target: blockTableName, + }) + }) + + break + } + + case 'tab': + case 'group': { + if (!('name' in field)) { + const { + hasLocalizedField: groupHasLocalizedField, + hasLocalizedManyNumberField: groupHasLocalizedManyNumberField, + hasLocalizedManyTextField: groupHasLocalizedManyTextField, + hasLocalizedRelationshipField: groupHasLocalizedRelationshipField, + hasManyNumberField: groupHasManyNumberField, + hasManyTextField: groupHasManyTextField, + } = traverseFields({ + adapter, + columnPrefix, + columns, + disableNotNull, + disableUnique, + fieldPrefix, + fields: field.fields, + forceLocalized, + indexes, + locales, + localesColumns, + localesIndexes, + newTableName, + parentTableName, + relationsToBuild, + relationships, + rootRelationsToBuild, + rootTableIDColType, + rootTableName, + versions, + }) + + if (groupHasLocalizedField) hasLocalizedField = true + if (groupHasLocalizedRelationshipField) hasLocalizedRelationshipField = true + if (groupHasManyTextField) hasManyTextField = true + if (groupHasLocalizedManyTextField) hasLocalizedManyTextField = true + if (groupHasManyNumberField) hasManyNumberField = true + if (groupHasLocalizedManyNumberField) hasLocalizedManyNumberField = true + break + } + + const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull + + const { + hasLocalizedField: groupHasLocalizedField, + hasLocalizedManyNumberField: groupHasLocalizedManyNumberField, + hasLocalizedManyTextField: groupHasLocalizedManyTextField, + hasLocalizedRelationshipField: groupHasLocalizedRelationshipField, + hasManyNumberField: groupHasManyNumberField, + hasManyTextField: groupHasManyTextField, + } = traverseFields({ + adapter, + columnPrefix: `${columnName}_`, + columns, + disableNotNull: disableNotNullFromHere, + disableUnique, + fieldPrefix: `${fieldName}.`, + fields: field.fields, + forceLocalized: field.localized, + indexes, + locales, + localesColumns, + localesIndexes, + newTableName: `${parentTableName}_${columnName}`, + parentTableName, + relationsToBuild, + relationships, + rootRelationsToBuild, + rootTableIDColType, + rootTableName, + versions, + }) + + if (groupHasLocalizedField) hasLocalizedField = true + if (groupHasLocalizedRelationshipField) hasLocalizedRelationshipField = true + if (groupHasManyTextField) hasManyTextField = true + if (groupHasLocalizedManyTextField) hasLocalizedManyTextField = true + if (groupHasManyNumberField) hasManyNumberField = true + if (groupHasLocalizedManyNumberField) hasLocalizedManyNumberField = true + break + } + + case 'tabs': { + const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull + + const { + hasLocalizedField: tabHasLocalizedField, + hasLocalizedManyNumberField: tabHasLocalizedManyNumberField, + hasLocalizedManyTextField: tabHasLocalizedManyTextField, + hasLocalizedRelationshipField: tabHasLocalizedRelationshipField, + hasManyNumberField: tabHasManyNumberField, + hasManyTextField: tabHasManyTextField, + } = traverseFields({ + adapter, + columnPrefix, + columns, + disableNotNull: disableNotNullFromHere, + disableUnique, + fieldPrefix, + fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })), + forceLocalized, + indexes, + locales, + localesColumns, + localesIndexes, + newTableName, + parentTableName, + relationsToBuild, + relationships, + rootRelationsToBuild, + rootTableIDColType, + rootTableName, + versions, + }) + + if (tabHasLocalizedField) hasLocalizedField = true + if (tabHasLocalizedRelationshipField) hasLocalizedRelationshipField = true + if (tabHasManyTextField) hasManyTextField = true + if (tabHasLocalizedManyTextField) hasLocalizedManyTextField = true + if (tabHasManyNumberField) hasManyNumberField = true + if (tabHasLocalizedManyNumberField) hasLocalizedManyNumberField = true + break + } + + case 'row': + case 'collapsible': { + const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull + const { + hasLocalizedField: rowHasLocalizedField, + hasLocalizedManyNumberField: rowHasLocalizedManyNumberField, + hasLocalizedManyTextField: rowHasLocalizedManyTextField, + hasLocalizedRelationshipField: rowHasLocalizedRelationshipField, + hasManyNumberField: rowHasManyNumberField, + hasManyTextField: rowHasManyTextField, + } = traverseFields({ + adapter, + columnPrefix, + columns, + disableNotNull: disableNotNullFromHere, + disableUnique, + fieldPrefix, + fields: field.fields, + forceLocalized, + indexes, + locales, + localesColumns, + localesIndexes, + newTableName, + parentTableName, + relationsToBuild, + relationships, + rootRelationsToBuild, + rootTableIDColType, + rootTableName, + versions, + }) + + if (rowHasLocalizedField) hasLocalizedField = true + if (rowHasLocalizedRelationshipField) hasLocalizedRelationshipField = true + if (rowHasManyTextField) hasManyTextField = true + if (rowHasLocalizedManyTextField) hasLocalizedManyTextField = true + if (rowHasManyNumberField) hasManyNumberField = true + if (rowHasLocalizedManyNumberField) hasLocalizedManyNumberField = true + break + } + + case 'relationship': + case 'upload': + if (Array.isArray(field.relationTo)) { + field.relationTo.forEach((relation) => relationships.add(relation)) + } else if (field.type === 'relationship' && field.hasMany) { + relationships.add(field.relationTo) + } else { + // simple relationships get a column on the targetTable with a foreign key to the relationTo table + const relationshipConfig = adapter.payload.collections[field.relationTo].config + + const tableName = adapter.tableNameMap.get(toSnakeCase(field.relationTo)) + + // get the id type of the related collection + let colType: IDType = 'integer' + const relatedCollectionCustomID = relationshipConfig.fields.find( + (field) => fieldAffectsData(field) && field.name === 'id', + ) + if (relatedCollectionCustomID?.type === 'number') colType = 'numeric' + if (relatedCollectionCustomID?.type === 'text') colType = 'text' + + // make the foreign key column for relationship using the correct id column type + targetTable[fieldName] = getIDColumn({ + name: `${columnName}_id`, + type: colType, + primaryKey: false, + }).references(() => adapter.tables[tableName].id, { onDelete: 'set null' }) + + // add relationship to table + relationsToBuild.set(fieldName, { + type: 'one', + localized: adapter.payload.config.localization && field.localized, + target: tableName, + }) + + // add notNull when not required + if (!disableNotNull && field.required && !field.admin?.condition) { + targetTable[fieldName].notNull() + } + break + } + if (adapter.payload.config.localization && field.localized) { + hasLocalizedRelationshipField = true + } + + break + + default: + break + } + + const condition = field.admin && field.admin.condition + + if ( + !disableNotNull && + targetTable[fieldName] && + 'required' in field && + field.required && + !condition + ) { + targetTable[fieldName].notNull() + } + }) + + return { + hasLocalizedField, + hasLocalizedManyNumberField, + hasLocalizedManyTextField, + hasLocalizedRelationshipField, + hasManyNumberField, + hasManyTextField, + } +} diff --git a/packages/db-sqlite/src/types.ts b/packages/db-sqlite/src/types.ts new file mode 100644 index 0000000000..0d324ccfd0 --- /dev/null +++ b/packages/db-sqlite/src/types.ts @@ -0,0 +1,167 @@ +import type { Client, Config, ResultSet } from '@libsql/client' +import type { Operators } from '@payloadcms/drizzle' +import type { BuildQueryJoinAliases, DrizzleAdapter } from '@payloadcms/drizzle/types' +import type { ColumnDataType, DrizzleConfig, Relation, Relations, SQL } from 'drizzle-orm' +import type { LibSQLDatabase } from 'drizzle-orm/libsql' +import type { + SQLiteColumn, + SQLiteInsertOnConflictDoUpdateConfig, + SQLiteTableWithColumns, + SQLiteTransactionConfig, +} from 'drizzle-orm/sqlite-core' +import type { SQLiteRaw } from 'drizzle-orm/sqlite-core/query-builders/raw' +import type { Payload, PayloadRequest } from 'payload' + +export type Args = { + client: Config + idType?: 'serial' | 'uuid' + localesSuffix?: string + logger?: DrizzleConfig['logger'] + migrationDir?: string + push?: boolean + relationshipsSuffix?: string + schemaName?: string + transactionOptions?: SQLiteTransactionConfig | false + versionsSuffix?: string +} + +export type GenericColumn = SQLiteColumn< + { + baseColumn: never + columnType: string + data: unknown + dataType: ColumnDataType + driverParam: unknown + enumValues: string[] + hasDefault: false + name: string + notNull: false + tableName: string + }, + object +> + +export type GenericColumns = { + [x: string]: GenericColumn +} + +export type GenericTable = SQLiteTableWithColumns<{ + columns: GenericColumns + dialect: string + name: string + schema: string +}> + +export type GenericRelation = Relations>> + +export type CountDistinct = (args: { + db: LibSQLDatabase + joins: BuildQueryJoinAliases + tableName: string + where: SQL +}) => Promise + +export type DeleteWhere = (args: { + db: LibSQLDatabase + tableName: string + where: SQL +}) => Promise + +export type DropDatabase = (args: { adapter: SQLiteAdapter }) => Promise + +export type Execute = (args: { + db?: LibSQLDatabase + drizzle?: LibSQLDatabase + raw?: string + sql?: SQL +}) => SQLiteRaw> | SQLiteRaw + +export type Insert = (args: { + db: LibSQLDatabase + onConflictDoUpdate?: SQLiteInsertOnConflictDoUpdateConfig + tableName: string + values: Record | Record[] +}) => Promise[]> + +// Explicitly omit drizzle property for complete override in SQLiteAdapter, required in ts 5.5 +type SQLiteDrizzleAdapter = Omit< + DrizzleAdapter, + | 'countDistinct' + | 'deleteWhere' + | 'drizzle' + | 'dropDatabase' + | 'execute' + | 'insert' + | 'operators' + | 'relations' +> + +export type SQLiteAdapter = { + client: Client + clientConfig: Args['client'] + countDistinct: CountDistinct + defaultDrizzleSnapshot: any + deleteWhere: DeleteWhere + drizzle: LibSQLDatabase + dropDatabase: DropDatabase + execute: Execute + /** + * An object keyed on each table, with a key value pair where the constraint name is the key, followed by the dot-notation field name + * Used for returning properly formed errors from unique fields + */ + fieldConstraints: Record> + idType: Args['idType'] + initializing: Promise + insert: Insert + localesSuffix?: string + logger: DrizzleConfig['logger'] + operators: Operators + push: boolean + rejectInitializing: () => void + relations: Record + relationshipsSuffix?: string + resolveInitializing: () => void + schema: Record + schemaName?: Args['schemaName'] + tableNameMap: Map + tables: Record + transactionOptions: SQLiteTransactionConfig + versionsSuffix?: string +} & SQLiteDrizzleAdapter + +export type IDType = 'integer' | 'numeric' | 'text' + +export type MigrateUpArgs = { + db: LibSQLDatabase + payload: Payload + req?: Partial +} +export type MigrateDownArgs = { + db: LibSQLDatabase + payload: Payload + req?: Partial +} + +declare module 'payload' { + export interface DatabaseAdapter + extends Omit, + DrizzleAdapter { + /** + * An object keyed on each table, with a key value pair where the constraint name is the key, followed by the dot-notation field name + * Used for returning properly formed errors from unique fields + */ + fieldConstraints: Record> + idType: Args['idType'] + initializing: Promise + localesSuffix?: string + logger: DrizzleConfig['logger'] + push: boolean + rejectInitializing: () => void + relationshipsSuffix?: string + resolveInitializing: () => void + schema: Record + tableNameMap: Map + transactionOptions: SQLiteTransactionConfig + versionsSuffix?: string + } +} diff --git a/packages/db-sqlite/tsconfig.json b/packages/db-sqlite/tsconfig.json new file mode 100644 index 0000000000..7308bb80f9 --- /dev/null +++ b/packages/db-sqlite/tsconfig.json @@ -0,0 +1,41 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, + // Make sure typescript knows that this module depends on their references + "noEmit": false + /* Do not emit outputs. */, + "emitDeclarationOnly": true, + "outDir": "./dist" + /* Specify an output folder for all emitted files. */, + "rootDir": "./src" + /* Specify the root folder within your source files. */ + }, + "exclude": [ + "dist", + "build", + "tests", + "test", + "node_modules", + "eslint.config.js", + "src/**/*.spec.js", + "src/**/*.spec.jsx", + "src/**/*.spec.ts", + "src/**/*.spec.tsx" + ], + "include": [ + "src", + "src/**/*.ts" + ], + "references": [ + { + "path": "../payload" + }, + { + "path": "../translations" + }, + { + "path": "../drizzle" + } + ] +} diff --git a/packages/drizzle/.eslintignore b/packages/drizzle/.eslintignore new file mode 100644 index 0000000000..247f3f12de --- /dev/null +++ b/packages/drizzle/.eslintignore @@ -0,0 +1,10 @@ +.tmp +**/.git +**/.hg +**/.pnp.* +**/.svn +**/.yarn/** +**/build +**/dist/** +**/node_modules +**/temp diff --git a/packages/drizzle/.eslintrc.cjs b/packages/drizzle/.eslintrc.cjs new file mode 100644 index 0000000000..d6b3a476b8 --- /dev/null +++ b/packages/drizzle/.eslintrc.cjs @@ -0,0 +1,7 @@ +/** @type {import('eslint').Linter.Config} */ +module.exports = { + parserOptions: { + project: ['./tsconfig.json'], + tsconfigRootDir: __dirname, + }, +} diff --git a/packages/drizzle/.prettierignore b/packages/drizzle/.prettierignore new file mode 100644 index 0000000000..247f3f12de --- /dev/null +++ b/packages/drizzle/.prettierignore @@ -0,0 +1,10 @@ +.tmp +**/.git +**/.hg +**/.pnp.* +**/.svn +**/.yarn/** +**/build +**/dist/** +**/node_modules +**/temp diff --git a/packages/drizzle/.swcrc b/packages/drizzle/.swcrc new file mode 100644 index 0000000000..14463f4b08 --- /dev/null +++ b/packages/drizzle/.swcrc @@ -0,0 +1,15 @@ +{ + "$schema": "https://json.schemastore.org/swcrc", + "sourceMaps": true, + "jsc": { + "target": "esnext", + "parser": { + "syntax": "typescript", + "tsx": true, + "dts": true + } + }, + "module": { + "type": "es6" + } +} diff --git a/packages/drizzle/README.md b/packages/drizzle/README.md new file mode 100644 index 0000000000..7eabb61466 --- /dev/null +++ b/packages/drizzle/README.md @@ -0,0 +1,3 @@ +# Payload Drizzle Adapter + +The Drizzle package is used by db-postgres and db-sqlite for shared functionality of SQL databases. It is not meant to be used directly in Payload projects. diff --git a/packages/drizzle/package.json b/packages/drizzle/package.json new file mode 100644 index 0000000000..25fed7a484 --- /dev/null +++ b/packages/drizzle/package.json @@ -0,0 +1,71 @@ +{ + "name": "@payloadcms/drizzle", + "version": "3.0.0-beta.36", + "description": "A library of shared functions used by different payload database adapters", + "homepage": "https://payloadcms.com", + "repository": { + "type": "git", + "url": "https://github.com/payloadcms/payload.git", + "directory": "packages/drizzle" + }, + "license": "MIT", + "author": "Payload (https://payloadcms.com)", + "type": "module", + "exports": { + ".": { + "import": "./src/index.ts", + "types": "./src/index.ts", + "default": "./src/index.ts" + }, + "./types": { + "import": "./src/types.ts", + "types": "./src/types.ts", + "default": "./src/types.ts" + } + }, + "main": "./src/index.ts", + "types": "./src/types.ts", + "files": [ + "dist", + "mock.js" + ], + "scripts": { + "build": "pnpm build:swc && pnpm build:types", + "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths", + "build:types": "tsc --emitDeclarationOnly --outDir dist", + "clean": "rimraf {dist,*.tsbuildinfo}", + "prepack": "pnpm clean && pnpm turbo build", + "prepublishOnly": "pnpm clean && pnpm turbo build" + }, + "dependencies": { + "console-table-printer": "2.11.2", + "drizzle-orm": "0.29.4", + "prompts": "2.4.2", + "to-snake-case": "1.0.0", + "uuid": "9.0.0" + }, + "devDependencies": { + "@libsql/client": "^0.6.2", + "@payloadcms/eslint-config": "workspace:*", + "@types/pg": "8.10.2", + "@types/to-snake-case": "1.0.0", + "payload": "workspace:*" + }, + "peerDependencies": { + "payload": "workspace:*" + }, + "publishConfig": { + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts" + }, + "./types": { + "import": "./dist/types.js", + "types": "./dist/types.d.ts" + } + }, + "main": "./dist/index.js", + "types": "./dist/index.d.ts" + } +} diff --git a/packages/drizzle/src/count.ts b/packages/drizzle/src/count.ts new file mode 100644 index 0000000000..10d080d878 --- /dev/null +++ b/packages/drizzle/src/count.ts @@ -0,0 +1,36 @@ +import type { Count } from 'payload' +import type { SanitizedCollectionConfig } from 'payload' + +import toSnakeCase from 'to-snake-case' + +import type { DrizzleAdapter } from './types.js' + +import buildQuery from './queries/buildQuery.js' + +export const count: Count = async function count( + this: DrizzleAdapter, + { collection, locale, req, where: whereArg }, +) { + const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config + + const tableName = this.tableNameMap.get(toSnakeCase(collectionConfig.slug)) + + const db = this.sessions[await req.transactionID]?.db || this.drizzle + + const { joins, where } = await buildQuery({ + adapter: this, + fields: collectionConfig.fields, + locale, + tableName, + where: whereArg, + }) + + const countResult = await this.countDistinct({ + db, + joins, + tableName, + where, + }) + + return { totalDocs: countResult } +} diff --git a/packages/db-postgres/src/create.ts b/packages/drizzle/src/create.ts similarity index 89% rename from packages/db-postgres/src/create.ts rename to packages/drizzle/src/create.ts index 9a1d062acc..07048a28ee 100644 --- a/packages/db-postgres/src/create.ts +++ b/packages/drizzle/src/create.ts @@ -2,12 +2,12 @@ import type { Create } from 'payload' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { upsertRow } from './upsertRow/index.js' export const create: Create = async function create( - this: PostgresAdapter, + this: DrizzleAdapter, { collection: collectionSlug, data, req }, ) { const db = this.sessions[await req.transactionID]?.db || this.drizzle diff --git a/packages/db-postgres/src/createGlobal.ts b/packages/drizzle/src/createGlobal.ts similarity index 90% rename from packages/db-postgres/src/createGlobal.ts rename to packages/drizzle/src/createGlobal.ts index 4c13d581db..da3710ff4b 100644 --- a/packages/db-postgres/src/createGlobal.ts +++ b/packages/drizzle/src/createGlobal.ts @@ -2,12 +2,12 @@ import type { CreateGlobalArgs, PayloadRequest } from 'payload' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { upsertRow } from './upsertRow/index.js' export async function createGlobal>( - this: PostgresAdapter, + this: DrizzleAdapter, { slug, data, req = {} as PayloadRequest }: CreateGlobalArgs, ): Promise { const db = this.sessions[await req.transactionID]?.db || this.drizzle diff --git a/packages/db-postgres/src/createGlobalVersion.ts b/packages/drizzle/src/createGlobalVersion.ts similarity index 81% rename from packages/db-postgres/src/createGlobalVersion.ts rename to packages/drizzle/src/createGlobalVersion.ts index 58e2dad1e2..a82b8559f7 100644 --- a/packages/db-postgres/src/createGlobalVersion.ts +++ b/packages/drizzle/src/createGlobalVersion.ts @@ -4,12 +4,12 @@ import { sql } from 'drizzle-orm' import { buildVersionGlobalFields } from 'payload' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { upsertRow } from './upsertRow/index.js' export async function createGlobalVersion( - this: PostgresAdapter, + this: DrizzleAdapter, { autosave, globalSlug, req = {} as PayloadRequest, versionData }: CreateGlobalVersionArgs, ) { const db = this.sessions[await req.transactionID]?.db || this.drizzle @@ -32,13 +32,15 @@ export async function createGlobalVersion( }) const table = this.tables[tableName] - if (global.versions.drafts) { - await db.execute(sql` - UPDATE ${table} - SET latest = false - WHERE ${table.id} != ${result.id}; - `) + await this.execute({ + db, + sql: sql` + UPDATE ${table} + SET latest = false + WHERE ${table.id} != ${result.id}; + `, + }) } return result diff --git a/packages/db-postgres/src/schema/createTableName.ts b/packages/drizzle/src/createTableName.ts similarity index 92% rename from packages/db-postgres/src/schema/createTableName.ts rename to packages/drizzle/src/createTableName.ts index 220947794a..55ffa04156 100644 --- a/packages/db-postgres/src/schema/createTableName.ts +++ b/packages/drizzle/src/createTableName.ts @@ -3,10 +3,10 @@ import type { DBIdentifierName } from 'payload' import { APIError } from 'payload' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from '../types.js' +import type { DrizzleAdapter } from './types.js' type Args = { - adapter: PostgresAdapter + adapter: Pick /** The collection, global or field config **/ config: { dbName?: DBIdentifierName @@ -20,6 +20,7 @@ type Args = { prefix?: string /** For tables based on fields that could have both enumName and dbName (ie: select with hasMany), default: 'dbName' */ target?: 'dbName' | 'enumName' + /** Throws error if true for postgres when table and enum names exceed 63 characters */ throwValidationError?: boolean /** Adds the versions suffix to the default table name - should only be used on the base collection to avoid duplicate suffixing */ versions?: boolean diff --git a/packages/db-postgres/src/createVersion.ts b/packages/drizzle/src/createVersion.ts similarity index 90% rename from packages/db-postgres/src/createVersion.ts rename to packages/drizzle/src/createVersion.ts index c21aecb136..afa12721d5 100644 --- a/packages/db-postgres/src/createVersion.ts +++ b/packages/drizzle/src/createVersion.ts @@ -4,12 +4,12 @@ import { sql } from 'drizzle-orm' import { buildVersionCollectionFields } from 'payload' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { upsertRow } from './upsertRow/index.js' export async function createVersion( - this: PostgresAdapter, + this: DrizzleAdapter, { autosave, collectionSlug, @@ -45,12 +45,15 @@ export async function createVersion( const table = this.tables[tableName] if (collection.versions.drafts) { - await db.execute(sql` + await this.execute({ + db, + sql: sql` UPDATE ${table} SET latest = false WHERE ${table.id} != ${result.id} AND ${table.parent} = ${parent} - `) + `, + }) } return result diff --git a/packages/db-postgres/src/deleteMany.ts b/packages/drizzle/src/deleteMany.ts similarity index 81% rename from packages/db-postgres/src/deleteMany.ts rename to packages/drizzle/src/deleteMany.ts index 81b1e9d11c..389f8bc301 100644 --- a/packages/db-postgres/src/deleteMany.ts +++ b/packages/drizzle/src/deleteMany.ts @@ -3,12 +3,12 @@ import type { DeleteMany, PayloadRequest } from 'payload' import { inArray } from 'drizzle-orm' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { findMany } from './find/findMany.js' export const deleteMany: DeleteMany = async function deleteMany( - this: PostgresAdapter, + this: DrizzleAdapter, { collection, req = {} as PayloadRequest, where }, ) { const db = this.sessions[await req.transactionID]?.db || this.drizzle @@ -35,6 +35,10 @@ export const deleteMany: DeleteMany = async function deleteMany( }) if (ids.length > 0) { - await db.delete(this.tables[tableName]).where(inArray(this.tables[tableName].id, ids)) + await this.deleteWhere({ + db, + tableName, + where: inArray(this.tables[tableName].id, ids), + }) } } diff --git a/packages/db-postgres/src/deleteOne.ts b/packages/drizzle/src/deleteOne.ts similarity index 90% rename from packages/db-postgres/src/deleteOne.ts rename to packages/drizzle/src/deleteOne.ts index df2e22b789..daee86249a 100644 --- a/packages/db-postgres/src/deleteOne.ts +++ b/packages/drizzle/src/deleteOne.ts @@ -3,7 +3,7 @@ import type { DeleteOne, PayloadRequest } from 'payload' import { eq } from 'drizzle-orm' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { buildFindManyArgs } from './find/buildFindManyArgs.js' import buildQuery from './queries/buildQuery.js' @@ -11,7 +11,7 @@ import { selectDistinct } from './queries/selectDistinct.js' import { transform } from './transform/read/index.js' export const deleteOne: DeleteOne = async function deleteOne( - this: PostgresAdapter, + this: DrizzleAdapter, { collection: collectionSlug, req = {} as PayloadRequest, where: whereArg }, ) { const db = this.sessions[await req.transactionID]?.db || this.drizzle @@ -63,7 +63,11 @@ export const deleteOne: DeleteOne = async function deleteOne( fields: collection.fields, }) - await db.delete(this.tables[tableName]).where(eq(this.tables[tableName].id, docToDelete.id)) + await this.deleteWhere({ + db, + tableName, + where: eq(this.tables[tableName].id, docToDelete.id), + }) return result } diff --git a/packages/db-postgres/src/deleteVersions.ts b/packages/drizzle/src/deleteVersions.ts similarity index 84% rename from packages/db-postgres/src/deleteVersions.ts rename to packages/drizzle/src/deleteVersions.ts index dd31268789..9d8320a745 100644 --- a/packages/db-postgres/src/deleteVersions.ts +++ b/packages/drizzle/src/deleteVersions.ts @@ -4,12 +4,12 @@ import { inArray } from 'drizzle-orm' import { buildVersionCollectionFields } from 'payload' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { findMany } from './find/findMany.js' export const deleteVersions: DeleteVersions = async function deleteVersion( - this: PostgresAdapter, + this: DrizzleAdapter, { collection, locale, req = {} as PayloadRequest, where: where }, ) { const db = this.sessions[await req.transactionID]?.db || this.drizzle @@ -40,7 +40,11 @@ export const deleteVersions: DeleteVersions = async function deleteVersion( }) if (ids.length > 0) { - await db.delete(this.tables[tableName]).where(inArray(this.tables[tableName].id, ids)) + await this.deleteWhere({ + db, + tableName, + where: inArray(this.tables[tableName].id, ids), + }) } return docs diff --git a/packages/db-postgres/src/destroy.ts b/packages/drizzle/src/destroy.ts similarity index 67% rename from packages/db-postgres/src/destroy.ts rename to packages/drizzle/src/destroy.ts index 9d57827104..3731cdf904 100644 --- a/packages/db-postgres/src/destroy.ts +++ b/packages/drizzle/src/destroy.ts @@ -1,10 +1,10 @@ import type { Destroy } from 'payload' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' // eslint-disable-next-line @typescript-eslint/require-await -export const destroy: Destroy = async function destroy(this: PostgresAdapter) { - this.enums = {} +export const destroy: Destroy = async function destroy(this: DrizzleAdapter) { + if (this.enums) this.enums = {} this.schema = {} this.tables = {} this.relations = {} diff --git a/packages/db-postgres/src/find.ts b/packages/drizzle/src/find.ts similarity index 91% rename from packages/db-postgres/src/find.ts rename to packages/drizzle/src/find.ts index 5a22ced2fb..2e49973182 100644 --- a/packages/db-postgres/src/find.ts +++ b/packages/drizzle/src/find.ts @@ -2,12 +2,12 @@ import type { Find, PayloadRequest, SanitizedCollectionConfig } from 'payload' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { findMany } from './find/findMany.js' export const find: Find = async function find( - this: PostgresAdapter, + this: DrizzleAdapter, { collection, limit, diff --git a/packages/db-postgres/src/find/buildFindManyArgs.ts b/packages/drizzle/src/find/buildFindManyArgs.ts similarity index 95% rename from packages/db-postgres/src/find/buildFindManyArgs.ts rename to packages/drizzle/src/find/buildFindManyArgs.ts index 32ec372235..15f446e1df 100644 --- a/packages/db-postgres/src/find/buildFindManyArgs.ts +++ b/packages/drizzle/src/find/buildFindManyArgs.ts @@ -1,12 +1,12 @@ import type { DBQueryConfig } from 'drizzle-orm' import type { Field } from 'payload' -import type { PostgresAdapter } from '../types.js' +import type { DrizzleAdapter } from '../types.js' import { traverseFields } from './traverseFields.js' type BuildFindQueryArgs = { - adapter: PostgresAdapter + adapter: DrizzleAdapter depth: number fields: Field[] tableName: string diff --git a/packages/db-postgres/src/find/chainMethods.ts b/packages/drizzle/src/find/chainMethods.ts similarity index 100% rename from packages/db-postgres/src/find/chainMethods.ts rename to packages/drizzle/src/find/chainMethods.ts diff --git a/packages/db-postgres/src/find/findMany.ts b/packages/drizzle/src/find/findMany.ts similarity index 74% rename from packages/db-postgres/src/find/findMany.ts rename to packages/drizzle/src/find/findMany.ts index b47567d97f..5d5fad0a29 100644 --- a/packages/db-postgres/src/find/findMany.ts +++ b/packages/drizzle/src/find/findMany.ts @@ -1,21 +1,20 @@ import type { Field, FindArgs, PayloadRequest, TypeWithID } from 'payload' -import { inArray, sql } from 'drizzle-orm' +import { inArray } from 'drizzle-orm' -import type { PostgresAdapter } from '../types.js' +import type { DrizzleAdapter } from '../types.js' import type { ChainedMethods } from './chainMethods.js' import buildQuery from '../queries/buildQuery.js' import { selectDistinct } from '../queries/selectDistinct.js' import { transform } from '../transform/read/index.js' import { buildFindManyArgs } from './buildFindManyArgs.js' -import { chainMethods } from './chainMethods.js' -type Args = Omit & { - adapter: PostgresAdapter +type Args = { + adapter: DrizzleAdapter fields: Field[] tableName: string -} +} & Omit export const findMany = async function find({ adapter, @@ -31,14 +30,17 @@ export const findMany = async function find({ where: whereArg, }: Args) { const db = adapter.sessions[await req.transactionID]?.db || adapter.drizzle - const table = adapter.tables[tableName] - - const limit = limitArg ?? 10 + let limit = limitArg let totalDocs: number let totalPages: number let hasPrevPage: boolean let hasNextPage: boolean let pagingCounter: number + const offset = skip || (page - 1) * limit + + if (limit === 0) { + limit = undefined + } const { joins, orderBy, selectFields, where } = await buildQuery({ adapter, @@ -68,8 +70,8 @@ export const findMany = async function find({ tableName, }) - selectDistinctMethods.push({ args: [skip || (page - 1) * limit], method: 'offset' }) - selectDistinctMethods.push({ args: [limit === 0 ? undefined : limit], method: 'limit' }) + selectDistinctMethods.push({ args: [offset], method: 'offset' }) + selectDistinctMethods.push({ args: [limit], method: 'limit' }) const selectDistinctResult = await selectDistinct({ adapter, @@ -104,40 +106,25 @@ export const findMany = async function find({ findManyArgs.where = inArray(adapter.tables[tableName].id, orderedIDs) } } else { - findManyArgs.limit = limitArg === 0 ? undefined : limitArg - - const offset = skip || (page - 1) * limitArg - - if (!Number.isNaN(offset)) findManyArgs.offset = offset + findManyArgs.limit = limit + findManyArgs.offset = offset + findManyArgs.orderBy = orderBy.order(orderBy.column) if (where) { findManyArgs.where = where } - findManyArgs.orderBy = orderBy.order(orderBy.column) } const findPromise = db.query[tableName].findMany(findManyArgs) if (pagination !== false && (orderedIDs ? orderedIDs?.length <= limit : true)) { - const selectCountMethods: ChainedMethods = [] - joins.forEach(({ condition, table }) => { - selectCountMethods.push({ - args: [table, condition], - method: 'leftJoin', - }) + totalDocs = await adapter.countDistinct({ + db, + joins, + tableName, + where, }) - const countResult = await chainMethods({ - methods: selectCountMethods, - query: db - .select({ - count: sql`count - (DISTINCT ${adapter.tables[tableName].id})`, - }) - .from(table) - .where(where), - }) - totalDocs = Number(countResult[0].count) totalPages = typeof limit === 'number' && limit !== 0 ? Math.ceil(totalDocs / limit) : 1 hasPrevPage = page > 1 hasNextPage = totalPages > page @@ -171,7 +158,7 @@ export const findMany = async function find({ docs, hasNextPage, hasPrevPage, - limit, + limit: limitArg, nextPage: hasNextPage ? page + 1 : null, page, pagingCounter, diff --git a/packages/db-postgres/src/find/traverseFields.ts b/packages/drizzle/src/find/traverseFields.ts similarity index 98% rename from packages/db-postgres/src/find/traverseFields.ts rename to packages/drizzle/src/find/traverseFields.ts index 3836dccaf5..c8d1534022 100644 --- a/packages/db-postgres/src/find/traverseFields.ts +++ b/packages/drizzle/src/find/traverseFields.ts @@ -4,12 +4,12 @@ import type { Field } from 'payload' import { fieldAffectsData, tabHasName } from 'payload/shared' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from '../types.js' +import type { DrizzleAdapter } from '../types.js' import type { Result } from './buildFindManyArgs.js' type TraverseFieldArgs = { _locales: Result - adapter: PostgresAdapter + adapter: DrizzleAdapter currentArgs: Result currentTableName: string depth?: number diff --git a/packages/db-postgres/src/findGlobal.ts b/packages/drizzle/src/findGlobal.ts similarity index 89% rename from packages/db-postgres/src/findGlobal.ts rename to packages/drizzle/src/findGlobal.ts index 1ed00bd789..c624a34b2b 100644 --- a/packages/db-postgres/src/findGlobal.ts +++ b/packages/drizzle/src/findGlobal.ts @@ -2,12 +2,12 @@ import type { FindGlobal } from 'payload' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { findMany } from './find/findMany.js' export const findGlobal: FindGlobal = async function findGlobal( - this: PostgresAdapter, + this: DrizzleAdapter, { slug, locale, req, where }, ) { const globalConfig = this.payload.globals.config.find((config) => config.slug === slug) diff --git a/packages/db-postgres/src/findGlobalVersions.ts b/packages/drizzle/src/findGlobalVersions.ts similarity index 92% rename from packages/db-postgres/src/findGlobalVersions.ts rename to packages/drizzle/src/findGlobalVersions.ts index 0c174fb244..1d1d22f8aa 100644 --- a/packages/db-postgres/src/findGlobalVersions.ts +++ b/packages/drizzle/src/findGlobalVersions.ts @@ -3,12 +3,12 @@ import type { FindGlobalVersions, PayloadRequest, SanitizedGlobalConfig } from ' import { buildVersionGlobalFields } from 'payload' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { findMany } from './find/findMany.js' export const findGlobalVersions: FindGlobalVersions = async function findGlobalVersions( - this: PostgresAdapter, + this: DrizzleAdapter, { global, limit, diff --git a/packages/drizzle/src/findMigrationDir.ts b/packages/drizzle/src/findMigrationDir.ts new file mode 100644 index 0000000000..e0f90b0518 --- /dev/null +++ b/packages/drizzle/src/findMigrationDir.ts @@ -0,0 +1,41 @@ +import fs from 'fs' +import path from 'path' + +/** + * Attempt to find migrations directory. + * + * Checks for the following directories in order: + * - `migrationDir` argument from Payload config + * - `src/migrations` + * - `dist/migrations` + * - `migrations` + * + * Defaults to `src/migrations` + * + * @param migrationDir + * @returns + */ +export function findMigrationDir(migrationDir?: string): string { + const cwd = process.cwd() + const srcDir = path.resolve(cwd, 'src/migrations') + const distDir = path.resolve(cwd, 'dist/migrations') + const relativeMigrations = path.resolve(cwd, 'migrations') + + // Use arg if provided + if (migrationDir) return migrationDir + + // Check other common locations + if (fs.existsSync(srcDir)) { + return srcDir + } + + if (fs.existsSync(distDir)) { + return distDir + } + + if (fs.existsSync(relativeMigrations)) { + return relativeMigrations + } + + return srcDir +} diff --git a/packages/db-postgres/src/findOne.ts b/packages/drizzle/src/findOne.ts similarity index 90% rename from packages/db-postgres/src/findOne.ts rename to packages/drizzle/src/findOne.ts index e491d8c7c6..4a6c165dcd 100644 --- a/packages/db-postgres/src/findOne.ts +++ b/packages/drizzle/src/findOne.ts @@ -2,12 +2,12 @@ import type { FindOneArgs, PayloadRequest, SanitizedCollectionConfig, TypeWithID import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { findMany } from './find/findMany.js' export async function findOne( - this: PostgresAdapter, + this: DrizzleAdapter, { collection, locale, req = {} as PayloadRequest, where }: FindOneArgs, ): Promise { const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config diff --git a/packages/db-postgres/src/findVersions.ts b/packages/drizzle/src/findVersions.ts similarity index 92% rename from packages/db-postgres/src/findVersions.ts rename to packages/drizzle/src/findVersions.ts index ff5a50ae11..8d8dcbafee 100644 --- a/packages/db-postgres/src/findVersions.ts +++ b/packages/drizzle/src/findVersions.ts @@ -3,12 +3,12 @@ import type { FindVersions, PayloadRequest, SanitizedCollectionConfig } from 'pa import { buildVersionCollectionFields } from 'payload' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { findMany } from './find/findMany.js' export const findVersions: FindVersions = async function findVersions( - this: PostgresAdapter, + this: DrizzleAdapter, { collection, limit, diff --git a/packages/drizzle/src/index.ts b/packages/drizzle/src/index.ts new file mode 100644 index 0000000000..a94fe0b5bb --- /dev/null +++ b/packages/drizzle/src/index.ts @@ -0,0 +1,37 @@ +export { count } from './count.js' +export { create } from './create.js' +export { createGlobal } from './createGlobal.js' +export { createGlobalVersion } from './createGlobalVersion.js' +export { createTableName } from './createTableName.js' +export { createVersion } from './createVersion.js' +export { deleteMany } from './deleteMany.js' +export { deleteOne } from './deleteOne.js' +export { deleteVersions } from './deleteVersions.js' +export { destroy } from './destroy.js' +export { find } from './find.js' +export { chainMethods } from './find/chainMethods.js' +export { findGlobal } from './findGlobal.js' +export { findGlobalVersions } from './findGlobalVersions.js' +export { findMigrationDir } from './findMigrationDir.js' +export { findOne } from './findOne.js' +export { findVersions } from './findVersions.js' +export { migrate } from './migrate.js' +export { migrateDown } from './migrateDown.js' +export { migrateFresh } from './migrateFresh.js' +export { migrateRefresh } from './migrateRefresh.js' +export { migrateReset } from './migrateReset.js' +export { migrateStatus } from './migrateStatus.js' +export { operatorMap } from './queries/operatorMap.js' +export type { Operators } from './queries/operatorMap.js' +export { queryDrafts } from './queryDrafts.js' +export { beginTransaction } from './transactions/beginTransaction.js' +export { commitTransaction } from './transactions/commitTransaction.js' +export { rollbackTransaction } from './transactions/rollbackTransaction.js' +export { updateOne } from './update.js' +export { updateGlobal } from './updateGlobal.js' +export { updateGlobalVersion } from './updateGlobalVersion.js' +export { updateVersion } from './updateVersion.js' +export { upsertRow } from './upsertRow/index.js' +export { hasLocalesTable } from './utilities/hasLocalesTable.js' +export { pushDevSchema } from './utilities/pushDevSchema.js' +export { validateExistingBlockIsIdentical } from './utilities/validateExistingBlockIsIdentical.js' diff --git a/packages/db-postgres/src/migrate.ts b/packages/drizzle/src/migrate.ts similarity index 74% rename from packages/db-postgres/src/migrate.ts rename to packages/drizzle/src/migrate.ts index 7d9e99989f..e8ab834add 100644 --- a/packages/db-postgres/src/migrate.ts +++ b/packages/drizzle/src/migrate.ts @@ -1,21 +1,15 @@ -/* eslint-disable no-restricted-syntax, no-await-in-loop */ -import type { Payload } from 'payload' -import type { PayloadRequest } from 'payload' -import type { Migration } from 'payload' + +import type { Payload, PayloadRequest } from 'payload' -import { createRequire } from 'module' import { commitTransaction, initTransaction, killTransaction, readMigrationFiles } from 'payload' import prompts from 'prompts' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter, Migration } from './types.js' -import { createMigrationTable } from './utilities/createMigrationTable.js' import { migrationTableExists } from './utilities/migrationTableExists.js' import { parseError } from './utilities/parseError.js' -const require = createRequire(import.meta.url) - -export async function migrate(this: PostgresAdapter): Promise { +export async function migrate(this: DrizzleAdapter): Promise { const { payload } = this const migrationFiles = await readMigrationFiles({ payload }) @@ -27,7 +21,7 @@ export async function migrate(this: PostgresAdapter): Promise { let latestBatch = 0 let migrationsInDB = [] - const hasMigrationTable = await migrationTableExists(this.drizzle) + const hasMigrationTable = await migrationTableExists(this) if (hasMigrationTable) { ;({ docs: migrationsInDB } = await payload.find({ @@ -38,8 +32,6 @@ export async function migrate(this: PostgresAdapter): Promise { if (Number(migrationsInDB?.[0]?.batch) > 0) { latestBatch = Number(migrationsInDB[0]?.batch) } - } else { - await createMigrationTable(this) } if (migrationsInDB.find((m) => m.batch === -1)) { @@ -72,7 +64,7 @@ export async function migrate(this: PostgresAdapter): Promise { // If already ran, skip if (alreadyRan) { - continue // eslint-disable-line no-continue + continue } await runMigrationFile(payload, migration, newBatch) @@ -80,19 +72,20 @@ export async function migrate(this: PostgresAdapter): Promise { } async function runMigrationFile(payload: Payload, migration: Migration, batch: number) { - const { generateDrizzleJson } = require('drizzle-kit/payload') - + const db = payload.db as DrizzleAdapter + const { generateDrizzleJson } = db.requireDrizzleKit() const start = Date.now() const req = { payload } as PayloadRequest + const adapter = payload.db as DrizzleAdapter payload.logger.info({ msg: `Migrating: ${migration.name}` }) - const pgAdapter = payload.db - const drizzleJSON = generateDrizzleJson(pgAdapter.schema) + const drizzleJSON = await generateDrizzleJson({ schema: adapter.schema }) try { await initTransaction(req) - await migration.up({ payload, req }) + const db = adapter?.sessions[await req.transactionID]?.db || adapter.drizzle + await migration.up({ db, payload, req }) payload.logger.info({ msg: `Migrated: ${migration.name} (${Date.now() - start}ms)` }) await payload.create({ collection: 'payload-migrations', diff --git a/packages/db-postgres/src/migrateDown.ts b/packages/drizzle/src/migrateDown.ts similarity index 90% rename from packages/db-postgres/src/migrateDown.ts rename to packages/drizzle/src/migrateDown.ts index 5ae47debfb..1959a1efa7 100644 --- a/packages/db-postgres/src/migrateDown.ts +++ b/packages/drizzle/src/migrateDown.ts @@ -9,12 +9,12 @@ import { readMigrationFiles, } from 'payload' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { migrationTableExists } from './utilities/migrationTableExists.js' import { parseError } from './utilities/parseError.js' -export async function migrateDown(this: PostgresAdapter): Promise { +export async function migrateDown(this: DrizzleAdapter): Promise { const { payload } = this const migrationFiles = await readMigrationFiles({ payload }) @@ -50,7 +50,7 @@ export async function migrateDown(this: PostgresAdapter): Promise { msg: `Migrated down: ${migrationFile.name} (${Date.now() - start}ms)`, }) - const tableExists = await migrationTableExists(this.drizzle) + const tableExists = await migrationTableExists(this) if (tableExists) { await payload.delete({ id: migration.id, diff --git a/packages/db-postgres/src/migrateFresh.ts b/packages/drizzle/src/migrateFresh.ts similarity index 82% rename from packages/db-postgres/src/migrateFresh.ts rename to packages/drizzle/src/migrateFresh.ts index 4b7fb30c76..df9014611e 100644 --- a/packages/db-postgres/src/migrateFresh.ts +++ b/packages/drizzle/src/migrateFresh.ts @@ -1,10 +1,9 @@ import type { PayloadRequest } from 'payload' -import { sql } from 'drizzle-orm' import { commitTransaction, initTransaction, killTransaction, readMigrationFiles } from 'payload' import prompts from 'prompts' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter, Migration } from './types.js' import { parseError } from './utilities/parseError.js' @@ -12,7 +11,7 @@ import { parseError } from './utilities/parseError.js' * Drop the current database and run all migrate up functions */ export async function migrateFresh( - this: PostgresAdapter, + this: DrizzleAdapter, { forceAcceptWarning = false }, ): Promise { const { payload } = this @@ -41,12 +40,9 @@ export async function migrateFresh( msg: `Dropping database.`, }) - await this.drizzle.execute( - sql.raw(`drop schema ${this.schemaName || 'public'} cascade; - create schema ${this.schemaName || 'public'};`), - ) + await this.dropDatabase({ adapter: this }) - const migrationFiles = await readMigrationFiles({ payload }) + const migrationFiles = (await readMigrationFiles({ payload })) as Migration[] payload.logger.debug({ msg: `Found ${migrationFiles.length} migration files.`, }) @@ -58,7 +54,9 @@ export async function migrateFresh( try { const start = Date.now() await initTransaction(req) - await migration.up({ payload, req }) + const adapter = payload.db as DrizzleAdapter + const db = adapter?.sessions[await req.transactionID]?.db || adapter.drizzle + await migration.up({ db, payload, req }) await payload.create({ collection: 'payload-migrations', data: { diff --git a/packages/db-postgres/src/migrateRefresh.ts b/packages/drizzle/src/migrateRefresh.ts similarity index 94% rename from packages/db-postgres/src/migrateRefresh.ts rename to packages/drizzle/src/migrateRefresh.ts index cf4270a2e7..3b1a20c21d 100644 --- a/packages/db-postgres/src/migrateRefresh.ts +++ b/packages/drizzle/src/migrateRefresh.ts @@ -9,7 +9,7 @@ import { readMigrationFiles, } from 'payload' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { migrationTableExists } from './utilities/migrationTableExists.js' import { parseError } from './utilities/parseError.js' @@ -17,7 +17,7 @@ import { parseError } from './utilities/parseError.js' /** * Run all migration down functions before running up */ -export async function migrateRefresh(this: PostgresAdapter) { +export async function migrateRefresh(this: DrizzleAdapter) { const { payload } = this const migrationFiles = await readMigrationFiles({ payload }) @@ -54,7 +54,7 @@ export async function migrateRefresh(this: PostgresAdapter) { msg: `Migrated down: ${migration.name} (${Date.now() - start}ms)`, }) - const tableExists = await migrationTableExists(this.drizzle) + const tableExists = await migrationTableExists(this) if (tableExists) { await payload.delete({ collection: 'payload-migrations', diff --git a/packages/db-postgres/src/migrateReset.ts b/packages/drizzle/src/migrateReset.ts similarity index 89% rename from packages/db-postgres/src/migrateReset.ts rename to packages/drizzle/src/migrateReset.ts index 932835ce6a..76eeea4bf2 100644 --- a/packages/db-postgres/src/migrateReset.ts +++ b/packages/drizzle/src/migrateReset.ts @@ -9,14 +9,14 @@ import { readMigrationFiles, } from 'payload' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { migrationTableExists } from './utilities/migrationTableExists.js' /** * Run all migrate down functions */ -export async function migrateReset(this: PostgresAdapter): Promise { +export async function migrateReset(this: DrizzleAdapter): Promise { const { payload } = this const migrationFiles = await readMigrationFiles({ payload }) @@ -45,7 +45,7 @@ export async function migrateReset(this: PostgresAdapter): Promise { msg: `Migrated down: ${migrationFile.name} (${Date.now() - start}ms)`, }) - const tableExists = await migrationTableExists(this.drizzle) + const tableExists = await migrationTableExists(this) if (tableExists) { await payload.delete({ id: migration.id, @@ -71,7 +71,7 @@ export async function migrateReset(this: PostgresAdapter): Promise { // Delete dev migration - const tableExists = await migrationTableExists(this.drizzle) + const tableExists = await migrationTableExists(this) if (tableExists) { try { await payload.delete({ diff --git a/packages/db-postgres/src/migrateStatus.ts b/packages/drizzle/src/migrateStatus.ts similarity index 85% rename from packages/db-postgres/src/migrateStatus.ts rename to packages/drizzle/src/migrateStatus.ts index a5dd7b787a..cb4f799556 100644 --- a/packages/db-postgres/src/migrateStatus.ts +++ b/packages/drizzle/src/migrateStatus.ts @@ -1,11 +1,11 @@ import { Table } from 'console-table-printer' import { getMigrations, readMigrationFiles } from 'payload' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { migrationTableExists } from './utilities/migrationTableExists.js' -export async function migrateStatus(this: PostgresAdapter): Promise { +export async function migrateStatus(this: DrizzleAdapter): Promise { const { payload } = this const migrationFiles = await readMigrationFiles({ payload }) @@ -14,7 +14,7 @@ export async function migrateStatus(this: PostgresAdapter): Promise { }) let existingMigrations = [] - const hasMigrationTable = await migrationTableExists(this.drizzle) + const hasMigrationTable = await migrationTableExists(this) if (hasMigrationTable) { ;({ existingMigrations } = await getMigrations({ payload })) diff --git a/packages/db-postgres/src/queries/buildAndOrConditions.ts b/packages/drizzle/src/queries/buildAndOrConditions.ts similarity index 93% rename from packages/db-postgres/src/queries/buildAndOrConditions.ts rename to packages/drizzle/src/queries/buildAndOrConditions.ts index 54d83b061b..35aa7ae1dc 100644 --- a/packages/db-postgres/src/queries/buildAndOrConditions.ts +++ b/packages/drizzle/src/queries/buildAndOrConditions.ts @@ -1,7 +1,7 @@ import type { SQL } from 'drizzle-orm' import type { Field, Where } from 'payload' -import type { GenericColumn, PostgresAdapter } from '../types.js' +import type { DrizzleAdapter, GenericColumn } from '../types.js' import type { BuildQueryJoinAliases } from './buildQuery.js' import { parseParams } from './parseParams.js' @@ -15,7 +15,7 @@ export async function buildAndOrConditions({ tableName, where, }: { - adapter: PostgresAdapter + adapter: DrizzleAdapter collectionSlug?: string fields: Field[] globalSlug?: string diff --git a/packages/db-postgres/src/queries/buildQuery.ts b/packages/drizzle/src/queries/buildQuery.ts similarity index 93% rename from packages/db-postgres/src/queries/buildQuery.ts rename to packages/drizzle/src/queries/buildQuery.ts index bf9395d21e..7d565b86aa 100644 --- a/packages/db-postgres/src/queries/buildQuery.ts +++ b/packages/drizzle/src/queries/buildQuery.ts @@ -4,20 +4,18 @@ import type { Field, Where } from 'payload' import { asc, desc } from 'drizzle-orm' -import type { GenericColumn, GenericTable, PostgresAdapter } from '../types.js' +import type { DrizzleAdapter, GenericColumn, GenericTable } from '../types.js' import { getTableColumnFromPath } from './getTableColumnFromPath.js' import { parseParams } from './parseParams.js' -export type BuildQueryJoins = Record - export type BuildQueryJoinAliases = { condition: SQL table: GenericTable | PgTableWithColumns }[] type BuildQueryArgs = { - adapter: PostgresAdapter + adapter: DrizzleAdapter fields: Field[] locale?: string sort?: string diff --git a/packages/drizzle/src/queries/getTableAlias.ts b/packages/drizzle/src/queries/getTableAlias.ts new file mode 100644 index 0000000000..36fc04184e --- /dev/null +++ b/packages/drizzle/src/queries/getTableAlias.ts @@ -0,0 +1,33 @@ +import type { PgTableWithColumns } from 'drizzle-orm/pg-core' +import type { SQLiteTableWithColumns } from 'drizzle-orm/sqlite-core' + +import { alias } from 'drizzle-orm/pg-core' +import { alias as aliasSQLite } from 'drizzle-orm/sqlite-core/alias' +import toSnakeCase from 'to-snake-case' +import { v4 as uuid } from 'uuid' + +import type { DrizzleAdapter } from '../types.js' + +type Table = PgTableWithColumns | SQLiteTableWithColumns +export const getTableAlias = ({ + adapter, + tableName, +}: { + adapter: DrizzleAdapter + tableName: string +}): { + newAliasTable: Table + newAliasTableName: string +} => { + const newAliasTableName = toSnakeCase(uuid()) + let newAliasTable + + if (adapter.name === 'postgres') { + newAliasTable = alias(adapter.tables[tableName], newAliasTableName) + } + if (adapter.name === 'sqlite') { + newAliasTable = aliasSQLite(adapter.tables[tableName], newAliasTableName) + } + + return { newAliasTable, newAliasTableName } +} diff --git a/packages/db-postgres/src/queries/getTableColumnFromPath.ts b/packages/drizzle/src/queries/getTableColumnFromPath.ts similarity index 93% rename from packages/db-postgres/src/queries/getTableColumnFromPath.ts rename to packages/drizzle/src/queries/getTableColumnFromPath.ts index b687a98e73..822173d7e9 100644 --- a/packages/db-postgres/src/queries/getTableColumnFromPath.ts +++ b/packages/drizzle/src/queries/getTableColumnFromPath.ts @@ -1,21 +1,21 @@ -/* eslint-disable no-param-reassign */ import type { SQL } from 'drizzle-orm' import type { PgTableWithColumns } from 'drizzle-orm/pg-core' +import type { SQLiteTableWithColumns } from 'drizzle-orm/sqlite-core' import type { Field, FieldAffectingData, NumberField, TabAsField, TextField } from 'payload' import { and, eq, like, sql } from 'drizzle-orm' -import { alias } from 'drizzle-orm/pg-core' import { APIError, flattenTopLevelFields } from 'payload' import { fieldAffectsData, tabHasName } from 'payload/shared' import toSnakeCase from 'to-snake-case' -import { v4 as uuid } from 'uuid' -import type { GenericColumn, GenericTable, PostgresAdapter } from '../types.js' +import type { DrizzleAdapter, GenericColumn } from '../types.js' import type { BuildQueryJoinAliases } from './buildQuery.js' +import { getTableAlias } from './getTableAlias.js' + type Constraint = { columnName: string - table: GenericTable | PgTableWithColumns + table: PgTableWithColumns | SQLiteTableWithColumns value: unknown } @@ -26,12 +26,12 @@ type TableColumn = { getNotNullColumnByValue?: (val: unknown) => string pathSegments?: string[] rawColumn?: SQL - table: GenericTable | PgTableWithColumns + table: PgTableWithColumns | SQLiteTableWithColumns } type Args = { - adapter: PostgresAdapter - aliasTable?: GenericTable | PgTableWithColumns + adapter: DrizzleAdapter + aliasTable?: PgTableWithColumns | SQLiteTableWithColumns collectionPath: string columnPrefix?: string constraintPath?: string @@ -348,8 +348,8 @@ export const getTableColumnFromPath = ({ newTableName = adapter.tableNameMap.get( `${tableName}_blocks_${toSnakeCase(block.slug)}`, ) - const newAliasTableName = toSnakeCase(uuid()) - const newAliasTable = alias(adapter.tables[newTableName], newAliasTableName) + + const { newAliasTable } = getTableAlias({ adapter, tableName: newTableName }) joins.push({ condition: eq(adapter.tables[tableName].id, newAliasTable._parentID), @@ -448,11 +448,10 @@ export const getTableColumnFromPath = ({ if (Array.isArray(field.relationTo) || (field.type === 'relationship' && field.hasMany)) { let relationshipFields const relationTableName = `${rootTableName}${adapter.relationshipsSuffix}` - const aliasRelationshipTableName = uuid() - const aliasRelationshipTable = alias( - adapter.tables[relationTableName], - aliasRelationshipTableName, - ) + const { + newAliasTable: aliasRelationshipTable, + newAliasTableName: aliasRelationshipTableName, + } = getTableAlias({ adapter, tableName: relationTableName }) // Join in the relationships table if (locale && field.localized && adapter.payload.config.localization) { @@ -493,8 +492,7 @@ export const getTableColumnFromPath = ({ // parent to relationship join table relationshipFields = relationshipConfig.fields - - newAliasTable = alias(adapter.tables[newTableName], toSnakeCase(uuid())) + ;({ newAliasTable } = getTableAlias({ adapter, tableName: newTableName })) joins.push({ condition: eq(newAliasTable.id, aliasRelationshipTable[`${field.relationTo}ID`]), @@ -517,10 +515,18 @@ export const getTableColumnFromPath = ({ return `"${aliasRelationshipTableName}"."${relationTableName}_id"` }) + + let column: string + if (tableColumnsNames.length === 1) { + column = tableColumnsNames[0] + } else { + column = `COALESCE(${tableColumnsNames.join(', ')})` + } + return { constraints, field, - rawColumn: sql.raw(`COALESCE(${tableColumnsNames.join(', ')})`), + rawColumn: sql.raw(`${column}`), table: aliasRelationshipTable, } } else if (newCollectionPath === 'relationTo') { @@ -565,15 +571,14 @@ export const getTableColumnFromPath = ({ const newTableName = adapter.tableNameMap.get( toSnakeCase(adapter.payload.collections[field.relationTo].config.slug), ) - const aliasTableName = uuid() - const newAliasTable = alias(adapter.tables[newTableName], aliasTableName) + const { newAliasTable } = getTableAlias({ adapter, tableName: newTableName }) if (field.localized && adapter.payload.config.localization) { - const aliasLocaleTableName = uuid() - const aliasLocaleTable = alias( - adapter.tables[`${rootTableName}${adapter.localesSuffix}`], - aliasLocaleTableName, - ) + const { newAliasTable: aliasLocaleTable } = getTableAlias({ + adapter, + tableName: `${rootTableName}${adapter.localesSuffix}`, + }) + joins.push({ condition: and( eq(aliasLocaleTable._parentID, adapter.tables[rootTableName].id), diff --git a/packages/db-postgres/src/queries/operatorMap.ts b/packages/drizzle/src/queries/operatorMap.ts similarity index 55% rename from packages/db-postgres/src/queries/operatorMap.ts rename to packages/drizzle/src/queries/operatorMap.ts index 75475bba40..6b0139106c 100644 --- a/packages/db-postgres/src/queries/operatorMap.ts +++ b/packages/drizzle/src/queries/operatorMap.ts @@ -1,4 +1,7 @@ import { + type Column, + type SQL, + type SQLWrapper, and, eq, gt, @@ -14,8 +17,25 @@ import { or, } from 'drizzle-orm' -export const operatorMap = { - // intersects: intersects, +type OperatorKeys = + | 'and' + | 'contains' + | 'equals' + | 'exists' + | 'greater_than' + | 'greater_than_equal' + | 'in' + | 'isNull' + | 'less_than' + | 'less_than_equal' + | 'like' + | 'not_equals' + | 'not_in' + | 'or' + +export type Operators = Record SQL> + +export const operatorMap: Operators = { and, contains: ilike, equals: eq, @@ -29,6 +49,7 @@ export const operatorMap = { like: ilike, not_equals: ne, // TODO: geojson queries + // intersects: intersects, // near: near, // within: within, // all: all, diff --git a/packages/db-postgres/src/queries/parseParams.ts b/packages/drizzle/src/queries/parseParams.ts similarity index 79% rename from packages/db-postgres/src/queries/parseParams.ts rename to packages/drizzle/src/queries/parseParams.ts index 6c2795f5a1..82d2f8bc73 100644 --- a/packages/db-postgres/src/queries/parseParams.ts +++ b/packages/drizzle/src/queries/parseParams.ts @@ -2,22 +2,19 @@ import type { SQL } from 'drizzle-orm' import type { Field, Operator, Where } from 'payload' -import { and, ilike, isNotNull, isNull, ne, notInArray, or, sql } from 'drizzle-orm' +import { and, isNotNull, isNull, ne, notInArray, or, sql } from 'drizzle-orm' import { QueryError } from 'payload' import { validOperators } from 'payload/shared' -import type { GenericColumn, PostgresAdapter } from '../types.js' +import type { DrizzleAdapter, GenericColumn } from '../types.js' import type { BuildQueryJoinAliases } from './buildQuery.js' import { buildAndOrConditions } from './buildAndOrConditions.js' -import { convertPathToJSONTraversal } from './createJSONQuery/convertPathToJSONTraversal.js' -import { createJSONQuery } from './createJSONQuery/index.js' import { getTableColumnFromPath } from './getTableColumnFromPath.js' -import { operatorMap } from './operatorMap.js' import { sanitizeQueryValue } from './sanitizeQueryValue.js' type Args = { - adapter: PostgresAdapter + adapter: DrizzleAdapter fields: Field[] joins: BuildQueryJoinAliases locale: string @@ -43,11 +40,11 @@ export async function parseParams({ for (const relationOrPath of Object.keys(where)) { if (relationOrPath) { const condition = where[relationOrPath] - let conditionOperator: 'and' | 'or' + let conditionOperator: typeof and | typeof or if (relationOrPath.toLowerCase() === 'and') { - conditionOperator = 'and' + conditionOperator = and } else if (relationOrPath.toLowerCase() === 'or') { - conditionOperator = 'or' + conditionOperator = or } if (Array.isArray(condition)) { const builtConditions = await buildAndOrConditions({ @@ -60,7 +57,7 @@ export async function parseParams({ where: condition, }) if (builtConditions.length > 0) { - result = operatorMap[conditionOperator](...builtConditions) + result = conditionOperator(...builtConditions) } } else { // It's a path - and there can be multiple comparisons on a single path. @@ -93,9 +90,9 @@ export async function parseParams({ queryConstraints.forEach(({ columnName: col, table: constraintTable, value }) => { if (typeof value === 'string' && value.indexOf('%') > -1) { - constraints.push(operatorMap.like(constraintTable[col], value)) + constraints.push(adapter.operators.like(constraintTable[col], value)) } else { - constraints.push(operatorMap.equals(constraintTable[col], value)) + constraints.push(adapter.operators.equals(constraintTable[col], value)) } }) @@ -108,9 +105,17 @@ export async function parseParams({ segments.unshift(table[columnName].name) if (field.type === 'richText') { - const jsonQuery = createJSONQuery({ + // use the table name from the nearest join to handle blocks, arrays, etc. or use the tableName arg + const jsonTable = + joins.length === 0 + ? tableName + : joins[joins.length - 1].table[ + Object.getOwnPropertySymbols(joins[joins.length - 1].table)[0] + ] + const jsonQuery = adapter.createJSONQuery({ operator, pathSegments: segments, + table: jsonTable, treatAsArray: ['children'], treatRootAsArray: true, value: val, @@ -120,16 +125,21 @@ export async function parseParams({ break } - const jsonQuery = convertPathToJSONTraversal(pathSegments) + const jsonQuery = adapter.convertPathToJSONTraversal(pathSegments) const operatorKeys = { - contains: { operator: 'ilike', wildcard: '%' }, + contains: { operator: 'like', wildcard: '%' }, equals: { operator: '=', wildcard: '' }, exists: { operator: val === true ? 'is not null' : 'is null' }, like: { operator: 'like', wildcard: '%' }, not_equals: { operator: '<>', wildcard: '' }, } - let formattedValue = `'${operatorKeys[operator].wildcard}${val}${operatorKeys[operator].wildcard}'` + let formattedValue = val + if (adapter.name === 'sqlite' && operator === 'equals' && !isNaN(val)) { + formattedValue = val + } else { + formattedValue = `'${operatorKeys[operator].wildcard}${val}${operatorKeys[operator].wildcard}'` + } if (operator === 'exists') { formattedValue = '' } @@ -162,7 +172,11 @@ export async function parseParams({ if (operator === 'like') { constraints.push( - and(...val.split(' ').map((word) => ilike(table[columnName], `%${word}%`))), + and( + ...val + .split(' ') + .map((word) => adapter.operators.like(table[columnName], `%${word}%`)), + ), ) break } @@ -218,7 +232,7 @@ export async function parseParams({ } constraints.push( - operatorMap[queryOperator](rawColumn || table[columnName], queryValue), + adapter.operators[queryOperator](rawColumn || table[columnName], queryValue), ) } } diff --git a/packages/db-postgres/src/queries/sanitizeQueryValue.ts b/packages/drizzle/src/queries/sanitizeQueryValue.ts similarity index 61% rename from packages/db-postgres/src/queries/sanitizeQueryValue.ts rename to packages/drizzle/src/queries/sanitizeQueryValue.ts index 168a28da25..1758d028b8 100644 --- a/packages/db-postgres/src/queries/sanitizeQueryValue.ts +++ b/packages/drizzle/src/queries/sanitizeQueryValue.ts @@ -1,10 +1,10 @@ import { APIError, type Field, type TabAsField, createArrayFromCommaDelineated } from 'payload' import { fieldAffectsData } from 'payload/shared' -import type { PostgresAdapter } from '../types.js' +import type { DrizzleAdapter } from '../types.js' type SanitizeQueryValueArgs = { - adapter: PostgresAdapter + adapter: DrizzleAdapter field: Field | TabAsField operator: string relationOrPath: string @@ -67,20 +67,54 @@ export const sanitizeQueryValue = ({ if (field.type === 'date' && operator !== 'exists') { if (typeof val === 'string') { - formattedValue = new Date(val) + formattedValue = new Date(val).toISOString() if (Number.isNaN(Date.parse(formattedValue))) { return { operator, value: undefined } } - } - - if (typeof val === 'number') { - formattedValue = new Date(val) - } + } else if (typeof val === 'number') formattedValue = new Date(val).toISOString() } - if (['relationship', 'upload'].includes(field.type)) { + if (field.type === 'relationship' || field.type === 'upload') { if (val === 'null') { formattedValue = null + } else if (!(formattedValue === null || typeof formattedValue === 'boolean')) { + // convert the value to the idType of the relationship + let idType: 'number' | 'text' + if (typeof field.relationTo === 'string') { + const collection = adapter.payload.collections[field.relationTo] + const mixedType: 'number' | 'serial' | 'text' | 'uuid' = + collection.customIDType || adapter.idType + const typeMap: Record = { + number: 'number', + serial: 'number', + text: 'text', + uuid: 'text', + } + idType = typeMap[mixedType] + } else { + // LIMITATION: Only cast to the first relationTo id type, + // otherwise we need to make the db cast which is inefficient + const collection = adapter.payload.collections[field.relationTo[0]] + idType = collection.customIDType || adapter.idType === 'uuid' ? 'text' : 'number' + } + if (Array.isArray(formattedValue)) { + formattedValue = formattedValue.map((value) => { + if (idType === 'number') { + return Number(value) + } + if (idType === 'text') { + return String(value) + } + return value + }) + } else { + if (idType === 'number') { + formattedValue = Number(val) + } + if (idType === 'text') { + formattedValue = String(val) + } + } } } diff --git a/packages/db-postgres/src/queries/selectDistinct.ts b/packages/drizzle/src/queries/selectDistinct.ts similarity index 61% rename from packages/db-postgres/src/queries/selectDistinct.ts rename to packages/drizzle/src/queries/selectDistinct.ts index 28e9c664b7..dda8b0823e 100644 --- a/packages/db-postgres/src/queries/selectDistinct.ts +++ b/packages/drizzle/src/queries/selectDistinct.ts @@ -1,16 +1,23 @@ import type { QueryPromise, SQL } from 'drizzle-orm' +import type { SQLiteColumn } from 'drizzle-orm/sqlite-core' import type { ChainedMethods } from '../find/chainMethods.js' -import type { DrizzleDB, PostgresAdapter } from '../types.js' +import type { + DrizzleAdapter, + DrizzleTransaction, + GenericPgColumn, + TransactionPg, + TransactionSQLite, +} from '../types.js' import type { BuildQueryJoinAliases } from './buildQuery.js' import { chainMethods } from '../find/chainMethods.js' import { type GenericColumn } from '../types.js' type Args = { - adapter: PostgresAdapter + adapter: DrizzleAdapter chainedMethods?: ChainedMethods - db: DrizzleDB + db: DrizzleAdapter['drizzle'] | DrizzleTransaction joins: BuildQueryJoinAliases selectFields: Record tableName: string @@ -41,9 +48,23 @@ export const selectDistinct = ({ }) }) + let query + const table = adapter.tables[tableName] + + if (adapter.name === 'postgres') { + query = (db as TransactionPg) + .selectDistinct(selectFields as Record) + .from(table) + } + if (adapter.name === 'sqlite') { + query = (db as TransactionSQLite) + .selectDistinct(selectFields as Record) + .from(table) + } + return chainMethods({ methods: chainedMethods, - query: db.selectDistinct(selectFields).from(adapter.tables[tableName]), + query, }) } } diff --git a/packages/db-postgres/src/queryDrafts.ts b/packages/drizzle/src/queryDrafts.ts similarity index 94% rename from packages/db-postgres/src/queryDrafts.ts rename to packages/drizzle/src/queryDrafts.ts index de555b6ee8..987a4215c8 100644 --- a/packages/db-postgres/src/queryDrafts.ts +++ b/packages/drizzle/src/queryDrafts.ts @@ -3,12 +3,12 @@ import type { PayloadRequest, QueryDrafts, SanitizedCollectionConfig } from 'pay import { buildVersionCollectionFields, combineQueries } from 'payload' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { findMany } from './find/findMany.js' export const queryDrafts: QueryDrafts = async function queryDrafts( - this: PostgresAdapter, + this: DrizzleAdapter, { collection, limit, locale, page = 1, pagination, req = {} as PayloadRequest, sort, where }, ) { const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config diff --git a/packages/db-postgres/src/transactions/beginTransaction.ts b/packages/drizzle/src/transactions/beginTransaction.ts similarity index 90% rename from packages/db-postgres/src/transactions/beginTransaction.ts rename to packages/drizzle/src/transactions/beginTransaction.ts index 0d59329261..2bcbcc71af 100644 --- a/packages/db-postgres/src/transactions/beginTransaction.ts +++ b/packages/drizzle/src/transactions/beginTransaction.ts @@ -2,10 +2,10 @@ import type { BeginTransaction } from 'payload' import { v4 as uuid } from 'uuid' -import type { DrizzleTransaction, PostgresAdapter } from '../types.js' +import type { DrizzleAdapter, DrizzleTransaction } from '../types.js' export const beginTransaction: BeginTransaction = async function beginTransaction( - this: PostgresAdapter, + this: DrizzleAdapter, ) { let id try { @@ -27,8 +27,6 @@ export const beginTransaction: BeginTransaction = async function beginTransactio // over many files and we don't want to pass the `tx` around like that, // so instead, we "lift" up the `resolve` and `reject` methods // and will call them in our respective transaction methods - - // eslint-disable-next-line @typescript-eslint/no-floating-promises const done = this.drizzle .transaction(async (tx) => { transaction = tx @@ -43,7 +41,7 @@ export const beginTransaction: BeginTransaction = async function beginTransactio } transactionReady() }) - }) + }, this.transactionOptions) .catch(() => { // swallow }) diff --git a/packages/db-postgres/src/transactions/commitTransaction.ts b/packages/drizzle/src/transactions/commitTransaction.ts similarity index 100% rename from packages/db-postgres/src/transactions/commitTransaction.ts rename to packages/drizzle/src/transactions/commitTransaction.ts diff --git a/packages/db-postgres/src/transactions/rollbackTransaction.ts b/packages/drizzle/src/transactions/rollbackTransaction.ts similarity index 100% rename from packages/db-postgres/src/transactions/rollbackTransaction.ts rename to packages/drizzle/src/transactions/rollbackTransaction.ts diff --git a/packages/db-postgres/src/transform/read/hasManyNumber.ts b/packages/drizzle/src/transform/read/hasManyNumber.ts similarity index 100% rename from packages/db-postgres/src/transform/read/hasManyNumber.ts rename to packages/drizzle/src/transform/read/hasManyNumber.ts diff --git a/packages/db-postgres/src/transform/read/hasManyText.ts b/packages/drizzle/src/transform/read/hasManyText.ts similarity index 100% rename from packages/db-postgres/src/transform/read/hasManyText.ts rename to packages/drizzle/src/transform/read/hasManyText.ts diff --git a/packages/db-postgres/src/transform/read/index.ts b/packages/drizzle/src/transform/read/index.ts similarity index 95% rename from packages/db-postgres/src/transform/read/index.ts rename to packages/drizzle/src/transform/read/index.ts index 85c4cd5bbf..7c26f23206 100644 --- a/packages/db-postgres/src/transform/read/index.ts +++ b/packages/drizzle/src/transform/read/index.ts @@ -1,14 +1,14 @@ /* eslint-disable no-param-reassign */ import type { Field, SanitizedConfig, TypeWithID } from 'payload' -import type { PostgresAdapter } from '../../types.js' +import type { DrizzleAdapter } from '../../types.js' import { createBlocksMap } from '../../utilities/createBlocksMap.js' import { createPathMap } from '../../utilities/createRelationshipMap.js' import { traverseFields } from './traverseFields.js' type TransformArgs = { - adapter: PostgresAdapter + adapter: DrizzleAdapter config: SanitizedConfig data: Record fallbackLocale?: false | string diff --git a/packages/db-postgres/src/transform/read/relationship.ts b/packages/drizzle/src/transform/read/relationship.ts similarity index 100% rename from packages/db-postgres/src/transform/read/relationship.ts rename to packages/drizzle/src/transform/read/relationship.ts diff --git a/packages/db-postgres/src/transform/read/traverseFields.ts b/packages/drizzle/src/transform/read/traverseFields.ts similarity index 99% rename from packages/db-postgres/src/transform/read/traverseFields.ts rename to packages/drizzle/src/transform/read/traverseFields.ts index 783b791a87..4e2eed927d 100644 --- a/packages/db-postgres/src/transform/read/traverseFields.ts +++ b/packages/drizzle/src/transform/read/traverseFields.ts @@ -4,7 +4,7 @@ import type { SanitizedConfig } from 'payload' import { fieldAffectsData } from 'payload/shared' -import type { PostgresAdapter } from '../../types.js' +import type { DrizzleAdapter } from '../../types.js' import type { BlocksMap } from '../../utilities/createBlocksMap.js' import { transformHasManyNumber } from './hasManyNumber.js' @@ -15,7 +15,7 @@ type TraverseFieldsArgs = { /** * The DB adapter */ - adapter: PostgresAdapter + adapter: DrizzleAdapter /** * Pre-formatted blocks map */ diff --git a/packages/db-postgres/src/transform/write/array.ts b/packages/drizzle/src/transform/write/array.ts similarity index 96% rename from packages/db-postgres/src/transform/write/array.ts rename to packages/drizzle/src/transform/write/array.ts index 140253709c..1ef0cd183a 100644 --- a/packages/db-postgres/src/transform/write/array.ts +++ b/packages/drizzle/src/transform/write/array.ts @@ -1,14 +1,14 @@ /* eslint-disable no-param-reassign */ import type { ArrayField } from 'payload' -import type { PostgresAdapter } from '../../types.js' +import type { DrizzleAdapter } from '../../types.js' import type { ArrayRowToInsert, BlockRowToInsert, RelationshipToDelete } from './types.js' import { isArrayOfRows } from '../../utilities/isArrayOfRows.js' import { traverseFields } from './traverseFields.js' type Args = { - adapter: PostgresAdapter + adapter: DrizzleAdapter arrayTableName: string baseTableName: string blocks: { diff --git a/packages/db-postgres/src/transform/write/blocks.ts b/packages/drizzle/src/transform/write/blocks.ts similarity index 96% rename from packages/db-postgres/src/transform/write/blocks.ts rename to packages/drizzle/src/transform/write/blocks.ts index b23f848552..c53a755686 100644 --- a/packages/db-postgres/src/transform/write/blocks.ts +++ b/packages/drizzle/src/transform/write/blocks.ts @@ -3,13 +3,13 @@ import type { BlockField } from 'payload' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from '../../types.js' +import type { DrizzleAdapter } from '../../types.js' import type { BlockRowToInsert, RelationshipToDelete } from './types.js' import { traverseFields } from './traverseFields.js' type Args = { - adapter: PostgresAdapter + adapter: DrizzleAdapter baseTableName: string blocks: { [blockType: string]: BlockRowToInsert[] diff --git a/packages/db-postgres/src/transform/write/index.ts b/packages/drizzle/src/transform/write/index.ts similarity index 94% rename from packages/db-postgres/src/transform/write/index.ts rename to packages/drizzle/src/transform/write/index.ts index 2a32848caf..ad43214e12 100644 --- a/packages/db-postgres/src/transform/write/index.ts +++ b/packages/drizzle/src/transform/write/index.ts @@ -1,13 +1,13 @@ /* eslint-disable no-param-reassign */ import type { Field } from 'payload' -import type { PostgresAdapter } from '../../types.js' +import type { DrizzleAdapter } from '../../types.js' import type { RowToInsert } from './types.js' import { traverseFields } from './traverseFields.js' type Args = { - adapter: PostgresAdapter + adapter: DrizzleAdapter data: Record fields: Field[] path?: string diff --git a/packages/db-postgres/src/transform/write/numbers.ts b/packages/drizzle/src/transform/write/numbers.ts similarity index 100% rename from packages/db-postgres/src/transform/write/numbers.ts rename to packages/drizzle/src/transform/write/numbers.ts diff --git a/packages/db-postgres/src/transform/write/relationships.ts b/packages/drizzle/src/transform/write/relationships.ts similarity index 100% rename from packages/db-postgres/src/transform/write/relationships.ts rename to packages/drizzle/src/transform/write/relationships.ts diff --git a/packages/db-postgres/src/transform/write/selects.ts b/packages/drizzle/src/transform/write/selects.ts similarity index 100% rename from packages/db-postgres/src/transform/write/selects.ts rename to packages/drizzle/src/transform/write/selects.ts diff --git a/packages/db-postgres/src/transform/write/texts.ts b/packages/drizzle/src/transform/write/texts.ts similarity index 100% rename from packages/db-postgres/src/transform/write/texts.ts rename to packages/drizzle/src/transform/write/texts.ts diff --git a/packages/db-postgres/src/transform/write/traverseFields.ts b/packages/drizzle/src/transform/write/traverseFields.ts similarity index 96% rename from packages/db-postgres/src/transform/write/traverseFields.ts rename to packages/drizzle/src/transform/write/traverseFields.ts index 92a829e15f..e259a2a70e 100644 --- a/packages/db-postgres/src/transform/write/traverseFields.ts +++ b/packages/drizzle/src/transform/write/traverseFields.ts @@ -1,10 +1,9 @@ -/* eslint-disable no-param-reassign */ import type { Field } from 'payload' import { fieldAffectsData } from 'payload/shared' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from '../../types.js' +import type { DrizzleAdapter } from '../../types.js' import type { ArrayRowToInsert, BlockRowToInsert, RelationshipToDelete } from './types.js' import { isArrayOfRows } from '../../utilities/isArrayOfRows.js' @@ -16,7 +15,7 @@ import { transformSelects } from './selects.js' import { transformTexts } from './texts.js' type Args = { - adapter: PostgresAdapter + adapter: DrizzleAdapter arrays: { [tableName: string]: ArrayRowToInsert[] } @@ -542,8 +541,15 @@ export const traverseFields = ({ if (typeof value !== 'undefined') { let formattedValue = value - if (field.type === 'date' && field.name === 'updatedAt') { - formattedValue = new Date().toISOString() + if (field.type === 'date') { + if (typeof value === 'number' && !Number.isNaN(value)) { + formattedValue = new Date(value).toISOString() + } else if (value instanceof Date) { + formattedValue = value.toISOString() + } else if (fieldName === 'updatedAt') { + // let the db handle this + formattedValue = new Date().toISOString() + } } if (localeKey) { diff --git a/packages/db-postgres/src/transform/write/types.ts b/packages/drizzle/src/transform/write/types.ts similarity index 100% rename from packages/db-postgres/src/transform/write/types.ts rename to packages/drizzle/src/transform/write/types.ts diff --git a/packages/drizzle/src/types.ts b/packages/drizzle/src/types.ts new file mode 100644 index 0000000000..6a7002d6ea --- /dev/null +++ b/packages/drizzle/src/types.ts @@ -0,0 +1,200 @@ +import type { + ColumnBaseConfig, + ColumnDataType, + DrizzleConfig, + ExtractTablesWithRelations, + Relation, + Relations, + SQL, + TableRelationalConfig, +} from 'drizzle-orm' +import type { LibSQLDatabase } from 'drizzle-orm/libsql' +import type { NodePgDatabase, NodePgQueryResultHKT } from 'drizzle-orm/node-postgres' +import type { PgColumn, PgTable, PgTransaction } from 'drizzle-orm/pg-core' +import type { SQLiteColumn, SQLiteTable, SQLiteTransaction } from 'drizzle-orm/sqlite-core' +import type { Result } from 'drizzle-orm/sqlite-core/session' +import type { + BaseDatabaseAdapter, + MigrationData, + MigrationTemplateArgs, + Payload, + PayloadRequest, +} from 'payload' + +import type { BuildQueryJoinAliases } from './queries/buildQuery.js' + +export { BuildQueryJoinAliases } + +import type { ResultSet } from '@libsql/client' +import type { SQLiteRaw } from 'drizzle-orm/sqlite-core/query-builders/raw' +import type { QueryResult } from 'pg' + +import type { ChainedMethods } from './find/chainMethods.js' +import type { Operators } from './queries/operatorMap.js' + +export { ChainedMethods } + +export type PostgresDB = NodePgDatabase> + +export type SQLiteDB = LibSQLDatabase< + Record & Record +> + +export type GenericPgColumn = PgColumn< + ColumnBaseConfig, + Record +> + +export type GenericColumns = { + [x: string]: T +} + +type GenericPgTable = PgTable<{ + columns: GenericColumns + dialect: string + name: string + schema: undefined +}> + +type GenericSQLiteTable = SQLiteTable<{ + columns: GenericColumns + dialect: string + name: string + schema: undefined +}> + +export type GenericColumn = GenericPgColumn | SQLiteColumn + +export type GenericTable = GenericPgTable | GenericSQLiteTable + +export type GenericRelation = Relations>> + +export type TransactionSQLite = SQLiteTransaction< + 'async', + Result<'async', unknown>, + Record, + { tsName: TableRelationalConfig } +> +export type TransactionPg = PgTransaction< + NodePgQueryResultHKT, + Record, + ExtractTablesWithRelations> +> + +export type DrizzleTransaction = TransactionPg | TransactionSQLite + +export type CountDistinct = (args: { + db: DrizzleTransaction | LibSQLDatabase | PostgresDB + joins: BuildQueryJoinAliases + tableName: string + where: SQL +}) => Promise + +export type DeleteWhere = (args: { + db: DrizzleTransaction | LibSQLDatabase | PostgresDB + tableName: string + where: SQL +}) => Promise + +export type DropDatabase = (args: { adapter: DrizzleAdapter }) => Promise + +export type Execute = (args: { + db?: DrizzleTransaction | LibSQLDatabase | PostgresDB + drizzle?: LibSQLDatabase | PostgresDB + raw?: string + sql?: SQL +}) => + | Promise>> + | SQLiteRaw> + | SQLiteRaw + +export type Insert = (args: { + db: DrizzleTransaction | LibSQLDatabase | PostgresDB + onConflictDoUpdate?: unknown + tableName: string + values: Record | Record[] +}) => Promise[]> + +export type RequireDrizzleKit = () => { + generateDrizzleJson: (args: { schema: Record }) => unknown + pushSchema: ( + schema: Record, + drizzle: DrizzleAdapter['drizzle'], + ) => Promise<{ apply; hasDataLoss; warnings }> +} + +export type Migration = { + down: ({ + db, + payload, + req, + }: { + db?: DrizzleTransaction | LibSQLDatabase> | PostgresDB + payload: Payload + req: PayloadRequest + }) => Promise + up: ({ + db, + payload, + req, + }: { + db?: DrizzleTransaction | LibSQLDatabase | PostgresDB + payload: Payload + req: PayloadRequest + }) => Promise +} & MigrationData + +export type CreateJSONQueryArgs = { + operator: string + pathSegments: string[] + table?: string + treatAsArray?: string[] + treatRootAsArray?: boolean + value: boolean | number | string +} + +export interface DrizzleAdapter extends BaseDatabaseAdapter { + convertPathToJSONTraversal: (incomingSegments: string[]) => string + countDistinct: CountDistinct + createJSONQuery: (args: CreateJSONQueryArgs) => string + defaultDrizzleSnapshot: Record + deleteWhere: DeleteWhere + drizzle: LibSQLDatabase | PostgresDB + dropDatabase: DropDatabase + enums?: Record | never + execute: Execute + features: { + json?: boolean + } + /** + * An object keyed on each table, with a key value pair where the constraint name is the key, followed by the dot-notation field name + * Used for returning properly formed errors from unique fields + */ + fieldConstraints: Record> + getMigrationTemplate: (args: MigrationTemplateArgs) => string + idType: 'serial' | 'uuid' + initializing: Promise + insert: Insert + localesSuffix?: string + logger: DrizzleConfig['logger'] + operators: Operators + push: boolean + rejectInitializing: () => void + relations: Record + relationshipsSuffix?: string + requireDrizzleKit: RequireDrizzleKit + resolveInitializing: () => void + schema: Record + schemaName?: string + sessions: { + [id: string]: { + db: DrizzleTransaction + reject: () => Promise + resolve: () => Promise + } + } + tableNameMap: Map + tables: Record + transactionOptions: unknown + versionsSuffix?: string +} diff --git a/packages/db-postgres/src/update.ts b/packages/drizzle/src/update.ts similarity index 94% rename from packages/db-postgres/src/update.ts rename to packages/drizzle/src/update.ts index 94377f45f3..a3a8849a25 100644 --- a/packages/db-postgres/src/update.ts +++ b/packages/drizzle/src/update.ts @@ -2,14 +2,14 @@ import type { UpdateOne } from 'payload' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import buildQuery from './queries/buildQuery.js' import { selectDistinct } from './queries/selectDistinct.js' import { upsertRow } from './upsertRow/index.js' export const updateOne: UpdateOne = async function updateOne( - this: PostgresAdapter, + this: DrizzleAdapter, { id, collection: collectionSlug, data, draft, locale, req, where: whereArg }, ) { const db = this.sessions[await req.transactionID]?.db || this.drizzle diff --git a/packages/db-postgres/src/updateGlobal.ts b/packages/drizzle/src/updateGlobal.ts similarity index 92% rename from packages/db-postgres/src/updateGlobal.ts rename to packages/drizzle/src/updateGlobal.ts index 9144c6abe6..974c1b13c7 100644 --- a/packages/db-postgres/src/updateGlobal.ts +++ b/packages/drizzle/src/updateGlobal.ts @@ -2,12 +2,12 @@ import type { PayloadRequest, UpdateGlobalArgs } from 'payload' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import { upsertRow } from './upsertRow/index.js' export async function updateGlobal>( - this: PostgresAdapter, + this: DrizzleAdapter, { slug, data, req = {} as PayloadRequest }: UpdateGlobalArgs, ): Promise { const db = this.sessions[await req.transactionID]?.db || this.drizzle diff --git a/packages/db-postgres/src/updateGlobalVersion.ts b/packages/drizzle/src/updateGlobalVersion.ts similarity index 94% rename from packages/db-postgres/src/updateGlobalVersion.ts rename to packages/drizzle/src/updateGlobalVersion.ts index ed7160237e..39e097bd6b 100644 --- a/packages/db-postgres/src/updateGlobalVersion.ts +++ b/packages/drizzle/src/updateGlobalVersion.ts @@ -9,13 +9,13 @@ import type { import { buildVersionGlobalFields } from 'payload' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import buildQuery from './queries/buildQuery.js' import { upsertRow } from './upsertRow/index.js' export async function updateGlobalVersion( - this: PostgresAdapter, + this: DrizzleAdapter, { id, global, diff --git a/packages/db-postgres/src/updateVersion.ts b/packages/drizzle/src/updateVersion.ts similarity index 94% rename from packages/db-postgres/src/updateVersion.ts rename to packages/drizzle/src/updateVersion.ts index ddf381c680..2a0f0f4836 100644 --- a/packages/db-postgres/src/updateVersion.ts +++ b/packages/drizzle/src/updateVersion.ts @@ -9,13 +9,13 @@ import type { import { buildVersionCollectionFields } from 'payload' import toSnakeCase from 'to-snake-case' -import type { PostgresAdapter } from './types.js' +import type { DrizzleAdapter } from './types.js' import buildQuery from './queries/buildQuery.js' import { upsertRow } from './upsertRow/index.js' export async function updateVersion( - this: PostgresAdapter, + this: DrizzleAdapter, { id, collection, diff --git a/packages/db-postgres/src/upsertRow/deleteExistingArrayRows.ts b/packages/drizzle/src/upsertRow/deleteExistingArrayRows.ts similarity index 56% rename from packages/db-postgres/src/upsertRow/deleteExistingArrayRows.ts rename to packages/drizzle/src/upsertRow/deleteExistingArrayRows.ts index 5bf57698a1..974bbc148f 100644 --- a/packages/db-postgres/src/upsertRow/deleteExistingArrayRows.ts +++ b/packages/drizzle/src/upsertRow/deleteExistingArrayRows.ts @@ -1,10 +1,10 @@ import { and, eq } from 'drizzle-orm' -import type { DrizzleDB, PostgresAdapter } from '../types.js' +import type { DrizzleAdapter, DrizzleTransaction } from '../types.js' type Args = { - adapter: PostgresAdapter - db: DrizzleDB + adapter: DrizzleAdapter + db: DrizzleAdapter['drizzle'] | DrizzleTransaction parentID: unknown tableName: string } @@ -19,5 +19,9 @@ export const deleteExistingArrayRows = async ({ const whereConstraints = [eq(table._parentID, parentID)] - await db.delete(table).where(and(...whereConstraints)) + await adapter.deleteWhere({ + db, + tableName, + where: and(...whereConstraints), + }) } diff --git a/packages/db-postgres/src/upsertRow/deleteExistingRowsByPath.ts b/packages/drizzle/src/upsertRow/deleteExistingRowsByPath.ts similarity index 78% rename from packages/db-postgres/src/upsertRow/deleteExistingRowsByPath.ts rename to packages/drizzle/src/upsertRow/deleteExistingRowsByPath.ts index a231c73af6..3940eee48e 100644 --- a/packages/db-postgres/src/upsertRow/deleteExistingRowsByPath.ts +++ b/packages/drizzle/src/upsertRow/deleteExistingRowsByPath.ts @@ -1,10 +1,10 @@ import { and, eq, inArray } from 'drizzle-orm' -import type { DrizzleDB, PostgresAdapter } from '../types.js' +import type { DrizzleAdapter, DrizzleTransaction } from '../types.js' type Args = { - adapter: PostgresAdapter - db: DrizzleDB + adapter: DrizzleAdapter + db: DrizzleAdapter['drizzle'] | DrizzleTransaction localeColumnName?: string parentColumnName?: string parentID: unknown @@ -45,7 +45,11 @@ export const deleteExistingRowsByPath = async ({ if (pathColumnName) whereConstraints.push(inArray(table[pathColumnName], Array.from(localizedPathsToDelete))) - await db.delete(table).where(and(...whereConstraints)) + await adapter.deleteWhere({ + db, + tableName, + where: and(...whereConstraints), + }) } if (pathsToDelete.size > 0) { @@ -54,6 +58,10 @@ export const deleteExistingRowsByPath = async ({ if (pathColumnName) whereConstraints.push(inArray(table[pathColumnName], Array.from(pathsToDelete))) - await db.delete(table).where(and(...whereConstraints)) + await adapter.deleteWhere({ + db, + tableName, + where: and(...whereConstraints), + }) } } diff --git a/packages/db-postgres/src/upsertRow/index.ts b/packages/drizzle/src/upsertRow/index.ts similarity index 82% rename from packages/db-postgres/src/upsertRow/index.ts rename to packages/drizzle/src/upsertRow/index.ts index 59e51fb0f0..88523c862a 100644 --- a/packages/db-postgres/src/upsertRow/index.ts +++ b/packages/drizzle/src/upsertRow/index.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-param-reassign */ import type { TypeWithID } from 'payload' import { eq } from 'drizzle-orm' @@ -47,23 +46,26 @@ export const upsertRow = async | TypeWithID>( if (id) { rowToInsert.row.id = id - ;[insertedRow] = await db - .insert(adapter.tables[tableName]) - .values(rowToInsert.row) - .onConflictDoUpdate({ set: rowToInsert.row, target }) - .returning() + ;[insertedRow] = await adapter.insert({ + db, + onConflictDoUpdate: { set: rowToInsert.row, target }, + tableName, + values: rowToInsert.row, + }) } else { - ;[insertedRow] = await db - .insert(adapter.tables[tableName]) - .values(rowToInsert.row) - .onConflictDoUpdate({ set: rowToInsert.row, target, where }) - .returning() + ;[insertedRow] = await adapter.insert({ + db, + onConflictDoUpdate: { set: rowToInsert.row, target, where }, + tableName, + values: rowToInsert.row, + }) } } else { - ;[insertedRow] = await db - .insert(adapter.tables[tableName]) - .values(rowToInsert.row) - .returning() + ;[insertedRow] = await adapter.insert({ + db, + tableName, + values: rowToInsert.row, + }) } const localesToInsert: Record[] = [] @@ -138,13 +140,22 @@ export const upsertRow = async | TypeWithID>( // ////////////////////////////////// if (localesToInsert.length > 0) { + const localeTableName = `${tableName}${adapter.localesSuffix}` const localeTable = adapter.tables[`${tableName}${adapter.localesSuffix}`] if (operation === 'update') { - await db.delete(localeTable).where(eq(localeTable._parentID, insertedRow.id)) + await adapter.deleteWhere({ + db, + tableName: localeTableName, + where: eq(localeTable._parentID, insertedRow.id), + }) } - await db.insert(localeTable).values(localesToInsert) + await adapter.insert({ + db, + tableName: localeTableName, + values: localesToInsert, + }) } // ////////////////////////////////// @@ -167,7 +178,11 @@ export const upsertRow = async | TypeWithID>( } if (relationsToInsert.length > 0) { - await db.insert(adapter.tables[relationshipsTableName]).values(relationsToInsert) + await adapter.insert({ + db, + tableName: relationshipsTableName, + values: relationsToInsert, + }) } // ////////////////////////////////// @@ -190,7 +205,11 @@ export const upsertRow = async | TypeWithID>( } if (textsToInsert.length > 0) { - await db.insert(adapter.tables[textsTableName]).values(textsToInsert).returning() + await adapter.insert({ + db, + tableName: textsTableName, + values: textsToInsert, + }) } // ////////////////////////////////// @@ -213,7 +232,11 @@ export const upsertRow = async | TypeWithID>( } if (numbersToInsert.length > 0) { - await db.insert(adapter.tables[numbersTableName]).values(numbersToInsert).returning() + await adapter.insert({ + db, + tableName: numbersTableName, + values: numbersToInsert, + }) } // ////////////////////////////////// @@ -226,16 +249,21 @@ export const upsertRow = async | TypeWithID>( for (const blockName of rowToInsert.blocksToDelete) { const blockTableName = adapter.tableNameMap.get(`${tableName}_blocks_${blockName}`) const blockTable = adapter.tables[blockTableName] - await db.delete(blockTable).where(eq(blockTable._parentID, insertedRow.id)) + await adapter.deleteWhere({ + db, + tableName: blockTableName, + where: eq(blockTable._parentID, insertedRow.id), + }) } } for (const [blockName, blockRows] of Object.entries(blocksToInsert)) { const blockTableName = adapter.tableNameMap.get(`${tableName}_blocks_${blockName}`) - insertedBlockRows[blockName] = await db - .insert(adapter.tables[blockTableName]) - .values(blockRows.map(({ row }) => row)) - .returning() + insertedBlockRows[blockName] = await adapter.insert({ + db, + tableName: blockTableName, + values: blockRows.map(({ row }) => row), + }) insertedBlockRows[blockName].forEach((row, i) => { blockRows[i].row = row @@ -259,10 +287,11 @@ export const upsertRow = async | TypeWithID>( }, []) if (blockLocaleRowsToInsert.length > 0) { - await db - .insert(adapter.tables[`${blockTableName}${adapter.localesSuffix}`]) - .values(blockLocaleRowsToInsert) - .returning() + await adapter.insert({ + db, + tableName: `${blockTableName}${adapter.localesSuffix}`, + values: blockLocaleRowsToInsert, + }) } await insertArrays({ @@ -302,9 +331,17 @@ export const upsertRow = async | TypeWithID>( for (const [selectTableName, tableRows] of Object.entries(selectsToInsert)) { const selectTable = adapter.tables[selectTableName] if (operation === 'update') { - await db.delete(selectTable).where(eq(selectTable.parent, insertedRow.id)) + await adapter.deleteWhere({ + db, + tableName: selectTableName, + where: eq(selectTable.parent, insertedRow.id), + }) } - await db.insert(selectTable).values(tableRows).returning() + await adapter.insert({ + db, + tableName: selectTableName, + values: tableRows, + }) } // ////////////////////////////////// diff --git a/packages/db-postgres/src/upsertRow/insertArrays.ts b/packages/drizzle/src/upsertRow/insertArrays.ts similarity index 87% rename from packages/db-postgres/src/upsertRow/insertArrays.ts rename to packages/drizzle/src/upsertRow/insertArrays.ts index 46ff4562ed..1076417565 100644 --- a/packages/db-postgres/src/upsertRow/insertArrays.ts +++ b/packages/drizzle/src/upsertRow/insertArrays.ts @@ -1,13 +1,13 @@ /* eslint-disable no-param-reassign */ import type { ArrayRowToInsert } from '../transform/write/types.js' -import type { DrizzleDB, PostgresAdapter } from '../types.js' +import type { DrizzleAdapter, DrizzleTransaction } from '../types.js' type Args = { - adapter: PostgresAdapter + adapter: DrizzleAdapter arrays: { [tableName: string]: ArrayRowToInsert[] }[] - db: DrizzleDB + db: DrizzleAdapter['drizzle'] | DrizzleTransaction parentRows: Record[] } @@ -67,7 +67,11 @@ export const insertArrays = async ({ adapter, arrays, db, parentRows }: Args): P // the nested arrays need the ID for the parentID foreign key let insertedRows: Args['parentRows'] if (row.rows.length > 0) { - insertedRows = await db.insert(adapter.tables[tableName]).values(row.rows).returning() + insertedRows = await adapter.insert({ + db, + tableName, + values: row.rows, + }) } // Insert locale rows @@ -81,10 +85,11 @@ export const insertArrays = async ({ adapter, arrays, db, parentRows }: Args): P return localeRow }) } - await db - .insert(adapter.tables[`${tableName}${adapter.localesSuffix}`]) - .values(row.locales) - .returning() + await adapter.insert({ + db, + tableName: `${tableName}${adapter.localesSuffix}`, + values: row.locales, + }) } // If there are sub arrays, call this function recursively diff --git a/packages/db-postgres/src/upsertRow/types.ts b/packages/drizzle/src/upsertRow/types.ts similarity index 79% rename from packages/db-postgres/src/upsertRow/types.ts rename to packages/drizzle/src/upsertRow/types.ts index 3b9fc9ce7c..9f52d9373e 100644 --- a/packages/db-postgres/src/upsertRow/types.ts +++ b/packages/drizzle/src/upsertRow/types.ts @@ -1,12 +1,12 @@ import type { SQL } from 'drizzle-orm' import type { Field, PayloadRequest } from 'payload' -import type { DrizzleDB, GenericColumn, PostgresAdapter } from '../types.js' +import type { DrizzleAdapter, DrizzleTransaction, GenericColumn } from '../types.js' type BaseArgs = { - adapter: PostgresAdapter + adapter: DrizzleAdapter data: Record - db: DrizzleDB + db: DrizzleAdapter['drizzle'] | DrizzleTransaction fields: Field[] /** * When true, skips reading the data back from the database and returns the input data diff --git a/packages/db-postgres/src/utilities/appendPrefixToKeys.ts b/packages/drizzle/src/utilities/appendPrefixToKeys.ts similarity index 100% rename from packages/db-postgres/src/utilities/appendPrefixToKeys.ts rename to packages/drizzle/src/utilities/appendPrefixToKeys.ts diff --git a/packages/db-postgres/src/utilities/createBlocksMap.ts b/packages/drizzle/src/utilities/createBlocksMap.ts similarity index 100% rename from packages/db-postgres/src/utilities/createBlocksMap.ts rename to packages/drizzle/src/utilities/createBlocksMap.ts diff --git a/packages/db-postgres/src/utilities/createRelationshipMap.ts b/packages/drizzle/src/utilities/createRelationshipMap.ts similarity index 100% rename from packages/db-postgres/src/utilities/createRelationshipMap.ts rename to packages/drizzle/src/utilities/createRelationshipMap.ts diff --git a/packages/db-postgres/src/utilities/hasLocalesTable.ts b/packages/drizzle/src/utilities/hasLocalesTable.ts similarity index 100% rename from packages/db-postgres/src/utilities/hasLocalesTable.ts rename to packages/drizzle/src/utilities/hasLocalesTable.ts diff --git a/packages/db-postgres/src/utilities/isArrayOfRows.ts b/packages/drizzle/src/utilities/isArrayOfRows.ts similarity index 100% rename from packages/db-postgres/src/utilities/isArrayOfRows.ts rename to packages/drizzle/src/utilities/isArrayOfRows.ts diff --git a/packages/drizzle/src/utilities/migrationTableExists.ts b/packages/drizzle/src/utilities/migrationTableExists.ts new file mode 100644 index 0000000000..0d69f9b9a7 --- /dev/null +++ b/packages/drizzle/src/utilities/migrationTableExists.ts @@ -0,0 +1,30 @@ +import type { DrizzleAdapter } from '../types.js' + +export const migrationTableExists = async (adapter: DrizzleAdapter): Promise => { + let statement + + if (adapter.name === 'postgres') { + const prependSchema = adapter.schemaName ? `"${adapter.schemaName}".` : '' + statement = `SELECT to_regclass('${prependSchema}"payload_migrations"') exists;` + } + + if (adapter.name === 'sqlite') { + statement = ` + SELECT CASE + WHEN COUNT(*) > 0 THEN 1 + ELSE 0 + END AS 'exists' + FROM sqlite_master + WHERE type = 'table' + AND name = 'payload_migrations';` + } + + const result = await adapter.execute({ + drizzle: adapter.drizzle, + raw: statement, + }) + + const [row] = result.rows + + return row && typeof row === 'object' && 'exists' in row && !!row.exists +} diff --git a/packages/db-postgres/src/utilities/parseError.ts b/packages/drizzle/src/utilities/parseError.ts similarity index 60% rename from packages/db-postgres/src/utilities/parseError.ts rename to packages/drizzle/src/utilities/parseError.ts index 88abbcd2ef..9dcc73b157 100644 --- a/packages/db-postgres/src/utilities/parseError.ts +++ b/packages/drizzle/src/utilities/parseError.ts @@ -1,6 +1,3 @@ -import pg from 'pg' -const { DatabaseError } = pg - /** * Format error message with hint if available */ @@ -8,9 +5,9 @@ export const parseError = (err: unknown, msg: string): string => { let formattedMsg = `${msg}` if (err instanceof Error) { formattedMsg += ` ${err.message}.` - if (err instanceof DatabaseError) { - msg += `: ${err.message}` - if (err.hint) msg += ` ${err.hint}.` + // Check if the error has a hint property + if ('hint' in err && typeof err.hint === 'string') { + formattedMsg += ` ${err.hint}.` } } return formattedMsg diff --git a/packages/drizzle/src/utilities/pushDevSchema.ts b/packages/drizzle/src/utilities/pushDevSchema.ts new file mode 100644 index 0000000000..253948ef03 --- /dev/null +++ b/packages/drizzle/src/utilities/pushDevSchema.ts @@ -0,0 +1,70 @@ +import prompts from 'prompts' + +import type { DrizzleAdapter } from '../types.js' + +/** + * Pushes the development schema to the database using Drizzle. + * + * @param {DrizzleAdapter} adapter - The PostgresAdapter instance connected to the database. + * @returns {Promise} - A promise that resolves once the schema push is complete. + */ +export const pushDevSchema = async (adapter: DrizzleAdapter) => { + const { pushSchema } = adapter.requireDrizzleKit() + + // This will prompt if clarifications are needed for Drizzle to push new schema + const { apply, hasDataLoss, warnings } = await pushSchema(adapter.schema, adapter.drizzle) + + if (warnings.length) { + let message = `Warnings detected during schema push: \n\n${warnings.join('\n')}\n\n` + + if (hasDataLoss) { + message += `DATA LOSS WARNING: Possible data loss detected if schema is pushed.\n\n` + } + + message += `Accept warnings and push schema to database?` + + const { confirm: acceptWarnings } = await prompts( + { + name: 'confirm', + type: 'confirm', + initial: false, + message, + }, + { + onCancel: () => { + process.exit(0) + }, + }, + ) + + // Exit if user does not accept warnings. + // Q: Is this the right type of exit for this interaction? + if (!acceptWarnings) { + process.exit(0) + } + } + + await apply() + const migrationsTable = adapter.schemaName + ? `"${adapter.schemaName}"."payload_migrations"` + : '"payload_migrations"' + + const result = await adapter.execute({ + drizzle: adapter.drizzle, + raw: `SELECT * FROM ${migrationsTable} WHERE batch = '-1'`, + }) + + const devPush = result.rows + + if (!devPush.length) { + await adapter.execute({ + drizzle: adapter.drizzle, + raw: `INSERT INTO ${migrationsTable} (name, batch) VALUES ('dev', '-1')`, + }) + } else { + await adapter.execute({ + drizzle: adapter.drizzle, + raw: `UPDATE ${migrationsTable} SET updated_at = CURRENT_TIMESTAMP WHERE batch = '-1'`, + }) + } +} diff --git a/packages/db-postgres/src/schema/validateExistingBlockIsIdentical.ts b/packages/drizzle/src/utilities/validateExistingBlockIsIdentical.ts similarity index 96% rename from packages/db-postgres/src/schema/validateExistingBlockIsIdentical.ts rename to packages/drizzle/src/utilities/validateExistingBlockIsIdentical.ts index ff115f4219..8a92876774 100644 --- a/packages/db-postgres/src/schema/validateExistingBlockIsIdentical.ts +++ b/packages/drizzle/src/utilities/validateExistingBlockIsIdentical.ts @@ -3,14 +3,12 @@ import type { Block, Field } from 'payload' import { InvalidConfiguration } from 'payload' import { fieldAffectsData, fieldHasSubFields, tabHasName } from 'payload/shared' -import type { GenericTable } from '../types.js' - type Args = { block: Block localized: boolean rootTableName: string - table: GenericTable - tableLocales?: GenericTable + table: Record + tableLocales?: Record } const getFlattenedFieldNames = ( diff --git a/packages/drizzle/tsconfig.json b/packages/drizzle/tsconfig.json new file mode 100644 index 0000000000..ddd37c9e4f --- /dev/null +++ b/packages/drizzle/tsconfig.json @@ -0,0 +1,28 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + // Make sure typescript knows that this module depends on their references + "composite": true, + /* Do not emit outputs. */ + "noEmit": false, + "emitDeclarationOnly": true, + /* Specify an output folder for all emitted files. */ + "outDir": "./dist", + /* Specify the root folder within your source files. */ + "rootDir": "./src" + }, + "exclude": [ + "dist", + "build", + "tests", + "test", + "node_modules", + "eslint.config.js", + "src/**/*.spec.js", + "src/**/*.spec.jsx", + "src/**/*.spec.ts", + "src/**/*.spec.tsx" + ], + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.d.ts", "src/**/*.json"], + "references": [{ "path": "../payload" }, { "path": "../translations" }] +} diff --git a/packages/payload/src/collections/dataloader.ts b/packages/payload/src/collections/dataloader.ts index a0a9e44499..dac7df9903 100644 --- a/packages/payload/src/collections/dataloader.ts +++ b/packages/payload/src/collections/dataloader.ts @@ -119,7 +119,7 @@ const batchAndLoadDocs = showHiddenFields: Boolean(showHiddenFields), where: { id: { - in: ids as JsonValue, + in: ids, }, }, }) diff --git a/packages/payload/src/database/migrations/getPredefinedMigration.ts b/packages/payload/src/database/migrations/getPredefinedMigration.ts index d4dc2ba332..a1ab1bf5f1 100644 --- a/packages/payload/src/database/migrations/getPredefinedMigration.ts +++ b/packages/payload/src/database/migrations/getPredefinedMigration.ts @@ -34,8 +34,11 @@ export const getPredefinedMigration = async ({ const { downSQL, imports, upSQL } = await eval(`import('${moduleURL.href}')`) return { downSQL, imports, upSQL } } catch (error) { - payload.logger.error(`Error loading predefined migration ${migrationName}`) - throw error + payload.logger.error({ + error, + msg: `Error loading predefined migration ${migrationName}`, + }) + process.exit(1) } } else { payload.logger.error({ diff --git a/packages/payload/src/exports/components/utilities.ts b/packages/payload/src/exports/components/utilities.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/payload/src/versions/enforceMaxVersions.ts b/packages/payload/src/versions/enforceMaxVersions.ts index 9c54a30dc7..74335c93ad 100644 --- a/packages/payload/src/versions/enforceMaxVersions.ts +++ b/packages/payload/src/versions/enforceMaxVersions.ts @@ -33,6 +33,7 @@ export const enforceMaxVersions = async ({ const query = await payload.db.findVersions({ collection: collection.slug, + limit: 1, pagination: false, req, skip: max, @@ -44,6 +45,7 @@ export const enforceMaxVersions = async ({ } else if (global) { const query = await payload.db.findGlobalVersions({ global: global.slug, + limit: 1, pagination: false, req, skip: max, diff --git a/packages/payload/src/versions/saveVersion.ts b/packages/payload/src/versions/saveVersion.ts index eee2fd1a43..d6635c7591 100644 --- a/packages/payload/src/versions/saveVersion.ts +++ b/packages/payload/src/versions/saveVersion.ts @@ -1,6 +1,6 @@ import type { SanitizedCollectionConfig, TypeWithID } from '../collections/config/types.js' import type { SanitizedGlobalConfig } from '../globals/config/types.js' -import type { Payload } from '../index.js'; +import type { Payload } from '../index.js' import type { PayloadRequest } from '../types/index.js' import { deepCopyObjectSimple } from '../index.js' diff --git a/packages/richtext-lexical/src/features/blocks/nodes/InlineBlocksNode.tsx b/packages/richtext-lexical/src/features/blocks/nodes/InlineBlocksNode.tsx index 8609423e4a..af53251194 100644 --- a/packages/richtext-lexical/src/features/blocks/nodes/InlineBlocksNode.tsx +++ b/packages/richtext-lexical/src/features/blocks/nodes/InlineBlocksNode.tsx @@ -113,7 +113,7 @@ export class InlineBlockNode extends DecoratorNode { } setFields(fields: InlineBlockFields): void { - const fieldsCopy = deepCopyObjectSimple(fields) as InlineBlockFields + const fieldsCopy = deepCopyObjectSimple(fields) const writable = this.getWritable() writable.__fields = fieldsCopy diff --git a/packages/richtext-lexical/src/features/blocks/plugin/index.tsx b/packages/richtext-lexical/src/features/blocks/plugin/index.tsx index efec302e5c..f5b4dd237c 100644 --- a/packages/richtext-lexical/src/features/blocks/plugin/index.tsx +++ b/packages/richtext-lexical/src/features/blocks/plugin/index.tsx @@ -99,14 +99,13 @@ export const BlocksPlugin: PluginComponent = () => { if (!node) { return false } - + node.setFields(fields as BlockFields) setTargetNodeKey(null) return true } - const inlineBlockNode = $createInlineBlockNode(fields as BlockFields) $insertNodes([inlineBlockNode]) if ($isRootOrShadowRoot(inlineBlockNode.getParentOrThrow())) { @@ -120,7 +119,6 @@ export const BlocksPlugin: PluginComponent = () => { editor.registerCommand( OPEN_INLINE_BLOCK_DRAWER_COMMAND, ({ fields, nodeKey }) => { - setBlockFields((fields as BlockFields) ?? null) setTargetNodeKey(nodeKey ?? null) setBlockType(fields?.blockType ?? ('' as any)) diff --git a/packages/richtext-lexical/src/index.ts b/packages/richtext-lexical/src/index.ts index a7ac1d1ec4..4dc4b175ec 100644 --- a/packages/richtext-lexical/src/index.ts +++ b/packages/richtext-lexical/src/index.ts @@ -463,8 +463,7 @@ export function lexicalEditor(props?: LexicalEditorProps): LexicalRichTextAdapte recurseNodeTree({ nodeIDMap: originalNodeWithLocalesIDMap, nodes: - - (siblingDocWithLocales[field.name] as unknown as SerializedEditorState)?.root + (siblingDocWithLocales[field.name] as SerializedEditorState)?.root ?.children ?? [], }) } diff --git a/packages/richtext-lexical/src/populateGraphQL/populateLexicalPopulationPromises.ts b/packages/richtext-lexical/src/populateGraphQL/populateLexicalPopulationPromises.ts index 206f685755..16615c6626 100644 --- a/packages/richtext-lexical/src/populateGraphQL/populateLexicalPopulationPromises.ts +++ b/packages/richtext-lexical/src/populateGraphQL/populateLexicalPopulationPromises.ts @@ -59,7 +59,7 @@ export const populateLexicalPopulationPromises = ({ } } }, - - nodes: (siblingDoc[field?.name] as unknown as SerializedEditorState)?.root?.children ?? [], + + nodes: (siblingDoc[field?.name] as SerializedEditorState)?.root?.children ?? [], }) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0e5a25305e..7443f39a52 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,6 +29,9 @@ importers: '@jest/globals': specifier: 29.7.0 version: 29.7.0 + '@libsql/client': + specifier: 0.6.2 + version: 0.6.2 '@next/bundle-analyzer': specifier: 15.0.0-canary.53 version: 15.0.0-canary.53 @@ -98,12 +101,9 @@ importers: dotenv: specifier: 16.4.5 version: 16.4.5 - drizzle-kit: - specifier: 0.20.14-1f2c838 - version: 0.20.14-1f2c838 drizzle-orm: specifier: 0.29.4 - version: 0.29.4(@libsql/client@0.5.6)(@types/pg@8.10.2)(pg@8.11.3)(react@19.0.0-rc-fb9a90fa48-20240614)(types-react@19.0.0-rc.0) + version: 0.29.4(@libsql/client@0.6.2)(@types/pg@8.10.2)(pg@8.11.3)(react@19.0.0-rc-fb9a90fa48-20240614)(types-react@19.0.0-rc.0) escape-html: specifier: ^1.0.3 version: 1.0.3 @@ -136,10 +136,10 @@ importers: version: 1.2.8 mongodb-memory-server: specifier: ^9.0 - version: 9.4.1 + version: 9.4.0 next: specifier: 15.0.0-canary.53 - version: 15.0.0-canary.53(@babel/core@7.24.9)(@playwright/test@1.43.0)(babel-plugin-react-compiler@0.0.0-experimental-592953e-20240517)(react-dom@19.0.0-rc-fb9a90fa48-20240614)(react@19.0.0-rc-fb9a90fa48-20240614) + version: 15.0.0-canary.53(@babel/core@7.24.7)(@playwright/test@1.43.0)(babel-plugin-react-compiler@0.0.0-experimental-592953e-20240517)(react-dom@19.0.0-rc-fb9a90fa48-20240614)(react@19.0.0-rc-fb9a90fa48-20240614) open: specifier: ^10.1.0 version: 10.1.0 @@ -169,7 +169,7 @@ importers: version: 3.0.2 semver: specifier: ^7.5.4 - version: 7.6.3 + version: 7.6.2 sharp: specifier: 0.32.6 version: 0.32.6 @@ -285,16 +285,16 @@ importers: version: 4.17.1(@aws-sdk/client-sso-oidc@3.614.0) mongodb-memory-server: specifier: ^9.0 - version: 9.4.1 + version: 9.4.0 payload: specifier: workspace:* version: link:../payload packages/db-postgres: dependencies: - '@libsql/client': - specifier: ^0.5.2 - version: 0.5.6 + '@payloadcms/drizzle': + specifier: workspace:* + version: link:../drizzle console-table-printer: specifier: 2.11.2 version: 2.11.2 @@ -303,7 +303,7 @@ importers: version: 0.20.14-1f2c838 drizzle-orm: specifier: 0.29.4 - version: 0.29.4(@libsql/client@0.5.6)(@types/pg@8.10.2)(pg@8.11.3)(react@19.0.0-rc-fb9a90fa48-20240614)(types-react@19.0.0-rc.0) + version: 0.29.4(@libsql/client@0.6.2)(@types/pg@8.10.2)(pg@8.11.3)(react@19.0.0-rc-fb9a90fa48-20240614)(types-react@19.0.0-rc.0) pg: specifier: 8.11.3 version: 8.11.3 @@ -336,6 +336,80 @@ importers: specifier: workspace:* version: link:../payload + packages/db-sqlite: + dependencies: + '@libsql/client': + specifier: ^0.6.2 + version: 0.6.2 + '@payloadcms/drizzle': + specifier: workspace:* + version: link:../drizzle + console-table-printer: + specifier: 2.11.2 + version: 2.11.2 + drizzle-kit: + specifier: 0.20.14-1f2c838 + version: 0.20.14-1f2c838 + drizzle-orm: + specifier: 0.29.4 + version: 0.29.4(@libsql/client@0.6.2)(@types/pg@8.10.2)(pg@8.11.3)(react@19.0.0-rc-fb9a90fa48-20240614)(types-react@19.0.0-rc.0) + prompts: + specifier: 2.4.2 + version: 2.4.2 + to-snake-case: + specifier: 1.0.0 + version: 1.0.0 + uuid: + specifier: 9.0.0 + version: 9.0.0 + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/pg': + specifier: 8.10.2 + version: 8.10.2 + '@types/to-snake-case': + specifier: 1.0.0 + version: 1.0.0 + payload: + specifier: workspace:* + version: link:../payload + + packages/drizzle: + dependencies: + console-table-printer: + specifier: 2.11.2 + version: 2.11.2 + drizzle-orm: + specifier: 0.29.4 + version: 0.29.4(@libsql/client@0.6.2)(@types/pg@8.10.2)(pg@8.11.3)(react@19.0.0-rc-fb9a90fa48-20240614)(types-react@19.0.0-rc.0) + prompts: + specifier: 2.4.2 + version: 2.4.2 + to-snake-case: + specifier: 1.0.0 + version: 1.0.0 + uuid: + specifier: 9.0.0 + version: 9.0.0 + devDependencies: + '@libsql/client': + specifier: ^0.6.2 + version: 0.6.2 + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/pg': + specifier: 8.10.2 + version: 8.10.2 + '@types/to-snake-case': + specifier: 1.0.0 + version: 1.0.0 + payload: + specifier: workspace:* + version: link:../payload + packages/email-nodemailer: dependencies: nodemailer: @@ -548,7 +622,7 @@ importers: version: link:../payload vue: specifier: ^3.0.0 - version: 3.4.32(typescript@5.5.3) + version: 3.4.31(typescript@5.5.3) packages/next: dependencies: @@ -584,7 +658,7 @@ importers: version: 1.6.2 next: specifier: ^15.0.0-canary.53 - version: 15.0.0-canary.53(@babel/core@7.24.9)(@playwright/test@1.43.0)(react-dom@19.0.0-rc-fb9a90fa48-20240614)(react@19.0.0-rc-fb9a90fa48-20240614)(sass@1.77.4) + version: 15.0.0-canary.53(@babel/core@7.24.7)(@playwright/test@1.43.0)(react-dom@19.0.0-rc-fb9a90fa48-20240614)(react@19.0.0-rc-fb9a90fa48-20240614)(sass@1.77.4) path-to-regexp: specifier: ^6.2.1 version: 6.2.2 @@ -627,13 +701,13 @@ importers: version: 10.0.0 '@types/ws': specifier: ^8.5.10 - version: 8.5.11 + version: 8.5.10 esbuild: specifier: 0.23.0 version: 0.23.0 esbuild-sass-plugin: specifier: 3.3.1 - version: 3.3.1(esbuild@0.23.0)(sass-embedded@1.77.8) + version: 3.3.1(esbuild@0.23.0)(sass-embedded@1.77.5) payload: specifier: workspace:* version: link:../payload @@ -818,7 +892,7 @@ importers: version: link:../payload ts-jest: specifier: ^29.1.0 - version: 29.2.2(@babel/core@7.24.9)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.5.3) + version: 29.2.2(@babel/core@7.24.7)(jest@29.7.0)(typescript@5.5.3) packages/plugin-cloud-storage: dependencies: @@ -843,7 +917,7 @@ importers: version: 12.23.0 '@google-cloud/storage': specifier: ^7.7.0 - version: 7.12.0 + version: 7.11.3 '@types/find-node-modules': specifier: ^2.1.2 version: 2.1.2 @@ -1015,7 +1089,7 @@ importers: version: link:../payload ts-jest: specifier: ^29.1.0 - version: 29.2.2(@babel/core@7.24.9)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.5.3) + version: 29.2.2(@babel/core@7.24.7)(jest@29.7.0)(typescript@5.5.3) packages/plugin-seo: dependencies: @@ -1186,7 +1260,7 @@ importers: version: 0.23.0 esbuild-sass-plugin: specifier: 3.3.1 - version: 3.3.1(esbuild@0.23.0)(sass-embedded@1.77.8) + version: 3.3.1(esbuild@0.23.0)(sass-embedded@1.77.5) payload: specifier: workspace:* version: link:../payload @@ -1266,7 +1340,7 @@ importers: dependencies: '@google-cloud/storage': specifier: ^7.7.0 - version: 7.12.0 + version: 7.11.3 '@payloadcms/plugin-cloud-storage': specifier: workspace:* version: link:../plugin-cloud-storage @@ -1385,7 +1459,7 @@ importers: version: 2.3.0 next: specifier: ^15.0.0-canary.53 - version: 15.0.0-canary.53(@babel/core@7.24.9)(@playwright/test@1.43.0)(babel-plugin-react-compiler@0.0.0-experimental-592953e-20240517)(react-dom@19.0.0-rc-fb9a90fa48-20240614)(react@19.0.0-rc-fb9a90fa48-20240614) + version: 15.0.0-canary.53(@babel/core@7.24.7)(@playwright/test@1.43.0)(babel-plugin-react-compiler@0.0.0-experimental-592953e-20240517)(react-dom@19.0.0-rc-fb9a90fa48-20240614)(react@19.0.0-rc-fb9a90fa48-20240614) object-to-formdata: specifier: 4.5.1 version: 4.5.1 @@ -1425,19 +1499,19 @@ importers: devDependencies: '@babel/cli': specifier: ^7.24.5 - version: 7.24.8(@babel/core@7.24.9) + version: 7.24.7(@babel/core@7.24.7) '@babel/core': specifier: ^7.24.5 - version: 7.24.9 + version: 7.24.7 '@babel/preset-env': specifier: ^7.24.5 - version: 7.24.8(@babel/core@7.24.9) + version: 7.24.7(@babel/core@7.24.7) '@babel/preset-react': specifier: ^7.24.1 - version: 7.24.7(@babel/core@7.24.9) + version: 7.24.7(@babel/core@7.24.7) '@babel/preset-typescript': specifier: ^7.24.1 - version: 7.24.7(@babel/core@7.24.9) + version: 7.24.7(@babel/core@7.24.7) '@hyrious/esbuild-plugin-commonjs': specifier: ^0.2.4 version: 0.2.4(esbuild@0.23.0) @@ -1467,7 +1541,7 @@ importers: version: 0.23.0 esbuild-sass-plugin: specifier: 3.3.1 - version: 3.3.1(esbuild@0.23.0)(sass-embedded@1.77.8) + version: 3.3.1(esbuild@0.23.0)(sass-embedded@1.77.5) payload: specifier: workspace:* version: link:../payload @@ -1489,6 +1563,12 @@ importers: '@payloadcms/db-postgres': specifier: workspace:* version: link:../packages/db-postgres + '@payloadcms/db-sqlite': + specifier: workspace:* + version: link:../packages/db-sqlite + '@payloadcms/drizzle': + specifier: workspace:* + version: link:../packages/drizzle '@payloadcms/email-nodemailer': specifier: workspace:* version: link:../packages/email-nodemailer @@ -1738,26 +1818,26 @@ packages: '@aws-sdk/util-user-agent-browser': 3.609.0 '@aws-sdk/util-user-agent-node': 3.614.0 '@smithy/config-resolver': 3.0.5 - '@smithy/core': 2.2.7 - '@smithy/fetch-http-handler': 3.2.2 + '@smithy/core': 2.2.6 + '@smithy/fetch-http-handler': 3.2.1 '@smithy/hash-node': 3.0.3 '@smithy/invalid-dependency': 3.0.3 - '@smithy/middleware-content-length': 3.0.4 + '@smithy/middleware-content-length': 3.0.3 '@smithy/middleware-endpoint': 3.0.5 - '@smithy/middleware-retry': 3.0.10 + '@smithy/middleware-retry': 3.0.9 '@smithy/middleware-serde': 3.0.3 '@smithy/middleware-stack': 3.0.3 '@smithy/node-config-provider': 3.1.4 - '@smithy/node-http-handler': 3.1.3 - '@smithy/protocol-http': 4.0.4 - '@smithy/smithy-client': 3.1.8 + '@smithy/node-http-handler': 3.1.2 + '@smithy/protocol-http': 4.0.3 + '@smithy/smithy-client': 3.1.7 '@smithy/types': 3.3.0 '@smithy/url-parser': 3.0.3 '@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.10 - '@smithy/util-defaults-mode-node': 3.0.10 + '@smithy/util-defaults-mode-browser': 3.0.9 + '@smithy/util-defaults-mode-node': 3.0.9 '@smithy/util-endpoints': 2.0.5 '@smithy/util-middleware': 3.0.3 '@smithy/util-retry': 3.0.3 @@ -1796,35 +1876,35 @@ packages: '@aws-sdk/util-user-agent-node': 3.614.0 '@aws-sdk/xml-builder': 3.609.0 '@smithy/config-resolver': 3.0.5 - '@smithy/core': 2.2.7 + '@smithy/core': 2.2.6 '@smithy/eventstream-serde-browser': 3.0.4 '@smithy/eventstream-serde-config-resolver': 3.0.3 '@smithy/eventstream-serde-node': 3.0.4 - '@smithy/fetch-http-handler': 3.2.2 + '@smithy/fetch-http-handler': 3.2.1 '@smithy/hash-blob-browser': 3.1.2 '@smithy/hash-node': 3.0.3 '@smithy/hash-stream-node': 3.1.2 '@smithy/invalid-dependency': 3.0.3 '@smithy/md5-js': 3.0.3 - '@smithy/middleware-content-length': 3.0.4 + '@smithy/middleware-content-length': 3.0.3 '@smithy/middleware-endpoint': 3.0.5 - '@smithy/middleware-retry': 3.0.10 + '@smithy/middleware-retry': 3.0.9 '@smithy/middleware-serde': 3.0.3 '@smithy/middleware-stack': 3.0.3 '@smithy/node-config-provider': 3.1.4 - '@smithy/node-http-handler': 3.1.3 - '@smithy/protocol-http': 4.0.4 - '@smithy/smithy-client': 3.1.8 + '@smithy/node-http-handler': 3.1.2 + '@smithy/protocol-http': 4.0.3 + '@smithy/smithy-client': 3.1.7 '@smithy/types': 3.3.0 '@smithy/url-parser': 3.0.3 '@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.10 - '@smithy/util-defaults-mode-node': 3.0.10 + '@smithy/util-defaults-mode-browser': 3.0.9 + '@smithy/util-defaults-mode-node': 3.0.9 '@smithy/util-endpoints': 2.0.5 '@smithy/util-retry': 3.0.3 - '@smithy/util-stream': 3.1.0 + '@smithy/util-stream': 3.0.6 '@smithy/util-utf8': 3.0.0 '@smithy/util-waiter': 3.1.2 tslib: 2.6.3 @@ -1852,26 +1932,26 @@ packages: '@aws-sdk/util-user-agent-browser': 3.609.0 '@aws-sdk/util-user-agent-node': 3.614.0 '@smithy/config-resolver': 3.0.5 - '@smithy/core': 2.2.7 - '@smithy/fetch-http-handler': 3.2.2 + '@smithy/core': 2.2.6 + '@smithy/fetch-http-handler': 3.2.1 '@smithy/hash-node': 3.0.3 '@smithy/invalid-dependency': 3.0.3 - '@smithy/middleware-content-length': 3.0.4 + '@smithy/middleware-content-length': 3.0.3 '@smithy/middleware-endpoint': 3.0.5 - '@smithy/middleware-retry': 3.0.10 + '@smithy/middleware-retry': 3.0.9 '@smithy/middleware-serde': 3.0.3 '@smithy/middleware-stack': 3.0.3 '@smithy/node-config-provider': 3.1.4 - '@smithy/node-http-handler': 3.1.3 - '@smithy/protocol-http': 4.0.4 - '@smithy/smithy-client': 3.1.8 + '@smithy/node-http-handler': 3.1.2 + '@smithy/protocol-http': 4.0.3 + '@smithy/smithy-client': 3.1.7 '@smithy/types': 3.3.0 '@smithy/url-parser': 3.0.3 '@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.10 - '@smithy/util-defaults-mode-node': 3.0.10 + '@smithy/util-defaults-mode-browser': 3.0.9 + '@smithy/util-defaults-mode-node': 3.0.9 '@smithy/util-endpoints': 2.0.5 '@smithy/util-middleware': 3.0.3 '@smithy/util-retry': 3.0.3 @@ -1897,26 +1977,26 @@ packages: '@aws-sdk/util-user-agent-browser': 3.609.0 '@aws-sdk/util-user-agent-node': 3.614.0 '@smithy/config-resolver': 3.0.5 - '@smithy/core': 2.2.7 - '@smithy/fetch-http-handler': 3.2.2 + '@smithy/core': 2.2.6 + '@smithy/fetch-http-handler': 3.2.1 '@smithy/hash-node': 3.0.3 '@smithy/invalid-dependency': 3.0.3 - '@smithy/middleware-content-length': 3.0.4 + '@smithy/middleware-content-length': 3.0.3 '@smithy/middleware-endpoint': 3.0.5 - '@smithy/middleware-retry': 3.0.10 + '@smithy/middleware-retry': 3.0.9 '@smithy/middleware-serde': 3.0.3 '@smithy/middleware-stack': 3.0.3 '@smithy/node-config-provider': 3.1.4 - '@smithy/node-http-handler': 3.1.3 - '@smithy/protocol-http': 4.0.4 - '@smithy/smithy-client': 3.1.8 + '@smithy/node-http-handler': 3.1.2 + '@smithy/protocol-http': 4.0.3 + '@smithy/smithy-client': 3.1.7 '@smithy/types': 3.3.0 '@smithy/url-parser': 3.0.3 '@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.10 - '@smithy/util-defaults-mode-node': 3.0.10 + '@smithy/util-defaults-mode-browser': 3.0.9 + '@smithy/util-defaults-mode-node': 3.0.9 '@smithy/util-endpoints': 2.0.5 '@smithy/util-middleware': 3.0.3 '@smithy/util-retry': 3.0.3 @@ -1944,26 +2024,26 @@ packages: '@aws-sdk/util-user-agent-browser': 3.609.0 '@aws-sdk/util-user-agent-node': 3.614.0 '@smithy/config-resolver': 3.0.5 - '@smithy/core': 2.2.7 - '@smithy/fetch-http-handler': 3.2.2 + '@smithy/core': 2.2.6 + '@smithy/fetch-http-handler': 3.2.1 '@smithy/hash-node': 3.0.3 '@smithy/invalid-dependency': 3.0.3 - '@smithy/middleware-content-length': 3.0.4 + '@smithy/middleware-content-length': 3.0.3 '@smithy/middleware-endpoint': 3.0.5 - '@smithy/middleware-retry': 3.0.10 + '@smithy/middleware-retry': 3.0.9 '@smithy/middleware-serde': 3.0.3 '@smithy/middleware-stack': 3.0.3 '@smithy/node-config-provider': 3.1.4 - '@smithy/node-http-handler': 3.1.3 - '@smithy/protocol-http': 4.0.4 - '@smithy/smithy-client': 3.1.8 + '@smithy/node-http-handler': 3.1.2 + '@smithy/protocol-http': 4.0.3 + '@smithy/smithy-client': 3.1.7 '@smithy/types': 3.3.0 '@smithy/url-parser': 3.0.3 '@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.10 - '@smithy/util-defaults-mode-node': 3.0.10 + '@smithy/util-defaults-mode-browser': 3.0.9 + '@smithy/util-defaults-mode-node': 3.0.9 '@smithy/util-endpoints': 2.0.5 '@smithy/util-middleware': 3.0.3 '@smithy/util-retry': 3.0.3 @@ -1976,10 +2056,10 @@ packages: resolution: {integrity: sha512-BUuS5/1YkgmKc4J0bg83XEtMyDHVyqG2QDzfmhYe8gbOIZabUl1FlrFVwhCAthtrrI6MPGTQcERB4BtJKUSplw==} engines: {node: '>=16.0.0'} dependencies: - '@smithy/core': 2.2.7 - '@smithy/protocol-http': 4.0.4 + '@smithy/core': 2.2.6 + '@smithy/protocol-http': 4.0.3 '@smithy/signature-v4': 3.1.2 - '@smithy/smithy-client': 3.1.8 + '@smithy/smithy-client': 3.1.7 '@smithy/types': 3.3.0 fast-xml-parser: 4.2.5 tslib: 2.6.3 @@ -2010,13 +2090,13 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@aws-sdk/types': 3.609.0 - '@smithy/fetch-http-handler': 3.2.2 - '@smithy/node-http-handler': 3.1.3 + '@smithy/fetch-http-handler': 3.2.1 + '@smithy/node-http-handler': 3.1.2 '@smithy/property-provider': 3.1.3 - '@smithy/protocol-http': 4.0.4 - '@smithy/smithy-client': 3.1.8 + '@smithy/protocol-http': 4.0.3 + '@smithy/smithy-client': 3.1.7 '@smithy/types': 3.3.0 - '@smithy/util-stream': 3.1.0 + '@smithy/util-stream': 3.0.6 tslib: 2.6.3 /@aws-sdk/credential-provider-ini@3.614.0(@aws-sdk/client-sso-oidc@3.614.0)(@aws-sdk/client-sts@3.614.0): @@ -2132,7 +2212,7 @@ packages: '@aws-sdk/client-s3': 3.614.0 '@smithy/abort-controller': 3.1.1 '@smithy/middleware-endpoint': 3.0.5 - '@smithy/smithy-client': 3.1.8 + '@smithy/smithy-client': 3.1.7 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 @@ -2145,7 +2225,7 @@ packages: '@aws-sdk/types': 3.609.0 '@aws-sdk/util-arn-parser': 3.568.0 '@smithy/node-config-provider': 3.1.4 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.0.3 '@smithy/types': 3.3.0 '@smithy/util-config-provider': 3.0.0 tslib: 2.6.3 @@ -2155,7 +2235,7 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@aws-sdk/types': 3.609.0 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.0.3 '@smithy/types': 3.3.0 tslib: 2.6.3 @@ -2167,7 +2247,7 @@ packages: '@aws-crypto/crc32c': 5.2.0 '@aws-sdk/types': 3.609.0 '@smithy/is-array-buffer': 3.0.0 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.0.3 '@smithy/types': 3.3.0 '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 @@ -2177,7 +2257,7 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@aws-sdk/types': 3.609.0 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.0.3 '@smithy/types': 3.3.0 tslib: 2.6.3 @@ -2202,7 +2282,7 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@aws-sdk/types': 3.609.0 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.0.3 '@smithy/types': 3.3.0 tslib: 2.6.3 @@ -2213,9 +2293,9 @@ packages: '@aws-sdk/types': 3.609.0 '@aws-sdk/util-arn-parser': 3.568.0 '@smithy/node-config-provider': 3.1.4 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.0.3 '@smithy/signature-v4': 3.1.2 - '@smithy/smithy-client': 3.1.8 + '@smithy/smithy-client': 3.1.7 '@smithy/types': 3.3.0 '@smithy/util-config-provider': 3.0.0 tslib: 2.6.3 @@ -2226,7 +2306,7 @@ packages: dependencies: '@aws-sdk/types': 3.609.0 '@smithy/property-provider': 3.1.3 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.0.3 '@smithy/signature-v4': 3.1.2 '@smithy/types': 3.3.0 '@smithy/util-middleware': 3.0.3 @@ -2246,7 +2326,7 @@ packages: dependencies: '@aws-sdk/types': 3.609.0 '@aws-sdk/util-endpoints': 3.614.0 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.0.3 '@smithy/types': 3.3.0 tslib: 2.6.3 @@ -2267,7 +2347,7 @@ packages: dependencies: '@aws-sdk/middleware-sdk-s3': 3.614.0 '@aws-sdk/types': 3.609.0 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.0.3 '@smithy/signature-v4': 3.1.2 '@smithy/types': 3.3.0 tslib: 2.6.3 @@ -2468,14 +2548,14 @@ packages: transitivePeerDependencies: - supports-color - /@babel/cli@7.24.8(@babel/core@7.24.9): - resolution: {integrity: sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg==} + /@babel/cli@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-8dfPprJgV4O14WTx+AQyEA+opgUKPrsIXX/MdL50J1n06EQJ6m1T+CdsJe0qEC0B/Xl85i+Un5KVAxd/PACX9A==} engines: {node: '>=6.9.0'} hasBin: true peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@jridgewell/trace-mapping': 0.3.25 commander: 6.2.1 convert-source-map: 2.0.0 @@ -2495,24 +2575,24 @@ packages: '@babel/highlight': 7.24.7 picocolors: 1.0.1 - /@babel/compat-data@7.24.9: - resolution: {integrity: sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==} + /@babel/compat-data@7.24.7: + resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} engines: {node: '>=6.9.0'} - /@babel/core@7.24.9: - resolution: {integrity: sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==} + /@babel/core@7.24.7: + resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.10 - '@babel/helper-compilation-targets': 7.24.8 - '@babel/helper-module-transforms': 7.24.9(@babel/core@7.24.9) - '@babel/helpers': 7.24.8 - '@babel/parser': 7.24.8 + '@babel/generator': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helpers': 7.24.7 + '@babel/parser': 7.24.7 '@babel/template': 7.24.7 - '@babel/traverse': 7.24.8 - '@babel/types': 7.24.9 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 convert-source-map: 2.0.0 debug: 4.3.5(supports-color@5.5.0) gensync: 1.0.0-beta.2 @@ -2524,17 +2604,17 @@ packages: /@babel/generator@7.2.0: resolution: {integrity: sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==} dependencies: - '@babel/types': 7.24.9 + '@babel/types': 7.24.7 jsesc: 2.5.2 lodash: 4.17.21 source-map: 0.5.7 trim-right: 1.0.1 - /@babel/generator@7.24.10: - resolution: {integrity: sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==} + /@babel/generator@7.24.7: + resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.9 + '@babel/types': 7.24.7 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 @@ -2543,42 +2623,42 @@ packages: resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.9 + '@babel/types': 7.24.7 dev: true /@babel/helper-builder-binary-assignment-operator-visitor@7.24.7: resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.24.8 - '@babel/types': 7.24.9 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-compilation-targets@7.24.8: - resolution: {integrity: sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==} + /@babel/helper-compilation-targets@7.24.7: + resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.24.9 - '@babel/helper-validator-option': 7.24.8 + '@babel/compat-data': 7.24.7 + '@babel/helper-validator-option': 7.24.7 browserslist: 4.23.2 lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.24.8(@babel/core@7.24.9): - resolution: {integrity: sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA==} + /@babel/helper-create-class-features-plugin@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-function-name': 7.24.7 - '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-member-expression-to-functions': 7.24.7 '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.9) + '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7) '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 '@babel/helper-split-export-declaration': 7.24.7 semver: 6.3.1 @@ -2586,26 +2666,26 @@ packages: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin@7.24.7(@babel/core@7.24.9): + /@babel/helper-create-regexp-features-plugin@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.24.7 regexpu-core: 5.3.2 semver: 6.3.1 dev: true - /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.9): + /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.7): resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-compilation-targets': 7.24.8 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 debug: 4.3.5(supports-color@5.5.0) lodash.debounce: 4.0.8 resolve: 1.22.8 @@ -2617,27 +2697,27 @@ packages: resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.9 + '@babel/types': 7.24.7 /@babel/helper-function-name@7.24.7: resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.24.7 - '@babel/types': 7.24.9 + '@babel/types': 7.24.7 /@babel/helper-hoist-variables@7.24.7: resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.9 + '@babel/types': 7.24.7 - /@babel/helper-member-expression-to-functions@7.24.8: - resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} + /@babel/helper-member-expression-to-functions@7.24.7: + resolution: {integrity: sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.24.8 - '@babel/types': 7.24.9 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color dev: true @@ -2646,18 +2726,18 @@ packages: resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.24.8 - '@babel/types': 7.24.9 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms@7.24.9(@babel/core@7.24.9): - resolution: {integrity: sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==} + /@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-module-imports': 7.24.7 '@babel/helper-simple-access': 7.24.7 @@ -2670,20 +2750,20 @@ packages: resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.9 + '@babel/types': 7.24.7 dev: true - /@babel/helper-plugin-utils@7.24.8: - resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + /@babel/helper-plugin-utils@7.24.7: + resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator@7.24.7(@babel/core@7.24.9): + /@babel/helper-remap-async-to-generator@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-wrap-function': 7.24.7 @@ -2691,15 +2771,15 @@ packages: - supports-color dev: true - /@babel/helper-replace-supers@7.24.7(@babel/core@7.24.9): + /@babel/helper-replace-supers@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-member-expression-to-functions': 7.24.7 '@babel/helper-optimise-call-expression': 7.24.7 transitivePeerDependencies: - supports-color @@ -2709,8 +2789,8 @@ packages: resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.24.8 - '@babel/types': 7.24.9 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color @@ -2718,8 +2798,8 @@ packages: resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.24.8 - '@babel/types': 7.24.9 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color dev: true @@ -2728,18 +2808,18 @@ packages: resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.9 + '@babel/types': 7.24.7 - /@babel/helper-string-parser@7.24.8: - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + /@babel/helper-string-parser@7.24.7: + resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} engines: {node: '>=6.9.0'} /@babel/helper-validator-identifier@7.24.7: resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.24.8: - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + /@babel/helper-validator-option@7.24.7: + resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} engines: {node: '>=6.9.0'} /@babel/helper-wrap-function@7.24.7: @@ -2748,18 +2828,18 @@ packages: dependencies: '@babel/helper-function-name': 7.24.7 '@babel/template': 7.24.7 - '@babel/traverse': 7.24.8 - '@babel/types': 7.24.9 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/helpers@7.24.8: - resolution: {integrity: sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==} + /@babel/helpers@7.24.7: + resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.24.7 - '@babel/types': 7.24.9 + '@babel/types': 7.24.7 /@babel/highlight@7.24.7: resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} @@ -2770,1011 +2850,1011 @@ packages: js-tokens: 4.0.0 picocolors: 1.0.1 - /@babel/parser@7.24.8: - resolution: {integrity: sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==} + /@babel/parser@7.24.7: + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.24.9 + '@babel/types': 7.24.7 - /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7(@babel/core@7.24.9): + /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.7(@babel/core@7.24.9): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.24.9): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.24.9) + '@babel/plugin-transform-optional-chaining': 7.24.7(@babel/core@7.24.7) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.7(@babel/core@7.24.9): + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.9): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.7): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.9): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.9): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.9): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.7): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.24.9): + /@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.24.9): + /@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.9): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.9): + /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.9): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.9): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.9): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.7): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.9): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - /@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.9): + /@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.9): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.7): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.9) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-async-generator-functions@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-async-generator-functions@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-remap-async-to-generator': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-remap-async-to-generator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@babel/helper-module-imports': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-remap-async-to-generator': 7.24.7(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-remap-async-to-generator': 7.24.7(@babel/core@7.24.7) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-block-scoping@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-block-scoping@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-class-features-plugin': 7.24.8(@babel/core@7.24.9) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-class-features-plugin': 7.24.8(@babel/core@7.24.9) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.9) + '@babel/core': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-classes@7.24.8(@babel/core@7.24.9): - resolution: {integrity: sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA==} + /@babel/plugin-transform-classes@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-compilation-targets': 7.24.8 + '@babel/helper-compilation-targets': 7.24.7 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-function-name': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.9) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7) '@babel/helper-split-export-declaration': 7.24.7 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 '@babel/template': 7.24.7 dev: true - /@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.24.9): - resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==} + /@babel/plugin-transform-destructuring@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.9) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.9) + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7) dev: true - /@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.9) + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7) dev: true - /@babel/plugin-transform-for-of@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-for-of@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-function-name@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-function-name@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-compilation-targets': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 '@babel/helper-function-name': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.9) + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) dev: true - /@babel/plugin-transform-literals@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-literals@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.9) + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) dev: true - /@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-module-transforms': 7.24.9(@babel/core@7.24.9) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.24.9): - resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} + /@babel/plugin-transform-modules-commonjs@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-module-transforms': 7.24.9(@babel/core@7.24.9) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-simple-access': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-modules-systemjs@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@babel/helper-hoist-variables': 7.24.7 - '@babel/helper-module-transforms': 7.24.9(@babel/core@7.24.9) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-module-transforms': 7.24.9(@babel/core@7.24.9) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.9) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-new-target@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-new-target@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.9) + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) dev: true - /@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.9) + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) dev: true - /@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-compilation-targets': 7.24.8 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.9) + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.7) dev: true - /@babel/plugin-transform-object-super@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-object-super@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.9) + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.7) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.9) + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) dev: true - /@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.24.9): - resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==} + /@babel/plugin-transform-optional-chaining@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-parameters@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-parameters@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-class-features-plugin': 7.24.8(@babel/core@7.24.9) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.24.8(@babel/core@7.24.9) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.9) + '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.24.9) + '@babel/core': 7.24.7 + '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.24.7) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-module-imports': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.9) - '@babel/types': 7.24.9 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-react-pure-annotations@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-react-pure-annotations@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-spread@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-spread@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.24.9): - resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==} + /@babel/plugin-transform-typeof-symbol@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-typescript@7.24.8(@babel/core@7.24.9): - resolution: {integrity: sha512-CgFgtN61BbdOGCP4fLaAMOPkzWUh6yQZNMr5YSt8uz2cZSSiQONCQFWqsE4NeVfOIhqDOlS9CR3WD91FzMeB2Q==} + /@babel/plugin-transform-typescript@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.24.8(@babel/core@7.24.9) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.9) + '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.9) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.9) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.9) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/preset-env@7.24.8(@babel/core@7.24.9): - resolution: {integrity: sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ==} + /@babel/preset-env@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.24.9 - '@babel/core': 7.24.9 - '@babel/helper-compilation-targets': 7.24.8 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.9) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.9) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.9) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.9) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.9) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.9) - '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-async-generator-functions': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-block-scoping': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-classes': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-function-name': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-literals': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-modules-systemjs': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.24.9) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.9) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.9) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.9) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.9) + '@babel/compat-data': 7.24.7 + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.7) + '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-async-generator-functions': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-block-scoping': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-classes': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-destructuring': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-function-name': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-literals': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-commonjs': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-systemjs': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-optional-chaining': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-typeof-symbol': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.24.7) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.7) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.7) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.7) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.7) core-js-compat: 3.37.1 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.9): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.7): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/types': 7.24.9 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/types': 7.24.7 esutils: 2.0.3 dev: true - /@babel/preset-react@7.24.7(@babel/core@7.24.9): + /@babel/preset-react@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-react-pure-annotations': 7.24.7(@babel/core@7.24.9) + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-react-pure-annotations': 7.24.7(@babel/core@7.24.7) transitivePeerDependencies: - supports-color dev: true - /@babel/preset-typescript@7.24.7(@babel/core@7.24.9): + /@babel/preset-typescript@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-typescript': 7.24.8(@babel/core@7.24.9) + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-commonjs': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-typescript': 7.24.7(@babel/core@7.24.7) transitivePeerDependencies: - supports-color dev: true @@ -3783,8 +3863,8 @@ packages: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true - /@babel/runtime@7.24.8: - resolution: {integrity: sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==} + /@babel/runtime@7.24.7: + resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.1 @@ -3794,31 +3874,31 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.7 - '@babel/parser': 7.24.8 - '@babel/types': 7.24.9 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 - /@babel/traverse@7.24.8: - resolution: {integrity: sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==} + /@babel/traverse@7.24.7: + resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.10 + '@babel/generator': 7.24.7 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-function-name': 7.24.7 '@babel/helper-hoist-variables': 7.24.7 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.24.8 - '@babel/types': 7.24.9 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 debug: 4.3.5(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color - /@babel/types@7.24.9: - resolution: {integrity: sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==} + /@babel/types@7.24.7: + resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.24.8 + '@babel/helper-string-parser': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 @@ -3907,6 +3987,7 @@ packages: resolution: {integrity: sha512-c5Hkm7MmQC2n5qAsKShjQrHoqlfGslB8+qWzsGGZ+2dHMRTNG60UuzalF0h0rvBax5uzPXuGkYLGaQ+TUX3yMw==} dependencies: superjson: 2.2.1 + dev: false /@effect/schema@0.68.12(effect@3.4.5): resolution: {integrity: sha512-UWJsFXzeYTBQYnftwI1KR2uaxIZ8fk+kffDS7BnJwnGjPPgODq3/AzeoBDSu1MAlnwBKOz+QRdMuSMxrT/pHig==} @@ -3914,7 +3995,7 @@ packages: effect: ^3.4.5 dependencies: effect: 3.4.5 - fast-check: 3.20.0 + fast-check: 3.19.0 /@emnapi/runtime@1.2.0: resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} @@ -3927,7 +4008,7 @@ packages: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: '@babel/helper-module-imports': 7.24.7 - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.24.7 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/serialize': 1.1.4 @@ -3980,7 +4061,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.24.7 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.4 @@ -4033,12 +4114,14 @@ packages: dependencies: esbuild: 0.18.20 source-map-support: 0.5.21 + dev: false /@esbuild-kit/esm-loader@2.6.5: resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} dependencies: '@esbuild-kit/core-utils': 3.3.2 get-tsconfig: 4.7.5 + dev: false /@esbuild/aix-ppc64@0.19.12: resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} @@ -4046,6 +4129,7 @@ packages: cpu: [ppc64] os: [aix] requiresBuild: true + dev: false optional: true /@esbuild/aix-ppc64@0.21.5: @@ -4072,6 +4156,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true + dev: false optional: true /@esbuild/android-arm64@0.19.12: @@ -4080,6 +4165,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true + dev: false optional: true /@esbuild/android-arm64@0.21.5: @@ -4106,6 +4192,7 @@ packages: cpu: [arm] os: [android] requiresBuild: true + dev: false optional: true /@esbuild/android-arm@0.19.12: @@ -4114,6 +4201,7 @@ packages: cpu: [arm] os: [android] requiresBuild: true + dev: false optional: true /@esbuild/android-arm@0.21.5: @@ -4140,6 +4228,7 @@ packages: cpu: [x64] os: [android] requiresBuild: true + dev: false optional: true /@esbuild/android-x64@0.19.12: @@ -4148,6 +4237,7 @@ packages: cpu: [x64] os: [android] requiresBuild: true + dev: false optional: true /@esbuild/android-x64@0.21.5: @@ -4174,6 +4264,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true + dev: false optional: true /@esbuild/darwin-arm64@0.19.12: @@ -4182,6 +4273,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true + dev: false optional: true /@esbuild/darwin-arm64@0.21.5: @@ -4208,6 +4300,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true + dev: false optional: true /@esbuild/darwin-x64@0.19.12: @@ -4216,6 +4309,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true + dev: false optional: true /@esbuild/darwin-x64@0.21.5: @@ -4242,6 +4336,7 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true + dev: false optional: true /@esbuild/freebsd-arm64@0.19.12: @@ -4250,6 +4345,7 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true + dev: false optional: true /@esbuild/freebsd-arm64@0.21.5: @@ -4276,6 +4372,7 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true + dev: false optional: true /@esbuild/freebsd-x64@0.19.12: @@ -4284,6 +4381,7 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true + dev: false optional: true /@esbuild/freebsd-x64@0.21.5: @@ -4310,6 +4408,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-arm64@0.19.12: @@ -4318,6 +4417,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-arm64@0.21.5: @@ -4344,6 +4444,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-arm@0.19.12: @@ -4352,6 +4453,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-arm@0.21.5: @@ -4378,6 +4480,7 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-ia32@0.19.12: @@ -4386,6 +4489,7 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-ia32@0.21.5: @@ -4412,6 +4516,7 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-loong64@0.19.12: @@ -4420,6 +4525,7 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-loong64@0.21.5: @@ -4446,6 +4552,7 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-mips64el@0.19.12: @@ -4454,6 +4561,7 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-mips64el@0.21.5: @@ -4480,6 +4588,7 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-ppc64@0.19.12: @@ -4488,6 +4597,7 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-ppc64@0.21.5: @@ -4514,6 +4624,7 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-riscv64@0.19.12: @@ -4522,6 +4633,7 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-riscv64@0.21.5: @@ -4548,6 +4660,7 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-s390x@0.19.12: @@ -4556,6 +4669,7 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-s390x@0.21.5: @@ -4582,6 +4696,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-x64@0.19.12: @@ -4590,6 +4705,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: false optional: true /@esbuild/linux-x64@0.21.5: @@ -4616,6 +4732,7 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true + dev: false optional: true /@esbuild/netbsd-x64@0.19.12: @@ -4624,6 +4741,7 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true + dev: false optional: true /@esbuild/netbsd-x64@0.21.5: @@ -4659,6 +4777,7 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true + dev: false optional: true /@esbuild/openbsd-x64@0.19.12: @@ -4667,6 +4786,7 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true + dev: false optional: true /@esbuild/openbsd-x64@0.21.5: @@ -4693,6 +4813,7 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true + dev: false optional: true /@esbuild/sunos-x64@0.19.12: @@ -4701,6 +4822,7 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true + dev: false optional: true /@esbuild/sunos-x64@0.21.5: @@ -4727,6 +4849,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true + dev: false optional: true /@esbuild/win32-arm64@0.19.12: @@ -4735,6 +4858,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true + dev: false optional: true /@esbuild/win32-arm64@0.21.5: @@ -4761,6 +4885,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true + dev: false optional: true /@esbuild/win32-ia32@0.19.12: @@ -4769,6 +4894,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true + dev: false optional: true /@esbuild/win32-ia32@0.21.5: @@ -4795,6 +4921,7 @@ packages: cpu: [x64] os: [win32] requiresBuild: true + dev: false optional: true /@esbuild/win32-x64@0.19.12: @@ -4803,6 +4930,7 @@ packages: cpu: [x64] os: [win32] requiresBuild: true + dev: false optional: true /@esbuild/win32-x64@0.21.5: @@ -4842,9 +4970,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) '@eslint-react/tools': 1.5.25-next.4 '@eslint-react/types': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.16.0 + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) transitivePeerDependencies: - eslint - supports-color @@ -4860,10 +4988,10 @@ packages: '@eslint-react/tools': 1.5.25-next.4 '@eslint-react/types': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) '@eslint-react/var': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/type-utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.16.0 + '@typescript-eslint/type-utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) transitivePeerDependencies: - eslint - supports-color @@ -4883,10 +5011,10 @@ packages: '@eslint-react/shared': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) '@eslint-react/tools': 1.5.25-next.4 '@eslint-react/types': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/type-utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.16.0 + '@typescript-eslint/type-utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) eslint: 9.6.0 eslint-plugin-react-debug: 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) eslint-plugin-react-dom: 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) @@ -4905,9 +5033,9 @@ packages: '@eslint-react/tools': 1.5.25-next.4 '@eslint-react/types': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) '@eslint-react/var': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.16.0 + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) transitivePeerDependencies: - eslint - supports-color @@ -4917,7 +5045,7 @@ packages: /@eslint-react/shared@1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3): resolution: {integrity: sha512-2QeA5AuM7HVmZ1Zd5QP8idrNcv5a+dcgT43CFuNFkpMBXlcYluiE/kb/m8YXCkFavCWsAV1df8QEvh9XHD3FdQ==} dependencies: - '@typescript-eslint/utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) valibot: 0.36.0 transitivePeerDependencies: - eslint @@ -4933,8 +5061,8 @@ packages: resolution: {integrity: sha512-XwIs8nfGg3MoohJmw9+TM0DXHNVMhufmqc9YsLgPcbZ3DNBkTiuEbdoZlMbhvzYyxcIy2ocVqc+gIu03xlN8dw==} dependencies: '@eslint-react/tools': 1.5.25-next.4 - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) transitivePeerDependencies: - eslint - supports-color @@ -4947,9 +5075,9 @@ packages: '@eslint-react/ast': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) '@eslint-react/tools': 1.5.25-next.4 '@eslint-react/types': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.16.0 + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) transitivePeerDependencies: - eslint - supports-color @@ -5078,8 +5206,8 @@ packages: resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} engines: {node: '>=14'} - /@google-cloud/storage@7.12.0: - resolution: {integrity: sha512-122Ui67bhnf8MkRnxQAC5lf7wPGkPP5hL3+J5s9HHDw2J9RpaMmnV8iahn+RUn9BH70W6uRe6nMZLXiRaJM/3g==} + /@google-cloud/storage@7.11.3: + resolution: {integrity: sha512-dFAR/IRENn+ZTTwBbMgoBGSrPrqNKoCEIjG7Wmq2+IpmyyjDk5BLip9HG9TUdMVRRP6xOQFrkEr7zIY1ZsoTSQ==} engines: {node: '>=14'} dependencies: '@google-cloud/paginator': 5.0.2 @@ -5494,7 +5622,7 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -5761,20 +5889,19 @@ packages: yjs: 13.6.18 dev: false - /@libsql/client@0.5.6: - resolution: {integrity: sha512-UBjmDoxz75Z2sHdP+ETCROpeLA/77VMesiff8R4UWK1rnaWbh6/YoCLDILMJL3Rh0udQeKxjL8MjXthqohax+g==} + /@libsql/client@0.6.2: + resolution: {integrity: sha512-xRNfRLv/dOCbV4qd+M0baQwGmvuZpMd2wG2UAPs8XmcdaPvu5ErkcaeITkxlm3hDEJVabQM1cFhMBxsugWW9fQ==} dependencies: - '@libsql/core': 0.5.6 - '@libsql/hrana-client': 0.5.6 + '@libsql/core': 0.6.2 + '@libsql/hrana-client': 0.6.2 js-base64: 3.7.7 libsql: 0.3.19 transitivePeerDependencies: - bufferutil - - encoding - utf-8-validate - /@libsql/core@0.5.6: - resolution: {integrity: sha512-3vicUAydq6jPth410n4AsHHm1n2psTwvkSf94nfJlSXutGSZsl0updn2N/mJBgqUHkbuFoWZtlMifF0SwBj1xQ==} + /@libsql/core@0.6.2: + resolution: {integrity: sha512-c2P4M+4u/4b2L02A0KjggO3UW51rGkhxr/7fzJO0fEAqsqrWGxuNj2YtRkina/oxfYvAof6xjp8RucNoIV/Odw==} dependencies: js-base64: 3.7.7 @@ -5792,30 +5919,24 @@ packages: requiresBuild: true optional: true - /@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==} dependencies: - '@libsql/isomorphic-fetch': 0.1.12 + '@libsql/isomorphic-fetch': 0.2.1 '@libsql/isomorphic-ws': 0.1.5 js-base64: 3.7.7 node-fetch: 3.3.2 transitivePeerDependencies: - bufferutil - - encoding - utf-8-validate - /@libsql/isomorphic-fetch@0.1.12: - resolution: {integrity: sha512-MRo4UcmjAGAa3ac56LoD5OE13m2p0lu0VEtZC2NZMcogM/jc5fU9YtMQ3qbPjFJ+u2BBjFZgMPkQaLS1dlMhpg==} - dependencies: - '@types/node-fetch': 2.6.11 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding + /@libsql/isomorphic-fetch@0.2.1: + resolution: {integrity: sha512-Sv07QP1Aw8A5OOrmKgRUBKe2fFhF2hpGJhtHe3d1aRnTESZCGkn//0zDycMKTGamVWb3oLYRroOsCV8Ukes9GA==} /@libsql/isomorphic-ws@0.1.5: resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} dependencies: - '@types/ws': 8.5.11 + '@types/ws': 8.5.10 ws: 8.18.0 transitivePeerDependencies: - bufferutil @@ -6216,15 +6337,15 @@ packages: '@smithy/util-middleware': 3.0.3 tslib: 2.6.3 - /@smithy/core@2.2.7: - resolution: {integrity: sha512-Wwd9QWKaYdR+n/oIqJbuwSr9lHuv7sa1e3Zu4wIToZl0sS7xapTYYqQtXP1hKKtIWz0jl8AhvOfNwkfT5jjV0w==} + /@smithy/core@2.2.6: + resolution: {integrity: sha512-tBbVIv/ui7/lLTKayYJJvi8JLVL2SwOQTbNFEOrvzSE3ktByvsa1erwBOnAMo8N5Vu30g7lN4lLStrU75oDGuw==} engines: {node: '>=16.0.0'} dependencies: '@smithy/middleware-endpoint': 3.0.5 - '@smithy/middleware-retry': 3.0.10 + '@smithy/middleware-retry': 3.0.9 '@smithy/middleware-serde': 3.0.3 - '@smithy/protocol-http': 4.0.4 - '@smithy/smithy-client': 3.1.8 + '@smithy/protocol-http': 4.0.3 + '@smithy/smithy-client': 3.1.7 '@smithy/types': 3.3.0 '@smithy/util-middleware': 3.0.3 tslib: 2.6.3 @@ -6278,10 +6399,10 @@ packages: '@smithy/types': 3.3.0 tslib: 2.6.3 - /@smithy/fetch-http-handler@3.2.2: - resolution: {integrity: sha512-3LaWlBZObyGrOOd7e5MlacnAKEwFBmAeiW/TOj2eR9475Vnq30uS2510+tnKbxrGjROfNdOhQqGo5j3sqLT6bA==} + /@smithy/fetch-http-handler@3.2.1: + resolution: {integrity: sha512-0w0bgUvZmfa0vHN8a+moByhCJT07WN6AHKEhFSOLsDpnszm+5dLVv5utGaqbhOrZ/aF5x3xuPMs/oMCd+4O5xg==} dependencies: - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.0.3 '@smithy/querystring-builder': 3.0.3 '@smithy/types': 3.3.0 '@smithy/util-base64': 3.0.0 @@ -6337,11 +6458,11 @@ packages: '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 - /@smithy/middleware-content-length@3.0.4: - resolution: {integrity: sha512-wySGje/KfhsnF8YSh9hP16pZcl3C+X6zRsvSfItQGvCyte92LliilU3SD0nR7kTlxnAJwxY8vE/k4Eoezj847Q==} + /@smithy/middleware-content-length@3.0.3: + resolution: {integrity: sha512-Dbz2bzexReYIQDWMr+gZhpwBetNXzbhnEMhYKA6urqmojO14CsXjnsoPYO8UL/xxcawn8ZsuVU61ElkLSltIUQ==} engines: {node: '>=16.0.0'} dependencies: - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.0.3 '@smithy/types': 3.3.0 tslib: 2.6.3 @@ -6357,14 +6478,14 @@ packages: '@smithy/util-middleware': 3.0.3 tslib: 2.6.3 - /@smithy/middleware-retry@3.0.10: - resolution: {integrity: sha512-+6ibpv6jpkTNJS6yErQSEjbxCWf1/jMeUSlpSlUiTYf73LGR9riSRlIrL1+JEW0eEpb6MelQ04BIc38aj8GtxQ==} + /@smithy/middleware-retry@3.0.9: + resolution: {integrity: sha512-Mrv9omExU1gA7Y0VEJG2LieGfPYtwwcEiOnVGZ54a37NEMr66TJ0glFslOJFuKWG6izg5DpKIUmDV9rRxjm47Q==} engines: {node: '>=16.0.0'} dependencies: '@smithy/node-config-provider': 3.1.4 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.0.3 '@smithy/service-error-classification': 3.0.3 - '@smithy/smithy-client': 3.1.8 + '@smithy/smithy-client': 3.1.7 '@smithy/types': 3.3.0 '@smithy/util-middleware': 3.0.3 '@smithy/util-retry': 3.0.3 @@ -6394,12 +6515,12 @@ packages: '@smithy/types': 3.3.0 tslib: 2.6.3 - /@smithy/node-http-handler@3.1.3: - resolution: {integrity: sha512-UiKZm8KHb/JeOPzHZtRUfyaRDO1KPKPpsd7iplhiwVGOeVdkiVJ5bVe7+NhWREMOKomrDIDdSZyglvMothLg0Q==} + /@smithy/node-http-handler@3.1.2: + resolution: {integrity: sha512-Td3rUNI7qqtoSLTsJBtsyfoG4cF/XMFmJr6Z2dX8QNzIi6tIW6YmuyFml8mJ2cNpyWNqITKbROMOFrvQjmsOvw==} engines: {node: '>=16.0.0'} dependencies: '@smithy/abort-controller': 3.1.1 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.0.3 '@smithy/querystring-builder': 3.0.3 '@smithy/types': 3.3.0 tslib: 2.6.3 @@ -6411,8 +6532,8 @@ packages: '@smithy/types': 3.3.0 tslib: 2.6.3 - /@smithy/protocol-http@4.0.4: - resolution: {integrity: sha512-fAA2O4EFyNRyYdFLVIv5xMMeRb+3fRKc/Rt2flh5k831vLvUmNFXcydeg7V3UeEhGURJI4c1asmGJBjvmF6j8Q==} + /@smithy/protocol-http@4.0.3: + resolution: {integrity: sha512-x5jmrCWwQlx+Zv4jAtc33ijJ+vqqYN+c/ZkrnpvEe/uDas7AT7A/4Rc2CdfxgWv4WFGmEqODIrrUToPN6DDkGw==} engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.3.0 @@ -6458,15 +6579,15 @@ packages: '@smithy/util-utf8': 3.0.0 tslib: 2.6.3 - /@smithy/smithy-client@3.1.8: - resolution: {integrity: sha512-nUNGCa0NgvtD0eM45732EBp1H9JQITChMBegGtPRhJD00v3hiFF6tibiOihcYwP5mbp9Kui+sOCl86rDT/Ew2w==} + /@smithy/smithy-client@3.1.7: + resolution: {integrity: sha512-nZbJZB0XI3YnaFBWGDBr7kjaew6O0oNYNmopyIz6gKZEbxzrtH7rwvU1GcVxcSFoOwWecLJEe79fxEMljHopFQ==} engines: {node: '>=16.0.0'} dependencies: '@smithy/middleware-endpoint': 3.0.5 '@smithy/middleware-stack': 3.0.3 - '@smithy/protocol-http': 4.0.4 + '@smithy/protocol-http': 4.0.3 '@smithy/types': 3.3.0 - '@smithy/util-stream': 3.1.0 + '@smithy/util-stream': 3.0.6 tslib: 2.6.3 /@smithy/types@3.3.0: @@ -6521,25 +6642,25 @@ packages: dependencies: tslib: 2.6.3 - /@smithy/util-defaults-mode-browser@3.0.10: - resolution: {integrity: sha512-WgaNxh33md2zvlD+1TSceVmM7DIy7qYMtuhOat+HYoTntsg0QTbNvoB/5DRxEwSpN84zKf9O34yqzRRtxJZgFg==} + /@smithy/util-defaults-mode-browser@3.0.9: + resolution: {integrity: sha512-WKPcElz92MAQG09miBdb0GxEH/MwD5GfE8g07WokITq5g6J1ROQfYCKC1wNnkqAGfrSywT7L0rdvvqlBplqiyA==} engines: {node: '>= 10.0.0'} dependencies: '@smithy/property-provider': 3.1.3 - '@smithy/smithy-client': 3.1.8 + '@smithy/smithy-client': 3.1.7 '@smithy/types': 3.3.0 bowser: 2.11.0 tslib: 2.6.3 - /@smithy/util-defaults-mode-node@3.0.10: - resolution: {integrity: sha512-3x/pcNIFyaAEQqXc3qnQsCFLlTz/Mwsfl9ciEPU56/Dk/g1kTFjkzyLbUNJaeOo5HT01VrpJBKrBuN94qbPm9A==} + /@smithy/util-defaults-mode-node@3.0.9: + resolution: {integrity: sha512-dQLrUqFxqpf0GvEKEuFdgXcdZwz6oFm752h4d6C7lQz+RLddf761L2r7dSwGWzESMMB3wKj0jL+skRhEGlecjw==} engines: {node: '>= 10.0.0'} dependencies: '@smithy/config-resolver': 3.0.5 '@smithy/credential-provider-imds': 3.1.4 '@smithy/node-config-provider': 3.1.4 '@smithy/property-provider': 3.1.3 - '@smithy/smithy-client': 3.1.8 + '@smithy/smithy-client': 3.1.7 '@smithy/types': 3.3.0 tslib: 2.6.3 @@ -6572,12 +6693,12 @@ packages: '@smithy/types': 3.3.0 tslib: 2.6.3 - /@smithy/util-stream@3.1.0: - resolution: {integrity: sha512-QEMvyv58QIptWA8cpQPbHagJOAlrbCt3ueB9EShwdFfVMYAviXdVtksszQQq+o+dv5dalUMWUbUHUDSJgkF9xg==} + /@smithy/util-stream@3.0.6: + resolution: {integrity: sha512-w9i//7egejAIvplX821rPWWgaiY1dxsQUw0hXX7qwa/uZ9U3zplqTQ871jWadkcVB9gFDhkPWYVZf4yfFbZ0xA==} engines: {node: '>=16.0.0'} dependencies: - '@smithy/fetch-http-handler': 3.2.2 - '@smithy/node-http-handler': 3.1.3 + '@smithy/fetch-http-handler': 3.2.1 + '@smithy/node-http-handler': 3.1.2 '@smithy/types': 3.3.0 '@smithy/util-base64': 3.0.0 '@smithy/util-buffer-from': 3.0.0 @@ -6649,7 +6770,7 @@ packages: fast-glob: 3.3.2 minimatch: 9.0.5 piscina: 4.6.1 - semver: 7.6.3 + semver: 7.6.2 slash: 3.0.0 source-map: 0.7.4 dev: true @@ -6800,8 +6921,8 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.24.8 - '@babel/types': 7.24.9 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 @@ -6809,18 +6930,18 @@ packages: /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.24.9 + '@babel/types': 7.24.7 /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.24.8 - '@babel/types': 7.24.9 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 /@types/babel__traverse@7.20.6: resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} dependencies: - '@babel/types': 7.24.9 + '@babel/types': 7.24.7 /@types/body-parser@1.19.5: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} @@ -7009,11 +7130,11 @@ packages: /@types/lodash.get@4.4.9: resolution: {integrity: sha512-J5dvW98sxmGnamqf+/aLP87PYXyrha9xIgc2ZlHl6OHMFR2Ejdxep50QfU0abO1+CH6+ugx+8wEUN1toImAinA==} dependencies: - '@types/lodash': 4.17.7 + '@types/lodash': 4.17.6 dev: true - /@types/lodash@4.17.7: - resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} + /@types/lodash@4.17.6: + resolution: {integrity: sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA==} /@types/mime@1.3.5: resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -7040,12 +7161,6 @@ packages: - supports-color dev: true - /@types/node-fetch@2.6.11: - resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} - dependencies: - '@types/node': 20.12.5 - form-data: 4.0.0 - /@types/node@20.12.5: resolution: {integrity: sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==} dependencies: @@ -7170,8 +7285,8 @@ packages: '@types/node': 20.12.5 '@types/webidl-conversions': 7.0.3 - /@types/ws@8.5.11: - resolution: {integrity: sha512-4+q7P5h3SpJxaBft0Dzpbr6lmMaqh0Jr2tbhJZ/luAwvD7ohSCniYkwz/pLxuT2h0EOa6QADgJj1Ko+TzRfZ+w==} + /@types/ws@8.5.10: + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} dependencies: '@types/node': 20.12.5 @@ -7244,14 +7359,6 @@ packages: '@typescript-eslint/visitor-keys': 7.16.0 dev: false - /@typescript-eslint/scope-manager@7.16.1: - resolution: {integrity: sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==} - engines: {node: ^18.18.0 || >=20.0.0} - dependencies: - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/visitor-keys': 7.16.1 - dev: false - /@typescript-eslint/type-utils@7.16.0(eslint@9.6.0)(typescript@5.5.3): resolution: {integrity: sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==} engines: {node: ^18.18.0 || >=20.0.0} @@ -7272,36 +7379,11 @@ packages: - supports-color dev: false - /@typescript-eslint/type-utils@7.16.1(eslint@9.6.0)(typescript@5.5.3): - resolution: {integrity: sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3) - '@typescript-eslint/utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) - debug: 4.3.5(supports-color@5.5.0) - eslint: 9.6.0 - ts-api-utils: 1.3.0(typescript@5.5.3) - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - dev: false - /@typescript-eslint/types@7.16.0: resolution: {integrity: sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==} engines: {node: ^18.18.0 || >=20.0.0} dev: false - /@typescript-eslint/types@7.16.1: - resolution: {integrity: sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==} - engines: {node: ^18.18.0 || >=20.0.0} - dev: false - /@typescript-eslint/typescript-estree@7.16.0(typescript@5.5.3): resolution: {integrity: sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -7317,29 +7399,7 @@ packages: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.3) - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/typescript-estree@7.16.1(typescript@5.5.3): - resolution: {integrity: sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/visitor-keys': 7.16.1 - debug: 4.3.5(supports-color@5.5.0) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 + semver: 7.6.2 ts-api-utils: 1.3.0(typescript@5.5.3) typescript: 5.5.3 transitivePeerDependencies: @@ -7362,22 +7422,6 @@ packages: - typescript dev: false - /@typescript-eslint/utils@7.16.1(eslint@9.6.0)(typescript@5.5.3): - resolution: {integrity: sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.3) - eslint: 9.6.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - /@typescript-eslint/visitor-keys@7.16.0: resolution: {integrity: sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==} engines: {node: ^18.18.0 || >=20.0.0} @@ -7386,14 +7430,6 @@ packages: eslint-visitor-keys: 3.4.3 dev: false - /@typescript-eslint/visitor-keys@7.16.1: - resolution: {integrity: sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==} - engines: {node: ^18.18.0 || >=20.0.0} - dependencies: - '@typescript-eslint/types': 7.16.1 - eslint-visitor-keys: 3.4.3 - dev: false - /@uploadthing/mime-types@0.2.10: resolution: {integrity: sha512-kz3F0oEgAyts25NAGXlUBCWh3mXonbSOQJFGFMawHuIgbUbnzXbe4w5WI+0XdneCbjNmikfWrdWrs8m/7HATfQ==} @@ -7413,78 +7449,78 @@ packages: is-buffer: 2.0.5 undici: 5.28.4 - /@vue/compiler-core@3.4.32: - resolution: {integrity: sha512-8tCVWkkLe/QCWIsrIvExUGnhYCAOroUs5dzhSoKL5w4MJS8uIYiou+pOPSVIOALOQ80B0jBs+Ri+kd5+MBnCDw==} + /@vue/compiler-core@3.4.31: + resolution: {integrity: sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==} dependencies: - '@babel/parser': 7.24.8 - '@vue/shared': 3.4.32 + '@babel/parser': 7.24.7 + '@vue/shared': 3.4.31 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.0 dev: true - /@vue/compiler-dom@3.4.32: - resolution: {integrity: sha512-PbSgt9KuYo4fyb90dynuPc0XFTfFPs3sCTbPLOLlo+PrUESW1gn/NjSsUvhR+mI2AmmEzexwYMxbHDldxSOr2A==} + /@vue/compiler-dom@3.4.31: + resolution: {integrity: sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==} dependencies: - '@vue/compiler-core': 3.4.32 - '@vue/shared': 3.4.32 + '@vue/compiler-core': 3.4.31 + '@vue/shared': 3.4.31 dev: true - /@vue/compiler-sfc@3.4.32: - resolution: {integrity: sha512-STy9im/WHfaguJnfKjjVpMHukxHUrOKjm2vVCxiojQJyo3Sb6Os8SMXBr/MI+ekpstEGkDONfqAQoSbZhspLYw==} + /@vue/compiler-sfc@3.4.31: + resolution: {integrity: sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==} dependencies: - '@babel/parser': 7.24.8 - '@vue/compiler-core': 3.4.32 - '@vue/compiler-dom': 3.4.32 - '@vue/compiler-ssr': 3.4.32 - '@vue/shared': 3.4.32 + '@babel/parser': 7.24.7 + '@vue/compiler-core': 3.4.31 + '@vue/compiler-dom': 3.4.31 + '@vue/compiler-ssr': 3.4.31 + '@vue/shared': 3.4.31 estree-walker: 2.0.2 magic-string: 0.30.10 postcss: 8.4.39 source-map-js: 1.2.0 dev: true - /@vue/compiler-ssr@3.4.32: - resolution: {integrity: sha512-nyu/txTecF6DrxLrpLcI34xutrvZPtHPBj9yRoPxstIquxeeyywXpYZrQMsIeDfBhlw1abJb9CbbyZvDw2kjdg==} + /@vue/compiler-ssr@3.4.31: + resolution: {integrity: sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==} dependencies: - '@vue/compiler-dom': 3.4.32 - '@vue/shared': 3.4.32 + '@vue/compiler-dom': 3.4.31 + '@vue/shared': 3.4.31 dev: true - /@vue/reactivity@3.4.32: - resolution: {integrity: sha512-1P7QvghAzhSIWmiNmh4MNkLVjr2QTNDcFv2sKmytEWhR6t7BZzNicgm5ENER4uU++wbWxgRh/pSEYgdI3MDcvg==} + /@vue/reactivity@3.4.31: + resolution: {integrity: sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==} dependencies: - '@vue/shared': 3.4.32 + '@vue/shared': 3.4.31 dev: true - /@vue/runtime-core@3.4.32: - resolution: {integrity: sha512-FxT2dTHUs1Hki8Ui/B1Hu339mx4H5kRJooqrNM32tGUHBPStJxwMzLIRbeGO/B1NMplU4Pg9fwOqrJtrOzkdfA==} + /@vue/runtime-core@3.4.31: + resolution: {integrity: sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==} dependencies: - '@vue/reactivity': 3.4.32 - '@vue/shared': 3.4.32 + '@vue/reactivity': 3.4.31 + '@vue/shared': 3.4.31 dev: true - /@vue/runtime-dom@3.4.32: - resolution: {integrity: sha512-Xz9G+ZViRyPFQtRBCPFkhMzKn454ihCPMKUiacNaUhuTIXvyfkAq8l89IZ/kegFVyw/7KkJGRGqYdEZrf27Xsg==} + /@vue/runtime-dom@3.4.31: + resolution: {integrity: sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==} dependencies: - '@vue/reactivity': 3.4.32 - '@vue/runtime-core': 3.4.32 - '@vue/shared': 3.4.32 + '@vue/reactivity': 3.4.31 + '@vue/runtime-core': 3.4.31 + '@vue/shared': 3.4.31 csstype: 3.1.3 dev: true - /@vue/server-renderer@3.4.32(vue@3.4.32): - resolution: {integrity: sha512-3c4rd0522Ao8hKjzgmUAbcjv2mBnvnw0Ld2f8HOMCuWJZjYie/p8cpIoYJbeP0VV2JYmrJJMwGQDO5RH4iQ30A==} + /@vue/server-renderer@3.4.31(vue@3.4.31): + resolution: {integrity: sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==} peerDependencies: - vue: 3.4.32 + vue: 3.4.31 dependencies: - '@vue/compiler-ssr': 3.4.32 - '@vue/shared': 3.4.32 - vue: 3.4.32(typescript@5.5.3) + '@vue/compiler-ssr': 3.4.31 + '@vue/shared': 3.4.31 + vue: 3.4.31(typescript@5.5.3) dev: true - /@vue/shared@3.4.32: - resolution: {integrity: sha512-ep4mF1IVnX/pYaNwxwOpJHyBtOMKWoKZMbnUyd+z0udqIxLUh7YCCd/JfDna8aUrmnG9SFORyIq2HzEATRrQsg==} + /@vue/shared@3.4.31: + resolution: {integrity: sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==} dev: true /abab@2.0.6: @@ -7799,17 +7835,17 @@ packages: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} dev: true - /babel-jest@29.7.0(@babel/core@7.24.9): + /babel-jest@29.7.0(@babel/core@7.24.7): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.24.9) + babel-preset-jest: 29.6.3(@babel/core@7.24.7) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -7820,7 +7856,7 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.24.7 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -7833,7 +7869,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/template': 7.24.7 - '@babel/types': 7.24.9 + '@babel/types': 7.24.7 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 @@ -7841,43 +7877,43 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.24.7 cosmiconfig: 7.1.0 resolve: 1.22.8 dev: false - /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.9): + /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.7): resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.24.9 - '@babel/core': 7.24.9 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.9) + '@babel/compat-data': 7.24.7 + '@babel/core': 7.24.7 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.7) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.9): + /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.7): resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.9) + '@babel/core': 7.24.7 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.7) core-js-compat: 3.37.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.9): + /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.7): resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.9) + '@babel/core': 7.24.7 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.7) transitivePeerDependencies: - supports-color dev: true @@ -7886,41 +7922,41 @@ packages: resolution: {integrity: sha512-OjG1SVaeQZaJrqkMFJatg8W/MTow8Ak5rx2SI0ETQBO1XvOk/XZGMbltNCPdFJLKghBYoBjC+Y3Ap/Xr7B01mA==} dependencies: '@babel/generator': 7.2.0 - '@babel/types': 7.24.9 + '@babel/types': 7.24.7 chalk: 4.1.2 invariant: 2.2.4 pretty-format: 24.9.0 zod: 3.23.8 zod-validation-error: 2.1.0(zod@3.23.8) - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.9): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.7): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.9) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.9) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.9) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.9) + '@babel/core': 7.24.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) - /babel-preset-jest@29.6.3(@babel/core@7.24.9): + /babel-preset-jest@29.6.3(@babel/core@7.24.7): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.9) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -7987,7 +8023,7 @@ packages: engines: {node: '>=12'} dependencies: bin-version: 6.0.0 - semver: 7.6.3 + semver: 7.6.2 semver-truncate: 3.0.0 dev: true @@ -8067,9 +8103,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001642 - electron-to-chromium: 1.4.829 - node-releases: 2.0.17 + caniuse-lite: 1.0.30001641 + electron-to-chromium: 1.4.825 + node-releases: 2.0.14 update-browserslist-db: 1.1.0(browserslist@4.23.2) /bs-logger@0.2.6: @@ -8238,9 +8274,10 @@ packages: /camelcase@7.0.1: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} + dev: false - /caniuse-lite@1.0.30001642: - resolution: {integrity: sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==} + /caniuse-lite@1.0.30001641: + resolution: {integrity: sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==} /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -8277,7 +8314,7 @@ packages: pathe: 1.1.2 pkg-types: 1.1.3 scule: 1.3.0 - semver: 7.6.3 + semver: 7.6.2 std-env: 3.7.0 yaml: 2.4.5 transitivePeerDependencies: @@ -8351,6 +8388,7 @@ packages: es6-iterator: 2.0.3 memoizee: 0.4.17 timers-ext: 0.1.8 + dev: false /cli-cursor@4.0.0: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} @@ -8475,6 +8513,7 @@ packages: /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} + dev: false /comment-json@4.2.4: resolution: {integrity: sha512-E5AjpSW+O+N5T2GsOQMHLLsJvrYw6G/AFt9GvU6NguEAfzKShh7hRiLtVo6S9KbRpFMGqE5ojo0/hE+sdteWvQ==} @@ -8568,6 +8607,7 @@ packages: engines: {node: '>=12.13'} dependencies: is-what: 4.1.16 + dev: false /copyfiles@2.4.1: resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} @@ -8681,6 +8721,7 @@ packages: dependencies: es5-ext: 0.10.64 type: 2.7.3 + dev: false /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -8976,6 +9017,7 @@ packages: resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} dependencies: heap: 0.2.7 + dev: false /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -8998,7 +9040,7 @@ packages: /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.24.7 csstype: 3.1.3 dev: false @@ -9047,6 +9089,7 @@ packages: engines: {node: '>=0.4.0'} dependencies: wordwrap: 1.0.0 + dev: false /drizzle-kit@0.20.14-1f2c838: resolution: {integrity: sha512-Gun36T6RcfwrZAZ+Gk2ZeWJtvUhO002H/SvkY9BNcsACvhsd4OxkkxzrznuZ3Kz5NEdg12k7yvZqNoimPp68aw==} @@ -9064,12 +9107,13 @@ packages: hanji: 0.0.5 json-diff: 0.9.0 minimatch: 7.4.6 - semver: 7.6.3 + semver: 7.6.2 zod: 3.23.8 transitivePeerDependencies: - supports-color + dev: false - /drizzle-orm@0.29.4(@libsql/client@0.5.6)(@types/pg@8.10.2)(pg@8.11.3)(react@19.0.0-rc-fb9a90fa48-20240614)(types-react@19.0.0-rc.0): + /drizzle-orm@0.29.4(@libsql/client@0.6.2)(@types/pg@8.10.2)(pg@8.11.3)(react@19.0.0-rc-fb9a90fa48-20240614)(types-react@19.0.0-rc.0): resolution: {integrity: sha512-ZnSM8TAxFhzH7p1s3+w3pRE/eKaOeNkH9SKitm717pubDVVcV2I0BCDBPGKV+pe02+wMfw37ntlTcCyo2rA3IA==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' @@ -9140,7 +9184,7 @@ packages: sqlite3: optional: true dependencies: - '@libsql/client': 0.5.6 + '@libsql/client': 0.6.2 '@types/pg': 8.10.2 '@types/react': /types-react@19.0.0-rc.0 pg: 8.11.3 @@ -9174,7 +9218,7 @@ packages: '@one-ini/wasm': 0.1.1 commander: 10.0.1 minimatch: 9.0.1 - semver: 7.6.3 + semver: 7.6.2 dev: false /ee-first@1.1.1: @@ -9192,8 +9236,8 @@ packages: jake: 10.9.1 dev: true - /electron-to-chromium@1.4.829: - resolution: {integrity: sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw==} + /electron-to-chromium@1.4.825: + resolution: {integrity: sha512-OCcF+LwdgFGcsYPYC5keEEFC2XT0gBhrYbeGzHCx7i9qRFbzO/AqTmc/C/1xNhJj+JA7rzlN7mpBuStshh96Cg==} /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -9226,6 +9270,7 @@ packages: /env-paths@3.0.0: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -9370,6 +9415,7 @@ packages: es6-symbol: 3.1.4 esniff: 2.0.1 next-tick: 1.1.0 + dev: false /es6-iterator@2.0.3: resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} @@ -9377,6 +9423,7 @@ packages: d: 1.0.2 es5-ext: 0.10.64 es6-symbol: 3.1.4 + dev: false /es6-symbol@3.1.4: resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} @@ -9384,6 +9431,7 @@ packages: dependencies: d: 1.0.2 ext: 1.7.0 + dev: false /es6-weak-map@2.0.3: resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} @@ -9392,6 +9440,7 @@ packages: es5-ext: 0.10.64 es6-iterator: 2.0.3 es6-symbol: 3.1.4 + dev: false /esbuild-register@3.5.0(esbuild@0.19.12): resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} @@ -9402,8 +9451,9 @@ packages: esbuild: 0.19.12 transitivePeerDependencies: - supports-color + dev: false - /esbuild-sass-plugin@3.3.1(esbuild@0.23.0)(sass-embedded@1.77.8): + /esbuild-sass-plugin@3.3.1(esbuild@0.23.0)(sass-embedded@1.77.5): resolution: {integrity: sha512-SnO1ls+d52n6j8gRRpjexXI8MsHEaumS0IdDHaYM29Y6gakzZYMls6i9ql9+AWMSQk/eryndmUpXEgT34QrX1A==} peerDependencies: esbuild: '>=0.20.1' @@ -9413,7 +9463,7 @@ packages: resolve: 1.22.8 safe-identifier: 0.4.2 sass: 1.77.4 - sass-embedded: 1.77.8 + sass-embedded: 1.77.5 dev: true /esbuild@0.18.20: @@ -9444,6 +9494,7 @@ packages: '@esbuild/win32-arm64': 0.18.20 '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 + dev: false /esbuild@0.19.12: resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} @@ -9474,6 +9525,7 @@ packages: '@esbuild/win32-arm64': 0.19.12 '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 + dev: false /esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} @@ -9599,7 +9651,7 @@ packages: peerDependencies: eslint: ^8.56.0 || ^9.0.0-0 dependencies: - '@typescript-eslint/utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) debug: 4.3.5(supports-color@5.5.0) doctrine: 3.0.0 eslint: 9.6.0 @@ -9607,7 +9659,7 @@ packages: get-tsconfig: 4.7.5 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 + semver: 7.6.2 stable-hash: 0.0.4 tslib: 2.6.3 transitivePeerDependencies: @@ -9625,7 +9677,7 @@ packages: '@testing-library/dom': optional: true dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.24.7 eslint: 9.6.0 requireindex: 1.2.0 dev: false @@ -9643,7 +9695,7 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) eslint: 9.6.0 jest: 29.7.0(@types/node@20.12.5) transitivePeerDependencies: @@ -9694,7 +9746,7 @@ packages: vue-eslint-parser: optional: true dependencies: - '@typescript-eslint/utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) eslint: 9.6.0 minimatch: 9.0.5 natural-compare-lite: 1.4.0 @@ -9733,10 +9785,10 @@ packages: '@eslint-react/shared': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) '@eslint-react/tools': 1.5.25-next.4 '@eslint-react/types': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/type-utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.16.0 + '@typescript-eslint/type-utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) eslint: 9.6.0 string-ts: 2.2.0 typescript: 5.5.3 @@ -9761,9 +9813,9 @@ packages: '@eslint-react/tools': 1.5.25-next.4 '@eslint-react/types': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) '@eslint-react/var': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.16.0 + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) eslint: 9.6.0 typescript: 5.5.3 transitivePeerDependencies: @@ -9787,10 +9839,10 @@ packages: '@eslint-react/tools': 1.5.25-next.4 '@eslint-react/types': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) '@eslint-react/var': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/type-utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.16.0 + '@typescript-eslint/type-utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) eslint: 9.6.0 typescript: 5.5.3 transitivePeerDependencies: @@ -9822,10 +9874,10 @@ packages: '@eslint-react/shared': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) '@eslint-react/tools': 1.5.25-next.4 '@eslint-react/types': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/type-utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.16.0 + '@typescript-eslint/type-utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) eslint: 9.6.0 typescript: 5.5.3 transitivePeerDependencies: @@ -9849,10 +9901,10 @@ packages: '@eslint-react/tools': 1.5.25-next.4 '@eslint-react/types': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) '@eslint-react/var': 1.5.25-next.4(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/type-utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.16.0 + '@typescript-eslint/type-utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) eslint: 9.6.0 is-immutable-type: 4.0.0(eslint@9.6.0)(typescript@5.5.3) typescript: 5.5.3 @@ -9876,8 +9928,8 @@ packages: scslre: 0.3.0 dev: false - /eslint-scope@8.0.2: - resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} + /eslint-scope@8.0.1: + resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: esrecurse: 4.3.0 @@ -9909,7 +9961,7 @@ packages: cross-spawn: 7.0.3 debug: 4.3.5(supports-color@5.5.0) escape-string-regexp: 4.0.0 - eslint-scope: 8.0.2 + eslint-scope: 8.0.1 eslint-visitor-keys: 4.0.0 espree: 10.1.0 esquery: 1.6.0 @@ -9941,6 +9993,7 @@ packages: es5-ext: 0.10.64 event-emitter: 0.3.5 type: 2.7.3 + dev: false /espree@10.1.0: resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} @@ -9995,6 +10048,7 @@ packages: dependencies: d: 1.0.2 es5-ext: 0.10.64 + dev: false /event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} @@ -10141,7 +10195,7 @@ packages: resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} engines: {node: '>=0.10.0'} dependencies: - mime-db: 1.53.0 + mime-db: 1.52.0 dev: true /ext-name@5.0.0: @@ -10156,6 +10210,7 @@ packages: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} dependencies: type: 2.7.3 + dev: false /extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} @@ -10171,8 +10226,8 @@ packages: resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} dev: false - /fast-check@3.20.0: - resolution: {integrity: sha512-pZIjqLpOZgdSLecec4GKC3Zq5702MZ34upMKxojnNVSWA0K64V3pXOBT1Wdsrc3AphLtzRBbsi8bRWF4TUGmUg==} + /fast-check@3.19.0: + resolution: {integrity: sha512-CO2JX/8/PT9bDGO1iXa5h5ey1skaKI1dvecERyhH4pp3PGjwd3KIjMAXEg79Ps9nclsdt4oPbfqiAnLU0EwrAQ==} engines: {node: '>=8.0.0'} dependencies: pure-rand: 6.1.0 @@ -10260,7 +10315,7 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: readable-web-to-node-stream: 3.0.2 - strtok3: 7.1.1 + strtok3: 7.1.0 token-types: 5.0.1 /filelist@1.0.4: @@ -10698,6 +10753,7 @@ packages: inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 + dev: false /global-modules@1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} @@ -10863,6 +10919,7 @@ packages: dependencies: lodash.throttle: 4.1.1 sisteransi: 1.0.5 + dev: false /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} @@ -10911,6 +10968,7 @@ packages: /heap@0.2.7: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + dev: false /help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} @@ -11311,7 +11369,7 @@ packages: eslint: '*' typescript: 5.5.3 dependencies: - '@typescript-eslint/type-utils': 7.16.1(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/type-utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) eslint: 9.6.0 ts-api-utils: 1.3.0(typescript@5.5.3) ts-declaration-location: 1.0.2(typescript@5.5.3) @@ -11378,6 +11436,7 @@ packages: /is-promise@2.2.2: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: false /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} @@ -11461,6 +11520,7 @@ packages: /is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} + dev: false /is-whitespace@0.3.0: resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} @@ -11521,8 +11581,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.24.9 - '@babel/parser': 7.24.8 + '@babel/core': 7.24.7 + '@babel/parser': 7.24.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -11533,11 +11593,11 @@ packages: resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.24.9 - '@babel/parser': 7.24.8 + '@babel/core': 7.24.7 + '@babel/parser': 7.24.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.3 + semver: 7.6.2 transitivePeerDependencies: - supports-color @@ -11679,11 +11739,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 '@types/node': 20.12.5 - babel-jest: 29.7.0(@babel/core@7.24.9) + babel-jest: 29.7.0(@babel/core@7.24.7) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -11924,15 +11984,15 @@ packages: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.24.9 - '@babel/generator': 7.24.10 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.9) - '@babel/types': 7.24.9 + '@babel/core': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7) + '@babel/types': 7.24.7 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.9) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -11943,7 +12003,7 @@ packages: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.6.3 + semver: 7.6.2 transitivePeerDependencies: - supports-color @@ -12135,6 +12195,7 @@ packages: cli-color: 2.0.4 difflib: 0.2.4 dreamopt: 0.8.0 + dev: false /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -12146,7 +12207,7 @@ packages: dependencies: '@bcherny/json-schema-ref-parser': 9.0.9 '@types/json-schema': 7.0.15 - '@types/lodash': 4.17.7 + '@types/lodash': 4.17.6 '@types/prettier': 2.7.3 cli-color: 2.0.4 get-stdin: 8.0.0 @@ -12193,7 +12254,7 @@ packages: jws: 3.2.2 lodash: 4.17.21 ms: 2.1.3 - semver: 7.6.3 + semver: 7.6.2 dev: false /jsx-ast-utils@3.3.5: @@ -12405,6 +12466,7 @@ packages: /lodash.throttle@4.1.1: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: false /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -12450,6 +12512,7 @@ packages: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} dependencies: es5-ext: 0.10.64 + dev: false /magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} @@ -12476,7 +12539,7 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: - semver: 7.6.3 + semver: 7.6.2 /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -12516,6 +12579,7 @@ packages: lru-queue: 0.1.0 next-tick: 1.1.0 timers-ext: 0.1.8 + dev: false /memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} @@ -12553,11 +12617,6 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - /mime-db@1.53.0: - resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} - engines: {node: '>= 0.6'} - dev: true - /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} @@ -12610,6 +12669,7 @@ packages: engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 + dev: false /minimatch@9.0.1: resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} @@ -12666,7 +12726,7 @@ packages: acorn: 8.12.1 pathe: 1.1.2 pkg-types: 1.1.3 - ufo: 1.5.4 + ufo: 1.5.3 dev: true /monaco-editor@0.38.0: @@ -12678,8 +12738,8 @@ packages: '@types/whatwg-url': 8.2.2 whatwg-url: 11.0.0 - /mongodb-memory-server-core@9.4.1: - resolution: {integrity: sha512-lobapXaysH64zrn521NTkmqHc3krSPUFkuuZ8A/BmQV8ON7p2SzAEvpoJPDXIeJkxIzYw06dYL6Gn5OcZdEElA==} + /mongodb-memory-server-core@9.4.0: + resolution: {integrity: sha512-irqdj/RPHJ2M9lgtxrvhXUbqFv/DfmUG+wvcAqtgtBJ8qVq1VGBD5rkKkLP5b3g8OoadP3OzsXTGCi1P2dDBQQ==} engines: {node: '>=14.20.1'} dependencies: async-mutex: 0.4.1 @@ -12690,7 +12750,7 @@ packages: https-proxy-agent: 7.0.5 mongodb: 5.9.2 new-find-package-json: 2.0.0 - semver: 7.6.3 + semver: 7.6.2 tar-stream: 3.1.7 tslib: 2.6.3 yauzl: 3.1.3 @@ -12703,12 +12763,12 @@ packages: - supports-color dev: true - /mongodb-memory-server@9.4.1: - resolution: {integrity: sha512-qONlW4sKPbtk9pqFnlPn7R73G3Q4TuebJJ5pHfoiKTqVJquojQ8xWmkCyz+/YnpA2vYBo/jib+nXvjfKwh7cjg==} + /mongodb-memory-server@9.4.0: + resolution: {integrity: sha512-O6n7TxWvcLSSDP3IrXsLsdG0iouljlqdZ7sH3ZaqEyymzZglMroV3CwMj1lvMNks7fRVj8HMrza0gnwF3MyFGA==} engines: {node: '>=14.20.1'} requiresBuild: true dependencies: - mongodb-memory-server-core: 9.4.1 + mongodb-memory-server-core: 9.4.0 tslib: 2.6.3 transitivePeerDependencies: - '@aws-sdk/credential-providers' @@ -12854,8 +12914,9 @@ packages: /next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: false - /next@15.0.0-canary.53(@babel/core@7.24.9)(@playwright/test@1.43.0)(babel-plugin-react-compiler@0.0.0-experimental-592953e-20240517)(react-dom@19.0.0-rc-fb9a90fa48-20240614)(react@19.0.0-rc-fb9a90fa48-20240614): + /next@15.0.0-canary.53(@babel/core@7.24.7)(@playwright/test@1.43.0)(babel-plugin-react-compiler@0.0.0-experimental-592953e-20240517)(react-dom@19.0.0-rc-fb9a90fa48-20240614)(react@19.0.0-rc-fb9a90fa48-20240614): resolution: {integrity: sha512-DSbMTIx/PFJPtIsRKoQzjHyRV6T/1Mir7vRrxiDkf1g223KGgjwn9hhvhjiLczUmBO6ec4vSnNNqWx0SuVXlJw==} engines: {node: '>=18.17.0'} hasBin: true @@ -12881,12 +12942,12 @@ packages: '@swc/helpers': 0.5.11 babel-plugin-react-compiler: 0.0.0-experimental-592953e-20240517 busboy: 1.6.0 - caniuse-lite: 1.0.30001642 + caniuse-lite: 1.0.30001641 graceful-fs: 4.2.11 postcss: 8.4.31 react: 19.0.0-rc-fb9a90fa48-20240614 react-dom: 19.0.0-rc-fb9a90fa48-20240614(react@19.0.0-rc-fb9a90fa48-20240614) - styled-jsx: 5.1.6(@babel/core@7.24.9)(react@19.0.0-rc-fb9a90fa48-20240614) + styled-jsx: 5.1.6(@babel/core@7.24.7)(react@19.0.0-rc-fb9a90fa48-20240614) optionalDependencies: '@next/swc-darwin-arm64': 15.0.0-canary.53 '@next/swc-darwin-x64': 15.0.0-canary.53 @@ -12902,7 +12963,7 @@ packages: - '@babel/core' - babel-plugin-macros - /next@15.0.0-canary.53(@babel/core@7.24.9)(@playwright/test@1.43.0)(react-dom@19.0.0-rc-fb9a90fa48-20240614)(react@19.0.0-rc-fb9a90fa48-20240614)(sass@1.77.4): + /next@15.0.0-canary.53(@babel/core@7.24.7)(@playwright/test@1.43.0)(react-dom@19.0.0-rc-fb9a90fa48-20240614)(react@19.0.0-rc-fb9a90fa48-20240614)(sass@1.77.4): resolution: {integrity: sha512-DSbMTIx/PFJPtIsRKoQzjHyRV6T/1Mir7vRrxiDkf1g223KGgjwn9hhvhjiLczUmBO6ec4vSnNNqWx0SuVXlJw==} engines: {node: '>=18.17.0'} hasBin: true @@ -12927,13 +12988,13 @@ packages: '@playwright/test': 1.43.0 '@swc/helpers': 0.5.11 busboy: 1.6.0 - caniuse-lite: 1.0.30001642 + caniuse-lite: 1.0.30001641 graceful-fs: 4.2.11 postcss: 8.4.31 react: 19.0.0-rc-fb9a90fa48-20240614 react-dom: 19.0.0-rc-fb9a90fa48-20240614(react@19.0.0-rc-fb9a90fa48-20240614) sass: 1.77.4 - styled-jsx: 5.1.6(@babel/core@7.24.9)(react@19.0.0-rc-fb9a90fa48-20240614) + styled-jsx: 5.1.6(@babel/core@7.24.7)(react@19.0.0-rc-fb9a90fa48-20240614) optionalDependencies: '@next/swc-darwin-arm64': 15.0.0-canary.53 '@next/swc-darwin-x64': 15.0.0-canary.53 @@ -12964,7 +13025,7 @@ packages: resolution: {integrity: sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==} engines: {node: '>=10'} dependencies: - semver: 7.6.3 + semver: 7.6.2 dev: true /node-addon-api@3.2.1: @@ -13014,8 +13075,8 @@ packages: /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - /node-releases@2.0.17: - resolution: {integrity: sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==} + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} /nodemailer@6.9.10: resolution: {integrity: sha512-qtoKfGFhvIFW5kLfrkw2R6Nm6Ur4LNUMykyqu6n9BRKJuyQrqEGwdXXUAbwWEKt33dlWUGXb7rzmJP/p4+O+CA==} @@ -13032,7 +13093,7 @@ packages: ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 - semver: 7.6.3 + semver: 7.6.2 simple-update-notifier: 2.0.0 supports-color: 5.5.0 touch: 3.1.1 @@ -13097,7 +13158,7 @@ packages: execa: 8.0.1 pathe: 1.1.2 pkg-types: 1.1.3 - ufo: 1.5.4 + ufo: 1.5.3 dev: true /object-assign@4.1.1: @@ -13164,7 +13225,7 @@ packages: dependencies: destr: 2.0.3 node-fetch-native: 1.6.4 - ufo: 1.5.4 + ufo: 1.5.3 dev: true /ohash@1.1.3: @@ -13412,8 +13473,8 @@ packages: resolution: {integrity: sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==} dev: false - /peek-readable@5.1.3: - resolution: {integrity: sha512-kCsc9HwH5RgVA3H3VqkWFyGQwsxUxLdiSX1d5nqAm7hnMFjNFX1VhBLmJoUY0hZNc8gmDNgBkLjfhiWPsziXWA==} + /peek-readable@5.1.1: + resolution: {integrity: sha512-4hEOSH7KeEaZpMDF/xfm1W9fS5rT7Ett3BkXWHqAEzRLLwLaHkwOL+GvvpIEh9UrvX9BDhzfkvteslgraoH69w==} engines: {node: '>=14.16'} /pend@1.2.0: @@ -13942,7 +14003,7 @@ packages: peerDependencies: react: ^19.0.0-rc-6230622a1a-20240610 dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.24.7 react: 19.0.0-rc-fb9a90fa48-20240614 dev: false @@ -13951,7 +14012,7 @@ packages: peerDependencies: react: ^19.0.0-rc-6230622a1a-20240610 dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.24.7 react: 19.0.0-rc-fb9a90fa48-20240614 dev: false @@ -13985,7 +14046,7 @@ packages: react: ^19.0.0-rc-6230622a1a-20240610 react-dom: ^19.0.0-rc-6230622a1a-20240610 dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.24.7 '@emotion/cache': 11.11.0 '@emotion/react': 11.11.4(react@19.0.0-rc-fb9a90fa48-20240614)(types-react@19.0.0-rc.0) '@floating-ui/dom': 1.6.7 @@ -14007,7 +14068,7 @@ packages: react: ^19.0.0-rc-6230622a1a-20240610 react-dom: ^19.0.0-rc-6230622a1a-20240610 dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.24.7 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -14120,7 +14181,7 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.24.7 dev: true /regexp-ast-analysis@0.7.1: @@ -14345,8 +14406,8 @@ packages: truncate-utf8-bytes: 1.0.2 dev: false - /sass-embedded-android-arm64@1.77.8: - resolution: {integrity: sha512-EmWHLbEx0Zo/f/lTFzMeH2Du+/I4RmSRlEnERSUKQWVp3aBSO04QDvdxfFezgQ+2Yt/ub9WMqBpma9P/8MPsLg==} + /sass-embedded-android-arm64@1.77.5: + resolution: {integrity: sha512-t4yIhK5OUpg1coZxFpDo3BhI2YVj21JxEd5SVI6FfcWD2ESroQWsC4cbq3ejw5aun8R1Kx6xH1EKxO8bSMvn1g==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [android] @@ -14355,8 +14416,8 @@ packages: dev: true optional: true - /sass-embedded-android-arm@1.77.8: - resolution: {integrity: sha512-GpGL7xZ7V1XpFbnflib/NWbM0euRzineK0iwoo31/ntWKAXGj03iHhGzkSiOwWSFcXgsJJi3eRA5BTmBvK5Q+w==} + /sass-embedded-android-arm@1.77.5: + resolution: {integrity: sha512-/DfNYoykqwMFduecqa8n0NH+cS6oLdCPFjwhe92efsOOt5WDYEOlolnhoOENZxqdzvSV+8axL+mHQ1Ypl4MLtg==} engines: {node: '>=14.0.0'} cpu: [arm] os: [android] @@ -14365,8 +14426,8 @@ packages: dev: true optional: true - /sass-embedded-android-ia32@1.77.8: - resolution: {integrity: sha512-+GjfJ3lDezPi4dUUyjQBxlNKXNa+XVWsExtGvVNkv1uKyaOxULJhubVo2G6QTJJU0esJdfeXf5Ca5/J0ph7+7w==} + /sass-embedded-android-ia32@1.77.5: + resolution: {integrity: sha512-92dWhEbR0Z2kpjbpfOx4LM9wlNBSnDsRtwpkMUK8udQIE7uF3E4/Fsf/88IJk0MrRkk4iwrsxxiCb1bz2tWnHQ==} engines: {node: '>=14.0.0'} cpu: [ia32] os: [android] @@ -14375,8 +14436,8 @@ packages: dev: true optional: true - /sass-embedded-android-x64@1.77.8: - resolution: {integrity: sha512-YZbFDzGe5NhaMCygShqkeCWtzjhkWxGVunc7ULR97wmxYPQLPeVyx7XFQZc84Aj0lKAJBJS4qRZeqphMqZEJsQ==} + /sass-embedded-android-x64@1.77.5: + resolution: {integrity: sha512-lFnXz9lRnjRLJ8Y28ONJViID3rDq4p6LJ/9ByPk2ZnSpx5ouUjsu4AfrXKJ0jgHWBaDvSKSxq2fPpt5aMQAEZA==} engines: {node: '>=14.0.0'} cpu: [x64] os: [android] @@ -14385,8 +14446,8 @@ packages: dev: true optional: true - /sass-embedded-darwin-arm64@1.77.8: - resolution: {integrity: sha512-aifgeVRNE+i43toIkDFFJc/aPLMo0PJ5s5hKb52U+oNdiJE36n65n2L8F/8z3zZRvCa6eYtFY2b7f1QXR3B0LA==} + /sass-embedded-darwin-arm64@1.77.5: + resolution: {integrity: sha512-J3yP6w+xqPrGQE0+sO4Gam6kBDJL5ivgkFNxR0fVlvKeN5qVFYhymp/xGRRMxBrKjohEQtBGP431EzrtvUMFow==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [darwin] @@ -14395,8 +14456,8 @@ packages: dev: true optional: true - /sass-embedded-darwin-x64@1.77.8: - resolution: {integrity: sha512-/VWZQtcWIOek60Zj6Sxk6HebXA1Qyyt3sD8o5qwbTgZnKitB1iEBuNunyGoAgMNeUz2PRd6rVki6hvbas9hQ6w==} + /sass-embedded-darwin-x64@1.77.5: + resolution: {integrity: sha512-A9fh5tg4s0FidMTG31Vs8TzYZ3Mam/I/tfqvN0g512OhBajp/p2DJvBY+0Br2r+TNH1yGUXf2ZfULuTBFj5u8w==} engines: {node: '>=14.0.0'} cpu: [x64] os: [darwin] @@ -14405,8 +14466,8 @@ packages: dev: true optional: true - /sass-embedded-linux-arm64@1.77.8: - resolution: {integrity: sha512-6iIOIZtBFa2YfMsHqOb3qake3C9d/zlKxjooKKnTSo+6g6z+CLTzMXe1bOfayb7yxeenElmFoK1k54kWD/40+g==} + /sass-embedded-linux-arm64@1.77.5: + resolution: {integrity: sha512-LoN804X7QsyvT/h8UGcgBMfV1SdT4JRRNV+slBICxoXPKBLXbZm9KyLRCBQcMLLdlXSZdOfZilxUN1Bd2az6OA==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] @@ -14415,8 +14476,8 @@ packages: dev: true optional: true - /sass-embedded-linux-arm@1.77.8: - resolution: {integrity: sha512-2edZMB6jf0whx3T0zlgH+p131kOEmWp+I4wnKj7ZMUeokiY4Up05d10hSvb0Q63lOrSjFAWu6P5/pcYUUx8arQ==} + /sass-embedded-linux-arm@1.77.5: + resolution: {integrity: sha512-O7gbOWJloxITBZNkpwChFltxofsnDUf+3pz7+q2ETQKvZQ3kUfFENAF37slo0bsHJ7IEpwJK3ZJlnhZvIgfhgw==} engines: {node: '>=14.0.0'} cpu: [arm] os: [linux] @@ -14425,8 +14486,8 @@ packages: dev: true optional: true - /sass-embedded-linux-ia32@1.77.8: - resolution: {integrity: sha512-63GsFFHWN5yRLTWiSef32TM/XmjhCBx1DFhoqxmj+Yc6L9Z1h0lDHjjwdG6Sp5XTz5EmsaFKjpDgnQTP9hJX3Q==} + /sass-embedded-linux-ia32@1.77.5: + resolution: {integrity: sha512-KHNJymlEmjyJbhGfB34zowohjgMvv/qKVsDX5hPlar+qMh+cxJwfgPln1Zl9bfe9qLObmEV2zFA1rpVBWy4xGQ==} engines: {node: '>=14.0.0'} cpu: [ia32] os: [linux] @@ -14435,8 +14496,8 @@ packages: dev: true optional: true - /sass-embedded-linux-musl-arm64@1.77.8: - resolution: {integrity: sha512-j8cgQxNWecYK+aH8ESFsyam/Q6G+9gg8eJegiRVpA9x8yk3ykfHC7UdQWwUcF22ZcuY4zegrjJx8k+thsgsOVA==} + /sass-embedded-linux-musl-arm64@1.77.5: + resolution: {integrity: sha512-ZWl8K8rCL4/phm3IPWDADwjnYAiohoaKg7BKjGo+36zv8P0ocoA0A3j4xx7/kjUJWagOmmoTyYxoOu+lo1NaKw==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] @@ -14444,8 +14505,8 @@ packages: dev: true optional: true - /sass-embedded-linux-musl-arm@1.77.8: - resolution: {integrity: sha512-nFkhSl3uu9btubm+JBW7uRglNVJ8W8dGfzVqh3fyQJKS1oyBC3vT3VOtfbT9YivXk28wXscSHpqXZwY7bUuopA==} + /sass-embedded-linux-musl-arm@1.77.5: + resolution: {integrity: sha512-TLhJzd1TJ0oX1oULobkWLMDLeErD27WbhdZqxtFvIqzyO+1TZPMwojhRX4YNWmHdmmYhIuXTR9foWxwL3Xjgsg==} engines: {node: '>=14.0.0'} cpu: [arm] os: [linux] @@ -14453,8 +14514,8 @@ packages: dev: true optional: true - /sass-embedded-linux-musl-ia32@1.77.8: - resolution: {integrity: sha512-oWveMe+8TFlP8WBWPna/+Ec5TV0CE+PxEutyi0ltSruBds2zxRq9dPVOqrpPcDN9QUx50vNZC0Afgch0aQEd0g==} + /sass-embedded-linux-musl-ia32@1.77.5: + resolution: {integrity: sha512-83zNSgsIIc+tYQFKepFIlvAvAHnbWSpZ824MjqXJLeCbfzcMO8SZ/q6OA0Zd2SIrf79lCWI4OfPHqp1PI6M7HQ==} engines: {node: '>=14.0.0'} cpu: [ia32] os: [linux] @@ -14462,8 +14523,8 @@ packages: dev: true optional: true - /sass-embedded-linux-musl-x64@1.77.8: - resolution: {integrity: sha512-2NtRpMXHeFo9kaYxuZ+Ewwo39CE7BTS2JDfXkTjZTZqd8H+8KC53eBh516YQnn2oiqxSiKxm7a6pxbxGZGwXOQ==} + /sass-embedded-linux-musl-x64@1.77.5: + resolution: {integrity: sha512-/SW9ggXZJilbRbKvRHAxEuQM6Yr9piEpvK7/aDevFL2XFvBW9x+dTzpH5jPVEmM0qWdJisS1r5mEv8AXUUdQZg==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] @@ -14471,8 +14532,8 @@ packages: dev: true optional: true - /sass-embedded-linux-x64@1.77.8: - resolution: {integrity: sha512-ND5qZLWUCpOn7LJfOf0gLSZUWhNIysY+7NZK1Ctq+pM6tpJky3JM5I1jSMplNxv5H3o8p80n0gSm+fcjsEFfjQ==} + /sass-embedded-linux-x64@1.77.5: + resolution: {integrity: sha512-3EmYeY+K8nMwIy1El9C+mPuONMQyXSCD6Yyztn3G7moPdZTqXrTL7kTJIl+SRq1tCcnOMMGXnBRE7Kpou1wd+w==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] @@ -14481,8 +14542,8 @@ packages: dev: true optional: true - /sass-embedded-win32-arm64@1.77.8: - resolution: {integrity: sha512-7L8zT6xzEvTYj86MvUWnbkWYCNQP+74HvruLILmiPPE+TCgOjgdi750709BtppVJGGZSs40ZuN6mi/YQyGtwXg==} + /sass-embedded-win32-arm64@1.77.5: + resolution: {integrity: sha512-dwVFOqkyfCRQgQB8CByH+MG93fp7IsfFaPDDCQVzVFAT00+HXk/dWFPMnv65XDDndGwsUE1KlZnjg8iOBDlRdw==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [win32] @@ -14491,8 +14552,8 @@ packages: dev: true optional: true - /sass-embedded-win32-ia32@1.77.8: - resolution: {integrity: sha512-7Buh+4bP0WyYn6XPbthkIa3M2vtcR8QIsFVg3JElVlr+8Ng19jqe0t0SwggDgbMX6AdQZC+Wj4F1BprZSok42A==} + /sass-embedded-win32-ia32@1.77.5: + resolution: {integrity: sha512-1ij/K5d2sHPJkytWiPJLoUOVHJOB6cSWXq7jmedeuGooWnBmqnWycmGkhBAEK/t6t1XgzMPsiJMGiHKh7fnBuA==} engines: {node: '>=14.0.0'} cpu: [ia32] os: [win32] @@ -14501,8 +14562,8 @@ packages: dev: true optional: true - /sass-embedded-win32-x64@1.77.8: - resolution: {integrity: sha512-rZmLIx4/LLQm+4GW39sRJW0MIlDqmyV0fkRzTmhFP5i/wVC7cuj8TUubPHw18rv2rkHFfBZKZJTCkPjCS5Z+SA==} + /sass-embedded-win32-x64@1.77.5: + resolution: {integrity: sha512-Pn6j0jDGeEAhuuVY0CaZaBa7yNkqimEsbUDYYuQ9xh+XdGvZ86SZf6HXHUVIyQUjHORLwQ5f0XoKYYzKfC0y9w==} engines: {node: '>=14.0.0'} cpu: [x64] os: [win32] @@ -14511,8 +14572,8 @@ packages: dev: true optional: true - /sass-embedded@1.77.8: - resolution: {integrity: sha512-WGXA6jcaoBo5Uhw0HX/s6z/sl3zyYQ7ZOnLOJzqwpctFcFmU4L07zn51e2VSkXXFpQZFAdMZNqOGz/7h/fvcRA==} + /sass-embedded@1.77.5: + resolution: {integrity: sha512-JQI8aprHDRSNK5exXsbusswTENQPJxW1QWUcLdwuyESoJClT1zo8e+4cmaV5OAU4abcRC6Av4/RmLocPdjcR3A==} engines: {node: '>=16.0.0'} dependencies: '@bufbuild/protobuf': 1.10.0 @@ -14522,23 +14583,23 @@ packages: supports-color: 8.1.1 varint: 6.0.0 optionalDependencies: - sass-embedded-android-arm: 1.77.8 - sass-embedded-android-arm64: 1.77.8 - sass-embedded-android-ia32: 1.77.8 - sass-embedded-android-x64: 1.77.8 - sass-embedded-darwin-arm64: 1.77.8 - sass-embedded-darwin-x64: 1.77.8 - sass-embedded-linux-arm: 1.77.8 - sass-embedded-linux-arm64: 1.77.8 - sass-embedded-linux-ia32: 1.77.8 - sass-embedded-linux-musl-arm: 1.77.8 - sass-embedded-linux-musl-arm64: 1.77.8 - sass-embedded-linux-musl-ia32: 1.77.8 - sass-embedded-linux-musl-x64: 1.77.8 - sass-embedded-linux-x64: 1.77.8 - sass-embedded-win32-arm64: 1.77.8 - sass-embedded-win32-ia32: 1.77.8 - sass-embedded-win32-x64: 1.77.8 + sass-embedded-android-arm: 1.77.5 + sass-embedded-android-arm64: 1.77.5 + sass-embedded-android-ia32: 1.77.5 + sass-embedded-android-x64: 1.77.5 + sass-embedded-darwin-arm64: 1.77.5 + sass-embedded-darwin-x64: 1.77.5 + sass-embedded-linux-arm: 1.77.5 + sass-embedded-linux-arm64: 1.77.5 + sass-embedded-linux-ia32: 1.77.5 + sass-embedded-linux-musl-arm: 1.77.5 + sass-embedded-linux-musl-arm64: 1.77.5 + sass-embedded-linux-musl-ia32: 1.77.5 + sass-embedded-linux-musl-x64: 1.77.5 + sass-embedded-linux-x64: 1.77.5 + sass-embedded-win32-arm64: 1.77.5 + sass-embedded-win32-ia32: 1.77.5 + sass-embedded-win32-x64: 1.77.5 dev: true /sass@1.77.4: @@ -14606,7 +14667,7 @@ packages: resolution: {integrity: sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==} engines: {node: '>=12'} dependencies: - semver: 7.6.3 + semver: 7.6.2 dev: true /semver@5.7.2: @@ -14618,8 +14679,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - /semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + /semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} engines: {node: '>=10'} hasBin: true @@ -14695,7 +14756,7 @@ packages: detect-libc: 2.0.3 node-addon-api: 6.1.0 prebuild-install: 7.1.2 - semver: 7.6.3 + semver: 7.6.2 simple-get: 4.0.1 tar-fs: 3.0.6 tunnel-agent: 0.6.0 @@ -14708,7 +14769,7 @@ packages: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.6.3 + semver: 7.6.2 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.4 '@img/sharp-darwin-x64': 0.33.4 @@ -14804,7 +14865,7 @@ packages: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} dependencies: - semver: 7.6.3 + semver: 7.6.2 dev: true /simple-wcswidth@1.0.1: @@ -14864,7 +14925,7 @@ packages: dependencies: '@juggle/resize-observer': 3.4.0 '@types/is-hotkey': 0.1.10 - '@types/lodash': 4.17.7 + '@types/lodash': 4.17.6 direction: 1.0.4 is-hotkey: 0.1.8 is-plain-object: 5.0.0 @@ -14954,7 +15015,7 @@ packages: git-hooks-list: 3.1.0 globby: 13.2.2 is-plain-obj: 4.1.0 - semver: 7.6.3 + semver: 7.6.2 sort-object-keys: 1.1.3 dev: true @@ -14973,6 +15034,7 @@ packages: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 + dev: false /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} @@ -15205,17 +15267,17 @@ packages: /strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - /strtok3@7.1.1: - resolution: {integrity: sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg==} - engines: {node: '>=16'} + /strtok3@7.1.0: + resolution: {integrity: sha512-19dQEwG6Jd+VabjPRyBhymIF069vZiqWSZa2jJBoKJTsqGKnTxowGoQaLnz+yLARfDI041IUQekyPUMWElOgsQ==} + engines: {node: '>=14.16'} dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 5.1.3 + peek-readable: 5.1.1 /stubs@3.0.0: resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} - /styled-jsx@5.1.6(@babel/core@7.24.9)(react@19.0.0-rc-fb9a90fa48-20240614): + /styled-jsx@5.1.6(@babel/core@7.24.7)(react@19.0.0-rc-fb9a90fa48-20240614): resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -15228,7 +15290,7 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 client-only: 0.0.1 react: 19.0.0-rc-fb9a90fa48-20240614 @@ -15241,6 +15303,7 @@ packages: engines: {node: '>=16'} dependencies: copy-anything: 3.0.5 + dev: false /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} @@ -15341,7 +15404,7 @@ packages: https-proxy-agent: 5.0.1 node-fetch: 2.7.0 stream-events: 1.0.5 - uuid: 9.0.1 + uuid: 9.0.0 transitivePeerDependencies: - encoding - supports-color @@ -15419,6 +15482,7 @@ packages: dependencies: es5-ext: 0.10.64 next-tick: 1.1.0 + dev: false /tiny-invariant@1.0.6: resolution: {integrity: sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==} @@ -15544,7 +15608,7 @@ packages: dependencies: typescript: 5.5.3 - /ts-jest@29.2.2(@babel/core@7.24.9)(esbuild@0.19.12)(jest@29.7.0)(typescript@5.5.3): + /ts-jest@29.2.2(@babel/core@7.24.7)(jest@29.7.0)(typescript@5.5.3): resolution: {integrity: sha512-sSW7OooaKT34AAngP6k1VS669a0HdLxkQZnlC7T76sckGCokXFnvJ3yRlQZGRTAoV5K19HfSgCiSwWOSIfcYlg==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true @@ -15568,17 +15632,16 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.24.7 bs-logger: 0.2.6 ejs: 3.1.10 - esbuild: 0.19.12 fast-json-stable-stringify: 2.1.0 jest: 29.7.0(@types/node@20.12.5) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.6.3 + semver: 7.6.2 typescript: 5.5.3 yargs-parser: 21.1.1 dev: true @@ -15706,6 +15769,7 @@ packages: /type@2.7.3: resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + dev: false /typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} @@ -15786,8 +15850,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - /ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + /ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} dev: true /unbox-primitive@1.0.2: @@ -15909,7 +15973,7 @@ packages: '@uploadthing/shared': 6.7.8 consola: 3.2.3 effect: 3.4.5 - next: 15.0.0-canary.53(@babel/core@7.24.9)(@playwright/test@1.43.0)(babel-plugin-react-compiler@0.0.0-experimental-592953e-20240517)(react-dom@19.0.0-rc-fb9a90fa48-20240614)(react@19.0.0-rc-fb9a90fa48-20240614) + next: 15.0.0-canary.53(@babel/core@7.24.7)(@playwright/test@1.43.0)(babel-plugin-react-compiler@0.0.0-experimental-592953e-20240517)(react-dom@19.0.0-rc-fb9a90fa48-20240614)(react@19.0.0-rc-fb9a90fa48-20240614) std-env: 3.7.0 /uri-js@4.4.1: @@ -15967,6 +16031,10 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true + /uuid@9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + /uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true @@ -15992,19 +16060,19 @@ packages: engines: {node: '>= 0.8'} dev: false - /vue@3.4.32(typescript@5.5.3): - resolution: {integrity: sha512-9mCGIAi/CAq7GtaLLLp2J92pEic+HArstG+pq6F+H7+/jB9a0Z7576n4Bh4k79/50L1cKMIhZC3MC0iGpl+1IA==} + /vue@3.4.31(typescript@5.5.3): + resolution: {integrity: sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==} peerDependencies: typescript: 5.5.3 peerDependenciesMeta: typescript: optional: true dependencies: - '@vue/compiler-dom': 3.4.32 - '@vue/compiler-sfc': 3.4.32 - '@vue/runtime-dom': 3.4.32 - '@vue/server-renderer': 3.4.32(vue@3.4.32) - '@vue/shared': 3.4.32 + '@vue/compiler-dom': 3.4.31 + '@vue/compiler-sfc': 3.4.31 + '@vue/runtime-dom': 3.4.31 + '@vue/server-renderer': 3.4.31(vue@3.4.31) + '@vue/shared': 3.4.31 typescript: 5.5.3 dev: true @@ -16147,6 +16215,7 @@ packages: /wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: false /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} diff --git a/scripts/lib/publishList.ts b/scripts/lib/publishList.ts index c50535b5e3..c0b936d1dd 100644 --- a/scripts/lib/publishList.ts +++ b/scripts/lib/publishList.ts @@ -9,8 +9,6 @@ export const packagePublishList = [ 'ui', 'next', 'graphql', - 'db-mongodb', - 'db-postgres', 'live-preview', 'live-preview-react', 'live-preview-vue', @@ -19,6 +17,12 @@ export const packagePublishList = [ 'create-payload-app', + // DB Adapters + 'drizzle', + 'db-mongodb', + 'db-postgres', + 'db-sqlite', + // Adapters 'email-nodemailer', 'email-resend', diff --git a/scripts/pack-all-to-dest.ts b/scripts/pack-all-to-dest.ts index 73b9d5e3a2..473ac014cc 100644 --- a/scripts/pack-all-to-dest.ts +++ b/scripts/pack-all-to-dest.ts @@ -36,6 +36,8 @@ async function main() { 'ui', 'next', 'db-mongodb', + 'drizzle', + 'db-sqlite', 'db-postgres', 'richtext-lexical', 'translations', diff --git a/test/buildConfigWithDefaults.ts b/test/buildConfigWithDefaults.ts index f8ab8037d9..46294e13b2 100644 --- a/test/buildConfigWithDefaults.ts +++ b/test/buildConfigWithDefaults.ts @@ -2,6 +2,7 @@ import type { Config, SanitizedConfig } from 'payload' import { mongooseAdapter } from '@payloadcms/db-mongodb' import { postgresAdapter } from '@payloadcms/db-postgres' +import { sqliteAdapter } from '@payloadcms/db-sqlite' import { AlignFeature, BlockquoteFeature, @@ -35,7 +36,10 @@ import sharp from 'sharp' import { reInitEndpoint } from './helpers/reInit.js' import { localAPIEndpoint } from './helpers/sdk/endpoint.js' import { testEmailAdapter } from './testEmailAdapter.js' + +// process.env.POSTGRES_URL = 'postgres://postgres:postgres@127.0.0.1:5432/payload' // process.env.PAYLOAD_DATABASE = 'postgres' +// process.env.PAYLOAD_DATABASE = 'sqlite' export async function buildConfigWithDefaults( testConfig?: Partial, @@ -64,6 +68,11 @@ export async function buildConfigWithDefaults( connectionString: process.env.POSTGRES_URL || 'postgres://127.0.0.1:5432/payloadtests', }, }), + sqlite: sqliteAdapter({ + client: { + url: process.env.SQLITE_URL || 'file:./payloadtests.db', + }, + }), supabase: postgresAdapter({ pool: { connectionString: diff --git a/test/collections-rest/int.spec.ts b/test/collections-rest/int.spec.ts index 966d3da859..727484ab11 100644 --- a/test/collections-rest/int.spec.ts +++ b/test/collections-rest/int.spec.ts @@ -1,7 +1,6 @@ import type { Payload } from 'payload' import { randomBytes } from 'crypto' -import { mapAsync } from 'payload' import type { NextRESTClient } from '../helpers/NextRESTClient.js' import type { Relation } from './config.js' @@ -127,9 +126,9 @@ describe('collections-rest', () => { describe('Bulk operations', () => { it('should bulk update', async () => { - await mapAsync([...Array(11)], async (_, i) => { + for (let i = 0; i < 11; i++) { await createPost({ description: `desc ${i}` }) - }) + } const description = 'updated' const response = await restClient.PATCH(`/${slug}`, { @@ -148,9 +147,9 @@ describe('collections-rest', () => { }) it('should not bulk update with a bad query', async () => { - await mapAsync([...Array(2)], async (_, i) => { + for (let i = 0; i < 2; i++) { await createPost({ description: `desc ${i}` }) - }) + } const description = 'updated' @@ -175,9 +174,9 @@ describe('collections-rest', () => { }) it('should not bulk update with a bad relationship query', async () => { - await mapAsync([...Array(2)], async (_, i) => { + for (let i = 0; i < 2; i++) { await createPost({ description: `desc ${i}` }) - }) + } const description = 'updated' const relationFieldResponse = await restClient.PATCH(`/${slug}`, { @@ -271,9 +270,9 @@ describe('collections-rest', () => { it('should bulk delete', async () => { const count = 11 - await mapAsync([...Array(count)], async (_, i) => { + for (let i = 0; i < count; i++) { await createPost({ description: `desc ${i}` }) - }) + } const response = await restClient.DELETE(`/${slug}`, { query: { where: { title: { equals: 'title' } } }, @@ -1088,19 +1087,22 @@ describe('collections-rest', () => { it('should sort find results by nearest distance', async () => { // creating twice as many records as we are querying to get a random sample - // eslint-disable-next-line @typescript-eslint/require-await - await mapAsync([...Array(10)], async () => { + const promises = [] + for (let i = 0; i < 11; i++) { // setTimeout used to randomize the creation timestamp - setTimeout(async () => { - await payload.create({ - collection: pointSlug, - data: { - // only randomize longitude to make distance comparison easy - point: [Math.random(), 0], - }, - }) + setTimeout(() => { + promises.push( + payload.create({ + collection: pointSlug, + data: { + // only randomize longitude to make distance comparison easy + point: [Math.random(), 0], + }, + }), + ) }, Math.random()) - }) + } + await Promise.all(promises) const { docs } = await restClient .GET(`/${pointSlug}`, { @@ -1327,13 +1329,13 @@ describe('collections-rest', () => { name: 'test', }, }) - await mapAsync([...Array(10)], async (_, i) => { + for (let i = 0; i < 10; i++) { await createPost({ number: i, relationField: relatedDoc.id as string, title: 'paginate-test', }) - }) + } }) it('should paginate with where query', async () => { @@ -1436,9 +1438,9 @@ describe('collections-rest', () => { describe('limit', () => { beforeEach(async () => { - await mapAsync([...Array(50)], async (_, i) => - createPost({ number: i, title: 'limit-test' }), - ) + for (let i = 0; i < 50; i++) { + await createPost({ number: i, title: 'limit-test' }) + } }) it('should query a limited set of docs', async () => { @@ -1522,9 +1524,9 @@ async function createPost(overrides?: Partial) { } async function createPosts(count: number) { - await mapAsync([...Array(count)], async () => { + for (let i = 0; i < count; i++) { await createPost() - }) + } } async function clearDocs(): Promise { diff --git a/test/custom-graphql/int.spec.ts b/test/custom-graphql/int.spec.ts index 00a66c8de8..5e09e27043 100644 --- a/test/custom-graphql/int.spec.ts +++ b/test/custom-graphql/int.spec.ts @@ -19,38 +19,44 @@ describe('Custom GraphQL', () => { } }) - describe('Isolated Transaction ID', () => { - it('should isolate transaction IDs between queries in the same request', async () => { - const query = `query { + if (!['sqlite'].includes(process.env.PAYLOAD_DATABASE || '')) { + describe('Isolated Transaction ID', () => { + it('should isolate transaction IDs between queries in the same request', async () => { + const query = `query { TransactionID1 TransactionID2 }` - const { data } = await restClient - .GRAPHQL_POST({ - body: JSON.stringify({ query }), - }) - .then((res) => res.json()) - // either no transactions at all or they are different - expect( - (data.TransactionID2 === null && data.TransactionID1 === null) || - data.TransactionID2 !== data.TransactionID1, - ).toBe(true) - }) - it('should isolate transaction IDs between mutations in the same request', async () => { - const query = `mutation { + const { data } = await restClient + .GRAPHQL_POST({ + body: JSON.stringify({ query }), + }) + .then((res) => res.json()) + // either no transactions at all or they are different + expect( + (data.TransactionID2 === null && data.TransactionID1 === null) || + data.TransactionID2 !== data.TransactionID1, + ).toBe(true) + }) + it('should isolate transaction IDs between mutations in the same request', async () => { + const query = `mutation { MutateTransactionID1 MutateTransactionID2 }` - const { data } = await restClient - .GRAPHQL_POST({ - body: JSON.stringify({ query }), - }) - .then((res) => res.json()) - // either no transactions at all or they are different - expect( - (data.MutateTransactionID2 === null && data.MutateTransactionID1 === null) || - data.MutateTransactionID2 !== data.MutateTransactionID1, - ).toBe(true) + const { data } = await restClient + .GRAPHQL_POST({ + body: JSON.stringify({ query }), + }) + .then((res) => res.json()) + // either no transactions at all or they are different + expect( + (data.MutateTransactionID2 === null && data.MutateTransactionID1 === null) || + data.MutateTransactionID2 !== data.MutateTransactionID1, + ).toBe(true) + }) }) - }) + } else { + it('should not run isolated transaction ID tests for sqlite', () => { + expect(true).toBe(true) + }) + } }) diff --git a/test/database/config.ts b/test/database/config.ts index df0decbc5f..2685a1f841 100644 --- a/test/database/config.ts +++ b/test/database/config.ts @@ -53,11 +53,6 @@ export default buildConfigWithDefaults({ name: 'title', type: 'text', }, - { - name: 'relationship', - type: 'relationship', - relationTo: 'relation-b', - }, { name: 'richText', type: 'richText', diff --git a/test/database/int.spec.ts b/test/database/int.spec.ts index b3908a4164..2c969f16b3 100644 --- a/test/database/int.spec.ts +++ b/test/database/int.spec.ts @@ -2,8 +2,6 @@ import type { PostgresAdapter } from '@payloadcms/db-postgres/types' import type { NextRESTClient } from 'helpers/NextRESTClient.js' import type { Payload, PayloadRequest, TypeWithID } from 'payload' -import { migratePostgresV2toV3 } from '@payloadcms/db-postgres/migration-utils' -import { sql } from 'drizzle-orm' import fs from 'fs' import path from 'path' import { commitTransaction, initTransaction } from 'payload' @@ -76,17 +74,59 @@ describe('database', () => { }) }) + describe('timestamps', () => { + it('should have createdAt and updatedAt timetstamps to the millisecond', async () => { + const result = await payload.create({ + collection: 'posts', + data: { + title: 'hello', + }, + }) + + const createdAtDate = new Date(result.createdAt) + + expect(createdAtDate.getMilliseconds()).toBeDefined() + }) + + it('should allow createdAt to be set in create', async () => { + const createdAt = new Date('2021-01-01T00:00:00.000Z') + const result = await payload.create({ + collection: 'posts', + data: { + // TODO: createdAt should be optional on RequiredDataFromCollectionSlug + createdAt, + title: 'hello', + }, + }) + + const doc = await payload.findByID({ + id: result.id, + collection: 'posts', + }) + + expect(result.createdAt).toStrictEqual(createdAt.toISOString()) + expect(doc.createdAt).toStrictEqual(createdAt.toISOString()) + }) + + it('updatedAt cannot be set in create', async () => { + const updatedAt = new Date('2022-01-01T00:00:00.000Z').toISOString() + const result = await payload.create({ + collection: 'posts', + data: { + title: 'hello', + updatedAt, + }, + }) + + expect(result.updatedAt).not.toStrictEqual(updatedAt) + }) + }) + describe('migrations', () => { beforeAll(async () => { if (process.env.PAYLOAD_DROP_DATABASE === 'true' && 'drizzle' in payload.db) { const db = payload.db as unknown as PostgresAdapter - const drizzle = db.drizzle - const schemaName = db.schemaName || 'public' - - await drizzle.execute( - sql.raw(`drop schema ${schemaName} cascade; - create schema ${schemaName};`), - ) + await db.dropDatabase({ adapter: db }) } }) @@ -107,15 +147,18 @@ describe('database', () => { }) it('should run migrate', async () => { + let error try { await payload.db.migrate() } catch (e) { console.error(e) + error = e } const { docs } = await payload.find({ collection: 'payload-migrations', }) const migration = docs[0] + expect(error).toBeUndefined() expect(migration?.name).toContain('_test') expect(migration?.batch).toStrictEqual(1) }) @@ -210,8 +253,10 @@ describe('database', () => { expect(db.tables.customBlocks_locales).toBeDefined() // enum names - expect(db.enums.selectEnum).toBeDefined() - expect(db.enums.radioEnum).toBeDefined() + if (db.enums) { + expect(db.enums.selectEnum).toBeDefined() + expect(db.enums.radioEnum).toBeDefined() + } } }) @@ -266,61 +311,64 @@ describe('database', () => { describe('transactions', () => { describe('local api', () => { - it('should commit multiple operations in isolation', async () => { - const req = { - payload, - user, - } as PayloadRequest + // sqlite cannot handle concurrent write transactions + if (!['sqlite'].includes(process.env.PAYLOAD_DATABASE)) { + it('should commit multiple operations in isolation', async () => { + const req = { + payload, + user, + } as unknown as PayloadRequest - await initTransaction(req) + await initTransaction(req) - const first = await payload.create({ - collection, - data: { - title, - }, - req, - }) + const first = await payload.create({ + collection, + data: { + title, + }, + req, + }) - await expect(() => - payload.findByID({ + await expect(() => + payload.findByID({ + id: first.id, + collection, + // omitting req for isolation + }), + ).rejects.toThrow('Not Found') + + const second = await payload.create({ + collection, + data: { + title, + }, + req, + }) + + await commitTransaction(req) + expect(req.transactionID).toBeUndefined() + + const firstResult = await payload.findByID({ id: first.id, collection, - // omitting req for isolation - }), - ).rejects.toThrow('Not Found') + req, + }) + const secondResult = await payload.findByID({ + id: second.id, + collection, + req, + }) - const second = await payload.create({ - collection, - data: { - title, - }, - req, + expect(firstResult.id).toStrictEqual(first.id) + expect(secondResult.id).toStrictEqual(second.id) }) - - await commitTransaction(req) - expect(req.transactionID).toBeUndefined() - - const firstResult = await payload.findByID({ - id: first.id, - collection, - req, - }) - const secondResult = await payload.findByID({ - id: second.id, - collection, - req, - }) - - expect(firstResult.id).toStrictEqual(first.id) - expect(secondResult.id).toStrictEqual(second.id) - }) + } it('should commit multiple operations async', async () => { const req = { payload, user, - } as PayloadRequest + } as unknown as PayloadRequest let first let second @@ -373,7 +421,7 @@ describe('database', () => { const req = { payload, user, - } as PayloadRequest + } as unknown as PayloadRequest await initTransaction(req) @@ -413,157 +461,4 @@ describe('database', () => { }) }) }) - - describe('postgres v2 - v3 migration', () => { - it.skip('should collect relations to migrate', async () => { - expect(payload.db).toBeDefined() - - if (payload.db.name === 'postgres') { - const relationA1 = await payload.create({ - collection: 'relation-a', - data: { - title: 'hello A 1', - }, - }) - - const relationB1 = await payload.create({ - collection: 'relation-b', - data: { - title: 'hello B 1', - }, - }) - - const relationA2 = await payload.create({ - collection: 'relation-a', - data: { - title: 'hello A 2', - }, - }) - - const relationB2 = await payload.create({ - collection: 'relation-b', - data: { - title: 'hello B 2', - }, - }) - - const enDoc = { - myArray: [ - { - mySubArray: [ - { - relation3: relationB1.id, - }, - { - relation3: relationB2.id, - }, - ], - relation2: relationB1.id, - }, - { - mySubArray: [ - { - relation3: relationB2.id, - }, - { - relation3: relationB1.id, - }, - ], - relation2: relationB2.id, - }, - ], - myBlocks: [ - { - blockType: 'myBlock', - relation5: relationA1.id, - relation6: relationB1.id, - }, - { - blockType: 'myBlock', - relation5: relationA2.id, - relation6: relationB2.id, - }, - ], - myGroup: { - relation4: relationB1.id, - }, - relation1: relationA1.id, - } - - const migrationDoc = await payload.create({ - collection: 'pg-migrations', - data: enDoc, - locale: 'en', - }) - - const esDoc = { - myArray: [ - { - id: migrationDoc.myArray[0].id, - mySubArray: [ - { - id: migrationDoc.myArray[0].mySubArray[0].id, - relation3: relationB2.id, - }, - { - id: migrationDoc.myArray[0].mySubArray[1].id, - relation3: relationB1.id, - }, - ], - relation2: relationB2.id, - }, - { - id: migrationDoc.myArray[1].id, - mySubArray: [ - { - id: migrationDoc.myArray[1].mySubArray[0].id, - relation3: relationB1.id, - }, - { - id: migrationDoc.myArray[1].mySubArray[1].id, - relation3: relationB2.id, - }, - ], - relation2: relationB1.id, - }, - ], - myBlocks: [ - { - id: migrationDoc.myBlocks[0].id, - blockType: 'myBlock', - relation5: relationA2.id, - relation6: relationB2.id, - }, - { - id: migrationDoc.myBlocks[1].id, - blockType: 'myBlock', - relation5: relationA1.id, - relation6: relationB1.id, - }, - ], - myGroup: { - relation4: relationB2.id, - }, - relation1: relationA2.id, - } - - const updated = await payload.update({ - id: migrationDoc.id, - collection: 'pg-migrations', - data: esDoc, - fallbackLocale: null, - locale: 'es', - }) - - const req: PayloadRequest = {} as PayloadRequest - await initTransaction(req) - - await migratePostgresV2toV3({ - debug: true, - payload, - req, - }) - } - }) - }) }) diff --git a/test/helpers/reset.ts b/test/helpers/reset.ts index 054c287dad..e0a85ff896 100644 --- a/test/helpers/reset.ts +++ b/test/helpers/reset.ts @@ -1,15 +1,13 @@ -import type { PostgresAdapter } from '@payloadcms/db-postgres/types' +import type { DrizzleAdapter } from '@payloadcms/drizzle/types' import type { Payload } from 'payload' -import { sql } from 'drizzle-orm' - import { isMongoose } from './isMongoose.js' export async function resetDB(_payload: Payload, collectionSlugs: string[]) { if (isMongoose(_payload) && 'collections' in _payload.db && collectionSlugs.length > 0) { await _payload.db.collections[collectionSlugs[0]].db.dropDatabase() - } else { - const db: PostgresAdapter = _payload.db as unknown as PostgresAdapter + } else if ('drizzle' in _payload.db) { + const db = _payload.db as unknown as DrizzleAdapter // Alternative to: await db.drizzle.execute(sql`drop schema public cascade; create schema public;`) @@ -19,18 +17,16 @@ export async function resetDB(_payload: Payload, collectionSlugs: string[]) { if (!schema) { return } - const queries = Object.values(schema).map((table: any) => { - return sql.raw(`DELETE FROM ${db.schemaName ? db.schemaName + '.' : ''}${table.dbName}`) - }) - await db.drizzle.transaction(async (trx) => { - await Promise.all( - queries.map(async (query) => { - if (query) { - await trx.execute(query) - } - }), - ) + const queries = Object.values(schema) + .map((table: any) => { + return `DELETE FROM ${db.schemaName ? db.schemaName + '.' : ''}${table.dbName};` + }) + .join('') + + await db.execute({ + drizzle: db.drizzle, + raw: queries, }) } } diff --git a/test/helpers/snapshot.ts b/test/helpers/snapshot.ts index 81109b04a4..eb5fb86ba3 100644 --- a/test/helpers/snapshot.ts +++ b/test/helpers/snapshot.ts @@ -1,7 +1,10 @@ import type { PostgresAdapter } from '@payloadcms/db-postgres/types' +import type { SQLiteAdapter } from '@payloadcms/db-sqlite/types' import type { PgTable } from 'drizzle-orm/pg-core' +import type { SQLiteTable } from 'drizzle-orm/sqlite-core' import type { Payload } from 'payload' +import { GenericTable } from '@payloadcms/drizzle/types' import { sql } from 'drizzle-orm' import { isMongoose } from './isMongoose.js' @@ -42,10 +45,10 @@ async function restoreFromMongooseSnapshot(collectionsObj, snapshotKey: string) } } -async function createDrizzleSnapshot(db: PostgresAdapter, snapshotKey: string) { +async function createDrizzleSnapshot(db: PostgresAdapter | SQLiteAdapter, snapshotKey: string) { const snapshot = {} - const schema: Record = db.drizzle._.schema + const schema: Record = db.drizzle._.schema if (!schema) { return } @@ -59,34 +62,53 @@ async function createDrizzleSnapshot(db: PostgresAdapter, snapshotKey: string) { dbSnapshot[snapshotKey] = snapshot } -async function restoreFromDrizzleSnapshot(db: PostgresAdapter, snapshotKey: string) { +async function restoreFromDrizzleSnapshot( + adapter: PostgresAdapter | SQLiteAdapter, + snapshotKey: string, +) { if (!dbSnapshot[snapshotKey]) { throw new Error('No snapshot found to restore from.') } + const db = adapter.name === 'postgres' ? (adapter as PostgresAdapter) : (adapter as SQLiteAdapter) + let disableFKConstraintChecksQuery + let enableFKConstraintChecksQuery - const disableFKConstraintChecksQuery = sql.raw('SET session_replication_role = replica;') - const enableFKConstraintChecksQuery = sql.raw('SET session_replication_role = DEFAULT;') + if (db.name === 'sqlite') { + disableFKConstraintChecksQuery = 'PRAGMA foreign_keys = off' + enableFKConstraintChecksQuery = 'PRAGMA foreign_keys = on' + } + if (db.name === 'postgres') { + disableFKConstraintChecksQuery = 'SET session_replication_role = replica;' + enableFKConstraintChecksQuery = 'SET session_replication_role = DEFAULT;' + } - await db.drizzle.transaction(async (trx) => { - // Temporarily disable foreign key constraint checks - await trx.execute(disableFKConstraintChecksQuery) - try { - for (const tableName in dbSnapshot[snapshotKey]) { - const table = db.drizzle.query[tableName]['fullSchema'][tableName] - await trx.delete(table).execute() // This deletes all records from the table. Probably not necessary, as I'm deleting the table before restoring anyways + // Temporarily disable foreign key constraint checks + try { + await db.execute({ + drizzle: db.drizzle, + raw: disableFKConstraintChecksQuery, + }) + for (const tableName in dbSnapshot[snapshotKey]) { + const table = db.drizzle.query[tableName]['fullSchema'][tableName] + await db.execute({ + drizzle: db.drizzle, + sql: sql`DELETE FROM ${table}`, + }) // This deletes all records from the table. Probably not necessary, as I'm deleting the table before restoring anyways - const records = dbSnapshot[snapshotKey][tableName] - if (records.length > 0) { - await trx.insert(table).values(records).execute() - } + const records = dbSnapshot[snapshotKey][tableName] + if (records.length > 0) { + await db.drizzle.insert(table).values(records).execute() } - } catch (e) { - console.error(e) - } finally { - // Re-enable foreign key constraint checks - await trx.execute(enableFKConstraintChecksQuery) } - }) + } catch (e) { + console.error(e) + } finally { + // Re-enable foreign key constraint checks + await db.execute({ + drizzle: db.drizzle, + raw: enableFKConstraintChecksQuery, + }) + } } export async function createSnapshot( diff --git a/test/package.json b/test/package.json index d5c623ffbd..54b6987abb 100644 --- a/test/package.json +++ b/test/package.json @@ -27,6 +27,8 @@ "@lexical/markdown": "0.16.1", "@payloadcms/db-mongodb": "workspace:*", "@payloadcms/db-postgres": "workspace:*", + "@payloadcms/db-sqlite": "workspace:*", + "@payloadcms/drizzle": "workspace:*", "@payloadcms/email-nodemailer": "workspace:*", "@payloadcms/email-resend": "workspace:*", "@payloadcms/eslint-config": "workspace:*", diff --git a/test/versions/int.spec.ts b/test/versions/int.spec.ts index b177429e7a..c4c68cab6c 100644 --- a/test/versions/int.spec.ts +++ b/test/versions/int.spec.ts @@ -414,6 +414,8 @@ describe('Versions', () => { expect(latestDraft).toMatchObject({ ...versionToRestore.version, + // timestamps cannot be guaranteed to be the exact same to the milliseconds + createdAt: latestDraft.createdAt, updatedAt: latestDraft.updatedAt, }) expect(latestDraft.blocksField).toHaveLength(0) @@ -439,8 +441,8 @@ describe('Versions', () => { id: originalPublishedPost.id, collection, data: { - title: patchedTitle, _status: 'draft', + title: patchedTitle, }, draft: true, locale: 'en', @@ -453,8 +455,8 @@ describe('Versions', () => { id: originalPublishedPost.id, collection, data: { - title: spanishTitle, _status: 'draft', + title: spanishTitle, }, draft: true, locale: 'es', @@ -519,19 +521,19 @@ describe('Versions', () => { const doc = await payload.create({ collection: draftCollectionSlug, data: { - title: 'initial value', - description: 'description to bulk update', _status: 'published', + description: 'description to bulk update', + title: 'initial value', }, }) await payload.update({ - collection: draftCollectionSlug, id: doc.id, - draft: true, + collection: draftCollectionSlug, data: { title: 'updated title', }, + draft: true, }) // bulk publish @@ -600,7 +602,7 @@ describe('Versions', () => { const result = await payload.db.queryDrafts({ collection, where: { - id: { + parent: { in: drafts.docs.map(({ id }) => id), }, // appendVersionToQueryKey, @@ -687,6 +689,13 @@ describe('Versions', () => { }, }) + const result = await payload.find({ + collection: 'version-posts', + where: { + updatedAt: { less_than_equal: '2027-01-01T00:00:00.000Z' }, + }, + }) + await payload.update({ id: doc1.id, collection: 'version-posts', diff --git a/tsconfig.json b/tsconfig.json index 1e8f085400..f14df6abb2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -85,6 +85,9 @@ { "path": "./packages/db-postgres" }, + { + "path": "./packages/drizzle" + }, { "path": "./packages/graphql" },