@payloadcms/drizzle 4.0.0-internal.934870d → 4.0.0-internal.952ed66

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 (199) hide show
  1. package/dist/count.d.ts.map +1 -1
  2. package/dist/count.js +25 -3
  3. package/dist/count.js.map +1 -1
  4. package/dist/countGlobalVersions.js +8 -3
  5. package/dist/countGlobalVersions.js.map +1 -1
  6. package/dist/countVersions.d.ts.map +1 -1
  7. package/dist/countVersions.js +29 -4
  8. package/dist/countVersions.js.map +1 -1
  9. package/dist/createGlobalVersion.d.ts.map +1 -1
  10. package/dist/createGlobalVersion.js +17 -2
  11. package/dist/createGlobalVersion.js.map +1 -1
  12. package/dist/createVersion.d.ts.map +1 -1
  13. package/dist/createVersion.js +12 -1
  14. package/dist/createVersion.js.map +1 -1
  15. package/dist/deleteBranchGlobal.d.ts +10 -0
  16. package/dist/deleteBranchGlobal.d.ts.map +1 -0
  17. package/dist/deleteBranchGlobal.js +27 -0
  18. package/dist/deleteBranchGlobal.js.map +1 -0
  19. package/dist/deleteOne.d.ts.map +1 -1
  20. package/dist/deleteOne.js +25 -1
  21. package/dist/deleteOne.js.map +1 -1
  22. package/dist/exports/postgres.d.ts +1 -1
  23. package/dist/exports/postgres.d.ts.map +1 -1
  24. package/dist/exports/postgres.js +1 -1
  25. package/dist/exports/postgres.js.map +1 -1
  26. package/dist/exports/sqlite.d.ts +1 -1
  27. package/dist/exports/sqlite.d.ts.map +1 -1
  28. package/dist/exports/sqlite.js +1 -1
  29. package/dist/exports/sqlite.js.map +1 -1
  30. package/dist/find/buildFindManyArgs.d.ts +3 -2
  31. package/dist/find/buildFindManyArgs.d.ts.map +1 -1
  32. package/dist/find/buildFindManyArgs.js +2 -1
  33. package/dist/find/buildFindManyArgs.js.map +1 -1
  34. package/dist/find/buildPolymorphicJoinQuery.d.ts +5 -3
  35. package/dist/find/buildPolymorphicJoinQuery.d.ts.map +1 -1
  36. package/dist/find/buildPolymorphicJoinQuery.js +43 -15
  37. package/dist/find/buildPolymorphicJoinQuery.js.map +1 -1
  38. package/dist/find/buildPolymorphicJoinWhere.js +1 -1
  39. package/dist/find/buildPolymorphicJoinWhere.js.map +1 -1
  40. package/dist/find/createPolymorphicJoinWherePlan.d.ts +2 -1
  41. package/dist/find/createPolymorphicJoinWherePlan.d.ts.map +1 -1
  42. package/dist/find/createPolymorphicJoinWherePlan.js +14 -5
  43. package/dist/find/createPolymorphicJoinWherePlan.js.map +1 -1
  44. package/dist/find/findMany.d.ts +6 -1
  45. package/dist/find/findMany.d.ts.map +1 -1
  46. package/dist/find/findMany.js +16 -3
  47. package/dist/find/findMany.js.map +1 -1
  48. package/dist/find/traverseFields.d.ts +3 -2
  49. package/dist/find/traverseFields.d.ts.map +1 -1
  50. package/dist/find/traverseFields.js +64 -8
  51. package/dist/find/traverseFields.js.map +1 -1
  52. package/dist/find.d.ts.map +1 -1
  53. package/dist/find.js +32 -4
  54. package/dist/find.js.map +1 -1
  55. package/dist/findDistinct.d.ts.map +1 -1
  56. package/dist/findDistinct.js +104 -8
  57. package/dist/findDistinct.js.map +1 -1
  58. package/dist/findGlobal.d.ts.map +1 -1
  59. package/dist/findGlobal.js +24 -5
  60. package/dist/findGlobal.js.map +1 -1
  61. package/dist/findGlobalVersions.js +8 -3
  62. package/dist/findGlobalVersions.js.map +1 -1
  63. package/dist/findOne.d.ts +1 -1
  64. package/dist/findOne.d.ts.map +1 -1
  65. package/dist/findOne.js +30 -3
  66. package/dist/findOne.js.map +1 -1
  67. package/dist/findVersions.d.ts.map +1 -1
  68. package/dist/findVersions.js +32 -5
  69. package/dist/findVersions.js.map +1 -1
  70. package/dist/index.d.ts +2 -0
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +2 -0
  73. package/dist/index.js.map +1 -1
  74. package/dist/postgres/insert.d.ts.map +1 -1
  75. package/dist/postgres/insert.js +4 -2
  76. package/dist/postgres/insert.js.map +1 -1
  77. package/dist/postgres/predefinedMigrations/v2-v3/index.js +1 -1
  78. package/dist/postgres/predefinedMigrations/v2-v3/index.js.map +1 -1
  79. package/dist/postgres/requireDrizzleKit.d.ts +4 -0
  80. package/dist/postgres/requireDrizzleKit.d.ts.map +1 -1
  81. package/dist/postgres/requireDrizzleKit.js +16 -10
  82. package/dist/postgres/requireDrizzleKit.js.map +1 -1
  83. package/dist/postgres/types.d.ts +4 -0
  84. package/dist/postgres/types.d.ts.map +1 -1
  85. package/dist/postgres/types.js.map +1 -1
  86. package/dist/queries/buildAndOrConditions.d.ts +3 -2
  87. package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
  88. package/dist/queries/buildAndOrConditions.js +2 -1
  89. package/dist/queries/buildAndOrConditions.js.map +1 -1
  90. package/dist/queries/buildBranchVisibility.d.ts +11 -0
  91. package/dist/queries/buildBranchVisibility.d.ts.map +1 -0
  92. package/dist/queries/buildBranchVisibility.js +48 -0
  93. package/dist/queries/buildBranchVisibility.js.map +1 -0
  94. package/dist/queries/buildOrderBy.d.ts +3 -2
  95. package/dist/queries/buildOrderBy.d.ts.map +1 -1
  96. package/dist/queries/buildOrderBy.js +2 -1
  97. package/dist/queries/buildOrderBy.js.map +1 -1
  98. package/dist/queries/buildQuery.d.ts +3 -2
  99. package/dist/queries/buildQuery.d.ts.map +1 -1
  100. package/dist/queries/buildQuery.js +4 -2
  101. package/dist/queries/buildQuery.js.map +1 -1
  102. package/dist/queries/getTableColumnFromPath.d.ts +3 -2
  103. package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
  104. package/dist/queries/getTableColumnFromPath.js +167 -29
  105. package/dist/queries/getTableColumnFromPath.js.map +1 -1
  106. package/dist/queries/parseParams.d.ts +3 -2
  107. package/dist/queries/parseParams.d.ts.map +1 -1
  108. package/dist/queries/parseParams.js +4 -1
  109. package/dist/queries/parseParams.js.map +1 -1
  110. package/dist/queryDrafts.d.ts.map +1 -1
  111. package/dist/queryDrafts.js +27 -5
  112. package/dist/queryDrafts.js.map +1 -1
  113. package/dist/schema/build.d.ts.map +1 -1
  114. package/dist/schema/build.js +28 -20
  115. package/dist/schema/build.js.map +1 -1
  116. package/dist/sqlite/createRequireDrizzleKit.d.ts +6 -0
  117. package/dist/sqlite/createRequireDrizzleKit.d.ts.map +1 -0
  118. package/dist/sqlite/createRequireDrizzleKit.js +15 -0
  119. package/dist/sqlite/createRequireDrizzleKit.js.map +1 -0
  120. package/dist/sqlite/execute.js.map +1 -1
  121. package/dist/sqlite/insert.d.ts.map +1 -1
  122. package/dist/sqlite/insert.js +5 -3
  123. package/dist/sqlite/insert.js.map +1 -1
  124. package/dist/sqlite/types.d.ts +4 -0
  125. package/dist/sqlite/types.d.ts.map +1 -1
  126. package/dist/sqlite/types.js.map +1 -1
  127. package/dist/transactions/beginTransaction.d.ts.map +1 -1
  128. package/dist/transactions/beginTransaction.js +13 -5
  129. package/dist/transactions/beginTransaction.js.map +1 -1
  130. package/dist/transactions/commitTransaction.d.ts.map +1 -1
  131. package/dist/transactions/commitTransaction.js +2 -5
  132. package/dist/transactions/commitTransaction.js.map +1 -1
  133. package/dist/transform/read/traverseFields.js.map +1 -1
  134. package/dist/transform/write/array.d.ts +3 -2
  135. package/dist/transform/write/array.d.ts.map +1 -1
  136. package/dist/transform/write/array.js +2 -1
  137. package/dist/transform/write/array.js.map +1 -1
  138. package/dist/transform/write/blocks.d.ts +3 -2
  139. package/dist/transform/write/blocks.d.ts.map +1 -1
  140. package/dist/transform/write/blocks.js +2 -1
  141. package/dist/transform/write/blocks.js.map +1 -1
  142. package/dist/transform/write/index.d.ts.map +1 -1
  143. package/dist/transform/write/index.js +2 -0
  144. package/dist/transform/write/index.js.map +1 -1
  145. package/dist/transform/write/traverseFields.d.ts +2 -1
  146. package/dist/transform/write/traverseFields.d.ts.map +1 -1
  147. package/dist/transform/write/traverseFields.js +43 -7
  148. package/dist/transform/write/traverseFields.js.map +1 -1
  149. package/dist/transform/write/types.d.ts +7 -0
  150. package/dist/transform/write/types.d.ts.map +1 -1
  151. package/dist/transform/write/types.js.map +1 -1
  152. package/dist/types.d.ts +3 -2
  153. package/dist/types.d.ts.map +1 -1
  154. package/dist/types.js.map +1 -1
  155. package/dist/updateGlobal.d.ts +5 -1
  156. package/dist/updateGlobal.d.ts.map +1 -1
  157. package/dist/updateGlobal.js +96 -4
  158. package/dist/updateGlobal.js.map +1 -1
  159. package/dist/updateOne.d.ts.map +1 -1
  160. package/dist/updateOne.js +54 -5
  161. package/dist/updateOne.js.map +1 -1
  162. package/dist/upsertBranchGlobalChange.d.ts +3 -0
  163. package/dist/upsertBranchGlobalChange.d.ts.map +1 -0
  164. package/dist/upsertBranchGlobalChange.js +35 -0
  165. package/dist/upsertBranchGlobalChange.js.map +1 -0
  166. package/dist/upsertRow/deleteExistingRowsByPath.d.ts.map +1 -1
  167. package/dist/upsertRow/deleteExistingRowsByPath.js +17 -12
  168. package/dist/upsertRow/deleteExistingRowsByPath.js.map +1 -1
  169. package/dist/upsertRow/index.d.ts +1 -1
  170. package/dist/upsertRow/index.d.ts.map +1 -1
  171. package/dist/upsertRow/index.js +132 -42
  172. package/dist/upsertRow/index.js.map +1 -1
  173. package/dist/upsertRow/types.d.ts +3 -0
  174. package/dist/upsertRow/types.d.ts.map +1 -1
  175. package/dist/upsertRow/types.js.map +1 -1
  176. package/dist/utilities/blocksToJsonMigrator.d.ts.map +1 -1
  177. package/dist/utilities/blocksToJsonMigrator.js +7 -18
  178. package/dist/utilities/blocksToJsonMigrator.js.map +1 -1
  179. package/dist/utilities/buildCreateMigration.js +1 -1
  180. package/dist/utilities/buildCreateMigration.js.map +1 -1
  181. package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.js +1 -1
  182. package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.js.map +1 -1
  183. package/dist/utilities/createSchemaGenerator.d.ts.map +1 -1
  184. package/dist/utilities/createSchemaGenerator.js +7 -12
  185. package/dist/utilities/createSchemaGenerator.js.map +1 -1
  186. package/dist/utilities/executeSchemaHooks.js +1 -1
  187. package/dist/utilities/executeSchemaHooks.js.map +1 -1
  188. package/dist/utilities/formatGeneratedFile.d.ts +10 -0
  189. package/dist/utilities/formatGeneratedFile.d.ts.map +1 -0
  190. package/dist/utilities/formatGeneratedFile.js +58 -0
  191. package/dist/utilities/formatGeneratedFile.js.map +1 -0
  192. package/dist/utilities/getTransaction.js.map +1 -1
  193. package/dist/utilities/pushDevSchema.js +1 -1
  194. package/dist/utilities/pushDevSchema.js.map +1 -1
  195. package/package.json +17 -19
  196. package/dist/sqlite/requireDrizzleKit.d.ts +0 -3
  197. package/dist/sqlite/requireDrizzleKit.d.ts.map +0 -1
  198. package/dist/sqlite/requireDrizzleKit.js +0 -12
  199. package/dist/sqlite/requireDrizzleKit.js.map +0 -1
@@ -7,5 +7,5 @@ import type { Args } from './types.js';
7
7
  *
8
8
  * adapter function replaces the entire row and does not support partial updates.
9
9
  */
10
- export declare const upsertRow: <T extends Record<string, unknown> | TypeWithID>({ id, adapter, collectionSlug, data, db, fields, globalSlug, ignoreResult, customID, joinQuery: _joinQuery, operation, path, req, select, tableName, upsertTarget, where, }: Args) => Promise<null | T>;
10
+ export declare const upsertRow: <T extends Record<string, unknown> | TypeWithID>({ id, adapter, collectionSlug, data, db, fields, globalSlug, ignoreResult, customID, joinQuery: _joinQuery, operation, path, req, select, tableName, upsertConflictData, upsertTarget, where, }: Args) => Promise<null | T>;
11
11
  //# sourceMappingURL=index.d.ts.map
@@ -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,+KAqB3E,IAAI,KAAG,OAAO,CAAC,IAAI,GAAG,CAAC,CA2uBzB,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;AAMzC,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,mMAsB3E,IAAI,KAAG,OAAO,CAAC,IAAI,GAAG,CAAC,CA01BzB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { and, desc, eq, isNull, or } from 'drizzle-orm';
2
+ import { branchField, MAIN_BRANCH } from 'payload';
2
3
  import { buildFindManyArgs } from '../find/buildFindManyArgs.js';
3
4
  import { transform } from '../transform/read/index.js';
4
5
  import { transformForWrite } from '../transform/write/index.js';
@@ -17,7 +18,7 @@ import { shouldUseOptimizedUpsertRow } from './shouldUseOptimizedUpsertRow.js';
17
18
  */ export const upsertRow = async ({ id, adapter, collectionSlug, data, db, fields, globalSlug, ignoreResult, // TODO:
18
19
  // When we support joins for write operations (create/update) - pass collectionSlug to the buildFindManyArgs
19
20
  // Make a new argument in upsertRow.ts and pass the slug from every operation.
20
- customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, upsertTarget, where })=>{
21
+ customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, upsertConflictData, upsertTarget, where })=>{
21
22
  if (operation === 'create' && !data.createdAt) {
22
23
  data.createdAt = new Date().toISOString();
23
24
  }
@@ -162,6 +163,16 @@ customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, u
162
163
  path,
163
164
  tableName
164
165
  });
166
+ const conflictWrite = upsertConflictData ? transformForWrite({
167
+ adapter,
168
+ data: upsertConflictData,
169
+ enableAtomicWrites: false,
170
+ fields,
171
+ path,
172
+ tableName
173
+ }) : rowToInsert;
174
+ let nestedWrite = rowToInsert;
175
+ let isUpdatingAfterInsertConflict = false;
165
176
  if (customID) {
166
177
  rowToInsert.row.id = customID;
167
178
  }
@@ -182,22 +193,58 @@ customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, u
182
193
  [insertedRow] = await adapter.insert({
183
194
  db,
184
195
  onConflictDoUpdate: where ? {
185
- set: rowToInsert.row,
196
+ set: conflictWrite.row,
186
197
  target,
187
198
  where
188
199
  } : {
189
- set: rowToInsert.row,
200
+ set: conflictWrite.row,
190
201
  target
191
202
  },
192
203
  tableName,
193
204
  values: rowToInsert.row
194
205
  });
206
+ } else if (upsertConflictData && upsertTarget) {
207
+ // The parent conflict is atomic. Child-table replacements are serialized only
208
+ // when the caller's transaction spans this complete upsert.
209
+ const targetKey = Object.entries(adapter.tables[tableName]).find(([, column])=>column === target)?.[0];
210
+ const targetValue = targetKey ? rowToInsert.row[targetKey] : undefined;
211
+ if (!targetKey || typeof targetValue === 'undefined') {
212
+ throw new Error(`Could not resolve the upsert target value for table "${tableName}".`);
213
+ }
214
+ for(let attempt = 0; attempt < 10; attempt++){
215
+ ;
216
+ [insertedRow] = await adapter.insert({
217
+ db,
218
+ onConflictDoNothing: {
219
+ target
220
+ },
221
+ tableName,
222
+ values: rowToInsert.row
223
+ });
224
+ if (insertedRow) {
225
+ break;
226
+ }
227
+ const updateWhere = where ? and(eq(target, targetValue), where) : eq(target, targetValue);
228
+ const updatedRows = await db.update(adapter.tables[tableName]).set(conflictWrite.row).where(updateWhere).returning();
229
+ if (updatedRows[0]) {
230
+ insertedRow = updatedRows[0];
231
+ nestedWrite = conflictWrite;
232
+ isUpdatingAfterInsertConflict = true;
233
+ break;
234
+ }
235
+ if (where) {
236
+ return null;
237
+ }
238
+ }
239
+ if (!insertedRow) {
240
+ throw new Error(`Could not upsert a stable row in table "${tableName}".`);
241
+ }
195
242
  } else {
196
243
  ;
197
244
  [insertedRow] = await adapter.insert({
198
245
  db,
199
246
  onConflictDoUpdate: {
200
- set: rowToInsert.row,
247
+ set: conflictWrite.row,
201
248
  target,
202
249
  where
203
250
  },
@@ -231,39 +278,44 @@ customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, u
231
278
  const numbersToInsert = [];
232
279
  const blocksToInsert = {};
233
280
  const selectsToInsert = {};
281
+ const localeTableName = `${tableName}${adapter.localesSuffix}`;
282
+ const shouldStampLocaleBranch = Boolean(adapter.rawTables[localeTableName]?.columns[branchField]);
234
283
  // If there are locale rows with data, add the parent and locale to each
235
- if (Object.keys(rowToInsert.locales).length > 0) {
236
- Object.entries(rowToInsert.locales).forEach(([locale, localeRow])=>{
284
+ if (Object.keys(nestedWrite.locales).length > 0) {
285
+ Object.entries(nestedWrite.locales).forEach(([locale, localeRow])=>{
237
286
  localeRow._parentID = insertedRow.id;
238
287
  localeRow._locale = locale;
288
+ if (shouldStampLocaleBranch) {
289
+ localeRow[branchField] = insertedRow[branchField] ?? data[branchField] ?? MAIN_BRANCH;
290
+ }
239
291
  localesToInsert.push(localeRow);
240
292
  });
241
293
  }
242
294
  // If there are relationships, add parent to each
243
- if (rowToInsert.relationships.length > 0) {
244
- rowToInsert.relationships.forEach((relation)=>{
295
+ if (nestedWrite.relationships.length > 0) {
296
+ nestedWrite.relationships.forEach((relation)=>{
245
297
  relation.parent = insertedRow.id;
246
298
  relationsToInsert.push(relation);
247
299
  });
248
300
  }
249
301
  // If there are texts, add parent to each
250
- if (rowToInsert.texts.length > 0) {
251
- rowToInsert.texts.forEach((textRow)=>{
302
+ if (nestedWrite.texts.length > 0) {
303
+ nestedWrite.texts.forEach((textRow)=>{
252
304
  textRow.parent = insertedRow.id;
253
305
  textsToInsert.push(textRow);
254
306
  });
255
307
  }
256
308
  // If there are numbers, add parent to each
257
- if (rowToInsert.numbers.length > 0) {
258
- rowToInsert.numbers.forEach((numberRow)=>{
309
+ if (nestedWrite.numbers.length > 0) {
310
+ nestedWrite.numbers.forEach((numberRow)=>{
259
311
  numberRow.parent = insertedRow.id;
260
312
  numbersToInsert.push(numberRow);
261
313
  });
262
314
  }
263
315
  // If there are selects, add parent to each, and then
264
316
  // store by table name and rows
265
- if (Object.keys(rowToInsert.selects).length > 0) {
266
- Object.entries(rowToInsert.selects).forEach(([selectTableName, selectRows])=>{
317
+ if (Object.keys(nestedWrite.selects).length > 0) {
318
+ Object.entries(nestedWrite.selects).forEach(([selectTableName, selectRows])=>{
267
319
  selectsToInsert[selectTableName] = [];
268
320
  selectRows.forEach((row)=>{
269
321
  if (typeof row.parent === 'undefined') {
@@ -275,8 +327,8 @@ customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, u
275
327
  }
276
328
  // If there are blocks, add parent to each, and then
277
329
  // store by table name and rows
278
- Object.keys(rowToInsert.blocks).forEach((tableName)=>{
279
- rowToInsert.blocks[tableName].forEach((blockRow)=>{
330
+ Object.keys(nestedWrite.blocks).forEach((tableName)=>{
331
+ nestedWrite.blocks[tableName].forEach((blockRow)=>{
280
332
  blockRow.row._parentID = insertedRow.id;
281
333
  if (!blocksToInsert[tableName]) {
282
334
  blocksToInsert[tableName] = [];
@@ -291,20 +343,36 @@ customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, u
291
343
  // INSERT LOCALES
292
344
  // //////////////////////////////////
293
345
  if (localesToInsert.length > 0) {
294
- const localeTableName = `${tableName}${adapter.localesSuffix}`;
295
346
  const localeTable = adapter.tables[`${tableName}${adapter.localesSuffix}`];
296
- if (operation === 'update') {
297
- await adapter.deleteWhere({
347
+ if (operation === 'update' && isUpdatingAfterInsertConflict) {
348
+ for (const localeRow of localesToInsert){
349
+ await adapter.insert({
350
+ db,
351
+ onConflictDoUpdate: {
352
+ set: localeRow,
353
+ target: [
354
+ localeTable._locale,
355
+ localeTable._parentID
356
+ ]
357
+ },
358
+ tableName: localeTableName,
359
+ values: localeRow
360
+ });
361
+ }
362
+ } else {
363
+ if (operation === 'update') {
364
+ await adapter.deleteWhere({
365
+ db,
366
+ tableName: localeTableName,
367
+ where: eq(localeTable._parentID, insertedRow.id)
368
+ });
369
+ }
370
+ await adapter.insert({
298
371
  db,
299
372
  tableName: localeTableName,
300
- where: eq(localeTable._parentID, insertedRow.id)
373
+ values: localesToInsert
301
374
  });
302
375
  }
303
- await adapter.insert({
304
- db,
305
- tableName: localeTableName,
306
- values: localesToInsert
307
- });
308
376
  }
309
377
  // //////////////////////////////////
310
378
  // INSERT RELATIONSHIPS
@@ -312,7 +380,7 @@ customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, u
312
380
  const relationshipsTableName = `${tableName}${adapter.relationshipsSuffix}`;
313
381
  if (operation === 'update') {
314
382
  // Filter out specific item deletions (those with itemToRemove) from general path deletions
315
- const generalRelationshipDeletes = rowToInsert.relationshipsToDelete.filter((rel)=>!('itemToRemove' in rel));
383
+ const generalRelationshipDeletes = nestedWrite.relationshipsToDelete.filter((rel)=>!('itemToRemove' in rel));
316
384
  await deleteExistingRowsByPath({
317
385
  adapter,
318
386
  db,
@@ -337,9 +405,9 @@ customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, u
337
405
  // //////////////////////////////////
338
406
  // HANDLE RELATIONSHIP $push OPERATIONS
339
407
  // //////////////////////////////////
340
- if (rowToInsert.relationshipsToAppend.length > 0) {
408
+ if (nestedWrite.relationshipsToAppend.length > 0) {
341
409
  // Prepare all relationships for batch insert (order will be set after max query)
342
- const relationshipsToInsert = rowToInsert.relationshipsToAppend.map((rel)=>{
410
+ const relationshipsToInsert = nestedWrite.relationshipsToAppend.map((rel)=>{
343
411
  const parentId = id || insertedRow.id;
344
412
  const row = {
345
413
  parent: parentId,
@@ -437,10 +505,10 @@ customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, u
437
505
  // //////////////////////////////////
438
506
  // HANDLE RELATIONSHIP $remove OPERATIONS
439
507
  // //////////////////////////////////
440
- if (rowToInsert.relationshipsToDelete.some((rel)=>'itemToRemove' in rel)) {
508
+ if (nestedWrite.relationshipsToDelete.some((rel)=>'itemToRemove' in rel)) {
441
509
  const relationshipTable = adapter.tables[relationshipsTableName];
442
510
  if (relationshipTable) {
443
- for (const relToDelete of rowToInsert.relationshipsToDelete){
511
+ for (const relToDelete of nestedWrite.relationshipsToDelete){
444
512
  if ('itemToRemove' in relToDelete && relToDelete.itemToRemove) {
445
513
  const item = relToDelete.itemToRemove;
446
514
  const parentId = id || insertedRow.id;
@@ -494,7 +562,7 @@ customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, u
494
562
  pathColumnName: 'path',
495
563
  rows: [
496
564
  ...textsToInsert,
497
- ...rowToInsert.textsToDelete
565
+ ...nestedWrite.textsToDelete
498
566
  ],
499
567
  tableName: textsTableName
500
568
  });
@@ -520,7 +588,7 @@ customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, u
520
588
  pathColumnName: 'path',
521
589
  rows: [
522
590
  ...numbersToInsert,
523
- ...rowToInsert.numbersToDelete
591
+ ...nestedWrite.numbersToDelete
524
592
  ],
525
593
  tableName: numbersTableName
526
594
  });
@@ -537,7 +605,7 @@ customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, u
537
605
  // //////////////////////////////////
538
606
  const insertedBlockRows = {};
539
607
  if (operation === 'update') {
540
- for (const tableName of rowToInsert.blocksToDelete){
608
+ for (const tableName of nestedWrite.blocksToDelete){
541
609
  const blockTable = adapter.tables[tableName];
542
610
  await adapter.deleteWhere({
543
611
  db,
@@ -593,7 +661,7 @@ customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, u
593
661
  // INSERT ARRAYS RECURSIVELY
594
662
  // //////////////////////////////////
595
663
  if (operation === 'update') {
596
- for (const arrayTableName of Object.keys(rowToInsert.arrays)){
664
+ for (const arrayTableName of Object.keys(nestedWrite.arrays)){
597
665
  await deleteExistingArrayRows({
598
666
  adapter,
599
667
  db,
@@ -605,8 +673,8 @@ customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, u
605
673
  await insertArrays({
606
674
  adapter,
607
675
  arrays: [
608
- rowToInsert.arrays,
609
- rowToInsert.arraysToPush
676
+ nestedWrite.arrays,
677
+ nestedWrite.arraysToPush
610
678
  ],
611
679
  db,
612
680
  parentRows: [
@@ -618,14 +686,36 @@ customID, joinQuery: _joinQuery, operation, path = '', req, select, tableName, u
618
686
  // //////////////////////////////////
619
687
  // INSERT hasMany SELECTS
620
688
  // //////////////////////////////////
621
- for (const [selectTableName, tableRows] of Object.entries(selectsToInsert)){
689
+ const selectTableNames = new Set([
690
+ ...Object.keys(nestedWrite.selectsToDelete),
691
+ ...Object.keys(selectsToInsert)
692
+ ]);
693
+ for (const selectTableName of selectTableNames){
694
+ const tableRows = selectsToInsert[selectTableName] ?? [];
622
695
  const selectTable = adapter.tables[selectTableName];
623
696
  if (operation === 'update') {
624
- await adapter.deleteWhere({
625
- db,
626
- tableName: selectTableName,
627
- where: eq(selectTable.parent, insertedRow.id)
628
- });
697
+ for (const selectToDelete of nestedWrite.selectsToDelete[selectTableName] ?? []){
698
+ let selectParent = selectToDelete.parent ?? insertedRow.id;
699
+ if ((typeof selectParent === 'number' || typeof selectParent === 'string') && selectParent in arraysBlocksUUIDMap) {
700
+ selectParent = arraysBlocksUUIDMap[selectParent];
701
+ }
702
+ const deleteConstraints = [
703
+ eq(selectTable.parent, selectParent)
704
+ ];
705
+ if (typeof selectToDelete.locale === 'string') {
706
+ if (!selectTable.locale) {
707
+ throw new Error(`Could not limit the select replacement for table "${selectTableName}" to locale "${selectToDelete.locale}".`);
708
+ }
709
+ deleteConstraints.push(eq(selectTable.locale, selectToDelete.locale));
710
+ } else if (selectTable.locale) {
711
+ deleteConstraints.push(isNull(selectTable.locale));
712
+ }
713
+ await adapter.deleteWhere({
714
+ db,
715
+ tableName: selectTableName,
716
+ where: and(...deleteConstraints)
717
+ });
718
+ }
629
719
  }
630
720
  if (Object.keys(arraysBlocksUUIDMap).length > 0) {
631
721
  tableRows.forEach((row)=>{
@@ -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<null | 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 const updateWhere = where\n ? and(eq(adapter.tables[tableName].id, id), where)\n : eq(adapter.tables[tableName].id, id)\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.update(adapter.tables[tableName]).set(row).where(updateWhere)\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 = updateWhere\n\n const doc = await db.query[tableName].findFirst(findManyArgs)\n\n if (!doc) {\n return null\n }\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(updateWhere)\n .returning(Object.keys(selectedFields).length ? selectedFields : undefined)\n\n if (!docs[0]) {\n return null\n }\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 const docs = await drizzle\n .update(adapter.tables[tableName])\n .set(row)\n .where(updateWhere)\n .returning({\n id: adapter.tables[tableName].id,\n })\n\n if (!docs[0]) {\n return null\n }\n\n insertedRow = docs[0]\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: where\n ? { set: rowToInsert.row, target, where }\n : { 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\n if (!insertedRow) {\n return null\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","updateWhere","tables","Object","keys","length","arrays","parentRows","uuidMap","updatedAt","hasDataToUpdate","update","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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"}
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'\nimport { branchField, MAIN_BRANCH } from 'payload'\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 upsertConflictData,\n upsertTarget,\n where,\n}: Args): Promise<null | 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 const updateWhere = where\n ? and(eq(adapter.tables[tableName].id, id), where)\n : eq(adapter.tables[tableName].id, id)\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.update(adapter.tables[tableName]).set(row).where(updateWhere)\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 = updateWhere\n\n const doc = await db.query[tableName].findFirst(findManyArgs)\n\n if (!doc) {\n return null\n }\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(updateWhere)\n .returning(Object.keys(selectedFields).length ? selectedFields : undefined)\n\n if (!docs[0]) {\n return null\n }\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 const docs = await drizzle\n .update(adapter.tables[tableName])\n .set(row)\n .where(updateWhere)\n .returning({\n id: adapter.tables[tableName].id,\n })\n\n if (!docs[0]) {\n return null\n }\n\n insertedRow = docs[0]\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 const conflictWrite = upsertConflictData\n ? transformForWrite({\n adapter,\n data: upsertConflictData,\n enableAtomicWrites: false,\n fields,\n path,\n tableName,\n })\n : rowToInsert\n let nestedWrite = rowToInsert\n let isUpdatingAfterInsertConflict = false\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: where\n ? { set: conflictWrite.row, target, where }\n : { set: conflictWrite.row, target },\n tableName,\n values: rowToInsert.row,\n })\n } else if (upsertConflictData && upsertTarget) {\n // The parent conflict is atomic. Child-table replacements are serialized only\n // when the caller's transaction spans this complete upsert.\n const targetKey = Object.entries(adapter.tables[tableName]).find(\n ([, column]) => column === target,\n )?.[0]\n const targetValue = targetKey ? rowToInsert.row[targetKey] : undefined\n\n if (!targetKey || typeof targetValue === 'undefined') {\n throw new Error(`Could not resolve the upsert target value for table \"${tableName}\".`)\n }\n\n for (let attempt = 0; attempt < 10; attempt++) {\n ;[insertedRow] = await adapter.insert({\n db,\n onConflictDoNothing: { target },\n tableName,\n values: rowToInsert.row,\n })\n\n if (insertedRow) {\n break\n }\n\n const updateWhere = where\n ? and(eq(target, targetValue), where)\n : eq(target, targetValue)\n const updatedRows = await (db as LibSQLDatabase)\n .update(adapter.tables[tableName])\n .set(conflictWrite.row)\n .where(updateWhere)\n .returning()\n\n if (updatedRows[0]) {\n insertedRow = updatedRows[0]\n nestedWrite = conflictWrite\n isUpdatingAfterInsertConflict = true\n break\n }\n\n if (where) {\n return null\n }\n }\n\n if (!insertedRow) {\n throw new Error(`Could not upsert a stable row in table \"${tableName}\".`)\n }\n } else {\n ;[insertedRow] = await adapter.insert({\n db,\n onConflictDoUpdate: { set: conflictWrite.row, target, where },\n tableName,\n values: rowToInsert.row,\n })\n }\n\n if (!insertedRow) {\n return null\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 const localeTableName = `${tableName}${adapter.localesSuffix}`\n const shouldStampLocaleBranch = Boolean(\n adapter.rawTables[localeTableName]?.columns[branchField],\n )\n\n // If there are locale rows with data, add the parent and locale to each\n if (Object.keys(nestedWrite.locales).length > 0) {\n Object.entries(nestedWrite.locales).forEach(([locale, localeRow]) => {\n localeRow._parentID = insertedRow.id\n localeRow._locale = locale\n if (shouldStampLocaleBranch) {\n localeRow[branchField] = insertedRow[branchField] ?? data[branchField] ?? MAIN_BRANCH\n }\n localesToInsert.push(localeRow)\n })\n }\n\n // If there are relationships, add parent to each\n if (nestedWrite.relationships.length > 0) {\n nestedWrite.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 (nestedWrite.texts.length > 0) {\n nestedWrite.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 (nestedWrite.numbers.length > 0) {\n nestedWrite.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(nestedWrite.selects).length > 0) {\n Object.entries(nestedWrite.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(nestedWrite.blocks).forEach((tableName) => {\n nestedWrite.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 localeTable = adapter.tables[`${tableName}${adapter.localesSuffix}`]\n\n if (operation === 'update' && isUpdatingAfterInsertConflict) {\n for (const localeRow of localesToInsert) {\n await adapter.insert({\n db,\n onConflictDoUpdate: {\n set: localeRow,\n target: [localeTable._locale, localeTable._parentID],\n },\n tableName: localeTableName,\n values: localeRow,\n })\n }\n } else {\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 // //////////////////////////////////\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 = nestedWrite.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 (nestedWrite.relationshipsToAppend.length > 0) {\n // Prepare all relationships for batch insert (order will be set after max query)\n const relationshipsToInsert = nestedWrite.relationshipsToAppend.map((rel) => {\n const parentId = id || insertedRow.id\n const row: Record<string, unknown> = {\n parent: parentId, // 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 (nestedWrite.relationshipsToDelete.some((rel) => 'itemToRemove' in rel)) {\n const relationshipTable = adapter.tables[relationshipsTableName]\n\n if (relationshipTable) {\n for (const relToDelete of nestedWrite.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, ...nestedWrite.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, ...nestedWrite.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 nestedWrite.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(nestedWrite.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: [nestedWrite.arrays, nestedWrite.arraysToPush],\n db,\n parentRows: [insertedRow, insertedRow],\n uuidMap: arraysBlocksUUIDMap,\n })\n\n // //////////////////////////////////\n // INSERT hasMany SELECTS\n // //////////////////////////////////\n\n const selectTableNames = new Set([\n ...Object.keys(nestedWrite.selectsToDelete),\n ...Object.keys(selectsToInsert),\n ])\n\n for (const selectTableName of selectTableNames) {\n const tableRows = selectsToInsert[selectTableName] ?? []\n const selectTable = adapter.tables[selectTableName]\n if (operation === 'update') {\n for (const selectToDelete of nestedWrite.selectsToDelete[selectTableName] ?? []) {\n let selectParent = selectToDelete.parent ?? insertedRow.id\n\n if (\n (typeof selectParent === 'number' || typeof selectParent === 'string') &&\n selectParent in arraysBlocksUUIDMap\n ) {\n selectParent = arraysBlocksUUIDMap[selectParent]\n }\n\n const deleteConstraints = [eq(selectTable.parent, selectParent)]\n\n if (typeof selectToDelete.locale === 'string') {\n if (!selectTable.locale) {\n throw new Error(\n `Could not limit the select replacement for table \"${selectTableName}\" to locale \"${selectToDelete.locale}\".`,\n )\n }\n\n deleteConstraints.push(eq(selectTable.locale, selectToDelete.locale))\n } else if (selectTable.locale) {\n deleteConstraints.push(isNull(selectTable.locale))\n }\n\n await adapter.deleteWhere({\n db,\n tableName: selectTableName,\n where: and(...deleteConstraints),\n })\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","branchField","MAIN_BRANCH","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","upsertConflictData","upsertTarget","where","createdAt","Date","toISOString","insertedRow","transformedForWrite","enableAtomicWrites","row","arraysToPush","drizzle","updateWhere","tables","Object","keys","length","arrays","parentRows","uuidMap","updatedAt","hasDataToUpdate","update","set","findManyArgs","depth","findManyKeysLength","hasOnlyColumns","columns","doc","query","findFirst","config","payload","selectedFields","column","enabled","entries","docs","returning","undefined","error","rowToInsert","conflictWrite","nestedWrite","isUpdatingAfterInsertConflict","target","rowKeys","hasLocalizedData","locales","hasMainRowData","every","key","insert","onConflictDoUpdate","values","targetKey","find","targetValue","Error","attempt","onConflictDoNothing","updatedRows","allowIDOnCreate","localesToInsert","relationsToInsert","textsToInsert","numbersToInsert","blocksToInsert","selectsToInsert","localeTableName","localesSuffix","shouldStampLocaleBranch","Boolean","rawTables","forEach","locale","localeRow","_parentID","_locale","push","relationships","relation","parent","texts","textRow","numbers","numberRow","selects","selectTableName","selectRows","blocks","blockRow","uuid","localeTable","deleteWhere","relationshipsTableName","relationshipsSuffix","generalRelationshipDeletes","relationshipsToDelete","filter","rel","localeColumnName","parentColumnName","parentID","pathColumnName","rows","relationshipsToAppend","relationshipsToInsert","map","parentId","relationshipTable","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","selectTableNames","Set","selectsToDelete","tableRows","selectTable","selectToDelete","selectParent","deleteConstraints","result"],"mappings":"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"}
@@ -30,6 +30,7 @@ type CreateArgs = {
30
30
  joinQuery?: never;
31
31
  operation: 'create';
32
32
  select?: SelectType;
33
+ upsertConflictData?: never;
33
34
  upsertTarget?: never;
34
35
  where?: never;
35
36
  } & BaseArgs;
@@ -39,6 +40,8 @@ type UpdateArgs = {
39
40
  joinQuery?: JoinQuery;
40
41
  operation: 'update';
41
42
  select?: SelectType;
43
+ /** Data applied only when an insert conflicts with an existing upsert target. */
44
+ upsertConflictData?: Record<string, unknown>;
42
45
  upsertTarget?: GenericColumn;
43
46
  where?: SQL<unknown>;
44
47
  } & BaseArgs;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/upsertRow/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpF,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEpF,KAAK,QAAQ,GAAG;IACd,OAAO,EAAE,cAAc,CAAA;IACvB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,EAAE,EAAE,cAAc,CAAC,SAAS,CAAC,GAAG,kBAAkB,CAAA;IAClD,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;IACjC,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,KAAK,UAAU,GAAG;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,EAAE,CAAC,EAAE,KAAK,CAAA;IACV,SAAS,CAAC,EAAE,KAAK,CAAA;IACjB,SAAS,EAAE,QAAQ,CAAA;IACnB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,YAAY,CAAC,EAAE,KAAK,CAAA;IACpB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,GAAG,QAAQ,CAAA;AAEZ,KAAK,UAAU,GAAG;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,SAAS,EAAE,QAAQ,CAAA;IACnB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,YAAY,CAAC,EAAE,aAAa,CAAA;IAC5B,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;CACrB,GAAG,QAAQ,CAAA;AAEZ,MAAM,MAAM,IAAI,GAAG,UAAU,GAAG,UAAU,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/upsertRow/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpF,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEpF,KAAK,QAAQ,GAAG;IACd,OAAO,EAAE,cAAc,CAAA;IACvB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,EAAE,EAAE,cAAc,CAAC,SAAS,CAAC,GAAG,kBAAkB,CAAA;IAClD,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;IACjC,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,KAAK,UAAU,GAAG;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,EAAE,CAAC,EAAE,KAAK,CAAA;IACV,SAAS,CAAC,EAAE,KAAK,CAAA;IACjB,SAAS,EAAE,QAAQ,CAAA;IACnB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,kBAAkB,CAAC,EAAE,KAAK,CAAA;IAC1B,YAAY,CAAC,EAAE,KAAK,CAAA;IACpB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,GAAG,QAAQ,CAAA;AAEZ,KAAK,UAAU,GAAG;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,SAAS,EAAE,QAAQ,CAAA;IACnB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5C,YAAY,CAAC,EAAE,aAAa,CAAA;IAC5B,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;CACrB,GAAG,QAAQ,CAAA;AAEZ,MAAM,MAAM,IAAI,GAAG,UAAU,GAAG,UAAU,CAAA"}