@payloadcms/drizzle 3.48.0-canary.5 → 3.48.0-canary.6

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 (47) hide show
  1. package/dist/findDistinct.d.ts +3 -0
  2. package/dist/findDistinct.d.ts.map +1 -0
  3. package/dist/findDistinct.js +94 -0
  4. package/dist/findDistinct.js.map +1 -0
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/postgres/countDistinct.js +3 -3
  10. package/dist/postgres/countDistinct.js.map +1 -1
  11. package/dist/postgres/types.d.ts +2 -0
  12. package/dist/postgres/types.d.ts.map +1 -1
  13. package/dist/postgres/types.js.map +1 -1
  14. package/dist/queries/parseParams.d.ts.map +1 -1
  15. package/dist/queries/parseParams.js +6 -1
  16. package/dist/queries/parseParams.js.map +1 -1
  17. package/dist/queries/selectDistinct.d.ts +2 -1
  18. package/dist/queries/selectDistinct.d.ts.map +1 -1
  19. package/dist/queries/selectDistinct.js +2 -2
  20. package/dist/queries/selectDistinct.js.map +1 -1
  21. package/dist/transform/write/index.d.ts +2 -1
  22. package/dist/transform/write/index.d.ts.map +1 -1
  23. package/dist/transform/write/index.js +2 -1
  24. package/dist/transform/write/index.js.map +1 -1
  25. package/dist/transform/write/traverseFields.d.ts +3 -2
  26. package/dist/transform/write/traverseFields.d.ts.map +1 -1
  27. package/dist/transform/write/traverseFields.js +9 -1
  28. package/dist/transform/write/traverseFields.js.map +1 -1
  29. package/dist/types.d.ts +1 -0
  30. package/dist/types.d.ts.map +1 -1
  31. package/dist/types.js.map +1 -1
  32. package/dist/updateOne.d.ts.map +1 -1
  33. package/dist/updateOne.js +8 -73
  34. package/dist/updateOne.js.map +1 -1
  35. package/dist/upsertRow/index.d.ts +1 -1
  36. package/dist/upsertRow/index.d.ts.map +1 -1
  37. package/dist/upsertRow/index.js +354 -334
  38. package/dist/upsertRow/index.js.map +1 -1
  39. package/dist/upsertRow/shouldUseOptimizedUpsertRow.d.ts +10 -0
  40. package/dist/upsertRow/shouldUseOptimizedUpsertRow.d.ts.map +1 -0
  41. package/dist/upsertRow/shouldUseOptimizedUpsertRow.js +24 -0
  42. package/dist/upsertRow/shouldUseOptimizedUpsertRow.js.map +1 -0
  43. package/dist/utilities/rawConstraint.d.ts +1 -0
  44. package/dist/utilities/rawConstraint.d.ts.map +1 -1
  45. package/dist/utilities/rawConstraint.js +1 -0
  46. package/dist/utilities/rawConstraint.js.map +1 -1
  47. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/upsertRow/index.ts"],"sourcesContent":["import type { TypeWithID } from 'payload'\n\nimport { eq } from 'drizzle-orm'\nimport { ValidationError } from 'payload'\n\nimport type { BlockRowToInsert } from '../transform/write/types.js'\nimport type { Args } from './types.js'\n\nimport { buildFindManyArgs } from '../find/buildFindManyArgs.js'\nimport { transform } from '../transform/read/index.js'\nimport { transformForWrite } from '../transform/write/index.js'\nimport { deleteExistingArrayRows } from './deleteExistingArrayRows.js'\nimport { deleteExistingRowsByPath } from './deleteExistingRowsByPath.js'\nimport { insertArrays } from './insertArrays.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 * This 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 data,\n db,\n fields,\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 joinQuery: _joinQuery,\n operation,\n path = '',\n req,\n select,\n tableName,\n upsertTarget,\n where,\n}: Args): Promise<T> => {\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 fields,\n path,\n tableName,\n })\n\n // First, we insert the main row\n let insertedRow: Record<string, unknown>\n\n try {\n if (operation === 'update') {\n const target = upsertTarget || adapter.tables[tableName].id\n\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 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 await deleteExistingRowsByPath({\n adapter,\n db,\n localeColumnName: 'locale',\n parentColumnName: 'parent',\n parentID: insertedRow.id,\n pathColumnName: 'path',\n rows: [...relationsToInsert, ...rowToInsert.relationshipsToDelete],\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 // 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, this 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],\n db,\n parentRows: [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: any) => {\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\n // //////////////////////////////////\n // Error Handling\n // //////////////////////////////////\n } catch (caughtError) {\n // Unique constraint violation error\n // '23505' is the code for PostgreSQL, and 'SQLITE_CONSTRAINT_UNIQUE' is for SQLite\n\n let error = caughtError\n if (typeof caughtError === 'object' && 'cause' in caughtError) {\n error = caughtError.cause\n }\n\n if (error.code === '23505' || error.code === 'SQLITE_CONSTRAINT_UNIQUE') {\n let fieldName: null | string = null\n // We need to try and find the right constraint for the field but if we can't we fallback to a generic message\n if (error.code === '23505') {\n // For PostgreSQL, we can try to extract the field name from the error constraint\n if (adapter.fieldConstraints?.[tableName]?.[error.constraint]) {\n fieldName = adapter.fieldConstraints[tableName]?.[error.constraint]\n } else {\n const replacement = `${tableName}_`\n\n if (error.constraint.includes(replacement)) {\n const replacedConstraint = error.constraint.replace(replacement, '')\n\n if (replacedConstraint && adapter.fieldConstraints[tableName]?.[replacedConstraint]) {\n fieldName = adapter.fieldConstraints[tableName][replacedConstraint]\n }\n }\n }\n\n if (!fieldName) {\n // Last case scenario we extract the key and value from the detail on the error\n const detail = error.detail\n const regex = /Key \\(([^)]+)\\)=\\(([^)]+)\\)/\n const match: string[] = detail.match(regex)\n\n if (match && match[1]) {\n const key = match[1]\n\n fieldName = key\n }\n }\n } else if (error.code === 'SQLITE_CONSTRAINT_UNIQUE') {\n /**\n * For SQLite, we can try to extract the field name from the error message\n * The message typically looks like:\n * \"UNIQUE constraint failed: table_name.field_name\"\n */\n const regex = /UNIQUE constraint failed: ([^.]+)\\.([^.]+)/\n const match: string[] = error.message.match(regex)\n\n if (match && match[2]) {\n if (adapter.fieldConstraints[tableName]) {\n fieldName = adapter.fieldConstraints[tableName][`${match[2]}_idx`]\n }\n\n if (!fieldName) {\n fieldName = match[2]\n }\n }\n }\n\n throw new ValidationError(\n {\n id,\n errors: [\n {\n message: req?.t ? req.t('error:valueMustBeUnique') : 'Value must be unique',\n path: fieldName,\n },\n ],\n req,\n },\n req?.t,\n )\n } else {\n throw error\n }\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":["eq","ValidationError","buildFindManyArgs","transform","transformForWrite","deleteExistingArrayRows","deleteExistingRowsByPath","insertArrays","upsertRow","id","adapter","data","db","fields","ignoreResult","joinQuery","_joinQuery","operation","path","req","select","tableName","upsertTarget","where","rowToInsert","insertedRow","target","tables","row","insert","onConflictDoUpdate","set","values","allowIDOnCreate","localesToInsert","relationsToInsert","textsToInsert","numbersToInsert","blocksToInsert","selectsToInsert","Object","keys","locales","length","entries","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","localeColumnName","parentColumnName","parentID","pathColumnName","rows","relationshipsToDelete","textsTableName","textsToDelete","numbersTableName","numbersToDelete","insertedBlockRows","blocksToDelete","blockTable","arraysBlocksUUIDMap","blockRows","map","i","_uuid","blockLocaleIndexMap","blockLocaleRowsToInsert","reduce","acc","blockLocale","blockLocaleData","arrays","parentRows","uuidMap","arrayTableName","tableRows","selectTable","caughtError","error","cause","code","fieldName","fieldConstraints","constraint","replacement","includes","replacedConstraint","replace","detail","regex","match","key","message","errors","t","findManyArgs","depth","doc","query","findFirst","result","config","payload"],"mappings":"AAEA,SAASA,EAAE,QAAQ,cAAa;AAChC,SAASC,eAAe,QAAQ,UAAS;AAKzC,SAASC,iBAAiB,QAAQ,+BAA8B;AAChE,SAASC,SAAS,QAAQ,6BAA4B;AACtD,SAASC,iBAAiB,QAAQ,8BAA6B;AAC/D,SAASC,uBAAuB,QAAQ,+BAA8B;AACtE,SAASC,wBAAwB,QAAQ,gCAA+B;AACxE,SAASC,YAAY,QAAQ,oBAAmB;AAEhD;;;;;;CAMC,GACD,OAAO,MAAMC,YAAY,OAAuD,EAC9EC,EAAE,EACFC,OAAO,EACPC,IAAI,EACJC,EAAE,EACFC,MAAM,EACNC,YAAY,EACZ,QAAQ;AACR,4GAA4G;AAC5G,8EAA8E;AAC9EC,WAAWC,UAAU,EACrBC,SAAS,EACTC,OAAO,EAAE,EACTC,GAAG,EACHC,MAAM,EACNC,SAAS,EACTC,YAAY,EACZC,KAAK,EACA;IACL,sDAAsD;IACtD,uDAAuD;IACvD,MAAMC,cAAcpB,kBAAkB;QACpCM;QACAC;QACAE;QACAK;QACAG;IACF;IAEA,gCAAgC;IAChC,IAAII;IAEJ,IAAI;QACF,IAAIR,cAAc,UAAU;YAC1B,MAAMS,SAASJ,gBAAgBZ,QAAQiB,MAAM,CAACN,UAAU,CAACZ,EAAE;YAE3D,IAAIA,IAAI;gBACNe,YAAYI,GAAG,CAACnB,EAAE,GAAGA;gBACpB,CAACgB,YAAY,GAAG,MAAMf,QAAQmB,MAAM,CAAC;oBACpCjB;oBACAkB,oBAAoB;wBAAEC,KAAKP,YAAYI,GAAG;wBAAEF;oBAAO;oBACnDL;oBACAW,QAAQR,YAAYI,GAAG;gBACzB;YACF,OAAO;;gBACJ,CAACH,YAAY,GAAG,MAAMf,QAAQmB,MAAM,CAAC;oBACpCjB;oBACAkB,oBAAoB;wBAAEC,KAAKP,YAAYI,GAAG;wBAAEF;wBAAQH;oBAAM;oBAC1DF;oBACAW,QAAQR,YAAYI,GAAG;gBACzB;YACF;QACF,OAAO;YACL,IAAIlB,QAAQuB,eAAe,IAAItB,KAAKF,EAAE,EAAE;gBACtCe,YAAYI,GAAG,CAACnB,EAAE,GAAGE,KAAKF,EAAE;YAC9B;;YACC,CAACgB,YAAY,GAAG,MAAMf,QAAQmB,MAAM,CAAC;gBACpCjB;gBACAS;gBACAW,QAAQR,YAAYI,GAAG;YACzB;QACF;QAEA,MAAMM,kBAA6C,EAAE;QACrD,MAAMC,oBAA+C,EAAE;QACvD,MAAMC,gBAA2C,EAAE;QACnD,MAAMC,kBAA6C,EAAE;QACrD,MAAMC,iBAA8D,CAAC;QACrE,MAAMC,kBAA4E,CAAC;QAEnF,wEAAwE;QACxE,IAAIC,OAAOC,IAAI,CAACjB,YAAYkB,OAAO,EAAEC,MAAM,GAAG,GAAG;YAC/CH,OAAOI,OAAO,CAACpB,YAAYkB,OAAO,EAAEG,OAAO,CAAC,CAAC,CAACC,QAAQC,UAAU;gBAC9DA,UAAUC,SAAS,GAAGvB,YAAYhB,EAAE;gBACpCsC,UAAUE,OAAO,GAAGH;gBACpBZ,gBAAgBgB,IAAI,CAACH;YACvB;QACF;QAEA,iDAAiD;QACjD,IAAIvB,YAAY2B,aAAa,CAACR,MAAM,GAAG,GAAG;YACxCnB,YAAY2B,aAAa,CAACN,OAAO,CAAC,CAACO;gBACjCA,SAASC,MAAM,GAAG5B,YAAYhB,EAAE;gBAChC0B,kBAAkBe,IAAI,CAACE;YACzB;QACF;QAEA,yCAAyC;QACzC,IAAI5B,YAAY8B,KAAK,CAACX,MAAM,GAAG,GAAG;YAChCnB,YAAY8B,KAAK,CAACT,OAAO,CAAC,CAACU;gBACzBA,QAAQF,MAAM,GAAG5B,YAAYhB,EAAE;gBAC/B2B,cAAcc,IAAI,CAACK;YACrB;QACF;QAEA,2CAA2C;QAC3C,IAAI/B,YAAYgC,OAAO,CAACb,MAAM,GAAG,GAAG;YAClCnB,YAAYgC,OAAO,CAACX,OAAO,CAAC,CAACY;gBAC3BA,UAAUJ,MAAM,GAAG5B,YAAYhB,EAAE;gBACjC4B,gBAAgBa,IAAI,CAACO;YACvB;QACF;QAEA,qDAAqD;QACrD,+BAA+B;QAC/B,IAAIjB,OAAOC,IAAI,CAACjB,YAAYkC,OAAO,EAAEf,MAAM,GAAG,GAAG;YAC/CH,OAAOI,OAAO,CAACpB,YAAYkC,OAAO,EAAEb,OAAO,CAAC,CAAC,CAACc,iBAAiBC,WAAW;gBACxErB,eAAe,CAACoB,gBAAgB,GAAG,EAAE;gBAErCC,WAAWf,OAAO,CAAC,CAACjB;oBAClB,IAAI,OAAOA,IAAIyB,MAAM,KAAK,aAAa;wBACrCzB,IAAIyB,MAAM,GAAG5B,YAAYhB,EAAE;oBAC7B;oBAEA8B,eAAe,CAACoB,gBAAgB,CAACT,IAAI,CAACtB;gBACxC;YACF;QACF;QAEA,oDAAoD;QACpD,+BAA+B;QAC/BY,OAAOC,IAAI,CAACjB,YAAYqC,MAAM,EAAEhB,OAAO,CAAC,CAACxB;YACvCG,YAAYqC,MAAM,CAACxC,UAAU,CAACwB,OAAO,CAAC,CAACiB;gBACrCA,SAASlC,GAAG,CAACoB,SAAS,GAAGvB,YAAYhB,EAAE;gBACvC,IAAI,CAAC6B,cAAc,CAACjB,UAAU,EAAE;oBAC9BiB,cAAc,CAACjB,UAAU,GAAG,EAAE;gBAChC;gBACA,IAAIyC,SAASlC,GAAG,CAACmC,IAAI,EAAE;oBACrB,OAAOD,SAASlC,GAAG,CAACmC,IAAI;gBAC1B;gBACAzB,cAAc,CAACjB,UAAU,CAAC6B,IAAI,CAACY;YACjC;QACF;QAEA,qCAAqC;QACrC,iBAAiB;QACjB,qCAAqC;QAErC,IAAI5B,gBAAgBS,MAAM,GAAG,GAAG;YAC9B,MAAMqB,kBAAkB,GAAG3C,YAAYX,QAAQuD,aAAa,EAAE;YAC9D,MAAMC,cAAcxD,QAAQiB,MAAM,CAAC,GAAGN,YAAYX,QAAQuD,aAAa,EAAE,CAAC;YAE1E,IAAIhD,cAAc,UAAU;gBAC1B,MAAMP,QAAQyD,WAAW,CAAC;oBACxBvD;oBACAS,WAAW2C;oBACXzC,OAAOvB,GAAGkE,YAAYlB,SAAS,EAAEvB,YAAYhB,EAAE;gBACjD;YACF;YAEA,MAAMC,QAAQmB,MAAM,CAAC;gBACnBjB;gBACAS,WAAW2C;gBACXhC,QAAQE;YACV;QACF;QAEA,qCAAqC;QACrC,uBAAuB;QACvB,qCAAqC;QAErC,MAAMkC,yBAAyB,GAAG/C,YAAYX,QAAQ2D,mBAAmB,EAAE;QAE3E,IAAIpD,cAAc,UAAU;YAC1B,MAAMX,yBAAyB;gBAC7BI;gBACAE;gBACA0D,kBAAkB;gBAClBC,kBAAkB;gBAClBC,UAAU/C,YAAYhB,EAAE;gBACxBgE,gBAAgB;gBAChBC,MAAM;uBAAIvC;uBAAsBX,YAAYmD,qBAAqB;iBAAC;gBAClEtD,WAAW+C;YACb;QACF;QAEA,IAAIjC,kBAAkBQ,MAAM,GAAG,GAAG;YAChC,MAAMjC,QAAQmB,MAAM,CAAC;gBACnBjB;gBACAS,WAAW+C;gBACXpC,QAAQG;YACV;QACF;QAEA,qCAAqC;QACrC,uBAAuB;QACvB,qCAAqC;QAErC,MAAMyC,iBAAiB,GAAGvD,UAAU,MAAM,CAAC;QAE3C,IAAIJ,cAAc,UAAU;YAC1B,MAAMX,yBAAyB;gBAC7BI;gBACAE;gBACA0D,kBAAkB;gBAClBC,kBAAkB;gBAClBC,UAAU/C,YAAYhB,EAAE;gBACxBgE,gBAAgB;gBAChBC,MAAM;uBAAItC;uBAAkBZ,YAAYqD,aAAa;iBAAC;gBACtDxD,WAAWuD;YACb;QACF;QAEA,IAAIxC,cAAcO,MAAM,GAAG,GAAG;YAC5B,MAAMjC,QAAQmB,MAAM,CAAC;gBACnBjB;gBACAS,WAAWuD;gBACX5C,QAAQI;YACV;QACF;QAEA,qCAAqC;QACrC,yBAAyB;QACzB,qCAAqC;QAErC,MAAM0C,mBAAmB,GAAGzD,UAAU,QAAQ,CAAC;QAE/C,IAAIJ,cAAc,UAAU;YAC1B,MAAMX,yBAAyB;gBAC7BI;gBACAE;gBACA0D,kBAAkB;gBAClBC,kBAAkB;gBAClBC,UAAU/C,YAAYhB,EAAE;gBACxBgE,gBAAgB;gBAChBC,MAAM;uBAAIrC;uBAAoBb,YAAYuD,eAAe;iBAAC;gBAC1D1D,WAAWyD;YACb;QACF;QAEA,IAAIzC,gBAAgBM,MAAM,GAAG,GAAG;YAC9B,MAAMjC,QAAQmB,MAAM,CAAC;gBACnBjB;gBACAS,WAAWyD;gBACX9C,QAAQK;YACV;QACF;QAEA,qCAAqC;QACrC,gBAAgB;QAChB,qCAAqC;QAErC,MAAM2C,oBAA+D,CAAC;QAEtE,IAAI/D,cAAc,UAAU;YAC1B,KAAK,MAAMI,aAAaG,YAAYyD,cAAc,CAAE;gBAClD,MAAMC,aAAaxE,QAAQiB,MAAM,CAACN,UAAU;gBAC5C,MAAMX,QAAQyD,WAAW,CAAC;oBACxBvD;oBACAS;oBACAE,OAAOvB,GAAGkF,WAAWlC,SAAS,EAAEvB,YAAYhB,EAAE;gBAChD;YACF;QACF;QAEA,4MAA4M;QAC5M,MAAM0E,sBAAuD,CAAC;QAE9D,KAAK,MAAM,CAAC9D,WAAW+D,UAAU,IAAI5C,OAAOI,OAAO,CAACN,gBAAiB;YACnE0C,iBAAiB,CAAC3D,UAAU,GAAG,MAAMX,QAAQmB,MAAM,CAAC;gBAClDjB;gBACAS;gBACAW,QAAQoD,UAAUC,GAAG,CAAC,CAAC,EAAEzD,GAAG,EAAE,GAAKA;YACrC;YAEAoD,iBAAiB,CAAC3D,UAAU,CAACwB,OAAO,CAAC,CAACjB,KAAK0D;gBACzCF,SAAS,CAACE,EAAE,CAAC1D,GAAG,GAAGA;gBACnB,IACE,OAAOA,IAAI2D,KAAK,KAAK,YACpB,CAAA,OAAO3D,IAAInB,EAAE,KAAK,YAAY,OAAOmB,IAAInB,EAAE,KAAK,QAAO,GACxD;oBACA0E,mBAAmB,CAACvD,IAAI2D,KAAK,CAAC,GAAG3D,IAAInB,EAAE;gBACzC;YACF;YAEA,MAAM+E,sBAAgC,EAAE;YAExC,MAAMC,0BAA0BL,UAAUM,MAAM,CAAC,CAACC,KAAK7B,UAAUwB;gBAC/D,IAAI9C,OAAOI,OAAO,CAACkB,SAASpB,OAAO,EAAEC,MAAM,GAAG,GAAG;oBAC/CH,OAAOI,OAAO,CAACkB,SAASpB,OAAO,EAAEG,OAAO,CAAC,CAAC,CAAC+C,aAAaC,gBAAgB;wBACtE,IAAIrD,OAAOC,IAAI,CAACoD,iBAAiBlD,MAAM,GAAG,GAAG;4BAC3CkD,gBAAgB7C,SAAS,GAAGc,SAASlC,GAAG,CAACnB,EAAE;4BAC3CoF,gBAAgB5C,OAAO,GAAG2C;4BAC1BD,IAAIzC,IAAI,CAAC2C;4BACTL,oBAAoBtC,IAAI,CAACoC;wBAC3B;oBACF;gBACF;gBAEA,OAAOK;YACT,GAAG,EAAE;YAEL,IAAIF,wBAAwB9C,MAAM,GAAG,GAAG;gBACtC,MAAMjC,QAAQmB,MAAM,CAAC;oBACnBjB;oBACAS,WAAW,GAAGA,YAAYX,QAAQuD,aAAa,EAAE;oBACjDjC,QAAQyD;gBACV;YACF;YAEA,MAAMlF,aAAa;gBACjBG;gBACAoF,QAAQV,UAAUC,GAAG,CAAC,CAAC,EAAES,MAAM,EAAE,GAAKA;gBACtClF;gBACAmF,YAAYf,iBAAiB,CAAC3D,UAAU;gBACxC2E,SAASb;YACX;QACF;QAEA,qCAAqC;QACrC,4BAA4B;QAC5B,qCAAqC;QAErC,IAAIlE,cAAc,UAAU;YAC1B,KAAK,MAAMgF,kBAAkBzD,OAAOC,IAAI,CAACjB,YAAYsE,MAAM,EAAG;gBAC5D,MAAMzF,wBAAwB;oBAC5BK;oBACAE;oBACA4D,UAAU/C,YAAYhB,EAAE;oBACxBY,WAAW4E;gBACb;YACF;QACF;QAEA,MAAM1F,aAAa;YACjBG;YACAoF,QAAQ;gBAACtE,YAAYsE,MAAM;aAAC;YAC5BlF;YACAmF,YAAY;gBAACtE;aAAY;YACzBuE,SAASb;QACX;QAEA,qCAAqC;QACrC,yBAAyB;QACzB,qCAAqC;QAErC,KAAK,MAAM,CAACxB,iBAAiBuC,UAAU,IAAI1D,OAAOI,OAAO,CAACL,iBAAkB;YAC1E,MAAM4D,cAAczF,QAAQiB,MAAM,CAACgC,gBAAgB;YACnD,IAAI1C,cAAc,UAAU;gBAC1B,MAAMP,QAAQyD,WAAW,CAAC;oBACxBvD;oBACAS,WAAWsC;oBACXpC,OAAOvB,GAAGmG,YAAY9C,MAAM,EAAE5B,YAAYhB,EAAE;gBAC9C;YACF;YAEA,IAAI+B,OAAOC,IAAI,CAAC0C,qBAAqBxC,MAAM,GAAG,GAAG;gBAC/CuD,UAAUrD,OAAO,CAAC,CAACjB;oBACjB,IAAIA,IAAIyB,MAAM,IAAI8B,qBAAqB;wBACrCvD,IAAIyB,MAAM,GAAG8B,mBAAmB,CAACvD,IAAIyB,MAAM,CAAC;oBAC9C;gBACF;YACF;YAEA,IAAI6C,UAAUvD,MAAM,EAAE;gBACpB,MAAMjC,QAAQmB,MAAM,CAAC;oBACnBjB;oBACAS,WAAWsC;oBACX3B,QAAQkE;gBACV;YACF;QACF;IAEA,qCAAqC;IACrC,iBAAiB;IACjB,qCAAqC;IACvC,EAAE,OAAOE,aAAa;QACpB,oCAAoC;QACpC,mFAAmF;QAEnF,IAAIC,QAAQD;QACZ,IAAI,OAAOA,gBAAgB,YAAY,WAAWA,aAAa;YAC7DC,QAAQD,YAAYE,KAAK;QAC3B;QAEA,IAAID,MAAME,IAAI,KAAK,WAAWF,MAAME,IAAI,KAAK,4BAA4B;YACvE,IAAIC,YAA2B;YAC/B,8GAA8G;YAC9G,IAAIH,MAAME,IAAI,KAAK,SAAS;gBAC1B,iFAAiF;gBACjF,IAAI7F,QAAQ+F,gBAAgB,EAAE,CAACpF,UAAU,EAAE,CAACgF,MAAMK,UAAU,CAAC,EAAE;oBAC7DF,YAAY9F,QAAQ+F,gBAAgB,CAACpF,UAAU,EAAE,CAACgF,MAAMK,UAAU,CAAC;gBACrE,OAAO;oBACL,MAAMC,cAAc,GAAGtF,UAAU,CAAC,CAAC;oBAEnC,IAAIgF,MAAMK,UAAU,CAACE,QAAQ,CAACD,cAAc;wBAC1C,MAAME,qBAAqBR,MAAMK,UAAU,CAACI,OAAO,CAACH,aAAa;wBAEjE,IAAIE,sBAAsBnG,QAAQ+F,gBAAgB,CAACpF,UAAU,EAAE,CAACwF,mBAAmB,EAAE;4BACnFL,YAAY9F,QAAQ+F,gBAAgB,CAACpF,UAAU,CAACwF,mBAAmB;wBACrE;oBACF;gBACF;gBAEA,IAAI,CAACL,WAAW;oBACd,+EAA+E;oBAC/E,MAAMO,SAASV,MAAMU,MAAM;oBAC3B,MAAMC,QAAQ;oBACd,MAAMC,QAAkBF,OAAOE,KAAK,CAACD;oBAErC,IAAIC,SAASA,KAAK,CAAC,EAAE,EAAE;wBACrB,MAAMC,MAAMD,KAAK,CAAC,EAAE;wBAEpBT,YAAYU;oBACd;gBACF;YACF,OAAO,IAAIb,MAAME,IAAI,KAAK,4BAA4B;gBACpD;;;;SAIC,GACD,MAAMS,QAAQ;gBACd,MAAMC,QAAkBZ,MAAMc,OAAO,CAACF,KAAK,CAACD;gBAE5C,IAAIC,SAASA,KAAK,CAAC,EAAE,EAAE;oBACrB,IAAIvG,QAAQ+F,gBAAgB,CAACpF,UAAU,EAAE;wBACvCmF,YAAY9F,QAAQ+F,gBAAgB,CAACpF,UAAU,CAAC,GAAG4F,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;oBACpE;oBAEA,IAAI,CAACT,WAAW;wBACdA,YAAYS,KAAK,CAAC,EAAE;oBACtB;gBACF;YACF;YAEA,MAAM,IAAIhH,gBACR;gBACEQ;gBACA2G,QAAQ;oBACN;wBACED,SAAShG,KAAKkG,IAAIlG,IAAIkG,CAAC,CAAC,6BAA6B;wBACrDnG,MAAMsF;oBACR;iBACD;gBACDrF;YACF,GACAA,KAAKkG;QAET,OAAO;YACL,MAAMhB;QACR;IACF;IAEA,IAAIvF,iBAAiB,UAAU;QAC7B,OAAO;YAAEL,IAAIgB,YAAYhB,EAAE;QAAC;IAC9B;IAEA,IAAIK,cAAc;QAChB,OAAOH;IACT;IAEA,qCAAqC;IACrC,6BAA6B;IAC7B,qCAAqC;IAErC,MAAM2G,eAAepH,kBAAkB;QACrCQ;QACA6G,OAAO;QACP1G;QACAE,WAAW;QACXK;QACAC;IACF;IAEAiG,aAAa/F,KAAK,GAAGvB,GAAGU,QAAQiB,MAAM,CAACN,UAAU,CAACZ,EAAE,EAAEgB,YAAYhB,EAAE;IAEpE,MAAM+G,MAAM,MAAM5G,GAAG6G,KAAK,CAACpG,UAAU,CAACqG,SAAS,CAACJ;IAEhD,qCAAqC;IACrC,iBAAiB;IACjB,qCAAqC;IAErC,MAAMK,SAASxH,UAAa;QAC1BO;QACAkH,QAAQlH,QAAQmH,OAAO,CAACD,MAAM;QAC9BjH,MAAM6G;QACN3G;QACAE,WAAW;QACXM;IACF;IAEA,OAAOsG;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/upsertRow/index.ts"],"sourcesContent":["import type { LibSQLDatabase } from 'drizzle-orm/libsql'\nimport type { TypeWithID } from 'payload'\n\nimport { eq } from 'drizzle-orm'\nimport { ValidationError } from 'payload'\n\nimport type { BlockRowToInsert } from '../transform/write/types.js'\nimport type { Args } from './types.js'\n\nimport { buildFindManyArgs } from '../find/buildFindManyArgs.js'\nimport { transform } from '../transform/read/index.js'\nimport { transformForWrite } from '../transform/write/index.js'\nimport { deleteExistingArrayRows } from './deleteExistingArrayRows.js'\nimport { deleteExistingRowsByPath } from './deleteExistingRowsByPath.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 data,\n db,\n fields,\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 joinQuery: _joinQuery,\n operation,\n path = '',\n req,\n select,\n tableName,\n upsertTarget,\n where,\n}: Args): Promise<T> => {\n let insertedRow: Record<string, unknown> = { id }\n if (id && shouldUseOptimizedUpsertRow({ data, fields })) {\n const { row } = transformForWrite({\n adapter,\n data,\n enableAtomicWrites: true,\n fields,\n tableName,\n })\n\n const drizzle = db as LibSQLDatabase\n\n await drizzle\n .update(adapter.tables[tableName])\n .set(row)\n // TODO: we can skip fetching idToUpdate here with using the incoming where\n .where(eq(adapter.tables[tableName].id, id))\n } else {\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 // First, we insert the main row\n try {\n if (operation === 'update') {\n const target = upsertTarget || adapter.tables[tableName].id\n\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 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 await deleteExistingRowsByPath({\n adapter,\n db,\n localeColumnName: 'locale',\n parentColumnName: 'parent',\n parentID: insertedRow.id,\n pathColumnName: 'path',\n rows: [...relationsToInsert, ...rowToInsert.relationshipsToDelete],\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 // 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],\n db,\n parentRows: [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: any) => {\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\n // //////////////////////////////////\n // Error Handling\n // //////////////////////////////////\n } catch (caughtError) {\n // Unique constraint violation error\n // '23505' is the code for PostgreSQL, and 'SQLITE_CONSTRAINT_UNIQUE' is for SQLite\n\n let error = caughtError\n if (typeof caughtError === 'object' && 'cause' in caughtError) {\n error = caughtError.cause\n }\n\n if (error.code === '23505' || error.code === 'SQLITE_CONSTRAINT_UNIQUE') {\n let fieldName: null | string = null\n // We need to try and find the right constraint for the field but if we can't we fallback to a generic message\n if (error.code === '23505') {\n // For PostgreSQL, we can try to extract the field name from the error constraint\n if (adapter.fieldConstraints?.[tableName]?.[error.constraint]) {\n fieldName = adapter.fieldConstraints[tableName]?.[error.constraint]\n } else {\n const replacement = `${tableName}_`\n\n if (error.constraint.includes(replacement)) {\n const replacedConstraint = error.constraint.replace(replacement, '')\n\n if (replacedConstraint && adapter.fieldConstraints[tableName]?.[replacedConstraint]) {\n fieldName = adapter.fieldConstraints[tableName][replacedConstraint]\n }\n }\n }\n\n if (!fieldName) {\n // Last case scenario we extract the key and value from the detail on the error\n const detail = error.detail\n const regex = /Key \\(([^)]+)\\)=\\(([^)]+)\\)/\n const match: string[] = detail.match(regex)\n\n if (match && match[1]) {\n const key = match[1]\n\n fieldName = key\n }\n }\n } else if (error.code === 'SQLITE_CONSTRAINT_UNIQUE') {\n /**\n * For SQLite, we can try to extract the field name from the error message\n * The message typically looks like:\n * \"UNIQUE constraint failed: table_name.field_name\"\n */\n const regex = /UNIQUE constraint failed: ([^.]+)\\.([^.]+)/\n const match: string[] = error.message.match(regex)\n\n if (match && match[2]) {\n if (adapter.fieldConstraints[tableName]) {\n fieldName = adapter.fieldConstraints[tableName][`${match[2]}_idx`]\n }\n\n if (!fieldName) {\n fieldName = match[2]\n }\n }\n }\n\n throw new ValidationError(\n {\n id,\n errors: [\n {\n message: req?.t ? req.t('error:valueMustBeUnique') : 'Value must be unique',\n path: fieldName,\n },\n ],\n req,\n },\n req?.t,\n )\n } else {\n throw error\n }\n }\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":["eq","ValidationError","buildFindManyArgs","transform","transformForWrite","deleteExistingArrayRows","deleteExistingRowsByPath","insertArrays","shouldUseOptimizedUpsertRow","upsertRow","id","adapter","data","db","fields","ignoreResult","joinQuery","_joinQuery","operation","path","req","select","tableName","upsertTarget","where","insertedRow","row","enableAtomicWrites","drizzle","update","tables","set","rowToInsert","target","insert","onConflictDoUpdate","values","allowIDOnCreate","localesToInsert","relationsToInsert","textsToInsert","numbersToInsert","blocksToInsert","selectsToInsert","Object","keys","locales","length","entries","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","localeColumnName","parentColumnName","parentID","pathColumnName","rows","relationshipsToDelete","textsTableName","textsToDelete","numbersTableName","numbersToDelete","insertedBlockRows","blocksToDelete","blockTable","arraysBlocksUUIDMap","blockRows","map","i","_uuid","blockLocaleIndexMap","blockLocaleRowsToInsert","reduce","acc","blockLocale","blockLocaleData","arrays","parentRows","uuidMap","arrayTableName","tableRows","selectTable","caughtError","error","cause","code","fieldName","fieldConstraints","constraint","replacement","includes","replacedConstraint","replace","detail","regex","match","key","message","errors","t","findManyArgs","depth","doc","query","findFirst","result","config","payload"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { FlattenedField } from 'payload';
2
+ /**
3
+ * Checks whether we should use the upsertRow function for the passed data and otherwise use a simple SQL SET call.
4
+ * We need to use upsertRow only when the data has arrays, blocks, hasMany select/text/number, localized fields, complex relationships.
5
+ */
6
+ export declare const shouldUseOptimizedUpsertRow: ({ data, fields, }: {
7
+ data: Record<string, unknown>;
8
+ fields: FlattenedField[];
9
+ }) => boolean;
10
+ //# sourceMappingURL=shouldUseOptimizedUpsertRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shouldUseOptimizedUpsertRow.d.ts","sourceRoot":"","sources":["../../src/upsertRow/shouldUseOptimizedUpsertRow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C;;;GAGG;AACH,eAAO,MAAM,2BAA2B,sBAGrC;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,MAAM,EAAE,cAAc,EAAE,CAAA;CACzB,YAuCA,CAAA"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Checks whether we should use the upsertRow function for the passed data and otherwise use a simple SQL SET call.
3
+ * We need to use upsertRow only when the data has arrays, blocks, hasMany select/text/number, localized fields, complex relationships.
4
+ */ export const shouldUseOptimizedUpsertRow = ({ data, fields })=>{
5
+ for(const key in data){
6
+ const value = data[key];
7
+ const field = fields.find((each)=>each.name === key);
8
+ if (!field) {
9
+ continue;
10
+ }
11
+ if (field.type === 'array' || field.type === 'blocks' || (field.type === 'text' || field.type === 'relationship' || field.type === 'upload' || field.type === 'select' || field.type === 'number') && field.hasMany || (field.type === 'relationship' || field.type === 'upload') && Array.isArray(field.relationTo) || field.localized) {
12
+ return false;
13
+ }
14
+ if ((field.type === 'group' || field.type === 'tab') && value && typeof value === 'object' && !shouldUseOptimizedUpsertRow({
15
+ data: value,
16
+ fields: field.flattenedFields
17
+ })) {
18
+ return false;
19
+ }
20
+ }
21
+ return true;
22
+ };
23
+
24
+ //# sourceMappingURL=shouldUseOptimizedUpsertRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/upsertRow/shouldUseOptimizedUpsertRow.ts"],"sourcesContent":["import type { FlattenedField } from 'payload'\n\n/**\n * Checks whether we should use the upsertRow function for the passed data and otherwise use a simple SQL SET call.\n * We need to use upsertRow only when the data has arrays, blocks, hasMany select/text/number, localized fields, complex relationships.\n */\nexport const shouldUseOptimizedUpsertRow = ({\n data,\n fields,\n}: {\n data: Record<string, unknown>\n fields: FlattenedField[]\n}) => {\n for (const key in data) {\n const value = data[key]\n const field = fields.find((each) => each.name === key)\n\n if (!field) {\n continue\n }\n\n if (\n field.type === 'array' ||\n field.type === 'blocks' ||\n ((field.type === 'text' ||\n field.type === 'relationship' ||\n field.type === 'upload' ||\n field.type === 'select' ||\n field.type === 'number') &&\n field.hasMany) ||\n ((field.type === 'relationship' || field.type === 'upload') &&\n Array.isArray(field.relationTo)) ||\n field.localized\n ) {\n return false\n }\n\n if (\n (field.type === 'group' || field.type === 'tab') &&\n value &&\n typeof value === 'object' &&\n !shouldUseOptimizedUpsertRow({\n data: value as Record<string, unknown>,\n fields: field.flattenedFields,\n })\n ) {\n return false\n }\n }\n\n return true\n}\n"],"names":["shouldUseOptimizedUpsertRow","data","fields","key","value","field","find","each","name","type","hasMany","Array","isArray","relationTo","localized","flattenedFields"],"mappings":"AAEA;;;CAGC,GACD,OAAO,MAAMA,8BAA8B,CAAC,EAC1CC,IAAI,EACJC,MAAM,EAIP;IACC,IAAK,MAAMC,OAAOF,KAAM;QACtB,MAAMG,QAAQH,IAAI,CAACE,IAAI;QACvB,MAAME,QAAQH,OAAOI,IAAI,CAAC,CAACC,OAASA,KAAKC,IAAI,KAAKL;QAElD,IAAI,CAACE,OAAO;YACV;QACF;QAEA,IACEA,MAAMI,IAAI,KAAK,WACfJ,MAAMI,IAAI,KAAK,YACd,AAACJ,CAAAA,MAAMI,IAAI,KAAK,UACfJ,MAAMI,IAAI,KAAK,kBACfJ,MAAMI,IAAI,KAAK,YACfJ,MAAMI,IAAI,KAAK,YACfJ,MAAMI,IAAI,KAAK,QAAO,KACtBJ,MAAMK,OAAO,IACd,AAACL,CAAAA,MAAMI,IAAI,KAAK,kBAAkBJ,MAAMI,IAAI,KAAK,QAAO,KACvDE,MAAMC,OAAO,CAACP,MAAMQ,UAAU,KAChCR,MAAMS,SAAS,EACf;YACA,OAAO;QACT;QAEA,IACE,AAACT,CAAAA,MAAMI,IAAI,KAAK,WAAWJ,MAAMI,IAAI,KAAK,KAAI,KAC9CL,SACA,OAAOA,UAAU,YACjB,CAACJ,4BAA4B;YAC3BC,MAAMG;YACNF,QAAQG,MAAMU,eAAe;QAC/B,IACA;YACA,OAAO;QACT;IACF;IAEA,OAAO;AACT,EAAC"}
@@ -1,3 +1,4 @@
1
+ export declare const DistinctSymbol: unique symbol;
1
2
  /**
2
3
  * You can use this to inject a raw query to where
3
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"rawConstraint.d.ts","sourceRoot":"","sources":["../../src/utilities/rawConstraint.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,eAAO,MAAM,aAAa,UAAW,OAAO;;;CAG1C,CAAA;AAEF,eAAO,MAAM,eAAe,UAAW,OAAO,KAAG,KAAK,IAAI,UAAU,CAAC,OAAO,aAAa,CAExF,CAAA"}
1
+ {"version":3,"file":"rawConstraint.d.ts","sourceRoot":"","sources":["../../src/utilities/rawConstraint.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,eAA2B,CAAA;AAEtD;;GAEG;AACH,eAAO,MAAM,aAAa,UAAW,OAAO;;;CAG1C,CAAA;AAEF,eAAO,MAAM,eAAe,UAAW,OAAO,KAAG,KAAK,IAAI,UAAU,CAAC,OAAO,aAAa,CAExF,CAAA"}
@@ -1,4 +1,5 @@
1
1
  const RawConstraintSymbol = Symbol('RawConstraint');
2
+ export const DistinctSymbol = Symbol('DistinctSymbol');
2
3
  /**
3
4
  * You can use this to inject a raw query to where
4
5
  */ export const rawConstraint = (value)=>({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/rawConstraint.ts"],"sourcesContent":["const RawConstraintSymbol = Symbol('RawConstraint')\n\n/**\n * You can use this to inject a raw query to where\n */\nexport const rawConstraint = (value: unknown) => ({\n type: RawConstraintSymbol,\n value,\n})\n\nexport const isRawConstraint = (value: unknown): value is ReturnType<typeof rawConstraint> => {\n return value && typeof value === 'object' && 'type' in value && value.type === RawConstraintSymbol\n}\n"],"names":["RawConstraintSymbol","Symbol","rawConstraint","value","type","isRawConstraint"],"mappings":"AAAA,MAAMA,sBAAsBC,OAAO;AAEnC;;CAEC,GACD,OAAO,MAAMC,gBAAgB,CAACC,QAAoB,CAAA;QAChDC,MAAMJ;QACNG;IACF,CAAA,EAAE;AAEF,OAAO,MAAME,kBAAkB,CAACF;IAC9B,OAAOA,SAAS,OAAOA,UAAU,YAAY,UAAUA,SAASA,MAAMC,IAAI,KAAKJ;AACjF,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/rawConstraint.ts"],"sourcesContent":["const RawConstraintSymbol = Symbol('RawConstraint')\n\nexport const DistinctSymbol = Symbol('DistinctSymbol')\n\n/**\n * You can use this to inject a raw query to where\n */\nexport const rawConstraint = (value: unknown) => ({\n type: RawConstraintSymbol,\n value,\n})\n\nexport const isRawConstraint = (value: unknown): value is ReturnType<typeof rawConstraint> => {\n return value && typeof value === 'object' && 'type' in value && value.type === RawConstraintSymbol\n}\n"],"names":["RawConstraintSymbol","Symbol","DistinctSymbol","rawConstraint","value","type","isRawConstraint"],"mappings":"AAAA,MAAMA,sBAAsBC,OAAO;AAEnC,OAAO,MAAMC,iBAAiBD,OAAO,kBAAiB;AAEtD;;CAEC,GACD,OAAO,MAAME,gBAAgB,CAACC,QAAoB,CAAA;QAChDC,MAAML;QACNI;IACF,CAAA,EAAE;AAEF,OAAO,MAAME,kBAAkB,CAACF;IAC9B,OAAOA,SAAS,OAAOA,UAAU,YAAY,UAAUA,SAASA,MAAMC,IAAI,KAAKL;AACjF,EAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/drizzle",
3
- "version": "3.48.0-canary.5",
3
+ "version": "3.48.0-canary.6",
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.10.2",
56
56
  "@types/to-snake-case": "1.0.0",
57
57
  "@payloadcms/eslint-config": "3.28.0",
58
- "payload": "3.48.0-canary.5"
58
+ "payload": "3.48.0-canary.6"
59
59
  },
60
60
  "peerDependencies": {
61
- "payload": "3.48.0-canary.5"
61
+ "payload": "3.48.0-canary.6"
62
62
  },
63
63
  "scripts": {
64
64
  "build": "pnpm build:swc && pnpm build:types",