payload 3.89.0 → 3.90.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) 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 +82 -4
  191. package/dist/database/queryValidation/validateSearchParams.js.map +1 -1
  192. package/dist/database/types.d.ts +5 -0
  193. package/dist/database/types.d.ts.map +1 -1
  194. package/dist/database/types.js.map +1 -1
  195. package/dist/email/normalizeSendEmailOptions.js.map +1 -1
  196. package/dist/email/types.d.ts +4 -1
  197. package/dist/email/types.d.ts.map +1 -1
  198. package/dist/email/types.js.map +1 -1
  199. package/dist/exports/internal.d.ts +7 -0
  200. package/dist/exports/internal.d.ts.map +1 -1
  201. package/dist/exports/internal.js +7 -1
  202. package/dist/exports/internal.js.map +1 -1
  203. package/dist/exports/shared.d.ts +3 -0
  204. package/dist/exports/shared.d.ts.map +1 -1
  205. package/dist/exports/shared.js +3 -0
  206. package/dist/exports/shared.js.map +1 -1
  207. package/dist/fields/config/types.d.ts +7 -5
  208. package/dist/fields/config/types.d.ts.map +1 -1
  209. package/dist/fields/config/types.js.map +1 -1
  210. package/dist/fields/hooks/beforeChange/index.d.ts +7 -1
  211. package/dist/fields/hooks/beforeChange/index.d.ts.map +1 -1
  212. package/dist/fields/hooks/beforeChange/index.js +4 -2
  213. package/dist/fields/hooks/beforeChange/index.js.map +1 -1
  214. package/dist/fields/hooks/beforeChange/index.spec.js +206 -0
  215. package/dist/fields/hooks/beforeChange/index.spec.js.map +1 -0
  216. package/dist/fields/hooks/beforeChange/promise.d.ts +2 -1
  217. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  218. package/dist/fields/hooks/beforeChange/promise.js +51 -9
  219. package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
  220. package/dist/fields/hooks/beforeChange/traverseFields.d.ts +2 -1
  221. package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
  222. package/dist/fields/hooks/beforeChange/traverseFields.js +3 -2
  223. package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
  224. package/dist/fields/hooks/beforeDuplicate/promise.d.ts.map +1 -1
  225. package/dist/fields/hooks/beforeDuplicate/promise.js +4 -0
  226. package/dist/fields/hooks/beforeDuplicate/promise.js.map +1 -1
  227. package/dist/fields/hooks/beforeValidate/getFallbackValue.d.ts +2 -1
  228. package/dist/fields/hooks/beforeValidate/getFallbackValue.d.ts.map +1 -1
  229. package/dist/fields/hooks/beforeValidate/getFallbackValue.js +2 -2
  230. package/dist/fields/hooks/beforeValidate/getFallbackValue.js.map +1 -1
  231. package/dist/fields/hooks/beforeValidate/index.d.ts +6 -1
  232. package/dist/fields/hooks/beforeValidate/index.d.ts.map +1 -1
  233. package/dist/fields/hooks/beforeValidate/index.js +3 -1
  234. package/dist/fields/hooks/beforeValidate/index.js.map +1 -1
  235. package/dist/fields/hooks/beforeValidate/index.spec.js +90 -0
  236. package/dist/fields/hooks/beforeValidate/index.spec.js.map +1 -0
  237. package/dist/fields/hooks/beforeValidate/promise.d.ts +6 -1
  238. package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
  239. package/dist/fields/hooks/beforeValidate/promise.js +23 -8
  240. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  241. package/dist/fields/hooks/beforeValidate/traverseFields.d.ts +6 -1
  242. package/dist/fields/hooks/beforeValidate/traverseFields.d.ts.map +1 -1
  243. package/dist/fields/hooks/beforeValidate/traverseFields.js +3 -1
  244. package/dist/fields/hooks/beforeValidate/traverseFields.js.map +1 -1
  245. package/dist/fields/validations.d.ts.map +1 -1
  246. package/dist/fields/validations.js +3 -1
  247. package/dist/fields/validations.js.map +1 -1
  248. package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
  249. package/dist/globals/operations/restoreVersion.js +45 -11
  250. package/dist/globals/operations/restoreVersion.js.map +1 -1
  251. package/dist/globals/operations/update.d.ts.map +1 -1
  252. package/dist/globals/operations/update.js +95 -16
  253. package/dist/globals/operations/update.js.map +1 -1
  254. package/dist/index.bundled.d.ts +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/traverseFields.d.ts.map +1 -1
  412. package/dist/utilities/traverseFields.js +5 -14
  413. package/dist/utilities/traverseFields.js.map +1 -1
  414. package/dist/utilities/unflatten.d.ts.map +1 -1
  415. package/dist/utilities/unflatten.js +21 -9
  416. package/dist/utilities/unflatten.js.map +1 -1
  417. package/dist/utilities/unflatten.spec.js +38 -0
  418. package/dist/utilities/unflatten.spec.js.map +1 -0
  419. package/dist/versions/allLocalesPublicationStatus.d.ts +38 -0
  420. package/dist/versions/allLocalesPublicationStatus.d.ts.map +1 -0
  421. package/dist/versions/allLocalesPublicationStatus.js +57 -0
  422. package/dist/versions/allLocalesPublicationStatus.js.map +1 -0
  423. package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
  424. package/dist/versions/getLatestGlobalVersion.js +10 -2
  425. package/dist/versions/getLatestGlobalVersion.js.map +1 -1
  426. package/dist/versions/getRestoredStatusesToAuthorize.d.ts +9 -0
  427. package/dist/versions/getRestoredStatusesToAuthorize.d.ts.map +1 -0
  428. package/dist/versions/getRestoredStatusesToAuthorize.js +22 -0
  429. package/dist/versions/getRestoredStatusesToAuthorize.js.map +1 -0
  430. package/dist/versions/getRestoredStatusesToAuthorize.spec.js +50 -0
  431. package/dist/versions/getRestoredStatusesToAuthorize.spec.js.map +1 -0
  432. package/dist/versions/schedule/job.d.ts +2 -2
  433. package/dist/versions/schedule/job.d.ts.map +1 -1
  434. package/dist/versions/schedule/job.js +11 -7
  435. package/dist/versions/schedule/job.js.map +1 -1
  436. package/dist/versions/schedule/types.d.ts +5 -1
  437. package/dist/versions/schedule/types.d.ts.map +1 -1
  438. package/dist/versions/schedule/types.js.map +1 -1
  439. package/package.json +4 -2
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/uploads/fetchAPI-multipart/processMultipart.spec.ts"],"sourcesContent":["import fs from 'fs'\nimport { mkdtemp, readFile, readdir, rm, stat, writeFile } from 'fs/promises'\nimport { tmpdir } from 'os'\nimport path from 'path'\nimport { describe, expect, it, vi } from 'vitest'\n\nimport { processMultipartFormdata } from './index.js'\n\nconst requestFor = (form: FormData) =>\n new Request('http://localhost/api/media', { body: form, method: 'POST' })\nconst fileForm = (size: number) => {\n const form = new FormData()\n form.append('file', new Blob([new Uint8Array(size)]), 'sample.bin')\n return form\n}\n\nconst streamedFileRequest = ({\n chunk,\n chunkCount,\n isClosed = true,\n onCancel,\n}: {\n chunk: Uint8Array\n chunkCount: number\n isClosed?: boolean\n onCancel?: () => void\n}) => {\n const header = Buffer.from(\n '--sample\\r\\nContent-Disposition: form-data; name=\"file\"; filename=\"sample.bin\"\\r\\nContent-Type: application/octet-stream\\r\\n\\r\\n',\n )\n const footer = Buffer.from('\\r\\n--sample--\\r\\n')\n let chunksRead = 0\n const body = new ReadableStream<Uint8Array>({\n cancel() {\n onCancel?.()\n },\n pull(controller) {\n if (chunksRead === 0) {\n controller.enqueue(header)\n } else if (chunksRead <= chunkCount) {\n controller.enqueue(chunk)\n } else if (isClosed) {\n controller.enqueue(footer)\n controller.close()\n }\n chunksRead += 1\n },\n })\n\n return new Request('http://localhost/api/media', {\n body,\n duplex: 'half',\n method: 'POST',\n headers: { 'content-type': 'multipart/form-data; boundary=sample' },\n } as RequestInit)\n}\n\ndescribe('multipart limits', () => {\n it('should reject files above the default size with a partial limit override', async () => {\n await expect(\n processMultipartFormdata({\n options: { limits: { fields: 2 } },\n request: requestFor(fileForm(20 * 1024 * 1024 + 1)),\n }).then(() => 'accepted'),\n ).rejects.toMatchObject({ status: 413 })\n })\n\n it.each([\n {\n kind: 'files',\n count: 3,\n append: ({ form, index }: { form: FormData; index: number }) =>\n form.append('file', new Blob(['sample']), `sample-${index}.txt`),\n },\n {\n kind: 'fields',\n count: 3,\n append: ({ form, index }: { form: FormData; index: number }) =>\n form.append(`field${index}`, 'sample'),\n },\n ])('should reject requests above the configured $kind count', async ({ kind, count, append }) => {\n const form = new FormData()\n for (let i = 0; i < count; i++) {\n append({ form, index: i })\n }\n await expect(\n processMultipartFormdata({ options: { limits: { [kind]: 2 } }, request: requestFor(form) }),\n ).rejects.toMatchObject({ status: 413 })\n })\n\n it('should preserve explicitly requested file truncation', async () => {\n const result = await processMultipartFormdata({\n options: { abortOnLimit: false, limits: { fileSize: 3 } },\n request: requestFor(fileForm(6)),\n })\n expect(result.files.file).toMatchObject({ size: 3, truncated: true })\n })\n\n it('should parse ordinary files and fields', async () => {\n const form = fileForm(6)\n form.append('_payload', '{\"title\":\"Sample\"}')\n const result = await processMultipartFormdata({ request: requestFor(form) })\n expect(result.files.file.size).toBe(6)\n expect(result.fields._payload).toBe('{\"title\":\"Sample\"}')\n })\n\n it.each([\n { label: 'NaN', requestSizeLimit: Number.NaN },\n { label: 'a negative value', requestSizeLimit: -1 },\n { label: 'negative Infinity', requestSizeLimit: -Infinity },\n { label: 'a fractional value', requestSizeLimit: 1.5 },\n { label: 'an unsafe integer', requestSizeLimit: Number.MAX_SAFE_INTEGER + 1 },\n ])('should reject $label as a request size limit', async ({ requestSizeLimit }) => {\n const request = requestFor(fileForm(1))\n\n await expect(\n processMultipartFormdata({ options: { requestSizeLimit }, request }),\n ).rejects.toThrow(\n 'requestSizeLimit must be Infinity or a non-negative safe integer representing bytes',\n )\n expect(request.body!.locked).toBe(false)\n })\n\n it('should accept zero as a request size limit', async () => {\n await expect(\n processMultipartFormdata({\n options: { requestSizeLimit: 0 },\n request: requestFor(fileForm(1)),\n }),\n ).rejects.toThrow('Multipart request size limit has been reached')\n })\n\n it.each([Number.MAX_SAFE_INTEGER, Infinity])(\n 'should accept %s as a request size limit',\n async (requestSizeLimit) => {\n const result = await processMultipartFormdata({\n options: { requestSizeLimit },\n request: requestFor(fileForm(1)),\n })\n expect(result.files.file.size).toBe(1)\n },\n )\n})\n\ndescribe('multipart streaming', () => {\n it('should cancel an unfinished body promptly when a file reaches its limit', async () => {\n let cancelled = false\n const body = new ReadableStream({\n start(controller) {\n controller.enqueue(\n Buffer.from(\n '--sample\\r\\nContent-Disposition: form-data; name=\"file\"; filename=\"sample.txt\"\\r\\nContent-Type: text/plain\\r\\n\\r\\nsample data',\n ),\n )\n },\n cancel() {\n cancelled = true\n },\n })\n const request = new Request('http://localhost/api/media', {\n body,\n duplex: 'half',\n method: 'POST',\n headers: { 'content-type': 'multipart/form-data; boundary=sample' },\n } as RequestInit)\n await expect(\n processMultipartFormdata({ options: { limits: { fileSize: 3 } }, request }),\n ).rejects.toMatchObject({ status: 413 })\n expect(cancelled).toBe(true)\n }, 1000)\n\n it.each([\n { label: 'omitted', override: {} },\n { label: 'explicitly undefined', override: { requestSizeLimit: undefined } },\n ])('should enforce the default request size when it is $label', async ({ override }) => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n try {\n const options = {\n limits: { fileSize: Infinity },\n tempFileDir: directory,\n useTempFiles: true,\n ...override,\n }\n await expect(\n processMultipartFormdata({\n options,\n request: streamedFileRequest({\n chunk: Buffer.alloc(1024 * 1024),\n chunkCount: 51,\n }),\n }),\n ).rejects.toMatchObject({ status: 413 })\n expect(await readdir(directory)).toEqual([])\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n })\n\n it('should accept requests within the default request size', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n try {\n const result = await processMultipartFormdata({\n options: {\n limits: { fileSize: Infinity },\n tempFileDir: directory,\n useTempFiles: true,\n },\n request: streamedFileRequest({\n chunk: Buffer.alloc(1024 * 1024),\n chunkCount: 49,\n }),\n })\n expect((await stat(result.files.file.tempFilePath!)).size).toBe(49 * 1024 * 1024)\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n })\n\n it('should accept requests above the default size with a larger finite limit', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n try {\n const result = await processMultipartFormdata({\n options: {\n limits: { fileSize: Infinity },\n requestSizeLimit: 52 * 1024 * 1024,\n tempFileDir: directory,\n useTempFiles: true,\n },\n request: streamedFileRequest({\n chunk: Buffer.alloc(1024 * 1024),\n chunkCount: 51,\n }),\n })\n expect((await stat(result.files.file.tempFilePath!)).size).toBe(51 * 1024 * 1024)\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n })\n\n it('should accept requests above the default size when the limit is disabled', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n try {\n const result = await processMultipartFormdata({\n options: {\n limits: { fileSize: Infinity },\n requestSizeLimit: Infinity,\n tempFileDir: directory,\n useTempFiles: true,\n },\n request: streamedFileRequest({\n chunk: Buffer.alloc(1024 * 1024),\n chunkCount: 51,\n }),\n })\n expect((await stat(result.files.file.tempFilePath!)).size).toBe(51 * 1024 * 1024)\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n })\n\n it('should cancel and clean up before forwarding a chunk above the request size limit', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n let isCancelled = false\n try {\n await expect(\n processMultipartFormdata({\n options: {\n limits: { fileSize: 192 * 1024 },\n requestSizeLimit: 200 * 1024,\n responseOnLimit: 'File size limit has been reached',\n tempFileDir: directory,\n useTempFiles: true,\n },\n request: streamedFileRequest({\n chunk: Buffer.alloc(128 * 1024),\n chunkCount: 2,\n isClosed: false,\n onCancel: () => {\n isCancelled = true\n },\n }),\n }),\n ).rejects.toThrow('Multipart request size limit has been reached')\n expect(isCancelled).toBe(true)\n expect(await readdir(directory)).toEqual([])\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n }, 1000)\n\n it.each([\n {\n kind: 'files',\n count: 4,\n append: ({ form, index }: { form: FormData; index: number }) =>\n form.append('file', new Blob(['sample']), `sample-${index}.txt`),\n },\n {\n kind: 'fields',\n count: 21,\n append: ({ form, index }: { form: FormData; index: number }) =>\n form.append(`field${index}`, 'sample'),\n },\n ])(\n 'should enforce the default $kind count with another limit overridden',\n async ({ count, append }) => {\n const form = new FormData()\n for (let i = 0; i < count; i++) {\n append({ form, index: i })\n }\n await expect(\n processMultipartFormdata({\n options: { limits: { fileSize: 100 } },\n request: requestFor(form),\n }).then(() => 'accepted'),\n ).rejects.toMatchObject({ status: 413 })\n },\n )\n\n it('should accept an explicitly increased file count', async () => {\n const form = new FormData()\n for (let i = 0; i < 11; i++) form.append(`file${i}`, new Blob(['sample']), `sample-${i}.txt`)\n const result = await processMultipartFormdata({\n options: { limits: { files: 11 } },\n request: requestFor(form),\n })\n expect(Object.keys(result.files)).toHaveLength(11)\n })\n\n it('should reject oversized fields', async () => {\n const form = new FormData()\n form.append('title', 'sample')\n await expect(\n processMultipartFormdata({\n options: { limits: { fieldSize: 3 } },\n request: requestFor(form),\n }),\n ).rejects.toMatchObject({ status: 413 })\n })\n\n it('should reject requests above the configured part count', async () => {\n const form = fileForm(6)\n form.append('title', 'sample')\n await expect(\n processMultipartFormdata({ options: { limits: { parts: 1 } }, request: requestFor(form) }),\n ).rejects.toMatchObject({ status: 413 })\n })\n\n it('should remove completed and partial temporary files after a limit', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n try {\n const form = new FormData()\n form.append('first', new Blob(['ok']), 'first.txt')\n form.append('second', new Blob(['sample']), 'second.txt')\n await expect(\n processMultipartFormdata({\n options: { limits: { fileSize: 3 }, tempFileDir: directory, useTempFiles: true },\n request: requestFor(form),\n }),\n ).rejects.toMatchObject({ status: 413 })\n expect(await readdir(directory)).toEqual([])\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n })\n\n it('should flush ordinary temporary files before returning', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n try {\n const result = await processMultipartFormdata({\n options: { tempFileDir: directory, useTempFiles: true },\n request: requestFor(fileForm(100_000)),\n })\n expect((await readFile(result.files.file.tempFilePath!)).length).toBe(100_000)\n expect(result.files.file.data.length).toBe(0)\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n })\n\n it('should reject incomplete multipart data without waiting for upload timers', async () => {\n const request = new Request('http://localhost/api/media', {\n body: '--sample\\r\\nContent-Disposition: form-data; name=\"file\"; filename=\"sample.txt\"\\r\\n\\r\\nsample',\n method: 'POST',\n headers: { 'content-type': 'multipart/form-data; boundary=sample' },\n })\n await expect(processMultipartFormdata({ request })).rejects.toThrow()\n }, 1000)\n})\n\ndescribe('multipart completion', () => {\n it('should finish an empty temporary file part', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n try {\n const request = new Request('http://localhost/api/media', {\n body: '--sample\\r\\nContent-Disposition: form-data; name=\"file\"; filename=\"\"\\r\\nContent-Type: application/octet-stream\\r\\n\\r\\n\\r\\n--sample--\\r\\n',\n method: 'POST',\n headers: { 'content-type': 'multipart/form-data; boundary=sample' },\n })\n const result = await processMultipartFormdata({\n options: { tempFileDir: directory, useTempFiles: true },\n request,\n })\n expect(result.files).toBeUndefined()\n expect(await readdir(directory)).toEqual([])\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n }, 1000)\n\n it('should cancel a stalled upload on timeout', async () => {\n let cancelled = false\n const body = new ReadableStream({\n start(controller) {\n controller.enqueue(\n Buffer.from(\n '--sample\\r\\nContent-Disposition: form-data; name=\"file\"; filename=\"sample.txt\"\\r\\nContent-Type: text/plain\\r\\n\\r\\nsample',\n ),\n )\n },\n cancel() {\n cancelled = true\n },\n })\n const request = new Request('http://localhost/api/media', {\n body,\n duplex: 'half',\n method: 'POST',\n headers: { 'content-type': 'multipart/form-data; boundary=sample' },\n } as RequestInit)\n await expect(\n processMultipartFormdata({ options: { uploadTimeout: 10 }, request }),\n ).rejects.toThrow('Upload timeout')\n expect(cancelled).toBe(true)\n }, 1000)\n\n it('should preserve defaults for undefined limit values', async () => {\n await expect(\n processMultipartFormdata({\n options: { abortOnLimit: undefined, limits: { fileSize: undefined } },\n request: requestFor(fileForm(20 * 1024 * 1024 + 1)),\n }).then(() => 'accepted'),\n ).rejects.toMatchObject({ status: 413 })\n })\n})\n\nit('should wait for temporary file backpressure before reading more body chunks', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n const createWriteStream = fs.createWriteStream\n let releaseWrite: () => void\n let startedWrite: () => void\n const gate = new Promise<void>((resolve) => {\n releaseWrite = resolve\n })\n const started = new Promise<void>((resolve) => {\n startedWrite = resolve\n })\n const spy = vi.spyOn(fs, 'createWriteStream').mockImplementation((filePath) => {\n const stream = createWriteStream(filePath, { highWaterMark: 1 })\n const write = stream._write.bind(stream)\n stream._write = (chunk, encoding, callback) => {\n startedWrite()\n void gate.then(() => write(chunk, encoding, callback))\n }\n const writev = stream._writev!.bind(stream)\n stream._writev = (chunks, callback) => {\n startedWrite()\n void gate.then(() => writev(chunks, callback))\n }\n return stream\n })\n let pulls = 0\n const body = new ReadableStream({\n pull(controller) {\n pulls++\n if (pulls === 1)\n controller.enqueue(\n Buffer.from(\n '--sample\\r\\nContent-Disposition: form-data; name=\"file\"; filename=\"sample.bin\"\\r\\nContent-Type: application/octet-stream\\r\\n\\r\\n',\n ),\n )\n else if (pulls <= 17) controller.enqueue(Buffer.alloc(64 * 1024))\n else {\n controller.enqueue(Buffer.from('\\r\\n--sample--\\r\\n'))\n controller.close()\n }\n },\n })\n const request = new Request('http://localhost/api/media', {\n body,\n duplex: 'half',\n method: 'POST',\n headers: { 'content-type': 'multipart/form-data; boundary=sample' },\n } as RequestInit)\n const parsing = processMultipartFormdata({\n options: { tempFileDir: directory, useTempFiles: true },\n request,\n })\n try {\n await started\n await new Promise<void>((resolve) => setImmediate(resolve))\n expect(pulls).toBeLessThanOrEqual(4)\n } finally {\n releaseWrite!()\n try {\n const result = await parsing\n expect((await readFile(result.files.file.tempFilePath!)).length).toBe(1024 * 1024)\n } finally {\n spy.mockRestore()\n await rm(directory, { recursive: true, force: true })\n }\n }\n})\n\nit('should reject temporary file write errors and release the request', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n try {\n const destination = path.join(directory, 'sample.txt')\n await writeFile(destination, 'sample')\n const request = requestFor(fileForm(100_000))\n await expect(\n processMultipartFormdata({\n options: { tempFileDir: destination, useTempFiles: true },\n request,\n }),\n ).rejects.toMatchObject({ code: 'ENOTDIR' })\n expect(request.body!.locked).toBe(false)\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n}, 1000)\n\nit('should propagate body read errors without leaving the reader locked', async () => {\n const body = new ReadableStream({\n start(controller) {\n controller.error(new Error('Read failed'))\n },\n })\n const request = new Request('http://localhost/api/media', {\n body,\n duplex: 'half',\n method: 'POST',\n headers: { 'content-type': 'multipart/form-data; boundary=sample' },\n } as RequestInit)\n await expect(processMultipartFormdata({ request })).rejects.toThrow('Read failed')\n expect(body.locked).toBe(false)\n})\n"],"names":["fs","mkdtemp","readFile","readdir","rm","stat","writeFile","tmpdir","path","describe","expect","it","vi","processMultipartFormdata","requestFor","form","Request","body","method","fileForm","size","FormData","append","Blob","Uint8Array","streamedFileRequest","chunk","chunkCount","isClosed","onCancel","header","Buffer","from","footer","chunksRead","ReadableStream","cancel","pull","controller","enqueue","close","duplex","headers","options","limits","fields","request","then","rejects","toMatchObject","status","each","kind","count","index","i","result","abortOnLimit","fileSize","files","file","truncated","toBe","_payload","label","requestSizeLimit","Number","NaN","Infinity","MAX_SAFE_INTEGER","toThrow","locked","cancelled","start","override","undefined","directory","join","tempFileDir","useTempFiles","alloc","toEqual","recursive","force","tempFilePath","isCancelled","responseOnLimit","Object","keys","toHaveLength","fieldSize","parts","length","data","toBeUndefined","uploadTimeout","createWriteStream","releaseWrite","startedWrite","gate","Promise","resolve","started","spy","spyOn","mockImplementation","filePath","stream","highWaterMark","write","_write","bind","encoding","callback","writev","_writev","chunks","pulls","parsing","setImmediate","toBeLessThanOrEqual","mockRestore","destination","code","error","Error"],"mappings":"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"}
@@ -1,12 +1,14 @@
1
1
  import type { Collection } from '../collections/config/types.js';
2
2
  import type { SanitizedConfig } from '../config/types.js';
3
3
  import type { PayloadRequest } from '../types/index.js';
4
+ import type { ExternalUploadSource } from './sanitizeUploadData.js';
4
5
  import type { FileToSave } from './types.js';
5
6
  type Args<T> = {
6
7
  collection: Collection;
7
8
  config: SanitizedConfig;
8
9
  data: T;
9
10
  draft?: boolean;
11
+ externalUploadSource?: ExternalUploadSource;
10
12
  isDuplicating?: boolean;
11
13
  operation: 'create' | 'update';
12
14
  originalDoc?: T;
@@ -26,6 +28,6 @@ type Result<T> = Promise<{
26
28
  * loading it into memory unnecessarily, this skips reading the temp file entirely when local
27
29
  * storage is disabled, and copies it straight to its destination when local storage is enabled.
28
30
  */
29
- export declare const generateFileData: <T>({ collection: { config: collectionConfig }, data, draft, isDuplicating, operation, originalDoc, overwriteExistingFiles, req, throwOnMissingFile, }: Args<T>) => Result<T>;
31
+ export declare const generateFileData: <T>({ collection: { config: collectionConfig }, data, draft, externalUploadSource, isDuplicating, operation, originalDoc, overwriteExistingFiles, req, throwOnMissingFile, }: Args<T>) => Result<T>;
30
32
  export {};
31
33
  //# sourceMappingURL=generateFileData.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generateFileData.d.ts","sourceRoot":"","sources":["../../src/uploads/generateFileData.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,KAAK,EAAY,UAAU,EAAgC,MAAM,YAAY,CAAA;AAepF,KAAK,IAAI,CAAC,CAAC,IAAI;IACb,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,WAAW,CAAC,EAAE,CAAC,CAAA;IACf,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,GAAG,EAAE,cAAc,CAAA;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,KAAK,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB,CAAC,CAAA;AA6BF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,GAAU,CAAC,sJAUrC,IAAI,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,CA2XpB,CAAA"}
1
+ {"version":3,"file":"generateFileData.d.ts","sourceRoot":"","sources":["../../src/uploads/generateFileData.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AACnE,OAAO,KAAK,EAAY,UAAU,EAAgC,MAAM,YAAY,CAAA;AAiBpF,KAAK,IAAI,CAAC,CAAC,IAAI;IACb,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;IAC3C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,WAAW,CAAC,EAAE,CAAC,CAAA;IACf,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,GAAG,EAAE,cAAc,CAAA;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,KAAK,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB,CAAC,CAAA;AA6BF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,GAAU,CAAC,4KAWrC,IAAI,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,CA4YpB,CAAA"}
@@ -1,6 +1,5 @@
1
1
  import { fileTypeFromBuffer } from 'file-type';
2
2
  import fs from 'fs/promises';
3
- import sanitize from 'sanitize-filename';
4
3
  import { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js';
5
4
  import { isNumber } from '../utilities/isNumber.js';
6
5
  import { canResizeImage } from './canResizeImage.js';
@@ -8,14 +7,16 @@ import { checkFileRestrictions } from './checkFileRestrictions.js';
8
7
  import { cropImage } from './cropImage.js';
9
8
  import { getExternalFile } from './getExternalFile.js';
10
9
  import { getFileByPath } from './getFileByPath.js';
10
+ import { getFileExtension, getSanitizedUploadFilename } from './getFileTypeIdentity.js';
11
11
  import { getImageSize } from './getImageSize.js';
12
12
  import { getSafeFileName } from './getSafeFilename.js';
13
13
  import { createImageSizes } from './image-resizing/createImageSizes.js';
14
14
  import { isAnimatedImage } from './isAnimatedImage.js';
15
15
  import { isImage } from './isImage.js';
16
+ import { isProcessableImage } from './isProcessableImage.js';
16
17
  import { optionallyAppendMetadata } from './optionallyAppendMetadata.js';
17
18
  const shouldReupload = (uploadEdits, fileData)=>{
18
- if (!fileData) {
19
+ if (!fileData || !uploadEdits) {
19
20
  return false;
20
21
  }
21
22
  if (uploadEdits.crop || uploadEdits.heightInPixels || uploadEdits.widthInPixels) {
@@ -39,7 +40,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
39
40
  * in-memory buffer, and that temp file can be far larger than server memory allows. To avoid
40
41
  * loading it into memory unnecessarily, this skips reading the temp file entirely when local
41
42
  * storage is disabled, and copies it straight to its destination when local storage is enabled.
42
- */ export const generateFileData = async ({ collection: { config: collectionConfig }, data, draft, isDuplicating, operation, originalDoc, overwriteExistingFiles, req, throwOnMissingFile })=>{
43
+ */ export const generateFileData = async ({ collection: { config: collectionConfig }, data, draft, externalUploadSource, isDuplicating, operation, originalDoc, overwriteExistingFiles, req, throwOnMissingFile })=>{
43
44
  if (!collectionConfig.upload) {
44
45
  return {
45
46
  data,
@@ -52,15 +53,18 @@ const shouldReupload = (uploadEdits, fileData)=>{
52
53
  data,
53
54
  isDuplicating,
54
55
  operation,
55
- originalDoc,
56
+ // Only a duplication source informs edit parsing. Updates now also pass `originalDoc` so the
57
+ // stored file can be reprocessed, and that must not change which edits are applied.
58
+ originalDoc: isDuplicating ? originalDoc : undefined,
56
59
  req
57
60
  });
58
61
  const { constructorOptions, disableLocalStorage, focalPoint: focalPointEnabled = true, formatOptions, imageSizes, resizeOptions, staticDir, trimOptions, withMetadata } = collectionConfig.upload;
59
62
  const staticPath = staticDir;
60
63
  const incomingFileData = isDuplicating ? originalDoc : data;
64
+ const fileSourceData = externalUploadSource ?? (operation === 'update' ? originalDoc : incomingFileData);
61
65
  let isLocalFile = false;
62
- if (!file && (isDuplicating || shouldReupload(uploadEdits, incomingFileData))) {
63
- const { filename, url } = incomingFileData;
66
+ if (!file && fileSourceData && (externalUploadSource || isDuplicating || shouldReupload(uploadEdits, incomingFileData))) {
67
+ const { filename, url } = fileSourceData;
64
68
  if (filename && (filename.includes('../') || filename.includes('..\\'))) {
65
69
  throw new Forbidden(req.t);
66
70
  }
@@ -68,7 +72,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
68
72
  isLocalFile = true;
69
73
  }
70
74
  try {
71
- if (!disableLocalStorage && isLocalFile) {
75
+ if (!externalUploadSource && !disableLocalStorage && isLocalFile) {
72
76
  // File is stored locally
73
77
  const filePath = `${staticPath}/${filename}`;
74
78
  const response = await getFileByPath(filePath);
@@ -77,11 +81,11 @@ const shouldReupload = (uploadEdits, fileData)=>{
77
81
  } else if (filename && url) {
78
82
  // File is remote
79
83
  file = await getExternalFile({
80
- data: incomingFileData,
84
+ data: fileSourceData,
81
85
  req,
82
86
  uploadConfig: collectionConfig.upload
83
87
  });
84
- overwriteExistingFiles = true;
88
+ overwriteExistingFiles = !externalUploadSource;
85
89
  }
86
90
  } catch (err) {
87
91
  throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined);
@@ -99,11 +103,18 @@ const shouldReupload = (uploadEdits, fileData)=>{
99
103
  files: []
100
104
  };
101
105
  }
102
- await checkFileRestrictions({
106
+ const detectedFileType = await checkFileRestrictions({
103
107
  collection: collectionConfig,
104
108
  file,
105
109
  req
106
110
  });
111
+ const shouldUseDetectedFileType = detectedFileType && (isProcessableImage(file.mimetype) || isProcessableImage(detectedFileType.mime));
112
+ if (shouldUseDetectedFileType && detectedFileType.mime !== file.mimetype) {
113
+ file = {
114
+ ...file,
115
+ mimetype: detectedFileType.mime
116
+ };
117
+ }
107
118
  if (!disableLocalStorage) {
108
119
  await fs.mkdir(staticPath, {
109
120
  recursive: true
@@ -152,7 +163,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
152
163
  if (fileSupportsResize || isImage(file.mimetype)) {
153
164
  dimensions = await getImageSize({
154
165
  file,
155
- sharp
166
+ sharp: fileSupportsResize ? sharp : undefined
156
167
  });
157
168
  fileData.width = dimensions.width;
158
169
  fileData.height = dimensions.height;
@@ -167,6 +178,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
167
178
  fileBuffer = await sharpFile.toBuffer({
168
179
  resolveWithObject: true
169
180
  });
181
+ delete file.clientUploadContext;
170
182
  ({ ext, mime } = await fileTypeFromBuffer(fileBuffer.data) // This is getting an incorrect gif height back.
171
183
  );
172
184
  fileData.width = fileBuffer.info.width;
@@ -181,7 +193,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
181
193
  mime = file.mimetype;
182
194
  fileData.filesize = file.size;
183
195
  if (file.name.includes('.')) {
184
- ext = file.name.split('.').pop()?.split('?')[0];
196
+ ext = getFileExtension(getSanitizedUploadFilename(file.name));
185
197
  } else {
186
198
  ext = '';
187
199
  }
@@ -191,8 +203,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
191
203
  mime = 'image/svg+xml';
192
204
  }
193
205
  fileData.mimeType = mime;
194
- const baseFilename = sanitize(file.name.substring(0, file.name.lastIndexOf('.')) || file.name);
195
- fsSafeName = `${baseFilename}${ext ? `.${ext}` : ''}`;
206
+ fsSafeName = getSanitizedUploadFilename(file.name, ext);
196
207
  if (!overwriteExistingFiles) {
197
208
  // Extract prefix if present (added by plugin-cloud-storage)
198
209
  const prefix = data?.prefix;
@@ -206,7 +217,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
206
217
  }
207
218
  fileData.filename = fsSafeName;
208
219
  let fileForResize = file;
209
- if (cropData && sharp) {
220
+ if (cropData && fileSupportsResize && sharp) {
210
221
  const { data: croppedImage, info } = await cropImage({
211
222
  cropData,
212
223
  dimensions: dimensions,
@@ -262,6 +273,8 @@ const shouldReupload = (uploadEdits, fileData)=>{
262
273
  }
263
274
  fileData.filesize = info.size;
264
275
  }
276
+ delete file.clientUploadContext;
277
+ delete fileForResize.clientUploadContext;
265
278
  if (file.tempFilePath) {
266
279
  await fs.writeFile(file.tempFilePath, croppedImage); // write fileBuffer to the temp path
267
280
  } else {
@@ -374,7 +387,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
374
387
  if (origDoc && 'focalX' in origDoc && 'focalY' in origDoc) {
375
388
  // If no change in focal point, return undefined.
376
389
  // This prevents a refocal operation triggered from admin, because it always sends the focal point.
377
- if (incomingData.focalX === origDoc.focalX && incomingData.focalY === origDoc.focalY) {
390
+ if (incomingData?.focalX === origDoc.focalX && incomingData?.focalY === origDoc.focalY) {
378
391
  return undefined;
379
392
  }
380
393
  if (isDuplicating) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import type { OutputInfo, Sharp, SharpOptions } from 'sharp'\n\nimport { fileTypeFromBuffer } from 'file-type'\nimport fs from 'fs/promises'\nimport sanitize from 'sanitize-filename'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { Document, PayloadRequest } from '../types/index.js'\nimport type { FileData, FileToSave, ProbedImageSize, UploadEdits } from './types.js'\n\nimport { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js'\nimport { isNumber } from '../utilities/isNumber.js'\nimport { canResizeImage } from './canResizeImage.js'\nimport { checkFileRestrictions } from './checkFileRestrictions.js'\nimport { cropImage } from './cropImage.js'\nimport { getExternalFile } from './getExternalFile.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getImageSize } from './getImageSize.js'\nimport { getSafeFileName } from './getSafeFilename.js'\nimport { createImageSizes } from './image-resizing/createImageSizes.js'\nimport { isAnimatedImage } from './isAnimatedImage.js'\nimport { isImage } from './isImage.js'\nimport { optionallyAppendMetadata } from './optionallyAppendMetadata.js'\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n draft?: boolean\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc?: T\n overwriteExistingFiles?: boolean\n req: PayloadRequest\n throwOnMissingFile?: boolean\n}\n\ntype Result<T> = Promise<{\n data: T\n files: FileToSave[]\n}>\n\nconst shouldReupload = (\n uploadEdits: UploadEdits,\n fileData: Record<string, unknown> | undefined,\n) => {\n if (!fileData) {\n return false\n }\n\n if (uploadEdits.crop || uploadEdits.heightInPixels || uploadEdits.widthInPixels) {\n return true\n }\n\n // Since uploadEdits always has focalPoint, compare to the value in the data if it was changed\n if (uploadEdits.focalPoint) {\n const incomingFocalX = uploadEdits.focalPoint.x\n const incomingFocalY = uploadEdits.focalPoint.y\n\n const currentFocalX = 'focalX' in fileData && fileData.focalX\n const currentFocalY = 'focalY' in fileData && fileData.focalY\n\n const isEqual = incomingFocalX === currentFocalX && incomingFocalY === currentFocalY\n return !isEqual\n }\n\n return false\n}\n\n/**\n * Builds the document's file metadata and the list of files to write to disk.\n *\n * A file uploaded with `useTempFiles` enabled arrives as a temp file path instead of an\n * in-memory buffer, and that temp file can be far larger than server memory allows. To avoid\n * loading it into memory unnecessarily, this skips reading the temp file entirely when local\n * storage is disabled, and copies it straight to its destination when local storage is enabled.\n */\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n draft,\n isDuplicating,\n operation,\n originalDoc,\n overwriteExistingFiles,\n req,\n throwOnMissingFile,\n}: Args<T>): Result<T> => {\n if (!collectionConfig.upload) {\n return {\n data,\n files: [],\n }\n }\n\n const { serverURL, sharp } = req.payload.config\n\n let file = isDuplicating ? undefined : req.file\n\n const uploadEdits = parseUploadEditsFromReqOrIncomingData({\n data,\n isDuplicating,\n operation,\n originalDoc,\n req,\n })\n\n const {\n constructorOptions,\n disableLocalStorage,\n focalPoint: focalPointEnabled = true,\n formatOptions,\n imageSizes,\n resizeOptions,\n staticDir,\n trimOptions,\n withMetadata,\n } = collectionConfig.upload\n\n const staticPath = staticDir\n\n const incomingFileData: Document = isDuplicating ? originalDoc : data\n let isLocalFile = false\n\n if (\n !file &&\n (isDuplicating || shouldReupload(uploadEdits, incomingFileData as Record<string, unknown>))\n ) {\n const { filename, url } = incomingFileData as unknown as FileData\n if (filename && (filename.includes('../') || filename.includes('..\\\\'))) {\n throw new Forbidden(req.t)\n }\n\n if ((serverURL && url?.startsWith(serverURL)) || url?.startsWith('/')) {\n isLocalFile = true\n }\n\n try {\n if (!disableLocalStorage && isLocalFile) {\n // File is stored locally\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && url) {\n // File is remote\n file = await getExternalFile({\n data: incomingFileData as unknown as FileData,\n req,\n uploadConfig: collectionConfig.upload,\n })\n overwriteExistingFiles = true\n }\n } catch (err: unknown) {\n throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined)\n }\n }\n\n if (isDuplicating) {\n overwriteExistingFiles = false\n }\n\n if (!file) {\n if (throwOnMissingFile) {\n throw new MissingFile(req.t)\n }\n\n return {\n data: incomingFileData!,\n files: [],\n }\n }\n\n await checkFileRestrictions({\n collection: collectionConfig,\n file,\n req,\n })\n\n if (!disableLocalStorage) {\n await fs.mkdir(staticPath!, { recursive: true })\n }\n\n let newData = incomingFileData as T\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const fileIsAnimatedType = isAnimatedImage(file.mimetype)\n const cropData =\n typeof uploadEdits === 'object' && 'crop' in uploadEdits ? uploadEdits.crop : undefined\n\n try {\n const fileSupportsResize = canResizeImage(file.mimetype)\n let fsSafeName: string\n let sharpFile: Sharp | undefined\n let dimensions: ProbedImageSize | undefined\n let fileBuffer!: { data: Buffer; info: OutputInfo }\n let ext\n let mime: string\n // Depends only on configured resize/format/trim options, not on whether the bytes are on\n // disk or in memory.\n const fileHasAdjustments =\n fileSupportsResize &&\n Boolean(resizeOptions || formatOptions || trimOptions || constructorOptions)\n\n const sharpOptions: SharpOptions = { ...constructorOptions }\n\n if (fileIsAnimatedType) {\n sharpOptions.animated = true\n }\n\n if (sharp && (fileIsAnimatedType || fileHasAdjustments)) {\n if (file.tempFilePath) {\n sharpFile = sharp(file.tempFilePath, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n } else {\n sharpFile = sharp(file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n }\n\n if (fileHasAdjustments) {\n if (resizeOptions) {\n sharpFile = sharpFile.resize(resizeOptions)\n }\n if (formatOptions) {\n sharpFile = sharpFile.toFormat(formatOptions.format, formatOptions.options)\n }\n if (trimOptions) {\n sharpFile = sharpFile.trim(trimOptions)\n }\n }\n }\n\n if (fileSupportsResize || isImage(file.mimetype)) {\n dimensions = await getImageSize({ file, sharp })\n fileData.width = dimensions.width\n fileData.height = dimensions.height\n }\n\n if (sharpFile) {\n const metadata = await sharpFile.metadata()\n sharpFile = await optionallyAppendMetadata({\n req,\n sharpFile,\n withMetadata: withMetadata!,\n })\n fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true })\n ;({ ext, mime } = (await fileTypeFromBuffer(fileBuffer.data))!) // This is getting an incorrect gif height back.\n fileData.width = fileBuffer.info.width\n fileData.height = fileBuffer.info.height\n fileData.filesize = fileBuffer.info.size\n\n // Animated GIFs + WebP aggregate the height from every frame, so we need to use divide by number of pages\n if (metadata.pages) {\n fileData.height = fileBuffer.info.height / metadata.pages\n fileData.filesize = fileBuffer.data.length\n }\n } else {\n mime = file.mimetype\n fileData.filesize = file.size\n\n if (file.name.includes('.')) {\n ext = file.name.split('.').pop()?.split('?')[0]\n } else {\n ext = ''\n }\n }\n\n // Adjust SVG mime type. fromBuffer modifies it.\n if (mime === 'application/xml' && ext === 'svg') {\n mime = 'image/svg+xml'\n }\n fileData.mimeType = mime\n\n const baseFilename = sanitize(file.name.substring(0, file.name.lastIndexOf('.')) || file.name)\n fsSafeName = `${baseFilename}${ext ? `.${ext}` : ''}`\n\n if (!overwriteExistingFiles) {\n // Extract prefix if present (added by plugin-cloud-storage)\n const prefix = (data as Record<string, unknown>)?.prefix as string | undefined\n fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n prefix,\n req,\n staticPath: staticPath!,\n })\n }\n\n fileData.filename = fsSafeName\n\n let fileForResize = file\n\n if (cropData && sharp) {\n const { data: croppedImage, info } = await cropImage({\n cropData,\n dimensions: dimensions!,\n file,\n heightInPixels: uploadEdits.heightInPixels!,\n req,\n sharp,\n widthInPixels: uploadEdits.widthInPixels!,\n withMetadata,\n })\n\n // Apply resize after cropping to ensure it conforms to resizeOptions\n if (resizeOptions && !resizeOptions.withoutEnlargement) {\n const resizedAfterCrop = await sharp(croppedImage)\n .resize({\n fit: resizeOptions?.fit || 'cover',\n height: resizeOptions?.height,\n position: resizeOptions?.position || 'center',\n width: resizeOptions?.width,\n })\n .toBuffer({ resolveWithObject: true })\n\n filesToSave.push({\n buffer: resizedAfterCrop.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...fileForResize,\n data: resizedAfterCrop.data,\n size: resizedAfterCrop.info.size,\n }\n\n fileData.width = resizedAfterCrop.info.width\n fileData.height = resizedAfterCrop.info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile!.metadata()\n fileData.height = metadata.pages\n ? resizedAfterCrop.info.height / metadata.pages\n : resizedAfterCrop.info.height\n }\n fileData.filesize = resizedAfterCrop.info.size\n } else {\n // If resizeOptions is not present, just save the cropped image\n filesToSave.push({\n buffer: croppedImage,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...file,\n data: croppedImage,\n size: info.size,\n }\n\n fileData.width = info.width\n fileData.height = info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile!.metadata()\n fileData.height = metadata.pages ? info.height / metadata.pages : info.height\n }\n fileData.filesize = info.size\n }\n\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path\n } else {\n req.file = fileForResize\n }\n } else {\n // For non-image files with useTempFiles, read the buffer from the temp file\n // since file.data is empty when using temp files.\n //\n // When local storage is disabled, filesToSave is never written to disk (create/update\n // skip uploadFiles for it), and an unmodified temp file's bytes on disk are already\n // correct, so there's nothing to read into memory or write back out. Skipping this avoids\n // buffering the entire file just to discard or rewrite it unchanged - a tempFilePath can\n // point at a file far larger than server memory allows.\n const skipTempFileBuffer =\n disableLocalStorage && Boolean(file.tempFilePath) && !fileBuffer?.data\n\n // When local storage is enabled and the temp file itself is unmodified, copy it straight\n // to its destination instead of reading it into memory first - a tempFilePath can point at\n // a file far larger than server memory allows.\n const shouldCopyFromTempFile =\n !fileBuffer?.data && Boolean(file.tempFilePath) && !disableLocalStorage\n\n if (shouldCopyFromTempFile) {\n filesToSave.push({\n path: `${staticPath}/${fsSafeName}`,\n sourcePath: file.tempFilePath!,\n })\n } else {\n let bufferToSave: Buffer\n if (fileBuffer?.data) {\n bufferToSave = fileBuffer.data\n } else if (file.tempFilePath) {\n bufferToSave = skipTempFileBuffer ? Buffer.alloc(0) : await fs.readFile(file.tempFilePath)\n } else {\n bufferToSave = file.data\n }\n\n if (!skipTempFileBuffer) {\n filesToSave.push({\n buffer: bufferToSave,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n // If using temp files and the image is being resized, write the file to the temp path\n if (fileBuffer?.data || bufferToSave.length > 0) {\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, fileBuffer?.data || bufferToSave) // write fileBuffer to the temp path\n } else {\n // Assign the _possibly modified_ file to the request object\n req.file = {\n ...file,\n data: fileBuffer?.data || bufferToSave,\n size: fileBuffer?.info.size,\n }\n }\n }\n }\n }\n }\n\n if (fileSupportsResize && (Array.isArray(imageSizes) || focalPointEnabled !== false)) {\n req.payloadUploadSizes = {}\n // Focal point adjustments\n const focalPoint =\n focalPointEnabled && uploadEdits?.focalPoint\n ? {\n x: isNumber(uploadEdits.focalPoint.x) ? Math.round(uploadEdits.focalPoint.x) : 50,\n y: isNumber(uploadEdits.focalPoint.y) ? Math.round(uploadEdits.focalPoint.y) : 50,\n }\n : undefined\n\n const { sizeData, sizesToSave } = await createImageSizes({\n config: collectionConfig,\n dimensions: !cropData\n ? dimensions!\n : {\n ...dimensions,\n height: fileData.height!,\n width: fileData.width!,\n },\n file: fileForResize,\n focalPoint,\n mimeType: fileData.mimeType,\n req,\n savedFilename: fsSafeName || file.name,\n sharp,\n staticPath: staticPath!,\n withMetadata,\n })\n\n fileData.sizes = sizeData\n fileData.focalX = focalPoint?.x\n fileData.focalY = focalPoint?.y\n filesToSave.push(...sizesToSave)\n }\n } catch (err) {\n req.payload.logger.error(err)\n throw new FileUploadError(req.t)\n }\n\n newData = {\n ...newData,\n ...fileData,\n ...(draft ? { _status: 'draft' } : {}),\n }\n\n return {\n data: newData,\n files: filesToSave,\n }\n}\n\n/**\n * Parse upload edits from req or incoming data\n */\nfunction parseUploadEditsFromReqOrIncomingData(args: {\n data: unknown\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc: unknown\n req: PayloadRequest\n}): UploadEdits {\n const { data, isDuplicating, operation, originalDoc, req } = args\n\n // Get intended focal point change from query string or incoming data\n const uploadEdits =\n req.query?.uploadEdits && typeof req.query.uploadEdits === 'object'\n ? (req.query.uploadEdits as UploadEdits)\n : {}\n\n if (uploadEdits.focalPoint) {\n return uploadEdits\n }\n\n const incomingData = data as FileData\n const origDoc = originalDoc as FileData\n\n if (origDoc && 'focalX' in origDoc && 'focalY' in origDoc) {\n // If no change in focal point, return undefined.\n // This prevents a refocal operation triggered from admin, because it always sends the focal point.\n if (incomingData.focalX === origDoc.focalX && incomingData.focalY === origDoc.focalY) {\n return undefined!\n }\n\n if (isDuplicating) {\n uploadEdits.focalPoint = {\n x: incomingData?.focalX || origDoc.focalX!,\n y: incomingData?.focalY || origDoc.focalY!,\n }\n return uploadEdits\n }\n }\n\n if (incomingData?.focalX && incomingData?.focalY) {\n uploadEdits.focalPoint = {\n x: incomingData.focalX,\n y: incomingData.focalY,\n }\n return uploadEdits\n }\n\n // If no focal point is set, default to center\n if (operation === 'create') {\n uploadEdits.focalPoint = {\n x: 50,\n y: 50,\n }\n }\n\n return uploadEdits\n}\n"],"names":["fileTypeFromBuffer","fs","sanitize","FileRetrievalError","FileUploadError","Forbidden","MissingFile","isNumber","canResizeImage","checkFileRestrictions","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","createImageSizes","isAnimatedImage","isImage","optionallyAppendMetadata","shouldReupload","uploadEdits","fileData","crop","heightInPixels","widthInPixels","focalPoint","incomingFocalX","x","incomingFocalY","y","currentFocalX","focalX","currentFocalY","focalY","isEqual","generateFileData","collection","config","collectionConfig","data","draft","isDuplicating","operation","originalDoc","overwriteExistingFiles","req","throwOnMissingFile","upload","files","serverURL","sharp","payload","file","undefined","parseUploadEditsFromReqOrIncomingData","constructorOptions","disableLocalStorage","focalPointEnabled","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","withMetadata","staticPath","incomingFileData","isLocalFile","filename","url","includes","t","startsWith","filePath","response","uploadConfig","err","Error","message","mkdir","recursive","newData","filesToSave","fileIsAnimatedType","mimetype","cropData","fileSupportsResize","fsSafeName","sharpFile","dimensions","fileBuffer","ext","mime","fileHasAdjustments","Boolean","sharpOptions","animated","tempFilePath","rotate","resize","toFormat","format","options","trim","width","height","metadata","toBuffer","resolveWithObject","info","filesize","size","pages","length","name","split","pop","mimeType","baseFilename","substring","lastIndexOf","prefix","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","withoutEnlargement","resizedAfterCrop","fit","position","push","buffer","path","writeFile","skipTempFileBuffer","shouldCopyFromTempFile","sourcePath","bufferToSave","Buffer","alloc","readFile","Array","isArray","payloadUploadSizes","Math","round","sizeData","sizesToSave","savedFilename","sizes","logger","error","_status","args","query","incomingData","origDoc"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import type { OutputInfo, Sharp, SharpOptions } from 'sharp'\n\nimport { fileTypeFromBuffer } from 'file-type'\nimport fs from 'fs/promises'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { Document, PayloadRequest } from '../types/index.js'\nimport type { ExternalUploadSource } from './sanitizeUploadData.js'\nimport type { FileData, FileToSave, ProbedImageSize, UploadEdits } from './types.js'\n\nimport { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js'\nimport { isNumber } from '../utilities/isNumber.js'\nimport { canResizeImage } from './canResizeImage.js'\nimport { checkFileRestrictions } from './checkFileRestrictions.js'\nimport { cropImage } from './cropImage.js'\nimport { getExternalFile } from './getExternalFile.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getFileExtension, getSanitizedUploadFilename } from './getFileTypeIdentity.js'\nimport { getImageSize } from './getImageSize.js'\nimport { getSafeFileName } from './getSafeFilename.js'\nimport { createImageSizes } from './image-resizing/createImageSizes.js'\nimport { isAnimatedImage } from './isAnimatedImage.js'\nimport { isImage } from './isImage.js'\nimport { isProcessableImage } from './isProcessableImage.js'\nimport { optionallyAppendMetadata } from './optionallyAppendMetadata.js'\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n draft?: boolean\n externalUploadSource?: ExternalUploadSource\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc?: T\n overwriteExistingFiles?: boolean\n req: PayloadRequest\n throwOnMissingFile?: boolean\n}\n\ntype Result<T> = Promise<{\n data: T\n files: FileToSave[]\n}>\n\nconst shouldReupload = (\n uploadEdits: undefined | UploadEdits,\n fileData: Record<string, unknown> | undefined,\n) => {\n if (!fileData || !uploadEdits) {\n return false\n }\n\n if (uploadEdits.crop || uploadEdits.heightInPixels || uploadEdits.widthInPixels) {\n return true\n }\n\n // Since uploadEdits always has focalPoint, compare to the value in the data if it was changed\n if (uploadEdits.focalPoint) {\n const incomingFocalX = uploadEdits.focalPoint.x\n const incomingFocalY = uploadEdits.focalPoint.y\n\n const currentFocalX = 'focalX' in fileData && fileData.focalX\n const currentFocalY = 'focalY' in fileData && fileData.focalY\n\n const isEqual = incomingFocalX === currentFocalX && incomingFocalY === currentFocalY\n return !isEqual\n }\n\n return false\n}\n\n/**\n * Builds the document's file metadata and the list of files to write to disk.\n *\n * A file uploaded with `useTempFiles` enabled arrives as a temp file path instead of an\n * in-memory buffer, and that temp file can be far larger than server memory allows. To avoid\n * loading it into memory unnecessarily, this skips reading the temp file entirely when local\n * storage is disabled, and copies it straight to its destination when local storage is enabled.\n */\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n draft,\n externalUploadSource,\n isDuplicating,\n operation,\n originalDoc,\n overwriteExistingFiles,\n req,\n throwOnMissingFile,\n}: Args<T>): Result<T> => {\n if (!collectionConfig.upload) {\n return {\n data,\n files: [],\n }\n }\n\n const { serverURL, sharp } = req.payload.config\n\n let file = isDuplicating ? undefined : req.file\n\n const uploadEdits = parseUploadEditsFromReqOrIncomingData({\n data,\n isDuplicating,\n operation,\n // Only a duplication source informs edit parsing. Updates now also pass `originalDoc` so the\n // stored file can be reprocessed, and that must not change which edits are applied.\n originalDoc: isDuplicating ? originalDoc : undefined,\n req,\n })\n\n const {\n constructorOptions,\n disableLocalStorage,\n focalPoint: focalPointEnabled = true,\n formatOptions,\n imageSizes,\n resizeOptions,\n staticDir,\n trimOptions,\n withMetadata,\n } = collectionConfig.upload\n\n const staticPath = staticDir\n\n const incomingFileData: Document = isDuplicating ? originalDoc : data\n const fileSourceData =\n externalUploadSource ?? (operation === 'update' ? originalDoc : incomingFileData)\n let isLocalFile = false\n\n if (\n !file &&\n fileSourceData &&\n (externalUploadSource ||\n isDuplicating ||\n shouldReupload(uploadEdits, incomingFileData as Record<string, unknown>))\n ) {\n const { filename, url } = fileSourceData as unknown as FileData\n if (filename && (filename.includes('../') || filename.includes('..\\\\'))) {\n throw new Forbidden(req.t)\n }\n\n if ((serverURL && url?.startsWith(serverURL)) || url?.startsWith('/')) {\n isLocalFile = true\n }\n\n try {\n if (!externalUploadSource && !disableLocalStorage && isLocalFile) {\n // File is stored locally\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && url) {\n // File is remote\n file = await getExternalFile({\n data: fileSourceData as unknown as FileData,\n req,\n uploadConfig: collectionConfig.upload,\n })\n overwriteExistingFiles = !externalUploadSource\n }\n } catch (err: unknown) {\n throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined)\n }\n }\n\n if (isDuplicating) {\n overwriteExistingFiles = false\n }\n\n if (!file) {\n if (throwOnMissingFile) {\n throw new MissingFile(req.t)\n }\n\n return {\n data: incomingFileData!,\n files: [],\n }\n }\n\n const detectedFileType = await checkFileRestrictions({\n collection: collectionConfig,\n file,\n req,\n })\n\n const shouldUseDetectedFileType =\n detectedFileType &&\n (isProcessableImage(file.mimetype) || isProcessableImage(detectedFileType.mime))\n\n if (shouldUseDetectedFileType && detectedFileType.mime !== file.mimetype) {\n file = { ...file, mimetype: detectedFileType.mime }\n }\n\n if (!disableLocalStorage) {\n await fs.mkdir(staticPath!, { recursive: true })\n }\n\n let newData = incomingFileData as T\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const fileIsAnimatedType = isAnimatedImage(file.mimetype)\n const cropData =\n typeof uploadEdits === 'object' && 'crop' in uploadEdits ? uploadEdits.crop : undefined\n\n try {\n const fileSupportsResize = canResizeImage(file.mimetype)\n let fsSafeName: string\n let sharpFile: Sharp | undefined\n let dimensions: ProbedImageSize | undefined\n let fileBuffer!: { data: Buffer; info: OutputInfo }\n let ext\n let mime: string\n // Depends only on configured resize/format/trim options, not on whether the bytes are on\n // disk or in memory.\n const fileHasAdjustments =\n fileSupportsResize &&\n Boolean(resizeOptions || formatOptions || trimOptions || constructorOptions)\n\n const sharpOptions: SharpOptions = { ...constructorOptions }\n\n if (fileIsAnimatedType) {\n sharpOptions.animated = true\n }\n\n if (sharp && (fileIsAnimatedType || fileHasAdjustments)) {\n if (file.tempFilePath) {\n sharpFile = sharp(file.tempFilePath, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n } else {\n sharpFile = sharp(file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n }\n\n if (fileHasAdjustments) {\n if (resizeOptions) {\n sharpFile = sharpFile.resize(resizeOptions)\n }\n if (formatOptions) {\n sharpFile = sharpFile.toFormat(formatOptions.format, formatOptions.options)\n }\n if (trimOptions) {\n sharpFile = sharpFile.trim(trimOptions)\n }\n }\n }\n\n if (fileSupportsResize || isImage(file.mimetype)) {\n dimensions = await getImageSize({ file, sharp: fileSupportsResize ? sharp : undefined })\n fileData.width = dimensions.width\n fileData.height = dimensions.height\n }\n\n if (sharpFile) {\n const metadata = await sharpFile.metadata()\n sharpFile = await optionallyAppendMetadata({\n req,\n sharpFile,\n withMetadata: withMetadata!,\n })\n fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true })\n delete file.clientUploadContext\n ;({ ext, mime } = (await fileTypeFromBuffer(fileBuffer.data))!) // This is getting an incorrect gif height back.\n fileData.width = fileBuffer.info.width\n fileData.height = fileBuffer.info.height\n fileData.filesize = fileBuffer.info.size\n\n // Animated GIFs + WebP aggregate the height from every frame, so we need to use divide by number of pages\n if (metadata.pages) {\n fileData.height = fileBuffer.info.height / metadata.pages\n fileData.filesize = fileBuffer.data.length\n }\n } else {\n mime = file.mimetype\n fileData.filesize = file.size\n\n if (file.name.includes('.')) {\n ext = getFileExtension(getSanitizedUploadFilename(file.name))\n } else {\n ext = ''\n }\n }\n\n // Adjust SVG mime type. fromBuffer modifies it.\n if (mime === 'application/xml' && ext === 'svg') {\n mime = 'image/svg+xml'\n }\n fileData.mimeType = mime\n\n fsSafeName = getSanitizedUploadFilename(file.name, ext)\n\n if (!overwriteExistingFiles) {\n // Extract prefix if present (added by plugin-cloud-storage)\n const prefix = (data as Record<string, unknown>)?.prefix as string | undefined\n fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n prefix,\n req,\n staticPath: staticPath!,\n })\n }\n\n fileData.filename = fsSafeName\n\n let fileForResize = file\n\n if (cropData && fileSupportsResize && sharp) {\n const { data: croppedImage, info } = await cropImage({\n cropData,\n dimensions: dimensions!,\n file,\n heightInPixels: uploadEdits.heightInPixels!,\n req,\n sharp,\n widthInPixels: uploadEdits.widthInPixels!,\n withMetadata,\n })\n\n // Apply resize after cropping to ensure it conforms to resizeOptions\n if (resizeOptions && !resizeOptions.withoutEnlargement) {\n const resizedAfterCrop = await sharp(croppedImage)\n .resize({\n fit: resizeOptions?.fit || 'cover',\n height: resizeOptions?.height,\n position: resizeOptions?.position || 'center',\n width: resizeOptions?.width,\n })\n .toBuffer({ resolveWithObject: true })\n\n filesToSave.push({\n buffer: resizedAfterCrop.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...fileForResize,\n data: resizedAfterCrop.data,\n size: resizedAfterCrop.info.size,\n }\n\n fileData.width = resizedAfterCrop.info.width\n fileData.height = resizedAfterCrop.info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile!.metadata()\n fileData.height = metadata.pages\n ? resizedAfterCrop.info.height / metadata.pages\n : resizedAfterCrop.info.height\n }\n fileData.filesize = resizedAfterCrop.info.size\n } else {\n // If resizeOptions is not present, just save the cropped image\n filesToSave.push({\n buffer: croppedImage,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...file,\n data: croppedImage,\n size: info.size,\n }\n\n fileData.width = info.width\n fileData.height = info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile!.metadata()\n fileData.height = metadata.pages ? info.height / metadata.pages : info.height\n }\n fileData.filesize = info.size\n }\n\n delete file.clientUploadContext\n delete fileForResize.clientUploadContext\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path\n } else {\n req.file = fileForResize\n }\n } else {\n // For non-image files with useTempFiles, read the buffer from the temp file\n // since file.data is empty when using temp files.\n //\n // When local storage is disabled, filesToSave is never written to disk (create/update\n // skip uploadFiles for it), and an unmodified temp file's bytes on disk are already\n // correct, so there's nothing to read into memory or write back out. Skipping this avoids\n // buffering the entire file just to discard or rewrite it unchanged - a tempFilePath can\n // point at a file far larger than server memory allows.\n const skipTempFileBuffer =\n disableLocalStorage && Boolean(file.tempFilePath) && !fileBuffer?.data\n\n // When local storage is enabled and the temp file itself is unmodified, copy it straight\n // to its destination instead of reading it into memory first - a tempFilePath can point at\n // a file far larger than server memory allows.\n const shouldCopyFromTempFile =\n !fileBuffer?.data && Boolean(file.tempFilePath) && !disableLocalStorage\n\n if (shouldCopyFromTempFile) {\n filesToSave.push({\n path: `${staticPath}/${fsSafeName}`,\n sourcePath: file.tempFilePath!,\n })\n } else {\n let bufferToSave: Buffer\n if (fileBuffer?.data) {\n bufferToSave = fileBuffer.data\n } else if (file.tempFilePath) {\n bufferToSave = skipTempFileBuffer ? Buffer.alloc(0) : await fs.readFile(file.tempFilePath)\n } else {\n bufferToSave = file.data\n }\n\n if (!skipTempFileBuffer) {\n filesToSave.push({\n buffer: bufferToSave,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n // If using temp files and the image is being resized, write the file to the temp path\n if (fileBuffer?.data || bufferToSave.length > 0) {\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, fileBuffer?.data || bufferToSave) // write fileBuffer to the temp path\n } else {\n // Assign the _possibly modified_ file to the request object\n req.file = {\n ...file,\n data: fileBuffer?.data || bufferToSave,\n size: fileBuffer?.info.size,\n }\n }\n }\n }\n }\n }\n\n if (fileSupportsResize && (Array.isArray(imageSizes) || focalPointEnabled !== false)) {\n req.payloadUploadSizes = {}\n // Focal point adjustments\n const focalPoint =\n focalPointEnabled && uploadEdits?.focalPoint\n ? {\n x: isNumber(uploadEdits.focalPoint.x) ? Math.round(uploadEdits.focalPoint.x) : 50,\n y: isNumber(uploadEdits.focalPoint.y) ? Math.round(uploadEdits.focalPoint.y) : 50,\n }\n : undefined\n\n const { sizeData, sizesToSave } = await createImageSizes({\n config: collectionConfig,\n dimensions: !cropData\n ? dimensions!\n : {\n ...dimensions,\n height: fileData.height!,\n width: fileData.width!,\n },\n file: fileForResize,\n focalPoint,\n mimeType: fileData.mimeType,\n req,\n savedFilename: fsSafeName || file.name,\n sharp,\n staticPath: staticPath!,\n withMetadata,\n })\n\n fileData.sizes = sizeData\n fileData.focalX = focalPoint?.x\n fileData.focalY = focalPoint?.y\n filesToSave.push(...sizesToSave)\n }\n } catch (err) {\n req.payload.logger.error(err)\n throw new FileUploadError(req.t)\n }\n\n newData = {\n ...newData,\n ...fileData,\n ...(draft ? { _status: 'draft' } : {}),\n }\n\n return {\n data: newData,\n files: filesToSave,\n }\n}\n\n/**\n * Parse upload edits from req or incoming data\n */\nfunction parseUploadEditsFromReqOrIncomingData(args: {\n data: unknown\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc: unknown\n req: PayloadRequest\n}): UploadEdits {\n const { data, isDuplicating, operation, originalDoc, req } = args\n\n // Get intended focal point change from query string or incoming data\n const uploadEdits =\n req.query?.uploadEdits && typeof req.query.uploadEdits === 'object'\n ? (req.query.uploadEdits as UploadEdits)\n : {}\n\n if (uploadEdits.focalPoint) {\n return uploadEdits\n }\n\n const incomingData = data as FileData\n const origDoc = originalDoc as FileData\n\n if (origDoc && 'focalX' in origDoc && 'focalY' in origDoc) {\n // If no change in focal point, return undefined.\n // This prevents a refocal operation triggered from admin, because it always sends the focal point.\n if (incomingData?.focalX === origDoc.focalX && incomingData?.focalY === origDoc.focalY) {\n return undefined!\n }\n\n if (isDuplicating) {\n uploadEdits.focalPoint = {\n x: incomingData?.focalX || origDoc.focalX!,\n y: incomingData?.focalY || origDoc.focalY!,\n }\n return uploadEdits\n }\n }\n\n if (incomingData?.focalX && incomingData?.focalY) {\n uploadEdits.focalPoint = {\n x: incomingData.focalX,\n y: incomingData.focalY,\n }\n return uploadEdits\n }\n\n // If no focal point is set, default to center\n if (operation === 'create') {\n uploadEdits.focalPoint = {\n x: 50,\n y: 50,\n }\n }\n\n return uploadEdits\n}\n"],"names":["fileTypeFromBuffer","fs","FileRetrievalError","FileUploadError","Forbidden","MissingFile","isNumber","canResizeImage","checkFileRestrictions","cropImage","getExternalFile","getFileByPath","getFileExtension","getSanitizedUploadFilename","getImageSize","getSafeFileName","createImageSizes","isAnimatedImage","isImage","isProcessableImage","optionallyAppendMetadata","shouldReupload","uploadEdits","fileData","crop","heightInPixels","widthInPixels","focalPoint","incomingFocalX","x","incomingFocalY","y","currentFocalX","focalX","currentFocalY","focalY","isEqual","generateFileData","collection","config","collectionConfig","data","draft","externalUploadSource","isDuplicating","operation","originalDoc","overwriteExistingFiles","req","throwOnMissingFile","upload","files","serverURL","sharp","payload","file","undefined","parseUploadEditsFromReqOrIncomingData","constructorOptions","disableLocalStorage","focalPointEnabled","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","withMetadata","staticPath","incomingFileData","fileSourceData","isLocalFile","filename","url","includes","t","startsWith","filePath","response","uploadConfig","err","Error","message","detectedFileType","shouldUseDetectedFileType","mimetype","mime","mkdir","recursive","newData","filesToSave","fileIsAnimatedType","cropData","fileSupportsResize","fsSafeName","sharpFile","dimensions","fileBuffer","ext","fileHasAdjustments","Boolean","sharpOptions","animated","tempFilePath","rotate","resize","toFormat","format","options","trim","width","height","metadata","toBuffer","resolveWithObject","clientUploadContext","info","filesize","size","pages","length","name","mimeType","prefix","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","withoutEnlargement","resizedAfterCrop","fit","position","push","buffer","path","writeFile","skipTempFileBuffer","shouldCopyFromTempFile","sourcePath","bufferToSave","Buffer","alloc","readFile","Array","isArray","payloadUploadSizes","Math","round","sizeData","sizesToSave","savedFilename","sizes","logger","error","_status","args","query","incomingData","origDoc"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getBaseFields.d.ts","sourceRoot":"","sources":["../../src/uploads/getBaseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AAMtD,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,gBAAgB,CAAA;IAC5B,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,eAAO,MAAM,mBAAmB,2BAA4B,OAAO,KAAG,KAAK,EA4R1E,CAAA"}
1
+ {"version":3,"file":"getBaseFields.d.ts","sourceRoot":"","sources":["../../src/uploads/getBaseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AAOtD,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,gBAAgB,CAAA;IAC5B,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,eAAO,MAAM,mBAAmB,2BAA4B,OAAO,KAAG,KAAK,EA6R1E,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { generateFilePathOrURL } from './generateFilePathOrURL.js';
2
2
  import { mimeTypeValidator } from './mimeTypeValidator.js';
3
+ import { validateUploadFilename } from './validateUploadFilename.js';
3
4
  export const getBaseUploadFields = ({ collection, config })=>{
4
5
  const uploadOptions = typeof collection.upload === 'object' ? collection.upload : {};
5
6
  const mimeType = {
@@ -76,7 +77,8 @@ export const getBaseUploadFields = ({ collection, config })=>{
76
77
  readOnly: true
77
78
  },
78
79
  index: true,
79
- label: ({ t })=>t('upload:fileName')
80
+ label: ({ t })=>t('upload:fileName'),
81
+ validate: validateUploadFilename
80
82
  };
81
83
  // Only set unique: true if the collection does not have a compound index
82
84
  if (collection.upload === true || typeof collection.upload === 'object' && !collection.upload.filenameCompoundIndex) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/getBaseFields.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { Config } from '../config/types.js'\nimport type { Field } from '../fields/config/types.js'\nimport type { UploadConfig } from './types.js'\n\nimport { generateFilePathOrURL } from './generateFilePathOrURL.js'\nimport { mimeTypeValidator } from './mimeTypeValidator.js'\n\ntype Options = {\n collection: CollectionConfig\n config: Config\n}\n\nexport const getBaseUploadFields = ({ collection, config }: Options): Field[] => {\n const uploadOptions: UploadConfig = typeof collection.upload === 'object' ? collection.upload : {}\n\n const mimeType: Field = {\n name: 'mimeType',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: 'MIME Type',\n }\n\n const thumbnailURL: Field = {\n name: 'thumbnailURL',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n hooks: {\n afterRead: [\n ({ originalDoc, req }) => {\n const adminThumbnail =\n typeof collection.upload !== 'boolean' ? collection.upload?.adminThumbnail : undefined\n\n if (typeof adminThumbnail === 'function') {\n return adminThumbnail({ doc: originalDoc })\n }\n\n return generateFilePathOrURL({\n collectionSlug: collection.slug,\n config,\n filename:\n typeof adminThumbnail === 'string'\n ? (originalDoc.sizes?.[adminThumbnail]?.filename as string)\n : undefined,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath:\n typeof adminThumbnail === 'string'\n ? (originalDoc.sizes?.[adminThumbnail]?.url as string)\n : undefined,\n })\n },\n ],\n },\n label: 'Thumbnail URL',\n }\n\n const width: Field = {\n name: 'width',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:width'),\n }\n\n const height: Field = {\n name: 'height',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:height'),\n }\n\n const filesize: Field = {\n name: 'filesize',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:fileSize'),\n }\n\n const filename: Field = {\n name: 'filename',\n type: 'text',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n readOnly: true,\n },\n index: true,\n label: ({ t }) => t('upload:fileName'),\n }\n\n // Only set unique: true if the collection does not have a compound index\n if (\n collection.upload === true ||\n (typeof collection.upload === 'object' && !collection.upload.filenameCompoundIndex)\n ) {\n filename.unique = true\n }\n\n const url: Field = {\n name: 'url',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: 'URL',\n }\n\n let uploadFields: Field[] = [\n {\n ...url,\n hooks: {\n afterRead: [\n ({ data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection.slug,\n config,\n filename: data?.filename || originalDoc?.filename,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n beforeChange: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename: data?.filename || originalDoc?.filename,\n relative: true,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n },\n },\n thumbnailURL,\n filename,\n mimeType,\n filesize,\n width,\n height,\n ]\n\n // Add focal point fields if not disabled\n if (\n uploadOptions.focalPoint !== false ||\n uploadOptions.imageSizes ||\n uploadOptions.resizeOptions\n ) {\n uploadFields = uploadFields.concat(\n ['focalX', 'focalY'].map((name) => {\n return {\n name,\n type: 'number',\n admin: {\n disableGroupBy: true,\n disableListColumn: true,\n disableListFilter: true,\n hidden: true,\n },\n }\n }),\n )\n }\n\n if (uploadOptions.mimeTypes) {\n mimeType.validate = mimeTypeValidator(uploadOptions.mimeTypes)\n }\n\n // In Payload v4, image size subfields (`url`, `width`, `height`, etc.) should\n // default to `disableGroupBy: true`, `disableListColumn: true` and `disableListFilter: true`\n // to avoid cluttering the collection list view and filters by default.\n if (uploadOptions.imageSizes) {\n uploadFields = uploadFields.concat([\n {\n name: 'sizes',\n type: 'group',\n admin: {\n hidden: true,\n },\n fields: uploadOptions.imageSizes.map((size) => ({\n name: size.name,\n type: 'group',\n admin: {\n hidden: true,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n fields: [\n {\n ...url,\n admin: {\n ...url.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n hooks: {\n afterRead: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename:\n data?.sizes?.[size.name]?.filename ||\n originalDoc?.sizes?.[size.name]?.filename,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n beforeChange: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename:\n data?.sizes?.[size.name]?.filename ||\n originalDoc?.sizes?.[size.name]?.filename,\n relative: true,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n },\n },\n {\n ...width,\n admin: {\n ...width.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n },\n {\n ...height,\n admin: {\n ...height.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n },\n {\n ...mimeType,\n admin: {\n ...mimeType.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n },\n {\n ...filesize,\n admin: {\n ...filesize.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n },\n {\n ...filename,\n admin: {\n ...filename.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n unique: false,\n },\n ],\n label: size.name,\n })),\n label: ({ t }) => t('upload:sizes'),\n },\n ])\n }\n return uploadFields\n}\n"],"names":["generateFilePathOrURL","mimeTypeValidator","getBaseUploadFields","collection","config","uploadOptions","upload","mimeType","name","type","admin","hidden","readOnly","label","thumbnailURL","hooks","afterRead","originalDoc","req","adminThumbnail","undefined","doc","collectionSlug","slug","filename","sizes","relative","serverURL","payload","urlOrPath","url","width","t","height","filesize","disableBulkEdit","index","filenameCompoundIndex","unique","uploadFields","data","value","beforeChange","focalPoint","imageSizes","resizeOptions","concat","map","disableGroupBy","disableListColumn","disableListFilter","mimeTypes","validate","fields","size"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/uploads/getBaseFields.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { Config } from '../config/types.js'\nimport type { Field } from '../fields/config/types.js'\nimport type { UploadConfig } from './types.js'\n\nimport { generateFilePathOrURL } from './generateFilePathOrURL.js'\nimport { mimeTypeValidator } from './mimeTypeValidator.js'\nimport { validateUploadFilename } from './validateUploadFilename.js'\n\ntype Options = {\n collection: CollectionConfig\n config: Config\n}\n\nexport const getBaseUploadFields = ({ collection, config }: Options): Field[] => {\n const uploadOptions: UploadConfig = typeof collection.upload === 'object' ? collection.upload : {}\n\n const mimeType: Field = {\n name: 'mimeType',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: 'MIME Type',\n }\n\n const thumbnailURL: Field = {\n name: 'thumbnailURL',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n hooks: {\n afterRead: [\n ({ originalDoc, req }) => {\n const adminThumbnail =\n typeof collection.upload !== 'boolean' ? collection.upload?.adminThumbnail : undefined\n\n if (typeof adminThumbnail === 'function') {\n return adminThumbnail({ doc: originalDoc })\n }\n\n return generateFilePathOrURL({\n collectionSlug: collection.slug,\n config,\n filename:\n typeof adminThumbnail === 'string'\n ? (originalDoc.sizes?.[adminThumbnail]?.filename as string)\n : undefined,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath:\n typeof adminThumbnail === 'string'\n ? (originalDoc.sizes?.[adminThumbnail]?.url as string)\n : undefined,\n })\n },\n ],\n },\n label: 'Thumbnail URL',\n }\n\n const width: Field = {\n name: 'width',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:width'),\n }\n\n const height: Field = {\n name: 'height',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:height'),\n }\n\n const filesize: Field = {\n name: 'filesize',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:fileSize'),\n }\n\n const filename: Field = {\n name: 'filename',\n type: 'text',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n readOnly: true,\n },\n index: true,\n label: ({ t }) => t('upload:fileName'),\n validate: validateUploadFilename,\n }\n\n // Only set unique: true if the collection does not have a compound index\n if (\n collection.upload === true ||\n (typeof collection.upload === 'object' && !collection.upload.filenameCompoundIndex)\n ) {\n filename.unique = true\n }\n\n const url: Field = {\n name: 'url',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: 'URL',\n }\n\n let uploadFields: Field[] = [\n {\n ...url,\n hooks: {\n afterRead: [\n ({ data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection.slug,\n config,\n filename: data?.filename || originalDoc?.filename,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n beforeChange: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename: data?.filename || originalDoc?.filename,\n relative: true,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n },\n },\n thumbnailURL,\n filename,\n mimeType,\n filesize,\n width,\n height,\n ]\n\n // Add focal point fields if not disabled\n if (\n uploadOptions.focalPoint !== false ||\n uploadOptions.imageSizes ||\n uploadOptions.resizeOptions\n ) {\n uploadFields = uploadFields.concat(\n ['focalX', 'focalY'].map((name) => {\n return {\n name,\n type: 'number',\n admin: {\n disableGroupBy: true,\n disableListColumn: true,\n disableListFilter: true,\n hidden: true,\n },\n }\n }),\n )\n }\n\n if (uploadOptions.mimeTypes) {\n mimeType.validate = mimeTypeValidator(uploadOptions.mimeTypes)\n }\n\n // In Payload v4, image size subfields (`url`, `width`, `height`, etc.) should\n // default to `disableGroupBy: true`, `disableListColumn: true` and `disableListFilter: true`\n // to avoid cluttering the collection list view and filters by default.\n if (uploadOptions.imageSizes) {\n uploadFields = uploadFields.concat([\n {\n name: 'sizes',\n type: 'group',\n admin: {\n hidden: true,\n },\n fields: uploadOptions.imageSizes.map((size) => ({\n name: size.name,\n type: 'group',\n admin: {\n hidden: true,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n fields: [\n {\n ...url,\n admin: {\n ...url.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n hooks: {\n afterRead: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename:\n data?.sizes?.[size.name]?.filename ||\n originalDoc?.sizes?.[size.name]?.filename,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n beforeChange: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename:\n data?.sizes?.[size.name]?.filename ||\n originalDoc?.sizes?.[size.name]?.filename,\n relative: true,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n },\n },\n {\n ...width,\n admin: {\n ...width.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n },\n {\n ...height,\n admin: {\n ...height.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n },\n {\n ...mimeType,\n admin: {\n ...mimeType.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n },\n {\n ...filesize,\n admin: {\n ...filesize.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n },\n {\n ...filename,\n admin: {\n ...filename.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n unique: false,\n },\n ],\n label: size.name,\n })),\n label: ({ t }) => t('upload:sizes'),\n },\n ])\n }\n return uploadFields\n}\n"],"names":["generateFilePathOrURL","mimeTypeValidator","validateUploadFilename","getBaseUploadFields","collection","config","uploadOptions","upload","mimeType","name","type","admin","hidden","readOnly","label","thumbnailURL","hooks","afterRead","originalDoc","req","adminThumbnail","undefined","doc","collectionSlug","slug","filename","sizes","relative","serverURL","payload","urlOrPath","url","width","t","height","filesize","disableBulkEdit","index","validate","filenameCompoundIndex","unique","uploadFields","data","value","beforeChange","focalPoint","imageSizes","resizeOptions","concat","map","disableGroupBy","disableListColumn","disableListFilter","mimeTypes","fields","size"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { PayloadRequest } from '../types/index.js';
2
2
  import type { File, FileData, UploadConfig } from './types.js';
3
3
  type Args = {
4
- data: FileData;
4
+ data: Pick<FileData, 'filename' | 'url'>;
5
5
  req: PayloadRequest;
6
6
  uploadConfig: UploadConfig;
7
7
  };
@@ -1 +1 @@
1
- {"version":3,"file":"getExternalFile.d.ts","sourceRoot":"","sources":["../../src/uploads/getExternalFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAM9D,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,QAAQ,CAAA;IACd,GAAG,EAAE,cAAc,CAAA;IACnB,YAAY,EAAE,YAAY,CAAA;CAC3B,CAAA;AACD,eAAO,MAAM,eAAe,gCAAuC,IAAI,KAAG,OAAO,CAAC,IAAI,CAgGrF,CAAA"}
1
+ {"version":3,"file":"getExternalFile.d.ts","sourceRoot":"","sources":["../../src/uploads/getExternalFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAO9D,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,KAAK,CAAC,CAAA;IACxC,GAAG,EAAE,cAAc,CAAA;IACnB,YAAY,EAAE,YAAY,CAAA;CAC3B,CAAA;AAmCD,eAAO,MAAM,eAAe,gCAAuC,IAAI,KAAG,OAAO,CAAC,IAAI,CAmHrF,CAAA"}