### What? The PR #12763 added significant improvements for third-party databases that are compatible with the MongoDB API. While the original PR was focused on Firestore, other databases like DocumentDB also benefit from these compatibility features. In particular, the aggregate JOIN strategy does not work on AWS DocumentDB and thus needs to be disabled. The current PR aims to provide this as a sensible default in the `compatibilityOptions` that are provided by Payload out-of-the-box. As a bonus, it also fixes a small typo from `compat(a)bility` to `compat(i)bility`. ### Why? Because our Payload instance, which is backed by AWS DocumentDB, crashes upon trying to access any `join` field. ### How? By adding the existing `useJoinAggregations` with value `false` to the compatiblity layer. Individual developers can still choose to override it in their own local config as needed.
138 lines
3.8 KiB
TypeScript
138 lines
3.8 KiB
TypeScript
import fs from 'fs'
|
|
import path from 'node:path'
|
|
import { fileURLToPath } from 'node:url'
|
|
|
|
const filename = fileURLToPath(import.meta.url)
|
|
const dirname = path.dirname(filename)
|
|
|
|
export const allDatabaseAdapters = {
|
|
mongodb: `
|
|
import { mongooseAdapter } from '@payloadcms/db-mongodb'
|
|
|
|
export const databaseAdapter = mongooseAdapter({
|
|
ensureIndexes: true,
|
|
// required for connect to detect that we are using a memory server
|
|
mongoMemoryServer: global._mongoMemoryServer,
|
|
url:
|
|
process.env.MONGODB_MEMORY_SERVER_URI ||
|
|
process.env.DATABASE_URI ||
|
|
'mongodb://127.0.0.1/payloadtests',
|
|
collation: {
|
|
strength: 1,
|
|
},
|
|
})`,
|
|
firestore: `
|
|
import { mongooseAdapter, compatibilityOptions } from '@payloadcms/db-mongodb'
|
|
|
|
export const databaseAdapter = mongooseAdapter({
|
|
...compatibilityOptions.firestore,
|
|
url:
|
|
process.env.DATABASE_URI ||
|
|
process.env.MONGODB_MEMORY_SERVER_URI ||
|
|
'mongodb://127.0.0.1/payloadtests',
|
|
collation: {
|
|
strength: 1,
|
|
},
|
|
// The following options prevent some tests from failing.
|
|
// More work needed to get tests succeeding without these options.
|
|
ensureIndexes: true,
|
|
transactionOptions: {},
|
|
disableIndexHints: false,
|
|
useAlternativeDropDatabase: false,
|
|
})`,
|
|
postgres: `
|
|
import { postgresAdapter } from '@payloadcms/db-postgres'
|
|
|
|
export const databaseAdapter = postgresAdapter({
|
|
pool: {
|
|
connectionString: process.env.POSTGRES_URL || 'postgres://127.0.0.1:5432/payloadtests',
|
|
},
|
|
})`,
|
|
'postgres-custom-schema': `
|
|
import { postgresAdapter } from '@payloadcms/db-postgres'
|
|
|
|
export const databaseAdapter = postgresAdapter({
|
|
pool: {
|
|
connectionString: process.env.POSTGRES_URL || 'postgres://127.0.0.1:5432/payloadtests',
|
|
},
|
|
schemaName: 'custom',
|
|
})`,
|
|
'postgres-uuid': `
|
|
import { postgresAdapter } from '@payloadcms/db-postgres'
|
|
|
|
export const databaseAdapter = postgresAdapter({
|
|
idType: 'uuid',
|
|
pool: {
|
|
connectionString: process.env.POSTGRES_URL || 'postgres://127.0.0.1:5432/payloadtests',
|
|
},
|
|
})`,
|
|
'postgres-read-replica': `
|
|
import { postgresAdapter } from '@payloadcms/db-postgres'
|
|
|
|
export const databaseAdapter = postgresAdapter({
|
|
pool: {
|
|
connectionString: process.env.POSTGRES_URL,
|
|
},
|
|
readReplicas: [process.env.POSTGRES_REPLICA_URL],
|
|
})
|
|
`,
|
|
'vercel-postgres-read-replica': `
|
|
import { vercelPostgresAdapter } from '@payloadcms/db-vercel-postgres'
|
|
|
|
export const databaseAdapter = vercelPostgresAdapter({
|
|
pool: {
|
|
connectionString: process.env.POSTGRES_URL,
|
|
},
|
|
readReplicas: [process.env.POSTGRES_REPLICA_URL],
|
|
})
|
|
`,
|
|
sqlite: `
|
|
import { sqliteAdapter } from '@payloadcms/db-sqlite'
|
|
|
|
export const databaseAdapter = sqliteAdapter({
|
|
client: {
|
|
url: process.env.SQLITE_URL || 'file:./payloadtests.db',
|
|
},
|
|
autoIncrement: true
|
|
})`,
|
|
'sqlite-uuid': `
|
|
import { sqliteAdapter } from '@payloadcms/db-sqlite'
|
|
|
|
export const databaseAdapter = sqliteAdapter({
|
|
idType: 'uuid',
|
|
client: {
|
|
url: process.env.SQLITE_URL || 'file:./payloadtests.db',
|
|
},
|
|
})`,
|
|
supabase: `
|
|
import { postgresAdapter } from '@payloadcms/db-postgres'
|
|
|
|
export const databaseAdapter = postgresAdapter({
|
|
pool: {
|
|
connectionString:
|
|
process.env.POSTGRES_URL || 'postgresql://postgres:postgres@127.0.0.1:54322/postgres',
|
|
},
|
|
})`,
|
|
}
|
|
|
|
/**
|
|
* Write to databaseAdapter.ts
|
|
*/
|
|
export function generateDatabaseAdapter(dbAdapter) {
|
|
const databaseAdapter = allDatabaseAdapters[dbAdapter]
|
|
if (!databaseAdapter) {
|
|
throw new Error(`Unknown database adapter: ${dbAdapter}`)
|
|
}
|
|
fs.writeFileSync(
|
|
path.resolve(dirname, 'databaseAdapter.js'),
|
|
`
|
|
// DO NOT MODIFY. This file is automatically generated by the test suite.
|
|
|
|
${databaseAdapter}
|
|
`,
|
|
)
|
|
|
|
console.log('Wrote', dbAdapter, 'db adapter')
|
|
return databaseAdapter
|
|
}
|