payload 3.89.0 → 3.90.1

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 (459) 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 +118 -18
  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 +87 -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 +102 -24
  255. package/dist/index.d.ts +3 -1
  256. package/dist/index.d.ts.map +1 -1
  257. package/dist/index.js +2 -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/types/index.d.ts +2 -1
  266. package/dist/queues/config/types/index.d.ts.map +1 -1
  267. package/dist/queues/config/types/index.js.map +1 -1
  268. package/dist/uploads/assertClientUploadAccess.d.ts +7 -0
  269. package/dist/uploads/assertClientUploadAccess.d.ts.map +1 -0
  270. package/dist/uploads/assertClientUploadAccess.js +27 -0
  271. package/dist/uploads/assertClientUploadAccess.js.map +1 -0
  272. package/dist/uploads/assertClientUploadAllowed.d.ts +11 -0
  273. package/dist/uploads/assertClientUploadAllowed.d.ts.map +1 -0
  274. package/dist/uploads/assertClientUploadAllowed.js +46 -0
  275. package/dist/uploads/assertClientUploadAllowed.js.map +1 -0
  276. package/dist/uploads/assertClientUploadAllowed.spec.js +91 -0
  277. package/dist/uploads/assertClientUploadAllowed.spec.js.map +1 -0
  278. package/dist/uploads/checkFileRestrictions.d.ts +4 -1
  279. package/dist/uploads/checkFileRestrictions.d.ts.map +1 -1
  280. package/dist/uploads/checkFileRestrictions.js +66 -26
  281. package/dist/uploads/checkFileRestrictions.js.map +1 -1
  282. package/dist/uploads/clientUploadReceipt.d.ts +23 -0
  283. package/dist/uploads/clientUploadReceipt.d.ts.map +1 -0
  284. package/dist/uploads/clientUploadReceipt.js +55 -0
  285. package/dist/uploads/clientUploadReceipt.js.map +1 -0
  286. package/dist/uploads/deleteAssociatedFiles.d.ts.map +1 -1
  287. package/dist/uploads/deleteAssociatedFiles.js +33 -8
  288. package/dist/uploads/deleteAssociatedFiles.js.map +1 -1
  289. package/dist/uploads/deleteAssociatedFiles.spec.js +124 -0
  290. package/dist/uploads/deleteAssociatedFiles.spec.js.map +1 -0
  291. package/dist/uploads/detectSvgFromXml.d.ts +1 -3
  292. package/dist/uploads/detectSvgFromXml.d.ts.map +1 -1
  293. package/dist/uploads/detectSvgFromXml.js +3 -40
  294. package/dist/uploads/detectSvgFromXml.js.map +1 -1
  295. package/dist/uploads/endpoints/getFile.d.ts.map +1 -1
  296. package/dist/uploads/endpoints/getFile.js +5 -3
  297. package/dist/uploads/endpoints/getFile.js.map +1 -1
  298. package/dist/uploads/fetchAPI-multipart/handlers.d.ts +2 -2
  299. package/dist/uploads/fetchAPI-multipart/handlers.d.ts.map +1 -1
  300. package/dist/uploads/fetchAPI-multipart/handlers.js +18 -5
  301. package/dist/uploads/fetchAPI-multipart/handlers.js.map +1 -1
  302. package/dist/uploads/fetchAPI-multipart/index.d.ts.map +1 -1
  303. package/dist/uploads/fetchAPI-multipart/index.js +24 -2
  304. package/dist/uploads/fetchAPI-multipart/index.js.map +1 -1
  305. package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts +0 -6
  306. package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts.map +1 -1
  307. package/dist/uploads/fetchAPI-multipart/processMultipart.js +146 -126
  308. package/dist/uploads/fetchAPI-multipart/processMultipart.js.map +1 -1
  309. package/dist/uploads/fetchAPI-multipart/processMultipart.spec.js +663 -0
  310. package/dist/uploads/fetchAPI-multipart/processMultipart.spec.js.map +1 -0
  311. package/dist/uploads/generateFileData.d.ts +3 -1
  312. package/dist/uploads/generateFileData.d.ts.map +1 -1
  313. package/dist/uploads/generateFileData.js +29 -16
  314. package/dist/uploads/generateFileData.js.map +1 -1
  315. package/dist/uploads/getBaseFields.d.ts.map +1 -1
  316. package/dist/uploads/getBaseFields.js +3 -1
  317. package/dist/uploads/getBaseFields.js.map +1 -1
  318. package/dist/uploads/getExternalFile.d.ts +1 -1
  319. package/dist/uploads/getExternalFile.d.ts.map +1 -1
  320. package/dist/uploads/getExternalFile.js +60 -15
  321. package/dist/uploads/getExternalFile.js.map +1 -1
  322. package/dist/uploads/getFileTypeFallback.d.ts.map +1 -1
  323. package/dist/uploads/getFileTypeFallback.js +3 -1
  324. package/dist/uploads/getFileTypeFallback.js.map +1 -1
  325. package/dist/uploads/getFileTypeIdentity.d.ts +19 -0
  326. package/dist/uploads/getFileTypeIdentity.d.ts.map +1 -0
  327. package/dist/uploads/getFileTypeIdentity.js +34 -0
  328. package/dist/uploads/getFileTypeIdentity.js.map +1 -0
  329. package/dist/uploads/getFileTypeIdentity.spec.js +43 -0
  330. package/dist/uploads/getFileTypeIdentity.spec.js.map +1 -0
  331. package/dist/uploads/isProcessableImage.d.ts +2 -0
  332. package/dist/uploads/isProcessableImage.d.ts.map +1 -0
  333. package/dist/uploads/isProcessableImage.js +7 -0
  334. package/dist/uploads/isProcessableImage.js.map +1 -0
  335. package/dist/uploads/safeFetch.d.ts.map +1 -1
  336. package/dist/uploads/safeFetch.js +3 -2
  337. package/dist/uploads/safeFetch.js.map +1 -1
  338. package/dist/uploads/sanitizeUploadData.d.ts +26 -0
  339. package/dist/uploads/sanitizeUploadData.d.ts.map +1 -0
  340. package/dist/uploads/sanitizeUploadData.js +159 -0
  341. package/dist/uploads/sanitizeUploadData.js.map +1 -0
  342. package/dist/uploads/sanitizeUploadData.spec.js +255 -0
  343. package/dist/uploads/sanitizeUploadData.spec.js.map +1 -0
  344. package/dist/uploads/types.d.ts +11 -3
  345. package/dist/uploads/types.d.ts.map +1 -1
  346. package/dist/uploads/types.js.map +1 -1
  347. package/dist/uploads/uploadContentSecurityPolicy.d.ts +2 -0
  348. package/dist/uploads/uploadContentSecurityPolicy.d.ts.map +1 -0
  349. package/dist/uploads/uploadContentSecurityPolicy.js +3 -0
  350. package/dist/uploads/uploadContentSecurityPolicy.js.map +1 -0
  351. package/dist/uploads/validateISOBaseMediaFile.d.ts +4 -0
  352. package/dist/uploads/validateISOBaseMediaFile.d.ts.map +1 -0
  353. package/dist/uploads/validateISOBaseMediaFile.js +91 -0
  354. package/dist/uploads/validateISOBaseMediaFile.js.map +1 -0
  355. package/dist/uploads/validateISOBaseMediaFile.spec.js +130 -0
  356. package/dist/uploads/validateISOBaseMediaFile.spec.js.map +1 -0
  357. package/dist/uploads/validateSvg.d.ts +10 -4
  358. package/dist/uploads/validateSvg.d.ts.map +1 -1
  359. package/dist/uploads/validateSvg.js +280 -40
  360. package/dist/uploads/validateSvg.js.map +1 -1
  361. package/dist/uploads/validateSvg.spec.js +123 -0
  362. package/dist/uploads/validateSvg.spec.js.map +1 -0
  363. package/dist/uploads/validateUploadFilename.d.ts +3 -0
  364. package/dist/uploads/validateUploadFilename.d.ts.map +1 -0
  365. package/dist/uploads/validateUploadFilename.js +13 -0
  366. package/dist/uploads/validateUploadFilename.js.map +1 -0
  367. package/dist/uploads/validateUploadFilename.spec.js +24 -0
  368. package/dist/uploads/validateUploadFilename.spec.js.map +1 -0
  369. package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
  370. package/dist/utilities/addDataAndFileToRequest.js +28 -1
  371. package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
  372. package/dist/utilities/addDataAndFileToRequest.spec.js +158 -0
  373. package/dist/utilities/addDataAndFileToRequest.spec.js.map +1 -1
  374. package/dist/utilities/createPayloadRequest.d.ts.map +1 -1
  375. package/dist/utilities/createPayloadRequest.js +2 -1
  376. package/dist/utilities/createPayloadRequest.js.map +1 -1
  377. package/dist/utilities/deepCopyObject.d.ts.map +1 -1
  378. package/dist/utilities/deepCopyObject.js +110 -19
  379. package/dist/utilities/deepCopyObject.js.map +1 -1
  380. package/dist/utilities/deepCopyObject.spec.js +216 -0
  381. package/dist/utilities/deepCopyObject.spec.js.map +1 -0
  382. package/dist/utilities/fieldPath.d.ts +13 -0
  383. package/dist/utilities/fieldPath.d.ts.map +1 -0
  384. package/dist/utilities/fieldPath.js +51 -0
  385. package/dist/utilities/fieldPath.js.map +1 -0
  386. package/dist/utilities/fieldPath.spec.js +155 -0
  387. package/dist/utilities/fieldPath.spec.js.map +1 -0
  388. package/dist/utilities/getEntityPermissions/getEntityPermissions.d.ts.map +1 -1
  389. package/dist/utilities/getEntityPermissions/getEntityPermissions.js +2 -0
  390. package/dist/utilities/getEntityPermissions/getEntityPermissions.js.map +1 -1
  391. package/dist/utilities/getObjectDotNotation.d.ts.map +1 -1
  392. package/dist/utilities/getObjectDotNotation.js +7 -1
  393. package/dist/utilities/getObjectDotNotation.js.map +1 -1
  394. package/dist/utilities/getObjectDotNotation.spec.js +33 -0
  395. package/dist/utilities/getObjectDotNotation.spec.js.map +1 -0
  396. package/dist/utilities/getSafeRedirect.spec.js +14 -0
  397. package/dist/utilities/getSafeRedirect.spec.js.map +1 -1
  398. package/dist/utilities/getTopLevelFieldNames.d.ts +2 -0
  399. package/dist/utilities/getTopLevelFieldNames.d.ts.map +1 -0
  400. package/dist/utilities/getTopLevelFieldNames.js +3 -0
  401. package/dist/utilities/getTopLevelFieldNames.js.map +1 -0
  402. package/dist/utilities/getTopLevelFieldNames.spec.js +18 -0
  403. package/dist/utilities/getTopLevelFieldNames.spec.js.map +1 -0
  404. package/dist/utilities/handleEndpoints.js +1 -1
  405. package/dist/utilities/handleEndpoints.js.map +1 -1
  406. package/dist/utilities/parseParams/index.d.ts.map +1 -1
  407. package/dist/utilities/parseParams/index.js +3 -1
  408. package/dist/utilities/parseParams/index.js.map +1 -1
  409. package/dist/utilities/parseParams/index.spec.js +8 -0
  410. package/dist/utilities/parseParams/index.spec.js.map +1 -1
  411. package/dist/utilities/telemetry/featureInfo/getFeatureInfo.d.ts +4 -0
  412. package/dist/utilities/telemetry/featureInfo/getFeatureInfo.d.ts.map +1 -0
  413. package/dist/utilities/telemetry/featureInfo/getFeatureInfo.js +248 -0
  414. package/dist/utilities/telemetry/featureInfo/getFeatureInfo.js.map +1 -0
  415. package/dist/utilities/telemetry/featureInfo/types.d.ts +62 -0
  416. package/dist/utilities/telemetry/featureInfo/types.d.ts.map +1 -0
  417. package/dist/utilities/telemetry/featureInfo/types.js +3 -0
  418. package/dist/utilities/telemetry/featureInfo/types.js.map +1 -0
  419. package/dist/utilities/telemetry/getProjectContext.d.ts +14 -0
  420. package/dist/utilities/telemetry/getProjectContext.d.ts.map +1 -0
  421. package/dist/utilities/telemetry/getProjectContext.js +36 -0
  422. package/dist/utilities/telemetry/getProjectContext.js.map +1 -0
  423. package/dist/utilities/telemetry/index.d.ts +7 -1
  424. package/dist/utilities/telemetry/index.d.ts.map +1 -1
  425. package/dist/utilities/telemetry/index.js +22 -0
  426. package/dist/utilities/telemetry/index.js.map +1 -1
  427. package/dist/utilities/traverseFields.d.ts.map +1 -1
  428. package/dist/utilities/traverseFields.js +5 -14
  429. package/dist/utilities/traverseFields.js.map +1 -1
  430. package/dist/utilities/unflatten.d.ts.map +1 -1
  431. package/dist/utilities/unflatten.js +21 -9
  432. package/dist/utilities/unflatten.js.map +1 -1
  433. package/dist/utilities/unflatten.spec.js +38 -0
  434. package/dist/utilities/unflatten.spec.js.map +1 -0
  435. package/dist/versions/allLocalesPublicationStatus.d.ts +38 -0
  436. package/dist/versions/allLocalesPublicationStatus.d.ts.map +1 -0
  437. package/dist/versions/allLocalesPublicationStatus.js +57 -0
  438. package/dist/versions/allLocalesPublicationStatus.js.map +1 -0
  439. package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
  440. package/dist/versions/getLatestGlobalVersion.js +10 -2
  441. package/dist/versions/getLatestGlobalVersion.js.map +1 -1
  442. package/dist/versions/getRestoredStatusesToAuthorize.d.ts +9 -0
  443. package/dist/versions/getRestoredStatusesToAuthorize.d.ts.map +1 -0
  444. package/dist/versions/getRestoredStatusesToAuthorize.js +22 -0
  445. package/dist/versions/getRestoredStatusesToAuthorize.js.map +1 -0
  446. package/dist/versions/getRestoredStatusesToAuthorize.spec.js +50 -0
  447. package/dist/versions/getRestoredStatusesToAuthorize.spec.js.map +1 -0
  448. package/dist/versions/schedule/job.d.ts +2 -2
  449. package/dist/versions/schedule/job.d.ts.map +1 -1
  450. package/dist/versions/schedule/job.js +11 -7
  451. package/dist/versions/schedule/job.js.map +1 -1
  452. package/dist/versions/schedule/types.d.ts +5 -1
  453. package/dist/versions/schedule/types.d.ts.map +1 -1
  454. package/dist/versions/schedule/types.js.map +1 -1
  455. package/package.json +4 -2
  456. package/dist/auth/baseFields/apiKey.d.ts +0 -3
  457. package/dist/auth/baseFields/apiKey.d.ts.map +0 -1
  458. package/dist/auth/baseFields/apiKey.js +0 -59
  459. package/dist/auth/baseFields/apiKey.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/collections/config/sanitize.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { OrderableJoinInfo } from '../../fields/config/sanitizeJoinField.js'\nimport type {\n CollectionConfig,\n SanitizedCollectionConfig,\n SanitizedJoin,\n SanitizedJoins,\n} from './types.js'\n\nimport { authCollectionEndpoints } from '../../auth/endpoints/index.js'\nimport { getBaseAuthFields } from '../../auth/getAuthFields.js'\nimport { TimestampsRequired } from '../../errors/TimestampsRequired.js'\nimport { sanitizeFields } from '../../fields/config/sanitize.js'\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport { mergeBaseFields } from '../../fields/mergeBaseFields.js'\nimport { uploadCollectionEndpoints } from '../../uploads/endpoints/index.js'\nimport { getBaseUploadFields } from '../../uploads/getBaseFields.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels } from '../../utilities/formatLabels.js'\nimport { miniChalk } from '../../utilities/miniChalk.js'\nimport { traverseForLocalizedFields } from '../../utilities/traverseForLocalizedFields.js'\nimport { baseVersionFields } from '../../versions/baseFields.js'\nimport { versionDefaults } from '../../versions/defaults.js'\nimport { defaultCollectionEndpoints } from '../endpoints/index.js'\nimport {\n addDefaultsToAuthConfig,\n addDefaultsToCollectionConfig,\n addDefaultsToLoginWithUsernameConfig,\n} from './defaults.js'\nimport { sanitizeCompoundIndexes } from './sanitizeCompoundIndexes.js'\nimport { validateUseAsTitle } from './useAsTitle.js'\n\n/**\n * Warns at startup when custom collection views are misconfigured with a missing `path`.\n * Views without `path` will never be matched by the router and are silently ignored.\n */\nexport const warnOnInvalidCustomViews = (collection: CollectionConfig): void => {\n const views = collection.admin?.components?.views\n if (!views || typeof views !== 'object') {\n return\n }\n\n for (const [key, view] of Object.entries(views)) {\n if (key === 'edit' || key === 'list') {\n continue\n }\n\n if (view && typeof view === 'object' && 'Component' in view && !('path' in view)) {\n console.warn(\n `[Payload] Custom collection view \"${key}\" in collection \"${collection.slug}\" is missing a \"path\" property. The view will never be rendered.`,\n )\n }\n\n if (view && typeof view === 'object' && 'path' in view && !('Component' in view)) {\n console.warn(\n `[Payload] Custom collection view \"${key}\" in collection \"${collection.slug}\" has a \"path\" but is missing a \"Component\". The view will never be rendered.`,\n )\n }\n }\n}\n\nexport const sanitizeCollection = async (\n config: Config,\n collection: CollectionConfig,\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>,\n _validRelationships?: string[],\n /**\n * Tracker for orderable join fields - populated during sanitization\n */\n orderableJoins?: OrderableJoinInfo[],\n): Promise<SanitizedCollectionConfig> => {\n if (collection._sanitized) {\n return collection as SanitizedCollectionConfig\n }\n\n collection._sanitized = true\n\n warnOnInvalidCustomViews(collection)\n\n // /////////////////////////////////\n // Make copy of collection config\n // /////////////////////////////////\n\n const sanitized: CollectionConfig = addDefaultsToCollectionConfig(collection)\n\n // /////////////////////////////////\n // Sanitize fields\n // /////////////////////////////////\n\n const validRelationships = _validRelationships ?? config.collections!.map((c) => c.slug) ?? []\n\n const joins: SanitizedJoins = {}\n\n const polymorphicJoins: SanitizedJoin[] = []\n\n sanitized.fields = await sanitizeFields({\n collectionConfig: sanitized,\n config,\n fields: sanitized.fields,\n joinPath: '',\n joins,\n orderableJoins,\n parentIsLocalized: false,\n polymorphicJoins,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n if (sanitized.endpoints !== false) {\n if (!sanitized.endpoints) {\n sanitized.endpoints = []\n }\n\n if (sanitized.auth) {\n for (const endpoint of authCollectionEndpoints) {\n sanitized.endpoints.push(endpoint)\n }\n }\n\n if (sanitized.upload) {\n for (const endpoint of uploadCollectionEndpoints) {\n sanitized.endpoints.push(endpoint)\n }\n }\n\n for (const endpoint of defaultCollectionEndpoints) {\n sanitized.endpoints.push(endpoint)\n }\n }\n\n if (sanitized.timestamps !== false) {\n // add default timestamps fields only as needed\n let hasUpdatedAt: boolean | null = null\n let hasCreatedAt: boolean | null = null\n let hasDeletedAt: boolean | null = null\n\n sanitized.fields.some((field) => {\n if (fieldAffectsData(field)) {\n if (field.name === 'updatedAt') {\n hasUpdatedAt = true\n }\n\n if (field.name === 'createdAt') {\n hasCreatedAt = true\n }\n\n if (field.name === 'deletedAt') {\n hasDeletedAt = true\n }\n }\n\n return hasCreatedAt && hasUpdatedAt && (!sanitized.trash || hasDeletedAt)\n })\n\n if (!hasUpdatedAt) {\n sanitized.fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n index: true,\n label: ({ t }) => t('general:updatedAt'),\n })\n }\n\n if (!hasCreatedAt) {\n sanitized.fields.push({\n name: 'createdAt',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n // The default sort for list view is createdAt. Thus, enabling indexing by default, is a major performance improvement, especially for large or a large amount of collections.\n type: 'date',\n index: true,\n label: ({ t }) => t('general:createdAt'),\n })\n }\n\n if (sanitized.trash && !hasDeletedAt) {\n sanitized.fields.push({\n name: 'deletedAt',\n type: 'date',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n index: true,\n label: ({ t }) => t('general:deletedAt'),\n })\n }\n }\n\n const defaultLabels = formatLabels(sanitized.slug)\n\n sanitized.labels = {\n plural: sanitized.labels?.plural || defaultLabels.plural,\n singular: sanitized.labels?.singular || defaultLabels.singular,\n }\n\n if (sanitized.versions) {\n if (sanitized.timestamps === false) {\n throw new TimestampsRequired(collection)\n }\n\n if (sanitized.versions === true) {\n sanitized.versions = {\n drafts: false,\n maxPerDoc: 100,\n }\n }\n\n sanitized.versions.maxPerDoc =\n typeof sanitized.versions.maxPerDoc === 'number' ? sanitized.versions.maxPerDoc : 100\n\n if (sanitized.versions.drafts) {\n if (sanitized.versions.drafts === true) {\n sanitized.versions.drafts = {\n autosave: false,\n validate: false,\n }\n }\n\n const hasLocalizedFields = traverseForLocalizedFields(sanitized.fields)\n\n if (config.localization) {\n if (hasLocalizedFields && sanitized.versions.drafts.localizeStatus === undefined) {\n sanitized.versions.drafts.localizeStatus = false\n }\n }\n\n // TODO v4: remove this sanitization check, should not need to enable the experimental flag\n if (sanitized.versions.drafts.localizeStatus && !config.experimental?.localizeStatus) {\n sanitized.versions.drafts.localizeStatus = false\n console.log(\n miniChalk.yellowBold(\n `Warning: \"localizeStatus\" for drafts is an experimental feature. To enable, set \"experimental.localizeStatus\" to true in your Payload config.`,\n ),\n )\n }\n\n if (sanitized.versions.drafts.autosave === true) {\n sanitized.versions.drafts.autosave = {\n interval: versionDefaults.autosaveInterval,\n }\n }\n\n if (sanitized.versions.drafts.validate === undefined) {\n sanitized.versions.drafts.validate = false\n }\n\n sanitized.fields = mergeBaseFields(\n sanitized.fields,\n baseVersionFields({\n localized: sanitized.versions.drafts.localizeStatus ?? false,\n }),\n )\n }\n } else {\n delete sanitized.versions\n }\n\n if (sanitized.folders === true) {\n sanitized.folders = {\n browseByFolder: true,\n }\n } else if (sanitized.folders) {\n sanitized.folders.browseByFolder = sanitized.folders.browseByFolder ?? true\n }\n\n if (sanitized.upload) {\n if (sanitized.upload === true) {\n sanitized.upload = {}\n }\n\n sanitized.upload.cacheTags = sanitized.upload?.cacheTags ?? true\n sanitized.upload.bulkUpload = sanitized.upload?.bulkUpload ?? true\n sanitized.upload.staticDir = sanitized.upload.staticDir || sanitized.slug\n sanitized.admin!.useAsTitle =\n sanitized.admin?.useAsTitle && sanitized.admin.useAsTitle !== 'id'\n ? sanitized.admin.useAsTitle\n : 'filename'\n\n const uploadFields = getBaseUploadFields({\n collection: sanitized,\n config,\n })\n\n sanitized.fields = mergeBaseFields(sanitized.fields, uploadFields)\n }\n\n if (sanitized.auth) {\n sanitized.auth = addDefaultsToAuthConfig(\n typeof sanitized.auth === 'boolean' ? {} : sanitized.auth,\n )\n\n // disable duplicate for auth enabled collections by default\n sanitized.disableDuplicate = sanitized.disableDuplicate ?? true\n\n if (sanitized.auth.loginWithUsername) {\n if (sanitized.auth.loginWithUsername === true) {\n sanitized.auth.loginWithUsername = addDefaultsToLoginWithUsernameConfig({})\n } else {\n const loginWithUsernameWithDefaults = addDefaultsToLoginWithUsernameConfig(\n sanitized.auth.loginWithUsername,\n )\n\n // if allowEmailLogin is false, requireUsername must be true\n if (loginWithUsernameWithDefaults.allowEmailLogin === false) {\n loginWithUsernameWithDefaults.requireUsername = true\n }\n sanitized.auth.loginWithUsername = loginWithUsernameWithDefaults\n }\n } else {\n sanitized.auth.loginWithUsername = false\n }\n\n if (!collection?.admin?.useAsTitle) {\n sanitized.admin!.useAsTitle = sanitized.auth.loginWithUsername ? 'username' : 'email'\n }\n\n sanitized.fields = mergeBaseFields(sanitized.fields, getBaseAuthFields(sanitized.auth))\n }\n\n if (collection?.admin?.pagination?.limits?.length) {\n sanitized.admin!.pagination!.limits = collection.admin.pagination.limits\n }\n\n validateUseAsTitle(sanitized)\n\n const sanitizedConfig = sanitized as SanitizedCollectionConfig\n\n sanitizedConfig.joins = joins\n sanitizedConfig.polymorphicJoins = polymorphicJoins\n\n sanitizedConfig.flattenedFields = flattenAllFields({ fields: sanitizedConfig.fields })\n\n sanitizedConfig.sanitizedIndexes = sanitizeCompoundIndexes({\n fields: sanitizedConfig.flattenedFields,\n indexes: sanitizedConfig.indexes,\n })\n\n return sanitizedConfig\n}\n"],"names":["authCollectionEndpoints","getBaseAuthFields","TimestampsRequired","sanitizeFields","fieldAffectsData","mergeBaseFields","uploadCollectionEndpoints","getBaseUploadFields","flattenAllFields","formatLabels","miniChalk","traverseForLocalizedFields","baseVersionFields","versionDefaults","defaultCollectionEndpoints","addDefaultsToAuthConfig","addDefaultsToCollectionConfig","addDefaultsToLoginWithUsernameConfig","sanitizeCompoundIndexes","validateUseAsTitle","warnOnInvalidCustomViews","collection","views","admin","components","key","view","Object","entries","console","warn","slug","sanitizeCollection","config","richTextSanitizationPromises","_validRelationships","orderableJoins","_sanitized","sanitized","validRelationships","collections","map","c","joins","polymorphicJoins","fields","collectionConfig","joinPath","parentIsLocalized","endpoints","auth","endpoint","push","upload","timestamps","hasUpdatedAt","hasCreatedAt","hasDeletedAt","some","field","name","trash","type","disableBulkEdit","hidden","index","label","t","defaultLabels","labels","plural","singular","versions","drafts","maxPerDoc","autosave","validate","hasLocalizedFields","localization","localizeStatus","undefined","experimental","log","yellowBold","interval","autosaveInterval","localized","folders","browseByFolder","cacheTags","bulkUpload","staticDir","useAsTitle","uploadFields","disableDuplicate","loginWithUsername","loginWithUsernameWithDefaults","allowEmailLogin","requireUsername","pagination","limits","length","sanitizedConfig","flattenedFields","sanitizedIndexes","indexes"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/collections/config/sanitize.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { OrderableJoinInfo } from '../../fields/config/sanitizeJoinField.js'\nimport type {\n CollectionConfig,\n SanitizedCollectionConfig,\n SanitizedJoin,\n SanitizedJoins,\n} from './types.js'\n\nimport { omitAPIKey } from '../../auth/baseFields/apiKey/index.js'\nimport { apiKeyRevealEndpoint, authCollectionEndpoints } from '../../auth/endpoints/index.js'\nimport { getBaseAuthFields } from '../../auth/getAuthFields.js'\nimport { TimestampsRequired } from '../../errors/TimestampsRequired.js'\nimport { sanitizeFields } from '../../fields/config/sanitize.js'\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport { mergeBaseFields } from '../../fields/mergeBaseFields.js'\nimport { uploadCollectionEndpoints } from '../../uploads/endpoints/index.js'\nimport { getBaseUploadFields } from '../../uploads/getBaseFields.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels } from '../../utilities/formatLabels.js'\nimport { miniChalk } from '../../utilities/miniChalk.js'\nimport { traverseForLocalizedFields } from '../../utilities/traverseForLocalizedFields.js'\nimport { baseVersionFields } from '../../versions/baseFields.js'\nimport { versionDefaults } from '../../versions/defaults.js'\nimport { defaultCollectionEndpoints, duplicateEndpoint } from '../endpoints/index.js'\nimport {\n addDefaultsToAuthConfig,\n addDefaultsToCollectionConfig,\n addDefaultsToLoginWithUsernameConfig,\n} from './defaults.js'\nimport { sanitizeCompoundIndexes } from './sanitizeCompoundIndexes.js'\nimport { validateUseAsTitle } from './useAsTitle.js'\n\n/**\n * Warns at startup when custom collection views are misconfigured with a missing `path`.\n * Views without `path` will never be matched by the router and are silently ignored.\n */\nexport const warnOnInvalidCustomViews = (collection: CollectionConfig): void => {\n const views = collection.admin?.components?.views\n if (!views || typeof views !== 'object') {\n return\n }\n\n for (const [key, view] of Object.entries(views)) {\n if (key === 'edit' || key === 'list') {\n continue\n }\n\n if (view && typeof view === 'object' && 'Component' in view && !('path' in view)) {\n console.warn(\n `[Payload] Custom collection view \"${key}\" in collection \"${collection.slug}\" is missing a \"path\" property. The view will never be rendered.`,\n )\n }\n\n if (view && typeof view === 'object' && 'path' in view && !('Component' in view)) {\n console.warn(\n `[Payload] Custom collection view \"${key}\" in collection \"${collection.slug}\" has a \"path\" but is missing a \"Component\". The view will never be rendered.`,\n )\n }\n }\n}\n\nexport const sanitizeCollection = async (\n config: Config,\n collection: CollectionConfig,\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>,\n _validRelationships?: string[],\n /**\n * Tracker for orderable join fields - populated during sanitization\n */\n orderableJoins?: OrderableJoinInfo[],\n): Promise<SanitizedCollectionConfig> => {\n if (collection._sanitized) {\n return collection as SanitizedCollectionConfig\n }\n\n collection._sanitized = true\n\n warnOnInvalidCustomViews(collection)\n\n // /////////////////////////////////\n // Make copy of collection config\n // /////////////////////////////////\n\n const sanitized: CollectionConfig = addDefaultsToCollectionConfig(collection)\n\n // /////////////////////////////////\n // Sanitize fields\n // /////////////////////////////////\n\n const validRelationships = _validRelationships ?? config.collections!.map((c) => c.slug) ?? []\n\n const joins: SanitizedJoins = {}\n\n const polymorphicJoins: SanitizedJoin[] = []\n\n sanitized.fields = await sanitizeFields({\n collectionConfig: sanitized,\n config,\n fields: sanitized.fields,\n joinPath: '',\n joins,\n orderableJoins,\n parentIsLocalized: false,\n polymorphicJoins,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n if (sanitized.auth) {\n // disable duplicate for auth enabled collections by default\n sanitized.disableDuplicate = sanitized.disableDuplicate ?? true\n }\n\n if (sanitized.endpoints !== false) {\n if (!sanitized.endpoints) {\n sanitized.endpoints = []\n }\n\n if (sanitized.auth) {\n for (const endpoint of authCollectionEndpoints) {\n sanitized.endpoints.push(endpoint)\n }\n\n if (\n typeof sanitized.auth === 'object' &&\n typeof sanitized.auth.useAPIKey === 'object' &&\n sanitized.auth.useAPIKey.reveal === true\n ) {\n sanitized.endpoints.push(apiKeyRevealEndpoint)\n }\n }\n\n if (sanitized.upload) {\n for (const endpoint of uploadCollectionEndpoints) {\n sanitized.endpoints.push(endpoint)\n }\n }\n\n for (const endpoint of defaultCollectionEndpoints) {\n if (endpoint !== duplicateEndpoint || sanitized.disableDuplicate !== true) {\n sanitized.endpoints.push(endpoint)\n }\n }\n }\n\n if (sanitized.timestamps !== false) {\n // add default timestamps fields only as needed\n let hasUpdatedAt: boolean | null = null\n let hasCreatedAt: boolean | null = null\n let hasDeletedAt: boolean | null = null\n\n sanitized.fields.some((field) => {\n if (fieldAffectsData(field)) {\n if (field.name === 'updatedAt') {\n hasUpdatedAt = true\n }\n\n if (field.name === 'createdAt') {\n hasCreatedAt = true\n }\n\n if (field.name === 'deletedAt') {\n hasDeletedAt = true\n }\n }\n\n return hasCreatedAt && hasUpdatedAt && (!sanitized.trash || hasDeletedAt)\n })\n\n if (!hasUpdatedAt) {\n sanitized.fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n index: true,\n label: ({ t }) => t('general:updatedAt'),\n })\n }\n\n if (!hasCreatedAt) {\n sanitized.fields.push({\n name: 'createdAt',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n // The default sort for list view is createdAt. Thus, enabling indexing by default, is a major performance improvement, especially for large or a large amount of collections.\n type: 'date',\n index: true,\n label: ({ t }) => t('general:createdAt'),\n })\n }\n\n if (sanitized.trash && !hasDeletedAt) {\n sanitized.fields.push({\n name: 'deletedAt',\n type: 'date',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n index: true,\n label: ({ t }) => t('general:deletedAt'),\n })\n }\n }\n\n const defaultLabels = formatLabels(sanitized.slug)\n\n sanitized.labels = {\n plural: sanitized.labels?.plural || defaultLabels.plural,\n singular: sanitized.labels?.singular || defaultLabels.singular,\n }\n\n if (sanitized.versions) {\n if (sanitized.timestamps === false) {\n throw new TimestampsRequired(collection)\n }\n\n if (sanitized.versions === true) {\n sanitized.versions = {\n drafts: false,\n maxPerDoc: 100,\n }\n }\n\n sanitized.versions.maxPerDoc =\n typeof sanitized.versions.maxPerDoc === 'number' ? sanitized.versions.maxPerDoc : 100\n\n if (sanitized.versions.drafts) {\n if (sanitized.versions.drafts === true) {\n sanitized.versions.drafts = {\n autosave: false,\n validate: false,\n }\n }\n\n const hasLocalizedFields = traverseForLocalizedFields(sanitized.fields)\n\n if (config.localization) {\n if (hasLocalizedFields && sanitized.versions.drafts.localizeStatus === undefined) {\n sanitized.versions.drafts.localizeStatus = false\n }\n }\n\n // TODO v4: remove this sanitization check, should not need to enable the experimental flag\n if (sanitized.versions.drafts.localizeStatus && !config.experimental?.localizeStatus) {\n sanitized.versions.drafts.localizeStatus = false\n console.log(\n miniChalk.yellowBold(\n `Warning: \"localizeStatus\" for drafts is an experimental feature. To enable, set \"experimental.localizeStatus\" to true in your Payload config.`,\n ),\n )\n }\n\n if (sanitized.versions.drafts.autosave === true) {\n sanitized.versions.drafts.autosave = {\n interval: versionDefaults.autosaveInterval,\n }\n }\n\n if (sanitized.versions.drafts.validate === undefined) {\n sanitized.versions.drafts.validate = false\n }\n\n sanitized.fields = mergeBaseFields(\n sanitized.fields,\n baseVersionFields({\n localized: sanitized.versions.drafts.localizeStatus ?? false,\n }),\n )\n }\n } else {\n delete sanitized.versions\n }\n\n if (sanitized.folders === true) {\n sanitized.folders = {\n browseByFolder: true,\n }\n } else if (sanitized.folders) {\n sanitized.folders.browseByFolder = sanitized.folders.browseByFolder ?? true\n }\n\n if (sanitized.upload) {\n if (sanitized.upload === true) {\n sanitized.upload = {}\n }\n\n sanitized.upload.cacheTags = sanitized.upload?.cacheTags ?? true\n sanitized.upload.bulkUpload = sanitized.upload?.bulkUpload ?? true\n sanitized.upload.staticDir = sanitized.upload.staticDir || sanitized.slug\n sanitized.admin!.useAsTitle =\n sanitized.admin?.useAsTitle && sanitized.admin.useAsTitle !== 'id'\n ? sanitized.admin.useAsTitle\n : 'filename'\n\n const uploadFields = getBaseUploadFields({\n collection: sanitized,\n config,\n })\n\n sanitized.fields = mergeBaseFields(sanitized.fields, uploadFields)\n }\n\n if (sanitized.auth) {\n sanitized.auth = addDefaultsToAuthConfig(\n typeof sanitized.auth === 'boolean' ? {} : sanitized.auth,\n )\n\n if (sanitized.auth.loginWithUsername) {\n if (sanitized.auth.loginWithUsername === true) {\n sanitized.auth.loginWithUsername = addDefaultsToLoginWithUsernameConfig({})\n } else {\n const loginWithUsernameWithDefaults = addDefaultsToLoginWithUsernameConfig(\n sanitized.auth.loginWithUsername,\n )\n\n // if allowEmailLogin is false, requireUsername must be true\n if (loginWithUsernameWithDefaults.allowEmailLogin === false) {\n loginWithUsernameWithDefaults.requireUsername = true\n }\n sanitized.auth.loginWithUsername = loginWithUsernameWithDefaults\n }\n } else {\n sanitized.auth.loginWithUsername = false\n }\n\n if (!collection?.admin?.useAsTitle) {\n sanitized.admin!.useAsTitle = sanitized.auth.loginWithUsername ? 'username' : 'email'\n }\n\n if (sanitized.auth.useAPIKey) {\n sanitized.hooks!.beforeRead!.unshift(omitAPIKey)\n }\n\n sanitized.fields = mergeBaseFields(\n sanitized.fields,\n getBaseAuthFields(sanitized.auth, sanitized.fields),\n )\n }\n\n if (collection?.admin?.pagination?.limits?.length) {\n sanitized.admin!.pagination!.limits = collection.admin.pagination.limits\n }\n\n validateUseAsTitle(sanitized)\n\n const sanitizedConfig = sanitized as SanitizedCollectionConfig\n\n sanitizedConfig.joins = joins\n sanitizedConfig.polymorphicJoins = polymorphicJoins\n\n sanitizedConfig.flattenedFields = flattenAllFields({ fields: sanitizedConfig.fields })\n\n sanitizedConfig.sanitizedIndexes = sanitizeCompoundIndexes({\n fields: sanitizedConfig.flattenedFields,\n indexes: sanitizedConfig.indexes,\n })\n\n return sanitizedConfig\n}\n"],"names":["omitAPIKey","apiKeyRevealEndpoint","authCollectionEndpoints","getBaseAuthFields","TimestampsRequired","sanitizeFields","fieldAffectsData","mergeBaseFields","uploadCollectionEndpoints","getBaseUploadFields","flattenAllFields","formatLabels","miniChalk","traverseForLocalizedFields","baseVersionFields","versionDefaults","defaultCollectionEndpoints","duplicateEndpoint","addDefaultsToAuthConfig","addDefaultsToCollectionConfig","addDefaultsToLoginWithUsernameConfig","sanitizeCompoundIndexes","validateUseAsTitle","warnOnInvalidCustomViews","collection","views","admin","components","key","view","Object","entries","console","warn","slug","sanitizeCollection","config","richTextSanitizationPromises","_validRelationships","orderableJoins","_sanitized","sanitized","validRelationships","collections","map","c","joins","polymorphicJoins","fields","collectionConfig","joinPath","parentIsLocalized","auth","disableDuplicate","endpoints","endpoint","push","useAPIKey","reveal","upload","timestamps","hasUpdatedAt","hasCreatedAt","hasDeletedAt","some","field","name","trash","type","disableBulkEdit","hidden","index","label","t","defaultLabels","labels","plural","singular","versions","drafts","maxPerDoc","autosave","validate","hasLocalizedFields","localization","localizeStatus","undefined","experimental","log","yellowBold","interval","autosaveInterval","localized","folders","browseByFolder","cacheTags","bulkUpload","staticDir","useAsTitle","uploadFields","loginWithUsername","loginWithUsernameWithDefaults","allowEmailLogin","requireUsername","hooks","beforeRead","unshift","pagination","limits","length","sanitizedConfig","flattenedFields","sanitizedIndexes","indexes"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  import type { Endpoint } from '../../config/types.js';
2
+ export declare const duplicateEndpoint: Endpoint;
2
3
  export declare const defaultCollectionEndpoints: Endpoint[];
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/collections/endpoints/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAkBrD,eAAO,MAAM,0BAA0B,EAAE,QAAQ,EA0EhD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/collections/endpoints/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAkBrD,eAAO,MAAM,iBAAiB,EAAE,QAI/B,CAAA;AAED,eAAO,MAAM,0BAA0B,EAAE,QAAQ,EAsEhD,CAAA"}
@@ -13,6 +13,11 @@ import { findVersionsHandler } from './findVersions.js';
13
13
  import { restoreVersionHandler } from './restoreVersion.js';
14
14
  import { updateHandler } from './update.js';
15
15
  import { updateByIDHandler } from './updateByID.js';
16
+ export const duplicateEndpoint = {
17
+ handler: duplicateHandler,
18
+ method: 'post',
19
+ path: '/:id/duplicate'
20
+ };
16
21
  export const defaultCollectionEndpoints = [
17
22
  ...wrapInternalEndpoints([
18
23
  {
@@ -51,11 +56,7 @@ export const defaultCollectionEndpoints = [
51
56
  // method: 'get',
52
57
  // path: '/distinct',
53
58
  // },
54
- {
55
- handler: duplicateHandler,
56
- method: 'post',
57
- path: '/:id/duplicate'
58
- },
59
+ duplicateEndpoint,
59
60
  {
60
61
  handler: findHandler,
61
62
  method: 'get',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/collections/endpoints/index.ts"],"sourcesContent":["import type { Endpoint } from '../../config/types.js'\n\nimport { wrapInternalEndpoints } from '../../utilities/wrapInternalEndpoints.js'\nimport { countHandler } from './count.js'\nimport { createHandler } from './create.js'\nimport { deleteHandler } from './delete.js'\nimport { deleteByIDHandler } from './deleteByID.js'\nimport { docAccessHandler } from './docAccess.js'\nimport { duplicateHandler } from './duplicate.js'\nimport { findHandler } from './find.js'\nimport { findByIDHandler } from './findByID.js'\n// import { findDistinctHandler } from './findDistinct.js'\nimport { findVersionByIDHandler } from './findVersionByID.js'\nimport { findVersionsHandler } from './findVersions.js'\nimport { restoreVersionHandler } from './restoreVersion.js'\nimport { updateHandler } from './update.js'\nimport { updateByIDHandler } from './updateByID.js'\n\nexport const defaultCollectionEndpoints: Endpoint[] = [\n ...wrapInternalEndpoints([\n {\n handler: countHandler,\n method: 'get',\n path: '/count',\n },\n {\n handler: createHandler,\n method: 'post',\n path: '/',\n },\n {\n handler: deleteHandler,\n method: 'delete',\n path: '/',\n },\n {\n handler: deleteByIDHandler,\n method: 'delete',\n path: '/:id',\n },\n {\n handler: docAccessHandler,\n method: 'post',\n path: '/access/:id?',\n },\n {\n handler: findVersionsHandler,\n method: 'get',\n path: '/versions',\n },\n // Might be uncommented in the future\n // {\n // handler: findDistinctHandler,\n // method: 'get',\n // path: '/distinct',\n // },\n {\n handler: duplicateHandler,\n method: 'post',\n path: '/:id/duplicate',\n },\n {\n handler: findHandler,\n method: 'get',\n path: '/',\n },\n {\n handler: findByIDHandler,\n method: 'get',\n path: '/:id',\n },\n {\n handler: findVersionByIDHandler,\n method: 'get',\n path: '/versions/:id',\n },\n {\n handler: restoreVersionHandler,\n method: 'post',\n path: '/versions/:id',\n },\n {\n handler: updateHandler,\n method: 'patch',\n path: '/',\n },\n {\n handler: updateByIDHandler,\n method: 'patch',\n path: '/:id',\n },\n ]),\n]\n"],"names":["wrapInternalEndpoints","countHandler","createHandler","deleteHandler","deleteByIDHandler","docAccessHandler","duplicateHandler","findHandler","findByIDHandler","findVersionByIDHandler","findVersionsHandler","restoreVersionHandler","updateHandler","updateByIDHandler","defaultCollectionEndpoints","handler","method","path"],"mappings":"AAEA,SAASA,qBAAqB,QAAQ,2CAA0C;AAChF,SAASC,YAAY,QAAQ,aAAY;AACzC,SAASC,aAAa,QAAQ,cAAa;AAC3C,SAASC,aAAa,QAAQ,cAAa;AAC3C,SAASC,iBAAiB,QAAQ,kBAAiB;AACnD,SAASC,gBAAgB,QAAQ,iBAAgB;AACjD,SAASC,gBAAgB,QAAQ,iBAAgB;AACjD,SAASC,WAAW,QAAQ,YAAW;AACvC,SAASC,eAAe,QAAQ,gBAAe;AAC/C,0DAA0D;AAC1D,SAASC,sBAAsB,QAAQ,uBAAsB;AAC7D,SAASC,mBAAmB,QAAQ,oBAAmB;AACvD,SAASC,qBAAqB,QAAQ,sBAAqB;AAC3D,SAASC,aAAa,QAAQ,cAAa;AAC3C,SAASC,iBAAiB,QAAQ,kBAAiB;AAEnD,OAAO,MAAMC,6BAAyC;OACjDd,sBAAsB;QACvB;YACEe,SAASd;YACTe,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASb;YACTc,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASZ;YACTa,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASX;YACTY,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASV;YACTW,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASL;YACTM,QAAQ;YACRC,MAAM;QACR;QACA,qCAAqC;QACrC,IAAI;QACJ,kCAAkC;QAClC,mBAAmB;QACnB,uBAAuB;QACvB,KAAK;QACL;YACEF,SAAST;YACTU,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASR;YACTS,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASP;YACTQ,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASN;YACTO,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASJ;YACTK,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASH;YACTI,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASF;YACTG,QAAQ;YACRC,MAAM;QACR;KACD;CACF,CAAA"}
1
+ {"version":3,"sources":["../../../src/collections/endpoints/index.ts"],"sourcesContent":["import type { Endpoint } from '../../config/types.js'\n\nimport { wrapInternalEndpoints } from '../../utilities/wrapInternalEndpoints.js'\nimport { countHandler } from './count.js'\nimport { createHandler } from './create.js'\nimport { deleteHandler } from './delete.js'\nimport { deleteByIDHandler } from './deleteByID.js'\nimport { docAccessHandler } from './docAccess.js'\nimport { duplicateHandler } from './duplicate.js'\nimport { findHandler } from './find.js'\nimport { findByIDHandler } from './findByID.js'\n// import { findDistinctHandler } from './findDistinct.js'\nimport { findVersionByIDHandler } from './findVersionByID.js'\nimport { findVersionsHandler } from './findVersions.js'\nimport { restoreVersionHandler } from './restoreVersion.js'\nimport { updateHandler } from './update.js'\nimport { updateByIDHandler } from './updateByID.js'\n\nexport const duplicateEndpoint: Endpoint = {\n handler: duplicateHandler,\n method: 'post',\n path: '/:id/duplicate',\n}\n\nexport const defaultCollectionEndpoints: Endpoint[] = [\n ...wrapInternalEndpoints([\n {\n handler: countHandler,\n method: 'get',\n path: '/count',\n },\n {\n handler: createHandler,\n method: 'post',\n path: '/',\n },\n {\n handler: deleteHandler,\n method: 'delete',\n path: '/',\n },\n {\n handler: deleteByIDHandler,\n method: 'delete',\n path: '/:id',\n },\n {\n handler: docAccessHandler,\n method: 'post',\n path: '/access/:id?',\n },\n {\n handler: findVersionsHandler,\n method: 'get',\n path: '/versions',\n },\n // Might be uncommented in the future\n // {\n // handler: findDistinctHandler,\n // method: 'get',\n // path: '/distinct',\n // },\n duplicateEndpoint,\n {\n handler: findHandler,\n method: 'get',\n path: '/',\n },\n {\n handler: findByIDHandler,\n method: 'get',\n path: '/:id',\n },\n {\n handler: findVersionByIDHandler,\n method: 'get',\n path: '/versions/:id',\n },\n {\n handler: restoreVersionHandler,\n method: 'post',\n path: '/versions/:id',\n },\n {\n handler: updateHandler,\n method: 'patch',\n path: '/',\n },\n {\n handler: updateByIDHandler,\n method: 'patch',\n path: '/:id',\n },\n ]),\n]\n"],"names":["wrapInternalEndpoints","countHandler","createHandler","deleteHandler","deleteByIDHandler","docAccessHandler","duplicateHandler","findHandler","findByIDHandler","findVersionByIDHandler","findVersionsHandler","restoreVersionHandler","updateHandler","updateByIDHandler","duplicateEndpoint","handler","method","path","defaultCollectionEndpoints"],"mappings":"AAEA,SAASA,qBAAqB,QAAQ,2CAA0C;AAChF,SAASC,YAAY,QAAQ,aAAY;AACzC,SAASC,aAAa,QAAQ,cAAa;AAC3C,SAASC,aAAa,QAAQ,cAAa;AAC3C,SAASC,iBAAiB,QAAQ,kBAAiB;AACnD,SAASC,gBAAgB,QAAQ,iBAAgB;AACjD,SAASC,gBAAgB,QAAQ,iBAAgB;AACjD,SAASC,WAAW,QAAQ,YAAW;AACvC,SAASC,eAAe,QAAQ,gBAAe;AAC/C,0DAA0D;AAC1D,SAASC,sBAAsB,QAAQ,uBAAsB;AAC7D,SAASC,mBAAmB,QAAQ,oBAAmB;AACvD,SAASC,qBAAqB,QAAQ,sBAAqB;AAC3D,SAASC,aAAa,QAAQ,cAAa;AAC3C,SAASC,iBAAiB,QAAQ,kBAAiB;AAEnD,OAAO,MAAMC,oBAA8B;IACzCC,SAAST;IACTU,QAAQ;IACRC,MAAM;AACR,EAAC;AAED,OAAO,MAAMC,6BAAyC;OACjDlB,sBAAsB;QACvB;YACEe,SAASd;YACTe,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASb;YACTc,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASZ;YACTa,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASX;YACTY,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASV;YACTW,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASL;YACTM,QAAQ;YACRC,MAAM;QACR;QACA,qCAAqC;QACrC,IAAI;QACJ,kCAAkC;QAClC,mBAAmB;QACnB,uBAAuB;QACvB,KAAK;QACLH;QACA;YACEC,SAASR;YACTS,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASP;YACTQ,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASN;YACTO,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASJ;YACTK,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASH;YACTI,QAAQ;YACRC,MAAM;QACR;QACA;YACEF,SAASF;YACTG,QAAQ;YACRC,MAAM;QACR;KACD;CACF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/create.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAc,MAAM,gBAAgB,CAAA;AAC7E,OAAO,KAAK,EAEV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,6BAA6B,EAC9B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EACV,UAAU,EACV,sBAAsB,EACtB,8BAA8B,EAC9B,wBAAwB,EACzB,MAAM,oBAAoB,CAAA;AA4B3B,MAAM,MAAM,SAAS,CAAC,KAAK,SAAS,cAAc,IAAI;IACpD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,UAAU,EAAE,UAAU,CAAA;IACtB,IAAI,EAAE,8BAA8B,CAAC,KAAK,CAAC,CAAA;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,eAAe,CAAC,EAAE,sBAAsB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAA;IACrD,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,GAAG,EAAE,cAAc,CAAA;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAA;AAElD,eAAO,MAAM,eAAe,GAC1B,KAAK,SAAS,cAAc,EAC5B,OAAO,SAAS,wBAAwB,CAAC,KAAK,CAAC,gBAEjC,SAAS,CAAC,KAAK,CAAC,KAC7B,OAAO,CAAC,6BAA6B,CAAC,KAAK,EAAE,OAAO,CAAC,CA8YvD,CAAA"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/create.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAc,MAAM,gBAAgB,CAAA;AAC7E,OAAO,KAAK,EAEV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,6BAA6B,EAC9B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EACV,UAAU,EACV,sBAAsB,EACtB,8BAA8B,EAC9B,wBAAwB,EACzB,MAAM,oBAAoB,CAAA;AAyC3B,MAAM,MAAM,SAAS,CAAC,KAAK,SAAS,cAAc,IAAI;IACpD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,UAAU,EAAE,UAAU,CAAA;IACtB,IAAI,EAAE,8BAA8B,CAAC,KAAK,CAAC,CAAA;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,eAAe,CAAC,EAAE,sBAAsB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAA;IACrD,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,GAAG,EAAE,cAAc,CAAA;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAA;AAElD,eAAO,MAAM,eAAe,GAC1B,KAAK,SAAS,cAAc,EAC5B,OAAO,SAAS,wBAAwB,CAAC,KAAK,CAAC,gBAEjC,SAAS,CAAC,KAAK,CAAC,KAC7B,OAAO,CAAC,6BAA6B,CAAC,KAAK,EAAE,OAAO,CAAC,CA6fvD,CAAA"}
@@ -4,12 +4,14 @@ import { executeAccess } from '../../auth/executeAccess.js';
4
4
  import { sendVerificationEmail } from '../../auth/sendVerificationEmail.js';
5
5
  import { registerLocalStrategy } from '../../auth/strategies/local/register.js';
6
6
  import { getDuplicateDocumentData } from '../../duplicateDocument/index.js';
7
+ import { APIError } from '../../errors/index.js';
7
8
  import { afterChange } from '../../fields/hooks/afterChange/index.js';
8
9
  import { afterRead } from '../../fields/hooks/afterRead/index.js';
9
10
  import { beforeChange } from '../../fields/hooks/beforeChange/index.js';
10
11
  import { beforeValidate } from '../../fields/hooks/beforeValidate/index.js';
11
12
  import { saveVersion } from '../../index.js';
12
13
  import { generateFileData } from '../../uploads/generateFileData.js';
14
+ import { getExternalUploadSource, getUploadDestination, sanitizeUploadData } from '../../uploads/sanitizeUploadData.js';
13
15
  import { unlinkTempFiles } from '../../uploads/unlinkTempFiles.js';
14
16
  import { uploadFiles } from '../../uploads/uploadFiles.js';
15
17
  import { commitTransaction } from '../../utilities/commitTransaction.js';
@@ -18,12 +20,48 @@ import { initTransaction } from '../../utilities/initTransaction.js';
18
20
  import { killTransaction } from '../../utilities/killTransaction.js';
19
21
  import { sanitizeInternalFields } from '../../utilities/sanitizeInternalFields.js';
20
22
  import { sanitizeSelect } from '../../utilities/sanitizeSelect.js';
23
+ import { buildAllLocalesPublicationHookDoc, getAllLocalesPublicationStatus, hasAuthorizedAllLocalesPublicationStatus, normalizeAllLocalesPublicationStatus, reconcileAllLocalesPublicationStatus } from '../../versions/allLocalesPublicationStatus.js';
21
24
  import { buildAfterOperation } from './utilities/buildAfterOperation.js';
22
25
  import { buildBeforeOperation } from './utilities/buildBeforeOperation.js';
23
26
  export const createOperation = async (incomingArgs)=>{
24
27
  let args = incomingArgs;
28
+ let externalUploadSource;
25
29
  try {
26
30
  const shouldCommit = !args.disableTransaction && await initTransaction(args.req);
31
+ // Keep a remote URL only as an ephemeral file source, then strip all submitted generated
32
+ // identity before untrusted create hooks run. The fetched file receives new server-owned
33
+ // identity before persistence.
34
+ if (args.collection.config.upload && !args.overrideAccess) {
35
+ externalUploadSource = getExternalUploadSource(args.data);
36
+ const { objectKey, prefix } = getUploadDestination({
37
+ data: args.data,
38
+ file: args.req.file
39
+ });
40
+ const sanitizedData = sanitizeUploadData(args.data, 'create');
41
+ args = {
42
+ ...args,
43
+ data: typeof sanitizedData === 'object' && sanitizedData !== null ? {
44
+ ...sanitizedData,
45
+ ...prefix !== undefined ? {
46
+ prefix
47
+ } : {},
48
+ ...objectKey !== undefined ? {
49
+ _objectKey: objectKey
50
+ } : {}
51
+ } : sanitizedData
52
+ };
53
+ }
54
+ const initialCollectionConfig = args.collection.config;
55
+ const initialPublishAllLocales = !args.draft && (args.publishAllLocales ?? !hasLocalizeStatusEnabled(initialCollectionConfig));
56
+ const initialAllLocalesPublicationStatus = getAllLocalesPublicationStatus({
57
+ hasLocalizedStatus: Boolean(args.req.payload.config.localization && hasLocalizeStatusEnabled(initialCollectionConfig)),
58
+ publishAllLocales: initialPublishAllLocales,
59
+ unpublishAllLocales: false
60
+ });
61
+ const initialAllLocalesPublicationIntent = normalizeAllLocalesPublicationStatus({
62
+ data: args.data,
63
+ status: initialAllLocalesPublicationStatus
64
+ });
27
65
  ensureUsernameOrEmail({
28
66
  authOptions: args.collection.config.auth,
29
67
  collectionSlug: args.collection.config.slug,
@@ -45,14 +83,32 @@ export const createOperation = async (incomingArgs)=>{
45
83
  }
46
84
  const { autosave = false, collection: { config: collectionConfig }, collection, depth, disableVerificationEmail, draft = false, duplicateFromID, overrideAccess, overwriteExistingFiles = false, populate, publishAllLocales: publishAllLocalesArg, publishSpecificLocale, req: { fallbackLocale, locale, payload, payload: { config } }, req, select: incomingSelect, selectedLocales, showHiddenFields } = args;
47
85
  let { data } = args;
48
- const publishAllLocales = !draft && (publishAllLocalesArg ?? (hasLocalizeStatusEnabled(collectionConfig) ? false : true));
86
+ // For creates there is no existing doc — always publish all locales when not a draft.
87
+ let publishAllLocales = !draft && (publishAllLocalesArg ?? !hasLocalizeStatusEnabled(collectionConfig));
88
+ const requestedAllLocalesPublicationStatus = getAllLocalesPublicationStatus({
89
+ hasLocalizedStatus: Boolean(config.localization && hasLocalizeStatusEnabled(collectionConfig)),
90
+ publishAllLocales,
91
+ unpublishAllLocales: false
92
+ });
93
+ const allLocalesPublicationStatus = reconcileAllLocalesPublicationStatus({
94
+ data,
95
+ intent: initialAllLocalesPublicationIntent,
96
+ status: requestedAllLocalesPublicationStatus
97
+ });
98
+ if (requestedAllLocalesPublicationStatus && !allLocalesPublicationStatus) {
99
+ publishAllLocales = false;
100
+ }
49
101
  const isSavingDraft = Boolean(draft && hasDraftsEnabled(collectionConfig) && !publishAllLocales);
50
102
  if (isSavingDraft) {
51
103
  data._status = 'draft';
52
104
  }
105
+ const isDuplicating = duplicateFromID !== undefined && duplicateFromID !== null;
106
+ if (isDuplicating && collectionConfig.disableDuplicate === true) {
107
+ throw new APIError(`The collection with slug ${String(collectionConfig.slug)} cannot be duplicated.`, 400);
108
+ }
53
109
  let duplicatedFromDocWithLocales = {};
54
110
  let duplicatedFromDoc = {};
55
- if (duplicateFromID) {
111
+ if (isDuplicating) {
56
112
  const duplicateResult = await getDuplicateDocumentData({
57
113
  id: duplicateFromID,
58
114
  collectionConfig,
@@ -81,7 +137,8 @@ export const createOperation = async (incomingArgs)=>{
81
137
  config,
82
138
  data,
83
139
  draft: isSavingDraft,
84
- isDuplicating: Boolean(duplicateFromID),
140
+ externalUploadSource,
141
+ isDuplicating,
85
142
  operation: 'create',
86
143
  originalDoc: duplicatedFromDoc,
87
144
  overwriteExistingFiles,
@@ -92,16 +149,34 @@ export const createOperation = async (incomingArgs)=>{
92
149
  // /////////////////////////////////////
93
150
  // beforeValidate - Fields
94
151
  // /////////////////////////////////////
152
+ let statusFieldAccess = false;
153
+ const publicationFieldPolicyDoc = buildAllLocalesPublicationHookDoc({
154
+ doc: duplicatedFromDoc,
155
+ docWithLocales: duplicatedFromDocWithLocales,
156
+ status: allLocalesPublicationStatus
157
+ });
95
158
  data = await beforeValidate({
96
159
  collection: collectionConfig,
97
160
  context: req.context,
98
161
  data,
99
162
  doc: duplicatedFromDoc,
163
+ docForHooks: publicationFieldPolicyDoc,
100
164
  global: null,
165
+ onFieldAccess: ({ accessResult, path })=>{
166
+ if (path === '_status') {
167
+ statusFieldAccess = accessResult;
168
+ }
169
+ },
101
170
  operation: 'create',
102
171
  overrideAccess: overrideAccess,
103
172
  req
104
173
  });
174
+ const publicationStatusIsAuthorized = statusFieldAccess && data._status === allLocalesPublicationStatus;
175
+ const publicationHookDoc = buildAllLocalesPublicationHookDoc({
176
+ doc: duplicatedFromDoc,
177
+ docWithLocales: duplicatedFromDocWithLocales,
178
+ status: publicationStatusIsAuthorized ? allLocalesPublicationStatus : undefined
179
+ });
105
180
  // /////////////////////////////////////
106
181
  // beforeValidate - Collections
107
182
  // /////////////////////////////////////
@@ -112,7 +187,7 @@ export const createOperation = async (incomingArgs)=>{
112
187
  context: req.context,
113
188
  data,
114
189
  operation: 'create',
115
- originalDoc: duplicatedFromDoc,
190
+ originalDoc: publicationHookDoc,
116
191
  req
117
192
  }) || data;
118
193
  }
@@ -127,27 +202,49 @@ export const createOperation = async (incomingArgs)=>{
127
202
  context: req.context,
128
203
  data,
129
204
  operation: 'create',
130
- originalDoc: duplicatedFromDoc,
205
+ originalDoc: publicationHookDoc,
131
206
  req
132
207
  }) || data;
133
208
  }
134
209
  }
210
+ const publicationData = {
211
+ ...data
212
+ };
135
213
  // /////////////////////////////////////
136
214
  // beforeChange - Fields
137
215
  // /////////////////////////////////////
216
+ let statusFieldValue;
217
+ const docWithLocalesForFields = !statusFieldAccess ? {
218
+ ...duplicatedFromDocWithLocales,
219
+ _status: {}
220
+ } : duplicatedFromDocWithLocales;
138
221
  const resultWithLocales = await beforeChange({
139
222
  collection: collectionConfig,
140
223
  context: req.context,
141
224
  data,
142
- doc: duplicatedFromDoc,
143
- docWithLocales: duplicatedFromDocWithLocales,
225
+ doc: publicationHookDoc,
226
+ docWithLocales: docWithLocalesForFields,
144
227
  global: null,
228
+ onDataProcessed: (processedData)=>{
229
+ statusFieldValue = processedData._status;
230
+ },
145
231
  operation: 'create',
146
232
  overrideAccess,
147
233
  req,
148
234
  skipValidation: isSavingDraft && !hasDraftValidationEnabled(collectionConfig)
149
235
  });
150
- if (config.localization && collectionConfig.versions && collectionConfig.versions.drafts && collectionConfig.versions.drafts.localizeStatus && publishAllLocales) {
236
+ const hasAuthorizedPublicationStatus = hasAuthorizedAllLocalesPublicationStatus({
237
+ data: publicationData,
238
+ fieldAccessDenied: !statusFieldAccess,
239
+ fieldValue: statusFieldValue,
240
+ status: allLocalesPublicationStatus
241
+ });
242
+ if (allLocalesPublicationStatus && !hasAuthorizedPublicationStatus && statusFieldAccess && typeof statusFieldValue === 'undefined' && typeof duplicatedFromDocWithLocales._status === 'object' && duplicatedFromDocWithLocales._status !== null) {
243
+ resultWithLocales._status = {
244
+ ...duplicatedFromDocWithLocales._status
245
+ };
246
+ }
247
+ if (config.localization && hasLocalizeStatusEnabled(collectionConfig) && hasAuthorizedPublicationStatus) {
151
248
  let accessibleLocaleCodes = config.localization.localeCodes;
152
249
  if (config.localization.filterAvailableLocales) {
153
250
  const filteredLocales = await config.localization.filterAvailableLocales({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/collections/operations/create.ts"],"sourcesContent":["import crypto from 'crypto'\n\nimport type { CollectionSlug, FindOptions, JsonObject } from '../../index.js'\nimport type {\n Document,\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformCollectionWithSelect,\n} from '../../types/index.js'\nimport type {\n Collection,\n DataFromCollectionSlug,\n RequiredDataFromCollectionSlug,\n SelectFromCollectionSlug,\n} from '../config/types.js'\n\nimport { ensureUsernameOrEmail } from '../../auth/ensureUsernameOrEmail.js'\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { sendVerificationEmail } from '../../auth/sendVerificationEmail.js'\nimport { registerLocalStrategy } from '../../auth/strategies/local/register.js'\nimport { getDuplicateDocumentData } from '../../duplicateDocument/index.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 { saveVersion } from '../../index.js'\nimport { generateFileData } from '../../uploads/generateFileData.js'\nimport { unlinkTempFiles } from '../../uploads/unlinkTempFiles.js'\nimport { uploadFiles } from '../../uploads/uploadFiles.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport {\n hasDraftsEnabled,\n hasDraftValidationEnabled,\n hasLocalizeStatusEnabled,\n} from '../../utilities/getVersionsConfig.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizeInternalFields } from '../../utilities/sanitizeInternalFields.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\n\nexport type Arguments<TSlug extends CollectionSlug> = {\n autosave?: boolean\n collection: Collection\n data: RequiredDataFromCollectionSlug<TSlug>\n depth?: number\n disableTransaction?: boolean\n disableVerificationEmail?: boolean\n draft?: boolean\n duplicateFromID?: DataFromCollectionSlug<TSlug>['id']\n overrideAccess?: boolean\n overwriteExistingFiles?: boolean\n populate?: PopulateType\n publishAllLocales?: boolean\n publishSpecificLocale?: string\n req: PayloadRequest\n selectedLocales?: string[]\n showHiddenFields?: boolean\n} & Pick<FindOptions<TSlug, SelectType>, 'select'>\n\nexport const createOperation = async <\n TSlug extends CollectionSlug,\n TSelect extends SelectFromCollectionSlug<TSlug>,\n>(\n incomingArgs: Arguments<TSlug>,\n): Promise<TransformCollectionWithSelect<TSlug, TSelect>> => {\n let args = incomingArgs\n\n try {\n const shouldCommit = !args.disableTransaction && (await initTransaction(args.req))\n\n ensureUsernameOrEmail<TSlug>({\n authOptions: args.collection.config.auth,\n collectionSlug: args.collection.config.slug,\n data: args.data,\n operation: 'create',\n req: args.req,\n })\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'create',\n overrideAccess: args.overrideAccess!,\n })\n\n if (args.publishSpecificLocale) {\n args.req.locale = args.publishSpecificLocale\n }\n\n const {\n autosave = false,\n collection: { config: collectionConfig },\n collection,\n depth,\n disableVerificationEmail,\n draft = false,\n duplicateFromID,\n overrideAccess,\n overwriteExistingFiles = false,\n populate,\n publishAllLocales: publishAllLocalesArg,\n publishSpecificLocale,\n req: {\n fallbackLocale,\n locale,\n payload,\n payload: { config },\n },\n req,\n select: incomingSelect,\n selectedLocales,\n showHiddenFields,\n } = args\n\n let { data } = args\n\n const publishAllLocales =\n !draft &&\n (publishAllLocalesArg ?? (hasLocalizeStatusEnabled(collectionConfig) ? false : true))\n const isSavingDraft = Boolean(draft && hasDraftsEnabled(collectionConfig) && !publishAllLocales)\n\n if (isSavingDraft) {\n data._status = 'draft'\n }\n\n let duplicatedFromDocWithLocales: JsonObject = {}\n let duplicatedFromDoc: JsonObject = {}\n\n if (duplicateFromID) {\n const duplicateResult = await getDuplicateDocumentData({\n id: duplicateFromID,\n collectionConfig,\n draftArg: isSavingDraft,\n overrideAccess,\n req,\n selectedLocales,\n })\n\n duplicatedFromDoc = duplicateResult.duplicatedFromDoc\n duplicatedFromDocWithLocales = duplicateResult.duplicatedFromDocWithLocales\n }\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n if (!overrideAccess) {\n await executeAccess({ data, req }, collectionConfig.access.create)\n }\n\n // /////////////////////////////////////\n // Generate data for all files and sizes\n // /////////////////////////////////////\n\n const { data: newFileData, files: filesToUpload } = await generateFileData({\n collection,\n config,\n data,\n draft: isSavingDraft,\n isDuplicating: Boolean(duplicateFromID),\n operation: 'create',\n originalDoc: duplicatedFromDoc,\n overwriteExistingFiles,\n req,\n throwOnMissingFile:\n !isSavingDraft && collection.config.upload.filesRequiredOnCreate !== false,\n })\n\n data = newFileData\n\n // /////////////////////////////////////\n // beforeValidate - Fields\n // /////////////////////////////////////\n\n data = await beforeValidate({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: duplicatedFromDoc,\n global: null,\n operation: 'create',\n overrideAccess: overrideAccess!,\n req,\n })\n\n // /////////////////////////////////////\n // beforeValidate - Collections\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: 'create',\n originalDoc: duplicatedFromDoc,\n req,\n })) || data\n }\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: 'create',\n originalDoc: duplicatedFromDoc,\n req,\n })) || data\n }\n }\n\n // /////////////////////////////////////\n // beforeChange - Fields\n // /////////////////////////////////////\n\n const resultWithLocales = await beforeChange<JsonObject>({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: duplicatedFromDoc,\n docWithLocales: duplicatedFromDocWithLocales,\n global: null,\n operation: 'create',\n overrideAccess,\n req,\n skipValidation: isSavingDraft && !hasDraftValidationEnabled(collectionConfig),\n })\n\n if (\n config.localization &&\n collectionConfig.versions &&\n collectionConfig.versions.drafts &&\n collectionConfig.versions.drafts.localizeStatus &&\n publishAllLocales\n ) {\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 resultWithLocales._status !== 'object' || resultWithLocales._status === null) {\n resultWithLocales._status = {}\n }\n\n for (const localeCode of accessibleLocaleCodes) {\n resultWithLocales._status[localeCode] = 'published'\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 // Create\n // /////////////////////////////////////\n\n let doc\n\n const select = sanitizeSelect({\n fields: collectionConfig.flattenedFields,\n forceSelect: collectionConfig.forceSelect,\n select: incomingSelect,\n })\n\n if (collectionConfig.auth && !collectionConfig.auth.disableLocalStrategy) {\n if (collectionConfig.auth.verify) {\n resultWithLocales._verified = Boolean(resultWithLocales._verified) || false\n resultWithLocales._verificationToken = crypto.randomBytes(20).toString('hex')\n }\n\n doc = await registerLocalStrategy({\n collection: collectionConfig,\n doc: resultWithLocales,\n password: data.password as string,\n payload: req.payload,\n req,\n })\n } else {\n doc = await payload.db.create({\n collection: collectionConfig.slug,\n data: resultWithLocales,\n req,\n })\n }\n\n const verificationToken = doc._verificationToken\n let result: Document = sanitizeInternalFields(doc)\n\n // /////////////////////////////////////\n // Add collection property for auth collections\n // /////////////////////////////////////\n\n if (collectionConfig.auth) {\n result = { ...result, collection: collectionConfig.slug }\n }\n\n // /////////////////////////////////////\n // Create version\n // /////////////////////////////////////\n\n if (collectionConfig.versions) {\n await saveVersion({\n id: result.id,\n autosave,\n collection: collectionConfig,\n docWithLocales: result,\n operation: 'create',\n payload,\n publishSpecificLocale,\n req,\n returning: false,\n })\n }\n\n // /////////////////////////////////////\n // Send verification email if applicable\n // /////////////////////////////////////\n\n if (collectionConfig.auth && collectionConfig.auth.verify && result.email) {\n await sendVerificationEmail({\n collection: { config: collectionConfig },\n config: payload.config,\n disableEmail: disableVerificationEmail!,\n email: payload.email,\n req,\n token: verificationToken,\n user: result,\n })\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: depth!,\n doc: result,\n draft,\n fallbackLocale: fallbackLocale!,\n global: null,\n locale: locale!,\n overrideAccess: overrideAccess!,\n populate,\n req,\n select,\n showHiddenFields: 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: 'create',\n previousDoc: {},\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: 'create',\n overrideAccess,\n previousDoc: {},\n req: args.req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation<TSlug>({\n args,\n collection: collectionConfig,\n operation: 'create',\n overrideAccess: args.overrideAccess!,\n result,\n })\n\n await unlinkTempFiles({ collectionConfig, config, req })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return result\n } catch (error: unknown) {\n await unlinkTempFiles({\n collectionConfig: args.collection.config,\n config: args.req.payload.config,\n req: args.req,\n }).catch((unlinkError) => {\n args.req.payload.logger.error({ err: unlinkError, msg: 'Failed to remove temp file' })\n })\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["crypto","ensureUsernameOrEmail","executeAccess","sendVerificationEmail","registerLocalStrategy","getDuplicateDocumentData","afterChange","afterRead","beforeChange","beforeValidate","saveVersion","generateFileData","unlinkTempFiles","uploadFiles","commitTransaction","hasDraftsEnabled","hasDraftValidationEnabled","hasLocalizeStatusEnabled","initTransaction","killTransaction","sanitizeInternalFields","sanitizeSelect","buildAfterOperation","buildBeforeOperation","createOperation","incomingArgs","args","shouldCommit","disableTransaction","req","authOptions","collection","config","auth","collectionSlug","slug","data","operation","overrideAccess","publishSpecificLocale","locale","autosave","collectionConfig","depth","disableVerificationEmail","draft","duplicateFromID","overwriteExistingFiles","populate","publishAllLocales","publishAllLocalesArg","fallbackLocale","payload","select","incomingSelect","selectedLocales","showHiddenFields","isSavingDraft","Boolean","_status","duplicatedFromDocWithLocales","duplicatedFromDoc","duplicateResult","id","draftArg","access","create","newFileData","files","filesToUpload","isDuplicating","originalDoc","throwOnMissingFile","upload","filesRequiredOnCreate","context","doc","global","hooks","length","hook","resultWithLocales","docWithLocales","skipValidation","localization","versions","drafts","localizeStatus","accessibleLocaleCodes","localeCodes","filterAvailableLocales","filteredLocales","locales","map","code","localeCode","disableLocalStorage","fields","flattenedFields","forceSelect","disableLocalStrategy","verify","_verified","_verificationToken","randomBytes","toString","password","db","verificationToken","result","returning","email","disableEmail","token","user","previousDoc","error","catch","unlinkError","logger","err","msg"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/collections/operations/create.ts"],"sourcesContent":["import crypto from 'crypto'\n\nimport type { CollectionSlug, FindOptions, JsonObject } from '../../index.js'\nimport type {\n Document,\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformCollectionWithSelect,\n} from '../../types/index.js'\nimport type {\n Collection,\n DataFromCollectionSlug,\n RequiredDataFromCollectionSlug,\n SelectFromCollectionSlug,\n} from '../config/types.js'\n\nimport { ensureUsernameOrEmail } from '../../auth/ensureUsernameOrEmail.js'\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { sendVerificationEmail } from '../../auth/sendVerificationEmail.js'\nimport { registerLocalStrategy } from '../../auth/strategies/local/register.js'\nimport { getDuplicateDocumentData } from '../../duplicateDocument/index.js'\nimport { APIError } from '../../errors/index.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 { saveVersion } from '../../index.js'\nimport { generateFileData } from '../../uploads/generateFileData.js'\nimport {\n getExternalUploadSource,\n getUploadDestination,\n sanitizeUploadData,\n} from '../../uploads/sanitizeUploadData.js'\nimport { unlinkTempFiles } from '../../uploads/unlinkTempFiles.js'\nimport { uploadFiles } from '../../uploads/uploadFiles.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport {\n hasDraftsEnabled,\n hasDraftValidationEnabled,\n hasLocalizeStatusEnabled,\n} from '../../utilities/getVersionsConfig.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizeInternalFields } from '../../utilities/sanitizeInternalFields.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport {\n buildAllLocalesPublicationHookDoc,\n getAllLocalesPublicationStatus,\n hasAuthorizedAllLocalesPublicationStatus,\n normalizeAllLocalesPublicationStatus,\n reconcileAllLocalesPublicationStatus,\n} from '../../versions/allLocalesPublicationStatus.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\n\nexport type Arguments<TSlug extends CollectionSlug> = {\n autosave?: boolean\n collection: Collection\n data: RequiredDataFromCollectionSlug<TSlug>\n depth?: number\n disableTransaction?: boolean\n disableVerificationEmail?: boolean\n draft?: boolean\n duplicateFromID?: DataFromCollectionSlug<TSlug>['id']\n overrideAccess?: boolean\n overwriteExistingFiles?: boolean\n populate?: PopulateType\n publishAllLocales?: boolean\n publishSpecificLocale?: string\n req: PayloadRequest\n selectedLocales?: string[]\n showHiddenFields?: boolean\n} & Pick<FindOptions<TSlug, SelectType>, 'select'>\n\nexport const createOperation = async <\n TSlug extends CollectionSlug,\n TSelect extends SelectFromCollectionSlug<TSlug>,\n>(\n incomingArgs: Arguments<TSlug>,\n): Promise<TransformCollectionWithSelect<TSlug, TSelect>> => {\n let args = incomingArgs\n let externalUploadSource: ReturnType<typeof getExternalUploadSource>\n\n try {\n const shouldCommit = !args.disableTransaction && (await initTransaction(args.req))\n\n // Keep a remote URL only as an ephemeral file source, then strip all submitted generated\n // identity before untrusted create hooks run. The fetched file receives new server-owned\n // identity before persistence.\n if (args.collection.config.upload && !args.overrideAccess) {\n externalUploadSource = getExternalUploadSource(args.data)\n const { objectKey, prefix } = getUploadDestination({ data: args.data, file: args.req.file })\n const sanitizedData = sanitizeUploadData(args.data, 'create')\n args = {\n ...args,\n data:\n typeof sanitizedData === 'object' && sanitizedData !== null\n ? {\n ...sanitizedData,\n ...(prefix !== undefined ? { prefix } : {}),\n ...(objectKey !== undefined ? { _objectKey: objectKey } : {}),\n }\n : sanitizedData,\n }\n }\n\n const initialCollectionConfig = args.collection.config\n const initialPublishAllLocales =\n !args.draft && (args.publishAllLocales ?? !hasLocalizeStatusEnabled(initialCollectionConfig))\n const initialAllLocalesPublicationStatus = getAllLocalesPublicationStatus({\n hasLocalizedStatus: Boolean(\n args.req.payload.config.localization && hasLocalizeStatusEnabled(initialCollectionConfig),\n ),\n publishAllLocales: initialPublishAllLocales,\n unpublishAllLocales: false,\n })\n\n const initialAllLocalesPublicationIntent = normalizeAllLocalesPublicationStatus({\n data: args.data,\n status: initialAllLocalesPublicationStatus,\n })\n\n ensureUsernameOrEmail<TSlug>({\n authOptions: args.collection.config.auth,\n collectionSlug: args.collection.config.slug,\n data: args.data,\n operation: 'create',\n req: args.req,\n })\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'create',\n overrideAccess: args.overrideAccess!,\n })\n\n if (args.publishSpecificLocale) {\n args.req.locale = args.publishSpecificLocale\n }\n\n const {\n autosave = false,\n collection: { config: collectionConfig },\n collection,\n depth,\n disableVerificationEmail,\n draft = false,\n duplicateFromID,\n overrideAccess,\n overwriteExistingFiles = false,\n populate,\n publishAllLocales: publishAllLocalesArg,\n publishSpecificLocale,\n req: {\n fallbackLocale,\n locale,\n payload,\n payload: { config },\n },\n req,\n select: incomingSelect,\n selectedLocales,\n showHiddenFields,\n } = args\n\n let { data } = args\n\n // For creates there is no existing doc — always publish all locales when not a draft.\n let publishAllLocales =\n !draft && (publishAllLocalesArg ?? !hasLocalizeStatusEnabled(collectionConfig))\n const requestedAllLocalesPublicationStatus = getAllLocalesPublicationStatus({\n hasLocalizedStatus: Boolean(\n config.localization && hasLocalizeStatusEnabled(collectionConfig),\n ),\n publishAllLocales,\n unpublishAllLocales: false,\n })\n const allLocalesPublicationStatus = reconcileAllLocalesPublicationStatus({\n data,\n intent: initialAllLocalesPublicationIntent,\n status: requestedAllLocalesPublicationStatus,\n })\n\n if (requestedAllLocalesPublicationStatus && !allLocalesPublicationStatus) {\n publishAllLocales = false\n }\n\n const isSavingDraft = Boolean(draft && hasDraftsEnabled(collectionConfig) && !publishAllLocales)\n\n if (isSavingDraft) {\n data._status = 'draft'\n }\n\n const isDuplicating = duplicateFromID !== undefined && duplicateFromID !== null\n\n if (isDuplicating && collectionConfig.disableDuplicate === true) {\n throw new APIError(\n `The collection with slug ${String(collectionConfig.slug)} cannot be duplicated.`,\n 400,\n )\n }\n\n let duplicatedFromDocWithLocales: JsonObject = {}\n let duplicatedFromDoc: JsonObject = {}\n\n if (isDuplicating) {\n const duplicateResult = await getDuplicateDocumentData({\n id: duplicateFromID,\n collectionConfig,\n draftArg: isSavingDraft,\n overrideAccess,\n req,\n selectedLocales,\n })\n\n duplicatedFromDoc = duplicateResult.duplicatedFromDoc\n duplicatedFromDocWithLocales = duplicateResult.duplicatedFromDocWithLocales\n }\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n if (!overrideAccess) {\n await executeAccess({ data, req }, collectionConfig.access.create)\n }\n\n // /////////////////////////////////////\n // Generate data for all files and sizes\n // /////////////////////////////////////\n\n const { data: newFileData, files: filesToUpload } = await generateFileData({\n collection,\n config,\n data,\n draft: isSavingDraft,\n externalUploadSource,\n isDuplicating,\n operation: 'create',\n originalDoc: duplicatedFromDoc,\n overwriteExistingFiles,\n req,\n throwOnMissingFile:\n !isSavingDraft && collection.config.upload.filesRequiredOnCreate !== false,\n })\n\n data = newFileData\n\n // /////////////////////////////////////\n // beforeValidate - Fields\n // /////////////////////////////////////\n\n let statusFieldAccess = false\n const publicationFieldPolicyDoc = buildAllLocalesPublicationHookDoc({\n doc: duplicatedFromDoc,\n docWithLocales: duplicatedFromDocWithLocales,\n status: allLocalesPublicationStatus,\n })\n\n data = await beforeValidate({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: duplicatedFromDoc,\n docForHooks: publicationFieldPolicyDoc,\n global: null,\n onFieldAccess: ({ accessResult, path }) => {\n if (path === '_status') {\n statusFieldAccess = accessResult\n }\n },\n operation: 'create',\n overrideAccess: overrideAccess!,\n req,\n })\n\n const publicationStatusIsAuthorized =\n statusFieldAccess && data._status === allLocalesPublicationStatus\n\n const publicationHookDoc = buildAllLocalesPublicationHookDoc({\n doc: duplicatedFromDoc,\n docWithLocales: duplicatedFromDocWithLocales,\n status: publicationStatusIsAuthorized ? allLocalesPublicationStatus : undefined,\n })\n\n // /////////////////////////////////////\n // beforeValidate - Collections\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: 'create',\n originalDoc: publicationHookDoc,\n req,\n })) || data\n }\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: 'create',\n originalDoc: publicationHookDoc,\n req,\n })) || data\n }\n }\n\n const publicationData = { ...data }\n\n // /////////////////////////////////////\n // beforeChange - Fields\n // /////////////////////////////////////\n\n let statusFieldValue: unknown\n const docWithLocalesForFields = !statusFieldAccess\n ? { ...duplicatedFromDocWithLocales, _status: {} }\n : duplicatedFromDocWithLocales\n\n const resultWithLocales = await beforeChange<JsonObject>({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: publicationHookDoc,\n docWithLocales: docWithLocalesForFields,\n global: null,\n onDataProcessed: (processedData) => {\n statusFieldValue = processedData._status\n },\n operation: 'create',\n overrideAccess,\n req,\n skipValidation: isSavingDraft && !hasDraftValidationEnabled(collectionConfig),\n })\n\n const hasAuthorizedPublicationStatus = hasAuthorizedAllLocalesPublicationStatus({\n data: publicationData,\n fieldAccessDenied: !statusFieldAccess,\n fieldValue: statusFieldValue,\n status: allLocalesPublicationStatus,\n })\n\n if (\n allLocalesPublicationStatus &&\n !hasAuthorizedPublicationStatus &&\n statusFieldAccess &&\n typeof statusFieldValue === 'undefined' &&\n typeof duplicatedFromDocWithLocales._status === 'object' &&\n duplicatedFromDocWithLocales._status !== null\n ) {\n resultWithLocales._status = { ...duplicatedFromDocWithLocales._status }\n }\n if (\n config.localization &&\n hasLocalizeStatusEnabled(collectionConfig) &&\n hasAuthorizedPublicationStatus\n ) {\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 resultWithLocales._status !== 'object' || resultWithLocales._status === null) {\n resultWithLocales._status = {}\n }\n\n for (const localeCode of accessibleLocaleCodes) {\n resultWithLocales._status[localeCode] = 'published'\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 // Create\n // /////////////////////////////////////\n\n let doc\n\n const select = sanitizeSelect({\n fields: collectionConfig.flattenedFields,\n forceSelect: collectionConfig.forceSelect,\n select: incomingSelect,\n })\n\n if (collectionConfig.auth && !collectionConfig.auth.disableLocalStrategy) {\n if (collectionConfig.auth.verify) {\n resultWithLocales._verified = Boolean(resultWithLocales._verified) || false\n resultWithLocales._verificationToken = crypto.randomBytes(20).toString('hex')\n }\n\n doc = await registerLocalStrategy({\n collection: collectionConfig,\n doc: resultWithLocales,\n password: data.password as string,\n payload: req.payload,\n req,\n })\n } else {\n doc = await payload.db.create({\n collection: collectionConfig.slug,\n data: resultWithLocales,\n req,\n })\n }\n\n const verificationToken = doc._verificationToken\n let result: Document = sanitizeInternalFields(doc)\n\n // /////////////////////////////////////\n // Add collection property for auth collections\n // /////////////////////////////////////\n\n if (collectionConfig.auth) {\n result = { ...result, collection: collectionConfig.slug }\n }\n\n // /////////////////////////////////////\n // Create version\n // /////////////////////////////////////\n\n if (collectionConfig.versions) {\n await saveVersion({\n id: result.id,\n autosave,\n collection: collectionConfig,\n docWithLocales: result,\n operation: 'create',\n payload,\n publishSpecificLocale,\n req,\n returning: false,\n })\n }\n\n // /////////////////////////////////////\n // Send verification email if applicable\n // /////////////////////////////////////\n\n if (collectionConfig.auth && collectionConfig.auth.verify && result.email) {\n await sendVerificationEmail({\n collection: { config: collectionConfig },\n config: payload.config,\n disableEmail: disableVerificationEmail!,\n email: payload.email,\n req,\n token: verificationToken,\n user: result,\n })\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: depth!,\n doc: result,\n draft,\n fallbackLocale: fallbackLocale!,\n global: null,\n locale: locale!,\n overrideAccess: overrideAccess!,\n populate,\n req,\n select,\n showHiddenFields: 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: 'create',\n previousDoc: {},\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: 'create',\n overrideAccess,\n previousDoc: {},\n req: args.req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation<TSlug>({\n args,\n collection: collectionConfig,\n operation: 'create',\n overrideAccess: args.overrideAccess!,\n result,\n })\n\n await unlinkTempFiles({ collectionConfig, config, req })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return result\n } catch (error: unknown) {\n await unlinkTempFiles({\n collectionConfig: args.collection.config,\n config: args.req.payload.config,\n req: args.req,\n }).catch((unlinkError) => {\n args.req.payload.logger.error({ err: unlinkError, msg: 'Failed to remove temp file' })\n })\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["crypto","ensureUsernameOrEmail","executeAccess","sendVerificationEmail","registerLocalStrategy","getDuplicateDocumentData","APIError","afterChange","afterRead","beforeChange","beforeValidate","saveVersion","generateFileData","getExternalUploadSource","getUploadDestination","sanitizeUploadData","unlinkTempFiles","uploadFiles","commitTransaction","hasDraftsEnabled","hasDraftValidationEnabled","hasLocalizeStatusEnabled","initTransaction","killTransaction","sanitizeInternalFields","sanitizeSelect","buildAllLocalesPublicationHookDoc","getAllLocalesPublicationStatus","hasAuthorizedAllLocalesPublicationStatus","normalizeAllLocalesPublicationStatus","reconcileAllLocalesPublicationStatus","buildAfterOperation","buildBeforeOperation","createOperation","incomingArgs","args","externalUploadSource","shouldCommit","disableTransaction","req","collection","config","upload","overrideAccess","data","objectKey","prefix","file","sanitizedData","undefined","_objectKey","initialCollectionConfig","initialPublishAllLocales","draft","publishAllLocales","initialAllLocalesPublicationStatus","hasLocalizedStatus","Boolean","payload","localization","unpublishAllLocales","initialAllLocalesPublicationIntent","status","authOptions","auth","collectionSlug","slug","operation","publishSpecificLocale","locale","autosave","collectionConfig","depth","disableVerificationEmail","duplicateFromID","overwriteExistingFiles","populate","publishAllLocalesArg","fallbackLocale","select","incomingSelect","selectedLocales","showHiddenFields","requestedAllLocalesPublicationStatus","allLocalesPublicationStatus","intent","isSavingDraft","_status","isDuplicating","disableDuplicate","String","duplicatedFromDocWithLocales","duplicatedFromDoc","duplicateResult","id","draftArg","access","create","newFileData","files","filesToUpload","originalDoc","throwOnMissingFile","filesRequiredOnCreate","statusFieldAccess","publicationFieldPolicyDoc","doc","docWithLocales","context","docForHooks","global","onFieldAccess","accessResult","path","publicationStatusIsAuthorized","publicationHookDoc","hooks","length","hook","publicationData","statusFieldValue","docWithLocalesForFields","resultWithLocales","onDataProcessed","processedData","skipValidation","hasAuthorizedPublicationStatus","fieldAccessDenied","fieldValue","accessibleLocaleCodes","localeCodes","filterAvailableLocales","filteredLocales","locales","map","code","localeCode","disableLocalStorage","fields","flattenedFields","forceSelect","disableLocalStrategy","verify","_verified","_verificationToken","randomBytes","toString","password","db","verificationToken","result","versions","returning","email","disableEmail","token","user","previousDoc","error","catch","unlinkError","logger","err","msg"],"mappings":"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"}
@@ -39,19 +39,6 @@ export const deleteByIDOperation = async (incomingArgs)=>{
39
39
  }, collectionConfig.access.delete) : true;
40
40
  const hasWhereAccess = hasWhereAccessResult(accessResults);
41
41
  // /////////////////////////////////////
42
- // beforeDelete - Collection
43
- // /////////////////////////////////////
44
- if (collectionConfig.hooks?.beforeDelete?.length) {
45
- for (const hook of collectionConfig.hooks.beforeDelete){
46
- await hook({
47
- id,
48
- collection: collectionConfig,
49
- context: req.context,
50
- req
51
- });
52
- }
53
- }
54
- // /////////////////////////////////////
55
42
  // Retrieve document
56
43
  // /////////////////////////////////////
57
44
  let where = combineQueries({
@@ -78,6 +65,19 @@ export const deleteByIDOperation = async (incomingArgs)=>{
78
65
  throw new Forbidden(req.t);
79
66
  }
80
67
  // /////////////////////////////////////
68
+ // beforeDelete - Collection
69
+ // /////////////////////////////////////
70
+ if (collectionConfig.hooks?.beforeDelete?.length) {
71
+ for (const hook of collectionConfig.hooks.beforeDelete){
72
+ await hook({
73
+ id,
74
+ collection: collectionConfig,
75
+ context: req.context,
76
+ req
77
+ });
78
+ }
79
+ }
80
+ // /////////////////////////////////////
81
81
  // Handle potentially locked documents
82
82
  // /////////////////////////////////////
83
83
  await checkDocumentLockStatus({