payload 4.0.0-internal.ea6e8f8 → 4.0.0-internal.ee5d8bd

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 (703) hide show
  1. package/dist/admin/adapters/router.d.ts +1 -1
  2. package/dist/admin/adapters/router.d.ts.map +1 -1
  3. package/dist/admin/adapters/router.js.map +1 -1
  4. package/dist/admin/forms/Diff.d.ts +0 -4
  5. package/dist/admin/forms/Diff.d.ts.map +1 -1
  6. package/dist/admin/forms/Diff.js.map +1 -1
  7. package/dist/admin/forms/Form.d.ts +0 -2
  8. package/dist/admin/forms/Form.d.ts.map +1 -1
  9. package/dist/admin/forms/Form.js.map +1 -1
  10. package/dist/admin/initAdminContext.d.ts.map +1 -1
  11. package/dist/admin/initAdminContext.js +0 -10
  12. package/dist/admin/initAdminContext.js.map +1 -1
  13. package/dist/auth/createAuthToken.d.ts +26 -0
  14. package/dist/auth/createAuthToken.d.ts.map +1 -0
  15. package/dist/auth/createAuthToken.js +39 -0
  16. package/dist/auth/createAuthToken.js.map +1 -0
  17. package/dist/auth/endpoints/refresh.d.ts.map +1 -1
  18. package/dist/auth/endpoints/refresh.js +2 -1
  19. package/dist/auth/endpoints/refresh.js.map +1 -1
  20. package/dist/auth/getFieldsToSign.js.map +1 -1
  21. package/dist/auth/loginWithCookie.d.ts.map +1 -1
  22. package/dist/auth/loginWithCookie.js +1 -0
  23. package/dist/auth/loginWithCookie.js.map +1 -1
  24. package/dist/auth/operations/local/login.d.ts.map +1 -1
  25. package/dist/auth/operations/local/login.js +1 -0
  26. package/dist/auth/operations/local/login.js.map +1 -1
  27. package/dist/auth/operations/login.d.ts +2 -0
  28. package/dist/auth/operations/login.d.ts.map +1 -1
  29. package/dist/auth/operations/login.js +6 -19
  30. package/dist/auth/operations/login.js.map +1 -1
  31. package/dist/auth/operations/refresh.d.ts +8 -0
  32. package/dist/auth/operations/refresh.d.ts.map +1 -1
  33. package/dist/auth/operations/refresh.js +50 -19
  34. package/dist/auth/operations/refresh.js.map +1 -1
  35. package/dist/auth/operations/resetPassword.d.ts.map +1 -1
  36. package/dist/auth/operations/resetPassword.js +54 -20
  37. package/dist/auth/operations/resetPassword.js.map +1 -1
  38. package/dist/auth/refreshAuthToken.d.ts +32 -0
  39. package/dist/auth/refreshAuthToken.d.ts.map +1 -0
  40. package/dist/auth/refreshAuthToken.js +113 -0
  41. package/dist/auth/refreshAuthToken.js.map +1 -0
  42. package/dist/auth/serverFunctions/cookies.js.map +1 -1
  43. package/dist/auth/serverFunctions/login.js.map +1 -1
  44. package/dist/auth/sessions.d.ts +9 -2
  45. package/dist/auth/sessions.d.ts.map +1 -1
  46. package/dist/auth/sessions.js +6 -5
  47. package/dist/auth/sessions.js.map +1 -1
  48. package/dist/auth/types.d.ts +25 -1
  49. package/dist/auth/types.d.ts.map +1 -1
  50. package/dist/auth/types.js.map +1 -1
  51. package/dist/cli/commands/data/utilities.d.ts +1 -1
  52. package/dist/cli/commands/data/utilities.d.ts.map +1 -1
  53. package/dist/cli/commands/data/utilities.js.map +1 -1
  54. package/dist/cli/defineCLICommand.js +1 -1
  55. package/dist/cli/defineCLICommand.js.map +1 -1
  56. package/dist/collections/config/client.d.ts +1 -1
  57. package/dist/collections/config/client.d.ts.map +1 -1
  58. package/dist/collections/config/client.js +0 -1
  59. package/dist/collections/config/client.js.map +1 -1
  60. package/dist/collections/config/defaults.d.ts +2 -0
  61. package/dist/collections/config/defaults.d.ts.map +1 -1
  62. package/dist/collections/config/defaults.js +4 -0
  63. package/dist/collections/config/defaults.js.map +1 -1
  64. package/dist/collections/config/sanitize.d.ts.map +1 -1
  65. package/dist/collections/config/sanitize.js +3 -0
  66. package/dist/collections/config/sanitize.js.map +1 -1
  67. package/dist/collections/config/sanitizeCompoundIndexes.d.ts.map +1 -1
  68. package/dist/collections/config/sanitizeCompoundIndexes.js +0 -9
  69. package/dist/collections/config/sanitizeCompoundIndexes.js.map +1 -1
  70. package/dist/collections/config/types.d.ts +4 -21
  71. package/dist/collections/config/types.d.ts.map +1 -1
  72. package/dist/collections/config/types.js.map +1 -1
  73. package/dist/collections/dataloader.d.ts +1 -10
  74. package/dist/collections/dataloader.d.ts.map +1 -1
  75. package/dist/collections/dataloader.js +6 -14
  76. package/dist/collections/dataloader.js.map +1 -1
  77. package/dist/collections/operations/create.d.ts.map +1 -1
  78. package/dist/collections/operations/create.js +0 -13
  79. package/dist/collections/operations/create.js.map +1 -1
  80. package/dist/collections/operations/delete.d.ts.map +1 -1
  81. package/dist/collections/operations/delete.js +121 -638
  82. package/dist/collections/operations/delete.js.map +1 -1
  83. package/dist/collections/operations/deleteByID.d.ts.map +1 -1
  84. package/dist/collections/operations/deleteByID.js +32 -238
  85. package/dist/collections/operations/deleteByID.js.map +1 -1
  86. package/dist/collections/operations/findByID.d.ts.map +1 -1
  87. package/dist/collections/operations/findByID.js +0 -6
  88. package/dist/collections/operations/findByID.js.map +1 -1
  89. package/dist/collections/operations/findDistinct.d.ts.map +1 -1
  90. package/dist/collections/operations/findDistinct.js +6 -7
  91. package/dist/collections/operations/findDistinct.js.map +1 -1
  92. package/dist/collections/operations/findVersionByID.d.ts.map +1 -1
  93. package/dist/collections/operations/findVersionByID.js +7 -0
  94. package/dist/collections/operations/findVersionByID.js.map +1 -1
  95. package/dist/collections/operations/findVersions.d.ts.map +1 -1
  96. package/dist/collections/operations/findVersions.js +5 -0
  97. package/dist/collections/operations/findVersions.js.map +1 -1
  98. package/dist/collections/operations/local/count.d.ts +4 -9
  99. package/dist/collections/operations/local/count.d.ts.map +1 -1
  100. package/dist/collections/operations/local/count.js.map +1 -1
  101. package/dist/collections/operations/local/countVersions.d.ts +0 -4
  102. package/dist/collections/operations/local/countVersions.d.ts.map +1 -1
  103. package/dist/collections/operations/local/countVersions.js.map +1 -1
  104. package/dist/collections/operations/local/create.d.ts +4 -9
  105. package/dist/collections/operations/local/create.d.ts.map +1 -1
  106. package/dist/collections/operations/local/create.js.map +1 -1
  107. package/dist/collections/operations/local/delete.d.ts +4 -9
  108. package/dist/collections/operations/local/delete.d.ts.map +1 -1
  109. package/dist/collections/operations/local/delete.js.map +1 -1
  110. package/dist/collections/operations/local/duplicate.d.ts +0 -5
  111. package/dist/collections/operations/local/duplicate.d.ts.map +1 -1
  112. package/dist/collections/operations/local/duplicate.js.map +1 -1
  113. package/dist/collections/operations/local/find.d.ts +4 -9
  114. package/dist/collections/operations/local/find.d.ts.map +1 -1
  115. package/dist/collections/operations/local/find.js.map +1 -1
  116. package/dist/collections/operations/local/findByID.d.ts +4 -9
  117. package/dist/collections/operations/local/findByID.d.ts.map +1 -1
  118. package/dist/collections/operations/local/findByID.js.map +1 -1
  119. package/dist/collections/operations/local/findDistinct.d.ts +0 -5
  120. package/dist/collections/operations/local/findDistinct.d.ts.map +1 -1
  121. package/dist/collections/operations/local/findDistinct.js.map +1 -1
  122. package/dist/collections/operations/local/findVersionByID.d.ts +0 -5
  123. package/dist/collections/operations/local/findVersionByID.d.ts.map +1 -1
  124. package/dist/collections/operations/local/findVersionByID.js.map +1 -1
  125. package/dist/collections/operations/local/findVersions.d.ts +0 -5
  126. package/dist/collections/operations/local/findVersions.d.ts.map +1 -1
  127. package/dist/collections/operations/local/findVersions.js.map +1 -1
  128. package/dist/collections/operations/local/restoreVersion.d.ts +0 -5
  129. package/dist/collections/operations/local/restoreVersion.d.ts.map +1 -1
  130. package/dist/collections/operations/local/restoreVersion.js.map +1 -1
  131. package/dist/collections/operations/local/update.d.ts +4 -9
  132. package/dist/collections/operations/local/update.d.ts.map +1 -1
  133. package/dist/collections/operations/local/update.js.map +1 -1
  134. package/dist/collections/operations/renameFile.js +1 -1
  135. package/dist/collections/operations/renameFile.js.map +1 -1
  136. package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
  137. package/dist/collections/operations/restoreVersion.js +76 -157
  138. package/dist/collections/operations/restoreVersion.js.map +1 -1
  139. package/dist/collections/operations/update.d.ts.map +1 -1
  140. package/dist/collections/operations/update.js +171 -357
  141. package/dist/collections/operations/update.js.map +1 -1
  142. package/dist/collections/operations/updateByID.d.ts +0 -15
  143. package/dist/collections/operations/updateByID.d.ts.map +1 -1
  144. package/dist/collections/operations/updateByID.js +60 -265
  145. package/dist/collections/operations/updateByID.js.map +1 -1
  146. package/dist/collections/operations/utilities/buildBeforeOperation.d.ts.map +1 -1
  147. package/dist/collections/operations/utilities/buildBeforeOperation.js +0 -7
  148. package/dist/collections/operations/utilities/buildBeforeOperation.js.map +1 -1
  149. package/dist/collections/operations/utilities/update.d.ts +1 -14
  150. package/dist/collections/operations/utilities/update.d.ts.map +1 -1
  151. package/dist/collections/operations/utilities/update.js +20 -92
  152. package/dist/collections/operations/utilities/update.js.map +1 -1
  153. package/dist/collections/operations/validate.js +4 -4
  154. package/dist/collections/operations/validate.js.map +1 -1
  155. package/dist/config/client.d.ts +1 -3
  156. package/dist/config/client.d.ts.map +1 -1
  157. package/dist/config/client.js +1 -9
  158. package/dist/config/client.js.map +1 -1
  159. package/dist/config/defaults.d.ts.map +1 -1
  160. package/dist/config/defaults.js +1 -0
  161. package/dist/config/defaults.js.map +1 -1
  162. package/dist/config/definePlugin.js.map +1 -1
  163. package/dist/config/sanitize.d.ts.map +1 -1
  164. package/dist/config/sanitize.js +2 -40
  165. package/dist/config/sanitize.js.map +1 -1
  166. package/dist/config/types.d.ts +13 -21
  167. package/dist/config/types.d.ts.map +1 -1
  168. package/dist/config/types.js.map +1 -1
  169. package/dist/database/defaultCopy.d.ts.map +1 -1
  170. package/dist/database/defaultCopy.js +0 -1
  171. package/dist/database/defaultCopy.js.map +1 -1
  172. package/dist/database/types.d.ts +4 -75
  173. package/dist/database/types.d.ts.map +1 -1
  174. package/dist/database/types.js.map +1 -1
  175. package/dist/exports/build-config.d.ts +9 -0
  176. package/dist/exports/build-config.d.ts.map +1 -0
  177. package/dist/exports/build-config.js +38 -0
  178. package/dist/exports/build-config.js.map +1 -0
  179. package/dist/exports/shared.d.ts +0 -2
  180. package/dist/exports/shared.d.ts.map +1 -1
  181. package/dist/exports/shared.js +0 -2
  182. package/dist/exports/shared.js.map +1 -1
  183. package/dist/fields/baseFields/authorship/index.d.ts +1 -2
  184. package/dist/fields/baseFields/authorship/index.d.ts.map +1 -1
  185. package/dist/fields/baseFields/authorship/index.js +0 -12
  186. package/dist/fields/baseFields/authorship/index.js.map +1 -1
  187. package/dist/fields/config/client.js.map +1 -1
  188. package/dist/fields/config/reservedFieldNames.d.ts.map +1 -1
  189. package/dist/fields/config/reservedFieldNames.js.map +1 -1
  190. package/dist/fields/config/types.d.ts.map +1 -1
  191. package/dist/fields/config/types.js.map +1 -1
  192. package/dist/fields/hooks/afterChange/promise.js.map +1 -1
  193. package/dist/fields/hooks/afterRead/index.d.ts +0 -8
  194. package/dist/fields/hooks/afterRead/index.d.ts.map +1 -1
  195. package/dist/fields/hooks/afterRead/index.js +2 -6
  196. package/dist/fields/hooks/afterRead/index.js.map +1 -1
  197. package/dist/fields/hooks/afterRead/promise.d.ts +1 -3
  198. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
  199. package/dist/fields/hooks/afterRead/promise.js +17 -41
  200. package/dist/fields/hooks/afterRead/promise.js.map +1 -1
  201. package/dist/fields/hooks/afterRead/relationshipPopulationPromise.d.ts.map +1 -1
  202. package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js +0 -2
  203. package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js.map +1 -1
  204. package/dist/fields/hooks/afterRead/traverseFields.d.ts +1 -3
  205. package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -1
  206. package/dist/fields/hooks/afterRead/traverseFields.js +2 -4
  207. package/dist/fields/hooks/afterRead/traverseFields.js.map +1 -1
  208. package/dist/fields/hooks/afterRead/virtualFieldPopulationPromise.d.ts.map +1 -1
  209. package/dist/fields/hooks/afterRead/virtualFieldPopulationPromise.js +0 -3
  210. package/dist/fields/hooks/afterRead/virtualFieldPopulationPromise.js.map +1 -1
  211. package/dist/fields/hooks/beforeChange/flattenValidationData.d.ts +14 -0
  212. package/dist/fields/hooks/beforeChange/flattenValidationData.d.ts.map +1 -0
  213. package/dist/fields/hooks/beforeChange/flattenValidationData.js +36 -0
  214. package/dist/fields/hooks/beforeChange/flattenValidationData.js.map +1 -0
  215. package/dist/fields/hooks/beforeChange/promise.d.ts +2 -1
  216. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  217. package/dist/fields/hooks/beforeChange/promise.js +96 -22
  218. package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
  219. package/dist/fields/hooks/beforeChange/traverseFields.d.ts +2 -1
  220. package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
  221. package/dist/fields/hooks/beforeChange/traverseFields.js +2 -1
  222. package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
  223. package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
  224. package/dist/fields/hooks/beforeValidate/promise.js +0 -8
  225. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  226. package/dist/fields/validations.d.ts.map +1 -1
  227. package/dist/fields/validations.js +4 -1
  228. package/dist/fields/validations.js.map +1 -1
  229. package/dist/globals/config/types.d.ts +2 -6
  230. package/dist/globals/config/types.d.ts.map +1 -1
  231. package/dist/globals/config/types.js.map +1 -1
  232. package/dist/globals/operations/countGlobalVersions.d.ts.map +1 -1
  233. package/dist/globals/operations/countGlobalVersions.js +0 -7
  234. package/dist/globals/operations/countGlobalVersions.js.map +1 -1
  235. package/dist/globals/operations/findOne.d.ts.map +1 -1
  236. package/dist/globals/operations/findOne.js +0 -7
  237. package/dist/globals/operations/findOne.js.map +1 -1
  238. package/dist/globals/operations/findVersionByID.d.ts.map +1 -1
  239. package/dist/globals/operations/findVersionByID.js +6 -6
  240. package/dist/globals/operations/findVersionByID.js.map +1 -1
  241. package/dist/globals/operations/findVersions.d.ts.map +1 -1
  242. package/dist/globals/operations/findVersions.js +4 -6
  243. package/dist/globals/operations/findVersions.js.map +1 -1
  244. package/dist/globals/operations/local/countVersions.d.ts +0 -5
  245. package/dist/globals/operations/local/countVersions.d.ts.map +1 -1
  246. package/dist/globals/operations/local/countVersions.js.map +1 -1
  247. package/dist/globals/operations/local/findOne.d.ts +0 -5
  248. package/dist/globals/operations/local/findOne.d.ts.map +1 -1
  249. package/dist/globals/operations/local/findOne.js.map +1 -1
  250. package/dist/globals/operations/local/findVersionByID.d.ts +0 -5
  251. package/dist/globals/operations/local/findVersionByID.d.ts.map +1 -1
  252. package/dist/globals/operations/local/findVersionByID.js.map +1 -1
  253. package/dist/globals/operations/local/findVersions.d.ts +0 -5
  254. package/dist/globals/operations/local/findVersions.d.ts.map +1 -1
  255. package/dist/globals/operations/local/findVersions.js.map +1 -1
  256. package/dist/globals/operations/local/restoreVersion.d.ts +0 -5
  257. package/dist/globals/operations/local/restoreVersion.d.ts.map +1 -1
  258. package/dist/globals/operations/local/restoreVersion.js.map +1 -1
  259. package/dist/globals/operations/local/update.d.ts +0 -5
  260. package/dist/globals/operations/local/update.d.ts.map +1 -1
  261. package/dist/globals/operations/local/update.js +18 -61
  262. package/dist/globals/operations/local/update.js.map +1 -1
  263. package/dist/globals/operations/restoreVersion.d.ts +2 -3
  264. package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
  265. package/dist/globals/operations/restoreVersion.js +24 -61
  266. package/dist/globals/operations/restoreVersion.js.map +1 -1
  267. package/dist/globals/operations/update.d.ts.map +1 -1
  268. package/dist/globals/operations/update.js +8 -86
  269. package/dist/globals/operations/update.js.map +1 -1
  270. package/dist/globals/operations/validate.js +1 -1
  271. package/dist/globals/operations/validate.js.map +1 -1
  272. package/dist/hierarchy/addHierarchyToCollection.d.ts.map +1 -1
  273. package/dist/hierarchy/addHierarchyToCollection.js +32 -21
  274. package/dist/hierarchy/addHierarchyToCollection.js.map +1 -1
  275. package/dist/hierarchy/createFolderField.js.map +1 -1
  276. package/dist/hierarchy/getInitialTreeData.d.ts +1 -3
  277. package/dist/hierarchy/getInitialTreeData.d.ts.map +1 -1
  278. package/dist/hierarchy/getInitialTreeData.js +1 -4
  279. package/dist/hierarchy/getInitialTreeData.js.map +1 -1
  280. package/dist/hierarchy/resolveHierarchyCollections.js +9 -3
  281. package/dist/hierarchy/resolveHierarchyCollections.js.map +1 -1
  282. package/dist/hierarchy/utils/computePaths.d.ts.map +1 -1
  283. package/dist/hierarchy/utils/computePaths.js.map +1 -1
  284. package/dist/index.bundled.d.ts +4336 -5501
  285. package/dist/index.d.ts +27 -51
  286. package/dist/index.d.ts.map +1 -1
  287. package/dist/index.js +14 -37
  288. package/dist/index.js.map +1 -1
  289. package/dist/llm-instructions/getInstructionsCollection.d.ts.map +1 -1
  290. package/dist/llm-instructions/getInstructionsCollection.js +2 -0
  291. package/dist/llm-instructions/getInstructionsCollection.js.map +1 -1
  292. package/dist/preferences/keys.d.ts +4 -11
  293. package/dist/preferences/keys.d.ts.map +1 -1
  294. package/dist/preferences/keys.js +3 -10
  295. package/dist/preferences/keys.js.map +1 -1
  296. package/dist/preferences/types.d.ts +0 -19
  297. package/dist/preferences/types.d.ts.map +1 -1
  298. package/dist/preferences/types.js.map +1 -1
  299. package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js +1 -1
  300. package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js.map +1 -1
  301. package/dist/types/index.d.ts +0 -13
  302. package/dist/types/index.d.ts.map +1 -1
  303. package/dist/types/index.js.map +1 -1
  304. package/dist/uploads/deleteAssociatedFiles.d.ts.map +1 -1
  305. package/dist/uploads/deleteAssociatedFiles.js +29 -108
  306. package/dist/uploads/deleteAssociatedFiles.js.map +1 -1
  307. package/dist/uploads/endpoints/getFile.d.ts.map +1 -1
  308. package/dist/uploads/endpoints/getFile.js +0 -5
  309. package/dist/uploads/endpoints/getFile.js.map +1 -1
  310. package/dist/uploads/fileExists.d.ts.map +1 -1
  311. package/dist/uploads/fileExists.js +2 -5
  312. package/dist/uploads/fileExists.js.map +1 -1
  313. package/dist/uploads/fileVersioning/archive.d.ts.map +1 -1
  314. package/dist/uploads/fileVersioning/archive.js +1 -15
  315. package/dist/uploads/fileVersioning/archive.js.map +1 -1
  316. package/dist/uploads/fileVersioning/cleanup.d.ts +0 -7
  317. package/dist/uploads/fileVersioning/cleanup.d.ts.map +1 -1
  318. package/dist/uploads/fileVersioning/cleanup.js +0 -12
  319. package/dist/uploads/fileVersioning/cleanup.js.map +1 -1
  320. package/dist/uploads/fileVersioning/cloudStorage.d.ts.map +1 -1
  321. package/dist/uploads/fileVersioning/cloudStorage.js +1 -16
  322. package/dist/uploads/fileVersioning/cloudStorage.js.map +1 -1
  323. package/dist/uploads/fileVersioning/resolveHistoricalFile.js.map +1 -1
  324. package/dist/uploads/formatFilesize.js +1 -1
  325. package/dist/uploads/formatFilesize.js.map +1 -1
  326. package/dist/uploads/generateFileData.d.ts +0 -5
  327. package/dist/uploads/generateFileData.d.ts.map +1 -1
  328. package/dist/uploads/generateFileData.js +2 -74
  329. package/dist/uploads/generateFileData.js.map +1 -1
  330. package/dist/uploads/getBaseFields.d.ts.map +1 -1
  331. package/dist/uploads/getBaseFields.js +29 -46
  332. package/dist/uploads/getBaseFields.js.map +1 -1
  333. package/dist/uploads/getFileContentRequirement.js.map +1 -1
  334. package/dist/uploads/getFileFromUploadInstructions.js.map +1 -1
  335. package/dist/uploads/getSafeFilename.d.ts.map +1 -1
  336. package/dist/uploads/getSafeFilename.js +3 -5
  337. package/dist/uploads/getSafeFilename.js.map +1 -1
  338. package/dist/uploads/safeFetch.js.map +1 -1
  339. package/dist/uploads/stagedUpload.js.map +1 -1
  340. package/dist/uploads/transformers/handleDynamicFileRequest.js +11 -2
  341. package/dist/uploads/transformers/handleDynamicFileRequest.js.map +1 -1
  342. package/dist/uploads/types.d.ts +0 -11
  343. package/dist/uploads/types.d.ts.map +1 -1
  344. package/dist/uploads/types.js.map +1 -1
  345. package/dist/uploads/uploadFiles.d.ts +1 -4
  346. package/dist/uploads/uploadFiles.d.ts.map +1 -1
  347. package/dist/uploads/uploadFiles.js +5 -29
  348. package/dist/uploads/uploadFiles.js.map +1 -1
  349. package/dist/utilities/addSelectGenericsToGeneretedTypes.d.ts.map +1 -1
  350. package/dist/utilities/addSelectGenericsToGeneretedTypes.js +0 -1
  351. package/dist/utilities/addSelectGenericsToGeneretedTypes.js.map +1 -1
  352. package/dist/utilities/appendDateTimezoneSelectFields.js.map +1 -1
  353. package/dist/utilities/assertNoValidationWrite.d.ts.map +1 -1
  354. package/dist/utilities/assertNoValidationWrite.js +0 -4
  355. package/dist/utilities/assertNoValidationWrite.js.map +1 -1
  356. package/dist/utilities/checkDocumentLockStatus.d.ts +6 -15
  357. package/dist/utilities/checkDocumentLockStatus.d.ts.map +1 -1
  358. package/dist/utilities/checkDocumentLockStatus.js +11 -44
  359. package/dist/utilities/checkDocumentLockStatus.js.map +1 -1
  360. package/dist/utilities/cloneValidationRequest.js.map +1 -1
  361. package/dist/utilities/commitTransaction.d.ts +0 -4
  362. package/dist/utilities/commitTransaction.d.ts.map +1 -1
  363. package/dist/utilities/commitTransaction.js +1 -41
  364. package/dist/utilities/commitTransaction.js.map +1 -1
  365. package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
  366. package/dist/utilities/configToJSONSchema.js +2 -18
  367. package/dist/utilities/configToJSONSchema.js.map +1 -1
  368. package/dist/utilities/createPayloadRequest.d.ts +0 -5
  369. package/dist/utilities/createPayloadRequest.d.ts.map +1 -1
  370. package/dist/utilities/createPayloadRequest.js +3 -50
  371. package/dist/utilities/createPayloadRequest.js.map +1 -1
  372. package/dist/utilities/createPayloadRequestFromWebRequest.d.ts +12 -1
  373. package/dist/utilities/createPayloadRequestFromWebRequest.d.ts.map +1 -1
  374. package/dist/utilities/createPayloadRequestFromWebRequest.js +9 -5
  375. package/dist/utilities/createPayloadRequestFromWebRequest.js.map +1 -1
  376. package/dist/utilities/deepCopyObject.js.map +1 -1
  377. package/dist/utilities/documentMatchingWhereExists.js +1 -1
  378. package/dist/utilities/documentMatchingWhereExists.js.map +1 -1
  379. package/dist/utilities/entityInputSchema/validateEntityData.d.ts.map +1 -1
  380. package/dist/utilities/entityInputSchema/validateEntityData.js.map +1 -1
  381. package/dist/utilities/filterDataToSelectedLocales.js.map +1 -1
  382. package/dist/utilities/getEntityPermissions/getEntityPermissions.d.ts.map +1 -1
  383. package/dist/utilities/getEntityPermissions/getEntityPermissions.js +1 -0
  384. package/dist/utilities/getEntityPermissions/getEntityPermissions.js.map +1 -1
  385. package/dist/utilities/getEntityPermissions/populateFieldPermissions.js.map +1 -1
  386. package/dist/utilities/getVersionsConfig.d.ts +4 -0
  387. package/dist/utilities/getVersionsConfig.d.ts.map +1 -1
  388. package/dist/utilities/getVersionsConfig.js +5 -0
  389. package/dist/utilities/getVersionsConfig.js.map +1 -1
  390. package/dist/utilities/handleEndpoints.d.ts.map +1 -1
  391. package/dist/utilities/handleEndpoints.js +10 -9
  392. package/dist/utilities/handleEndpoints.js.map +1 -1
  393. package/dist/utilities/httpStatus.d.ts +0 -2
  394. package/dist/utilities/httpStatus.d.ts.map +1 -1
  395. package/dist/utilities/httpStatus.js +1 -3
  396. package/dist/utilities/httpStatus.js.map +1 -1
  397. package/dist/utilities/initTransaction.d.ts.map +1 -1
  398. package/dist/utilities/initTransaction.js +7 -35
  399. package/dist/utilities/initTransaction.js.map +1 -1
  400. package/dist/utilities/killTransaction.d.ts.map +1 -1
  401. package/dist/utilities/killTransaction.js +0 -27
  402. package/dist/utilities/killTransaction.js.map +1 -1
  403. package/dist/utilities/parseParams/index.js.map +1 -1
  404. package/dist/utilities/parseValidationLocale.js.map +1 -1
  405. package/dist/utilities/sanitizePopulateParam.js.map +1 -1
  406. package/dist/utilities/telemetry/conf/index.d.ts +4 -1
  407. package/dist/utilities/telemetry/conf/index.d.ts.map +1 -1
  408. package/dist/utilities/telemetry/conf/index.js.map +1 -1
  409. package/dist/utilities/telemetry/featureInfo/getFeatureInfo.js.map +1 -1
  410. package/dist/versions/allLocalesPublicationStatus.js.map +1 -1
  411. package/dist/versions/buildCollectionFields.d.ts.map +1 -1
  412. package/dist/versions/buildCollectionFields.js +0 -23
  413. package/dist/versions/buildCollectionFields.js.map +1 -1
  414. package/dist/versions/buildGlobalFields.d.ts.map +1 -1
  415. package/dist/versions/buildGlobalFields.js +0 -14
  416. package/dist/versions/buildGlobalFields.js.map +1 -1
  417. package/dist/versions/buildVersionCompoundIndexes.d.ts.map +1 -1
  418. package/dist/versions/buildVersionCompoundIndexes.js +2 -8
  419. package/dist/versions/buildVersionCompoundIndexes.js.map +1 -1
  420. package/dist/versions/deleteCollectionVersions.d.ts +1 -2
  421. package/dist/versions/deleteCollectionVersions.d.ts.map +1 -1
  422. package/dist/versions/deleteCollectionVersions.js +8 -37
  423. package/dist/versions/deleteCollectionVersions.js.map +1 -1
  424. package/dist/versions/deleteScheduledPublishJobs.d.ts.map +1 -1
  425. package/dist/versions/deleteScheduledPublishJobs.js +0 -4
  426. package/dist/versions/deleteScheduledPublishJobs.js.map +1 -1
  427. package/dist/versions/drafts/appendVersionToQueryKey.d.ts.map +1 -1
  428. package/dist/versions/drafts/appendVersionToQueryKey.js +1 -9
  429. package/dist/versions/drafts/appendVersionToQueryKey.js.map +1 -1
  430. package/dist/versions/drafts/replaceWithDraftIfAvailable.d.ts.map +1 -1
  431. package/dist/versions/drafts/replaceWithDraftIfAvailable.js +1 -8
  432. package/dist/versions/drafts/replaceWithDraftIfAvailable.js.map +1 -1
  433. package/dist/versions/enforceMaxVersions.d.ts +0 -1
  434. package/dist/versions/enforceMaxVersions.d.ts.map +1 -1
  435. package/dist/versions/enforceMaxVersions.js +6 -22
  436. package/dist/versions/enforceMaxVersions.js.map +1 -1
  437. package/dist/versions/getLatestCollectionVersion.d.ts.map +1 -1
  438. package/dist/versions/getLatestCollectionVersion.js +2 -10
  439. package/dist/versions/getLatestCollectionVersion.js.map +1 -1
  440. package/dist/versions/getLatestGlobalVersion.d.ts +2 -6
  441. package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
  442. package/dist/versions/getLatestGlobalVersion.js +21 -65
  443. package/dist/versions/getLatestGlobalVersion.js.map +1 -1
  444. package/dist/versions/isInheritedReadVersionsAccess.js.map +1 -1
  445. package/dist/versions/saveVersion.d.ts +0 -7
  446. package/dist/versions/saveVersion.d.ts.map +1 -1
  447. package/dist/versions/saveVersion.js +4 -27
  448. package/dist/versions/saveVersion.js.map +1 -1
  449. package/dist/versions/updateLatestVersion.d.ts +0 -1
  450. package/dist/versions/updateLatestVersion.d.ts.map +1 -1
  451. package/dist/versions/updateLatestVersion.js +7 -24
  452. package/dist/versions/updateLatestVersion.js.map +1 -1
  453. package/package.json +30 -28
  454. package/skills/payload/reference/ENDPOINTS.md +3 -9
  455. package/skills/payload/reference/PLUGIN-DEVELOPMENT.md +4 -4
  456. package/dist/admin/getAdminPreferences.d.ts +0 -10
  457. package/dist/admin/getAdminPreferences.d.ts.map +0 -1
  458. package/dist/admin/getAdminPreferences.js +0 -53
  459. package/dist/admin/getAdminPreferences.js.map +0 -1
  460. package/dist/admin/getRequestBranch.d.ts +0 -6
  461. package/dist/admin/getRequestBranch.d.ts.map +0 -1
  462. package/dist/admin/getRequestBranch.js +0 -17
  463. package/dist/admin/getRequestBranch.js.map +0 -1
  464. package/dist/branching/appendBranchFilter.d.ts +0 -30
  465. package/dist/branching/appendBranchFilter.d.ts.map +0 -1
  466. package/dist/branching/appendBranchFilter.js +0 -105
  467. package/dist/branching/appendBranchFilter.js.map +0 -1
  468. package/dist/branching/assertBranchAccess.d.ts +0 -10
  469. package/dist/branching/assertBranchAccess.d.ts.map +0 -1
  470. package/dist/branching/assertBranchAccess.js +0 -36
  471. package/dist/branching/assertBranchAccess.js.map +0 -1
  472. package/dist/branching/assertBranchActionAccess.d.ts +0 -10
  473. package/dist/branching/assertBranchActionAccess.d.ts.map +0 -1
  474. package/dist/branching/assertBranchActionAccess.js +0 -15
  475. package/dist/branching/assertBranchActionAccess.js.map +0 -1
  476. package/dist/branching/assertBranchCreatedDocumentsUnreferenced.d.ts +0 -53
  477. package/dist/branching/assertBranchCreatedDocumentsUnreferenced.d.ts.map +0 -1
  478. package/dist/branching/assertBranchCreatedDocumentsUnreferenced.js +0 -833
  479. package/dist/branching/assertBranchCreatedDocumentsUnreferenced.js.map +0 -1
  480. package/dist/branching/assertBranchReadable.d.ts +0 -36
  481. package/dist/branching/assertBranchReadable.d.ts.map +0 -1
  482. package/dist/branching/assertBranchReadable.js +0 -83
  483. package/dist/branching/assertBranchReadable.js.map +0 -1
  484. package/dist/branching/assertBranchUpdateAccess.d.ts +0 -8
  485. package/dist/branching/assertBranchUpdateAccess.d.ts.map +0 -1
  486. package/dist/branching/assertBranchUpdateAccess.js +0 -12
  487. package/dist/branching/assertBranchUpdateAccess.js.map +0 -1
  488. package/dist/branching/assertBranchWritable.d.ts +0 -18
  489. package/dist/branching/assertBranchWritable.d.ts.map +0 -1
  490. package/dist/branching/assertBranchWritable.js +0 -46
  491. package/dist/branching/assertBranchWritable.js.map +0 -1
  492. package/dist/branching/branchIDs.d.ts +0 -38
  493. package/dist/branching/branchIDs.d.ts.map +0 -1
  494. package/dist/branching/branchIDs.js +0 -113
  495. package/dist/branching/branchIDs.js.map +0 -1
  496. package/dist/branching/branchSelect.d.ts +0 -42
  497. package/dist/branching/branchSelect.d.ts.map +0 -1
  498. package/dist/branching/branchSelect.js +0 -97
  499. package/dist/branching/branchSelect.js.map +0 -1
  500. package/dist/branching/checkFieldAccess.d.ts +0 -21
  501. package/dist/branching/checkFieldAccess.d.ts.map +0 -1
  502. package/dist/branching/checkFieldAccess.js +0 -238
  503. package/dist/branching/checkFieldAccess.js.map +0 -1
  504. package/dist/branching/collections.d.ts +0 -14
  505. package/dist/branching/collections.d.ts.map +0 -1
  506. package/dist/branching/collections.js +0 -713
  507. package/dist/branching/collections.js.map +0 -1
  508. package/dist/branching/combineBranchAccess.d.ts +0 -6
  509. package/dist/branching/combineBranchAccess.d.ts.map +0 -1
  510. package/dist/branching/combineBranchAccess.js +0 -22
  511. package/dist/branching/combineBranchAccess.js.map +0 -1
  512. package/dist/branching/copyUploadFilesToBranch.d.ts +0 -9
  513. package/dist/branching/copyUploadFilesToBranch.d.ts.map +0 -1
  514. package/dist/branching/copyUploadFilesToBranch.js +0 -126
  515. package/dist/branching/copyUploadFilesToBranch.js.map +0 -1
  516. package/dist/branching/createShadowRow.d.ts +0 -70
  517. package/dist/branching/createShadowRow.d.ts.map +0 -1
  518. package/dist/branching/createShadowRow.js +0 -296
  519. package/dist/branching/createShadowRow.js.map +0 -1
  520. package/dist/branching/discard.d.ts +0 -52
  521. package/dist/branching/discard.d.ts.map +0 -1
  522. package/dist/branching/discard.js +0 -428
  523. package/dist/branching/discard.js.map +0 -1
  524. package/dist/branching/effectiveOperations.d.ts +0 -55
  525. package/dist/branching/effectiveOperations.d.ts.map +0 -1
  526. package/dist/branching/effectiveOperations.js +0 -472
  527. package/dist/branching/effectiveOperations.js.map +0 -1
  528. package/dist/branching/endpoints/discard.d.ts +0 -15
  529. package/dist/branching/endpoints/discard.d.ts.map +0 -1
  530. package/dist/branching/endpoints/discard.js +0 -55
  531. package/dist/branching/endpoints/discard.js.map +0 -1
  532. package/dist/branching/endpoints/merge.d.ts +0 -34
  533. package/dist/branching/endpoints/merge.d.ts.map +0 -1
  534. package/dist/branching/endpoints/merge.js +0 -119
  535. package/dist/branching/endpoints/merge.js.map +0 -1
  536. package/dist/branching/forkDocument.d.ts +0 -20
  537. package/dist/branching/forkDocument.d.ts.map +0 -1
  538. package/dist/branching/forkDocument.js +0 -169
  539. package/dist/branching/forkDocument.js.map +0 -1
  540. package/dist/branching/globalMergeWrites.d.ts +0 -21
  541. package/dist/branching/globalMergeWrites.d.ts.map +0 -1
  542. package/dist/branching/globalMergeWrites.js +0 -146
  543. package/dist/branching/globalMergeWrites.js.map +0 -1
  544. package/dist/branching/globals.d.ts +0 -49
  545. package/dist/branching/globals.d.ts.map +0 -1
  546. package/dist/branching/globals.js +0 -197
  547. package/dist/branching/globals.js.map +0 -1
  548. package/dist/branching/hooks.d.ts +0 -24
  549. package/dist/branching/hooks.d.ts.map +0 -1
  550. package/dist/branching/hooks.js +0 -92
  551. package/dist/branching/hooks.js.map +0 -1
  552. package/dist/branching/injectBranchFields.d.ts +0 -40
  553. package/dist/branching/injectBranchFields.d.ts.map +0 -1
  554. package/dist/branching/injectBranchFields.js +0 -229
  555. package/dist/branching/injectBranchFields.js.map +0 -1
  556. package/dist/branching/merge/applyMergeChange.d.ts +0 -27
  557. package/dist/branching/merge/applyMergeChange.d.ts.map +0 -1
  558. package/dist/branching/merge/applyMergeChange.js +0 -853
  559. package/dist/branching/merge/applyMergeChange.js.map +0 -1
  560. package/dist/branching/merge/branchMergeStatus.d.ts +0 -12
  561. package/dist/branching/merge/branchMergeStatus.d.ts.map +0 -1
  562. package/dist/branching/merge/branchMergeStatus.js +0 -74
  563. package/dist/branching/merge/branchMergeStatus.js.map +0 -1
  564. package/dist/branching/merge/executeMerge.d.ts +0 -22
  565. package/dist/branching/merge/executeMerge.d.ts.map +0 -1
  566. package/dist/branching/merge/executeMerge.js +0 -600
  567. package/dist/branching/merge/executeMerge.js.map +0 -1
  568. package/dist/branching/merge/finalizeMerge.d.ts +0 -40
  569. package/dist/branching/merge/finalizeMerge.d.ts.map +0 -1
  570. package/dist/branching/merge/finalizeMerge.js +0 -237
  571. package/dist/branching/merge/finalizeMerge.js.map +0 -1
  572. package/dist/branching/merge/mergeLedger.d.ts +0 -40
  573. package/dist/branching/merge/mergeLedger.d.ts.map +0 -1
  574. package/dist/branching/merge/mergeLedger.js +0 -130
  575. package/dist/branching/merge/mergeLedger.js.map +0 -1
  576. package/dist/branching/merge/prepareMerge.d.ts +0 -41
  577. package/dist/branching/merge/prepareMerge.d.ts.map +0 -1
  578. package/dist/branching/merge/prepareMerge.js +0 -234
  579. package/dist/branching/merge/prepareMerge.js.map +0 -1
  580. package/dist/branching/merge/recoverMerge.d.ts +0 -16
  581. package/dist/branching/merge/recoverMerge.d.ts.map +0 -1
  582. package/dist/branching/merge/recoverMerge.js +0 -199
  583. package/dist/branching/merge/recoverMerge.js.map +0 -1
  584. package/dist/branching/merge/retryFailedCleanups.d.ts +0 -36
  585. package/dist/branching/merge/retryFailedCleanups.d.ts.map +0 -1
  586. package/dist/branching/merge/retryFailedCleanups.js +0 -335
  587. package/dist/branching/merge/retryFailedCleanups.js.map +0 -1
  588. package/dist/branching/merge/utilities.d.ts +0 -35
  589. package/dist/branching/merge/utilities.d.ts.map +0 -1
  590. package/dist/branching/merge/utilities.js +0 -54
  591. package/dist/branching/merge/utilities.js.map +0 -1
  592. package/dist/branching/merge.d.ts +0 -88
  593. package/dist/branching/merge.d.ts.map +0 -1
  594. package/dist/branching/merge.js +0 -163
  595. package/dist/branching/merge.js.map +0 -1
  596. package/dist/branching/mergeWriteGuard.d.ts +0 -20
  597. package/dist/branching/mergeWriteGuard.d.ts.map +0 -1
  598. package/dist/branching/mergeWriteGuard.js +0 -27
  599. package/dist/branching/mergeWriteGuard.js.map +0 -1
  600. package/dist/branching/preflight.d.ts +0 -71
  601. package/dist/branching/preflight.d.ts.map +0 -1
  602. package/dist/branching/preflight.js +0 -757
  603. package/dist/branching/preflight.js.map +0 -1
  604. package/dist/branching/readLocalizedBranchWrite.d.ts +0 -14
  605. package/dist/branching/readLocalizedBranchWrite.d.ts.map +0 -1
  606. package/dist/branching/readLocalizedBranchWrite.js +0 -90
  607. package/dist/branching/readLocalizedBranchWrite.js.map +0 -1
  608. package/dist/branching/readMergeSnapshot.d.ts +0 -18
  609. package/dist/branching/readMergeSnapshot.d.ts.map +0 -1
  610. package/dist/branching/readMergeSnapshot.js +0 -99
  611. package/dist/branching/readMergeSnapshot.js.map +0 -1
  612. package/dist/branching/resolveBranch.d.ts +0 -153
  613. package/dist/branching/resolveBranch.d.ts.map +0 -1
  614. package/dist/branching/resolveBranch.js +0 -363
  615. package/dist/branching/resolveBranch.js.map +0 -1
  616. package/dist/branching/resolveBranchActionAccess.d.ts +0 -8
  617. package/dist/branching/resolveBranchActionAccess.d.ts.map +0 -1
  618. package/dist/branching/resolveBranchActionAccess.js +0 -9
  619. package/dist/branching/resolveBranchActionAccess.js.map +0 -1
  620. package/dist/branching/resolveBranchQuery.d.ts +0 -48
  621. package/dist/branching/resolveBranchQuery.d.ts.map +0 -1
  622. package/dist/branching/resolveBranchQuery.js +0 -115
  623. package/dist/branching/resolveBranchQuery.js.map +0 -1
  624. package/dist/branching/resolveBranchRowID.d.ts +0 -22
  625. package/dist/branching/resolveBranchRowID.d.ts.map +0 -1
  626. package/dist/branching/resolveBranchRowID.js +0 -70
  627. package/dist/branching/resolveBranchRowID.js.map +0 -1
  628. package/dist/branching/sanitizeBranchingConfig.d.ts +0 -31
  629. package/dist/branching/sanitizeBranchingConfig.d.ts.map +0 -1
  630. package/dist/branching/sanitizeBranchingConfig.js +0 -110
  631. package/dist/branching/sanitizeBranchingConfig.js.map +0 -1
  632. package/dist/branching/schedule/job.d.ts +0 -51
  633. package/dist/branching/schedule/job.d.ts.map +0 -1
  634. package/dist/branching/schedule/job.js +0 -151
  635. package/dist/branching/schedule/job.js.map +0 -1
  636. package/dist/branching/selectBranchChanges.d.ts +0 -8
  637. package/dist/branching/selectBranchChanges.d.ts.map +0 -1
  638. package/dist/branching/selectBranchChanges.js +0 -9
  639. package/dist/branching/selectBranchChanges.js.map +0 -1
  640. package/dist/branching/stripBranchMergeData.d.ts +0 -11
  641. package/dist/branching/stripBranchMergeData.d.ts.map +0 -1
  642. package/dist/branching/stripBranchMergeData.js +0 -20
  643. package/dist/branching/stripBranchMergeData.js.map +0 -1
  644. package/dist/branching/tombstone.d.ts +0 -91
  645. package/dist/branching/tombstone.d.ts.map +0 -1
  646. package/dist/branching/tombstone.js +0 -546
  647. package/dist/branching/tombstone.js.map +0 -1
  648. package/dist/branching/types.d.ts +0 -158
  649. package/dist/branching/types.d.ts.map +0 -1
  650. package/dist/branching/types.js +0 -54
  651. package/dist/branching/types.js.map +0 -1
  652. package/dist/branching/validation.d.ts +0 -47
  653. package/dist/branching/validation.d.ts.map +0 -1
  654. package/dist/branching/validation.js +0 -272
  655. package/dist/branching/validation.js.map +0 -1
  656. package/dist/branching/versions.d.ts +0 -131
  657. package/dist/branching/versions.d.ts.map +0 -1
  658. package/dist/branching/versions.js +0 -572
  659. package/dist/branching/versions.js.map +0 -1
  660. package/dist/collections/operations/utilities/createOperationRetryRequest.d.ts +0 -23
  661. package/dist/collections/operations/utilities/createOperationRetryRequest.d.ts.map +0 -1
  662. package/dist/collections/operations/utilities/createOperationRetryRequest.js +0 -683
  663. package/dist/collections/operations/utilities/createOperationRetryRequest.js.map +0 -1
  664. package/dist/fields/hooks/beforeValidate/throwOnAccessDenied.d.ts +0 -3
  665. package/dist/fields/hooks/beforeValidate/throwOnAccessDenied.d.ts.map +0 -1
  666. package/dist/fields/hooks/beforeValidate/throwOnAccessDenied.js +0 -3
  667. package/dist/fields/hooks/beforeValidate/throwOnAccessDenied.js.map +0 -1
  668. package/dist/uploads/appendBranchToFileURL.d.ts +0 -6
  669. package/dist/uploads/appendBranchToFileURL.d.ts.map +0 -1
  670. package/dist/uploads/appendBranchToFileURL.js +0 -24
  671. package/dist/uploads/appendBranchToFileURL.js.map +0 -1
  672. package/dist/uploads/deleteUploadFilesExclusiveToDocument.d.ts +0 -15
  673. package/dist/uploads/deleteUploadFilesExclusiveToDocument.d.ts.map +0 -1
  674. package/dist/uploads/deleteUploadFilesExclusiveToDocument.js +0 -62
  675. package/dist/uploads/deleteUploadFilesExclusiveToDocument.js.map +0 -1
  676. package/dist/uploads/fileIdentity.d.ts +0 -24
  677. package/dist/uploads/fileIdentity.d.ts.map +0 -1
  678. package/dist/uploads/fileIdentity.js +0 -36
  679. package/dist/uploads/fileIdentity.js.map +0 -1
  680. package/dist/uploads/fileQuarantine.d.ts +0 -17
  681. package/dist/uploads/fileQuarantine.d.ts.map +0 -1
  682. package/dist/uploads/fileQuarantine.js +0 -52
  683. package/dist/uploads/fileQuarantine.js.map +0 -1
  684. package/dist/uploads/linkFileWithoutOverwrite.d.ts +0 -13
  685. package/dist/uploads/linkFileWithoutOverwrite.d.ts.map +0 -1
  686. package/dist/uploads/linkFileWithoutOverwrite.js +0 -13
  687. package/dist/uploads/linkFileWithoutOverwrite.js.map +0 -1
  688. package/dist/uploads/uploadFileRollback.d.ts +0 -31
  689. package/dist/uploads/uploadFileRollback.d.ts.map +0 -1
  690. package/dist/uploads/uploadFileRollback.js +0 -269
  691. package/dist/uploads/uploadFileRollback.js.map +0 -1
  692. package/dist/utilities/extractRelationshipID.d.ts +0 -4
  693. package/dist/utilities/extractRelationshipID.d.ts.map +0 -1
  694. package/dist/utilities/extractRelationshipID.js +0 -14
  695. package/dist/utilities/extractRelationshipID.js.map +0 -1
  696. package/dist/utilities/transactionCallbacks.d.ts +0 -77
  697. package/dist/utilities/transactionCallbacks.d.ts.map +0 -1
  698. package/dist/utilities/transactionCallbacks.js +0 -299
  699. package/dist/utilities/transactionCallbacks.js.map +0 -1
  700. package/dist/utilities/transactionMutationTracker.d.ts +0 -21
  701. package/dist/utilities/transactionMutationTracker.d.ts.map +0 -1
  702. package/dist/utilities/transactionMutationTracker.js +0 -71
  703. package/dist/utilities/transactionMutationTracker.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"createPayloadRequestFromWebRequest.d.ts","sourceRoot":"","sources":["../../src/utilities/createPayloadRequestFromWebRequest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAUvD,KAAK,IAAI,GAAG;IACV,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAA;IAClD,MAAM,CAAC,EAAE;QACP,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;IACD,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,kCAAkC,wFAM5C,IAAI,KAAG,OAAO,CAAC,cAAc,CA+G/B,CAAA"}
1
+ {"version":3,"file":"createPayloadRequestFromWebRequest.d.ts","sourceRoot":"","sources":["../../src/utilities/createPayloadRequestFromWebRequest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAUvD,KAAK,IAAI,GAAG;IACV,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAA;IAClD,MAAM,CAAC,EAAE;QACP,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;IACD,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,eAAO,MAAM,kCAAkC,4GAO5C,IAAI,KAAG,OAAO,CAAC,cAAc,CA+F/B,CAAA;AAED,8EAA8E;AAC9E,eAAO,MAAM,mBAAmB,4BAG7B;IACD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,OAAO,CAAC,cAAc,CAgBzB,CAAA"}
@@ -7,7 +7,7 @@ import { createPayloadRequest } from './createPayloadRequest.js';
7
7
  import { formatAdminURL } from './formatAdminURL.js';
8
8
  import { getRequestLanguage } from './getRequestLanguage.js';
9
9
  import { parseCookies } from './parseCookies.js';
10
- export const createPayloadRequestFromWebRequest = async ({ canSetHeaders, config: configPromise, params, payloadInstanceCacheKey, request })=>{
10
+ export const createPayloadRequestFromWebRequest = async ({ canSetHeaders, config: configPromise, params, payloadInstanceCacheKey, request, shouldAuthenticate = true })=>{
11
11
  const cookies = parseCookies(request.headers);
12
12
  const payload = await getPayload({
13
13
  config: configPromise,
@@ -18,7 +18,6 @@ export const createPayloadRequestFromWebRequest = async ({ canSetHeaders, config
18
18
  const localization = config.localization;
19
19
  const urlProperties = new URL(request.url);
20
20
  const { pathname, searchParams } = urlProperties;
21
- const branch = searchParams.get('branch');
22
21
  const isGraphQL = !config.graphQL.disable && pathname === formatAdminURL({
23
22
  apiRoute: config.routes.api,
24
23
  path: config.routes.graphQL
@@ -70,7 +69,6 @@ export const createPayloadRequestFromWebRequest = async ({ canSetHeaders, config
70
69
  transactionID: undefined
71
70
  });
72
71
  const req = await createPayloadRequest({
73
- branch: branch || undefined,
74
72
  fallbackLocale: fallbackLocale,
75
73
  locale: locale ?? undefined,
76
74
  payload,
@@ -80,11 +78,17 @@ export const createPayloadRequestFromWebRequest = async ({ canSetHeaders, config
80
78
  fallbackLocale,
81
79
  locale
82
80
  });
81
+ return shouldAuthenticate ? authenticateRequest({
82
+ canSetHeaders,
83
+ req
84
+ }) : req;
85
+ };
86
+ /** Runs the auth strategies and sets `req.user` and `req.responseHeaders`. */ export const authenticateRequest = async ({ canSetHeaders, req })=>{
83
87
  const { responseHeaders, user } = await executeAuthStrategies({
84
88
  canSetHeaders,
85
89
  headers: req.headers,
86
- isGraphQL,
87
- payload,
90
+ isGraphQL: req.payloadAPI === 'GraphQL',
91
+ payload: req.payload,
88
92
  req
89
93
  });
90
94
  req.user = user;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/createPayloadRequestFromWebRequest.ts"],"sourcesContent":["import { initI18n } from '@payloadcms/translations'\nimport * as qs from 'qs-esm'\n\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { TypedFallbackLocale, TypedLocale } from '../index.js'\nimport type { PayloadRequest } from '../types/index.js'\n\nimport { executeAuthStrategies } from '../auth/executeAuthStrategies.js'\nimport { getPayload } from '../index.js'\nimport { sanitizeLocales } from './addLocalesToRequest.js'\nimport { createPayloadRequest } from './createPayloadRequest.js'\nimport { formatAdminURL } from './formatAdminURL.js'\nimport { getRequestLanguage } from './getRequestLanguage.js'\nimport { parseCookies } from './parseCookies.js'\n\ntype Args = {\n canSetHeaders?: boolean\n config: Promise<SanitizedConfig> | SanitizedConfig\n params?: {\n collection: string\n }\n payloadInstanceCacheKey?: string\n request: Request\n}\n\nexport const createPayloadRequestFromWebRequest = async ({\n canSetHeaders,\n config: configPromise,\n params,\n payloadInstanceCacheKey,\n request,\n}: Args): Promise<PayloadRequest> => {\n const cookies = parseCookies(request.headers)\n const payload = await getPayload({\n config: configPromise,\n cron: true,\n key: payloadInstanceCacheKey,\n })\n\n const { config } = payload\n const localization = config.localization\n\n const urlProperties = new URL(request.url)\n const { pathname, searchParams } = urlProperties\n const branch = searchParams.get('branch')\n\n const isGraphQL =\n !config.graphQL.disable &&\n pathname ===\n formatAdminURL({\n apiRoute: config.routes.api,\n path: config.routes.graphQL as `/${string}`,\n })\n\n const language = getRequestLanguage({\n config,\n cookies,\n headers: request.headers,\n })\n\n const i18n = await initI18n({\n config: config.i18n,\n context: 'api',\n language,\n })\n\n let locale = searchParams.get('locale')\n\n const { search: queryToParse } = urlProperties\n\n const query = queryToParse\n ? qs.parse(queryToParse, {\n allowEmptyArrays: true,\n arrayLimit: 1000,\n depth: 10,\n ignoreQueryPrefix: true,\n })\n : {}\n\n const fallbackFromRequest = (query.fallbackLocale ||\n searchParams.get('fallback-locale') ||\n searchParams.get('fallbackLocale')) as TypedFallbackLocale\n\n let fallbackLocale = fallbackFromRequest\n\n if (localization) {\n const locales = sanitizeLocales({\n fallbackLocale: fallbackLocale!,\n locale: locale!,\n localization,\n })\n\n fallbackLocale = locales.fallbackLocale!\n locale = locales.locale!\n }\n\n Object.assign(request, {\n hash: urlProperties.hash,\n host: urlProperties.host,\n href: urlProperties.href,\n i18n,\n origin: urlProperties.origin,\n pathname: urlProperties.pathname,\n payloadAPI: isGraphQL ? 'GraphQL' : 'REST',\n payloadUploadSizes: {},\n port: urlProperties.port,\n protocol: urlProperties.protocol,\n query,\n routeParams: params || {},\n search: urlProperties.search,\n searchParams: urlProperties.searchParams,\n transactionID: undefined,\n })\n\n const req = await createPayloadRequest({\n branch: branch || undefined,\n fallbackLocale: fallbackLocale as false | TypedLocale | undefined,\n locale: locale ?? undefined,\n payload,\n req: request,\n })\n\n Object.assign(req, {\n fallbackLocale,\n locale,\n })\n\n const { responseHeaders, user } = await executeAuthStrategies({\n canSetHeaders,\n headers: req.headers,\n isGraphQL,\n payload,\n req,\n })\n\n req.user = user\n\n if (responseHeaders) {\n req.responseHeaders = responseHeaders\n }\n\n return req\n}\n"],"names":["initI18n","qs","executeAuthStrategies","getPayload","sanitizeLocales","createPayloadRequest","formatAdminURL","getRequestLanguage","parseCookies","createPayloadRequestFromWebRequest","canSetHeaders","config","configPromise","params","payloadInstanceCacheKey","request","cookies","headers","payload","cron","key","localization","urlProperties","URL","url","pathname","searchParams","branch","get","isGraphQL","graphQL","disable","apiRoute","routes","api","path","language","i18n","context","locale","search","queryToParse","query","parse","allowEmptyArrays","arrayLimit","depth","ignoreQueryPrefix","fallbackFromRequest","fallbackLocale","locales","Object","assign","hash","host","href","origin","payloadAPI","payloadUploadSizes","port","protocol","routeParams","transactionID","undefined","req","responseHeaders","user"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,2BAA0B;AACnD,YAAYC,QAAQ,SAAQ;AAM5B,SAASC,qBAAqB,QAAQ,mCAAkC;AACxE,SAASC,UAAU,QAAQ,cAAa;AACxC,SAASC,eAAe,QAAQ,2BAA0B;AAC1D,SAASC,oBAAoB,QAAQ,4BAA2B;AAChE,SAASC,cAAc,QAAQ,sBAAqB;AACpD,SAASC,kBAAkB,QAAQ,0BAAyB;AAC5D,SAASC,YAAY,QAAQ,oBAAmB;AAYhD,OAAO,MAAMC,qCAAqC,OAAO,EACvDC,aAAa,EACbC,QAAQC,aAAa,EACrBC,MAAM,EACNC,uBAAuB,EACvBC,OAAO,EACF;IACL,MAAMC,UAAUR,aAAaO,QAAQE,OAAO;IAC5C,MAAMC,UAAU,MAAMf,WAAW;QAC/BQ,QAAQC;QACRO,MAAM;QACNC,KAAKN;IACP;IAEA,MAAM,EAAEH,MAAM,EAAE,GAAGO;IACnB,MAAMG,eAAeV,OAAOU,YAAY;IAExC,MAAMC,gBAAgB,IAAIC,IAAIR,QAAQS,GAAG;IACzC,MAAM,EAAEC,QAAQ,EAAEC,YAAY,EAAE,GAAGJ;IACnC,MAAMK,SAASD,aAAaE,GAAG,CAAC;IAEhC,MAAMC,YACJ,CAAClB,OAAOmB,OAAO,CAACC,OAAO,IACvBN,aACEnB,eAAe;QACb0B,UAAUrB,OAAOsB,MAAM,CAACC,GAAG;QAC3BC,MAAMxB,OAAOsB,MAAM,CAACH,OAAO;IAC7B;IAEJ,MAAMM,WAAW7B,mBAAmB;QAClCI;QACAK;QACAC,SAASF,QAAQE,OAAO;IAC1B;IAEA,MAAMoB,OAAO,MAAMrC,SAAS;QAC1BW,QAAQA,OAAO0B,IAAI;QACnBC,SAAS;QACTF;IACF;IAEA,IAAIG,SAASb,aAAaE,GAAG,CAAC;IAE9B,MAAM,EAAEY,QAAQC,YAAY,EAAE,GAAGnB;IAEjC,MAAMoB,QAAQD,eACVxC,GAAG0C,KAAK,CAACF,cAAc;QACrBG,kBAAkB;QAClBC,YAAY;QACZC,OAAO;QACPC,mBAAmB;IACrB,KACA,CAAC;IAEL,MAAMC,sBAAuBN,MAAMO,cAAc,IAC/CvB,aAAaE,GAAG,CAAC,sBACjBF,aAAaE,GAAG,CAAC;IAEnB,IAAIqB,iBAAiBD;IAErB,IAAI3B,cAAc;QAChB,MAAM6B,UAAU9C,gBAAgB;YAC9B6C,gBAAgBA;YAChBV,QAAQA;YACRlB;QACF;QAEA4B,iBAAiBC,QAAQD,cAAc;QACvCV,SAASW,QAAQX,MAAM;IACzB;IAEAY,OAAOC,MAAM,CAACrC,SAAS;QACrBsC,MAAM/B,cAAc+B,IAAI;QACxBC,MAAMhC,cAAcgC,IAAI;QACxBC,MAAMjC,cAAciC,IAAI;QACxBlB;QACAmB,QAAQlC,cAAckC,MAAM;QAC5B/B,UAAUH,cAAcG,QAAQ;QAChCgC,YAAY5B,YAAY,YAAY;QACpC6B,oBAAoB,CAAC;QACrBC,MAAMrC,cAAcqC,IAAI;QACxBC,UAAUtC,cAAcsC,QAAQ;QAChClB;QACAmB,aAAahD,UAAU,CAAC;QACxB2B,QAAQlB,cAAckB,MAAM;QAC5Bd,cAAcJ,cAAcI,YAAY;QACxCoC,eAAeC;IACjB;IAEA,MAAMC,MAAM,MAAM3D,qBAAqB;QACrCsB,QAAQA,UAAUoC;QAClBd,gBAAgBA;QAChBV,QAAQA,UAAUwB;QAClB7C;QACA8C,KAAKjD;IACP;IAEAoC,OAAOC,MAAM,CAACY,KAAK;QACjBf;QACAV;IACF;IAEA,MAAM,EAAE0B,eAAe,EAAEC,IAAI,EAAE,GAAG,MAAMhE,sBAAsB;QAC5DQ;QACAO,SAAS+C,IAAI/C,OAAO;QACpBY;QACAX;QACA8C;IACF;IAEAA,IAAIE,IAAI,GAAGA;IAEX,IAAID,iBAAiB;QACnBD,IAAIC,eAAe,GAAGA;IACxB;IAEA,OAAOD;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/createPayloadRequestFromWebRequest.ts"],"sourcesContent":["import { initI18n } from '@payloadcms/translations'\nimport * as qs from 'qs-esm'\n\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { TypedFallbackLocale, TypedLocale } from '../index.js'\nimport type { PayloadRequest } from '../types/index.js'\n\nimport { executeAuthStrategies } from '../auth/executeAuthStrategies.js'\nimport { getPayload } from '../index.js'\nimport { sanitizeLocales } from './addLocalesToRequest.js'\nimport { createPayloadRequest } from './createPayloadRequest.js'\nimport { formatAdminURL } from './formatAdminURL.js'\nimport { getRequestLanguage } from './getRequestLanguage.js'\nimport { parseCookies } from './parseCookies.js'\n\ntype Args = {\n canSetHeaders?: boolean\n config: Promise<SanitizedConfig> | SanitizedConfig\n params?: {\n collection: string\n }\n payloadInstanceCacheKey?: string\n request: Request\n /**\n * Run the auth strategies and set `req.user`.\n *\n * @default true\n */\n shouldAuthenticate?: boolean\n}\n\nexport const createPayloadRequestFromWebRequest = async ({\n canSetHeaders,\n config: configPromise,\n params,\n payloadInstanceCacheKey,\n request,\n shouldAuthenticate = true,\n}: Args): Promise<PayloadRequest> => {\n const cookies = parseCookies(request.headers)\n const payload = await getPayload({\n config: configPromise,\n cron: true,\n key: payloadInstanceCacheKey,\n })\n\n const { config } = payload\n const localization = config.localization\n\n const urlProperties = new URL(request.url)\n const { pathname, searchParams } = urlProperties\n\n const isGraphQL =\n !config.graphQL.disable &&\n pathname ===\n formatAdminURL({\n apiRoute: config.routes.api,\n path: config.routes.graphQL as `/${string}`,\n })\n\n const language = getRequestLanguage({\n config,\n cookies,\n headers: request.headers,\n })\n\n const i18n = await initI18n({\n config: config.i18n,\n context: 'api',\n language,\n })\n\n let locale = searchParams.get('locale')\n\n const { search: queryToParse } = urlProperties\n\n const query = queryToParse\n ? qs.parse(queryToParse, {\n allowEmptyArrays: true,\n arrayLimit: 1000,\n depth: 10,\n ignoreQueryPrefix: true,\n })\n : {}\n\n const fallbackFromRequest = (query.fallbackLocale ||\n searchParams.get('fallback-locale') ||\n searchParams.get('fallbackLocale')) as TypedFallbackLocale\n\n let fallbackLocale = fallbackFromRequest\n\n if (localization) {\n const locales = sanitizeLocales({\n fallbackLocale: fallbackLocale!,\n locale: locale!,\n localization,\n })\n\n fallbackLocale = locales.fallbackLocale!\n locale = locales.locale!\n }\n\n Object.assign(request, {\n hash: urlProperties.hash,\n host: urlProperties.host,\n href: urlProperties.href,\n i18n,\n origin: urlProperties.origin,\n pathname: urlProperties.pathname,\n payloadAPI: isGraphQL ? 'GraphQL' : 'REST',\n payloadUploadSizes: {},\n port: urlProperties.port,\n protocol: urlProperties.protocol,\n query,\n routeParams: params || {},\n search: urlProperties.search,\n searchParams: urlProperties.searchParams,\n transactionID: undefined,\n })\n\n const req = await createPayloadRequest({\n fallbackLocale: fallbackLocale as false | TypedLocale | undefined,\n locale: locale ?? undefined,\n payload,\n req: request,\n })\n\n Object.assign(req, {\n fallbackLocale,\n locale,\n })\n\n return shouldAuthenticate ? authenticateRequest({ canSetHeaders, req }) : req\n}\n\n/** Runs the auth strategies and sets `req.user` and `req.responseHeaders`. */\nexport const authenticateRequest = async ({\n canSetHeaders,\n req,\n}: {\n canSetHeaders?: boolean\n req: PayloadRequest\n}): Promise<PayloadRequest> => {\n const { responseHeaders, user } = await executeAuthStrategies({\n canSetHeaders,\n headers: req.headers,\n isGraphQL: req.payloadAPI === 'GraphQL',\n payload: req.payload,\n req,\n })\n\n req.user = user\n\n if (responseHeaders) {\n req.responseHeaders = responseHeaders\n }\n\n return req\n}\n"],"names":["initI18n","qs","executeAuthStrategies","getPayload","sanitizeLocales","createPayloadRequest","formatAdminURL","getRequestLanguage","parseCookies","createPayloadRequestFromWebRequest","canSetHeaders","config","configPromise","params","payloadInstanceCacheKey","request","shouldAuthenticate","cookies","headers","payload","cron","key","localization","urlProperties","URL","url","pathname","searchParams","isGraphQL","graphQL","disable","apiRoute","routes","api","path","language","i18n","context","locale","get","search","queryToParse","query","parse","allowEmptyArrays","arrayLimit","depth","ignoreQueryPrefix","fallbackFromRequest","fallbackLocale","locales","Object","assign","hash","host","href","origin","payloadAPI","payloadUploadSizes","port","protocol","routeParams","transactionID","undefined","req","authenticateRequest","responseHeaders","user"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/deepCopyObject.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { JsonValue } from '../types/index.js'\n\n/*\nMain deepCopyObject handling - from rfdc: https://github.com/davidmarkclements/rfdc/blob/master/index.js\n\nCopyright 2019 \"David Mark Clements <david.mark.clements@gmail.com>\"\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\ndocumentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\nto permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions\nof the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\nTO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\nTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\nCONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n*/\n\nfunction copyBuffer(cur: any) {\n if (cur instanceof Buffer) {\n return Buffer.from(cur)\n }\n\n return new cur.constructor(cur.buffer.slice(), cur.byteOffset, cur.length)\n}\n\nconst constructorHandlers = new Map()\nconstructorHandlers.set(Date, (o: any) => new Date(o))\nconstructorHandlers.set(Map, (o: any, fn: any) => new Map(cloneArray<any>(Array.from(o), fn)))\nconstructorHandlers.set(Set, (o: any, fn: any) => new Set(cloneArray(Array.from(o), fn)))\nconstructorHandlers.set(RegExp, (regex: RegExp) => new RegExp(regex.source, regex.flags))\n\nlet handler: ((o: any, fn: any) => any) | null = null\n\nfunction cloneArray<T extends object>(a: T, fn: (o: any) => any): T {\n const keys = Object.keys(a)\n const a2 = new Array(keys.length) as T\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i] as keyof typeof a\n const cur = a[k] as any\n if (typeof cur !== 'object' || cur === null) {\n setClonedValue({ key: k, target: a2, value: cur })\n } else if (cur instanceof RegExp) {\n setClonedValue({ key: k, target: a2, value: new RegExp(cur.source, cur.flags) })\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n setClonedValue({ key: k, target: a2, value: handler(cur, fn) })\n } else if (ArrayBuffer.isView(cur)) {\n setClonedValue({ key: k, target: a2, value: copyBuffer(cur) })\n } else {\n setClonedValue({ key: k, target: a2, value: fn(cur) })\n }\n }\n return a2\n}\n\nexport const deepCopyObject = <T>(o: T): T => {\n if (typeof o !== 'object' || o === null) {\n return o\n }\n if (Array.isArray(o)) {\n return cloneArray(o, deepCopyObject)\n }\n if (o instanceof RegExp) {\n return new RegExp(o.source, o.flags) as T\n }\n\n if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor))) {\n return handler(o, deepCopyObject)\n }\n const o2 = {} as Record<PropertyKey, any> & T\n for (const k in o) {\n if (Object.hasOwnProperty.call(o, k) === false) {\n continue\n }\n const cur = o[k]\n if (typeof cur !== 'object' || cur === null) {\n setClonedValue({ key: k, target: o2, value: cur })\n } else if (cur instanceof RegExp) {\n setClonedValue({ key: k, target: o2, value: new RegExp(cur.source, cur.flags) })\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n setClonedValue({ key: k, target: o2, value: handler(cur, deepCopyObject) })\n } else if (ArrayBuffer.isView(cur)) {\n setClonedValue({ key: k, target: o2, value: copyBuffer(cur) })\n } else {\n setClonedValue({ key: k, target: o2, value: deepCopyObject(cur) })\n }\n }\n return o2\n}\n\n/*\nFast deepCopyObjectSimple handling - from fast-json-clone: https://github.com/rhysd/fast-json-clone\n\nBenchmark: https://github.com/AlessioGr/fastest-deep-clone-json/blob/main/test/benchmark.js\n*/\n\n/**\n * A deepCopyObject implementation which only works for JSON objects and arrays, and is faster than\n * JSON.parse(JSON.stringify(obj))\n *\n * @param value The JSON value to be cloned. There are two invariants. 1) It must not contain circles\n * as JSON does not allow it. This function will cause infinite loop for such values by\n * design. 2) It must contain JSON values only. Other values like `Date`, `Regexp`, `Map`,\n * `Set`, `Buffer`, ... are not allowed.\n * @returns The cloned JSON value.\n */\nexport function deepCopyObjectSimple<T extends JsonValue>(value: T, filterUndefined = false): T {\n if (typeof value !== 'object' || value === null) {\n return value\n } else if (Array.isArray(value)) {\n const clone = new Array(value.length)\n\n for (let index = 0; index < value.length; index++) {\n if (!Object.hasOwn(value, index)) {\n continue\n }\n\n const element = value[index]\n setClonedValue({\n key: index,\n target: clone,\n value:\n typeof element !== 'object' || element === null\n ? element\n : deepCopyObjectSimple(element, filterUndefined),\n })\n }\n\n return clone as T\n } else {\n if (value instanceof Date) {\n return new Date(value) as unknown as T\n }\n // BSON ObjectId instances expose extra enumerable properties (e.g. `buffer`) via `for...in`\n // that corrupt the copy. Detect BSON types early and convert them to their string representation.\n if ('_bsontype' in value && typeof (value as any).toHexString === 'function') {\n return (value as any).toHexString() as unknown as T\n }\n const ret: { [key: string]: T } = {}\n const objectValue = value as Record<string, T>\n for (const k of Object.keys(objectValue)) {\n const v = objectValue[k]\n if (filterUndefined && v === undefined) {\n continue\n }\n setClonedValue({\n key: k,\n target: ret,\n value:\n typeof v !== 'object' || v === null\n ? v\n : (deepCopyObjectSimple(v as T, filterUndefined) as any),\n })\n }\n return ret as unknown as T\n }\n}\n\nexport function deepCopyObjectSimpleWithoutReactComponents<T extends JsonValue>(\n value: T,\n opts: {\n excludeFiles?: boolean\n } = {},\n): T {\n if (\n typeof value === 'object' &&\n value !== null &&\n '$$typeof' in value &&\n typeof value.$$typeof === 'symbol'\n ) {\n return undefined!\n } else if (typeof value !== 'object' || value === null) {\n return value\n } else if (Array.isArray(value)) {\n const clone = new Array(value.length)\n\n for (let index = 0; index < value.length; index++) {\n if (!Object.hasOwn(value, index)) {\n continue\n }\n\n const element = value[index]\n setClonedValue({\n key: index,\n target: clone,\n value:\n typeof element !== 'object' || element === null\n ? element\n : deepCopyObjectSimpleWithoutReactComponents(element, opts),\n })\n }\n\n return clone as T\n } else {\n // Handle File objects by returning them as-is (don't serialize to plain object) or exclude if excludeFiles is provided\n if (value instanceof File) {\n if (opts.excludeFiles) {\n return undefined!\n }\n\n return value as unknown as T\n }\n if (value instanceof Date) {\n return new Date(value) as unknown as T\n }\n if ('_bsontype' in value && typeof (value as any).toHexString === 'function') {\n return (value as any).toHexString() as unknown as T\n }\n const ret: { [key: string]: T } = {}\n const objectValue = value as Record<string, T>\n for (const k of Object.keys(objectValue)) {\n const v = objectValue[k]\n setClonedValue({\n key: k,\n target: ret,\n value:\n typeof v !== 'object' || v === null\n ? v\n : (deepCopyObjectSimpleWithoutReactComponents(v as T, opts) as any),\n })\n }\n return ret as unknown as T\n }\n}\n\n/**\n * A deepCopyObject implementation which is slower than deepCopyObject, but more correct.\n * Can be used if correctness is more important than speed. Supports circular dependencies\n */\nexport function deepCopyObjectComplex<T>(object: T, cache: WeakMap<any, any> = new WeakMap()): T {\n if (object === null) {\n return null!\n }\n\n if (cache.has(object)) {\n return cache.get(object)\n }\n\n // Handle File\n if (object instanceof File) {\n return object as unknown as T\n }\n\n // Handle Date\n if (object instanceof Date) {\n return new Date(object.getTime()) as unknown as T\n }\n\n // Handle RegExp\n if (object instanceof RegExp) {\n return new RegExp(object.source, object.flags) as unknown as T\n }\n\n // Handle Map\n if (object instanceof Map) {\n const clonedMap = new Map()\n cache.set(object, clonedMap)\n for (const [key, value] of object.entries()) {\n clonedMap.set(key, deepCopyObjectComplex(value, cache))\n }\n return clonedMap as unknown as T\n }\n\n // Handle Set\n if (object instanceof Set) {\n const clonedSet = new Set()\n cache.set(object, clonedSet)\n for (const value of object.values()) {\n clonedSet.add(deepCopyObjectComplex(value, cache))\n }\n return clonedSet as unknown as T\n }\n\n // Handle Array and Object\n if (typeof object === 'object' && object !== null) {\n if ('$$typeof' in object && typeof object.$$typeof === 'symbol') {\n return object\n }\n\n const clonedObject: any = Array.isArray(object)\n ? []\n : Object.create(Object.getPrototypeOf(object))\n cache.set(object, clonedObject)\n\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) ||\n Object.getOwnPropertySymbols(object).includes(key as any)\n ) {\n setClonedValue({\n key,\n target: clonedObject,\n value: deepCopyObjectComplex(object[key], cache),\n })\n }\n }\n\n return clonedObject as T\n }\n\n // Handle all other cases\n return object\n}\n\nfunction setClonedValue<TTarget extends Record<PropertyKey, any>>({\n key,\n target,\n value,\n}: {\n key: PropertyKey\n target: TTarget\n value: any\n}): TTarget {\n if (key === '__proto__' || (!Object.hasOwn(target, key) && key in target)) {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true,\n })\n } else if (!Reflect.set(target, key, value)) {\n throw new TypeError(`Cannot assign to property ${String(key)}`)\n }\n\n return target\n}\n"],"names":["copyBuffer","cur","Buffer","from","buffer","slice","byteOffset","length","constructorHandlers","Map","set","Date","o","fn","cloneArray","Array","Set","RegExp","regex","source","flags","handler","a","keys","Object","a2","i","k","setClonedValue","key","target","value","get","ArrayBuffer","isView","deepCopyObject","isArray","o2","hasOwnProperty","call","deepCopyObjectSimple","filterUndefined","clone","index","hasOwn","element","toHexString","ret","objectValue","v","undefined","deepCopyObjectSimpleWithoutReactComponents","opts","$$typeof","File","excludeFiles","deepCopyObjectComplex","object","cache","WeakMap","has","getTime","clonedMap","entries","clonedSet","values","add","clonedObject","create","getPrototypeOf","prototype","getOwnPropertySymbols","includes","defineProperty","configurable","enumerable","writable","Reflect","TypeError","String"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/deepCopyObject.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { JsonValue } from '../types/index.js'\n\n/*\nMain deepCopyObject handling - from rfdc: https://github.com/davidmarkclements/rfdc/blob/master/index.js\n\nCopyright 2019 \"David Mark Clements <david.mark.clements@gmail.com>\"\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\ndocumentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\nto permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions\nof the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\nTO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\nTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\nCONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n*/\n\nfunction copyBuffer(cur: any) {\n if (cur instanceof Buffer) {\n return Buffer.from(cur)\n }\n\n return new cur.constructor(cur.buffer.slice(), cur.byteOffset, cur.length)\n}\n\nconst constructorHandlers = new Map()\nconstructorHandlers.set(Date, (o: any) => new Date(o))\nconstructorHandlers.set(Map, (o: any, fn: any) => new Map(cloneArray<any>(Array.from(o), fn)))\nconstructorHandlers.set(Set, (o: any, fn: any) => new Set(cloneArray(Array.from(o), fn)))\nconstructorHandlers.set(RegExp, (regex: RegExp) => new RegExp(regex.source, regex.flags))\n\nlet handler: ((o: any, fn: any) => any) | null = null\n\nfunction cloneArray<T extends object>(a: T, fn: (o: any) => any): T {\n const keys = Object.keys(a)\n const a2 = new Array(keys.length) as T\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i] as keyof typeof a\n const cur = a[k] as any\n if (typeof cur !== 'object' || cur === null) {\n setClonedValue({ key: k, target: a2, value: cur })\n } else if (cur instanceof RegExp) {\n setClonedValue({ key: k, target: a2, value: new RegExp(cur.source, cur.flags) })\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n setClonedValue({ key: k, target: a2, value: handler(cur, fn) })\n } else if (ArrayBuffer.isView(cur)) {\n setClonedValue({ key: k, target: a2, value: copyBuffer(cur) })\n } else {\n setClonedValue({ key: k, target: a2, value: fn(cur) })\n }\n }\n return a2\n}\n\nexport const deepCopyObject = <T>(o: T): T => {\n if (typeof o !== 'object' || o === null) {\n return o\n }\n if (Array.isArray(o)) {\n return cloneArray(o, deepCopyObject)\n }\n if (o instanceof RegExp) {\n return new RegExp(o.source, o.flags) as T\n }\n\n if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor))) {\n return handler(o, deepCopyObject)\n }\n const o2 = {} as Record<PropertyKey, any> & T\n for (const k in o) {\n if (Object.hasOwnProperty.call(o, k) === false) {\n continue\n }\n const cur = o[k]\n if (typeof cur !== 'object' || cur === null) {\n setClonedValue({ key: k, target: o2, value: cur })\n } else if (cur instanceof RegExp) {\n setClonedValue({ key: k, target: o2, value: new RegExp(cur.source, cur.flags) })\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n setClonedValue({ key: k, target: o2, value: handler(cur, deepCopyObject) })\n } else if (ArrayBuffer.isView(cur)) {\n setClonedValue({ key: k, target: o2, value: copyBuffer(cur) })\n } else {\n setClonedValue({ key: k, target: o2, value: deepCopyObject(cur) })\n }\n }\n return o2\n}\n\n/*\nFast deepCopyObjectSimple handling - from fast-json-clone: https://github.com/rhysd/fast-json-clone\n\nBenchmark: https://github.com/AlessioGr/fastest-deep-clone-json/blob/main/test/benchmark.js\n*/\n\n/**\n * A deepCopyObject implementation which only works for JSON objects and arrays, and is faster than\n * JSON.parse(JSON.stringify(obj))\n *\n * @param value The JSON value to be cloned. There are two invariants. 1) It must not contain circles\n * as JSON does not allow it. This function will cause infinite loop for such values by\n * design. 2) It must contain JSON values only. Other values like `Date`, `Regexp`, `Map`,\n * `Set`, `Buffer`, ... are not allowed.\n * @returns The cloned JSON value.\n */\nexport function deepCopyObjectSimple<T extends JsonValue>(value: T, filterUndefined = false): T {\n if (typeof value !== 'object' || value === null) {\n return value\n } else if (Array.isArray(value)) {\n const clone = new Array(value.length)\n\n for (let index = 0; index < value.length; index++) {\n if (!Object.hasOwn(value, index)) {\n continue\n }\n\n const element = value[index]\n setClonedValue({\n key: index,\n target: clone,\n value:\n typeof element !== 'object' || element === null\n ? element\n : deepCopyObjectSimple(element, filterUndefined),\n })\n }\n\n return clone as T\n } else {\n if (value instanceof Date) {\n return new Date(value) as unknown as T\n }\n // BSON ObjectId instances expose extra enumerable properties (e.g. `buffer`) via `for...in`\n // that corrupt the copy. Detect BSON types early and convert them to their string representation.\n if ('_bsontype' in value && typeof (value as any).toHexString === 'function') {\n return (value as any).toHexString()\n }\n const ret: { [key: string]: T } = {}\n const objectValue = value as Record<string, T>\n for (const k of Object.keys(objectValue)) {\n const v = objectValue[k]\n if (filterUndefined && v === undefined) {\n continue\n }\n setClonedValue({\n key: k,\n target: ret,\n value:\n typeof v !== 'object' || v === null\n ? v\n : (deepCopyObjectSimple(v as T, filterUndefined) as any),\n })\n }\n return ret as unknown as T\n }\n}\n\nexport function deepCopyObjectSimpleWithoutReactComponents<T extends JsonValue>(\n value: T,\n opts: {\n excludeFiles?: boolean\n } = {},\n): T {\n if (\n typeof value === 'object' &&\n value !== null &&\n '$$typeof' in value &&\n typeof value.$$typeof === 'symbol'\n ) {\n return undefined!\n } else if (typeof value !== 'object' || value === null) {\n return value\n } else if (Array.isArray(value)) {\n const clone = new Array(value.length)\n\n for (let index = 0; index < value.length; index++) {\n if (!Object.hasOwn(value, index)) {\n continue\n }\n\n const element = value[index]\n setClonedValue({\n key: index,\n target: clone,\n value:\n typeof element !== 'object' || element === null\n ? element\n : deepCopyObjectSimpleWithoutReactComponents(element, opts),\n })\n }\n\n return clone as T\n } else {\n // Handle File objects by returning them as-is (don't serialize to plain object) or exclude if excludeFiles is provided\n if (value instanceof File) {\n if (opts.excludeFiles) {\n return undefined!\n }\n\n return value\n }\n if (value instanceof Date) {\n return new Date(value) as unknown as T\n }\n if ('_bsontype' in value && typeof (value as any).toHexString === 'function') {\n return (value as any).toHexString()\n }\n const ret: { [key: string]: T } = {}\n const objectValue = value as Record<string, T>\n for (const k of Object.keys(objectValue)) {\n const v = objectValue[k]\n setClonedValue({\n key: k,\n target: ret,\n value:\n typeof v !== 'object' || v === null\n ? v\n : (deepCopyObjectSimpleWithoutReactComponents(v as T, opts) as any),\n })\n }\n return ret as unknown as T\n }\n}\n\n/**\n * A deepCopyObject implementation which is slower than deepCopyObject, but more correct.\n * Can be used if correctness is more important than speed. Supports circular dependencies\n */\nexport function deepCopyObjectComplex<T>(object: T, cache: WeakMap<any, any> = new WeakMap()): T {\n if (object === null) {\n return null!\n }\n\n if (cache.has(object)) {\n return cache.get(object)\n }\n\n // Handle File\n if (object instanceof File) {\n return object\n }\n\n // Handle Date\n if (object instanceof Date) {\n return new Date(object.getTime()) as unknown as T\n }\n\n // Handle RegExp\n if (object instanceof RegExp) {\n return new RegExp(object.source, object.flags) as unknown as T\n }\n\n // Handle Map\n if (object instanceof Map) {\n const clonedMap = new Map()\n cache.set(object, clonedMap)\n for (const [key, value] of object.entries()) {\n clonedMap.set(key, deepCopyObjectComplex(value, cache))\n }\n return clonedMap as unknown as T\n }\n\n // Handle Set\n if (object instanceof Set) {\n const clonedSet = new Set()\n cache.set(object, clonedSet)\n for (const value of object.values()) {\n clonedSet.add(deepCopyObjectComplex(value, cache))\n }\n return clonedSet as unknown as T\n }\n\n // Handle Array and Object\n if (typeof object === 'object' && object !== null) {\n if ('$$typeof' in object && typeof object.$$typeof === 'symbol') {\n return object\n }\n\n const clonedObject: any = Array.isArray(object)\n ? []\n : Object.create(Object.getPrototypeOf(object))\n cache.set(object, clonedObject)\n\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) ||\n Object.getOwnPropertySymbols(object).includes(key as any)\n ) {\n setClonedValue({\n key,\n target: clonedObject,\n value: deepCopyObjectComplex(object[key], cache),\n })\n }\n }\n\n return clonedObject as T\n }\n\n // Handle all other cases\n return object\n}\n\nfunction setClonedValue<TTarget extends Record<PropertyKey, any>>({\n key,\n target,\n value,\n}: {\n key: PropertyKey\n target: TTarget\n value: any\n}): TTarget {\n if (key === '__proto__' || (!Object.hasOwn(target, key) && key in target)) {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true,\n })\n } else if (!Reflect.set(target, key, value)) {\n throw new TypeError(`Cannot assign to property ${String(key)}`)\n }\n\n return target\n}\n"],"names":["copyBuffer","cur","Buffer","from","buffer","slice","byteOffset","length","constructorHandlers","Map","set","Date","o","fn","cloneArray","Array","Set","RegExp","regex","source","flags","handler","a","keys","Object","a2","i","k","setClonedValue","key","target","value","get","ArrayBuffer","isView","deepCopyObject","isArray","o2","hasOwnProperty","call","deepCopyObjectSimple","filterUndefined","clone","index","hasOwn","element","toHexString","ret","objectValue","v","undefined","deepCopyObjectSimpleWithoutReactComponents","opts","$$typeof","File","excludeFiles","deepCopyObjectComplex","object","cache","WeakMap","has","getTime","clonedMap","entries","clonedSet","values","add","clonedObject","create","getPrototypeOf","prototype","getOwnPropertySymbols","includes","defineProperty","configurable","enumerable","writable","Reflect","TypeError","String"],"mappings":"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"}
@@ -15,7 +15,7 @@ import { isolateObjectProperty } from './isolateObjectProperty.js';
15
15
  disableErrors: true,
16
16
  draft: Boolean(draftsEnabled),
17
17
  limit: 2,
18
- locale: locale,
18
+ locale,
19
19
  overrideAccess,
20
20
  pagination: false,
21
21
  req: queryReq,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/documentMatchingWhereExists.ts"],"sourcesContent":["import type { DefaultDocumentIDType, Locale } from '../index.js'\nimport type { PayloadRequest, Where } from '../types/index.js'\n\nimport { isolateObjectProperty } from './isolateObjectProperty.js'\n\nexport type DocumentMatchingWhereExistsArgs = {\n collection: string\n /**\n * When true, also matches documents whose value only exists in a draft version. A versioned\n * collection keeps draft data in `_versions`, which the main-collection query — and the unique\n * index — would miss.\n */\n draftsEnabled?: boolean\n /** Exclude this document, so a document does not conflict with itself on update. */\n id?: DefaultDocumentIDType\n locale?: Locale['code']\n overrideAccess?: boolean\n req: PayloadRequest\n where: Where\n}\n\n/** Whether another document in `collection` matches `where`. */\nexport const documentMatchingWhereExists = async ({\n id,\n collection,\n draftsEnabled,\n locale,\n overrideAccess = false,\n req,\n where,\n}: DocumentMatchingWhereExistsArgs): Promise<boolean> => {\n const queryReq = isolateObjectProperty(req, ['query', 'transactionID'])\n queryReq.query = { ...req.query }\n delete queryReq.transactionID\n const includeTrashed = Boolean(req.payload.collections[collection]?.config.trash)\n\n const { docs } = await req.payload.find({\n collection,\n depth: 0,\n disableErrors: true,\n draft: Boolean(draftsEnabled),\n limit: 2,\n locale: locale as Parameters<typeof req.payload.find>[0]['locale'],\n overrideAccess,\n pagination: false,\n req: queryReq,\n trash: includeTrashed,\n where,\n })\n\n return docs.some((doc) => doc.id !== id)\n}\n"],"names":["isolateObjectProperty","documentMatchingWhereExists","id","collection","draftsEnabled","locale","overrideAccess","req","where","queryReq","query","transactionID","includeTrashed","Boolean","payload","collections","config","trash","docs","find","depth","disableErrors","draft","limit","pagination","some","doc"],"mappings":"AAGA,SAASA,qBAAqB,QAAQ,6BAA4B;AAkBlE,8DAA8D,GAC9D,OAAO,MAAMC,8BAA8B,OAAO,EAChDC,EAAE,EACFC,UAAU,EACVC,aAAa,EACbC,MAAM,EACNC,iBAAiB,KAAK,EACtBC,GAAG,EACHC,KAAK,EAC2B;IAChC,MAAMC,WAAWT,sBAAsBO,KAAK;QAAC;QAAS;KAAgB;IACtEE,SAASC,KAAK,GAAG;QAAE,GAAGH,IAAIG,KAAK;IAAC;IAChC,OAAOD,SAASE,aAAa;IAC7B,MAAMC,iBAAiBC,QAAQN,IAAIO,OAAO,CAACC,WAAW,CAACZ,WAAW,EAAEa,OAAOC;IAE3E,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMX,IAAIO,OAAO,CAACK,IAAI,CAAC;QACtChB;QACAiB,OAAO;QACPC,eAAe;QACfC,OAAOT,QAAQT;QACfmB,OAAO;QACPlB,QAAQA;QACRC;QACAkB,YAAY;QACZjB,KAAKE;QACLQ,OAAOL;QACPJ;IACF;IAEA,OAAOU,KAAKO,IAAI,CAAC,CAACC,MAAQA,IAAIxB,EAAE,KAAKA;AACvC,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/documentMatchingWhereExists.ts"],"sourcesContent":["import type { DefaultDocumentIDType, Locale } from '../index.js'\nimport type { PayloadRequest, Where } from '../types/index.js'\n\nimport { isolateObjectProperty } from './isolateObjectProperty.js'\n\nexport type DocumentMatchingWhereExistsArgs = {\n collection: string\n /**\n * When true, also matches documents whose value only exists in a draft version. A versioned\n * collection keeps draft data in `_versions`, which the main-collection query — and the unique\n * index — would miss.\n */\n draftsEnabled?: boolean\n /** Exclude this document, so a document does not conflict with itself on update. */\n id?: DefaultDocumentIDType\n locale?: Locale['code']\n overrideAccess?: boolean\n req: PayloadRequest\n where: Where\n}\n\n/** Whether another document in `collection` matches `where`. */\nexport const documentMatchingWhereExists = async ({\n id,\n collection,\n draftsEnabled,\n locale,\n overrideAccess = false,\n req,\n where,\n}: DocumentMatchingWhereExistsArgs): Promise<boolean> => {\n const queryReq = isolateObjectProperty(req, ['query', 'transactionID'])\n queryReq.query = { ...req.query }\n delete queryReq.transactionID\n const includeTrashed = Boolean(req.payload.collections[collection]?.config.trash)\n\n const { docs } = await req.payload.find({\n collection,\n depth: 0,\n disableErrors: true,\n draft: Boolean(draftsEnabled),\n limit: 2,\n locale,\n overrideAccess,\n pagination: false,\n req: queryReq,\n trash: includeTrashed,\n where,\n })\n\n return docs.some((doc) => doc.id !== id)\n}\n"],"names":["isolateObjectProperty","documentMatchingWhereExists","id","collection","draftsEnabled","locale","overrideAccess","req","where","queryReq","query","transactionID","includeTrashed","Boolean","payload","collections","config","trash","docs","find","depth","disableErrors","draft","limit","pagination","some","doc"],"mappings":"AAGA,SAASA,qBAAqB,QAAQ,6BAA4B;AAkBlE,8DAA8D,GAC9D,OAAO,MAAMC,8BAA8B,OAAO,EAChDC,EAAE,EACFC,UAAU,EACVC,aAAa,EACbC,MAAM,EACNC,iBAAiB,KAAK,EACtBC,GAAG,EACHC,KAAK,EAC2B;IAChC,MAAMC,WAAWT,sBAAsBO,KAAK;QAAC;QAAS;KAAgB;IACtEE,SAASC,KAAK,GAAG;QAAE,GAAGH,IAAIG,KAAK;IAAC;IAChC,OAAOD,SAASE,aAAa;IAC7B,MAAMC,iBAAiBC,QAAQN,IAAIO,OAAO,CAACC,WAAW,CAACZ,WAAW,EAAEa,OAAOC;IAE3E,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMX,IAAIO,OAAO,CAACK,IAAI,CAAC;QACtChB;QACAiB,OAAO;QACPC,eAAe;QACfC,OAAOT,QAAQT;QACfmB,OAAO;QACPlB;QACAC;QACAkB,YAAY;QACZjB,KAAKE;QACLQ,OAAOL;QACPJ;IACF;IAEA,OAAOU,KAAKO,IAAI,CAAC,CAACC,MAAQA,IAAIxB,EAAE,KAAKA;AACvC,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"validateEntityData.d.ts","sourceRoot":"","sources":["../../../src/utilities/entityInputSchema/validateEntityData.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAMhF,eAAO,MAAM,sBAAsB,kCAKhC;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,EAAE,cAAc,CAAA;IACnB,IAAI,EAAE,cAAc,CAAA;CACrB,KAAG,IAQH,CAAA;AAED,eAAO,MAAM,kBAAkB,yBAI5B;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,GAAG,EAAE,cAAc,CAAA;IACnB,IAAI,EAAE,UAAU,CAAA;CACjB,KAAG,IAIH,CAAA"}
1
+ {"version":3,"file":"validateEntityData.d.ts","sourceRoot":"","sources":["../../../src/utilities/entityInputSchema/validateEntityData.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAMhF,eAAO,MAAM,sBAAsB,kCAKhC;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,EAAE,cAAc,CAAA;IACnB,IAAI,EAAE,cAAc,CAAA;CACrB,KAAG,IAQH,CAAA;AAED,eAAO,MAAM,kBAAkB,yBAI5B;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,GAAG,EAAE,cAAc,CAAA;IACnB,IAAI,EAAE,UAAU,CAAA;CACjB,KAAG,IAQH,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utilities/entityInputSchema/validateEntityData.ts"],"sourcesContent":["import type { core } from 'zod'\n\nimport { fromJSONSchema } from 'zod'\n\nimport type { CollectionSlug, GlobalSlug, PayloadRequest } from '../../index.js'\nimport type { EntityInputSchema } from './types.js'\n\nimport { ValidationError } from '../../errors/ValidationError.js'\nimport { getCollectionInputSchema, getGlobalInputSchema } from './getEntityInputSchema.js'\n\nexport const validateCollectionData = ({\n slug,\n data,\n partial,\n req,\n}: {\n data: Record<string, unknown>\n partial?: boolean\n req: PayloadRequest\n slug: CollectionSlug\n}): void => {\n const schema = getCollectionInputSchema({\n collectionSlug: slug,\n req,\n shouldKeepDeprecatedProperties: true,\n })\n\n validateEntityData({ slug, data, entity: 'collection', partial, req, schema })\n}\n\nexport const validateGlobalData = ({\n slug,\n data,\n req,\n}: {\n data: Record<string, unknown>\n req: PayloadRequest\n slug: GlobalSlug\n}): void => {\n const schema = getGlobalInputSchema({ globalSlug: slug, req, shouldKeepDeprecatedProperties: true })\n\n validateEntityData({ slug, data, entity: 'global', partial: true, req, schema })\n}\n\nconst validateEntityData = ({\n slug,\n data,\n entity,\n partial,\n req,\n schema,\n}: {\n data: Record<string, unknown>\n entity: 'collection' | 'global'\n partial?: boolean\n req: PayloadRequest\n schema: EntityInputSchema | null\n slug: string\n}): void => {\n if (!schema) {\n return\n }\n\n const validationSchema = partial ? withoutRequired(schema) : schema\n const result = fromJSONSchema(validationSchema as Parameters<typeof fromJSONSchema>[0]).safeParse(\n data,\n )\n\n if (result.success) {\n return\n }\n\n throw new ValidationError({\n [entity]: slug,\n errors: getUsefulIssues(result.error.issues).map(({ message, path }) => ({\n message,\n path: formatDataPath(path),\n })),\n req,\n })\n}\n\n/** Updates and drafts accept partial data, including partial nested objects and array rows. */\nconst withoutRequired = (schema: EntityInputSchema): EntityInputSchema => {\n const {\n $defs,\n additionalProperties,\n anyOf,\n items,\n oneOf,\n properties,\n required: _required,\n ...partialSchema\n } = schema\n\n return {\n ...partialSchema,\n ...($defs ? { $defs: mapSchemaRecord($defs) } : {}),\n ...(typeof additionalProperties === 'object'\n ? { additionalProperties: withoutRequired(additionalProperties) }\n : additionalProperties !== undefined\n ? { additionalProperties }\n : {}),\n ...(anyOf ? { anyOf: anyOf.map(makeSchemaPartial) } : {}),\n ...(items\n ? {\n items: Array.isArray(items)\n ? items.map((item) => withoutRequired(item))\n : withoutRequired(items),\n }\n : {}),\n ...(oneOf ? { oneOf: oneOf.map(makeSchemaPartial) } : {}),\n ...(properties ? { properties: mapSchemaRecord(properties) } : {}),\n }\n}\n\nconst makeSchemaPartial = (schema: boolean | EntityInputSchema): boolean | EntityInputSchema =>\n typeof schema === 'boolean' ? schema : withoutRequired(schema)\n\nconst mapSchemaRecord = <T extends boolean | EntityInputSchema>(\n schemas: Record<string, T>,\n): Record<string, T> =>\n Object.fromEntries(\n Object.entries(schemas).map(([name, schema]) => [name, makeSchemaPartial(schema)]),\n ) as Record<string, T>\n\n/**\n * Zod keeps every failed recursive-union branch. Select the closest matching branch instead of\n * returning a very large error tree to CLI and MCP clients.\n */\nconst getUsefulIssues = (\n issues: core.$ZodIssue[],\n parentPath: PropertyKey[] = [],\n): core.$ZodIssue[] => {\n const selectedIssues = issues.flatMap((issue) => {\n if (issue.code !== 'invalid_union') {\n return [{ ...issue, path: [...parentPath, ...issue.path] }]\n }\n\n const unionPath = [...parentPath, ...issue.path]\n const closestBranch = issue.errors\n .filter((branch) => branch.length > 0)\n .sort(compareIssueBranches)[0]\n\n return closestBranch\n ? getUsefulIssues(closestBranch, unionPath)\n : [{ ...issue, path: unionPath }]\n })\n const uniqueIssues = new Map<string, core.$ZodIssue>()\n\n for (const issue of selectedIssues) {\n const key = `${issue.path.map(String).join('.')}:${issue.message}`\n\n if (!uniqueIssues.has(key)) {\n uniqueIssues.set(key, issue)\n }\n }\n\n return [...uniqueIssues.values()].slice(0, 10)\n}\n\nconst compareIssueBranches = (left: core.$ZodIssue[], right: core.$ZodIssue[]): number => {\n const discriminatorDifference = countDiscriminatorIssues(left) - countDiscriminatorIssues(right)\n\n if (discriminatorDifference !== 0) {\n return discriminatorDifference\n }\n\n const pathDepthDifference = getDeepestPath(right) - getDeepestPath(left)\n\n if (pathDepthDifference !== 0) {\n return pathDepthDifference\n }\n\n return left.length - right.length\n}\n\nconst countDiscriminatorIssues = (issues: core.$ZodIssue[]): number =>\n issues.filter((issue) => {\n const field = issue.path.at(-1)\n\n return field === 'blockType' || field === 'relationTo' || field === 'type'\n }).length\n\nconst getDeepestPath = (issues: core.$ZodIssue[]): number =>\n Math.max(0, ...issues.map((issue) => issue.path.length))\n\nconst formatDataPath = (path: PropertyKey[]): string =>\n path.reduce<string>(\n (result, segment) =>\n typeof segment === 'number' ? `${result}[${segment}]` : `${result}.${String(segment)}`,\n 'data',\n )\n"],"names":["fromJSONSchema","ValidationError","getCollectionInputSchema","getGlobalInputSchema","validateCollectionData","slug","data","partial","req","schema","collectionSlug","shouldKeepDeprecatedProperties","validateEntityData","entity","validateGlobalData","globalSlug","validationSchema","withoutRequired","result","safeParse","success","errors","getUsefulIssues","error","issues","map","message","path","formatDataPath","$defs","additionalProperties","anyOf","items","oneOf","properties","required","_required","partialSchema","mapSchemaRecord","undefined","makeSchemaPartial","Array","isArray","item","schemas","Object","fromEntries","entries","name","parentPath","selectedIssues","flatMap","issue","code","unionPath","closestBranch","filter","branch","length","sort","compareIssueBranches","uniqueIssues","Map","key","String","join","has","set","values","slice","left","right","discriminatorDifference","countDiscriminatorIssues","pathDepthDifference","getDeepestPath","field","at","Math","max","reduce","segment"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utilities/entityInputSchema/validateEntityData.ts"],"sourcesContent":["import type { core } from 'zod'\n\nimport { fromJSONSchema } from 'zod'\n\nimport type { CollectionSlug, GlobalSlug, PayloadRequest } from '../../index.js'\nimport type { EntityInputSchema } from './types.js'\n\nimport { ValidationError } from '../../errors/ValidationError.js'\nimport { getCollectionInputSchema, getGlobalInputSchema } from './getEntityInputSchema.js'\n\nexport const validateCollectionData = ({\n slug,\n data,\n partial,\n req,\n}: {\n data: Record<string, unknown>\n partial?: boolean\n req: PayloadRequest\n slug: CollectionSlug\n}): void => {\n const schema = getCollectionInputSchema({\n collectionSlug: slug,\n req,\n shouldKeepDeprecatedProperties: true,\n })\n\n validateEntityData({ slug, data, entity: 'collection', partial, req, schema })\n}\n\nexport const validateGlobalData = ({\n slug,\n data,\n req,\n}: {\n data: Record<string, unknown>\n req: PayloadRequest\n slug: GlobalSlug\n}): void => {\n const schema = getGlobalInputSchema({\n globalSlug: slug,\n req,\n shouldKeepDeprecatedProperties: true,\n })\n\n validateEntityData({ slug, data, entity: 'global', partial: true, req, schema })\n}\n\nconst validateEntityData = ({\n slug,\n data,\n entity,\n partial,\n req,\n schema,\n}: {\n data: Record<string, unknown>\n entity: 'collection' | 'global'\n partial?: boolean\n req: PayloadRequest\n schema: EntityInputSchema | null\n slug: string\n}): void => {\n if (!schema) {\n return\n }\n\n const validationSchema = partial ? withoutRequired(schema) : schema\n const result = fromJSONSchema(validationSchema as Parameters<typeof fromJSONSchema>[0]).safeParse(\n data,\n )\n\n if (result.success) {\n return\n }\n\n throw new ValidationError({\n [entity]: slug,\n errors: getUsefulIssues(result.error.issues).map(({ message, path }) => ({\n message,\n path: formatDataPath(path),\n })),\n req,\n })\n}\n\n/** Updates and drafts accept partial data, including partial nested objects and array rows. */\nconst withoutRequired = (schema: EntityInputSchema): EntityInputSchema => {\n const {\n $defs,\n additionalProperties,\n anyOf,\n items,\n oneOf,\n properties,\n required: _required,\n ...partialSchema\n } = schema\n\n return {\n ...partialSchema,\n ...($defs ? { $defs: mapSchemaRecord($defs) } : {}),\n ...(typeof additionalProperties === 'object'\n ? { additionalProperties: withoutRequired(additionalProperties) }\n : additionalProperties !== undefined\n ? { additionalProperties }\n : {}),\n ...(anyOf ? { anyOf: anyOf.map(makeSchemaPartial) } : {}),\n ...(items\n ? {\n items: Array.isArray(items)\n ? items.map((item) => withoutRequired(item))\n : withoutRequired(items),\n }\n : {}),\n ...(oneOf ? { oneOf: oneOf.map(makeSchemaPartial) } : {}),\n ...(properties ? { properties: mapSchemaRecord(properties) } : {}),\n }\n}\n\nconst makeSchemaPartial = (schema: boolean | EntityInputSchema): boolean | EntityInputSchema =>\n typeof schema === 'boolean' ? schema : withoutRequired(schema)\n\nconst mapSchemaRecord = <T extends boolean | EntityInputSchema>(\n schemas: Record<string, T>,\n): Record<string, T> =>\n Object.fromEntries(\n Object.entries(schemas).map(([name, schema]) => [name, makeSchemaPartial(schema)]),\n ) as Record<string, T>\n\n/**\n * Zod keeps every failed recursive-union branch. Select the closest matching branch instead of\n * returning a very large error tree to CLI and MCP clients.\n */\nconst getUsefulIssues = (\n issues: core.$ZodIssue[],\n parentPath: PropertyKey[] = [],\n): core.$ZodIssue[] => {\n const selectedIssues = issues.flatMap((issue) => {\n if (issue.code !== 'invalid_union') {\n return [{ ...issue, path: [...parentPath, ...issue.path] }]\n }\n\n const unionPath = [...parentPath, ...issue.path]\n const closestBranch = issue.errors\n .filter((branch) => branch.length > 0)\n .sort(compareIssueBranches)[0]\n\n return closestBranch\n ? getUsefulIssues(closestBranch, unionPath)\n : [{ ...issue, path: unionPath }]\n })\n const uniqueIssues = new Map<string, core.$ZodIssue>()\n\n for (const issue of selectedIssues) {\n const key = `${issue.path.map(String).join('.')}:${issue.message}`\n\n if (!uniqueIssues.has(key)) {\n uniqueIssues.set(key, issue)\n }\n }\n\n return [...uniqueIssues.values()].slice(0, 10)\n}\n\nconst compareIssueBranches = (left: core.$ZodIssue[], right: core.$ZodIssue[]): number => {\n const discriminatorDifference = countDiscriminatorIssues(left) - countDiscriminatorIssues(right)\n\n if (discriminatorDifference !== 0) {\n return discriminatorDifference\n }\n\n const pathDepthDifference = getDeepestPath(right) - getDeepestPath(left)\n\n if (pathDepthDifference !== 0) {\n return pathDepthDifference\n }\n\n return left.length - right.length\n}\n\nconst countDiscriminatorIssues = (issues: core.$ZodIssue[]): number =>\n issues.filter((issue) => {\n const field = issue.path.at(-1)\n\n return field === 'blockType' || field === 'relationTo' || field === 'type'\n }).length\n\nconst getDeepestPath = (issues: core.$ZodIssue[]): number =>\n Math.max(0, ...issues.map((issue) => issue.path.length))\n\nconst formatDataPath = (path: PropertyKey[]): string =>\n path.reduce<string>(\n (result, segment) =>\n typeof segment === 'number' ? `${result}[${segment}]` : `${result}.${String(segment)}`,\n 'data',\n )\n"],"names":["fromJSONSchema","ValidationError","getCollectionInputSchema","getGlobalInputSchema","validateCollectionData","slug","data","partial","req","schema","collectionSlug","shouldKeepDeprecatedProperties","validateEntityData","entity","validateGlobalData","globalSlug","validationSchema","withoutRequired","result","safeParse","success","errors","getUsefulIssues","error","issues","map","message","path","formatDataPath","$defs","additionalProperties","anyOf","items","oneOf","properties","required","_required","partialSchema","mapSchemaRecord","undefined","makeSchemaPartial","Array","isArray","item","schemas","Object","fromEntries","entries","name","parentPath","selectedIssues","flatMap","issue","code","unionPath","closestBranch","filter","branch","length","sort","compareIssueBranches","uniqueIssues","Map","key","String","join","has","set","values","slice","left","right","discriminatorDifference","countDiscriminatorIssues","pathDepthDifference","getDeepestPath","field","at","Math","max","reduce","segment"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/filterDataToSelectedLocales.ts"],"sourcesContent":["import type { Block, Field, FlattenedBlock } from '../fields/config/types.js'\nimport type { SanitizedConfig } from '../index.js'\nimport type { JsonObject } from '../types/index.js'\n\nimport { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../fields/config/types.js'\n\ntype FilterDataToSelectedLocalesArgs = {\n configBlockReferences: SanitizedConfig['blocks']\n docWithLocales: JsonObject\n fields: Field[]\n parentIsLocalized?: boolean\n selectedLocales: string[]\n}\n\n/**\n * Filters a locale map to selected locales and applies a transform to each locale's value.\n */\nfunction filterLocaleMap(\n localeMap: Record<string, unknown>,\n selectedLocales: string[],\n transform: (value: unknown) => unknown,\n): Record<string, unknown> {\n const filtered: Record<string, unknown> = {}\n const localesToInclude =\n selectedLocales && selectedLocales.length > 0 ? selectedLocales : Object.keys(localeMap)\n\n for (const locale of localesToInclude) {\n if (locale in localeMap) {\n filtered[locale] = transform(localeMap[locale])\n }\n }\n\n return Object.keys(filtered).length > 0 ? filtered : {}\n}\n\n/**\n * Filters localized field data to only include specified locales.\n * For non-localized fields, returns all data as-is.\n * For localized fields, if selectedLocales is provided, returns only those locales.\n * If selectedLocales is not provided and field is localized, returns all locales.\n */\nexport function filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields,\n parentIsLocalized = false,\n selectedLocales,\n}: FilterDataToSelectedLocalesArgs): JsonObject {\n if (!docWithLocales || typeof docWithLocales !== 'object') {\n return docWithLocales\n }\n\n const result: JsonObject = {}\n\n for (const field of fields) {\n if (fieldAffectsData(field)) {\n const fieldIsLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n switch (field.type) {\n case 'array': {\n if (!(field.name in docWithLocales)) {\n break\n }\n\n const arrayValue = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n if (arrayValue && typeof arrayValue === 'object' && !Array.isArray(arrayValue)) {\n result[field.name] = filterLocaleMap(arrayValue, selectedLocales, (localeRows) =>\n Array.isArray(localeRows)\n ? localeRows.map((item: JsonObject) =>\n filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: item,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n }),\n )\n : localeRows,\n )\n }\n } else if (Array.isArray(arrayValue)) {\n result[field.name] = arrayValue.map((item: JsonObject) =>\n filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: item,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n }),\n )\n }\n\n break\n }\n\n case 'blocks': {\n if (!(field.name in docWithLocales)) {\n break\n }\n\n const blocksValue = docWithLocales[field.name]\n\n const processBlockRows = (rows: unknown): unknown => {\n if (!Array.isArray(rows)) {\n return rows\n }\n\n return rows.map((blockData: JsonObject) => {\n const blockOrSlug = field.blocks.find((b) => {\n const slug = typeof b === 'string' ? b : b.slug\n return slug === blockData.blockType\n })\n const block: Block | FlattenedBlock | undefined =\n typeof blockOrSlug === 'string'\n ? configBlockReferences?.find((b) => b.slug === blockOrSlug)\n : blockOrSlug\n\n if (block) {\n const filtered = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: blockData,\n fields: block?.fields || [],\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n\n // blockType, id, blockName are set by Payload internally\n // and not part of block.fields, so they must be preserved explicitly\n filtered.blockType = blockData.blockType\n filtered.id = blockData.id\n filtered.blockName = blockData.blockName\n\n return filtered\n }\n\n return blockData\n })\n }\n\n if (fieldIsLocalized) {\n if (blocksValue && typeof blocksValue === 'object' && !Array.isArray(blocksValue)) {\n result[field.name] = filterLocaleMap(blocksValue, selectedLocales, (localeRows) =>\n processBlockRows(localeRows),\n )\n }\n } else if (Array.isArray(blocksValue)) {\n result[field.name] = processBlockRows(blocksValue)\n }\n\n break\n }\n\n case 'group': {\n if (field.name in docWithLocales && typeof docWithLocales[field.name] === 'object') {\n const groupValue = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n if (groupValue && typeof groupValue === 'object' && !Array.isArray(groupValue)) {\n result[field.name] = filterLocaleMap(groupValue, selectedLocales, (localeValue) => {\n if (\n localeValue &&\n typeof localeValue === 'object' &&\n !Array.isArray(localeValue)\n ) {\n return filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: localeValue as JsonObject,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n }\n return localeValue\n })\n }\n } else if (typeof groupValue === 'object' && !Array.isArray(groupValue)) {\n result[field.name] = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: groupValue as JsonObject,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n }\n } else {\n // Unnamed groups pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: field.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n }\n break\n }\n\n default: {\n if (field.name in docWithLocales) {\n const value = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n result[field.name] = filterLocaleMap(\n value,\n selectedLocales,\n (localeValue) => localeValue,\n )\n }\n } else {\n result[field.name] = value\n }\n }\n break\n }\n }\n } else {\n // Layout-only fields that don't affect data structure\n switch (field.type) {\n case 'collapsible':\n case 'group':\n case 'row': {\n // These pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: field.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n break\n }\n\n case 'tabs': {\n for (const tab of field.tabs) {\n if (tabHasName(tab)) {\n // Named tabs create a nested data structure\n if (tab.name in docWithLocales && typeof docWithLocales[tab.name] === 'object') {\n result[tab.name] = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: docWithLocales[tab.name],\n fields: tab.fields,\n parentIsLocalized,\n selectedLocales,\n })\n }\n } else {\n // Unnamed tabs pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: tab.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n }\n }\n break\n }\n }\n }\n }\n\n return result\n}\n"],"names":["fieldAffectsData","fieldShouldBeLocalized","tabHasName","filterLocaleMap","localeMap","selectedLocales","transform","filtered","localesToInclude","length","Object","keys","locale","filterDataToSelectedLocales","configBlockReferences","docWithLocales","fields","parentIsLocalized","result","field","fieldIsLocalized","type","name","arrayValue","Array","isArray","localeRows","map","item","blocksValue","processBlockRows","rows","blockData","blockOrSlug","blocks","find","b","slug","blockType","block","id","blockName","groupValue","localeValue","nestedResult","assign","value","tab","tabs"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/filterDataToSelectedLocales.ts"],"sourcesContent":["import type { Block, Field, FlattenedBlock } from '../fields/config/types.js'\nimport type { SanitizedConfig } from '../index.js'\nimport type { JsonObject } from '../types/index.js'\n\nimport { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../fields/config/types.js'\n\ntype FilterDataToSelectedLocalesArgs = {\n configBlockReferences: SanitizedConfig['blocks']\n docWithLocales: JsonObject\n fields: Field[]\n parentIsLocalized?: boolean\n selectedLocales: string[]\n}\n\n/**\n * Filters a locale map to selected locales and applies a transform to each locale's value.\n */\nfunction filterLocaleMap(\n localeMap: Record<string, unknown>,\n selectedLocales: string[],\n transform: (value: unknown) => unknown,\n): Record<string, unknown> {\n const filtered: Record<string, unknown> = {}\n const localesToInclude =\n selectedLocales && selectedLocales.length > 0 ? selectedLocales : Object.keys(localeMap)\n\n for (const locale of localesToInclude) {\n if (locale in localeMap) {\n filtered[locale] = transform(localeMap[locale])\n }\n }\n\n return Object.keys(filtered).length > 0 ? filtered : {}\n}\n\n/**\n * Filters localized field data to only include specified locales.\n * For non-localized fields, returns all data as-is.\n * For localized fields, if selectedLocales is provided, returns only those locales.\n * If selectedLocales is not provided and field is localized, returns all locales.\n */\nexport function filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields,\n parentIsLocalized = false,\n selectedLocales,\n}: FilterDataToSelectedLocalesArgs): JsonObject {\n if (!docWithLocales || typeof docWithLocales !== 'object') {\n return docWithLocales\n }\n\n const result: JsonObject = {}\n\n for (const field of fields) {\n if (fieldAffectsData(field)) {\n const fieldIsLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n switch (field.type) {\n case 'array': {\n if (!(field.name in docWithLocales)) {\n break\n }\n\n const arrayValue = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n if (arrayValue && typeof arrayValue === 'object' && !Array.isArray(arrayValue)) {\n result[field.name] = filterLocaleMap(arrayValue, selectedLocales, (localeRows) =>\n Array.isArray(localeRows)\n ? localeRows.map((item: JsonObject) =>\n filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: item,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n }),\n )\n : localeRows,\n )\n }\n } else if (Array.isArray(arrayValue)) {\n result[field.name] = arrayValue.map((item: JsonObject) =>\n filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: item,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n }),\n )\n }\n\n break\n }\n\n case 'blocks': {\n if (!(field.name in docWithLocales)) {\n break\n }\n\n const blocksValue = docWithLocales[field.name]\n\n const processBlockRows = (rows: unknown): unknown => {\n if (!Array.isArray(rows)) {\n return rows\n }\n\n return rows.map((blockData: JsonObject) => {\n const blockOrSlug = field.blocks.find((b) => {\n const slug = typeof b === 'string' ? b : b.slug\n return slug === blockData.blockType\n })\n const block: Block | FlattenedBlock | undefined =\n typeof blockOrSlug === 'string'\n ? configBlockReferences?.find((b) => b.slug === blockOrSlug)\n : blockOrSlug\n\n if (block) {\n const filtered = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: blockData,\n fields: block?.fields || [],\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n\n // blockType, id, blockName are set by Payload internally\n // and not part of block.fields, so they must be preserved explicitly\n filtered.blockType = blockData.blockType\n filtered.id = blockData.id\n filtered.blockName = blockData.blockName\n\n return filtered\n }\n\n return blockData\n })\n }\n\n if (fieldIsLocalized) {\n if (blocksValue && typeof blocksValue === 'object' && !Array.isArray(blocksValue)) {\n result[field.name] = filterLocaleMap(blocksValue, selectedLocales, (localeRows) =>\n processBlockRows(localeRows),\n )\n }\n } else if (Array.isArray(blocksValue)) {\n result[field.name] = processBlockRows(blocksValue)\n }\n\n break\n }\n\n case 'group': {\n if (field.name in docWithLocales && typeof docWithLocales[field.name] === 'object') {\n const groupValue = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n if (groupValue && typeof groupValue === 'object' && !Array.isArray(groupValue)) {\n result[field.name] = filterLocaleMap(groupValue, selectedLocales, (localeValue) => {\n if (\n localeValue &&\n typeof localeValue === 'object' &&\n !Array.isArray(localeValue)\n ) {\n return filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: localeValue,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n }\n return localeValue\n })\n }\n } else if (typeof groupValue === 'object' && !Array.isArray(groupValue)) {\n result[field.name] = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: groupValue as JsonObject,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n }\n } else {\n // Unnamed groups pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: field.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n }\n break\n }\n\n default: {\n if (field.name in docWithLocales) {\n const value = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n result[field.name] = filterLocaleMap(\n value,\n selectedLocales,\n (localeValue) => localeValue,\n )\n }\n } else {\n result[field.name] = value\n }\n }\n break\n }\n }\n } else {\n // Layout-only fields that don't affect data structure\n switch (field.type) {\n case 'collapsible':\n case 'group':\n case 'row': {\n // These pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: field.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n break\n }\n\n case 'tabs': {\n for (const tab of field.tabs) {\n if (tabHasName(tab)) {\n // Named tabs create a nested data structure\n if (tab.name in docWithLocales && typeof docWithLocales[tab.name] === 'object') {\n result[tab.name] = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: docWithLocales[tab.name],\n fields: tab.fields,\n parentIsLocalized,\n selectedLocales,\n })\n }\n } else {\n // Unnamed tabs pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: tab.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n }\n }\n break\n }\n }\n }\n }\n\n return result\n}\n"],"names":["fieldAffectsData","fieldShouldBeLocalized","tabHasName","filterLocaleMap","localeMap","selectedLocales","transform","filtered","localesToInclude","length","Object","keys","locale","filterDataToSelectedLocales","configBlockReferences","docWithLocales","fields","parentIsLocalized","result","field","fieldIsLocalized","type","name","arrayValue","Array","isArray","localeRows","map","item","blocksValue","processBlockRows","rows","blockData","blockOrSlug","blocks","find","b","slug","blockType","block","id","blockName","groupValue","localeValue","nestedResult","assign","value","tab","tabs"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getEntityPermissions.d.ts","sourceRoot":"","sources":["../../../src/utilities/getEntityPermissions/getEntityPermissions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EAEpB,gBAAgB,EAEjB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAC9F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAS,MAAM,sBAAsB,CAAA;AAQ5F,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAC7C,SAAS,EACT,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAC7C,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,UAAU,CAAA;AAE/C,KAAK,UAAU,CAAC,WAAW,SAAS,YAAY,GAAG,QAAQ,IAAI,WAAW,SAAS,QAAQ,GACvF,gBAAgB,GAChB,oBAAoB,CAAA;AAExB,KAAK,IAAI,CAAC,WAAW,SAAS,YAAY,GAAG,QAAQ,IAAI;IACvD,0BAA0B,EAAE,0BAA0B,CAAA;IACtD;;OAEG;IACH,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,MAAM,EAAE,WAAW,SAAS,YAAY,GAAG,yBAAyB,GAAG,qBAAqB,CAAA;IAC5F,UAAU,EAAE,WAAW,CAAA;IACvB;;OAEG;IACH,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,CACA;IACE,SAAS,EAAE,KAAK,CAAA;IAChB,EAAE,CAAC,EAAE,KAAK,CAAA;CACX,GACD;IACE,SAAS,EAAE,IAAI,CAAA;IACf,EAAE,EAAE,WAAW,SAAS,YAAY,GAAG,qBAAqB,GAAG,SAAS,CAAA;CACzE,CACJ,CAAA;AAaD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,SAAS,YAAY,GAAG,QAAQ,EACpF,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,GACtB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAuKlC"}
1
+ {"version":3,"file":"getEntityPermissions.d.ts","sourceRoot":"","sources":["../../../src/utilities/getEntityPermissions/getEntityPermissions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EAEpB,gBAAgB,EAEjB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAC9F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAS,MAAM,sBAAsB,CAAA;AAQ5F,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAC7C,SAAS,EACT,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAC7C,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,UAAU,CAAA;AAE/C,KAAK,UAAU,CAAC,WAAW,SAAS,YAAY,GAAG,QAAQ,IAAI,WAAW,SAAS,QAAQ,GACvF,gBAAgB,GAChB,oBAAoB,CAAA;AAExB,KAAK,IAAI,CAAC,WAAW,SAAS,YAAY,GAAG,QAAQ,IAAI;IACvD,0BAA0B,EAAE,0BAA0B,CAAA;IACtD;;OAEG;IACH,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,MAAM,EAAE,WAAW,SAAS,YAAY,GAAG,yBAAyB,GAAG,qBAAqB,CAAA;IAC5F,UAAU,EAAE,WAAW,CAAA;IACvB;;OAEG;IACH,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,CACA;IACE,SAAS,EAAE,KAAK,CAAA;IAChB,EAAE,CAAC,EAAE,KAAK,CAAA;CACX,GACD;IACE,SAAS,EAAE,IAAI,CAAA;IACf,EAAE,EAAE,WAAW,SAAS,YAAY,GAAG,qBAAqB,GAAG,SAAS,CAAA;CACzE,CACJ,CAAA;AAaD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,SAAS,YAAY,GAAG,QAAQ,EACpF,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,GACtB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAwKlC"}
@@ -133,6 +133,7 @@ const topLevelGlobalPermissions = [
133
133
  // Await all where query DB calls in parallel
134
134
  await Promise.all(wherePromises);
135
135
  populateFieldPermissions({
136
+ id,
136
137
  blockReferencesPermissions,
137
138
  collection: entityType === 'collection' ? entity : null,
138
139
  data,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utilities/getEntityPermissions/getEntityPermissions.ts"],"sourcesContent":["import { isDeepStrictEqual } from 'util'\n\nimport type {\n BlockPermissions,\n CollectionPermission,\n FieldsPermissions,\n GlobalPermission,\n Permission,\n} from '../../auth/types.js'\nimport type { SanitizedCollectionConfig, TypeWithID } from '../../collections/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../globals/config/types.js'\nimport type { BlockSlug, DefaultDocumentIDType } from '../../index.js'\nimport type { AllOperations, JsonObject, PayloadRequest, Where } from '../../types/index.js'\n\nimport { getAccessOperationRequest } from '../getAccessOperationRequest.js'\nimport { entityDocExists } from './entityDocExists.js'\nimport { populateFieldPermissions } from './populateFieldPermissions.js'\n\ntype WhereQueryCache = { result: Promise<boolean>; where: Where }[]\n\nexport type BlockReferencesPermissions = Record<\n BlockSlug,\n BlockPermissions | Promise<BlockPermissions>\n>\n\nexport type EntityDoc = JsonObject | TypeWithID\n\ntype ReturnType<TEntityType extends 'collection' | 'global'> = TEntityType extends 'global'\n ? GlobalPermission\n : CollectionPermission\n\ntype Args<TEntityType extends 'collection' | 'global'> = {\n blockReferencesPermissions: BlockReferencesPermissions\n /**\n * If the document data is passed, it will be used to check access instead of fetching the document from the database.\n */\n data?: JsonObject\n entity: TEntityType extends 'collection' ? SanitizedCollectionConfig : SanitizedGlobalConfig\n entityType: TEntityType\n /**\n * Operations to check access for\n */\n operations: AllOperations[]\n req: PayloadRequest\n} & (\n | {\n fetchData: false\n id?: never\n }\n | {\n fetchData: true\n id: TEntityType extends 'collection' ? DefaultDocumentIDType : undefined\n }\n)\n\nconst topLevelCollectionPermissions = [\n 'create',\n 'delete',\n 'read',\n 'readVersions',\n 'update',\n 'validate',\n 'unlock',\n]\nconst topLevelGlobalPermissions = ['read', 'readVersions', 'update', 'validate']\n\n/**\n * Build up permissions object for an entity (collection or global).\n * This is not run during any update and reflects the current state of the entity data => doc and data is the same.\n *\n * When `fetchData` is false:\n * - returned `Where` are not run and evaluated as \"does not have permission\".\n * - If req.data is passed: `data` and `doc` is passed to access functions.\n * - If req.data is not passed: `data` and `doc` is not passed to access functions.\n *\n * When `fetchData` is true:\n * - `Where` are run and evaluated as \"has permission\" or \"does not have permission\".\n * - `data` and `doc` are always passed to access functions.\n * - Error is thrown if `entityType` is 'collection' and `id` is not passed.\n *\n * In both cases:\n * We cannot include siblingData or blockData here, as we do not have siblingData available once we reach block or array\n * rows, as we're calculating schema permissions, which do not include individual rows.\n * For consistency, it's thus better to never include the siblingData and blockData\n *\n * @internal\n */\nexport async function getEntityPermissions<TEntityType extends 'collection' | 'global'>(\n args: Args<TEntityType>,\n): Promise<ReturnType<TEntityType>> {\n const {\n id,\n blockReferencesPermissions,\n data: _data,\n entity,\n entityType,\n fetchData,\n operations,\n req,\n } = args\n const { locale: _locale, user } = req\n\n const locale = _locale ? _locale : undefined\n\n if (fetchData && entityType === 'collection' && !id) {\n throw new Error('ID is required when fetching data for a collection')\n }\n\n const hasData = _data && Object.keys(_data).length > 0\n const data: JsonObject | undefined = hasData\n ? _data\n : fetchData\n ? await (async () => {\n if (entityType === 'global') {\n return req.payload.findGlobal({\n slug: entity.slug,\n depth: 0,\n fallbackLocale: null,\n locale,\n overrideAccess: true,\n req,\n })\n }\n\n if (entityType === 'collection') {\n return req.payload.findByID({\n id: id!,\n collection: entity.slug,\n depth: 0,\n fallbackLocale: null,\n locale,\n overrideAccess: true,\n req,\n trash: true,\n })\n }\n })()\n : undefined\n\n const isLoggedIn = !!user\n\n const fieldsPermissions: FieldsPermissions = {}\n\n const entityPermissions: ReturnType<TEntityType> = {\n fields: fieldsPermissions,\n } as ReturnType<TEntityType>\n\n const promises: Promise<void>[] = []\n\n // Phase 1: Resolve all access functions to get where queries\n const accessResults: {\n operation: keyof typeof entity.access\n result: Promise<boolean | Where>\n }[] = []\n\n for (const _operation of operations) {\n const operation = _operation as keyof typeof entity.access\n const accessFunction = entity.access[operation]\n\n if (\n (entityType === 'collection' && topLevelCollectionPermissions.includes(operation)) ||\n (entityType === 'global' && topLevelGlobalPermissions.includes(operation))\n ) {\n if (typeof accessFunction === 'function') {\n accessResults.push({\n operation,\n result: Promise.resolve(\n accessFunction({\n id,\n slug: entity.slug,\n data,\n req:\n _operation === 'readVersions' || _operation === 'unlock'\n ? req\n : getAccessOperationRequest({\n operation: _operation,\n req,\n }),\n }),\n ) as Promise<boolean | Where>,\n })\n } else {\n entityPermissions[operation] = {\n permission: isLoggedIn,\n }\n }\n }\n }\n\n // Await all access functions in parallel\n const resolvedAccessResults = await Promise.all(\n accessResults.map(async (item) => ({\n operation: item.operation,\n result: await item.result,\n })),\n )\n\n // Phase 2: Process where queries with cache and resolve in parallel\n const whereQueryCache: WhereQueryCache = []\n const wherePromises: Promise<void>[] = []\n\n for (const { operation, result: accessResult } of resolvedAccessResults) {\n if (typeof accessResult === 'object') {\n processWhereQuery({\n id,\n slug: entity.slug,\n accessResult,\n entityPermissions,\n entityType,\n fetchData,\n locale,\n operation,\n req,\n wherePromises,\n whereQueryCache,\n })\n } else if (entityPermissions[operation]?.permission !== false) {\n entityPermissions[operation] = { permission: !!accessResult }\n }\n }\n\n // Await all where query DB calls in parallel\n await Promise.all(wherePromises)\n\n populateFieldPermissions({\n blockReferencesPermissions,\n collection: entityType === 'collection' ? (entity as SanitizedCollectionConfig) : null,\n data,\n fields: entity.fields,\n global: entityType === 'global' ? (entity as SanitizedGlobalConfig) : null,\n operations,\n parentPermissionsObject: entityPermissions,\n permissionsObject: fieldsPermissions,\n promises,\n req,\n })\n\n /**\n * Await all promises in parallel.\n * A promise can add more promises to the promises array (group of fields calls populateFieldPermissions again in their own promise), which will not be\n * awaited in the first run.\n * This is why we need to loop again to process the new promises, until there are no more promises left.\n */\n let iterations = 0\n while (promises.length > 0) {\n const currentPromises = promises.splice(0, promises.length)\n\n await Promise.all(currentPromises)\n\n iterations++\n if (iterations >= 100) {\n throw new Error('Infinite getEntityPermissions promise loop detected.')\n }\n }\n\n return entityPermissions\n}\n\nconst processWhereQuery = ({\n id,\n slug,\n accessResult,\n entityPermissions,\n entityType,\n fetchData,\n locale,\n operation,\n req,\n wherePromises,\n whereQueryCache,\n}: {\n accessResult: Where\n entityPermissions: CollectionPermission | GlobalPermission\n entityType: 'collection' | 'global'\n fetchData: boolean\n id?: DefaultDocumentIDType\n locale?: string\n operation: Extract<keyof (CollectionPermission | GlobalPermission), AllOperations>\n req: PayloadRequest\n slug: string\n wherePromises: Promise<void>[]\n whereQueryCache: WhereQueryCache\n}): void => {\n if (fetchData) {\n // Check cache for identical where query using deep comparison\n let cached = whereQueryCache.find((entry) => isDeepStrictEqual(entry.where, accessResult))\n\n if (!cached) {\n // Cache miss - start DB query (don't await)\n cached = {\n result: entityDocExists({\n id,\n slug,\n entityType,\n locale,\n operation,\n req,\n where: accessResult,\n }),\n where: accessResult,\n }\n whereQueryCache.push(cached)\n }\n\n // Defer resolution to Promise.all (cache hits reuse same promise)\n wherePromises.push(\n cached.result.then((hasPermission) => {\n entityPermissions[operation] = {\n permission: hasPermission,\n where: accessResult,\n } as Permission\n }),\n )\n } else {\n // TODO: 4.0: Investigate defaulting to `false` here, if where query is returned but ignored as we don't\n // have the document data available. This seems more secure.\n // Alternatively, we could set permission to a third state, like 'unknown'.\n // Even after calling sanitizePermissions, the permissions will still be true if the where query is returned but ignored as we don't have the document data available.\n entityPermissions[operation] = { permission: true, where: accessResult } as Permission\n }\n}\n"],"names":["isDeepStrictEqual","getAccessOperationRequest","entityDocExists","populateFieldPermissions","topLevelCollectionPermissions","topLevelGlobalPermissions","getEntityPermissions","args","id","blockReferencesPermissions","data","_data","entity","entityType","fetchData","operations","req","locale","_locale","user","undefined","Error","hasData","Object","keys","length","payload","findGlobal","slug","depth","fallbackLocale","overrideAccess","findByID","collection","trash","isLoggedIn","fieldsPermissions","entityPermissions","fields","promises","accessResults","_operation","operation","accessFunction","access","includes","push","result","Promise","resolve","permission","resolvedAccessResults","all","map","item","whereQueryCache","wherePromises","accessResult","processWhereQuery","global","parentPermissionsObject","permissionsObject","iterations","currentPromises","splice","cached","find","entry","where","then","hasPermission"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utilities/getEntityPermissions/getEntityPermissions.ts"],"sourcesContent":["import { isDeepStrictEqual } from 'util'\n\nimport type {\n BlockPermissions,\n CollectionPermission,\n FieldsPermissions,\n GlobalPermission,\n Permission,\n} from '../../auth/types.js'\nimport type { SanitizedCollectionConfig, TypeWithID } from '../../collections/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../globals/config/types.js'\nimport type { BlockSlug, DefaultDocumentIDType } from '../../index.js'\nimport type { AllOperations, JsonObject, PayloadRequest, Where } from '../../types/index.js'\n\nimport { getAccessOperationRequest } from '../getAccessOperationRequest.js'\nimport { entityDocExists } from './entityDocExists.js'\nimport { populateFieldPermissions } from './populateFieldPermissions.js'\n\ntype WhereQueryCache = { result: Promise<boolean>; where: Where }[]\n\nexport type BlockReferencesPermissions = Record<\n BlockSlug,\n BlockPermissions | Promise<BlockPermissions>\n>\n\nexport type EntityDoc = JsonObject | TypeWithID\n\ntype ReturnType<TEntityType extends 'collection' | 'global'> = TEntityType extends 'global'\n ? GlobalPermission\n : CollectionPermission\n\ntype Args<TEntityType extends 'collection' | 'global'> = {\n blockReferencesPermissions: BlockReferencesPermissions\n /**\n * If the document data is passed, it will be used to check access instead of fetching the document from the database.\n */\n data?: JsonObject\n entity: TEntityType extends 'collection' ? SanitizedCollectionConfig : SanitizedGlobalConfig\n entityType: TEntityType\n /**\n * Operations to check access for\n */\n operations: AllOperations[]\n req: PayloadRequest\n} & (\n | {\n fetchData: false\n id?: never\n }\n | {\n fetchData: true\n id: TEntityType extends 'collection' ? DefaultDocumentIDType : undefined\n }\n)\n\nconst topLevelCollectionPermissions = [\n 'create',\n 'delete',\n 'read',\n 'readVersions',\n 'update',\n 'validate',\n 'unlock',\n]\nconst topLevelGlobalPermissions = ['read', 'readVersions', 'update', 'validate']\n\n/**\n * Build up permissions object for an entity (collection or global).\n * This is not run during any update and reflects the current state of the entity data => doc and data is the same.\n *\n * When `fetchData` is false:\n * - returned `Where` are not run and evaluated as \"does not have permission\".\n * - If req.data is passed: `data` and `doc` is passed to access functions.\n * - If req.data is not passed: `data` and `doc` is not passed to access functions.\n *\n * When `fetchData` is true:\n * - `Where` are run and evaluated as \"has permission\" or \"does not have permission\".\n * - `data` and `doc` are always passed to access functions.\n * - Error is thrown if `entityType` is 'collection' and `id` is not passed.\n *\n * In both cases:\n * We cannot include siblingData or blockData here, as we do not have siblingData available once we reach block or array\n * rows, as we're calculating schema permissions, which do not include individual rows.\n * For consistency, it's thus better to never include the siblingData and blockData\n *\n * @internal\n */\nexport async function getEntityPermissions<TEntityType extends 'collection' | 'global'>(\n args: Args<TEntityType>,\n): Promise<ReturnType<TEntityType>> {\n const {\n id,\n blockReferencesPermissions,\n data: _data,\n entity,\n entityType,\n fetchData,\n operations,\n req,\n } = args\n const { locale: _locale, user } = req\n\n const locale = _locale ? _locale : undefined\n\n if (fetchData && entityType === 'collection' && !id) {\n throw new Error('ID is required when fetching data for a collection')\n }\n\n const hasData = _data && Object.keys(_data).length > 0\n const data: JsonObject | undefined = hasData\n ? _data\n : fetchData\n ? await (async () => {\n if (entityType === 'global') {\n return req.payload.findGlobal({\n slug: entity.slug,\n depth: 0,\n fallbackLocale: null,\n locale,\n overrideAccess: true,\n req,\n })\n }\n\n if (entityType === 'collection') {\n return req.payload.findByID({\n id: id!,\n collection: entity.slug,\n depth: 0,\n fallbackLocale: null,\n locale,\n overrideAccess: true,\n req,\n trash: true,\n })\n }\n })()\n : undefined\n\n const isLoggedIn = !!user\n\n const fieldsPermissions: FieldsPermissions = {}\n\n const entityPermissions: ReturnType<TEntityType> = {\n fields: fieldsPermissions,\n }\n\n const promises: Promise<void>[] = []\n\n // Phase 1: Resolve all access functions to get where queries\n const accessResults: {\n operation: keyof typeof entity.access\n result: Promise<boolean | Where>\n }[] = []\n\n for (const _operation of operations) {\n const operation = _operation as keyof typeof entity.access\n const accessFunction = entity.access[operation]\n\n if (\n (entityType === 'collection' && topLevelCollectionPermissions.includes(operation)) ||\n (entityType === 'global' && topLevelGlobalPermissions.includes(operation))\n ) {\n if (typeof accessFunction === 'function') {\n accessResults.push({\n operation,\n result: Promise.resolve(\n accessFunction({\n id,\n slug: entity.slug,\n data,\n req:\n _operation === 'readVersions' || _operation === 'unlock'\n ? req\n : getAccessOperationRequest({\n operation: _operation,\n req,\n }),\n }),\n ),\n })\n } else {\n entityPermissions[operation] = {\n permission: isLoggedIn,\n }\n }\n }\n }\n\n // Await all access functions in parallel\n const resolvedAccessResults = await Promise.all(\n accessResults.map(async (item) => ({\n operation: item.operation,\n result: await item.result,\n })),\n )\n\n // Phase 2: Process where queries with cache and resolve in parallel\n const whereQueryCache: WhereQueryCache = []\n const wherePromises: Promise<void>[] = []\n\n for (const { operation, result: accessResult } of resolvedAccessResults) {\n if (typeof accessResult === 'object') {\n processWhereQuery({\n id,\n slug: entity.slug,\n accessResult,\n entityPermissions,\n entityType,\n fetchData,\n locale,\n operation,\n req,\n wherePromises,\n whereQueryCache,\n })\n } else if (entityPermissions[operation]?.permission !== false) {\n entityPermissions[operation] = { permission: !!accessResult }\n }\n }\n\n // Await all where query DB calls in parallel\n await Promise.all(wherePromises)\n\n populateFieldPermissions({\n id,\n blockReferencesPermissions,\n collection: entityType === 'collection' ? (entity as SanitizedCollectionConfig) : null,\n data,\n fields: entity.fields,\n global: entityType === 'global' ? (entity as SanitizedGlobalConfig) : null,\n operations,\n parentPermissionsObject: entityPermissions,\n permissionsObject: fieldsPermissions,\n promises,\n req,\n })\n\n /**\n * Await all promises in parallel.\n * A promise can add more promises to the promises array (group of fields calls populateFieldPermissions again in their own promise), which will not be\n * awaited in the first run.\n * This is why we need to loop again to process the new promises, until there are no more promises left.\n */\n let iterations = 0\n while (promises.length > 0) {\n const currentPromises = promises.splice(0, promises.length)\n\n await Promise.all(currentPromises)\n\n iterations++\n if (iterations >= 100) {\n throw new Error('Infinite getEntityPermissions promise loop detected.')\n }\n }\n\n return entityPermissions\n}\n\nconst processWhereQuery = ({\n id,\n slug,\n accessResult,\n entityPermissions,\n entityType,\n fetchData,\n locale,\n operation,\n req,\n wherePromises,\n whereQueryCache,\n}: {\n accessResult: Where\n entityPermissions: CollectionPermission | GlobalPermission\n entityType: 'collection' | 'global'\n fetchData: boolean\n id?: DefaultDocumentIDType\n locale?: string\n operation: Extract<keyof (CollectionPermission | GlobalPermission), AllOperations>\n req: PayloadRequest\n slug: string\n wherePromises: Promise<void>[]\n whereQueryCache: WhereQueryCache\n}): void => {\n if (fetchData) {\n // Check cache for identical where query using deep comparison\n let cached = whereQueryCache.find((entry) => isDeepStrictEqual(entry.where, accessResult))\n\n if (!cached) {\n // Cache miss - start DB query (don't await)\n cached = {\n result: entityDocExists({\n id,\n slug,\n entityType,\n locale,\n operation,\n req,\n where: accessResult,\n }),\n where: accessResult,\n }\n whereQueryCache.push(cached)\n }\n\n // Defer resolution to Promise.all (cache hits reuse same promise)\n wherePromises.push(\n cached.result.then((hasPermission) => {\n entityPermissions[operation] = {\n permission: hasPermission,\n where: accessResult,\n }\n }),\n )\n } else {\n // TODO: 4.0: Investigate defaulting to `false` here, if where query is returned but ignored as we don't\n // have the document data available. This seems more secure.\n // Alternatively, we could set permission to a third state, like 'unknown'.\n // Even after calling sanitizePermissions, the permissions will still be true if the where query is returned but ignored as we don't have the document data available.\n entityPermissions[operation] = { permission: true, where: accessResult }\n }\n}\n"],"names":["isDeepStrictEqual","getAccessOperationRequest","entityDocExists","populateFieldPermissions","topLevelCollectionPermissions","topLevelGlobalPermissions","getEntityPermissions","args","id","blockReferencesPermissions","data","_data","entity","entityType","fetchData","operations","req","locale","_locale","user","undefined","Error","hasData","Object","keys","length","payload","findGlobal","slug","depth","fallbackLocale","overrideAccess","findByID","collection","trash","isLoggedIn","fieldsPermissions","entityPermissions","fields","promises","accessResults","_operation","operation","accessFunction","access","includes","push","result","Promise","resolve","permission","resolvedAccessResults","all","map","item","whereQueryCache","wherePromises","accessResult","processWhereQuery","global","parentPermissionsObject","permissionsObject","iterations","currentPromises","splice","cached","find","entry","where","then","hasPermission"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utilities/getEntityPermissions/populateFieldPermissions.ts"],"sourcesContent":["import type {\n BlockPermissions,\n BlocksPermissions,\n CollectionPermission,\n FieldPermissions,\n FieldsPermissions,\n GlobalPermission,\n Permission,\n} from '../../auth/types.js'\nimport type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../globals/config/types.js'\nimport type { DefaultDocumentIDType } from '../../index.js'\nimport type { AllOperations, JsonObject, PayloadRequest } from '../../types/index.js'\nimport type { BlockReferencesPermissions } from './getEntityPermissions.js'\n\nimport { type Field, tabHasName } from '../../fields/config/types.js'\nimport { getAccessOperationRequest } from '../getAccessOperationRequest.js'\n\nconst isThenable = (value: unknown): value is Promise<unknown> =>\n value != null && typeof (value as { then?: unknown }).then === 'function'\n\n/**\n * Helper to set a permission value that might be a promise.\n * If it's a promise, creates a chained promise that resolves to update the target,\n * stores the promise temporarily, and adds it to the promises array for later resolution.\n */\nconst setPermission = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n target: any,\n operation: AllOperations,\n value: boolean | Promise<boolean> | undefined,\n promises: Promise<void>[],\n): void => {\n if (isThenable(value)) {\n // Create a single permission object that will be mutated in place\n // This ensures all references (including cached blocks) see the resolved value\n const permissionObj = { permission: value as any }\n target[operation] = permissionObj\n\n const permissionPromise = value.then((result) => {\n // Mutate the permission property in place so all references see the update\n permissionObj.permission = result\n })\n\n promises.push(permissionPromise)\n } else {\n target[operation] = { permission: value }\n }\n}\n\n/**\n * Build up permissions object and run access functions for each field of an entity\n * This function is synchronous and collects all async work into the promises array\n */\nexport const populateFieldPermissions = ({\n id,\n blockReferencesPermissions,\n collection,\n data,\n fields,\n global,\n operations,\n parentPermissionsObject,\n permissionsObject,\n promises,\n req,\n}: {\n blockReferencesPermissions: BlockReferencesPermissions\n /** The collection which the fields belong to. If the fields belong to a global, this will be null. */\n collection: null | SanitizedCollectionConfig\n data: JsonObject | undefined\n fields: Field[]\n /** The global which the fields belong to. If the fields belong to a collection, this will be null. */\n global: null | SanitizedGlobalConfig\n id?: DefaultDocumentIDType\n /**\n * Operations to check access for\n */\n operations: AllOperations[]\n parentPermissionsObject: CollectionPermission | FieldPermissions | GlobalPermission\n permissionsObject: FieldsPermissions\n promises: Promise<void>[]\n req: PayloadRequest\n}): void => {\n for (const field of fields) {\n // Set up permissions for all operations\n for (const operation of operations) {\n const parentPermissionForOperation = (\n parentPermissionsObject[operation as keyof typeof parentPermissionsObject] as Permission\n )?.permission\n\n // Fields don't have all operations of a collection\n if (operation === 'delete' || operation === 'readVersions' || operation === 'unlock') {\n continue\n }\n\n if ('name' in field && field.name) {\n if (!permissionsObject[field.name]) {\n permissionsObject[field.name] = {} as FieldPermissions\n }\n const fieldPermissions: FieldPermissions = permissionsObject[field.name]!\n\n if ('access' in field && field.access && typeof field.access[operation] === 'function') {\n const accessResult = field.access[operation](\n collection\n ? {\n id,\n collection,\n data,\n doc: data,\n req: getAccessOperationRequest({\n operation,\n req,\n }),\n // We cannot include siblingData or blockData here, as we do not have siblingData/blockData available once we reach block or array\n // rows, as we're calculating schema permissions, which do not include individual rows.\n // For consistency, it's thus better to never include the siblingData and blockData\n }\n : {\n id,\n data,\n doc: data,\n global: global!,\n req: getAccessOperationRequest({\n operation,\n req,\n }),\n // We cannot include siblingData or blockData here, as we do not have siblingData/blockData available once we reach block or array\n // rows, as we're calculating schema permissions, which do not include individual rows.\n // For consistency, it's thus better to never include the siblingData and blockData\n },\n )\n\n // Handle both sync and async access results\n if (isThenable(accessResult)) {\n const booleanPromise = accessResult.then((result) => Boolean(result))\n setPermission(fieldPermissions, operation, booleanPromise, promises)\n } else {\n setPermission(fieldPermissions, operation, Boolean(accessResult), promises)\n }\n } else {\n // Inherit from parent (which might be a promise)\n setPermission(fieldPermissions, operation, parentPermissionForOperation, promises)\n }\n }\n }\n\n // Handle named fields with nested content\n if ('name' in field && field.name) {\n const fieldPermissions: FieldPermissions = permissionsObject[field.name]!\n\n if ('fields' in field && field.fields) {\n if (!fieldPermissions.fields) {\n fieldPermissions.fields = {}\n }\n\n populateFieldPermissions({\n id,\n blockReferencesPermissions,\n collection,\n data,\n fields: field.fields,\n global,\n operations,\n parentPermissionsObject: fieldPermissions,\n permissionsObject: fieldPermissions.fields,\n promises,\n req,\n })\n }\n\n if ('blocks' in field && field.blocks?.length) {\n if (!fieldPermissions.blocks) {\n fieldPermissions.blocks = {}\n }\n const blocksPermissions: BlocksPermissions = fieldPermissions.blocks\n\n // Set up permissions for all operations for all blocks\n for (const operation of operations) {\n // Fields don't have all operations of a collection\n if (operation === 'delete' || operation === 'readVersions' || operation === 'unlock') {\n continue\n }\n\n const parentPermissionForOperation = (\n parentPermissionsObject[operation as keyof typeof parentPermissionsObject] as Permission\n )?.permission\n\n for (const _block of field.blocks) {\n const block = typeof _block === 'string' ? req.payload.blocks[_block] : _block\n\n // Skip if block doesn't exist (invalid block reference)\n if (!block) {\n continue\n }\n\n // Handle block references - check if we've seen this block before\n if (typeof _block === 'string') {\n const blockReferencePermissions = blockReferencesPermissions[_block]\n if (blockReferencePermissions) {\n // Reference the cached permissions (may be a promise or resolved object)\n blocksPermissions[block.slug] = blockReferencePermissions as BlockPermissions\n continue\n }\n }\n\n // Initialize block permissions object if needed\n if (!blocksPermissions[block.slug]) {\n blocksPermissions[block.slug] = {} as BlockPermissions\n }\n\n const blockPermission = blocksPermissions[block.slug]!\n\n // Set permission for this operation\n if (!blockPermission[operation]) {\n const fieldPermission =\n fieldPermissions[operation]?.permission ?? parentPermissionForOperation\n\n // Inherit from field permission (which might be a promise)\n setPermission(blockPermission, operation, fieldPermission, promises)\n }\n }\n }\n\n // Process nested content for each unique block (once per block, not once per operation)\n const processedBlocks = new Set<string>()\n for (const _block of field.blocks) {\n const block = typeof _block === 'string' ? req.payload.blocks[_block] : _block\n\n // Skip if block doesn't exist (invalid block reference)\n if (!block || processedBlocks.has(block.slug)) {\n continue\n }\n processedBlocks.add(block.slug)\n\n const blockPermission = blocksPermissions[block.slug]\n if (!blockPermission) {\n continue\n }\n\n if (!blockPermission.fields) {\n blockPermission.fields = {}\n }\n\n // Handle block references with caching - store as promise that will be resolved later\n if (typeof _block === 'string' && !blockReferencesPermissions[_block]) {\n // Mark this block as being processed by storing a reference\n blockReferencesPermissions[_block] = blockPermission\n }\n\n // Recursively process block fields synchronously\n populateFieldPermissions({\n id,\n blockReferencesPermissions,\n collection,\n data,\n fields: block.fields,\n global,\n operations,\n parentPermissionsObject: blockPermission,\n permissionsObject: blockPermission.fields,\n promises,\n req,\n })\n }\n }\n }\n\n // Handle unnamed group fields\n if ('fields' in field && field.fields && !('name' in field && field.name)) {\n // Field does not have a name => same parentPermissionsObject\n populateFieldPermissions({\n id,\n collection,\n data,\n fields: field.fields,\n global,\n operations,\n // Field does not have a name here => use parent permissions object\n blockReferencesPermissions,\n parentPermissionsObject,\n permissionsObject,\n promises,\n req,\n })\n }\n\n // Handle tabs fields\n if (field.type === 'tabs') {\n // Process tabs for all operations\n for (const operation of operations) {\n // Fields don't have all operations of a collection\n if (operation === 'delete' || operation === 'readVersions' || operation === 'unlock') {\n continue\n }\n\n const parentPermissionForOperation = (\n parentPermissionsObject[operation as keyof typeof parentPermissionsObject] as Permission\n )?.permission\n\n for (const tab of field.tabs) {\n if (tabHasName(tab)) {\n if (!permissionsObject[tab.name]) {\n permissionsObject[tab.name] = { fields: {} } as FieldPermissions\n }\n\n const tabPermissions = permissionsObject[tab.name]!\n if (!tabPermissions[operation]) {\n // Inherit from parent (which might be a promise)\n setPermission(tabPermissions, operation, parentPermissionForOperation, promises)\n }\n }\n }\n }\n\n for (const tab of field.tabs) {\n if (tabHasName(tab)) {\n const tabPermissions: FieldPermissions = permissionsObject[tab.name]!\n\n if (!tabPermissions.fields) {\n tabPermissions.fields = {}\n }\n\n populateFieldPermissions({\n id,\n blockReferencesPermissions,\n collection,\n data,\n fields: tab.fields,\n global,\n operations,\n parentPermissionsObject: tabPermissions,\n permissionsObject: tabPermissions.fields,\n promises,\n req,\n })\n } else {\n // Tab does not have a name => same parentPermissionsObject\n populateFieldPermissions({\n id,\n collection,\n data,\n fields: tab.fields,\n global,\n operations,\n // Tab does not have a name here => use parent permissions object\n blockReferencesPermissions,\n parentPermissionsObject,\n permissionsObject,\n promises,\n req,\n })\n }\n }\n }\n }\n}\n"],"names":["tabHasName","getAccessOperationRequest","isThenable","value","then","setPermission","target","operation","promises","permissionObj","permission","permissionPromise","result","push","populateFieldPermissions","id","blockReferencesPermissions","collection","data","fields","global","operations","parentPermissionsObject","permissionsObject","req","field","parentPermissionForOperation","name","fieldPermissions","access","accessResult","doc","booleanPromise","Boolean","blocks","length","blocksPermissions","_block","block","payload","blockReferencePermissions","slug","blockPermission","fieldPermission","processedBlocks","Set","has","add","type","tab","tabs","tabPermissions"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utilities/getEntityPermissions/populateFieldPermissions.ts"],"sourcesContent":["import type {\n BlockPermissions,\n BlocksPermissions,\n CollectionPermission,\n FieldPermissions,\n FieldsPermissions,\n GlobalPermission,\n Permission,\n} from '../../auth/types.js'\nimport type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../globals/config/types.js'\nimport type { DefaultDocumentIDType } from '../../index.js'\nimport type { AllOperations, JsonObject, PayloadRequest } from '../../types/index.js'\nimport type { BlockReferencesPermissions } from './getEntityPermissions.js'\n\nimport { type Field, tabHasName } from '../../fields/config/types.js'\nimport { getAccessOperationRequest } from '../getAccessOperationRequest.js'\n\nconst isThenable = (value: unknown): value is Promise<unknown> =>\n value != null && typeof (value as { then?: unknown }).then === 'function'\n\n/**\n * Helper to set a permission value that might be a promise.\n * If it's a promise, creates a chained promise that resolves to update the target,\n * stores the promise temporarily, and adds it to the promises array for later resolution.\n */\nconst setPermission = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n target: any,\n operation: AllOperations,\n value: boolean | Promise<boolean> | undefined,\n promises: Promise<void>[],\n): void => {\n if (isThenable(value)) {\n // Create a single permission object that will be mutated in place\n // This ensures all references (including cached blocks) see the resolved value\n const permissionObj = { permission: value as any }\n target[operation] = permissionObj\n\n const permissionPromise = value.then((result) => {\n // Mutate the permission property in place so all references see the update\n permissionObj.permission = result\n })\n\n promises.push(permissionPromise)\n } else {\n target[operation] = { permission: value }\n }\n}\n\n/**\n * Build up permissions object and run access functions for each field of an entity\n * This function is synchronous and collects all async work into the promises array\n */\nexport const populateFieldPermissions = ({\n id,\n blockReferencesPermissions,\n collection,\n data,\n fields,\n global,\n operations,\n parentPermissionsObject,\n permissionsObject,\n promises,\n req,\n}: {\n blockReferencesPermissions: BlockReferencesPermissions\n /** The collection which the fields belong to. If the fields belong to a global, this will be null. */\n collection: null | SanitizedCollectionConfig\n data: JsonObject | undefined\n fields: Field[]\n /** The global which the fields belong to. If the fields belong to a collection, this will be null. */\n global: null | SanitizedGlobalConfig\n id?: DefaultDocumentIDType\n /**\n * Operations to check access for\n */\n operations: AllOperations[]\n parentPermissionsObject: CollectionPermission | FieldPermissions | GlobalPermission\n permissionsObject: FieldsPermissions\n promises: Promise<void>[]\n req: PayloadRequest\n}): void => {\n for (const field of fields) {\n // Set up permissions for all operations\n for (const operation of operations) {\n const parentPermissionForOperation = (\n parentPermissionsObject[operation as keyof typeof parentPermissionsObject] as Permission\n )?.permission\n\n // Fields don't have all operations of a collection\n if (operation === 'delete' || operation === 'readVersions' || operation === 'unlock') {\n continue\n }\n\n if ('name' in field && field.name) {\n if (!permissionsObject[field.name]) {\n permissionsObject[field.name] = {}\n }\n const fieldPermissions: FieldPermissions = permissionsObject[field.name]!\n\n if ('access' in field && field.access && typeof field.access[operation] === 'function') {\n const accessResult = field.access[operation](\n collection\n ? {\n id,\n collection,\n data,\n doc: data,\n req: getAccessOperationRequest({\n operation,\n req,\n }),\n // We cannot include siblingData or blockData here, as we do not have siblingData/blockData available once we reach block or array\n // rows, as we're calculating schema permissions, which do not include individual rows.\n // For consistency, it's thus better to never include the siblingData and blockData\n }\n : {\n id,\n data,\n doc: data,\n global: global!,\n req: getAccessOperationRequest({\n operation,\n req,\n }),\n // We cannot include siblingData or blockData here, as we do not have siblingData/blockData available once we reach block or array\n // rows, as we're calculating schema permissions, which do not include individual rows.\n // For consistency, it's thus better to never include the siblingData and blockData\n },\n )\n\n // Handle both sync and async access results\n if (isThenable(accessResult)) {\n const booleanPromise = accessResult.then((result) => Boolean(result))\n setPermission(fieldPermissions, operation, booleanPromise, promises)\n } else {\n setPermission(fieldPermissions, operation, Boolean(accessResult), promises)\n }\n } else {\n // Inherit from parent (which might be a promise)\n setPermission(fieldPermissions, operation, parentPermissionForOperation, promises)\n }\n }\n }\n\n // Handle named fields with nested content\n if ('name' in field && field.name) {\n const fieldPermissions: FieldPermissions = permissionsObject[field.name]!\n\n if ('fields' in field && field.fields) {\n if (!fieldPermissions.fields) {\n fieldPermissions.fields = {}\n }\n\n populateFieldPermissions({\n id,\n blockReferencesPermissions,\n collection,\n data,\n fields: field.fields,\n global,\n operations,\n parentPermissionsObject: fieldPermissions,\n permissionsObject: fieldPermissions.fields,\n promises,\n req,\n })\n }\n\n if ('blocks' in field && field.blocks?.length) {\n if (!fieldPermissions.blocks) {\n fieldPermissions.blocks = {}\n }\n const blocksPermissions: BlocksPermissions = fieldPermissions.blocks\n\n // Set up permissions for all operations for all blocks\n for (const operation of operations) {\n // Fields don't have all operations of a collection\n if (operation === 'delete' || operation === 'readVersions' || operation === 'unlock') {\n continue\n }\n\n const parentPermissionForOperation = (\n parentPermissionsObject[operation as keyof typeof parentPermissionsObject] as Permission\n )?.permission\n\n for (const _block of field.blocks) {\n const block = typeof _block === 'string' ? req.payload.blocks[_block] : _block\n\n // Skip if block doesn't exist (invalid block reference)\n if (!block) {\n continue\n }\n\n // Handle block references - check if we've seen this block before\n if (typeof _block === 'string') {\n const blockReferencePermissions = blockReferencesPermissions[_block]\n if (blockReferencePermissions) {\n // Reference the cached permissions (may be a promise or resolved object)\n blocksPermissions[block.slug] = blockReferencePermissions as BlockPermissions\n continue\n }\n }\n\n // Initialize block permissions object if needed\n if (!blocksPermissions[block.slug]) {\n blocksPermissions[block.slug] = {} as BlockPermissions\n }\n\n const blockPermission = blocksPermissions[block.slug]!\n\n // Set permission for this operation\n if (!blockPermission[operation]) {\n const fieldPermission =\n fieldPermissions[operation]?.permission ?? parentPermissionForOperation\n\n // Inherit from field permission (which might be a promise)\n setPermission(blockPermission, operation, fieldPermission, promises)\n }\n }\n }\n\n // Process nested content for each unique block (once per block, not once per operation)\n const processedBlocks = new Set<string>()\n for (const _block of field.blocks) {\n const block = typeof _block === 'string' ? req.payload.blocks[_block] : _block\n\n // Skip if block doesn't exist (invalid block reference)\n if (!block || processedBlocks.has(block.slug)) {\n continue\n }\n processedBlocks.add(block.slug)\n\n const blockPermission = blocksPermissions[block.slug]\n if (!blockPermission) {\n continue\n }\n\n if (!blockPermission.fields) {\n blockPermission.fields = {}\n }\n\n // Handle block references with caching - store as promise that will be resolved later\n if (typeof _block === 'string' && !blockReferencesPermissions[_block]) {\n // Mark this block as being processed by storing a reference\n blockReferencesPermissions[_block] = blockPermission\n }\n\n // Recursively process block fields synchronously\n populateFieldPermissions({\n id,\n blockReferencesPermissions,\n collection,\n data,\n fields: block.fields,\n global,\n operations,\n parentPermissionsObject: blockPermission,\n permissionsObject: blockPermission.fields,\n promises,\n req,\n })\n }\n }\n }\n\n // Handle unnamed group fields\n if ('fields' in field && field.fields && !('name' in field && field.name)) {\n // Field does not have a name => same parentPermissionsObject\n populateFieldPermissions({\n id,\n collection,\n data,\n fields: field.fields,\n global,\n operations,\n // Field does not have a name here => use parent permissions object\n blockReferencesPermissions,\n parentPermissionsObject,\n permissionsObject,\n promises,\n req,\n })\n }\n\n // Handle tabs fields\n if (field.type === 'tabs') {\n // Process tabs for all operations\n for (const operation of operations) {\n // Fields don't have all operations of a collection\n if (operation === 'delete' || operation === 'readVersions' || operation === 'unlock') {\n continue\n }\n\n const parentPermissionForOperation = (\n parentPermissionsObject[operation as keyof typeof parentPermissionsObject] as Permission\n )?.permission\n\n for (const tab of field.tabs) {\n if (tabHasName(tab)) {\n if (!permissionsObject[tab.name]) {\n permissionsObject[tab.name] = { fields: {} }\n }\n\n const tabPermissions = permissionsObject[tab.name]!\n if (!tabPermissions[operation]) {\n // Inherit from parent (which might be a promise)\n setPermission(tabPermissions, operation, parentPermissionForOperation, promises)\n }\n }\n }\n }\n\n for (const tab of field.tabs) {\n if (tabHasName(tab)) {\n const tabPermissions: FieldPermissions = permissionsObject[tab.name]!\n\n if (!tabPermissions.fields) {\n tabPermissions.fields = {}\n }\n\n populateFieldPermissions({\n id,\n blockReferencesPermissions,\n collection,\n data,\n fields: tab.fields,\n global,\n operations,\n parentPermissionsObject: tabPermissions,\n permissionsObject: tabPermissions.fields,\n promises,\n req,\n })\n } else {\n // Tab does not have a name => same parentPermissionsObject\n populateFieldPermissions({\n id,\n collection,\n data,\n fields: tab.fields,\n global,\n operations,\n // Tab does not have a name here => use parent permissions object\n blockReferencesPermissions,\n parentPermissionsObject,\n permissionsObject,\n promises,\n req,\n })\n }\n }\n }\n }\n}\n"],"names":["tabHasName","getAccessOperationRequest","isThenable","value","then","setPermission","target","operation","promises","permissionObj","permission","permissionPromise","result","push","populateFieldPermissions","id","blockReferencesPermissions","collection","data","fields","global","operations","parentPermissionsObject","permissionsObject","req","field","parentPermissionForOperation","name","fieldPermissions","access","accessResult","doc","booleanPromise","Boolean","blocks","length","blocksPermissions","_block","block","payload","blockReferencePermissions","slug","blockPermission","fieldPermission","processedBlocks","Set","has","add","type","tab","tabs","tabPermissions"],"mappings":"AAeA,SAAqBA,UAAU,QAAQ,+BAA8B;AACrE,SAASC,yBAAyB,QAAQ,kCAAiC;AAE3E,MAAMC,aAAa,CAACC,QAClBA,SAAS,QAAQ,OAAO,AAACA,MAA6BC,IAAI,KAAK;AAEjE;;;;CAIC,GACD,MAAMC,gBAAgB,CACpB,8DAA8D;AAC9DC,QACAC,WACAJ,OACAK;IAEA,IAAIN,WAAWC,QAAQ;QACrB,kEAAkE;QAClE,+EAA+E;QAC/E,MAAMM,gBAAgB;YAAEC,YAAYP;QAAa;QACjDG,MAAM,CAACC,UAAU,GAAGE;QAEpB,MAAME,oBAAoBR,MAAMC,IAAI,CAAC,CAACQ;YACpC,2EAA2E;YAC3EH,cAAcC,UAAU,GAAGE;QAC7B;QAEAJ,SAASK,IAAI,CAACF;IAChB,OAAO;QACLL,MAAM,CAACC,UAAU,GAAG;YAAEG,YAAYP;QAAM;IAC1C;AACF;AAEA;;;CAGC,GACD,OAAO,MAAMW,2BAA2B,CAAC,EACvCC,EAAE,EACFC,0BAA0B,EAC1BC,UAAU,EACVC,IAAI,EACJC,MAAM,EACNC,MAAM,EACNC,UAAU,EACVC,uBAAuB,EACvBC,iBAAiB,EACjBf,QAAQ,EACRgB,GAAG,EAkBJ;IACC,KAAK,MAAMC,SAASN,OAAQ;QAC1B,wCAAwC;QACxC,KAAK,MAAMZ,aAAac,WAAY;YAClC,MAAMK,+BACJJ,uBAAuB,CAACf,UAAkD,EACzEG;YAEH,mDAAmD;YACnD,IAAIH,cAAc,YAAYA,cAAc,kBAAkBA,cAAc,UAAU;gBACpF;YACF;YAEA,IAAI,UAAUkB,SAASA,MAAME,IAAI,EAAE;gBACjC,IAAI,CAACJ,iBAAiB,CAACE,MAAME,IAAI,CAAC,EAAE;oBAClCJ,iBAAiB,CAACE,MAAME,IAAI,CAAC,GAAG,CAAC;gBACnC;gBACA,MAAMC,mBAAqCL,iBAAiB,CAACE,MAAME,IAAI,CAAC;gBAExE,IAAI,YAAYF,SAASA,MAAMI,MAAM,IAAI,OAAOJ,MAAMI,MAAM,CAACtB,UAAU,KAAK,YAAY;oBACtF,MAAMuB,eAAeL,MAAMI,MAAM,CAACtB,UAAU,CAC1CU,aACI;wBACEF;wBACAE;wBACAC;wBACAa,KAAKb;wBACLM,KAAKvB,0BAA0B;4BAC7BM;4BACAiB;wBACF;oBAIF,IACA;wBACET;wBACAG;wBACAa,KAAKb;wBACLE,QAAQA;wBACRI,KAAKvB,0BAA0B;4BAC7BM;4BACAiB;wBACF;oBAIF;oBAGN,4CAA4C;oBAC5C,IAAItB,WAAW4B,eAAe;wBAC5B,MAAME,iBAAiBF,aAAa1B,IAAI,CAAC,CAACQ,SAAWqB,QAAQrB;wBAC7DP,cAAcuB,kBAAkBrB,WAAWyB,gBAAgBxB;oBAC7D,OAAO;wBACLH,cAAcuB,kBAAkBrB,WAAW0B,QAAQH,eAAetB;oBACpE;gBACF,OAAO;oBACL,iDAAiD;oBACjDH,cAAcuB,kBAAkBrB,WAAWmB,8BAA8BlB;gBAC3E;YACF;QACF;QAEA,0CAA0C;QAC1C,IAAI,UAAUiB,SAASA,MAAME,IAAI,EAAE;YACjC,MAAMC,mBAAqCL,iBAAiB,CAACE,MAAME,IAAI,CAAC;YAExE,IAAI,YAAYF,SAASA,MAAMN,MAAM,EAAE;gBACrC,IAAI,CAACS,iBAAiBT,MAAM,EAAE;oBAC5BS,iBAAiBT,MAAM,GAAG,CAAC;gBAC7B;gBAEAL,yBAAyB;oBACvBC;oBACAC;oBACAC;oBACAC;oBACAC,QAAQM,MAAMN,MAAM;oBACpBC;oBACAC;oBACAC,yBAAyBM;oBACzBL,mBAAmBK,iBAAiBT,MAAM;oBAC1CX;oBACAgB;gBACF;YACF;YAEA,IAAI,YAAYC,SAASA,MAAMS,MAAM,EAAEC,QAAQ;gBAC7C,IAAI,CAACP,iBAAiBM,MAAM,EAAE;oBAC5BN,iBAAiBM,MAAM,GAAG,CAAC;gBAC7B;gBACA,MAAME,oBAAuCR,iBAAiBM,MAAM;gBAEpE,uDAAuD;gBACvD,KAAK,MAAM3B,aAAac,WAAY;oBAClC,mDAAmD;oBACnD,IAAId,cAAc,YAAYA,cAAc,kBAAkBA,cAAc,UAAU;wBACpF;oBACF;oBAEA,MAAMmB,+BACJJ,uBAAuB,CAACf,UAAkD,EACzEG;oBAEH,KAAK,MAAM2B,UAAUZ,MAAMS,MAAM,CAAE;wBACjC,MAAMI,QAAQ,OAAOD,WAAW,WAAWb,IAAIe,OAAO,CAACL,MAAM,CAACG,OAAO,GAAGA;wBAExE,wDAAwD;wBACxD,IAAI,CAACC,OAAO;4BACV;wBACF;wBAEA,kEAAkE;wBAClE,IAAI,OAAOD,WAAW,UAAU;4BAC9B,MAAMG,4BAA4BxB,0BAA0B,CAACqB,OAAO;4BACpE,IAAIG,2BAA2B;gCAC7B,yEAAyE;gCACzEJ,iBAAiB,CAACE,MAAMG,IAAI,CAAC,GAAGD;gCAChC;4BACF;wBACF;wBAEA,gDAAgD;wBAChD,IAAI,CAACJ,iBAAiB,CAACE,MAAMG,IAAI,CAAC,EAAE;4BAClCL,iBAAiB,CAACE,MAAMG,IAAI,CAAC,GAAG,CAAC;wBACnC;wBAEA,MAAMC,kBAAkBN,iBAAiB,CAACE,MAAMG,IAAI,CAAC;wBAErD,oCAAoC;wBACpC,IAAI,CAACC,eAAe,CAACnC,UAAU,EAAE;4BAC/B,MAAMoC,kBACJf,gBAAgB,CAACrB,UAAU,EAAEG,cAAcgB;4BAE7C,2DAA2D;4BAC3DrB,cAAcqC,iBAAiBnC,WAAWoC,iBAAiBnC;wBAC7D;oBACF;gBACF;gBAEA,wFAAwF;gBACxF,MAAMoC,kBAAkB,IAAIC;gBAC5B,KAAK,MAAMR,UAAUZ,MAAMS,MAAM,CAAE;oBACjC,MAAMI,QAAQ,OAAOD,WAAW,WAAWb,IAAIe,OAAO,CAACL,MAAM,CAACG,OAAO,GAAGA;oBAExE,wDAAwD;oBACxD,IAAI,CAACC,SAASM,gBAAgBE,GAAG,CAACR,MAAMG,IAAI,GAAG;wBAC7C;oBACF;oBACAG,gBAAgBG,GAAG,CAACT,MAAMG,IAAI;oBAE9B,MAAMC,kBAAkBN,iBAAiB,CAACE,MAAMG,IAAI,CAAC;oBACrD,IAAI,CAACC,iBAAiB;wBACpB;oBACF;oBAEA,IAAI,CAACA,gBAAgBvB,MAAM,EAAE;wBAC3BuB,gBAAgBvB,MAAM,GAAG,CAAC;oBAC5B;oBAEA,sFAAsF;oBACtF,IAAI,OAAOkB,WAAW,YAAY,CAACrB,0BAA0B,CAACqB,OAAO,EAAE;wBACrE,4DAA4D;wBAC5DrB,0BAA0B,CAACqB,OAAO,GAAGK;oBACvC;oBAEA,iDAAiD;oBACjD5B,yBAAyB;wBACvBC;wBACAC;wBACAC;wBACAC;wBACAC,QAAQmB,MAAMnB,MAAM;wBACpBC;wBACAC;wBACAC,yBAAyBoB;wBACzBnB,mBAAmBmB,gBAAgBvB,MAAM;wBACzCX;wBACAgB;oBACF;gBACF;YACF;QACF;QAEA,8BAA8B;QAC9B,IAAI,YAAYC,SAASA,MAAMN,MAAM,IAAI,CAAE,CAAA,UAAUM,SAASA,MAAME,IAAI,AAAD,GAAI;YACzE,6DAA6D;YAC7Db,yBAAyB;gBACvBC;gBACAE;gBACAC;gBACAC,QAAQM,MAAMN,MAAM;gBACpBC;gBACAC;gBACA,mEAAmE;gBACnEL;gBACAM;gBACAC;gBACAf;gBACAgB;YACF;QACF;QAEA,qBAAqB;QACrB,IAAIC,MAAMuB,IAAI,KAAK,QAAQ;YACzB,kCAAkC;YAClC,KAAK,MAAMzC,aAAac,WAAY;gBAClC,mDAAmD;gBACnD,IAAId,cAAc,YAAYA,cAAc,kBAAkBA,cAAc,UAAU;oBACpF;gBACF;gBAEA,MAAMmB,+BACJJ,uBAAuB,CAACf,UAAkD,EACzEG;gBAEH,KAAK,MAAMuC,OAAOxB,MAAMyB,IAAI,CAAE;oBAC5B,IAAIlD,WAAWiD,MAAM;wBACnB,IAAI,CAAC1B,iBAAiB,CAAC0B,IAAItB,IAAI,CAAC,EAAE;4BAChCJ,iBAAiB,CAAC0B,IAAItB,IAAI,CAAC,GAAG;gCAAER,QAAQ,CAAC;4BAAE;wBAC7C;wBAEA,MAAMgC,iBAAiB5B,iBAAiB,CAAC0B,IAAItB,IAAI,CAAC;wBAClD,IAAI,CAACwB,cAAc,CAAC5C,UAAU,EAAE;4BAC9B,iDAAiD;4BACjDF,cAAc8C,gBAAgB5C,WAAWmB,8BAA8BlB;wBACzE;oBACF;gBACF;YACF;YAEA,KAAK,MAAMyC,OAAOxB,MAAMyB,IAAI,CAAE;gBAC5B,IAAIlD,WAAWiD,MAAM;oBACnB,MAAME,iBAAmC5B,iBAAiB,CAAC0B,IAAItB,IAAI,CAAC;oBAEpE,IAAI,CAACwB,eAAehC,MAAM,EAAE;wBAC1BgC,eAAehC,MAAM,GAAG,CAAC;oBAC3B;oBAEAL,yBAAyB;wBACvBC;wBACAC;wBACAC;wBACAC;wBACAC,QAAQ8B,IAAI9B,MAAM;wBAClBC;wBACAC;wBACAC,yBAAyB6B;wBACzB5B,mBAAmB4B,eAAehC,MAAM;wBACxCX;wBACAgB;oBACF;gBACF,OAAO;oBACL,2DAA2D;oBAC3DV,yBAAyB;wBACvBC;wBACAE;wBACAC;wBACAC,QAAQ8B,IAAI9B,MAAM;wBAClBC;wBACAC;wBACA,iEAAiE;wBACjEL;wBACAM;wBACAC;wBACAf;wBACAgB;oBACF;gBACF;YACF;QACF;IACF;AACF,EAAC"}
@@ -2,6 +2,10 @@ import type { CollectionConfig } from '../collections/config/types.js';
2
2
  import type { GlobalConfig } from '../globals/config/types.js';
3
3
  import type { Autosave, SanitizedDrafts } from '../versions/types.js';
4
4
  type EntityConfig = Pick<CollectionConfig | GlobalConfig, 'versions'>;
5
+ /**
6
+ * Check if an entity has versions enabled at all
7
+ */
8
+ export declare const hasVersionsEnabled: (config: EntityConfig) => boolean;
5
9
  /**
6
10
  * Check if an entity has drafts enabled
7
11
  */
@@ -1 +1 @@
1
- {"version":3,"file":"getVersionsConfig.d.ts","sourceRoot":"","sources":["../../src/utilities/getVersionsConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAIrE,KAAK,YAAY,GAAG,IAAI,CAAC,gBAAgB,GAAG,YAAY,EAAE,UAAU,CAAC,CAAA;AAErE;;GAEG;AACH,eAAO,MAAM,gBAAgB,WAAY,YAAY,KAAG,OAEvD,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,WAAY,YAAY,KAAG,OAQ/D,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,WACrB,YAAY,KACnB,MAAM,IAAI;IACX,QAAQ,EAAE;QACR,MAAM,EAAE;YAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAAA;SAAE,CAAA;KACvC,CAAA;CACF,GAAG,YAQH,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,yBAAyB,WAAY,YAAY,KAAG,OAQhE,CAAA;AAED,eAAO,MAAM,0BAA0B,WAC7B,YAAY,KACnB,MAAM,IAAI;IACX,QAAQ,EAAE;QACR,MAAM,EAAE;YAAE,eAAe,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAA;SAAE,CAAA;KAChE,CAAA;CACF,GAAG,YAQH,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,WAAY,YAAY,KAAG,MAYrD,CAAA;AAED,eAAO,MAAM,mBAAmB,WAAY,YAAY,KAAG,MAa1D,CAAA"}
1
+ {"version":3,"file":"getVersionsConfig.d.ts","sourceRoot":"","sources":["../../src/utilities/getVersionsConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAIrE,KAAK,YAAY,GAAG,IAAI,CAAC,gBAAgB,GAAG,YAAY,EAAE,UAAU,CAAC,CAAA;AAErE;;GAEG;AACH,eAAO,MAAM,kBAAkB,WAAY,YAAY,KAAG,OAEzD,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,WAAY,YAAY,KAAG,OAEvD,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,WAAY,YAAY,KAAG,OAQ/D,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,WACrB,YAAY,KACnB,MAAM,IAAI;IACX,QAAQ,EAAE;QACR,MAAM,EAAE;YAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,CAAA;SAAE,CAAA;KACvC,CAAA;CACF,GAAG,YAQH,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,yBAAyB,WAAY,YAAY,KAAG,OAQhE,CAAA;AAED,eAAO,MAAM,0BAA0B,WAC7B,YAAY,KACnB,MAAM,IAAI;IACX,QAAQ,EAAE;QACR,MAAM,EAAE;YAAE,eAAe,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAA;SAAE,CAAA;KAChE,CAAA;CACF,GAAG,YAQH,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,WAAY,YAAY,KAAG,MAYrD,CAAA;AAED,eAAO,MAAM,mBAAmB,WAAY,YAAY,KAAG,MAa1D,CAAA"}
@@ -1,4 +1,9 @@
1
1
  import { versionDefaults } from '../versions/defaults.js';
2
+ /**
3
+ * Check if an entity has versions enabled at all
4
+ */ export const hasVersionsEnabled = (config)=>{
5
+ return Boolean(config?.versions);
6
+ };
2
7
  /**
3
8
  * Check if an entity has drafts enabled
4
9
  */ export const hasDraftsEnabled = (config)=>{