@payloadcms/db-mongodb 3.25.0 → 3.26.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 (164) hide show
  1. package/dist/connect.d.ts.map +1 -1
  2. package/dist/connect.js +5 -1
  3. package/dist/connect.js.map +1 -1
  4. package/dist/count.d.ts.map +1 -1
  5. package/dist/count.js +8 -4
  6. package/dist/count.js.map +1 -1
  7. package/dist/countGlobalVersions.d.ts.map +1 -1
  8. package/dist/countGlobalVersions.js +8 -3
  9. package/dist/countGlobalVersions.js.map +1 -1
  10. package/dist/countVersions.d.ts.map +1 -1
  11. package/dist/countVersions.js +8 -3
  12. package/dist/countVersions.js.map +1 -1
  13. package/dist/create.d.ts.map +1 -1
  14. package/dist/create.js +13 -6
  15. package/dist/create.js.map +1 -1
  16. package/dist/createGlobal.d.ts +1 -1
  17. package/dist/createGlobal.d.ts.map +1 -1
  18. package/dist/createGlobal.js +12 -5
  19. package/dist/createGlobal.js.map +1 -1
  20. package/dist/createGlobalVersion.d.ts.map +1 -1
  21. package/dist/createGlobalVersion.js +13 -5
  22. package/dist/createGlobalVersion.js.map +1 -1
  23. package/dist/createMigration.d.ts.map +1 -1
  24. package/dist/createMigration.js.map +1 -1
  25. package/dist/createVersion.d.ts.map +1 -1
  26. package/dist/createVersion.js +13 -5
  27. package/dist/createVersion.js.map +1 -1
  28. package/dist/deleteMany.d.ts +1 -1
  29. package/dist/deleteMany.d.ts.map +1 -1
  30. package/dist/deleteMany.js +8 -4
  31. package/dist/deleteMany.js.map +1 -1
  32. package/dist/deleteOne.d.ts.map +1 -1
  33. package/dist/deleteOne.js +14 -6
  34. package/dist/deleteOne.js.map +1 -1
  35. package/dist/deleteVersions.d.ts.map +1 -1
  36. package/dist/deleteVersions.js +9 -4
  37. package/dist/deleteVersions.js.map +1 -1
  38. package/dist/find.d.ts.map +1 -1
  39. package/dist/find.js +25 -8
  40. package/dist/find.js.map +1 -1
  41. package/dist/findGlobal.d.ts.map +1 -1
  42. package/dist/findGlobal.js +8 -5
  43. package/dist/findGlobal.js.map +1 -1
  44. package/dist/findGlobalVersions.d.ts.map +1 -1
  45. package/dist/findGlobalVersions.js +8 -4
  46. package/dist/findGlobalVersions.js.map +1 -1
  47. package/dist/findOne.d.ts +1 -1
  48. package/dist/findOne.d.ts.map +1 -1
  49. package/dist/findOne.js +18 -8
  50. package/dist/findOne.js.map +1 -1
  51. package/dist/findVersions.d.ts.map +1 -1
  52. package/dist/findVersions.js +8 -4
  53. package/dist/findVersions.js.map +1 -1
  54. package/dist/index.d.ts +6 -7
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +6 -1
  57. package/dist/index.js.map +1 -1
  58. package/dist/init.d.ts.map +1 -1
  59. package/dist/init.js +1 -5
  60. package/dist/init.js.map +1 -1
  61. package/dist/migrateFresh.d.ts.map +1 -1
  62. package/dist/migrateFresh.js.map +1 -1
  63. package/dist/models/buildCollectionSchema.d.ts.map +1 -1
  64. package/dist/models/buildCollectionSchema.js +0 -4
  65. package/dist/models/buildCollectionSchema.js.map +1 -1
  66. package/dist/models/buildSchema.d.ts.map +1 -1
  67. package/dist/models/buildSchema.js +545 -515
  68. package/dist/models/buildSchema.js.map +1 -1
  69. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.d.ts.map +1 -1
  70. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js +21 -8
  71. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js.map +1 -1
  72. package/dist/predefinedMigrations/migrateVersionsV1_V2.d.ts.map +1 -1
  73. package/dist/predefinedMigrations/migrateVersionsV1_V2.js +20 -8
  74. package/dist/predefinedMigrations/migrateVersionsV1_V2.js.map +1 -1
  75. package/dist/queries/buildSearchParams.d.ts +1 -1
  76. package/dist/queries/buildSearchParams.d.ts.map +1 -1
  77. package/dist/queries/buildSearchParams.js +42 -29
  78. package/dist/queries/buildSearchParams.js.map +1 -1
  79. package/dist/queries/buildSortParam.d.ts +2 -3
  80. package/dist/queries/buildSortParam.d.ts.map +1 -1
  81. package/dist/queries/buildSortParam.js +1 -1
  82. package/dist/queries/buildSortParam.js.map +1 -1
  83. package/dist/queries/getBuildQueryPlugin.d.ts.map +1 -1
  84. package/dist/queries/getBuildQueryPlugin.js +15 -8
  85. package/dist/queries/getBuildQueryPlugin.js.map +1 -1
  86. package/dist/queries/getLocalizedSortProperty.d.ts +1 -1
  87. package/dist/queries/getLocalizedSortProperty.d.ts.map +1 -1
  88. package/dist/queries/getLocalizedSortProperty.js +11 -6
  89. package/dist/queries/getLocalizedSortProperty.js.map +1 -1
  90. package/dist/queries/getLocalizedSortProperty.spec.js +8 -0
  91. package/dist/queries/getLocalizedSortProperty.spec.js.map +1 -1
  92. package/dist/queries/operatorMap.d.ts +1 -0
  93. package/dist/queries/operatorMap.d.ts.map +1 -1
  94. package/dist/queries/operatorMap.js.map +1 -1
  95. package/dist/queries/parseParams.d.ts +1 -1
  96. package/dist/queries/parseParams.d.ts.map +1 -1
  97. package/dist/queries/parseParams.js +3 -3
  98. package/dist/queries/parseParams.js.map +1 -1
  99. package/dist/queries/sanitizeQueryValue.d.ts +1 -1
  100. package/dist/queries/sanitizeQueryValue.d.ts.map +1 -1
  101. package/dist/queries/sanitizeQueryValue.js +30 -26
  102. package/dist/queries/sanitizeQueryValue.js.map +1 -1
  103. package/dist/queryDrafts.d.ts.map +1 -1
  104. package/dist/queryDrafts.js +26 -8
  105. package/dist/queryDrafts.js.map +1 -1
  106. package/dist/transactions/beginTransaction.d.ts.map +1 -1
  107. package/dist/transactions/beginTransaction.js +4 -2
  108. package/dist/transactions/beginTransaction.js.map +1 -1
  109. package/dist/transactions/commitTransaction.d.ts.map +1 -1
  110. package/dist/transactions/commitTransaction.js +1 -1
  111. package/dist/transactions/commitTransaction.js.map +1 -1
  112. package/dist/transactions/rollbackTransaction.d.ts.map +1 -1
  113. package/dist/transactions/rollbackTransaction.js +3 -3
  114. package/dist/transactions/rollbackTransaction.js.map +1 -1
  115. package/dist/types.d.ts +2 -2
  116. package/dist/types.d.ts.map +1 -1
  117. package/dist/types.js.map +1 -1
  118. package/dist/updateGlobal.d.ts.map +1 -1
  119. package/dist/updateGlobal.js +17 -7
  120. package/dist/updateGlobal.js.map +1 -1
  121. package/dist/updateGlobalVersion.d.ts +1 -1
  122. package/dist/updateGlobalVersion.d.ts.map +1 -1
  123. package/dist/updateGlobalVersion.js +14 -6
  124. package/dist/updateGlobalVersion.js.map +1 -1
  125. package/dist/updateMany.d.ts +3 -0
  126. package/dist/updateMany.d.ts.map +1 -0
  127. package/dist/updateMany.js +75 -0
  128. package/dist/updateMany.js.map +1 -0
  129. package/dist/updateOne.d.ts.map +1 -1
  130. package/dist/updateOne.js +17 -8
  131. package/dist/updateOne.js.map +1 -1
  132. package/dist/updateVersion.d.ts.map +1 -1
  133. package/dist/updateVersion.js +14 -5
  134. package/dist/updateVersion.js.map +1 -1
  135. package/dist/upsert.d.ts.map +1 -1
  136. package/dist/upsert.js +2 -1
  137. package/dist/upsert.js.map +1 -1
  138. package/dist/utilities/aggregatePaginate.d.ts +19 -0
  139. package/dist/utilities/aggregatePaginate.d.ts.map +1 -0
  140. package/dist/utilities/aggregatePaginate.js +78 -0
  141. package/dist/utilities/aggregatePaginate.js.map +1 -0
  142. package/dist/utilities/buildJoinAggregation.d.ts +5 -6
  143. package/dist/utilities/buildJoinAggregation.d.ts.map +1 -1
  144. package/dist/utilities/buildJoinAggregation.js +39 -36
  145. package/dist/utilities/buildJoinAggregation.js.map +1 -1
  146. package/dist/utilities/buildProjectionFromSelect.d.ts.map +1 -1
  147. package/dist/utilities/buildProjectionFromSelect.js +8 -4
  148. package/dist/utilities/buildProjectionFromSelect.js.map +1 -1
  149. package/dist/utilities/getDBName.d.ts +1 -1
  150. package/dist/utilities/getDBName.d.ts.map +1 -1
  151. package/dist/utilities/getDBName.js +6 -2
  152. package/dist/utilities/getDBName.js.map +1 -1
  153. package/dist/utilities/getEntity.d.ts +33 -0
  154. package/dist/utilities/getEntity.d.ts.map +1 -0
  155. package/dist/utilities/getEntity.js +49 -0
  156. package/dist/utilities/getEntity.js.map +1 -0
  157. package/dist/utilities/handleError.d.ts +1 -1
  158. package/dist/utilities/handleError.d.ts.map +1 -1
  159. package/dist/utilities/handleError.js +3 -2
  160. package/dist/utilities/handleError.js.map +1 -1
  161. package/dist/utilities/transform.d.ts.map +1 -1
  162. package/dist/utilities/transform.js +10 -9
  163. package/dist/utilities/transform.js.map +1 -1
  164. package/package.json +5 -4
@@ -1,28 +1,20 @@
1
+ import { APIError } from 'payload';
1
2
  import { fieldShouldBeLocalized } from 'payload/shared';
2
3
  import { buildQuery } from '../queries/buildQuery.js';
3
4
  import { buildSortParam } from '../queries/buildSortParam.js';
4
- export const buildJoinAggregation = async ({ adapter, collection, collectionConfig, joins, limit, locale, projection, query, versions })=>{
5
+ import { getCollection } from './getEntity.js';
6
+ export const buildJoinAggregation = async ({ adapter, collection, collectionConfig, joins, locale, projection, versions })=>{
5
7
  if (Object.keys(collectionConfig.joins).length === 0 && collectionConfig.polymorphicJoins.length == 0 || joins === false) {
6
8
  return;
7
9
  }
8
- const joinConfig = adapter.payload.collections[collection].config.joins;
9
- const polymorphicJoinsConfig = adapter.payload.collections[collection].config.polymorphicJoins;
10
- const aggregate = [
11
- {
12
- $sort: {
13
- createdAt: -1
14
- }
15
- }
16
- ];
17
- if (query) {
18
- aggregate.push({
19
- $match: query
20
- });
10
+ const joinConfig = adapter.payload.collections[collection]?.config?.joins;
11
+ if (!joinConfig) {
12
+ throw new APIError(`Could not retrieve sanitized join config for ${collection}.`);
21
13
  }
22
- if (limit) {
23
- aggregate.push({
24
- $limit: limit
25
- });
14
+ const aggregate = [];
15
+ const polymorphicJoinsConfig = adapter.payload.collections[collection]?.config?.polymorphicJoins;
16
+ if (!polymorphicJoinsConfig) {
17
+ throw new APIError(`Could not retrieve sanitized polymorphic joins config for ${collection}.`);
26
18
  }
27
19
  for (const join of polymorphicJoinsConfig){
28
20
  if (projection && !projection[join.joinPath]) {
@@ -31,10 +23,14 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
31
23
  if (joins?.[join.joinPath] === false) {
32
24
  continue;
33
25
  }
34
- const { count = false, limit: limitJoin = join.field.defaultLimit ?? 10, page, sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort, where: whereJoin } = joins?.[join.joinPath] || {};
26
+ const { count = false, limit: limitJoin = join.field.defaultLimit ?? 10, page, sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort, where: whereJoin = {} } = joins?.[join.joinPath] || {};
35
27
  const aggregatedFields = [];
36
28
  for (const collectionSlug of join.field.collection){
37
- for (const field of adapter.payload.collections[collectionSlug].config.flattenedFields){
29
+ const { collectionConfig } = getCollection({
30
+ adapter,
31
+ collectionSlug
32
+ });
33
+ for (const field of collectionConfig.flattenedFields){
38
34
  if (!aggregatedFields.some((eachField)=>eachField.name === field.name)) {
39
35
  aggregatedFields.push(field);
40
36
  }
@@ -53,7 +49,8 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
53
49
  locale,
54
50
  where: whereJoin
55
51
  });
56
- const sortProperty = Object.keys(sort)[0];
52
+ const sortProperty = Object.keys(sort)[0]// assert because buildSortParam always returns at least 1 key.
53
+ ;
57
54
  const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1;
58
55
  const projectSort = sortProperty !== '_id' && sortProperty !== 'relationTo';
59
56
  const aliases = [];
@@ -85,10 +82,14 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
85
82
  }
86
83
  }
87
84
  ];
85
+ const { Model: JoinModel } = getCollection({
86
+ adapter,
87
+ collectionSlug
88
+ });
88
89
  aggregate.push({
89
90
  $lookup: {
90
91
  as: alias,
91
- from: adapter.collections[collectionSlug].collection.name,
92
+ from: JoinModel.collection.name,
92
93
  let: {
93
94
  root_id_: '$_id'
94
95
  },
@@ -119,7 +120,7 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
119
120
  aggregate.push({
120
121
  $lookup: {
121
122
  as: `${as}.totalDocs.${alias}`,
122
- from: adapter.collections[collectionSlug].collection.name,
123
+ from: JoinModel.collection.name,
123
124
  let: {
124
125
  root_id_: '$_id'
125
126
  },
@@ -198,28 +199,35 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
198
199
  });
199
200
  }
200
201
  for (const slug of Object.keys(joinConfig)){
201
- for (const join of joinConfig[slug]){
202
+ const joinsList = joinConfig[slug];
203
+ if (!joinsList) {
204
+ throw new APIError(`Failed to retrieve array of joins for ${slug} in collectio ${collection}`);
205
+ }
206
+ for (const join of joinsList){
202
207
  if (projection && !projection[join.joinPath]) {
203
208
  continue;
204
209
  }
205
210
  if (joins?.[join.joinPath] === false) {
206
211
  continue;
207
212
  }
208
- const { count, limit: limitJoin = join.field.defaultLimit ?? 10, page, sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort, where: whereJoin } = joins?.[join.joinPath] || {};
213
+ const { collectionConfig, Model: JoinModel } = getCollection({
214
+ adapter,
215
+ collectionSlug: join.field.collection
216
+ });
217
+ const { count, limit: limitJoin = join.field.defaultLimit ?? 10, page, sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort, where: whereJoin = {} } = joins?.[join.joinPath] || {};
209
218
  if (Array.isArray(join.field.collection)) {
210
219
  throw new Error('Unreachable');
211
220
  }
212
- const joinModel = adapter.collections[join.field.collection];
213
221
  const sort = buildSortParam({
214
222
  config: adapter.payload.config,
215
- fields: adapter.payload.collections[slug].config.flattenedFields,
223
+ fields: collectionConfig.flattenedFields,
216
224
  locale,
217
225
  sort: sortJoin,
218
226
  timestamps: true
219
227
  });
220
228
  const sortProperty = Object.keys(sort)[0];
221
229
  const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1;
222
- const $match = await joinModel.buildQuery({
230
+ const $match = await JoinModel.buildQuery({
223
231
  locale,
224
232
  payload: adapter.payload,
225
233
  where: whereJoin
@@ -252,7 +260,7 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
252
260
  $lookup: {
253
261
  as: `${as}.totalDocs`,
254
262
  foreignField,
255
- from: adapter.collections[slug].collection.name,
263
+ from: JoinModel.collection.name,
256
264
  localField: versions ? 'parent' : '_id',
257
265
  pipeline: [
258
266
  {
@@ -282,7 +290,7 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
282
290
  $lookup: {
283
291
  as: `${as}.docs`,
284
292
  foreignField: `${join.field.on}${code}${polymorphicSuffix}`,
285
- from: adapter.collections[slug].collection.name,
293
+ from: JoinModel.collection.name,
286
294
  localField: versions ? 'parent' : '_id',
287
295
  pipeline
288
296
  }
@@ -339,7 +347,7 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
339
347
  $lookup: {
340
348
  as: `${as}.docs`,
341
349
  foreignField,
342
- from: adapter.collections[slug].collection.name,
350
+ from: JoinModel.collection.name,
343
351
  localField: versions ? 'parent' : '_id',
344
352
  pipeline
345
353
  }
@@ -380,11 +388,6 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
380
388
  }
381
389
  }
382
390
  }
383
- if (projection) {
384
- aggregate.push({
385
- $project: projection
386
- });
387
- }
388
391
  return aggregate;
389
392
  };
390
393
 
@@ -1 +1 @@
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 count = false,\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 const basePipeline = [\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\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 ...basePipeline,\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 if (count) {\n aggregate.push({\n $lookup: {\n as: `${as}.totalDocs.${alias}`,\n from: adapter.collections[collectionSlug].collection.name,\n let: {\n root_id_: '$_id',\n },\n pipeline: [\n ...basePipeline,\n {\n $count: 'result',\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 if (count) {\n aggregate.push({\n $addFields: {\n [`${as}.totalDocs`]: {\n $add: aliases.map((alias) => ({\n $ifNull: [\n {\n $first: `$${as}.totalDocs.${alias}.result`,\n },\n 0,\n ],\n })),\n },\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 $addFields: {\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n },\n },\n })\n\n aggregate.push({\n $set: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, ...sliceValue],\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 count,\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 const addTotalDocsAggregation = (as: string, foreignField: string) =>\n aggregate.push(\n {\n $lookup: {\n as: `${as}.totalDocs`,\n foreignField,\n from: adapter.collections[slug].collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline: [\n {\n $match,\n },\n {\n $count: 'result',\n },\n ],\n },\n },\n {\n $addFields: {\n [`${as}.totalDocs`]: { $ifNull: [{ $first: `$${as}.totalDocs.result` }, 0] },\n },\n },\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\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n\n if (count) {\n addTotalDocsAggregation(as, `${join.field.on}${code}${polymorphicSuffix}`)\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\n if (count) {\n addTotalDocsAggregation(as, foreignField)\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","count","limitJoin","field","defaultLimit","page","sort","sortJoin","defaultSort","where","whereJoin","aggregatedFields","collectionSlug","flattenedFields","some","eachField","name","fields","timestamps","sortProperty","sortDirection","projectSort","aliases","as","alias","basePipeline","$addFields","relationTo","$literal","$and","$expr","$eq","on","$lookup","from","let","root_id_","pipeline","$project","value","$count","$concatArrays","map","$add","$ifNull","$first","$set","$sortArray","input","sortBy","sliceValue","$gt","$size","Number","MAX_VALUE","$slice","slug","Array","isArray","Error","joinModel","$skip","polymorphicSuffix","targetField","addTotalDocsAggregation","foreignField","localField","localization","localeCodes","forEach","code","$map","in","localeSuffix","parentIsLocalized","getForeignPath"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/buildJoinAggregation.ts"],"sourcesContent":["import type { PipelineStage } from 'mongoose'\n\nimport {\n APIError,\n type CollectionSlug,\n type FlattenedField,\n type JoinQuery,\n type SanitizedCollectionConfig,\n} from 'payload'\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'\nimport { getCollection } from './getEntity.js'\n\ntype BuildJoinAggregationArgs = {\n adapter: MongooseAdapter\n collection: CollectionSlug\n collectionConfig: SanitizedCollectionConfig\n joins?: JoinQuery\n locale?: string\n projection?: Record<string, true>\n // the where clause for the top collection\n query?: Record<string, unknown>\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 locale,\n projection,\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\n if (!joinConfig) {\n throw new APIError(`Could not retrieve sanitized join config for ${collection}.`)\n }\n\n const aggregate: PipelineStage[] = []\n const polymorphicJoinsConfig = adapter.payload.collections[collection]?.config?.polymorphicJoins\n\n if (!polymorphicJoinsConfig) {\n throw new APIError(`Could not retrieve sanitized polymorphic joins config for ${collection}.`)\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 count = false,\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 const { collectionConfig } = getCollection({ adapter, collectionSlug })\n\n for (const field of collectionConfig.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]! // assert because buildSortParam always returns at least 1 key.\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 const basePipeline = [\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\n const { Model: JoinModel } = getCollection({ adapter, collectionSlug })\n\n aggregate.push({\n $lookup: {\n as: alias,\n from: JoinModel.collection.name,\n let: {\n root_id_: '$_id',\n },\n pipeline: [\n ...basePipeline,\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 if (count) {\n aggregate.push({\n $lookup: {\n as: `${as}.totalDocs.${alias}`,\n from: JoinModel.collection.name,\n let: {\n root_id_: '$_id',\n },\n pipeline: [\n ...basePipeline,\n {\n $count: 'result',\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 if (count) {\n aggregate.push({\n $addFields: {\n [`${as}.totalDocs`]: {\n $add: aliases.map((alias) => ({\n $ifNull: [\n {\n $first: `$${as}.totalDocs.${alias}.result`,\n },\n 0,\n ],\n })),\n },\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 $addFields: {\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n },\n },\n })\n\n aggregate.push({\n $set: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, ...sliceValue],\n },\n },\n })\n }\n\n for (const slug of Object.keys(joinConfig)) {\n const joinsList = joinConfig[slug]\n\n if (!joinsList) {\n throw new APIError(`Failed to retrieve array of joins for ${slug} in collectio ${collection}`)\n }\n\n for (const join of joinsList) {\n if (projection && !projection[join.joinPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const { collectionConfig, Model: JoinModel } = getCollection({\n adapter,\n collectionSlug: join.field.collection as string,\n })\n\n const {\n count,\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 sort = buildSortParam({\n config: adapter.payload.config,\n fields: collectionConfig.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 const addTotalDocsAggregation = (as: string, foreignField: string) =>\n aggregate.push(\n {\n $lookup: {\n as: `${as}.totalDocs`,\n foreignField,\n from: JoinModel.collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline: [\n {\n $match,\n },\n {\n $count: 'result',\n },\n ],\n },\n },\n {\n $addFields: {\n [`${as}.totalDocs`]: { $ifNull: [{ $first: `$${as}.totalDocs.result` }, 0] },\n },\n },\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: JoinModel.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\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n\n if (count) {\n addTotalDocsAggregation(as, `${join.field.on}${code}${polymorphicSuffix}`)\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: JoinModel.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\n if (count) {\n addTotalDocsAggregation(as, foreignField)\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 return aggregate\n}\n"],"names":["APIError","fieldShouldBeLocalized","buildQuery","buildSortParam","getCollection","buildJoinAggregation","adapter","collection","collectionConfig","joins","locale","projection","versions","Object","keys","length","polymorphicJoins","joinConfig","payload","collections","config","aggregate","polymorphicJoinsConfig","join","joinPath","count","limit","limitJoin","field","defaultLimit","page","sort","sortJoin","defaultSort","where","whereJoin","aggregatedFields","collectionSlug","flattenedFields","some","eachField","name","push","fields","timestamps","$match","sortProperty","sortDirection","projectSort","aliases","as","alias","basePipeline","$addFields","relationTo","$literal","$and","$expr","$eq","on","Model","JoinModel","$lookup","from","let","root_id_","pipeline","$sort","$limit","$project","value","$count","$concatArrays","map","$add","$ifNull","$first","$set","$sortArray","input","sortBy","sliceValue","$gt","$size","Number","MAX_VALUE","$slice","slug","joinsList","Array","isArray","Error","$skip","polymorphicSuffix","targetField","addTotalDocsAggregation","foreignField","localField","localization","localeCodes","forEach","code","$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;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
+ {"version":3,"file":"buildProjectionFromSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/buildProjectionFromSelect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,cAAc,EAGd,UAAU,EACX,MAAM,SAAS,CAAA;AAShB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAmLlD,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"}
@@ -61,7 +61,7 @@ const traverseFields = ({ adapter, databaseSchemaPath = '', fields, parentIsLoca
61
61
  {
62
62
  const fieldSelect = select[field.name];
63
63
  if (field.type === 'array' && selectMode === 'include') {
64
- fieldSelect['id'] = true;
64
+ fieldSelect.id = true;
65
65
  }
66
66
  traverseFields({
67
67
  adapter,
@@ -79,6 +79,9 @@ const traverseFields = ({ adapter, databaseSchemaPath = '', fields, parentIsLoca
79
79
  const blocksSelect = select[field.name];
80
80
  for (const _block of field.blockReferences ?? field.blocks){
81
81
  const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block;
82
+ if (!block) {
83
+ continue;
84
+ }
82
85
  if (selectMode === 'include' && blocksSelect[block.slug] === true || selectMode === 'exclude' && typeof blocksSelect[block.slug] === 'undefined') {
83
86
  traverseFields({
84
87
  adapter,
@@ -99,9 +102,10 @@ const traverseFields = ({ adapter, databaseSchemaPath = '', fields, parentIsLoca
99
102
  if (typeof blocksSelect[block.slug] !== 'object') {
100
103
  blocksSelect[block.slug] = {};
101
104
  }
102
- if (blockSelectMode === 'include') {
103
- blocksSelect[block.slug]['id'] = true;
104
- blocksSelect[block.slug]['blockType'] = true;
105
+ if (blockSelectMode === 'include' && typeof blocksSelect[block.slug] === 'object') {
106
+ const blockSelect = blocksSelect[block.slug];
107
+ blockSelect.id = true;
108
+ blockSelect.blockType = true;
105
109
  }
106
110
  traverseFields({
107
111
  adapter,
@@ -1 +1 @@
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":"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"}
1
+ {"version":3,"sources":["../../src/utilities/buildProjectionFromSelect.ts"],"sourcesContent":["import type {\n FieldAffectingData,\n FlattenedField,\n SelectIncludeType,\n SelectMode,\n SelectType,\n} from 'payload'\n\nimport {\n deepCopyObjectSimple,\n fieldAffectsData,\n fieldShouldBeLocalized,\n getSelectMode,\n} from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\n\nconst addFieldToProjection = ({\n adapter,\n databaseSchemaPath,\n field,\n parentIsLocalized,\n projection,\n}: {\n adapter: MongooseAdapter\n databaseSchemaPath: string\n field: FieldAffectingData\n parentIsLocalized: boolean\n projection: Record<string, true>\n}) => {\n const { config } = adapter.payload\n\n if (parentIsLocalized && config.localization) {\n for (const locale of config.localization.localeCodes) {\n const localeDatabaseSchemaPath = databaseSchemaPath.replace('<locale>', locale)\n projection[`${localeDatabaseSchemaPath}${field.name}`] = true\n }\n } else {\n projection[`${databaseSchemaPath}${field.name}`] = true\n }\n}\n\nconst traverseFields = ({\n adapter,\n databaseSchemaPath = '',\n fields,\n parentIsLocalized = false,\n projection,\n select,\n selectAllOnCurrentLevel = false,\n selectMode,\n}: {\n adapter: MongooseAdapter\n databaseSchemaPath?: string\n fields: FlattenedField[]\n parentIsLocalized?: boolean\n projection: Record<string, true>\n select: SelectType\n selectAllOnCurrentLevel?: boolean\n selectMode: SelectMode\n}) => {\n for (const field of fields) {\n if (fieldAffectsData(field)) {\n if (selectMode === 'include') {\n if (select[field.name] === true || selectAllOnCurrentLevel) {\n addFieldToProjection({\n adapter,\n databaseSchemaPath,\n field,\n parentIsLocalized,\n projection,\n })\n continue\n }\n\n if (!select[field.name]) {\n continue\n }\n }\n\n if (selectMode === 'exclude') {\n if (typeof select[field.name] === 'undefined') {\n addFieldToProjection({\n adapter,\n databaseSchemaPath,\n field,\n parentIsLocalized,\n projection,\n })\n continue\n }\n\n if (select[field.name] === false) {\n continue\n }\n }\n }\n\n let fieldDatabaseSchemaPath = databaseSchemaPath\n\n if (fieldAffectsData(field)) {\n fieldDatabaseSchemaPath = `${databaseSchemaPath}${field.name}.`\n\n if (fieldShouldBeLocalized({ field, parentIsLocalized })) {\n fieldDatabaseSchemaPath = `${fieldDatabaseSchemaPath}<locale>.`\n }\n }\n\n switch (field.type) {\n case 'array':\n case 'group':\n case 'tab': {\n const fieldSelect = select[field.name] as SelectType\n\n if (field.type === 'array' && selectMode === 'include') {\n fieldSelect.id = true\n }\n\n traverseFields({\n adapter,\n databaseSchemaPath: fieldDatabaseSchemaPath,\n fields: field.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n projection,\n select: fieldSelect,\n selectMode,\n })\n\n break\n }\n\n case 'blocks': {\n const blocksSelect = select[field.name] as SelectType\n\n for (const _block of field.blockReferences ?? field.blocks) {\n const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block\n\n if (!block) {\n continue\n }\n\n if (\n (selectMode === 'include' && blocksSelect[block.slug] === true) ||\n (selectMode === 'exclude' && typeof blocksSelect[block.slug] === 'undefined')\n ) {\n traverseFields({\n adapter,\n databaseSchemaPath: fieldDatabaseSchemaPath,\n fields: block.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n projection,\n select: {},\n selectAllOnCurrentLevel: true,\n selectMode: 'include',\n })\n continue\n }\n\n let blockSelectMode = selectMode\n\n if (selectMode === 'exclude' && blocksSelect[block.slug] === false) {\n blockSelectMode = 'include'\n }\n\n if (typeof blocksSelect[block.slug] !== 'object') {\n blocksSelect[block.slug] = {}\n }\n\n if (blockSelectMode === 'include' && typeof blocksSelect[block.slug] === 'object') {\n const blockSelect = blocksSelect[block.slug] as SelectIncludeType\n blockSelect.id = true\n blockSelect.blockType = true\n }\n\n traverseFields({\n adapter,\n databaseSchemaPath: fieldDatabaseSchemaPath,\n fields: block.flattenedFields,\n parentIsLocalized: parentIsLocalized || field.localized,\n projection,\n select: blocksSelect[block.slug] as SelectType,\n selectMode: blockSelectMode,\n })\n }\n\n break\n }\n\n default:\n break\n }\n }\n}\n\nexport const buildProjectionFromSelect = ({\n adapter,\n fields,\n select,\n}: {\n adapter: MongooseAdapter\n fields: FlattenedField[]\n select?: SelectType\n}): Record<string, true> | undefined => {\n if (!select) {\n return\n }\n\n const projection: Record<string, true> = {\n _id: true,\n }\n\n traverseFields({\n adapter,\n fields,\n projection,\n // Clone to safely mutate it later\n select: deepCopyObjectSimple(select),\n selectMode: getSelectMode(select),\n })\n\n return projection\n}\n"],"names":["deepCopyObjectSimple","fieldAffectsData","fieldShouldBeLocalized","getSelectMode","addFieldToProjection","adapter","databaseSchemaPath","field","parentIsLocalized","projection","config","payload","localization","locale","localeCodes","localeDatabaseSchemaPath","replace","name","traverseFields","fields","select","selectAllOnCurrentLevel","selectMode","fieldDatabaseSchemaPath","type","fieldSelect","id","flattenedFields","localized","blocksSelect","_block","blockReferences","blocks","block","slug","blockSelectMode","blockSelect","blockType","buildProjectionFromSelect","_id"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { DBIdentifierName } from 'payload';
1
+ import { type DBIdentifierName } from 'payload';
2
2
  type Args = {
3
3
  config: {
4
4
  dbName?: DBIdentifierName;
@@ -1 +1 @@
1
- {"version":3,"file":"getDBName.d.ts","sourceRoot":"","sources":["../../src/utilities/getDBName.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,KAAK,IAAI,GAAG;IACV,MAAM,EAAE;QACN,MAAM,CAAC,EAAE,gBAAgB,CAAA;QACzB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;QAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IACD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAA;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,0DAKnB,IAAI,KAAG,MAmBT,CAAA"}
1
+ {"version":3,"file":"getDBName.d.ts","sourceRoot":"","sources":["../../src/utilities/getDBName.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAEzD,KAAK,IAAI,GAAG;IACV,MAAM,EAAE;QACN,MAAM,CAAC,EAAE,gBAAgB,CAAA;QACzB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;QAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IACD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAA;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,0DAKnB,IAAI,KAAG,MAuBT,CAAA"}
@@ -1,8 +1,9 @@
1
+ import { APIError } from 'payload';
1
2
  /**
2
3
  * Used to name database enums and collections
3
4
  * Returns the collection or enum name for a given entity
4
5
  */ export const getDBName = ({ config: { name, slug }, config, target = 'dbName', versions = false })=>{
5
- let result;
6
+ let result = null;
6
7
  let custom = config[target];
7
8
  if (!custom && target === 'enumName') {
8
9
  custom = config['dbName'];
@@ -10,11 +11,14 @@
10
11
  if (custom) {
11
12
  result = typeof custom === 'function' ? custom({}) : custom;
12
13
  } else {
13
- result = name ?? slug;
14
+ result = name ?? slug ?? null;
14
15
  }
15
16
  if (versions) {
16
17
  result = `_${result}_versions`;
17
18
  }
19
+ if (!result) {
20
+ throw new APIError(`Assertion for DB name of ${name} ${slug} was failed.`);
21
+ }
18
22
  return result;
19
23
  };
20
24
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getDBName.ts"],"sourcesContent":["import type { DBIdentifierName } from 'payload'\n\ntype Args = {\n config: {\n dbName?: DBIdentifierName\n enumName?: DBIdentifierName\n name?: string\n slug?: string\n }\n locales?: boolean\n target?: 'dbName' | 'enumName'\n versions?: boolean\n}\n\n/**\n * Used to name database enums and collections\n * Returns the collection or enum name for a given entity\n */\nexport const getDBName = ({\n config: { name, slug },\n config,\n target = 'dbName',\n versions = false,\n}: Args): string => {\n let result: string\n let custom = config[target]\n\n if (!custom && target === 'enumName') {\n custom = config['dbName']\n }\n\n if (custom) {\n result = typeof custom === 'function' ? custom({}) : custom\n } else {\n result = name ?? slug\n }\n\n if (versions) {\n result = `_${result}_versions`\n }\n\n return result\n}\n"],"names":["getDBName","config","name","slug","target","versions","result","custom"],"mappings":"AAcA;;;CAGC,GACD,OAAO,MAAMA,YAAY,CAAC,EACxBC,QAAQ,EAAEC,IAAI,EAAEC,IAAI,EAAE,EACtBF,MAAM,EACNG,SAAS,QAAQ,EACjBC,WAAW,KAAK,EACX;IACL,IAAIC;IACJ,IAAIC,SAASN,MAAM,CAACG,OAAO;IAE3B,IAAI,CAACG,UAAUH,WAAW,YAAY;QACpCG,SAASN,MAAM,CAAC,SAAS;IAC3B;IAEA,IAAIM,QAAQ;QACVD,SAAS,OAAOC,WAAW,aAAaA,OAAO,CAAC,KAAKA;IACvD,OAAO;QACLD,SAASJ,QAAQC;IACnB;IAEA,IAAIE,UAAU;QACZC,SAAS,CAAC,CAAC,EAAEA,OAAO,SAAS,CAAC;IAChC;IAEA,OAAOA;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/getDBName.ts"],"sourcesContent":["import { APIError, type DBIdentifierName } from 'payload'\n\ntype Args = {\n config: {\n dbName?: DBIdentifierName\n enumName?: DBIdentifierName\n name?: string\n slug?: string\n }\n locales?: boolean\n target?: 'dbName' | 'enumName'\n versions?: boolean\n}\n\n/**\n * Used to name database enums and collections\n * Returns the collection or enum name for a given entity\n */\nexport const getDBName = ({\n config: { name, slug },\n config,\n target = 'dbName',\n versions = false,\n}: Args): string => {\n let result: null | string = null\n let custom = config[target]\n\n if (!custom && target === 'enumName') {\n custom = config['dbName']\n }\n\n if (custom) {\n result = typeof custom === 'function' ? custom({}) : custom\n } else {\n result = name ?? slug ?? null\n }\n\n if (versions) {\n result = `_${result}_versions`\n }\n\n if (!result) {\n throw new APIError(`Assertion for DB name of ${name} ${slug} was failed.`)\n }\n\n return result\n}\n"],"names":["APIError","getDBName","config","name","slug","target","versions","result","custom"],"mappings":"AAAA,SAASA,QAAQ,QAA+B,UAAS;AAczD;;;CAGC,GACD,OAAO,MAAMC,YAAY,CAAC,EACxBC,QAAQ,EAAEC,IAAI,EAAEC,IAAI,EAAE,EACtBF,MAAM,EACNG,SAAS,QAAQ,EACjBC,WAAW,KAAK,EACX;IACL,IAAIC,SAAwB;IAC5B,IAAIC,SAASN,MAAM,CAACG,OAAO;IAE3B,IAAI,CAACG,UAAUH,WAAW,YAAY;QACpCG,SAASN,MAAM,CAAC,SAAS;IAC3B;IAEA,IAAIM,QAAQ;QACVD,SAAS,OAAOC,WAAW,aAAaA,OAAO,CAAC,KAAKA;IACvD,OAAO;QACLD,SAASJ,QAAQC,QAAQ;IAC3B;IAEA,IAAIE,UAAU;QACZC,SAAS,CAAC,CAAC,EAAEA,OAAO,SAAS,CAAC;IAChC;IAEA,IAAI,CAACA,QAAQ;QACX,MAAM,IAAIP,SAAS,CAAC,yBAAyB,EAAEG,KAAK,CAAC,EAAEC,KAAK,YAAY,CAAC;IAC3E;IAEA,OAAOG;AACT,EAAC"}
@@ -0,0 +1,33 @@
1
+ import type { Collection, SanitizedCollectionConfig, SanitizedGlobalConfig } from 'payload';
2
+ import type { MongooseAdapter } from '../index.js';
3
+ import type { CollectionModel, GlobalModel } from '../types.js';
4
+ export declare const getCollection: ({ adapter, collectionSlug, versions, }: {
5
+ adapter: MongooseAdapter;
6
+ collectionSlug: string;
7
+ versions?: boolean;
8
+ }) => {
9
+ collectionConfig: SanitizedCollectionConfig;
10
+ customIDType: Collection["customIDType"];
11
+ Model: CollectionModel;
12
+ };
13
+ type BaseGetGlobalArgs = {
14
+ adapter: MongooseAdapter;
15
+ globalSlug: string;
16
+ };
17
+ interface GetGlobal {
18
+ (args: {
19
+ versions?: false | undefined;
20
+ } & BaseGetGlobalArgs): {
21
+ globalConfig: SanitizedGlobalConfig;
22
+ Model: GlobalModel;
23
+ };
24
+ (args: {
25
+ versions?: true;
26
+ } & BaseGetGlobalArgs): {
27
+ globalConfig: SanitizedGlobalConfig;
28
+ Model: CollectionModel;
29
+ };
30
+ }
31
+ export declare const getGlobal: GetGlobal;
32
+ export {};
33
+ //# sourceMappingURL=getEntity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getEntity.d.ts","sourceRoot":"","sources":["../../src/utilities/getEntity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAI3F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE/D,eAAO,MAAM,aAAa,2CAIvB;IACD,OAAO,EAAE,eAAe,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,KAAG;IACF,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,CAAA;IAExC,KAAK,EAAE,eAAe,CAAA;CA+BvB,CAAA;AAED,KAAK,iBAAiB,GAAG;IACvB,OAAO,EAAE,eAAe,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,UAAU,SAAS;IACjB,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,KAAK,GAAG,SAAS,CAAA;KAAE,GAAG,iBAAiB,GAAG;QAC5D,YAAY,EAAE,qBAAqB,CAAA;QACnC,KAAK,EAAE,WAAW,CAAA;KACnB,CAAA;IACD,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,IAAI,CAAA;KAAE,GAAG,iBAAiB,GAAG;QAC/C,YAAY,EAAE,qBAAqB,CAAA;QACnC,KAAK,EAAE,eAAe,CAAA;KACvB,CAAA;CACF;AAED,eAAO,MAAM,SAAS,EAAE,SAsBvB,CAAA"}
@@ -0,0 +1,49 @@
1
+ import { APIError } from 'payload';
2
+ export const getCollection = ({ adapter, collectionSlug, versions = false })=>{
3
+ const collection = adapter.payload.collections[collectionSlug];
4
+ if (!collection) {
5
+ throw new APIError(`ERROR: Failed to retrieve collection with the slug "${collectionSlug}". Does not exist.`);
6
+ }
7
+ if (versions) {
8
+ const Model = adapter.versions[collectionSlug];
9
+ if (!Model) {
10
+ throw new APIError(`ERROR: Failed to retrieve collection version model with the slug "${collectionSlug}". Does not exist.`);
11
+ }
12
+ return {
13
+ collectionConfig: collection.config,
14
+ customIDType: collection.customIDType,
15
+ Model
16
+ };
17
+ }
18
+ const Model = adapter.collections[collectionSlug];
19
+ if (!Model) {
20
+ throw new APIError(`ERROR: Failed to retrieve collection model with the slug "${collectionSlug}". Does not exist.`);
21
+ }
22
+ return {
23
+ collectionConfig: collection.config,
24
+ customIDType: collection.customIDType,
25
+ Model
26
+ };
27
+ };
28
+ export const getGlobal = ({ adapter, globalSlug, versions = false })=>{
29
+ const globalConfig = adapter.payload.config.globals.find((each)=>each.slug === globalSlug);
30
+ if (!globalConfig) {
31
+ throw new APIError(`ERROR: Failed to retrieve global with the slug "${globalSlug}". Does not exist.`);
32
+ }
33
+ if (versions) {
34
+ const Model = adapter.versions[globalSlug];
35
+ if (!Model) {
36
+ throw new APIError(`ERROR: Failed to retrieve global version model with the slug "${globalSlug}". Does not exist.`);
37
+ }
38
+ return {
39
+ globalConfig,
40
+ Model
41
+ };
42
+ }
43
+ return {
44
+ globalConfig,
45
+ Model: adapter.globals
46
+ };
47
+ };
48
+
49
+ //# sourceMappingURL=getEntity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/getEntity.ts"],"sourcesContent":["import type { Collection, SanitizedCollectionConfig, SanitizedGlobalConfig } from 'payload'\n\nimport { APIError } from 'payload'\n\nimport type { MongooseAdapter } from '../index.js'\nimport type { CollectionModel, GlobalModel } from '../types.js'\n\nexport const getCollection = ({\n adapter,\n collectionSlug,\n versions = false,\n}: {\n adapter: MongooseAdapter\n collectionSlug: string\n versions?: boolean\n}): {\n collectionConfig: SanitizedCollectionConfig\n customIDType: Collection['customIDType']\n\n Model: CollectionModel\n} => {\n const collection = adapter.payload.collections[collectionSlug]\n\n if (!collection) {\n throw new APIError(\n `ERROR: Failed to retrieve collection with the slug \"${collectionSlug}\". Does not exist.`,\n )\n }\n\n if (versions) {\n const Model = adapter.versions[collectionSlug]\n\n if (!Model) {\n throw new APIError(\n `ERROR: Failed to retrieve collection version model with the slug \"${collectionSlug}\". Does not exist.`,\n )\n }\n\n return { collectionConfig: collection.config, customIDType: collection.customIDType, Model }\n }\n\n const Model = adapter.collections[collectionSlug]\n\n if (!Model) {\n throw new APIError(\n `ERROR: Failed to retrieve collection model with the slug \"${collectionSlug}\". Does not exist.`,\n )\n }\n\n return { collectionConfig: collection.config, customIDType: collection.customIDType, Model }\n}\n\ntype BaseGetGlobalArgs = {\n adapter: MongooseAdapter\n globalSlug: string\n}\n\ninterface GetGlobal {\n (args: { versions?: false | undefined } & BaseGetGlobalArgs): {\n globalConfig: SanitizedGlobalConfig\n Model: GlobalModel\n }\n (args: { versions?: true } & BaseGetGlobalArgs): {\n globalConfig: SanitizedGlobalConfig\n Model: CollectionModel\n }\n}\n\nexport const getGlobal: GetGlobal = ({ adapter, globalSlug, versions = false }) => {\n const globalConfig = adapter.payload.config.globals.find((each) => each.slug === globalSlug)\n\n if (!globalConfig) {\n throw new APIError(\n `ERROR: Failed to retrieve global with the slug \"${globalSlug}\". Does not exist.`,\n )\n }\n\n if (versions) {\n const Model = adapter.versions[globalSlug]\n\n if (!Model) {\n throw new APIError(\n `ERROR: Failed to retrieve global version model with the slug \"${globalSlug}\". Does not exist.`,\n )\n }\n\n return { globalConfig, Model }\n }\n\n return { globalConfig, Model: adapter.globals } as any\n}\n"],"names":["APIError","getCollection","adapter","collectionSlug","versions","collection","payload","collections","Model","collectionConfig","config","customIDType","getGlobal","globalSlug","globalConfig","globals","find","each","slug"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,UAAS;AAKlC,OAAO,MAAMC,gBAAgB,CAAC,EAC5BC,OAAO,EACPC,cAAc,EACdC,WAAW,KAAK,EAKjB;IAMC,MAAMC,aAAaH,QAAQI,OAAO,CAACC,WAAW,CAACJ,eAAe;IAE9D,IAAI,CAACE,YAAY;QACf,MAAM,IAAIL,SACR,CAAC,oDAAoD,EAAEG,eAAe,kBAAkB,CAAC;IAE7F;IAEA,IAAIC,UAAU;QACZ,MAAMI,QAAQN,QAAQE,QAAQ,CAACD,eAAe;QAE9C,IAAI,CAACK,OAAO;YACV,MAAM,IAAIR,SACR,CAAC,kEAAkE,EAAEG,eAAe,kBAAkB,CAAC;QAE3G;QAEA,OAAO;YAAEM,kBAAkBJ,WAAWK,MAAM;YAAEC,cAAcN,WAAWM,YAAY;YAAEH;QAAM;IAC7F;IAEA,MAAMA,QAAQN,QAAQK,WAAW,CAACJ,eAAe;IAEjD,IAAI,CAACK,OAAO;QACV,MAAM,IAAIR,SACR,CAAC,0DAA0D,EAAEG,eAAe,kBAAkB,CAAC;IAEnG;IAEA,OAAO;QAAEM,kBAAkBJ,WAAWK,MAAM;QAAEC,cAAcN,WAAWM,YAAY;QAAEH;IAAM;AAC7F,EAAC;AAkBD,OAAO,MAAMI,YAAuB,CAAC,EAAEV,OAAO,EAAEW,UAAU,EAAET,WAAW,KAAK,EAAE;IAC5E,MAAMU,eAAeZ,QAAQI,OAAO,CAACI,MAAM,CAACK,OAAO,CAACC,IAAI,CAAC,CAACC,OAASA,KAAKC,IAAI,KAAKL;IAEjF,IAAI,CAACC,cAAc;QACjB,MAAM,IAAId,SACR,CAAC,gDAAgD,EAAEa,WAAW,kBAAkB,CAAC;IAErF;IAEA,IAAIT,UAAU;QACZ,MAAMI,QAAQN,QAAQE,QAAQ,CAACS,WAAW;QAE1C,IAAI,CAACL,OAAO;YACV,MAAM,IAAIR,SACR,CAAC,8DAA8D,EAAEa,WAAW,kBAAkB,CAAC;QAEnG;QAEA,OAAO;YAAEC;YAAcN;QAAM;IAC/B;IAEA,OAAO;QAAEM;QAAcN,OAAON,QAAQa,OAAO;IAAC;AAChD,EAAC"}
@@ -1,7 +1,7 @@
1
1
  import type { PayloadRequest } from 'payload';
2
2
  export declare const handleError: ({ collection, error, global, req, }: {
3
3
  collection?: string;
4
- error: Error;
4
+ error: unknown;
5
5
  global?: string;
6
6
  req?: Partial<PayloadRequest>;
7
7
  }) => never;
@@ -1 +1 @@
1
- {"version":3,"file":"handleError.d.ts","sourceRoot":"","sources":["../../src/utilities/handleError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAI7C,eAAO,MAAM,WAAW,wCAKrB;IACD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,KAAK,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;CAC9B,UAuBA,CAAA"}
1
+ {"version":3,"file":"handleError.d.ts","sourceRoot":"","sources":["../../src/utilities/handleError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAI7C,eAAO,MAAM,WAAW,wCAKrB;IACD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;CAC9B,UA8BA,CAAA"}
@@ -4,18 +4,19 @@ export const handleError = ({ collection, error, global, req })=>{
4
4
  throw error;
5
5
  }
6
6
  // Handle uniqueness error from MongoDB
7
- if ('code' in error && error.code === 11000 && 'keyValue' in error && error.keyValue) {
7
+ if ('code' in error && error.code === 11000 && 'keyValue' in error && error.keyValue && typeof error.keyValue === 'object') {
8
8
  throw new ValidationError({
9
9
  collection,
10
10
  errors: [
11
11
  {
12
12
  message: req?.t ? req.t('error:valueMustBeUnique') : 'Value must be unique',
13
- path: Object.keys(error.keyValue)[0]
13
+ path: Object.keys(error.keyValue)[0] ?? ''
14
14
  }
15
15
  ],
16
16
  global
17
17
  }, req?.t);
18
18
  }
19
+ // eslint-disable-next-line @typescript-eslint/only-throw-error
19
20
  throw error;
20
21
  };
21
22
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/handleError.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport { ValidationError } from 'payload'\n\nexport const handleError = ({\n collection,\n error,\n global,\n req,\n}: {\n collection?: string\n error: Error\n global?: string\n req?: Partial<PayloadRequest>\n}) => {\n if (!error || typeof error !== 'object') {\n throw error\n }\n\n // Handle uniqueness error from MongoDB\n if ('code' in error && error.code === 11000 && 'keyValue' in error && error.keyValue) {\n throw new ValidationError(\n {\n collection,\n errors: [\n {\n message: req?.t ? req.t('error:valueMustBeUnique') : 'Value must be unique',\n path: Object.keys(error.keyValue)[0],\n },\n ],\n global,\n },\n req?.t,\n )\n }\n\n throw error\n}\n"],"names":["ValidationError","handleError","collection","error","global","req","code","keyValue","errors","message","t","path","Object","keys"],"mappings":"AAEA,SAASA,eAAe,QAAQ,UAAS;AAEzC,OAAO,MAAMC,cAAc,CAAC,EAC1BC,UAAU,EACVC,KAAK,EACLC,MAAM,EACNC,GAAG,EAMJ;IACC,IAAI,CAACF,SAAS,OAAOA,UAAU,UAAU;QACvC,MAAMA;IACR;IAEA,uCAAuC;IACvC,IAAI,UAAUA,SAASA,MAAMG,IAAI,KAAK,SAAS,cAAcH,SAASA,MAAMI,QAAQ,EAAE;QACpF,MAAM,IAAIP,gBACR;YACEE;YACAM,QAAQ;gBACN;oBACEC,SAASJ,KAAKK,IAAIL,IAAIK,CAAC,CAAC,6BAA6B;oBACrDC,MAAMC,OAAOC,IAAI,CAACV,MAAMI,QAAQ,CAAC,CAAC,EAAE;gBACtC;aACD;YACDH;QACF,GACAC,KAAKK;IAET;IAEA,MAAMP;AACR,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/handleError.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport { ValidationError } from 'payload'\n\nexport const handleError = ({\n collection,\n error,\n global,\n req,\n}: {\n collection?: string\n error: unknown\n global?: string\n req?: Partial<PayloadRequest>\n}) => {\n if (!error || typeof error !== 'object') {\n throw error\n }\n\n // Handle uniqueness error from MongoDB\n if (\n 'code' in error &&\n error.code === 11000 &&\n 'keyValue' in error &&\n error.keyValue &&\n typeof error.keyValue === 'object'\n ) {\n throw new ValidationError(\n {\n collection,\n errors: [\n {\n message: req?.t ? req.t('error:valueMustBeUnique') : 'Value must be unique',\n path: Object.keys(error.keyValue)[0] ?? '',\n },\n ],\n global,\n },\n req?.t,\n )\n }\n\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw error\n}\n"],"names":["ValidationError","handleError","collection","error","global","req","code","keyValue","errors","message","t","path","Object","keys"],"mappings":"AAEA,SAASA,eAAe,QAAQ,UAAS;AAEzC,OAAO,MAAMC,cAAc,CAAC,EAC1BC,UAAU,EACVC,KAAK,EACLC,MAAM,EACNC,GAAG,EAMJ;IACC,IAAI,CAACF,SAAS,OAAOA,UAAU,UAAU;QACvC,MAAMA;IACR;IAEA,uCAAuC;IACvC,IACE,UAAUA,SACVA,MAAMG,IAAI,KAAK,SACf,cAAcH,SACdA,MAAMI,QAAQ,IACd,OAAOJ,MAAMI,QAAQ,KAAK,UAC1B;QACA,MAAM,IAAIP,gBACR;YACEE;YACAM,QAAQ;gBACN;oBACEC,SAASJ,KAAKK,IAAIL,IAAIK,CAAC,CAAC,6BAA6B;oBACrDC,MAAMC,OAAOC,IAAI,CAACV,MAAMI,QAAQ,CAAC,CAAC,EAAE,IAAI;gBAC1C;aACD;YACDH;QACF,GACAC,KAAKK;IAET;IAEA,+DAA+D;IAC/D,MAAMP;AACR,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/utilities/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,KAAK,EAMN,MAAM,SAAS,CAAA;AAMhB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAgMlD,KAAK,IAAI,GAAG;IACV,8BAA8B;IAC9B,OAAO,EAAE,eAAe,CAAA;IACxB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACzD,uCAAuC;IACvC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC,CAAA;AAED,eAAO,MAAM,SAAS,gGAQnB,IAAI,SA4GN,CAAA"}
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/utilities/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,KAAK,EAMN,MAAM,SAAS,CAAA;AAMhB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAgMlD,KAAK,IAAI,GAAG;IACV,8BAA8B;IAC9B,OAAO,EAAE,eAAe,CAAA;IACxB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACzD,uCAAuC;IACvC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC,CAAA;AAED,eAAO,MAAM,SAAS,gGAQnB,IAAI,SA8GN,CAAA"}