chore(eslint): lint entire codebase including db packages (#8042)

This commit is contained in:
Elliot DeNolf
2024-09-03 11:22:41 -04:00
committed by GitHub
54 changed files with 539 additions and 243 deletions

View File

@@ -25,3 +25,6 @@ fb7d1be2f3325d076b7c967b1730afcef37922c2
# Upgrade to typescript-eslint v8, then prettier & lint everywhere # Upgrade to typescript-eslint v8, then prettier & lint everywhere
86fdad0bb8ab27810599c8a32f3d8cba1341e1df 86fdad0bb8ab27810599c8a32f3d8cba1341e1df
# Prettier and lint remaining db packages
7fd736ea5b2e9fc4ef936e9dc9e5e3d722f6d8bf

View File

@@ -29,7 +29,9 @@ export const connect: Connect = async function connect(
useFacet: undefined, useFacet: undefined,
} }
if (hotReload) connectionOptions.autoIndex = false if (hotReload) {
connectionOptions.autoIndex = false
}
try { try {
this.connection = (await mongoose.connect(urlToConnect, connectionOptions)).connection this.connection = (await mongoose.connect(urlToConnect, connectionOptions)).connection

View File

@@ -1,6 +1,6 @@
import type { CollationOptions, TransactionOptions } from 'mongodb' import type { CollationOptions, TransactionOptions } from 'mongodb'
import type { MongoMemoryReplSet } from 'mongodb-memory-server' import type { MongoMemoryReplSet } from 'mongodb-memory-server'
import type { ClientSession, ConnectOptions, Connection } from 'mongoose' import type { ClientSession, Connection, ConnectOptions } from 'mongoose'
import type { BaseDatabaseAdapter, DatabaseAdapterObj, Payload } from 'payload' import type { BaseDatabaseAdapter, DatabaseAdapterObj, Payload } from 'payload'
import fs from 'fs' import fs from 'fs'
@@ -83,7 +83,7 @@ export interface Args {
name: string name: string
up: (args: MigrateUpArgs) => Promise<void> up: (args: MigrateUpArgs) => Promise<void>
}[] }[]
transactionOptions?: TransactionOptions | false transactionOptions?: false | TransactionOptions
/** The URL to connect to MongoDB or false to start payload and prevent connecting */ /** The URL to connect to MongoDB or false to start payload and prevent connecting */
url: false | string url: false | string
} }
@@ -150,8 +150,8 @@ export function mongooseAdapter({
// Mongoose-specific // Mongoose-specific
autoPluralization, autoPluralization,
collections: {}, collections: {},
connectOptions: connectOptions || {},
connection: undefined, connection: undefined,
connectOptions: connectOptions || {},
count, count,
disableIndexHints, disableIndexHints,
globals: undefined, globals: undefined,
@@ -221,7 +221,9 @@ function findMigrationDir(migrationDir?: string): string {
const relativeMigrations = path.resolve(cwd, 'migrations') const relativeMigrations = path.resolve(cwd, 'migrations')
// Use arg if provided // Use arg if provided
if (migrationDir) return migrationDir if (migrationDir) {
return migrationDir
}
// Check other common locations // Check other common locations
if (fs.existsSync(srcDir)) { if (fs.existsSync(srcDir)) {

View File

@@ -24,8 +24,8 @@ import type {
SelectField, SelectField,
Tab, Tab,
TabsField, TabsField,
TextField,
TextareaField, TextareaField,
TextField,
UploadField, UploadField,
} from 'payload' } from 'payload'
@@ -92,7 +92,7 @@ const formatBaseSchema = (field: FieldAffectingData, buildSchemaOptions: BuildSc
const localizeSchema = ( const localizeSchema = (
entity: NonPresentationalField | Tab, entity: NonPresentationalField | Tab,
schema, schema,
localization: SanitizedLocalizationConfig | false, localization: false | SanitizedLocalizationConfig,
) => { ) => {
if (fieldIsLocalized(entity) && localization && Array.isArray(localization.locales)) { if (fieldIsLocalized(entity) && localization && Array.isArray(localization.locales)) {
return { return {
@@ -384,7 +384,9 @@ const fieldToSchemaMap: Record<string, FieldSchemaGenerator> = {
...formatBaseSchema(field, buildSchemaOptions), ...formatBaseSchema(field, buildSchemaOptions),
type: String, type: String,
enum: field.options.map((option) => { enum: field.options.map((option) => {
if (typeof option === 'object') return option.value if (typeof option === 'object') {
return option.value
}
return option return option
}), }),
} }
@@ -511,7 +513,9 @@ const fieldToSchemaMap: Record<string, FieldSchemaGenerator> = {
...formatBaseSchema(field, buildSchemaOptions), ...formatBaseSchema(field, buildSchemaOptions),
type: String, type: String,
enum: field.options.map((option) => { enum: field.options.map((option) => {
if (typeof option === 'object') return option.value if (typeof option === 'object') {
return option.value
}
return option return option
}), }),
} }

View File

@@ -48,7 +48,9 @@ export async function buildSearchParam({
}): Promise<SearchParam> { }): Promise<SearchParam> {
// Replace GraphQL nested field double underscore formatting // Replace GraphQL nested field double underscore formatting
let sanitizedPath = incomingPath.replace(/__/g, '.') let sanitizedPath = incomingPath.replace(/__/g, '.')
if (sanitizedPath === 'id') sanitizedPath = '_id' if (sanitizedPath === 'id') {
sanitizedPath = '_id'
}
let paths: PathToQuery[] = [] let paths: PathToQuery[] = []
@@ -99,7 +101,9 @@ export async function buildSearchParam({
val, val,
}) })
if (rawQuery) return { value: rawQuery } if (rawQuery) {
return { value: rawQuery }
}
// If there are multiple collections to search through, // If there are multiple collections to search through,
// Recursively build up a list of query constraints // Recursively build up a list of query constraints
@@ -190,7 +194,9 @@ export async function buildSearchParam({
if (field.type === 'relationship' || field.type === 'upload') { if (field.type === 'relationship' || field.type === 'upload') {
let hasNumberIDRelation let hasNumberIDRelation
let multiIDCondition = '$or' let multiIDCondition = '$or'
if (operatorKey === '$ne') multiIDCondition = '$and' if (operatorKey === '$ne') {
multiIDCondition = '$and'
}
const result = { const result = {
value: { value: {
@@ -215,10 +221,11 @@ export async function buildSearchParam({
}, },
) )
if (hasNumberIDRelation) if (hasNumberIDRelation) {
result.value[multiIDCondition].push({ result.value[multiIDCondition].push({
[path]: { [operatorKey]: parseFloat(formattedValue) }, [path]: { [operatorKey]: parseFloat(formattedValue) },
}) })
}
} }
} }

View File

@@ -43,7 +43,9 @@ export async function parseParams({
payload, payload,
where: condition, where: condition,
}) })
if (builtConditions.length > 0) result[conditionOperator] = builtConditions if (builtConditions.length > 0) {
result[conditionOperator] = builtConditions
}
} else { } else {
// It's a path - and there can be multiple comparisons on a single path. // It's a path - and there can be multiple comparisons on a single path.
// For example - title like 'test' and title not equal to 'tester' // For example - title like 'test' and title not equal to 'tester'

View File

@@ -46,8 +46,12 @@ export const sanitizeQueryValue = ({
// Cast incoming values as proper searchable types // Cast incoming values as proper searchable types
if (field.type === 'checkbox' && typeof val === 'string') { if (field.type === 'checkbox' && typeof val === 'string') {
if (val.toLowerCase() === 'true') formattedValue = true if (val.toLowerCase() === 'true') {
if (val.toLowerCase() === 'false') formattedValue = false formattedValue = true
}
if (val.toLowerCase() === 'false') {
formattedValue = false
}
} }
if (['all', 'in', 'not_in'].includes(operator) && typeof formattedValue === 'string') { if (['all', 'in', 'not_in'].includes(operator) && typeof formattedValue === 'string') {
@@ -95,11 +99,14 @@ export const sanitizeQueryValue = ({
if (operator === 'in' && Array.isArray(formattedValue)) { if (operator === 'in' && Array.isArray(formattedValue)) {
formattedValue = formattedValue.reduce((formattedValues, inVal) => { formattedValue = formattedValue.reduce((formattedValues, inVal) => {
const newValues = [inVal] const newValues = [inVal]
if (mongoose.Types.ObjectId.isValid(inVal)) if (mongoose.Types.ObjectId.isValid(inVal)) {
newValues.push(new mongoose.Types.ObjectId(inVal)) newValues.push(new mongoose.Types.ObjectId(inVal))
}
const parsedNumber = parseFloat(inVal) const parsedNumber = parseFloat(inVal)
if (!Number.isNaN(parsedNumber)) newValues.push(parsedNumber) if (!Number.isNaN(parsedNumber)) {
newValues.push(parsedNumber)
}
return [...formattedValues, ...newValues] return [...formattedValues, ...newValues]
}, []) }, [])
@@ -129,8 +136,12 @@ export const sanitizeQueryValue = ({
$geometry: { type: 'Point', coordinates: [parseFloat(lng), parseFloat(lat)] }, $geometry: { type: 'Point', coordinates: [parseFloat(lng), parseFloat(lat)] },
} }
if (maxDistance) formattedValue.$maxDistance = parseFloat(maxDistance) if (maxDistance) {
if (minDistance) formattedValue.$minDistance = parseFloat(minDistance) formattedValue.$maxDistance = parseFloat(maxDistance)
}
if (minDistance) {
formattedValue.$minDistance = parseFloat(minDistance)
}
} }
} }

View File

@@ -1,7 +1,9 @@
import type { CommitTransaction } from 'payload' import type { CommitTransaction } from 'payload'
export const commitTransaction: CommitTransaction = async function commitTransaction(id) { export const commitTransaction: CommitTransaction = async function commitTransaction(id) {
if (id instanceof Promise) return if (id instanceof Promise) {
return
}
if (!this.sessions[id]?.inTransaction()) { if (!this.sessions[id]?.inTransaction()) {
return return

View File

@@ -20,8 +20,8 @@ import type {
SanitizedConfig, SanitizedConfig,
SelectField, SelectField,
TabsField, TabsField,
TextField,
TextareaField, TextareaField,
TextField,
UploadField, UploadField,
} from 'payload' } from 'payload'

View File

@@ -35,7 +35,9 @@ export const getDBName = ({
result = name ?? slug result = name ?? slug
} }
if (versions) result = `_${result}_versions` if (versions) {
result = `_${result}_versions`
}
return result return result
} }

View File

@@ -17,5 +17,7 @@ export async function withSession(
transactionID = await req.transactionID transactionID = await req.transactionID
} }
if (req) return db.sessions[transactionID] ? { session: db.sessions[transactionID] } : {} if (req) {
return db.sessions[transactionID] ? { session: db.sessions[transactionID] } : {}
}
} }

View File

@@ -77,7 +77,9 @@ export const connect: Connect = async function connect(
} }
} catch (err) { } catch (err) {
this.payload.logger.error(`Error: cannot connect to Postgres. Details: ${err.message}`, err) this.payload.logger.error(`Error: cannot connect to Postgres. Details: ${err.message}`, err)
if (typeof this.rejectInitializing === 'function') this.rejectInitializing() if (typeof this.rejectInitializing === 'function') {
this.rejectInitializing()
}
process.exit(1) process.exit(1)
} }
@@ -90,7 +92,9 @@ export const connect: Connect = async function connect(
await pushDevSchema(this as unknown as DrizzleAdapter) await pushDevSchema(this as unknown as DrizzleAdapter)
} }
if (typeof this.resolveInitializing === 'function') this.resolveInitializing() if (typeof this.resolveInitializing === 'function') {
this.resolveInitializing()
}
if (process.env.NODE_ENV === 'production' && this.prodMigrations) { if (process.env.NODE_ENV === 'production' && this.prodMigrations) {
await this.migrate({ migrations: this.prodMigrations }) await this.migrate({ migrations: this.prodMigrations })

View File

@@ -193,7 +193,9 @@ export const traverseFields = ({ doc, fields, locale, path, rows }: Args) => {
const matchedRelationship = rows.find((row) => { const matchedRelationship = rows.find((row) => {
const matchesPath = row.path === relationshipPath const matchesPath = row.path === relationshipPath
if (locale) return matchesPath && locale === row.locale if (locale) {
return matchesPath && locale === row.locale
}
return row.path === relationshipPath return row.path === relationshipPath
}) })

View File

@@ -35,7 +35,9 @@ export const migrateRelationships = async ({
req, req,
tableName, tableName,
}: Args) => { }: Args) => {
if (pathsToQuery.size === 0) return if (pathsToQuery.size === 0) {
return
}
let offset = 0 let offset = 0
@@ -54,7 +56,9 @@ export const migrateRelationships = async ({
paginationResult = await adapter.drizzle.execute(sql.raw(`${paginationStatement}`)) paginationResult = await adapter.drizzle.execute(sql.raw(`${paginationStatement}`))
if (paginationResult.rows.length === 0) return if (paginationResult.rows.length === 0) {
return
}
offset += 1 offset += 1
@@ -74,7 +78,9 @@ export const migrateRelationships = async ({
const parentID = row.parent_id const parentID = row.parent_id
if (typeof parentID === 'string' || typeof parentID === 'number') { if (typeof parentID === 'string' || typeof parentID === 'number') {
if (!docsToResave[parentID]) docsToResave[parentID] = [] if (!docsToResave[parentID]) {
docsToResave[parentID] = []
}
docsToResave[parentID].push(row) docsToResave[parentID].push(row)
} }
}) })

View File

@@ -28,7 +28,7 @@ export type Args = {
* @experimental This only works when there are not other tables or enums of the same name in the database under a different schema. Awaiting fix from Drizzle. * @experimental This only works when there are not other tables or enums of the same name in the database under a different schema. Awaiting fix from Drizzle.
*/ */
schemaName?: string schemaName?: string
transactionOptions?: PgTransactionConfig | false transactionOptions?: false | PgTransactionConfig
versionsSuffix?: string versionsSuffix?: string
} }

View File

@@ -38,7 +38,9 @@ export const connect: Connect = async function connect(
} }
} catch (err) { } catch (err) {
this.payload.logger.error(`Error: cannot connect to SQLite. Details: ${err.message}`, err) this.payload.logger.error(`Error: cannot connect to SQLite. Details: ${err.message}`, err)
if (typeof this.rejectInitializing === 'function') this.rejectInitializing() if (typeof this.rejectInitializing === 'function') {
this.rejectInitializing()
}
process.exit(1) process.exit(1)
} }
@@ -51,7 +53,9 @@ export const connect: Connect = async function connect(
await pushDevSchema(this as unknown as DrizzleAdapter) await pushDevSchema(this as unknown as DrizzleAdapter)
} }
if (typeof this.resolveInitializing === 'function') this.resolveInitializing() if (typeof this.resolveInitializing === 'function') {
this.resolveInitializing()
}
if (process.env.NODE_ENV === 'production' && this.prodMigrations) { if (process.env.NODE_ENV === 'production' && this.prodMigrations) {
await this.migrate({ migrations: this.prodMigrations }) await this.migrate({ migrations: this.prodMigrations })

View File

@@ -51,8 +51,8 @@ type Args = {
disableUnique: boolean disableUnique: boolean
fields: Field[] fields: Field[]
locales?: [string, ...string[]] locales?: [string, ...string[]]
rootRelationsToBuild?: RelationMap
rootRelationships?: Set<string> rootRelationships?: Set<string>
rootRelationsToBuild?: RelationMap
rootTableIDColType?: IDType rootTableIDColType?: IDType
rootTableName?: string rootTableName?: string
tableName: string tableName: string
@@ -82,8 +82,8 @@ export const buildTable = ({
disableUnique = false, disableUnique = false,
fields, fields,
locales, locales,
rootRelationsToBuild,
rootRelationships, rootRelationships,
rootRelationsToBuild,
rootTableIDColType, rootTableIDColType,
rootTableName: incomingRootTableName, rootTableName: incomingRootTableName,
tableName, tableName,
@@ -131,8 +131,8 @@ export const buildTable = ({
localesIndexes, localesIndexes,
newTableName: tableName, newTableName: tableName,
parentTableName: tableName, parentTableName: tableName,
relationsToBuild,
relationships, relationships,
relationsToBuild,
rootRelationsToBuild: rootRelationsToBuild || relationsToBuild, rootRelationsToBuild: rootRelationsToBuild || relationsToBuild,
rootTableIDColType: rootTableIDColType || idColType, rootTableIDColType: rootTableIDColType || idColType,
rootTableName, rootTableName,
@@ -375,8 +375,12 @@ export const buildTable = ({
const relatedCollectionCustomIDType = const relatedCollectionCustomIDType =
adapter.payload.collections[relationshipConfig.slug]?.customIDType adapter.payload.collections[relationshipConfig.slug]?.customIDType
if (relatedCollectionCustomIDType === 'number') colType = 'numeric' if (relatedCollectionCustomIDType === 'number') {
if (relatedCollectionCustomIDType === 'text') colType = 'text' colType = 'numeric'
}
if (relatedCollectionCustomIDType === 'text') {
colType = 'text'
}
relationshipColumns[`${relationTo}ID`] = getIDColumn({ relationshipColumns[`${relationTo}ID`] = getIDColumn({
name: `${formattedRelationTo}_id`, name: `${formattedRelationTo}_id`,

View File

@@ -20,8 +20,9 @@ export const createIndex = ({ name, columnName, tableName, unique }: CreateIndex
} else { } else {
columns = [table[name]] columns = [table[name]]
} }
if (unique) if (unique) {
return uniqueIndex(`${tableName}_${columnName}_idx`).on(columns[0], ...columns.slice(1)) return uniqueIndex(`${tableName}_${columnName}_idx`).on(columns[0], ...columns.slice(1))
}
return index(`${tableName}_${columnName}_idx`).on(columns[0], ...columns.slice(1)) return index(`${tableName}_${columnName}_idx`).on(columns[0], ...columns.slice(1))
} }
} }

View File

@@ -9,13 +9,13 @@ import {
} from '@payloadcms/drizzle' } from '@payloadcms/drizzle'
import { relations } from 'drizzle-orm' import { relations } from 'drizzle-orm'
import { import {
SQLiteIntegerBuilder,
SQLiteNumericBuilder,
SQLiteTextBuilder,
foreignKey, foreignKey,
index, index,
integer, integer,
numeric, numeric,
SQLiteIntegerBuilder,
SQLiteNumericBuilder,
SQLiteTextBuilder,
text, text,
} from 'drizzle-orm/sqlite-core' } from 'drizzle-orm/sqlite-core'
import { InvalidConfiguration } from 'payload' import { InvalidConfiguration } from 'payload'
@@ -46,8 +46,8 @@ type Args = {
localesIndexes: Record<string, (cols: GenericColumns) => IndexBuilder> localesIndexes: Record<string, (cols: GenericColumns) => IndexBuilder>
newTableName: string newTableName: string
parentTableName: string parentTableName: string
relationsToBuild: RelationMap
relationships: Set<string> relationships: Set<string>
relationsToBuild: RelationMap
rootRelationsToBuild?: RelationMap rootRelationsToBuild?: RelationMap
rootTableIDColType: IDType rootTableIDColType: IDType
rootTableName: string rootTableName: string
@@ -83,8 +83,8 @@ export const traverseFields = ({
localesIndexes, localesIndexes,
newTableName, newTableName,
parentTableName, parentTableName,
relationsToBuild,
relationships, relationships,
relationsToBuild,
rootRelationsToBuild, rootRelationsToBuild,
rootTableIDColType, rootTableIDColType,
rootTableName, rootTableName,
@@ -99,12 +99,20 @@ export const traverseFields = ({
let hasLocalizedManyNumberField = false let hasLocalizedManyNumberField = false
let parentIDColType: IDType = 'integer' let parentIDColType: IDType = 'integer'
if (columns.id instanceof SQLiteIntegerBuilder) parentIDColType = 'integer' if (columns.id instanceof SQLiteIntegerBuilder) {
if (columns.id instanceof SQLiteNumericBuilder) parentIDColType = 'numeric' parentIDColType = 'integer'
if (columns.id instanceof SQLiteTextBuilder) parentIDColType = 'text' }
if (columns.id instanceof SQLiteNumericBuilder) {
parentIDColType = 'numeric'
}
if (columns.id instanceof SQLiteTextBuilder) {
parentIDColType = 'text'
}
fields.forEach((field) => { fields.forEach((field) => {
if ('name' in field && field.name === 'id') return if ('name' in field && field.name === 'id') {
return
}
let columnName: string let columnName: string
let fieldName: string let fieldName: string
@@ -379,8 +387,8 @@ export const traverseFields = ({
disableNotNull: disableNotNullFromHere, disableNotNull: disableNotNullFromHere,
disableUnique, disableUnique,
fields: disableUnique ? idToUUID(field.fields) : field.fields, fields: disableUnique ? idToUUID(field.fields) : field.fields,
rootRelationsToBuild,
rootRelationships: relationships, rootRelationships: relationships,
rootRelationsToBuild,
rootTableIDColType, rootTableIDColType,
rootTableName, rootTableName,
tableName: arrayTableName, tableName: arrayTableName,
@@ -401,12 +409,14 @@ export const traverseFields = ({
} }
if (subHasManyTextField) { if (subHasManyTextField) {
if (!hasManyTextField || subHasManyTextField === 'index') if (!hasManyTextField || subHasManyTextField === 'index') {
hasManyTextField = subHasManyTextField hasManyTextField = subHasManyTextField
}
} }
if (subHasManyNumberField) { if (subHasManyNumberField) {
if (!hasManyNumberField || subHasManyNumberField === 'index') if (!hasManyNumberField || subHasManyNumberField === 'index') {
hasManyNumberField = subHasManyNumberField hasManyNumberField = subHasManyNumberField
}
} }
relationsToBuild.set(fieldName, { relationsToBuild.set(fieldName, {
@@ -481,13 +491,13 @@ export const traverseFields = ({
const baseExtraConfig: BaseExtraConfig = { const baseExtraConfig: BaseExtraConfig = {
_orderIdx: (cols) => index(`${blockTableName}_order_idx`).on(cols._order), _orderIdx: (cols) => index(`${blockTableName}_order_idx`).on(cols._order),
_parentIDIdx: (cols) => index(`${blockTableName}_parent_id_idx`).on(cols._parentID),
_parentIdFk: (cols) => _parentIdFk: (cols) =>
foreignKey({ foreignKey({
name: `${blockTableName}_parent_id_fk`, name: `${blockTableName}_parent_id_fk`,
columns: [cols._parentID], columns: [cols._parentID],
foreignColumns: [adapter.tables[rootTableName].id], foreignColumns: [adapter.tables[rootTableName].id],
}).onDelete('cascade'), }).onDelete('cascade'),
_parentIDIdx: (cols) => index(`${blockTableName}_parent_id_idx`).on(cols._parentID),
_pathIdx: (cols) => index(`${blockTableName}_path_idx`).on(cols._path), _pathIdx: (cols) => index(`${blockTableName}_path_idx`).on(cols._path),
} }
@@ -515,8 +525,8 @@ export const traverseFields = ({
disableNotNull: disableNotNullFromHere, disableNotNull: disableNotNullFromHere,
disableUnique, disableUnique,
fields: disableUnique ? idToUUID(block.fields) : block.fields, fields: disableUnique ? idToUUID(block.fields) : block.fields,
rootRelationsToBuild,
rootRelationships: relationships, rootRelationships: relationships,
rootRelationsToBuild,
rootTableIDColType, rootTableIDColType,
rootTableName, rootTableName,
tableName: blockTableName, tableName: blockTableName,
@@ -537,13 +547,15 @@ export const traverseFields = ({
} }
if (subHasManyTextField) { if (subHasManyTextField) {
if (!hasManyTextField || subHasManyTextField === 'index') if (!hasManyTextField || subHasManyTextField === 'index') {
hasManyTextField = subHasManyTextField hasManyTextField = subHasManyTextField
}
} }
if (subHasManyNumberField) { if (subHasManyNumberField) {
if (!hasManyNumberField || subHasManyNumberField === 'index') if (!hasManyNumberField || subHasManyNumberField === 'index') {
hasManyNumberField = subHasManyNumberField hasManyNumberField = subHasManyNumberField
}
} }
adapter.relations[`relations_${blockTableName}`] = relations( adapter.relations[`relations_${blockTableName}`] = relations(
@@ -629,8 +641,8 @@ export const traverseFields = ({
localesIndexes, localesIndexes,
newTableName, newTableName,
parentTableName, parentTableName,
relationsToBuild,
relationships, relationships,
relationsToBuild,
rootRelationsToBuild, rootRelationsToBuild,
rootTableIDColType, rootTableIDColType,
rootTableName, rootTableName,
@@ -638,12 +650,24 @@ export const traverseFields = ({
withinLocalizedArrayOrBlock, withinLocalizedArrayOrBlock,
}) })
if (groupHasLocalizedField) hasLocalizedField = true if (groupHasLocalizedField) {
if (groupHasLocalizedRelationshipField) hasLocalizedRelationshipField = true hasLocalizedField = true
if (groupHasManyTextField) hasManyTextField = true }
if (groupHasLocalizedManyTextField) hasLocalizedManyTextField = true if (groupHasLocalizedRelationshipField) {
if (groupHasManyNumberField) hasManyNumberField = true hasLocalizedRelationshipField = true
if (groupHasLocalizedManyNumberField) hasLocalizedManyNumberField = true }
if (groupHasManyTextField) {
hasManyTextField = true
}
if (groupHasLocalizedManyTextField) {
hasLocalizedManyTextField = true
}
if (groupHasManyNumberField) {
hasManyNumberField = true
}
if (groupHasLocalizedManyNumberField) {
hasLocalizedManyNumberField = true
}
break break
} }
@@ -671,8 +695,8 @@ export const traverseFields = ({
localesIndexes, localesIndexes,
newTableName: `${parentTableName}_${columnName}`, newTableName: `${parentTableName}_${columnName}`,
parentTableName, parentTableName,
relationsToBuild,
relationships, relationships,
relationsToBuild,
rootRelationsToBuild, rootRelationsToBuild,
rootTableIDColType, rootTableIDColType,
rootTableName, rootTableName,
@@ -680,12 +704,24 @@ export const traverseFields = ({
withinLocalizedArrayOrBlock, withinLocalizedArrayOrBlock,
}) })
if (groupHasLocalizedField) hasLocalizedField = true if (groupHasLocalizedField) {
if (groupHasLocalizedRelationshipField) hasLocalizedRelationshipField = true hasLocalizedField = true
if (groupHasManyTextField) hasManyTextField = true }
if (groupHasLocalizedManyTextField) hasLocalizedManyTextField = true if (groupHasLocalizedRelationshipField) {
if (groupHasManyNumberField) hasManyNumberField = true hasLocalizedRelationshipField = true
if (groupHasLocalizedManyNumberField) hasLocalizedManyNumberField = true }
if (groupHasManyTextField) {
hasManyTextField = true
}
if (groupHasLocalizedManyTextField) {
hasLocalizedManyTextField = true
}
if (groupHasManyNumberField) {
hasManyNumberField = true
}
if (groupHasLocalizedManyNumberField) {
hasLocalizedManyNumberField = true
}
break break
} }
@@ -714,8 +750,8 @@ export const traverseFields = ({
localesIndexes, localesIndexes,
newTableName, newTableName,
parentTableName, parentTableName,
relationsToBuild,
relationships, relationships,
relationsToBuild,
rootRelationsToBuild, rootRelationsToBuild,
rootTableIDColType, rootTableIDColType,
rootTableName, rootTableName,
@@ -723,12 +759,24 @@ export const traverseFields = ({
withinLocalizedArrayOrBlock, withinLocalizedArrayOrBlock,
}) })
if (tabHasLocalizedField) hasLocalizedField = true if (tabHasLocalizedField) {
if (tabHasLocalizedRelationshipField) hasLocalizedRelationshipField = true hasLocalizedField = true
if (tabHasManyTextField) hasManyTextField = true }
if (tabHasLocalizedManyTextField) hasLocalizedManyTextField = true if (tabHasLocalizedRelationshipField) {
if (tabHasManyNumberField) hasManyNumberField = true hasLocalizedRelationshipField = true
if (tabHasLocalizedManyNumberField) hasLocalizedManyNumberField = true }
if (tabHasManyTextField) {
hasManyTextField = true
}
if (tabHasLocalizedManyTextField) {
hasLocalizedManyTextField = true
}
if (tabHasManyNumberField) {
hasManyNumberField = true
}
if (tabHasLocalizedManyNumberField) {
hasLocalizedManyNumberField = true
}
break break
} }
@@ -757,8 +805,8 @@ export const traverseFields = ({
localesIndexes, localesIndexes,
newTableName, newTableName,
parentTableName, parentTableName,
relationsToBuild,
relationships, relationships,
relationsToBuild,
rootRelationsToBuild, rootRelationsToBuild,
rootTableIDColType, rootTableIDColType,
rootTableName, rootTableName,
@@ -766,12 +814,24 @@ export const traverseFields = ({
withinLocalizedArrayOrBlock, withinLocalizedArrayOrBlock,
}) })
if (rowHasLocalizedField) hasLocalizedField = true if (rowHasLocalizedField) {
if (rowHasLocalizedRelationshipField) hasLocalizedRelationshipField = true hasLocalizedField = true
if (rowHasManyTextField) hasManyTextField = true }
if (rowHasLocalizedManyTextField) hasLocalizedManyTextField = true if (rowHasLocalizedRelationshipField) {
if (rowHasManyNumberField) hasManyNumberField = true hasLocalizedRelationshipField = true
if (rowHasLocalizedManyNumberField) hasLocalizedManyNumberField = true }
if (rowHasManyTextField) {
hasManyTextField = true
}
if (rowHasLocalizedManyTextField) {
hasLocalizedManyTextField = true
}
if (rowHasManyNumberField) {
hasManyNumberField = true
}
if (rowHasLocalizedManyNumberField) {
hasLocalizedManyNumberField = true
}
break break
} }
@@ -792,8 +852,12 @@ export const traverseFields = ({
const relatedCollectionCustomID = relationshipConfig.fields.find( const relatedCollectionCustomID = relationshipConfig.fields.find(
(field) => fieldAffectsData(field) && field.name === 'id', (field) => fieldAffectsData(field) && field.name === 'id',
) )
if (relatedCollectionCustomID?.type === 'number') colType = 'numeric' if (relatedCollectionCustomID?.type === 'number') {
if (relatedCollectionCustomID?.type === 'text') colType = 'text' colType = 'numeric'
}
if (relatedCollectionCustomID?.type === 'text') {
colType = 'text'
}
// make the foreign key column for relationship using the correct id column type // make the foreign key column for relationship using the correct id column type
targetTable[fieldName] = getIDColumn({ targetTable[fieldName] = getIDColumn({

View File

@@ -5,8 +5,9 @@ export const withDefault = (
column: SQLiteColumnBuilder, column: SQLiteColumnBuilder,
field: FieldAffectingData, field: FieldAffectingData,
): SQLiteColumnBuilder => { ): SQLiteColumnBuilder => {
if (typeof field.defaultValue === 'undefined' || typeof field.defaultValue === 'function') if (typeof field.defaultValue === 'undefined' || typeof field.defaultValue === 'function') {
return column return column
}
if (typeof field.defaultValue === 'string' && field.defaultValue.includes("'")) { if (typeof field.defaultValue === 'string' && field.defaultValue.includes("'")) {
const escapedString = field.defaultValue.replaceAll("'", "''") const escapedString = field.defaultValue.replaceAll("'", "''")

View File

@@ -26,7 +26,7 @@ export type Args = {
push?: boolean push?: boolean
relationshipsSuffix?: string relationshipsSuffix?: string
schemaName?: string schemaName?: string
transactionOptions?: SQLiteTransactionConfig | false transactionOptions?: false | SQLiteTransactionConfig
versionsSuffix?: string versionsSuffix?: string
} }

View File

@@ -2,7 +2,7 @@ import type { DrizzleAdapter } from '@payloadcms/drizzle/types'
import type { Connect } from 'payload' import type { Connect } from 'payload'
import { pushDevSchema } from '@payloadcms/drizzle' import { pushDevSchema } from '@payloadcms/drizzle'
import { VercelPool, sql } from '@vercel/postgres' import { sql, VercelPool } from '@vercel/postgres'
import { drizzle } from 'drizzle-orm/node-postgres' import { drizzle } from 'drizzle-orm/node-postgres'
import type { VercelPostgresAdapter } from './types.js' import type { VercelPostgresAdapter } from './types.js'
@@ -40,7 +40,9 @@ export const connect: Connect = async function connect(
} }
} catch (err) { } catch (err) {
this.payload.logger.error(`Error: cannot connect to Postgres. Details: ${err.message}`, err) this.payload.logger.error(`Error: cannot connect to Postgres. Details: ${err.message}`, err)
if (typeof this.rejectInitializing === 'function') this.rejectInitializing() if (typeof this.rejectInitializing === 'function') {
this.rejectInitializing()
}
process.exit(1) process.exit(1)
} }
@@ -53,7 +55,9 @@ export const connect: Connect = async function connect(
await pushDevSchema(this as unknown as DrizzleAdapter) await pushDevSchema(this as unknown as DrizzleAdapter)
} }
if (typeof this.resolveInitializing === 'function') this.resolveInitializing() if (typeof this.resolveInitializing === 'function') {
this.resolveInitializing()
}
if (process.env.NODE_ENV === 'production' && this.prodMigrations) { if (process.env.NODE_ENV === 'production' && this.prodMigrations) {
await this.migrate({ migrations: this.prodMigrations }) await this.migrate({ migrations: this.prodMigrations })

View File

@@ -193,7 +193,9 @@ export const traverseFields = ({ doc, fields, locale, path, rows }: Args) => {
const matchedRelationship = rows.find((row) => { const matchedRelationship = rows.find((row) => {
const matchesPath = row.path === relationshipPath const matchesPath = row.path === relationshipPath
if (locale) return matchesPath && locale === row.locale if (locale) {
return matchesPath && locale === row.locale
}
return row.path === relationshipPath return row.path === relationshipPath
}) })

View File

@@ -35,7 +35,9 @@ export const migrateRelationships = async ({
req, req,
tableName, tableName,
}: Args) => { }: Args) => {
if (pathsToQuery.size === 0) return if (pathsToQuery.size === 0) {
return
}
let offset = 0 let offset = 0
@@ -54,7 +56,9 @@ export const migrateRelationships = async ({
paginationResult = await adapter.drizzle.execute(sql.raw(`${paginationStatement}`)) paginationResult = await adapter.drizzle.execute(sql.raw(`${paginationStatement}`))
if (paginationResult.rows.length === 0) return if (paginationResult.rows.length === 0) {
return
}
offset += 1 offset += 1
@@ -74,7 +78,9 @@ export const migrateRelationships = async ({
const parentID = row.parent_id const parentID = row.parent_id
if (typeof parentID === 'string' || typeof parentID === 'number') { if (typeof parentID === 'string' || typeof parentID === 'number') {
if (!docsToResave[parentID]) docsToResave[parentID] = [] if (!docsToResave[parentID]) {
docsToResave[parentID] = []
}
docsToResave[parentID].push(row) docsToResave[parentID].push(row)
} }
}) })

View File

@@ -33,7 +33,7 @@ export type Args = {
* @experimental This only works when there are not other tables or enums of the same name in the database under a different schema. Awaiting fix from Drizzle. * @experimental This only works when there are not other tables or enums of the same name in the database under a different schema. Awaiting fix from Drizzle.
*/ */
schemaName?: string schemaName?: string
transactionOptions?: PgTransactionConfig | false transactionOptions?: false | PgTransactionConfig
versionsSuffix?: string versionsSuffix?: string
} }

View File

@@ -1,4 +1,4 @@
import type { Count , SanitizedCollectionConfig } from 'payload' import type { Count, SanitizedCollectionConfig } from 'payload'
import toSnakeCase from 'to-snake-case' import toSnakeCase from 'to-snake-case'

View File

@@ -47,7 +47,9 @@ export const createTableName = ({
let defaultTableName = `${prefix}${toSnakeCase(name ?? slug)}` let defaultTableName = `${prefix}${toSnakeCase(name ?? slug)}`
if (versions) defaultTableName = `_${defaultTableName}${adapter.versionsSuffix}` if (versions) {
defaultTableName = `_${defaultTableName}${adapter.versionsSuffix}`
}
let customTableNameResult: string let customTableNameResult: string
@@ -61,8 +63,9 @@ export const createTableName = ({
? customNameDefinition({ tableName: parentTableName }) ? customNameDefinition({ tableName: parentTableName })
: customNameDefinition : customNameDefinition
if (versionsCustomName) if (versionsCustomName) {
customTableNameResult = `_${customTableNameResult}${adapter.versionsSuffix}` customTableNameResult = `_${customTableNameResult}${adapter.versionsSuffix}`
}
} }
const result = customTableNameResult || defaultTableName const result = customTableNameResult || defaultTableName

View File

@@ -25,7 +25,9 @@ export async function createVersion<T extends TypeWithID>(
const tableName = this.tableNameMap.get(`_${defaultTableName}${this.versionsSuffix}`) const tableName = this.tableNameMap.get(`_${defaultTableName}${this.versionsSuffix}`)
const version = { ...versionData } const version = { ...versionData }
if (version.id) delete version.id if (version.id) {
delete version.id
}
const result = await upsertRow<TypeWithVersion<T>>({ const result = await upsertRow<TypeWithVersion<T>>({
adapter: this, adapter: this,

View File

@@ -4,7 +4,9 @@ import type { DrizzleAdapter } from './types.js'
// eslint-disable-next-line @typescript-eslint/require-await // eslint-disable-next-line @typescript-eslint/require-await
export const destroy: Destroy = async function destroy(this: DrizzleAdapter) { export const destroy: Destroy = async function destroy(this: DrizzleAdapter) {
if (this.enums) this.enums = {} if (this.enums) {
this.enums = {}
}
this.schema = {} this.schema = {}
this.tables = {} this.tables = {}
this.relations = {} this.relations = {}

View File

@@ -22,7 +22,9 @@ export function findMigrationDir(migrationDir?: string): string {
const relativeMigrations = path.resolve(cwd, 'migrations') const relativeMigrations = path.resolve(cwd, 'migrations')
// Use arg if provided // Use arg if provided
if (migrationDir) return migrationDir if (migrationDir) {
return migrationDir
}
// Check other common locations // Check other common locations
if (fs.existsSync(srcDir)) { if (fs.existsSync(srcDir)) {

View File

@@ -57,7 +57,9 @@ export async function migrateReset(this: DrizzleAdapter): Promise<void> {
} catch (err: unknown) { } catch (err: unknown) {
let msg = `Error running migration ${migrationFile.name}.` let msg = `Error running migration ${migrationFile.name}.`
if (err instanceof Error) msg += ` ${err.message}` if (err instanceof Error) {
msg += ` ${err.message}`
}
await killTransaction(req) await killTransaction(req)
payload.logger.error({ payload.logger.error({

View File

@@ -7,7 +7,9 @@ export const convertPathToJSONTraversal = (incomingSegments: string[]) => {
return segments.reduce((res, segment, i) => { return segments.reduce((res, segment, i) => {
const formattedSegment = formatJSONPathSegment(segment) const formattedSegment = formatJSONPathSegment(segment)
if (i + 1 === segments.length) return `${res}->>${formattedSegment}` if (i + 1 === segments.length) {
return `${res}->>${formattedSegment}`
}
return `${res}->${formattedSegment}` return `${res}->${formattedSegment}`
}, '') }, '')
} }

View File

@@ -47,8 +47,8 @@ type Args = {
disableNotNull: boolean disableNotNull: boolean
disableUnique: boolean disableUnique: boolean
fields: Field[] fields: Field[]
rootRelationsToBuild?: RelationMap
rootRelationships?: Set<string> rootRelationships?: Set<string>
rootRelationsToBuild?: RelationMap
rootTableIDColType?: string rootTableIDColType?: string
rootTableName?: string rootTableName?: string
tableName: string tableName: string
@@ -77,8 +77,8 @@ export const buildTable = ({
disableNotNull, disableNotNull,
disableUnique = false, disableUnique = false,
fields, fields,
rootRelationsToBuild,
rootRelationships, rootRelationships,
rootRelationsToBuild,
rootTableIDColType, rootTableIDColType,
rootTableName: incomingRootTableName, rootTableName: incomingRootTableName,
tableName, tableName,
@@ -125,8 +125,8 @@ export const buildTable = ({
localesIndexes, localesIndexes,
newTableName: tableName, newTableName: tableName,
parentTableName: tableName, parentTableName: tableName,
relationsToBuild,
relationships, relationships,
relationsToBuild,
rootRelationsToBuild: rootRelationsToBuild || relationsToBuild, rootRelationsToBuild: rootRelationsToBuild || relationsToBuild,
rootTableIDColType: rootTableIDColType || idColType, rootTableIDColType: rootTableIDColType || idColType,
rootTableName, rootTableName,
@@ -358,8 +358,12 @@ export const buildTable = ({
const relatedCollectionCustomIDType = const relatedCollectionCustomIDType =
adapter.payload.collections[relationshipConfig.slug]?.customIDType adapter.payload.collections[relationshipConfig.slug]?.customIDType
if (relatedCollectionCustomIDType === 'number') colType = 'numeric' if (relatedCollectionCustomIDType === 'number') {
if (relatedCollectionCustomIDType === 'text') colType = 'varchar' colType = 'numeric'
}
if (relatedCollectionCustomIDType === 'text') {
colType = 'varchar'
}
relationshipColumns[`${relationTo}ID`] = parentIDColumnMap[colType]( relationshipColumns[`${relationTo}ID`] = parentIDColumnMap[colType](
`${formattedRelationTo}_id`, `${formattedRelationTo}_id`,

View File

@@ -20,8 +20,9 @@ export const createIndex = ({ name, columnName, tableName, unique }: CreateIndex
} else { } else {
columns = [table[name]] columns = [table[name]]
} }
if (unique) if (unique) {
return uniqueIndex(`${tableName}_${columnName}_idx`).on(columns[0], ...columns.slice(1)) return uniqueIndex(`${tableName}_${columnName}_idx`).on(columns[0], ...columns.slice(1))
}
return index(`${tableName}_${columnName}_idx`).on(columns[0], ...columns.slice(1)) return index(`${tableName}_${columnName}_idx`).on(columns[0], ...columns.slice(1))
} }
} }

View File

@@ -4,15 +4,15 @@ import type { Field, TabAsField } from 'payload'
import { relations } from 'drizzle-orm' import { relations } from 'drizzle-orm'
import { import {
PgNumericBuilder,
PgUUIDBuilder,
PgVarcharBuilder,
boolean, boolean,
foreignKey, foreignKey,
index, index,
integer, integer,
jsonb, jsonb,
numeric, numeric,
PgNumericBuilder,
PgUUIDBuilder,
PgVarcharBuilder,
text, text,
timestamp, timestamp,
varchar, varchar,
@@ -52,8 +52,8 @@ type Args = {
localesIndexes: Record<string, (cols: GenericColumns) => IndexBuilder> localesIndexes: Record<string, (cols: GenericColumns) => IndexBuilder>
newTableName: string newTableName: string
parentTableName: string parentTableName: string
relationsToBuild: RelationMap
relationships: Set<string> relationships: Set<string>
relationsToBuild: RelationMap
rootRelationsToBuild?: RelationMap rootRelationsToBuild?: RelationMap
rootTableIDColType: string rootTableIDColType: string
rootTableName: string rootTableName: string
@@ -88,8 +88,8 @@ export const traverseFields = ({
localesIndexes, localesIndexes,
newTableName, newTableName,
parentTableName, parentTableName,
relationsToBuild,
relationships, relationships,
relationsToBuild,
rootRelationsToBuild, rootRelationsToBuild,
rootTableIDColType, rootTableIDColType,
rootTableName, rootTableName,
@@ -105,12 +105,20 @@ export const traverseFields = ({
let hasLocalizedManyNumberField = false let hasLocalizedManyNumberField = false
let parentIDColType: IDType = 'integer' let parentIDColType: IDType = 'integer'
if (columns.id instanceof PgUUIDBuilder) parentIDColType = 'uuid' if (columns.id instanceof PgUUIDBuilder) {
if (columns.id instanceof PgNumericBuilder) parentIDColType = 'numeric' parentIDColType = 'uuid'
if (columns.id instanceof PgVarcharBuilder) parentIDColType = 'varchar' }
if (columns.id instanceof PgNumericBuilder) {
parentIDColType = 'numeric'
}
if (columns.id instanceof PgVarcharBuilder) {
parentIDColType = 'varchar'
}
fields.forEach((field) => { fields.forEach((field) => {
if ('name' in field && field.name === 'id') return if ('name' in field && field.name === 'id') {
return
}
let columnName: string let columnName: string
let fieldName: string let fieldName: string
@@ -396,8 +404,8 @@ export const traverseFields = ({
disableNotNull: disableNotNullFromHere, disableNotNull: disableNotNullFromHere,
disableUnique, disableUnique,
fields: disableUnique ? idToUUID(field.fields) : field.fields, fields: disableUnique ? idToUUID(field.fields) : field.fields,
rootRelationsToBuild,
rootRelationships: relationships, rootRelationships: relationships,
rootRelationsToBuild,
rootTableIDColType, rootTableIDColType,
rootTableName, rootTableName,
tableName: arrayTableName, tableName: arrayTableName,
@@ -418,12 +426,14 @@ export const traverseFields = ({
} }
if (subHasManyTextField) { if (subHasManyTextField) {
if (!hasManyTextField || subHasManyTextField === 'index') if (!hasManyTextField || subHasManyTextField === 'index') {
hasManyTextField = subHasManyTextField hasManyTextField = subHasManyTextField
}
} }
if (subHasManyNumberField) { if (subHasManyNumberField) {
if (!hasManyNumberField || subHasManyNumberField === 'index') if (!hasManyNumberField || subHasManyNumberField === 'index') {
hasManyNumberField = subHasManyNumberField hasManyNumberField = subHasManyNumberField
}
} }
relationsToBuild.set(fieldName, { relationsToBuild.set(fieldName, {
@@ -494,13 +504,13 @@ export const traverseFields = ({
const baseExtraConfig: BaseExtraConfig = { const baseExtraConfig: BaseExtraConfig = {
_orderIdx: (cols) => index(`${blockTableName}_order_idx`).on(cols._order), _orderIdx: (cols) => index(`${blockTableName}_order_idx`).on(cols._order),
_parentIDIdx: (cols) => index(`${blockTableName}_parent_id_idx`).on(cols._parentID),
_parentIdFk: (cols) => _parentIdFk: (cols) =>
foreignKey({ foreignKey({
name: `${blockTableName}_parent_id_fk`, name: `${blockTableName}_parent_id_fk`,
columns: [cols._parentID], columns: [cols._parentID],
foreignColumns: [adapter.tables[rootTableName].id], foreignColumns: [adapter.tables[rootTableName].id],
}).onDelete('cascade'), }).onDelete('cascade'),
_parentIDIdx: (cols) => index(`${blockTableName}_parent_id_idx`).on(cols._parentID),
_pathIdx: (cols) => index(`${blockTableName}_path_idx`).on(cols._path), _pathIdx: (cols) => index(`${blockTableName}_path_idx`).on(cols._path),
} }
@@ -528,8 +538,8 @@ export const traverseFields = ({
disableNotNull: disableNotNullFromHere, disableNotNull: disableNotNullFromHere,
disableUnique, disableUnique,
fields: disableUnique ? idToUUID(block.fields) : block.fields, fields: disableUnique ? idToUUID(block.fields) : block.fields,
rootRelationsToBuild,
rootRelationships: relationships, rootRelationships: relationships,
rootRelationsToBuild,
rootTableIDColType, rootTableIDColType,
rootTableName, rootTableName,
tableName: blockTableName, tableName: blockTableName,
@@ -550,13 +560,15 @@ export const traverseFields = ({
} }
if (subHasManyTextField) { if (subHasManyTextField) {
if (!hasManyTextField || subHasManyTextField === 'index') if (!hasManyTextField || subHasManyTextField === 'index') {
hasManyTextField = subHasManyTextField hasManyTextField = subHasManyTextField
}
} }
if (subHasManyNumberField) { if (subHasManyNumberField) {
if (!hasManyNumberField || subHasManyNumberField === 'index') if (!hasManyNumberField || subHasManyNumberField === 'index') {
hasManyNumberField = subHasManyNumberField hasManyNumberField = subHasManyNumberField
}
} }
adapter.relations[`relations_${blockTableName}`] = relations( adapter.relations[`relations_${blockTableName}`] = relations(
@@ -641,8 +653,8 @@ export const traverseFields = ({
localesIndexes, localesIndexes,
newTableName, newTableName,
parentTableName, parentTableName,
relationsToBuild,
relationships, relationships,
relationsToBuild,
rootRelationsToBuild, rootRelationsToBuild,
rootTableIDColType, rootTableIDColType,
rootTableName, rootTableName,
@@ -650,12 +662,24 @@ export const traverseFields = ({
withinLocalizedArrayOrBlock, withinLocalizedArrayOrBlock,
}) })
if (groupHasLocalizedField) hasLocalizedField = true if (groupHasLocalizedField) {
if (groupHasLocalizedRelationshipField) hasLocalizedRelationshipField = true hasLocalizedField = true
if (groupHasManyTextField) hasManyTextField = true }
if (groupHasLocalizedManyTextField) hasLocalizedManyTextField = true if (groupHasLocalizedRelationshipField) {
if (groupHasManyNumberField) hasManyNumberField = true hasLocalizedRelationshipField = true
if (groupHasLocalizedManyNumberField) hasLocalizedManyNumberField = true }
if (groupHasManyTextField) {
hasManyTextField = true
}
if (groupHasLocalizedManyTextField) {
hasLocalizedManyTextField = true
}
if (groupHasManyNumberField) {
hasManyNumberField = true
}
if (groupHasLocalizedManyNumberField) {
hasLocalizedManyNumberField = true
}
break break
} }
@@ -682,8 +706,8 @@ export const traverseFields = ({
localesIndexes, localesIndexes,
newTableName: `${parentTableName}_${columnName}`, newTableName: `${parentTableName}_${columnName}`,
parentTableName, parentTableName,
relationsToBuild,
relationships, relationships,
relationsToBuild,
rootRelationsToBuild, rootRelationsToBuild,
rootTableIDColType, rootTableIDColType,
rootTableName, rootTableName,
@@ -691,12 +715,24 @@ export const traverseFields = ({
withinLocalizedArrayOrBlock, withinLocalizedArrayOrBlock,
}) })
if (groupHasLocalizedField) hasLocalizedField = true if (groupHasLocalizedField) {
if (groupHasLocalizedRelationshipField) hasLocalizedRelationshipField = true hasLocalizedField = true
if (groupHasManyTextField) hasManyTextField = true }
if (groupHasLocalizedManyTextField) hasLocalizedManyTextField = true if (groupHasLocalizedRelationshipField) {
if (groupHasManyNumberField) hasManyNumberField = true hasLocalizedRelationshipField = true
if (groupHasLocalizedManyNumberField) hasLocalizedManyNumberField = true }
if (groupHasManyTextField) {
hasManyTextField = true
}
if (groupHasLocalizedManyTextField) {
hasLocalizedManyTextField = true
}
if (groupHasManyNumberField) {
hasManyNumberField = true
}
if (groupHasLocalizedManyNumberField) {
hasLocalizedManyNumberField = true
}
break break
} }
@@ -724,8 +760,8 @@ export const traverseFields = ({
localesIndexes, localesIndexes,
newTableName, newTableName,
parentTableName, parentTableName,
relationsToBuild,
relationships, relationships,
relationsToBuild,
rootRelationsToBuild, rootRelationsToBuild,
rootTableIDColType, rootTableIDColType,
rootTableName, rootTableName,
@@ -733,12 +769,24 @@ export const traverseFields = ({
withinLocalizedArrayOrBlock, withinLocalizedArrayOrBlock,
}) })
if (tabHasLocalizedField) hasLocalizedField = true if (tabHasLocalizedField) {
if (tabHasLocalizedRelationshipField) hasLocalizedRelationshipField = true hasLocalizedField = true
if (tabHasManyTextField) hasManyTextField = true }
if (tabHasLocalizedManyTextField) hasLocalizedManyTextField = true if (tabHasLocalizedRelationshipField) {
if (tabHasManyNumberField) hasManyNumberField = true hasLocalizedRelationshipField = true
if (tabHasLocalizedManyNumberField) hasLocalizedManyNumberField = true }
if (tabHasManyTextField) {
hasManyTextField = true
}
if (tabHasLocalizedManyTextField) {
hasLocalizedManyTextField = true
}
if (tabHasManyNumberField) {
hasManyNumberField = true
}
if (tabHasLocalizedManyNumberField) {
hasLocalizedManyNumberField = true
}
break break
} }
@@ -766,8 +814,8 @@ export const traverseFields = ({
localesIndexes, localesIndexes,
newTableName, newTableName,
parentTableName, parentTableName,
relationsToBuild,
relationships, relationships,
relationsToBuild,
rootRelationsToBuild, rootRelationsToBuild,
rootTableIDColType, rootTableIDColType,
rootTableName, rootTableName,
@@ -775,12 +823,24 @@ export const traverseFields = ({
withinLocalizedArrayOrBlock, withinLocalizedArrayOrBlock,
}) })
if (rowHasLocalizedField) hasLocalizedField = true if (rowHasLocalizedField) {
if (rowHasLocalizedRelationshipField) hasLocalizedRelationshipField = true hasLocalizedField = true
if (rowHasManyTextField) hasManyTextField = true }
if (rowHasLocalizedManyTextField) hasLocalizedManyTextField = true if (rowHasLocalizedRelationshipField) {
if (rowHasManyNumberField) hasManyNumberField = true hasLocalizedRelationshipField = true
if (rowHasLocalizedManyNumberField) hasLocalizedManyNumberField = true }
if (rowHasManyTextField) {
hasManyTextField = true
}
if (rowHasLocalizedManyTextField) {
hasLocalizedManyTextField = true
}
if (rowHasManyNumberField) {
hasManyNumberField = true
}
if (rowHasLocalizedManyNumberField) {
hasLocalizedManyNumberField = true
}
break break
} }
@@ -801,8 +861,12 @@ export const traverseFields = ({
const relatedCollectionCustomID = relationshipConfig.fields.find( const relatedCollectionCustomID = relationshipConfig.fields.find(
(field) => fieldAffectsData(field) && field.name === 'id', (field) => fieldAffectsData(field) && field.name === 'id',
) )
if (relatedCollectionCustomID?.type === 'number') colType = 'numeric' if (relatedCollectionCustomID?.type === 'number') {
if (relatedCollectionCustomID?.type === 'text') colType = 'varchar' colType = 'numeric'
}
if (relatedCollectionCustomID?.type === 'text') {
colType = 'varchar'
}
// make the foreign key column for relationship using the correct id column type // make the foreign key column for relationship using the correct id column type
targetTable[fieldName] = parentIDColumnMap[colType](`${columnName}_id`).references( targetTable[fieldName] = parentIDColumnMap[colType](`${columnName}_id`).references(

View File

@@ -5,8 +5,9 @@ export const withDefault = (
column: PgColumnBuilder, column: PgColumnBuilder,
field: FieldAffectingData, field: FieldAffectingData,
): PgColumnBuilder => { ): PgColumnBuilder => {
if (typeof field.defaultValue === 'undefined' || typeof field.defaultValue === 'function') if (typeof field.defaultValue === 'undefined' || typeof field.defaultValue === 'function') {
return column return column
}
if (typeof field.defaultValue === 'string' && field.defaultValue.includes("'")) { if (typeof field.defaultValue === 'string' && field.defaultValue.includes("'")) {
const escapedString = field.defaultValue.replaceAll("'", "''") const escapedString = field.defaultValue.replaceAll("'", "''")

View File

@@ -13,11 +13,11 @@ import type {
IndexBuilder, IndexBuilder,
PgColumn, PgColumn,
PgEnum, PgEnum,
pgEnum,
PgInsertOnConflictDoUpdateConfig, PgInsertOnConflictDoUpdateConfig,
PgSchema, PgSchema,
PgTableWithColumns, PgTableWithColumns,
UniqueConstraintBuilder, UniqueConstraintBuilder,
pgEnum,
} from 'drizzle-orm/pg-core' } from 'drizzle-orm/pg-core'
import type { PgTableFn } from 'drizzle-orm/pg-core/table' import type { PgTableFn } from 'drizzle-orm/pg-core/table'
import type { Payload, PayloadRequest } from 'payload' import type { Payload, PayloadRequest } from 'payload'

View File

@@ -539,7 +539,9 @@ export const getTableColumnFromPath = ({
field, field,
getNotNullColumnByValue: (val) => { getNotNullColumnByValue: (val) => {
const matchedRelation = relationTo.find((relation) => relation === val) const matchedRelation = relationTo.find((relation) => relation === val)
if (matchedRelation) return `${matchedRelation}ID` if (matchedRelation) {
return `${matchedRelation}ID`
}
return undefined return undefined
}, },
table: aliasRelationshipTable, table: aliasRelationshipTable,

View File

@@ -1,8 +1,6 @@
import { import {
type Column,
type SQL,
type SQLWrapper,
and, and,
type Column,
eq, eq,
gt, gt,
gte, gte,
@@ -15,6 +13,8 @@ import {
ne, ne,
notInArray, notInArray,
or, or,
type SQL,
type SQLWrapper,
} from 'drizzle-orm' } from 'drizzle-orm'
type OperatorKeys = type OperatorKeys =

View File

@@ -1,4 +1,4 @@
import { APIError, type Field, type TabAsField, createArrayFromCommaDelineated } from 'payload' import { APIError, createArrayFromCommaDelineated, type Field, type TabAsField } from 'payload'
import { fieldAffectsData } from 'payload/shared' import { fieldAffectsData } from 'payload/shared'
import type { DrizzleAdapter } from '../types.js' import type { DrizzleAdapter } from '../types.js'
@@ -21,7 +21,9 @@ export const sanitizeQueryValue = ({
let operator = operatorArg let operator = operatorArg
let formattedValue = val let formattedValue = val
if (!fieldAffectsData(field)) return { operator, value: formattedValue } if (!fieldAffectsData(field)) {
return { operator, value: formattedValue }
}
if ( if (
(field.type === 'relationship' || field.type === 'upload') && (field.type === 'relationship' || field.type === 'upload') &&
@@ -43,8 +45,12 @@ export const sanitizeQueryValue = ({
// Cast incoming values as proper searchable types // Cast incoming values as proper searchable types
if (field.type === 'checkbox' && typeof val === 'string') { if (field.type === 'checkbox' && typeof val === 'string') {
if (val.toLowerCase() === 'true') formattedValue = true if (val.toLowerCase() === 'true') {
if (val.toLowerCase() === 'false') formattedValue = false formattedValue = true
}
if (val.toLowerCase() === 'false') {
formattedValue = false
}
} }
if (['all', 'in', 'not_in'].includes(operator)) { if (['all', 'in', 'not_in'].includes(operator)) {
@@ -71,7 +77,9 @@ export const sanitizeQueryValue = ({
if (Number.isNaN(Date.parse(formattedValue))) { if (Number.isNaN(Date.parse(formattedValue))) {
return { operator, value: undefined } return { operator, value: undefined }
} }
} else if (typeof val === 'number') formattedValue = new Date(val).toISOString() } else if (typeof val === 'number') {
formattedValue = new Date(val).toISOString()
}
} }
if (field.type === 'relationship' || field.type === 'upload') { if (field.type === 'relationship' || field.type === 'upload') {

View File

@@ -1,7 +1,9 @@
import type { CommitTransaction } from 'payload' import type { CommitTransaction } from 'payload'
export const commitTransaction: CommitTransaction = async function commitTransaction(id) { export const commitTransaction: CommitTransaction = async function commitTransaction(id) {
if (id instanceof Promise) return if (id instanceof Promise) {
return
}
// if the session was deleted it has already been aborted // if the session was deleted it has already been aborted
if (!this.sessions[id]) { if (!this.sessions[id]) {

View File

@@ -142,7 +142,9 @@ export const traverseFields = <T extends Record<string, unknown>>({
if (field.localized) { if (field.localized) {
result[field.name] = fieldData.reduce((arrayResult, row) => { result[field.name] = fieldData.reduce((arrayResult, row) => {
if (typeof row._locale === 'string') { if (typeof row._locale === 'string') {
if (!arrayResult[row._locale]) arrayResult[row._locale] = [] if (!arrayResult[row._locale]) {
arrayResult[row._locale] = []
}
const locale = row._locale const locale = row._locale
const data = {} const data = {}
delete row._locale delete row._locale
@@ -235,7 +237,9 @@ export const traverseFields = <T extends Record<string, unknown>>({
delete row._uuid delete row._uuid
} }
if (typeof row._locale === 'string') { if (typeof row._locale === 'string') {
if (!result[field.name][row._locale]) result[field.name][row._locale] = [] if (!result[field.name][row._locale]) {
result[field.name][row._locale] = []
}
result[field.name][row._locale].push(row) result[field.name][row._locale].push(row)
delete row._locale delete row._locale
} }
@@ -355,7 +359,9 @@ export const traverseFields = <T extends Record<string, unknown>>({
relationPathMatch.forEach((row) => { relationPathMatch.forEach((row) => {
if (typeof row.locale === 'string') { if (typeof row.locale === 'string') {
if (!relationsByLocale[row.locale]) relationsByLocale[row.locale] = [] if (!relationsByLocale[row.locale]) {
relationsByLocale[row.locale] = []
}
relationsByLocale[row.locale].push(row) relationsByLocale[row.locale].push(row)
} }
}) })
@@ -382,7 +388,9 @@ export const traverseFields = <T extends Record<string, unknown>>({
if (field.type === 'text' && field?.hasMany) { if (field.type === 'text' && field?.hasMany) {
const textPathMatch = texts[`${sanitizedPath}${field.name}`] const textPathMatch = texts[`${sanitizedPath}${field.name}`]
if (!textPathMatch) return result if (!textPathMatch) {
return result
}
if (field.localized) { if (field.localized) {
result[field.name] = {} result[field.name] = {}
@@ -390,7 +398,9 @@ export const traverseFields = <T extends Record<string, unknown>>({
textPathMatch.forEach((row) => { textPathMatch.forEach((row) => {
if (typeof row.locale === 'string') { if (typeof row.locale === 'string') {
if (!textsByLocale[row.locale]) textsByLocale[row.locale] = [] if (!textsByLocale[row.locale]) {
textsByLocale[row.locale] = []
}
textsByLocale[row.locale].push(row) textsByLocale[row.locale].push(row)
} }
}) })
@@ -417,7 +427,9 @@ export const traverseFields = <T extends Record<string, unknown>>({
if (field.type === 'number' && field.hasMany) { if (field.type === 'number' && field.hasMany) {
const numberPathMatch = numbers[`${sanitizedPath}${field.name}`] const numberPathMatch = numbers[`${sanitizedPath}${field.name}`]
if (!numberPathMatch) return result if (!numberPathMatch) {
return result
}
if (field.localized) { if (field.localized) {
result[field.name] = {} result[field.name] = {}
@@ -425,7 +437,9 @@ export const traverseFields = <T extends Record<string, unknown>>({
numberPathMatch.forEach((row) => { numberPathMatch.forEach((row) => {
if (typeof row.locale === 'string') { if (typeof row.locale === 'string') {
if (!numbersByLocale[row.locale]) numbersByLocale[row.locale] = [] if (!numbersByLocale[row.locale]) {
numbersByLocale[row.locale] = []
}
numbersByLocale[row.locale].push(row) numbersByLocale[row.locale].push(row)
} }
}) })
@@ -455,7 +469,9 @@ export const traverseFields = <T extends Record<string, unknown>>({
if (field.localized) { if (field.localized) {
result[field.name] = fieldData.reduce((selectResult, row) => { result[field.name] = fieldData.reduce((selectResult, row) => {
if (typeof row.locale === 'string') { if (typeof row.locale === 'string') {
if (!selectResult[row.locale]) selectResult[row.locale] = [] if (!selectResult[row.locale]) {
selectResult[row.locale] = []
}
selectResult[row.locale].push(row.value) selectResult[row.locale].push(row.value)
} }
@@ -494,7 +510,9 @@ export const traverseFields = <T extends Record<string, unknown>>({
const locale = table._locale as string const locale = table._locale as string
const refKey = field.localized && locale ? locale : field.name const refKey = field.localized && locale ? locale : field.name
if (field.localized && locale) delete table._locale if (field.localized && locale) {
delete table._locale
}
ref[refKey] = traverseFields<Record<string, unknown>>({ ref[refKey] = traverseFields<Record<string, unknown>>({
adapter, adapter,
blocks, blocks,

View File

@@ -48,12 +48,18 @@ export const transformBlocks = ({
withinArrayOrBlockLocale, withinArrayOrBlockLocale,
}: Args) => { }: Args) => {
data.forEach((blockRow, i) => { data.forEach((blockRow, i) => {
if (typeof blockRow.blockType !== 'string') return if (typeof blockRow.blockType !== 'string') {
return
}
const matchedBlock = field.blocks.find(({ slug }) => slug === blockRow.blockType) const matchedBlock = field.blocks.find(({ slug }) => slug === blockRow.blockType)
if (!matchedBlock) return if (!matchedBlock) {
return
}
const blockType = toSnakeCase(blockRow.blockType) const blockType = toSnakeCase(blockRow.blockType)
if (!blocks[blockType]) blocks[blockType] = [] if (!blocks[blockType]) {
blocks[blockType] = []
}
const newRow: BlockRowToInsert = { const newRow: BlockRowToInsert = {
arrays: {}, arrays: {},
@@ -64,8 +70,12 @@ export const transformBlocks = ({
}, },
} }
if (field.localized && locale) newRow.row._locale = locale if (field.localized && locale) {
if (withinArrayOrBlockLocale) newRow.row._locale = withinArrayOrBlockLocale newRow.row._locale = locale
}
if (withinArrayOrBlockLocale) {
newRow.row._locale = withinArrayOrBlockLocale
}
const blockTableName = adapter.tableNameMap.get(`${baseTableName}_blocks_${blockType}`) const blockTableName = adapter.tableNameMap.get(`${baseTableName}_blocks_${blockType}`)

View File

@@ -15,14 +15,18 @@ export const transformRelationship = ({ baseRow, data, field, relationships }: A
relations.forEach((relation, i) => { relations.forEach((relation, i) => {
if (relation) { if (relation) {
const relationRow = { ...baseRow } const relationRow = { ...baseRow }
if ('hasMany' in field && field.hasMany) relationRow.order = i + 1 if ('hasMany' in field && field.hasMany) {
relationRow.order = i + 1
}
if (Array.isArray(field.relationTo) && valueIsValueWithRelation(relation)) { if (Array.isArray(field.relationTo) && valueIsValueWithRelation(relation)) {
relationRow[`${relation.relationTo}ID`] = relation.value relationRow[`${relation.relationTo}ID`] = relation.value
relationships.push(relationRow) relationships.push(relationRow)
} else { } else {
relationRow[`${field.relationTo}ID`] = relation relationRow[`${field.relationTo}ID`] = relation
if (relation) relationships.push(relationRow) if (relation) {
relationships.push(relationRow)
}
} }
} }
}) })

View File

@@ -101,7 +101,9 @@ export const traverseFields = ({
if (field.type === 'array') { if (field.type === 'array') {
const arrayTableName = adapter.tableNameMap.get(`${parentTableName}_${columnName}`) const arrayTableName = adapter.tableNameMap.get(`${parentTableName}_${columnName}`)
if (!arrays[arrayTableName]) arrays[arrayTableName] = [] if (!arrays[arrayTableName]) {
arrays[arrayTableName] = []
}
if (field.localized) { if (field.localized) {
if (typeof data[field.name] === 'object' && data[field.name] !== null) { if (typeof data[field.name] === 'object' && data[field.name] !== null) {
@@ -502,7 +504,9 @@ export const traverseFields = ({
if (field.type === 'select' && field.hasMany) { if (field.type === 'select' && field.hasMany) {
const selectTableName = adapter.tableNameMap.get(`${parentTableName}_${columnName}`) const selectTableName = adapter.tableNameMap.get(`${parentTableName}_${columnName}`)
if (!selects[selectTableName]) selects[selectTableName] = [] if (!selects[selectTableName]) {
selects[selectTableName] = []
}
if (field.localized) { if (field.localized) {
if (typeof data[field.name] === 'object' && data[field.name] !== null) { if (typeof data[field.name] === 'object' && data[field.name] !== null) {
@@ -537,7 +541,9 @@ export const traverseFields = ({
if (field.localized) { if (field.localized) {
if (typeof fieldData === 'object' && fieldData !== null) { if (typeof fieldData === 'object' && fieldData !== null) {
Object.entries(fieldData).forEach(([localeKey, localeData]) => { Object.entries(fieldData).forEach(([localeKey, localeData]) => {
if (!locales[localeKey]) locales[localeKey] = {} if (!locales[localeKey]) {
locales[localeKey] = {}
}
valuesToTransform.push({ valuesToTransform.push({
localeKey, localeKey,
@@ -550,7 +556,9 @@ export const traverseFields = ({
let ref = row let ref = row
if (forcedLocale) { if (forcedLocale) {
if (!locales[forcedLocale]) locales[forcedLocale] = {} if (!locales[forcedLocale]) {
locales[forcedLocale] = {}
}
ref = locales[forcedLocale] ref = locales[forcedLocale]
} }

View File

@@ -162,7 +162,7 @@ export interface DrizzleAdapter extends BaseDatabaseAdapter {
deleteWhere: DeleteWhere deleteWhere: DeleteWhere
drizzle: LibSQLDatabase | PostgresDB drizzle: LibSQLDatabase | PostgresDB
dropDatabase: DropDatabase dropDatabase: DropDatabase
enums?: Record<string, unknown> | never enums?: never | Record<string, unknown>
execute: Execute<unknown> execute: Execute<unknown>
features: { features: {
json?: boolean json?: boolean

View File

@@ -42,8 +42,9 @@ export const deleteExistingRowsByPath = async ({
if (localizedPathsToDelete.size > 0) { if (localizedPathsToDelete.size > 0) {
const whereConstraints = [eq(table[parentColumnName], parentID)] const whereConstraints = [eq(table[parentColumnName], parentID)]
if (pathColumnName) if (pathColumnName) {
whereConstraints.push(inArray(table[pathColumnName], Array.from(localizedPathsToDelete))) whereConstraints.push(inArray(table[pathColumnName], Array.from(localizedPathsToDelete)))
}
await adapter.deleteWhere({ await adapter.deleteWhere({
db, db,
@@ -55,8 +56,9 @@ export const deleteExistingRowsByPath = async ({
if (pathsToDelete.size > 0) { if (pathsToDelete.size > 0) {
const whereConstraints = [eq(table[parentColumnName], parentID)] const whereConstraints = [eq(table[parentColumnName], parentID)]
if (pathColumnName) if (pathColumnName) {
whereConstraints.push(inArray(table[pathColumnName], Array.from(pathsToDelete))) whereConstraints.push(inArray(table[pathColumnName], Array.from(pathsToDelete)))
}
await adapter.deleteWhere({ await adapter.deleteWhere({
db, db,

View File

@@ -116,7 +116,9 @@ export const upsertRow = async <T extends Record<string, unknown> | TypeWithID>(
if (typeof row.parent === 'undefined') { if (typeof row.parent === 'undefined') {
row.parent = insertedRow.id row.parent = insertedRow.id
} }
if (!selectsToInsert[selectTableName]) selectsToInsert[selectTableName] = [] if (!selectsToInsert[selectTableName]) {
selectsToInsert[selectTableName] = []
}
selectsToInsert[selectTableName].push(row) selectsToInsert[selectTableName].push(row)
}) })
}) })
@@ -127,7 +129,9 @@ export const upsertRow = async <T extends Record<string, unknown> | TypeWithID>(
Object.keys(rowToInsert.blocks).forEach((blockName) => { Object.keys(rowToInsert.blocks).forEach((blockName) => {
rowToInsert.blocks[blockName].forEach((blockRow) => { rowToInsert.blocks[blockName].forEach((blockRow) => {
blockRow.row._parentID = insertedRow.id blockRow.row._parentID = insertedRow.id
if (!blocksToInsert[blockName]) blocksToInsert[blockName] = [] if (!blocksToInsert[blockName]) {
blocksToInsert[blockName] = []
}
if (blockRow.row.uuid) { if (blockRow.row.uuid) {
delete blockRow.row.uuid delete blockRow.row.uuid
} }
@@ -360,8 +364,9 @@ export const upsertRow = async <T extends Record<string, unknown> | TypeWithID>(
if (error.constraint.includes(replacement)) { if (error.constraint.includes(replacement)) {
const replacedConstraint = error.constraint.replace(replacement, '') const replacedConstraint = error.constraint.replace(replacement, '')
if (replacedConstraint && adapter.fieldConstraints[tableName]?.[replacedConstraint]) if (replacedConstraint && adapter.fieldConstraints[tableName]?.[replacedConstraint]) {
fieldName = adapter.fieldConstraints[tableName][replacedConstraint] fieldName = adapter.fieldConstraints[tableName][replacedConstraint]
}
} }
} }
} }
@@ -396,7 +401,9 @@ export const upsertRow = async <T extends Record<string, unknown> | TypeWithID>(
} }
} }
if (ignoreResult) return data as T if (ignoreResult) {
return data as T
}
// ////////////////////////////////// // //////////////////////////////////
// RETRIEVE NEWLY UPDATED ROW // RETRIEVE NEWLY UPDATED ROW

View File

@@ -11,7 +11,9 @@ export const createBlocksMap = (data: Record<string, unknown>): BlocksMap => {
rows.forEach((row) => { rows.forEach((row) => {
if ('_path' in row) { if ('_path' in row) {
if (!(row._path in blocksMap)) blocksMap[row._path] = [] if (!(row._path in blocksMap)) {
blocksMap[row._path] = []
}
row.blockType = blockType row.blockType = blockType
blocksMap[row._path].push(row) blocksMap[row._path].push(row)

View File

@@ -11,7 +11,9 @@ export const createPathMap = (rows: unknown): Record<string, Record<string, unkn
delete formattedRow.path delete formattedRow.path
if (!res[row.path]) res[row.path] = [] if (!res[row.path]) {
res[row.path] = []
}
res[row.path].push(row) res[row.path].push(row)
return res return res

View File

@@ -5,10 +5,18 @@ import { fieldAffectsData, fieldHasSubFields } from 'payload/shared'
export const hasLocalesTable = (fields: Field[]): boolean => { export const hasLocalesTable = (fields: Field[]): boolean => {
return fields.some((field) => { return fields.some((field) => {
// arrays always get a separate table // arrays always get a separate table
if (field.type === 'array') return false if (field.type === 'array') {
if (fieldAffectsData(field) && field.localized) return true return false
if (fieldHasSubFields(field)) return hasLocalesTable(field.fields) }
if (field.type === 'tabs') return field.tabs.some((tab) => hasLocalesTable(tab.fields)) if (fieldAffectsData(field) && field.localized) {
return true
}
if (fieldHasSubFields(field)) {
return hasLocalesTable(field.fields)
}
if (field.type === 'tabs') {
return field.tabs.some((tab) => hasLocalesTable(tab.fields))
}
return false return false
}) })
} }

View File

@@ -104,7 +104,7 @@ const typescriptRules = {
}, },
}, },
], ],
'@typescript-eslint/no-empty-object-type': 'warn' '@typescript-eslint/no-empty-object-type': 'warn',
} }
/** @typedef {import('eslint').Linter.FlatConfig} */ /** @typedef {import('eslint').Linter.FlatConfig} */

View File

@@ -101,6 +101,32 @@ export const translations = {
tooShort: 'Trop court', tooShort: 'Trop court',
}, },
}, },
it: {
$schema: './translation-schema.json',
'plugin-seo': {
almostThere: 'Ci siamo quasi',
autoGenerate: 'Generazione automatica',
bestPractices: 'migliori pratiche',
characterCount: '{{current}}/{{minLength}}-{{maxLength}} caratteri, ',
charactersLeftOver: '{{characters}} rimasti',
charactersToGo: '{{characters}} mancanti',
charactersTooMany: '{{characters}} in più',
checksPassing: '{{current}}/{{max}} controlli superati',
good: 'Bene',
imageAutoGenerationTip:
"La generazione automatica recupererà l'immagine selezionata per l'hero",
lengthTipDescription:
'Dovrebbe essere compreso tra {{minLength}} e {{maxLength}} caratteri. Per assistenza nella scrittura di meta descrizioni di qualità, vedere ',
lengthTipTitle:
'Dovrebbe essere compreso tra {{minLength}} e {{maxLength}} caratteri. Per assistenza nella scrittura di meta titoli di qualità, vedere ',
noImage: 'Nessuna Immagine',
preview: 'Anteprima',
previewDescription:
'I risultati esatti possono variare in base al contenuto e alla pertinenza della ricerca.',
tooLong: 'Troppo lungo',
tooShort: 'Troppo corto',
},
},
nb: { nb: {
$schema: './translation-schema.json', $schema: './translation-schema.json',
'plugin-seo': { 'plugin-seo': {
@@ -201,28 +227,6 @@ export const translations = {
tooShort: 'Закороткий', tooShort: 'Закороткий',
}, },
}, },
it: {
$schema: './translation-schema.json',
'plugin-seo': {
almostThere: 'Ci siamo quasi',
autoGenerate: 'Generazione automatica',
bestPractices: 'migliori pratiche',
characterCount: '{{current}}/{{minLength}}-{{maxLength}} caratteri, ',
charactersLeftOver: '{{characters}} rimasti',
charactersToGo: '{{characters}} mancanti',
charactersTooMany: '{{characters}} in più',
checksPassing: '{{current}}/{{max}} controlli superati',
good: 'Bene',
imageAutoGenerationTip: 'La generazione automatica recupererà l\'immagine selezionata per l\'hero',
lengthTipDescription: 'Dovrebbe essere compreso tra {{minLength}} e {{maxLength}} caratteri. Per assistenza nella scrittura di meta descrizioni di qualità, vedere ',
lengthTipTitle: 'Dovrebbe essere compreso tra {{minLength}} e {{maxLength}} caratteri. Per assistenza nella scrittura di meta titoli di qualità, vedere ',
noImage: 'Nessuna Immagine',
preview: 'Anteprima',
previewDescription: 'I risultati esatti possono variare in base al contenuto e alla pertinenza della ricerca.',
tooLong: 'Troppo lungo',
tooShort: 'Troppo corto'
}
}
} }
export type PluginSEOTranslations = typeof translations.en export type PluginSEOTranslations = typeof translations.en

View File

@@ -20,24 +20,25 @@ import { default as default_18 } from '@/components/BeforeDashboard'
import { default as default_19 } from '@/components/BeforeLogin' import { default as default_19 } from '@/components/BeforeLogin'
export const importMap = { export const importMap = {
"@payloadcms/richtext-lexical/client#RichTextCell": RichTextCell_0, '@payloadcms/richtext-lexical/client#RichTextCell': RichTextCell_0,
"@payloadcms/richtext-lexical/client#RichTextField": RichTextField_1, '@payloadcms/richtext-lexical/client#RichTextField': RichTextField_1,
"@payloadcms/richtext-lexical/generateComponentMap#getGenerateComponentMap": getGenerateComponentMap_2, '@payloadcms/richtext-lexical/generateComponentMap#getGenerateComponentMap':
"@payloadcms/richtext-lexical/client#InlineToolbarFeatureClient": InlineToolbarFeatureClient_3, getGenerateComponentMap_2,
"@payloadcms/richtext-lexical/client#FixedToolbarFeatureClient": FixedToolbarFeatureClient_4, '@payloadcms/richtext-lexical/client#InlineToolbarFeatureClient': InlineToolbarFeatureClient_3,
"@payloadcms/richtext-lexical/client#HeadingFeatureClient": HeadingFeatureClient_5, '@payloadcms/richtext-lexical/client#FixedToolbarFeatureClient': FixedToolbarFeatureClient_4,
"@payloadcms/richtext-lexical/client#UnderlineFeatureClient": UnderlineFeatureClient_6, '@payloadcms/richtext-lexical/client#HeadingFeatureClient': HeadingFeatureClient_5,
"@payloadcms/richtext-lexical/client#BoldFeatureClient": BoldFeatureClient_7, '@payloadcms/richtext-lexical/client#UnderlineFeatureClient': UnderlineFeatureClient_6,
"@payloadcms/richtext-lexical/client#ItalicFeatureClient": ItalicFeatureClient_8, '@payloadcms/richtext-lexical/client#BoldFeatureClient': BoldFeatureClient_7,
"@payloadcms/richtext-lexical/client#LinkFeatureClient": LinkFeatureClient_9, '@payloadcms/richtext-lexical/client#ItalicFeatureClient': ItalicFeatureClient_8,
"@payloadcms/plugin-seo/client#OverviewComponent": OverviewComponent_10, '@payloadcms/richtext-lexical/client#LinkFeatureClient': LinkFeatureClient_9,
"@payloadcms/plugin-seo/client#MetaTitleComponent": MetaTitleComponent_11, '@payloadcms/plugin-seo/client#OverviewComponent': OverviewComponent_10,
"@payloadcms/plugin-seo/client#MetaImageComponent": MetaImageComponent_12, '@payloadcms/plugin-seo/client#MetaTitleComponent': MetaTitleComponent_11,
"@payloadcms/plugin-seo/client#MetaDescriptionComponent": MetaDescriptionComponent_13, '@payloadcms/plugin-seo/client#MetaImageComponent': MetaImageComponent_12,
"@payloadcms/plugin-seo/client#PreviewComponent": PreviewComponent_14, '@payloadcms/plugin-seo/client#MetaDescriptionComponent': MetaDescriptionComponent_13,
"@/fields/slug/SlugComponent#SlugComponent": SlugComponent_15, '@payloadcms/plugin-seo/client#PreviewComponent': PreviewComponent_14,
"@payloadcms/richtext-lexical/client#HorizontalRuleFeatureClient": HorizontalRuleFeatureClient_16, '@/fields/slug/SlugComponent#SlugComponent': SlugComponent_15,
"@payloadcms/richtext-lexical/client#BlocksFeatureClient": BlocksFeatureClient_17, '@payloadcms/richtext-lexical/client#HorizontalRuleFeatureClient': HorizontalRuleFeatureClient_16,
"@/components/BeforeDashboard#default": default_18, '@payloadcms/richtext-lexical/client#BlocksFeatureClient': BlocksFeatureClient_17,
"@/components/BeforeLogin#default": default_19 '@/components/BeforeDashboard#default': default_18,
'@/components/BeforeLogin#default': default_19,
} }