@payloadcms/db-mongodb 4.0.0-internal.17c142b → 4.0.0-internal.1a2a79e

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 (197) hide show
  1. package/LICENSE.md +1 -1
  2. package/dist/connect.d.ts.map +1 -1
  3. package/dist/connect.js +9 -2
  4. package/dist/connect.js.map +1 -1
  5. package/dist/count.d.ts.map +1 -1
  6. package/dist/count.js +33 -4
  7. package/dist/count.js.map +1 -1
  8. package/dist/countGlobalVersions.d.ts.map +1 -1
  9. package/dist/countGlobalVersions.js +1 -0
  10. package/dist/countGlobalVersions.js.map +1 -1
  11. package/dist/countVersions.d.ts.map +1 -1
  12. package/dist/countVersions.js +36 -4
  13. package/dist/countVersions.js.map +1 -1
  14. package/dist/create.d.ts.map +1 -1
  15. package/dist/create.js +2 -1
  16. package/dist/create.js.map +1 -1
  17. package/dist/createGlobalVersion.d.ts +1 -1
  18. package/dist/createGlobalVersion.d.ts.map +1 -1
  19. package/dist/createGlobalVersion.js +23 -2
  20. package/dist/createGlobalVersion.js.map +1 -1
  21. package/dist/createMigration.d.ts.map +1 -1
  22. package/dist/createMigration.js +9 -2
  23. package/dist/createMigration.js.map +1 -1
  24. package/dist/createVersion.d.ts.map +1 -1
  25. package/dist/createVersion.js +17 -4
  26. package/dist/createVersion.js.map +1 -1
  27. package/dist/deleteBranchGlobal.d.ts +10 -0
  28. package/dist/deleteBranchGlobal.d.ts.map +1 -0
  29. package/dist/deleteBranchGlobal.js +22 -0
  30. package/dist/deleteBranchGlobal.js.map +1 -0
  31. package/dist/deleteMany.d.ts.map +1 -1
  32. package/dist/deleteMany.js +1 -0
  33. package/dist/deleteMany.js.map +1 -1
  34. package/dist/deleteOne.d.ts.map +1 -1
  35. package/dist/deleteOne.js +20 -1
  36. package/dist/deleteOne.js.map +1 -1
  37. package/dist/deleteVersions.d.ts.map +1 -1
  38. package/dist/deleteVersions.js +1 -0
  39. package/dist/deleteVersions.js.map +1 -1
  40. package/dist/exports/migration-utils.d.ts +2 -0
  41. package/dist/exports/migration-utils.d.ts.map +1 -1
  42. package/dist/exports/migration-utils.js +2 -0
  43. package/dist/exports/migration-utils.js.map +1 -1
  44. package/dist/find.d.ts.map +1 -1
  45. package/dist/find.js +44 -8
  46. package/dist/find.js.map +1 -1
  47. package/dist/findDistinct.d.ts.map +1 -1
  48. package/dist/findDistinct.js +115 -12
  49. package/dist/findDistinct.js.map +1 -1
  50. package/dist/findGlobal.d.ts.map +1 -1
  51. package/dist/findGlobal.js +34 -5
  52. package/dist/findGlobal.js.map +1 -1
  53. package/dist/findGlobalVersions.d.ts.map +1 -1
  54. package/dist/findGlobalVersions.js +10 -2
  55. package/dist/findGlobalVersions.js.map +1 -1
  56. package/dist/findOne.d.ts.map +1 -1
  57. package/dist/findOne.js +43 -5
  58. package/dist/findOne.js.map +1 -1
  59. package/dist/findVersions.d.ts.map +1 -1
  60. package/dist/findVersions.js +49 -5
  61. package/dist/findVersions.js.map +1 -1
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +4 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/init.d.ts.map +1 -1
  66. package/dist/init.js +89 -67
  67. package/dist/init.js.map +1 -1
  68. package/dist/migrateFresh.d.ts +4 -2
  69. package/dist/migrateFresh.d.ts.map +1 -1
  70. package/dist/migrateFresh.js +21 -6
  71. package/dist/migrateFresh.js.map +1 -1
  72. package/dist/models/buildCollectionSchema.d.ts +8 -2
  73. package/dist/models/buildCollectionSchema.d.ts.map +1 -1
  74. package/dist/models/buildCollectionSchema.js +4 -2
  75. package/dist/models/buildCollectionSchema.js.map +1 -1
  76. package/dist/models/buildGlobalModel.d.ts +5 -1
  77. package/dist/models/buildGlobalModel.d.ts.map +1 -1
  78. package/dist/models/buildGlobalModel.js +34 -3
  79. package/dist/models/buildGlobalModel.js.map +1 -1
  80. package/dist/models/buildSchema.d.ts +4 -0
  81. package/dist/models/buildSchema.d.ts.map +1 -1
  82. package/dist/models/buildSchema.js +114 -36
  83. package/dist/models/buildSchema.js.map +1 -1
  84. package/dist/models/schemaBuildContext.d.ts +21 -0
  85. package/dist/models/schemaBuildContext.d.ts.map +1 -0
  86. package/dist/models/schemaBuildContext.js +29 -0
  87. package/dist/models/schemaBuildContext.js.map +1 -0
  88. package/dist/predefinedMigrations/branching.d.ts +4 -0
  89. package/dist/predefinedMigrations/branching.d.ts.map +1 -0
  90. package/dist/predefinedMigrations/branching.js +9 -0
  91. package/dist/predefinedMigrations/branching.js.map +1 -0
  92. package/dist/predefinedMigrations/migrateBranching.d.ts +15 -0
  93. package/dist/predefinedMigrations/migrateBranching.d.ts.map +1 -0
  94. package/dist/predefinedMigrations/migrateBranching.js +88 -0
  95. package/dist/predefinedMigrations/migrateBranching.js.map +1 -0
  96. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.d.ts.map +1 -1
  97. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js +4 -4
  98. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js.map +1 -1
  99. package/dist/predefinedMigrations/migrateSizesToVariants.d.ts +13 -0
  100. package/dist/predefinedMigrations/migrateSizesToVariants.d.ts.map +1 -0
  101. package/dist/predefinedMigrations/migrateSizesToVariants.js +368 -0
  102. package/dist/predefinedMigrations/migrateSizesToVariants.js.map +1 -0
  103. package/dist/predefinedMigrations/sizes-to-variants.d.ts +5 -0
  104. package/dist/predefinedMigrations/sizes-to-variants.d.ts.map +1 -0
  105. package/dist/predefinedMigrations/sizes-to-variants.js +8 -0
  106. package/dist/predefinedMigrations/sizes-to-variants.js.map +1 -0
  107. package/dist/queries/buildAndOrConditions.d.ts +4 -2
  108. package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
  109. package/dist/queries/buildAndOrConditions.js +3 -1
  110. package/dist/queries/buildAndOrConditions.js.map +1 -1
  111. package/dist/queries/buildBranchVisibility.d.ts +11 -0
  112. package/dist/queries/buildBranchVisibility.d.ts.map +1 -0
  113. package/dist/queries/buildBranchVisibility.js +204 -0
  114. package/dist/queries/buildBranchVisibility.js.map +1 -0
  115. package/dist/queries/buildQuery.d.ts +4 -2
  116. package/dist/queries/buildQuery.d.ts.map +1 -1
  117. package/dist/queries/buildQuery.js +3 -1
  118. package/dist/queries/buildQuery.js.map +1 -1
  119. package/dist/queries/buildSearchParams.d.ts +4 -2
  120. package/dist/queries/buildSearchParams.d.ts.map +1 -1
  121. package/dist/queries/buildSearchParams.js +338 -24
  122. package/dist/queries/buildSearchParams.js.map +1 -1
  123. package/dist/queries/buildSortParam.d.ts.map +1 -1
  124. package/dist/queries/getBuildQueryPlugin.d.ts +3 -1
  125. package/dist/queries/getBuildQueryPlugin.d.ts.map +1 -1
  126. package/dist/queries/getBuildQueryPlugin.js +3 -1
  127. package/dist/queries/getBuildQueryPlugin.js.map +1 -1
  128. package/dist/queries/getLocalizedSortProperty.d.ts.map +1 -1
  129. package/dist/queries/operatorMap.d.ts.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/queries/sanitizeQueryValue.d.ts.map +1 -1
  135. package/dist/queryDrafts.d.ts.map +1 -1
  136. package/dist/queryDrafts.js +38 -7
  137. package/dist/queryDrafts.js.map +1 -1
  138. package/dist/testCredentials.d.ts.map +1 -1
  139. package/dist/transactions/beginTransaction.d.ts.map +1 -1
  140. package/dist/transactions/beginTransaction.js +0 -1
  141. package/dist/transactions/beginTransaction.js.map +1 -1
  142. package/dist/transactions/commitTransaction.d.ts.map +1 -1
  143. package/dist/transactions/commitTransaction.js +68 -7
  144. package/dist/transactions/commitTransaction.js.map +1 -1
  145. package/dist/transactions/rollbackTransaction.d.ts.map +1 -1
  146. package/dist/transactions/rollbackTransaction.js +10 -9
  147. package/dist/transactions/rollbackTransaction.js.map +1 -1
  148. package/dist/updateGlobal.d.ts.map +1 -1
  149. package/dist/updateGlobal.js +89 -9
  150. package/dist/updateGlobal.js.map +1 -1
  151. package/dist/updateGlobalVersion.d.ts.map +1 -1
  152. package/dist/updateGlobalVersion.js +3 -2
  153. package/dist/updateGlobalVersion.js.map +1 -1
  154. package/dist/updateJobs.d.ts.map +1 -1
  155. package/dist/updateJobs.js +71 -14
  156. package/dist/updateJobs.js.map +1 -1
  157. package/dist/updateMany.d.ts.map +1 -1
  158. package/dist/updateMany.js +3 -2
  159. package/dist/updateMany.js.map +1 -1
  160. package/dist/updateOne.d.ts.map +1 -1
  161. package/dist/updateOne.js +30 -4
  162. package/dist/updateOne.js.map +1 -1
  163. package/dist/updateVersion.d.ts.map +1 -1
  164. package/dist/updateVersion.js +3 -2
  165. package/dist/updateVersion.js.map +1 -1
  166. package/dist/upsertBranchGlobalChange.d.ts +3 -0
  167. package/dist/upsertBranchGlobalChange.d.ts.map +1 -0
  168. package/dist/upsertBranchGlobalChange.js +28 -0
  169. package/dist/upsertBranchGlobalChange.js.map +1 -0
  170. package/dist/utilities/aggregatePaginate.d.ts +2 -1
  171. package/dist/utilities/aggregatePaginate.d.ts.map +1 -1
  172. package/dist/utilities/aggregatePaginate.js +21 -5
  173. package/dist/utilities/aggregatePaginate.js.map +1 -1
  174. package/dist/utilities/buildJoinAggregation.d.ts +4 -2
  175. package/dist/utilities/buildJoinAggregation.d.ts.map +1 -1
  176. package/dist/utilities/buildJoinAggregation.js +124 -21
  177. package/dist/utilities/buildJoinAggregation.js.map +1 -1
  178. package/dist/utilities/buildProjectionFromSelect.d.ts.map +1 -1
  179. package/dist/utilities/getDBName.d.ts.map +1 -1
  180. package/dist/utilities/getEntity.d.ts +1 -1
  181. package/dist/utilities/getEntity.d.ts.map +1 -1
  182. package/dist/utilities/handleError.d.ts.map +1 -1
  183. package/dist/utilities/isObjectID.d.ts.map +1 -1
  184. package/dist/utilities/resolveJoins.d.ts +6 -2
  185. package/dist/utilities/resolveJoins.d.ts.map +1 -1
  186. package/dist/utilities/resolveJoins.js +114 -26
  187. package/dist/utilities/resolveJoins.js.map +1 -1
  188. package/dist/utilities/transform.d.ts.map +1 -1
  189. package/dist/utilities/transform.js +15 -0
  190. package/dist/utilities/transform.js.map +1 -1
  191. package/package.json +18 -21
  192. package/dist/queries/buildSortParam.spec.js +0 -123
  193. package/dist/queries/buildSortParam.spec.js.map +0 -1
  194. package/dist/queries/getLocalizedSortProperty.spec.js +0 -215
  195. package/dist/queries/getLocalizedSortProperty.spec.js.map +0 -1
  196. package/dist/utilities/transform.spec.js +0 -479
  197. package/dist/utilities/transform.spec.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/queries/getBuildQueryPlugin.ts"],"sourcesContent":["import type { FlattenedField, Payload, Where } from 'payload'\n\nimport { APIError } from 'payload'\n\nimport { parseParams } from './parseParams.js'\n\ntype GetBuildQueryPluginArgs = {\n collectionSlug?: string\n versionsFields?: FlattenedField[]\n}\n\nexport type BuildQueryArgs = {\n globalSlug?: string\n locale?: string\n payload: Payload\n where: Where\n}\n\n// This plugin asynchronously builds a list of Mongoose query constraints\n// which can then be used in subsequent Mongoose queries.\n// Deprecated in favor of using simpler buildQuery directly\nexport const getBuildQueryPlugin = ({\n collectionSlug,\n versionsFields,\n}: GetBuildQueryPluginArgs = {}) => {\n return function buildQueryPlugin(schema: any) {\n const modifiedSchema = schema\n async function schemaBuildQuery({\n globalSlug,\n locale,\n payload,\n where,\n }: BuildQueryArgs): Promise<Record<string, unknown>> {\n let fields: FlattenedField[] | null = null\n\n if (versionsFields) {\n fields = versionsFields\n } else {\n if (globalSlug) {\n const globalConfig = payload.globals.config.find(({ slug }) => slug === globalSlug)\n\n if (!globalConfig) {\n throw new APIError(`Global with the slug ${globalSlug} was not found`)\n }\n\n fields = globalConfig.flattenedFields\n }\n if (collectionSlug) {\n const collectionConfig = payload.collections[collectionSlug]?.config\n\n if (!collectionConfig) {\n throw new APIError(`Collection with the slug ${globalSlug} was not found`)\n }\n\n fields = collectionConfig.flattenedFields\n }\n }\n\n if (fields === null) {\n throw new APIError('Fields are not initialized.')\n }\n\n const result = await parseParams({\n collectionSlug,\n fields,\n globalSlug,\n locale,\n parentIsLocalized: false,\n payload,\n where,\n })\n\n return result\n }\n modifiedSchema.statics.buildQuery = schemaBuildQuery\n }\n}\n"],"names":["APIError","parseParams","getBuildQueryPlugin","collectionSlug","versionsFields","buildQueryPlugin","schema","modifiedSchema","schemaBuildQuery","globalSlug","locale","payload","where","fields","globalConfig","globals","config","find","slug","flattenedFields","collectionConfig","collections","result","parentIsLocalized","statics","buildQuery"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,UAAS;AAElC,SAASC,WAAW,QAAQ,mBAAkB;AAc9C,yEAAyE;AACzE,yDAAyD;AACzD,2DAA2D;AAC3D,OAAO,MAAMC,sBAAsB,CAAC,EAClCC,cAAc,EACdC,cAAc,EACU,GAAG,CAAC,CAAC;IAC7B,OAAO,SAASC,iBAAiBC,MAAW;QAC1C,MAAMC,iBAAiBD;QACvB,eAAeE,iBAAiB,EAC9BC,UAAU,EACVC,MAAM,EACNC,OAAO,EACPC,KAAK,EACU;YACf,IAAIC,SAAkC;YAEtC,IAAIT,gBAAgB;gBAClBS,SAAST;YACX,OAAO;gBACL,IAAIK,YAAY;oBACd,MAAMK,eAAeH,QAAQI,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKA,SAAST;oBAExE,IAAI,CAACK,cAAc;wBACjB,MAAM,IAAId,SAAS,CAAC,qBAAqB,EAAES,WAAW,cAAc,CAAC;oBACvE;oBAEAI,SAASC,aAAaK,eAAe;gBACvC;gBACA,IAAIhB,gBAAgB;oBAClB,MAAMiB,mBAAmBT,QAAQU,WAAW,CAAClB,eAAe,EAAEa;oBAE9D,IAAI,CAACI,kBAAkB;wBACrB,MAAM,IAAIpB,SAAS,CAAC,yBAAyB,EAAES,WAAW,cAAc,CAAC;oBAC3E;oBAEAI,SAASO,iBAAiBD,eAAe;gBAC3C;YACF;YAEA,IAAIN,WAAW,MAAM;gBACnB,MAAM,IAAIb,SAAS;YACrB;YAEA,MAAMsB,SAAS,MAAMrB,YAAY;gBAC/BE;gBACAU;gBACAJ;gBACAC;gBACAa,mBAAmB;gBACnBZ;gBACAC;YACF;YAEA,OAAOU;QACT;QACAf,eAAeiB,OAAO,CAACC,UAAU,GAAGjB;IACtC;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/queries/getBuildQueryPlugin.ts"],"sourcesContent":["import type { FlattenedField, Payload, PayloadRequest, Where } from 'payload'\n\nimport { APIError } from 'payload'\n\nimport { parseParams } from './parseParams.js'\n\ntype GetBuildQueryPluginArgs = {\n collectionSlug?: string\n versionsFields?: FlattenedField[]\n}\n\nexport type BuildQueryArgs = {\n branch?: false | string\n globalSlug?: string\n locale?: string\n payload: Payload\n req?: Partial<PayloadRequest>\n where: Where\n}\n\n// This plugin asynchronously builds a list of Mongoose query constraints\n// which can then be used in subsequent Mongoose queries.\n// Deprecated in favor of using simpler buildQuery directly\nexport const getBuildQueryPlugin = ({\n collectionSlug,\n versionsFields,\n}: GetBuildQueryPluginArgs = {}) => {\n return function buildQueryPlugin(schema: any) {\n const modifiedSchema = schema\n async function schemaBuildQuery({\n branch,\n globalSlug,\n locale,\n payload,\n req,\n where,\n }: BuildQueryArgs): Promise<Record<string, unknown>> {\n let fields: FlattenedField[] | null = null\n\n if (versionsFields) {\n fields = versionsFields\n } else {\n if (globalSlug) {\n const globalConfig = payload.globals.config.find(({ slug }) => slug === globalSlug)\n\n if (!globalConfig) {\n throw new APIError(`Global with the slug ${globalSlug} was not found`)\n }\n\n fields = globalConfig.flattenedFields\n }\n if (collectionSlug) {\n const collectionConfig = payload.collections[collectionSlug]?.config\n\n if (!collectionConfig) {\n throw new APIError(`Collection with the slug ${globalSlug} was not found`)\n }\n\n fields = collectionConfig.flattenedFields\n }\n }\n\n if (fields === null) {\n throw new APIError('Fields are not initialized.')\n }\n\n const result = await parseParams({\n branch,\n collectionSlug,\n fields,\n globalSlug,\n locale,\n parentIsLocalized: false,\n payload,\n req,\n where,\n })\n\n return result\n }\n modifiedSchema.statics.buildQuery = schemaBuildQuery\n }\n}\n"],"names":["APIError","parseParams","getBuildQueryPlugin","collectionSlug","versionsFields","buildQueryPlugin","schema","modifiedSchema","schemaBuildQuery","branch","globalSlug","locale","payload","req","where","fields","globalConfig","globals","config","find","slug","flattenedFields","collectionConfig","collections","result","parentIsLocalized","statics","buildQuery"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,UAAS;AAElC,SAASC,WAAW,QAAQ,mBAAkB;AAgB9C,yEAAyE;AACzE,yDAAyD;AACzD,2DAA2D;AAC3D,OAAO,MAAMC,sBAAsB,CAAC,EAClCC,cAAc,EACdC,cAAc,EACU,GAAG,CAAC,CAAC;IAC7B,OAAO,SAASC,iBAAiBC,MAAW;QAC1C,MAAMC,iBAAiBD;QACvB,eAAeE,iBAAiB,EAC9BC,MAAM,EACNC,UAAU,EACVC,MAAM,EACNC,OAAO,EACPC,GAAG,EACHC,KAAK,EACU;YACf,IAAIC,SAAkC;YAEtC,IAAIX,gBAAgB;gBAClBW,SAASX;YACX,OAAO;gBACL,IAAIM,YAAY;oBACd,MAAMM,eAAeJ,QAAQK,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKA,SAASV;oBAExE,IAAI,CAACM,cAAc;wBACjB,MAAM,IAAIhB,SAAS,CAAC,qBAAqB,EAAEU,WAAW,cAAc,CAAC;oBACvE;oBAEAK,SAASC,aAAaK,eAAe;gBACvC;gBACA,IAAIlB,gBAAgB;oBAClB,MAAMmB,mBAAmBV,QAAQW,WAAW,CAACpB,eAAe,EAAEe;oBAE9D,IAAI,CAACI,kBAAkB;wBACrB,MAAM,IAAItB,SAAS,CAAC,yBAAyB,EAAEU,WAAW,cAAc,CAAC;oBAC3E;oBAEAK,SAASO,iBAAiBD,eAAe;gBAC3C;YACF;YAEA,IAAIN,WAAW,MAAM;gBACnB,MAAM,IAAIf,SAAS;YACrB;YAEA,MAAMwB,SAAS,MAAMvB,YAAY;gBAC/BQ;gBACAN;gBACAY;gBACAL;gBACAC;gBACAc,mBAAmB;gBACnBb;gBACAC;gBACAC;YACF;YAEA,OAAOU;QACT;QACAjB,eAAemB,OAAO,CAACC,UAAU,GAAGnB;IACtC;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"getLocalizedSortProperty.d.ts","sourceRoot":"","sources":["../../src/queries/getLocalizedSortProperty.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAI9D,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,eAAe,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,EAAE,OAAO,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,wBAAwB,GAAI,oGAOtC,IAAI,KAAG,MA8FT,CAAA"}
1
+ {"version":3,"file":"getLocalizedSortProperty.d.ts","sourceRoot":"","sources":["../../src/queries/getLocalizedSortProperty.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAI9D,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,eAAe,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,EAAE,OAAO,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,wBAAwB,uGAOlC,IAAI,KAAG,MA8FT,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"operatorMap.d.ts","sourceRoot":"","sources":["../../src/queries/operatorMap.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,WAAW,CAAA;AAErD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;CAcvB,CAAA"}
1
+ {"version":3,"file":"operatorMap.d.ts","sourceRoot":"","sources":["../../src/queries/operatorMap.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,WAAW,CAAA;AAErD,eAAO,MAAM,WAAW;IACtB,GAAG;IACH,MAAM;IACN,MAAM;IACN,YAAY;IACZ,kBAAkB;IAClB,EAAE;IACF,UAAU;IACV,SAAS;IACT,eAAe;IACf,IAAI;IACJ,UAAU;IACV,MAAM;IACN,MAAM;CACP,CAAA"}
@@ -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":"sanitizeQueryValue.d.ts","sourceRoot":"","sources":["../../src/queries/sanitizeQueryValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAA;AAMnG,KAAK,sBAAsB,GAAG;IAC5B,KAAK,EAAE,cAAc,CAAA;IACrB,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,QAAQ,CAAA;IAClB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,GAAG,CAAA;CACT,CAAA;AAmED,eAAO,MAAM,kBAAkB,GAAI,kFAShC,sBAAsB,KACrB;IACE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd,GACD,SAycH,CAAA"}
1
+ {"version":3,"file":"sanitizeQueryValue.d.ts","sourceRoot":"","sources":["../../src/queries/sanitizeQueryValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAA;AAMnG,KAAK,sBAAsB,GAAG;IAC5B,KAAK,EAAE,cAAc,CAAA;IACrB,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,QAAQ,CAAA;IAClB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,GAAG,CAAA;CACT,CAAA;AAmED,eAAO,MAAM,kBAAkB,qFAS5B,sBAAsB,KACrB;IACE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd,GACD,SAycH,CAAA"}
@@ -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,46 @@ 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
+ collectionSlug,
73
+ req,
74
+ select
75
+ })
52
76
  });
53
77
  const session = await getSession(this, req);
54
78
  const options = {
55
79
  session
56
80
  };
57
81
  // 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;
82
+ const useEstimatedCount = !branchVisibility.length && (hasNearConstraint || !versionQuery || Object.keys(versionQuery).length === 0);
59
83
  const paginationOptions = {
60
84
  lean: true,
61
85
  leanWithId: true,
@@ -97,17 +121,20 @@ export const queryDrafts = async function queryDrafts({ collection: collectionSl
97
121
  let result;
98
122
  const aggregate = await buildJoinAggregation({
99
123
  adapter: this,
124
+ branch,
100
125
  collection: collectionSlug,
101
126
  collectionConfig,
102
127
  joins,
103
128
  locale,
104
129
  projection,
105
130
  query: versionQuery,
131
+ req,
106
132
  versions: true
107
133
  });
108
- if (aggregate || sortAggregation.length > 0) {
134
+ if (aggregate.length > 0 || branchVisibility.length > 0 || sortAggregation.length > 0) {
109
135
  result = await aggregatePaginate({
110
136
  adapter: this,
137
+ branchVisibility,
111
138
  collation: paginationOptions.collation,
112
139
  joinAggregation: aggregate,
113
140
  limit: paginationOptions.limit,
@@ -127,10 +154,12 @@ export const queryDrafts = async function queryDrafts({ collection: collectionSl
127
154
  if (!this.useJoinAggregations) {
128
155
  await resolveJoins({
129
156
  adapter: this,
157
+ branch,
130
158
  collectionSlug,
131
159
  docs: result.docs,
132
160
  joins,
133
161
  locale,
162
+ req,
134
163
  versions: true
135
164
  });
136
165
  }
@@ -141,7 +170,9 @@ export const queryDrafts = async function queryDrafts({ collection: collectionSl
141
170
  operation: 'read'
142
171
  });
143
172
  for(let i = 0; i < result.docs.length; i++){
144
- const id = result.docs[i].parent;
173
+ // A branch version's `parent` is the shadow row's primary key, so the
174
+ // canonical document ID comes from `_branchParent` when present.
175
+ const id = projectBranchVersionParent(result.docs[i]);
145
176
  result.docs[i] = result.docs[i].version ?? {};
146
177
  result.docs[i].id = id;
147
178
  }
@@ -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({ 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":"testCredentials.d.ts","sourceRoot":"","sources":["../src/testCredentials.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,kBAAkB,CAAA;AACpC,eAAO,MAAM,QAAQ,YAAY,CAAA;AACjC,eAAO,MAAM,UAAU;;;;CAItB,CAAA"}
1
+ {"version":3,"file":"testCredentials.d.ts","sourceRoot":"","sources":["../src/testCredentials.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,kBAAkB,CAAA;AACpC,eAAO,MAAM,QAAQ,YAAY,CAAA;AACjC,eAAO,MAAM,UAAU;IACrB,IAAI;IACJ,IAAI;IACJ,GAAG;CACJ,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"beginTransaction.d.ts","sourceRoot":"","sources":["../../src/transactions/beginTransaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAU/C,eAAO,MAAM,gBAAgB,EAAE,gBAsB9B,CAAA"}
1
+ {"version":3,"file":"beginTransaction.d.ts","sourceRoot":"","sources":["../../src/transactions/beginTransaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAU/C,eAAO,MAAM,gBAAgB,EAAE,gBAqB9B,CAAA"}
@@ -10,7 +10,6 @@ export const beginTransaction = async function beginTransaction(options) {
10
10
  const client = this.connection.getClient();
11
11
  const id = uuid();
12
12
  if (!this.sessions[id]) {
13
- // @ts-expect-error BaseDatabaseAdapter and MongoosAdapter (that extends Base) sessions aren't compatible.
14
13
  this.sessions[id] = client.startSession();
15
14
  }
16
15
  if (this.sessions[id]?.inTransaction()) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/transactions/beginTransaction.ts"],"sourcesContent":["import type { TransactionOptions } from 'mongodb'\nimport type { BeginTransaction } from 'payload'\n\nimport { APIError } from 'payload'\nimport { v4 as uuid } from 'uuid'\n\nimport type { MongooseAdapter } from '../index.js'\n\n// Needs await to fulfill the interface\n// @ts-expect-error TransactionOptions isn't compatible with BeginTransaction of the DatabaseAdapter interface.\n// eslint-disable-next-line @typescript-eslint/require-await\nexport const beginTransaction: BeginTransaction = async function beginTransaction(\n this: MongooseAdapter,\n options: TransactionOptions,\n) {\n if (!this.connection) {\n throw new APIError('beginTransaction called while no connection to the database exists')\n }\n\n const client = this.connection.getClient()\n const id = uuid()\n\n if (!this.sessions[id]) {\n // @ts-expect-error BaseDatabaseAdapter and MongoosAdapter (that extends Base) sessions aren't compatible.\n this.sessions[id] = client.startSession()\n }\n if (this.sessions[id]?.inTransaction()) {\n this.payload.logger.warn('beginTransaction called while transaction already exists')\n } else {\n this.sessions[id]?.startTransaction(options || (this.transactionOptions as TransactionOptions))\n }\n\n return id\n}\n"],"names":["APIError","v4","uuid","beginTransaction","options","connection","client","getClient","id","sessions","startSession","inTransaction","payload","logger","warn","startTransaction","transactionOptions"],"mappings":"AAGA,SAASA,QAAQ,QAAQ,UAAS;AAClC,SAASC,MAAMC,IAAI,QAAQ,OAAM;AAIjC,uCAAuC;AACvC,+GAA+G;AAC/G,4DAA4D;AAC5D,OAAO,MAAMC,mBAAqC,eAAeA,iBAE/DC,OAA2B;IAE3B,IAAI,CAAC,IAAI,CAACC,UAAU,EAAE;QACpB,MAAM,IAAIL,SAAS;IACrB;IAEA,MAAMM,SAAS,IAAI,CAACD,UAAU,CAACE,SAAS;IACxC,MAAMC,KAAKN;IAEX,IAAI,CAAC,IAAI,CAACO,QAAQ,CAACD,GAAG,EAAE;QACtB,0GAA0G;QAC1G,IAAI,CAACC,QAAQ,CAACD,GAAG,GAAGF,OAAOI,YAAY;IACzC;IACA,IAAI,IAAI,CAACD,QAAQ,CAACD,GAAG,EAAEG,iBAAiB;QACtC,IAAI,CAACC,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC;IAC3B,OAAO;QACL,IAAI,CAACL,QAAQ,CAACD,GAAG,EAAEO,iBAAiBX,WAAY,IAAI,CAACY,kBAAkB;IACzE;IAEA,OAAOR;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/transactions/beginTransaction.ts"],"sourcesContent":["import type { TransactionOptions } from 'mongodb'\nimport type { BeginTransaction } from 'payload'\n\nimport { APIError } from 'payload'\nimport { v4 as uuid } from 'uuid'\n\nimport type { MongooseAdapter } from '../index.js'\n\n// Needs await to fulfill the interface\n// @ts-expect-error TransactionOptions isn't compatible with BeginTransaction of the DatabaseAdapter interface.\n// eslint-disable-next-line @typescript-eslint/require-await\nexport const beginTransaction: BeginTransaction = async function beginTransaction(\n this: MongooseAdapter,\n options: TransactionOptions,\n) {\n if (!this.connection) {\n throw new APIError('beginTransaction called while no connection to the database exists')\n }\n\n const client = this.connection.getClient()\n const id = uuid()\n\n if (!this.sessions[id]) {\n this.sessions[id] = client.startSession()\n }\n if (this.sessions[id]?.inTransaction()) {\n this.payload.logger.warn('beginTransaction called while transaction already exists')\n } else {\n this.sessions[id]?.startTransaction(options || (this.transactionOptions as TransactionOptions))\n }\n\n return id\n}\n"],"names":["APIError","v4","uuid","beginTransaction","options","connection","client","getClient","id","sessions","startSession","inTransaction","payload","logger","warn","startTransaction","transactionOptions"],"mappings":"AAGA,SAASA,QAAQ,QAAQ,UAAS;AAClC,SAASC,MAAMC,IAAI,QAAQ,OAAM;AAIjC,uCAAuC;AACvC,+GAA+G;AAC/G,4DAA4D;AAC5D,OAAO,MAAMC,mBAAqC,eAAeA,iBAE/DC,OAA2B;IAE3B,IAAI,CAAC,IAAI,CAACC,UAAU,EAAE;QACpB,MAAM,IAAIL,SAAS;IACrB;IAEA,MAAMM,SAAS,IAAI,CAACD,UAAU,CAACE,SAAS;IACxC,MAAMC,KAAKN;IAEX,IAAI,CAAC,IAAI,CAACO,QAAQ,CAACD,GAAG,EAAE;QACtB,IAAI,CAACC,QAAQ,CAACD,GAAG,GAAGF,OAAOI,YAAY;IACzC;IACA,IAAI,IAAI,CAACD,QAAQ,CAACD,GAAG,EAAEG,iBAAiB;QACtC,IAAI,CAACC,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC;IAC3B,OAAO;QACL,IAAI,CAACL,QAAQ,CAACD,GAAG,EAAEO,iBAAiBX,WAAY,IAAI,CAACY,kBAAkB;IACzE;IAEA,OAAOR;AACT,EAAC"}
@@ -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,YAgG1B,CAAA"}