@payloadcms/db-mongodb 4.0.0-internal.a6582c6 → 4.0.0-internal.a9d2e4e

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 (185) 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/create.d.ts.map +1 -1
  14. package/dist/create.js +2 -1
  15. package/dist/create.js.map +1 -1
  16. package/dist/createGlobalVersion.d.ts +1 -1
  17. package/dist/createGlobalVersion.d.ts.map +1 -1
  18. package/dist/createGlobalVersion.js +25 -2
  19. package/dist/createGlobalVersion.js.map +1 -1
  20. package/dist/createMigration.d.ts.map +1 -1
  21. package/dist/createMigration.js +9 -2
  22. package/dist/createMigration.js.map +1 -1
  23. package/dist/createVersion.d.ts.map +1 -1
  24. package/dist/createVersion.js +17 -4
  25. package/dist/createVersion.js.map +1 -1
  26. package/dist/deleteBranchGlobal.d.ts +10 -0
  27. package/dist/deleteBranchGlobal.d.ts.map +1 -0
  28. package/dist/deleteBranchGlobal.js +26 -0
  29. package/dist/deleteBranchGlobal.js.map +1 -0
  30. package/dist/deleteMany.d.ts.map +1 -1
  31. package/dist/deleteMany.js +1 -0
  32. package/dist/deleteMany.js.map +1 -1
  33. package/dist/deleteOne.d.ts.map +1 -1
  34. package/dist/deleteOne.js +20 -1
  35. package/dist/deleteOne.js.map +1 -1
  36. package/dist/deleteVersions.d.ts.map +1 -1
  37. package/dist/deleteVersions.js +1 -0
  38. package/dist/deleteVersions.js.map +1 -1
  39. package/dist/exports/migration-utils.d.ts +2 -0
  40. package/dist/exports/migration-utils.d.ts.map +1 -1
  41. package/dist/exports/migration-utils.js +2 -0
  42. package/dist/exports/migration-utils.js.map +1 -1
  43. package/dist/find.d.ts.map +1 -1
  44. package/dist/find.js +44 -8
  45. package/dist/find.js.map +1 -1
  46. package/dist/findDistinct.d.ts.map +1 -1
  47. package/dist/findDistinct.js +115 -12
  48. package/dist/findDistinct.js.map +1 -1
  49. package/dist/findGlobal.d.ts.map +1 -1
  50. package/dist/findGlobal.js +48 -9
  51. package/dist/findGlobal.js.map +1 -1
  52. package/dist/findGlobalVersions.d.ts.map +1 -1
  53. package/dist/findGlobalVersions.js +10 -2
  54. package/dist/findGlobalVersions.js.map +1 -1
  55. package/dist/findOne.d.ts.map +1 -1
  56. package/dist/findOne.js +43 -5
  57. package/dist/findOne.js.map +1 -1
  58. package/dist/findVersions.d.ts.map +1 -1
  59. package/dist/findVersions.js +49 -5
  60. package/dist/findVersions.js.map +1 -1
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +4 -0
  63. package/dist/index.js.map +1 -1
  64. package/dist/init.d.ts.map +1 -1
  65. package/dist/init.js +89 -67
  66. package/dist/init.js.map +1 -1
  67. package/dist/migrateFresh.d.ts +4 -2
  68. package/dist/migrateFresh.d.ts.map +1 -1
  69. package/dist/migrateFresh.js +21 -6
  70. package/dist/migrateFresh.js.map +1 -1
  71. package/dist/models/buildCollectionSchema.d.ts +8 -2
  72. package/dist/models/buildCollectionSchema.d.ts.map +1 -1
  73. package/dist/models/buildCollectionSchema.js +4 -2
  74. package/dist/models/buildCollectionSchema.js.map +1 -1
  75. package/dist/models/buildGlobalModel.d.ts +5 -1
  76. package/dist/models/buildGlobalModel.d.ts.map +1 -1
  77. package/dist/models/buildGlobalModel.js +34 -3
  78. package/dist/models/buildGlobalModel.js.map +1 -1
  79. package/dist/models/buildSchema.d.ts +4 -0
  80. package/dist/models/buildSchema.d.ts.map +1 -1
  81. package/dist/models/buildSchema.js +100 -36
  82. package/dist/models/buildSchema.js.map +1 -1
  83. package/dist/models/schemaBuildContext.d.ts +21 -0
  84. package/dist/models/schemaBuildContext.d.ts.map +1 -0
  85. package/dist/models/schemaBuildContext.js +29 -0
  86. package/dist/models/schemaBuildContext.js.map +1 -0
  87. package/dist/predefinedMigrations/branching.d.ts +4 -0
  88. package/dist/predefinedMigrations/branching.d.ts.map +1 -0
  89. package/dist/predefinedMigrations/branching.js +9 -0
  90. package/dist/predefinedMigrations/branching.js.map +1 -0
  91. package/dist/predefinedMigrations/migrateBranching.d.ts +17 -0
  92. package/dist/predefinedMigrations/migrateBranching.d.ts.map +1 -0
  93. package/dist/predefinedMigrations/migrateBranching.js +90 -0
  94. package/dist/predefinedMigrations/migrateBranching.js.map +1 -0
  95. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.d.ts.map +1 -1
  96. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js +4 -4
  97. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js.map +1 -1
  98. package/dist/predefinedMigrations/migrateSizesToVariants.d.ts +13 -0
  99. package/dist/predefinedMigrations/migrateSizesToVariants.d.ts.map +1 -0
  100. package/dist/predefinedMigrations/migrateSizesToVariants.js +368 -0
  101. package/dist/predefinedMigrations/migrateSizesToVariants.js.map +1 -0
  102. package/dist/predefinedMigrations/sizes-to-variants.d.ts +5 -0
  103. package/dist/predefinedMigrations/sizes-to-variants.d.ts.map +1 -0
  104. package/dist/predefinedMigrations/sizes-to-variants.js +8 -0
  105. package/dist/predefinedMigrations/sizes-to-variants.js.map +1 -0
  106. package/dist/queries/buildAndOrConditions.d.ts +4 -2
  107. package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
  108. package/dist/queries/buildAndOrConditions.js +3 -1
  109. package/dist/queries/buildAndOrConditions.js.map +1 -1
  110. package/dist/queries/buildBranchVisibility.d.ts +11 -0
  111. package/dist/queries/buildBranchVisibility.d.ts.map +1 -0
  112. package/dist/queries/buildBranchVisibility.js +204 -0
  113. package/dist/queries/buildBranchVisibility.js.map +1 -0
  114. package/dist/queries/buildQuery.d.ts +4 -2
  115. package/dist/queries/buildQuery.d.ts.map +1 -1
  116. package/dist/queries/buildQuery.js +3 -1
  117. package/dist/queries/buildQuery.js.map +1 -1
  118. package/dist/queries/buildRelatedQueryPipeline.d.ts +7 -0
  119. package/dist/queries/buildRelatedQueryPipeline.d.ts.map +1 -0
  120. package/dist/queries/buildRelatedQueryPipeline.js +56 -0
  121. package/dist/queries/buildRelatedQueryPipeline.js.map +1 -0
  122. package/dist/queries/buildSearchParams.d.ts +4 -2
  123. package/dist/queries/buildSearchParams.d.ts.map +1 -1
  124. package/dist/queries/buildSearchParams.js +340 -25
  125. package/dist/queries/buildSearchParams.js.map +1 -1
  126. package/dist/queries/getBuildQueryPlugin.d.ts +3 -1
  127. package/dist/queries/getBuildQueryPlugin.d.ts.map +1 -1
  128. package/dist/queries/getBuildQueryPlugin.js +3 -1
  129. package/dist/queries/getBuildQueryPlugin.js.map +1 -1
  130. package/dist/queries/parseParams.d.ts +4 -2
  131. package/dist/queries/parseParams.d.ts.map +1 -1
  132. package/dist/queries/parseParams.js +5 -1
  133. package/dist/queries/parseParams.js.map +1 -1
  134. package/dist/queryDrafts.d.ts.map +1 -1
  135. package/dist/queryDrafts.js +39 -7
  136. package/dist/queryDrafts.js.map +1 -1
  137. package/dist/transactions/commitTransaction.d.ts.map +1 -1
  138. package/dist/transactions/commitTransaction.js +68 -7
  139. package/dist/transactions/commitTransaction.js.map +1 -1
  140. package/dist/transactions/rollbackTransaction.d.ts.map +1 -1
  141. package/dist/transactions/rollbackTransaction.js +10 -9
  142. package/dist/transactions/rollbackTransaction.js.map +1 -1
  143. package/dist/updateGlobal.d.ts.map +1 -1
  144. package/dist/updateGlobal.js +91 -9
  145. package/dist/updateGlobal.js.map +1 -1
  146. package/dist/updateGlobalVersion.d.ts.map +1 -1
  147. package/dist/updateGlobalVersion.js +3 -2
  148. package/dist/updateGlobalVersion.js.map +1 -1
  149. package/dist/updateJobs.js +1 -1
  150. package/dist/updateJobs.js.map +1 -1
  151. package/dist/updateMany.d.ts.map +1 -1
  152. package/dist/updateMany.js +3 -2
  153. package/dist/updateMany.js.map +1 -1
  154. package/dist/updateOne.d.ts.map +1 -1
  155. package/dist/updateOne.js +30 -4
  156. package/dist/updateOne.js.map +1 -1
  157. package/dist/updateVersion.d.ts.map +1 -1
  158. package/dist/updateVersion.js +3 -2
  159. package/dist/updateVersion.js.map +1 -1
  160. package/dist/upsertBranchGlobalChange.d.ts +3 -0
  161. package/dist/upsertBranchGlobalChange.d.ts.map +1 -0
  162. package/dist/upsertBranchGlobalChange.js +28 -0
  163. package/dist/upsertBranchGlobalChange.js.map +1 -0
  164. package/dist/utilities/aggregatePaginate.d.ts +2 -1
  165. package/dist/utilities/aggregatePaginate.d.ts.map +1 -1
  166. package/dist/utilities/aggregatePaginate.js +21 -5
  167. package/dist/utilities/aggregatePaginate.js.map +1 -1
  168. package/dist/utilities/buildJoinAggregation.d.ts +4 -2
  169. package/dist/utilities/buildJoinAggregation.d.ts.map +1 -1
  170. package/dist/utilities/buildJoinAggregation.js +160 -26
  171. package/dist/utilities/buildJoinAggregation.js.map +1 -1
  172. package/dist/utilities/resolveJoins.d.ts +6 -2
  173. package/dist/utilities/resolveJoins.d.ts.map +1 -1
  174. package/dist/utilities/resolveJoins.js +115 -26
  175. package/dist/utilities/resolveJoins.js.map +1 -1
  176. package/dist/utilities/transform.d.ts.map +1 -1
  177. package/dist/utilities/transform.js +15 -0
  178. package/dist/utilities/transform.js.map +1 -1
  179. package/package.json +18 -21
  180. package/dist/queries/buildSortParam.spec.js +0 -123
  181. package/dist/queries/buildSortParam.spec.js.map +0 -1
  182. package/dist/queries/getLocalizedSortProperty.spec.js +0 -215
  183. package/dist/queries/getLocalizedSortProperty.spec.js.map +0 -1
  184. package/dist/utilities/transform.spec.js +0 -479
  185. package/dist/utilities/transform.spec.js.map +0 -1
@@ -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"}
@@ -2,7 +2,7 @@ import { deepMergeWithCombinedArrays } from 'payload';
2
2
  import { validOperatorSet } from 'payload/shared';
3
3
  import { buildAndOrConditions } from './buildAndOrConditions.js';
4
4
  import { buildSearchParam } from './buildSearchParams.js';
5
- export async function parseParams({ collectionSlug, fields, globalSlug, locale, parentIsLocalized, payload, where }) {
5
+ export async function parseParams({ branch, collectionSlug, fields, globalSlug, locale, parentIsLocalized, payload, req, where }) {
6
6
  let result = {};
7
7
  if (typeof where === 'object') {
8
8
  // We need to determine if the whereKey is an AND, OR, or a schema path
@@ -16,12 +16,14 @@ export async function parseParams({ collectionSlug, fields, globalSlug, locale,
16
16
  }
17
17
  if (Array.isArray(condition)) {
18
18
  const builtConditions = await buildAndOrConditions({
19
+ branch,
19
20
  collectionSlug,
20
21
  fields,
21
22
  globalSlug,
22
23
  locale,
23
24
  parentIsLocalized,
24
25
  payload,
26
+ req,
25
27
  where: condition
26
28
  });
27
29
  if (builtConditions.length > 0 && conditionOperator !== null) {
@@ -36,6 +38,7 @@ export async function parseParams({ collectionSlug, fields, globalSlug, locale,
36
38
  const validOperators = Object.keys(pathOperators).filter((operator)=>validOperatorSet.has(operator));
37
39
  for (const operator of validOperators){
38
40
  const searchParam = await buildSearchParam({
41
+ branch,
39
42
  collectionSlug,
40
43
  fields,
41
44
  globalSlug,
@@ -44,6 +47,7 @@ export async function parseParams({ collectionSlug, fields, globalSlug, locale,
44
47
  operator,
45
48
  parentIsLocalized,
46
49
  payload,
50
+ req,
47
51
  val: pathOperators[operator]
48
52
  });
49
53
  if (searchParam?.value && searchParam?.path) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/queries/parseParams.ts"],"sourcesContent":["import type { FilterQuery } from 'mongoose'\nimport type { FlattenedField, Operator, Payload, Where } from 'payload'\n\nimport { deepMergeWithCombinedArrays } from 'payload'\nimport { validOperatorSet } from 'payload/shared'\n\nimport { buildAndOrConditions } from './buildAndOrConditions.js'\nimport { buildSearchParam } from './buildSearchParams.js'\n\nexport async function parseParams({\n collectionSlug,\n fields,\n globalSlug,\n locale,\n parentIsLocalized,\n payload,\n where,\n}: {\n collectionSlug?: string\n fields: FlattenedField[]\n globalSlug?: string\n locale?: string\n parentIsLocalized: boolean\n payload: Payload\n where: Where\n}): Promise<Record<string, unknown>> {\n let result = {} as FilterQuery<any>\n\n if (typeof where === 'object') {\n // We need to determine if the whereKey is an AND, OR, or a schema path\n for (const relationOrPath of Object.keys(where)) {\n const condition = where[relationOrPath]\n let conditionOperator: '$and' | '$or' | null = null\n if (relationOrPath.toLowerCase() === 'and') {\n conditionOperator = '$and'\n } else if (relationOrPath.toLowerCase() === 'or') {\n conditionOperator = '$or'\n }\n if (Array.isArray(condition)) {\n const builtConditions = await buildAndOrConditions({\n collectionSlug,\n fields,\n globalSlug,\n locale,\n parentIsLocalized,\n payload,\n where: condition,\n })\n if (builtConditions.length > 0 && conditionOperator !== null) {\n result[conditionOperator] = builtConditions\n }\n } else {\n // It's a path - and there can be multiple comparisons on a single path.\n // For example - title like 'test' and title not equal to 'tester'\n // So we need to loop on keys again here to handle each operator independently\n const pathOperators = where[relationOrPath]\n if (typeof pathOperators === 'object') {\n const validOperators: Operator[] = Object.keys(pathOperators).filter((operator) =>\n validOperatorSet.has(operator as Operator),\n ) as Operator[]\n\n for (const operator of validOperators) {\n const searchParam = await buildSearchParam({\n collectionSlug,\n fields,\n globalSlug,\n incomingPath: relationOrPath,\n locale,\n operator,\n parentIsLocalized,\n payload,\n val: (pathOperators as Record<string, Where>)[operator],\n })\n\n if (searchParam?.value && searchParam?.path) {\n if (validOperators.length > 1) {\n if (!result.$and) {\n result.$and = []\n }\n result.$and.push({\n [searchParam.path]: searchParam.value,\n })\n } else {\n if (result[searchParam.path]) {\n if (!result.$and) {\n result.$and = []\n }\n\n result.$and.push({ [searchParam.path]: result[searchParam.path] })\n result.$and.push({\n [searchParam.path]: searchParam.value,\n })\n delete result[searchParam.path]\n } else {\n result[searchParam.path] = searchParam.value\n }\n }\n } else if (typeof searchParam?.value === 'object') {\n result = deepMergeWithCombinedArrays(result, searchParam.value ?? {}, {\n // dont clone Types.ObjectIDs\n clone: false,\n })\n }\n }\n }\n }\n }\n }\n\n return result\n}\n"],"names":["deepMergeWithCombinedArrays","validOperatorSet","buildAndOrConditions","buildSearchParam","parseParams","collectionSlug","fields","globalSlug","locale","parentIsLocalized","payload","where","result","relationOrPath","Object","keys","condition","conditionOperator","toLowerCase","Array","isArray","builtConditions","length","pathOperators","validOperators","filter","operator","has","searchParam","incomingPath","val","value","path","$and","push","clone"],"mappings":"AAGA,SAASA,2BAA2B,QAAQ,UAAS;AACrD,SAASC,gBAAgB,QAAQ,iBAAgB;AAEjD,SAASC,oBAAoB,QAAQ,4BAA2B;AAChE,SAASC,gBAAgB,QAAQ,yBAAwB;AAEzD,OAAO,eAAeC,YAAY,EAChCC,cAAc,EACdC,MAAM,EACNC,UAAU,EACVC,MAAM,EACNC,iBAAiB,EACjBC,OAAO,EACPC,KAAK,EASN;IACC,IAAIC,SAAS,CAAC;IAEd,IAAI,OAAOD,UAAU,UAAU;QAC7B,uEAAuE;QACvE,KAAK,MAAME,kBAAkBC,OAAOC,IAAI,CAACJ,OAAQ;YAC/C,MAAMK,YAAYL,KAAK,CAACE,eAAe;YACvC,IAAII,oBAA2C;YAC/C,IAAIJ,eAAeK,WAAW,OAAO,OAAO;gBAC1CD,oBAAoB;YACtB,OAAO,IAAIJ,eAAeK,WAAW,OAAO,MAAM;gBAChDD,oBAAoB;YACtB;YACA,IAAIE,MAAMC,OAAO,CAACJ,YAAY;gBAC5B,MAAMK,kBAAkB,MAAMnB,qBAAqB;oBACjDG;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC,OAAOK;gBACT;gBACA,IAAIK,gBAAgBC,MAAM,GAAG,KAAKL,sBAAsB,MAAM;oBAC5DL,MAAM,CAACK,kBAAkB,GAAGI;gBAC9B;YACF,OAAO;gBACL,wEAAwE;gBACxE,kEAAkE;gBAClE,8EAA8E;gBAC9E,MAAME,gBAAgBZ,KAAK,CAACE,eAAe;gBAC3C,IAAI,OAAOU,kBAAkB,UAAU;oBACrC,MAAMC,iBAA6BV,OAAOC,IAAI,CAACQ,eAAeE,MAAM,CAAC,CAACC,WACpEzB,iBAAiB0B,GAAG,CAACD;oBAGvB,KAAK,MAAMA,YAAYF,eAAgB;wBACrC,MAAMI,cAAc,MAAMzB,iBAAiB;4BACzCE;4BACAC;4BACAC;4BACAsB,cAAchB;4BACdL;4BACAkB;4BACAjB;4BACAC;4BACAoB,KAAK,AAACP,aAAuC,CAACG,SAAS;wBACzD;wBAEA,IAAIE,aAAaG,SAASH,aAAaI,MAAM;4BAC3C,IAAIR,eAAeF,MAAM,GAAG,GAAG;gCAC7B,IAAI,CAACV,OAAOqB,IAAI,EAAE;oCAChBrB,OAAOqB,IAAI,GAAG,EAAE;gCAClB;gCACArB,OAAOqB,IAAI,CAACC,IAAI,CAAC;oCACf,CAACN,YAAYI,IAAI,CAAC,EAAEJ,YAAYG,KAAK;gCACvC;4BACF,OAAO;gCACL,IAAInB,MAAM,CAACgB,YAAYI,IAAI,CAAC,EAAE;oCAC5B,IAAI,CAACpB,OAAOqB,IAAI,EAAE;wCAChBrB,OAAOqB,IAAI,GAAG,EAAE;oCAClB;oCAEArB,OAAOqB,IAAI,CAACC,IAAI,CAAC;wCAAE,CAACN,YAAYI,IAAI,CAAC,EAAEpB,MAAM,CAACgB,YAAYI,IAAI,CAAC;oCAAC;oCAChEpB,OAAOqB,IAAI,CAACC,IAAI,CAAC;wCACf,CAACN,YAAYI,IAAI,CAAC,EAAEJ,YAAYG,KAAK;oCACvC;oCACA,OAAOnB,MAAM,CAACgB,YAAYI,IAAI,CAAC;gCACjC,OAAO;oCACLpB,MAAM,CAACgB,YAAYI,IAAI,CAAC,GAAGJ,YAAYG,KAAK;gCAC9C;4BACF;wBACF,OAAO,IAAI,OAAOH,aAAaG,UAAU,UAAU;4BACjDnB,SAASZ,4BAA4BY,QAAQgB,YAAYG,KAAK,IAAI,CAAC,GAAG;gCACpE,6BAA6B;gCAC7BI,OAAO;4BACT;wBACF;oBACF;gBACF;YACF;QACF;IACF;IAEA,OAAOvB;AACT"}
1
+ {"version":3,"sources":["../../src/queries/parseParams.ts"],"sourcesContent":["import type { QueryFilter } from 'mongoose'\nimport type { FlattenedField, Operator, Payload, PayloadRequest, Where } from 'payload'\n\nimport { deepMergeWithCombinedArrays } from 'payload'\nimport { validOperatorSet } from 'payload/shared'\n\nimport { buildAndOrConditions } from './buildAndOrConditions.js'\nimport { buildSearchParam } from './buildSearchParams.js'\n\nexport async function parseParams({\n branch,\n collectionSlug,\n fields,\n globalSlug,\n locale,\n parentIsLocalized,\n payload,\n req,\n where,\n}: {\n branch?: false | string\n collectionSlug?: string\n fields: FlattenedField[]\n globalSlug?: string\n locale?: string\n parentIsLocalized: boolean\n payload: Payload\n req?: Partial<PayloadRequest>\n where: Where\n}): Promise<Record<string, unknown>> {\n let result = {} as QueryFilter<any>\n\n if (typeof where === 'object') {\n // We need to determine if the whereKey is an AND, OR, or a schema path\n for (const relationOrPath of Object.keys(where)) {\n const condition = where[relationOrPath]\n let conditionOperator: '$and' | '$or' | null = null\n if (relationOrPath.toLowerCase() === 'and') {\n conditionOperator = '$and'\n } else if (relationOrPath.toLowerCase() === 'or') {\n conditionOperator = '$or'\n }\n if (Array.isArray(condition)) {\n const builtConditions = await buildAndOrConditions({\n branch,\n collectionSlug,\n fields,\n globalSlug,\n locale,\n parentIsLocalized,\n payload,\n req,\n where: condition,\n })\n if (builtConditions.length > 0 && conditionOperator !== null) {\n result[conditionOperator] = builtConditions\n }\n } else {\n // It's a path - and there can be multiple comparisons on a single path.\n // For example - title like 'test' and title not equal to 'tester'\n // So we need to loop on keys again here to handle each operator independently\n const pathOperators = where[relationOrPath]\n if (typeof pathOperators === 'object') {\n const validOperators: Operator[] = Object.keys(pathOperators).filter((operator) =>\n validOperatorSet.has(operator as Operator),\n ) as Operator[]\n\n for (const operator of validOperators) {\n const searchParam = await buildSearchParam({\n branch,\n collectionSlug,\n fields,\n globalSlug,\n incomingPath: relationOrPath,\n locale,\n operator,\n parentIsLocalized,\n payload,\n req,\n val: (pathOperators as Record<string, Where>)[operator],\n })\n\n if (searchParam?.value && searchParam?.path) {\n if (validOperators.length > 1) {\n if (!result.$and) {\n result.$and = []\n }\n result.$and.push({\n [searchParam.path]: searchParam.value,\n })\n } else {\n if (result[searchParam.path]) {\n if (!result.$and) {\n result.$and = []\n }\n\n result.$and.push({ [searchParam.path]: result[searchParam.path] })\n result.$and.push({\n [searchParam.path]: searchParam.value,\n })\n delete result[searchParam.path]\n } else {\n result[searchParam.path] = searchParam.value\n }\n }\n } else if (typeof searchParam?.value === 'object') {\n result = deepMergeWithCombinedArrays(result, searchParam.value ?? {}, {\n // dont clone Types.ObjectIDs\n clone: false,\n })\n }\n }\n }\n }\n }\n }\n\n return result\n}\n"],"names":["deepMergeWithCombinedArrays","validOperatorSet","buildAndOrConditions","buildSearchParam","parseParams","branch","collectionSlug","fields","globalSlug","locale","parentIsLocalized","payload","req","where","result","relationOrPath","Object","keys","condition","conditionOperator","toLowerCase","Array","isArray","builtConditions","length","pathOperators","validOperators","filter","operator","has","searchParam","incomingPath","val","value","path","$and","push","clone"],"mappings":"AAGA,SAASA,2BAA2B,QAAQ,UAAS;AACrD,SAASC,gBAAgB,QAAQ,iBAAgB;AAEjD,SAASC,oBAAoB,QAAQ,4BAA2B;AAChE,SAASC,gBAAgB,QAAQ,yBAAwB;AAEzD,OAAO,eAAeC,YAAY,EAChCC,MAAM,EACNC,cAAc,EACdC,MAAM,EACNC,UAAU,EACVC,MAAM,EACNC,iBAAiB,EACjBC,OAAO,EACPC,GAAG,EACHC,KAAK,EAWN;IACC,IAAIC,SAAS,CAAC;IAEd,IAAI,OAAOD,UAAU,UAAU;QAC7B,uEAAuE;QACvE,KAAK,MAAME,kBAAkBC,OAAOC,IAAI,CAACJ,OAAQ;YAC/C,MAAMK,YAAYL,KAAK,CAACE,eAAe;YACvC,IAAII,oBAA2C;YAC/C,IAAIJ,eAAeK,WAAW,OAAO,OAAO;gBAC1CD,oBAAoB;YACtB,OAAO,IAAIJ,eAAeK,WAAW,OAAO,MAAM;gBAChDD,oBAAoB;YACtB;YACA,IAAIE,MAAMC,OAAO,CAACJ,YAAY;gBAC5B,MAAMK,kBAAkB,MAAMrB,qBAAqB;oBACjDG;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC,OAAOK;gBACT;gBACA,IAAIK,gBAAgBC,MAAM,GAAG,KAAKL,sBAAsB,MAAM;oBAC5DL,MAAM,CAACK,kBAAkB,GAAGI;gBAC9B;YACF,OAAO;gBACL,wEAAwE;gBACxE,kEAAkE;gBAClE,8EAA8E;gBAC9E,MAAME,gBAAgBZ,KAAK,CAACE,eAAe;gBAC3C,IAAI,OAAOU,kBAAkB,UAAU;oBACrC,MAAMC,iBAA6BV,OAAOC,IAAI,CAACQ,eAAeE,MAAM,CAAC,CAACC,WACpE3B,iBAAiB4B,GAAG,CAACD;oBAGvB,KAAK,MAAMA,YAAYF,eAAgB;wBACrC,MAAMI,cAAc,MAAM3B,iBAAiB;4BACzCE;4BACAC;4BACAC;4BACAC;4BACAuB,cAAchB;4BACdN;4BACAmB;4BACAlB;4BACAC;4BACAC;4BACAoB,KAAK,AAACP,aAAuC,CAACG,SAAS;wBACzD;wBAEA,IAAIE,aAAaG,SAASH,aAAaI,MAAM;4BAC3C,IAAIR,eAAeF,MAAM,GAAG,GAAG;gCAC7B,IAAI,CAACV,OAAOqB,IAAI,EAAE;oCAChBrB,OAAOqB,IAAI,GAAG,EAAE;gCAClB;gCACArB,OAAOqB,IAAI,CAACC,IAAI,CAAC;oCACf,CAACN,YAAYI,IAAI,CAAC,EAAEJ,YAAYG,KAAK;gCACvC;4BACF,OAAO;gCACL,IAAInB,MAAM,CAACgB,YAAYI,IAAI,CAAC,EAAE;oCAC5B,IAAI,CAACpB,OAAOqB,IAAI,EAAE;wCAChBrB,OAAOqB,IAAI,GAAG,EAAE;oCAClB;oCAEArB,OAAOqB,IAAI,CAACC,IAAI,CAAC;wCAAE,CAACN,YAAYI,IAAI,CAAC,EAAEpB,MAAM,CAACgB,YAAYI,IAAI,CAAC;oCAAC;oCAChEpB,OAAOqB,IAAI,CAACC,IAAI,CAAC;wCACf,CAACN,YAAYI,IAAI,CAAC,EAAEJ,YAAYG,KAAK;oCACvC;oCACA,OAAOnB,MAAM,CAACgB,YAAYI,IAAI,CAAC;gCACjC,OAAO;oCACLpB,MAAM,CAACgB,YAAYI,IAAI,CAAC,GAAGJ,YAAYG,KAAK;gCAC9C;4BACF;wBACF,OAAO,IAAI,OAAOH,aAAaG,UAAU,UAAU;4BACjDnB,SAASd,4BAA4Bc,QAAQgB,YAAYG,KAAK,IAAI,CAAC,GAAG;gCACpE,6BAA6B;gCAC7BI,OAAO;4BACT;wBACF;oBACF;gBACF;YACF;QACF;IACF;IAEA,OAAOvB;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"queryDrafts.d.ts","sourceRoot":"","sources":["../src/queryDrafts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAgB1C,eAAO,MAAM,WAAW,EAAE,WA+KzB,CAAA"}
1
+ {"version":3,"file":"queryDrafts.d.ts","sourceRoot":"","sources":["../src/queryDrafts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AA0B1C,eAAO,MAAM,WAAW,EAAE,WA4MzB,CAAA"}
@@ -1,4 +1,5 @@
1
- import { buildVersionCollectionFields, combineQueries, flattenWhereToOperators } from 'payload';
1
+ import { buildVersionCollectionFields, combineQueries, flattenWhereToOperators, projectBranchVersionParent, resolveBranchReadState, resolveBranchVersionQuery, rewriteBranchVersionParents, withBranchVersionSelect } from 'payload';
2
+ import { buildBranchVisibilityStages } from './queries/buildBranchVisibility.js';
2
3
  import { buildQuery } from './queries/buildQuery.js';
3
4
  import { buildSortParam } from './queries/buildSortParam.js';
4
5
  import { aggregatePaginate } from './utilities/aggregatePaginate.js';
@@ -8,12 +9,17 @@ import { getCollection } from './utilities/getEntity.js';
8
9
  import { getSession } from './utilities/getSession.js';
9
10
  import { resolveJoins } from './utilities/resolveJoins.js';
10
11
  import { transform } from './utilities/transform.js';
11
- export const queryDrafts = async function queryDrafts({ collection: collectionSlug, joins, limit, locale, page, pagination, req, select, sort: sortArg, where = {} }) {
12
+ export const queryDrafts = async function queryDrafts({ branch, collection: collectionSlug, joins, limit, locale, page, pagination, req, select, sort: sortArg, where = {} }) {
12
13
  const { collectionConfig, Model } = getCollection({
13
14
  adapter: this,
14
15
  collectionSlug,
15
16
  versions: true
16
17
  });
18
+ const branchReadState = resolveBranchReadState({
19
+ branch,
20
+ collectionSlug,
21
+ req
22
+ });
17
23
  let hasNearConstraint;
18
24
  let sort;
19
25
  if (where) {
@@ -34,28 +40,47 @@ export const queryDrafts = async function queryDrafts({ collection: collectionSl
34
40
  versions: true
35
41
  });
36
42
  }
43
+ const branchedWhere = branchReadState.useBranching ? rewriteBranchVersionParents(where) : await resolveBranchVersionQuery({
44
+ branch,
45
+ collectionSlug,
46
+ req,
47
+ where
48
+ });
49
+ const branchVisibility = branchReadState.useBranching ? buildBranchVisibilityStages({
50
+ adapter: this,
51
+ branch: branchReadState.branch,
52
+ collectionSlug,
53
+ mode: 'drafts'
54
+ }) : [];
37
55
  const combinedWhere = combineQueries({
38
56
  latest: {
39
57
  equals: true
40
58
  }
41
- }, where);
59
+ }, branchedWhere ?? {});
42
60
  const versionQuery = await buildQuery({
43
61
  adapter: this,
62
+ branch,
44
63
  fields,
45
64
  locale,
65
+ req,
46
66
  where: combinedWhere
47
67
  });
48
68
  const projection = buildProjectionFromSelect({
49
69
  adapter: this,
50
70
  fields,
51
- select
71
+ select: withBranchVersionSelect({
72
+ branch,
73
+ collectionSlug,
74
+ req,
75
+ select
76
+ })
52
77
  });
53
78
  const session = await getSession(this, req);
54
79
  const options = {
55
80
  session
56
81
  };
57
82
  // useEstimatedCount is faster, but not accurate, as it ignores any filters. It is thus set to true if there are no filters.
58
- const useEstimatedCount = hasNearConstraint || !versionQuery || Object.keys(versionQuery).length === 0;
83
+ const useEstimatedCount = !branchVisibility.length && (hasNearConstraint || !versionQuery || Object.keys(versionQuery).length === 0);
59
84
  const paginationOptions = {
60
85
  lean: true,
61
86
  leanWithId: true,
@@ -97,17 +122,20 @@ export const queryDrafts = async function queryDrafts({ collection: collectionSl
97
122
  let result;
98
123
  const aggregate = await buildJoinAggregation({
99
124
  adapter: this,
125
+ branch,
100
126
  collection: collectionSlug,
101
127
  collectionConfig,
102
128
  joins,
103
129
  locale,
104
130
  projection,
105
131
  query: versionQuery,
132
+ req,
106
133
  versions: true
107
134
  });
108
- if (aggregate || sortAggregation.length > 0) {
135
+ if (aggregate.length > 0 || branchVisibility.length > 0 || sortAggregation.length > 0) {
109
136
  result = await aggregatePaginate({
110
137
  adapter: this,
138
+ branchVisibility,
111
139
  collation: paginationOptions.collation,
112
140
  joinAggregation: aggregate,
113
141
  limit: paginationOptions.limit,
@@ -127,10 +155,12 @@ export const queryDrafts = async function queryDrafts({ collection: collectionSl
127
155
  if (!this.useJoinAggregations) {
128
156
  await resolveJoins({
129
157
  adapter: this,
158
+ branch,
130
159
  collectionSlug,
131
160
  docs: result.docs,
132
161
  joins,
133
162
  locale,
163
+ req,
134
164
  versions: true
135
165
  });
136
166
  }
@@ -141,7 +171,9 @@ export const queryDrafts = async function queryDrafts({ collection: collectionSl
141
171
  operation: 'read'
142
172
  });
143
173
  for(let i = 0; i < result.docs.length; i++){
144
- const id = result.docs[i].parent;
174
+ // A branch version's `parent` is the shadow row's primary key, so the
175
+ // canonical document ID comes from `_branchParent` when present.
176
+ const id = projectBranchVersionParent(result.docs[i]);
145
177
  result.docs[i] = result.docs[i].version ?? {};
146
178
  result.docs[i].id = id;
147
179
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/queryDrafts.ts"],"sourcesContent":["import type { PaginateOptions, PipelineStage, QueryOptions } from 'mongoose'\nimport type { QueryDrafts } from 'payload'\n\nimport { buildVersionCollectionFields, combineQueries, flattenWhereToOperators } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildSortParam } from './queries/buildSortParam.js'\nimport { aggregatePaginate } from './utilities/aggregatePaginate.js'\nimport { buildJoinAggregation } from './utilities/buildJoinAggregation.js'\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getCollection } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\nimport { resolveJoins } from './utilities/resolveJoins.js'\nimport { transform } from './utilities/transform.js'\n\nexport const queryDrafts: QueryDrafts = async function queryDrafts(\n this: MongooseAdapter,\n {\n collection: collectionSlug,\n joins,\n limit,\n locale,\n page,\n pagination,\n req,\n select,\n sort: sortArg,\n where = {},\n },\n) {\n const { collectionConfig, Model } = getCollection({\n adapter: this,\n collectionSlug,\n versions: true,\n })\n\n let hasNearConstraint\n let sort\n\n if (where) {\n const constraints = flattenWhereToOperators(where)\n hasNearConstraint = constraints.some((prop) => Object.keys(prop).some((key) => key === 'near'))\n }\n\n const fields = buildVersionCollectionFields(this.payload.config, collectionConfig, true)\n\n const sortAggregation: PipelineStage[] = []\n if (!hasNearConstraint) {\n sort = buildSortParam({\n adapter: this,\n config: this.payload.config,\n fields,\n locale,\n sort: sortArg || collectionConfig.defaultSort,\n sortAggregation,\n timestamps: true,\n versions: true,\n })\n }\n\n const combinedWhere = combineQueries({ latest: { equals: true } }, where)\n\n const versionQuery = await buildQuery({\n adapter: this,\n fields,\n locale,\n where: combinedWhere,\n })\n\n const projection = buildProjectionFromSelect({\n adapter: this,\n fields,\n select,\n })\n\n const session = await getSession(this, req)\n const options: QueryOptions = {\n session,\n }\n\n // useEstimatedCount is faster, but not accurate, as it ignores any filters. It is thus set to true if there are no filters.\n const useEstimatedCount =\n hasNearConstraint || !versionQuery || Object.keys(versionQuery).length === 0\n const paginationOptions: PaginateOptions = {\n lean: true,\n leanWithId: true,\n options,\n page,\n pagination,\n projection,\n sort,\n useEstimatedCount,\n }\n\n if (this.collation) {\n const localizationConfig = this.payload.config.localization\n const defaultLocale =\n (typeof localizationConfig === 'object' && localizationConfig?.defaultLocale) || 'en'\n\n paginationOptions.collation = {\n locale: locale && locale !== 'all' && locale !== '*' ? locale : defaultLocale,\n ...this.collation,\n }\n }\n\n if (\n !useEstimatedCount &&\n Object.keys(versionQuery).length === 0 &&\n this.disableIndexHints !== true\n ) {\n // Improve the performance of the countDocuments query which is used if useEstimatedCount is set to false by adding\n // a hint. By default, if no hint is provided, MongoDB does not use an indexed field to count the returned documents,\n // which makes queries very slow. This only happens when no query (filter) is provided. If one is provided, it uses\n // the correct indexed field\n paginationOptions.useCustomCountFn = () => {\n return Promise.resolve(\n Model.countDocuments(versionQuery, {\n collation: paginationOptions.collation,\n hint: { _id: 1 },\n session,\n }),\n )\n }\n }\n\n if (limit && limit > 0) {\n paginationOptions.limit = limit\n // limit must also be set here, it's ignored when pagination is false\n\n paginationOptions.options!.limit = limit\n }\n\n let result\n\n const aggregate = await buildJoinAggregation({\n adapter: this,\n collection: collectionSlug,\n collectionConfig,\n joins,\n locale,\n projection,\n query: versionQuery,\n versions: true,\n })\n\n if (aggregate || sortAggregation.length > 0) {\n result = await aggregatePaginate({\n adapter: this,\n collation: paginationOptions.collation,\n joinAggregation: aggregate,\n limit: paginationOptions.limit,\n Model,\n page: paginationOptions.page,\n pagination: paginationOptions.pagination,\n projection: paginationOptions.projection,\n query: versionQuery,\n session: paginationOptions.options?.session ?? undefined,\n sort: paginationOptions.sort as object,\n sortAggregation,\n useEstimatedCount: paginationOptions.useEstimatedCount,\n })\n } else {\n result = await Model.paginate(versionQuery, paginationOptions)\n }\n\n if (!this.useJoinAggregations) {\n await resolveJoins({\n adapter: this,\n collectionSlug,\n docs: result.docs as Record<string, unknown>[],\n joins,\n locale,\n versions: true,\n })\n }\n\n transform({\n adapter: this,\n data: result.docs,\n fields: buildVersionCollectionFields(this.payload.config, collectionConfig),\n operation: 'read',\n })\n\n for (let i = 0; i < result.docs.length; i++) {\n const id = result.docs[i].parent\n result.docs[i] = result.docs[i].version ?? {}\n result.docs[i].id = id\n }\n\n return result\n}\n"],"names":["buildVersionCollectionFields","combineQueries","flattenWhereToOperators","buildQuery","buildSortParam","aggregatePaginate","buildJoinAggregation","buildProjectionFromSelect","getCollection","getSession","resolveJoins","transform","queryDrafts","collection","collectionSlug","joins","limit","locale","page","pagination","req","select","sort","sortArg","where","collectionConfig","Model","adapter","versions","hasNearConstraint","constraints","some","prop","Object","keys","key","fields","payload","config","sortAggregation","defaultSort","timestamps","combinedWhere","latest","equals","versionQuery","projection","session","options","useEstimatedCount","length","paginationOptions","lean","leanWithId","collation","localizationConfig","localization","defaultLocale","disableIndexHints","useCustomCountFn","Promise","resolve","countDocuments","hint","_id","result","aggregate","query","joinAggregation","undefined","paginate","useJoinAggregations","docs","data","operation","i","id","parent","version"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/queryDrafts.ts"],"sourcesContent":["import type { PaginateOptions, PipelineStage, QueryOptions } from 'mongoose'\nimport type { QueryDrafts } from 'payload'\n\nimport {\n buildVersionCollectionFields,\n combineQueries,\n flattenWhereToOperators,\n projectBranchVersionParent,\n resolveBranchReadState,\n resolveBranchVersionQuery,\n rewriteBranchVersionParents,\n withBranchVersionSelect,\n} from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildBranchVisibilityStages } from './queries/buildBranchVisibility.js'\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildSortParam } from './queries/buildSortParam.js'\nimport { aggregatePaginate } from './utilities/aggregatePaginate.js'\nimport { buildJoinAggregation } from './utilities/buildJoinAggregation.js'\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getCollection } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\nimport { resolveJoins } from './utilities/resolveJoins.js'\nimport { transform } from './utilities/transform.js'\n\nexport const queryDrafts: QueryDrafts = async function queryDrafts(\n this: MongooseAdapter,\n {\n branch,\n collection: collectionSlug,\n joins,\n limit,\n locale,\n page,\n pagination,\n req,\n select,\n sort: sortArg,\n where = {},\n },\n) {\n const { collectionConfig, Model } = getCollection({\n adapter: this,\n collectionSlug,\n versions: true,\n })\n const branchReadState = resolveBranchReadState({ branch, collectionSlug, req })\n\n let hasNearConstraint\n let sort\n\n if (where) {\n const constraints = flattenWhereToOperators(where)\n hasNearConstraint = constraints.some((prop) => Object.keys(prop).some((key) => key === 'near'))\n }\n\n const fields = buildVersionCollectionFields(this.payload.config, collectionConfig, true)\n\n const sortAggregation: PipelineStage[] = []\n if (!hasNearConstraint) {\n sort = buildSortParam({\n adapter: this,\n config: this.payload.config,\n fields,\n locale,\n sort: sortArg || collectionConfig.defaultSort,\n sortAggregation,\n timestamps: true,\n versions: true,\n })\n }\n\n const branchedWhere = branchReadState.useBranching\n ? rewriteBranchVersionParents(where)\n : await resolveBranchVersionQuery({\n branch,\n collectionSlug,\n req,\n where,\n })\n const branchVisibility = branchReadState.useBranching\n ? buildBranchVisibilityStages({\n adapter: this,\n branch: branchReadState.branch,\n collectionSlug,\n mode: 'drafts',\n })\n : []\n\n const combinedWhere = combineQueries({ latest: { equals: true } }, branchedWhere ?? {})\n\n const versionQuery = await buildQuery({\n adapter: this,\n branch,\n fields,\n locale,\n req,\n where: combinedWhere,\n })\n\n const projection = buildProjectionFromSelect({\n adapter: this,\n fields,\n select: withBranchVersionSelect({ branch, collectionSlug, req, select }),\n })\n\n const session = await getSession(this, req)\n const options: QueryOptions = {\n session,\n }\n\n // useEstimatedCount is faster, but not accurate, as it ignores any filters. It is thus set to true if there are no filters.\n const useEstimatedCount =\n !branchVisibility.length &&\n (hasNearConstraint || !versionQuery || Object.keys(versionQuery).length === 0)\n const paginationOptions: PaginateOptions = {\n lean: true,\n leanWithId: true,\n options,\n page,\n pagination,\n projection,\n sort,\n useEstimatedCount,\n }\n\n if (this.collation) {\n const localizationConfig = this.payload.config.localization\n const defaultLocale =\n (typeof localizationConfig === 'object' && localizationConfig?.defaultLocale) || 'en'\n\n paginationOptions.collation = {\n locale: locale && locale !== 'all' && locale !== '*' ? locale : defaultLocale,\n ...this.collation,\n }\n }\n\n if (\n !useEstimatedCount &&\n Object.keys(versionQuery).length === 0 &&\n this.disableIndexHints !== true\n ) {\n // Improve the performance of the countDocuments query which is used if useEstimatedCount is set to false by adding\n // a hint. By default, if no hint is provided, MongoDB does not use an indexed field to count the returned documents,\n // which makes queries very slow. This only happens when no query (filter) is provided. If one is provided, it uses\n // the correct indexed field\n paginationOptions.useCustomCountFn = () => {\n return Promise.resolve(\n Model.countDocuments(versionQuery, {\n collation: paginationOptions.collation,\n hint: { _id: 1 },\n session,\n }),\n )\n }\n }\n\n if (limit && limit > 0) {\n paginationOptions.limit = limit\n // limit must also be set here, it's ignored when pagination is false\n\n paginationOptions.options!.limit = limit\n }\n\n let result\n\n const aggregate = await buildJoinAggregation({\n adapter: this,\n branch,\n collection: collectionSlug,\n collectionConfig,\n joins,\n locale,\n projection,\n query: versionQuery,\n req,\n versions: true,\n })\n\n if (aggregate.length > 0 || branchVisibility.length > 0 || sortAggregation.length > 0) {\n result = await aggregatePaginate({\n adapter: this,\n branchVisibility,\n collation: paginationOptions.collation,\n joinAggregation: aggregate,\n limit: paginationOptions.limit,\n Model,\n page: paginationOptions.page,\n pagination: paginationOptions.pagination,\n projection: paginationOptions.projection,\n query: versionQuery,\n session: paginationOptions.options?.session ?? undefined,\n sort: paginationOptions.sort as object,\n sortAggregation,\n useEstimatedCount: paginationOptions.useEstimatedCount,\n })\n } else {\n result = await Model.paginate(versionQuery, paginationOptions)\n }\n\n if (!this.useJoinAggregations) {\n await resolveJoins({\n adapter: this,\n branch,\n collectionSlug,\n docs: result.docs as Record<string, unknown>[],\n joins,\n locale,\n req,\n versions: true,\n })\n }\n\n transform({\n adapter: this,\n data: result.docs,\n fields: buildVersionCollectionFields(this.payload.config, collectionConfig),\n operation: 'read',\n })\n\n for (let i = 0; i < result.docs.length; i++) {\n // A branch version's `parent` is the shadow row's primary key, so the\n // canonical document ID comes from `_branchParent` when present.\n const id = projectBranchVersionParent(result.docs[i] as Record<string, unknown>)\n result.docs[i] = result.docs[i].version ?? {}\n result.docs[i].id = id\n }\n\n return result\n}\n"],"names":["buildVersionCollectionFields","combineQueries","flattenWhereToOperators","projectBranchVersionParent","resolveBranchReadState","resolveBranchVersionQuery","rewriteBranchVersionParents","withBranchVersionSelect","buildBranchVisibilityStages","buildQuery","buildSortParam","aggregatePaginate","buildJoinAggregation","buildProjectionFromSelect","getCollection","getSession","resolveJoins","transform","queryDrafts","branch","collection","collectionSlug","joins","limit","locale","page","pagination","req","select","sort","sortArg","where","collectionConfig","Model","adapter","versions","branchReadState","hasNearConstraint","constraints","some","prop","Object","keys","key","fields","payload","config","sortAggregation","defaultSort","timestamps","branchedWhere","useBranching","branchVisibility","mode","combinedWhere","latest","equals","versionQuery","projection","session","options","useEstimatedCount","length","paginationOptions","lean","leanWithId","collation","localizationConfig","localization","defaultLocale","disableIndexHints","useCustomCountFn","Promise","resolve","countDocuments","hint","_id","result","aggregate","query","joinAggregation","undefined","paginate","useJoinAggregations","docs","data","operation","i","id","version"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"commitTransaction.d.ts","sourceRoot":"","sources":["../../src/transactions/commitTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAIhD,eAAO,MAAM,iBAAiB,EAAE,iBA4B/B,CAAA"}
1
+ {"version":3,"file":"commitTransaction.d.ts","sourceRoot":"","sources":["../../src/transactions/commitTransaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAShD,eAAO,MAAM,iBAAiB,EAAE,iBA8D/B,CAAA"}
@@ -1,23 +1,84 @@
1
+ const unknownCommitRetryTimeoutMilliseconds = 120_000;
2
+ const unknownCommitRetryInitialDelayMilliseconds = 5;
3
+ const unknownCommitRetryMaximumDelayMilliseconds = 500;
4
+ const unknownCommitRetryGrowth = 1.5;
1
5
  export const commitTransaction = async function commitTransaction(incomingID = '') {
2
6
  const transactionID = incomingID instanceof Promise ? await incomingID : incomingID;
3
7
  if (!this.sessions[transactionID]) {
4
8
  return;
5
9
  }
6
10
  if (!this.sessions[transactionID]?.inTransaction()) {
7
- // Clean up the orphaned session reference
8
- delete this.sessions[transactionID];
11
+ await endRegisteredSession({
12
+ adapter: this,
13
+ session: this.sessions[transactionID],
14
+ transactionID
15
+ });
9
16
  return;
10
17
  }
11
18
  const session = this.sessions[transactionID];
12
- // Delete from registry FIRST to prevent race conditions
13
- // This ensures other operations can't retrieve this session while we're ending it
14
- delete this.sessions[transactionID];
15
- await session.commitTransaction();
19
+ const retryDeadline = Date.now() + unknownCommitRetryTimeoutMilliseconds;
20
+ let retryIndex = 0;
21
+ while(true){
22
+ try {
23
+ const remainingMilliseconds = Math.max(retryDeadline - Date.now(), 1);
24
+ const timeoutMS = session.timeoutMS && session.timeoutMS > 0 ? Math.min(session.timeoutMS, remainingMilliseconds) : remainingMilliseconds;
25
+ await session.commitTransaction({
26
+ timeoutMS
27
+ });
28
+ await endRegisteredSession({
29
+ adapter: this,
30
+ session,
31
+ transactionID
32
+ });
33
+ return;
34
+ } catch (error) {
35
+ if (!isUnknownTransactionCommitResult(error)) {
36
+ throw error;
37
+ }
38
+ const retryDelayMilliseconds = Math.random() * Math.min(unknownCommitRetryInitialDelayMilliseconds * unknownCommitRetryGrowth ** retryIndex, unknownCommitRetryMaximumDelayMilliseconds);
39
+ if (isMaxTimeExpiredError(error) || Date.now() + retryDelayMilliseconds >= retryDeadline) {
40
+ await endRegisteredSession({
41
+ adapter: this,
42
+ session,
43
+ transactionID
44
+ });
45
+ throw error;
46
+ }
47
+ await new Promise((resolve)=>setTimeout(resolve, retryDelayMilliseconds));
48
+ // The retry delay can resume late if the event loop is busy.
49
+ if (Date.now() >= retryDeadline) {
50
+ await endRegisteredSession({
51
+ adapter: this,
52
+ session,
53
+ transactionID
54
+ });
55
+ throw error;
56
+ }
57
+ retryIndex += 1;
58
+ }
59
+ }
60
+ };
61
+ const endRegisteredSession = async ({ adapter, session, transactionID })=>{
62
+ delete adapter.sessions[transactionID];
16
63
  try {
17
64
  await session.endSession();
18
65
  } catch (_) {
19
- // ending sessions is only best effort and won't impact anything if it fails since the transaction was committed
66
+ // Ending the session is best effort after commit succeeds or its result remains unknown.
67
+ }
68
+ };
69
+ const isMaxTimeExpiredError = (error)=>{
70
+ if (!error || typeof error !== 'object') {
71
+ return false;
72
+ }
73
+ const mongoError = error;
74
+ return mongoError.code === 50 || mongoError.codeName === 'MaxTimeMSExpired';
75
+ };
76
+ const isUnknownTransactionCommitResult = (error)=>{
77
+ if (!error || typeof error !== 'object') {
78
+ return false;
20
79
  }
80
+ const labeledError = error;
81
+ return labeledError.hasErrorLabel?.('UnknownTransactionCommitResult') === true || labeledError.errorLabels?.includes('UnknownTransactionCommitResult') === true;
21
82
  };
22
83
 
23
84
  //# sourceMappingURL=commitTransaction.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/transactions/commitTransaction.ts"],"sourcesContent":["import type { CommitTransaction } from 'payload'\n\nimport type { MongooseAdapter } from '../index.js'\n\nexport const commitTransaction: CommitTransaction = async function commitTransaction(\n this: MongooseAdapter,\n incomingID = '',\n) {\n const transactionID = incomingID instanceof Promise ? await incomingID : incomingID\n\n if (!this.sessions[transactionID]) {\n return\n }\n\n if (!this.sessions[transactionID]?.inTransaction()) {\n // Clean up the orphaned session reference\n delete this.sessions[transactionID]\n return\n }\n\n const session = this.sessions[transactionID]\n\n // Delete from registry FIRST to prevent race conditions\n // This ensures other operations can't retrieve this session while we're ending it\n delete this.sessions[transactionID]\n\n await session.commitTransaction()\n try {\n await session.endSession()\n } catch (_) {\n // ending sessions is only best effort and won't impact anything if it fails since the transaction was committed\n }\n}\n"],"names":["commitTransaction","incomingID","transactionID","Promise","sessions","inTransaction","session","endSession","_"],"mappings":"AAIA,OAAO,MAAMA,oBAAuC,eAAeA,kBAEjEC,aAAa,EAAE;IAEf,MAAMC,gBAAgBD,sBAAsBE,UAAU,MAAMF,aAAaA;IAEzE,IAAI,CAAC,IAAI,CAACG,QAAQ,CAACF,cAAc,EAAE;QACjC;IACF;IAEA,IAAI,CAAC,IAAI,CAACE,QAAQ,CAACF,cAAc,EAAEG,iBAAiB;QAClD,0CAA0C;QAC1C,OAAO,IAAI,CAACD,QAAQ,CAACF,cAAc;QACnC;IACF;IAEA,MAAMI,UAAU,IAAI,CAACF,QAAQ,CAACF,cAAc;IAE5C,wDAAwD;IACxD,kFAAkF;IAClF,OAAO,IAAI,CAACE,QAAQ,CAACF,cAAc;IAEnC,MAAMI,QAAQN,iBAAiB;IAC/B,IAAI;QACF,MAAMM,QAAQC,UAAU;IAC1B,EAAE,OAAOC,GAAG;IACV,gHAAgH;IAClH;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/transactions/commitTransaction.ts"],"sourcesContent":["import type { ClientSession } from 'mongodb'\nimport type { CommitTransaction } from 'payload'\n\nimport type { MongooseAdapter } from '../index.js'\n\nconst unknownCommitRetryTimeoutMilliseconds = 120_000\nconst unknownCommitRetryInitialDelayMilliseconds = 5\nconst unknownCommitRetryMaximumDelayMilliseconds = 500\nconst unknownCommitRetryGrowth = 1.5\n\nexport const commitTransaction: CommitTransaction = async function commitTransaction(\n this: MongooseAdapter,\n incomingID = '',\n) {\n const transactionID = incomingID instanceof Promise ? await incomingID : incomingID\n\n if (!this.sessions[transactionID]) {\n return\n }\n\n if (!this.sessions[transactionID]?.inTransaction()) {\n await endRegisteredSession({\n adapter: this,\n session: this.sessions[transactionID],\n transactionID,\n })\n return\n }\n\n const session = this.sessions[transactionID]\n const retryDeadline = Date.now() + unknownCommitRetryTimeoutMilliseconds\n let retryIndex = 0\n\n while (true) {\n try {\n const remainingMilliseconds = Math.max(retryDeadline - Date.now(), 1)\n const timeoutMS =\n session.timeoutMS && session.timeoutMS > 0\n ? Math.min(session.timeoutMS, remainingMilliseconds)\n : remainingMilliseconds\n\n await session.commitTransaction({ timeoutMS })\n await endRegisteredSession({ adapter: this, session, transactionID })\n return\n } catch (error) {\n if (!isUnknownTransactionCommitResult(error)) {\n throw error\n }\n\n const retryDelayMilliseconds =\n Math.random() *\n Math.min(\n unknownCommitRetryInitialDelayMilliseconds * unknownCommitRetryGrowth ** retryIndex,\n unknownCommitRetryMaximumDelayMilliseconds,\n )\n\n if (isMaxTimeExpiredError(error) || Date.now() + retryDelayMilliseconds >= retryDeadline) {\n await endRegisteredSession({ adapter: this, session, transactionID })\n throw error\n }\n\n await new Promise((resolve) => setTimeout(resolve, retryDelayMilliseconds))\n\n // The retry delay can resume late if the event loop is busy.\n if (Date.now() >= retryDeadline) {\n await endRegisteredSession({ adapter: this, session, transactionID })\n throw error\n }\n\n retryIndex += 1\n }\n }\n}\n\nconst endRegisteredSession = async ({\n adapter,\n session,\n transactionID,\n}: {\n adapter: MongooseAdapter\n session: ClientSession\n transactionID: number | string\n}): Promise<void> => {\n delete adapter.sessions[transactionID]\n\n try {\n await session.endSession()\n } catch (_) {\n // Ending the session is best effort after commit succeeds or its result remains unknown.\n }\n}\n\nconst isMaxTimeExpiredError = (error: unknown): boolean => {\n if (!error || typeof error !== 'object') {\n return false\n }\n\n const mongoError = error as { code?: number; codeName?: string }\n\n return mongoError.code === 50 || mongoError.codeName === 'MaxTimeMSExpired'\n}\n\nconst isUnknownTransactionCommitResult = (error: unknown): boolean => {\n if (!error || typeof error !== 'object') {\n return false\n }\n\n const labeledError = error as {\n errorLabels?: string[]\n hasErrorLabel?: (label: string) => boolean\n }\n\n return (\n labeledError.hasErrorLabel?.('UnknownTransactionCommitResult') === true ||\n labeledError.errorLabels?.includes('UnknownTransactionCommitResult') === true\n )\n}\n"],"names":["unknownCommitRetryTimeoutMilliseconds","unknownCommitRetryInitialDelayMilliseconds","unknownCommitRetryMaximumDelayMilliseconds","unknownCommitRetryGrowth","commitTransaction","incomingID","transactionID","Promise","sessions","inTransaction","endRegisteredSession","adapter","session","retryDeadline","Date","now","retryIndex","remainingMilliseconds","Math","max","timeoutMS","min","error","isUnknownTransactionCommitResult","retryDelayMilliseconds","random","isMaxTimeExpiredError","resolve","setTimeout","endSession","_","mongoError","code","codeName","labeledError","hasErrorLabel","errorLabels","includes"],"mappings":"AAKA,MAAMA,wCAAwC;AAC9C,MAAMC,6CAA6C;AACnD,MAAMC,6CAA6C;AACnD,MAAMC,2BAA2B;AAEjC,OAAO,MAAMC,oBAAuC,eAAeA,kBAEjEC,aAAa,EAAE;IAEf,MAAMC,gBAAgBD,sBAAsBE,UAAU,MAAMF,aAAaA;IAEzE,IAAI,CAAC,IAAI,CAACG,QAAQ,CAACF,cAAc,EAAE;QACjC;IACF;IAEA,IAAI,CAAC,IAAI,CAACE,QAAQ,CAACF,cAAc,EAAEG,iBAAiB;QAClD,MAAMC,qBAAqB;YACzBC,SAAS,IAAI;YACbC,SAAS,IAAI,CAACJ,QAAQ,CAACF,cAAc;YACrCA;QACF;QACA;IACF;IAEA,MAAMM,UAAU,IAAI,CAACJ,QAAQ,CAACF,cAAc;IAC5C,MAAMO,gBAAgBC,KAAKC,GAAG,KAAKf;IACnC,IAAIgB,aAAa;IAEjB,MAAO,KAAM;QACX,IAAI;YACF,MAAMC,wBAAwBC,KAAKC,GAAG,CAACN,gBAAgBC,KAAKC,GAAG,IAAI;YACnE,MAAMK,YACJR,QAAQQ,SAAS,IAAIR,QAAQQ,SAAS,GAAG,IACrCF,KAAKG,GAAG,CAACT,QAAQQ,SAAS,EAAEH,yBAC5BA;YAEN,MAAML,QAAQR,iBAAiB,CAAC;gBAAEgB;YAAU;YAC5C,MAAMV,qBAAqB;gBAAEC,SAAS,IAAI;gBAAEC;gBAASN;YAAc;YACnE;QACF,EAAE,OAAOgB,OAAO;YACd,IAAI,CAACC,iCAAiCD,QAAQ;gBAC5C,MAAMA;YACR;YAEA,MAAME,yBACJN,KAAKO,MAAM,KACXP,KAAKG,GAAG,CACNpB,6CAA6CE,4BAA4Ba,YACzEd;YAGJ,IAAIwB,sBAAsBJ,UAAUR,KAAKC,GAAG,KAAKS,0BAA0BX,eAAe;gBACxF,MAAMH,qBAAqB;oBAAEC,SAAS,IAAI;oBAAEC;oBAASN;gBAAc;gBACnE,MAAMgB;YACR;YAEA,MAAM,IAAIf,QAAQ,CAACoB,UAAYC,WAAWD,SAASH;YAEnD,6DAA6D;YAC7D,IAAIV,KAAKC,GAAG,MAAMF,eAAe;gBAC/B,MAAMH,qBAAqB;oBAAEC,SAAS,IAAI;oBAAEC;oBAASN;gBAAc;gBACnE,MAAMgB;YACR;YAEAN,cAAc;QAChB;IACF;AACF,EAAC;AAED,MAAMN,uBAAuB,OAAO,EAClCC,OAAO,EACPC,OAAO,EACPN,aAAa,EAKd;IACC,OAAOK,QAAQH,QAAQ,CAACF,cAAc;IAEtC,IAAI;QACF,MAAMM,QAAQiB,UAAU;IAC1B,EAAE,OAAOC,GAAG;IACV,yFAAyF;IAC3F;AACF;AAEA,MAAMJ,wBAAwB,CAACJ;IAC7B,IAAI,CAACA,SAAS,OAAOA,UAAU,UAAU;QACvC,OAAO;IACT;IAEA,MAAMS,aAAaT;IAEnB,OAAOS,WAAWC,IAAI,KAAK,MAAMD,WAAWE,QAAQ,KAAK;AAC3D;AAEA,MAAMV,mCAAmC,CAACD;IACxC,IAAI,CAACA,SAAS,OAAOA,UAAU,UAAU;QACvC,OAAO;IACT;IAEA,MAAMY,eAAeZ;IAKrB,OACEY,aAAaC,aAAa,GAAG,sCAAsC,QACnED,aAAaE,WAAW,EAAEC,SAAS,sCAAsC;AAE7E"}
@@ -1 +1 @@
1
- {"version":3,"file":"rollbackTransaction.d.ts","sourceRoot":"","sources":["../../src/transactions/rollbackTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAIlD,eAAO,MAAM,mBAAmB,EAAE,mBAgCjC,CAAA"}
1
+ {"version":3,"file":"rollbackTransaction.d.ts","sourceRoot":"","sources":["../../src/transactions/rollbackTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAIlD,eAAO,MAAM,mBAAmB,EAAE,mBAiCjC,CAAA"}
@@ -5,22 +5,23 @@ export const rollbackTransaction = async function rollbackTransaction(incomingID
5
5
  if (!this.sessions[transactionID]) {
6
6
  return;
7
7
  }
8
- // when session exists but is not inTransaction something unexpected is happening to the session
9
- if (!this.sessions[transactionID]?.inTransaction()) {
10
- this.payload.logger.warn('rollbackTransaction called when no transaction exists');
11
- delete this.sessions[transactionID];
12
- return;
13
- }
14
8
  const session = this.sessions[transactionID];
15
9
  // Delete from registry FIRST to prevent race conditions
16
10
  // This ensures other operations can't retrieve this session while we're aborting it
17
11
  delete this.sessions[transactionID];
18
- // the first call for rollback should be aborted and deleted causing any other operations with the same transaction to fail
12
+ if (session.inTransaction()) {
13
+ try {
14
+ await session.abortTransaction();
15
+ } catch (_error) {
16
+ // ignore the error as it is likely a race condition from multiple errors
17
+ }
18
+ } else {
19
+ this.payload.logger.warn('rollbackTransaction called when no transaction exists');
20
+ }
19
21
  try {
20
- await session.abortTransaction();
21
22
  await session.endSession();
22
23
  } catch (_error) {
23
- // ignore the error as it is likely a race condition from multiple errors
24
+ // ending a session is best effort after its transaction has failed or been aborted
24
25
  }
25
26
  };
26
27
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/transactions/rollbackTransaction.ts"],"sourcesContent":["import type { RollbackTransaction } from 'payload'\n\nimport type { MongooseAdapter } from '../index.js'\n\nexport const rollbackTransaction: RollbackTransaction = async function rollbackTransaction(\n this: MongooseAdapter,\n incomingID = '',\n) {\n const transactionID = incomingID instanceof Promise ? await incomingID : incomingID\n\n // if multiple operations are using the same transaction, the first will flow through and delete the session.\n // subsequent calls should be ignored.\n if (!this.sessions[transactionID]) {\n return\n }\n\n // when session exists but is not inTransaction something unexpected is happening to the session\n if (!this.sessions[transactionID]?.inTransaction()) {\n this.payload.logger.warn('rollbackTransaction called when no transaction exists')\n delete this.sessions[transactionID]\n return\n }\n\n const session = this.sessions[transactionID]\n\n // Delete from registry FIRST to prevent race conditions\n // This ensures other operations can't retrieve this session while we're aborting it\n delete this.sessions[transactionID]\n\n // the first call for rollback should be aborted and deleted causing any other operations with the same transaction to fail\n try {\n await session.abortTransaction()\n await session.endSession()\n } catch (_error) {\n // ignore the error as it is likely a race condition from multiple errors\n }\n}\n"],"names":["rollbackTransaction","incomingID","transactionID","Promise","sessions","inTransaction","payload","logger","warn","session","abortTransaction","endSession","_error"],"mappings":"AAIA,OAAO,MAAMA,sBAA2C,eAAeA,oBAErEC,aAAa,EAAE;IAEf,MAAMC,gBAAgBD,sBAAsBE,UAAU,MAAMF,aAAaA;IAEzE,6GAA6G;IAC7G,sCAAsC;IACtC,IAAI,CAAC,IAAI,CAACG,QAAQ,CAACF,cAAc,EAAE;QACjC;IACF;IAEA,gGAAgG;IAChG,IAAI,CAAC,IAAI,CAACE,QAAQ,CAACF,cAAc,EAAEG,iBAAiB;QAClD,IAAI,CAACC,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC;QACzB,OAAO,IAAI,CAACJ,QAAQ,CAACF,cAAc;QACnC;IACF;IAEA,MAAMO,UAAU,IAAI,CAACL,QAAQ,CAACF,cAAc;IAE5C,wDAAwD;IACxD,oFAAoF;IACpF,OAAO,IAAI,CAACE,QAAQ,CAACF,cAAc;IAEnC,2HAA2H;IAC3H,IAAI;QACF,MAAMO,QAAQC,gBAAgB;QAC9B,MAAMD,QAAQE,UAAU;IAC1B,EAAE,OAAOC,QAAQ;IACf,yEAAyE;IAC3E;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/transactions/rollbackTransaction.ts"],"sourcesContent":["import type { RollbackTransaction } from 'payload'\n\nimport type { MongooseAdapter } from '../index.js'\n\nexport const rollbackTransaction: RollbackTransaction = async function rollbackTransaction(\n this: MongooseAdapter,\n incomingID = '',\n) {\n const transactionID = incomingID instanceof Promise ? await incomingID : incomingID\n\n // if multiple operations are using the same transaction, the first will flow through and delete the session.\n // subsequent calls should be ignored.\n if (!this.sessions[transactionID]) {\n return\n }\n\n const session = this.sessions[transactionID]\n\n // Delete from registry FIRST to prevent race conditions\n // This ensures other operations can't retrieve this session while we're aborting it\n delete this.sessions[transactionID]\n\n if (session.inTransaction()) {\n try {\n await session.abortTransaction()\n } catch (_error) {\n // ignore the error as it is likely a race condition from multiple errors\n }\n } else {\n this.payload.logger.warn('rollbackTransaction called when no transaction exists')\n }\n\n try {\n await session.endSession()\n } catch (_error) {\n // ending a session is best effort after its transaction has failed or been aborted\n }\n}\n"],"names":["rollbackTransaction","incomingID","transactionID","Promise","sessions","session","inTransaction","abortTransaction","_error","payload","logger","warn","endSession"],"mappings":"AAIA,OAAO,MAAMA,sBAA2C,eAAeA,oBAErEC,aAAa,EAAE;IAEf,MAAMC,gBAAgBD,sBAAsBE,UAAU,MAAMF,aAAaA;IAEzE,6GAA6G;IAC7G,sCAAsC;IACtC,IAAI,CAAC,IAAI,CAACG,QAAQ,CAACF,cAAc,EAAE;QACjC;IACF;IAEA,MAAMG,UAAU,IAAI,CAACD,QAAQ,CAACF,cAAc;IAE5C,wDAAwD;IACxD,oFAAoF;IACpF,OAAO,IAAI,CAACE,QAAQ,CAACF,cAAc;IAEnC,IAAIG,QAAQC,aAAa,IAAI;QAC3B,IAAI;YACF,MAAMD,QAAQE,gBAAgB;QAChC,EAAE,OAAOC,QAAQ;QACf,yEAAyE;QAC3E;IACF,OAAO;QACL,IAAI,CAACC,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC;IAC3B;IAEA,IAAI;QACF,MAAMN,QAAQO,UAAU;IAC1B,EAAE,OAAOJ,QAAQ;IACf,mFAAmF;IACrF;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"updateGlobal.d.ts","sourceRoot":"","sources":["../src/updateGlobal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAS3C,eAAO,MAAM,YAAY,EAAE,YAsC1B,CAAA"}
1
+ {"version":3,"file":"updateGlobal.d.ts","sourceRoot":"","sources":["../src/updateGlobal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,SAAS,CAAA;AAe7D,eAAO,MAAM,YAAY,EAAE,YA6F1B,CAAA"}
@@ -1,8 +1,10 @@
1
+ import { resolveBranchGlobalWrite } from 'payload';
1
2
  import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js';
2
3
  import { getGlobal } from './utilities/getEntity.js';
3
4
  import { getSession } from './utilities/getSession.js';
4
5
  import { transform } from './utilities/transform.js';
5
- export const updateGlobal = async function updateGlobal({ slug: globalSlug, data, options: optionsArgs = {}, req, returning, select }) {
6
+ export const updateGlobal = async function updateGlobal(args) {
7
+ const { slug: globalSlug, branch, branchConflictData, data, options: optionsArgs = {}, req, returning, select } = args;
6
8
  const { globalConfig, Model } = getGlobal({
7
9
  adapter: this,
8
10
  globalSlug
@@ -15,6 +17,15 @@ export const updateGlobal = async function updateGlobal({ slug: globalSlug, data
15
17
  globalSlug,
16
18
  operation: 'write'
17
19
  });
20
+ if (branchConflictData) {
21
+ transform({
22
+ adapter: this,
23
+ data: branchConflictData,
24
+ fields,
25
+ globalSlug,
26
+ operation: 'write'
27
+ });
28
+ }
18
29
  const baseOptions = {
19
30
  ...optionsArgs,
20
31
  session: await getSession(this, req),
@@ -24,22 +35,93 @@ export const updateGlobal = async function updateGlobal({ slug: globalSlug, data
24
35
  const findOptions = {
25
36
  ...baseOptions,
26
37
  lean: true,
27
- new: true,
28
38
  projection: buildProjectionFromSelect({
29
39
  adapter: this,
30
40
  fields: globalConfig.flattenedFields,
31
41
  select
32
- })
42
+ }),
43
+ returnDocument: 'after'
33
44
  };
34
- if (returning === false) {
35
- await Model.updateOne({
45
+ const writeBranch = resolveBranchGlobalWrite({
46
+ branch,
47
+ globalSlug,
48
+ req
49
+ });
50
+ const isBranchableGlobal = this.payload.config.branching?.branchableGlobals.has(globalSlug);
51
+ // On a branch the write targets that branch's own row, upserting it from
52
+ // main's current content the first time the global is touched.
53
+ const filter = writeBranch ? {
54
+ _branch: {
55
+ $eq: writeBranch
56
+ },
57
+ globalType: globalSlug
58
+ } : isBranchableGlobal ? {
59
+ $or: [
60
+ {
61
+ _branch: 'main'
62
+ },
63
+ {
64
+ _branch: {
65
+ $exists: false
66
+ }
67
+ },
68
+ {
69
+ _branch: null
70
+ }
71
+ ],
72
+ globalType: globalSlug
73
+ } : {
74
+ globalType: globalSlug
75
+ };
76
+ if (writeBranch) {
77
+ const mainDoc = await Model.findOne({
78
+ _branch: {
79
+ $eq: 'main'
80
+ },
36
81
  globalType: globalSlug
37
- }, data, baseOptions);
82
+ }, {}, baseOptions).lean();
83
+ const { _id, __v, ...mainData } = mainDoc ?? {};
84
+ const writeData = {
85
+ ...branchConflictData ?? data,
86
+ _branch: writeBranch
87
+ };
88
+ const insertData = {
89
+ ...mainData,
90
+ globalType: globalSlug
91
+ };
92
+ for (const key of Object.keys(writeData)){
93
+ delete insertData[key];
94
+ }
95
+ const upsertOptions = {
96
+ ...findOptions,
97
+ upsert: true
98
+ };
99
+ const update = {
100
+ $set: writeData,
101
+ $setOnInsert: insertData
102
+ };
103
+ if (returning === false) {
104
+ await Model.findOneAndUpdate(filter, update, {
105
+ ...baseOptions,
106
+ upsert: true
107
+ });
108
+ return null;
109
+ }
110
+ const result = await Model.findOneAndUpdate(filter, update, upsertOptions);
111
+ transform({
112
+ adapter: this,
113
+ data: result,
114
+ fields,
115
+ globalSlug,
116
+ operation: 'read'
117
+ });
118
+ return result;
119
+ }
120
+ if (returning === false) {
121
+ await Model.updateOne(filter, data, baseOptions);
38
122
  return null;
39
123
  }
40
- const result = await Model.findOneAndUpdate({
41
- globalType: globalSlug
42
- }, data, findOptions);
124
+ const result = await Model.findOneAndUpdate(filter, data, findOptions);
43
125
  transform({
44
126
  adapter: this,
45
127
  data: result,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/updateGlobal.ts"],"sourcesContent":["import type { QueryOptions } from 'mongoose'\nimport type { UpdateGlobal } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getGlobal } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\nimport { transform } from './utilities/transform.js'\n\nexport const updateGlobal: UpdateGlobal = async function updateGlobal(\n this: MongooseAdapter,\n { slug: globalSlug, data, options: optionsArgs = {}, req, returning, select },\n) {\n const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug })\n\n const fields = globalConfig.fields\n\n transform({ adapter: this, data, fields, globalSlug, operation: 'write' })\n\n const baseOptions = {\n ...optionsArgs,\n session: await getSession(this, req),\n // Timestamps are manually added by the write transform\n timestamps: false,\n } satisfies QueryOptions\n\n const findOptions: QueryOptions = {\n ...baseOptions,\n lean: true,\n new: true,\n projection: buildProjectionFromSelect({\n adapter: this,\n fields: globalConfig.flattenedFields,\n select,\n }),\n }\n\n if (returning === false) {\n await Model.updateOne({ globalType: globalSlug }, data, baseOptions)\n return null\n }\n\n const result: any = await Model.findOneAndUpdate({ globalType: globalSlug }, data, findOptions)\n\n transform({ adapter: this, data: result, fields, globalSlug, operation: 'read' })\n\n return result\n}\n"],"names":["buildProjectionFromSelect","getGlobal","getSession","transform","updateGlobal","slug","globalSlug","data","options","optionsArgs","req","returning","select","globalConfig","Model","adapter","fields","operation","baseOptions","session","timestamps","findOptions","lean","new","projection","flattenedFields","updateOne","globalType","result","findOneAndUpdate"],"mappings":"AAKA,SAASA,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,SAAS,QAAQ,2BAA0B;AACpD,SAASC,UAAU,QAAQ,4BAA2B;AACtD,SAASC,SAAS,QAAQ,2BAA0B;AAEpD,OAAO,MAAMC,eAA6B,eAAeA,aAEvD,EAAEC,MAAMC,UAAU,EAAEC,IAAI,EAAEC,SAASC,cAAc,CAAC,CAAC,EAAEC,GAAG,EAAEC,SAAS,EAAEC,MAAM,EAAE;IAE7E,MAAM,EAAEC,YAAY,EAAEC,KAAK,EAAE,GAAGb,UAAU;QAAEc,SAAS,IAAI;QAAET;IAAW;IAEtE,MAAMU,SAASH,aAAaG,MAAM;IAElCb,UAAU;QAAEY,SAAS,IAAI;QAAER;QAAMS;QAAQV;QAAYW,WAAW;IAAQ;IAExE,MAAMC,cAAc;QAClB,GAAGT,WAAW;QACdU,SAAS,MAAMjB,WAAW,IAAI,EAAEQ;QAChC,uDAAuD;QACvDU,YAAY;IACd;IAEA,MAAMC,cAA4B;QAChC,GAAGH,WAAW;QACdI,MAAM;QACNC,KAAK;QACLC,YAAYxB,0BAA0B;YACpCe,SAAS,IAAI;YACbC,QAAQH,aAAaY,eAAe;YACpCb;QACF;IACF;IAEA,IAAID,cAAc,OAAO;QACvB,MAAMG,MAAMY,SAAS,CAAC;YAAEC,YAAYrB;QAAW,GAAGC,MAAMW;QACxD,OAAO;IACT;IAEA,MAAMU,SAAc,MAAMd,MAAMe,gBAAgB,CAAC;QAAEF,YAAYrB;IAAW,GAAGC,MAAMc;IAEnFlB,UAAU;QAAEY,SAAS,IAAI;QAAER,MAAMqB;QAAQZ;QAAQV;QAAYW,WAAW;IAAO;IAE/E,OAAOW;AACT,EAAC"}
1
+ {"version":3,"sources":["../src/updateGlobal.ts"],"sourcesContent":["import type { QueryOptions } from 'mongoose'\nimport type { UpdateGlobal, UpdateGlobalArgs } from 'payload'\n\nimport { resolveBranchGlobalWrite } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getGlobal } from './utilities/getEntity.js'\nimport { getSession } from './utilities/getSession.js'\nimport { transform } from './utilities/transform.js'\n\ntype BranchUpdateGlobalArgs<T extends Record<string, unknown>> = {\n branchConflictData?: Record<string, unknown>\n} & UpdateGlobalArgs<T>\n\nexport const updateGlobal: UpdateGlobal = async function updateGlobal<\n T extends Record<string, unknown>,\n>(this: MongooseAdapter, args: UpdateGlobalArgs<T>) {\n const {\n slug: globalSlug,\n branch,\n branchConflictData,\n data,\n options: optionsArgs = {},\n req,\n returning,\n select,\n } = args as BranchUpdateGlobalArgs<T>\n const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug })\n\n const fields = globalConfig.fields\n\n transform({ adapter: this, data, fields, globalSlug, operation: 'write' })\n if (branchConflictData) {\n transform({ adapter: this, data: branchConflictData, fields, globalSlug, operation: 'write' })\n }\n\n const baseOptions = {\n ...optionsArgs,\n session: await getSession(this, req),\n // Timestamps are manually added by the write transform\n timestamps: false,\n } satisfies QueryOptions\n\n const findOptions: QueryOptions = {\n ...baseOptions,\n lean: true,\n projection: buildProjectionFromSelect({\n adapter: this,\n fields: globalConfig.flattenedFields,\n select,\n }),\n returnDocument: 'after',\n }\n\n const writeBranch = resolveBranchGlobalWrite({ branch, globalSlug, req })\n const isBranchableGlobal = this.payload.config.branching?.branchableGlobals.has(globalSlug)\n\n // On a branch the write targets that branch's own row, upserting it from\n // main's current content the first time the global is touched.\n const filter = writeBranch\n ? { _branch: { $eq: writeBranch }, globalType: globalSlug }\n : isBranchableGlobal\n ? {\n $or: [{ _branch: 'main' }, { _branch: { $exists: false } }, { _branch: null }],\n globalType: globalSlug,\n }\n : { globalType: globalSlug }\n\n if (writeBranch) {\n const mainDoc = await Model.findOne(\n { _branch: { $eq: 'main' }, globalType: globalSlug },\n {},\n baseOptions,\n ).lean()\n const { _id, __v, ...mainData } = (mainDoc ?? {}) as Record<string, unknown>\n const writeData = { ...((branchConflictData ?? data) as object), _branch: writeBranch }\n const insertData: Record<string, unknown> = { ...mainData, globalType: globalSlug }\n\n for (const key of Object.keys(writeData)) {\n delete insertData[key]\n }\n\n const upsertOptions = { ...findOptions, upsert: true }\n const update = { $set: writeData, $setOnInsert: insertData }\n\n if (returning === false) {\n await Model.findOneAndUpdate(filter, update, { ...baseOptions, upsert: true })\n return null as unknown as T\n }\n\n const result = (await Model.findOneAndUpdate(filter, update, upsertOptions)) as unknown as T\n\n transform({ adapter: this, data: result, fields, globalSlug, operation: 'read' })\n\n return result\n }\n\n if (returning === false) {\n await Model.updateOne(filter, data, baseOptions)\n return null as unknown as T\n }\n\n const result = (await Model.findOneAndUpdate(filter, data, findOptions)) as unknown as T\n\n transform({ adapter: this, data: result, fields, globalSlug, operation: 'read' })\n\n return result\n}\n"],"names":["resolveBranchGlobalWrite","buildProjectionFromSelect","getGlobal","getSession","transform","updateGlobal","args","slug","globalSlug","branch","branchConflictData","data","options","optionsArgs","req","returning","select","globalConfig","Model","adapter","fields","operation","baseOptions","session","timestamps","findOptions","lean","projection","flattenedFields","returnDocument","writeBranch","isBranchableGlobal","payload","config","branching","branchableGlobals","has","filter","_branch","$eq","globalType","$or","$exists","mainDoc","findOne","_id","__v","mainData","writeData","insertData","key","Object","keys","upsertOptions","upsert","update","$set","$setOnInsert","findOneAndUpdate","result","updateOne"],"mappings":"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"}