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 { type PgSchema, pgEnum, pgSchema, pgTable } from 'drizzle-orm/pg-core' import { createDatabaseAdapter } from 'payload' import type { Args, PostgresAdapter } 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 postgresAdapter(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: 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, drizzle: undefined, enums: {}, features: { json: true, }, fieldConstraints: {}, getMigrationTemplate, idType: postgresIDType, initializing, localesSuffix: args.localesSuffix || '_locales', logger: args.logger, operators: operatorMap, pgSchema: adapterSchema, pool: undefined, poolOptions: args.pool, 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, } }