This PR allows to have full type safety on `payload.drizzle` with a single command ```sh pnpm payload generate:db-schema ``` Which generates TypeScript code with Drizzle declarations based on the current database schema. Example of generated file with the website template: https://gist.github.com/r1tsuu/b8687f211b51d9a3a7e78ba41e8fbf03 Video that shows the power: https://github.com/user-attachments/assets/3ced958b-ec1d-49f5-9f51-d859d5fae236 We also now proxy drizzle package the same way we do for Lexical so you don't have to install it (and you shouldn't because you may have version mismatch). Instead, you can import from Drizzle like this: ```ts import { pgTable, index, foreignKey, integer, text, varchar, jsonb, boolean, numeric, serial, timestamp, uniqueIndex, pgEnum, } from '@payloadcms/db-postgres/drizzle/pg-core' import { sql } from '@payloadcms/db-postgres/drizzle' import { relations } from '@payloadcms/db-postgres/drizzle/relations' ``` Fixes https://github.com/payloadcms/payload/discussions/4318 In the future we can also support types generation for mongoose / raw mongodb results.
203 lines
5.0 KiB
TypeScript
203 lines
5.0 KiB
TypeScript
import type { DatabaseAdapterObj, Payload } from 'payload'
|
|
|
|
import {
|
|
beginTransaction,
|
|
buildCreateMigration,
|
|
commitTransaction,
|
|
count,
|
|
countGlobalVersions,
|
|
countVersions,
|
|
create,
|
|
createGlobal,
|
|
createGlobalVersion,
|
|
createSchemaGenerator,
|
|
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 {
|
|
columnToCodeConverter,
|
|
countDistinct,
|
|
createDatabase,
|
|
createExtensions,
|
|
createJSONQuery,
|
|
defaultDrizzleSnapshot,
|
|
deleteWhere,
|
|
dropDatabase,
|
|
execute,
|
|
init,
|
|
insert,
|
|
requireDrizzleKit,
|
|
} from '@payloadcms/drizzle/postgres'
|
|
import { pgEnum, pgSchema, pgTable } from 'drizzle-orm/pg-core'
|
|
import { createDatabaseAdapter, defaultBeginTransaction } from 'payload'
|
|
import { fileURLToPath } from 'url'
|
|
|
|
import type { Args, PostgresAdapter } from './types.js'
|
|
|
|
import { connect } from './connect.js'
|
|
|
|
const filename = fileURLToPath(import.meta.url)
|
|
|
|
export function postgresAdapter(args: Args): DatabaseAdapterObj<PostgresAdapter> {
|
|
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<void>((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<PostgresAdapter>({
|
|
name: 'postgres',
|
|
afterSchemaInit: args.afterSchemaInit ?? [],
|
|
beforeSchemaInit: args.beforeSchemaInit ?? [],
|
|
createDatabase,
|
|
createExtensions,
|
|
createMigration: buildCreateMigration({
|
|
executeMethod: 'execute',
|
|
filename,
|
|
sanitizeStatements({ sqlExecute, statements }) {
|
|
return `${sqlExecute}\n ${statements.join('\n')}\`)`
|
|
},
|
|
}),
|
|
defaultDrizzleSnapshot,
|
|
disableCreateDatabase: args.disableCreateDatabase ?? false,
|
|
drizzle: undefined,
|
|
enums: {},
|
|
extensions,
|
|
features: {
|
|
json: true,
|
|
},
|
|
fieldConstraints: {},
|
|
generateSchema: createSchemaGenerator({
|
|
columnToCodeConverter,
|
|
corePackageSuffix: 'pg-core',
|
|
defaultOutputFile: args.generateSchemaOutputFile,
|
|
enumImport: 'pgEnum',
|
|
schemaImport: 'pgSchema',
|
|
tableImport: 'pgTable',
|
|
}),
|
|
idType: postgresIDType,
|
|
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<string, string>(),
|
|
tables: {},
|
|
tablesFilter: args.tablesFilter,
|
|
transactionOptions: args.transactionOptions || undefined,
|
|
versionsSuffix: args.versionsSuffix || '_v',
|
|
|
|
// DatabaseAdapter
|
|
beginTransaction:
|
|
args.transactionOptions === false ? defaultBeginTransaction() : beginTransaction,
|
|
commitTransaction,
|
|
connect,
|
|
count,
|
|
countDistinct,
|
|
countGlobalVersions,
|
|
countVersions,
|
|
create,
|
|
createGlobal,
|
|
createGlobalVersion,
|
|
createJSONQuery,
|
|
createVersion,
|
|
defaultIDType: payloadIDType,
|
|
deleteMany,
|
|
deleteOne,
|
|
deleteVersions,
|
|
deleteWhere,
|
|
destroy,
|
|
dropDatabase,
|
|
execute,
|
|
find,
|
|
findGlobal,
|
|
findGlobalVersions,
|
|
findOne,
|
|
findVersions,
|
|
indexes: new Set<string>(),
|
|
init,
|
|
insert,
|
|
migrate,
|
|
migrateDown,
|
|
migrateFresh,
|
|
migrateRefresh,
|
|
migrateReset,
|
|
migrateStatus,
|
|
migrationDir,
|
|
packageName: '@payloadcms/db-postgres',
|
|
payload,
|
|
queryDrafts,
|
|
rawRelations: {},
|
|
rawTables: {},
|
|
rejectInitializing,
|
|
requireDrizzleKit,
|
|
resolveInitializing,
|
|
rollbackTransaction,
|
|
updateGlobal,
|
|
updateGlobalVersion,
|
|
updateOne,
|
|
updateVersion,
|
|
upsert: updateOne,
|
|
})
|
|
}
|
|
|
|
return {
|
|
defaultIDType: payloadIDType,
|
|
init: adapter,
|
|
}
|
|
}
|
|
|
|
export type { MigrateDownArgs, MigrateUpArgs } from '@payloadcms/drizzle/postgres'
|
|
export { geometryColumn } from '@payloadcms/drizzle/postgres'
|
|
export { sql } from 'drizzle-orm'
|