From 075819964d6598395759abd326872d6849323576 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Wed, 31 Jul 2024 16:42:00 -0400 Subject: [PATCH] fix(db-postgres, db-sqlite): enum schema (#7453) - updates drizzle-kit and drizzle-orm - fix enum creation to fully support custom schemas - sqlite by default will not use transactions --- .github/workflows/main.yml | 1 + package.json | 2 +- packages/db-postgres/package.json | 4 +- packages/db-postgres/src/connect.ts | 1 + packages/db-postgres/src/createMigration.ts | 6 + packages/db-postgres/src/defaultSnapshot.ts | 5 +- packages/db-postgres/src/index.ts | 10 +- packages/db-postgres/src/init.ts | 8 +- .../db-postgres/src/schema/createIndex.ts | 1 - .../db-postgres/src/schema/traverseFields.ts | 3 +- packages/db-postgres/src/types.ts | 12 +- packages/db-sqlite/package.json | 4 +- packages/db-sqlite/src/defaultSnapshot.ts | 2 +- packages/db-sqlite/src/index.ts | 2 +- packages/db-sqlite/src/schema/build.ts | 18 +- packages/db-sqlite/src/schema/createIndex.ts | 7 +- packages/db-sqlite/src/types.ts | 22 +-- packages/drizzle/package.json | 2 +- packages/drizzle/src/types.ts | 1 + .../drizzle/src/utilities/pushDevSchema.ts | 6 +- pnpm-lock.yaml | 168 +++++------------ test/database/int.spec.ts | 174 +++++++++--------- test/hooks/collections/Hook/index.ts | 4 +- 23 files changed, 185 insertions(+), 278 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 83cd3c246f..32b7553b09 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -196,6 +196,7 @@ jobs: - postgres-custom-schema - postgres-uuid - supabase + - sqlite env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres diff --git a/package.json b/package.json index 13a01d75d9..96b4c86f29 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ "create-payload-app": "workspace:*", "cross-env": "7.0.3", "dotenv": "16.4.5", - "drizzle-orm": "0.29.4", + "drizzle-orm": "0.32.1", "escape-html": "^1.0.3", "execa": "5.1.1", "form-data": "3.0.1", diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index 56ccd1f994..9dd59d4ffa 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -47,8 +47,8 @@ "dependencies": { "@payloadcms/drizzle": "workspace:*", "console-table-printer": "2.11.2", - "drizzle-kit": "0.20.14-1f2c838", - "drizzle-orm": "0.29.4", + "drizzle-kit": "0.23.1-7816536", + "drizzle-orm": "0.32.1", "pg": "8.11.3", "prompts": "2.4.2", "to-snake-case": "1.0.0", diff --git a/packages/db-postgres/src/connect.ts b/packages/db-postgres/src/connect.ts index b05c0c74cc..1e7be5ae3c 100644 --- a/packages/db-postgres/src/connect.ts +++ b/packages/db-postgres/src/connect.ts @@ -53,6 +53,7 @@ export const connect: Connect = async function connect( const { hotReload } = options this.schema = { + pgSchema: this.pgSchema, ...this.tables, ...this.relations, ...this.enums, diff --git a/packages/db-postgres/src/createMigration.ts b/packages/db-postgres/src/createMigration.ts index e25b355990..43ce0e412b 100644 --- a/packages/db-postgres/src/createMigration.ts +++ b/packages/db-postgres/src/createMigration.ts @@ -49,6 +49,12 @@ export const createMigration: CreateMigration = async function createMigration( let drizzleJsonBefore = defaultDrizzleSnapshot + if (this.schemaName) { + drizzleJsonBefore.schemas = { + [this.schemaName]: this.schemaName, + } + } + if (!upSQL) { // Get latest migration snapshot const latestSnapshot = fs diff --git a/packages/db-postgres/src/defaultSnapshot.ts b/packages/db-postgres/src/defaultSnapshot.ts index e3453c35d4..ec1a3aa7a0 100644 --- a/packages/db-postgres/src/defaultSnapshot.ts +++ b/packages/db-postgres/src/defaultSnapshot.ts @@ -7,10 +7,11 @@ export const defaultDrizzleSnapshot: DrizzleSnapshotJSON = { schemas: {}, tables: {}, }, - dialect: 'pg', + dialect: 'postgresql', enums: {}, prevId: '00000000-0000-0000-0000-00000000000', schemas: {}, + sequences: {}, tables: {}, - version: '5', + version: '7', } diff --git a/packages/db-postgres/src/index.ts b/packages/db-postgres/src/index.ts index c426753670..4aa41696f3 100644 --- a/packages/db-postgres/src/index.ts +++ b/packages/db-postgres/src/index.ts @@ -32,6 +32,7 @@ import { updateOne, updateVersion, } from '@payloadcms/drizzle' +import { type PgSchema, pgEnum, pgSchema, pgTable } from 'drizzle-orm/pg-core' import { createDatabaseAdapter } from 'payload' import type { Args, PostgresAdapter } from './types.js' @@ -62,12 +63,19 @@ export function postgresAdapter(args: Args): DatabaseAdapterObj const migrationDir = findMigrationDir(args.migrationDir) let resolveInitializing let rejectInitializing + let adapterSchema: PostgresAdapter['pgSchema'] const initializing = new Promise((res, rej) => { resolveInitializing = res rejectInitializing = rej }) + if (args.schemaName) { + adapterSchema = pgSchema(args.schemaName) + } else { + adapterSchema = { enum: pgEnum, table: pgTable } + } + return createDatabaseAdapter({ name: 'postgres', defaultDrizzleSnapshot, @@ -83,7 +91,7 @@ export function postgresAdapter(args: Args): DatabaseAdapterObj localesSuffix: args.localesSuffix || '_locales', logger: args.logger, operators: operatorMap, - pgSchema: undefined, + pgSchema: adapterSchema, pool: undefined, poolOptions: args.pool, push: args.push, diff --git a/packages/db-postgres/src/init.ts b/packages/db-postgres/src/init.ts index afdc07e122..6836f251d6 100644 --- a/packages/db-postgres/src/init.ts +++ b/packages/db-postgres/src/init.ts @@ -1,7 +1,6 @@ import type { Init, SanitizedCollectionConfig } from 'payload' import { createTableName } from '@payloadcms/drizzle' -import { pgEnum, pgSchema, pgTable } from 'drizzle-orm/pg-core' import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload' import toSnakeCase from 'to-snake-case' @@ -10,13 +9,8 @@ import type { PostgresAdapter } from './types.js' import { buildTable } from './schema/build.js' export const init: Init = function init(this: PostgresAdapter) { - if (this.schemaName) { - this.pgSchema = pgSchema(this.schemaName) - } else { - this.pgSchema = { table: pgTable } - } if (this.payload.config.localization) { - this.enums.enum__locales = pgEnum( + this.enums.enum__locales = this.pgSchema.enum( '_locales', this.payload.config.localization.locales.map(({ code }) => code) as [string, ...string[]], ) diff --git a/packages/db-postgres/src/schema/createIndex.ts b/packages/db-postgres/src/schema/createIndex.ts index bb754624a6..bda062639c 100644 --- a/packages/db-postgres/src/schema/createIndex.ts +++ b/packages/db-postgres/src/schema/createIndex.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-param-reassign */ import { index, uniqueIndex } from 'drizzle-orm/pg-core' import type { GenericColumn } from '../types.js' diff --git a/packages/db-postgres/src/schema/traverseFields.ts b/packages/db-postgres/src/schema/traverseFields.ts index 5d014495d4..5eb46bcdae 100644 --- a/packages/db-postgres/src/schema/traverseFields.ts +++ b/packages/db-postgres/src/schema/traverseFields.ts @@ -18,7 +18,6 @@ import { integer, jsonb, numeric, - pgEnum, text, timestamp, varchar, @@ -237,7 +236,7 @@ export const traverseFields = ({ throwValidationError, }) - adapter.enums[enumName] = pgEnum( + adapter.enums[enumName] = adapter.pgSchema.enum( enumName, field.options.map((option) => { if (optionIsObject(option)) { diff --git a/packages/db-postgres/src/types.ts b/packages/db-postgres/src/types.ts index e3e7984932..d60559ce37 100644 --- a/packages/db-postgres/src/types.ts +++ b/packages/db-postgres/src/types.ts @@ -21,6 +21,7 @@ import type { PgSchema, PgTableWithColumns, PgTransactionConfig, + pgEnum, } from 'drizzle-orm/pg-core' import type { PgTableFn } from 'drizzle-orm/pg-core/table' import type { Payload, PayloadRequest } from 'payload' @@ -106,6 +107,13 @@ type PostgresDrizzleAdapter = Omit< | 'relations' > +type Schema = + | { + enum: typeof pgEnum + table: PgTableFn + } + | PgSchema + export type PostgresAdapter = { countDistinct: CountDistinct defaultDrizzleSnapshot: DrizzleSnapshotJSON @@ -125,7 +133,7 @@ export type PostgresAdapter = { localesSuffix?: string logger: DrizzleConfig['logger'] operators: Operators - pgSchema?: { table: PgTableFn } | PgSchema + pgSchema?: Schema pool: Pool poolOptions: Args['pool'] push: boolean @@ -133,7 +141,7 @@ export type PostgresAdapter = { relations: Record relationshipsSuffix?: string resolveInitializing: () => void - schema: Record + schema: DrizzleConfig schemaName?: Args['schemaName'] sessions: { [id: string]: { diff --git a/packages/db-sqlite/package.json b/packages/db-sqlite/package.json index 74abb5546a..cd5ec2573f 100644 --- a/packages/db-sqlite/package.json +++ b/packages/db-sqlite/package.json @@ -46,8 +46,8 @@ "@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", + "drizzle-kit": "0.23.1-7816536", + "drizzle-orm": "0.32.1", "prompts": "2.4.2", "to-snake-case": "1.0.0", "uuid": "9.0.0" diff --git a/packages/db-sqlite/src/defaultSnapshot.ts b/packages/db-sqlite/src/defaultSnapshot.ts index cfcbb71cb7..ffd0378354 100644 --- a/packages/db-sqlite/src/defaultSnapshot.ts +++ b/packages/db-sqlite/src/defaultSnapshot.ts @@ -10,5 +10,5 @@ export const defaultDrizzleSnapshot: DrizzleSQLiteSnapshotJSON = { enums: {}, prevId: '00000000-0000-0000-0000-00000000000', tables: {}, - version: '5', + version: '6', } diff --git a/packages/db-sqlite/src/index.ts b/packages/db-sqlite/src/index.ts index 834f70e503..2a1377033d 100644 --- a/packages/db-sqlite/src/index.ts +++ b/packages/db-sqlite/src/index.ts @@ -105,7 +105,7 @@ export function sqliteAdapter(args: Args): DatabaseAdapterObj { versionsSuffix: args.versionsSuffix || '_v', // DatabaseAdapter - beginTransaction: args.transactionOptions === false ? undefined : beginTransaction, + beginTransaction: args.transactionOptions ? beginTransaction : undefined, commitTransaction, connect, convertPathToJSONTraversal, diff --git a/packages/db-sqlite/src/schema/build.ts b/packages/db-sqlite/src/schema/build.ts index 9622c33760..163d8501d1 100644 --- a/packages/db-sqlite/src/schema/build.ts +++ b/packages/db-sqlite/src/schema/build.ts @@ -1,9 +1,8 @@ -/* eslint-disable no-param-reassign */ -import type { ColumnDataType, Relation } from 'drizzle-orm' +import type { Relation } from 'drizzle-orm' import type { + AnySQLiteColumn, ForeignKeyBuilder, IndexBuilder, - SQLiteColumn, SQLiteColumnBuilder, SQLiteTableWithColumns, UniqueConstraintBuilder, @@ -32,18 +31,7 @@ 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 - }> + [x: string]: AnySQLiteColumn }) => ForeignKeyBuilder | IndexBuilder | UniqueConstraintBuilder > diff --git a/packages/db-sqlite/src/schema/createIndex.ts b/packages/db-sqlite/src/schema/createIndex.ts index e96d7c45f2..0912a13608 100644 --- a/packages/db-sqlite/src/schema/createIndex.ts +++ b/packages/db-sqlite/src/schema/createIndex.ts @@ -1,7 +1,6 @@ -/* eslint-disable no-param-reassign */ -import { index, uniqueIndex } from 'drizzle-orm/sqlite-core' +import type { AnySQLiteColumn} from 'drizzle-orm/sqlite-core'; -import type { GenericColumn } from '../types.js' +import { index, uniqueIndex } from 'drizzle-orm/sqlite-core' type CreateIndexArgs = { columnName: string @@ -11,7 +10,7 @@ type CreateIndexArgs = { } export const createIndex = ({ name, columnName, tableName, unique }: CreateIndexArgs) => { - return (table: { [x: string]: GenericColumn }) => { + return (table: { [x: string]: AnySQLiteColumn }) => { let columns if (Array.isArray(name)) { columns = name diff --git a/packages/db-sqlite/src/types.ts b/packages/db-sqlite/src/types.ts index ef0083e735..8fad054539 100644 --- a/packages/db-sqlite/src/types.ts +++ b/packages/db-sqlite/src/types.ts @@ -1,10 +1,10 @@ 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 { DrizzleConfig, Relation, Relations, SQL } from 'drizzle-orm' import type { LibSQLDatabase } from 'drizzle-orm/libsql' import type { - SQLiteColumn, + AnySQLiteColumn, SQLiteInsertOnConflictDoUpdateConfig, SQLiteTableWithColumns, SQLiteTransactionConfig, @@ -25,24 +25,8 @@ export type Args = { 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 + [x: string]: AnySQLiteColumn } export type GenericTable = SQLiteTableWithColumns<{ diff --git a/packages/drizzle/package.json b/packages/drizzle/package.json index 1667b92a50..590958167c 100644 --- a/packages/drizzle/package.json +++ b/packages/drizzle/package.json @@ -39,7 +39,7 @@ }, "dependencies": { "console-table-printer": "2.11.2", - "drizzle-orm": "0.29.4", + "drizzle-orm": "0.32.1", "prompts": "2.4.2", "to-snake-case": "1.0.0", "uuid": "9.0.0" diff --git a/packages/drizzle/src/types.ts b/packages/drizzle/src/types.ts index 6a7002d6ea..e8e6ef22e6 100644 --- a/packages/drizzle/src/types.ts +++ b/packages/drizzle/src/types.ts @@ -120,6 +120,7 @@ export type RequireDrizzleKit = () => { pushSchema: ( schema: Record, drizzle: DrizzleAdapter['drizzle'], + filterSchema?: string[], ) => Promise<{ apply; hasDataLoss; warnings }> } diff --git a/packages/drizzle/src/utilities/pushDevSchema.ts b/packages/drizzle/src/utilities/pushDevSchema.ts index 253948ef03..3a23bcb088 100644 --- a/packages/drizzle/src/utilities/pushDevSchema.ts +++ b/packages/drizzle/src/utilities/pushDevSchema.ts @@ -12,7 +12,11 @@ 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) + const { apply, hasDataLoss, warnings } = await pushSchema( + adapter.schema, + adapter.drizzle, + adapter.schemaName ? [adapter.schemaName] : undefined, + ) if (warnings.length) { let message = `Warnings detected during schema push: \n\n${warnings.join('\n')}\n\n` diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a2180c5f7c..0b55922cdd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ overrides: copyfiles: 2.4.1 cross-env: 7.0.3 dotenv: 16.4.5 - drizzle-orm: 0.29.4 + drizzle-orm: 0.32.1 graphql: ^16.8.1 mongodb-memory-server: ^9.0 react: ^19.0.0-rc-6230622a1a-20240610 @@ -102,8 +102,8 @@ importers: specifier: 16.4.5 version: 16.4.5 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) + specifier: 0.32.1 + version: 0.32.1(@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 @@ -302,11 +302,11 @@ importers: specifier: 2.11.2 version: 2.11.2 drizzle-kit: - specifier: 0.20.14-1f2c838 - version: 0.20.14-1f2c838 + specifier: 0.23.1-7816536 + version: 0.23.1-7816536 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) + specifier: 0.32.1 + version: 0.32.1(@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 @@ -351,11 +351,11 @@ importers: specifier: 2.11.2 version: 2.11.2 drizzle-kit: - specifier: 0.20.14-1f2c838 - version: 0.20.14-1f2c838 + specifier: 0.23.1-7816536 + version: 0.23.1-7816536 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) + specifier: 0.32.1 + version: 0.32.1(@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 @@ -385,8 +385,8 @@ importers: 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) + specifier: 0.32.1 + version: 0.32.1(@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 @@ -3986,10 +3986,8 @@ packages: tslib: 2.6.3 dev: false - /@drizzle-team/studio@0.0.39: - resolution: {integrity: sha512-c5Hkm7MmQC2n5qAsKShjQrHoqlfGslB8+qWzsGGZ+2dHMRTNG60UuzalF0h0rvBax5uzPXuGkYLGaQ+TUX3yMw==} - dependencies: - superjson: 2.2.1 + /@drizzle-team/brocli@0.8.2: + resolution: {integrity: sha512-zTrFENsqGvOkBOuHDC1pXCkDXNd2UhP4lI3gYGhQ1R1SPeAAfqzPsV1dcpMy4uNU6kB5VpU5NGhvwxVNETR02A==} dev: false /@effect/schema@0.68.12(effect@3.4.5): @@ -8274,11 +8272,6 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - /camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: false - /caniuse-lite@1.0.30001641: resolution: {integrity: sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==} @@ -8300,6 +8293,7 @@ packages: /chalk@5.3.0: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true /changelogen@0.5.5: resolution: {integrity: sha512-IzgToIJ/R9NhVKmL+PW33ozYkv53bXvufDNUSH3GTKXq1iCHGgkbgbtqEWbo8tnWNnt7nPDpjL8PwSG2iS8RVw==} @@ -8513,11 +8507,6 @@ packages: engines: {node: '>= 12'} dev: true - /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==} engines: {node: '>= 6'} @@ -8605,13 +8594,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /copy-anything@3.0.5: - resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} - engines: {node: '>=12.13'} - dependencies: - is-what: 4.1.16 - dev: false - /copyfiles@2.4.1: resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} hasBin: true @@ -9016,12 +8998,6 @@ packages: engines: {node: '>=0.3.1'} dev: false - /difflib@0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} - dependencies: - heap: 0.2.7 - dev: false - /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -9087,49 +9063,37 @@ packages: engines: {node: '>=12'} dev: true - /dreamopt@0.8.0: - resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} - engines: {node: '>=0.4.0'} - dependencies: - wordwrap: 1.0.0 - dev: false - - /drizzle-kit@0.20.14-1f2c838: - resolution: {integrity: sha512-Gun36T6RcfwrZAZ+Gk2ZeWJtvUhO002H/SvkY9BNcsACvhsd4OxkkxzrznuZ3Kz5NEdg12k7yvZqNoimPp68aw==} + /drizzle-kit@0.23.1-7816536: + resolution: {integrity: sha512-mc7Mo8Kuze3VJSccOjuOSibCRgMvyshp0r6ZVnGVAo+hgLgfIjOkyVIPDadzNFwGCH01j7gmjI1CkO8uvORuJg==} hasBin: true dependencies: - '@drizzle-team/studio': 0.0.39 + '@drizzle-team/brocli': 0.8.2 '@esbuild-kit/esm-loader': 2.6.5 - camelcase: 7.0.1 - chalk: 5.3.0 - commander: 9.5.0 - env-paths: 3.0.0 esbuild: 0.19.12 esbuild-register: 3.5.0(esbuild@0.19.12) - glob: 8.1.0 - hanji: 0.0.5 - json-diff: 0.9.0 - minimatch: 7.4.6 - semver: 7.6.2 - zod: 3.23.8 transitivePeerDependencies: - supports-color dev: false - /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==} + /drizzle-orm@0.32.1(@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-Wq1J+lL8PzwR5K3a1FfoWsbs8powjr3pGA4+5+2ueN1VTLDNFYEolUyUWFtqy8DVRvYbL2n7sXZkgVmK9dQkng==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=3' + '@electric-sql/pglite': '>=0.1.1' '@libsql/client': '*' '@neondatabase/serverless': '>=0.1' + '@op-engineering/op-sqlite': '>=2' '@opentelemetry/api': ^1.4.1 '@planetscale/database': '>=1' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' '@types/better-sqlite3': '*' '@types/pg': '*' '@types/react': npm:types-react@19.0.0-rc.0 '@types/sql.js': '*' - '@vercel/postgres': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' better-sqlite3: '>=7' bun-types: '*' expo-sqlite: '>=13.2.0' @@ -9138,6 +9102,7 @@ packages: mysql2: '>=2' pg: '>=8' postgres: '>=3' + prisma: '*' react: ^19.0.0-rc-6230622a1a-20240610 sql.js: '>=1' sqlite3: '>=5' @@ -9146,14 +9111,22 @@ packages: optional: true '@cloudflare/workers-types': optional: true + '@electric-sql/pglite': + optional: true '@libsql/client': optional: true '@neondatabase/serverless': optional: true + '@op-engineering/op-sqlite': + optional: true '@opentelemetry/api': optional: true '@planetscale/database': optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true '@types/better-sqlite3': optional: true '@types/pg': @@ -9164,6 +9137,8 @@ packages: optional: true '@vercel/postgres': optional: true + '@xata.io/client': + optional: true better-sqlite3: optional: true bun-types: @@ -9180,6 +9155,8 @@ packages: optional: true postgres: optional: true + prisma: + optional: true react: optional: true sql.js: @@ -9270,11 +9247,6 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - /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==} dependencies: @@ -10746,18 +10718,6 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: false - /global-modules@1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} engines: {node: '>=0.10.0'} @@ -10917,13 +10877,6 @@ packages: duplexer: 0.1.2 dev: true - /hanji@0.0.5: - resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} - 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==} dev: false @@ -10969,10 +10922,6 @@ packages: dependencies: function-bind: 1.1.2 - /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==} dev: false @@ -11520,11 +11469,6 @@ packages: get-intrinsic: 1.2.4 dev: false - /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==} engines: {node: '>=0.10.0'} @@ -12191,15 +12135,6 @@ packages: /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - /json-diff@0.9.0: - resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==} - hasBin: true - dependencies: - 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==} @@ -12463,10 +12398,6 @@ packages: /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - /lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - dev: false - /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -12662,13 +12593,7 @@ packages: engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 - - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: false + dev: true /minimatch@9.0.1: resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} @@ -15297,13 +15222,6 @@ packages: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} dev: false - /superjson@2.2.1: - resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} - engines: {node: '>=16'} - dependencies: - copy-anything: 3.0.5 - dev: false - /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -16212,10 +16130,6 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - /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==} engines: {node: '>=10'} diff --git a/test/database/int.spec.ts b/test/database/int.spec.ts index a976034a5b..9f5125bf1b 100644 --- a/test/database/int.spec.ts +++ b/test/database/int.spec.ts @@ -361,103 +361,103 @@ describe('database', () => { expect(firstResult.id).toStrictEqual(first.id) expect(secondResult.id).toStrictEqual(second.id) }) - } - it('should commit multiple operations async', async () => { - const req = { - payload, - user, - } as unknown as PayloadRequest + it('should commit multiple operations async', async () => { + const req = { + payload, + user, + } as unknown as PayloadRequest - let first - let second + let first + let second - const firstReq = payload - .create({ - collection, - data: { - title, - }, - req, - }) - .then((res) => { - first = res - }) + const firstReq = payload + .create({ + collection, + data: { + title, + }, + req, + }) + .then((res) => { + first = res + }) - const secondReq = payload - .create({ - collection, - data: { - title, - }, - req, - }) - .then((res) => { - second = res - }) + const secondReq = payload + .create({ + collection, + data: { + title, + }, + req, + }) + .then((res) => { + second = res + }) - await Promise.all([firstReq, secondReq]) + await Promise.all([firstReq, secondReq]) - await commitTransaction(req) - expect(req.transactionID).toBeUndefined() + 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 rollback operations on failure', async () => { - const req = { - payload, - user, - } as unknown as PayloadRequest - - await initTransaction(req) - - const first = await payload.create({ - collection, - data: { - title, - }, - req, - }) - - try { - await payload.create({ - collection, - data: { - throwAfterChange: true, - title, - }, - req, - }) - } catch (error: unknown) { - // catch error and carry on - } - - expect(req.transactionID).toBeFalsy() - - // this should not do anything but is needed to be certain about the next assertion - await commitTransaction(req) - - await expect(() => - payload.findByID({ + const firstResult = await payload.findByID({ id: first.id, collection, req, - }), - ).rejects.toThrow('Not Found') - }) + }) + const secondResult = await payload.findByID({ + id: second.id, + collection, + req, + }) + + expect(firstResult.id).toStrictEqual(first.id) + expect(secondResult.id).toStrictEqual(second.id) + }) + + it('should rollback operations on failure', async () => { + const req = { + payload, + user, + } as unknown as PayloadRequest + + await initTransaction(req) + + const first = await payload.create({ + collection, + data: { + title, + }, + req, + }) + + try { + await payload.create({ + collection, + data: { + throwAfterChange: true, + title, + }, + req, + }) + } catch (error: unknown) { + // catch error and carry on + } + + expect(req.transactionID).toBeFalsy() + + // this should not do anything but is needed to be certain about the next assertion + await commitTransaction(req) + + await expect(() => + payload.findByID({ + id: first.id, + collection, + req, + }), + ).rejects.toThrow('Not Found') + }) + } }) }) diff --git a/test/hooks/collections/Hook/index.ts b/test/hooks/collections/Hook/index.ts index 499b3c8d8b..71eea6f2c0 100644 --- a/test/hooks/collections/Hook/index.ts +++ b/test/hooks/collections/Hook/index.ts @@ -11,8 +11,8 @@ const Hooks: CollectionConfig = { }, hooks: { beforeOperation: [ - ({ req, operation }) => { - if (!req.transactionID && ['create', 'delete', 'update'].includes(operation)) { + ({ operation, req }) => { + if (typeof req.payload.db.beginTransaction === 'function' && !req.transactionID && ['create', 'delete', 'update'].includes(operation)) { throw new Error('transactionID is missing in beforeOperation hook') } },