payload 3.89.0-internal.95c9cba → 3.90.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (468) hide show
  1. package/dist/admin/forms/Field.d.ts +2 -0
  2. package/dist/admin/forms/Field.d.ts.map +1 -1
  3. package/dist/admin/forms/Field.js.map +1 -1
  4. package/dist/admin/forms/Form.d.ts +2 -0
  5. package/dist/admin/forms/Form.d.ts.map +1 -1
  6. package/dist/admin/forms/Form.js.map +1 -1
  7. package/dist/admin/functions/index.d.ts +3 -1
  8. package/dist/admin/functions/index.d.ts.map +1 -1
  9. package/dist/admin/functions/index.js.map +1 -1
  10. package/dist/admin/views/dashboard.d.ts +1 -1
  11. package/dist/admin/views/dashboard.d.ts.map +1 -1
  12. package/dist/admin/views/dashboard.js.map +1 -1
  13. package/dist/auth/applyUserReadAccess.d.ts +15 -0
  14. package/dist/auth/applyUserReadAccess.d.ts.map +1 -0
  15. package/dist/auth/applyUserReadAccess.js +41 -0
  16. package/dist/auth/applyUserReadAccess.js.map +1 -0
  17. package/dist/auth/baseFields/apiKey/canCreateOrUpdateAPIKey.d.ts +4 -0
  18. package/dist/auth/baseFields/apiKey/canCreateOrUpdateAPIKey.d.ts.map +1 -0
  19. package/dist/auth/baseFields/apiKey/canCreateOrUpdateAPIKey.js +20 -0
  20. package/dist/auth/baseFields/apiKey/canCreateOrUpdateAPIKey.js.map +1 -0
  21. package/dist/auth/baseFields/apiKey/encryptAPIKey.d.ts +4 -0
  22. package/dist/auth/baseFields/apiKey/encryptAPIKey.d.ts.map +1 -0
  23. package/dist/auth/baseFields/apiKey/encryptAPIKey.js +16 -0
  24. package/dist/auth/baseFields/apiKey/encryptAPIKey.js.map +1 -0
  25. package/dist/auth/baseFields/apiKey/index.d.ts +6 -0
  26. package/dist/auth/baseFields/apiKey/index.d.ts.map +1 -0
  27. package/dist/auth/baseFields/apiKey/index.js +112 -0
  28. package/dist/auth/baseFields/apiKey/index.js.map +1 -0
  29. package/dist/auth/baseFields/apiKey/omitAPIKey.d.ts +4 -0
  30. package/dist/auth/baseFields/apiKey/omitAPIKey.d.ts.map +1 -0
  31. package/dist/auth/baseFields/apiKey/omitAPIKey.js +8 -0
  32. package/dist/auth/baseFields/apiKey/omitAPIKey.js.map +1 -0
  33. package/dist/auth/baseFields/apiKey/omitAPIKeyIndex.d.ts +4 -0
  34. package/dist/auth/baseFields/apiKey/omitAPIKeyIndex.d.ts.map +1 -0
  35. package/dist/auth/baseFields/apiKey/omitAPIKeyIndex.js +5 -0
  36. package/dist/auth/baseFields/apiKey/omitAPIKeyIndex.js.map +1 -0
  37. package/dist/auth/baseFields/apiKey/omitEncryptedAPIKey.d.ts +4 -0
  38. package/dist/auth/baseFields/apiKey/omitEncryptedAPIKey.d.ts.map +1 -0
  39. package/dist/auth/baseFields/apiKey/omitEncryptedAPIKey.js +5 -0
  40. package/dist/auth/baseFields/apiKey/omitEncryptedAPIKey.js.map +1 -0
  41. package/dist/auth/baseFields/apiKey/setAPIKeyIndex.d.ts +4 -0
  42. package/dist/auth/baseFields/apiKey/setAPIKeyIndex.d.ts.map +1 -0
  43. package/dist/auth/baseFields/apiKey/setAPIKeyIndex.js +17 -0
  44. package/dist/auth/baseFields/apiKey/setAPIKeyIndex.js.map +1 -0
  45. package/dist/auth/baseFields/auth.d.ts +1 -0
  46. package/dist/auth/baseFields/auth.d.ts.map +1 -1
  47. package/dist/auth/baseFields/auth.js +9 -0
  48. package/dist/auth/baseFields/auth.js.map +1 -1
  49. package/dist/auth/defaultUnlockAccess.d.ts +3 -0
  50. package/dist/auth/defaultUnlockAccess.d.ts.map +1 -0
  51. package/dist/auth/defaultUnlockAccess.js +8 -0
  52. package/dist/auth/defaultUnlockAccess.js.map +1 -0
  53. package/dist/auth/endpoints/index.d.ts +1 -0
  54. package/dist/auth/endpoints/index.d.ts.map +1 -1
  55. package/dist/auth/endpoints/index.js +8 -0
  56. package/dist/auth/endpoints/index.js.map +1 -1
  57. package/dist/auth/endpoints/revealAPIKey.d.ts +7 -0
  58. package/dist/auth/endpoints/revealAPIKey.d.ts.map +1 -0
  59. package/dist/auth/endpoints/revealAPIKey.js +120 -0
  60. package/dist/auth/endpoints/revealAPIKey.js.map +1 -0
  61. package/dist/auth/executeAccess.d.ts +3 -1
  62. package/dist/auth/executeAccess.d.ts.map +1 -1
  63. package/dist/auth/executeAccess.js +2 -1
  64. package/dist/auth/executeAccess.js.map +1 -1
  65. package/dist/auth/getAuthFields.d.ts +1 -1
  66. package/dist/auth/getAuthFields.d.ts.map +1 -1
  67. package/dist/auth/getAuthFields.js +7 -4
  68. package/dist/auth/getAuthFields.js.map +1 -1
  69. package/dist/auth/getFieldsToSign.d.ts.map +1 -1
  70. package/dist/auth/getFieldsToSign.js +17 -10
  71. package/dist/auth/getFieldsToSign.js.map +1 -1
  72. package/dist/auth/getFieldsToSign.spec.js +114 -0
  73. package/dist/auth/getFieldsToSign.spec.js.map +1 -0
  74. package/dist/auth/jwt.d.ts.map +1 -1
  75. package/dist/auth/jwt.js +2 -0
  76. package/dist/auth/jwt.js.map +1 -1
  77. package/dist/auth/jwt.spec.js +24 -0
  78. package/dist/auth/jwt.spec.js.map +1 -0
  79. package/dist/auth/jwtAuth.d.ts +9 -0
  80. package/dist/auth/jwtAuth.d.ts.map +1 -0
  81. package/dist/auth/jwtAuth.js +8 -0
  82. package/dist/auth/jwtAuth.js.map +1 -0
  83. package/dist/auth/operations/auth.d.ts.map +1 -1
  84. package/dist/auth/operations/auth.js +2 -1
  85. package/dist/auth/operations/auth.js.map +1 -1
  86. package/dist/auth/operations/forgotPassword.d.ts.map +1 -1
  87. package/dist/auth/operations/forgotPassword.js +95 -7
  88. package/dist/auth/operations/forgotPassword.js.map +1 -1
  89. package/dist/auth/operations/local/auth.js +3 -1
  90. package/dist/auth/operations/local/auth.js.map +1 -1
  91. package/dist/auth/operations/login.d.ts.map +1 -1
  92. package/dist/auth/operations/login.js +48 -26
  93. package/dist/auth/operations/login.js.map +1 -1
  94. package/dist/auth/operations/refresh.d.ts.map +1 -1
  95. package/dist/auth/operations/refresh.js +32 -9
  96. package/dist/auth/operations/refresh.js.map +1 -1
  97. package/dist/auth/operations/registerFirstUser.d.ts.map +1 -1
  98. package/dist/auth/operations/registerFirstUser.js +3 -4
  99. package/dist/auth/operations/registerFirstUser.js.map +1 -1
  100. package/dist/auth/operations/resetPassword.d.ts.map +1 -1
  101. package/dist/auth/operations/resetPassword.js +31 -22
  102. package/dist/auth/operations/resetPassword.js.map +1 -1
  103. package/dist/auth/operations/unlock.d.ts.map +1 -1
  104. package/dist/auth/operations/unlock.js +1 -0
  105. package/dist/auth/operations/unlock.js.map +1 -1
  106. package/dist/auth/strategies/apiKey.d.ts.map +1 -1
  107. package/dist/auth/strategies/apiKey.js +15 -1
  108. package/dist/auth/strategies/apiKey.js.map +1 -1
  109. package/dist/auth/strategies/jwt.d.ts.map +1 -1
  110. package/dist/auth/strategies/jwt.js +61 -10
  111. package/dist/auth/strategies/jwt.js.map +1 -1
  112. package/dist/auth/strategies/jwt.spec.js +281 -0
  113. package/dist/auth/strategies/jwt.spec.js.map +1 -0
  114. package/dist/auth/strategies/local/authenticate.d.ts +5 -1
  115. package/dist/auth/strategies/local/authenticate.d.ts.map +1 -1
  116. package/dist/auth/strategies/local/authenticate.js +8 -3
  117. package/dist/auth/strategies/local/authenticate.js.map +1 -1
  118. package/dist/auth/strategies/local/authenticate.spec.js +37 -10
  119. package/dist/auth/strategies/local/authenticate.spec.js.map +1 -1
  120. package/dist/auth/strategies/local/generatePasswordSaltHash.d.ts +9 -1
  121. package/dist/auth/strategies/local/generatePasswordSaltHash.d.ts.map +1 -1
  122. package/dist/auth/strategies/local/generatePasswordSaltHash.js +61 -34
  123. package/dist/auth/strategies/local/generatePasswordSaltHash.js.map +1 -1
  124. package/dist/auth/types.d.ts +16 -1
  125. package/dist/auth/types.d.ts.map +1 -1
  126. package/dist/auth/types.js.map +1 -1
  127. package/dist/collections/config/client.d.ts +1 -0
  128. package/dist/collections/config/client.d.ts.map +1 -1
  129. package/dist/collections/config/client.js +3 -0
  130. package/dist/collections/config/client.js.map +1 -1
  131. package/dist/collections/config/defaults.d.ts.map +1 -1
  132. package/dist/collections/config/defaults.js +4 -2
  133. package/dist/collections/config/defaults.js.map +1 -1
  134. package/dist/collections/config/sanitize.d.ts.map +1 -1
  135. package/dist/collections/config/sanitize.js +17 -6
  136. package/dist/collections/config/sanitize.js.map +1 -1
  137. package/dist/collections/endpoints/index.d.ts +1 -0
  138. package/dist/collections/endpoints/index.d.ts.map +1 -1
  139. package/dist/collections/endpoints/index.js +6 -5
  140. package/dist/collections/endpoints/index.js.map +1 -1
  141. package/dist/collections/operations/create.d.ts.map +1 -1
  142. package/dist/collections/operations/create.js +105 -8
  143. package/dist/collections/operations/create.js.map +1 -1
  144. package/dist/collections/operations/deleteByID.js +13 -13
  145. package/dist/collections/operations/deleteByID.js.map +1 -1
  146. package/dist/collections/operations/findDistinct.d.ts.map +1 -1
  147. package/dist/collections/operations/findDistinct.js +96 -18
  148. package/dist/collections/operations/findDistinct.js.map +1 -1
  149. package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
  150. package/dist/collections/operations/restoreVersion.js +47 -13
  151. package/dist/collections/operations/restoreVersion.js.map +1 -1
  152. package/dist/collections/operations/update.d.ts.map +1 -1
  153. package/dist/collections/operations/update.js +123 -23
  154. package/dist/collections/operations/update.js.map +1 -1
  155. package/dist/collections/operations/updateByID.d.ts.map +1 -1
  156. package/dist/collections/operations/updateByID.js +62 -2
  157. package/dist/collections/operations/updateByID.js.map +1 -1
  158. package/dist/collections/operations/utilities/update.d.ts.map +1 -1
  159. package/dist/collections/operations/utilities/update.js +71 -15
  160. package/dist/collections/operations/utilities/update.js.map +1 -1
  161. package/dist/config/orderable/index.d.ts.map +1 -1
  162. package/dist/config/orderable/index.js +67 -14
  163. package/dist/config/orderable/index.js.map +1 -1
  164. package/dist/config/sanitize.d.ts.map +1 -1
  165. package/dist/config/sanitize.js +1 -1
  166. package/dist/config/sanitize.js.map +1 -1
  167. package/dist/config/types.d.ts +13 -1
  168. package/dist/config/types.d.ts.map +1 -1
  169. package/dist/config/types.js.map +1 -1
  170. package/dist/database/getLocalizedPaths.d.ts +2 -1
  171. package/dist/database/getLocalizedPaths.d.ts.map +1 -1
  172. package/dist/database/getLocalizedPaths.js +12 -3
  173. package/dist/database/getLocalizedPaths.js.map +1 -1
  174. package/dist/database/isNestedRelationshipQuery.d.ts +9 -0
  175. package/dist/database/isNestedRelationshipQuery.d.ts.map +1 -0
  176. package/dist/database/isNestedRelationshipQuery.js +14 -0
  177. package/dist/database/isNestedRelationshipQuery.js.map +1 -0
  178. package/dist/database/prefixWherePaths.d.ts +6 -0
  179. package/dist/database/prefixWherePaths.d.ts.map +1 -0
  180. package/dist/database/prefixWherePaths.js +19 -0
  181. package/dist/database/prefixWherePaths.js.map +1 -0
  182. package/dist/database/prefixWherePaths.spec.js +46 -0
  183. package/dist/database/prefixWherePaths.spec.js.map +1 -0
  184. package/dist/database/queryValidation/validateQueryPaths.d.ts +2 -1
  185. package/dist/database/queryValidation/validateQueryPaths.d.ts.map +1 -1
  186. package/dist/database/queryValidation/validateQueryPaths.js +4 -1
  187. package/dist/database/queryValidation/validateQueryPaths.js.map +1 -1
  188. package/dist/database/queryValidation/validateSearchParams.d.ts +2 -1
  189. package/dist/database/queryValidation/validateSearchParams.d.ts.map +1 -1
  190. package/dist/database/queryValidation/validateSearchParams.js +82 -4
  191. package/dist/database/queryValidation/validateSearchParams.js.map +1 -1
  192. package/dist/database/types.d.ts +5 -0
  193. package/dist/database/types.d.ts.map +1 -1
  194. package/dist/database/types.js.map +1 -1
  195. package/dist/email/normalizeSendEmailOptions.js.map +1 -1
  196. package/dist/email/types.d.ts +4 -1
  197. package/dist/email/types.d.ts.map +1 -1
  198. package/dist/email/types.js.map +1 -1
  199. package/dist/exports/internal.d.ts +7 -0
  200. package/dist/exports/internal.d.ts.map +1 -1
  201. package/dist/exports/internal.js +7 -1
  202. package/dist/exports/internal.js.map +1 -1
  203. package/dist/exports/shared.d.ts +3 -0
  204. package/dist/exports/shared.d.ts.map +1 -1
  205. package/dist/exports/shared.js +3 -0
  206. package/dist/exports/shared.js.map +1 -1
  207. package/dist/fields/config/types.d.ts +7 -5
  208. package/dist/fields/config/types.d.ts.map +1 -1
  209. package/dist/fields/config/types.js.map +1 -1
  210. package/dist/fields/hooks/beforeChange/index.d.ts +7 -1
  211. package/dist/fields/hooks/beforeChange/index.d.ts.map +1 -1
  212. package/dist/fields/hooks/beforeChange/index.js +4 -2
  213. package/dist/fields/hooks/beforeChange/index.js.map +1 -1
  214. package/dist/fields/hooks/beforeChange/index.spec.js +206 -0
  215. package/dist/fields/hooks/beforeChange/index.spec.js.map +1 -0
  216. package/dist/fields/hooks/beforeChange/promise.d.ts +2 -1
  217. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  218. package/dist/fields/hooks/beforeChange/promise.js +51 -9
  219. package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
  220. package/dist/fields/hooks/beforeChange/traverseFields.d.ts +2 -1
  221. package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
  222. package/dist/fields/hooks/beforeChange/traverseFields.js +3 -2
  223. package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
  224. package/dist/fields/hooks/beforeDuplicate/promise.d.ts.map +1 -1
  225. package/dist/fields/hooks/beforeDuplicate/promise.js +4 -0
  226. package/dist/fields/hooks/beforeDuplicate/promise.js.map +1 -1
  227. package/dist/fields/hooks/beforeValidate/getFallbackValue.d.ts +2 -1
  228. package/dist/fields/hooks/beforeValidate/getFallbackValue.d.ts.map +1 -1
  229. package/dist/fields/hooks/beforeValidate/getFallbackValue.js +2 -2
  230. package/dist/fields/hooks/beforeValidate/getFallbackValue.js.map +1 -1
  231. package/dist/fields/hooks/beforeValidate/index.d.ts +6 -1
  232. package/dist/fields/hooks/beforeValidate/index.d.ts.map +1 -1
  233. package/dist/fields/hooks/beforeValidate/index.js +3 -1
  234. package/dist/fields/hooks/beforeValidate/index.js.map +1 -1
  235. package/dist/fields/hooks/beforeValidate/index.spec.js +90 -0
  236. package/dist/fields/hooks/beforeValidate/index.spec.js.map +1 -0
  237. package/dist/fields/hooks/beforeValidate/promise.d.ts +6 -1
  238. package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
  239. package/dist/fields/hooks/beforeValidate/promise.js +23 -8
  240. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  241. package/dist/fields/hooks/beforeValidate/traverseFields.d.ts +6 -1
  242. package/dist/fields/hooks/beforeValidate/traverseFields.d.ts.map +1 -1
  243. package/dist/fields/hooks/beforeValidate/traverseFields.js +3 -1
  244. package/dist/fields/hooks/beforeValidate/traverseFields.js.map +1 -1
  245. package/dist/fields/validations.d.ts.map +1 -1
  246. package/dist/fields/validations.js +3 -1
  247. package/dist/fields/validations.js.map +1 -1
  248. package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
  249. package/dist/globals/operations/restoreVersion.js +45 -11
  250. package/dist/globals/operations/restoreVersion.js.map +1 -1
  251. package/dist/globals/operations/update.d.ts.map +1 -1
  252. package/dist/globals/operations/update.js +95 -16
  253. package/dist/globals/operations/update.js.map +1 -1
  254. package/dist/index.bundled.d.ts +146 -48
  255. package/dist/index.d.ts +4 -1
  256. package/dist/index.d.ts.map +1 -1
  257. package/dist/index.js +3 -2
  258. package/dist/index.js.map +1 -1
  259. package/dist/preferences/config.d.ts.map +1 -1
  260. package/dist/preferences/config.js +2 -1
  261. package/dist/preferences/config.js.map +1 -1
  262. package/dist/query-presets/access.d.ts.map +1 -1
  263. package/dist/query-presets/access.js +2 -1
  264. package/dist/query-presets/access.js.map +1 -1
  265. package/dist/queues/config/collection.d.ts.map +1 -1
  266. package/dist/queues/config/collection.js +6 -0
  267. package/dist/queues/config/collection.js.map +1 -1
  268. package/dist/queues/config/types/index.d.ts +4 -1
  269. package/dist/queues/config/types/index.d.ts.map +1 -1
  270. package/dist/queues/config/types/index.js.map +1 -1
  271. package/dist/queues/endpoints/handleSchedules.d.ts.map +1 -1
  272. package/dist/queues/endpoints/handleSchedules.js +2 -1
  273. package/dist/queues/endpoints/handleSchedules.js.map +1 -1
  274. package/dist/queues/endpoints/run.d.ts.map +1 -1
  275. package/dist/queues/endpoints/run.js +2 -1
  276. package/dist/queues/endpoints/run.js.map +1 -1
  277. package/dist/uploads/assertClientUploadAccess.d.ts +7 -0
  278. package/dist/uploads/assertClientUploadAccess.d.ts.map +1 -0
  279. package/dist/uploads/assertClientUploadAccess.js +27 -0
  280. package/dist/uploads/assertClientUploadAccess.js.map +1 -0
  281. package/dist/uploads/assertClientUploadAllowed.d.ts +11 -0
  282. package/dist/uploads/assertClientUploadAllowed.d.ts.map +1 -0
  283. package/dist/uploads/assertClientUploadAllowed.js +46 -0
  284. package/dist/uploads/assertClientUploadAllowed.js.map +1 -0
  285. package/dist/uploads/assertClientUploadAllowed.spec.js +91 -0
  286. package/dist/uploads/assertClientUploadAllowed.spec.js.map +1 -0
  287. package/dist/uploads/checkFileRestrictions.d.ts +4 -1
  288. package/dist/uploads/checkFileRestrictions.d.ts.map +1 -1
  289. package/dist/uploads/checkFileRestrictions.js +66 -26
  290. package/dist/uploads/checkFileRestrictions.js.map +1 -1
  291. package/dist/uploads/clientUploadReceipt.d.ts +23 -0
  292. package/dist/uploads/clientUploadReceipt.d.ts.map +1 -0
  293. package/dist/uploads/clientUploadReceipt.js +55 -0
  294. package/dist/uploads/clientUploadReceipt.js.map +1 -0
  295. package/dist/uploads/deleteAssociatedFiles.d.ts.map +1 -1
  296. package/dist/uploads/deleteAssociatedFiles.js +33 -8
  297. package/dist/uploads/deleteAssociatedFiles.js.map +1 -1
  298. package/dist/uploads/deleteAssociatedFiles.spec.js +124 -0
  299. package/dist/uploads/deleteAssociatedFiles.spec.js.map +1 -0
  300. package/dist/uploads/detectSvgFromXml.d.ts +1 -3
  301. package/dist/uploads/detectSvgFromXml.d.ts.map +1 -1
  302. package/dist/uploads/detectSvgFromXml.js +3 -40
  303. package/dist/uploads/detectSvgFromXml.js.map +1 -1
  304. package/dist/uploads/endpoints/getFile.d.ts.map +1 -1
  305. package/dist/uploads/endpoints/getFile.js +5 -3
  306. package/dist/uploads/endpoints/getFile.js.map +1 -1
  307. package/dist/uploads/fetchAPI-multipart/handlers.d.ts +2 -2
  308. package/dist/uploads/fetchAPI-multipart/handlers.d.ts.map +1 -1
  309. package/dist/uploads/fetchAPI-multipart/handlers.js +18 -5
  310. package/dist/uploads/fetchAPI-multipart/handlers.js.map +1 -1
  311. package/dist/uploads/fetchAPI-multipart/index.d.ts.map +1 -1
  312. package/dist/uploads/fetchAPI-multipart/index.js +24 -2
  313. package/dist/uploads/fetchAPI-multipart/index.js.map +1 -1
  314. package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts +0 -6
  315. package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts.map +1 -1
  316. package/dist/uploads/fetchAPI-multipart/processMultipart.js +146 -126
  317. package/dist/uploads/fetchAPI-multipart/processMultipart.js.map +1 -1
  318. package/dist/uploads/fetchAPI-multipart/processMultipart.spec.js +663 -0
  319. package/dist/uploads/fetchAPI-multipart/processMultipart.spec.js.map +1 -0
  320. package/dist/uploads/generateFileData.d.ts +3 -1
  321. package/dist/uploads/generateFileData.d.ts.map +1 -1
  322. package/dist/uploads/generateFileData.js +29 -16
  323. package/dist/uploads/generateFileData.js.map +1 -1
  324. package/dist/uploads/getBaseFields.d.ts.map +1 -1
  325. package/dist/uploads/getBaseFields.js +3 -1
  326. package/dist/uploads/getBaseFields.js.map +1 -1
  327. package/dist/uploads/getExternalFile.d.ts +1 -1
  328. package/dist/uploads/getExternalFile.d.ts.map +1 -1
  329. package/dist/uploads/getExternalFile.js +60 -15
  330. package/dist/uploads/getExternalFile.js.map +1 -1
  331. package/dist/uploads/getFileFromClientUpload.d.ts +2 -2
  332. package/dist/uploads/getFileFromClientUpload.d.ts.map +1 -1
  333. package/dist/uploads/getFileFromClientUpload.js +4 -4
  334. package/dist/uploads/getFileFromClientUpload.js.map +1 -1
  335. package/dist/uploads/getFileFromClientUpload.spec.js +62 -0
  336. package/dist/uploads/getFileFromClientUpload.spec.js.map +1 -1
  337. package/dist/uploads/getFileTypeFallback.d.ts.map +1 -1
  338. package/dist/uploads/getFileTypeFallback.js +3 -1
  339. package/dist/uploads/getFileTypeFallback.js.map +1 -1
  340. package/dist/uploads/getFileTypeIdentity.d.ts +19 -0
  341. package/dist/uploads/getFileTypeIdentity.d.ts.map +1 -0
  342. package/dist/uploads/getFileTypeIdentity.js +34 -0
  343. package/dist/uploads/getFileTypeIdentity.js.map +1 -0
  344. package/dist/uploads/getFileTypeIdentity.spec.js +43 -0
  345. package/dist/uploads/getFileTypeIdentity.spec.js.map +1 -0
  346. package/dist/uploads/isProcessableImage.d.ts +2 -0
  347. package/dist/uploads/isProcessableImage.d.ts.map +1 -0
  348. package/dist/uploads/isProcessableImage.js +7 -0
  349. package/dist/uploads/isProcessableImage.js.map +1 -0
  350. package/dist/uploads/safeFetch.d.ts.map +1 -1
  351. package/dist/uploads/safeFetch.js +3 -2
  352. package/dist/uploads/safeFetch.js.map +1 -1
  353. package/dist/uploads/sanitizeUploadData.d.ts +26 -0
  354. package/dist/uploads/sanitizeUploadData.d.ts.map +1 -0
  355. package/dist/uploads/sanitizeUploadData.js +159 -0
  356. package/dist/uploads/sanitizeUploadData.js.map +1 -0
  357. package/dist/uploads/sanitizeUploadData.spec.js +255 -0
  358. package/dist/uploads/sanitizeUploadData.spec.js.map +1 -0
  359. package/dist/uploads/types.d.ts +11 -3
  360. package/dist/uploads/types.d.ts.map +1 -1
  361. package/dist/uploads/types.js.map +1 -1
  362. package/dist/uploads/unlinkClientUploadTempFile.d.ts +20 -0
  363. package/dist/uploads/unlinkClientUploadTempFile.d.ts.map +1 -0
  364. package/dist/uploads/unlinkClientUploadTempFile.js +30 -0
  365. package/dist/uploads/unlinkClientUploadTempFile.js.map +1 -0
  366. package/dist/uploads/unlinkTempFiles.d.ts.map +1 -1
  367. package/dist/uploads/unlinkTempFiles.js +7 -9
  368. package/dist/uploads/unlinkTempFiles.js.map +1 -1
  369. package/dist/uploads/unlinkTempFiles.spec.js +61 -1
  370. package/dist/uploads/unlinkTempFiles.spec.js.map +1 -1
  371. package/dist/uploads/uploadContentSecurityPolicy.d.ts +2 -0
  372. package/dist/uploads/uploadContentSecurityPolicy.d.ts.map +1 -0
  373. package/dist/uploads/uploadContentSecurityPolicy.js +3 -0
  374. package/dist/uploads/uploadContentSecurityPolicy.js.map +1 -0
  375. package/dist/uploads/validateISOBaseMediaFile.d.ts +4 -0
  376. package/dist/uploads/validateISOBaseMediaFile.d.ts.map +1 -0
  377. package/dist/uploads/validateISOBaseMediaFile.js +91 -0
  378. package/dist/uploads/validateISOBaseMediaFile.js.map +1 -0
  379. package/dist/uploads/validateISOBaseMediaFile.spec.js +130 -0
  380. package/dist/uploads/validateISOBaseMediaFile.spec.js.map +1 -0
  381. package/dist/uploads/validateSvg.d.ts +10 -4
  382. package/dist/uploads/validateSvg.d.ts.map +1 -1
  383. package/dist/uploads/validateSvg.js +280 -40
  384. package/dist/uploads/validateSvg.js.map +1 -1
  385. package/dist/uploads/validateSvg.spec.js +123 -0
  386. package/dist/uploads/validateSvg.spec.js.map +1 -0
  387. package/dist/uploads/validateUploadFilename.d.ts +3 -0
  388. package/dist/uploads/validateUploadFilename.d.ts.map +1 -0
  389. package/dist/uploads/validateUploadFilename.js +13 -0
  390. package/dist/uploads/validateUploadFilename.js.map +1 -0
  391. package/dist/uploads/validateUploadFilename.spec.js +24 -0
  392. package/dist/uploads/validateUploadFilename.spec.js.map +1 -0
  393. package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
  394. package/dist/utilities/addDataAndFileToRequest.js +28 -1
  395. package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
  396. package/dist/utilities/addDataAndFileToRequest.spec.js +158 -0
  397. package/dist/utilities/addDataAndFileToRequest.spec.js.map +1 -1
  398. package/dist/utilities/createPayloadRequest.d.ts.map +1 -1
  399. package/dist/utilities/createPayloadRequest.js +2 -1
  400. package/dist/utilities/createPayloadRequest.js.map +1 -1
  401. package/dist/utilities/deepCopyObject.d.ts.map +1 -1
  402. package/dist/utilities/deepCopyObject.js +110 -19
  403. package/dist/utilities/deepCopyObject.js.map +1 -1
  404. package/dist/utilities/deepCopyObject.spec.js +216 -0
  405. package/dist/utilities/deepCopyObject.spec.js.map +1 -0
  406. package/dist/utilities/fieldPath.d.ts +13 -0
  407. package/dist/utilities/fieldPath.d.ts.map +1 -0
  408. package/dist/utilities/fieldPath.js +51 -0
  409. package/dist/utilities/fieldPath.js.map +1 -0
  410. package/dist/utilities/fieldPath.spec.js +155 -0
  411. package/dist/utilities/fieldPath.spec.js.map +1 -0
  412. package/dist/utilities/getEntityPermissions/getEntityPermissions.d.ts.map +1 -1
  413. package/dist/utilities/getEntityPermissions/getEntityPermissions.js +2 -0
  414. package/dist/utilities/getEntityPermissions/getEntityPermissions.js.map +1 -1
  415. package/dist/utilities/getObjectDotNotation.d.ts.map +1 -1
  416. package/dist/utilities/getObjectDotNotation.js +7 -1
  417. package/dist/utilities/getObjectDotNotation.js.map +1 -1
  418. package/dist/utilities/getObjectDotNotation.spec.js +33 -0
  419. package/dist/utilities/getObjectDotNotation.spec.js.map +1 -0
  420. package/dist/utilities/getSafeRedirect.spec.js +14 -0
  421. package/dist/utilities/getSafeRedirect.spec.js.map +1 -1
  422. package/dist/utilities/getTopLevelFieldNames.d.ts +2 -0
  423. package/dist/utilities/getTopLevelFieldNames.d.ts.map +1 -0
  424. package/dist/utilities/getTopLevelFieldNames.js +3 -0
  425. package/dist/utilities/getTopLevelFieldNames.js.map +1 -0
  426. package/dist/utilities/getTopLevelFieldNames.spec.js +18 -0
  427. package/dist/utilities/getTopLevelFieldNames.spec.js.map +1 -0
  428. package/dist/utilities/handleEndpoints.js +1 -1
  429. package/dist/utilities/handleEndpoints.js.map +1 -1
  430. package/dist/utilities/parseParams/index.d.ts.map +1 -1
  431. package/dist/utilities/parseParams/index.js +3 -1
  432. package/dist/utilities/parseParams/index.js.map +1 -1
  433. package/dist/utilities/parseParams/index.spec.js +8 -0
  434. package/dist/utilities/parseParams/index.spec.js.map +1 -1
  435. package/dist/utilities/traverseFields.d.ts.map +1 -1
  436. package/dist/utilities/traverseFields.js +5 -14
  437. package/dist/utilities/traverseFields.js.map +1 -1
  438. package/dist/utilities/unflatten.d.ts.map +1 -1
  439. package/dist/utilities/unflatten.js +21 -9
  440. package/dist/utilities/unflatten.js.map +1 -1
  441. package/dist/utilities/unflatten.spec.js +38 -0
  442. package/dist/utilities/unflatten.spec.js.map +1 -0
  443. package/dist/utilities/wrapInternalEndpoints.d.ts.map +1 -1
  444. package/dist/utilities/wrapInternalEndpoints.js +10 -3
  445. package/dist/utilities/wrapInternalEndpoints.js.map +1 -1
  446. package/dist/utilities/wrapInternalEndpoints.spec.js +124 -0
  447. package/dist/utilities/wrapInternalEndpoints.spec.js.map +1 -0
  448. package/dist/versions/allLocalesPublicationStatus.d.ts +38 -0
  449. package/dist/versions/allLocalesPublicationStatus.d.ts.map +1 -0
  450. package/dist/versions/allLocalesPublicationStatus.js +57 -0
  451. package/dist/versions/allLocalesPublicationStatus.js.map +1 -0
  452. package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
  453. package/dist/versions/getLatestGlobalVersion.js +10 -2
  454. package/dist/versions/getLatestGlobalVersion.js.map +1 -1
  455. package/dist/versions/getRestoredStatusesToAuthorize.d.ts +9 -0
  456. package/dist/versions/getRestoredStatusesToAuthorize.d.ts.map +1 -0
  457. package/dist/versions/getRestoredStatusesToAuthorize.js +22 -0
  458. package/dist/versions/getRestoredStatusesToAuthorize.js.map +1 -0
  459. package/dist/versions/getRestoredStatusesToAuthorize.spec.js +50 -0
  460. package/dist/versions/getRestoredStatusesToAuthorize.spec.js.map +1 -0
  461. package/dist/versions/schedule/job.d.ts +2 -2
  462. package/dist/versions/schedule/job.d.ts.map +1 -1
  463. package/dist/versions/schedule/job.js +11 -7
  464. package/dist/versions/schedule/job.js.map +1 -1
  465. package/dist/versions/schedule/types.d.ts +5 -1
  466. package/dist/versions/schedule/types.d.ts.map +1 -1
  467. package/dist/versions/schedule/types.js.map +1 -1
  468. package/package.json +4 -2
@@ -1,4 +1,5 @@
1
1
  import { ensureUsernameOrEmail } from '../../../auth/ensureUsernameOrEmail.js';
2
+ import { removeExpiredSessions } from '../../../auth/sessions.js';
2
3
  import { generatePasswordSaltHash } from '../../../auth/strategies/local/generatePasswordSaltHash.js';
3
4
  import { afterChange } from '../../../fields/hooks/afterChange/index.js';
4
5
  import { afterRead } from '../../../fields/hooks/afterRead/index.js';
@@ -8,8 +9,10 @@ import { deepCopyObjectSimple, getLatestCollectionVersion, saveVersion } from '.
8
9
  import { deleteAssociatedFiles } from '../../../uploads/deleteAssociatedFiles.js';
9
10
  import { uploadFiles } from '../../../uploads/uploadFiles.js';
10
11
  import { checkDocumentLockStatus } from '../../../utilities/checkDocumentLockStatus.js';
12
+ import { getTopLevelFieldNames } from '../../../utilities/getTopLevelFieldNames.js';
11
13
  import { hasDraftsEnabled, hasDraftValidationEnabled, hasLocalizeStatusEnabled } from '../../../utilities/getVersionsConfig.js';
12
14
  import { mergeLocalizedData } from '../../../utilities/mergeLocalizedData.js';
15
+ import { buildAllLocalesPublicationHookDoc, getAllLocalesPublicationStatus, hasAuthorizedAllLocalesPublicationStatus, validateAllLocalesPublicationFlags } from '../../../versions/allLocalesPublicationStatus.js';
13
16
  /**
14
17
  * This function is used to update a document in the DB and return the result.
15
18
  *
@@ -23,13 +26,20 @@ import { mergeLocalizedData } from '../../../utilities/mergeLocalizedData.js';
23
26
  * - afterChange - Fields
24
27
  * - afterChange - Collection
25
28
  */ export const updateDocument = async ({ id, autosave, collectionConfig, config, data, depth, docWithLocales, draftArg, fallbackLocale, filesToUpload, locale, overrideAccess, overrideLock, payload, populate, publishAllLocales: publishAllLocalesArg, publishSpecificLocale, req, select, showHiddenFields, unpublishAllLocales: unpublishAllLocalesArg })=>{
26
- const password = data?.password;
27
- const publishAllLocales = !draftArg && (publishAllLocalesArg ?? (hasLocalizeStatusEnabled(collectionConfig) ? false : true));
29
+ validateAllLocalesPublicationFlags({
30
+ publishAllLocales: publishAllLocalesArg,
31
+ unpublishAllLocales: unpublishAllLocalesArg
32
+ });
33
+ const publishAllLocales = !draftArg && (publishAllLocalesArg ?? !hasLocalizeStatusEnabled(collectionConfig));
28
34
  const unpublishAllLocales = typeof unpublishAllLocalesArg === 'string' ? unpublishAllLocalesArg === 'true' : !!unpublishAllLocalesArg;
35
+ const allLocalesPublicationStatus = getAllLocalesPublicationStatus({
36
+ hasLocalizedStatus: Boolean(config.localization && hasLocalizeStatusEnabled(collectionConfig)),
37
+ publishAllLocales,
38
+ unpublishAllLocales
39
+ });
29
40
  const isSavingDraft = Boolean(draftArg && hasDraftsEnabled(collectionConfig)) && data._status !== 'published' && !publishAllLocales;
30
- const shouldSavePassword = Boolean(password && collectionConfig.auth && (!collectionConfig.auth.disableLocalStrategy || typeof collectionConfig.auth.disableLocalStrategy === 'object' && collectionConfig.auth.disableLocalStrategy.enableFields) && !isSavingDraft);
31
- if (isSavingDraft) {
32
- data._status = 'draft';
41
+ if (allLocalesPublicationStatus || isSavingDraft) {
42
+ data._status = allLocalesPublicationStatus ?? 'draft';
33
43
  }
34
44
  // /////////////////////////////////////
35
45
  // Handle potentially locked documents
@@ -55,6 +65,8 @@ import { mergeLocalizedData } from '../../../utilities/mergeLocalizedData.js';
55
65
  showHiddenFields: true
56
66
  });
57
67
  const isRestoringDraftFromTrash = Boolean(originalDoc?.deletedAt) && data?._status !== 'published';
68
+ const shouldLimitValidationToSubmittedFields = collectionConfig.trash && (Boolean(data?.deletedAt) || isRestoringDraftFromTrash) || unpublishAllLocales;
69
+ const submittedTopLevelFieldNames = shouldLimitValidationToSubmittedFields ? getTopLevelFieldNames(data) : undefined;
58
70
  if (collectionConfig.auth) {
59
71
  ensureUsernameOrEmail({
60
72
  authOptions: collectionConfig.auth,
@@ -87,17 +99,37 @@ import { mergeLocalizedData } from '../../../utilities/mergeLocalizedData.js';
87
99
  // /////////////////////////////////////
88
100
  // beforeValidate - Fields
89
101
  // /////////////////////////////////////
102
+ let statusFieldAccess = false;
103
+ const publicationFieldPolicyDoc = buildAllLocalesPublicationHookDoc({
104
+ doc: originalDoc,
105
+ docWithLocales,
106
+ status: allLocalesPublicationStatus
107
+ });
90
108
  data = await beforeValidate({
91
109
  id,
92
110
  collection: collectionConfig,
93
111
  context: req.context,
94
112
  data,
95
113
  doc: originalDoc,
114
+ docForHooks: publicationFieldPolicyDoc,
96
115
  global: null,
116
+ onFieldAccess: ({ accessResult, path })=>{
117
+ if (path === '_status') {
118
+ statusFieldAccess = accessResult;
119
+ }
120
+ },
97
121
  operation: 'update',
98
122
  overrideAccess,
99
123
  req
100
124
  });
125
+ const password = data?.password;
126
+ const shouldSavePassword = Boolean(password && collectionConfig.auth && (!collectionConfig.auth.disableLocalStrategy || typeof collectionConfig.auth.disableLocalStrategy === 'object' && collectionConfig.auth.disableLocalStrategy.enableFields) && !isSavingDraft);
127
+ const publicationStatusIsAuthorized = statusFieldAccess && data._status === allLocalesPublicationStatus;
128
+ const publicationHookDoc = buildAllLocalesPublicationHookDoc({
129
+ doc: originalDoc,
130
+ docWithLocales,
131
+ status: publicationStatusIsAuthorized ? allLocalesPublicationStatus : undefined
132
+ });
101
133
  // /////////////////////////////////////
102
134
  // beforeValidate - Collection
103
135
  // /////////////////////////////////////
@@ -108,7 +140,7 @@ import { mergeLocalizedData } from '../../../utilities/mergeLocalizedData.js';
108
140
  context: req.context,
109
141
  data,
110
142
  operation: 'update',
111
- originalDoc,
143
+ originalDoc: publicationHookDoc,
112
144
  req
113
145
  }) || data;
114
146
  }
@@ -129,11 +161,14 @@ import { mergeLocalizedData } from '../../../utilities/mergeLocalizedData.js';
129
161
  context: req.context,
130
162
  data,
131
163
  operation: 'update',
132
- originalDoc,
164
+ originalDoc: publicationHookDoc,
133
165
  req
134
166
  }) || data;
135
167
  }
136
168
  }
169
+ const publicationData = {
170
+ ...data
171
+ };
137
172
  // /////////////////////////////////////
138
173
  // beforeChange - Fields
139
174
  // /////////////////////////////////////
@@ -145,27 +180,43 @@ import { mergeLocalizedData } from '../../../utilities/mergeLocalizedData.js';
145
180
  ...data,
146
181
  id
147
182
  },
148
- doc: originalDoc,
183
+ doc: publicationHookDoc,
149
184
  docWithLocales,
185
+ fieldsToValidate: submittedTopLevelFieldNames,
150
186
  global: null,
151
187
  operation: 'update',
152
188
  overrideAccess,
153
189
  req,
154
- skipValidation: // only skip validation for drafts when draft validation is false
155
- isSavingDraft && !hasDraftValidationEnabled(collectionConfig) || // Skip validation for trash operations since they're just metadata updates
156
- collectionConfig.trash && (Boolean(data?.deletedAt) || isRestoringDraftFromTrash) || // Skip validation for unpublish operations — they only change _status, not document data
157
- unpublishAllLocales
190
+ // only skip validation for drafts when draft validation is false
191
+ skipValidation: isSavingDraft && !hasDraftValidationEnabled(collectionConfig)
158
192
  };
159
193
  // /////////////////////////////////////
160
194
  // Handle Localized Data Merging
161
195
  // /////////////////////////////////////
162
- let result = await beforeChange(beforeChangeArgs);
196
+ let statusFieldValue;
197
+ let result = await beforeChange({
198
+ ...beforeChangeArgs,
199
+ onDataProcessed: (processedData)=>{
200
+ statusFieldValue = processedData._status;
201
+ }
202
+ });
203
+ const hasAuthorizedPublicationStatus = hasAuthorizedAllLocalesPublicationStatus({
204
+ data: publicationData,
205
+ fieldAccessDenied: !statusFieldAccess,
206
+ fieldValue: statusFieldValue,
207
+ status: allLocalesPublicationStatus
208
+ });
209
+ if (allLocalesPublicationStatus && !hasAuthorizedPublicationStatus && typeof statusFieldValue === 'undefined' && typeof docWithLocales._status === 'object' && docWithLocales._status !== null) {
210
+ result._status = {
211
+ ...docWithLocales._status
212
+ };
213
+ }
163
214
  let snapshotToSave;
164
215
  if (config.localization && collectionConfig.versions) {
165
216
  let snapshotData;
166
217
  let currentDoc;
167
- if (collectionConfig.versions.drafts && collectionConfig.versions.drafts.localizeStatus) {
168
- if (publishAllLocales || unpublishAllLocales) {
218
+ if (hasLocalizeStatusEnabled(collectionConfig)) {
219
+ if (hasAuthorizedPublicationStatus) {
169
220
  let accessibleLocaleCodes = config.localization.localeCodes;
170
221
  if (config.localization.filterAvailableLocales) {
171
222
  const filteredLocales = await config.localization.filterAvailableLocales({
@@ -246,6 +297,11 @@ import { mergeLocalizedData } from '../../../utilities/mergeLocalizedData.js';
246
297
  dataToUpdate.hash = hash;
247
298
  delete dataToUpdate.password;
248
299
  delete data.password;
300
+ if (collectionConfig.auth?.useSessions) {
301
+ const currentSid = req.user?.collection === collectionConfig.slug && String(req.user.id) === String(id) ? req.user._sid : undefined;
302
+ const existingSessions = removeExpiredSessions(docWithLocales.sessions ?? []);
303
+ dataToUpdate.sessions = currentSid ? existingSessions.filter((session)=>session.id === currentSid) : [];
304
+ }
249
305
  }
250
306
  // /////////////////////////////////////
251
307
  // Update
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/collections/operations/utilities/update.ts"],"sourcesContent":["import type { DeepPartial } from 'ts-essentials'\n\nimport type { Args } from '../../../fields/hooks/beforeChange/index.js'\nimport type {\n CollectionSlug,\n FileToSave,\n SanitizedConfig,\n TypedFallbackLocale,\n} from '../../../index.js'\nimport type {\n JsonObject,\n Payload,\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformCollectionWithSelect,\n} from '../../../types/index.js'\nimport type {\n DataFromCollectionSlug,\n SanitizedCollectionConfig,\n SelectFromCollectionSlug,\n TypeWithID,\n} from '../../config/types.js'\n\nimport { ensureUsernameOrEmail } from '../../../auth/ensureUsernameOrEmail.js'\nimport { generatePasswordSaltHash } from '../../../auth/strategies/local/generatePasswordSaltHash.js'\nimport { afterChange } from '../../../fields/hooks/afterChange/index.js'\nimport { afterRead } from '../../../fields/hooks/afterRead/index.js'\nimport { beforeChange } from '../../../fields/hooks/beforeChange/index.js'\nimport { beforeValidate } from '../../../fields/hooks/beforeValidate/index.js'\nimport { deepCopyObjectSimple, getLatestCollectionVersion, saveVersion } from '../../../index.js'\nimport { deleteAssociatedFiles } from '../../../uploads/deleteAssociatedFiles.js'\nimport { uploadFiles } from '../../../uploads/uploadFiles.js'\nimport { checkDocumentLockStatus } from '../../../utilities/checkDocumentLockStatus.js'\nimport {\n hasDraftsEnabled,\n hasDraftValidationEnabled,\n hasLocalizeStatusEnabled,\n} from '../../../utilities/getVersionsConfig.js'\nimport { mergeLocalizedData } from '../../../utilities/mergeLocalizedData.js'\nexport type SharedUpdateDocumentArgs<TSlug extends CollectionSlug> = {\n autosave: boolean\n collectionConfig: SanitizedCollectionConfig\n config: SanitizedConfig\n data: DeepPartial<DataFromCollectionSlug<TSlug>>\n depth: number\n docWithLocales: JsonObject & TypeWithID\n draftArg: boolean\n fallbackLocale: TypedFallbackLocale\n filesToUpload: FileToSave[]\n id: number | string\n locale: string\n overrideAccess: boolean\n overrideLock: boolean\n payload: Payload\n populate?: PopulateType\n publishAllLocales?: boolean\n publishSpecificLocale?: string\n req: PayloadRequest\n select: SelectType\n showHiddenFields: boolean\n unpublishAllLocales?: boolean\n}\n\n/**\n * This function is used to update a document in the DB and return the result.\n *\n * It runs the following hooks in order:\n * - beforeValidate - Fields\n * - beforeValidate - Collection\n * - beforeChange - Collection\n * - beforeChange - Fields\n * - afterRead - Fields\n * - afterRead - Collection\n * - afterChange - Fields\n * - afterChange - Collection\n */\nexport const updateDocument = async <\n TSlug extends CollectionSlug,\n TSelect extends SelectFromCollectionSlug<TSlug> = SelectType,\n>({\n id,\n autosave,\n collectionConfig,\n config,\n data,\n depth,\n docWithLocales,\n draftArg,\n fallbackLocale,\n filesToUpload,\n locale,\n overrideAccess,\n overrideLock,\n payload,\n populate,\n publishAllLocales: publishAllLocalesArg,\n publishSpecificLocale,\n req,\n select,\n showHiddenFields,\n unpublishAllLocales: unpublishAllLocalesArg,\n}: SharedUpdateDocumentArgs<TSlug>): Promise<TransformCollectionWithSelect<TSlug, TSelect>> => {\n const password = data?.password\n const publishAllLocales =\n !draftArg &&\n (publishAllLocalesArg ?? (hasLocalizeStatusEnabled(collectionConfig) ? false : true))\n const unpublishAllLocales =\n typeof unpublishAllLocalesArg === 'string'\n ? unpublishAllLocalesArg === 'true'\n : !!unpublishAllLocalesArg\n const isSavingDraft =\n Boolean(draftArg && hasDraftsEnabled(collectionConfig)) &&\n data._status !== 'published' &&\n !publishAllLocales\n const shouldSavePassword = Boolean(\n password &&\n collectionConfig.auth &&\n (!collectionConfig.auth.disableLocalStrategy ||\n (typeof collectionConfig.auth.disableLocalStrategy === 'object' &&\n collectionConfig.auth.disableLocalStrategy.enableFields)) &&\n !isSavingDraft,\n )\n\n if (isSavingDraft) {\n data._status = 'draft'\n }\n\n // /////////////////////////////////////\n // Handle potentially locked documents\n // /////////////////////////////////////\n\n await checkDocumentLockStatus({\n id,\n collectionSlug: collectionConfig.slug,\n lockErrorMessage: `Document with ID ${id} is currently locked by another user and cannot be updated.`,\n overrideLock,\n req,\n })\n\n const originalDoc = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: 0,\n doc: deepCopyObjectSimple(docWithLocales),\n draft: draftArg,\n fallbackLocale: id ? null : fallbackLocale,\n global: null,\n locale,\n overrideAccess: true,\n req,\n showHiddenFields: true,\n })\n\n const isRestoringDraftFromTrash = Boolean(originalDoc?.deletedAt) && data?._status !== 'published'\n\n if (collectionConfig.auth) {\n ensureUsernameOrEmail<TSlug>({\n authOptions: collectionConfig.auth,\n collectionSlug: collectionConfig.slug,\n data,\n operation: 'update',\n originalDoc,\n req,\n })\n }\n\n // /////////////////////////////////////\n // Delete any associated files\n // /////////////////////////////////////\n\n // When saving a draft on a document whose latest version is published, the file\n // referenced by docWithLocales is still actively used by the published main document.\n // Deleting it here would break the published document's file even though no publish\n // is happening. Only skip deletion in this case; when the latest version is already a\n // draft, it is safe to delete the old draft file as it is being replaced.\n const isDraftOverPublished = isSavingDraft && docWithLocales._status === 'published'\n\n if (!isDraftOverPublished) {\n await deleteAssociatedFiles({\n collectionConfig,\n config,\n doc: docWithLocales,\n files: filesToUpload,\n overrideDelete: false,\n req,\n })\n }\n\n // /////////////////////////////////////\n // beforeValidate - Fields\n // /////////////////////////////////////\n\n data = await beforeValidate<DeepPartial<DataFromCollectionSlug<TSlug>>>({\n id,\n collection: collectionConfig,\n context: req.context,\n data,\n doc: originalDoc,\n global: null,\n operation: 'update',\n overrideAccess,\n req,\n })\n\n // /////////////////////////////////////\n // beforeValidate - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeValidate?.length) {\n for (const hook of collectionConfig.hooks.beforeValidate) {\n data =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n operation: 'update',\n originalDoc,\n req,\n })) || data\n }\n }\n\n // /////////////////////////////////////\n // Write files to local storage\n // /////////////////////////////////////\n\n if (!collectionConfig.upload.disableLocalStorage) {\n await uploadFiles(payload, filesToUpload, req)\n }\n\n // /////////////////////////////////////\n // beforeChange - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeChange?.length) {\n for (const hook of collectionConfig.hooks.beforeChange) {\n data =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n operation: 'update',\n originalDoc,\n req,\n })) || data\n }\n }\n\n // /////////////////////////////////////\n // beforeChange - Fields\n // /////////////////////////////////////\n\n const beforeChangeArgs: Args<DataFromCollectionSlug<TSlug>> = {\n id,\n collection: collectionConfig,\n context: req.context,\n data: { ...data, id },\n doc: originalDoc,\n docWithLocales,\n global: null,\n operation: 'update',\n overrideAccess,\n req,\n skipValidation:\n // only skip validation for drafts when draft validation is false\n (isSavingDraft && !hasDraftValidationEnabled(collectionConfig)) ||\n // Skip validation for trash operations since they're just metadata updates\n (collectionConfig.trash && (Boolean(data?.deletedAt) || isRestoringDraftFromTrash)) ||\n // Skip validation for unpublish operations — they only change _status, not document data\n unpublishAllLocales,\n }\n\n // /////////////////////////////////////\n // Handle Localized Data Merging\n // /////////////////////////////////////\n\n let result: JsonObject = await beforeChange(beforeChangeArgs)\n let snapshotToSave: JsonObject | undefined\n\n if (config.localization && collectionConfig.versions) {\n let snapshotData: JsonObject | undefined\n let currentDoc\n\n if (collectionConfig.versions.drafts && collectionConfig.versions.drafts.localizeStatus) {\n if (publishAllLocales || unpublishAllLocales) {\n let accessibleLocaleCodes = config.localization.localeCodes\n\n if (config.localization.filterAvailableLocales) {\n const filteredLocales = await config.localization.filterAvailableLocales({\n locales: config.localization.locales,\n req,\n })\n accessibleLocaleCodes = filteredLocales.map((locale) =>\n typeof locale === 'string' ? locale : locale.code,\n )\n }\n\n if (typeof result._status !== 'object' || result._status === null) {\n result._status = {}\n }\n\n for (const localeCode of accessibleLocaleCodes) {\n result._status[localeCode] = unpublishAllLocales ? 'draft' : 'published'\n }\n } else if (!isSavingDraft) {\n // publishing a single locale\n currentDoc = await payload.db.findOne<DataFromCollectionSlug<TSlug>>({\n collection: collectionConfig.slug,\n req,\n where: { id: { equals: id } },\n })\n snapshotData = result\n }\n } else if (publishSpecificLocale) {\n // previous way of publishing a single locale\n currentDoc = await getLatestCollectionVersion({\n id,\n config: collectionConfig,\n payload,\n published: true,\n query: {\n collection: collectionConfig.slug,\n locale: 'all',\n req,\n where: { id: { equals: id } },\n },\n req,\n })\n snapshotData = {\n ...result,\n _status: 'draft',\n }\n }\n\n if (snapshotData) {\n snapshotToSave = deepCopyObjectSimple(snapshotData || {})\n\n result = mergeLocalizedData({\n configBlockReferences: config.blocks,\n dataWithLocales: result || {},\n docWithLocales: currentDoc || {},\n fields: collectionConfig.fields,\n selectedLocales: [locale],\n })\n }\n }\n\n const dataToUpdate: JsonObject = { ...result }\n\n // /////////////////////////////////////\n // Handle potential password update\n // /////////////////////////////////////\n\n if (shouldSavePassword && typeof password === 'string') {\n const { hash, salt } = await generatePasswordSaltHash({\n collection: collectionConfig,\n password,\n req,\n })\n dataToUpdate.salt = salt\n dataToUpdate.hash = hash\n delete dataToUpdate.password\n delete data.password\n }\n\n // /////////////////////////////////////\n // Update\n // /////////////////////////////////////\n\n if (!isSavingDraft) {\n // Ensure updatedAt date is always updated\n dataToUpdate.updatedAt = new Date().toISOString()\n result = await req.payload.db.updateOne({\n id,\n collection: collectionConfig.slug,\n data: dataToUpdate,\n locale,\n req,\n })\n }\n\n // /////////////////////////////////////\n // Create version\n // /////////////////////////////////////\n\n if (collectionConfig.versions) {\n result = await saveVersion({\n id,\n autosave,\n collection: collectionConfig,\n docWithLocales: result,\n draft: isSavingDraft,\n operation: 'update',\n payload,\n publishSpecificLocale,\n req,\n snapshot: snapshotToSave,\n unpublish: unpublishAllLocales,\n })\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth,\n doc: result,\n draft: draftArg,\n fallbackLocale,\n global: null,\n locale,\n overrideAccess,\n populate,\n req,\n select,\n showHiddenFields,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterRead?.length) {\n for (const hook of collectionConfig.hooks.afterRead) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n overrideAccess,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterChange - Fields\n // /////////////////////////////////////\n\n result = await afterChange({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: result,\n global: null,\n operation: 'update',\n previousDoc: originalDoc,\n req,\n })\n\n // /////////////////////////////////////\n // afterChange - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterChange?.length) {\n for (const hook of collectionConfig.hooks.afterChange) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: result,\n operation: 'update',\n overrideAccess,\n previousDoc: originalDoc,\n req,\n })) || result\n }\n }\n\n return result as TransformCollectionWithSelect<TSlug, TSelect>\n}\n"],"names":["ensureUsernameOrEmail","generatePasswordSaltHash","afterChange","afterRead","beforeChange","beforeValidate","deepCopyObjectSimple","getLatestCollectionVersion","saveVersion","deleteAssociatedFiles","uploadFiles","checkDocumentLockStatus","hasDraftsEnabled","hasDraftValidationEnabled","hasLocalizeStatusEnabled","mergeLocalizedData","updateDocument","id","autosave","collectionConfig","config","data","depth","docWithLocales","draftArg","fallbackLocale","filesToUpload","locale","overrideAccess","overrideLock","payload","populate","publishAllLocales","publishAllLocalesArg","publishSpecificLocale","req","select","showHiddenFields","unpublishAllLocales","unpublishAllLocalesArg","password","isSavingDraft","Boolean","_status","shouldSavePassword","auth","disableLocalStrategy","enableFields","collectionSlug","slug","lockErrorMessage","originalDoc","collection","context","doc","draft","global","isRestoringDraftFromTrash","deletedAt","authOptions","operation","isDraftOverPublished","files","overrideDelete","hooks","length","hook","upload","disableLocalStorage","beforeChangeArgs","skipValidation","trash","result","snapshotToSave","localization","versions","snapshotData","currentDoc","drafts","localizeStatus","accessibleLocaleCodes","localeCodes","filterAvailableLocales","filteredLocales","locales","map","code","localeCode","db","findOne","where","equals","published","query","configBlockReferences","blocks","dataWithLocales","fields","selectedLocales","dataToUpdate","hash","salt","updatedAt","Date","toISOString","updateOne","snapshot","unpublish","previousDoc"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/collections/operations/utilities/update.ts"],"sourcesContent":["import type { DeepPartial } from 'ts-essentials'\n\nimport type { UserSession } from '../../../auth/types.js'\nimport type { Args } from '../../../fields/hooks/beforeChange/index.js'\nimport type {\n CollectionSlug,\n FileToSave,\n SanitizedConfig,\n TypedFallbackLocale,\n} from '../../../index.js'\nimport type {\n JsonObject,\n Payload,\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformCollectionWithSelect,\n} from '../../../types/index.js'\nimport type {\n DataFromCollectionSlug,\n SanitizedCollectionConfig,\n SelectFromCollectionSlug,\n TypeWithID,\n} from '../../config/types.js'\n\nimport { ensureUsernameOrEmail } from '../../../auth/ensureUsernameOrEmail.js'\nimport { removeExpiredSessions } from '../../../auth/sessions.js'\nimport { generatePasswordSaltHash } from '../../../auth/strategies/local/generatePasswordSaltHash.js'\nimport { afterChange } from '../../../fields/hooks/afterChange/index.js'\nimport { afterRead } from '../../../fields/hooks/afterRead/index.js'\nimport { beforeChange } from '../../../fields/hooks/beforeChange/index.js'\nimport { beforeValidate } from '../../../fields/hooks/beforeValidate/index.js'\nimport { deepCopyObjectSimple, getLatestCollectionVersion, saveVersion } from '../../../index.js'\nimport { deleteAssociatedFiles } from '../../../uploads/deleteAssociatedFiles.js'\nimport { uploadFiles } from '../../../uploads/uploadFiles.js'\nimport { checkDocumentLockStatus } from '../../../utilities/checkDocumentLockStatus.js'\nimport { getTopLevelFieldNames } from '../../../utilities/getTopLevelFieldNames.js'\nimport {\n hasDraftsEnabled,\n hasDraftValidationEnabled,\n hasLocalizeStatusEnabled,\n} from '../../../utilities/getVersionsConfig.js'\nimport { mergeLocalizedData } from '../../../utilities/mergeLocalizedData.js'\nimport {\n buildAllLocalesPublicationHookDoc,\n getAllLocalesPublicationStatus,\n hasAuthorizedAllLocalesPublicationStatus,\n validateAllLocalesPublicationFlags,\n} from '../../../versions/allLocalesPublicationStatus.js'\nexport type SharedUpdateDocumentArgs<TSlug extends CollectionSlug> = {\n autosave: boolean\n collectionConfig: SanitizedCollectionConfig\n config: SanitizedConfig\n data: DeepPartial<DataFromCollectionSlug<TSlug>>\n depth: number\n docWithLocales: JsonObject & TypeWithID\n draftArg: boolean\n fallbackLocale: TypedFallbackLocale\n filesToUpload: FileToSave[]\n id: number | string\n locale: string\n overrideAccess: boolean\n overrideLock: boolean\n payload: Payload\n populate?: PopulateType\n publishAllLocales?: boolean\n publishSpecificLocale?: string\n req: PayloadRequest\n select: SelectType\n showHiddenFields: boolean\n unpublishAllLocales?: boolean\n}\n\n/**\n * This function is used to update a document in the DB and return the result.\n *\n * It runs the following hooks in order:\n * - beforeValidate - Fields\n * - beforeValidate - Collection\n * - beforeChange - Collection\n * - beforeChange - Fields\n * - afterRead - Fields\n * - afterRead - Collection\n * - afterChange - Fields\n * - afterChange - Collection\n */\nexport const updateDocument = async <\n TSlug extends CollectionSlug,\n TSelect extends SelectFromCollectionSlug<TSlug> = SelectType,\n>({\n id,\n autosave,\n collectionConfig,\n config,\n data,\n depth,\n docWithLocales,\n draftArg,\n fallbackLocale,\n filesToUpload,\n locale,\n overrideAccess,\n overrideLock,\n payload,\n populate,\n publishAllLocales: publishAllLocalesArg,\n publishSpecificLocale,\n req,\n select,\n showHiddenFields,\n unpublishAllLocales: unpublishAllLocalesArg,\n}: SharedUpdateDocumentArgs<TSlug>): Promise<TransformCollectionWithSelect<TSlug, TSelect>> => {\n validateAllLocalesPublicationFlags({\n publishAllLocales: publishAllLocalesArg,\n unpublishAllLocales: unpublishAllLocalesArg,\n })\n\n const publishAllLocales =\n !draftArg && (publishAllLocalesArg ?? !hasLocalizeStatusEnabled(collectionConfig))\n const unpublishAllLocales =\n typeof unpublishAllLocalesArg === 'string'\n ? unpublishAllLocalesArg === 'true'\n : !!unpublishAllLocalesArg\n const allLocalesPublicationStatus = getAllLocalesPublicationStatus({\n hasLocalizedStatus: Boolean(config.localization && hasLocalizeStatusEnabled(collectionConfig)),\n publishAllLocales,\n unpublishAllLocales,\n })\n const isSavingDraft =\n Boolean(draftArg && hasDraftsEnabled(collectionConfig)) &&\n data._status !== 'published' &&\n !publishAllLocales\n if (allLocalesPublicationStatus || isSavingDraft) {\n data._status = allLocalesPublicationStatus ?? 'draft'\n }\n\n // /////////////////////////////////////\n // Handle potentially locked documents\n // /////////////////////////////////////\n\n await checkDocumentLockStatus({\n id,\n collectionSlug: collectionConfig.slug,\n lockErrorMessage: `Document with ID ${id} is currently locked by another user and cannot be updated.`,\n overrideLock,\n req,\n })\n\n const originalDoc = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: 0,\n doc: deepCopyObjectSimple(docWithLocales),\n draft: draftArg,\n fallbackLocale: id ? null : fallbackLocale,\n global: null,\n locale,\n overrideAccess: true,\n req,\n showHiddenFields: true,\n })\n\n const isRestoringDraftFromTrash = Boolean(originalDoc?.deletedAt) && data?._status !== 'published'\n const shouldLimitValidationToSubmittedFields =\n (collectionConfig.trash && (Boolean(data?.deletedAt) || isRestoringDraftFromTrash)) ||\n unpublishAllLocales\n const submittedTopLevelFieldNames = shouldLimitValidationToSubmittedFields\n ? getTopLevelFieldNames(data)\n : undefined\n\n if (collectionConfig.auth) {\n ensureUsernameOrEmail<TSlug>({\n authOptions: collectionConfig.auth,\n collectionSlug: collectionConfig.slug,\n data,\n operation: 'update',\n originalDoc,\n req,\n })\n }\n\n // /////////////////////////////////////\n // Delete any associated files\n // /////////////////////////////////////\n\n // When saving a draft on a document whose latest version is published, the file\n // referenced by docWithLocales is still actively used by the published main document.\n // Deleting it here would break the published document's file even though no publish\n // is happening. Only skip deletion in this case; when the latest version is already a\n // draft, it is safe to delete the old draft file as it is being replaced.\n const isDraftOverPublished = isSavingDraft && docWithLocales._status === 'published'\n\n if (!isDraftOverPublished) {\n await deleteAssociatedFiles({\n collectionConfig,\n config,\n doc: docWithLocales,\n files: filesToUpload,\n overrideDelete: false,\n req,\n })\n }\n\n // /////////////////////////////////////\n // beforeValidate - Fields\n // /////////////////////////////////////\n\n let statusFieldAccess = false\n const publicationFieldPolicyDoc = buildAllLocalesPublicationHookDoc({\n doc: originalDoc,\n docWithLocales,\n status: allLocalesPublicationStatus,\n })\n\n data = await beforeValidate<DeepPartial<DataFromCollectionSlug<TSlug>>>({\n id,\n collection: collectionConfig,\n context: req.context,\n data,\n doc: originalDoc,\n docForHooks: publicationFieldPolicyDoc,\n global: null,\n onFieldAccess: ({ accessResult, path }) => {\n if (path === '_status') {\n statusFieldAccess = accessResult\n }\n },\n operation: 'update',\n overrideAccess,\n req,\n })\n\n const password = data?.password\n const shouldSavePassword = Boolean(\n password &&\n collectionConfig.auth &&\n (!collectionConfig.auth.disableLocalStrategy ||\n (typeof collectionConfig.auth.disableLocalStrategy === 'object' &&\n collectionConfig.auth.disableLocalStrategy.enableFields)) &&\n !isSavingDraft,\n )\n\n const publicationStatusIsAuthorized =\n statusFieldAccess && data._status === allLocalesPublicationStatus\n\n const publicationHookDoc = buildAllLocalesPublicationHookDoc({\n doc: originalDoc,\n docWithLocales,\n status: publicationStatusIsAuthorized ? allLocalesPublicationStatus : undefined,\n })\n\n // /////////////////////////////////////\n // beforeValidate - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeValidate?.length) {\n for (const hook of collectionConfig.hooks.beforeValidate) {\n data =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n operation: 'update',\n originalDoc: publicationHookDoc,\n req,\n })) || data\n }\n }\n\n // /////////////////////////////////////\n // Write files to local storage\n // /////////////////////////////////////\n\n if (!collectionConfig.upload.disableLocalStorage) {\n await uploadFiles(payload, filesToUpload, req)\n }\n\n // /////////////////////////////////////\n // beforeChange - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeChange?.length) {\n for (const hook of collectionConfig.hooks.beforeChange) {\n data =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n operation: 'update',\n originalDoc: publicationHookDoc,\n req,\n })) || data\n }\n }\n\n const publicationData = { ...data }\n\n // /////////////////////////////////////\n // beforeChange - Fields\n // /////////////////////////////////////\n\n const beforeChangeArgs: Args<DataFromCollectionSlug<TSlug>> = {\n id,\n collection: collectionConfig,\n context: req.context,\n data: { ...data, id },\n doc: publicationHookDoc,\n docWithLocales,\n fieldsToValidate: submittedTopLevelFieldNames,\n global: null,\n operation: 'update',\n overrideAccess,\n req,\n // only skip validation for drafts when draft validation is false\n skipValidation: isSavingDraft && !hasDraftValidationEnabled(collectionConfig),\n }\n\n // /////////////////////////////////////\n // Handle Localized Data Merging\n // /////////////////////////////////////\n\n let statusFieldValue: unknown\n\n let result: JsonObject = await beforeChange({\n ...beforeChangeArgs,\n onDataProcessed: (processedData) => {\n statusFieldValue = processedData._status\n },\n })\n\n const hasAuthorizedPublicationStatus = hasAuthorizedAllLocalesPublicationStatus({\n data: publicationData,\n fieldAccessDenied: !statusFieldAccess,\n fieldValue: statusFieldValue,\n status: allLocalesPublicationStatus,\n })\n if (\n allLocalesPublicationStatus &&\n !hasAuthorizedPublicationStatus &&\n typeof statusFieldValue === 'undefined' &&\n typeof docWithLocales._status === 'object' &&\n docWithLocales._status !== null\n ) {\n result._status = { ...docWithLocales._status }\n }\n\n let snapshotToSave: JsonObject | undefined\n\n if (config.localization && collectionConfig.versions) {\n let snapshotData: JsonObject | undefined\n let currentDoc\n\n if (hasLocalizeStatusEnabled(collectionConfig)) {\n if (hasAuthorizedPublicationStatus) {\n let accessibleLocaleCodes = config.localization.localeCodes\n\n if (config.localization.filterAvailableLocales) {\n const filteredLocales = await config.localization.filterAvailableLocales({\n locales: config.localization.locales,\n req,\n })\n accessibleLocaleCodes = filteredLocales.map((locale) =>\n typeof locale === 'string' ? locale : locale.code,\n )\n }\n\n if (typeof result._status !== 'object' || result._status === null) {\n result._status = {}\n }\n\n for (const localeCode of accessibleLocaleCodes) {\n result._status[localeCode] = unpublishAllLocales ? 'draft' : 'published'\n }\n } else if (!isSavingDraft) {\n // publishing a single locale\n currentDoc = await payload.db.findOne<DataFromCollectionSlug<TSlug>>({\n collection: collectionConfig.slug,\n req,\n where: { id: { equals: id } },\n })\n snapshotData = result\n }\n } else if (publishSpecificLocale) {\n // previous way of publishing a single locale\n currentDoc = await getLatestCollectionVersion({\n id,\n config: collectionConfig,\n payload,\n published: true,\n query: {\n collection: collectionConfig.slug,\n locale: 'all',\n req,\n where: { id: { equals: id } },\n },\n req,\n })\n snapshotData = {\n ...result,\n _status: 'draft',\n }\n }\n\n if (snapshotData) {\n snapshotToSave = deepCopyObjectSimple(snapshotData || {})\n\n result = mergeLocalizedData({\n configBlockReferences: config.blocks,\n dataWithLocales: result || {},\n docWithLocales: currentDoc || {},\n fields: collectionConfig.fields,\n selectedLocales: [locale],\n })\n }\n }\n\n const dataToUpdate: JsonObject = { ...result }\n\n // /////////////////////////////////////\n // Handle potential password update\n // /////////////////////////////////////\n\n if (shouldSavePassword && typeof password === 'string') {\n const { hash, salt } = await generatePasswordSaltHash({\n collection: collectionConfig,\n password,\n req,\n })\n dataToUpdate.salt = salt\n dataToUpdate.hash = hash\n delete dataToUpdate.password\n delete data.password\n\n if (collectionConfig.auth?.useSessions) {\n const currentSid =\n req.user?.collection === collectionConfig.slug && String(req.user.id) === String(id)\n ? req.user._sid\n : undefined\n const existingSessions = removeExpiredSessions(\n (docWithLocales.sessions as undefined | UserSession[]) ?? [],\n )\n\n dataToUpdate.sessions = currentSid\n ? existingSessions.filter((session) => session.id === currentSid)\n : []\n }\n }\n\n // /////////////////////////////////////\n // Update\n // /////////////////////////////////////\n\n if (!isSavingDraft) {\n // Ensure updatedAt date is always updated\n dataToUpdate.updatedAt = new Date().toISOString()\n result = await req.payload.db.updateOne({\n id,\n collection: collectionConfig.slug,\n data: dataToUpdate,\n locale,\n req,\n })\n }\n\n // /////////////////////////////////////\n // Create version\n // /////////////////////////////////////\n\n if (collectionConfig.versions) {\n result = await saveVersion({\n id,\n autosave,\n collection: collectionConfig,\n docWithLocales: result,\n draft: isSavingDraft,\n operation: 'update',\n payload,\n publishSpecificLocale,\n req,\n snapshot: snapshotToSave,\n unpublish: unpublishAllLocales,\n })\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth,\n doc: result,\n draft: draftArg,\n fallbackLocale,\n global: null,\n locale,\n overrideAccess,\n populate,\n req,\n select,\n showHiddenFields,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterRead?.length) {\n for (const hook of collectionConfig.hooks.afterRead) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n overrideAccess,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterChange - Fields\n // /////////////////////////////////////\n\n result = await afterChange({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: result,\n global: null,\n operation: 'update',\n previousDoc: originalDoc,\n req,\n })\n\n // /////////////////////////////////////\n // afterChange - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterChange?.length) {\n for (const hook of collectionConfig.hooks.afterChange) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: result,\n operation: 'update',\n overrideAccess,\n previousDoc: originalDoc,\n req,\n })) || result\n }\n }\n\n return result as TransformCollectionWithSelect<TSlug, TSelect>\n}\n"],"names":["ensureUsernameOrEmail","removeExpiredSessions","generatePasswordSaltHash","afterChange","afterRead","beforeChange","beforeValidate","deepCopyObjectSimple","getLatestCollectionVersion","saveVersion","deleteAssociatedFiles","uploadFiles","checkDocumentLockStatus","getTopLevelFieldNames","hasDraftsEnabled","hasDraftValidationEnabled","hasLocalizeStatusEnabled","mergeLocalizedData","buildAllLocalesPublicationHookDoc","getAllLocalesPublicationStatus","hasAuthorizedAllLocalesPublicationStatus","validateAllLocalesPublicationFlags","updateDocument","id","autosave","collectionConfig","config","data","depth","docWithLocales","draftArg","fallbackLocale","filesToUpload","locale","overrideAccess","overrideLock","payload","populate","publishAllLocales","publishAllLocalesArg","publishSpecificLocale","req","select","showHiddenFields","unpublishAllLocales","unpublishAllLocalesArg","allLocalesPublicationStatus","hasLocalizedStatus","Boolean","localization","isSavingDraft","_status","collectionSlug","slug","lockErrorMessage","originalDoc","collection","context","doc","draft","global","isRestoringDraftFromTrash","deletedAt","shouldLimitValidationToSubmittedFields","trash","submittedTopLevelFieldNames","undefined","auth","authOptions","operation","isDraftOverPublished","files","overrideDelete","statusFieldAccess","publicationFieldPolicyDoc","status","docForHooks","onFieldAccess","accessResult","path","password","shouldSavePassword","disableLocalStrategy","enableFields","publicationStatusIsAuthorized","publicationHookDoc","hooks","length","hook","upload","disableLocalStorage","publicationData","beforeChangeArgs","fieldsToValidate","skipValidation","statusFieldValue","result","onDataProcessed","processedData","hasAuthorizedPublicationStatus","fieldAccessDenied","fieldValue","snapshotToSave","versions","snapshotData","currentDoc","accessibleLocaleCodes","localeCodes","filterAvailableLocales","filteredLocales","locales","map","code","localeCode","db","findOne","where","equals","published","query","configBlockReferences","blocks","dataWithLocales","fields","selectedLocales","dataToUpdate","hash","salt","useSessions","currentSid","user","String","_sid","existingSessions","sessions","filter","session","updatedAt","Date","toISOString","updateOne","snapshot","unpublish","previousDoc"],"mappings":"AAyBA,SAASA,qBAAqB,QAAQ,yCAAwC;AAC9E,SAASC,qBAAqB,QAAQ,4BAA2B;AACjE,SAASC,wBAAwB,QAAQ,6DAA4D;AACrG,SAASC,WAAW,QAAQ,6CAA4C;AACxE,SAASC,SAAS,QAAQ,2CAA0C;AACpE,SAASC,YAAY,QAAQ,8CAA6C;AAC1E,SAASC,cAAc,QAAQ,gDAA+C;AAC9E,SAASC,oBAAoB,EAAEC,0BAA0B,EAAEC,WAAW,QAAQ,oBAAmB;AACjG,SAASC,qBAAqB,QAAQ,4CAA2C;AACjF,SAASC,WAAW,QAAQ,kCAAiC;AAC7D,SAASC,uBAAuB,QAAQ,gDAA+C;AACvF,SAASC,qBAAqB,QAAQ,8CAA6C;AACnF,SACEC,gBAAgB,EAChBC,yBAAyB,EACzBC,wBAAwB,QACnB,0CAAyC;AAChD,SAASC,kBAAkB,QAAQ,2CAA0C;AAC7E,SACEC,iCAAiC,EACjCC,8BAA8B,EAC9BC,wCAAwC,EACxCC,kCAAkC,QAC7B,mDAAkD;AAyBzD;;;;;;;;;;;;CAYC,GACD,OAAO,MAAMC,iBAAiB,OAG5B,EACAC,EAAE,EACFC,QAAQ,EACRC,gBAAgB,EAChBC,MAAM,EACNC,IAAI,EACJC,KAAK,EACLC,cAAc,EACdC,QAAQ,EACRC,cAAc,EACdC,aAAa,EACbC,MAAM,EACNC,cAAc,EACdC,YAAY,EACZC,OAAO,EACPC,QAAQ,EACRC,mBAAmBC,oBAAoB,EACvCC,qBAAqB,EACrBC,GAAG,EACHC,MAAM,EACNC,gBAAgB,EAChBC,qBAAqBC,sBAAsB,EACX;IAChCxB,mCAAmC;QACjCiB,mBAAmBC;QACnBK,qBAAqBC;IACvB;IAEA,MAAMP,oBACJ,CAACR,YAAaS,CAAAA,wBAAwB,CAACvB,yBAAyBS,iBAAgB;IAClF,MAAMmB,sBACJ,OAAOC,2BAA2B,WAC9BA,2BAA2B,SAC3B,CAAC,CAACA;IACR,MAAMC,8BAA8B3B,+BAA+B;QACjE4B,oBAAoBC,QAAQtB,OAAOuB,YAAY,IAAIjC,yBAAyBS;QAC5Ea;QACAM;IACF;IACA,MAAMM,gBACJF,QAAQlB,YAAYhB,iBAAiBW,sBACrCE,KAAKwB,OAAO,KAAK,eACjB,CAACb;IACH,IAAIQ,+BAA+BI,eAAe;QAChDvB,KAAKwB,OAAO,GAAGL,+BAA+B;IAChD;IAEA,wCAAwC;IACxC,sCAAsC;IACtC,wCAAwC;IAExC,MAAMlC,wBAAwB;QAC5BW;QACA6B,gBAAgB3B,iBAAiB4B,IAAI;QACrCC,kBAAkB,CAAC,iBAAiB,EAAE/B,GAAG,2DAA2D,CAAC;QACrGY;QACAM;IACF;IAEA,MAAMc,cAAc,MAAMnD,UAAU;QAClCoD,YAAY/B;QACZgC,SAAShB,IAAIgB,OAAO;QACpB7B,OAAO;QACP8B,KAAKnD,qBAAqBsB;QAC1B8B,OAAO7B;QACPC,gBAAgBR,KAAK,OAAOQ;QAC5B6B,QAAQ;QACR3B;QACAC,gBAAgB;QAChBO;QACAE,kBAAkB;IACpB;IAEA,MAAMkB,4BAA4Bb,QAAQO,aAAaO,cAAcnC,MAAMwB,YAAY;IACvF,MAAMY,yCACJ,AAACtC,iBAAiBuC,KAAK,IAAKhB,CAAAA,QAAQrB,MAAMmC,cAAcD,yBAAwB,KAChFjB;IACF,MAAMqB,8BAA8BF,yCAChClD,sBAAsBc,QACtBuC;IAEJ,IAAIzC,iBAAiB0C,IAAI,EAAE;QACzBnE,sBAA6B;YAC3BoE,aAAa3C,iBAAiB0C,IAAI;YAClCf,gBAAgB3B,iBAAiB4B,IAAI;YACrC1B;YACA0C,WAAW;YACXd;YACAd;QACF;IACF;IAEA,wCAAwC;IACxC,8BAA8B;IAC9B,wCAAwC;IAExC,gFAAgF;IAChF,sFAAsF;IACtF,oFAAoF;IACpF,sFAAsF;IACtF,0EAA0E;IAC1E,MAAM6B,uBAAuBpB,iBAAiBrB,eAAesB,OAAO,KAAK;IAEzE,IAAI,CAACmB,sBAAsB;QACzB,MAAM5D,sBAAsB;YAC1Be;YACAC;YACAgC,KAAK7B;YACL0C,OAAOvC;YACPwC,gBAAgB;YAChB/B;QACF;IACF;IAEA,wCAAwC;IACxC,0BAA0B;IAC1B,wCAAwC;IAExC,IAAIgC,oBAAoB;IACxB,MAAMC,4BAA4BxD,kCAAkC;QAClEwC,KAAKH;QACL1B;QACA8C,QAAQ7B;IACV;IAEAnB,OAAO,MAAMrB,eAA2D;QACtEiB;QACAiC,YAAY/B;QACZgC,SAAShB,IAAIgB,OAAO;QACpB9B;QACA+B,KAAKH;QACLqB,aAAaF;QACbd,QAAQ;QACRiB,eAAe,CAAC,EAAEC,YAAY,EAAEC,IAAI,EAAE;YACpC,IAAIA,SAAS,WAAW;gBACtBN,oBAAoBK;YACtB;QACF;QACAT,WAAW;QACXnC;QACAO;IACF;IAEA,MAAMuC,WAAWrD,MAAMqD;IACvB,MAAMC,qBAAqBjC,QACzBgC,YACEvD,iBAAiB0C,IAAI,IACpB,CAAA,CAAC1C,iBAAiB0C,IAAI,CAACe,oBAAoB,IACzC,OAAOzD,iBAAiB0C,IAAI,CAACe,oBAAoB,KAAK,YACrDzD,iBAAiB0C,IAAI,CAACe,oBAAoB,CAACC,YAAY,KAC3D,CAACjC;IAGL,MAAMkC,gCACJX,qBAAqB9C,KAAKwB,OAAO,KAAKL;IAExC,MAAMuC,qBAAqBnE,kCAAkC;QAC3DwC,KAAKH;QACL1B;QACA8C,QAAQS,gCAAgCtC,8BAA8BoB;IACxE;IAEA,wCAAwC;IACxC,8BAA8B;IAC9B,wCAAwC;IAExC,IAAIzC,iBAAiB6D,KAAK,EAAEhF,gBAAgBiF,QAAQ;QAClD,KAAK,MAAMC,QAAQ/D,iBAAiB6D,KAAK,CAAChF,cAAc,CAAE;YACxDqB,OACE,AAAC,MAAM6D,KAAK;gBACVhC,YAAY/B;gBACZgC,SAAShB,IAAIgB,OAAO;gBACpB9B;gBACA0C,WAAW;gBACXd,aAAa8B;gBACb5C;YACF,MAAOd;QACX;IACF;IAEA,wCAAwC;IACxC,+BAA+B;IAC/B,wCAAwC;IAExC,IAAI,CAACF,iBAAiBgE,MAAM,CAACC,mBAAmB,EAAE;QAChD,MAAM/E,YAAYyB,SAASJ,eAAeS;IAC5C;IAEA,wCAAwC;IACxC,4BAA4B;IAC5B,wCAAwC;IAExC,IAAIhB,iBAAiB6D,KAAK,EAAEjF,cAAckF,QAAQ;QAChD,KAAK,MAAMC,QAAQ/D,iBAAiB6D,KAAK,CAACjF,YAAY,CAAE;YACtDsB,OACE,AAAC,MAAM6D,KAAK;gBACVhC,YAAY/B;gBACZgC,SAAShB,IAAIgB,OAAO;gBACpB9B;gBACA0C,WAAW;gBACXd,aAAa8B;gBACb5C;YACF,MAAOd;QACX;IACF;IAEA,MAAMgE,kBAAkB;QAAE,GAAGhE,IAAI;IAAC;IAElC,wCAAwC;IACxC,wBAAwB;IACxB,wCAAwC;IAExC,MAAMiE,mBAAwD;QAC5DrE;QACAiC,YAAY/B;QACZgC,SAAShB,IAAIgB,OAAO;QACpB9B,MAAM;YAAE,GAAGA,IAAI;YAAEJ;QAAG;QACpBmC,KAAK2B;QACLxD;QACAgE,kBAAkB5B;QAClBL,QAAQ;QACRS,WAAW;QACXnC;QACAO;QACA,iEAAiE;QACjEqD,gBAAgB5C,iBAAiB,CAACnC,0BAA0BU;IAC9D;IAEA,wCAAwC;IACxC,gCAAgC;IAChC,wCAAwC;IAExC,IAAIsE;IAEJ,IAAIC,SAAqB,MAAM3F,aAAa;QAC1C,GAAGuF,gBAAgB;QACnBK,iBAAiB,CAACC;YAChBH,mBAAmBG,cAAc/C,OAAO;QAC1C;IACF;IAEA,MAAMgD,iCAAiC/E,yCAAyC;QAC9EO,MAAMgE;QACNS,mBAAmB,CAAC3B;QACpB4B,YAAYN;QACZpB,QAAQ7B;IACV;IACA,IACEA,+BACA,CAACqD,kCACD,OAAOJ,qBAAqB,eAC5B,OAAOlE,eAAesB,OAAO,KAAK,YAClCtB,eAAesB,OAAO,KAAK,MAC3B;QACA6C,OAAO7C,OAAO,GAAG;YAAE,GAAGtB,eAAesB,OAAO;QAAC;IAC/C;IAEA,IAAImD;IAEJ,IAAI5E,OAAOuB,YAAY,IAAIxB,iBAAiB8E,QAAQ,EAAE;QACpD,IAAIC;QACJ,IAAIC;QAEJ,IAAIzF,yBAAyBS,mBAAmB;YAC9C,IAAI0E,gCAAgC;gBAClC,IAAIO,wBAAwBhF,OAAOuB,YAAY,CAAC0D,WAAW;gBAE3D,IAAIjF,OAAOuB,YAAY,CAAC2D,sBAAsB,EAAE;oBAC9C,MAAMC,kBAAkB,MAAMnF,OAAOuB,YAAY,CAAC2D,sBAAsB,CAAC;wBACvEE,SAASpF,OAAOuB,YAAY,CAAC6D,OAAO;wBACpCrE;oBACF;oBACAiE,wBAAwBG,gBAAgBE,GAAG,CAAC,CAAC9E,SAC3C,OAAOA,WAAW,WAAWA,SAASA,OAAO+E,IAAI;gBAErD;gBAEA,IAAI,OAAOhB,OAAO7C,OAAO,KAAK,YAAY6C,OAAO7C,OAAO,KAAK,MAAM;oBACjE6C,OAAO7C,OAAO,GAAG,CAAC;gBACpB;gBAEA,KAAK,MAAM8D,cAAcP,sBAAuB;oBAC9CV,OAAO7C,OAAO,CAAC8D,WAAW,GAAGrE,sBAAsB,UAAU;gBAC/D;YACF,OAAO,IAAI,CAACM,eAAe;gBACzB,6BAA6B;gBAC7BuD,aAAa,MAAMrE,QAAQ8E,EAAE,CAACC,OAAO,CAAgC;oBACnE3D,YAAY/B,iBAAiB4B,IAAI;oBACjCZ;oBACA2E,OAAO;wBAAE7F,IAAI;4BAAE8F,QAAQ9F;wBAAG;oBAAE;gBAC9B;gBACAiF,eAAeR;YACjB;QACF,OAAO,IAAIxD,uBAAuB;YAChC,6CAA6C;YAC7CiE,aAAa,MAAMjG,2BAA2B;gBAC5Ce;gBACAG,QAAQD;gBACRW;gBACAkF,WAAW;gBACXC,OAAO;oBACL/D,YAAY/B,iBAAiB4B,IAAI;oBACjCpB,QAAQ;oBACRQ;oBACA2E,OAAO;wBAAE7F,IAAI;4BAAE8F,QAAQ9F;wBAAG;oBAAE;gBAC9B;gBACAkB;YACF;YACA+D,eAAe;gBACb,GAAGR,MAAM;gBACT7C,SAAS;YACX;QACF;QAEA,IAAIqD,cAAc;YAChBF,iBAAiB/F,qBAAqBiG,gBAAgB,CAAC;YAEvDR,SAAS/E,mBAAmB;gBAC1BuG,uBAAuB9F,OAAO+F,MAAM;gBACpCC,iBAAiB1B,UAAU,CAAC;gBAC5BnE,gBAAgB4E,cAAc,CAAC;gBAC/BkB,QAAQlG,iBAAiBkG,MAAM;gBAC/BC,iBAAiB;oBAAC3F;iBAAO;YAC3B;QACF;IACF;IAEA,MAAM4F,eAA2B;QAAE,GAAG7B,MAAM;IAAC;IAE7C,wCAAwC;IACxC,mCAAmC;IACnC,wCAAwC;IAExC,IAAIf,sBAAsB,OAAOD,aAAa,UAAU;QACtD,MAAM,EAAE8C,IAAI,EAAEC,IAAI,EAAE,GAAG,MAAM7H,yBAAyB;YACpDsD,YAAY/B;YACZuD;YACAvC;QACF;QACAoF,aAAaE,IAAI,GAAGA;QACpBF,aAAaC,IAAI,GAAGA;QACpB,OAAOD,aAAa7C,QAAQ;QAC5B,OAAOrD,KAAKqD,QAAQ;QAEpB,IAAIvD,iBAAiB0C,IAAI,EAAE6D,aAAa;YACtC,MAAMC,aACJxF,IAAIyF,IAAI,EAAE1E,eAAe/B,iBAAiB4B,IAAI,IAAI8E,OAAO1F,IAAIyF,IAAI,CAAC3G,EAAE,MAAM4G,OAAO5G,MAC7EkB,IAAIyF,IAAI,CAACE,IAAI,GACblE;YACN,MAAMmE,mBAAmBpI,sBACvB,AAAC4B,eAAeyG,QAAQ,IAAkC,EAAE;YAG9DT,aAAaS,QAAQ,GAAGL,aACpBI,iBAAiBE,MAAM,CAAC,CAACC,UAAYA,QAAQjH,EAAE,KAAK0G,cACpD,EAAE;QACR;IACF;IAEA,wCAAwC;IACxC,SAAS;IACT,wCAAwC;IAExC,IAAI,CAAC/E,eAAe;QAClB,0CAA0C;QAC1C2E,aAAaY,SAAS,GAAG,IAAIC,OAAOC,WAAW;QAC/C3C,SAAS,MAAMvD,IAAIL,OAAO,CAAC8E,EAAE,CAAC0B,SAAS,CAAC;YACtCrH;YACAiC,YAAY/B,iBAAiB4B,IAAI;YACjC1B,MAAMkG;YACN5F;YACAQ;QACF;IACF;IAEA,wCAAwC;IACxC,iBAAiB;IACjB,wCAAwC;IAExC,IAAIhB,iBAAiB8E,QAAQ,EAAE;QAC7BP,SAAS,MAAMvF,YAAY;YACzBc;YACAC;YACAgC,YAAY/B;YACZI,gBAAgBmE;YAChBrC,OAAOT;YACPmB,WAAW;YACXjC;YACAI;YACAC;YACAoG,UAAUvC;YACVwC,WAAWlG;QACb;IACF;IAEA,wCAAwC;IACxC,qBAAqB;IACrB,wCAAwC;IAExCoD,SAAS,MAAM5F,UAAU;QACvBoD,YAAY/B;QACZgC,SAAShB,IAAIgB,OAAO;QACpB7B;QACA8B,KAAKsC;QACLrC,OAAO7B;QACPC;QACA6B,QAAQ;QACR3B;QACAC;QACAG;QACAI;QACAC;QACAC;IACF;IAEA,wCAAwC;IACxC,yBAAyB;IACzB,wCAAwC;IAExC,IAAIlB,iBAAiB6D,KAAK,EAAElF,WAAWmF,QAAQ;QAC7C,KAAK,MAAMC,QAAQ/D,iBAAiB6D,KAAK,CAAClF,SAAS,CAAE;YACnD4F,SACE,AAAC,MAAMR,KAAK;gBACVhC,YAAY/B;gBACZgC,SAAShB,IAAIgB,OAAO;gBACpBC,KAAKsC;gBACL9D;gBACAO;YACF,MAAOuD;QACX;IACF;IAEA,wCAAwC;IACxC,uBAAuB;IACvB,wCAAwC;IAExCA,SAAS,MAAM7F,YAAY;QACzBqD,YAAY/B;QACZgC,SAAShB,IAAIgB,OAAO;QACpB9B;QACA+B,KAAKsC;QACLpC,QAAQ;QACRS,WAAW;QACX0E,aAAaxF;QACbd;IACF;IAEA,wCAAwC;IACxC,2BAA2B;IAC3B,wCAAwC;IAExC,IAAIhB,iBAAiB6D,KAAK,EAAEnF,aAAaoF,QAAQ;QAC/C,KAAK,MAAMC,QAAQ/D,iBAAiB6D,KAAK,CAACnF,WAAW,CAAE;YACrD6F,SACE,AAAC,MAAMR,KAAK;gBACVhC,YAAY/B;gBACZgC,SAAShB,IAAIgB,OAAO;gBACpB9B;gBACA+B,KAAKsC;gBACL3B,WAAW;gBACXnC;gBACA6G,aAAaxF;gBACbd;YACF,MAAOuD;QACX;IACF;IAEA,OAAOA;AACT,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/orderable/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAoB,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AAC3F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD,OAAO,KAAK,EAA4B,eAAe,EAAE,MAAM,aAAa,CAAA;AAgB5E,eAAO,MAAM,yBAAyB,eACxB,gBAAgB,UACpB,MAAM,uBACO,MAAM,EAAE,+BACA,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,kBA2F9D,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,YAAY,EAAE,SAAS,GAAG,MAAM,CAAA;IAChC,kBAAkB,EAAE,MAAM,CAAA;IAC1B,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAA;QACV,GAAG,EAAE,MAAM,CAAA;KACZ,CAAA;CACF,CAAA;AAED,eAAO,MAAM,oBAAoB,WACvB,eAAe,8BACK,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,SAiN7D,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/orderable/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAoB,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AAC3F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD,OAAO,KAAK,EAA4B,eAAe,EAAE,MAAM,aAAa,CAAA;AAkB5E,eAAO,MAAM,yBAAyB,eACxB,gBAAgB,UACpB,MAAM,uBACO,MAAM,EAAE,+BACA,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,kBA2F9D,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,YAAY,EAAE,SAAS,GAAG,MAAM,CAAA;IAChC,kBAAkB,EAAE,MAAM,CAAA;IAC1B,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAA;QACV,GAAG,EAAE,MAAM,CAAA;KACZ,CAAA;CACF,CAAA;AAED,eAAO,MAAM,oBAAoB,WACvB,eAAe,8BACK,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,SAiQ7D,CAAA"}
@@ -1,6 +1,8 @@
1
1
  import { status as httpStatus } from 'http-status';
2
2
  import { executeAccess } from '../../auth/executeAccess.js';
3
- import { APIError } from '../../errors/index.js';
3
+ import { hasWhereAccessResult } from '../../auth/types.js';
4
+ import { combineQueries } from '../../database/combineQueries.js';
5
+ import { APIError, Forbidden } from '../../errors/index.js';
4
6
  import { sanitizeField } from '../../fields/config/sanitize.js';
5
7
  import { combineWhereConstraints } from '../../utilities/combineWhereConstraints.js';
6
8
  import { commitTransaction } from '../../utilities/commitTransaction.js';
@@ -143,6 +145,49 @@ export const addOrderableEndpoint = (config, joinFieldPathsByCollection)=>{
143
145
  status: 400
144
146
  });
145
147
  }
148
+ const isConfiguredOrderableField = collection.orderable && orderableFieldName === '_order' || joinFieldPathsByCollection.get(collection.slug)?.has(orderableFieldName);
149
+ if (!isConfiguredOrderableField) {
150
+ return new Response(JSON.stringify({
151
+ error: `${orderableFieldName} is not configured for ordering`
152
+ }), {
153
+ headers: {
154
+ 'Content-Type': 'application/json'
155
+ },
156
+ status: 400
157
+ });
158
+ }
159
+ const assertUpdateAccess = async (updates)=>{
160
+ if (!collection.access?.update) {
161
+ return;
162
+ }
163
+ for (const { id, data } of updates){
164
+ const accessResult = await executeAccess({
165
+ id,
166
+ data,
167
+ req
168
+ }, collection.access.update);
169
+ if (hasWhereAccessResult(accessResult)) {
170
+ const accessibleDoc = await getLatestCollectionVersion({
171
+ id,
172
+ config: collection,
173
+ payload: req.payload,
174
+ query: {
175
+ collection: collection.slug,
176
+ req,
177
+ where: combineQueries({
178
+ id: {
179
+ equals: id
180
+ }
181
+ }, accessResult)
182
+ },
183
+ req
184
+ });
185
+ if (!accessibleDoc) {
186
+ throw new Forbidden(req.t);
187
+ }
188
+ }
189
+ }
190
+ };
146
191
  const { joinScopeWhere, targetDoc } = await getJoinScopeContext({
147
192
  collectionSlug: collection.slug,
148
193
  joinFieldPathsByCollection,
@@ -150,16 +195,6 @@ export const addOrderableEndpoint = (config, joinFieldPathsByCollection)=>{
150
195
  req,
151
196
  target
152
197
  });
153
- // Prevent reordering if user doesn't have editing permissions
154
- if (collection.access?.update) {
155
- await executeAccess({
156
- // Currently only one doc can be moved at a time. We should review this if we want to allow
157
- // multiple docs to be moved at once in the future.
158
- id: docsToMove[0],
159
- data: {},
160
- req
161
- }, collection.access.update);
162
- }
163
198
  /**
164
199
  * If there is no target.key, we can assume the user enabled `orderable`
165
200
  * on a collection with existing documents, and that this is the first
@@ -186,7 +221,14 @@ export const addOrderableEndpoint = (config, joinFieldPathsByCollection)=>{
186
221
  joinScopeWhere ?? undefined
187
222
  ])
188
223
  });
189
- await initTransaction(req);
224
+ const shouldCommit = await initTransaction(req);
225
+ const hasTransaction = Boolean(await req.transactionID);
226
+ if (!hasTransaction) {
227
+ await assertUpdateAccess(docs.map(({ id })=>({
228
+ id,
229
+ data: {}
230
+ })));
231
+ }
190
232
  // We cannot update all documents in a single operation with `payload.update`,
191
233
  // because they would all end up with the same order key (`a0`).
192
234
  try {
@@ -197,12 +239,18 @@ export const addOrderableEndpoint = (config, joinFieldPathsByCollection)=>{
197
239
  data: {
198
240
  },
199
241
  depth: 0,
242
+ overrideAccess: false,
200
243
  req
201
244
  });
245
+ }
246
+ if (shouldCommit || !hasTransaction) {
202
247
  await commitTransaction(req);
203
248
  }
204
249
  } catch (e) {
205
250
  await killTransaction(req);
251
+ if (e instanceof APIError) {
252
+ throw e;
253
+ }
206
254
  if (e instanceof Error) {
207
255
  throw new APIError(e.message, httpStatus.INTERNAL_SERVER_ERROR);
208
256
  }
@@ -258,9 +306,13 @@ export const addOrderableEndpoint = (config, joinFieldPathsByCollection)=>{
258
306
  ])
259
307
  });
260
308
  const adjacentDocKey = adjacentDoc.docs?.[0]?.[orderableFieldName] || null;
261
- // Currently N (= docsToMove.length) is always 1. Maybe in the future we will
262
- // allow dragging and reordering multiple documents at once via the UI.
263
309
  const orderValues = newKeyWillBe === 'greater' ? generateNKeysBetween(targetKey, adjacentDocKey, docsToMove.length) : generateNKeysBetween(adjacentDocKey, targetKey, docsToMove.length);
310
+ await assertUpdateAccess(docsToMove.map((id, index)=>({
311
+ id,
312
+ data: {
313
+ [orderableFieldName]: orderValues[index]
314
+ }
315
+ })));
264
316
  const draftsEnabled = hasDraftsEnabled(collection);
265
317
  // Update each document with its new order value
266
318
  for (const [index, id] of docsToMove.entries()){
@@ -291,6 +343,7 @@ export const addOrderableEndpoint = (config, joinFieldPathsByCollection)=>{
291
343
  },
292
344
  depth: 0,
293
345
  draft,
346
+ overrideAccess: false,
294
347
  req
295
348
  });
296
349
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/config/orderable/index.ts"],"sourcesContent":["import { status as httpStatus } from 'http-status'\n\nimport type { BeforeChangeHook, CollectionConfig } from '../../collections/config/types.js'\nimport type { Config } from '../../config/types.js'\nimport type { Field, TextField } from '../../fields/config/types.js'\nimport type { Endpoint, PayloadHandler, SanitizedConfig } from '../types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { APIError } from '../../errors/index.js'\nimport { sanitizeField } from '../../fields/config/sanitize.js'\nimport { combineWhereConstraints } from '../../utilities/combineWhereConstraints.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { hasDraftsEnabled } from '../../utilities/getVersionsConfig.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { getLatestCollectionVersion } from '../../versions/getLatestCollectionVersion.js'\nimport { generateKeyBetween, generateNKeysBetween } from './fractional-indexing.js'\nimport { getJoinScopeContext } from './utils/getJoinScopeContext.js'\nimport { getJoinScopeWhereFromDocData } from './utils/getJoinScopeWhereFromDocData.js'\nimport { resolvePendingTargetKey } from './utils/resolvePendingTargetKey.js'\n\nexport const addOrderableFieldsAndHook = async (\n collection: CollectionConfig,\n config: Config,\n orderableFieldNames: string[],\n joinFieldPathsByCollection?: Map<string, Map<string, string>>,\n) => {\n // 1. Add fields\n for (const orderableFieldName of orderableFieldNames) {\n const orderField: TextField = {\n name: orderableFieldName,\n type: 'text',\n admin: {\n disableBulkEdit: true,\n disabled: true,\n disableGroupBy: true,\n disableListColumn: true,\n disableListFilter: true,\n hidden: true,\n readOnly: true,\n },\n hooks: {\n beforeDuplicate: [\n ({ siblingData }) => {\n delete siblingData[orderableFieldName]\n },\n ],\n },\n index: true,\n }\n\n // Sanitize the field using the standard sanitization logic\n await sanitizeField({\n collectionConfig: collection,\n config,\n existingFieldNames: new Set(),\n field: orderField,\n index: 0,\n isTopLevelField: true,\n joinPath: '',\n parentIndexPath: '',\n parentIsLocalized: false,\n parentSchemaPath: '',\n requireFieldLevelRichTextEditor: false,\n validRelationships: null,\n })\n\n collection.fields.unshift(orderField)\n }\n\n // 2. Add hook\n if (!collection.hooks) {\n collection.hooks = {}\n }\n if (!collection.hooks.beforeChange) {\n collection.hooks.beforeChange = []\n }\n\n const orderBeforeChangeHook: BeforeChangeHook = async ({ data, originalDoc, req }) => {\n for (const orderableFieldName of orderableFieldNames) {\n if (!data[orderableFieldName] && !originalDoc?.[orderableFieldName]) {\n const joinScopeWhere = getJoinScopeWhereFromDocData({\n collectionSlug: collection.slug,\n data,\n joinFieldPathsByCollection,\n orderableFieldName,\n originalDoc,\n })\n\n const lastDoc = await req.payload.find({\n collection: collection.slug,\n depth: 0,\n limit: 1,\n pagination: false,\n req,\n select: { [orderableFieldName]: true },\n sort: `-${orderableFieldName}`,\n where: combineWhereConstraints([\n {\n [orderableFieldName]: {\n exists: true,\n },\n },\n joinScopeWhere ?? undefined,\n ]),\n })\n\n const lastOrderValue = lastDoc.docs[0]?.[orderableFieldName] || null\n data[orderableFieldName] = generateKeyBetween(lastOrderValue, null)\n }\n }\n\n return data\n }\n\n collection.hooks.beforeChange.push(orderBeforeChangeHook)\n}\n\n/**\n * The body of the reorder endpoint.\n * @internal\n */\nexport type OrderableEndpointBody = {\n collectionSlug: string\n docsToMove: string[]\n newKeyWillBe: 'greater' | 'less'\n orderableFieldName: string\n target: {\n id: string\n key: string\n }\n}\n\nexport const addOrderableEndpoint = (\n config: SanitizedConfig,\n joinFieldPathsByCollection: Map<string, Map<string, string>>,\n) => {\n // 3. Add endpoint\n const reorderHandler: PayloadHandler = async (req) => {\n const body = (await req.json?.()) as OrderableEndpointBody\n\n const { collectionSlug, docsToMove, newKeyWillBe, orderableFieldName, target } = body\n\n if (!Array.isArray(docsToMove) || docsToMove.length === 0) {\n return new Response(JSON.stringify({ error: 'docsToMove must be a non-empty array' }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n if (newKeyWillBe !== 'greater' && newKeyWillBe !== 'less') {\n return new Response(JSON.stringify({ error: 'newKeyWillBe must be \"greater\" or \"less\"' }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n const collection = config.collections.find((c) => c.slug === collectionSlug)\n if (!collection) {\n return new Response(JSON.stringify({ error: `Collection ${collectionSlug} not found` }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n if (typeof orderableFieldName !== 'string') {\n return new Response(JSON.stringify({ error: 'orderableFieldName must be a string' }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n\n const { joinScopeWhere, targetDoc } = await getJoinScopeContext({\n collectionSlug: collection.slug,\n joinFieldPathsByCollection,\n orderableFieldName,\n req,\n target,\n })\n\n // Prevent reordering if user doesn't have editing permissions\n if (collection.access?.update) {\n await executeAccess(\n {\n // Currently only one doc can be moved at a time. We should review this if we want to allow\n // multiple docs to be moved at once in the future.\n id: docsToMove[0],\n data: {},\n req,\n },\n collection.access.update,\n )\n }\n /**\n * If there is no target.key, we can assume the user enabled `orderable`\n * on a collection with existing documents, and that this is the first\n * time they tried to reorder them. Therefore, we perform a one-time\n * migration by setting the key value for all documents. We do this\n * instead of enforcing `required` and `unique` at the database schema\n * level, so that users don't have to run a migration when they enable\n * `orderable` on a collection with existing documents.\n */\n if (!target.key) {\n const { docs } = await req.payload.find({\n collection: collection.slug,\n depth: 0,\n limit: 0,\n req,\n select: { [orderableFieldName]: true },\n where: combineWhereConstraints([\n {\n [orderableFieldName]: {\n exists: false,\n },\n },\n joinScopeWhere ?? undefined,\n ]),\n })\n await initTransaction(req)\n // We cannot update all documents in a single operation with `payload.update`,\n // because they would all end up with the same order key (`a0`).\n try {\n for (const doc of docs) {\n await req.payload.update({\n id: doc.id,\n collection: collection.slug,\n data: {\n // no data needed since the order hooks will handle this\n },\n depth: 0,\n req,\n })\n await commitTransaction(req)\n }\n } catch (e) {\n await killTransaction(req)\n if (e instanceof Error) {\n throw new APIError(e.message, httpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n return new Response(JSON.stringify({ message: 'initial migration', success: true }), {\n headers: { 'Content-Type': 'application/json' },\n status: 200,\n })\n }\n\n if (\n typeof target !== 'object' ||\n typeof target.id === 'undefined' ||\n typeof target.key !== 'string'\n ) {\n return new Response(JSON.stringify({ error: 'target must be an object with id' }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n\n const targetId = target.id\n const targetKey = await resolvePendingTargetKey({\n collectionSlug: collection.slug,\n orderableFieldName,\n req,\n targetDoc,\n targetID: targetId,\n targetKey: target.key,\n })\n\n // The reason the endpoint does not receive this docId as an argument is that there\n // are situations where the user may not see or know what the next or previous one is. For\n // example, access control restrictions, if docBefore is the last one on the page, etc.\n const adjacentDoc = await req.payload.find({\n collection: collection.slug,\n depth: 0,\n limit: 1,\n pagination: false,\n select: { [orderableFieldName]: true },\n sort: newKeyWillBe === 'greater' ? orderableFieldName : `-${orderableFieldName}`,\n where: combineWhereConstraints([\n {\n [orderableFieldName]: {\n [newKeyWillBe === 'greater' ? 'greater_than' : 'less_than']: targetKey,\n },\n },\n joinScopeWhere ?? undefined,\n ]),\n })\n const adjacentDocKey = adjacentDoc.docs?.[0]?.[orderableFieldName] || null\n\n // Currently N (= docsToMove.length) is always 1. Maybe in the future we will\n // allow dragging and reordering multiple documents at once via the UI.\n const orderValues =\n newKeyWillBe === 'greater'\n ? generateNKeysBetween(targetKey, adjacentDocKey, docsToMove.length)\n : generateNKeysBetween(adjacentDocKey, targetKey, docsToMove.length)\n\n const draftsEnabled = hasDraftsEnabled(collection)\n\n // Update each document with its new order value\n for (const [index, id] of docsToMove.entries()) {\n let draft: boolean | undefined\n\n if (draftsEnabled) {\n const latestVersion = await getLatestCollectionVersion({\n id,\n config: collection,\n payload: req.payload,\n query: {\n collection: collection.slug,\n req,\n where: { id: { equals: id } },\n },\n req,\n })\n\n draft = latestVersion?._status === 'draft'\n }\n\n await req.payload.update({\n id,\n collection: collection.slug,\n data: {\n [orderableFieldName]: orderValues[index],\n },\n depth: 0,\n draft,\n req,\n })\n }\n\n return new Response(JSON.stringify({ orderValues, success: true }), {\n headers: { 'Content-Type': 'application/json' },\n status: 200,\n })\n }\n\n const reorderEndpoint: Endpoint = {\n handler: reorderHandler,\n method: 'post',\n path: '/reorder',\n }\n\n if (!config.endpoints) {\n config.endpoints = []\n }\n\n config.endpoints.push(reorderEndpoint)\n}\n"],"names":["status","httpStatus","executeAccess","APIError","sanitizeField","combineWhereConstraints","commitTransaction","hasDraftsEnabled","initTransaction","killTransaction","getLatestCollectionVersion","generateKeyBetween","generateNKeysBetween","getJoinScopeContext","getJoinScopeWhereFromDocData","resolvePendingTargetKey","addOrderableFieldsAndHook","collection","config","orderableFieldNames","joinFieldPathsByCollection","orderableFieldName","orderField","name","type","admin","disableBulkEdit","disabled","disableGroupBy","disableListColumn","disableListFilter","hidden","readOnly","hooks","beforeDuplicate","siblingData","index","collectionConfig","existingFieldNames","Set","field","isTopLevelField","joinPath","parentIndexPath","parentIsLocalized","parentSchemaPath","requireFieldLevelRichTextEditor","validRelationships","fields","unshift","beforeChange","orderBeforeChangeHook","data","originalDoc","req","joinScopeWhere","collectionSlug","slug","lastDoc","payload","find","depth","limit","pagination","select","sort","where","exists","undefined","lastOrderValue","docs","push","addOrderableEndpoint","reorderHandler","body","json","docsToMove","newKeyWillBe","target","Array","isArray","length","Response","JSON","stringify","error","headers","collections","c","targetDoc","access","update","id","key","doc","e","Error","message","INTERNAL_SERVER_ERROR","success","targetId","targetKey","targetID","adjacentDoc","adjacentDocKey","orderValues","draftsEnabled","entries","draft","latestVersion","query","equals","_status","reorderEndpoint","handler","method","path","endpoints"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/config/orderable/index.ts"],"sourcesContent":["import { status as httpStatus } from 'http-status'\n\nimport type { BeforeChangeHook, CollectionConfig } from '../../collections/config/types.js'\nimport type { Config } from '../../config/types.js'\nimport type { Field, TextField } from '../../fields/config/types.js'\nimport type { Endpoint, PayloadHandler, SanitizedConfig } from '../types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { hasWhereAccessResult } from '../../auth/types.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { APIError, Forbidden } from '../../errors/index.js'\nimport { sanitizeField } from '../../fields/config/sanitize.js'\nimport { combineWhereConstraints } from '../../utilities/combineWhereConstraints.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { hasDraftsEnabled } from '../../utilities/getVersionsConfig.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { getLatestCollectionVersion } from '../../versions/getLatestCollectionVersion.js'\nimport { generateKeyBetween, generateNKeysBetween } from './fractional-indexing.js'\nimport { getJoinScopeContext } from './utils/getJoinScopeContext.js'\nimport { getJoinScopeWhereFromDocData } from './utils/getJoinScopeWhereFromDocData.js'\nimport { resolvePendingTargetKey } from './utils/resolvePendingTargetKey.js'\n\nexport const addOrderableFieldsAndHook = async (\n collection: CollectionConfig,\n config: Config,\n orderableFieldNames: string[],\n joinFieldPathsByCollection?: Map<string, Map<string, string>>,\n) => {\n // 1. Add fields\n for (const orderableFieldName of orderableFieldNames) {\n const orderField: TextField = {\n name: orderableFieldName,\n type: 'text',\n admin: {\n disableBulkEdit: true,\n disabled: true,\n disableGroupBy: true,\n disableListColumn: true,\n disableListFilter: true,\n hidden: true,\n readOnly: true,\n },\n hooks: {\n beforeDuplicate: [\n ({ siblingData }) => {\n delete siblingData[orderableFieldName]\n },\n ],\n },\n index: true,\n }\n\n // Sanitize the field using the standard sanitization logic\n await sanitizeField({\n collectionConfig: collection,\n config,\n existingFieldNames: new Set(),\n field: orderField,\n index: 0,\n isTopLevelField: true,\n joinPath: '',\n parentIndexPath: '',\n parentIsLocalized: false,\n parentSchemaPath: '',\n requireFieldLevelRichTextEditor: false,\n validRelationships: null,\n })\n\n collection.fields.unshift(orderField)\n }\n\n // 2. Add hook\n if (!collection.hooks) {\n collection.hooks = {}\n }\n if (!collection.hooks.beforeChange) {\n collection.hooks.beforeChange = []\n }\n\n const orderBeforeChangeHook: BeforeChangeHook = async ({ data, originalDoc, req }) => {\n for (const orderableFieldName of orderableFieldNames) {\n if (!data[orderableFieldName] && !originalDoc?.[orderableFieldName]) {\n const joinScopeWhere = getJoinScopeWhereFromDocData({\n collectionSlug: collection.slug,\n data,\n joinFieldPathsByCollection,\n orderableFieldName,\n originalDoc,\n })\n\n const lastDoc = await req.payload.find({\n collection: collection.slug,\n depth: 0,\n limit: 1,\n pagination: false,\n req,\n select: { [orderableFieldName]: true },\n sort: `-${orderableFieldName}`,\n where: combineWhereConstraints([\n {\n [orderableFieldName]: {\n exists: true,\n },\n },\n joinScopeWhere ?? undefined,\n ]),\n })\n\n const lastOrderValue = lastDoc.docs[0]?.[orderableFieldName] || null\n data[orderableFieldName] = generateKeyBetween(lastOrderValue, null)\n }\n }\n\n return data\n }\n\n collection.hooks.beforeChange.push(orderBeforeChangeHook)\n}\n\n/**\n * The body of the reorder endpoint.\n * @internal\n */\nexport type OrderableEndpointBody = {\n collectionSlug: string\n docsToMove: string[]\n newKeyWillBe: 'greater' | 'less'\n orderableFieldName: string\n target: {\n id: string\n key: string\n }\n}\n\nexport const addOrderableEndpoint = (\n config: SanitizedConfig,\n joinFieldPathsByCollection: Map<string, Map<string, string>>,\n) => {\n // 3. Add endpoint\n const reorderHandler: PayloadHandler = async (req) => {\n const body = (await req.json?.()) as OrderableEndpointBody\n\n const { collectionSlug, docsToMove, newKeyWillBe, orderableFieldName, target } = body\n\n if (!Array.isArray(docsToMove) || docsToMove.length === 0) {\n return new Response(JSON.stringify({ error: 'docsToMove must be a non-empty array' }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n if (newKeyWillBe !== 'greater' && newKeyWillBe !== 'less') {\n return new Response(JSON.stringify({ error: 'newKeyWillBe must be \"greater\" or \"less\"' }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n const collection = config.collections.find((c) => c.slug === collectionSlug)\n if (!collection) {\n return new Response(JSON.stringify({ error: `Collection ${collectionSlug} not found` }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n if (typeof orderableFieldName !== 'string') {\n return new Response(JSON.stringify({ error: 'orderableFieldName must be a string' }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n\n const isConfiguredOrderableField =\n (collection.orderable && orderableFieldName === '_order') ||\n joinFieldPathsByCollection.get(collection.slug)?.has(orderableFieldName)\n\n if (!isConfiguredOrderableField) {\n return new Response(\n JSON.stringify({ error: `${orderableFieldName} is not configured for ordering` }),\n {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n },\n )\n }\n\n const assertUpdateAccess = async (\n updates: { data: Record<string, unknown>; id: number | string }[],\n ) => {\n if (!collection.access?.update) {\n return\n }\n\n for (const { id, data } of updates) {\n const accessResult = await executeAccess({ id, data, req }, collection.access.update)\n\n if (hasWhereAccessResult(accessResult)) {\n const accessibleDoc = await getLatestCollectionVersion({\n id,\n config: collection,\n payload: req.payload,\n query: {\n collection: collection.slug,\n req,\n where: combineQueries({ id: { equals: id } }, accessResult),\n },\n req,\n })\n\n if (!accessibleDoc) {\n throw new Forbidden(req.t)\n }\n }\n }\n }\n\n const { joinScopeWhere, targetDoc } = await getJoinScopeContext({\n collectionSlug: collection.slug,\n joinFieldPathsByCollection,\n orderableFieldName,\n req,\n target,\n })\n\n /**\n * If there is no target.key, we can assume the user enabled `orderable`\n * on a collection with existing documents, and that this is the first\n * time they tried to reorder them. Therefore, we perform a one-time\n * migration by setting the key value for all documents. We do this\n * instead of enforcing `required` and `unique` at the database schema\n * level, so that users don't have to run a migration when they enable\n * `orderable` on a collection with existing documents.\n */\n if (!target.key) {\n const { docs } = await req.payload.find({\n collection: collection.slug,\n depth: 0,\n limit: 0,\n req,\n select: { [orderableFieldName]: true },\n where: combineWhereConstraints([\n {\n [orderableFieldName]: {\n exists: false,\n },\n },\n joinScopeWhere ?? undefined,\n ]),\n })\n const shouldCommit = await initTransaction(req)\n const hasTransaction = Boolean(await req.transactionID)\n\n if (!hasTransaction) {\n await assertUpdateAccess(docs.map(({ id }) => ({ id, data: {} })))\n }\n // We cannot update all documents in a single operation with `payload.update`,\n // because they would all end up with the same order key (`a0`).\n try {\n for (const doc of docs) {\n await req.payload.update({\n id: doc.id,\n collection: collection.slug,\n data: {\n // no data needed since the order hooks will handle this\n },\n depth: 0,\n overrideAccess: false,\n req,\n })\n }\n if (shouldCommit || !hasTransaction) {\n await commitTransaction(req)\n }\n } catch (e) {\n await killTransaction(req)\n if (e instanceof APIError) {\n throw e\n }\n if (e instanceof Error) {\n throw new APIError(e.message, httpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n return new Response(JSON.stringify({ message: 'initial migration', success: true }), {\n headers: { 'Content-Type': 'application/json' },\n status: 200,\n })\n }\n\n if (\n typeof target !== 'object' ||\n typeof target.id === 'undefined' ||\n typeof target.key !== 'string'\n ) {\n return new Response(JSON.stringify({ error: 'target must be an object with id' }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n\n const targetId = target.id\n const targetKey = await resolvePendingTargetKey({\n collectionSlug: collection.slug,\n orderableFieldName,\n req,\n targetDoc,\n targetID: targetId,\n targetKey: target.key,\n })\n\n // The reason the endpoint does not receive this docId as an argument is that there\n // are situations where the user may not see or know what the next or previous one is. For\n // example, access control restrictions, if docBefore is the last one on the page, etc.\n const adjacentDoc = await req.payload.find({\n collection: collection.slug,\n depth: 0,\n limit: 1,\n pagination: false,\n select: { [orderableFieldName]: true },\n sort: newKeyWillBe === 'greater' ? orderableFieldName : `-${orderableFieldName}`,\n where: combineWhereConstraints([\n {\n [orderableFieldName]: {\n [newKeyWillBe === 'greater' ? 'greater_than' : 'less_than']: targetKey,\n },\n },\n joinScopeWhere ?? undefined,\n ]),\n })\n const adjacentDocKey = adjacentDoc.docs?.[0]?.[orderableFieldName] || null\n\n const orderValues =\n newKeyWillBe === 'greater'\n ? generateNKeysBetween(targetKey, adjacentDocKey, docsToMove.length)\n : generateNKeysBetween(adjacentDocKey, targetKey, docsToMove.length)\n\n await assertUpdateAccess(\n docsToMove.map((id, index) => ({\n id,\n data: { [orderableFieldName]: orderValues[index] },\n })),\n )\n\n const draftsEnabled = hasDraftsEnabled(collection)\n\n // Update each document with its new order value\n for (const [index, id] of docsToMove.entries()) {\n let draft: boolean | undefined\n\n if (draftsEnabled) {\n const latestVersion = await getLatestCollectionVersion({\n id,\n config: collection,\n payload: req.payload,\n query: {\n collection: collection.slug,\n req,\n where: { id: { equals: id } },\n },\n req,\n })\n\n draft = latestVersion?._status === 'draft'\n }\n\n await req.payload.update({\n id,\n collection: collection.slug,\n data: {\n [orderableFieldName]: orderValues[index],\n },\n depth: 0,\n draft,\n overrideAccess: false,\n req,\n })\n }\n\n return new Response(JSON.stringify({ orderValues, success: true }), {\n headers: { 'Content-Type': 'application/json' },\n status: 200,\n })\n }\n\n const reorderEndpoint: Endpoint = {\n handler: reorderHandler,\n method: 'post',\n path: '/reorder',\n }\n\n if (!config.endpoints) {\n config.endpoints = []\n }\n\n config.endpoints.push(reorderEndpoint)\n}\n"],"names":["status","httpStatus","executeAccess","hasWhereAccessResult","combineQueries","APIError","Forbidden","sanitizeField","combineWhereConstraints","commitTransaction","hasDraftsEnabled","initTransaction","killTransaction","getLatestCollectionVersion","generateKeyBetween","generateNKeysBetween","getJoinScopeContext","getJoinScopeWhereFromDocData","resolvePendingTargetKey","addOrderableFieldsAndHook","collection","config","orderableFieldNames","joinFieldPathsByCollection","orderableFieldName","orderField","name","type","admin","disableBulkEdit","disabled","disableGroupBy","disableListColumn","disableListFilter","hidden","readOnly","hooks","beforeDuplicate","siblingData","index","collectionConfig","existingFieldNames","Set","field","isTopLevelField","joinPath","parentIndexPath","parentIsLocalized","parentSchemaPath","requireFieldLevelRichTextEditor","validRelationships","fields","unshift","beforeChange","orderBeforeChangeHook","data","originalDoc","req","joinScopeWhere","collectionSlug","slug","lastDoc","payload","find","depth","limit","pagination","select","sort","where","exists","undefined","lastOrderValue","docs","push","addOrderableEndpoint","reorderHandler","body","json","docsToMove","newKeyWillBe","target","Array","isArray","length","Response","JSON","stringify","error","headers","collections","c","isConfiguredOrderableField","orderable","get","has","assertUpdateAccess","updates","access","update","id","accessResult","accessibleDoc","query","equals","t","targetDoc","key","shouldCommit","hasTransaction","Boolean","transactionID","map","doc","overrideAccess","e","Error","message","INTERNAL_SERVER_ERROR","success","targetId","targetKey","targetID","adjacentDoc","adjacentDocKey","orderValues","draftsEnabled","entries","draft","latestVersion","_status","reorderEndpoint","handler","method","path","endpoints"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/config/sanitize.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,MAAM,EAGN,eAAe,EAIhB,MAAM,YAAY,CAAA;AAoGnB,eAAO,MAAM,cAAc,mBAA0B,MAAM,KAAG,OAAO,CAAC,eAAe,CAibpF,CAAA"}
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/config/sanitize.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,MAAM,EAGN,eAAe,EAIhB,MAAM,YAAY,CAAA;AAoGnB,eAAO,MAAM,cAAc,mBAA0B,MAAM,KAAG,OAAO,CAAC,eAAe,CAmbpF,CAAA"}
@@ -269,7 +269,7 @@ export const sanitizeConfig = async (incomingConfig)=>{
269
269
  if (schedulePublishCollections.length || schedulePublishGlobals.length) {
270
270
  ;
271
271
  ((config.jobs ??= {}).tasks ??= []).push(getSchedulePublishTask({
272
- adminUserSlug: config.admin.user,
272
+ authCollectionSlugs: config.collections.filter((collection)=>Boolean(collection.auth)).map(({ slug })=>slug),
273
273
  collections: schedulePublishCollections,
274
274
  globals: schedulePublishGlobals
275
275
  }));