@payloadcms/db-mongodb 3.24.0-canary.f229d8d → 3.24.0

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 (113) hide show
  1. package/dist/count.d.ts.map +1 -1
  2. package/dist/count.js +5 -2
  3. package/dist/count.js.map +1 -1
  4. package/dist/countGlobalVersions.d.ts.map +1 -1
  5. package/dist/countGlobalVersions.js +5 -3
  6. package/dist/countGlobalVersions.js.map +1 -1
  7. package/dist/countVersions.d.ts.map +1 -1
  8. package/dist/countVersions.js +5 -3
  9. package/dist/countVersions.js.map +1 -1
  10. package/dist/deleteMany.d.ts.map +1 -1
  11. package/dist/deleteMany.js +5 -2
  12. package/dist/deleteMany.js.map +1 -1
  13. package/dist/deleteOne.d.ts.map +1 -1
  14. package/dist/deleteOne.js +9 -3
  15. package/dist/deleteOne.js.map +1 -1
  16. package/dist/deleteVersions.d.ts +1 -1
  17. package/dist/deleteVersions.d.ts.map +1 -1
  18. package/dist/deleteVersions.js +5 -2
  19. package/dist/deleteVersions.js.map +1 -1
  20. package/dist/find.d.ts.map +1 -1
  21. package/dist/find.js +5 -2
  22. package/dist/find.js.map +1 -1
  23. package/dist/findGlobal.d.ts.map +1 -1
  24. package/dist/findGlobal.js +6 -3
  25. package/dist/findGlobal.js.map +1 -1
  26. package/dist/findGlobalVersions.d.ts.map +1 -1
  27. package/dist/findGlobalVersions.js +4 -3
  28. package/dist/findGlobalVersions.js.map +1 -1
  29. package/dist/findOne.d.ts.map +1 -1
  30. package/dist/findOne.js +5 -2
  31. package/dist/findOne.js.map +1 -1
  32. package/dist/findVersions.d.ts.map +1 -1
  33. package/dist/findVersions.js +6 -3
  34. package/dist/findVersions.js.map +1 -1
  35. package/dist/init.d.ts.map +1 -1
  36. package/dist/init.js +25 -17
  37. package/dist/init.js.map +1 -1
  38. package/dist/models/buildCollectionSchema.d.ts.map +1 -1
  39. package/dist/models/buildCollectionSchema.js +14 -10
  40. package/dist/models/buildCollectionSchema.js.map +1 -1
  41. package/dist/models/buildGlobalModel.d.ts.map +1 -1
  42. package/dist/models/buildGlobalModel.js +9 -5
  43. package/dist/models/buildGlobalModel.js.map +1 -1
  44. package/dist/models/buildSchema.d.ts +6 -1
  45. package/dist/models/buildSchema.d.ts.map +1 -1
  46. package/dist/models/buildSchema.js +220 -99
  47. package/dist/models/buildSchema.js.map +1 -1
  48. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.d.ts.map +1 -1
  49. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js +6 -2
  50. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js.map +1 -1
  51. package/dist/queries/buildAndOrConditions.d.ts +2 -1
  52. package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
  53. package/dist/queries/buildAndOrConditions.js +2 -1
  54. package/dist/queries/buildAndOrConditions.js.map +1 -1
  55. package/dist/queries/buildQuery.d.ts +6 -9
  56. package/dist/queries/buildQuery.d.ts.map +1 -1
  57. package/dist/queries/buildQuery.js +11 -34
  58. package/dist/queries/buildQuery.js.map +1 -1
  59. package/dist/queries/buildSearchParams.d.ts +2 -1
  60. package/dist/queries/buildSearchParams.d.ts.map +1 -1
  61. package/dist/queries/buildSearchParams.js +4 -1
  62. package/dist/queries/buildSearchParams.js.map +1 -1
  63. package/dist/queries/buildSortParam.d.ts +2 -1
  64. package/dist/queries/buildSortParam.d.ts.map +1 -1
  65. package/dist/queries/buildSortParam.js +2 -1
  66. package/dist/queries/buildSortParam.js.map +1 -1
  67. package/dist/queries/getBuildQueryPlugin.d.ts +14 -0
  68. package/dist/queries/getBuildQueryPlugin.d.ts.map +1 -0
  69. package/dist/queries/getBuildQueryPlugin.js +40 -0
  70. package/dist/queries/getBuildQueryPlugin.js.map +1 -0
  71. package/dist/queries/getLocalizedSortProperty.d.ts +2 -1
  72. package/dist/queries/getLocalizedSortProperty.d.ts.map +1 -1
  73. package/dist/queries/getLocalizedSortProperty.js +11 -3
  74. package/dist/queries/getLocalizedSortProperty.js.map +1 -1
  75. package/dist/queries/parseParams.d.ts +2 -1
  76. package/dist/queries/parseParams.d.ts.map +1 -1
  77. package/dist/queries/parseParams.js +3 -1
  78. package/dist/queries/parseParams.js.map +1 -1
  79. package/dist/queries/sanitizeQueryValue.d.ts +2 -1
  80. package/dist/queries/sanitizeQueryValue.d.ts.map +1 -1
  81. package/dist/queries/sanitizeQueryValue.js +6 -2
  82. package/dist/queries/sanitizeQueryValue.js.map +1 -1
  83. package/dist/queryDrafts.d.ts.map +1 -1
  84. package/dist/queryDrafts.js +6 -3
  85. package/dist/queryDrafts.js.map +1 -1
  86. package/dist/types.d.ts +1 -1
  87. package/dist/types.d.ts.map +1 -1
  88. package/dist/types.js.map +1 -1
  89. package/dist/updateGlobal.d.ts.map +1 -1
  90. package/dist/updateGlobal.js +3 -0
  91. package/dist/updateGlobal.js.map +1 -1
  92. package/dist/updateGlobalVersion.d.ts.map +1 -1
  93. package/dist/updateGlobalVersion.js +9 -3
  94. package/dist/updateGlobalVersion.js.map +1 -1
  95. package/dist/updateOne.d.ts.map +1 -1
  96. package/dist/updateOne.js +8 -2
  97. package/dist/updateOne.js.map +1 -1
  98. package/dist/updateVersion.d.ts.map +1 -1
  99. package/dist/updateVersion.js +9 -3
  100. package/dist/updateVersion.js.map +1 -1
  101. package/dist/utilities/buildJoinAggregation.d.ts.map +1 -1
  102. package/dist/utilities/buildJoinAggregation.js +155 -4
  103. package/dist/utilities/buildJoinAggregation.js.map +1 -1
  104. package/dist/utilities/buildProjectionFromSelect.d.ts.map +1 -1
  105. package/dist/utilities/buildProjectionFromSelect.js +18 -17
  106. package/dist/utilities/buildProjectionFromSelect.js.map +1 -1
  107. package/dist/utilities/sanitizeRelationshipIDs.d.ts +2 -1
  108. package/dist/utilities/sanitizeRelationshipIDs.d.ts.map +1 -1
  109. package/dist/utilities/sanitizeRelationshipIDs.js +7 -3
  110. package/dist/utilities/sanitizeRelationshipIDs.js.map +1 -1
  111. package/dist/utilities/sanitizeRelationshipIDs.spec.js +44 -0
  112. package/dist/utilities/sanitizeRelationshipIDs.spec.js.map +1 -1
  113. package/package.json +3 -3
@@ -1,4 +1,5 @@
1
1
  import { buildVersionGlobalFields } from 'payload';
2
+ import { buildQuery } from './queries/buildQuery.js';
2
3
  import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js';
3
4
  import { getSession } from './utilities/getSession.js';
4
5
  import { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js';
@@ -11,20 +12,22 @@ export async function updateGlobalVersion({ id, global: globalSlug, locale, opti
11
12
  };
12
13
  const currentGlobal = this.payload.config.globals.find((global)=>global.slug === globalSlug);
13
14
  const fields = buildVersionGlobalFields(this.payload.config, currentGlobal);
15
+ const flattenedFields = buildVersionGlobalFields(this.payload.config, currentGlobal, true);
14
16
  const options = {
15
17
  ...optionsArgs,
16
18
  lean: true,
17
19
  new: true,
18
20
  projection: buildProjectionFromSelect({
19
21
  adapter: this,
20
- fields: buildVersionGlobalFields(this.payload.config, currentGlobal, true),
22
+ fields: flattenedFields,
21
23
  select
22
24
  }),
23
25
  session: await getSession(this, req)
24
26
  };
25
- const query = await VersionModel.buildQuery({
27
+ const query = await buildQuery({
28
+ adapter: this,
29
+ fields: flattenedFields,
26
30
  locale,
27
- payload: this.payload,
28
31
  where: whereToUse
29
32
  });
30
33
  const sanitizedData = sanitizeRelationshipIDs({
@@ -33,6 +36,9 @@ export async function updateGlobalVersion({ id, global: globalSlug, locale, opti
33
36
  fields
34
37
  });
35
38
  const doc = await VersionModel.findOneAndUpdate(query, sanitizedData, options);
39
+ if (!doc) {
40
+ return null;
41
+ }
36
42
  const result = JSON.parse(JSON.stringify(doc));
37
43
  const verificationToken = doc._verificationToken;
38
44
  // custom id type reset
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/updateGlobalVersion.ts"],"sourcesContent":["import type { QueryOptions } from 'mongoose'\n\nimport { buildVersionGlobalFields, type TypeWithID, type UpdateGlobalVersionArgs } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getSession } from './utilities/getSession.js'\nimport { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js'\n\nexport async function updateGlobalVersion<T extends TypeWithID>(\n this: MongooseAdapter,\n {\n id,\n global: globalSlug,\n locale,\n options: optionsArgs = {},\n req,\n select,\n versionData,\n where,\n }: UpdateGlobalVersionArgs<T>,\n) {\n const VersionModel = this.versions[globalSlug]\n const whereToUse = where || { id: { equals: id } }\n\n const currentGlobal = this.payload.config.globals.find((global) => global.slug === globalSlug)\n const fields = buildVersionGlobalFields(this.payload.config, currentGlobal)\n\n const options: QueryOptions = {\n ...optionsArgs,\n lean: true,\n new: true,\n projection: buildProjectionFromSelect({\n adapter: this,\n fields: buildVersionGlobalFields(this.payload.config, currentGlobal, true),\n select,\n }),\n session: await getSession(this, req),\n }\n\n const query = await VersionModel.buildQuery({\n locale,\n payload: this.payload,\n where: whereToUse,\n })\n\n const sanitizedData = sanitizeRelationshipIDs({\n config: this.payload.config,\n data: versionData,\n fields,\n })\n\n const doc = await VersionModel.findOneAndUpdate(query, sanitizedData, options)\n\n const result = JSON.parse(JSON.stringify(doc))\n\n const verificationToken = doc._verificationToken\n\n // custom id type reset\n result.id = result._id\n if (verificationToken) {\n result._verificationToken = verificationToken\n }\n return result\n}\n"],"names":["buildVersionGlobalFields","buildProjectionFromSelect","getSession","sanitizeRelationshipIDs","updateGlobalVersion","id","global","globalSlug","locale","options","optionsArgs","req","select","versionData","where","VersionModel","versions","whereToUse","equals","currentGlobal","payload","config","globals","find","slug","fields","lean","new","projection","adapter","session","query","buildQuery","sanitizedData","data","doc","findOneAndUpdate","result","JSON","parse","stringify","verificationToken","_verificationToken","_id"],"mappings":"AAEA,SAASA,wBAAwB,QAAuD,UAAS;AAIjG,SAASC,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,UAAU,QAAQ,4BAA2B;AACtD,SAASC,uBAAuB,QAAQ,yCAAwC;AAEhF,OAAO,eAAeC,oBAEpB,EACEC,EAAE,EACFC,QAAQC,UAAU,EAClBC,MAAM,EACNC,SAASC,cAAc,CAAC,CAAC,EACzBC,GAAG,EACHC,MAAM,EACNC,WAAW,EACXC,KAAK,EACsB;IAE7B,MAAMC,eAAe,IAAI,CAACC,QAAQ,CAACT,WAAW;IAC9C,MAAMU,aAAaH,SAAS;QAAET,IAAI;YAAEa,QAAQb;QAAG;IAAE;IAEjD,MAAMc,gBAAgB,IAAI,CAACC,OAAO,CAACC,MAAM,CAACC,OAAO,CAACC,IAAI,CAAC,CAACjB,SAAWA,OAAOkB,IAAI,KAAKjB;IACnF,MAAMkB,SAASzB,yBAAyB,IAAI,CAACoB,OAAO,CAACC,MAAM,EAAEF;IAE7D,MAAMV,UAAwB;QAC5B,GAAGC,WAAW;QACdgB,MAAM;QACNC,KAAK;QACLC,YAAY3B,0BAA0B;YACpC4B,SAAS,IAAI;YACbJ,QAAQzB,yBAAyB,IAAI,CAACoB,OAAO,CAACC,MAAM,EAAEF,eAAe;YACrEP;QACF;QACAkB,SAAS,MAAM5B,WAAW,IAAI,EAAES;IAClC;IAEA,MAAMoB,QAAQ,MAAMhB,aAAaiB,UAAU,CAAC;QAC1CxB;QACAY,SAAS,IAAI,CAACA,OAAO;QACrBN,OAAOG;IACT;IAEA,MAAMgB,gBAAgB9B,wBAAwB;QAC5CkB,QAAQ,IAAI,CAACD,OAAO,CAACC,MAAM;QAC3Ba,MAAMrB;QACNY;IACF;IAEA,MAAMU,MAAM,MAAMpB,aAAaqB,gBAAgB,CAACL,OAAOE,eAAexB;IAEtE,MAAM4B,SAASC,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACL;IAEzC,MAAMM,oBAAoBN,IAAIO,kBAAkB;IAEhD,uBAAuB;IACvBL,OAAOhC,EAAE,GAAGgC,OAAOM,GAAG;IACtB,IAAIF,mBAAmB;QACrBJ,OAAOK,kBAAkB,GAAGD;IAC9B;IACA,OAAOJ;AACT"}
1
+ {"version":3,"sources":["../src/updateGlobalVersion.ts"],"sourcesContent":["import type { QueryOptions } from 'mongoose'\n\nimport { buildVersionGlobalFields, type TypeWithID, type UpdateGlobalVersionArgs } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getSession } from './utilities/getSession.js'\nimport { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js'\n\nexport async function updateGlobalVersion<T extends TypeWithID>(\n this: MongooseAdapter,\n {\n id,\n global: globalSlug,\n locale,\n options: optionsArgs = {},\n req,\n select,\n versionData,\n where,\n }: UpdateGlobalVersionArgs<T>,\n) {\n const VersionModel = this.versions[globalSlug]\n const whereToUse = where || { id: { equals: id } }\n\n const currentGlobal = this.payload.config.globals.find((global) => global.slug === globalSlug)\n const fields = buildVersionGlobalFields(this.payload.config, currentGlobal)\n const flattenedFields = buildVersionGlobalFields(this.payload.config, currentGlobal, true)\n const options: QueryOptions = {\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 }\n\n const query = await buildQuery({\n adapter: this,\n fields: flattenedFields,\n locale,\n where: whereToUse,\n })\n\n const sanitizedData = sanitizeRelationshipIDs({\n config: this.payload.config,\n data: versionData,\n fields,\n })\n\n const doc = await VersionModel.findOneAndUpdate(query, sanitizedData, options)\n\n if (!doc) {\n return null\n }\n\n const result = JSON.parse(JSON.stringify(doc))\n\n const verificationToken = doc._verificationToken\n\n // custom id type reset\n result.id = result._id\n if (verificationToken) {\n result._verificationToken = verificationToken\n }\n return result\n}\n"],"names":["buildVersionGlobalFields","buildQuery","buildProjectionFromSelect","getSession","sanitizeRelationshipIDs","updateGlobalVersion","id","global","globalSlug","locale","options","optionsArgs","req","select","versionData","where","VersionModel","versions","whereToUse","equals","currentGlobal","payload","config","globals","find","slug","fields","flattenedFields","lean","new","projection","adapter","session","query","sanitizedData","data","doc","findOneAndUpdate","result","JSON","parse","stringify","verificationToken","_verificationToken","_id"],"mappings":"AAEA,SAASA,wBAAwB,QAAuD,UAAS;AAIjG,SAASC,UAAU,QAAQ,0BAAyB;AACpD,SAASC,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,UAAU,QAAQ,4BAA2B;AACtD,SAASC,uBAAuB,QAAQ,yCAAwC;AAEhF,OAAO,eAAeC,oBAEpB,EACEC,EAAE,EACFC,QAAQC,UAAU,EAClBC,MAAM,EACNC,SAASC,cAAc,CAAC,CAAC,EACzBC,GAAG,EACHC,MAAM,EACNC,WAAW,EACXC,KAAK,EACsB;IAE7B,MAAMC,eAAe,IAAI,CAACC,QAAQ,CAACT,WAAW;IAC9C,MAAMU,aAAaH,SAAS;QAAET,IAAI;YAAEa,QAAQb;QAAG;IAAE;IAEjD,MAAMc,gBAAgB,IAAI,CAACC,OAAO,CAACC,MAAM,CAACC,OAAO,CAACC,IAAI,CAAC,CAACjB,SAAWA,OAAOkB,IAAI,KAAKjB;IACnF,MAAMkB,SAAS1B,yBAAyB,IAAI,CAACqB,OAAO,CAACC,MAAM,EAAEF;IAC7D,MAAMO,kBAAkB3B,yBAAyB,IAAI,CAACqB,OAAO,CAACC,MAAM,EAAEF,eAAe;IACrF,MAAMV,UAAwB;QAC5B,GAAGC,WAAW;QACdiB,MAAM;QACNC,KAAK;QACLC,YAAY5B,0BAA0B;YACpC6B,SAAS,IAAI;YACbL,QAAQC;YACRd;QACF;QACAmB,SAAS,MAAM7B,WAAW,IAAI,EAAES;IAClC;IAEA,MAAMqB,QAAQ,MAAMhC,WAAW;QAC7B8B,SAAS,IAAI;QACbL,QAAQC;QACRlB;QACAM,OAAOG;IACT;IAEA,MAAMgB,gBAAgB9B,wBAAwB;QAC5CkB,QAAQ,IAAI,CAACD,OAAO,CAACC,MAAM;QAC3Ba,MAAMrB;QACNY;IACF;IAEA,MAAMU,MAAM,MAAMpB,aAAaqB,gBAAgB,CAACJ,OAAOC,eAAexB;IAEtE,IAAI,CAAC0B,KAAK;QACR,OAAO;IACT;IAEA,MAAME,SAASC,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACL;IAEzC,MAAMM,oBAAoBN,IAAIO,kBAAkB;IAEhD,uBAAuB;IACvBL,OAAOhC,EAAE,GAAGgC,OAAOM,GAAG;IACtB,IAAIF,mBAAmB;QACrBJ,OAAOK,kBAAkB,GAAGD;IAC9B;IACA,OAAOJ;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"updateOne.d.ts","sourceRoot":"","sources":["../src/updateOne.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAUxC,eAAO,MAAM,SAAS,EAAE,SA4CvB,CAAA"}
1
+ {"version":3,"file":"updateOne.d.ts","sourceRoot":"","sources":["../src/updateOne.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAWxC,eAAO,MAAM,SAAS,EAAE,SAkDvB,CAAA"}
package/dist/updateOne.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { buildQuery } from './queries/buildQuery.js';
1
2
  import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js';
2
3
  import { getSession } from './utilities/getSession.js';
3
4
  import { handleError } from './utilities/handleError.js';
@@ -22,9 +23,11 @@ export const updateOne = async function updateOne({ id, collection, data, locale
22
23
  }),
23
24
  session: await getSession(this, req)
24
25
  };
25
- const query = await Model.buildQuery({
26
+ const query = await buildQuery({
27
+ adapter: this,
28
+ collectionSlug: collection,
29
+ fields: this.payload.collections[collection].config.flattenedFields,
26
30
  locale,
27
- payload: this.payload,
28
31
  where
29
32
  });
30
33
  let result;
@@ -42,6 +45,9 @@ export const updateOne = async function updateOne({ id, collection, data, locale
42
45
  req
43
46
  });
44
47
  }
48
+ if (!result) {
49
+ return null;
50
+ }
45
51
  result = JSON.parse(JSON.stringify(result));
46
52
  result.id = result._id;
47
53
  result = sanitizeInternalFields(result);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/updateOne.ts"],"sourcesContent":["import type { QueryOptions } from 'mongoose'\nimport type { UpdateOne } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getSession } from './utilities/getSession.js'\nimport { handleError } from './utilities/handleError.js'\nimport { sanitizeInternalFields } from './utilities/sanitizeInternalFields.js'\nimport { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js'\n\nexport const updateOne: UpdateOne = async function updateOne(\n this: MongooseAdapter,\n { id, collection, data, locale, options: optionsArgs = {}, req, select, where: whereArg },\n) {\n const where = id ? { id: { equals: id } } : whereArg\n const Model = this.collections[collection]\n const fields = this.payload.collections[collection].config.fields\n const options: QueryOptions = {\n ...optionsArgs,\n lean: true,\n new: true,\n projection: buildProjectionFromSelect({\n adapter: this,\n fields: this.payload.collections[collection].config.flattenedFields,\n select,\n }),\n session: await getSession(this, req),\n }\n\n const query = await Model.buildQuery({\n locale,\n payload: this.payload,\n where,\n })\n\n let result\n\n const sanitizedData = sanitizeRelationshipIDs({\n config: this.payload.config,\n data,\n fields,\n })\n\n try {\n result = await Model.findOneAndUpdate(query, sanitizedData, options)\n } catch (error) {\n handleError({ collection, error, req })\n }\n\n result = JSON.parse(JSON.stringify(result))\n result.id = result._id\n result = sanitizeInternalFields(result)\n\n return result\n}\n"],"names":["buildProjectionFromSelect","getSession","handleError","sanitizeInternalFields","sanitizeRelationshipIDs","updateOne","id","collection","data","locale","options","optionsArgs","req","select","where","whereArg","equals","Model","collections","fields","payload","config","lean","new","projection","adapter","flattenedFields","session","query","buildQuery","result","sanitizedData","findOneAndUpdate","error","JSON","parse","stringify","_id"],"mappings":"AAKA,SAASA,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,UAAU,QAAQ,4BAA2B;AACtD,SAASC,WAAW,QAAQ,6BAA4B;AACxD,SAASC,sBAAsB,QAAQ,wCAAuC;AAC9E,SAASC,uBAAuB,QAAQ,yCAAwC;AAEhF,OAAO,MAAMC,YAAuB,eAAeA,UAEjD,EAAEC,EAAE,EAAEC,UAAU,EAAEC,IAAI,EAAEC,MAAM,EAAEC,SAASC,cAAc,CAAC,CAAC,EAAEC,GAAG,EAAEC,MAAM,EAAEC,OAAOC,QAAQ,EAAE;IAEzF,MAAMD,QAAQR,KAAK;QAAEA,IAAI;YAAEU,QAAQV;QAAG;IAAE,IAAIS;IAC5C,MAAME,QAAQ,IAAI,CAACC,WAAW,CAACX,WAAW;IAC1C,MAAMY,SAAS,IAAI,CAACC,OAAO,CAACF,WAAW,CAACX,WAAW,CAACc,MAAM,CAACF,MAAM;IACjE,MAAMT,UAAwB;QAC5B,GAAGC,WAAW;QACdW,MAAM;QACNC,KAAK;QACLC,YAAYxB,0BAA0B;YACpCyB,SAAS,IAAI;YACbN,QAAQ,IAAI,CAACC,OAAO,CAACF,WAAW,CAACX,WAAW,CAACc,MAAM,CAACK,eAAe;YACnEb;QACF;QACAc,SAAS,MAAM1B,WAAW,IAAI,EAAEW;IAClC;IAEA,MAAMgB,QAAQ,MAAMX,MAAMY,UAAU,CAAC;QACnCpB;QACAW,SAAS,IAAI,CAACA,OAAO;QACrBN;IACF;IAEA,IAAIgB;IAEJ,MAAMC,gBAAgB3B,wBAAwB;QAC5CiB,QAAQ,IAAI,CAACD,OAAO,CAACC,MAAM;QAC3Bb;QACAW;IACF;IAEA,IAAI;QACFW,SAAS,MAAMb,MAAMe,gBAAgB,CAACJ,OAAOG,eAAerB;IAC9D,EAAE,OAAOuB,OAAO;QACd/B,YAAY;YAAEK;YAAY0B;YAAOrB;QAAI;IACvC;IAEAkB,SAASI,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACN;IACnCA,OAAOxB,EAAE,GAAGwB,OAAOO,GAAG;IACtBP,SAAS3B,uBAAuB2B;IAEhC,OAAOA;AACT,EAAC"}
1
+ {"version":3,"sources":["../src/updateOne.ts"],"sourcesContent":["import type { QueryOptions } 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 { getSession } from './utilities/getSession.js'\nimport { handleError } from './utilities/handleError.js'\nimport { sanitizeInternalFields } from './utilities/sanitizeInternalFields.js'\nimport { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js'\n\nexport const updateOne: UpdateOne = async function updateOne(\n this: MongooseAdapter,\n { id, collection, data, locale, options: optionsArgs = {}, req, select, where: whereArg },\n) {\n const where = id ? { id: { equals: id } } : whereArg\n const Model = this.collections[collection]\n const fields = this.payload.collections[collection].config.fields\n const options: QueryOptions = {\n ...optionsArgs,\n lean: true,\n new: true,\n projection: buildProjectionFromSelect({\n adapter: this,\n fields: this.payload.collections[collection].config.flattenedFields,\n select,\n }),\n session: await getSession(this, req),\n }\n\n const query = await buildQuery({\n adapter: this,\n collectionSlug: collection,\n fields: this.payload.collections[collection].config.flattenedFields,\n locale,\n where,\n })\n\n let result\n\n const sanitizedData = sanitizeRelationshipIDs({\n config: this.payload.config,\n data,\n fields,\n })\n\n try {\n result = await Model.findOneAndUpdate(query, sanitizedData, options)\n } catch (error) {\n handleError({ collection, error, req })\n }\n\n if (!result) {\n return null\n }\n\n result = JSON.parse(JSON.stringify(result))\n result.id = result._id\n result = sanitizeInternalFields(result)\n\n return result\n}\n"],"names":["buildQuery","buildProjectionFromSelect","getSession","handleError","sanitizeInternalFields","sanitizeRelationshipIDs","updateOne","id","collection","data","locale","options","optionsArgs","req","select","where","whereArg","equals","Model","collections","fields","payload","config","lean","new","projection","adapter","flattenedFields","session","query","collectionSlug","result","sanitizedData","findOneAndUpdate","error","JSON","parse","stringify","_id"],"mappings":"AAKA,SAASA,UAAU,QAAQ,0BAAyB;AACpD,SAASC,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,UAAU,QAAQ,4BAA2B;AACtD,SAASC,WAAW,QAAQ,6BAA4B;AACxD,SAASC,sBAAsB,QAAQ,wCAAuC;AAC9E,SAASC,uBAAuB,QAAQ,yCAAwC;AAEhF,OAAO,MAAMC,YAAuB,eAAeA,UAEjD,EAAEC,EAAE,EAAEC,UAAU,EAAEC,IAAI,EAAEC,MAAM,EAAEC,SAASC,cAAc,CAAC,CAAC,EAAEC,GAAG,EAAEC,MAAM,EAAEC,OAAOC,QAAQ,EAAE;IAEzF,MAAMD,QAAQR,KAAK;QAAEA,IAAI;YAAEU,QAAQV;QAAG;IAAE,IAAIS;IAC5C,MAAME,QAAQ,IAAI,CAACC,WAAW,CAACX,WAAW;IAC1C,MAAMY,SAAS,IAAI,CAACC,OAAO,CAACF,WAAW,CAACX,WAAW,CAACc,MAAM,CAACF,MAAM;IACjE,MAAMT,UAAwB;QAC5B,GAAGC,WAAW;QACdW,MAAM;QACNC,KAAK;QACLC,YAAYxB,0BAA0B;YACpCyB,SAAS,IAAI;YACbN,QAAQ,IAAI,CAACC,OAAO,CAACF,WAAW,CAACX,WAAW,CAACc,MAAM,CAACK,eAAe;YACnEb;QACF;QACAc,SAAS,MAAM1B,WAAW,IAAI,EAAEW;IAClC;IAEA,MAAMgB,QAAQ,MAAM7B,WAAW;QAC7B0B,SAAS,IAAI;QACbI,gBAAgBtB;QAChBY,QAAQ,IAAI,CAACC,OAAO,CAACF,WAAW,CAACX,WAAW,CAACc,MAAM,CAACK,eAAe;QACnEjB;QACAK;IACF;IAEA,IAAIgB;IAEJ,MAAMC,gBAAgB3B,wBAAwB;QAC5CiB,QAAQ,IAAI,CAACD,OAAO,CAACC,MAAM;QAC3Bb;QACAW;IACF;IAEA,IAAI;QACFW,SAAS,MAAMb,MAAMe,gBAAgB,CAACJ,OAAOG,eAAerB;IAC9D,EAAE,OAAOuB,OAAO;QACd/B,YAAY;YAAEK;YAAY0B;YAAOrB;QAAI;IACvC;IAEA,IAAI,CAACkB,QAAQ;QACX,OAAO;IACT;IAEAA,SAASI,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACN;IACnCA,OAAOxB,EAAE,GAAGwB,OAAOO,GAAG;IACtBP,SAAS3B,uBAAuB2B;IAEhC,OAAOA;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;AAQ1E,eAAO,MAAM,aAAa,EAAE,aAmD3B,CAAA"}
1
+ {"version":3,"file":"updateVersion.d.ts","sourceRoot":"","sources":["../src/updateVersion.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgC,KAAK,aAAa,EAAE,MAAM,SAAS,CAAA;AAS1E,eAAO,MAAM,aAAa,EAAE,aA0D3B,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { buildVersionCollectionFields } from 'payload';
2
+ import { buildQuery } from './queries/buildQuery.js';
2
3
  import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js';
3
4
  import { getSession } from './utilities/getSession.js';
4
5
  import { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js';
@@ -10,20 +11,22 @@ export const updateVersion = async function updateVersion({ id, collection, loca
10
11
  }
11
12
  };
12
13
  const fields = buildVersionCollectionFields(this.payload.config, this.payload.collections[collection].config);
14
+ const flattenedFields = buildVersionCollectionFields(this.payload.config, this.payload.collections[collection].config, true);
13
15
  const options = {
14
16
  ...optionsArgs,
15
17
  lean: true,
16
18
  new: true,
17
19
  projection: buildProjectionFromSelect({
18
20
  adapter: this,
19
- fields: buildVersionCollectionFields(this.payload.config, this.payload.collections[collection].config, true),
21
+ fields: flattenedFields,
20
22
  select
21
23
  }),
22
24
  session: await getSession(this, req)
23
25
  };
24
- const query = await VersionModel.buildQuery({
26
+ const query = await buildQuery({
27
+ adapter: this,
28
+ fields: flattenedFields,
25
29
  locale,
26
- payload: this.payload,
27
30
  where: whereToUse
28
31
  });
29
32
  const sanitizedData = sanitizeRelationshipIDs({
@@ -32,6 +35,9 @@ export const updateVersion = async function updateVersion({ id, collection, loca
32
35
  fields
33
36
  });
34
37
  const doc = await VersionModel.findOneAndUpdate(query, sanitizedData, options);
38
+ if (!doc) {
39
+ return null;
40
+ }
35
41
  const result = JSON.parse(JSON.stringify(doc));
36
42
  const verificationToken = doc._verificationToken;
37
43
  // custom id type reset
@@ -1 +1 @@
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 { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getSession } from './utilities/getSession.js'\nimport { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js'\n\nexport const updateVersion: UpdateVersion = async function updateVersion(\n this: MongooseAdapter,\n { id, collection, locale, options: optionsArgs = {}, req, select, versionData, where },\n) {\n const VersionModel = this.versions[collection]\n const whereToUse = where || { id: { equals: id } }\n const fields = buildVersionCollectionFields(\n this.payload.config,\n this.payload.collections[collection].config,\n )\n\n const options: QueryOptions = {\n ...optionsArgs,\n lean: true,\n new: true,\n projection: buildProjectionFromSelect({\n adapter: this,\n fields: buildVersionCollectionFields(\n this.payload.config,\n this.payload.collections[collection].config,\n true,\n ),\n select,\n }),\n session: await getSession(this, req),\n }\n\n const query = await VersionModel.buildQuery({\n locale,\n payload: this.payload,\n where: whereToUse,\n })\n\n const sanitizedData = sanitizeRelationshipIDs({\n config: this.payload.config,\n data: versionData,\n fields,\n })\n\n const doc = await VersionModel.findOneAndUpdate(query, sanitizedData, options)\n\n const result = JSON.parse(JSON.stringify(doc))\n\n const verificationToken = doc._verificationToken\n\n // custom id type reset\n result.id = result._id\n if (verificationToken) {\n result._verificationToken = verificationToken\n }\n return result\n}\n"],"names":["buildVersionCollectionFields","buildProjectionFromSelect","getSession","sanitizeRelationshipIDs","updateVersion","id","collection","locale","options","optionsArgs","req","select","versionData","where","VersionModel","versions","whereToUse","equals","fields","payload","config","collections","lean","new","projection","adapter","session","query","buildQuery","sanitizedData","data","doc","findOneAndUpdate","result","JSON","parse","stringify","verificationToken","_verificationToken","_id"],"mappings":"AAEA,SAASA,4BAA4B,QAA4B,UAAS;AAI1E,SAASC,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,UAAU,QAAQ,4BAA2B;AACtD,SAASC,uBAAuB,QAAQ,yCAAwC;AAEhF,OAAO,MAAMC,gBAA+B,eAAeA,cAEzD,EAAEC,EAAE,EAAEC,UAAU,EAAEC,MAAM,EAAEC,SAASC,cAAc,CAAC,CAAC,EAAEC,GAAG,EAAEC,MAAM,EAAEC,WAAW,EAAEC,KAAK,EAAE;IAEtF,MAAMC,eAAe,IAAI,CAACC,QAAQ,CAACT,WAAW;IAC9C,MAAMU,aAAaH,SAAS;QAAER,IAAI;YAAEY,QAAQZ;QAAG;IAAE;IACjD,MAAMa,SAASlB,6BACb,IAAI,CAACmB,OAAO,CAACC,MAAM,EACnB,IAAI,CAACD,OAAO,CAACE,WAAW,CAACf,WAAW,CAACc,MAAM;IAG7C,MAAMZ,UAAwB;QAC5B,GAAGC,WAAW;QACda,MAAM;QACNC,KAAK;QACLC,YAAYvB,0BAA0B;YACpCwB,SAAS,IAAI;YACbP,QAAQlB,6BACN,IAAI,CAACmB,OAAO,CAACC,MAAM,EACnB,IAAI,CAACD,OAAO,CAACE,WAAW,CAACf,WAAW,CAACc,MAAM,EAC3C;YAEFT;QACF;QACAe,SAAS,MAAMxB,WAAW,IAAI,EAAEQ;IAClC;IAEA,MAAMiB,QAAQ,MAAMb,aAAac,UAAU,CAAC;QAC1CrB;QACAY,SAAS,IAAI,CAACA,OAAO;QACrBN,OAAOG;IACT;IAEA,MAAMa,gBAAgB1B,wBAAwB;QAC5CiB,QAAQ,IAAI,CAACD,OAAO,CAACC,MAAM;QAC3BU,MAAMlB;QACNM;IACF;IAEA,MAAMa,MAAM,MAAMjB,aAAakB,gBAAgB,CAACL,OAAOE,eAAerB;IAEtE,MAAMyB,SAASC,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACL;IAEzC,MAAMM,oBAAoBN,IAAIO,kBAAkB;IAEhD,uBAAuB;IACvBL,OAAO5B,EAAE,GAAG4B,OAAOM,GAAG;IACtB,IAAIF,mBAAmB;QACrBJ,OAAOK,kBAAkB,GAAGD;IAC9B;IACA,OAAOJ;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 { getSession } from './utilities/getSession.js'\nimport { sanitizeRelationshipIDs } from './utilities/sanitizeRelationshipIDs.js'\n\nexport const updateVersion: UpdateVersion = async function updateVersion(\n this: MongooseAdapter,\n { id, collection, locale, options: optionsArgs = {}, req, select, versionData, where },\n) {\n const VersionModel = this.versions[collection]\n const whereToUse = where || { id: { equals: id } }\n const fields = buildVersionCollectionFields(\n this.payload.config,\n this.payload.collections[collection].config,\n )\n\n const flattenedFields = buildVersionCollectionFields(\n this.payload.config,\n this.payload.collections[collection].config,\n true,\n )\n\n const options: QueryOptions = {\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 }\n\n const query = await buildQuery({\n adapter: this,\n fields: flattenedFields,\n locale,\n where: whereToUse,\n })\n\n const sanitizedData = sanitizeRelationshipIDs({\n config: this.payload.config,\n data: versionData,\n fields,\n })\n\n const doc = await VersionModel.findOneAndUpdate(query, sanitizedData, options)\n\n if (!doc) {\n return null\n }\n\n const result = JSON.parse(JSON.stringify(doc))\n\n const verificationToken = doc._verificationToken\n\n // custom id type reset\n result.id = result._id\n if (verificationToken) {\n result._verificationToken = verificationToken\n }\n return result\n}\n"],"names":["buildVersionCollectionFields","buildQuery","buildProjectionFromSelect","getSession","sanitizeRelationshipIDs","updateVersion","id","collection","locale","options","optionsArgs","req","select","versionData","where","VersionModel","versions","whereToUse","equals","fields","payload","config","collections","flattenedFields","lean","new","projection","adapter","session","query","sanitizedData","data","doc","findOneAndUpdate","result","JSON","parse","stringify","verificationToken","_verificationToken","_id"],"mappings":"AAEA,SAASA,4BAA4B,QAA4B,UAAS;AAI1E,SAASC,UAAU,QAAQ,0BAAyB;AACpD,SAASC,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,UAAU,QAAQ,4BAA2B;AACtD,SAASC,uBAAuB,QAAQ,yCAAwC;AAEhF,OAAO,MAAMC,gBAA+B,eAAeA,cAEzD,EAAEC,EAAE,EAAEC,UAAU,EAAEC,MAAM,EAAEC,SAASC,cAAc,CAAC,CAAC,EAAEC,GAAG,EAAEC,MAAM,EAAEC,WAAW,EAAEC,KAAK,EAAE;IAEtF,MAAMC,eAAe,IAAI,CAACC,QAAQ,CAACT,WAAW;IAC9C,MAAMU,aAAaH,SAAS;QAAER,IAAI;YAAEY,QAAQZ;QAAG;IAAE;IACjD,MAAMa,SAASnB,6BACb,IAAI,CAACoB,OAAO,CAACC,MAAM,EACnB,IAAI,CAACD,OAAO,CAACE,WAAW,CAACf,WAAW,CAACc,MAAM;IAG7C,MAAME,kBAAkBvB,6BACtB,IAAI,CAACoB,OAAO,CAACC,MAAM,EACnB,IAAI,CAACD,OAAO,CAACE,WAAW,CAACf,WAAW,CAACc,MAAM,EAC3C;IAGF,MAAMZ,UAAwB;QAC5B,GAAGC,WAAW;QACdc,MAAM;QACNC,KAAK;QACLC,YAAYxB,0BAA0B;YACpCyB,SAAS,IAAI;YACbR,QAAQI;YACRX;QACF;QACAgB,SAAS,MAAMzB,WAAW,IAAI,EAAEQ;IAClC;IAEA,MAAMkB,QAAQ,MAAM5B,WAAW;QAC7B0B,SAAS,IAAI;QACbR,QAAQI;QACRf;QACAM,OAAOG;IACT;IAEA,MAAMa,gBAAgB1B,wBAAwB;QAC5CiB,QAAQ,IAAI,CAACD,OAAO,CAACC,MAAM;QAC3BU,MAAMlB;QACNM;IACF;IAEA,MAAMa,MAAM,MAAMjB,aAAakB,gBAAgB,CAACJ,OAAOC,eAAerB;IAEtE,IAAI,CAACuB,KAAK;QACR,OAAO;IACT;IAEA,MAAME,SAASC,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACL;IAEzC,MAAMM,oBAAoBN,IAAIO,kBAAkB;IAEhD,uBAAuB;IACvBL,OAAO5B,EAAE,GAAG4B,OAAOM,GAAG;IACtB,IAAIF,mBAAmB;QACrBJ,OAAOK,kBAAkB,GAAGD;IAC9B;IACA,OAAOJ;AACT,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"buildJoinAggregation.d.ts","sourceRoot":"","sources":["../../src/utilities/buildJoinAggregation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,yBAAyB,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE1F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAIlD,KAAK,wBAAwB,GAAG;IAC9B,OAAO,EAAE,eAAe,CAAA;IACxB,UAAU,EAAE,cAAc,CAAA;IAC1B,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C,KAAK,EAAE,SAAS,CAAA;IAEhB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAEjC,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,oBAAoB,kGAU9B,wBAAwB,KAAG,OAAO,CAAC,aAAa,EAAE,GAAG,SAAS,CA4KhE,CAAA"}
1
+ {"version":3,"file":"buildJoinAggregation.d.ts","sourceRoot":"","sources":["../../src/utilities/buildJoinAggregation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,KAAK,EACV,cAAc,EAEd,SAAS,EACT,yBAAyB,EACzB,KAAK,EACN,MAAM,SAAS,CAAA;AAIhB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAKlD,KAAK,wBAAwB,GAAG;IAC9B,OAAO,EAAE,eAAe,CAAA;IACxB,UAAU,EAAE,cAAc,CAAA;IAC1B,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C,KAAK,EAAE,SAAS,CAAA;IAEhB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAEjC,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,oBAAoB,kGAU9B,wBAAwB,KAAG,OAAO,CAAC,aAAa,EAAE,GAAG,SAAS,CAkVhE,CAAA"}
@@ -1,9 +1,12 @@
1
+ import { fieldShouldBeLocalized } from 'payload/shared';
2
+ import { buildQuery } from '../queries/buildQuery.js';
1
3
  import { buildSortParam } from '../queries/buildSortParam.js';
2
4
  export const buildJoinAggregation = async ({ adapter, collection, collectionConfig, joins, limit, locale, projection, query, versions })=>{
3
- if (Object.keys(collectionConfig.joins).length === 0 || joins === false) {
5
+ if (Object.keys(collectionConfig.joins).length === 0 && collectionConfig.polymorphicJoins.length == 0 || joins === false) {
4
6
  return;
5
7
  }
6
8
  const joinConfig = adapter.payload.collections[collection].config.joins;
9
+ const polymorphicJoinsConfig = adapter.payload.collections[collection].config.polymorphicJoins;
7
10
  const aggregate = [
8
11
  {
9
12
  $sort: {
@@ -21,16 +24,156 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
21
24
  $limit: limit
22
25
  });
23
26
  }
27
+ for (const join of polymorphicJoinsConfig){
28
+ if (projection && !projection[join.joinPath]) {
29
+ continue;
30
+ }
31
+ if (joins?.[join.joinPath] === false) {
32
+ continue;
33
+ }
34
+ const { limit: limitJoin = join.field.defaultLimit ?? 10, page, sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort, where: whereJoin } = joins?.[join.joinPath] || {};
35
+ const aggregatedFields = [];
36
+ for (const collectionSlug of join.field.collection){
37
+ for (const field of adapter.payload.collections[collectionSlug].config.flattenedFields){
38
+ if (!aggregatedFields.some((eachField)=>eachField.name === field.name)) {
39
+ aggregatedFields.push(field);
40
+ }
41
+ }
42
+ }
43
+ const sort = buildSortParam({
44
+ config: adapter.payload.config,
45
+ fields: aggregatedFields,
46
+ locale,
47
+ sort: sortJoin,
48
+ timestamps: true
49
+ });
50
+ const $match = await buildQuery({
51
+ adapter,
52
+ fields: aggregatedFields,
53
+ locale,
54
+ where: whereJoin
55
+ });
56
+ const sortProperty = Object.keys(sort)[0];
57
+ const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1;
58
+ const projectSort = sortProperty !== '_id' && sortProperty !== 'relationTo';
59
+ const aliases = [];
60
+ const as = join.joinPath;
61
+ for (const collectionSlug of join.field.collection){
62
+ const alias = `${as}.docs.${collectionSlug}`;
63
+ aliases.push(alias);
64
+ aggregate.push({
65
+ $lookup: {
66
+ as: alias,
67
+ from: adapter.collections[collectionSlug].collection.name,
68
+ let: {
69
+ root_id_: '$_id'
70
+ },
71
+ pipeline: [
72
+ {
73
+ $addFields: {
74
+ relationTo: {
75
+ $literal: collectionSlug
76
+ }
77
+ }
78
+ },
79
+ {
80
+ $match: {
81
+ $and: [
82
+ {
83
+ $expr: {
84
+ $eq: [
85
+ `$${join.field.on}`,
86
+ '$$root_id_'
87
+ ]
88
+ }
89
+ },
90
+ $match
91
+ ]
92
+ }
93
+ },
94
+ {
95
+ $sort: {
96
+ [sortProperty]: sortDirection
97
+ }
98
+ },
99
+ {
100
+ // Unfortunately, we can't use $skip here because we can lose data, instead we do $slice then
101
+ $limit: page ? page * limitJoin : limitJoin
102
+ },
103
+ {
104
+ $project: {
105
+ value: '$_id',
106
+ ...projectSort && {
107
+ [sortProperty]: 1
108
+ },
109
+ relationTo: 1
110
+ }
111
+ }
112
+ ]
113
+ }
114
+ });
115
+ }
116
+ aggregate.push({
117
+ $addFields: {
118
+ [`${as}.docs`]: {
119
+ $concatArrays: aliases.map((alias)=>`$${alias}`)
120
+ }
121
+ }
122
+ });
123
+ aggregate.push({
124
+ $set: {
125
+ [`${as}.docs`]: {
126
+ $sortArray: {
127
+ input: `$${as}.docs`,
128
+ sortBy: {
129
+ [sortProperty]: sortDirection
130
+ }
131
+ }
132
+ }
133
+ }
134
+ });
135
+ const sliceValue = page ? [
136
+ (page - 1) * limitJoin,
137
+ limitJoin
138
+ ] : [
139
+ limitJoin
140
+ ];
141
+ aggregate.push({
142
+ $set: {
143
+ [`${as}.docs`]: {
144
+ $slice: [
145
+ `$${as}.docs`,
146
+ ...sliceValue
147
+ ]
148
+ }
149
+ }
150
+ });
151
+ aggregate.push({
152
+ $addFields: {
153
+ [`${as}.hasNextPage`]: {
154
+ $gt: [
155
+ {
156
+ $size: `$${as}.docs`
157
+ },
158
+ limitJoin || Number.MAX_VALUE
159
+ ]
160
+ }
161
+ }
162
+ });
163
+ }
24
164
  for (const slug of Object.keys(joinConfig)){
25
165
  for (const join of joinConfig[slug]){
26
- const joinModel = adapter.collections[join.field.collection];
27
166
  if (projection && !projection[join.joinPath]) {
28
167
  continue;
29
168
  }
30
169
  if (joins?.[join.joinPath] === false) {
31
170
  continue;
32
171
  }
33
- const { limit: limitJoin = join.field.defaultLimit ?? 10, sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort, where: whereJoin } = joins?.[join.joinPath] || {};
172
+ const { limit: limitJoin = join.field.defaultLimit ?? 10, page, sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort, where: whereJoin } = joins?.[join.joinPath] || {};
173
+ if (Array.isArray(join.field.collection)) {
174
+ throw new Error('Unreachable');
175
+ }
176
+ const joinModel = adapter.collections[join.field.collection];
34
177
  const sort = buildSortParam({
35
178
  config: adapter.payload.config,
36
179
  fields: adapter.payload.collections[slug].config.flattenedFields,
@@ -55,6 +198,11 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
55
198
  }
56
199
  }
57
200
  ];
201
+ if (page) {
202
+ pipeline.push({
203
+ $skip: (page - 1) * limitJoin
204
+ });
205
+ }
58
206
  if (limitJoin > 0) {
59
207
  pipeline.push({
60
208
  $limit: limitJoin + 1
@@ -108,7 +256,10 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
108
256
  }
109
257
  });
110
258
  } else {
111
- const localeSuffix = join.field.localized && adapter.payload.config.localization && locale ? `.${locale}` : '';
259
+ const localeSuffix = fieldShouldBeLocalized({
260
+ field: join.field,
261
+ parentIsLocalized: join.parentIsLocalized
262
+ }) && adapter.payload.config.localization && locale ? `.${locale}` : '';
112
263
  const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${localeSuffix}`;
113
264
  let foreignField;
114
265
  if (join.getForeignPath) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/buildJoinAggregation.ts"],"sourcesContent":["import type { PipelineStage } from 'mongoose'\nimport type { CollectionSlug, JoinQuery, SanitizedCollectionConfig, Where } from 'payload'\n\nimport type { MongooseAdapter } from '../index.js'\n\nimport { buildSortParam } from '../queries/buildSortParam.js'\n\ntype BuildJoinAggregationArgs = {\n adapter: MongooseAdapter\n collection: CollectionSlug\n collectionConfig: SanitizedCollectionConfig\n joins: JoinQuery\n // the number of docs to get at the top collection level\n limit?: number\n locale: string\n projection?: Record<string, true>\n // the where clause for the top collection\n query?: Where\n /** whether the query is from drafts */\n versions?: boolean\n}\n\nexport const buildJoinAggregation = async ({\n adapter,\n collection,\n collectionConfig,\n joins,\n limit,\n locale,\n projection,\n query,\n versions,\n}: BuildJoinAggregationArgs): Promise<PipelineStage[] | undefined> => {\n if (Object.keys(collectionConfig.joins).length === 0 || joins === false) {\n return\n }\n\n const joinConfig = adapter.payload.collections[collection].config.joins\n const aggregate: PipelineStage[] = [\n {\n $sort: { createdAt: -1 },\n },\n ]\n\n if (query) {\n aggregate.push({\n $match: query,\n })\n }\n\n if (limit) {\n aggregate.push({\n $limit: limit,\n })\n }\n\n for (const slug of Object.keys(joinConfig)) {\n for (const join of joinConfig[slug]) {\n const joinModel = adapter.collections[join.field.collection]\n\n if (projection && !projection[join.joinPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const {\n limit: limitJoin = join.field.defaultLimit ?? 10,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin,\n } = joins?.[join.joinPath] || {}\n\n const sort = buildSortParam({\n config: adapter.payload.config,\n fields: adapter.payload.collections[slug].config.flattenedFields,\n locale,\n sort: sortJoin,\n timestamps: true,\n })\n const sortProperty = Object.keys(sort)[0]\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n const $match = await joinModel.buildQuery({\n locale,\n payload: adapter.payload,\n where: whereJoin,\n })\n\n const pipeline: Exclude<PipelineStage, PipelineStage.Merge | PipelineStage.Out>[] = [\n { $match },\n {\n $sort: { [sortProperty]: sortDirection },\n },\n ]\n\n if (limitJoin > 0) {\n pipeline.push({\n $limit: limitJoin + 1,\n })\n }\n\n let polymorphicSuffix = ''\n if (Array.isArray(join.targetField.relationTo)) {\n polymorphicSuffix = '.value'\n }\n\n if (adapter.payload.config.localization && locale === 'all') {\n adapter.payload.config.localization.localeCodes.forEach((code) => {\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${code}`\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${join.field.on}${code}${polymorphicSuffix}`,\n from: adapter.collections[slug].collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: limitJoin\n ? { $gt: [{ $size: `$${as}.docs` }, limitJoin] }\n : false,\n // Boolean indicating if more docs than limit\n },\n },\n )\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n })\n } else {\n const localeSuffix =\n join.field.localized && adapter.payload.config.localization && locale ? `.${locale}` : ''\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${localeSuffix}`\n\n let foreignField: string\n\n if (join.getForeignPath) {\n foreignField = `${join.getForeignPath({ locale })}${polymorphicSuffix}`\n } else {\n foreignField = `${join.field.on}${polymorphicSuffix}`\n }\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField,\n from: adapter.collections[slug].collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n }, // Boolean indicating if more docs than limit\n },\n },\n )\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n }\n }\n }\n\n if (projection) {\n aggregate.push({ $project: projection })\n }\n\n return aggregate\n}\n"],"names":["buildSortParam","buildJoinAggregation","adapter","collection","collectionConfig","joins","limit","locale","projection","query","versions","Object","keys","length","joinConfig","payload","collections","config","aggregate","$sort","createdAt","push","$match","$limit","slug","join","joinModel","field","joinPath","limitJoin","defaultLimit","sort","sortJoin","defaultSort","where","whereJoin","fields","flattenedFields","timestamps","sortProperty","sortDirection","buildQuery","pipeline","polymorphicSuffix","Array","isArray","targetField","relationTo","localization","localeCodes","forEach","code","as","$lookup","foreignField","on","from","name","localField","$addFields","$map","in","input","$gt","$size","$slice","localeSuffix","localized","getForeignPath","Number","MAX_VALUE","$project"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/buildJoinAggregation.ts"],"sourcesContent":["import type { PipelineStage } from 'mongoose'\nimport type {\n CollectionSlug,\n FlattenedField,\n JoinQuery,\n SanitizedCollectionConfig,\n Where,\n} from 'payload'\n\nimport { fieldShouldBeLocalized } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\n\nimport { buildQuery } from '../queries/buildQuery.js'\nimport { buildSortParam } from '../queries/buildSortParam.js'\n\ntype BuildJoinAggregationArgs = {\n adapter: MongooseAdapter\n collection: CollectionSlug\n collectionConfig: SanitizedCollectionConfig\n joins: JoinQuery\n // the number of docs to get at the top collection level\n limit?: number\n locale: string\n projection?: Record<string, true>\n // the where clause for the top collection\n query?: Where\n /** whether the query is from drafts */\n versions?: boolean\n}\n\nexport const buildJoinAggregation = async ({\n adapter,\n collection,\n collectionConfig,\n joins,\n limit,\n locale,\n projection,\n query,\n versions,\n}: BuildJoinAggregationArgs): Promise<PipelineStage[] | undefined> => {\n if (\n (Object.keys(collectionConfig.joins).length === 0 &&\n collectionConfig.polymorphicJoins.length == 0) ||\n joins === false\n ) {\n return\n }\n\n const joinConfig = adapter.payload.collections[collection].config.joins\n const polymorphicJoinsConfig = adapter.payload.collections[collection].config.polymorphicJoins\n const aggregate: PipelineStage[] = [\n {\n $sort: { createdAt: -1 },\n },\n ]\n\n if (query) {\n aggregate.push({\n $match: query,\n })\n }\n\n if (limit) {\n aggregate.push({\n $limit: limit,\n })\n }\n\n for (const join of polymorphicJoinsConfig) {\n if (projection && !projection[join.joinPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const {\n limit: limitJoin = join.field.defaultLimit ?? 10,\n page,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin,\n } = joins?.[join.joinPath] || {}\n\n const aggregatedFields: FlattenedField[] = []\n for (const collectionSlug of join.field.collection) {\n for (const field of adapter.payload.collections[collectionSlug].config.flattenedFields) {\n if (!aggregatedFields.some((eachField) => eachField.name === field.name)) {\n aggregatedFields.push(field)\n }\n }\n }\n\n const sort = buildSortParam({\n config: adapter.payload.config,\n fields: aggregatedFields,\n locale,\n sort: sortJoin,\n timestamps: true,\n })\n\n const $match = await buildQuery({\n adapter,\n fields: aggregatedFields,\n locale,\n where: whereJoin,\n })\n\n const sortProperty = Object.keys(sort)[0]\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n const projectSort = sortProperty !== '_id' && sortProperty !== 'relationTo'\n\n const aliases: string[] = []\n\n const as = join.joinPath\n\n for (const collectionSlug of join.field.collection) {\n const alias = `${as}.docs.${collectionSlug}`\n aliases.push(alias)\n\n aggregate.push({\n $lookup: {\n as: alias,\n from: adapter.collections[collectionSlug].collection.name,\n let: {\n root_id_: '$_id',\n },\n pipeline: [\n {\n $addFields: {\n relationTo: {\n $literal: collectionSlug,\n },\n },\n },\n {\n $match: {\n $and: [\n {\n $expr: {\n $eq: [`$${join.field.on}`, '$$root_id_'],\n },\n },\n $match,\n ],\n },\n },\n {\n $sort: {\n [sortProperty]: sortDirection,\n },\n },\n {\n // Unfortunately, we can't use $skip here because we can lose data, instead we do $slice then\n $limit: page ? page * limitJoin : limitJoin,\n },\n {\n $project: {\n value: '$_id',\n ...(projectSort && {\n [sortProperty]: 1,\n }),\n relationTo: 1,\n },\n },\n ],\n },\n })\n }\n\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $concatArrays: aliases.map((alias) => `$${alias}`),\n },\n },\n })\n\n aggregate.push({\n $set: {\n [`${as}.docs`]: {\n $sortArray: {\n input: `$${as}.docs`,\n sortBy: {\n [sortProperty]: sortDirection,\n },\n },\n },\n },\n })\n\n const sliceValue = page ? [(page - 1) * limitJoin, limitJoin] : [limitJoin]\n\n aggregate.push({\n $set: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, ...sliceValue],\n },\n },\n })\n\n aggregate.push({\n $addFields: {\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n },\n },\n })\n }\n\n for (const slug of Object.keys(joinConfig)) {\n for (const join of joinConfig[slug]) {\n if (projection && !projection[join.joinPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const {\n limit: limitJoin = join.field.defaultLimit ?? 10,\n page,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin,\n } = joins?.[join.joinPath] || {}\n\n if (Array.isArray(join.field.collection)) {\n throw new Error('Unreachable')\n }\n\n const joinModel = adapter.collections[join.field.collection]\n\n const sort = buildSortParam({\n config: adapter.payload.config,\n fields: adapter.payload.collections[slug].config.flattenedFields,\n locale,\n sort: sortJoin,\n timestamps: true,\n })\n const sortProperty = Object.keys(sort)[0]\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n const $match = await joinModel.buildQuery({\n locale,\n payload: adapter.payload,\n where: whereJoin,\n })\n\n const pipeline: Exclude<PipelineStage, PipelineStage.Merge | PipelineStage.Out>[] = [\n { $match },\n {\n $sort: { [sortProperty]: sortDirection },\n },\n ]\n\n if (page) {\n pipeline.push({\n $skip: (page - 1) * limitJoin,\n })\n }\n\n if (limitJoin > 0) {\n pipeline.push({\n $limit: limitJoin + 1,\n })\n }\n\n let polymorphicSuffix = ''\n if (Array.isArray(join.targetField.relationTo)) {\n polymorphicSuffix = '.value'\n }\n\n if (adapter.payload.config.localization && locale === 'all') {\n adapter.payload.config.localization.localeCodes.forEach((code) => {\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${code}`\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${join.field.on}${code}${polymorphicSuffix}`,\n from: adapter.collections[slug].collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: limitJoin\n ? { $gt: [{ $size: `$${as}.docs` }, limitJoin] }\n : false,\n // Boolean indicating if more docs than limit\n },\n },\n )\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n })\n } else {\n const localeSuffix =\n fieldShouldBeLocalized({\n field: join.field,\n parentIsLocalized: join.parentIsLocalized,\n }) &&\n adapter.payload.config.localization &&\n locale\n ? `.${locale}`\n : ''\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${localeSuffix}`\n\n let foreignField: string\n\n if (join.getForeignPath) {\n foreignField = `${join.getForeignPath({ locale })}${polymorphicSuffix}`\n } else {\n foreignField = `${join.field.on}${polymorphicSuffix}`\n }\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField,\n from: adapter.collections[slug].collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n }, // Boolean indicating if more docs than limit\n },\n },\n )\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n }\n }\n }\n\n if (projection) {\n aggregate.push({ $project: projection })\n }\n\n return aggregate\n}\n"],"names":["fieldShouldBeLocalized","buildQuery","buildSortParam","buildJoinAggregation","adapter","collection","collectionConfig","joins","limit","locale","projection","query","versions","Object","keys","length","polymorphicJoins","joinConfig","payload","collections","config","polymorphicJoinsConfig","aggregate","$sort","createdAt","push","$match","$limit","join","joinPath","limitJoin","field","defaultLimit","page","sort","sortJoin","defaultSort","where","whereJoin","aggregatedFields","collectionSlug","flattenedFields","some","eachField","name","fields","timestamps","sortProperty","sortDirection","projectSort","aliases","as","alias","$lookup","from","let","root_id_","pipeline","$addFields","relationTo","$literal","$and","$expr","$eq","on","$project","value","$concatArrays","map","$set","$sortArray","input","sortBy","sliceValue","$slice","$gt","$size","Number","MAX_VALUE","slug","Array","isArray","Error","joinModel","$skip","polymorphicSuffix","targetField","localization","localeCodes","forEach","code","foreignField","localField","$map","in","localeSuffix","parentIsLocalized","getForeignPath"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"buildProjectionFromSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/buildProjectionFromSelect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsB,cAAc,EAAc,UAAU,EAAE,MAAM,SAAS,CAAA;AAIzF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AA+KlD,eAAO,MAAM,yBAAyB,iCAInC;IACD,OAAO,EAAE,eAAe,CAAA;IACxB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB,KAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,SAmB1B,CAAA"}
1
+ {"version":3,"file":"buildProjectionFromSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/buildProjectionFromSelect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsB,cAAc,EAAc,UAAU,EAAE,MAAM,SAAS,CAAA;AASzF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AA6KlD,eAAO,MAAM,yBAAyB,iCAInC;IACD,OAAO,EAAE,eAAe,CAAA;IACxB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB,KAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,SAmB1B,CAAA"}
@@ -1,7 +1,7 @@
1
- import { deepCopyObjectSimple, fieldAffectsData, getSelectMode } from 'payload/shared';
2
- const addFieldToProjection = ({ adapter, databaseSchemaPath, field, projection, withinLocalizedField })=>{
1
+ import { deepCopyObjectSimple, fieldAffectsData, fieldShouldBeLocalized, getSelectMode } from 'payload/shared';
2
+ const addFieldToProjection = ({ adapter, databaseSchemaPath, field, parentIsLocalized, projection })=>{
3
3
  const { config } = adapter.payload;
4
- if (withinLocalizedField && config.localization) {
4
+ if (parentIsLocalized && config.localization) {
5
5
  for (const locale of config.localization.localeCodes){
6
6
  const localeDatabaseSchemaPath = databaseSchemaPath.replace('<locale>', locale);
7
7
  projection[`${localeDatabaseSchemaPath}${field.name}`] = true;
@@ -10,7 +10,7 @@ const addFieldToProjection = ({ adapter, databaseSchemaPath, field, projection,
10
10
  projection[`${databaseSchemaPath}${field.name}`] = true;
11
11
  }
12
12
  };
13
- const traverseFields = ({ adapter, databaseSchemaPath = '', fields, projection, select, selectAllOnCurrentLevel = false, selectMode, withinLocalizedField = false })=>{
13
+ const traverseFields = ({ adapter, databaseSchemaPath = '', fields, parentIsLocalized = false, projection, select, selectAllOnCurrentLevel = false, selectMode })=>{
14
14
  for (const field of fields){
15
15
  if (fieldAffectsData(field)) {
16
16
  if (selectMode === 'include') {
@@ -19,8 +19,8 @@ const traverseFields = ({ adapter, databaseSchemaPath = '', fields, projection,
19
19
  adapter,
20
20
  databaseSchemaPath,
21
21
  field,
22
- projection,
23
- withinLocalizedField
22
+ parentIsLocalized,
23
+ projection
24
24
  });
25
25
  continue;
26
26
  }
@@ -34,8 +34,8 @@ const traverseFields = ({ adapter, databaseSchemaPath = '', fields, projection,
34
34
  adapter,
35
35
  databaseSchemaPath,
36
36
  field,
37
- projection,
38
- withinLocalizedField
37
+ parentIsLocalized,
38
+ projection
39
39
  });
40
40
  continue;
41
41
  }
@@ -45,12 +45,13 @@ const traverseFields = ({ adapter, databaseSchemaPath = '', fields, projection,
45
45
  }
46
46
  }
47
47
  let fieldDatabaseSchemaPath = databaseSchemaPath;
48
- let fieldWithinLocalizedField = withinLocalizedField;
49
48
  if (fieldAffectsData(field)) {
50
49
  fieldDatabaseSchemaPath = `${databaseSchemaPath}${field.name}.`;
51
- if (field.localized) {
50
+ if (fieldShouldBeLocalized({
51
+ field,
52
+ parentIsLocalized
53
+ })) {
52
54
  fieldDatabaseSchemaPath = `${fieldDatabaseSchemaPath}<locale>.`;
53
- fieldWithinLocalizedField = true;
54
55
  }
55
56
  }
56
57
  switch(field.type){
@@ -66,10 +67,10 @@ const traverseFields = ({ adapter, databaseSchemaPath = '', fields, projection,
66
67
  adapter,
67
68
  databaseSchemaPath: fieldDatabaseSchemaPath,
68
69
  fields: field.flattenedFields,
70
+ parentIsLocalized: parentIsLocalized || field.localized,
69
71
  projection,
70
72
  select: fieldSelect,
71
- selectMode,
72
- withinLocalizedField: fieldWithinLocalizedField
73
+ selectMode
73
74
  });
74
75
  break;
75
76
  }
@@ -83,11 +84,11 @@ const traverseFields = ({ adapter, databaseSchemaPath = '', fields, projection,
83
84
  adapter,
84
85
  databaseSchemaPath: fieldDatabaseSchemaPath,
85
86
  fields: block.flattenedFields,
87
+ parentIsLocalized: parentIsLocalized || field.localized,
86
88
  projection,
87
89
  select: {},
88
90
  selectAllOnCurrentLevel: true,
89
- selectMode: 'include',
90
- withinLocalizedField: fieldWithinLocalizedField
91
+ selectMode: 'include'
91
92
  });
92
93
  continue;
93
94
  }
@@ -106,10 +107,10 @@ const traverseFields = ({ adapter, databaseSchemaPath = '', fields, projection,
106
107
  adapter,
107
108
  databaseSchemaPath: fieldDatabaseSchemaPath,
108
109
  fields: block.flattenedFields,
110
+ parentIsLocalized: parentIsLocalized || field.localized,
109
111
  projection,
110
112
  select: blocksSelect[block.slug],
111
- selectMode: blockSelectMode,
112
- withinLocalizedField: fieldWithinLocalizedField
113
+ selectMode: blockSelectMode
113
114
  });
114
115
  }
115
116
  break;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/buildProjectionFromSelect.ts"],"sourcesContent":["import type { FieldAffectingData, FlattenedField, SelectMode, SelectType } from 'payload'\n\nimport { deepCopyObjectSimple, fieldAffectsData, getSelectMode } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\n\nconst addFieldToProjection = ({\n adapter,\n databaseSchemaPath,\n field,\n projection,\n withinLocalizedField,\n}: {\n adapter: MongooseAdapter\n databaseSchemaPath: string\n field: FieldAffectingData\n projection: Record<string, true>\n withinLocalizedField: boolean\n}) => {\n const { config } = adapter.payload\n\n if (withinLocalizedField && 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 projection,\n select,\n selectAllOnCurrentLevel = false,\n selectMode,\n withinLocalizedField = false,\n}: {\n adapter: MongooseAdapter\n databaseSchemaPath?: string\n fields: FlattenedField[]\n projection: Record<string, true>\n select: SelectType\n selectAllOnCurrentLevel?: boolean\n selectMode: SelectMode\n withinLocalizedField?: boolean\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 projection,\n withinLocalizedField,\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 projection,\n withinLocalizedField,\n })\n continue\n }\n\n if (select[field.name] === false) {\n continue\n }\n }\n }\n\n let fieldDatabaseSchemaPath = databaseSchemaPath\n let fieldWithinLocalizedField = withinLocalizedField\n\n if (fieldAffectsData(field)) {\n fieldDatabaseSchemaPath = `${databaseSchemaPath}${field.name}.`\n\n if (field.localized) {\n fieldDatabaseSchemaPath = `${fieldDatabaseSchemaPath}<locale>.`\n fieldWithinLocalizedField = true\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 projection,\n select: fieldSelect,\n selectMode,\n withinLocalizedField: fieldWithinLocalizedField,\n })\n\n break\n }\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 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 projection,\n select: {},\n selectAllOnCurrentLevel: true,\n selectMode: 'include',\n withinLocalizedField: fieldWithinLocalizedField,\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') {\n blocksSelect[block.slug]['id'] = true\n blocksSelect[block.slug]['blockType'] = true\n }\n\n traverseFields({\n adapter,\n databaseSchemaPath: fieldDatabaseSchemaPath,\n fields: block.flattenedFields,\n projection,\n select: blocksSelect[block.slug] as SelectType,\n selectMode: blockSelectMode,\n withinLocalizedField: fieldWithinLocalizedField,\n })\n }\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","getSelectMode","addFieldToProjection","adapter","databaseSchemaPath","field","projection","withinLocalizedField","config","payload","localization","locale","localeCodes","localeDatabaseSchemaPath","replace","name","traverseFields","fields","select","selectAllOnCurrentLevel","selectMode","fieldDatabaseSchemaPath","fieldWithinLocalizedField","localized","type","fieldSelect","flattenedFields","blocksSelect","_block","blockReferences","blocks","block","slug","blockSelectMode","buildProjectionFromSelect","_id"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/buildProjectionFromSelect.ts"],"sourcesContent":["import type { FieldAffectingData, FlattenedField, SelectMode, SelectType } 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\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 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') {\n blocksSelect[block.slug]['id'] = true\n blocksSelect[block.slug]['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 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","flattenedFields","localized","blocksSelect","_block","blockReferences","blocks","block","slug","blockSelectMode","buildProjectionFromSelect","_id"],"mappings":"AAEA,SACEA,oBAAoB,EACpBC,gBAAgB,EAChBC,sBAAsB,EACtBC,aAAa,QACR,iBAAgB;AAIvB,MAAMC,uBAAuB,CAAC,EAC5BC,OAAO,EACPC,kBAAkB,EAClBC,KAAK,EACLC,iBAAiB,EACjBC,UAAU,EAOX;IACC,MAAM,EAAEC,MAAM,EAAE,GAAGL,QAAQM,OAAO;IAElC,IAAIH,qBAAqBE,OAAOE,YAAY,EAAE;QAC5C,KAAK,MAAMC,UAAUH,OAAOE,YAAY,CAACE,WAAW,CAAE;YACpD,MAAMC,2BAA2BT,mBAAmBU,OAAO,CAAC,YAAYH;YACxEJ,UAAU,CAAC,GAAGM,2BAA2BR,MAAMU,IAAI,EAAE,CAAC,GAAG;QAC3D;IACF,OAAO;QACLR,UAAU,CAAC,GAAGH,qBAAqBC,MAAMU,IAAI,EAAE,CAAC,GAAG;IACrD;AACF;AAEA,MAAMC,iBAAiB,CAAC,EACtBb,OAAO,EACPC,qBAAqB,EAAE,EACvBa,MAAM,EACNX,oBAAoB,KAAK,EACzBC,UAAU,EACVW,MAAM,EACNC,0BAA0B,KAAK,EAC/BC,UAAU,EAUX;IACC,KAAK,MAAMf,SAASY,OAAQ;QAC1B,IAAIlB,iBAAiBM,QAAQ;YAC3B,IAAIe,eAAe,WAAW;gBAC5B,IAAIF,MAAM,CAACb,MAAMU,IAAI,CAAC,KAAK,QAAQI,yBAAyB;oBAC1DjB,qBAAqB;wBACnBC;wBACAC;wBACAC;wBACAC;wBACAC;oBACF;oBACA;gBACF;gBAEA,IAAI,CAACW,MAAM,CAACb,MAAMU,IAAI,CAAC,EAAE;oBACvB;gBACF;YACF;YAEA,IAAIK,eAAe,WAAW;gBAC5B,IAAI,OAAOF,MAAM,CAACb,MAAMU,IAAI,CAAC,KAAK,aAAa;oBAC7Cb,qBAAqB;wBACnBC;wBACAC;wBACAC;wBACAC;wBACAC;oBACF;oBACA;gBACF;gBAEA,IAAIW,MAAM,CAACb,MAAMU,IAAI,CAAC,KAAK,OAAO;oBAChC;gBACF;YACF;QACF;QAEA,IAAIM,0BAA0BjB;QAE9B,IAAIL,iBAAiBM,QAAQ;YAC3BgB,0BAA0B,GAAGjB,qBAAqBC,MAAMU,IAAI,CAAC,CAAC,CAAC;YAE/D,IAAIf,uBAAuB;gBAAEK;gBAAOC;YAAkB,IAAI;gBACxDe,0BAA0B,GAAGA,wBAAwB,SAAS,CAAC;YACjE;QACF;QAEA,OAAQhB,MAAMiB,IAAI;YAChB,KAAK;YACL,KAAK;YACL,KAAK;gBAAO;oBACV,MAAMC,cAAcL,MAAM,CAACb,MAAMU,IAAI,CAAC;oBAEtC,IAAIV,MAAMiB,IAAI,KAAK,WAAWF,eAAe,WAAW;wBACtDG,WAAW,CAAC,KAAK,GAAG;oBACtB;oBAEAP,eAAe;wBACbb;wBACAC,oBAAoBiB;wBACpBJ,QAAQZ,MAAMmB,eAAe;wBAC7BlB,mBAAmBA,qBAAqBD,MAAMoB,SAAS;wBACvDlB;wBACAW,QAAQK;wBACRH;oBACF;oBAEA;gBACF;YAEA,KAAK;gBAAU;oBACb,MAAMM,eAAeR,MAAM,CAACb,MAAMU,IAAI,CAAC;oBAEvC,KAAK,MAAMY,UAAUtB,MAAMuB,eAAe,IAAIvB,MAAMwB,MAAM,CAAE;wBAC1D,MAAMC,QAAQ,OAAOH,WAAW,WAAWxB,QAAQM,OAAO,CAACoB,MAAM,CAACF,OAAO,GAAGA;wBAC5E,IACE,AAACP,eAAe,aAAaM,YAAY,CAACI,MAAMC,IAAI,CAAC,KAAK,QACzDX,eAAe,aAAa,OAAOM,YAAY,CAACI,MAAMC,IAAI,CAAC,KAAK,aACjE;4BACAf,eAAe;gCACbb;gCACAC,oBAAoBiB;gCACpBJ,QAAQa,MAAMN,eAAe;gCAC7BlB,mBAAmBA,qBAAqBD,MAAMoB,SAAS;gCACvDlB;gCACAW,QAAQ,CAAC;gCACTC,yBAAyB;gCACzBC,YAAY;4BACd;4BACA;wBACF;wBAEA,IAAIY,kBAAkBZ;wBAEtB,IAAIA,eAAe,aAAaM,YAAY,CAACI,MAAMC,IAAI,CAAC,KAAK,OAAO;4BAClEC,kBAAkB;wBACpB;wBAEA,IAAI,OAAON,YAAY,CAACI,MAAMC,IAAI,CAAC,KAAK,UAAU;4BAChDL,YAAY,CAACI,MAAMC,IAAI,CAAC,GAAG,CAAC;wBAC9B;wBAEA,IAAIC,oBAAoB,WAAW;4BACjCN,YAAY,CAACI,MAAMC,IAAI,CAAC,CAAC,KAAK,GAAG;4BACjCL,YAAY,CAACI,MAAMC,IAAI,CAAC,CAAC,YAAY,GAAG;wBAC1C;wBAEAf,eAAe;4BACbb;4BACAC,oBAAoBiB;4BACpBJ,QAAQa,MAAMN,eAAe;4BAC7BlB,mBAAmBA,qBAAqBD,MAAMoB,SAAS;4BACvDlB;4BACAW,QAAQQ,YAAY,CAACI,MAAMC,IAAI,CAAC;4BAChCX,YAAYY;wBACd;oBACF;oBAEA;gBACF;YAEA;gBACE;QACJ;IACF;AACF;AAEA,OAAO,MAAMC,4BAA4B,CAAC,EACxC9B,OAAO,EACPc,MAAM,EACNC,MAAM,EAKP;IACC,IAAI,CAACA,QAAQ;QACX;IACF;IAEA,MAAMX,aAAmC;QACvC2B,KAAK;IACP;IAEAlB,eAAe;QACbb;QACAc;QACAV;QACA,kCAAkC;QAClCW,QAAQpB,qBAAqBoB;QAC7BE,YAAYnB,cAAciB;IAC5B;IAEA,OAAOX;AACT,EAAC"}