@payloadcms/db-mongodb 4.0.0-internal.e16cf59 → 4.0.0-internal.e38d3ac

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 (65) hide show
  1. package/LICENSE.md +1 -1
  2. package/dist/connect.d.ts.map +1 -1
  3. package/dist/connect.js +1 -2
  4. package/dist/connect.js.map +1 -1
  5. package/dist/deleteOne.js.map +1 -1
  6. package/dist/exports/migration-utils.d.ts +1 -0
  7. package/dist/exports/migration-utils.d.ts.map +1 -1
  8. package/dist/exports/migration-utils.js +1 -0
  9. package/dist/exports/migration-utils.js.map +1 -1
  10. package/dist/index.d.ts +1 -7
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/models/buildSchema.d.ts.map +1 -1
  14. package/dist/models/buildSchema.js +15 -1
  15. package/dist/models/buildSchema.js.map +1 -1
  16. package/dist/predefinedMigrations/localize-status.d.ts +4 -0
  17. package/dist/predefinedMigrations/localize-status.d.ts.map +1 -0
  18. package/dist/predefinedMigrations/localize-status.js +9 -0
  19. package/dist/predefinedMigrations/localize-status.js.map +1 -0
  20. package/dist/predefinedMigrations/migrateLocalizeStatus.d.ts +27 -0
  21. package/dist/predefinedMigrations/migrateLocalizeStatus.d.ts.map +1 -0
  22. package/dist/predefinedMigrations/migrateLocalizeStatus.js +324 -0
  23. package/dist/predefinedMigrations/migrateLocalizeStatus.js.map +1 -0
  24. package/dist/queries/buildSortParam.spec.js +1 -1
  25. package/dist/queries/buildSortParam.spec.js.map +1 -1
  26. package/dist/queries/getLocalizedSortProperty.d.ts.map +1 -1
  27. package/dist/queries/getLocalizedSortProperty.js +1 -1
  28. package/dist/queries/getLocalizedSortProperty.js.map +1 -1
  29. package/dist/queries/getLocalizedSortProperty.spec.js +1 -1
  30. package/dist/queries/getLocalizedSortProperty.spec.js.map +1 -1
  31. package/dist/queries/operatorMap.d.ts.map +1 -1
  32. package/dist/queries/sanitizeQueryValue.d.ts.map +1 -1
  33. package/dist/queries/sanitizeQueryValue.js +2 -3
  34. package/dist/queries/sanitizeQueryValue.js.map +1 -1
  35. package/dist/testCredentials.d.ts.map +1 -1
  36. package/dist/transactions/beginTransaction.d.ts.map +1 -1
  37. package/dist/transactions/beginTransaction.js +0 -1
  38. package/dist/transactions/beginTransaction.js.map +1 -1
  39. package/dist/updateGlobal.d.ts.map +1 -1
  40. package/dist/updateGlobal.js +10 -7
  41. package/dist/updateGlobal.js.map +1 -1
  42. package/dist/updateGlobalVersion.d.ts.map +1 -1
  43. package/dist/updateGlobalVersion.js +10 -7
  44. package/dist/updateGlobalVersion.js.map +1 -1
  45. package/dist/updateJobs.d.ts.map +1 -1
  46. package/dist/updateJobs.js +80 -20
  47. package/dist/updateJobs.js.map +1 -1
  48. package/dist/updateMany.d.ts.map +1 -1
  49. package/dist/updateMany.js +11 -8
  50. package/dist/updateMany.js.map +1 -1
  51. package/dist/updateOne.d.ts.map +1 -1
  52. package/dist/updateOne.js +10 -7
  53. package/dist/updateOne.js.map +1 -1
  54. package/dist/updateVersion.d.ts.map +1 -1
  55. package/dist/updateVersion.js +10 -7
  56. package/dist/updateVersion.js.map +1 -1
  57. package/dist/utilities/buildProjectionFromSelect.js +1 -1
  58. package/dist/utilities/buildProjectionFromSelect.js.map +1 -1
  59. package/dist/utilities/getEntity.d.ts +1 -1
  60. package/dist/utilities/transform.d.ts.map +1 -1
  61. package/dist/utilities/transform.js +25 -34
  62. package/dist/utilities/transform.js.map +1 -1
  63. package/dist/utilities/transform.spec.js +70 -3
  64. package/dist/utilities/transform.spec.js.map +1 -1
  65. package/package.json +5 -5
package/dist/updateOne.js CHANGED
@@ -55,22 +55,25 @@ export const updateOne = async function updateOne({ id, collection: collectionSl
55
55
  updateOps.$set = updateData;
56
56
  updateData = updateOps;
57
57
  }
58
- const options = {
58
+ const baseOptions = {
59
59
  ...optionsArgs,
60
+ session: await getSession(this, req),
61
+ // Timestamps are manually added by the write transform
62
+ timestamps: false
63
+ };
64
+ const findOptions = {
65
+ ...baseOptions,
60
66
  lean: true,
61
67
  new: true,
62
68
  projection: buildProjectionFromSelect({
63
69
  adapter: this,
64
70
  fields: collectionConfig.flattenedFields,
65
71
  select
66
- }),
67
- session: await getSession(this, req),
68
- // Timestamps are manually added by the write transform
69
- timestamps: false
72
+ })
70
73
  };
71
74
  try {
72
75
  if (returning === false) {
73
- await Model.updateOne(query, updateData, options);
76
+ await Model.updateOne(query, updateData, baseOptions);
74
77
  transform({
75
78
  adapter: this,
76
79
  data,
@@ -79,7 +82,7 @@ export const updateOne = async function updateOne({ id, collection: collectionSl
79
82
  });
80
83
  return null;
81
84
  } else {
82
- result = await Model.findOneAndUpdate(query, updateData, options);
85
+ result = await Model.findOneAndUpdate(query, updateData, findOptions);
83
86
  }
84
87
  } catch (error) {
85
88
  handleError({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/updateOne.ts"],"sourcesContent":["import type { MongooseUpdateQueryOptions, UpdateQuery } from 'mongoose'\nimport type { UpdateOne } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getCollection } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\nimport { handleError } from './utilities/handleError.js'\nimport { transform } from './utilities/transform.js'\n\nexport const updateOne: UpdateOne = async function updateOne(\n this: MongooseAdapter,\n {\n id,\n collection: collectionSlug,\n data,\n locale,\n options: optionsArgs = {},\n req,\n returning,\n select,\n where: whereArg = {},\n },\n) {\n const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug })\n const where = id ? { id: { equals: id } } : whereArg\n const fields = collectionConfig.fields\n\n const query = await buildQuery({\n adapter: this,\n collectionSlug,\n fields: collectionConfig.flattenedFields,\n locale,\n where,\n })\n\n let result\n\n let updateData: UpdateQuery<any> = data\n\n const $inc: Record<string, number> = {}\n const $push: Record<string, { $each: any[] } | any> = {}\n const $addToSet: Record<string, { $each: any[] } | any> = {}\n const $pull: Record<string, { $in: any[] } | any> = {}\n\n transform({\n $addToSet,\n $inc,\n $pull,\n $push,\n adapter: this,\n data,\n fields,\n operation: 'write',\n })\n\n const updateOps: UpdateQuery<any> = {}\n\n if (Object.keys($inc).length) {\n updateOps.$inc = $inc\n }\n if (Object.keys($push).length) {\n updateOps.$push = $push\n }\n if (Object.keys($addToSet).length) {\n updateOps.$addToSet = $addToSet\n }\n if (Object.keys($pull).length) {\n updateOps.$pull = $pull\n }\n if (Object.keys(updateOps).length) {\n updateOps.$set = updateData\n updateData = updateOps\n }\n\n const options: MongooseUpdateQueryOptions = {\n ...optionsArgs,\n lean: true,\n new: true,\n projection: buildProjectionFromSelect({\n adapter: this,\n fields: collectionConfig.flattenedFields,\n select,\n }),\n session: await getSession(this, req),\n // Timestamps are manually added by the write transform\n timestamps: false,\n }\n\n try {\n if (returning === false) {\n await Model.updateOne(query, updateData, options)\n transform({ adapter: this, data, fields, operation: 'read' })\n return null\n } else {\n result = await Model.findOneAndUpdate(query, updateData, options)\n }\n } catch (error) {\n handleError({ collection: collectionSlug, error, req })\n }\n\n if (!result) {\n return null\n }\n\n transform({ adapter: this, data: result, fields, operation: 'read' })\n\n return result\n}\n"],"names":["buildQuery","buildProjectionFromSelect","getCollection","getSession","handleError","transform","updateOne","id","collection","collectionSlug","data","locale","options","optionsArgs","req","returning","select","where","whereArg","collectionConfig","Model","adapter","equals","fields","query","flattenedFields","result","updateData","$inc","$push","$addToSet","$pull","operation","updateOps","Object","keys","length","$set","lean","new","projection","session","timestamps","findOneAndUpdate","error"],"mappings":"AAKA,SAASA,UAAU,QAAQ,0BAAyB;AACpD,SAASC,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,aAAa,QAAQ,2BAA0B;AACxD,SAASC,UAAU,QAAQ,4BAA2B;AACtD,SAASC,WAAW,QAAQ,6BAA4B;AACxD,SAASC,SAAS,QAAQ,2BAA0B;AAEpD,OAAO,MAAMC,YAAuB,eAAeA,UAEjD,EACEC,EAAE,EACFC,YAAYC,cAAc,EAC1BC,IAAI,EACJC,MAAM,EACNC,SAASC,cAAc,CAAC,CAAC,EACzBC,GAAG,EACHC,SAAS,EACTC,MAAM,EACNC,OAAOC,WAAW,CAAC,CAAC,EACrB;IAED,MAAM,EAAEC,gBAAgB,EAAEC,KAAK,EAAE,GAAGlB,cAAc;QAAEmB,SAAS,IAAI;QAAEZ;IAAe;IAClF,MAAMQ,QAAQV,KAAK;QAAEA,IAAI;YAAEe,QAAQf;QAAG;IAAE,IAAIW;IAC5C,MAAMK,SAASJ,iBAAiBI,MAAM;IAEtC,MAAMC,QAAQ,MAAMxB,WAAW;QAC7BqB,SAAS,IAAI;QACbZ;QACAc,QAAQJ,iBAAiBM,eAAe;QACxCd;QACAM;IACF;IAEA,IAAIS;IAEJ,IAAIC,aAA+BjB;IAEnC,MAAMkB,OAA+B,CAAC;IACtC,MAAMC,QAAgD,CAAC;IACvD,MAAMC,YAAoD,CAAC;IAC3D,MAAMC,QAA8C,CAAC;IAErD1B,UAAU;QACRyB;QACAF;QACAG;QACAF;QACAR,SAAS,IAAI;QACbX;QACAa;QACAS,WAAW;IACb;IAEA,MAAMC,YAA8B,CAAC;IAErC,IAAIC,OAAOC,IAAI,CAACP,MAAMQ,MAAM,EAAE;QAC5BH,UAAUL,IAAI,GAAGA;IACnB;IACA,IAAIM,OAAOC,IAAI,CAACN,OAAOO,MAAM,EAAE;QAC7BH,UAAUJ,KAAK,GAAGA;IACpB;IACA,IAAIK,OAAOC,IAAI,CAACL,WAAWM,MAAM,EAAE;QACjCH,UAAUH,SAAS,GAAGA;IACxB;IACA,IAAII,OAAOC,IAAI,CAACJ,OAAOK,MAAM,EAAE;QAC7BH,UAAUF,KAAK,GAAGA;IACpB;IACA,IAAIG,OAAOC,IAAI,CAACF,WAAWG,MAAM,EAAE;QACjCH,UAAUI,IAAI,GAAGV;QACjBA,aAAaM;IACf;IAEA,MAAMrB,UAAsC;QAC1C,GAAGC,WAAW;QACdyB,MAAM;QACNC,KAAK;QACLC,YAAYvC,0BAA0B;YACpCoB,SAAS,IAAI;YACbE,QAAQJ,iBAAiBM,eAAe;YACxCT;QACF;QACAyB,SAAS,MAAMtC,WAAW,IAAI,EAAEW;QAChC,uDAAuD;QACvD4B,YAAY;IACd;IAEA,IAAI;QACF,IAAI3B,cAAc,OAAO;YACvB,MAAMK,MAAMd,SAAS,CAACkB,OAAOG,YAAYf;YACzCP,UAAU;gBAAEgB,SAAS,IAAI;gBAAEX;gBAAMa;gBAAQS,WAAW;YAAO;YAC3D,OAAO;QACT,OAAO;YACLN,SAAS,MAAMN,MAAMuB,gBAAgB,CAACnB,OAAOG,YAAYf;QAC3D;IACF,EAAE,OAAOgC,OAAO;QACdxC,YAAY;YAAEI,YAAYC;YAAgBmC;YAAO9B;QAAI;IACvD;IAEA,IAAI,CAACY,QAAQ;QACX,OAAO;IACT;IAEArB,UAAU;QAAEgB,SAAS,IAAI;QAAEX,MAAMgB;QAAQH;QAAQS,WAAW;IAAO;IAEnE,OAAON;AACT,EAAC"}
1
+ {"version":3,"sources":["../src/updateOne.ts"],"sourcesContent":["import type { QueryOptions, UpdateQuery } from 'mongoose'\nimport type { UpdateOne } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getCollection } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\nimport { handleError } from './utilities/handleError.js'\nimport { transform } from './utilities/transform.js'\n\nexport const updateOne: UpdateOne = async function updateOne(\n this: MongooseAdapter,\n {\n id,\n collection: collectionSlug,\n data,\n locale,\n options: optionsArgs = {},\n req,\n returning,\n select,\n where: whereArg = {},\n },\n) {\n const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug })\n const where = id ? { id: { equals: id } } : whereArg\n const fields = collectionConfig.fields\n\n const query = await buildQuery({\n adapter: this,\n collectionSlug,\n fields: collectionConfig.flattenedFields,\n locale,\n where,\n })\n\n let result\n\n let updateData: UpdateQuery<any> = data\n\n const $inc: Record<string, number> = {}\n const $push: Record<string, { $each: any[] } | any> = {}\n const $addToSet: Record<string, { $each: any[] } | any> = {}\n const $pull: Record<string, { $in: any[] } | any> = {}\n\n transform({\n $addToSet,\n $inc,\n $pull,\n $push,\n adapter: this,\n data,\n fields,\n operation: 'write',\n })\n\n const updateOps: UpdateQuery<any> = {}\n\n if (Object.keys($inc).length) {\n updateOps.$inc = $inc\n }\n if (Object.keys($push).length) {\n updateOps.$push = $push\n }\n if (Object.keys($addToSet).length) {\n updateOps.$addToSet = $addToSet\n }\n if (Object.keys($pull).length) {\n updateOps.$pull = $pull\n }\n if (Object.keys(updateOps).length) {\n updateOps.$set = updateData\n updateData = updateOps\n }\n\n const baseOptions = {\n ...optionsArgs,\n session: await getSession(this, req),\n // Timestamps are manually added by the write transform\n timestamps: false,\n } satisfies QueryOptions\n\n const findOptions: QueryOptions = {\n ...baseOptions,\n lean: true,\n new: true,\n projection: buildProjectionFromSelect({\n adapter: this,\n fields: collectionConfig.flattenedFields,\n select,\n }),\n }\n\n try {\n if (returning === false) {\n await Model.updateOne(query, updateData, baseOptions)\n transform({ adapter: this, data, fields, operation: 'read' })\n return null\n } else {\n result = await Model.findOneAndUpdate(query, updateData, findOptions)\n }\n } catch (error) {\n handleError({ collection: collectionSlug, error, req })\n }\n\n if (!result) {\n return null\n }\n\n transform({ adapter: this, data: result, fields, operation: 'read' })\n\n return result\n}\n"],"names":["buildQuery","buildProjectionFromSelect","getCollection","getSession","handleError","transform","updateOne","id","collection","collectionSlug","data","locale","options","optionsArgs","req","returning","select","where","whereArg","collectionConfig","Model","adapter","equals","fields","query","flattenedFields","result","updateData","$inc","$push","$addToSet","$pull","operation","updateOps","Object","keys","length","$set","baseOptions","session","timestamps","findOptions","lean","new","projection","findOneAndUpdate","error"],"mappings":"AAKA,SAASA,UAAU,QAAQ,0BAAyB;AACpD,SAASC,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,aAAa,QAAQ,2BAA0B;AACxD,SAASC,UAAU,QAAQ,4BAA2B;AACtD,SAASC,WAAW,QAAQ,6BAA4B;AACxD,SAASC,SAAS,QAAQ,2BAA0B;AAEpD,OAAO,MAAMC,YAAuB,eAAeA,UAEjD,EACEC,EAAE,EACFC,YAAYC,cAAc,EAC1BC,IAAI,EACJC,MAAM,EACNC,SAASC,cAAc,CAAC,CAAC,EACzBC,GAAG,EACHC,SAAS,EACTC,MAAM,EACNC,OAAOC,WAAW,CAAC,CAAC,EACrB;IAED,MAAM,EAAEC,gBAAgB,EAAEC,KAAK,EAAE,GAAGlB,cAAc;QAAEmB,SAAS,IAAI;QAAEZ;IAAe;IAClF,MAAMQ,QAAQV,KAAK;QAAEA,IAAI;YAAEe,QAAQf;QAAG;IAAE,IAAIW;IAC5C,MAAMK,SAASJ,iBAAiBI,MAAM;IAEtC,MAAMC,QAAQ,MAAMxB,WAAW;QAC7BqB,SAAS,IAAI;QACbZ;QACAc,QAAQJ,iBAAiBM,eAAe;QACxCd;QACAM;IACF;IAEA,IAAIS;IAEJ,IAAIC,aAA+BjB;IAEnC,MAAMkB,OAA+B,CAAC;IACtC,MAAMC,QAAgD,CAAC;IACvD,MAAMC,YAAoD,CAAC;IAC3D,MAAMC,QAA8C,CAAC;IAErD1B,UAAU;QACRyB;QACAF;QACAG;QACAF;QACAR,SAAS,IAAI;QACbX;QACAa;QACAS,WAAW;IACb;IAEA,MAAMC,YAA8B,CAAC;IAErC,IAAIC,OAAOC,IAAI,CAACP,MAAMQ,MAAM,EAAE;QAC5BH,UAAUL,IAAI,GAAGA;IACnB;IACA,IAAIM,OAAOC,IAAI,CAACN,OAAOO,MAAM,EAAE;QAC7BH,UAAUJ,KAAK,GAAGA;IACpB;IACA,IAAIK,OAAOC,IAAI,CAACL,WAAWM,MAAM,EAAE;QACjCH,UAAUH,SAAS,GAAGA;IACxB;IACA,IAAII,OAAOC,IAAI,CAACJ,OAAOK,MAAM,EAAE;QAC7BH,UAAUF,KAAK,GAAGA;IACpB;IACA,IAAIG,OAAOC,IAAI,CAACF,WAAWG,MAAM,EAAE;QACjCH,UAAUI,IAAI,GAAGV;QACjBA,aAAaM;IACf;IAEA,MAAMK,cAAc;QAClB,GAAGzB,WAAW;QACd0B,SAAS,MAAMpC,WAAW,IAAI,EAAEW;QAChC,uDAAuD;QACvD0B,YAAY;IACd;IAEA,MAAMC,cAA4B;QAChC,GAAGH,WAAW;QACdI,MAAM;QACNC,KAAK;QACLC,YAAY3C,0BAA0B;YACpCoB,SAAS,IAAI;YACbE,QAAQJ,iBAAiBM,eAAe;YACxCT;QACF;IACF;IAEA,IAAI;QACF,IAAID,cAAc,OAAO;YACvB,MAAMK,MAAMd,SAAS,CAACkB,OAAOG,YAAYW;YACzCjC,UAAU;gBAAEgB,SAAS,IAAI;gBAAEX;gBAAMa;gBAAQS,WAAW;YAAO;YAC3D,OAAO;QACT,OAAO;YACLN,SAAS,MAAMN,MAAMyB,gBAAgB,CAACrB,OAAOG,YAAYc;QAC3D;IACF,EAAE,OAAOK,OAAO;QACd1C,YAAY;YAAEI,YAAYC;YAAgBqC;YAAOhC;QAAI;IACvD;IAEA,IAAI,CAACY,QAAQ;QACX,OAAO;IACT;IAEArB,UAAU;QAAEgB,SAAS,IAAI;QAAEX,MAAMgB;QAAQH;QAAQS,WAAW;IAAO;IAEnE,OAAON;AACT,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"updateVersion.d.ts","sourceRoot":"","sources":["../src/updateVersion.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgC,KAAK,aAAa,EAAE,MAAM,SAAS,CAAA;AAU1E,eAAO,MAAM,aAAa,EAAE,aA8D3B,CAAA"}
1
+ {"version":3,"file":"updateVersion.d.ts","sourceRoot":"","sources":["../src/updateVersion.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgC,KAAK,aAAa,EAAE,MAAM,SAAS,CAAA;AAU1E,eAAO,MAAM,aAAa,EAAE,aAkE3B,CAAA"}
@@ -29,24 +29,27 @@ export const updateVersion = async function updateVersion({ id, collection: coll
29
29
  fields,
30
30
  operation: 'write'
31
31
  });
32
- const options = {
32
+ const baseOptions = {
33
33
  ...optionsArgs,
34
+ session: await getSession(this, req),
35
+ // Timestamps are manually added by the write transform
36
+ timestamps: false
37
+ };
38
+ const findOptions = {
39
+ ...baseOptions,
34
40
  lean: true,
35
41
  new: true,
36
42
  projection: buildProjectionFromSelect({
37
43
  adapter: this,
38
44
  fields: flattenedFields,
39
45
  select
40
- }),
41
- session: await getSession(this, req),
42
- // Timestamps are manually added by the write transform
43
- timestamps: false
46
+ })
44
47
  };
45
48
  if (returning === false) {
46
- await Model.updateOne(query, versionData, options);
49
+ await Model.updateOne(query, versionData, baseOptions);
47
50
  return null;
48
51
  }
49
- const doc = await Model.findOneAndUpdate(query, versionData, options);
52
+ const doc = await Model.findOneAndUpdate(query, versionData, findOptions);
50
53
  if (!doc) {
51
54
  return null;
52
55
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/updateVersion.ts"],"sourcesContent":["import type { MongooseUpdateQueryOptions } from 'mongoose'\n\nimport { buildVersionCollectionFields, type UpdateVersion } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getCollection } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\nimport { transform } from './utilities/transform.js'\n\nexport const updateVersion: UpdateVersion = async function updateVersion(\n this: MongooseAdapter,\n {\n id,\n collection: collectionSlug,\n locale,\n options: optionsArgs = {},\n req,\n returning,\n select,\n versionData,\n where,\n },\n) {\n const { collectionConfig, Model } = getCollection({\n adapter: this,\n collectionSlug,\n versions: true,\n })\n\n const whereToUse = where || { id: { equals: id } }\n const fields = buildVersionCollectionFields(this.payload.config, collectionConfig)\n\n const flattenedFields = buildVersionCollectionFields(this.payload.config, collectionConfig, true)\n\n const query = await buildQuery({\n adapter: this,\n fields: flattenedFields,\n locale,\n where: whereToUse,\n })\n\n transform({ adapter: this, data: versionData, fields, operation: 'write' })\n\n const options: MongooseUpdateQueryOptions = {\n ...optionsArgs,\n lean: true,\n new: true,\n projection: buildProjectionFromSelect({\n adapter: this,\n fields: flattenedFields,\n select,\n }),\n session: await getSession(this, req),\n // Timestamps are manually added by the write transform\n timestamps: false,\n }\n\n if (returning === false) {\n await Model.updateOne(query, versionData, options)\n return null\n }\n\n const doc = await Model.findOneAndUpdate(query, versionData, options)\n\n if (!doc) {\n return null\n }\n\n transform({ adapter: this, data: doc, fields, operation: 'read' })\n\n return doc\n}\n"],"names":["buildVersionCollectionFields","buildQuery","buildProjectionFromSelect","getCollection","getSession","transform","updateVersion","id","collection","collectionSlug","locale","options","optionsArgs","req","returning","select","versionData","where","collectionConfig","Model","adapter","versions","whereToUse","equals","fields","payload","config","flattenedFields","query","data","operation","lean","new","projection","session","timestamps","updateOne","doc","findOneAndUpdate"],"mappings":"AAEA,SAASA,4BAA4B,QAA4B,UAAS;AAI1E,SAASC,UAAU,QAAQ,0BAAyB;AACpD,SAASC,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,aAAa,QAAQ,2BAA0B;AACxD,SAASC,UAAU,QAAQ,4BAA2B;AACtD,SAASC,SAAS,QAAQ,2BAA0B;AAEpD,OAAO,MAAMC,gBAA+B,eAAeA,cAEzD,EACEC,EAAE,EACFC,YAAYC,cAAc,EAC1BC,MAAM,EACNC,SAASC,cAAc,CAAC,CAAC,EACzBC,GAAG,EACHC,SAAS,EACTC,MAAM,EACNC,WAAW,EACXC,KAAK,EACN;IAED,MAAM,EAAEC,gBAAgB,EAAEC,KAAK,EAAE,GAAGhB,cAAc;QAChDiB,SAAS,IAAI;QACbX;QACAY,UAAU;IACZ;IAEA,MAAMC,aAAaL,SAAS;QAAEV,IAAI;YAAEgB,QAAQhB;QAAG;IAAE;IACjD,MAAMiB,SAASxB,6BAA6B,IAAI,CAACyB,OAAO,CAACC,MAAM,EAAER;IAEjE,MAAMS,kBAAkB3B,6BAA6B,IAAI,CAACyB,OAAO,CAACC,MAAM,EAAER,kBAAkB;IAE5F,MAAMU,QAAQ,MAAM3B,WAAW;QAC7BmB,SAAS,IAAI;QACbI,QAAQG;QACRjB;QACAO,OAAOK;IACT;IAEAjB,UAAU;QAAEe,SAAS,IAAI;QAAES,MAAMb;QAAaQ;QAAQM,WAAW;IAAQ;IAEzE,MAAMnB,UAAsC;QAC1C,GAAGC,WAAW;QACdmB,MAAM;QACNC,KAAK;QACLC,YAAY/B,0BAA0B;YACpCkB,SAAS,IAAI;YACbI,QAAQG;YACRZ;QACF;QACAmB,SAAS,MAAM9B,WAAW,IAAI,EAAES;QAChC,uDAAuD;QACvDsB,YAAY;IACd;IAEA,IAAIrB,cAAc,OAAO;QACvB,MAAMK,MAAMiB,SAAS,CAACR,OAAOZ,aAAaL;QAC1C,OAAO;IACT;IAEA,MAAM0B,MAAM,MAAMlB,MAAMmB,gBAAgB,CAACV,OAAOZ,aAAaL;IAE7D,IAAI,CAAC0B,KAAK;QACR,OAAO;IACT;IAEAhC,UAAU;QAAEe,SAAS,IAAI;QAAES,MAAMQ;QAAKb;QAAQM,WAAW;IAAO;IAEhE,OAAOO;AACT,EAAC"}
1
+ {"version":3,"sources":["../src/updateVersion.ts"],"sourcesContent":["import type { QueryOptions } from 'mongoose'\n\nimport { buildVersionCollectionFields, type UpdateVersion } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getCollection } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\nimport { transform } from './utilities/transform.js'\n\nexport const updateVersion: UpdateVersion = async function updateVersion(\n this: MongooseAdapter,\n {\n id,\n collection: collectionSlug,\n locale,\n options: optionsArgs = {},\n req,\n returning,\n select,\n versionData,\n where,\n },\n) {\n const { collectionConfig, Model } = getCollection({\n adapter: this,\n collectionSlug,\n versions: true,\n })\n\n const whereToUse = where || { id: { equals: id } }\n const fields = buildVersionCollectionFields(this.payload.config, collectionConfig)\n\n const flattenedFields = buildVersionCollectionFields(this.payload.config, collectionConfig, true)\n\n const query = await buildQuery({\n adapter: this,\n fields: flattenedFields,\n locale,\n where: whereToUse,\n })\n\n transform({ adapter: this, data: versionData, fields, operation: 'write' })\n\n const baseOptions = {\n ...optionsArgs,\n session: await getSession(this, req),\n // Timestamps are manually added by the write transform\n timestamps: false,\n } satisfies QueryOptions\n\n const findOptions: QueryOptions = {\n ...baseOptions,\n lean: true,\n new: true,\n projection: buildProjectionFromSelect({\n adapter: this,\n fields: flattenedFields,\n select,\n }),\n }\n\n if (returning === false) {\n await Model.updateOne(query, versionData, baseOptions)\n return null\n }\n\n const doc = await Model.findOneAndUpdate(query, versionData, findOptions)\n\n if (!doc) {\n return null\n }\n\n transform({ adapter: this, data: doc, fields, operation: 'read' })\n\n return doc\n}\n"],"names":["buildVersionCollectionFields","buildQuery","buildProjectionFromSelect","getCollection","getSession","transform","updateVersion","id","collection","collectionSlug","locale","options","optionsArgs","req","returning","select","versionData","where","collectionConfig","Model","adapter","versions","whereToUse","equals","fields","payload","config","flattenedFields","query","data","operation","baseOptions","session","timestamps","findOptions","lean","new","projection","updateOne","doc","findOneAndUpdate"],"mappings":"AAEA,SAASA,4BAA4B,QAA4B,UAAS;AAI1E,SAASC,UAAU,QAAQ,0BAAyB;AACpD,SAASC,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,aAAa,QAAQ,2BAA0B;AACxD,SAASC,UAAU,QAAQ,4BAA2B;AACtD,SAASC,SAAS,QAAQ,2BAA0B;AAEpD,OAAO,MAAMC,gBAA+B,eAAeA,cAEzD,EACEC,EAAE,EACFC,YAAYC,cAAc,EAC1BC,MAAM,EACNC,SAASC,cAAc,CAAC,CAAC,EACzBC,GAAG,EACHC,SAAS,EACTC,MAAM,EACNC,WAAW,EACXC,KAAK,EACN;IAED,MAAM,EAAEC,gBAAgB,EAAEC,KAAK,EAAE,GAAGhB,cAAc;QAChDiB,SAAS,IAAI;QACbX;QACAY,UAAU;IACZ;IAEA,MAAMC,aAAaL,SAAS;QAAEV,IAAI;YAAEgB,QAAQhB;QAAG;IAAE;IACjD,MAAMiB,SAASxB,6BAA6B,IAAI,CAACyB,OAAO,CAACC,MAAM,EAAER;IAEjE,MAAMS,kBAAkB3B,6BAA6B,IAAI,CAACyB,OAAO,CAACC,MAAM,EAAER,kBAAkB;IAE5F,MAAMU,QAAQ,MAAM3B,WAAW;QAC7BmB,SAAS,IAAI;QACbI,QAAQG;QACRjB;QACAO,OAAOK;IACT;IAEAjB,UAAU;QAAEe,SAAS,IAAI;QAAES,MAAMb;QAAaQ;QAAQM,WAAW;IAAQ;IAEzE,MAAMC,cAAc;QAClB,GAAGnB,WAAW;QACdoB,SAAS,MAAM5B,WAAW,IAAI,EAAES;QAChC,uDAAuD;QACvDoB,YAAY;IACd;IAEA,MAAMC,cAA4B;QAChC,GAAGH,WAAW;QACdI,MAAM;QACNC,KAAK;QACLC,YAAYnC,0BAA0B;YACpCkB,SAAS,IAAI;YACbI,QAAQG;YACRZ;QACF;IACF;IAEA,IAAID,cAAc,OAAO;QACvB,MAAMK,MAAMmB,SAAS,CAACV,OAAOZ,aAAae;QAC1C,OAAO;IACT;IAEA,MAAMQ,MAAM,MAAMpB,MAAMqB,gBAAgB,CAACZ,OAAOZ,aAAakB;IAE7D,IAAI,CAACK,KAAK;QACR,OAAO;IACT;IAEAlC,UAAU;QAAEe,SAAS,IAAI;QAAES,MAAMU;QAAKf;QAAQM,WAAW;IAAO;IAEhE,OAAOS;AACT,EAAC"}
@@ -77,7 +77,7 @@ const traverseFields = ({ adapter, databaseSchemaPath = '', fields, parentIsLoca
77
77
  case 'blocks':
78
78
  {
79
79
  const blocksSelect = select[field.name];
80
- for (const _block of field.blockReferences ?? field.blocks){
80
+ for (const _block of field.blocks){
81
81
  const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block;
82
82
  if (!block) {
83
83
  continue;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/buildProjectionFromSelect.ts"],"sourcesContent":["import type {\n FieldAffectingData,\n FlattenedField,\n SelectIncludeType,\n SelectMode,\n SelectType,\n} from 'payload'\n\nimport {\n deepCopyObjectSimple,\n fieldAffectsData,\n fieldShouldBeLocalized,\n getSelectMode,\n} from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\n\nconst addFieldToProjection = ({\n adapter,\n databaseSchemaPath,\n field,\n parentIsLocalized,\n projection,\n}: {\n adapter: MongooseAdapter\n databaseSchemaPath: string\n field: FieldAffectingData\n parentIsLocalized: boolean\n projection: Record<string, true>\n}) => {\n const { config } = adapter.payload\n\n if (parentIsLocalized && config.localization) {\n for (const locale of config.localization.localeCodes) {\n const localeDatabaseSchemaPath = databaseSchemaPath.replace('<locale>', locale)\n projection[`${localeDatabaseSchemaPath}${field.name}`] = true\n }\n } else {\n projection[`${databaseSchemaPath}${field.name}`] = true\n }\n}\n\nconst traverseFields = ({\n adapter,\n databaseSchemaPath = '',\n fields,\n parentIsLocalized = false,\n projection,\n select,\n selectAllOnCurrentLevel = false,\n selectMode,\n}: {\n adapter: MongooseAdapter\n databaseSchemaPath?: string\n fields: FlattenedField[]\n parentIsLocalized?: boolean\n projection: Record<string, true>\n select: SelectType\n selectAllOnCurrentLevel?: boolean\n selectMode: SelectMode\n}) => {\n for (const field of fields) {\n if (fieldAffectsData(field)) {\n if (selectMode === 'include') {\n if (select[field.name] === true || selectAllOnCurrentLevel) {\n addFieldToProjection({\n adapter,\n databaseSchemaPath,\n field,\n parentIsLocalized,\n projection,\n })\n continue\n }\n\n if (!select[field.name]) {\n continue\n }\n }\n\n if (selectMode === 'exclude') {\n if (typeof select[field.name] === 'undefined') {\n addFieldToProjection({\n adapter,\n databaseSchemaPath,\n field,\n parentIsLocalized,\n projection,\n })\n continue\n }\n\n if (select[field.name] === false) {\n continue\n }\n }\n }\n\n let fieldDatabaseSchemaPath = databaseSchemaPath\n\n if (fieldAffectsData(field)) {\n fieldDatabaseSchemaPath = `${databaseSchemaPath}${field.name}.`\n\n if (fieldShouldBeLocalized({ field, parentIsLocalized })) {\n fieldDatabaseSchemaPath = `${fieldDatabaseSchemaPath}<locale>.`\n }\n }\n\n switch (field.type) {\n case 'array':\n case 'group':\n case 'tab': {\n const fieldSelect = select[field.name] as SelectType\n\n if (field.type === 'array' && selectMode === 'include') {\n fieldSelect.id = true\n }\n\n traverseFields({\n adapter,\n databaseSchemaPath: fieldDatabaseSchemaPath,\n fields: field.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n projection,\n select: fieldSelect,\n selectMode,\n })\n\n break\n }\n case 'blocks': {\n const blocksSelect = select[field.name] as SelectType\n\n for (const _block of field.blockReferences ?? field.blocks) {\n const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block\n\n if (!block) {\n continue\n }\n\n if (\n (selectMode === 'include' && blocksSelect[block.slug] === true) ||\n (selectMode === 'exclude' && typeof blocksSelect[block.slug] === 'undefined')\n ) {\n traverseFields({\n adapter,\n databaseSchemaPath: fieldDatabaseSchemaPath,\n fields: block.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n projection,\n select: {},\n selectAllOnCurrentLevel: true,\n selectMode: 'include',\n })\n continue\n }\n\n let blockSelectMode = selectMode\n\n if (selectMode === 'exclude' && blocksSelect[block.slug] === false) {\n blockSelectMode = 'include'\n }\n\n if (typeof blocksSelect[block.slug] !== 'object') {\n blocksSelect[block.slug] = {}\n }\n\n if (blockSelectMode === 'include' && typeof blocksSelect[block.slug] === 'object') {\n const blockSelect = blocksSelect[block.slug] as SelectIncludeType\n blockSelect.id = true\n blockSelect.blockType = true\n }\n\n traverseFields({\n adapter,\n databaseSchemaPath: fieldDatabaseSchemaPath,\n fields: block.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n projection,\n select: blocksSelect[block.slug] as SelectType,\n selectMode: blockSelectMode,\n })\n }\n\n break\n }\n\n case 'relationship':\n case 'upload': {\n // When a relationship/upload field is selected with nested fields (for population), we still need to include the raw\n // field value in the projection so that population can work. The nested select is handled by the population logic.\n addFieldToProjection({\n adapter,\n databaseSchemaPath,\n field,\n parentIsLocalized,\n projection,\n })\n break\n }\n\n default:\n break\n }\n }\n}\n\nexport const buildProjectionFromSelect = ({\n adapter,\n fields,\n select,\n}: {\n adapter: MongooseAdapter\n fields: FlattenedField[]\n select?: SelectType\n}): Record<string, true> | undefined => {\n if (!select) {\n return\n }\n\n const projection: Record<string, true> = {\n _id: true,\n }\n\n traverseFields({\n adapter,\n fields,\n projection,\n // Clone to safely mutate it later\n select: deepCopyObjectSimple(select),\n selectMode: getSelectMode(select),\n })\n\n return projection\n}\n"],"names":["deepCopyObjectSimple","fieldAffectsData","fieldShouldBeLocalized","getSelectMode","addFieldToProjection","adapter","databaseSchemaPath","field","parentIsLocalized","projection","config","payload","localization","locale","localeCodes","localeDatabaseSchemaPath","replace","name","traverseFields","fields","select","selectAllOnCurrentLevel","selectMode","fieldDatabaseSchemaPath","type","fieldSelect","id","flattenedFields","localized","blocksSelect","_block","blockReferences","blocks","block","slug","blockSelectMode","blockSelect","blockType","buildProjectionFromSelect","_id"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/buildProjectionFromSelect.ts"],"sourcesContent":["import type {\n FieldAffectingData,\n FlattenedField,\n SelectIncludeType,\n SelectMode,\n SelectType,\n} from 'payload'\n\nimport {\n deepCopyObjectSimple,\n fieldAffectsData,\n fieldShouldBeLocalized,\n getSelectMode,\n} from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\n\nconst addFieldToProjection = ({\n adapter,\n databaseSchemaPath,\n field,\n parentIsLocalized,\n projection,\n}: {\n adapter: MongooseAdapter\n databaseSchemaPath: string\n field: FieldAffectingData\n parentIsLocalized: boolean\n projection: Record<string, true>\n}) => {\n const { config } = adapter.payload\n\n if (parentIsLocalized && config.localization) {\n for (const locale of config.localization.localeCodes) {\n const localeDatabaseSchemaPath = databaseSchemaPath.replace('<locale>', locale)\n projection[`${localeDatabaseSchemaPath}${field.name}`] = true\n }\n } else {\n projection[`${databaseSchemaPath}${field.name}`] = true\n }\n}\n\nconst traverseFields = ({\n adapter,\n databaseSchemaPath = '',\n fields,\n parentIsLocalized = false,\n projection,\n select,\n selectAllOnCurrentLevel = false,\n selectMode,\n}: {\n adapter: MongooseAdapter\n databaseSchemaPath?: string\n fields: FlattenedField[]\n parentIsLocalized?: boolean\n projection: Record<string, true>\n select: SelectType\n selectAllOnCurrentLevel?: boolean\n selectMode: SelectMode\n}) => {\n for (const field of fields) {\n if (fieldAffectsData(field)) {\n if (selectMode === 'include') {\n if (select[field.name] === true || selectAllOnCurrentLevel) {\n addFieldToProjection({\n adapter,\n databaseSchemaPath,\n field,\n parentIsLocalized,\n projection,\n })\n continue\n }\n\n if (!select[field.name]) {\n continue\n }\n }\n\n if (selectMode === 'exclude') {\n if (typeof select[field.name] === 'undefined') {\n addFieldToProjection({\n adapter,\n databaseSchemaPath,\n field,\n parentIsLocalized,\n projection,\n })\n continue\n }\n\n if (select[field.name] === false) {\n continue\n }\n }\n }\n\n let fieldDatabaseSchemaPath = databaseSchemaPath\n\n if (fieldAffectsData(field)) {\n fieldDatabaseSchemaPath = `${databaseSchemaPath}${field.name}.`\n\n if (fieldShouldBeLocalized({ field, parentIsLocalized })) {\n fieldDatabaseSchemaPath = `${fieldDatabaseSchemaPath}<locale>.`\n }\n }\n\n switch (field.type) {\n case 'array':\n case 'group':\n case 'tab': {\n const fieldSelect = select[field.name] as SelectType\n\n if (field.type === 'array' && selectMode === 'include') {\n fieldSelect.id = true\n }\n\n traverseFields({\n adapter,\n databaseSchemaPath: fieldDatabaseSchemaPath,\n fields: field.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n projection,\n select: fieldSelect,\n selectMode,\n })\n\n break\n }\n case 'blocks': {\n const blocksSelect = select[field.name] as SelectType\n\n for (const _block of field.blocks) {\n const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block\n\n if (!block) {\n continue\n }\n\n if (\n (selectMode === 'include' && blocksSelect[block.slug] === true) ||\n (selectMode === 'exclude' && typeof blocksSelect[block.slug] === 'undefined')\n ) {\n traverseFields({\n adapter,\n databaseSchemaPath: fieldDatabaseSchemaPath,\n fields: block.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n projection,\n select: {},\n selectAllOnCurrentLevel: true,\n selectMode: 'include',\n })\n continue\n }\n\n let blockSelectMode = selectMode\n\n if (selectMode === 'exclude' && blocksSelect[block.slug] === false) {\n blockSelectMode = 'include'\n }\n\n if (typeof blocksSelect[block.slug] !== 'object') {\n blocksSelect[block.slug] = {}\n }\n\n if (blockSelectMode === 'include' && typeof blocksSelect[block.slug] === 'object') {\n const blockSelect = blocksSelect[block.slug] as SelectIncludeType\n blockSelect.id = true\n blockSelect.blockType = true\n }\n\n traverseFields({\n adapter,\n databaseSchemaPath: fieldDatabaseSchemaPath,\n fields: block.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n projection,\n select: blocksSelect[block.slug] as SelectType,\n selectMode: blockSelectMode,\n })\n }\n\n break\n }\n\n case 'relationship':\n case 'upload': {\n // When a relationship/upload field is selected with nested fields (for population), we still need to include the raw\n // field value in the projection so that population can work. The nested select is handled by the population logic.\n addFieldToProjection({\n adapter,\n databaseSchemaPath,\n field,\n parentIsLocalized,\n projection,\n })\n break\n }\n\n default:\n break\n }\n }\n}\n\nexport const buildProjectionFromSelect = ({\n adapter,\n fields,\n select,\n}: {\n adapter: MongooseAdapter\n fields: FlattenedField[]\n select?: SelectType\n}): Record<string, true> | undefined => {\n if (!select) {\n return\n }\n\n const projection: Record<string, true> = {\n _id: true,\n }\n\n traverseFields({\n adapter,\n fields,\n projection,\n // Clone to safely mutate it later\n select: deepCopyObjectSimple(select),\n selectMode: getSelectMode(select),\n })\n\n return projection\n}\n"],"names":["deepCopyObjectSimple","fieldAffectsData","fieldShouldBeLocalized","getSelectMode","addFieldToProjection","adapter","databaseSchemaPath","field","parentIsLocalized","projection","config","payload","localization","locale","localeCodes","localeDatabaseSchemaPath","replace","name","traverseFields","fields","select","selectAllOnCurrentLevel","selectMode","fieldDatabaseSchemaPath","type","fieldSelect","id","flattenedFields","localized","blocksSelect","_block","blocks","block","slug","blockSelectMode","blockSelect","blockType","buildProjectionFromSelect","_id"],"mappings":"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"}
@@ -7,7 +7,7 @@ export declare const getCollection: ({ adapter, collectionSlug, versions, }: {
7
7
  versions?: boolean;
8
8
  }) => {
9
9
  collectionConfig: SanitizedCollectionConfig;
10
- customIDType: Collection["customIDType"];
10
+ customIDType: Collection['customIDType'];
11
11
  Model: CollectionModel;
12
12
  };
13
13
  type BaseGetGlobalArgs = {
@@ -1 +1 @@
1
- {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/utilities/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,KAAK,EAQN,MAAM,SAAS,CAAA;AAMhB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAmQlD,KAAK,IAAI,GAAG;IACV,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,GAAG,EAAE,CAAA;KAAE,GAAG,GAAG,CAAC,CAAA;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,GAAG,EAAE,CAAA;KAAE,GAAG,GAAG,CAAC,CAAA;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,GAAG,EAAE,CAAA;KAAE,GAAG,GAAG,CAAC,CAAA;IAC9C,8BAA8B;IAC9B,OAAO,EAAE,eAAe,CAAA;IACxB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACzD,uCAAuC;IACvC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC,CAAA;AAmMD;;;GAGG;AACH,eAAO,MAAM,SAAS,+HAYnB,IAAI,qBA6XN,CAAA"}
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/utilities/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,KAAK,EAQN,MAAM,SAAS,CAAA;AAMhB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAyQlD,KAAK,IAAI,GAAG;IACV,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,GAAG,EAAE,CAAA;KAAE,GAAG,GAAG,CAAC,CAAA;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,GAAG,EAAE,CAAA;KAAE,GAAG,GAAG,CAAC,CAAA;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,GAAG,EAAE,CAAA;KAAE,GAAG,GAAG,CAAC,CAAA;IAC9C,8BAA8B;IAC9B,OAAO,EAAE,eAAe,CAAA;IACxB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACzD,uCAAuC;IACvC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC,CAAA;AAyLD;;;GAGG;AACH,eAAO,MAAM,SAAS,+HAYnB,IAAI,qBA6XN,CAAA"}
@@ -92,6 +92,11 @@ const sanitizeRelationship = ({ adapter, config, field, locale, operation, ref,
92
92
  }
93
93
  if (Array.isArray(value)) {
94
94
  result = value.map((val)=>{
95
+ // Skip null/undefined entries so a stray null in a hasMany relationship
96
+ // array doesn't get coerced or crash downstream sanitization.
97
+ if (val === null || typeof val === 'undefined') {
98
+ return val;
99
+ }
95
100
  // Handle has many - polymorphic
96
101
  if (isValidRelationObject(val)) {
97
102
  const relatedCollectionForSingleValue = config.collections?.find(({ slug })=>slug === val.relationTo);
@@ -198,27 +203,20 @@ const stripFields = ({ config, data, fields, parentIsLocalized = false, reserved
198
203
  let hasNull = false;
199
204
  for(let i = 0; i < localeData.length; i++){
200
205
  const data = localeData[i];
206
+ if (!data || typeof data !== 'object') {
207
+ localeData[i] = null;
208
+ hasNull = true;
209
+ continue;
210
+ }
201
211
  let fields = null;
202
212
  if (field.type === 'array') {
203
213
  fields = field.flattenedFields;
204
214
  } else {
205
- let maybeBlock = undefined;
206
- if (field.blockReferences) {
207
- const maybeBlockReference = field.blockReferences.find((each)=>{
208
- const slug = typeof each === 'string' ? each : each.slug;
209
- return slug === data.blockType;
210
- });
211
- if (maybeBlockReference) {
212
- if (typeof maybeBlockReference === 'object') {
213
- maybeBlock = maybeBlockReference;
214
- } else {
215
- maybeBlock = config.blocks?.find((each)=>each.slug === maybeBlockReference);
216
- }
217
- }
218
- }
219
- if (!maybeBlock) {
220
- maybeBlock = field.blocks.find((each)=>each.slug === data.blockType);
221
- }
215
+ const blockOrSlug = field.blocks.find((each)=>{
216
+ const slug = typeof each === 'string' ? each : each.slug;
217
+ return slug === data.blockType;
218
+ });
219
+ const maybeBlock = typeof blockOrSlug === 'string' ? config.blocks?.find((each)=>each.slug === blockOrSlug) : blockOrSlug;
222
220
  if (maybeBlock) {
223
221
  fields = maybeBlock.flattenedFields;
224
222
  } else {
@@ -260,27 +258,20 @@ const stripFields = ({ config, data, fields, parentIsLocalized = false, reserved
260
258
  let hasNull = false;
261
259
  for(let i = 0; i < fieldData.length; i++){
262
260
  const data = fieldData[i];
261
+ if (!data || typeof data !== 'object') {
262
+ fieldData[i] = null;
263
+ hasNull = true;
264
+ continue;
265
+ }
263
266
  let fields = null;
264
267
  if (field.type === 'array') {
265
268
  fields = field.flattenedFields;
266
269
  } else {
267
- let maybeBlock = undefined;
268
- if (field.blockReferences) {
269
- const maybeBlockReference = field.blockReferences.find((each)=>{
270
- const slug = typeof each === 'string' ? each : each.slug;
271
- return slug === data.blockType;
272
- });
273
- if (maybeBlockReference) {
274
- if (typeof maybeBlockReference === 'object') {
275
- maybeBlock = maybeBlockReference;
276
- } else {
277
- maybeBlock = config.blocks?.find((each)=>each.slug === maybeBlockReference);
278
- }
279
- }
280
- }
281
- if (!maybeBlock) {
282
- maybeBlock = field.blocks.find((each)=>each.slug === data.blockType);
283
- }
270
+ const blockOrSlug = field.blocks.find((each)=>{
271
+ const slug = typeof each === 'string' ? each : each.slug;
272
+ return slug === data.blockType;
273
+ });
274
+ const maybeBlock = typeof blockOrSlug === 'string' ? config.blocks?.find((each)=>each.slug === blockOrSlug) : blockOrSlug;
284
275
  if (maybeBlock) {
285
276
  fields = maybeBlock.flattenedFields;
286
277
  } else {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/transform.ts"],"sourcesContent":["import type {\n CollectionConfig,\n DateField,\n Field,\n FlattenedBlock,\n FlattenedField,\n JoinField,\n RelationshipField,\n SanitizedConfig,\n TraverseFieldsCallback,\n UploadField,\n} from 'payload'\n\nimport { Types } from 'mongoose'\nimport { flattenAllFields, traverseFields } from 'payload'\nimport { fieldAffectsData, fieldShouldBeLocalized } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\n\nimport { isObjectID } from './isObjectID.js'\n\ninterface RelationObject {\n relationTo: string\n value: number | string\n}\n\nfunction isValidRelationObject(value: unknown): value is RelationObject {\n return typeof value === 'object' && value !== null && 'relationTo' in value && 'value' in value\n}\n\n/**\n * Process relationship values for polymorphic and simple relationships\n * Used by both $push and $remove operations\n */\nconst processRelationshipValues = (\n items: unknown[],\n field: RelationshipField | UploadField,\n config: SanitizedConfig,\n operation: 'read' | 'write',\n validateRelationships: boolean,\n adapter: MongooseAdapter,\n) => {\n return items.map((item) => {\n // Handle polymorphic relationships\n if (Array.isArray(field.relationTo) && isValidRelationObject(item)) {\n const relatedCollection = config.collections?.find(({ slug }) => slug === item.relationTo)\n if (relatedCollection) {\n return {\n relationTo: item.relationTo,\n value: convertRelationshipValue({\n adapter,\n operation,\n relatedCollection,\n validateRelationships,\n value: item.value,\n }),\n }\n }\n return item\n }\n\n // Handle simple relationships\n if (typeof field.relationTo === 'string') {\n const relatedCollection = config.collections?.find(({ slug }) => slug === field.relationTo)\n if (relatedCollection) {\n return convertRelationshipValue({\n adapter,\n operation,\n relatedCollection,\n validateRelationships,\n value: item,\n })\n }\n }\n\n return item\n })\n}\n\nconst convertRelationshipValue = ({\n adapter,\n operation,\n relatedCollection,\n validateRelationships,\n value,\n}: {\n adapter: MongooseAdapter\n operation: Args['operation']\n relatedCollection: CollectionConfig\n validateRelationships?: boolean\n value: unknown\n}) => {\n const customIDField = relatedCollection.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n )\n\n if (operation === 'read') {\n if (isObjectID(value)) {\n return value.toHexString()\n }\n\n if (\n customIDField?.type === 'number' &&\n typeof value === 'bigint' &&\n adapter.useBigIntForNumberIDs\n ) {\n return Number(value)\n }\n\n return value\n }\n\n if (customIDField) {\n return value\n }\n\n if (typeof value === 'string') {\n try {\n return new Types.ObjectId(value)\n } catch (e) {\n if (validateRelationships) {\n throw e\n }\n return value\n }\n }\n\n return value\n}\n\nconst sanitizeRelationship = ({\n adapter,\n config,\n field,\n locale,\n operation,\n ref,\n validateRelationships,\n value,\n}: {\n adapter: MongooseAdapter\n config: SanitizedConfig\n field: JoinField | RelationshipField | UploadField\n locale?: string\n operation: Args['operation']\n ref: Record<string, unknown>\n validateRelationships?: boolean\n value?: unknown\n}) => {\n if (field.type === 'join') {\n if (\n operation === 'read' &&\n value &&\n typeof value === 'object' &&\n 'docs' in value &&\n Array.isArray(value.docs)\n ) {\n for (let i = 0; i < value.docs.length; i++) {\n const item = value.docs[i]\n\n if (isObjectID(item)) {\n value.docs[i] = item.toHexString()\n } else if (Array.isArray(field.collection) && item) {\n // Fields here for polymorphic joins cannot be determinted, JSON.parse needed\n value.docs[i] = JSON.parse(JSON.stringify(value.docs[i]))\n }\n }\n }\n\n return value\n }\n let relatedCollection: CollectionConfig | undefined\n let result = value\n\n const hasManyRelations = typeof field.relationTo !== 'string'\n\n if (!hasManyRelations) {\n relatedCollection = config.collections?.find(({ slug }) => slug === field.relationTo)\n }\n\n if (Array.isArray(value)) {\n result = value.map((val) => {\n // Handle has many - polymorphic\n if (isValidRelationObject(val)) {\n const relatedCollectionForSingleValue = config.collections?.find(\n ({ slug }) => slug === val.relationTo,\n )\n\n if (relatedCollectionForSingleValue) {\n return {\n relationTo: val.relationTo,\n value: convertRelationshipValue({\n adapter,\n operation,\n relatedCollection: relatedCollectionForSingleValue,\n validateRelationships,\n value: val.value,\n }),\n }\n }\n }\n\n if (relatedCollection) {\n return convertRelationshipValue({\n adapter,\n operation,\n relatedCollection,\n validateRelationships,\n value: val,\n })\n }\n\n return val\n })\n }\n // Handle has one - polymorphic\n else if (isValidRelationObject(value)) {\n relatedCollection = config.collections?.find(({ slug }) => slug === value.relationTo)\n\n if (relatedCollection) {\n result = {\n relationTo: value.relationTo,\n value: convertRelationshipValue({\n adapter,\n operation,\n relatedCollection,\n validateRelationships,\n value: value.value,\n }),\n }\n }\n }\n // Handle has one\n else if (relatedCollection) {\n result = convertRelationshipValue({\n adapter,\n operation,\n relatedCollection,\n validateRelationships,\n value,\n })\n }\n\n if (locale) {\n ref[locale] = result\n } else {\n ref[field.name] = result\n }\n}\n\nconst sanitizeDate = ({\n field,\n locale,\n ref,\n value,\n}: {\n field: DateField\n locale?: string\n ref: Record<string, unknown>\n value: unknown\n}) => {\n if (!value) {\n return\n }\n\n if (value instanceof Date) {\n value = value.toISOString()\n }\n\n if (locale) {\n ref[locale] = value\n } else {\n ref[field.name] = value\n }\n}\n\ntype Args = {\n $addToSet?: Record<string, { $each: any[] } | any>\n $inc?: Record<string, number>\n $pull?: Record<string, { $in: any[] } | any>\n $push?: Record<string, { $each: any[] } | any>\n /** instance of the adapter */\n adapter: MongooseAdapter\n /** data to transform, can be an array of documents or a single document */\n data: Record<string, unknown> | Record<string, unknown>[]\n /** fields accossiated with the data */\n fields: Field[]\n /** slug of the global, pass only when the operation is `write` */\n globalSlug?: string\n /**\n * Type of the operation\n * read - sanitizes ObjectIDs, Date to strings.\n * write - sanitizes string relationships to ObjectIDs.\n */\n operation: 'read' | 'write'\n parentIsLocalized?: boolean\n /**\n * Throw errors on invalid relationships\n * @default true\n */\n validateRelationships?: boolean\n}\n\nconst stripFields = ({\n config,\n data,\n fields,\n parentIsLocalized = false,\n reservedKeys = [],\n}: {\n config: SanitizedConfig\n data: any\n fields: FlattenedField[]\n parentIsLocalized?: boolean\n reservedKeys?: string[]\n}) => {\n for (const k in data) {\n if (!fields.some((field) => field.name === k) && !reservedKeys.includes(k)) {\n delete data[k]\n }\n }\n\n for (const field of fields) {\n reservedKeys = []\n const fieldData = data[field.name]\n if (!fieldData || typeof fieldData !== 'object') {\n continue\n }\n\n const shouldLocalizeField = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n if (field.type === 'blocks') {\n reservedKeys.push('blockType')\n }\n\n if ('flattenedFields' in field || 'blocks' in field) {\n if (shouldLocalizeField && config.localization) {\n for (const localeKey in fieldData) {\n if (!config.localization.localeCodes.some((code) => code === localeKey)) {\n delete fieldData[localeKey]\n continue\n }\n\n const localeData = fieldData[localeKey]\n\n if (!localeData || typeof localeData !== 'object') {\n continue\n }\n\n if (field.type === 'array' || field.type === 'blocks') {\n if (!Array.isArray(localeData)) {\n continue\n }\n\n let hasNull = false\n for (let i = 0; i < localeData.length; i++) {\n const data = localeData[i]\n let fields: FlattenedField[] | null = null\n\n if (field.type === 'array') {\n fields = field.flattenedFields\n } else {\n let maybeBlock: FlattenedBlock | undefined = undefined\n\n if (field.blockReferences) {\n const maybeBlockReference = field.blockReferences.find((each) => {\n const slug = typeof each === 'string' ? each : each.slug\n return slug === data.blockType\n })\n\n if (maybeBlockReference) {\n if (typeof maybeBlockReference === 'object') {\n maybeBlock = maybeBlockReference\n } else {\n maybeBlock = config.blocks?.find((each) => each.slug === maybeBlockReference)\n }\n }\n }\n\n if (!maybeBlock) {\n maybeBlock = field.blocks.find((each) => each.slug === data.blockType)\n }\n\n if (maybeBlock) {\n fields = maybeBlock.flattenedFields\n } else {\n localeData[i] = null\n hasNull = true\n }\n }\n\n if (!fields) {\n continue\n }\n\n stripFields({\n config,\n data,\n fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n reservedKeys,\n })\n }\n\n if (hasNull) {\n fieldData[localeKey] = localeData.filter(Boolean)\n }\n\n continue\n } else {\n stripFields({\n config,\n data: localeData,\n fields: field.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n reservedKeys,\n })\n }\n }\n continue\n }\n\n if (field.type === 'array' || field.type === 'blocks') {\n if (!Array.isArray(fieldData)) {\n continue\n }\n\n let hasNull = false\n\n for (let i = 0; i < fieldData.length; i++) {\n const data = fieldData[i]\n let fields: FlattenedField[] | null = null\n\n if (field.type === 'array') {\n fields = field.flattenedFields\n } else {\n let maybeBlock: FlattenedBlock | undefined = undefined\n\n if (field.blockReferences) {\n const maybeBlockReference = field.blockReferences.find((each) => {\n const slug = typeof each === 'string' ? each : each.slug\n return slug === data.blockType\n })\n\n if (maybeBlockReference) {\n if (typeof maybeBlockReference === 'object') {\n maybeBlock = maybeBlockReference\n } else {\n maybeBlock = config.blocks?.find((each) => each.slug === maybeBlockReference)\n }\n }\n }\n\n if (!maybeBlock) {\n maybeBlock = field.blocks.find((each) => each.slug === data.blockType)\n }\n\n if (maybeBlock) {\n fields = maybeBlock.flattenedFields\n } else {\n fieldData[i] = null\n hasNull = true\n }\n }\n\n if (!fields) {\n continue\n }\n\n stripFields({\n config,\n data,\n fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n reservedKeys,\n })\n }\n\n if (hasNull) {\n data[field.name] = fieldData.filter(Boolean)\n }\n\n continue\n } else {\n stripFields({\n config,\n data: fieldData,\n fields: field.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n reservedKeys,\n })\n }\n }\n }\n}\n\n/**\n * A function that transforms Payload <-> MongoDB data.\n * @internal - this function may be removed or receive breaking changes in minor releases.\n */\nexport const transform = ({\n $addToSet,\n $inc,\n $pull,\n $push,\n adapter,\n data,\n fields,\n globalSlug,\n operation,\n parentIsLocalized = false,\n validateRelationships = true,\n}: Args) => {\n if (!data) {\n return null\n }\n\n if (Array.isArray(data)) {\n for (const item of data) {\n transform({\n $addToSet,\n $inc,\n $pull,\n $push,\n adapter,\n data: item,\n fields,\n globalSlug,\n operation,\n validateRelationships,\n })\n }\n return\n }\n\n const {\n payload: { config },\n } = adapter\n\n if (operation === 'read') {\n delete data['__v']\n data.id = data._id || data.id\n delete data['_id']\n\n if (isObjectID(data.id)) {\n data.id = data.id.toHexString()\n }\n\n // Handle BigInt conversion for custom ID fields of type 'number'\n if (adapter.useBigIntForNumberIDs && typeof data.id === 'bigint') {\n data.id = Number(data.id)\n }\n\n if (!adapter.allowAdditionalKeys) {\n stripFields({\n config,\n data,\n fields: flattenAllFields({ cache: true, fields }),\n parentIsLocalized: false,\n reservedKeys: ['id', 'globalType'],\n })\n }\n }\n\n if (operation === 'write' && globalSlug) {\n data.globalType = globalSlug\n }\n\n const sanitize: TraverseFieldsCallback = ({\n field,\n parentIsLocalized,\n parentPath,\n parentRef: incomingParentRef,\n ref: incomingRef,\n }) => {\n if (!incomingRef || typeof incomingRef !== 'object') {\n return\n }\n\n const ref = incomingRef as Record<string, unknown>\n const parentRef = (incomingParentRef || {}) as Record<string, unknown>\n\n // Clear empty parent containers by setting them to undefined.\n const clearEmptyContainer = () => {\n if (!parentRef || typeof parentRef !== 'object') {\n return\n }\n if (!ref || typeof ref !== 'object') {\n return\n }\n if (Object.keys(ref).length > 0) {\n return\n }\n const containerKey = Object.keys(parentRef).find((k) => parentRef[k] === ref)\n if (containerKey) {\n parentRef[containerKey] = undefined\n }\n }\n\n if (\n $inc &&\n field.type === 'number' &&\n operation === 'write' &&\n field.name in ref &&\n ref[field.name]\n ) {\n const value = ref[field.name]\n if (value && typeof value === 'object' && '$inc' in value && typeof value.$inc === 'number') {\n $inc[`${parentPath}${field.name}`] = value.$inc\n delete ref[field.name]\n clearEmptyContainer()\n }\n }\n\n if (\n $push &&\n field.type === 'array' &&\n operation === 'write' &&\n field.name in ref &&\n ref[field.name]\n ) {\n const value = ref[field.name]\n\n if (\n value &&\n typeof value === 'object' &&\n ('$push' in value ||\n (config.localization &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n Object.values(value).some(\n (localeValue) =>\n localeValue && typeof localeValue === 'object' && '$push' in localeValue,\n )))\n ) {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n // Handle localized fields: { field: { locale: { $push: data } } }\n let hasLocaleOperations = false\n Object.entries(value).forEach(([localeKey, localeValue]) => {\n if (localeValue && typeof localeValue === 'object' && '$push' in localeValue) {\n hasLocaleOperations = true\n const push = localeValue.$push\n if (Array.isArray(push)) {\n $push[`${parentPath}${field.name}.${localeKey}`] = { $each: push }\n } else if (typeof push === 'object') {\n $push[`${parentPath}${field.name}.${localeKey}`] = push\n }\n }\n })\n\n if (hasLocaleOperations) {\n delete ref[field.name]\n clearEmptyContainer()\n }\n } else if (value && typeof value === 'object' && '$push' in value) {\n // Handle non-localized fields: { field: { $push: data } }\n const push = value.$push\n if (Array.isArray(push)) {\n $push[`${parentPath}${field.name}`] = { $each: push }\n } else if (typeof push === 'object') {\n $push[`${parentPath}${field.name}`] = push\n }\n delete ref[field.name]\n clearEmptyContainer()\n }\n }\n }\n\n // Handle $push operation for relationship fields (converts to $addToSet)\n\n // Handle $push operation for relationship fields (converts to $addToSet) - unified approach\n if (\n $addToSet &&\n (field.type === 'relationship' || field.type === 'upload') &&\n 'hasMany' in field &&\n field.hasMany &&\n operation === 'write' &&\n field.name in ref &&\n ref[field.name]\n ) {\n const value = ref[field.name]\n\n if (\n value &&\n typeof value === 'object' &&\n ('$push' in value ||\n (config.localization &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n Object.values(value).some(\n (localeValue) =>\n localeValue &&\n typeof localeValue === 'object' &&\n '$push' in (localeValue as Record<string, unknown>),\n )))\n ) {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n // Handle localized fields: { field: { locale: { $push: data } } }\n let hasLocaleOperations = false\n Object.entries(value).forEach(([localeKey, localeValue]) => {\n if (localeValue && typeof localeValue === 'object' && '$push' in localeValue) {\n hasLocaleOperations = true\n const push = localeValue.$push\n const localeItems = Array.isArray(push) ? push : [push]\n const processedLocaleItems = processRelationshipValues(\n localeItems,\n field,\n config,\n operation,\n validateRelationships,\n adapter,\n )\n $addToSet[`${parentPath}${field.name}.${localeKey}`] = { $each: processedLocaleItems }\n }\n })\n\n if (hasLocaleOperations) {\n delete ref[field.name]\n clearEmptyContainer()\n }\n } else if (value && typeof value === 'object' && '$push' in value) {\n // Handle non-localized fields: { field: { $push: data } }\n const itemsToAppend = Array.isArray(value.$push) ? value.$push : [value.$push]\n const processedItems = processRelationshipValues(\n itemsToAppend,\n field,\n config,\n operation,\n validateRelationships,\n adapter,\n )\n $addToSet[`${parentPath}${field.name}`] = { $each: processedItems }\n delete ref[field.name]\n clearEmptyContainer()\n }\n }\n }\n\n // Handle $remove operation for relationship fields (converts to $pull)\n if (\n $pull &&\n (field.type === 'relationship' || field.type === 'upload') &&\n 'hasMany' in field &&\n field.hasMany &&\n operation === 'write' &&\n field.name in ref &&\n ref[field.name]\n ) {\n const value = ref[field.name]\n if (\n value &&\n typeof value === 'object' &&\n ('$remove' in value ||\n (config.localization &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n Object.values(value).some(\n (localeValue) =>\n localeValue &&\n typeof localeValue === 'object' &&\n '$remove' in (localeValue as Record<string, unknown>),\n )))\n ) {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n // Handle localized fields: { field: { locale: { $remove: data } } }\n let hasLocaleOperations = false\n Object.entries(value).forEach(([localeKey, localeValue]) => {\n if (localeValue && typeof localeValue === 'object' && '$remove' in localeValue) {\n hasLocaleOperations = true\n const remove = localeValue.$remove\n const localeItems = Array.isArray(remove) ? remove : [remove]\n const processedLocaleItems = processRelationshipValues(\n localeItems,\n field,\n config,\n operation,\n validateRelationships,\n adapter,\n )\n $pull[`${parentPath}${field.name}.${localeKey}`] = { $in: processedLocaleItems }\n }\n })\n\n if (hasLocaleOperations) {\n delete ref[field.name]\n clearEmptyContainer()\n }\n } else if (value && typeof value === 'object' && '$remove' in value) {\n // Handle non-localized fields: { field: { $remove: data } }\n const itemsToRemove = Array.isArray(value.$remove) ? value.$remove : [value.$remove]\n const processedItems = processRelationshipValues(\n itemsToRemove,\n field,\n config,\n operation,\n validateRelationships,\n adapter,\n )\n $pull[`${parentPath}${field.name}`] = { $in: processedItems }\n delete ref[field.name]\n clearEmptyContainer()\n }\n }\n }\n\n if (field.type === 'date' && operation === 'read' && field.name in ref && ref[field.name]) {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n const fieldRef = ref[field.name] as Record<string, unknown>\n if (!fieldRef || typeof fieldRef !== 'object') {\n return\n }\n\n for (const locale of config.localization.localeCodes) {\n sanitizeDate({\n field,\n locale,\n ref: fieldRef,\n value: fieldRef[locale],\n })\n }\n } else {\n sanitizeDate({\n field,\n ref,\n value: ref[field.name],\n })\n }\n }\n\n if (\n field.type === 'relationship' ||\n field.type === 'upload' ||\n (operation === 'read' && field.type === 'join')\n ) {\n if (!ref[field.name]) {\n return\n }\n\n // handle localized relationships\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n const locales = config.localization.locales\n const fieldRef = ref[field.name] as Record<string, unknown>\n if (typeof fieldRef !== 'object') {\n return\n }\n\n for (const { code } of locales) {\n const value = fieldRef[code]\n if (value) {\n sanitizeRelationship({\n adapter,\n config,\n field,\n locale: code,\n operation,\n ref: fieldRef,\n validateRelationships,\n value,\n })\n }\n }\n } else {\n // handle non-localized relationships\n sanitizeRelationship({\n adapter,\n config,\n field,\n locale: undefined,\n operation,\n ref,\n validateRelationships,\n value: ref[field.name],\n })\n }\n }\n }\n\n traverseFields({\n callback: sanitize,\n config,\n fields,\n fillEmpty: false,\n parentIsLocalized,\n ref: data,\n })\n\n if (operation === 'write') {\n if (typeof data.updatedAt === 'undefined') {\n // If data.updatedAt is explicitly set to `null` we should not set it - this means we don't want to change the value of updatedAt.\n data.updatedAt = new Date().toISOString()\n } else if (data.updatedAt === null) {\n // `updatedAt` may be explicitly set to null to disable updating it - if that is the case, we need to delete the property. Keeping it as null will\n // cause the database to think we want to set it to null, which we don't.\n delete data.updatedAt\n }\n }\n}\n"],"names":["Types","flattenAllFields","traverseFields","fieldAffectsData","fieldShouldBeLocalized","isObjectID","isValidRelationObject","value","processRelationshipValues","items","field","config","operation","validateRelationships","adapter","map","item","Array","isArray","relationTo","relatedCollection","collections","find","slug","convertRelationshipValue","customIDField","fields","name","toHexString","type","useBigIntForNumberIDs","Number","ObjectId","e","sanitizeRelationship","locale","ref","docs","i","length","collection","JSON","parse","stringify","result","hasManyRelations","val","relatedCollectionForSingleValue","sanitizeDate","Date","toISOString","stripFields","data","parentIsLocalized","reservedKeys","k","some","includes","fieldData","shouldLocalizeField","push","localization","localeKey","localeCodes","code","localeData","hasNull","flattenedFields","maybeBlock","undefined","blockReferences","maybeBlockReference","each","blockType","blocks","localized","filter","Boolean","transform","$addToSet","$inc","$pull","$push","globalSlug","payload","id","_id","allowAdditionalKeys","cache","globalType","sanitize","parentPath","parentRef","incomingParentRef","incomingRef","clearEmptyContainer","Object","keys","containerKey","values","localeValue","hasLocaleOperations","entries","forEach","$each","hasMany","localeItems","processedLocaleItems","itemsToAppend","processedItems","remove","$remove","$in","itemsToRemove","fieldRef","locales","callback","fillEmpty","updatedAt"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/transform.ts"],"sourcesContent":["import type {\n CollectionConfig,\n DateField,\n Field,\n FlattenedBlock,\n FlattenedField,\n JoinField,\n RelationshipField,\n SanitizedConfig,\n TraverseFieldsCallback,\n UploadField,\n} from 'payload'\n\nimport { Types } from 'mongoose'\nimport { flattenAllFields, traverseFields } from 'payload'\nimport { fieldAffectsData, fieldShouldBeLocalized } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\n\nimport { isObjectID } from './isObjectID.js'\n\ninterface RelationObject {\n relationTo: string\n value: number | string\n}\n\nfunction isValidRelationObject(value: unknown): value is RelationObject {\n return typeof value === 'object' && value !== null && 'relationTo' in value && 'value' in value\n}\n\n/**\n * Process relationship values for polymorphic and simple relationships\n * Used by both $push and $remove operations\n */\nconst processRelationshipValues = (\n items: unknown[],\n field: RelationshipField | UploadField,\n config: SanitizedConfig,\n operation: 'read' | 'write',\n validateRelationships: boolean,\n adapter: MongooseAdapter,\n) => {\n return items.map((item) => {\n // Handle polymorphic relationships\n if (Array.isArray(field.relationTo) && isValidRelationObject(item)) {\n const relatedCollection = config.collections?.find(({ slug }) => slug === item.relationTo)\n if (relatedCollection) {\n return {\n relationTo: item.relationTo,\n value: convertRelationshipValue({\n adapter,\n operation,\n relatedCollection,\n validateRelationships,\n value: item.value,\n }),\n }\n }\n return item\n }\n\n // Handle simple relationships\n if (typeof field.relationTo === 'string') {\n const relatedCollection = config.collections?.find(({ slug }) => slug === field.relationTo)\n if (relatedCollection) {\n return convertRelationshipValue({\n adapter,\n operation,\n relatedCollection,\n validateRelationships,\n value: item,\n })\n }\n }\n\n return item\n })\n}\n\nconst convertRelationshipValue = ({\n adapter,\n operation,\n relatedCollection,\n validateRelationships,\n value,\n}: {\n adapter: MongooseAdapter\n operation: Args['operation']\n relatedCollection: CollectionConfig\n validateRelationships?: boolean\n value: unknown\n}) => {\n const customIDField = relatedCollection.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n )\n\n if (operation === 'read') {\n if (isObjectID(value)) {\n return value.toHexString()\n }\n\n if (\n customIDField?.type === 'number' &&\n typeof value === 'bigint' &&\n adapter.useBigIntForNumberIDs\n ) {\n return Number(value)\n }\n\n return value\n }\n\n if (customIDField) {\n return value\n }\n\n if (typeof value === 'string') {\n try {\n return new Types.ObjectId(value)\n } catch (e) {\n if (validateRelationships) {\n throw e\n }\n return value\n }\n }\n\n return value\n}\n\nconst sanitizeRelationship = ({\n adapter,\n config,\n field,\n locale,\n operation,\n ref,\n validateRelationships,\n value,\n}: {\n adapter: MongooseAdapter\n config: SanitizedConfig\n field: JoinField | RelationshipField | UploadField\n locale?: string\n operation: Args['operation']\n ref: Record<string, unknown>\n validateRelationships?: boolean\n value?: unknown\n}) => {\n if (field.type === 'join') {\n if (\n operation === 'read' &&\n value &&\n typeof value === 'object' &&\n 'docs' in value &&\n Array.isArray(value.docs)\n ) {\n for (let i = 0; i < value.docs.length; i++) {\n const item = value.docs[i]\n\n if (isObjectID(item)) {\n value.docs[i] = item.toHexString()\n } else if (Array.isArray(field.collection) && item) {\n // Fields here for polymorphic joins cannot be determinted, JSON.parse needed\n value.docs[i] = JSON.parse(JSON.stringify(value.docs[i]))\n }\n }\n }\n\n return value\n }\n let relatedCollection: CollectionConfig | undefined\n let result = value\n\n const hasManyRelations = typeof field.relationTo !== 'string'\n\n if (!hasManyRelations) {\n relatedCollection = config.collections?.find(({ slug }) => slug === field.relationTo)\n }\n\n if (Array.isArray(value)) {\n result = value.map((val) => {\n // Skip null/undefined entries so a stray null in a hasMany relationship\n // array doesn't get coerced or crash downstream sanitization.\n if (val === null || typeof val === 'undefined') {\n return val\n }\n\n // Handle has many - polymorphic\n if (isValidRelationObject(val)) {\n const relatedCollectionForSingleValue = config.collections?.find(\n ({ slug }) => slug === val.relationTo,\n )\n\n if (relatedCollectionForSingleValue) {\n return {\n relationTo: val.relationTo,\n value: convertRelationshipValue({\n adapter,\n operation,\n relatedCollection: relatedCollectionForSingleValue,\n validateRelationships,\n value: val.value,\n }),\n }\n }\n }\n\n if (relatedCollection) {\n return convertRelationshipValue({\n adapter,\n operation,\n relatedCollection,\n validateRelationships,\n value: val,\n })\n }\n\n return val\n })\n }\n // Handle has one - polymorphic\n else if (isValidRelationObject(value)) {\n relatedCollection = config.collections?.find(({ slug }) => slug === value.relationTo)\n\n if (relatedCollection) {\n result = {\n relationTo: value.relationTo,\n value: convertRelationshipValue({\n adapter,\n operation,\n relatedCollection,\n validateRelationships,\n value: value.value,\n }),\n }\n }\n }\n // Handle has one\n else if (relatedCollection) {\n result = convertRelationshipValue({\n adapter,\n operation,\n relatedCollection,\n validateRelationships,\n value,\n })\n }\n\n if (locale) {\n ref[locale] = result\n } else {\n ref[field.name] = result\n }\n}\n\nconst sanitizeDate = ({\n field,\n locale,\n ref,\n value,\n}: {\n field: DateField\n locale?: string\n ref: Record<string, unknown>\n value: unknown\n}) => {\n if (!value) {\n return\n }\n\n if (value instanceof Date) {\n value = value.toISOString()\n }\n\n if (locale) {\n ref[locale] = value\n } else {\n ref[field.name] = value\n }\n}\n\ntype Args = {\n $addToSet?: Record<string, { $each: any[] } | any>\n $inc?: Record<string, number>\n $pull?: Record<string, { $in: any[] } | any>\n $push?: Record<string, { $each: any[] } | any>\n /** instance of the adapter */\n adapter: MongooseAdapter\n /** data to transform, can be an array of documents or a single document */\n data: Record<string, unknown> | Record<string, unknown>[]\n /** fields accossiated with the data */\n fields: Field[]\n /** slug of the global, pass only when the operation is `write` */\n globalSlug?: string\n /**\n * Type of the operation\n * read - sanitizes ObjectIDs, Date to strings.\n * write - sanitizes string relationships to ObjectIDs.\n */\n operation: 'read' | 'write'\n parentIsLocalized?: boolean\n /**\n * Throw errors on invalid relationships\n * @default true\n */\n validateRelationships?: boolean\n}\n\nconst stripFields = ({\n config,\n data,\n fields,\n parentIsLocalized = false,\n reservedKeys = [],\n}: {\n config: SanitizedConfig\n data: any\n fields: FlattenedField[]\n parentIsLocalized?: boolean\n reservedKeys?: string[]\n}) => {\n for (const k in data) {\n if (!fields.some((field) => field.name === k) && !reservedKeys.includes(k)) {\n delete data[k]\n }\n }\n\n for (const field of fields) {\n reservedKeys = []\n const fieldData = data[field.name]\n if (!fieldData || typeof fieldData !== 'object') {\n continue\n }\n\n const shouldLocalizeField = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n if (field.type === 'blocks') {\n reservedKeys.push('blockType')\n }\n\n if ('flattenedFields' in field || 'blocks' in field) {\n if (shouldLocalizeField && config.localization) {\n for (const localeKey in fieldData) {\n if (!config.localization.localeCodes.some((code) => code === localeKey)) {\n delete fieldData[localeKey]\n continue\n }\n\n const localeData = fieldData[localeKey]\n\n if (!localeData || typeof localeData !== 'object') {\n continue\n }\n\n if (field.type === 'array' || field.type === 'blocks') {\n if (!Array.isArray(localeData)) {\n continue\n }\n\n let hasNull = false\n for (let i = 0; i < localeData.length; i++) {\n const data = localeData[i]\n\n if (!data || typeof data !== 'object') {\n localeData[i] = null\n hasNull = true\n continue\n }\n\n let fields: FlattenedField[] | null = null\n\n if (field.type === 'array') {\n fields = field.flattenedFields\n } else {\n const blockOrSlug = field.blocks.find((each) => {\n const slug = typeof each === 'string' ? each : each.slug\n return slug === data.blockType\n })\n const maybeBlock: FlattenedBlock | undefined =\n typeof blockOrSlug === 'string'\n ? config.blocks?.find((each) => each.slug === blockOrSlug)\n : blockOrSlug\n\n if (maybeBlock) {\n fields = maybeBlock.flattenedFields\n } else {\n localeData[i] = null\n hasNull = true\n }\n }\n\n if (!fields) {\n continue\n }\n\n stripFields({\n config,\n data,\n fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n reservedKeys,\n })\n }\n\n if (hasNull) {\n fieldData[localeKey] = localeData.filter(Boolean)\n }\n\n continue\n } else {\n stripFields({\n config,\n data: localeData,\n fields: field.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n reservedKeys,\n })\n }\n }\n continue\n }\n\n if (field.type === 'array' || field.type === 'blocks') {\n if (!Array.isArray(fieldData)) {\n continue\n }\n\n let hasNull = false\n\n for (let i = 0; i < fieldData.length; i++) {\n const data = fieldData[i]\n\n if (!data || typeof data !== 'object') {\n fieldData[i] = null\n hasNull = true\n continue\n }\n\n let fields: FlattenedField[] | null = null\n\n if (field.type === 'array') {\n fields = field.flattenedFields\n } else {\n const blockOrSlug = field.blocks.find((each) => {\n const slug = typeof each === 'string' ? each : each.slug\n return slug === data.blockType\n })\n const maybeBlock: FlattenedBlock | undefined =\n typeof blockOrSlug === 'string'\n ? config.blocks?.find((each) => each.slug === blockOrSlug)\n : blockOrSlug\n\n if (maybeBlock) {\n fields = maybeBlock.flattenedFields\n } else {\n fieldData[i] = null\n hasNull = true\n }\n }\n\n if (!fields) {\n continue\n }\n\n stripFields({\n config,\n data,\n fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n reservedKeys,\n })\n }\n\n if (hasNull) {\n data[field.name] = fieldData.filter(Boolean)\n }\n\n continue\n } else {\n stripFields({\n config,\n data: fieldData,\n fields: field.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n reservedKeys,\n })\n }\n }\n }\n}\n\n/**\n * A function that transforms Payload <-> MongoDB data.\n * @internal - this function may be removed or receive breaking changes in minor releases.\n */\nexport const transform = ({\n $addToSet,\n $inc,\n $pull,\n $push,\n adapter,\n data,\n fields,\n globalSlug,\n operation,\n parentIsLocalized = false,\n validateRelationships = true,\n}: Args) => {\n if (!data) {\n return null\n }\n\n if (Array.isArray(data)) {\n for (const item of data) {\n transform({\n $addToSet,\n $inc,\n $pull,\n $push,\n adapter,\n data: item,\n fields,\n globalSlug,\n operation,\n validateRelationships,\n })\n }\n return\n }\n\n const {\n payload: { config },\n } = adapter\n\n if (operation === 'read') {\n delete data['__v']\n data.id = data._id || data.id\n delete data['_id']\n\n if (isObjectID(data.id)) {\n data.id = data.id.toHexString()\n }\n\n // Handle BigInt conversion for custom ID fields of type 'number'\n if (adapter.useBigIntForNumberIDs && typeof data.id === 'bigint') {\n data.id = Number(data.id)\n }\n\n if (!adapter.allowAdditionalKeys) {\n stripFields({\n config,\n data,\n fields: flattenAllFields({ cache: true, fields }),\n parentIsLocalized: false,\n reservedKeys: ['id', 'globalType'],\n })\n }\n }\n\n if (operation === 'write' && globalSlug) {\n data.globalType = globalSlug\n }\n\n const sanitize: TraverseFieldsCallback = ({\n field,\n parentIsLocalized,\n parentPath,\n parentRef: incomingParentRef,\n ref: incomingRef,\n }) => {\n if (!incomingRef || typeof incomingRef !== 'object') {\n return\n }\n\n const ref = incomingRef as Record<string, unknown>\n const parentRef = (incomingParentRef || {}) as Record<string, unknown>\n\n // Clear empty parent containers by setting them to undefined.\n const clearEmptyContainer = () => {\n if (!parentRef || typeof parentRef !== 'object') {\n return\n }\n if (!ref || typeof ref !== 'object') {\n return\n }\n if (Object.keys(ref).length > 0) {\n return\n }\n const containerKey = Object.keys(parentRef).find((k) => parentRef[k] === ref)\n if (containerKey) {\n parentRef[containerKey] = undefined\n }\n }\n\n if (\n $inc &&\n field.type === 'number' &&\n operation === 'write' &&\n field.name in ref &&\n ref[field.name]\n ) {\n const value = ref[field.name]\n if (value && typeof value === 'object' && '$inc' in value && typeof value.$inc === 'number') {\n $inc[`${parentPath}${field.name}`] = value.$inc\n delete ref[field.name]\n clearEmptyContainer()\n }\n }\n\n if (\n $push &&\n field.type === 'array' &&\n operation === 'write' &&\n field.name in ref &&\n ref[field.name]\n ) {\n const value = ref[field.name]\n\n if (\n value &&\n typeof value === 'object' &&\n ('$push' in value ||\n (config.localization &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n Object.values(value).some(\n (localeValue) =>\n localeValue && typeof localeValue === 'object' && '$push' in localeValue,\n )))\n ) {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n // Handle localized fields: { field: { locale: { $push: data } } }\n let hasLocaleOperations = false\n Object.entries(value).forEach(([localeKey, localeValue]) => {\n if (localeValue && typeof localeValue === 'object' && '$push' in localeValue) {\n hasLocaleOperations = true\n const push = localeValue.$push\n if (Array.isArray(push)) {\n $push[`${parentPath}${field.name}.${localeKey}`] = { $each: push }\n } else if (typeof push === 'object') {\n $push[`${parentPath}${field.name}.${localeKey}`] = push\n }\n }\n })\n\n if (hasLocaleOperations) {\n delete ref[field.name]\n clearEmptyContainer()\n }\n } else if (value && typeof value === 'object' && '$push' in value) {\n // Handle non-localized fields: { field: { $push: data } }\n const push = value.$push\n if (Array.isArray(push)) {\n $push[`${parentPath}${field.name}`] = { $each: push }\n } else if (typeof push === 'object') {\n $push[`${parentPath}${field.name}`] = push\n }\n delete ref[field.name]\n clearEmptyContainer()\n }\n }\n }\n\n // Handle $push operation for relationship fields (converts to $addToSet)\n\n // Handle $push operation for relationship fields (converts to $addToSet) - unified approach\n if (\n $addToSet &&\n (field.type === 'relationship' || field.type === 'upload') &&\n 'hasMany' in field &&\n field.hasMany &&\n operation === 'write' &&\n field.name in ref &&\n ref[field.name]\n ) {\n const value = ref[field.name]\n\n if (\n value &&\n typeof value === 'object' &&\n ('$push' in value ||\n (config.localization &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n Object.values(value).some(\n (localeValue) =>\n localeValue &&\n typeof localeValue === 'object' &&\n '$push' in (localeValue as Record<string, unknown>),\n )))\n ) {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n // Handle localized fields: { field: { locale: { $push: data } } }\n let hasLocaleOperations = false\n Object.entries(value).forEach(([localeKey, localeValue]) => {\n if (localeValue && typeof localeValue === 'object' && '$push' in localeValue) {\n hasLocaleOperations = true\n const push = localeValue.$push\n const localeItems = Array.isArray(push) ? push : [push]\n const processedLocaleItems = processRelationshipValues(\n localeItems,\n field,\n config,\n operation,\n validateRelationships,\n adapter,\n )\n $addToSet[`${parentPath}${field.name}.${localeKey}`] = { $each: processedLocaleItems }\n }\n })\n\n if (hasLocaleOperations) {\n delete ref[field.name]\n clearEmptyContainer()\n }\n } else if (value && typeof value === 'object' && '$push' in value) {\n // Handle non-localized fields: { field: { $push: data } }\n const itemsToAppend = Array.isArray(value.$push) ? value.$push : [value.$push]\n const processedItems = processRelationshipValues(\n itemsToAppend,\n field,\n config,\n operation,\n validateRelationships,\n adapter,\n )\n $addToSet[`${parentPath}${field.name}`] = { $each: processedItems }\n delete ref[field.name]\n clearEmptyContainer()\n }\n }\n }\n\n // Handle $remove operation for relationship fields (converts to $pull)\n if (\n $pull &&\n (field.type === 'relationship' || field.type === 'upload') &&\n 'hasMany' in field &&\n field.hasMany &&\n operation === 'write' &&\n field.name in ref &&\n ref[field.name]\n ) {\n const value = ref[field.name]\n if (\n value &&\n typeof value === 'object' &&\n ('$remove' in value ||\n (config.localization &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n Object.values(value).some(\n (localeValue) =>\n localeValue &&\n typeof localeValue === 'object' &&\n '$remove' in (localeValue as Record<string, unknown>),\n )))\n ) {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n // Handle localized fields: { field: { locale: { $remove: data } } }\n let hasLocaleOperations = false\n Object.entries(value).forEach(([localeKey, localeValue]) => {\n if (localeValue && typeof localeValue === 'object' && '$remove' in localeValue) {\n hasLocaleOperations = true\n const remove = localeValue.$remove\n const localeItems = Array.isArray(remove) ? remove : [remove]\n const processedLocaleItems = processRelationshipValues(\n localeItems,\n field,\n config,\n operation,\n validateRelationships,\n adapter,\n )\n $pull[`${parentPath}${field.name}.${localeKey}`] = { $in: processedLocaleItems }\n }\n })\n\n if (hasLocaleOperations) {\n delete ref[field.name]\n clearEmptyContainer()\n }\n } else if (value && typeof value === 'object' && '$remove' in value) {\n // Handle non-localized fields: { field: { $remove: data } }\n const itemsToRemove = Array.isArray(value.$remove) ? value.$remove : [value.$remove]\n const processedItems = processRelationshipValues(\n itemsToRemove,\n field,\n config,\n operation,\n validateRelationships,\n adapter,\n )\n $pull[`${parentPath}${field.name}`] = { $in: processedItems }\n delete ref[field.name]\n clearEmptyContainer()\n }\n }\n }\n\n if (field.type === 'date' && operation === 'read' && field.name in ref && ref[field.name]) {\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n const fieldRef = ref[field.name] as Record<string, unknown>\n if (!fieldRef || typeof fieldRef !== 'object') {\n return\n }\n\n for (const locale of config.localization.localeCodes) {\n sanitizeDate({\n field,\n locale,\n ref: fieldRef,\n value: fieldRef[locale],\n })\n }\n } else {\n sanitizeDate({\n field,\n ref,\n value: ref[field.name],\n })\n }\n }\n\n if (\n field.type === 'relationship' ||\n field.type === 'upload' ||\n (operation === 'read' && field.type === 'join')\n ) {\n if (!ref[field.name]) {\n return\n }\n\n // handle localized relationships\n if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n const locales = config.localization.locales\n const fieldRef = ref[field.name] as Record<string, unknown>\n if (typeof fieldRef !== 'object') {\n return\n }\n\n for (const { code } of locales) {\n const value = fieldRef[code]\n if (value) {\n sanitizeRelationship({\n adapter,\n config,\n field,\n locale: code,\n operation,\n ref: fieldRef,\n validateRelationships,\n value,\n })\n }\n }\n } else {\n // handle non-localized relationships\n sanitizeRelationship({\n adapter,\n config,\n field,\n locale: undefined,\n operation,\n ref,\n validateRelationships,\n value: ref[field.name],\n })\n }\n }\n }\n\n traverseFields({\n callback: sanitize,\n config,\n fields,\n fillEmpty: false,\n parentIsLocalized,\n ref: data,\n })\n\n if (operation === 'write') {\n if (typeof data.updatedAt === 'undefined') {\n // If data.updatedAt is explicitly set to `null` we should not set it - this means we don't want to change the value of updatedAt.\n data.updatedAt = new Date().toISOString()\n } else if (data.updatedAt === null) {\n // `updatedAt` may be explicitly set to null to disable updating it - if that is the case, we need to delete the property. Keeping it as null will\n // cause the database to think we want to set it to null, which we don't.\n delete data.updatedAt\n }\n }\n}\n"],"names":["Types","flattenAllFields","traverseFields","fieldAffectsData","fieldShouldBeLocalized","isObjectID","isValidRelationObject","value","processRelationshipValues","items","field","config","operation","validateRelationships","adapter","map","item","Array","isArray","relationTo","relatedCollection","collections","find","slug","convertRelationshipValue","customIDField","fields","name","toHexString","type","useBigIntForNumberIDs","Number","ObjectId","e","sanitizeRelationship","locale","ref","docs","i","length","collection","JSON","parse","stringify","result","hasManyRelations","val","relatedCollectionForSingleValue","sanitizeDate","Date","toISOString","stripFields","data","parentIsLocalized","reservedKeys","k","some","includes","fieldData","shouldLocalizeField","push","localization","localeKey","localeCodes","code","localeData","hasNull","flattenedFields","blockOrSlug","blocks","each","blockType","maybeBlock","localized","filter","Boolean","transform","$addToSet","$inc","$pull","$push","globalSlug","payload","id","_id","allowAdditionalKeys","cache","globalType","sanitize","parentPath","parentRef","incomingParentRef","incomingRef","clearEmptyContainer","Object","keys","containerKey","undefined","values","localeValue","hasLocaleOperations","entries","forEach","$each","hasMany","localeItems","processedLocaleItems","itemsToAppend","processedItems","remove","$remove","$in","itemsToRemove","fieldRef","locales","callback","fillEmpty","updatedAt"],"mappings":"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"}
@@ -169,9 +169,9 @@ const config = {
169
169
  ]
170
170
  },
171
171
  {
172
- name: 'blockReferences',
172
+ name: 'referencedBlocks',
173
173
  type: 'blocks',
174
- blockReferences: [
174
+ blocks: [
175
175
  'reference-block'
176
176
  ]
177
177
  },
@@ -390,7 +390,7 @@ describe('transform', ()=>{
390
390
  }
391
391
  }
392
392
  ],
393
- blockReferences: [
393
+ referencedBlocks: [
394
394
  {
395
395
  blockType: 'reference-block',
396
396
  array: [
@@ -474,6 +474,73 @@ describe('transform', ()=>{
474
474
  expect(flattenValuesBefore[i]).toBe(value.toHexString());
475
475
  });
476
476
  });
477
+ it('should strip null elements from array and blocks fields on read', ()=>{
478
+ const data = {
479
+ _id: new Types.ObjectId(),
480
+ array: [
481
+ null,
482
+ {
483
+ rel_1: new Types.ObjectId()
484
+ }
485
+ ],
486
+ arrayLocalized: {
487
+ en: [
488
+ null,
489
+ {
490
+ rel_1: new Types.ObjectId()
491
+ }
492
+ ]
493
+ },
494
+ blocks: [
495
+ null,
496
+ {
497
+ blockType: 'block',
498
+ rel_1: new Types.ObjectId()
499
+ }
500
+ ]
501
+ };
502
+ const mockAdapter = {
503
+ allowAdditionalKeys: false,
504
+ payload: {
505
+ config
506
+ }
507
+ };
508
+ expect(()=>transform({
509
+ adapter: mockAdapter,
510
+ operation: 'read',
511
+ data,
512
+ fields: config.collections[0].fields
513
+ })).not.toThrow();
514
+ expect(data.array).toHaveLength(1);
515
+ expect(data.array[0]).toMatchObject({});
516
+ expect(data.arrayLocalized.en).toHaveLength(1);
517
+ expect(data.blocks).toHaveLength(1);
518
+ expect(data.blocks[0].blockType).toBe('block');
519
+ });
520
+ it('should skip null entries in hasMany relationship arrays without coercing them', ()=>{
521
+ const validId = new Types.ObjectId();
522
+ const data = {
523
+ _id: new Types.ObjectId(),
524
+ rel_2: [
525
+ null,
526
+ validId
527
+ ]
528
+ };
529
+ const mockAdapter = {
530
+ allowAdditionalKeys: false,
531
+ payload: {
532
+ config
533
+ }
534
+ };
535
+ expect(()=>transform({
536
+ adapter: mockAdapter,
537
+ operation: 'read',
538
+ data,
539
+ fields: config.collections[0].fields
540
+ })).not.toThrow();
541
+ expect(data.rel_2[0]).toBeNull();
542
+ expect(data.rel_2[1]).toBe(validId.toHexString());
543
+ });
477
544
  });
478
545
 
479
546
  //# sourceMappingURL=transform.spec.js.map