refactor: optimize database schema generation bin script (#10086)

* Avoids additional file system writes (1 for `await writeFile` and then
`npx prettier --write`) instead prettier now formats the javascript
string directly. Went from 650 MS to 250 MS for the prettify block.
* Disables database connection, since the `db.generateSchema` doesn't
need connection, this also disables Drizzle schema push.
* Properly exits the bin script process.
This commit is contained in:
Sasha
2024-12-20 14:43:11 +02:00
committed by GitHub
parent 7292220109
commit 7c4ea5b86e
3 changed files with 54 additions and 11 deletions

View File

@@ -1,15 +1,11 @@
import type { GenerateSchema } from 'payload' import type { GenerateSchema } from 'payload'
import { exec } from 'child_process'
import { existsSync } from 'fs' import { existsSync } from 'fs'
import { writeFile } from 'fs/promises' import { writeFile } from 'fs/promises'
import path from 'path' import path from 'path'
import { promisify } from 'util'
import type { ColumnToCodeConverter, DrizzleAdapter } from '../types.js' import type { ColumnToCodeConverter, DrizzleAdapter } from '../types.js'
const execAsync = promisify(exec)
/** /**
* @example * @example
* console.log(sanitizeObjectKey("oneTwo")); // oneTwo * console.log(sanitizeObjectKey("oneTwo")); // oneTwo
@@ -271,7 +267,7 @@ declare module '${this.packageName}/types' {
*/ */
` `
const code = [ let code = [
warning, warning,
...importDeclarationsSanitized, ...importDeclarationsSanitized,
schemaDeclaration, schemaDeclaration,
@@ -295,15 +291,18 @@ declare module '${this.packageName}/types' {
} }
} }
await writeFile(outputFile, code, 'utf-8')
if (prettify) { if (prettify) {
try { try {
await execAsync(`npx prettier ${outputFile} --write`) const prettier = await import('prettier')
const configPath = await prettier.resolveConfigFile()
const config = configPath ? await prettier.resolveConfig(configPath) : {}
code = await prettier.format(code, { ...config, parser: 'typescript' })
// eslint-disable-next-line no-empty // eslint-disable-next-line no-empty
} catch {} } catch {}
} }
await writeFile(outputFile, code, 'utf-8')
if (log) { if (log) {
this.payload.logger.info(`Written ${outputFile}`) this.payload.logger.info(`Written ${outputFile}`)
} }

View File

@@ -6,7 +6,7 @@ import path from 'path'
import type { BinScript } from '../config/types.js' import type { BinScript } from '../config/types.js'
import { findConfig } from '../config/find.js' import { findConfig } from '../config/find.js'
import { getPayload } from '../index.js' import payload, { getPayload } from '../index.js'
import { generateImportMap } from './generateImportMap/index.js' import { generateImportMap } from './generateImportMap/index.js'
import { generateTypes } from './generateTypes.js' import { generateTypes } from './generateTypes.js'
import { info } from './info.js' import { info } from './info.js'
@@ -110,7 +110,12 @@ export const bin = async () => {
} }
if (script === 'generate:db-schema') { if (script === 'generate:db-schema') {
const payload = await getPayload({ config }) // Barebones instance to access database adapter, without connecting to the DB
await payload.init({
config,
disableDBConnect: true,
disableOnInit: true,
})
if (typeof payload.db.generateSchema !== 'function') { if (typeof payload.db.generateSchema !== 'function') {
payload.logger.error({ payload.logger.error({
@@ -124,6 +129,8 @@ export const bin = async () => {
log: args.log === 'false' ? false : true, log: args.log === 'false' ? false : true,
prettify: args.prettify === 'false' ? false : true, prettify: args.prettify === 'false' ? false : true,
}) })
process.exit(0)
} }
console.error(`Unknown script: "${script}".`) console.error(`Unknown script: "${script}".`)

View File

@@ -422,6 +422,26 @@ export const polymorphic_relationships = pgTable(
}), }),
) )
export const polymorphic_relationships_locales = pgTable(
'polymorphic_relationships_locales',
{
id: serial('id').primaryKey(),
_locale: enum__locales('_locale').notNull(),
_parentID: integer('_parent_id').notNull(),
},
(columns) => ({
_localeParent: uniqueIndex('polymorphic_relationships_locales_locale_parent_id_unique').on(
columns._locale,
columns._parentID,
),
_parentIdFk: foreignKey({
columns: [columns['_parentID']],
foreignColumns: [polymorphic_relationships.id],
name: 'polymorphic_relationships_locales_parent_id_fk',
}).onDelete('cascade'),
}),
)
export const polymorphic_relationships_rels = pgTable( export const polymorphic_relationships_rels = pgTable(
'polymorphic_relationships_rels', 'polymorphic_relationships_rels',
{ {
@@ -429,15 +449,17 @@ export const polymorphic_relationships_rels = pgTable(
order: integer('order'), order: integer('order'),
parent: integer('parent_id').notNull(), parent: integer('parent_id').notNull(),
path: varchar('path').notNull(), path: varchar('path').notNull(),
locale: enum__locales('locale'),
moviesID: integer('movies_id'), moviesID: integer('movies_id'),
}, },
(columns) => ({ (columns) => ({
order: index('polymorphic_relationships_rels_order_idx').on(columns.order), order: index('polymorphic_relationships_rels_order_idx').on(columns.order),
parentIdx: index('polymorphic_relationships_rels_parent_idx').on(columns.parent), parentIdx: index('polymorphic_relationships_rels_parent_idx').on(columns.parent),
pathIdx: index('polymorphic_relationships_rels_path_idx').on(columns.path), pathIdx: index('polymorphic_relationships_rels_path_idx').on(columns.path),
localeIdx: index('polymorphic_relationships_rels_locale_idx').on(columns.locale),
polymorphic_relationships_rels_movies_id_idx: index( polymorphic_relationships_rels_movies_id_idx: index(
'polymorphic_relationships_rels_movies_id_idx', 'polymorphic_relationships_rels_movies_id_idx',
).on(columns.moviesID), ).on(columns.moviesID, columns.locale),
parentFk: foreignKey({ parentFk: foreignKey({
columns: [columns['parent']], columns: [columns['parent']],
foreignColumns: [polymorphic_relationships.id], foreignColumns: [polymorphic_relationships.id],
@@ -1093,6 +1115,16 @@ export const relations_movie_reviews = relations(movie_reviews, ({ one, many })
relationName: '_rels', relationName: '_rels',
}), }),
})) }))
export const relations_polymorphic_relationships_locales = relations(
polymorphic_relationships_locales,
({ one }) => ({
_parentID: one(polymorphic_relationships, {
fields: [polymorphic_relationships_locales._parentID],
references: [polymorphic_relationships.id],
relationName: '_locales',
}),
}),
)
export const relations_polymorphic_relationships_rels = relations( export const relations_polymorphic_relationships_rels = relations(
polymorphic_relationships_rels, polymorphic_relationships_rels,
({ one }) => ({ ({ one }) => ({
@@ -1111,6 +1143,9 @@ export const relations_polymorphic_relationships_rels = relations(
export const relations_polymorphic_relationships = relations( export const relations_polymorphic_relationships = relations(
polymorphic_relationships, polymorphic_relationships,
({ many }) => ({ ({ many }) => ({
_locales: many(polymorphic_relationships_locales, {
relationName: '_locales',
}),
_rels: many(polymorphic_relationships_rels, { _rels: many(polymorphic_relationships_rels, {
relationName: '_rels', relationName: '_rels',
}), }),
@@ -1347,6 +1382,7 @@ type DatabaseSchema = {
movie_reviews: typeof movie_reviews movie_reviews: typeof movie_reviews
movie_reviews_rels: typeof movie_reviews_rels movie_reviews_rels: typeof movie_reviews_rels
polymorphic_relationships: typeof polymorphic_relationships polymorphic_relationships: typeof polymorphic_relationships
polymorphic_relationships_locales: typeof polymorphic_relationships_locales
polymorphic_relationships_rels: typeof polymorphic_relationships_rels polymorphic_relationships_rels: typeof polymorphic_relationships_rels
tree: typeof tree tree: typeof tree
pages_menu: typeof pages_menu pages_menu: typeof pages_menu
@@ -1377,6 +1413,7 @@ type DatabaseSchema = {
relations_directors: typeof relations_directors relations_directors: typeof relations_directors
relations_movie_reviews_rels: typeof relations_movie_reviews_rels relations_movie_reviews_rels: typeof relations_movie_reviews_rels
relations_movie_reviews: typeof relations_movie_reviews relations_movie_reviews: typeof relations_movie_reviews
relations_polymorphic_relationships_locales: typeof relations_polymorphic_relationships_locales
relations_polymorphic_relationships_rels: typeof relations_polymorphic_relationships_rels relations_polymorphic_relationships_rels: typeof relations_polymorphic_relationships_rels
relations_polymorphic_relationships: typeof relations_polymorphic_relationships relations_polymorphic_relationships: typeof relations_polymorphic_relationships
relations_tree: typeof relations_tree relations_tree: typeof relations_tree