@payloadcms/drizzle 4.0.0-internal.5d5a2b2 → 4.0.0-internal.688c4d0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/exports/postgres.d.ts +1 -0
  2. package/dist/exports/postgres.d.ts.map +1 -1
  3. package/dist/exports/postgres.js +1 -0
  4. package/dist/exports/postgres.js.map +1 -1
  5. package/dist/exports/sqlite.d.ts +1 -0
  6. package/dist/exports/sqlite.d.ts.map +1 -1
  7. package/dist/exports/sqlite.js +1 -0
  8. package/dist/exports/sqlite.js.map +1 -1
  9. package/dist/find/traverseFields.js +1 -2
  10. package/dist/find/traverseFields.js.map +1 -1
  11. package/dist/postgres/predefinedMigrations/localize-status/index.d.ts +11 -0
  12. package/dist/postgres/predefinedMigrations/localize-status/index.d.ts.map +1 -0
  13. package/dist/postgres/predefinedMigrations/localize-status/index.js +296 -0
  14. package/dist/postgres/predefinedMigrations/localize-status/index.js.map +1 -0
  15. package/dist/postgres/predefinedMigrations/localize-status/migrateMainCollection.d.ts +13 -0
  16. package/dist/postgres/predefinedMigrations/localize-status/migrateMainCollection.d.ts.map +1 -0
  17. package/dist/postgres/predefinedMigrations/localize-status/migrateMainCollection.js +51 -0
  18. package/dist/postgres/predefinedMigrations/localize-status/migrateMainCollection.js.map +1 -0
  19. package/dist/postgres/predefinedMigrations/localize-status/migrateMainGlobal.d.ts +13 -0
  20. package/dist/postgres/predefinedMigrations/localize-status/migrateMainGlobal.d.ts.map +1 -0
  21. package/dist/postgres/predefinedMigrations/localize-status/migrateMainGlobal.js +54 -0
  22. package/dist/postgres/predefinedMigrations/localize-status/migrateMainGlobal.js.map +1 -0
  23. package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.d.ts.map +1 -1
  24. package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.js.map +1 -1
  25. package/dist/queries/getTableColumnFromPath.js +2 -2
  26. package/dist/queries/getTableColumnFromPath.js.map +1 -1
  27. package/dist/schema/traverseFields.js +1 -1
  28. package/dist/schema/traverseFields.js.map +1 -1
  29. package/dist/sqlite/predefinedMigrations/localize-status/index.d.ts +28 -0
  30. package/dist/sqlite/predefinedMigrations/localize-status/index.d.ts.map +1 -0
  31. package/dist/sqlite/predefinedMigrations/localize-status/index.js +198 -0
  32. package/dist/sqlite/predefinedMigrations/localize-status/index.js.map +1 -0
  33. package/dist/sqlite/predefinedMigrations/localize-status/migrateMainCollection.d.ts +12 -0
  34. package/dist/sqlite/predefinedMigrations/localize-status/migrateMainCollection.d.ts.map +1 -0
  35. package/dist/sqlite/predefinedMigrations/localize-status/migrateMainCollection.js +24 -0
  36. package/dist/sqlite/predefinedMigrations/localize-status/migrateMainCollection.js.map +1 -0
  37. package/dist/sqlite/predefinedMigrations/localize-status/migrateMainGlobal.d.ts +12 -0
  38. package/dist/sqlite/predefinedMigrations/localize-status/migrateMainGlobal.d.ts.map +1 -0
  39. package/dist/sqlite/predefinedMigrations/localize-status/migrateMainGlobal.js +28 -0
  40. package/dist/sqlite/predefinedMigrations/localize-status/migrateMainGlobal.js.map +1 -0
  41. package/dist/transform/read/traverseFields.js +2 -2
  42. package/dist/transform/read/traverseFields.js.map +1 -1
  43. package/dist/transform/write/blocks.js +1 -1
  44. package/dist/transform/write/blocks.js.map +1 -1
  45. package/dist/transform/write/traverseFields.js +1 -2
  46. package/dist/transform/write/traverseFields.js.map +1 -1
  47. package/dist/upsertRow/index.d.ts.map +1 -1
  48. package/dist/upsertRow/index.js +5 -2
  49. package/dist/upsertRow/index.js.map +1 -1
  50. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/transform/write/traverseFields.ts"],"sourcesContent":["import { sql } from 'drizzle-orm'\nimport { APIError, type FlattenedField } from 'payload'\nimport { fieldIsVirtual, fieldShouldBeLocalized } from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter } from '../../types.js'\nimport type {\n NumberToDelete,\n RelationshipToAppend,\n RelationshipToDelete,\n RowToInsert,\n TextToDelete,\n} from './types.js'\n\nimport { isArrayOfRows } from '../../utilities/isArrayOfRows.js'\nimport { resolveBlockTableName } from '../../utilities/validateExistingBlockIsIdentical.js'\nimport { transformArray } from './array.js'\nimport { transformBlocks } from './blocks.js'\nimport { transformNumbers } from './numbers.js'\nimport { transformRelationship } from './relationships.js'\nimport { transformSelects } from './selects.js'\nimport { transformTexts } from './texts.js'\n\ntype Args = {\n adapter: DrizzleAdapter\n /**\n * This will delete the array table and then re-insert all the new array rows.\n */\n arrays: RowToInsert['arrays']\n /**\n * Array rows to push to the existing array. This will simply create\n * a new row in the array table.\n */\n arraysToPush: RowToInsert['arraysToPush']\n /**\n * This is the name of the base table\n */\n baseTableName: string\n blocks: RowToInsert['blocks']\n blocksToDelete: Set<string>\n /**\n * A snake-case field prefix, representing prior fields\n * Ex: my_group_my_named_tab_\n */\n columnPrefix: string\n data: Record<string, unknown>\n enableAtomicWrites?: boolean\n existingLocales?: Record<string, unknown>[]\n /**\n * A prefix that will retain camel-case formatting, representing prior fields\n * Ex: myGroup_myNamedTab_\n */\n fieldPrefix: string\n fields: FlattenedField[]\n forcedLocale?: string\n /**\n * Tracks whether the current traversion context is from array or block.\n */\n insideArrayOrBlock?: boolean\n locales: {\n [locale: string]: Record<string, unknown>\n }\n numbers: Record<string, unknown>[]\n numbersToDelete: NumberToDelete[]\n parentIsLocalized: boolean\n /**\n * This is the name of the parent table\n */\n parentTableName: string\n path: string\n relationships: Record<string, unknown>[]\n relationshipsToAppend: RelationshipToAppend[]\n relationshipsToDelete: RelationshipToDelete[]\n row: Record<string, unknown>\n selects: {\n [tableName: string]: Record<string, unknown>[]\n }\n texts: Record<string, unknown>[]\n textsToDelete: TextToDelete[]\n /**\n * Set to a locale code if this set of fields is traversed within a\n * localized array or block field\n */\n withinArrayOrBlockLocale?: string\n}\n\nexport const traverseFields = ({\n adapter,\n arrays,\n arraysToPush,\n baseTableName,\n blocks,\n blocksToDelete,\n columnPrefix,\n data,\n enableAtomicWrites,\n existingLocales,\n fieldPrefix,\n fields,\n forcedLocale,\n insideArrayOrBlock = false,\n locales,\n numbers,\n numbersToDelete,\n parentIsLocalized,\n parentTableName,\n path,\n relationships,\n relationshipsToAppend,\n relationshipsToDelete,\n row,\n selects,\n texts,\n textsToDelete,\n withinArrayOrBlockLocale,\n}: Args) => {\n let fieldsMatched = false\n\n if (row._uuid) {\n data._uuid = row._uuid\n }\n\n fields.forEach((field) => {\n let columnName = ''\n let fieldName = ''\n let fieldData: unknown\n\n if (fieldIsVirtual(field)) {\n return\n }\n\n // Mark that we found a matching field\n if (data[field.name] !== undefined) {\n fieldsMatched = true\n }\n\n columnName = `${columnPrefix || ''}${toSnakeCase(field.name)}`\n fieldName = `${fieldPrefix || ''}${field.name}`\n fieldData = data[field.name]\n\n const isLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n if (field.type === 'array') {\n const arrayTableName = adapter.tableNameMap.get(`${parentTableName}_${columnName}`)\n\n if (isLocalized) {\n const value = data[field.name]\n\n if (typeof value === 'object' && value !== null) {\n Object.entries(value).forEach(([localeKey, localeValue]) => {\n let localeData = localeValue\n let push = false\n\n if (localeValue && typeof localeValue === 'object' && '$push' in localeValue) {\n localeData = localeValue.$push\n push = true\n if (!Array.isArray(localeData)) {\n localeData = [localeData]\n }\n }\n\n if (Array.isArray(localeData)) {\n const newRows = transformArray({\n adapter,\n arrayTableName,\n baseTableName,\n blocks,\n blocksToDelete,\n data: localeData,\n field,\n locale: localeKey,\n numbers,\n numbersToDelete,\n parentIsLocalized: parentIsLocalized || field.localized,\n path,\n relationships,\n relationshipsToDelete,\n selects,\n texts,\n textsToDelete,\n withinArrayOrBlockLocale: localeKey,\n })\n\n if (push) {\n if (!arraysToPush[arrayTableName]) {\n arraysToPush[arrayTableName] = []\n }\n arraysToPush[arrayTableName] = arraysToPush[arrayTableName].concat(newRows)\n } else {\n if (!arrays[arrayTableName]) {\n arrays[arrayTableName] = []\n }\n arrays[arrayTableName] = arrays[arrayTableName].concat(newRows)\n }\n }\n })\n }\n } else {\n let value = data[field.name]\n let push = false\n if (typeof value === 'object' && '$push' in value) {\n value = Array.isArray(value.$push) ? value.$push : [value.$push]\n push = true\n }\n\n const newRows = transformArray({\n adapter,\n arrayTableName,\n baseTableName,\n blocks,\n blocksToDelete,\n data: value,\n field,\n numbers,\n numbersToDelete,\n parentIsLocalized: parentIsLocalized || field.localized,\n path,\n relationships,\n relationshipsToDelete,\n selects,\n texts,\n textsToDelete,\n withinArrayOrBlockLocale,\n })\n\n if (push) {\n if (!arraysToPush[arrayTableName]) {\n arraysToPush[arrayTableName] = []\n }\n arraysToPush[arrayTableName] = arraysToPush[arrayTableName].concat(newRows)\n } else {\n if (!arrays[arrayTableName]) {\n arrays[arrayTableName] = []\n }\n arrays[arrayTableName] = arrays[arrayTableName].concat(newRows)\n }\n }\n\n return\n }\n\n if (field.type === 'blocks' && !adapter.blocksAsJSON) {\n ;(field.blockReferences ?? field.blocks).forEach((block) => {\n const matchedBlock =\n typeof block === 'string'\n ? adapter.payload.config.blocks.find((each) => each.slug === block)\n : block\n\n blocksToDelete.add(\n resolveBlockTableName(\n matchedBlock,\n adapter.tableNameMap.get(`${baseTableName}_blocks_${toSnakeCase(matchedBlock.slug)}`),\n ),\n )\n })\n\n if (isLocalized) {\n if (typeof data[field.name] === 'object' && data[field.name] !== null) {\n Object.entries(data[field.name]).forEach(([localeKey, localeData]) => {\n if (Array.isArray(localeData)) {\n transformBlocks({\n adapter,\n baseTableName,\n blocks,\n blocksToDelete,\n data: localeData,\n field,\n locale: localeKey,\n numbers,\n numbersToDelete,\n parentIsLocalized: parentIsLocalized || field.localized,\n path,\n relationships,\n relationshipsToDelete,\n selects,\n texts,\n textsToDelete,\n withinArrayOrBlockLocale: localeKey,\n })\n }\n })\n }\n } else if (isArrayOfRows(fieldData)) {\n transformBlocks({\n adapter,\n baseTableName,\n blocks,\n blocksToDelete,\n data: fieldData,\n field,\n numbers,\n numbersToDelete,\n parentIsLocalized: parentIsLocalized || field.localized,\n path,\n relationships,\n relationshipsToDelete,\n selects,\n texts,\n textsToDelete,\n withinArrayOrBlockLocale,\n })\n }\n\n return\n }\n\n if (field.type === 'group' || field.type === 'tab') {\n if (typeof data[field.name] === 'object' && data[field.name] !== null) {\n if (isLocalized) {\n Object.entries(data[field.name]).forEach(([localeKey, localeData]) => {\n // preserve array ID if there is\n localeData._uuid = data.id || data._uuid\n\n traverseFields({\n adapter,\n arrays,\n arraysToPush,\n baseTableName,\n blocks,\n blocksToDelete,\n columnPrefix: `${columnName}_`,\n data: localeData as Record<string, unknown>,\n enableAtomicWrites,\n existingLocales,\n fieldPrefix: `${fieldName}_`,\n fields: field.flattenedFields,\n forcedLocale: localeKey,\n insideArrayOrBlock,\n locales,\n numbers,\n numbersToDelete,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentTableName,\n path: `${path || ''}${field.name}.`,\n relationships,\n relationshipsToAppend,\n relationshipsToDelete,\n row,\n selects,\n texts,\n textsToDelete,\n withinArrayOrBlockLocale: localeKey,\n })\n })\n } else {\n // preserve array ID if there is\n const groupData = data[field.name] as Record<string, unknown>\n groupData._uuid = data.id || data._uuid\n\n traverseFields({\n adapter,\n arrays,\n arraysToPush,\n baseTableName,\n blocks,\n blocksToDelete,\n columnPrefix: `${columnName}_`,\n data: groupData,\n enableAtomicWrites,\n existingLocales,\n fieldPrefix: `${fieldName}_`,\n fields: field.flattenedFields,\n forcedLocale,\n insideArrayOrBlock,\n locales,\n numbers,\n numbersToDelete,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentTableName,\n path: `${path || ''}${field.name}.`,\n relationships,\n relationshipsToAppend,\n relationshipsToDelete,\n row,\n selects,\n texts,\n textsToDelete,\n withinArrayOrBlockLocale,\n })\n }\n }\n\n return\n }\n\n if (field.type === 'relationship' || field.type === 'upload') {\n const relationshipPath = `${path || ''}${field.name}`\n\n // Handle $push operation for relationship fields\n if (\n fieldData &&\n typeof fieldData === 'object' &&\n 'hasMany' in field &&\n field.hasMany &&\n ('$push' in fieldData ||\n (field.localized &&\n Object.values(fieldData).some(\n (localeValue) =>\n localeValue &&\n typeof localeValue === 'object' &&\n '$push' in (localeValue as Record<string, unknown>),\n )))\n ) {\n let itemsToAppend: unknown[]\n\n if (field.localized) {\n let hasLocaleOperations = false\n Object.entries(fieldData).forEach(([localeKey, localeValue]) => {\n if (localeValue && typeof localeValue === 'object' && '$push' in localeValue) {\n hasLocaleOperations = true\n const push = localeValue.$push\n const localeItems = Array.isArray(push) ? push : [push]\n\n localeItems.forEach((item) => {\n const relationshipToAppend: RelationshipToAppend = {\n locale: localeKey,\n path: relationshipPath,\n value: item,\n }\n\n // Handle polymorphic relationships\n if (\n Array.isArray(field.relationTo) &&\n item &&\n typeof item === 'object' &&\n 'relationTo' in item\n ) {\n relationshipToAppend.relationTo = item.relationTo\n relationshipToAppend.value = item.value\n } else if (typeof field.relationTo === 'string') {\n // Simple relationship\n relationshipToAppend.relationTo = field.relationTo\n relationshipToAppend.value = item\n }\n\n relationshipsToAppend.push(relationshipToAppend)\n })\n }\n })\n\n if (hasLocaleOperations) {\n return\n }\n } else {\n // Handle non-localized fields: { field: { $push: data } }\n itemsToAppend = Array.isArray((fieldData as any).$push)\n ? (fieldData as any).$push\n : [(fieldData as any).$push]\n\n itemsToAppend.forEach((item) => {\n const relationshipToAppend: RelationshipToAppend = {\n locale: isLocalized ? withinArrayOrBlockLocale : undefined,\n path: relationshipPath,\n value: item,\n }\n\n // Handle polymorphic relationships\n if (\n Array.isArray(field.relationTo) &&\n item &&\n typeof item === 'object' &&\n 'relationTo' in item &&\n 'value' in item\n ) {\n relationshipToAppend.relationTo = item.relationTo as string\n relationshipToAppend.value = item.value as number | string\n } else if (typeof field.relationTo === 'string') {\n // Simple relationship\n relationshipToAppend.relationTo = field.relationTo\n relationshipToAppend.value = item\n }\n\n relationshipsToAppend.push(relationshipToAppend)\n })\n }\n return\n }\n\n // Handle $remove operation for relationship fields\n if (\n fieldData &&\n typeof fieldData === 'object' &&\n 'hasMany' in field &&\n field.hasMany &&\n ('$remove' in fieldData ||\n (field.localized &&\n Object.values(fieldData).some(\n (localeValue) =>\n localeValue &&\n typeof localeValue === 'object' &&\n '$remove' in (localeValue as Record<string, unknown>),\n )))\n ) {\n // Check for new locale-first syntax: { field: { locale: { $remove: data } } }\n if (field.localized) {\n let hasLocaleOperations = false\n Object.entries(fieldData).forEach(([localeKey, localeValue]) => {\n if (localeValue && typeof localeValue === 'object' && '$remove' in localeValue) {\n hasLocaleOperations = true\n const remove = localeValue.$remove\n const localeItems = Array.isArray(remove) ? remove : [remove]\n\n localeItems.forEach((item) => {\n const relationshipToDelete: RelationshipToDelete = {\n itemToRemove: item,\n locale: localeKey,\n path: relationshipPath,\n }\n\n // Store relationTo for simple relationships\n if (typeof field.relationTo === 'string') {\n relationshipToDelete.relationTo = field.relationTo\n }\n\n relationshipsToDelete.push(relationshipToDelete)\n })\n }\n })\n\n if (hasLocaleOperations) {\n return\n }\n } else {\n // Handle non-localized fields: { field: { $remove: data } }\n const itemsToRemove = Array.isArray((fieldData as any).$remove)\n ? (fieldData as any).$remove\n : [(fieldData as any).$remove]\n\n itemsToRemove.forEach((item) => {\n const relationshipToDelete: RelationshipToDelete = {\n itemToRemove: item,\n locale: isLocalized ? withinArrayOrBlockLocale : undefined,\n path: relationshipPath,\n }\n\n // Store relationTo for simple relationships\n if (typeof field.relationTo === 'string') {\n relationshipToDelete.relationTo = field.relationTo\n }\n\n relationshipsToDelete.push(relationshipToDelete)\n })\n }\n return\n }\n\n if (\n isLocalized &&\n (Array.isArray(field.relationTo) || ('hasMany' in field && field.hasMany))\n ) {\n if (typeof fieldData === 'object') {\n Object.entries(fieldData).forEach(([localeKey, localeData]) => {\n if (localeData === null) {\n relationshipsToDelete.push({\n locale: localeKey,\n path: relationshipPath,\n })\n return\n }\n\n transformRelationship({\n baseRow: {\n locale: localeKey,\n path: relationshipPath,\n },\n data: localeData,\n field,\n relationships,\n })\n })\n }\n return\n } else if (Array.isArray(field.relationTo) || ('hasMany' in field && field.hasMany)) {\n if (fieldData === null || (Array.isArray(fieldData) && fieldData.length === 0)) {\n relationshipsToDelete.push({ path: relationshipPath })\n return\n }\n\n transformRelationship({\n baseRow: {\n locale: withinArrayOrBlockLocale,\n path: relationshipPath,\n },\n data: fieldData,\n field,\n relationships,\n })\n return\n } else {\n if (\n !isLocalized &&\n fieldData &&\n typeof fieldData === 'object' &&\n 'id' in fieldData &&\n fieldData?.id\n ) {\n fieldData = fieldData.id\n } else if (isLocalized) {\n if (typeof fieldData === 'object') {\n Object.entries(fieldData).forEach(([localeKey, localeData]) => {\n if (typeof localeData === 'object') {\n if (localeData && 'id' in localeData && localeData?.id) {\n fieldData[localeKey] = localeData.id\n }\n } else {\n fieldData[localeKey] = localeData\n }\n })\n }\n }\n }\n }\n\n if (field.type === 'text' && field.hasMany) {\n const textPath = `${path || ''}${field.name}`\n\n if (isLocalized) {\n if (typeof fieldData === 'object') {\n Object.entries(fieldData).forEach(([localeKey, localeData]) => {\n if (Array.isArray(localeData)) {\n if (!localeData.length) {\n textsToDelete.push({ locale: localeKey, path: textPath })\n return\n }\n\n transformTexts({\n baseRow: {\n locale: localeKey,\n path: textPath,\n },\n data: localeData,\n texts,\n })\n }\n })\n }\n } else if (Array.isArray(fieldData)) {\n if (!fieldData.length) {\n textsToDelete.push({ locale: withinArrayOrBlockLocale, path: textPath })\n return\n }\n\n transformTexts({\n baseRow: {\n locale: withinArrayOrBlockLocale,\n path: textPath,\n },\n data: fieldData,\n texts,\n })\n }\n\n return\n }\n\n if (field.type === 'number' && field.hasMany) {\n const numberPath = `${path || ''}${field.name}`\n\n if (isLocalized) {\n if (typeof fieldData === 'object') {\n Object.entries(fieldData).forEach(([localeKey, localeData]) => {\n if (Array.isArray(localeData)) {\n if (!localeData.length) {\n numbersToDelete.push({ locale: localeKey, path: numberPath })\n return\n }\n\n transformNumbers({\n baseRow: {\n locale: localeKey,\n path: numberPath,\n },\n data: localeData,\n numbers,\n })\n }\n })\n }\n } else if (Array.isArray(fieldData)) {\n if (!fieldData.length) {\n numbersToDelete.push({ locale: withinArrayOrBlockLocale, path: numberPath })\n return\n }\n\n transformNumbers({\n baseRow: {\n locale: withinArrayOrBlockLocale,\n path: numberPath,\n },\n data: fieldData,\n numbers,\n })\n }\n\n return\n }\n\n if (field.type === 'select' && field.hasMany) {\n const selectTableName = adapter.tableNameMap.get(`${parentTableName}_${columnName}`)\n if (!selects[selectTableName]) {\n selects[selectTableName] = []\n }\n\n if (isLocalized) {\n if (typeof data[field.name] === 'object' && data[field.name] !== null) {\n Object.entries(data[field.name]).forEach(([localeKey, localeData]) => {\n if (Array.isArray(localeData)) {\n const newRows = transformSelects({\n id: insideArrayOrBlock ? data._uuid || data.id : undefined,\n data: localeData,\n locale: localeKey,\n })\n\n selects[selectTableName] = selects[selectTableName].concat(newRows)\n }\n })\n }\n } else if (Array.isArray(data[field.name])) {\n const newRows = transformSelects({\n id: insideArrayOrBlock ? data._uuid || data.id : undefined,\n data: data[field.name],\n locale: withinArrayOrBlockLocale,\n })\n\n selects[selectTableName] = selects[selectTableName].concat(newRows)\n }\n\n return\n }\n\n const valuesToTransform: { localeKey?: string; ref: unknown; value: unknown }[] = []\n\n if (isLocalized) {\n if (typeof fieldData === 'object' && fieldData !== null) {\n Object.entries(fieldData).forEach(([localeKey, localeData]) => {\n if (!locales[localeKey]) {\n locales[localeKey] = {}\n }\n\n valuesToTransform.push({\n localeKey,\n ref: locales,\n value: localeData,\n })\n })\n }\n } else {\n let ref = row\n\n if (forcedLocale) {\n if (!locales[forcedLocale]) {\n locales[forcedLocale] = {}\n }\n ref = locales[forcedLocale]\n }\n\n valuesToTransform.push({ ref, value: fieldData })\n }\n\n valuesToTransform.forEach(({ localeKey, ref, value }) => {\n let formattedValue = value\n\n if (field.type === 'date') {\n if (fieldName === 'updatedAt' && formattedValue === null) {\n // If updatedAt is explicitly set to null, skip it entirely - don't add to row\n // This prevents the timestamp from being updated for session-only operations\n return // Skip this iteration\n } else if (fieldName === 'updatedAt' && typeof formattedValue === 'undefined') {\n // If updatedAt is undefined, set it to current time (normal behavior)\n formattedValue = new Date().toISOString()\n } else {\n if (typeof value === 'number' && !Number.isNaN(value)) {\n formattedValue = new Date(value).toISOString()\n } else if (value instanceof Date) {\n formattedValue = value.toISOString()\n }\n }\n }\n\n if (typeof value !== 'undefined') {\n if (value && field.type === 'point' && adapter.name !== 'sqlite') {\n formattedValue = sql`ST_GeomFromGeoJSON(${JSON.stringify(value)})`\n }\n\n if (field.type === 'text' && value && typeof value !== 'string') {\n formattedValue = JSON.stringify(value)\n }\n\n if (\n field.type === 'number' &&\n value &&\n typeof value === 'object' &&\n '$inc' in value &&\n typeof value.$inc === 'number'\n ) {\n if (!enableAtomicWrites) {\n throw new APIError(\n 'The passed data must not contain any nested fields for atomic writes',\n )\n }\n\n formattedValue = sql.raw(`${columnName} + ${value.$inc}`)\n }\n }\n\n if (typeof formattedValue !== 'undefined') {\n if (localeKey) {\n ref[localeKey][fieldName] = formattedValue\n } else {\n ref[fieldName] = formattedValue\n }\n }\n })\n })\n\n // Handle dot-notation paths when no fields matched\n if (!fieldsMatched) {\n Object.keys(data).forEach((key) => {\n if (key.includes('.')) {\n // Split on first dot only\n const firstDotIndex = key.indexOf('.')\n const fieldName = key.substring(0, firstDotIndex)\n const remainingPath = key.substring(firstDotIndex + 1)\n\n // Create nested structure for this field\n if (!data[fieldName]) {\n data[fieldName] = {}\n }\n\n const nestedData = data[fieldName] as Record<string, unknown>\n\n // Move the value to the nested structure\n nestedData[remainingPath] = data[key]\n delete data[key]\n\n // Recursively process the newly created nested structure\n // The field traversal will naturally handle it if the field exists in the schema\n traverseFields({\n adapter,\n arrays,\n arraysToPush,\n baseTableName,\n blocks,\n blocksToDelete,\n columnPrefix,\n data,\n enableAtomicWrites,\n existingLocales,\n fieldPrefix,\n fields,\n forcedLocale,\n insideArrayOrBlock,\n locales,\n numbers,\n numbersToDelete,\n parentIsLocalized,\n parentTableName,\n path,\n relationships,\n relationshipsToAppend,\n relationshipsToDelete,\n row,\n selects,\n texts,\n textsToDelete,\n withinArrayOrBlockLocale,\n })\n }\n })\n }\n}\n"],"names":["sql","APIError","fieldIsVirtual","fieldShouldBeLocalized","toSnakeCase","isArrayOfRows","resolveBlockTableName","transformArray","transformBlocks","transformNumbers","transformRelationship","transformSelects","transformTexts","traverseFields","adapter","arrays","arraysToPush","baseTableName","blocks","blocksToDelete","columnPrefix","data","enableAtomicWrites","existingLocales","fieldPrefix","fields","forcedLocale","insideArrayOrBlock","locales","numbers","numbersToDelete","parentIsLocalized","parentTableName","path","relationships","relationshipsToAppend","relationshipsToDelete","row","selects","texts","textsToDelete","withinArrayOrBlockLocale","fieldsMatched","_uuid","forEach","field","columnName","fieldName","fieldData","name","undefined","isLocalized","type","arrayTableName","tableNameMap","get","value","Object","entries","localeKey","localeValue","localeData","push","$push","Array","isArray","newRows","locale","localized","concat","blocksAsJSON","blockReferences","block","matchedBlock","payload","config","find","each","slug","add","id","flattenedFields","groupData","relationshipPath","hasMany","values","some","itemsToAppend","hasLocaleOperations","localeItems","item","relationshipToAppend","relationTo","remove","$remove","relationshipToDelete","itemToRemove","itemsToRemove","baseRow","length","textPath","numberPath","selectTableName","valuesToTransform","ref","formattedValue","Date","toISOString","Number","isNaN","JSON","stringify","$inc","raw","keys","key","includes","firstDotIndex","indexOf","substring","remainingPath","nestedData"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/transform/write/traverseFields.ts"],"sourcesContent":["import { sql } from 'drizzle-orm'\nimport { APIError, type FlattenedField } from 'payload'\nimport { fieldIsVirtual, fieldShouldBeLocalized } from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter } from '../../types.js'\nimport type {\n NumberToDelete,\n RelationshipToAppend,\n RelationshipToDelete,\n RowToInsert,\n TextToDelete,\n} from './types.js'\n\nimport { isArrayOfRows } from '../../utilities/isArrayOfRows.js'\nimport { resolveBlockTableName } from '../../utilities/validateExistingBlockIsIdentical.js'\nimport { transformArray } from './array.js'\nimport { transformBlocks } from './blocks.js'\nimport { transformNumbers } from './numbers.js'\nimport { transformRelationship } from './relationships.js'\nimport { transformSelects } from './selects.js'\nimport { transformTexts } from './texts.js'\n\ntype Args = {\n adapter: DrizzleAdapter\n /**\n * This will delete the array table and then re-insert all the new array rows.\n */\n arrays: RowToInsert['arrays']\n /**\n * Array rows to push to the existing array. This will simply create\n * a new row in the array table.\n */\n arraysToPush: RowToInsert['arraysToPush']\n /**\n * This is the name of the base table\n */\n baseTableName: string\n blocks: RowToInsert['blocks']\n blocksToDelete: Set<string>\n /**\n * A snake-case field prefix, representing prior fields\n * Ex: my_group_my_named_tab_\n */\n columnPrefix: string\n data: Record<string, unknown>\n enableAtomicWrites?: boolean\n existingLocales?: Record<string, unknown>[]\n /**\n * A prefix that will retain camel-case formatting, representing prior fields\n * Ex: myGroup_myNamedTab_\n */\n fieldPrefix: string\n fields: FlattenedField[]\n forcedLocale?: string\n /**\n * Tracks whether the current traversion context is from array or block.\n */\n insideArrayOrBlock?: boolean\n locales: {\n [locale: string]: Record<string, unknown>\n }\n numbers: Record<string, unknown>[]\n numbersToDelete: NumberToDelete[]\n parentIsLocalized: boolean\n /**\n * This is the name of the parent table\n */\n parentTableName: string\n path: string\n relationships: Record<string, unknown>[]\n relationshipsToAppend: RelationshipToAppend[]\n relationshipsToDelete: RelationshipToDelete[]\n row: Record<string, unknown>\n selects: {\n [tableName: string]: Record<string, unknown>[]\n }\n texts: Record<string, unknown>[]\n textsToDelete: TextToDelete[]\n /**\n * Set to a locale code if this set of fields is traversed within a\n * localized array or block field\n */\n withinArrayOrBlockLocale?: string\n}\n\nexport const traverseFields = ({\n adapter,\n arrays,\n arraysToPush,\n baseTableName,\n blocks,\n blocksToDelete,\n columnPrefix,\n data,\n enableAtomicWrites,\n existingLocales,\n fieldPrefix,\n fields,\n forcedLocale,\n insideArrayOrBlock = false,\n locales,\n numbers,\n numbersToDelete,\n parentIsLocalized,\n parentTableName,\n path,\n relationships,\n relationshipsToAppend,\n relationshipsToDelete,\n row,\n selects,\n texts,\n textsToDelete,\n withinArrayOrBlockLocale,\n}: Args) => {\n let fieldsMatched = false\n\n if (row._uuid) {\n data._uuid = row._uuid\n }\n\n fields.forEach((field) => {\n let columnName = ''\n let fieldName = ''\n let fieldData: unknown\n\n if (fieldIsVirtual(field)) {\n return\n }\n\n // Mark that we found a matching field\n if (data[field.name] !== undefined) {\n fieldsMatched = true\n }\n\n columnName = `${columnPrefix || ''}${toSnakeCase(field.name)}`\n fieldName = `${fieldPrefix || ''}${field.name}`\n fieldData = data[field.name]\n\n const isLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n if (field.type === 'array') {\n const arrayTableName = adapter.tableNameMap.get(`${parentTableName}_${columnName}`)\n\n if (isLocalized) {\n const value = data[field.name]\n\n if (typeof value === 'object' && value !== null) {\n Object.entries(value).forEach(([localeKey, localeValue]) => {\n let localeData = localeValue\n let push = false\n\n if (localeValue && typeof localeValue === 'object' && '$push' in localeValue) {\n localeData = localeValue.$push\n push = true\n if (!Array.isArray(localeData)) {\n localeData = [localeData]\n }\n }\n\n if (Array.isArray(localeData)) {\n const newRows = transformArray({\n adapter,\n arrayTableName,\n baseTableName,\n blocks,\n blocksToDelete,\n data: localeData,\n field,\n locale: localeKey,\n numbers,\n numbersToDelete,\n parentIsLocalized: parentIsLocalized || field.localized,\n path,\n relationships,\n relationshipsToDelete,\n selects,\n texts,\n textsToDelete,\n withinArrayOrBlockLocale: localeKey,\n })\n\n if (push) {\n if (!arraysToPush[arrayTableName]) {\n arraysToPush[arrayTableName] = []\n }\n arraysToPush[arrayTableName] = arraysToPush[arrayTableName].concat(newRows)\n } else {\n if (!arrays[arrayTableName]) {\n arrays[arrayTableName] = []\n }\n arrays[arrayTableName] = arrays[arrayTableName].concat(newRows)\n }\n }\n })\n }\n } else {\n let value = data[field.name]\n let push = false\n if (typeof value === 'object' && '$push' in value) {\n value = Array.isArray(value.$push) ? value.$push : [value.$push]\n push = true\n }\n\n const newRows = transformArray({\n adapter,\n arrayTableName,\n baseTableName,\n blocks,\n blocksToDelete,\n data: value,\n field,\n numbers,\n numbersToDelete,\n parentIsLocalized: parentIsLocalized || field.localized,\n path,\n relationships,\n relationshipsToDelete,\n selects,\n texts,\n textsToDelete,\n withinArrayOrBlockLocale,\n })\n\n if (push) {\n if (!arraysToPush[arrayTableName]) {\n arraysToPush[arrayTableName] = []\n }\n arraysToPush[arrayTableName] = arraysToPush[arrayTableName].concat(newRows)\n } else {\n if (!arrays[arrayTableName]) {\n arrays[arrayTableName] = []\n }\n arrays[arrayTableName] = arrays[arrayTableName].concat(newRows)\n }\n }\n\n return\n }\n\n if (field.type === 'blocks' && !adapter.blocksAsJSON) {\n field.blocks.forEach((block) => {\n const matchedBlock =\n typeof block === 'string'\n ? adapter.payload.config.blocks.find((each) => each.slug === block)\n : block\n\n blocksToDelete.add(\n resolveBlockTableName(\n matchedBlock,\n adapter.tableNameMap.get(`${baseTableName}_blocks_${toSnakeCase(matchedBlock.slug)}`),\n ),\n )\n })\n\n if (isLocalized) {\n if (typeof data[field.name] === 'object' && data[field.name] !== null) {\n Object.entries(data[field.name]).forEach(([localeKey, localeData]) => {\n if (Array.isArray(localeData)) {\n transformBlocks({\n adapter,\n baseTableName,\n blocks,\n blocksToDelete,\n data: localeData,\n field,\n locale: localeKey,\n numbers,\n numbersToDelete,\n parentIsLocalized: parentIsLocalized || field.localized,\n path,\n relationships,\n relationshipsToDelete,\n selects,\n texts,\n textsToDelete,\n withinArrayOrBlockLocale: localeKey,\n })\n }\n })\n }\n } else if (isArrayOfRows(fieldData)) {\n transformBlocks({\n adapter,\n baseTableName,\n blocks,\n blocksToDelete,\n data: fieldData,\n field,\n numbers,\n numbersToDelete,\n parentIsLocalized: parentIsLocalized || field.localized,\n path,\n relationships,\n relationshipsToDelete,\n selects,\n texts,\n textsToDelete,\n withinArrayOrBlockLocale,\n })\n }\n\n return\n }\n\n if (field.type === 'group' || field.type === 'tab') {\n if (typeof data[field.name] === 'object' && data[field.name] !== null) {\n if (isLocalized) {\n Object.entries(data[field.name]).forEach(([localeKey, localeData]) => {\n // preserve array ID if there is\n localeData._uuid = data.id || data._uuid\n\n traverseFields({\n adapter,\n arrays,\n arraysToPush,\n baseTableName,\n blocks,\n blocksToDelete,\n columnPrefix: `${columnName}_`,\n data: localeData as Record<string, unknown>,\n enableAtomicWrites,\n existingLocales,\n fieldPrefix: `${fieldName}_`,\n fields: field.flattenedFields,\n forcedLocale: localeKey,\n insideArrayOrBlock,\n locales,\n numbers,\n numbersToDelete,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentTableName,\n path: `${path || ''}${field.name}.`,\n relationships,\n relationshipsToAppend,\n relationshipsToDelete,\n row,\n selects,\n texts,\n textsToDelete,\n withinArrayOrBlockLocale: localeKey,\n })\n })\n } else {\n // preserve array ID if there is\n const groupData = data[field.name] as Record<string, unknown>\n groupData._uuid = data.id || data._uuid\n\n traverseFields({\n adapter,\n arrays,\n arraysToPush,\n baseTableName,\n blocks,\n blocksToDelete,\n columnPrefix: `${columnName}_`,\n data: groupData,\n enableAtomicWrites,\n existingLocales,\n fieldPrefix: `${fieldName}_`,\n fields: field.flattenedFields,\n forcedLocale,\n insideArrayOrBlock,\n locales,\n numbers,\n numbersToDelete,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentTableName,\n path: `${path || ''}${field.name}.`,\n relationships,\n relationshipsToAppend,\n relationshipsToDelete,\n row,\n selects,\n texts,\n textsToDelete,\n withinArrayOrBlockLocale,\n })\n }\n }\n\n return\n }\n\n if (field.type === 'relationship' || field.type === 'upload') {\n const relationshipPath = `${path || ''}${field.name}`\n\n // Handle $push operation for relationship fields\n if (\n fieldData &&\n typeof fieldData === 'object' &&\n 'hasMany' in field &&\n field.hasMany &&\n ('$push' in fieldData ||\n (field.localized &&\n Object.values(fieldData).some(\n (localeValue) =>\n localeValue &&\n typeof localeValue === 'object' &&\n '$push' in (localeValue as Record<string, unknown>),\n )))\n ) {\n let itemsToAppend: unknown[]\n\n if (field.localized) {\n let hasLocaleOperations = false\n Object.entries(fieldData).forEach(([localeKey, localeValue]) => {\n if (localeValue && typeof localeValue === 'object' && '$push' in localeValue) {\n hasLocaleOperations = true\n const push = localeValue.$push\n const localeItems = Array.isArray(push) ? push : [push]\n\n localeItems.forEach((item) => {\n const relationshipToAppend: RelationshipToAppend = {\n locale: localeKey,\n path: relationshipPath,\n value: item,\n }\n\n // Handle polymorphic relationships\n if (\n Array.isArray(field.relationTo) &&\n item &&\n typeof item === 'object' &&\n 'relationTo' in item\n ) {\n relationshipToAppend.relationTo = item.relationTo\n relationshipToAppend.value = item.value\n } else if (typeof field.relationTo === 'string') {\n // Simple relationship\n relationshipToAppend.relationTo = field.relationTo\n relationshipToAppend.value = item\n }\n\n relationshipsToAppend.push(relationshipToAppend)\n })\n }\n })\n\n if (hasLocaleOperations) {\n return\n }\n } else {\n // Handle non-localized fields: { field: { $push: data } }\n itemsToAppend = Array.isArray((fieldData as any).$push)\n ? (fieldData as any).$push\n : [(fieldData as any).$push]\n\n itemsToAppend.forEach((item) => {\n const relationshipToAppend: RelationshipToAppend = {\n locale: isLocalized ? withinArrayOrBlockLocale : undefined,\n path: relationshipPath,\n value: item,\n }\n\n // Handle polymorphic relationships\n if (\n Array.isArray(field.relationTo) &&\n item &&\n typeof item === 'object' &&\n 'relationTo' in item &&\n 'value' in item\n ) {\n relationshipToAppend.relationTo = item.relationTo as string\n relationshipToAppend.value = item.value as number | string\n } else if (typeof field.relationTo === 'string') {\n // Simple relationship\n relationshipToAppend.relationTo = field.relationTo\n relationshipToAppend.value = item\n }\n\n relationshipsToAppend.push(relationshipToAppend)\n })\n }\n return\n }\n\n // Handle $remove operation for relationship fields\n if (\n fieldData &&\n typeof fieldData === 'object' &&\n 'hasMany' in field &&\n field.hasMany &&\n ('$remove' in fieldData ||\n (field.localized &&\n Object.values(fieldData).some(\n (localeValue) =>\n localeValue &&\n typeof localeValue === 'object' &&\n '$remove' in (localeValue as Record<string, unknown>),\n )))\n ) {\n // Check for new locale-first syntax: { field: { locale: { $remove: data } } }\n if (field.localized) {\n let hasLocaleOperations = false\n Object.entries(fieldData).forEach(([localeKey, localeValue]) => {\n if (localeValue && typeof localeValue === 'object' && '$remove' in localeValue) {\n hasLocaleOperations = true\n const remove = localeValue.$remove\n const localeItems = Array.isArray(remove) ? remove : [remove]\n\n localeItems.forEach((item) => {\n const relationshipToDelete: RelationshipToDelete = {\n itemToRemove: item,\n locale: localeKey,\n path: relationshipPath,\n }\n\n // Store relationTo for simple relationships\n if (typeof field.relationTo === 'string') {\n relationshipToDelete.relationTo = field.relationTo\n }\n\n relationshipsToDelete.push(relationshipToDelete)\n })\n }\n })\n\n if (hasLocaleOperations) {\n return\n }\n } else {\n // Handle non-localized fields: { field: { $remove: data } }\n const itemsToRemove = Array.isArray((fieldData as any).$remove)\n ? (fieldData as any).$remove\n : [(fieldData as any).$remove]\n\n itemsToRemove.forEach((item) => {\n const relationshipToDelete: RelationshipToDelete = {\n itemToRemove: item,\n locale: isLocalized ? withinArrayOrBlockLocale : undefined,\n path: relationshipPath,\n }\n\n // Store relationTo for simple relationships\n if (typeof field.relationTo === 'string') {\n relationshipToDelete.relationTo = field.relationTo\n }\n\n relationshipsToDelete.push(relationshipToDelete)\n })\n }\n return\n }\n\n if (\n isLocalized &&\n (Array.isArray(field.relationTo) || ('hasMany' in field && field.hasMany))\n ) {\n if (typeof fieldData === 'object') {\n Object.entries(fieldData).forEach(([localeKey, localeData]) => {\n if (localeData === null) {\n relationshipsToDelete.push({\n locale: localeKey,\n path: relationshipPath,\n })\n return\n }\n\n transformRelationship({\n baseRow: {\n locale: localeKey,\n path: relationshipPath,\n },\n data: localeData,\n field,\n relationships,\n })\n })\n }\n return\n } else if (Array.isArray(field.relationTo) || ('hasMany' in field && field.hasMany)) {\n if (fieldData === null || (Array.isArray(fieldData) && fieldData.length === 0)) {\n relationshipsToDelete.push({ path: relationshipPath })\n return\n }\n\n transformRelationship({\n baseRow: {\n locale: withinArrayOrBlockLocale,\n path: relationshipPath,\n },\n data: fieldData,\n field,\n relationships,\n })\n return\n } else {\n if (\n !isLocalized &&\n fieldData &&\n typeof fieldData === 'object' &&\n 'id' in fieldData &&\n fieldData?.id\n ) {\n fieldData = fieldData.id\n } else if (isLocalized) {\n if (typeof fieldData === 'object') {\n Object.entries(fieldData).forEach(([localeKey, localeData]) => {\n if (typeof localeData === 'object') {\n if (localeData && 'id' in localeData && localeData?.id) {\n fieldData[localeKey] = localeData.id\n }\n } else {\n fieldData[localeKey] = localeData\n }\n })\n }\n }\n }\n }\n\n if (field.type === 'text' && field.hasMany) {\n const textPath = `${path || ''}${field.name}`\n\n if (isLocalized) {\n if (typeof fieldData === 'object') {\n Object.entries(fieldData).forEach(([localeKey, localeData]) => {\n if (Array.isArray(localeData)) {\n if (!localeData.length) {\n textsToDelete.push({ locale: localeKey, path: textPath })\n return\n }\n\n transformTexts({\n baseRow: {\n locale: localeKey,\n path: textPath,\n },\n data: localeData,\n texts,\n })\n }\n })\n }\n } else if (Array.isArray(fieldData)) {\n if (!fieldData.length) {\n textsToDelete.push({ locale: withinArrayOrBlockLocale, path: textPath })\n return\n }\n\n transformTexts({\n baseRow: {\n locale: withinArrayOrBlockLocale,\n path: textPath,\n },\n data: fieldData,\n texts,\n })\n }\n\n return\n }\n\n if (field.type === 'number' && field.hasMany) {\n const numberPath = `${path || ''}${field.name}`\n\n if (isLocalized) {\n if (typeof fieldData === 'object') {\n Object.entries(fieldData).forEach(([localeKey, localeData]) => {\n if (Array.isArray(localeData)) {\n if (!localeData.length) {\n numbersToDelete.push({ locale: localeKey, path: numberPath })\n return\n }\n\n transformNumbers({\n baseRow: {\n locale: localeKey,\n path: numberPath,\n },\n data: localeData,\n numbers,\n })\n }\n })\n }\n } else if (Array.isArray(fieldData)) {\n if (!fieldData.length) {\n numbersToDelete.push({ locale: withinArrayOrBlockLocale, path: numberPath })\n return\n }\n\n transformNumbers({\n baseRow: {\n locale: withinArrayOrBlockLocale,\n path: numberPath,\n },\n data: fieldData,\n numbers,\n })\n }\n\n return\n }\n\n if (field.type === 'select' && field.hasMany) {\n const selectTableName = adapter.tableNameMap.get(`${parentTableName}_${columnName}`)\n if (!selects[selectTableName]) {\n selects[selectTableName] = []\n }\n\n if (isLocalized) {\n if (typeof data[field.name] === 'object' && data[field.name] !== null) {\n Object.entries(data[field.name]).forEach(([localeKey, localeData]) => {\n if (Array.isArray(localeData)) {\n const newRows = transformSelects({\n id: insideArrayOrBlock ? data._uuid || data.id : undefined,\n data: localeData,\n locale: localeKey,\n })\n\n selects[selectTableName] = selects[selectTableName].concat(newRows)\n }\n })\n }\n } else if (Array.isArray(data[field.name])) {\n const newRows = transformSelects({\n id: insideArrayOrBlock ? data._uuid || data.id : undefined,\n data: data[field.name],\n locale: withinArrayOrBlockLocale,\n })\n\n selects[selectTableName] = selects[selectTableName].concat(newRows)\n }\n\n return\n }\n\n const valuesToTransform: { localeKey?: string; ref: unknown; value: unknown }[] = []\n\n if (isLocalized) {\n if (typeof fieldData === 'object' && fieldData !== null) {\n Object.entries(fieldData).forEach(([localeKey, localeData]) => {\n if (!locales[localeKey]) {\n locales[localeKey] = {}\n }\n\n valuesToTransform.push({\n localeKey,\n ref: locales,\n value: localeData,\n })\n })\n }\n } else {\n let ref = row\n\n if (forcedLocale) {\n if (!locales[forcedLocale]) {\n locales[forcedLocale] = {}\n }\n ref = locales[forcedLocale]\n }\n\n valuesToTransform.push({ ref, value: fieldData })\n }\n\n valuesToTransform.forEach(({ localeKey, ref, value }) => {\n let formattedValue = value\n\n if (field.type === 'date') {\n if (fieldName === 'updatedAt' && formattedValue === null) {\n // If updatedAt is explicitly set to null, skip it entirely - don't add to row\n // This prevents the timestamp from being updated for session-only operations\n return // Skip this iteration\n } else if (fieldName === 'updatedAt' && typeof formattedValue === 'undefined') {\n // If updatedAt is undefined, set it to current time (normal behavior)\n formattedValue = new Date().toISOString()\n } else {\n if (typeof value === 'number' && !Number.isNaN(value)) {\n formattedValue = new Date(value).toISOString()\n } else if (value instanceof Date) {\n formattedValue = value.toISOString()\n }\n }\n }\n\n if (typeof value !== 'undefined') {\n if (value && field.type === 'point' && adapter.name !== 'sqlite') {\n formattedValue = sql`ST_GeomFromGeoJSON(${JSON.stringify(value)})`\n }\n\n if (field.type === 'text' && value && typeof value !== 'string') {\n formattedValue = JSON.stringify(value)\n }\n\n if (\n field.type === 'number' &&\n value &&\n typeof value === 'object' &&\n '$inc' in value &&\n typeof value.$inc === 'number'\n ) {\n if (!enableAtomicWrites) {\n throw new APIError(\n 'The passed data must not contain any nested fields for atomic writes',\n )\n }\n\n formattedValue = sql.raw(`${columnName} + ${value.$inc}`)\n }\n }\n\n if (typeof formattedValue !== 'undefined') {\n if (localeKey) {\n ref[localeKey][fieldName] = formattedValue\n } else {\n ref[fieldName] = formattedValue\n }\n }\n })\n })\n\n // Handle dot-notation paths when no fields matched\n if (!fieldsMatched) {\n Object.keys(data).forEach((key) => {\n if (key.includes('.')) {\n // Split on first dot only\n const firstDotIndex = key.indexOf('.')\n const fieldName = key.substring(0, firstDotIndex)\n const remainingPath = key.substring(firstDotIndex + 1)\n\n // Create nested structure for this field\n if (!data[fieldName]) {\n data[fieldName] = {}\n }\n\n const nestedData = data[fieldName] as Record<string, unknown>\n\n // Move the value to the nested structure\n nestedData[remainingPath] = data[key]\n delete data[key]\n\n // Recursively process the newly created nested structure\n // The field traversal will naturally handle it if the field exists in the schema\n traverseFields({\n adapter,\n arrays,\n arraysToPush,\n baseTableName,\n blocks,\n blocksToDelete,\n columnPrefix,\n data,\n enableAtomicWrites,\n existingLocales,\n fieldPrefix,\n fields,\n forcedLocale,\n insideArrayOrBlock,\n locales,\n numbers,\n numbersToDelete,\n parentIsLocalized,\n parentTableName,\n path,\n relationships,\n relationshipsToAppend,\n relationshipsToDelete,\n row,\n selects,\n texts,\n textsToDelete,\n withinArrayOrBlockLocale,\n })\n }\n })\n }\n}\n"],"names":["sql","APIError","fieldIsVirtual","fieldShouldBeLocalized","toSnakeCase","isArrayOfRows","resolveBlockTableName","transformArray","transformBlocks","transformNumbers","transformRelationship","transformSelects","transformTexts","traverseFields","adapter","arrays","arraysToPush","baseTableName","blocks","blocksToDelete","columnPrefix","data","enableAtomicWrites","existingLocales","fieldPrefix","fields","forcedLocale","insideArrayOrBlock","locales","numbers","numbersToDelete","parentIsLocalized","parentTableName","path","relationships","relationshipsToAppend","relationshipsToDelete","row","selects","texts","textsToDelete","withinArrayOrBlockLocale","fieldsMatched","_uuid","forEach","field","columnName","fieldName","fieldData","name","undefined","isLocalized","type","arrayTableName","tableNameMap","get","value","Object","entries","localeKey","localeValue","localeData","push","$push","Array","isArray","newRows","locale","localized","concat","blocksAsJSON","block","matchedBlock","payload","config","find","each","slug","add","id","flattenedFields","groupData","relationshipPath","hasMany","values","some","itemsToAppend","hasLocaleOperations","localeItems","item","relationshipToAppend","relationTo","remove","$remove","relationshipToDelete","itemToRemove","itemsToRemove","baseRow","length","textPath","numberPath","selectTableName","valuesToTransform","ref","formattedValue","Date","toISOString","Number","isNaN","JSON","stringify","$inc","raw","keys","key","includes","firstDotIndex","indexOf","substring","remainingPath","nestedData"],"mappings":"AAAA,SAASA,GAAG,QAAQ,cAAa;AACjC,SAASC,QAAQ,QAA6B,UAAS;AACvD,SAASC,cAAc,EAAEC,sBAAsB,QAAQ,iBAAgB;AACvE,OAAOC,iBAAiB,gBAAe;AAWvC,SAASC,aAAa,QAAQ,mCAAkC;AAChE,SAASC,qBAAqB,QAAQ,sDAAqD;AAC3F,SAASC,cAAc,QAAQ,aAAY;AAC3C,SAASC,eAAe,QAAQ,cAAa;AAC7C,SAASC,gBAAgB,QAAQ,eAAc;AAC/C,SAASC,qBAAqB,QAAQ,qBAAoB;AAC1D,SAASC,gBAAgB,QAAQ,eAAc;AAC/C,SAASC,cAAc,QAAQ,aAAY;AAiE3C,OAAO,MAAMC,iBAAiB,CAAC,EAC7BC,OAAO,EACPC,MAAM,EACNC,YAAY,EACZC,aAAa,EACbC,MAAM,EACNC,cAAc,EACdC,YAAY,EACZC,IAAI,EACJC,kBAAkB,EAClBC,eAAe,EACfC,WAAW,EACXC,MAAM,EACNC,YAAY,EACZC,qBAAqB,KAAK,EAC1BC,OAAO,EACPC,OAAO,EACPC,eAAe,EACfC,iBAAiB,EACjBC,eAAe,EACfC,IAAI,EACJC,aAAa,EACbC,qBAAqB,EACrBC,qBAAqB,EACrBC,GAAG,EACHC,OAAO,EACPC,KAAK,EACLC,aAAa,EACbC,wBAAwB,EACnB;IACL,IAAIC,gBAAgB;IAEpB,IAAIL,IAAIM,KAAK,EAAE;QACbtB,KAAKsB,KAAK,GAAGN,IAAIM,KAAK;IACxB;IAEAlB,OAAOmB,OAAO,CAAC,CAACC;QACd,IAAIC,aAAa;QACjB,IAAIC,YAAY;QAChB,IAAIC;QAEJ,IAAI9C,eAAe2C,QAAQ;YACzB;QACF;QAEA,sCAAsC;QACtC,IAAIxB,IAAI,CAACwB,MAAMI,IAAI,CAAC,KAAKC,WAAW;YAClCR,gBAAgB;QAClB;QAEAI,aAAa,GAAG1B,gBAAgB,KAAKhB,YAAYyC,MAAMI,IAAI,GAAG;QAC9DF,YAAY,GAAGvB,eAAe,KAAKqB,MAAMI,IAAI,EAAE;QAC/CD,YAAY3B,IAAI,CAACwB,MAAMI,IAAI,CAAC;QAE5B,MAAME,cAAchD,uBAAuB;YAAE0C;YAAOd;QAAkB;QAEtE,IAAIc,MAAMO,IAAI,KAAK,SAAS;YAC1B,MAAMC,iBAAiBvC,QAAQwC,YAAY,CAACC,GAAG,CAAC,GAAGvB,gBAAgB,CAAC,EAAEc,YAAY;YAElF,IAAIK,aAAa;gBACf,MAAMK,QAAQnC,IAAI,CAACwB,MAAMI,IAAI,CAAC;gBAE9B,IAAI,OAAOO,UAAU,YAAYA,UAAU,MAAM;oBAC/CC,OAAOC,OAAO,CAACF,OAAOZ,OAAO,CAAC,CAAC,CAACe,WAAWC,YAAY;wBACrD,IAAIC,aAAaD;wBACjB,IAAIE,OAAO;wBAEX,IAAIF,eAAe,OAAOA,gBAAgB,YAAY,WAAWA,aAAa;4BAC5EC,aAAaD,YAAYG,KAAK;4BAC9BD,OAAO;4BACP,IAAI,CAACE,MAAMC,OAAO,CAACJ,aAAa;gCAC9BA,aAAa;oCAACA;iCAAW;4BAC3B;wBACF;wBAEA,IAAIG,MAAMC,OAAO,CAACJ,aAAa;4BAC7B,MAAMK,UAAU3D,eAAe;gCAC7BO;gCACAuC;gCACApC;gCACAC;gCACAC;gCACAE,MAAMwC;gCACNhB;gCACAsB,QAAQR;gCACR9B;gCACAC;gCACAC,mBAAmBA,qBAAqBc,MAAMuB,SAAS;gCACvDnC;gCACAC;gCACAE;gCACAE;gCACAC;gCACAC;gCACAC,0BAA0BkB;4BAC5B;4BAEA,IAAIG,MAAM;gCACR,IAAI,CAAC9C,YAAY,CAACqC,eAAe,EAAE;oCACjCrC,YAAY,CAACqC,eAAe,GAAG,EAAE;gCACnC;gCACArC,YAAY,CAACqC,eAAe,GAAGrC,YAAY,CAACqC,eAAe,CAACgB,MAAM,CAACH;4BACrE,OAAO;gCACL,IAAI,CAACnD,MAAM,CAACsC,eAAe,EAAE;oCAC3BtC,MAAM,CAACsC,eAAe,GAAG,EAAE;gCAC7B;gCACAtC,MAAM,CAACsC,eAAe,GAAGtC,MAAM,CAACsC,eAAe,CAACgB,MAAM,CAACH;4BACzD;wBACF;oBACF;gBACF;YACF,OAAO;gBACL,IAAIV,QAAQnC,IAAI,CAACwB,MAAMI,IAAI,CAAC;gBAC5B,IAAIa,OAAO;gBACX,IAAI,OAAON,UAAU,YAAY,WAAWA,OAAO;oBACjDA,QAAQQ,MAAMC,OAAO,CAACT,MAAMO,KAAK,IAAIP,MAAMO,KAAK,GAAG;wBAACP,MAAMO,KAAK;qBAAC;oBAChED,OAAO;gBACT;gBAEA,MAAMI,UAAU3D,eAAe;oBAC7BO;oBACAuC;oBACApC;oBACAC;oBACAC;oBACAE,MAAMmC;oBACNX;oBACAhB;oBACAC;oBACAC,mBAAmBA,qBAAqBc,MAAMuB,SAAS;oBACvDnC;oBACAC;oBACAE;oBACAE;oBACAC;oBACAC;oBACAC;gBACF;gBAEA,IAAIqB,MAAM;oBACR,IAAI,CAAC9C,YAAY,CAACqC,eAAe,EAAE;wBACjCrC,YAAY,CAACqC,eAAe,GAAG,EAAE;oBACnC;oBACArC,YAAY,CAACqC,eAAe,GAAGrC,YAAY,CAACqC,eAAe,CAACgB,MAAM,CAACH;gBACrE,OAAO;oBACL,IAAI,CAACnD,MAAM,CAACsC,eAAe,EAAE;wBAC3BtC,MAAM,CAACsC,eAAe,GAAG,EAAE;oBAC7B;oBACAtC,MAAM,CAACsC,eAAe,GAAGtC,MAAM,CAACsC,eAAe,CAACgB,MAAM,CAACH;gBACzD;YACF;YAEA;QACF;QAEA,IAAIrB,MAAMO,IAAI,KAAK,YAAY,CAACtC,QAAQwD,YAAY,EAAE;YACpDzB,MAAM3B,MAAM,CAAC0B,OAAO,CAAC,CAAC2B;gBACpB,MAAMC,eACJ,OAAOD,UAAU,WACbzD,QAAQ2D,OAAO,CAACC,MAAM,CAACxD,MAAM,CAACyD,IAAI,CAAC,CAACC,OAASA,KAAKC,IAAI,KAAKN,SAC3DA;gBAENpD,eAAe2D,GAAG,CAChBxE,sBACEkE,cACA1D,QAAQwC,YAAY,CAACC,GAAG,CAAC,GAAGtC,cAAc,QAAQ,EAAEb,YAAYoE,aAAaK,IAAI,GAAG;YAG1F;YAEA,IAAI1B,aAAa;gBACf,IAAI,OAAO9B,IAAI,CAACwB,MAAMI,IAAI,CAAC,KAAK,YAAY5B,IAAI,CAACwB,MAAMI,IAAI,CAAC,KAAK,MAAM;oBACrEQ,OAAOC,OAAO,CAACrC,IAAI,CAACwB,MAAMI,IAAI,CAAC,EAAEL,OAAO,CAAC,CAAC,CAACe,WAAWE,WAAW;wBAC/D,IAAIG,MAAMC,OAAO,CAACJ,aAAa;4BAC7BrD,gBAAgB;gCACdM;gCACAG;gCACAC;gCACAC;gCACAE,MAAMwC;gCACNhB;gCACAsB,QAAQR;gCACR9B;gCACAC;gCACAC,mBAAmBA,qBAAqBc,MAAMuB,SAAS;gCACvDnC;gCACAC;gCACAE;gCACAE;gCACAC;gCACAC;gCACAC,0BAA0BkB;4BAC5B;wBACF;oBACF;gBACF;YACF,OAAO,IAAItD,cAAc2C,YAAY;gBACnCxC,gBAAgB;oBACdM;oBACAG;oBACAC;oBACAC;oBACAE,MAAM2B;oBACNH;oBACAhB;oBACAC;oBACAC,mBAAmBA,qBAAqBc,MAAMuB,SAAS;oBACvDnC;oBACAC;oBACAE;oBACAE;oBACAC;oBACAC;oBACAC;gBACF;YACF;YAEA;QACF;QAEA,IAAII,MAAMO,IAAI,KAAK,WAAWP,MAAMO,IAAI,KAAK,OAAO;YAClD,IAAI,OAAO/B,IAAI,CAACwB,MAAMI,IAAI,CAAC,KAAK,YAAY5B,IAAI,CAACwB,MAAMI,IAAI,CAAC,KAAK,MAAM;gBACrE,IAAIE,aAAa;oBACfM,OAAOC,OAAO,CAACrC,IAAI,CAACwB,MAAMI,IAAI,CAAC,EAAEL,OAAO,CAAC,CAAC,CAACe,WAAWE,WAAW;wBAC/D,gCAAgC;wBAChCA,WAAWlB,KAAK,GAAGtB,KAAK0D,EAAE,IAAI1D,KAAKsB,KAAK;wBAExC9B,eAAe;4BACbC;4BACAC;4BACAC;4BACAC;4BACAC;4BACAC;4BACAC,cAAc,GAAG0B,WAAW,CAAC,CAAC;4BAC9BzB,MAAMwC;4BACNvC;4BACAC;4BACAC,aAAa,GAAGuB,UAAU,CAAC,CAAC;4BAC5BtB,QAAQoB,MAAMmC,eAAe;4BAC7BtD,cAAciC;4BACdhC;4BACAC;4BACAC;4BACAC;4BACAC,mBAAmBA,qBAAqBc,MAAMuB,SAAS;4BACvDpC;4BACAC,MAAM,GAAGA,QAAQ,KAAKY,MAAMI,IAAI,CAAC,CAAC,CAAC;4BACnCf;4BACAC;4BACAC;4BACAC;4BACAC;4BACAC;4BACAC;4BACAC,0BAA0BkB;wBAC5B;oBACF;gBACF,OAAO;oBACL,gCAAgC;oBAChC,MAAMsB,YAAY5D,IAAI,CAACwB,MAAMI,IAAI,CAAC;oBAClCgC,UAAUtC,KAAK,GAAGtB,KAAK0D,EAAE,IAAI1D,KAAKsB,KAAK;oBAEvC9B,eAAe;wBACbC;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC,cAAc,GAAG0B,WAAW,CAAC,CAAC;wBAC9BzB,MAAM4D;wBACN3D;wBACAC;wBACAC,aAAa,GAAGuB,UAAU,CAAC,CAAC;wBAC5BtB,QAAQoB,MAAMmC,eAAe;wBAC7BtD;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC,mBAAmBA,qBAAqBc,MAAMuB,SAAS;wBACvDpC;wBACAC,MAAM,GAAGA,QAAQ,KAAKY,MAAMI,IAAI,CAAC,CAAC,CAAC;wBACnCf;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC;oBACF;gBACF;YACF;YAEA;QACF;QAEA,IAAII,MAAMO,IAAI,KAAK,kBAAkBP,MAAMO,IAAI,KAAK,UAAU;YAC5D,MAAM8B,mBAAmB,GAAGjD,QAAQ,KAAKY,MAAMI,IAAI,EAAE;YAErD,iDAAiD;YACjD,IACED,aACA,OAAOA,cAAc,YACrB,aAAaH,SACbA,MAAMsC,OAAO,IACZ,CAAA,WAAWnC,aACTH,MAAMuB,SAAS,IACdX,OAAO2B,MAAM,CAACpC,WAAWqC,IAAI,CAC3B,CAACzB,cACCA,eACA,OAAOA,gBAAgB,YACvB,WAAYA,YACf,GACL;gBACA,IAAI0B;gBAEJ,IAAIzC,MAAMuB,SAAS,EAAE;oBACnB,IAAImB,sBAAsB;oBAC1B9B,OAAOC,OAAO,CAACV,WAAWJ,OAAO,CAAC,CAAC,CAACe,WAAWC,YAAY;wBACzD,IAAIA,eAAe,OAAOA,gBAAgB,YAAY,WAAWA,aAAa;4BAC5E2B,sBAAsB;4BACtB,MAAMzB,OAAOF,YAAYG,KAAK;4BAC9B,MAAMyB,cAAcxB,MAAMC,OAAO,CAACH,QAAQA,OAAO;gCAACA;6BAAK;4BAEvD0B,YAAY5C,OAAO,CAAC,CAAC6C;gCACnB,MAAMC,uBAA6C;oCACjDvB,QAAQR;oCACR1B,MAAMiD;oCACN1B,OAAOiC;gCACT;gCAEA,mCAAmC;gCACnC,IACEzB,MAAMC,OAAO,CAACpB,MAAM8C,UAAU,KAC9BF,QACA,OAAOA,SAAS,YAChB,gBAAgBA,MAChB;oCACAC,qBAAqBC,UAAU,GAAGF,KAAKE,UAAU;oCACjDD,qBAAqBlC,KAAK,GAAGiC,KAAKjC,KAAK;gCACzC,OAAO,IAAI,OAAOX,MAAM8C,UAAU,KAAK,UAAU;oCAC/C,sBAAsB;oCACtBD,qBAAqBC,UAAU,GAAG9C,MAAM8C,UAAU;oCAClDD,qBAAqBlC,KAAK,GAAGiC;gCAC/B;gCAEAtD,sBAAsB2B,IAAI,CAAC4B;4BAC7B;wBACF;oBACF;oBAEA,IAAIH,qBAAqB;wBACvB;oBACF;gBACF,OAAO;oBACL,0DAA0D;oBAC1DD,gBAAgBtB,MAAMC,OAAO,CAAC,AAACjB,UAAkBe,KAAK,IAClD,AAACf,UAAkBe,KAAK,GACxB;wBAAEf,UAAkBe,KAAK;qBAAC;oBAE9BuB,cAAc1C,OAAO,CAAC,CAAC6C;wBACrB,MAAMC,uBAA6C;4BACjDvB,QAAQhB,cAAcV,2BAA2BS;4BACjDjB,MAAMiD;4BACN1B,OAAOiC;wBACT;wBAEA,mCAAmC;wBACnC,IACEzB,MAAMC,OAAO,CAACpB,MAAM8C,UAAU,KAC9BF,QACA,OAAOA,SAAS,YAChB,gBAAgBA,QAChB,WAAWA,MACX;4BACAC,qBAAqBC,UAAU,GAAGF,KAAKE,UAAU;4BACjDD,qBAAqBlC,KAAK,GAAGiC,KAAKjC,KAAK;wBACzC,OAAO,IAAI,OAAOX,MAAM8C,UAAU,KAAK,UAAU;4BAC/C,sBAAsB;4BACtBD,qBAAqBC,UAAU,GAAG9C,MAAM8C,UAAU;4BAClDD,qBAAqBlC,KAAK,GAAGiC;wBAC/B;wBAEAtD,sBAAsB2B,IAAI,CAAC4B;oBAC7B;gBACF;gBACA;YACF;YAEA,mDAAmD;YACnD,IACE1C,aACA,OAAOA,cAAc,YACrB,aAAaH,SACbA,MAAMsC,OAAO,IACZ,CAAA,aAAanC,aACXH,MAAMuB,SAAS,IACdX,OAAO2B,MAAM,CAACpC,WAAWqC,IAAI,CAC3B,CAACzB,cACCA,eACA,OAAOA,gBAAgB,YACvB,aAAcA,YACjB,GACL;gBACA,8EAA8E;gBAC9E,IAAIf,MAAMuB,SAAS,EAAE;oBACnB,IAAImB,sBAAsB;oBAC1B9B,OAAOC,OAAO,CAACV,WAAWJ,OAAO,CAAC,CAAC,CAACe,WAAWC,YAAY;wBACzD,IAAIA,eAAe,OAAOA,gBAAgB,YAAY,aAAaA,aAAa;4BAC9E2B,sBAAsB;4BACtB,MAAMK,SAAShC,YAAYiC,OAAO;4BAClC,MAAML,cAAcxB,MAAMC,OAAO,CAAC2B,UAAUA,SAAS;gCAACA;6BAAO;4BAE7DJ,YAAY5C,OAAO,CAAC,CAAC6C;gCACnB,MAAMK,uBAA6C;oCACjDC,cAAcN;oCACdtB,QAAQR;oCACR1B,MAAMiD;gCACR;gCAEA,4CAA4C;gCAC5C,IAAI,OAAOrC,MAAM8C,UAAU,KAAK,UAAU;oCACxCG,qBAAqBH,UAAU,GAAG9C,MAAM8C,UAAU;gCACpD;gCAEAvD,sBAAsB0B,IAAI,CAACgC;4BAC7B;wBACF;oBACF;oBAEA,IAAIP,qBAAqB;wBACvB;oBACF;gBACF,OAAO;oBACL,4DAA4D;oBAC5D,MAAMS,gBAAgBhC,MAAMC,OAAO,CAAC,AAACjB,UAAkB6C,OAAO,IAC1D,AAAC7C,UAAkB6C,OAAO,GAC1B;wBAAE7C,UAAkB6C,OAAO;qBAAC;oBAEhCG,cAAcpD,OAAO,CAAC,CAAC6C;wBACrB,MAAMK,uBAA6C;4BACjDC,cAAcN;4BACdtB,QAAQhB,cAAcV,2BAA2BS;4BACjDjB,MAAMiD;wBACR;wBAEA,4CAA4C;wBAC5C,IAAI,OAAOrC,MAAM8C,UAAU,KAAK,UAAU;4BACxCG,qBAAqBH,UAAU,GAAG9C,MAAM8C,UAAU;wBACpD;wBAEAvD,sBAAsB0B,IAAI,CAACgC;oBAC7B;gBACF;gBACA;YACF;YAEA,IACE3C,eACCa,CAAAA,MAAMC,OAAO,CAACpB,MAAM8C,UAAU,KAAM,aAAa9C,SAASA,MAAMsC,OAAO,GACxE;gBACA,IAAI,OAAOnC,cAAc,UAAU;oBACjCS,OAAOC,OAAO,CAACV,WAAWJ,OAAO,CAAC,CAAC,CAACe,WAAWE,WAAW;wBACxD,IAAIA,eAAe,MAAM;4BACvBzB,sBAAsB0B,IAAI,CAAC;gCACzBK,QAAQR;gCACR1B,MAAMiD;4BACR;4BACA;wBACF;wBAEAxE,sBAAsB;4BACpBuF,SAAS;gCACP9B,QAAQR;gCACR1B,MAAMiD;4BACR;4BACA7D,MAAMwC;4BACNhB;4BACAX;wBACF;oBACF;gBACF;gBACA;YACF,OAAO,IAAI8B,MAAMC,OAAO,CAACpB,MAAM8C,UAAU,KAAM,aAAa9C,SAASA,MAAMsC,OAAO,EAAG;gBACnF,IAAInC,cAAc,QAASgB,MAAMC,OAAO,CAACjB,cAAcA,UAAUkD,MAAM,KAAK,GAAI;oBAC9E9D,sBAAsB0B,IAAI,CAAC;wBAAE7B,MAAMiD;oBAAiB;oBACpD;gBACF;gBAEAxE,sBAAsB;oBACpBuF,SAAS;wBACP9B,QAAQ1B;wBACRR,MAAMiD;oBACR;oBACA7D,MAAM2B;oBACNH;oBACAX;gBACF;gBACA;YACF,OAAO;gBACL,IACE,CAACiB,eACDH,aACA,OAAOA,cAAc,YACrB,QAAQA,aACRA,WAAW+B,IACX;oBACA/B,YAAYA,UAAU+B,EAAE;gBAC1B,OAAO,IAAI5B,aAAa;oBACtB,IAAI,OAAOH,cAAc,UAAU;wBACjCS,OAAOC,OAAO,CAACV,WAAWJ,OAAO,CAAC,CAAC,CAACe,WAAWE,WAAW;4BACxD,IAAI,OAAOA,eAAe,UAAU;gCAClC,IAAIA,cAAc,QAAQA,cAAcA,YAAYkB,IAAI;oCACtD/B,SAAS,CAACW,UAAU,GAAGE,WAAWkB,EAAE;gCACtC;4BACF,OAAO;gCACL/B,SAAS,CAACW,UAAU,GAAGE;4BACzB;wBACF;oBACF;gBACF;YACF;QACF;QAEA,IAAIhB,MAAMO,IAAI,KAAK,UAAUP,MAAMsC,OAAO,EAAE;YAC1C,MAAMgB,WAAW,GAAGlE,QAAQ,KAAKY,MAAMI,IAAI,EAAE;YAE7C,IAAIE,aAAa;gBACf,IAAI,OAAOH,cAAc,UAAU;oBACjCS,OAAOC,OAAO,CAACV,WAAWJ,OAAO,CAAC,CAAC,CAACe,WAAWE,WAAW;wBACxD,IAAIG,MAAMC,OAAO,CAACJ,aAAa;4BAC7B,IAAI,CAACA,WAAWqC,MAAM,EAAE;gCACtB1D,cAAcsB,IAAI,CAAC;oCAAEK,QAAQR;oCAAW1B,MAAMkE;gCAAS;gCACvD;4BACF;4BAEAvF,eAAe;gCACbqF,SAAS;oCACP9B,QAAQR;oCACR1B,MAAMkE;gCACR;gCACA9E,MAAMwC;gCACNtB;4BACF;wBACF;oBACF;gBACF;YACF,OAAO,IAAIyB,MAAMC,OAAO,CAACjB,YAAY;gBACnC,IAAI,CAACA,UAAUkD,MAAM,EAAE;oBACrB1D,cAAcsB,IAAI,CAAC;wBAAEK,QAAQ1B;wBAA0BR,MAAMkE;oBAAS;oBACtE;gBACF;gBAEAvF,eAAe;oBACbqF,SAAS;wBACP9B,QAAQ1B;wBACRR,MAAMkE;oBACR;oBACA9E,MAAM2B;oBACNT;gBACF;YACF;YAEA;QACF;QAEA,IAAIM,MAAMO,IAAI,KAAK,YAAYP,MAAMsC,OAAO,EAAE;YAC5C,MAAMiB,aAAa,GAAGnE,QAAQ,KAAKY,MAAMI,IAAI,EAAE;YAE/C,IAAIE,aAAa;gBACf,IAAI,OAAOH,cAAc,UAAU;oBACjCS,OAAOC,OAAO,CAACV,WAAWJ,OAAO,CAAC,CAAC,CAACe,WAAWE,WAAW;wBACxD,IAAIG,MAAMC,OAAO,CAACJ,aAAa;4BAC7B,IAAI,CAACA,WAAWqC,MAAM,EAAE;gCACtBpE,gBAAgBgC,IAAI,CAAC;oCAAEK,QAAQR;oCAAW1B,MAAMmE;gCAAW;gCAC3D;4BACF;4BAEA3F,iBAAiB;gCACfwF,SAAS;oCACP9B,QAAQR;oCACR1B,MAAMmE;gCACR;gCACA/E,MAAMwC;gCACNhC;4BACF;wBACF;oBACF;gBACF;YACF,OAAO,IAAImC,MAAMC,OAAO,CAACjB,YAAY;gBACnC,IAAI,CAACA,UAAUkD,MAAM,EAAE;oBACrBpE,gBAAgBgC,IAAI,CAAC;wBAAEK,QAAQ1B;wBAA0BR,MAAMmE;oBAAW;oBAC1E;gBACF;gBAEA3F,iBAAiB;oBACfwF,SAAS;wBACP9B,QAAQ1B;wBACRR,MAAMmE;oBACR;oBACA/E,MAAM2B;oBACNnB;gBACF;YACF;YAEA;QACF;QAEA,IAAIgB,MAAMO,IAAI,KAAK,YAAYP,MAAMsC,OAAO,EAAE;YAC5C,MAAMkB,kBAAkBvF,QAAQwC,YAAY,CAACC,GAAG,CAAC,GAAGvB,gBAAgB,CAAC,EAAEc,YAAY;YACnF,IAAI,CAACR,OAAO,CAAC+D,gBAAgB,EAAE;gBAC7B/D,OAAO,CAAC+D,gBAAgB,GAAG,EAAE;YAC/B;YAEA,IAAIlD,aAAa;gBACf,IAAI,OAAO9B,IAAI,CAACwB,MAAMI,IAAI,CAAC,KAAK,YAAY5B,IAAI,CAACwB,MAAMI,IAAI,CAAC,KAAK,MAAM;oBACrEQ,OAAOC,OAAO,CAACrC,IAAI,CAACwB,MAAMI,IAAI,CAAC,EAAEL,OAAO,CAAC,CAAC,CAACe,WAAWE,WAAW;wBAC/D,IAAIG,MAAMC,OAAO,CAACJ,aAAa;4BAC7B,MAAMK,UAAUvD,iBAAiB;gCAC/BoE,IAAIpD,qBAAqBN,KAAKsB,KAAK,IAAItB,KAAK0D,EAAE,GAAG7B;gCACjD7B,MAAMwC;gCACNM,QAAQR;4BACV;4BAEArB,OAAO,CAAC+D,gBAAgB,GAAG/D,OAAO,CAAC+D,gBAAgB,CAAChC,MAAM,CAACH;wBAC7D;oBACF;gBACF;YACF,OAAO,IAAIF,MAAMC,OAAO,CAAC5C,IAAI,CAACwB,MAAMI,IAAI,CAAC,GAAG;gBAC1C,MAAMiB,UAAUvD,iBAAiB;oBAC/BoE,IAAIpD,qBAAqBN,KAAKsB,KAAK,IAAItB,KAAK0D,EAAE,GAAG7B;oBACjD7B,MAAMA,IAAI,CAACwB,MAAMI,IAAI,CAAC;oBACtBkB,QAAQ1B;gBACV;gBAEAH,OAAO,CAAC+D,gBAAgB,GAAG/D,OAAO,CAAC+D,gBAAgB,CAAChC,MAAM,CAACH;YAC7D;YAEA;QACF;QAEA,MAAMoC,oBAA4E,EAAE;QAEpF,IAAInD,aAAa;YACf,IAAI,OAAOH,cAAc,YAAYA,cAAc,MAAM;gBACvDS,OAAOC,OAAO,CAACV,WAAWJ,OAAO,CAAC,CAAC,CAACe,WAAWE,WAAW;oBACxD,IAAI,CAACjC,OAAO,CAAC+B,UAAU,EAAE;wBACvB/B,OAAO,CAAC+B,UAAU,GAAG,CAAC;oBACxB;oBAEA2C,kBAAkBxC,IAAI,CAAC;wBACrBH;wBACA4C,KAAK3E;wBACL4B,OAAOK;oBACT;gBACF;YACF;QACF,OAAO;YACL,IAAI0C,MAAMlE;YAEV,IAAIX,cAAc;gBAChB,IAAI,CAACE,OAAO,CAACF,aAAa,EAAE;oBAC1BE,OAAO,CAACF,aAAa,GAAG,CAAC;gBAC3B;gBACA6E,MAAM3E,OAAO,CAACF,aAAa;YAC7B;YAEA4E,kBAAkBxC,IAAI,CAAC;gBAAEyC;gBAAK/C,OAAOR;YAAU;QACjD;QAEAsD,kBAAkB1D,OAAO,CAAC,CAAC,EAAEe,SAAS,EAAE4C,GAAG,EAAE/C,KAAK,EAAE;YAClD,IAAIgD,iBAAiBhD;YAErB,IAAIX,MAAMO,IAAI,KAAK,QAAQ;gBACzB,IAAIL,cAAc,eAAeyD,mBAAmB,MAAM;oBACxD,8EAA8E;oBAC9E,6EAA6E;oBAC7E,QAAO,sBAAsB;gBAC/B,OAAO,IAAIzD,cAAc,eAAe,OAAOyD,mBAAmB,aAAa;oBAC7E,sEAAsE;oBACtEA,iBAAiB,IAAIC,OAAOC,WAAW;gBACzC,OAAO;oBACL,IAAI,OAAOlD,UAAU,YAAY,CAACmD,OAAOC,KAAK,CAACpD,QAAQ;wBACrDgD,iBAAiB,IAAIC,KAAKjD,OAAOkD,WAAW;oBAC9C,OAAO,IAAIlD,iBAAiBiD,MAAM;wBAChCD,iBAAiBhD,MAAMkD,WAAW;oBACpC;gBACF;YACF;YAEA,IAAI,OAAOlD,UAAU,aAAa;gBAChC,IAAIA,SAASX,MAAMO,IAAI,KAAK,WAAWtC,QAAQmC,IAAI,KAAK,UAAU;oBAChEuD,iBAAiBxG,GAAG,CAAC,mBAAmB,EAAE6G,KAAKC,SAAS,CAACtD,OAAO,CAAC,CAAC;gBACpE;gBAEA,IAAIX,MAAMO,IAAI,KAAK,UAAUI,SAAS,OAAOA,UAAU,UAAU;oBAC/DgD,iBAAiBK,KAAKC,SAAS,CAACtD;gBAClC;gBAEA,IACEX,MAAMO,IAAI,KAAK,YACfI,SACA,OAAOA,UAAU,YACjB,UAAUA,SACV,OAAOA,MAAMuD,IAAI,KAAK,UACtB;oBACA,IAAI,CAACzF,oBAAoB;wBACvB,MAAM,IAAIrB,SACR;oBAEJ;oBAEAuG,iBAAiBxG,IAAIgH,GAAG,CAAC,GAAGlE,WAAW,GAAG,EAAEU,MAAMuD,IAAI,EAAE;gBAC1D;YACF;YAEA,IAAI,OAAOP,mBAAmB,aAAa;gBACzC,IAAI7C,WAAW;oBACb4C,GAAG,CAAC5C,UAAU,CAACZ,UAAU,GAAGyD;gBAC9B,OAAO;oBACLD,GAAG,CAACxD,UAAU,GAAGyD;gBACnB;YACF;QACF;IACF;IAEA,mDAAmD;IACnD,IAAI,CAAC9D,eAAe;QAClBe,OAAOwD,IAAI,CAAC5F,MAAMuB,OAAO,CAAC,CAACsE;YACzB,IAAIA,IAAIC,QAAQ,CAAC,MAAM;gBACrB,0BAA0B;gBAC1B,MAAMC,gBAAgBF,IAAIG,OAAO,CAAC;gBAClC,MAAMtE,YAAYmE,IAAII,SAAS,CAAC,GAAGF;gBACnC,MAAMG,gBAAgBL,IAAII,SAAS,CAACF,gBAAgB;gBAEpD,yCAAyC;gBACzC,IAAI,CAAC/F,IAAI,CAAC0B,UAAU,EAAE;oBACpB1B,IAAI,CAAC0B,UAAU,GAAG,CAAC;gBACrB;gBAEA,MAAMyE,aAAanG,IAAI,CAAC0B,UAAU;gBAElC,yCAAyC;gBACzCyE,UAAU,CAACD,cAAc,GAAGlG,IAAI,CAAC6F,IAAI;gBACrC,OAAO7F,IAAI,CAAC6F,IAAI;gBAEhB,yDAAyD;gBACzD,iFAAiF;gBACjFrG,eAAe;oBACbC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;gBACF;YACF;QACF;IACF;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/upsertRow/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAKzC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAqBtC;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAU,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,EAAE,6KAqB7E,IAAI,KAAG,OAAO,CAAC,CAAC,CAgtBlB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/upsertRow/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAKzC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAqBtC;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAU,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,EAAE,6KAqB7E,IAAI,KAAG,OAAO,CAAC,CAAC,CAotBlB,CAAA"}
@@ -157,9 +157,12 @@ customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, u
157
157
  if (operation === 'update') {
158
158
  const target = upsertTarget || adapter.tables[tableName].id;
159
159
  // Check if we only have relationship operations and no main row data to update
160
- // Exclude timestamp-only updates when we only have relationship operations
160
+ // Exclude timestamp-only updates when we only have relationship operations.
161
+ // Localized field updates live in the `_locales` table, so the main row may only
162
+ // contain timestamps — in that case the parent row's `updatedAt` must still bump.
161
163
  const rowKeys = Object.keys(rowToInsert.row);
162
- const hasMainRowData = rowKeys.length > 0 && !rowKeys.every((key)=>key === 'updatedAt' || key === 'createdAt');
164
+ const hasLocalizedData = Object.keys(rowToInsert.locales).length > 0;
165
+ const hasMainRowData = rowKeys.length > 0 && (hasLocalizedData || !rowKeys.every((key)=>key === 'updatedAt' || key === 'createdAt'));
163
166
  if (hasMainRowData) {
164
167
  if (id) {
165
168
  rowToInsert.row.id = id;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/upsertRow/index.ts"],"sourcesContent":["import type { LibSQLDatabase } from 'drizzle-orm/libsql'\nimport type { SelectedFields } from 'drizzle-orm/sqlite-core'\nimport type { TypeWithID } from 'payload'\n\nimport { and, desc, eq, isNull, or } from 'drizzle-orm'\n\nimport type { BlockRowToInsert } from '../transform/write/types.js'\nimport type { Args } from './types.js'\n\ntype RelationshipRow = {\n [key: string]: number | string | undefined // For relationship ID columns like categoriesID, moviesID, etc.\n id?: number | string\n locale?: string\n order: number\n parent: number | string // Drizzle table uses 'parent' key\n path: string\n}\n\nimport { buildFindManyArgs } from '../find/buildFindManyArgs.js'\nimport { transform } from '../transform/read/index.js'\nimport { transformForWrite } from '../transform/write/index.js'\nimport { markWrite } from '../utilities/readAfterWrite.js'\nimport { deleteExistingArrayRows } from './deleteExistingArrayRows.js'\nimport { deleteExistingRowsByPath } from './deleteExistingRowsByPath.js'\nimport { handleUpsertError } from './handleUpsertError.js'\nimport { insertArrays } from './insertArrays.js'\nimport { shouldUseOptimizedUpsertRow } from './shouldUseOptimizedUpsertRow.js'\n\n/**\n * If `id` is provided, it will update the row with that ID.\n * If `where` is provided, it will update the row that matches the `where`\n * If neither `id` nor `where` is provided, it will create a new row.\n *\n * adapter function replaces the entire row and does not support partial updates.\n */\nexport const upsertRow = async <T extends Record<string, unknown> | TypeWithID>({\n id,\n adapter,\n collectionSlug,\n data,\n db,\n fields,\n globalSlug,\n ignoreResult,\n // TODO:\n // When we support joins for write operations (create/update) - pass collectionSlug to the buildFindManyArgs\n // Make a new argument in upsertRow.ts and pass the slug from every operation.\n customID,\n joinQuery: _joinQuery,\n operation,\n path = '',\n req,\n select,\n tableName,\n upsertTarget,\n where,\n}: Args): Promise<T> => {\n if (operation === 'create' && !data.createdAt) {\n data.createdAt = new Date().toISOString()\n }\n\n markWrite(adapter)\n\n let insertedRow: Record<string, unknown> = { id }\n if (id && shouldUseOptimizedUpsertRow({ data, fields })) {\n try {\n const transformedForWrite = transformForWrite({\n adapter,\n data,\n enableAtomicWrites: true,\n fields,\n tableName,\n })\n const { row } = transformedForWrite\n const { arraysToPush } = transformedForWrite\n\n const drizzle = db as LibSQLDatabase\n\n // First, handle $push arrays\n\n if (arraysToPush && Object.keys(arraysToPush)?.length) {\n await insertArrays({\n adapter,\n arrays: [arraysToPush],\n db,\n parentRows: [insertedRow],\n uuidMap: {},\n })\n }\n\n // If row.updatedAt is not set, delete it to avoid triggering hasDataToUpdate. `updatedAt` may be explicitly set to null to\n // disable triggering hasDataToUpdate.\n if (typeof row.updatedAt === 'undefined' || row.updatedAt === null) {\n delete row.updatedAt\n }\n\n const hasDataToUpdate = row && Object.keys(row)?.length\n\n // Then, handle regular row update\n if (ignoreResult) {\n if (hasDataToUpdate) {\n // Only update row if there is something to update.\n // Example: if the data only consists of a single $push, calling insertArrays is enough - we don't need to update the row.\n await drizzle\n .update(adapter.tables[tableName])\n .set(row)\n .where(eq(adapter.tables[tableName].id, id))\n }\n return ignoreResult === 'idOnly' ? ({ id } as T) : null\n }\n\n const findManyArgs = buildFindManyArgs({\n adapter,\n depth: 0,\n fields,\n joinQuery: false,\n select,\n tableName,\n })\n\n const findManyKeysLength = Object.keys(findManyArgs).length\n const hasOnlyColumns = Object.keys(findManyArgs.columns || {}).length > 0\n\n if (!hasDataToUpdate) {\n // Nothing to update => just fetch current row and return\n findManyArgs.where = eq(adapter.tables[tableName].id, insertedRow.id)\n\n const doc = await db.query[tableName].findFirst(findManyArgs)\n\n return transform<T>({\n adapter,\n config: adapter.payload.config,\n data: doc,\n fields,\n joinQuery: false,\n tableName,\n })\n }\n\n if (findManyKeysLength === 0 || hasOnlyColumns) {\n // Optimization - No need for joins => can simply use returning(). This is optimal for very simple collections\n // without complex fields that live in separate tables like blocks, arrays, relationships, etc.\n\n const selectedFields: SelectedFields = {}\n if (hasOnlyColumns) {\n for (const [column, enabled] of Object.entries(findManyArgs.columns)) {\n if (enabled) {\n selectedFields[column] = adapter.tables[tableName][column]\n }\n }\n }\n\n const docs = await drizzle\n .update(adapter.tables[tableName])\n .set(row)\n .where(eq(adapter.tables[tableName].id, id))\n .returning(Object.keys(selectedFields).length ? selectedFields : undefined)\n\n return transform<T>({\n adapter,\n config: adapter.payload.config,\n data: docs[0],\n fields,\n joinQuery: false,\n tableName,\n })\n }\n\n // DB Update that needs the result, potentially with joins => need to update first, then find. returning() does not work with joins.\n\n await drizzle\n .update(adapter.tables[tableName])\n .set(row)\n .where(eq(adapter.tables[tableName].id, id))\n\n findManyArgs.where = eq(adapter.tables[tableName].id, insertedRow.id)\n\n const doc = await db.query[tableName].findFirst(findManyArgs)\n\n return transform<T>({\n adapter,\n config: adapter.payload.config,\n data: doc,\n fields,\n joinQuery: false,\n tableName,\n })\n } catch (error) {\n handleUpsertError({ id, adapter, collectionSlug, error, globalSlug, req, tableName })\n }\n }\n // Split out the incoming data into the corresponding:\n // base row, locales, relationships, blocks, and arrays\n const rowToInsert = transformForWrite({\n adapter,\n data,\n enableAtomicWrites: false,\n fields,\n path,\n tableName,\n })\n\n if (customID) {\n rowToInsert.row.id = customID\n }\n\n // First, we insert the main row\n try {\n if (operation === 'update') {\n const target = upsertTarget || adapter.tables[tableName].id\n\n // Check if we only have relationship operations and no main row data to update\n // Exclude timestamp-only updates when we only have relationship operations\n const rowKeys = Object.keys(rowToInsert.row)\n const hasMainRowData =\n rowKeys.length > 0 && !rowKeys.every((key) => key === 'updatedAt' || key === 'createdAt')\n\n if (hasMainRowData) {\n if (id) {\n rowToInsert.row.id = id\n ;[insertedRow] = await adapter.insert({\n db,\n onConflictDoUpdate: { set: rowToInsert.row, target },\n tableName,\n values: rowToInsert.row,\n })\n } else {\n ;[insertedRow] = await adapter.insert({\n db,\n onConflictDoUpdate: { set: rowToInsert.row, target, where },\n tableName,\n values: rowToInsert.row,\n })\n }\n } else {\n // No main row data to update, just use the existing ID\n insertedRow = { id }\n }\n } else {\n if (adapter.allowIDOnCreate && data.id) {\n rowToInsert.row.id = data.id\n }\n ;[insertedRow] = await adapter.insert({\n db,\n tableName,\n values: rowToInsert.row,\n })\n }\n\n const localesToInsert: Record<string, unknown>[] = []\n const relationsToInsert: Record<string, unknown>[] = []\n const textsToInsert: Record<string, unknown>[] = []\n const numbersToInsert: Record<string, unknown>[] = []\n const blocksToInsert: { [blockType: string]: BlockRowToInsert[] } = {}\n const selectsToInsert: { [selectTableName: string]: Record<string, unknown>[] } = {}\n\n // If there are locale rows with data, add the parent and locale to each\n if (Object.keys(rowToInsert.locales).length > 0) {\n Object.entries(rowToInsert.locales).forEach(([locale, localeRow]) => {\n localeRow._parentID = insertedRow.id\n localeRow._locale = locale\n localesToInsert.push(localeRow)\n })\n }\n\n // If there are relationships, add parent to each\n if (rowToInsert.relationships.length > 0) {\n rowToInsert.relationships.forEach((relation) => {\n relation.parent = insertedRow.id\n relationsToInsert.push(relation)\n })\n }\n\n // If there are texts, add parent to each\n if (rowToInsert.texts.length > 0) {\n rowToInsert.texts.forEach((textRow) => {\n textRow.parent = insertedRow.id\n textsToInsert.push(textRow)\n })\n }\n\n // If there are numbers, add parent to each\n if (rowToInsert.numbers.length > 0) {\n rowToInsert.numbers.forEach((numberRow) => {\n numberRow.parent = insertedRow.id\n numbersToInsert.push(numberRow)\n })\n }\n\n // If there are selects, add parent to each, and then\n // store by table name and rows\n if (Object.keys(rowToInsert.selects).length > 0) {\n Object.entries(rowToInsert.selects).forEach(([selectTableName, selectRows]) => {\n selectsToInsert[selectTableName] = []\n\n selectRows.forEach((row) => {\n if (typeof row.parent === 'undefined') {\n row.parent = insertedRow.id\n }\n\n selectsToInsert[selectTableName].push(row)\n })\n })\n }\n\n // If there are blocks, add parent to each, and then\n // store by table name and rows\n Object.keys(rowToInsert.blocks).forEach((tableName) => {\n rowToInsert.blocks[tableName].forEach((blockRow) => {\n blockRow.row._parentID = insertedRow.id\n if (!blocksToInsert[tableName]) {\n blocksToInsert[tableName] = []\n }\n if (blockRow.row.uuid) {\n delete blockRow.row.uuid\n }\n blocksToInsert[tableName].push(blockRow)\n })\n })\n\n // //////////////////////////////////\n // INSERT LOCALES\n // //////////////////////////////////\n\n if (localesToInsert.length > 0) {\n const localeTableName = `${tableName}${adapter.localesSuffix}`\n const localeTable = adapter.tables[`${tableName}${adapter.localesSuffix}`]\n\n if (operation === 'update') {\n await adapter.deleteWhere({\n db,\n tableName: localeTableName,\n where: eq(localeTable._parentID, insertedRow.id),\n })\n }\n\n await adapter.insert({\n db,\n tableName: localeTableName,\n values: localesToInsert,\n })\n }\n\n // //////////////////////////////////\n // INSERT RELATIONSHIPS\n // //////////////////////////////////\n\n const relationshipsTableName = `${tableName}${adapter.relationshipsSuffix}`\n\n if (operation === 'update') {\n // Filter out specific item deletions (those with itemToRemove) from general path deletions\n const generalRelationshipDeletes = rowToInsert.relationshipsToDelete.filter(\n (rel) => !('itemToRemove' in rel),\n )\n\n await deleteExistingRowsByPath({\n adapter,\n db,\n localeColumnName: 'locale',\n parentColumnName: 'parent',\n parentID: insertedRow.id,\n pathColumnName: 'path',\n rows: [...relationsToInsert, ...generalRelationshipDeletes],\n tableName: relationshipsTableName,\n })\n }\n\n if (relationsToInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: relationshipsTableName,\n values: relationsToInsert,\n })\n }\n\n // //////////////////////////////////\n // HANDLE RELATIONSHIP $push OPERATIONS\n // //////////////////////////////////\n\n if (rowToInsert.relationshipsToAppend.length > 0) {\n // Prepare all relationships for batch insert (order will be set after max query)\n const relationshipsToInsert = rowToInsert.relationshipsToAppend.map((rel) => {\n const parentId = id || insertedRow.id\n const row: Record<string, unknown> = {\n parent: parentId as number | string, // Use 'parent' key for Drizzle table\n path: rel.path,\n }\n\n // Only add locale if this relationship table has a locale column\n const relationshipTable = adapter.rawTables[relationshipsTableName]\n if (rel.locale && relationshipTable && relationshipTable.columns.locale) {\n row.locale = rel.locale\n }\n\n if (rel.relationTo) {\n // Use camelCase key for Drizzle table (e.g., categoriesID not categories_id)\n row[`${rel.relationTo}ID`] = rel.value\n }\n\n return row\n })\n\n if (relationshipsToInsert.length > 0) {\n // Check for potential duplicates\n const relationshipTable = adapter.tables[relationshipsTableName]\n\n if (relationshipTable) {\n // Build conditions only if we have relationships to check\n if (relationshipsToInsert.length === 0) {\n return // No relationships to insert\n }\n\n const conditions = relationshipsToInsert.map((row: RelationshipRow) => {\n const parts = [\n eq(relationshipTable.parent, row.parent),\n eq(relationshipTable.path, row.path),\n ]\n\n // Add locale condition\n if (row.locale !== undefined && relationshipTable.locale) {\n parts.push(eq(relationshipTable.locale, row.locale))\n } else if (relationshipTable.locale) {\n parts.push(isNull(relationshipTable.locale))\n }\n\n // Add all relationship ID matches using schema fields\n for (const [key, value] of Object.entries(row)) {\n if (key.endsWith('ID') && value != null) {\n const column = relationshipTable[key]\n if (column && typeof column === 'object') {\n parts.push(eq(column, value))\n }\n }\n }\n\n return and(...parts)\n })\n\n // Get both existing relationships AND max order in a single query\n let existingRels: Record<string, unknown>[] = []\n let maxOrder = 0\n\n if (conditions.length > 0) {\n // Query for existing relationships\n existingRels = await (db as any)\n .select()\n .from(relationshipTable)\n .where(or(...conditions))\n }\n\n // Get max order for this parent across all paths in a single query\n const parentId = id || insertedRow.id\n const maxOrderResult = await (db as any)\n .select({ maxOrder: relationshipTable.order })\n .from(relationshipTable)\n .where(eq(relationshipTable.parent, parentId))\n .orderBy(desc(relationshipTable.order))\n .limit(1)\n\n if (maxOrderResult.length > 0 && maxOrderResult[0].maxOrder) {\n maxOrder = maxOrderResult[0].maxOrder\n }\n\n // Set order values for all relationships based on max order\n relationshipsToInsert.forEach((row, index) => {\n row.order = maxOrder + index + 1\n })\n\n // Filter out relationships that already exist\n const relationshipsToActuallyInsert = relationshipsToInsert.filter((newRow) => {\n return !existingRels.some((existingRow: Record<string, unknown>) => {\n // Check if this relationship already exists\n let matches = existingRow.parent === newRow.parent && existingRow.path === newRow.path\n\n if (newRow.locale !== undefined) {\n matches = matches && existingRow.locale === newRow.locale\n }\n\n // Check relationship value matches - convert to camelCase for comparison\n for (const key of Object.keys(newRow)) {\n if (key.endsWith('ID')) {\n // Now using camelCase keys\n matches = matches && existingRow[key] === newRow[key]\n }\n }\n\n return matches\n })\n })\n\n // Insert only non-duplicate relationships\n if (relationshipsToActuallyInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: relationshipsTableName,\n values: relationshipsToActuallyInsert,\n })\n }\n }\n }\n }\n\n // //////////////////////////////////\n // HANDLE RELATIONSHIP $remove OPERATIONS\n // //////////////////////////////////\n\n if (rowToInsert.relationshipsToDelete.some((rel) => 'itemToRemove' in rel)) {\n const relationshipTable = adapter.tables[relationshipsTableName]\n\n if (relationshipTable) {\n for (const relToDelete of rowToInsert.relationshipsToDelete) {\n if ('itemToRemove' in relToDelete && relToDelete.itemToRemove) {\n const item = relToDelete.itemToRemove\n const parentId = (id || insertedRow.id) as number | string\n\n const conditions = [\n eq(relationshipTable.parent, parentId),\n eq(relationshipTable.path, relToDelete.path),\n ]\n\n // Add locale condition if this relationship table has a locale column\n if (adapter.rawTables[relationshipsTableName]?.columns.locale) {\n if (relToDelete.locale) {\n conditions.push(eq(relationshipTable.locale, relToDelete.locale))\n } else {\n conditions.push(isNull(relationshipTable.locale))\n }\n }\n\n // Handle polymorphic vs simple relationships\n if (typeof item === 'object' && 'relationTo' in item) {\n // Polymorphic relationship - convert to camelCase key\n const camelKey = `${item.relationTo}ID`\n if (relationshipTable[camelKey]) {\n conditions.push(eq(relationshipTable[camelKey], item.value))\n }\n } else if (relToDelete.relationTo) {\n // Simple relationship - convert to camelCase key\n const camelKey = `${relToDelete.relationTo}ID`\n if (relationshipTable[camelKey]) {\n conditions.push(eq(relationshipTable[camelKey], item))\n }\n }\n\n // Execute DELETE using Drizzle query builder\n await adapter.deleteWhere({\n db,\n tableName: relationshipsTableName,\n where: and(...conditions),\n })\n }\n }\n }\n }\n\n // //////////////////////////////////\n // INSERT hasMany TEXTS\n // //////////////////////////////////\n\n const textsTableName = `${tableName}_texts`\n\n if (operation === 'update') {\n await deleteExistingRowsByPath({\n adapter,\n db,\n localeColumnName: 'locale',\n parentColumnName: 'parent',\n parentID: insertedRow.id,\n pathColumnName: 'path',\n rows: [...textsToInsert, ...rowToInsert.textsToDelete],\n tableName: textsTableName,\n })\n }\n\n if (textsToInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: textsTableName,\n values: textsToInsert,\n })\n }\n\n // //////////////////////////////////\n // INSERT hasMany NUMBERS\n // //////////////////////////////////\n\n const numbersTableName = `${tableName}_numbers`\n\n if (operation === 'update') {\n await deleteExistingRowsByPath({\n adapter,\n db,\n localeColumnName: 'locale',\n parentColumnName: 'parent',\n parentID: insertedRow.id,\n pathColumnName: 'path',\n rows: [...numbersToInsert, ...rowToInsert.numbersToDelete],\n tableName: numbersTableName,\n })\n }\n\n if (numbersToInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: numbersTableName,\n values: numbersToInsert,\n })\n }\n\n // //////////////////////////////////\n // INSERT BLOCKS\n // //////////////////////////////////\n\n const insertedBlockRows: Record<string, Record<string, unknown>[]> = {}\n\n if (operation === 'update') {\n for (const tableName of rowToInsert.blocksToDelete) {\n const blockTable = adapter.tables[tableName]\n await adapter.deleteWhere({\n db,\n tableName,\n where: eq(blockTable._parentID, insertedRow.id),\n })\n }\n }\n\n // When versions are enabled, adapter is used to track mapping between blocks/arrays ObjectID to their numeric generated representation, then we use it for nested to arrays/blocks select hasMany in versions.\n const arraysBlocksUUIDMap: Record<string, number | string> = {}\n\n for (const [tableName, blockRows] of Object.entries(blocksToInsert)) {\n insertedBlockRows[tableName] = await adapter.insert({\n db,\n tableName,\n values: blockRows.map(({ row }) => row),\n })\n\n insertedBlockRows[tableName].forEach((row, i) => {\n blockRows[i].row = row\n if (\n typeof row._uuid === 'string' &&\n (typeof row.id === 'string' || typeof row.id === 'number')\n ) {\n arraysBlocksUUIDMap[row._uuid] = row.id\n }\n })\n\n const blockLocaleIndexMap: number[] = []\n\n const blockLocaleRowsToInsert = blockRows.reduce((acc, blockRow, i) => {\n if (Object.entries(blockRow.locales).length > 0) {\n Object.entries(blockRow.locales).forEach(([blockLocale, blockLocaleData]) => {\n if (Object.keys(blockLocaleData).length > 0) {\n blockLocaleData._parentID = blockRow.row.id\n blockLocaleData._locale = blockLocale\n acc.push(blockLocaleData)\n blockLocaleIndexMap.push(i)\n }\n })\n }\n\n return acc\n }, [])\n\n if (blockLocaleRowsToInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: `${tableName}${adapter.localesSuffix}`,\n values: blockLocaleRowsToInsert,\n })\n }\n\n await insertArrays({\n adapter,\n arrays: blockRows.map(({ arrays }) => arrays),\n db,\n parentRows: insertedBlockRows[tableName],\n uuidMap: arraysBlocksUUIDMap,\n })\n }\n\n // //////////////////////////////////\n // INSERT ARRAYS RECURSIVELY\n // //////////////////////////////////\n\n if (operation === 'update') {\n for (const arrayTableName of Object.keys(rowToInsert.arrays)) {\n await deleteExistingArrayRows({\n adapter,\n db,\n parentID: insertedRow.id,\n tableName: arrayTableName,\n })\n }\n }\n\n await insertArrays({\n adapter,\n arrays: [rowToInsert.arrays, rowToInsert.arraysToPush],\n db,\n parentRows: [insertedRow, insertedRow],\n uuidMap: arraysBlocksUUIDMap,\n })\n\n // //////////////////////////////////\n // INSERT hasMany SELECTS\n // //////////////////////////////////\n\n for (const [selectTableName, tableRows] of Object.entries(selectsToInsert)) {\n const selectTable = adapter.tables[selectTableName]\n if (operation === 'update') {\n await adapter.deleteWhere({\n db,\n tableName: selectTableName,\n where: eq(selectTable.parent, insertedRow.id),\n })\n }\n\n if (Object.keys(arraysBlocksUUIDMap).length > 0) {\n tableRows.forEach((row: RelationshipRow) => {\n if (row.parent in arraysBlocksUUIDMap) {\n row.parent = arraysBlocksUUIDMap[row.parent]\n }\n })\n }\n\n if (tableRows.length) {\n await adapter.insert({\n db,\n tableName: selectTableName,\n values: tableRows,\n })\n }\n }\n } catch (error) {\n handleUpsertError({ id, adapter, collectionSlug, error, globalSlug, req, tableName })\n }\n\n if (ignoreResult === 'idOnly') {\n return { id: insertedRow.id } as T\n }\n\n if (ignoreResult) {\n return data as T\n }\n\n // //////////////////////////////////\n // RETRIEVE NEWLY UPDATED ROW\n // //////////////////////////////////\n\n const findManyArgs = buildFindManyArgs({\n adapter,\n depth: 0,\n fields,\n joinQuery: false,\n select,\n tableName,\n })\n\n findManyArgs.where = eq(adapter.tables[tableName].id, insertedRow.id)\n\n const doc = await db.query[tableName].findFirst(findManyArgs)\n\n // //////////////////////////////////\n // TRANSFORM DATA\n // //////////////////////////////////\n\n const result = transform<T>({\n adapter,\n config: adapter.payload.config,\n data: doc,\n fields,\n joinQuery: false,\n tableName,\n })\n\n return result\n}\n"],"names":["and","desc","eq","isNull","or","buildFindManyArgs","transform","transformForWrite","markWrite","deleteExistingArrayRows","deleteExistingRowsByPath","handleUpsertError","insertArrays","shouldUseOptimizedUpsertRow","upsertRow","id","adapter","collectionSlug","data","db","fields","globalSlug","ignoreResult","customID","joinQuery","_joinQuery","operation","path","req","select","tableName","upsertTarget","where","createdAt","Date","toISOString","insertedRow","transformedForWrite","enableAtomicWrites","row","arraysToPush","drizzle","Object","keys","length","arrays","parentRows","uuidMap","updatedAt","hasDataToUpdate","update","tables","set","findManyArgs","depth","findManyKeysLength","hasOnlyColumns","columns","doc","query","findFirst","config","payload","selectedFields","column","enabled","entries","docs","returning","undefined","error","rowToInsert","target","rowKeys","hasMainRowData","every","key","insert","onConflictDoUpdate","values","allowIDOnCreate","localesToInsert","relationsToInsert","textsToInsert","numbersToInsert","blocksToInsert","selectsToInsert","locales","forEach","locale","localeRow","_parentID","_locale","push","relationships","relation","parent","texts","textRow","numbers","numberRow","selects","selectTableName","selectRows","blocks","blockRow","uuid","localeTableName","localesSuffix","localeTable","deleteWhere","relationshipsTableName","relationshipsSuffix","generalRelationshipDeletes","relationshipsToDelete","filter","rel","localeColumnName","parentColumnName","parentID","pathColumnName","rows","relationshipsToAppend","relationshipsToInsert","map","parentId","relationshipTable","rawTables","relationTo","value","conditions","parts","endsWith","existingRels","maxOrder","from","maxOrderResult","order","orderBy","limit","index","relationshipsToActuallyInsert","newRow","some","existingRow","matches","relToDelete","itemToRemove","item","camelKey","textsTableName","textsToDelete","numbersTableName","numbersToDelete","insertedBlockRows","blocksToDelete","blockTable","arraysBlocksUUIDMap","blockRows","i","_uuid","blockLocaleIndexMap","blockLocaleRowsToInsert","reduce","acc","blockLocale","blockLocaleData","arrayTableName","tableRows","selectTable","result"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/upsertRow/index.ts"],"sourcesContent":["import type { LibSQLDatabase } from 'drizzle-orm/libsql'\nimport type { SelectedFields } from 'drizzle-orm/sqlite-core'\nimport type { TypeWithID } from 'payload'\n\nimport { and, desc, eq, isNull, or } from 'drizzle-orm'\n\nimport type { BlockRowToInsert } from '../transform/write/types.js'\nimport type { Args } from './types.js'\n\ntype RelationshipRow = {\n [key: string]: number | string | undefined // For relationship ID columns like categoriesID, moviesID, etc.\n id?: number | string\n locale?: string\n order: number\n parent: number | string // Drizzle table uses 'parent' key\n path: string\n}\n\nimport { buildFindManyArgs } from '../find/buildFindManyArgs.js'\nimport { transform } from '../transform/read/index.js'\nimport { transformForWrite } from '../transform/write/index.js'\nimport { markWrite } from '../utilities/readAfterWrite.js'\nimport { deleteExistingArrayRows } from './deleteExistingArrayRows.js'\nimport { deleteExistingRowsByPath } from './deleteExistingRowsByPath.js'\nimport { handleUpsertError } from './handleUpsertError.js'\nimport { insertArrays } from './insertArrays.js'\nimport { shouldUseOptimizedUpsertRow } from './shouldUseOptimizedUpsertRow.js'\n\n/**\n * If `id` is provided, it will update the row with that ID.\n * If `where` is provided, it will update the row that matches the `where`\n * If neither `id` nor `where` is provided, it will create a new row.\n *\n * adapter function replaces the entire row and does not support partial updates.\n */\nexport const upsertRow = async <T extends Record<string, unknown> | TypeWithID>({\n id,\n adapter,\n collectionSlug,\n data,\n db,\n fields,\n globalSlug,\n ignoreResult,\n // TODO:\n // When we support joins for write operations (create/update) - pass collectionSlug to the buildFindManyArgs\n // Make a new argument in upsertRow.ts and pass the slug from every operation.\n customID,\n joinQuery: _joinQuery,\n operation,\n path = '',\n req,\n select,\n tableName,\n upsertTarget,\n where,\n}: Args): Promise<T> => {\n if (operation === 'create' && !data.createdAt) {\n data.createdAt = new Date().toISOString()\n }\n\n markWrite(adapter)\n\n let insertedRow: Record<string, unknown> = { id }\n if (id && shouldUseOptimizedUpsertRow({ data, fields })) {\n try {\n const transformedForWrite = transformForWrite({\n adapter,\n data,\n enableAtomicWrites: true,\n fields,\n tableName,\n })\n const { row } = transformedForWrite\n const { arraysToPush } = transformedForWrite\n\n const drizzle = db as LibSQLDatabase\n\n // First, handle $push arrays\n\n if (arraysToPush && Object.keys(arraysToPush)?.length) {\n await insertArrays({\n adapter,\n arrays: [arraysToPush],\n db,\n parentRows: [insertedRow],\n uuidMap: {},\n })\n }\n\n // If row.updatedAt is not set, delete it to avoid triggering hasDataToUpdate. `updatedAt` may be explicitly set to null to\n // disable triggering hasDataToUpdate.\n if (typeof row.updatedAt === 'undefined' || row.updatedAt === null) {\n delete row.updatedAt\n }\n\n const hasDataToUpdate = row && Object.keys(row)?.length\n\n // Then, handle regular row update\n if (ignoreResult) {\n if (hasDataToUpdate) {\n // Only update row if there is something to update.\n // Example: if the data only consists of a single $push, calling insertArrays is enough - we don't need to update the row.\n await drizzle\n .update(adapter.tables[tableName])\n .set(row)\n .where(eq(adapter.tables[tableName].id, id))\n }\n return ignoreResult === 'idOnly' ? ({ id } as T) : null\n }\n\n const findManyArgs = buildFindManyArgs({\n adapter,\n depth: 0,\n fields,\n joinQuery: false,\n select,\n tableName,\n })\n\n const findManyKeysLength = Object.keys(findManyArgs).length\n const hasOnlyColumns = Object.keys(findManyArgs.columns || {}).length > 0\n\n if (!hasDataToUpdate) {\n // Nothing to update => just fetch current row and return\n findManyArgs.where = eq(adapter.tables[tableName].id, insertedRow.id)\n\n const doc = await db.query[tableName].findFirst(findManyArgs)\n\n return transform<T>({\n adapter,\n config: adapter.payload.config,\n data: doc,\n fields,\n joinQuery: false,\n tableName,\n })\n }\n\n if (findManyKeysLength === 0 || hasOnlyColumns) {\n // Optimization - No need for joins => can simply use returning(). This is optimal for very simple collections\n // without complex fields that live in separate tables like blocks, arrays, relationships, etc.\n\n const selectedFields: SelectedFields = {}\n if (hasOnlyColumns) {\n for (const [column, enabled] of Object.entries(findManyArgs.columns)) {\n if (enabled) {\n selectedFields[column] = adapter.tables[tableName][column]\n }\n }\n }\n\n const docs = await drizzle\n .update(adapter.tables[tableName])\n .set(row)\n .where(eq(adapter.tables[tableName].id, id))\n .returning(Object.keys(selectedFields).length ? selectedFields : undefined)\n\n return transform<T>({\n adapter,\n config: adapter.payload.config,\n data: docs[0],\n fields,\n joinQuery: false,\n tableName,\n })\n }\n\n // DB Update that needs the result, potentially with joins => need to update first, then find. returning() does not work with joins.\n\n await drizzle\n .update(adapter.tables[tableName])\n .set(row)\n .where(eq(adapter.tables[tableName].id, id))\n\n findManyArgs.where = eq(adapter.tables[tableName].id, insertedRow.id)\n\n const doc = await db.query[tableName].findFirst(findManyArgs)\n\n return transform<T>({\n adapter,\n config: adapter.payload.config,\n data: doc,\n fields,\n joinQuery: false,\n tableName,\n })\n } catch (error) {\n handleUpsertError({ id, adapter, collectionSlug, error, globalSlug, req, tableName })\n }\n }\n // Split out the incoming data into the corresponding:\n // base row, locales, relationships, blocks, and arrays\n const rowToInsert = transformForWrite({\n adapter,\n data,\n enableAtomicWrites: false,\n fields,\n path,\n tableName,\n })\n\n if (customID) {\n rowToInsert.row.id = customID\n }\n\n // First, we insert the main row\n try {\n if (operation === 'update') {\n const target = upsertTarget || adapter.tables[tableName].id\n\n // Check if we only have relationship operations and no main row data to update\n // Exclude timestamp-only updates when we only have relationship operations.\n // Localized field updates live in the `_locales` table, so the main row may only\n // contain timestamps — in that case the parent row's `updatedAt` must still bump.\n const rowKeys = Object.keys(rowToInsert.row)\n const hasLocalizedData = Object.keys(rowToInsert.locales).length > 0\n const hasMainRowData =\n rowKeys.length > 0 &&\n (hasLocalizedData || !rowKeys.every((key) => key === 'updatedAt' || key === 'createdAt'))\n\n if (hasMainRowData) {\n if (id) {\n rowToInsert.row.id = id\n ;[insertedRow] = await adapter.insert({\n db,\n onConflictDoUpdate: { set: rowToInsert.row, target },\n tableName,\n values: rowToInsert.row,\n })\n } else {\n ;[insertedRow] = await adapter.insert({\n db,\n onConflictDoUpdate: { set: rowToInsert.row, target, where },\n tableName,\n values: rowToInsert.row,\n })\n }\n } else {\n // No main row data to update, just use the existing ID\n insertedRow = { id }\n }\n } else {\n if (adapter.allowIDOnCreate && data.id) {\n rowToInsert.row.id = data.id\n }\n ;[insertedRow] = await adapter.insert({\n db,\n tableName,\n values: rowToInsert.row,\n })\n }\n\n const localesToInsert: Record<string, unknown>[] = []\n const relationsToInsert: Record<string, unknown>[] = []\n const textsToInsert: Record<string, unknown>[] = []\n const numbersToInsert: Record<string, unknown>[] = []\n const blocksToInsert: { [blockType: string]: BlockRowToInsert[] } = {}\n const selectsToInsert: { [selectTableName: string]: Record<string, unknown>[] } = {}\n\n // If there are locale rows with data, add the parent and locale to each\n if (Object.keys(rowToInsert.locales).length > 0) {\n Object.entries(rowToInsert.locales).forEach(([locale, localeRow]) => {\n localeRow._parentID = insertedRow.id\n localeRow._locale = locale\n localesToInsert.push(localeRow)\n })\n }\n\n // If there are relationships, add parent to each\n if (rowToInsert.relationships.length > 0) {\n rowToInsert.relationships.forEach((relation) => {\n relation.parent = insertedRow.id\n relationsToInsert.push(relation)\n })\n }\n\n // If there are texts, add parent to each\n if (rowToInsert.texts.length > 0) {\n rowToInsert.texts.forEach((textRow) => {\n textRow.parent = insertedRow.id\n textsToInsert.push(textRow)\n })\n }\n\n // If there are numbers, add parent to each\n if (rowToInsert.numbers.length > 0) {\n rowToInsert.numbers.forEach((numberRow) => {\n numberRow.parent = insertedRow.id\n numbersToInsert.push(numberRow)\n })\n }\n\n // If there are selects, add parent to each, and then\n // store by table name and rows\n if (Object.keys(rowToInsert.selects).length > 0) {\n Object.entries(rowToInsert.selects).forEach(([selectTableName, selectRows]) => {\n selectsToInsert[selectTableName] = []\n\n selectRows.forEach((row) => {\n if (typeof row.parent === 'undefined') {\n row.parent = insertedRow.id\n }\n\n selectsToInsert[selectTableName].push(row)\n })\n })\n }\n\n // If there are blocks, add parent to each, and then\n // store by table name and rows\n Object.keys(rowToInsert.blocks).forEach((tableName) => {\n rowToInsert.blocks[tableName].forEach((blockRow) => {\n blockRow.row._parentID = insertedRow.id\n if (!blocksToInsert[tableName]) {\n blocksToInsert[tableName] = []\n }\n if (blockRow.row.uuid) {\n delete blockRow.row.uuid\n }\n blocksToInsert[tableName].push(blockRow)\n })\n })\n\n // //////////////////////////////////\n // INSERT LOCALES\n // //////////////////////////////////\n\n if (localesToInsert.length > 0) {\n const localeTableName = `${tableName}${adapter.localesSuffix}`\n const localeTable = adapter.tables[`${tableName}${adapter.localesSuffix}`]\n\n if (operation === 'update') {\n await adapter.deleteWhere({\n db,\n tableName: localeTableName,\n where: eq(localeTable._parentID, insertedRow.id),\n })\n }\n\n await adapter.insert({\n db,\n tableName: localeTableName,\n values: localesToInsert,\n })\n }\n\n // //////////////////////////////////\n // INSERT RELATIONSHIPS\n // //////////////////////////////////\n\n const relationshipsTableName = `${tableName}${adapter.relationshipsSuffix}`\n\n if (operation === 'update') {\n // Filter out specific item deletions (those with itemToRemove) from general path deletions\n const generalRelationshipDeletes = rowToInsert.relationshipsToDelete.filter(\n (rel) => !('itemToRemove' in rel),\n )\n\n await deleteExistingRowsByPath({\n adapter,\n db,\n localeColumnName: 'locale',\n parentColumnName: 'parent',\n parentID: insertedRow.id,\n pathColumnName: 'path',\n rows: [...relationsToInsert, ...generalRelationshipDeletes],\n tableName: relationshipsTableName,\n })\n }\n\n if (relationsToInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: relationshipsTableName,\n values: relationsToInsert,\n })\n }\n\n // //////////////////////////////////\n // HANDLE RELATIONSHIP $push OPERATIONS\n // //////////////////////////////////\n\n if (rowToInsert.relationshipsToAppend.length > 0) {\n // Prepare all relationships for batch insert (order will be set after max query)\n const relationshipsToInsert = rowToInsert.relationshipsToAppend.map((rel) => {\n const parentId = id || insertedRow.id\n const row: Record<string, unknown> = {\n parent: parentId as number | string, // Use 'parent' key for Drizzle table\n path: rel.path,\n }\n\n // Only add locale if this relationship table has a locale column\n const relationshipTable = adapter.rawTables[relationshipsTableName]\n if (rel.locale && relationshipTable && relationshipTable.columns.locale) {\n row.locale = rel.locale\n }\n\n if (rel.relationTo) {\n // Use camelCase key for Drizzle table (e.g., categoriesID not categories_id)\n row[`${rel.relationTo}ID`] = rel.value\n }\n\n return row\n })\n\n if (relationshipsToInsert.length > 0) {\n // Check for potential duplicates\n const relationshipTable = adapter.tables[relationshipsTableName]\n\n if (relationshipTable) {\n // Build conditions only if we have relationships to check\n if (relationshipsToInsert.length === 0) {\n return // No relationships to insert\n }\n\n const conditions = relationshipsToInsert.map((row: RelationshipRow) => {\n const parts = [\n eq(relationshipTable.parent, row.parent),\n eq(relationshipTable.path, row.path),\n ]\n\n // Add locale condition\n if (row.locale !== undefined && relationshipTable.locale) {\n parts.push(eq(relationshipTable.locale, row.locale))\n } else if (relationshipTable.locale) {\n parts.push(isNull(relationshipTable.locale))\n }\n\n // Add all relationship ID matches using schema fields\n for (const [key, value] of Object.entries(row)) {\n if (key.endsWith('ID') && value != null) {\n const column = relationshipTable[key]\n if (column && typeof column === 'object') {\n parts.push(eq(column, value))\n }\n }\n }\n\n return and(...parts)\n })\n\n // Get both existing relationships AND max order in a single query\n let existingRels: Record<string, unknown>[] = []\n let maxOrder = 0\n\n if (conditions.length > 0) {\n // Query for existing relationships\n existingRels = await (db as any)\n .select()\n .from(relationshipTable)\n .where(or(...conditions))\n }\n\n // Get max order for this parent across all paths in a single query\n const parentId = id || insertedRow.id\n const maxOrderResult = await (db as any)\n .select({ maxOrder: relationshipTable.order })\n .from(relationshipTable)\n .where(eq(relationshipTable.parent, parentId))\n .orderBy(desc(relationshipTable.order))\n .limit(1)\n\n if (maxOrderResult.length > 0 && maxOrderResult[0].maxOrder) {\n maxOrder = maxOrderResult[0].maxOrder\n }\n\n // Set order values for all relationships based on max order\n relationshipsToInsert.forEach((row, index) => {\n row.order = maxOrder + index + 1\n })\n\n // Filter out relationships that already exist\n const relationshipsToActuallyInsert = relationshipsToInsert.filter((newRow) => {\n return !existingRels.some((existingRow: Record<string, unknown>) => {\n // Check if this relationship already exists\n let matches = existingRow.parent === newRow.parent && existingRow.path === newRow.path\n\n if (newRow.locale !== undefined) {\n matches = matches && existingRow.locale === newRow.locale\n }\n\n // Check relationship value matches - convert to camelCase for comparison\n for (const key of Object.keys(newRow)) {\n if (key.endsWith('ID')) {\n // Now using camelCase keys\n matches = matches && existingRow[key] === newRow[key]\n }\n }\n\n return matches\n })\n })\n\n // Insert only non-duplicate relationships\n if (relationshipsToActuallyInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: relationshipsTableName,\n values: relationshipsToActuallyInsert,\n })\n }\n }\n }\n }\n\n // //////////////////////////////////\n // HANDLE RELATIONSHIP $remove OPERATIONS\n // //////////////////////////////////\n\n if (rowToInsert.relationshipsToDelete.some((rel) => 'itemToRemove' in rel)) {\n const relationshipTable = adapter.tables[relationshipsTableName]\n\n if (relationshipTable) {\n for (const relToDelete of rowToInsert.relationshipsToDelete) {\n if ('itemToRemove' in relToDelete && relToDelete.itemToRemove) {\n const item = relToDelete.itemToRemove\n const parentId = (id || insertedRow.id) as number | string\n\n const conditions = [\n eq(relationshipTable.parent, parentId),\n eq(relationshipTable.path, relToDelete.path),\n ]\n\n // Add locale condition if this relationship table has a locale column\n if (adapter.rawTables[relationshipsTableName]?.columns.locale) {\n if (relToDelete.locale) {\n conditions.push(eq(relationshipTable.locale, relToDelete.locale))\n } else {\n conditions.push(isNull(relationshipTable.locale))\n }\n }\n\n // Handle polymorphic vs simple relationships\n if (typeof item === 'object' && 'relationTo' in item) {\n // Polymorphic relationship - convert to camelCase key\n const camelKey = `${item.relationTo}ID`\n if (relationshipTable[camelKey]) {\n conditions.push(eq(relationshipTable[camelKey], item.value))\n }\n } else if (relToDelete.relationTo) {\n // Simple relationship - convert to camelCase key\n const camelKey = `${relToDelete.relationTo}ID`\n if (relationshipTable[camelKey]) {\n conditions.push(eq(relationshipTable[camelKey], item))\n }\n }\n\n // Execute DELETE using Drizzle query builder\n await adapter.deleteWhere({\n db,\n tableName: relationshipsTableName,\n where: and(...conditions),\n })\n }\n }\n }\n }\n\n // //////////////////////////////////\n // INSERT hasMany TEXTS\n // //////////////////////////////////\n\n const textsTableName = `${tableName}_texts`\n\n if (operation === 'update') {\n await deleteExistingRowsByPath({\n adapter,\n db,\n localeColumnName: 'locale',\n parentColumnName: 'parent',\n parentID: insertedRow.id,\n pathColumnName: 'path',\n rows: [...textsToInsert, ...rowToInsert.textsToDelete],\n tableName: textsTableName,\n })\n }\n\n if (textsToInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: textsTableName,\n values: textsToInsert,\n })\n }\n\n // //////////////////////////////////\n // INSERT hasMany NUMBERS\n // //////////////////////////////////\n\n const numbersTableName = `${tableName}_numbers`\n\n if (operation === 'update') {\n await deleteExistingRowsByPath({\n adapter,\n db,\n localeColumnName: 'locale',\n parentColumnName: 'parent',\n parentID: insertedRow.id,\n pathColumnName: 'path',\n rows: [...numbersToInsert, ...rowToInsert.numbersToDelete],\n tableName: numbersTableName,\n })\n }\n\n if (numbersToInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: numbersTableName,\n values: numbersToInsert,\n })\n }\n\n // //////////////////////////////////\n // INSERT BLOCKS\n // //////////////////////////////////\n\n const insertedBlockRows: Record<string, Record<string, unknown>[]> = {}\n\n if (operation === 'update') {\n for (const tableName of rowToInsert.blocksToDelete) {\n const blockTable = adapter.tables[tableName]\n await adapter.deleteWhere({\n db,\n tableName,\n where: eq(blockTable._parentID, insertedRow.id),\n })\n }\n }\n\n // When versions are enabled, adapter is used to track mapping between blocks/arrays ObjectID to their numeric generated representation, then we use it for nested to arrays/blocks select hasMany in versions.\n const arraysBlocksUUIDMap: Record<string, number | string> = {}\n\n for (const [tableName, blockRows] of Object.entries(blocksToInsert)) {\n insertedBlockRows[tableName] = await adapter.insert({\n db,\n tableName,\n values: blockRows.map(({ row }) => row),\n })\n\n insertedBlockRows[tableName].forEach((row, i) => {\n blockRows[i].row = row\n if (\n typeof row._uuid === 'string' &&\n (typeof row.id === 'string' || typeof row.id === 'number')\n ) {\n arraysBlocksUUIDMap[row._uuid] = row.id\n }\n })\n\n const blockLocaleIndexMap: number[] = []\n\n const blockLocaleRowsToInsert = blockRows.reduce((acc, blockRow, i) => {\n if (Object.entries(blockRow.locales).length > 0) {\n Object.entries(blockRow.locales).forEach(([blockLocale, blockLocaleData]) => {\n if (Object.keys(blockLocaleData).length > 0) {\n blockLocaleData._parentID = blockRow.row.id\n blockLocaleData._locale = blockLocale\n acc.push(blockLocaleData)\n blockLocaleIndexMap.push(i)\n }\n })\n }\n\n return acc\n }, [])\n\n if (blockLocaleRowsToInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: `${tableName}${adapter.localesSuffix}`,\n values: blockLocaleRowsToInsert,\n })\n }\n\n await insertArrays({\n adapter,\n arrays: blockRows.map(({ arrays }) => arrays),\n db,\n parentRows: insertedBlockRows[tableName],\n uuidMap: arraysBlocksUUIDMap,\n })\n }\n\n // //////////////////////////////////\n // INSERT ARRAYS RECURSIVELY\n // //////////////////////////////////\n\n if (operation === 'update') {\n for (const arrayTableName of Object.keys(rowToInsert.arrays)) {\n await deleteExistingArrayRows({\n adapter,\n db,\n parentID: insertedRow.id,\n tableName: arrayTableName,\n })\n }\n }\n\n await insertArrays({\n adapter,\n arrays: [rowToInsert.arrays, rowToInsert.arraysToPush],\n db,\n parentRows: [insertedRow, insertedRow],\n uuidMap: arraysBlocksUUIDMap,\n })\n\n // //////////////////////////////////\n // INSERT hasMany SELECTS\n // //////////////////////////////////\n\n for (const [selectTableName, tableRows] of Object.entries(selectsToInsert)) {\n const selectTable = adapter.tables[selectTableName]\n if (operation === 'update') {\n await adapter.deleteWhere({\n db,\n tableName: selectTableName,\n where: eq(selectTable.parent, insertedRow.id),\n })\n }\n\n if (Object.keys(arraysBlocksUUIDMap).length > 0) {\n tableRows.forEach((row: RelationshipRow) => {\n if (row.parent in arraysBlocksUUIDMap) {\n row.parent = arraysBlocksUUIDMap[row.parent]\n }\n })\n }\n\n if (tableRows.length) {\n await adapter.insert({\n db,\n tableName: selectTableName,\n values: tableRows,\n })\n }\n }\n } catch (error) {\n handleUpsertError({ id, adapter, collectionSlug, error, globalSlug, req, tableName })\n }\n\n if (ignoreResult === 'idOnly') {\n return { id: insertedRow.id } as T\n }\n\n if (ignoreResult) {\n return data as T\n }\n\n // //////////////////////////////////\n // RETRIEVE NEWLY UPDATED ROW\n // //////////////////////////////////\n\n const findManyArgs = buildFindManyArgs({\n adapter,\n depth: 0,\n fields,\n joinQuery: false,\n select,\n tableName,\n })\n\n findManyArgs.where = eq(adapter.tables[tableName].id, insertedRow.id)\n\n const doc = await db.query[tableName].findFirst(findManyArgs)\n\n // //////////////////////////////////\n // TRANSFORM DATA\n // //////////////////////////////////\n\n const result = transform<T>({\n adapter,\n config: adapter.payload.config,\n data: doc,\n fields,\n joinQuery: false,\n tableName,\n })\n\n return result\n}\n"],"names":["and","desc","eq","isNull","or","buildFindManyArgs","transform","transformForWrite","markWrite","deleteExistingArrayRows","deleteExistingRowsByPath","handleUpsertError","insertArrays","shouldUseOptimizedUpsertRow","upsertRow","id","adapter","collectionSlug","data","db","fields","globalSlug","ignoreResult","customID","joinQuery","_joinQuery","operation","path","req","select","tableName","upsertTarget","where","createdAt","Date","toISOString","insertedRow","transformedForWrite","enableAtomicWrites","row","arraysToPush","drizzle","Object","keys","length","arrays","parentRows","uuidMap","updatedAt","hasDataToUpdate","update","tables","set","findManyArgs","depth","findManyKeysLength","hasOnlyColumns","columns","doc","query","findFirst","config","payload","selectedFields","column","enabled","entries","docs","returning","undefined","error","rowToInsert","target","rowKeys","hasLocalizedData","locales","hasMainRowData","every","key","insert","onConflictDoUpdate","values","allowIDOnCreate","localesToInsert","relationsToInsert","textsToInsert","numbersToInsert","blocksToInsert","selectsToInsert","forEach","locale","localeRow","_parentID","_locale","push","relationships","relation","parent","texts","textRow","numbers","numberRow","selects","selectTableName","selectRows","blocks","blockRow","uuid","localeTableName","localesSuffix","localeTable","deleteWhere","relationshipsTableName","relationshipsSuffix","generalRelationshipDeletes","relationshipsToDelete","filter","rel","localeColumnName","parentColumnName","parentID","pathColumnName","rows","relationshipsToAppend","relationshipsToInsert","map","parentId","relationshipTable","rawTables","relationTo","value","conditions","parts","endsWith","existingRels","maxOrder","from","maxOrderResult","order","orderBy","limit","index","relationshipsToActuallyInsert","newRow","some","existingRow","matches","relToDelete","itemToRemove","item","camelKey","textsTableName","textsToDelete","numbersTableName","numbersToDelete","insertedBlockRows","blocksToDelete","blockTable","arraysBlocksUUIDMap","blockRows","i","_uuid","blockLocaleIndexMap","blockLocaleRowsToInsert","reduce","acc","blockLocale","blockLocaleData","arrayTableName","tableRows","selectTable","result"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/drizzle",
3
- "version": "4.0.0-internal.5d5a2b2",
3
+ "version": "4.0.0-internal.688c4d0",
4
4
  "description": "A library of shared functions used by different payload database adapters",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "repository": {
@@ -55,10 +55,10 @@
55
55
  "@types/pg": "8.20.0",
56
56
  "@types/to-snake-case": "1.0.0",
57
57
  "@payloadcms/eslint-config": "3.28.0",
58
- "payload": "4.0.0-internal.5d5a2b2"
58
+ "payload": "4.0.0-internal.688c4d0"
59
59
  },
60
60
  "peerDependencies": {
61
- "payload": "4.0.0-internal.5d5a2b2"
61
+ "payload": "4.0.0-internal.688c4d0"
62
62
  },
63
63
  "scripts": {
64
64
  "build": "pnpm build:swc && pnpm build:types",