@payloadcms/db-mongodb 4.0.0-internal.9496957 → 4.0.0-internal.952ed66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/dist/connect.d.ts.map +1 -1
  2. package/dist/connect.js +9 -2
  3. package/dist/connect.js.map +1 -1
  4. package/dist/count.d.ts.map +1 -1
  5. package/dist/count.js +33 -4
  6. package/dist/count.js.map +1 -1
  7. package/dist/countGlobalVersions.d.ts.map +1 -1
  8. package/dist/countGlobalVersions.js +10 -2
  9. package/dist/countGlobalVersions.js.map +1 -1
  10. package/dist/countVersions.d.ts.map +1 -1
  11. package/dist/countVersions.js +36 -4
  12. package/dist/countVersions.js.map +1 -1
  13. package/dist/createGlobalVersion.d.ts +1 -1
  14. package/dist/createGlobalVersion.d.ts.map +1 -1
  15. package/dist/createGlobalVersion.js +24 -1
  16. package/dist/createGlobalVersion.js.map +1 -1
  17. package/dist/createVersion.d.ts.map +1 -1
  18. package/dist/createVersion.js +16 -3
  19. package/dist/createVersion.js.map +1 -1
  20. package/dist/deleteBranchGlobal.d.ts +10 -0
  21. package/dist/deleteBranchGlobal.d.ts.map +1 -0
  22. package/dist/deleteBranchGlobal.js +26 -0
  23. package/dist/deleteBranchGlobal.js.map +1 -0
  24. package/dist/deleteMany.d.ts.map +1 -1
  25. package/dist/deleteMany.js +1 -0
  26. package/dist/deleteMany.js.map +1 -1
  27. package/dist/deleteOne.d.ts.map +1 -1
  28. package/dist/deleteOne.js +20 -1
  29. package/dist/deleteOne.js.map +1 -1
  30. package/dist/deleteVersions.d.ts.map +1 -1
  31. package/dist/deleteVersions.js +1 -0
  32. package/dist/deleteVersions.js.map +1 -1
  33. package/dist/exports/migration-utils.d.ts +2 -0
  34. package/dist/exports/migration-utils.d.ts.map +1 -1
  35. package/dist/exports/migration-utils.js +2 -0
  36. package/dist/exports/migration-utils.js.map +1 -1
  37. package/dist/find.d.ts.map +1 -1
  38. package/dist/find.js +44 -8
  39. package/dist/find.js.map +1 -1
  40. package/dist/findDistinct.d.ts.map +1 -1
  41. package/dist/findDistinct.js +115 -12
  42. package/dist/findDistinct.js.map +1 -1
  43. package/dist/findGlobal.d.ts.map +1 -1
  44. package/dist/findGlobal.js +48 -9
  45. package/dist/findGlobal.js.map +1 -1
  46. package/dist/findGlobalVersions.d.ts.map +1 -1
  47. package/dist/findGlobalVersions.js +10 -2
  48. package/dist/findGlobalVersions.js.map +1 -1
  49. package/dist/findOne.d.ts.map +1 -1
  50. package/dist/findOne.js +43 -5
  51. package/dist/findOne.js.map +1 -1
  52. package/dist/findVersions.d.ts.map +1 -1
  53. package/dist/findVersions.js +49 -5
  54. package/dist/findVersions.js.map +1 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +4 -0
  57. package/dist/index.js.map +1 -1
  58. package/dist/init.d.ts.map +1 -1
  59. package/dist/init.js +89 -67
  60. package/dist/init.js.map +1 -1
  61. package/dist/migrateFresh.d.ts.map +1 -1
  62. package/dist/migrateFresh.js +1 -0
  63. package/dist/migrateFresh.js.map +1 -1
  64. package/dist/models/buildCollectionSchema.d.ts +8 -2
  65. package/dist/models/buildCollectionSchema.d.ts.map +1 -1
  66. package/dist/models/buildCollectionSchema.js +4 -2
  67. package/dist/models/buildCollectionSchema.js.map +1 -1
  68. package/dist/models/buildGlobalModel.d.ts +5 -1
  69. package/dist/models/buildGlobalModel.d.ts.map +1 -1
  70. package/dist/models/buildGlobalModel.js +34 -3
  71. package/dist/models/buildGlobalModel.js.map +1 -1
  72. package/dist/models/buildSchema.d.ts +4 -0
  73. package/dist/models/buildSchema.d.ts.map +1 -1
  74. package/dist/models/buildSchema.js +100 -36
  75. package/dist/models/buildSchema.js.map +1 -1
  76. package/dist/models/schemaBuildContext.d.ts +21 -0
  77. package/dist/models/schemaBuildContext.d.ts.map +1 -0
  78. package/dist/models/schemaBuildContext.js +29 -0
  79. package/dist/models/schemaBuildContext.js.map +1 -0
  80. package/dist/predefinedMigrations/branching.d.ts +4 -0
  81. package/dist/predefinedMigrations/branching.d.ts.map +1 -0
  82. package/dist/predefinedMigrations/branching.js +9 -0
  83. package/dist/predefinedMigrations/branching.js.map +1 -0
  84. package/dist/predefinedMigrations/migrateBranching.d.ts +17 -0
  85. package/dist/predefinedMigrations/migrateBranching.d.ts.map +1 -0
  86. package/dist/predefinedMigrations/migrateBranching.js +90 -0
  87. package/dist/predefinedMigrations/migrateBranching.js.map +1 -0
  88. package/dist/predefinedMigrations/migrateSizesToVariants.d.ts +13 -0
  89. package/dist/predefinedMigrations/migrateSizesToVariants.d.ts.map +1 -0
  90. package/dist/predefinedMigrations/migrateSizesToVariants.js +368 -0
  91. package/dist/predefinedMigrations/migrateSizesToVariants.js.map +1 -0
  92. package/dist/predefinedMigrations/sizes-to-variants.d.ts +5 -0
  93. package/dist/predefinedMigrations/sizes-to-variants.d.ts.map +1 -0
  94. package/dist/predefinedMigrations/sizes-to-variants.js +8 -0
  95. package/dist/predefinedMigrations/sizes-to-variants.js.map +1 -0
  96. package/dist/queries/buildAndOrConditions.d.ts +4 -2
  97. package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
  98. package/dist/queries/buildAndOrConditions.js +3 -1
  99. package/dist/queries/buildAndOrConditions.js.map +1 -1
  100. package/dist/queries/buildBranchVisibility.d.ts +11 -0
  101. package/dist/queries/buildBranchVisibility.d.ts.map +1 -0
  102. package/dist/queries/buildBranchVisibility.js +204 -0
  103. package/dist/queries/buildBranchVisibility.js.map +1 -0
  104. package/dist/queries/buildQuery.d.ts +4 -2
  105. package/dist/queries/buildQuery.d.ts.map +1 -1
  106. package/dist/queries/buildQuery.js +3 -1
  107. package/dist/queries/buildQuery.js.map +1 -1
  108. package/dist/queries/buildRelatedQueryPipeline.d.ts +7 -0
  109. package/dist/queries/buildRelatedQueryPipeline.d.ts.map +1 -0
  110. package/dist/queries/buildRelatedQueryPipeline.js +56 -0
  111. package/dist/queries/buildRelatedQueryPipeline.js.map +1 -0
  112. package/dist/queries/buildSearchParams.d.ts +4 -2
  113. package/dist/queries/buildSearchParams.d.ts.map +1 -1
  114. package/dist/queries/buildSearchParams.js +223 -41
  115. package/dist/queries/buildSearchParams.js.map +1 -1
  116. package/dist/queries/getBuildQueryPlugin.d.ts +3 -1
  117. package/dist/queries/getBuildQueryPlugin.d.ts.map +1 -1
  118. package/dist/queries/getBuildQueryPlugin.js +3 -1
  119. package/dist/queries/getBuildQueryPlugin.js.map +1 -1
  120. package/dist/queries/parseParams.d.ts +4 -2
  121. package/dist/queries/parseParams.d.ts.map +1 -1
  122. package/dist/queries/parseParams.js +5 -1
  123. package/dist/queries/parseParams.js.map +1 -1
  124. package/dist/queryDrafts.d.ts.map +1 -1
  125. package/dist/queryDrafts.js +39 -7
  126. package/dist/queryDrafts.js.map +1 -1
  127. package/dist/transactions/commitTransaction.d.ts.map +1 -1
  128. package/dist/transactions/commitTransaction.js +69 -7
  129. package/dist/transactions/commitTransaction.js.map +1 -1
  130. package/dist/transactions/rollbackTransaction.d.ts.map +1 -1
  131. package/dist/transactions/rollbackTransaction.js +10 -9
  132. package/dist/transactions/rollbackTransaction.js.map +1 -1
  133. package/dist/updateGlobal.d.ts.map +1 -1
  134. package/dist/updateGlobal.js +91 -9
  135. package/dist/updateGlobal.js.map +1 -1
  136. package/dist/updateGlobalVersion.d.ts.map +1 -1
  137. package/dist/updateGlobalVersion.js +3 -2
  138. package/dist/updateGlobalVersion.js.map +1 -1
  139. package/dist/updateJobs.js +1 -1
  140. package/dist/updateJobs.js.map +1 -1
  141. package/dist/updateMany.d.ts.map +1 -1
  142. package/dist/updateMany.js +3 -2
  143. package/dist/updateMany.js.map +1 -1
  144. package/dist/updateOne.d.ts.map +1 -1
  145. package/dist/updateOne.js +30 -4
  146. package/dist/updateOne.js.map +1 -1
  147. package/dist/updateVersion.d.ts.map +1 -1
  148. package/dist/updateVersion.js +3 -2
  149. package/dist/updateVersion.js.map +1 -1
  150. package/dist/upsertBranchGlobalChange.d.ts +3 -0
  151. package/dist/upsertBranchGlobalChange.d.ts.map +1 -0
  152. package/dist/upsertBranchGlobalChange.js +28 -0
  153. package/dist/upsertBranchGlobalChange.js.map +1 -0
  154. package/dist/utilities/aggregatePaginate.d.ts +2 -1
  155. package/dist/utilities/aggregatePaginate.d.ts.map +1 -1
  156. package/dist/utilities/aggregatePaginate.js +21 -5
  157. package/dist/utilities/aggregatePaginate.js.map +1 -1
  158. package/dist/utilities/buildJoinAggregation.d.ts +4 -2
  159. package/dist/utilities/buildJoinAggregation.d.ts.map +1 -1
  160. package/dist/utilities/buildJoinAggregation.js +158 -24
  161. package/dist/utilities/buildJoinAggregation.js.map +1 -1
  162. package/dist/utilities/resolveJoins.d.ts +6 -2
  163. package/dist/utilities/resolveJoins.d.ts.map +1 -1
  164. package/dist/utilities/resolveJoins.js +115 -26
  165. package/dist/utilities/resolveJoins.js.map +1 -1
  166. package/package.json +16 -19
  167. package/dist/queries/buildSortParam.spec.js +0 -123
  168. package/dist/queries/buildSortParam.spec.js.map +0 -1
  169. package/dist/queries/getLocalizedSortProperty.spec.js +0 -215
  170. package/dist/queries/getLocalizedSortProperty.spec.js.map +0 -1
  171. package/dist/utilities/transform.spec.js +0 -546
  172. package/dist/utilities/transform.spec.js.map +0 -1
@@ -1,16 +1,15 @@
1
1
  import { Types } from 'mongoose';
2
- import { APIError, escapeRegExp, getFieldByPath, getLocalizedPaths } from 'payload';
2
+ import { APIError, escapeRegExp, getFieldByPath, getLocalizedPaths, resolveBranchQuery, resolveBranchReadState, rewriteBranchIDs } from 'payload';
3
3
  import { hasManyRelationshipOperatorSet, isNestedRelationshipQuery, validOperatorSet } from 'payload/shared';
4
4
  import { getCollection } from '../utilities/getEntity.js';
5
5
  import { isObjectID } from '../utilities/isObjectID.js';
6
+ import { buildBranchVisibilityStages } from './buildBranchVisibility.js';
7
+ import { buildRelatedQueryPipeline } from './buildRelatedQueryPipeline.js';
6
8
  import { operatorMap } from './operatorMap.js';
7
9
  import { sanitizeQueryValue } from './sanitizeQueryValue.js';
8
- const subQueryOptions = {
9
- lean: true
10
- };
11
10
  /**
12
11
  * Convert the Payload key / value / operator into a MongoDB query
13
- */ export async function buildSearchParam({ collectionSlug, fields, globalSlug, incomingPath, locale, operator, parentIsLocalized, payload, val }) {
12
+ */ export async function buildSearchParam({ branch, collectionSlug, fields, globalSlug, incomingPath, locale, operator, parentIsLocalized, payload, req, val }) {
14
13
  // Replace GraphQL nested field double underscore formatting
15
14
  let sanitizedPath = incomingPath.replace(/__/g, '.');
16
15
  if (sanitizedPath === 'id') {
@@ -52,14 +51,29 @@ const subQueryOptions = {
52
51
  const [{ field, path }] = paths;
53
52
  if (hasManyRelationshipOperatorSet.has(operator) && paths.length === 1 && (field.type === 'relationship' || field.type === 'upload') && field.hasMany && typeof field.relationTo === 'string' && isNestedRelationshipQuery(val)) {
54
53
  return buildHasManyRelationshipSearchParam({
54
+ branch,
55
55
  field,
56
56
  locale,
57
57
  nestedWhere: val,
58
58
  operator: operator,
59
59
  path,
60
- payload
60
+ payload,
61
+ req
62
+ });
63
+ }
64
+ if (operator === 'contains' && paths.length === 1 && field.type === 'join' && typeof field.collection === 'string' && isNestedRelationshipQuery(val)) {
65
+ return buildJoinContainsSearchParam({
66
+ branch,
67
+ field,
68
+ locale,
69
+ nestedWhere: val,
70
+ payload,
71
+ req
61
72
  });
62
73
  }
74
+ if ((operator === 'contains' || operator === 'like' || operator === 'not_like') && (isNestedRelationshipQuery(val) || Array.isArray(val) && val.some((entry)=>isNestedRelationshipQuery(entry)))) {
75
+ throw new APIError(`Invalid value for "${operator}" on path "${path}": expected a string.`, 400);
76
+ }
63
77
  if (path) {
64
78
  const sanitizedQueryValue = sanitizeQueryValue({
65
79
  field,
@@ -93,6 +107,7 @@ const subQueryOptions = {
93
107
  let relationshipQuery = {
94
108
  value: {}
95
109
  };
110
+ let relationshipWhere;
96
111
  for (const [i, { collectionSlug, path: subPath }] of pathsToQuery.entries()){
97
112
  // The arrays are reversed together, so both entries describe the same relationship hop.
98
113
  const parentField = parentPaths[i]?.field;
@@ -107,17 +122,27 @@ const subQueryOptions = {
107
122
  collectionSlug
108
123
  });
109
124
  if (i === 0) {
110
- const subQuery = await SubModel.buildQuery({
111
- locale,
125
+ const { branchVisibility, where: relatedWhere } = await resolveRelatedBranchQuery({
126
+ branch,
127
+ collectionSlug,
112
128
  payload,
129
+ req,
113
130
  where: {
114
131
  [subPath]: {
115
132
  [formattedOperator]: val
116
133
  }
117
134
  }
118
135
  });
136
+ const subQuery = await SubModel.buildQuery({
137
+ branch,
138
+ locale,
139
+ payload,
140
+ req,
141
+ where: relatedWhere ?? {}
142
+ });
119
143
  const select = {
120
- _id: true
144
+ _id: true,
145
+ _branchDocID: true
121
146
  };
122
147
  let joinPath = null;
123
148
  if (parentField.type === 'join') {
@@ -138,7 +163,12 @@ const subQueryOptions = {
138
163
  if (joinPath) {
139
164
  select[joinPath] = true;
140
165
  }
141
- const result = await SubModel.find(subQuery).lean().select(select);
166
+ const result = await findRelatedDocuments({
167
+ branchVisibility,
168
+ Model: SubModel,
169
+ projection: select,
170
+ query: subQuery
171
+ });
142
172
  const $in = [];
143
173
  result.forEach((doc)=>{
144
174
  if (joinPath) {
@@ -163,9 +193,10 @@ const subQueryOptions = {
163
193
  $in.push(ref);
164
194
  }
165
195
  } else {
166
- const stringID = doc._id.toString();
196
+ const documentID = doc._branchDocID ?? doc._id;
197
+ const stringID = documentID.toString();
167
198
  if (Types.ObjectId.isValid(stringID)) {
168
- $in.push(doc._id);
199
+ $in.push(documentID);
169
200
  } else {
170
201
  $in.push(stringID);
171
202
  }
@@ -181,21 +212,35 @@ const subQueryOptions = {
181
212
  }
182
213
  const nextSubPath = pathsToQuery[i + 1]?.path;
183
214
  if (nextSubPath) {
184
- relationshipQuery = {
185
- value: joinPath ? {
186
- _id: {
187
- $in
188
- }
189
- } : {
190
- [nextSubPath]: {
191
- $in
192
- }
215
+ relationshipWhere = joinPath ? {
216
+ id: {
217
+ in: $in
218
+ }
219
+ } : {
220
+ [nextSubPath]: {
221
+ in: $in
193
222
  }
194
223
  };
195
224
  }
196
225
  continue;
197
226
  }
198
- const subQuery = relationshipQuery.value;
227
+ if (!relationshipWhere) {
228
+ return undefined;
229
+ }
230
+ const { branchVisibility, where: relatedWhere } = await resolveRelatedBranchQuery({
231
+ branch,
232
+ collectionSlug,
233
+ payload,
234
+ req,
235
+ where: relationshipWhere
236
+ });
237
+ const subQuery = await SubModel.buildQuery({
238
+ branch,
239
+ locale,
240
+ payload,
241
+ req,
242
+ where: relatedWhere ?? {}
243
+ });
199
244
  /**
200
245
  * Follow this join back to its parent IDs.
201
246
  * For example, matching songs yield album IDs, then artist IDs.
@@ -211,7 +256,12 @@ const subQueryOptions = {
211
256
  if (relationshipField.pathHasLocalized && payload.config.localization) {
212
257
  joinPath = joinPath.replace('<locale>', locale || payload.config.localization.defaultLocale);
213
258
  }
214
- const $in = await SubModel.distinct(joinPath, subQuery);
259
+ const $in = await findRelatedDistinctValues({
260
+ branchVisibility,
261
+ Model: SubModel,
262
+ path: joinPath,
263
+ query: subQuery
264
+ });
215
265
  if (i + 1 === pathsToQuery.length) {
216
266
  return {
217
267
  path: '_id',
@@ -220,17 +270,23 @@ const subQueryOptions = {
220
270
  }
221
271
  };
222
272
  }
223
- relationshipQuery = {
224
- value: {
225
- _id: {
226
- $in
227
- }
273
+ relationshipWhere = {
274
+ id: {
275
+ in: $in
228
276
  }
229
277
  };
230
278
  continue;
231
279
  }
232
- const result = await SubModel.find(subQuery, subQueryOptions);
233
- const $in = result.map((doc)=>doc._id);
280
+ const result = await findRelatedDocuments({
281
+ branchVisibility,
282
+ Model: SubModel,
283
+ projection: {
284
+ _id: true,
285
+ _branchDocID: true
286
+ },
287
+ query: subQuery
288
+ });
289
+ const $in = result.map((doc)=>doc._branchDocID ?? doc._id);
234
290
  // If it is the last recursion
235
291
  // then pass through the search param
236
292
  if (i + 1 === pathsToQuery.length) {
@@ -243,11 +299,9 @@ const subQueryOptions = {
243
299
  } else {
244
300
  const nextSubPath = pathsToQuery[i + 1]?.path;
245
301
  if (nextSubPath) {
246
- relationshipQuery = {
247
- value: {
248
- [nextSubPath]: {
249
- $in
250
- }
302
+ relationshipWhere = {
303
+ [nextSubPath]: {
304
+ in: $in
251
305
  }
252
306
  };
253
307
  }
@@ -367,7 +421,7 @@ const subQueryOptions = {
367
421
  * // Simplified MongoDB result, after finding the matching ingredient IDs
368
422
  * { ingredients: { $nin: [unhealthyIngredientID] } }
369
423
  * ```
370
- */ async function buildHasManyRelationshipSearchParam({ field, locale, nestedWhere, operator, path, payload }) {
424
+ */ async function buildHasManyRelationshipSearchParam({ branch, field, locale, nestedWhere, operator, path, payload, req }) {
371
425
  if (field.type !== 'relationship' && field.type !== 'upload' || !field.hasMany || typeof field.relationTo !== 'string' || !isNestedRelationshipQuery(nestedWhere)) {
372
426
  return undefined;
373
427
  }
@@ -376,14 +430,29 @@ const subQueryOptions = {
376
430
  collectionSlug: field.relationTo
377
431
  });
378
432
  const pathLocale = payload.config.localization ? payload.config.localization.localeCodes.find((localeCode)=>path.split('.').at(-1) === localeCode) : undefined;
433
+ const { branchVisibility, where: relatedWhere } = await resolveRelatedBranchQuery({
434
+ branch,
435
+ collectionSlug: field.relationTo,
436
+ payload,
437
+ req,
438
+ where: nestedWhere
439
+ });
379
440
  const matchingRelatedDocumentsQuery = await RelatedModel.buildQuery({
441
+ branch,
380
442
  locale: pathLocale ?? locale,
381
443
  payload,
382
- where: nestedWhere
444
+ req,
445
+ where: relatedWhere ?? {}
383
446
  });
384
- const findRelatedDocumentIDs = async (query)=>(await RelatedModel.find(query).lean().select({
385
- _id: true
386
- })).map((document)=>document._id);
447
+ const findRelatedDocumentIDs = async (query)=>(await findRelatedDocuments({
448
+ branchVisibility,
449
+ Model: RelatedModel,
450
+ projection: {
451
+ _id: true,
452
+ _branchDocID: true
453
+ },
454
+ query
455
+ })).map((document)=>document._branchDocID ?? document._id);
387
456
  switch(operator){
388
457
  case 'contains':
389
458
  {
@@ -398,7 +467,7 @@ const subQueryOptions = {
398
467
  case 'equals':
399
468
  {
400
469
  // Every related document satisfies an empty nested query.
401
- if (!Object.keys(matchingRelatedDocumentsQuery).length) {
470
+ if (!Object.keys(nestedWhere).length) {
402
471
  return {
403
472
  path,
404
473
  value: {
@@ -432,5 +501,118 @@ const subQueryOptions = {
432
501
  }
433
502
  }
434
503
  }
504
+ /**
505
+ * Builds a MongoDB condition for a `contains` query nested on a join field.
506
+ *
507
+ * Finds documents in the joined collection that match the nested query, then follows the join's
508
+ * `on` relationship to collect the parent IDs those documents point back to. Because the nested
509
+ * query resolves against a single joined document, the user's filter and any injected access
510
+ * constraint must be satisfied by the same document.
511
+ */ async function buildJoinContainsSearchParam({ branch, field, locale, nestedWhere, payload, req }) {
512
+ if (field.type !== 'join' || typeof field.collection !== 'string' || !isNestedRelationshipQuery(nestedWhere)) {
513
+ return undefined;
514
+ }
515
+ const { collectionConfig, Model: JoinedModel } = getCollection({
516
+ adapter: payload.db,
517
+ collectionSlug: field.collection
518
+ });
519
+ const relationshipField = getFieldByPath({
520
+ fields: collectionConfig.flattenedFields,
521
+ path: field.on
522
+ });
523
+ if (!relationshipField) {
524
+ throw new APIError('Relationship field was not found');
525
+ }
526
+ let joinPath = relationshipField.localizedPath;
527
+ if (relationshipField.pathHasLocalized && payload.config.localization) {
528
+ joinPath = joinPath.replace('<locale>', locale || payload.config.localization.defaultLocale);
529
+ }
530
+ const { branchVisibility, where: relatedWhere } = await resolveRelatedBranchQuery({
531
+ branch,
532
+ collectionSlug: field.collection,
533
+ payload,
534
+ req,
535
+ where: nestedWhere
536
+ });
537
+ const subQuery = await JoinedModel.buildQuery({
538
+ branch,
539
+ locale,
540
+ payload,
541
+ req,
542
+ where: relatedWhere ?? {}
543
+ });
544
+ const parentIDs = await findRelatedDistinctValues({
545
+ branchVisibility,
546
+ Model: JoinedModel,
547
+ path: joinPath,
548
+ query: subQuery
549
+ });
550
+ return {
551
+ path: '_id',
552
+ value: {
553
+ $in: parentIDs
554
+ }
555
+ };
556
+ }
557
+ const resolveRelatedBranchQuery = async ({ branch, collectionSlug, payload, req, where })=>{
558
+ const adapter = payload.db;
559
+ const branchReadState = resolveBranchReadState({
560
+ branch,
561
+ collectionSlug,
562
+ req
563
+ });
564
+ const resolvedWhere = branchReadState.useBranching ? rewriteBranchIDs(where) : await resolveBranchQuery({
565
+ branch,
566
+ collectionSlug,
567
+ req,
568
+ where
569
+ });
570
+ return {
571
+ branchVisibility: branchReadState.useBranching ? buildBranchVisibilityStages({
572
+ adapter,
573
+ branch: branchReadState.branch,
574
+ collectionSlug
575
+ }) : [],
576
+ where: resolvedWhere ?? {}
577
+ };
578
+ };
579
+ const findRelatedDocuments = async ({ branchVisibility, Model, projection, query })=>{
580
+ if (branchVisibility.length) {
581
+ return Model.aggregate([
582
+ ...buildRelatedQueryPipeline({
583
+ branchVisibility,
584
+ query
585
+ }),
586
+ {
587
+ $project: projection
588
+ }
589
+ ]);
590
+ }
591
+ return Model.find(query).lean().select(projection);
592
+ };
593
+ const findRelatedDistinctValues = async ({ branchVisibility, Model, path, query })=>{
594
+ if (!branchVisibility.length) {
595
+ return Model.distinct(path, query);
596
+ }
597
+ return Model.aggregate([
598
+ ...buildRelatedQueryPipeline({
599
+ branchVisibility,
600
+ query
601
+ }),
602
+ {
603
+ $project: {
604
+ value: `$${path}`
605
+ }
606
+ },
607
+ {
608
+ $unwind: '$value'
609
+ },
610
+ {
611
+ $group: {
612
+ _id: '$value'
613
+ }
614
+ }
615
+ ]).then((results)=>results.map(({ _id })=>_id));
616
+ };
435
617
 
436
618
  //# sourceMappingURL=buildSearchParams.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/queries/buildSearchParams.ts"],"sourcesContent":["import type { QueryFilter } from 'mongoose'\nimport type {\n FlattenedField,\n HasManyRelationshipOperator,\n Operator,\n PathToQuery,\n Payload,\n} from 'payload'\n\nimport { Types } from 'mongoose'\nimport { APIError, escapeRegExp, getFieldByPath, getLocalizedPaths } from 'payload'\nimport {\n hasManyRelationshipOperatorSet,\n isNestedRelationshipQuery,\n validOperatorSet,\n} from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\nimport type { OperatorMapKey } from './operatorMap.js'\n\nimport { getCollection } from '../utilities/getEntity.js'\nimport { isObjectID } from '../utilities/isObjectID.js'\nimport { operatorMap } from './operatorMap.js'\nimport { sanitizeQueryValue } from './sanitizeQueryValue.js'\n\ntype SearchParam = {\n path?: string\n rawQuery?: unknown\n value?: unknown\n}\n\nconst subQueryOptions = {\n lean: true,\n}\n\n/**\n * Convert the Payload key / value / operator into a MongoDB query\n */\nexport async function buildSearchParam({\n collectionSlug,\n fields,\n globalSlug,\n incomingPath,\n locale,\n operator,\n parentIsLocalized,\n payload,\n val,\n}: {\n collectionSlug?: string\n fields: FlattenedField[]\n globalSlug?: string\n incomingPath: string\n locale?: string\n operator: Operator\n parentIsLocalized: boolean\n payload: Payload\n val: unknown\n}): Promise<SearchParam | undefined> {\n // Replace GraphQL nested field double underscore formatting\n let sanitizedPath = incomingPath.replace(/__/g, '.')\n if (sanitizedPath === 'id') {\n sanitizedPath = '_id'\n }\n\n let paths: PathToQuery[] = []\n\n let hasCustomID = false\n\n if (sanitizedPath === '_id') {\n const customIDFieldType = collectionSlug\n ? payload.collections[collectionSlug]?.customIDType\n : undefined\n\n let idFieldType: 'number' | 'text' = 'text'\n\n if (customIDFieldType) {\n idFieldType = customIDFieldType\n hasCustomID = true\n }\n\n paths.push({\n collectionSlug,\n complete: true,\n field: {\n name: 'id',\n type: idFieldType,\n } as FlattenedField,\n parentIsLocalized: parentIsLocalized ?? false,\n path: '_id',\n })\n } else {\n paths = getLocalizedPaths({\n collectionSlug,\n fields,\n globalSlug,\n incomingPath: sanitizedPath,\n locale,\n parentIsLocalized,\n payload,\n })\n }\n\n if (!paths[0]) {\n return undefined\n }\n\n const [{ field, path }] = paths\n\n if (\n hasManyRelationshipOperatorSet.has(operator as HasManyRelationshipOperator) &&\n paths.length === 1 &&\n (field.type === 'relationship' || field.type === 'upload') &&\n field.hasMany &&\n typeof field.relationTo === 'string' &&\n isNestedRelationshipQuery(val)\n ) {\n return buildHasManyRelationshipSearchParam({\n field,\n locale,\n nestedWhere: val,\n operator: operator as HasManyRelationshipOperator,\n path,\n payload,\n })\n }\n\n if (path) {\n const sanitizedQueryValue = sanitizeQueryValue({\n field,\n hasCustomID,\n locale,\n operator,\n parentIsLocalized,\n path,\n payload,\n val,\n })\n\n if (!sanitizedQueryValue) {\n return undefined\n }\n\n const { operator: formattedOperator, rawQuery, val: formattedValue } = sanitizedQueryValue\n\n if (rawQuery && paths.length === 1) {\n return { value: rawQuery }\n }\n\n if (!formattedOperator) {\n return undefined\n }\n\n // If there are multiple collections to search through,\n // Recursively build up a list of query constraints\n if (paths.length > 1) {\n // Remove top collection and reverse array\n // to work backwards from top\n const pathsToQuery = paths.slice(1).reverse()\n const parentPaths = paths.slice(0, -1).reverse()\n\n let relationshipQuery: SearchParam = {\n value: {},\n }\n\n for (const [i, { collectionSlug, path: subPath }] of pathsToQuery.entries()) {\n // The arrays are reversed together, so both entries describe the same relationship hop.\n const parentField = parentPaths[i]?.field\n\n if (!parentField) {\n return undefined\n }\n\n if (!collectionSlug) {\n throw new APIError(`Collection with the slug ${collectionSlug} was not found.`)\n }\n\n const { collectionConfig, Model: SubModel } = getCollection({\n adapter: payload.db as MongooseAdapter,\n collectionSlug,\n })\n\n if (i === 0) {\n const subQuery = await SubModel.buildQuery({\n locale,\n payload,\n where: {\n [subPath]: {\n [formattedOperator]: val,\n },\n },\n })\n\n const select: Record<string, boolean> = {\n _id: true,\n }\n\n let joinPath: null | string = null\n\n if (parentField.type === 'join') {\n const relationshipField = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: parentField.on,\n })\n if (!relationshipField) {\n throw new APIError('Relationship field was not found')\n }\n\n let path = relationshipField.localizedPath\n if (relationshipField.pathHasLocalized && payload.config.localization) {\n path = path.replace('<locale>', locale || payload.config.localization.defaultLocale)\n }\n select[path] = true\n\n joinPath = path\n }\n\n if (joinPath) {\n select[joinPath] = true\n }\n\n const result = await SubModel.find(subQuery).lean().select(select)\n\n const $in: unknown[] = []\n\n result.forEach((doc: any) => {\n if (joinPath) {\n let ref = doc\n\n for (const segment of joinPath.split('.')) {\n if (Array.isArray(ref)) {\n ref = ref\n .map((item) => (typeof item === 'object' && item ? item[segment] : undefined))\n .flat()\n .filter((item) => item != null)\n } else if (typeof ref === 'object' && ref) {\n ref = ref[segment]\n } else {\n ref = undefined\n break\n }\n }\n\n if (Array.isArray(ref)) {\n for (const item of ref) {\n if (isObjectID(item)) {\n $in.push(item)\n }\n }\n } else if (isObjectID(ref)) {\n $in.push(ref)\n }\n } else {\n const stringID = doc._id.toString()\n if (Types.ObjectId.isValid(stringID)) {\n $in.push(doc._id)\n } else {\n $in.push(stringID)\n }\n }\n })\n\n if (pathsToQuery.length === 1) {\n return {\n path: joinPath ? '_id' : path,\n value: { $in },\n }\n }\n\n const nextSubPath = pathsToQuery[i + 1]?.path\n\n if (nextSubPath) {\n relationshipQuery = {\n value: joinPath ? { _id: { $in } } : { [nextSubPath]: { $in } },\n }\n }\n\n continue\n }\n\n const subQuery = relationshipQuery.value as QueryFilter<any>\n\n /**\n * Follow this join back to its parent IDs.\n * For example, matching songs yield album IDs, then artist IDs.\n */\n if (parentField.type === 'join') {\n const relationshipField = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: parentField.on,\n })\n if (!relationshipField) {\n throw new APIError('Relationship field was not found')\n }\n\n let joinPath = relationshipField.localizedPath\n if (relationshipField.pathHasLocalized && payload.config.localization) {\n joinPath = joinPath.replace(\n '<locale>',\n locale || payload.config.localization.defaultLocale,\n )\n }\n\n const $in = await SubModel.distinct(joinPath, subQuery)\n if (i + 1 === pathsToQuery.length) {\n return { path: '_id', value: { $in } }\n }\n\n relationshipQuery = { value: { _id: { $in } } }\n continue\n }\n\n const result = await SubModel.find(subQuery, subQueryOptions)\n\n const $in = result.map((doc) => doc._id)\n\n // If it is the last recursion\n // then pass through the search param\n if (i + 1 === pathsToQuery.length) {\n relationshipQuery = {\n path,\n value: { $in },\n }\n } else {\n const nextSubPath = pathsToQuery[i + 1]?.path\n if (nextSubPath) {\n relationshipQuery = {\n value: {\n [nextSubPath]: { $in },\n },\n }\n }\n }\n }\n\n return relationshipQuery\n }\n\n if (formattedOperator && validOperatorSet.has(formattedOperator as Operator)) {\n const operatorKey = operatorMap[formattedOperator as OperatorMapKey]\n\n if (field.type === 'relationship' || field.type === 'upload') {\n let hasNumberIDRelation\n let multiIDCondition = '$or'\n if (operatorKey === '$ne') {\n multiIDCondition = '$and'\n }\n\n const result = {\n value: {\n [multiIDCondition]: [{ [path]: { [operatorKey]: formattedValue } }],\n },\n }\n\n if (typeof formattedValue === 'string') {\n if (Types.ObjectId.isValid(formattedValue)) {\n result.value[multiIDCondition]?.push({\n [path]: { [operatorKey]: new Types.ObjectId(formattedValue) },\n })\n } else {\n ;(Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo]).forEach(\n (relationTo) => {\n const isRelatedToCustomNumberID =\n payload.collections[relationTo]?.customIDType === 'number'\n\n if (isRelatedToCustomNumberID) {\n hasNumberIDRelation = true\n }\n },\n )\n\n if (hasNumberIDRelation) {\n result.value[multiIDCondition]?.push({\n [path]: { [operatorKey]: parseFloat(formattedValue) },\n })\n }\n }\n }\n\n const length = result.value[multiIDCondition]?.length\n\n if (typeof length === 'number' && length > 1) {\n return result\n }\n }\n\n if (formattedOperator === 'like' && typeof formattedValue === 'string') {\n const words = formattedValue.split(' ')\n\n const result = {\n value: {\n $and: words.map((word) => ({\n [path]: {\n $options: 'i',\n $regex: escapeRegExp(word),\n },\n })),\n },\n }\n\n return result\n }\n\n if (formattedOperator === 'not_like' && typeof formattedValue === 'string') {\n const words = formattedValue.split(' ')\n\n const result = {\n value: {\n $and: words.map((word) => ({\n [path]: {\n $not: {\n $options: 'i',\n $regex: escapeRegExp(word),\n },\n },\n })),\n },\n }\n\n return result\n }\n\n // Some operators like 'near' need to define a full query\n // so if there is no operator key, just return the value\n if (!operatorKey) {\n return {\n path,\n value: formattedValue,\n }\n }\n\n return {\n path,\n value: { [operatorKey]: formattedValue },\n }\n }\n }\n return undefined\n}\n\n/**\n * Builds a MongoDB condition for an operator containing a nested has-many relationship query.\n *\n * First, it finds IDs from the related collection that match the nested query. The parent\n * collection can then use `$in` or `$nin` against its stored relationship IDs.\n *\n * @example\n * ```ts\n * // Input\n * { ingredients: { not_equals: { isHealthy: { equals: false } } } }\n *\n * // Simplified MongoDB result, after finding the matching ingredient IDs\n * { ingredients: { $nin: [unhealthyIngredientID] } }\n * ```\n */\nasync function buildHasManyRelationshipSearchParam({\n field,\n locale,\n nestedWhere,\n operator,\n path,\n payload,\n}: {\n field: FlattenedField\n locale?: string\n nestedWhere: unknown\n operator: HasManyRelationshipOperator\n path: string\n payload: Payload\n}): Promise<SearchParam | undefined> {\n if (\n (field.type !== 'relationship' && field.type !== 'upload') ||\n !field.hasMany ||\n typeof field.relationTo !== 'string' ||\n !isNestedRelationshipQuery(nestedWhere)\n ) {\n return undefined\n }\n\n const { Model: RelatedModel } = getCollection({\n adapter: payload.db as MongooseAdapter,\n collectionSlug: field.relationTo,\n })\n const pathLocale = payload.config.localization\n ? payload.config.localization.localeCodes.find(\n (localeCode) => path.split('.').at(-1) === localeCode,\n )\n : undefined\n const matchingRelatedDocumentsQuery = await RelatedModel.buildQuery({\n locale: pathLocale ?? locale,\n payload,\n where: nestedWhere,\n })\n\n const findRelatedDocumentIDs = async (query: Record<string, unknown>) =>\n (await RelatedModel.find(query).lean().select({ _id: true })).map((document) => document._id)\n\n switch (operator) {\n case 'contains': {\n const matchingRelatedDocumentIDs = await findRelatedDocumentIDs(matchingRelatedDocumentsQuery)\n\n return {\n path,\n value: { $in: matchingRelatedDocumentIDs },\n }\n }\n\n case 'equals': {\n // Every related document satisfies an empty nested query.\n if (!Object.keys(matchingRelatedDocumentsQuery).length) {\n return {\n path,\n value: { $nin: [] },\n }\n }\n\n // MongoDB rejects `$near` and `$text` when they are inverted with `$nor`. Check the parent\n // instead: none of its IDs may fall outside the matching IDs.\n const matchingRelatedDocumentIDs = await findRelatedDocumentIDs(matchingRelatedDocumentsQuery)\n\n return {\n path,\n value: { $not: { $elemMatch: { $nin: matchingRelatedDocumentIDs } } },\n }\n }\n\n case 'not_equals': {\n const matchingRelatedDocumentIDs = await findRelatedDocumentIDs(matchingRelatedDocumentsQuery)\n\n return {\n path,\n value: { $nin: matchingRelatedDocumentIDs },\n }\n }\n }\n}\n"],"names":["Types","APIError","escapeRegExp","getFieldByPath","getLocalizedPaths","hasManyRelationshipOperatorSet","isNestedRelationshipQuery","validOperatorSet","getCollection","isObjectID","operatorMap","sanitizeQueryValue","subQueryOptions","lean","buildSearchParam","collectionSlug","fields","globalSlug","incomingPath","locale","operator","parentIsLocalized","payload","val","sanitizedPath","replace","paths","hasCustomID","customIDFieldType","collections","customIDType","undefined","idFieldType","push","complete","field","name","type","path","has","length","hasMany","relationTo","buildHasManyRelationshipSearchParam","nestedWhere","sanitizedQueryValue","formattedOperator","rawQuery","formattedValue","value","pathsToQuery","slice","reverse","parentPaths","relationshipQuery","i","subPath","entries","parentField","collectionConfig","Model","SubModel","adapter","db","subQuery","buildQuery","where","select","_id","joinPath","relationshipField","flattenedFields","on","localizedPath","pathHasLocalized","config","localization","defaultLocale","result","find","$in","forEach","doc","ref","segment","split","Array","isArray","map","item","flat","filter","stringID","toString","ObjectId","isValid","nextSubPath","distinct","operatorKey","hasNumberIDRelation","multiIDCondition","isRelatedToCustomNumberID","parseFloat","words","$and","word","$options","$regex","$not","RelatedModel","pathLocale","localeCodes","localeCode","at","matchingRelatedDocumentsQuery","findRelatedDocumentIDs","query","document","matchingRelatedDocumentIDs","Object","keys","$nin","$elemMatch"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/queries/buildSearchParams.ts"],"sourcesContent":["import type { PipelineStage, QueryFilter } from 'mongoose'\nimport type {\n FlattenedField,\n HasManyRelationshipOperator,\n Operator,\n PathToQuery,\n Payload,\n PayloadRequest,\n Where,\n} from 'payload'\n\nimport { Types } from 'mongoose'\nimport {\n APIError,\n escapeRegExp,\n getFieldByPath,\n getLocalizedPaths,\n resolveBranchQuery,\n resolveBranchReadState,\n rewriteBranchIDs,\n} from 'payload'\nimport {\n hasManyRelationshipOperatorSet,\n isNestedRelationshipQuery,\n validOperatorSet,\n} from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\nimport type { CollectionModel } from '../types.js'\nimport type { OperatorMapKey } from './operatorMap.js'\n\nimport { getCollection } from '../utilities/getEntity.js'\nimport { isObjectID } from '../utilities/isObjectID.js'\nimport { buildBranchVisibilityStages } from './buildBranchVisibility.js'\nimport { buildRelatedQueryPipeline } from './buildRelatedQueryPipeline.js'\nimport { operatorMap } from './operatorMap.js'\nimport { sanitizeQueryValue } from './sanitizeQueryValue.js'\n\ntype SearchParam = {\n path?: string\n rawQuery?: unknown\n value?: unknown\n}\n\n/**\n * Convert the Payload key / value / operator into a MongoDB query\n */\nexport async function buildSearchParam({\n branch,\n collectionSlug,\n fields,\n globalSlug,\n incomingPath,\n locale,\n operator,\n parentIsLocalized,\n payload,\n req,\n val,\n}: {\n branch?: false | string\n collectionSlug?: string\n fields: FlattenedField[]\n globalSlug?: string\n incomingPath: string\n locale?: string\n operator: Operator\n parentIsLocalized: boolean\n payload: Payload\n req?: Partial<PayloadRequest>\n val: unknown\n}): Promise<SearchParam | undefined> {\n // Replace GraphQL nested field double underscore formatting\n let sanitizedPath = incomingPath.replace(/__/g, '.')\n if (sanitizedPath === 'id') {\n sanitizedPath = '_id'\n }\n\n let paths: PathToQuery[] = []\n\n let hasCustomID = false\n\n if (sanitizedPath === '_id') {\n const customIDFieldType = collectionSlug\n ? payload.collections[collectionSlug]?.customIDType\n : undefined\n\n let idFieldType: 'number' | 'text' = 'text'\n\n if (customIDFieldType) {\n idFieldType = customIDFieldType\n hasCustomID = true\n }\n\n paths.push({\n collectionSlug,\n complete: true,\n field: {\n name: 'id',\n type: idFieldType,\n } as FlattenedField,\n parentIsLocalized: parentIsLocalized ?? false,\n path: '_id',\n })\n } else {\n paths = getLocalizedPaths({\n collectionSlug,\n fields,\n globalSlug,\n incomingPath: sanitizedPath,\n locale,\n parentIsLocalized,\n payload,\n })\n }\n\n if (!paths[0]) {\n return undefined\n }\n\n const [{ field, path }] = paths\n\n if (\n hasManyRelationshipOperatorSet.has(operator as HasManyRelationshipOperator) &&\n paths.length === 1 &&\n (field.type === 'relationship' || field.type === 'upload') &&\n field.hasMany &&\n typeof field.relationTo === 'string' &&\n isNestedRelationshipQuery(val)\n ) {\n return buildHasManyRelationshipSearchParam({\n branch,\n field,\n locale,\n nestedWhere: val,\n operator: operator as HasManyRelationshipOperator,\n path,\n payload,\n req,\n })\n }\n\n if (\n operator === 'contains' &&\n paths.length === 1 &&\n field.type === 'join' &&\n typeof field.collection === 'string' &&\n isNestedRelationshipQuery(val)\n ) {\n return buildJoinContainsSearchParam({\n branch,\n field,\n locale,\n nestedWhere: val,\n payload,\n req,\n })\n }\n\n if (\n (operator === 'contains' || operator === 'like' || operator === 'not_like') &&\n (isNestedRelationshipQuery(val) ||\n (Array.isArray(val) && val.some((entry) => isNestedRelationshipQuery(entry))))\n ) {\n throw new APIError(`Invalid value for \"${operator}\" on path \"${path}\": expected a string.`, 400)\n }\n\n if (path) {\n const sanitizedQueryValue = sanitizeQueryValue({\n field,\n hasCustomID,\n locale,\n operator,\n parentIsLocalized,\n path,\n payload,\n val,\n })\n\n if (!sanitizedQueryValue) {\n return undefined\n }\n\n const { operator: formattedOperator, rawQuery, val: formattedValue } = sanitizedQueryValue\n\n if (rawQuery && paths.length === 1) {\n return { value: rawQuery }\n }\n\n if (!formattedOperator) {\n return undefined\n }\n\n // If there are multiple collections to search through,\n // Recursively build up a list of query constraints\n if (paths.length > 1) {\n // Remove top collection and reverse array\n // to work backwards from top\n const pathsToQuery = paths.slice(1).reverse()\n const parentPaths = paths.slice(0, -1).reverse()\n\n let relationshipQuery: SearchParam = { value: {} }\n let relationshipWhere: undefined | Where\n\n for (const [i, { collectionSlug, path: subPath }] of pathsToQuery.entries()) {\n // The arrays are reversed together, so both entries describe the same relationship hop.\n const parentField = parentPaths[i]?.field\n\n if (!parentField) {\n return undefined\n }\n\n if (!collectionSlug) {\n throw new APIError(`Collection with the slug ${collectionSlug} was not found.`)\n }\n\n const { collectionConfig, Model: SubModel } = getCollection({\n adapter: payload.db as MongooseAdapter,\n collectionSlug,\n })\n\n if (i === 0) {\n const { branchVisibility, where: relatedWhere } = await resolveRelatedBranchQuery({\n branch,\n collectionSlug,\n payload,\n req,\n where: {\n [subPath]: {\n [formattedOperator]: val,\n },\n },\n })\n const subQuery = await SubModel.buildQuery({\n branch,\n locale,\n payload,\n req,\n where: relatedWhere ?? {},\n })\n\n const select: Record<string, boolean> = {\n _id: true,\n _branchDocID: true,\n }\n\n let joinPath: null | string = null\n\n if (parentField.type === 'join') {\n const relationshipField = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: parentField.on,\n })\n if (!relationshipField) {\n throw new APIError('Relationship field was not found')\n }\n\n let path = relationshipField.localizedPath\n if (relationshipField.pathHasLocalized && payload.config.localization) {\n path = path.replace('<locale>', locale || payload.config.localization.defaultLocale)\n }\n select[path] = true\n\n joinPath = path\n }\n\n if (joinPath) {\n select[joinPath] = true\n }\n\n const result = await findRelatedDocuments({\n branchVisibility,\n Model: SubModel,\n projection: select,\n query: subQuery,\n })\n\n const $in: unknown[] = []\n\n result.forEach((doc: any) => {\n if (joinPath) {\n let ref = doc\n\n for (const segment of joinPath.split('.')) {\n if (Array.isArray(ref)) {\n ref = ref\n .map((item) => (typeof item === 'object' && item ? item[segment] : undefined))\n .flat()\n .filter((item) => item != null)\n } else if (typeof ref === 'object' && ref) {\n ref = ref[segment]\n } else {\n ref = undefined\n break\n }\n }\n\n if (Array.isArray(ref)) {\n for (const item of ref) {\n if (isObjectID(item)) {\n $in.push(item)\n }\n }\n } else if (isObjectID(ref)) {\n $in.push(ref)\n }\n } else {\n const documentID = doc._branchDocID ?? doc._id\n const stringID = documentID.toString()\n if (Types.ObjectId.isValid(stringID)) {\n $in.push(documentID)\n } else {\n $in.push(stringID)\n }\n }\n })\n\n if (pathsToQuery.length === 1) {\n return {\n path: joinPath ? '_id' : path,\n value: { $in },\n }\n }\n\n const nextSubPath = pathsToQuery[i + 1]?.path\n\n if (nextSubPath) {\n relationshipWhere = joinPath ? { id: { in: $in } } : { [nextSubPath]: { in: $in } }\n }\n\n continue\n }\n\n if (!relationshipWhere) {\n return undefined\n }\n\n const { branchVisibility, where: relatedWhere } = await resolveRelatedBranchQuery({\n branch,\n collectionSlug,\n payload,\n req,\n where: relationshipWhere,\n })\n const subQuery = (await SubModel.buildQuery({\n branch,\n locale,\n payload,\n req,\n where: relatedWhere ?? {},\n })) as QueryFilter<Record<string, unknown>>\n\n /**\n * Follow this join back to its parent IDs.\n * For example, matching songs yield album IDs, then artist IDs.\n */\n if (parentField.type === 'join') {\n const relationshipField = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: parentField.on,\n })\n if (!relationshipField) {\n throw new APIError('Relationship field was not found')\n }\n\n let joinPath = relationshipField.localizedPath\n if (relationshipField.pathHasLocalized && payload.config.localization) {\n joinPath = joinPath.replace(\n '<locale>',\n locale || payload.config.localization.defaultLocale,\n )\n }\n\n const $in = await findRelatedDistinctValues({\n branchVisibility,\n Model: SubModel,\n path: joinPath,\n query: subQuery,\n })\n if (i + 1 === pathsToQuery.length) {\n return { path: '_id', value: { $in } }\n }\n\n relationshipWhere = { id: { in: $in } }\n continue\n }\n\n const result = await findRelatedDocuments({\n branchVisibility,\n Model: SubModel,\n projection: { _id: true, _branchDocID: true },\n query: subQuery,\n })\n\n const $in = result.map((doc) => doc._branchDocID ?? doc._id)\n\n // If it is the last recursion\n // then pass through the search param\n if (i + 1 === pathsToQuery.length) {\n relationshipQuery = {\n path,\n value: { $in },\n }\n } else {\n const nextSubPath = pathsToQuery[i + 1]?.path\n if (nextSubPath) {\n relationshipWhere = { [nextSubPath]: { in: $in } }\n }\n }\n }\n\n return relationshipQuery\n }\n\n if (formattedOperator && validOperatorSet.has(formattedOperator as Operator)) {\n const operatorKey = operatorMap[formattedOperator as OperatorMapKey]\n\n if (field.type === 'relationship' || field.type === 'upload') {\n let hasNumberIDRelation\n let multiIDCondition = '$or'\n if (operatorKey === '$ne') {\n multiIDCondition = '$and'\n }\n\n const result = {\n value: {\n [multiIDCondition]: [{ [path]: { [operatorKey]: formattedValue } }],\n },\n }\n\n if (typeof formattedValue === 'string') {\n if (Types.ObjectId.isValid(formattedValue)) {\n result.value[multiIDCondition]?.push({\n [path]: { [operatorKey]: new Types.ObjectId(formattedValue) },\n })\n } else {\n ;(Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo]).forEach(\n (relationTo) => {\n const isRelatedToCustomNumberID =\n payload.collections[relationTo]?.customIDType === 'number'\n\n if (isRelatedToCustomNumberID) {\n hasNumberIDRelation = true\n }\n },\n )\n\n if (hasNumberIDRelation) {\n result.value[multiIDCondition]?.push({\n [path]: { [operatorKey]: parseFloat(formattedValue) },\n })\n }\n }\n }\n\n const length = result.value[multiIDCondition]?.length\n\n if (typeof length === 'number' && length > 1) {\n return result\n }\n }\n\n if (formattedOperator === 'like' && typeof formattedValue === 'string') {\n const words = formattedValue.split(' ')\n\n const result = {\n value: {\n $and: words.map((word) => ({\n [path]: {\n $options: 'i',\n $regex: escapeRegExp(word),\n },\n })),\n },\n }\n\n return result\n }\n\n if (formattedOperator === 'not_like' && typeof formattedValue === 'string') {\n const words = formattedValue.split(' ')\n\n const result = {\n value: {\n $and: words.map((word) => ({\n [path]: {\n $not: {\n $options: 'i',\n $regex: escapeRegExp(word),\n },\n },\n })),\n },\n }\n\n return result\n }\n\n // Some operators like 'near' need to define a full query\n // so if there is no operator key, just return the value\n if (!operatorKey) {\n return {\n path,\n value: formattedValue,\n }\n }\n\n return {\n path,\n value: { [operatorKey]: formattedValue },\n }\n }\n }\n return undefined\n}\n\n/**\n * Builds a MongoDB condition for an operator containing a nested has-many relationship query.\n *\n * First, it finds IDs from the related collection that match the nested query. The parent\n * collection can then use `$in` or `$nin` against its stored relationship IDs.\n *\n * @example\n * ```ts\n * // Input\n * { ingredients: { not_equals: { isHealthy: { equals: false } } } }\n *\n * // Simplified MongoDB result, after finding the matching ingredient IDs\n * { ingredients: { $nin: [unhealthyIngredientID] } }\n * ```\n */\nasync function buildHasManyRelationshipSearchParam({\n branch,\n field,\n locale,\n nestedWhere,\n operator,\n path,\n payload,\n req,\n}: {\n branch?: false | string\n field: FlattenedField\n locale?: string\n nestedWhere: unknown\n operator: HasManyRelationshipOperator\n path: string\n payload: Payload\n req?: Partial<PayloadRequest>\n}): Promise<SearchParam | undefined> {\n if (\n (field.type !== 'relationship' && field.type !== 'upload') ||\n !field.hasMany ||\n typeof field.relationTo !== 'string' ||\n !isNestedRelationshipQuery(nestedWhere)\n ) {\n return undefined\n }\n\n const { Model: RelatedModel } = getCollection({\n adapter: payload.db as MongooseAdapter,\n collectionSlug: field.relationTo,\n })\n const pathLocale = payload.config.localization\n ? payload.config.localization.localeCodes.find(\n (localeCode) => path.split('.').at(-1) === localeCode,\n )\n : undefined\n const { branchVisibility, where: relatedWhere } = await resolveRelatedBranchQuery({\n branch,\n collectionSlug: field.relationTo,\n payload,\n req,\n where: nestedWhere,\n })\n const matchingRelatedDocumentsQuery = await RelatedModel.buildQuery({\n branch,\n locale: pathLocale ?? locale,\n payload,\n req,\n where: relatedWhere ?? {},\n })\n\n const findRelatedDocumentIDs = async (query: Record<string, unknown>) =>\n (\n await findRelatedDocuments({\n branchVisibility,\n Model: RelatedModel,\n projection: { _id: true, _branchDocID: true },\n query,\n })\n ).map((document) => document._branchDocID ?? document._id)\n\n switch (operator) {\n case 'contains': {\n const matchingRelatedDocumentIDs = await findRelatedDocumentIDs(matchingRelatedDocumentsQuery)\n\n return {\n path,\n value: { $in: matchingRelatedDocumentIDs },\n }\n }\n\n case 'equals': {\n // Every related document satisfies an empty nested query.\n if (!Object.keys(nestedWhere).length) {\n return {\n path,\n value: { $nin: [] },\n }\n }\n\n // MongoDB rejects `$near` and `$text` when they are inverted with `$nor`. Check the parent\n // instead: none of its IDs may fall outside the matching IDs.\n const matchingRelatedDocumentIDs = await findRelatedDocumentIDs(matchingRelatedDocumentsQuery)\n\n return {\n path,\n value: { $not: { $elemMatch: { $nin: matchingRelatedDocumentIDs } } },\n }\n }\n\n case 'not_equals': {\n const matchingRelatedDocumentIDs = await findRelatedDocumentIDs(matchingRelatedDocumentsQuery)\n\n return {\n path,\n value: { $nin: matchingRelatedDocumentIDs },\n }\n }\n }\n}\n\n/**\n * Builds a MongoDB condition for a `contains` query nested on a join field.\n *\n * Finds documents in the joined collection that match the nested query, then follows the join's\n * `on` relationship to collect the parent IDs those documents point back to. Because the nested\n * query resolves against a single joined document, the user's filter and any injected access\n * constraint must be satisfied by the same document.\n */\nasync function buildJoinContainsSearchParam({\n branch,\n field,\n locale,\n nestedWhere,\n payload,\n req,\n}: {\n branch?: false | string\n field: FlattenedField\n locale?: string\n nestedWhere: unknown\n payload: Payload\n req?: Partial<PayloadRequest>\n}): Promise<SearchParam | undefined> {\n if (\n field.type !== 'join' ||\n typeof field.collection !== 'string' ||\n !isNestedRelationshipQuery(nestedWhere)\n ) {\n return undefined\n }\n\n const { collectionConfig, Model: JoinedModel } = getCollection({\n adapter: payload.db as MongooseAdapter,\n collectionSlug: field.collection,\n })\n\n const relationshipField = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: field.on,\n })\n\n if (!relationshipField) {\n throw new APIError('Relationship field was not found')\n }\n\n let joinPath = relationshipField.localizedPath\n if (relationshipField.pathHasLocalized && payload.config.localization) {\n joinPath = joinPath.replace('<locale>', locale || payload.config.localization.defaultLocale)\n }\n\n const { branchVisibility, where: relatedWhere } = await resolveRelatedBranchQuery({\n branch,\n collectionSlug: field.collection,\n payload,\n req,\n where: nestedWhere,\n })\n const subQuery = await JoinedModel.buildQuery({\n branch,\n locale,\n payload,\n req,\n where: relatedWhere ?? {},\n })\n\n const parentIDs = await findRelatedDistinctValues({\n branchVisibility,\n Model: JoinedModel,\n path: joinPath,\n query: subQuery,\n })\n\n return {\n path: '_id',\n value: { $in: parentIDs },\n }\n}\n\nconst resolveRelatedBranchQuery = async ({\n branch,\n collectionSlug,\n payload,\n req,\n where,\n}: {\n branch?: false | string\n collectionSlug: string\n payload: Payload\n req?: Partial<PayloadRequest>\n where: Where\n}) => {\n const adapter = payload.db as MongooseAdapter\n const branchReadState = resolveBranchReadState({ branch, collectionSlug, req })\n const resolvedWhere = branchReadState.useBranching\n ? rewriteBranchIDs(where)\n : await resolveBranchQuery({ branch, collectionSlug, req, where })\n\n return {\n branchVisibility: branchReadState.useBranching\n ? buildBranchVisibilityStages({\n adapter,\n branch: branchReadState.branch,\n collectionSlug,\n })\n : [],\n where: resolvedWhere ?? {},\n }\n}\n\nconst findRelatedDocuments = async ({\n branchVisibility,\n Model,\n projection,\n query,\n}: {\n branchVisibility: PipelineStage[]\n Model: CollectionModel\n projection: Record<string, boolean>\n query: Record<string, unknown>\n}) => {\n if (branchVisibility.length) {\n return Model.aggregate([\n ...buildRelatedQueryPipeline({ branchVisibility, query }),\n { $project: projection },\n ])\n }\n\n return Model.find(query).lean().select(projection)\n}\n\nconst findRelatedDistinctValues = async ({\n branchVisibility,\n Model,\n path,\n query,\n}: {\n branchVisibility: PipelineStage[]\n Model: CollectionModel\n path: string\n query: Record<string, unknown>\n}) => {\n if (!branchVisibility.length) {\n return Model.distinct(path, query)\n }\n\n return Model.aggregate([\n ...buildRelatedQueryPipeline({ branchVisibility, query }),\n { $project: { value: `$${path}` } },\n { $unwind: '$value' },\n { $group: { _id: '$value' } },\n ]).then((results) => results.map(({ _id }) => _id))\n}\n"],"names":["Types","APIError","escapeRegExp","getFieldByPath","getLocalizedPaths","resolveBranchQuery","resolveBranchReadState","rewriteBranchIDs","hasManyRelationshipOperatorSet","isNestedRelationshipQuery","validOperatorSet","getCollection","isObjectID","buildBranchVisibilityStages","buildRelatedQueryPipeline","operatorMap","sanitizeQueryValue","buildSearchParam","branch","collectionSlug","fields","globalSlug","incomingPath","locale","operator","parentIsLocalized","payload","req","val","sanitizedPath","replace","paths","hasCustomID","customIDFieldType","collections","customIDType","undefined","idFieldType","push","complete","field","name","type","path","has","length","hasMany","relationTo","buildHasManyRelationshipSearchParam","nestedWhere","collection","buildJoinContainsSearchParam","Array","isArray","some","entry","sanitizedQueryValue","formattedOperator","rawQuery","formattedValue","value","pathsToQuery","slice","reverse","parentPaths","relationshipQuery","relationshipWhere","i","subPath","entries","parentField","collectionConfig","Model","SubModel","adapter","db","branchVisibility","where","relatedWhere","resolveRelatedBranchQuery","subQuery","buildQuery","select","_id","_branchDocID","joinPath","relationshipField","flattenedFields","on","localizedPath","pathHasLocalized","config","localization","defaultLocale","result","findRelatedDocuments","projection","query","$in","forEach","doc","ref","segment","split","map","item","flat","filter","documentID","stringID","toString","ObjectId","isValid","nextSubPath","id","in","findRelatedDistinctValues","operatorKey","hasNumberIDRelation","multiIDCondition","isRelatedToCustomNumberID","parseFloat","words","$and","word","$options","$regex","$not","RelatedModel","pathLocale","localeCodes","find","localeCode","at","matchingRelatedDocumentsQuery","findRelatedDocumentIDs","document","matchingRelatedDocumentIDs","Object","keys","$nin","$elemMatch","JoinedModel","parentIDs","branchReadState","resolvedWhere","useBranching","aggregate","$project","lean","distinct","$unwind","$group","then","results"],"mappings":"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"}
@@ -1,12 +1,14 @@
1
- import type { FlattenedField, Payload, Where } from 'payload';
1
+ import type { FlattenedField, Payload, PayloadRequest, Where } from 'payload';
2
2
  type GetBuildQueryPluginArgs = {
3
3
  collectionSlug?: string;
4
4
  versionsFields?: FlattenedField[];
5
5
  };
6
6
  export type BuildQueryArgs = {
7
+ branch?: false | string;
7
8
  globalSlug?: string;
8
9
  locale?: string;
9
10
  payload: Payload;
11
+ req?: Partial<PayloadRequest>;
10
12
  where: Where;
11
13
  };
12
14
  export declare const getBuildQueryPlugin: ({ collectionSlug, versionsFields, }?: GetBuildQueryPluginArgs) => (schema: any) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"getBuildQueryPlugin.d.ts","sourceRoot":"","sources":["../../src/queries/getBuildQueryPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAM7D,KAAK,uBAAuB,GAAG;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,cAAc,EAAE,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAKD,eAAO,MAAM,mBAAmB,yCAG7B,uBAAuB,cACiB,GAAG,SAmD7C,CAAA"}
1
+ {"version":3,"file":"getBuildQueryPlugin.d.ts","sourceRoot":"","sources":["../../src/queries/getBuildQueryPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAM7E,KAAK,uBAAuB,GAAG;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,cAAc,EAAE,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7B,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAKD,eAAO,MAAM,mBAAmB,yCAG7B,uBAAuB,cACiB,GAAG,SAuD7C,CAAA"}
@@ -6,7 +6,7 @@ import { parseParams } from './parseParams.js';
6
6
  export const getBuildQueryPlugin = ({ collectionSlug, versionsFields } = {})=>{
7
7
  return function buildQueryPlugin(schema) {
8
8
  const modifiedSchema = schema;
9
- async function schemaBuildQuery({ globalSlug, locale, payload, where }) {
9
+ async function schemaBuildQuery({ branch, globalSlug, locale, payload, req, where }) {
10
10
  let fields = null;
11
11
  if (versionsFields) {
12
12
  fields = versionsFields;
@@ -30,12 +30,14 @@ export const getBuildQueryPlugin = ({ collectionSlug, versionsFields } = {})=>{
30
30
  throw new APIError('Fields are not initialized.');
31
31
  }
32
32
  const result = await parseParams({
33
+ branch,
33
34
  collectionSlug,
34
35
  fields,
35
36
  globalSlug,
36
37
  locale,
37
38
  parentIsLocalized: false,
38
39
  payload,
40
+ req,
39
41
  where
40
42
  });
41
43
  return result;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/queries/getBuildQueryPlugin.ts"],"sourcesContent":["import type { FlattenedField, Payload, Where } from 'payload'\n\nimport { APIError } from 'payload'\n\nimport { parseParams } from './parseParams.js'\n\ntype GetBuildQueryPluginArgs = {\n collectionSlug?: string\n versionsFields?: FlattenedField[]\n}\n\nexport type BuildQueryArgs = {\n globalSlug?: string\n locale?: string\n payload: Payload\n where: Where\n}\n\n// This plugin asynchronously builds a list of Mongoose query constraints\n// which can then be used in subsequent Mongoose queries.\n// Deprecated in favor of using simpler buildQuery directly\nexport const getBuildQueryPlugin = ({\n collectionSlug,\n versionsFields,\n}: GetBuildQueryPluginArgs = {}) => {\n return function buildQueryPlugin(schema: any) {\n const modifiedSchema = schema\n async function schemaBuildQuery({\n globalSlug,\n locale,\n payload,\n where,\n }: BuildQueryArgs): Promise<Record<string, unknown>> {\n let fields: FlattenedField[] | null = null\n\n if (versionsFields) {\n fields = versionsFields\n } else {\n if (globalSlug) {\n const globalConfig = payload.globals.config.find(({ slug }) => slug === globalSlug)\n\n if (!globalConfig) {\n throw new APIError(`Global with the slug ${globalSlug} was not found`)\n }\n\n fields = globalConfig.flattenedFields\n }\n if (collectionSlug) {\n const collectionConfig = payload.collections[collectionSlug]?.config\n\n if (!collectionConfig) {\n throw new APIError(`Collection with the slug ${globalSlug} was not found`)\n }\n\n fields = collectionConfig.flattenedFields\n }\n }\n\n if (fields === null) {\n throw new APIError('Fields are not initialized.')\n }\n\n const result = await parseParams({\n collectionSlug,\n fields,\n globalSlug,\n locale,\n parentIsLocalized: false,\n payload,\n where,\n })\n\n return result\n }\n modifiedSchema.statics.buildQuery = schemaBuildQuery\n }\n}\n"],"names":["APIError","parseParams","getBuildQueryPlugin","collectionSlug","versionsFields","buildQueryPlugin","schema","modifiedSchema","schemaBuildQuery","globalSlug","locale","payload","where","fields","globalConfig","globals","config","find","slug","flattenedFields","collectionConfig","collections","result","parentIsLocalized","statics","buildQuery"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,UAAS;AAElC,SAASC,WAAW,QAAQ,mBAAkB;AAc9C,yEAAyE;AACzE,yDAAyD;AACzD,2DAA2D;AAC3D,OAAO,MAAMC,sBAAsB,CAAC,EAClCC,cAAc,EACdC,cAAc,EACU,GAAG,CAAC,CAAC;IAC7B,OAAO,SAASC,iBAAiBC,MAAW;QAC1C,MAAMC,iBAAiBD;QACvB,eAAeE,iBAAiB,EAC9BC,UAAU,EACVC,MAAM,EACNC,OAAO,EACPC,KAAK,EACU;YACf,IAAIC,SAAkC;YAEtC,IAAIT,gBAAgB;gBAClBS,SAAST;YACX,OAAO;gBACL,IAAIK,YAAY;oBACd,MAAMK,eAAeH,QAAQI,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKA,SAAST;oBAExE,IAAI,CAACK,cAAc;wBACjB,MAAM,IAAId,SAAS,CAAC,qBAAqB,EAAES,WAAW,cAAc,CAAC;oBACvE;oBAEAI,SAASC,aAAaK,eAAe;gBACvC;gBACA,IAAIhB,gBAAgB;oBAClB,MAAMiB,mBAAmBT,QAAQU,WAAW,CAAClB,eAAe,EAAEa;oBAE9D,IAAI,CAACI,kBAAkB;wBACrB,MAAM,IAAIpB,SAAS,CAAC,yBAAyB,EAAES,WAAW,cAAc,CAAC;oBAC3E;oBAEAI,SAASO,iBAAiBD,eAAe;gBAC3C;YACF;YAEA,IAAIN,WAAW,MAAM;gBACnB,MAAM,IAAIb,SAAS;YACrB;YAEA,MAAMsB,SAAS,MAAMrB,YAAY;gBAC/BE;gBACAU;gBACAJ;gBACAC;gBACAa,mBAAmB;gBACnBZ;gBACAC;YACF;YAEA,OAAOU;QACT;QACAf,eAAeiB,OAAO,CAACC,UAAU,GAAGjB;IACtC;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/queries/getBuildQueryPlugin.ts"],"sourcesContent":["import type { FlattenedField, Payload, PayloadRequest, Where } from 'payload'\n\nimport { APIError } from 'payload'\n\nimport { parseParams } from './parseParams.js'\n\ntype GetBuildQueryPluginArgs = {\n collectionSlug?: string\n versionsFields?: FlattenedField[]\n}\n\nexport type BuildQueryArgs = {\n branch?: false | string\n globalSlug?: string\n locale?: string\n payload: Payload\n req?: Partial<PayloadRequest>\n where: Where\n}\n\n// This plugin asynchronously builds a list of Mongoose query constraints\n// which can then be used in subsequent Mongoose queries.\n// Deprecated in favor of using simpler buildQuery directly\nexport const getBuildQueryPlugin = ({\n collectionSlug,\n versionsFields,\n}: GetBuildQueryPluginArgs = {}) => {\n return function buildQueryPlugin(schema: any) {\n const modifiedSchema = schema\n async function schemaBuildQuery({\n branch,\n globalSlug,\n locale,\n payload,\n req,\n where,\n }: BuildQueryArgs): Promise<Record<string, unknown>> {\n let fields: FlattenedField[] | null = null\n\n if (versionsFields) {\n fields = versionsFields\n } else {\n if (globalSlug) {\n const globalConfig = payload.globals.config.find(({ slug }) => slug === globalSlug)\n\n if (!globalConfig) {\n throw new APIError(`Global with the slug ${globalSlug} was not found`)\n }\n\n fields = globalConfig.flattenedFields\n }\n if (collectionSlug) {\n const collectionConfig = payload.collections[collectionSlug]?.config\n\n if (!collectionConfig) {\n throw new APIError(`Collection with the slug ${globalSlug} was not found`)\n }\n\n fields = collectionConfig.flattenedFields\n }\n }\n\n if (fields === null) {\n throw new APIError('Fields are not initialized.')\n }\n\n const result = await parseParams({\n branch,\n collectionSlug,\n fields,\n globalSlug,\n locale,\n parentIsLocalized: false,\n payload,\n req,\n where,\n })\n\n return result\n }\n modifiedSchema.statics.buildQuery = schemaBuildQuery\n }\n}\n"],"names":["APIError","parseParams","getBuildQueryPlugin","collectionSlug","versionsFields","buildQueryPlugin","schema","modifiedSchema","schemaBuildQuery","branch","globalSlug","locale","payload","req","where","fields","globalConfig","globals","config","find","slug","flattenedFields","collectionConfig","collections","result","parentIsLocalized","statics","buildQuery"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,UAAS;AAElC,SAASC,WAAW,QAAQ,mBAAkB;AAgB9C,yEAAyE;AACzE,yDAAyD;AACzD,2DAA2D;AAC3D,OAAO,MAAMC,sBAAsB,CAAC,EAClCC,cAAc,EACdC,cAAc,EACU,GAAG,CAAC,CAAC;IAC7B,OAAO,SAASC,iBAAiBC,MAAW;QAC1C,MAAMC,iBAAiBD;QACvB,eAAeE,iBAAiB,EAC9BC,MAAM,EACNC,UAAU,EACVC,MAAM,EACNC,OAAO,EACPC,GAAG,EACHC,KAAK,EACU;YACf,IAAIC,SAAkC;YAEtC,IAAIX,gBAAgB;gBAClBW,SAASX;YACX,OAAO;gBACL,IAAIM,YAAY;oBACd,MAAMM,eAAeJ,QAAQK,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKA,SAASV;oBAExE,IAAI,CAACM,cAAc;wBACjB,MAAM,IAAIhB,SAAS,CAAC,qBAAqB,EAAEU,WAAW,cAAc,CAAC;oBACvE;oBAEAK,SAASC,aAAaK,eAAe;gBACvC;gBACA,IAAIlB,gBAAgB;oBAClB,MAAMmB,mBAAmBV,QAAQW,WAAW,CAACpB,eAAe,EAAEe;oBAE9D,IAAI,CAACI,kBAAkB;wBACrB,MAAM,IAAItB,SAAS,CAAC,yBAAyB,EAAEU,WAAW,cAAc,CAAC;oBAC3E;oBAEAK,SAASO,iBAAiBD,eAAe;gBAC3C;YACF;YAEA,IAAIN,WAAW,MAAM;gBACnB,MAAM,IAAIf,SAAS;YACrB;YAEA,MAAMwB,SAAS,MAAMvB,YAAY;gBAC/BQ;gBACAN;gBACAY;gBACAL;gBACAC;gBACAc,mBAAmB;gBACnBb;gBACAC;gBACAC;YACF;YAEA,OAAOU;QACT;QACAjB,eAAemB,OAAO,CAACC,UAAU,GAAGnB;IACtC;AACF,EAAC"}
@@ -1,11 +1,13 @@
1
- import type { FlattenedField, Payload, Where } from 'payload';
2
- export declare function parseParams({ collectionSlug, fields, globalSlug, locale, parentIsLocalized, payload, where, }: {
1
+ import type { FlattenedField, Payload, PayloadRequest, Where } from 'payload';
2
+ export declare function parseParams({ branch, collectionSlug, fields, globalSlug, locale, parentIsLocalized, payload, req, where, }: {
3
+ branch?: false | string;
3
4
  collectionSlug?: string;
4
5
  fields: FlattenedField[];
5
6
  globalSlug?: string;
6
7
  locale?: string;
7
8
  parentIsLocalized: boolean;
8
9
  payload: Payload;
10
+ req?: Partial<PayloadRequest>;
9
11
  where: Where;
10
12
  }): Promise<Record<string, unknown>>;
11
13
  //# sourceMappingURL=parseParams.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseParams.d.ts","sourceRoot":"","sources":["../../src/queries/parseParams.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAY,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAQvE,wBAAsB,WAAW,CAAC,EAChC,cAAc,EACd,MAAM,EACN,UAAU,EACV,MAAM,EACN,iBAAiB,EACjB,OAAO,EACP,KAAK,GACN,EAAE;IACD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,EAAE,OAAO,CAAA;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,CAAA;CACb,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAqFnC"}
1
+ {"version":3,"file":"parseParams.d.ts","sourceRoot":"","sources":["../../src/queries/parseParams.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAY,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAQvF,wBAAsB,WAAW,CAAC,EAChC,MAAM,EACN,cAAc,EACd,MAAM,EACN,UAAU,EACV,MAAM,EACN,iBAAiB,EACjB,OAAO,EACP,GAAG,EACH,KAAK,GACN,EAAE;IACD,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,EAAE,OAAO,CAAA;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7B,KAAK,EAAE,KAAK,CAAA;CACb,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAyFnC"}