fix(db-postgres): create relationship-v2-v3 migration (#9178)

### What?
This command from here:
https://github.com/payloadcms/payload/pull/6339
```sh
payload migrate:create --file @payloadcms/db-postgres/relationships-v2-v3
```
stopped working after db-postgers and drizzle packages were separated 

### How?
Passes correct `dirname` to `getPredefinedMigration`

Additionally, adds support for `.js` files in `getPredefinedMigration`
This commit is contained in:
Sasha
2024-11-13 21:02:17 +02:00
committed by GitHub
parent bcbca0e44a
commit 5b9cee67c0
5 changed files with 37 additions and 22 deletions

View File

@@ -50,12 +50,17 @@ import {
requireDrizzleKit, requireDrizzleKit,
} from '@payloadcms/drizzle/postgres' } from '@payloadcms/drizzle/postgres'
import { pgEnum, pgSchema, pgTable } from 'drizzle-orm/pg-core' import { pgEnum, pgSchema, pgTable } from 'drizzle-orm/pg-core'
import path from 'path'
import { createDatabaseAdapter, defaultBeginTransaction } from 'payload' import { createDatabaseAdapter, defaultBeginTransaction } from 'payload'
import { fileURLToPath } from 'url'
import type { Args, PostgresAdapter } from './types.js' import type { Args, PostgresAdapter } from './types.js'
import { connect } from './connect.js' import { connect } from './connect.js'
const filename = fileURLToPath(import.meta.url)
const dirname = path.dirname(filename)
export function postgresAdapter(args: Args): DatabaseAdapterObj<PostgresAdapter> { export function postgresAdapter(args: Args): DatabaseAdapterObj<PostgresAdapter> {
const postgresIDType = args.idType || 'serial' const postgresIDType = args.idType || 'serial'
const payloadIDType = postgresIDType === 'serial' ? 'number' : 'text' const payloadIDType = postgresIDType === 'serial' ? 'number' : 'text'
@@ -88,6 +93,9 @@ export function postgresAdapter(args: Args): DatabaseAdapterObj<PostgresAdapter>
beforeSchemaInit: args.beforeSchemaInit ?? [], beforeSchemaInit: args.beforeSchemaInit ?? [],
createDatabase, createDatabase,
createExtensions, createExtensions,
createMigration(args) {
return createMigration.bind(this)({ ...args, dirname })
},
defaultDrizzleSnapshot, defaultDrizzleSnapshot,
disableCreateDatabase: args.disableCreateDatabase ?? false, disableCreateDatabase: args.disableCreateDatabase ?? false,
drizzle: undefined, drizzle: undefined,
@@ -132,7 +140,6 @@ export function postgresAdapter(args: Args): DatabaseAdapterObj<PostgresAdapter>
createGlobal, createGlobal,
createGlobalVersion, createGlobalVersion,
createJSONQuery, createJSONQuery,
createMigration,
createVersion, createVersion,
defaultIDType: payloadIDType, defaultIDType: payloadIDType,
deleteMany, deleteMany,

View File

@@ -50,12 +50,17 @@ import {
requireDrizzleKit, requireDrizzleKit,
} from '@payloadcms/drizzle/postgres' } from '@payloadcms/drizzle/postgres'
import { pgEnum, pgSchema, pgTable } from 'drizzle-orm/pg-core' import { pgEnum, pgSchema, pgTable } from 'drizzle-orm/pg-core'
import path from 'path'
import { createDatabaseAdapter, defaultBeginTransaction } from 'payload' import { createDatabaseAdapter, defaultBeginTransaction } from 'payload'
import { fileURLToPath } from 'url'
import type { Args, VercelPostgresAdapter } from './types.js' import type { Args, VercelPostgresAdapter } from './types.js'
import { connect } from './connect.js' import { connect } from './connect.js'
const filename = fileURLToPath(import.meta.url)
const dirname = path.dirname(filename)
export function vercelPostgresAdapter(args: Args = {}): DatabaseAdapterObj<VercelPostgresAdapter> { export function vercelPostgresAdapter(args: Args = {}): DatabaseAdapterObj<VercelPostgresAdapter> {
const postgresIDType = args.idType || 'serial' const postgresIDType = args.idType || 'serial'
const payloadIDType = postgresIDType === 'serial' ? 'number' : 'text' const payloadIDType = postgresIDType === 'serial' ? 'number' : 'text'
@@ -133,7 +138,9 @@ export function vercelPostgresAdapter(args: Args = {}): DatabaseAdapterObj<Verce
createGlobal, createGlobal,
createGlobalVersion, createGlobalVersion,
createJSONQuery, createJSONQuery,
createMigration, createMigration(args) {
return createMigration.bind(this)({ ...args, dirname })
},
createVersion, createVersion,
defaultIDType: payloadIDType, defaultIDType: payloadIDType,
deleteMany, deleteMany,

View File

@@ -2,10 +2,8 @@ import type { CreateMigration } from 'payload'
import fs from 'fs' import fs from 'fs'
import { createRequire } from 'module' import { createRequire } from 'module'
import path from 'path'
import { getPredefinedMigration, writeMigrationIndex } from 'payload' import { getPredefinedMigration, writeMigrationIndex } from 'payload'
import prompts from 'prompts' import prompts from 'prompts'
import { fileURLToPath } from 'url'
import type { BasePostgresAdapter } from './types.js' import type { BasePostgresAdapter } from './types.js'
@@ -16,10 +14,8 @@ const require = createRequire(import.meta.url)
export const createMigration: CreateMigration = async function createMigration( export const createMigration: CreateMigration = async function createMigration(
this: BasePostgresAdapter, this: BasePostgresAdapter,
{ file, forceAcceptWarning, migrationName, payload }, { dirname, file, forceAcceptWarning, migrationName, payload },
) { ) {
const filename = fileURLToPath(import.meta.url)
const dirname = path.dirname(filename)
const dir = payload.db.migrationDir const dir = payload.db.migrationDir
if (!fs.existsSync(dir)) { if (!fs.existsSync(dir)) {
fs.mkdirSync(dir) fs.mkdirSync(dir)

View File

@@ -24,28 +24,31 @@ export const getPredefinedMigration = async ({
if (file || migrationNameArg?.startsWith('@payloadcms/')) { if (file || migrationNameArg?.startsWith('@payloadcms/')) {
// removes the package name from the migrationName. // removes the package name from the migrationName.
const migrationName = (file || migrationNameArg).split('/').slice(2).join('/') const migrationName = (file || migrationNameArg).split('/').slice(2).join('/')
let cleanPath = path.join(dirname, `./predefinedMigrations/${migrationName}.mjs`) let cleanPath = path.join(dirname, `./predefinedMigrations/${migrationName}`)
// Check if predefined migration exists if (fs.existsSync(`${cleanPath}.mjs`)) {
if (fs.existsSync(cleanPath)) { cleanPath = `${cleanPath}.mjs`
cleanPath = cleanPath.replaceAll('\\', '/') } else if (fs.existsSync(`${cleanPath}.js`)) {
const moduleURL = pathToFileURL(cleanPath) cleanPath = `${cleanPath}.js`
try {
const { downSQL, imports, upSQL } = await eval(`import('${moduleURL.href}')`)
return { downSQL, imports, upSQL }
} catch (error) {
payload.logger.error({
error,
msg: `Error loading predefined migration ${migrationName}`,
})
process.exit(1)
}
} else { } else {
payload.logger.error({ payload.logger.error({
msg: `Canned migration ${migrationName} not found.`, msg: `Canned migration ${migrationName} not found.`,
}) })
process.exit(1) process.exit(1)
} }
cleanPath = cleanPath.replaceAll('\\', '/')
const moduleURL = pathToFileURL(cleanPath)
try {
const { downSQL, imports, upSQL } = await eval(`import('${moduleURL.href}')`)
return { downSQL, imports, upSQL }
} catch (err) {
payload.logger.error({
err,
msg: `Error loading predefined migration ${migrationName}`,
})
process.exit(1)
}
} }
return {} return {}
} }

View File

@@ -160,6 +160,8 @@ export type Connect = (args?: ConnectArgs) => Promise<void>
export type Destroy = () => Promise<void> export type Destroy = () => Promise<void>
export type CreateMigration = (args: { export type CreateMigration = (args: {
/** dirname of the package, required in drizzle */
dirname?: string
file?: string file?: string
/** /**
* Skips the prompt asking to create empty migrations * Skips the prompt asking to create empty migrations