import type { DatabaseAdapterObj, Payload } from 'payload' import { beginTransaction, commitTransaction, count, countGlobalVersions, countVersions, 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 { convertPathToJSONTraversal, countDistinct, createDatabase, createExtensions, createJSONQuery, createMigration, defaultDrizzleSnapshot, deleteWhere, dropDatabase, execute, getMigrationTemplate, init, insert, requireDrizzleKit, } from '@payloadcms/drizzle/postgres' import { pgEnum, pgSchema, pgTable } from 'drizzle-orm/pg-core' import { createDatabaseAdapter, defaultBeginTransaction } from 'payload' import type { Args, VercelPostgresAdapter } from './types.js' import { connect } from './connect.js' export function vercelPostgresAdapter(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 let adapterSchema: VercelPostgresAdapter['pgSchema'] const initializing = new Promise((res, rej) => { resolveInitializing = res rejectInitializing = rej }) if (args.schemaName) { adapterSchema = pgSchema(args.schemaName) } else { adapterSchema = { enum: pgEnum, table: pgTable } } const extensions = (args.extensions ?? []).reduce((acc, name) => { acc[name] = true return acc }, {}) return createDatabaseAdapter({ name: 'postgres', afterSchemaInit: args.afterSchemaInit ?? [], beforeSchemaInit: args.beforeSchemaInit ?? [], createDatabase, createExtensions, defaultDrizzleSnapshot, disableCreateDatabase: args.disableCreateDatabase ?? false, drizzle: undefined, enums: {}, extensions, features: { json: true, }, fieldConstraints: {}, getMigrationTemplate, idType: postgresIDType, indexes: new Set(), initializing, localesSuffix: args.localesSuffix || '_locales', logger: args.logger, operators: operatorMap, pgSchema: adapterSchema, pool: undefined, poolOptions: args.pool, prodMigrations: args.prodMigrations, push: args.push, relations: {}, relationshipsSuffix: args.relationshipsSuffix || '_rels', schema: {}, schemaName: args.schemaName, sessions: {}, tableNameMap: new Map(), tables: {}, tablesFilter: args.tablesFilter, transactionOptions: args.transactionOptions || undefined, versionsSuffix: args.versionsSuffix || '_v', // DatabaseAdapter beginTransaction: args.transactionOptions === false ? defaultBeginTransaction() : beginTransaction, commitTransaction, connect, convertPathToJSONTraversal, count, countDistinct, countGlobalVersions, countVersions, 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, packageName: '@payloadcms/db-vercel-postgres', payload, queryDrafts, rejectInitializing, requireDrizzleKit, resolveInitializing, rollbackTransaction, updateGlobal, updateGlobalVersion, updateOne, updateVersion, upsert: updateOne, }) } return { defaultIDType: payloadIDType, init: adapter, } } export type { MigrateDownArgs, MigrateUpArgs } from '@payloadcms/drizzle/postgres' export { sql } from 'drizzle-orm'