payload 3.0.0-beta.95 → 3.0.0-beta.97

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 (320) hide show
  1. package/dist/admin/RichText.d.ts +4 -3
  2. package/dist/admin/RichText.d.ts.map +1 -1
  3. package/dist/admin/RichText.js.map +1 -1
  4. package/dist/admin/elements/Tab.d.ts +1 -1
  5. package/dist/admin/elements/Tab.d.ts.map +1 -1
  6. package/dist/admin/elements/Tab.js.map +1 -1
  7. package/dist/admin/forms/Description.d.ts +1 -1
  8. package/dist/admin/forms/Description.d.ts.map +1 -1
  9. package/dist/admin/forms/Description.js.map +1 -1
  10. package/dist/admin/forms/Error.d.ts +1 -1
  11. package/dist/admin/forms/Error.d.ts.map +1 -1
  12. package/dist/admin/forms/Error.js.map +1 -1
  13. package/dist/admin/forms/Form.d.ts +1 -1
  14. package/dist/admin/forms/Form.d.ts.map +1 -1
  15. package/dist/admin/forms/Form.js.map +1 -1
  16. package/dist/admin/forms/Label.d.ts +1 -1
  17. package/dist/admin/forms/Label.d.ts.map +1 -1
  18. package/dist/admin/forms/Label.js.map +1 -1
  19. package/dist/admin/types.d.ts +5 -5
  20. package/dist/admin/types.d.ts.map +1 -1
  21. package/dist/admin/types.js.map +1 -1
  22. package/dist/admin/views/types.d.ts +1 -1
  23. package/dist/admin/views/types.d.ts.map +1 -1
  24. package/dist/admin/views/types.js.map +1 -1
  25. package/dist/auth/executeAccess.d.ts.map +1 -1
  26. package/dist/auth/executeAccess.js +6 -2
  27. package/dist/auth/executeAccess.js.map +1 -1
  28. package/dist/auth/getAuthFields.d.ts.map +1 -1
  29. package/dist/auth/getAuthFields.js +3 -1
  30. package/dist/auth/getAuthFields.js.map +1 -1
  31. package/dist/auth/isLocked.d.ts.map +1 -1
  32. package/dist/auth/isLocked.js +3 -1
  33. package/dist/auth/isLocked.js.map +1 -1
  34. package/dist/auth/operations/auth.d.ts +1 -1
  35. package/dist/auth/operations/auth.d.ts.map +1 -1
  36. package/dist/auth/operations/auth.js +3 -1
  37. package/dist/auth/operations/auth.js.map +1 -1
  38. package/dist/auth/operations/forgotPassword.d.ts.map +1 -1
  39. package/dist/auth/operations/forgotPassword.js +6 -2
  40. package/dist/auth/operations/forgotPassword.js.map +1 -1
  41. package/dist/auth/operations/login.d.ts.map +1 -1
  42. package/dist/auth/operations/login.js +6 -2
  43. package/dist/auth/operations/login.js.map +1 -1
  44. package/dist/auth/operations/logout.d.ts.map +1 -1
  45. package/dist/auth/operations/logout.js +6 -2
  46. package/dist/auth/operations/logout.js.map +1 -1
  47. package/dist/auth/operations/me.d.ts.map +1 -1
  48. package/dist/auth/operations/me.js +6 -2
  49. package/dist/auth/operations/me.js.map +1 -1
  50. package/dist/auth/operations/refresh.d.ts.map +1 -1
  51. package/dist/auth/operations/refresh.js +6 -2
  52. package/dist/auth/operations/refresh.js.map +1 -1
  53. package/dist/auth/operations/registerFirstUser.d.ts.map +1 -1
  54. package/dist/auth/operations/registerFirstUser.js +6 -2
  55. package/dist/auth/operations/registerFirstUser.js.map +1 -1
  56. package/dist/auth/operations/resetPassword.d.ts.map +1 -1
  57. package/dist/auth/operations/resetPassword.js +6 -2
  58. package/dist/auth/operations/resetPassword.js.map +1 -1
  59. package/dist/auth/operations/unlock.d.ts.map +1 -1
  60. package/dist/auth/operations/unlock.js +3 -1
  61. package/dist/auth/operations/unlock.js.map +1 -1
  62. package/dist/auth/operations/verifyEmail.d.ts.map +1 -1
  63. package/dist/auth/operations/verifyEmail.js +9 -3
  64. package/dist/auth/operations/verifyEmail.js.map +1 -1
  65. package/dist/auth/strategies/jwt.js.map +1 -1
  66. package/dist/auth/strategies/local/authenticate.d.ts.map +1 -1
  67. package/dist/auth/strategies/local/authenticate.js +3 -1
  68. package/dist/auth/strategies/local/authenticate.js.map +1 -1
  69. package/dist/auth/strategies/local/register.d.ts.map +1 -1
  70. package/dist/auth/strategies/local/register.js +3 -1
  71. package/dist/auth/strategies/local/register.js.map +1 -1
  72. package/dist/auth/strategies/local/resetLoginAttempts.d.ts.map +1 -1
  73. package/dist/auth/strategies/local/resetLoginAttempts.js +3 -1
  74. package/dist/auth/strategies/local/resetLoginAttempts.js.map +1 -1
  75. package/dist/auth/types.d.ts +5 -5
  76. package/dist/auth/types.d.ts.map +1 -1
  77. package/dist/auth/types.js.map +1 -1
  78. package/dist/bin/generateImportMap/iterateFields.js.map +1 -1
  79. package/dist/bin/generateTypes.d.ts.map +1 -1
  80. package/dist/bin/generateTypes.js +7 -3
  81. package/dist/bin/generateTypes.js.map +1 -1
  82. package/dist/bin/index.d.ts.map +1 -1
  83. package/dist/bin/index.js +3 -1
  84. package/dist/bin/index.js.map +1 -1
  85. package/dist/collections/config/client.d.ts +2 -2
  86. package/dist/collections/config/client.d.ts.map +1 -1
  87. package/dist/collections/config/client.js.map +1 -1
  88. package/dist/collections/config/reservedFieldNames.spec.js +4 -4
  89. package/dist/collections/config/reservedFieldNames.spec.js.map +1 -1
  90. package/dist/collections/config/sanitize.d.ts.map +1 -1
  91. package/dist/collections/config/sanitize.js +15 -6
  92. package/dist/collections/config/sanitize.js.map +1 -1
  93. package/dist/collections/config/types.d.ts +9 -9
  94. package/dist/collections/config/types.d.ts.map +1 -1
  95. package/dist/collections/config/types.js.map +1 -1
  96. package/dist/collections/dataloader.d.ts +1 -1
  97. package/dist/collections/dataloader.d.ts.map +1 -1
  98. package/dist/collections/dataloader.js +3 -1
  99. package/dist/collections/dataloader.js.map +1 -1
  100. package/dist/collections/operations/create.d.ts.map +1 -1
  101. package/dist/collections/operations/create.js +3 -1
  102. package/dist/collections/operations/create.js.map +1 -1
  103. package/dist/collections/operations/delete.d.ts.map +1 -1
  104. package/dist/collections/operations/delete.js +3 -1
  105. package/dist/collections/operations/delete.js.map +1 -1
  106. package/dist/collections/operations/deleteByID.d.ts.map +1 -1
  107. package/dist/collections/operations/deleteByID.js +9 -3
  108. package/dist/collections/operations/deleteByID.js.map +1 -1
  109. package/dist/collections/operations/duplicate.d.ts.map +1 -1
  110. package/dist/collections/operations/duplicate.js +9 -3
  111. package/dist/collections/operations/duplicate.js.map +1 -1
  112. package/dist/collections/operations/findByID.d.ts.map +1 -1
  113. package/dist/collections/operations/findByID.js +6 -2
  114. package/dist/collections/operations/findByID.js.map +1 -1
  115. package/dist/collections/operations/findVersionByID.d.ts.map +1 -1
  116. package/dist/collections/operations/findVersionByID.js +9 -3
  117. package/dist/collections/operations/findVersionByID.js.map +1 -1
  118. package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
  119. package/dist/collections/operations/restoreVersion.js +6 -2
  120. package/dist/collections/operations/restoreVersion.js.map +1 -1
  121. package/dist/collections/operations/update.d.ts.map +1 -1
  122. package/dist/collections/operations/update.js +3 -1
  123. package/dist/collections/operations/update.js.map +1 -1
  124. package/dist/collections/operations/updateByID.d.ts.map +1 -1
  125. package/dist/collections/operations/updateByID.js +9 -3
  126. package/dist/collections/operations/updateByID.js.map +1 -1
  127. package/dist/collections/operations/utils.d.ts +1 -1
  128. package/dist/collections/operations/utils.d.ts.map +1 -1
  129. package/dist/collections/operations/utils.js.map +1 -1
  130. package/dist/config/client.d.ts +2 -2
  131. package/dist/config/client.d.ts.map +1 -1
  132. package/dist/config/client.js.map +1 -1
  133. package/dist/config/find.d.ts.map +1 -1
  134. package/dist/config/find.js +9 -3
  135. package/dist/config/find.js.map +1 -1
  136. package/dist/config/sanitize.d.ts.map +1 -1
  137. package/dist/config/sanitize.js +10 -5
  138. package/dist/config/sanitize.js.map +1 -1
  139. package/dist/config/types.d.ts +164 -35
  140. package/dist/config/types.d.ts.map +1 -1
  141. package/dist/config/types.js.map +1 -1
  142. package/dist/database/combineQueries.d.ts +1 -1
  143. package/dist/database/combineQueries.d.ts.map +1 -1
  144. package/dist/database/combineQueries.js +9 -3
  145. package/dist/database/combineQueries.js.map +1 -1
  146. package/dist/database/getLocalizedPaths.d.ts.map +1 -1
  147. package/dist/database/getLocalizedPaths.js +3 -1
  148. package/dist/database/getLocalizedPaths.js.map +1 -1
  149. package/dist/database/migrations/readMigrationFiles.d.ts.map +1 -1
  150. package/dist/database/migrations/readMigrationFiles.js +3 -1
  151. package/dist/database/migrations/readMigrationFiles.js.map +1 -1
  152. package/dist/database/types.d.ts +3 -3
  153. package/dist/database/types.d.ts.map +1 -1
  154. package/dist/database/types.js.map +1 -1
  155. package/dist/fields/config/sanitize.d.ts +2 -1
  156. package/dist/fields/config/sanitize.d.ts.map +1 -1
  157. package/dist/fields/config/sanitize.js +28 -8
  158. package/dist/fields/config/sanitize.js.map +1 -1
  159. package/dist/fields/config/types.d.ts +56 -56
  160. package/dist/fields/config/types.d.ts.map +1 -1
  161. package/dist/fields/config/types.js.map +1 -1
  162. package/dist/fields/hooks/afterChange/index.d.ts +2 -2
  163. package/dist/fields/hooks/afterChange/index.d.ts.map +1 -1
  164. package/dist/fields/hooks/afterChange/index.js.map +1 -1
  165. package/dist/fields/hooks/afterChange/promise.d.ts +2 -2
  166. package/dist/fields/hooks/afterChange/promise.d.ts.map +1 -1
  167. package/dist/fields/hooks/afterChange/promise.js.map +1 -1
  168. package/dist/fields/hooks/afterChange/traverseFields.d.ts +2 -2
  169. package/dist/fields/hooks/afterChange/traverseFields.d.ts.map +1 -1
  170. package/dist/fields/hooks/afterChange/traverseFields.js.map +1 -1
  171. package/dist/fields/hooks/afterRead/index.d.ts +2 -2
  172. package/dist/fields/hooks/afterRead/index.d.ts.map +1 -1
  173. package/dist/fields/hooks/afterRead/index.js +3 -1
  174. package/dist/fields/hooks/afterRead/index.js.map +1 -1
  175. package/dist/fields/hooks/afterRead/promise.d.ts +2 -2
  176. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
  177. package/dist/fields/hooks/afterRead/promise.js +6 -2
  178. package/dist/fields/hooks/afterRead/promise.js.map +1 -1
  179. package/dist/fields/hooks/afterRead/traverseFields.d.ts +2 -2
  180. package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -1
  181. package/dist/fields/hooks/afterRead/traverseFields.js.map +1 -1
  182. package/dist/fields/hooks/beforeChange/getExistingRowDoc.d.ts.map +1 -1
  183. package/dist/fields/hooks/beforeChange/getExistingRowDoc.js +6 -2
  184. package/dist/fields/hooks/beforeChange/getExistingRowDoc.js.map +1 -1
  185. package/dist/fields/hooks/beforeChange/index.d.ts +2 -2
  186. package/dist/fields/hooks/beforeChange/index.d.ts.map +1 -1
  187. package/dist/fields/hooks/beforeChange/index.js.map +1 -1
  188. package/dist/fields/hooks/beforeChange/promise.d.ts +2 -2
  189. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  190. package/dist/fields/hooks/beforeChange/promise.js +18 -6
  191. package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
  192. package/dist/fields/hooks/beforeChange/traverseFields.d.ts +2 -2
  193. package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
  194. package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
  195. package/dist/fields/hooks/beforeValidate/index.d.ts +2 -2
  196. package/dist/fields/hooks/beforeValidate/index.d.ts.map +1 -1
  197. package/dist/fields/hooks/beforeValidate/index.js.map +1 -1
  198. package/dist/fields/hooks/beforeValidate/promise.d.ts +2 -2
  199. package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
  200. package/dist/fields/hooks/beforeValidate/promise.js +21 -7
  201. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  202. package/dist/fields/hooks/beforeValidate/traverseFields.d.ts +2 -2
  203. package/dist/fields/hooks/beforeValidate/traverseFields.d.ts.map +1 -1
  204. package/dist/fields/hooks/beforeValidate/traverseFields.js.map +1 -1
  205. package/dist/fields/validations.d.ts +1 -1
  206. package/dist/fields/validations.d.ts.map +1 -1
  207. package/dist/fields/validations.js +57 -19
  208. package/dist/fields/validations.js.map +1 -1
  209. package/dist/globals/config/sanitize.d.ts.map +1 -1
  210. package/dist/globals/config/sanitize.js +45 -16
  211. package/dist/globals/config/sanitize.js.map +1 -1
  212. package/dist/globals/config/types.d.ts +2 -2
  213. package/dist/globals/config/types.d.ts.map +1 -1
  214. package/dist/globals/config/types.js.map +1 -1
  215. package/dist/globals/operations/docAccess.d.ts.map +1 -1
  216. package/dist/globals/operations/docAccess.js +3 -1
  217. package/dist/globals/operations/docAccess.js.map +1 -1
  218. package/dist/globals/operations/findVersionByID.d.ts.map +1 -1
  219. package/dist/globals/operations/findVersionByID.js +12 -4
  220. package/dist/globals/operations/findVersionByID.js.map +1 -1
  221. package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
  222. package/dist/globals/operations/restoreVersion.js +3 -1
  223. package/dist/globals/operations/restoreVersion.js.map +1 -1
  224. package/dist/globals/operations/update.d.ts.map +1 -1
  225. package/dist/globals/operations/update.js +3 -1
  226. package/dist/globals/operations/update.js.map +1 -1
  227. package/dist/index.d.ts +7 -7
  228. package/dist/index.d.ts.map +1 -1
  229. package/dist/index.js +13 -7
  230. package/dist/index.js.map +1 -1
  231. package/dist/preferences/operations/findOne.d.ts.map +1 -1
  232. package/dist/preferences/operations/findOne.js +3 -1
  233. package/dist/preferences/operations/findOne.js.map +1 -1
  234. package/dist/types/index.d.ts +3 -3
  235. package/dist/types/index.d.ts.map +1 -1
  236. package/dist/types/index.js.map +1 -1
  237. package/dist/uploads/cropImage.d.ts.map +1 -1
  238. package/dist/uploads/cropImage.js +3 -1
  239. package/dist/uploads/cropImage.js.map +1 -1
  240. package/dist/uploads/deleteAssociatedFiles.d.ts.map +1 -1
  241. package/dist/uploads/deleteAssociatedFiles.js +3 -1
  242. package/dist/uploads/deleteAssociatedFiles.js.map +1 -1
  243. package/dist/uploads/docWithFilenameExists.d.ts.map +1 -1
  244. package/dist/uploads/docWithFilenameExists.js +3 -1
  245. package/dist/uploads/docWithFilenameExists.js.map +1 -1
  246. package/dist/uploads/formatFilesize.d.ts.map +1 -1
  247. package/dist/uploads/formatFilesize.js +3 -1
  248. package/dist/uploads/formatFilesize.js.map +1 -1
  249. package/dist/uploads/generateFileData.d.ts.map +1 -1
  250. package/dist/uploads/generateFileData.js +12 -4
  251. package/dist/uploads/generateFileData.js.map +1 -1
  252. package/dist/uploads/getBaseFields.d.ts.map +1 -1
  253. package/dist/uploads/getBaseFields.js +6 -2
  254. package/dist/uploads/getBaseFields.js.map +1 -1
  255. package/dist/uploads/getExternalFile.d.ts.map +1 -1
  256. package/dist/uploads/getExternalFile.js +3 -1
  257. package/dist/uploads/getExternalFile.js.map +1 -1
  258. package/dist/uploads/imageResizer.d.ts.map +1 -1
  259. package/dist/uploads/imageResizer.js +35 -13
  260. package/dist/uploads/imageResizer.js.map +1 -1
  261. package/dist/uploads/optionallyAppendMetadata.d.ts.map +1 -1
  262. package/dist/uploads/optionallyAppendMetadata.js +3 -1
  263. package/dist/uploads/optionallyAppendMetadata.js.map +1 -1
  264. package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
  265. package/dist/utilities/configToJSONSchema.js +12 -4
  266. package/dist/utilities/configToJSONSchema.js.map +1 -1
  267. package/dist/utilities/createArrayFromCommaDelineated.d.ts.map +1 -1
  268. package/dist/utilities/createArrayFromCommaDelineated.js +3 -1
  269. package/dist/utilities/createArrayFromCommaDelineated.js.map +1 -1
  270. package/dist/utilities/createLocalReq.d.ts.map +1 -1
  271. package/dist/utilities/createLocalReq.js +28 -12
  272. package/dist/utilities/createLocalReq.js.map +1 -1
  273. package/dist/utilities/deepCopyObject.d.ts.map +1 -1
  274. package/dist/utilities/deepCopyObject.js +15 -5
  275. package/dist/utilities/deepCopyObject.js.map +1 -1
  276. package/dist/utilities/dependencies/versionUtils.d.ts.map +1 -1
  277. package/dist/utilities/dependencies/versionUtils.js +24 -8
  278. package/dist/utilities/dependencies/versionUtils.js.map +1 -1
  279. package/dist/utilities/getEntityPolicies.d.ts.map +1 -1
  280. package/dist/utilities/getEntityPolicies.js +9 -3
  281. package/dist/utilities/getEntityPolicies.js.map +1 -1
  282. package/dist/utilities/getObjectDotNotation.d.ts.map +1 -1
  283. package/dist/utilities/getObjectDotNotation.js +3 -1
  284. package/dist/utilities/getObjectDotNotation.js.map +1 -1
  285. package/dist/utilities/getSiblingData.d.ts.map +1 -1
  286. package/dist/utilities/getSiblingData.js +3 -1
  287. package/dist/utilities/getSiblingData.js.map +1 -1
  288. package/dist/utilities/isReactComponent.d.ts +3 -3
  289. package/dist/utilities/isReactComponent.d.ts.map +1 -1
  290. package/dist/utilities/isReactComponent.js.map +1 -1
  291. package/dist/utilities/isValidID.d.ts +1 -1
  292. package/dist/utilities/isValidID.d.ts.map +1 -1
  293. package/dist/utilities/isValidID.js +3 -1
  294. package/dist/utilities/isValidID.js.map +1 -1
  295. package/dist/utilities/logger.d.ts +8 -3
  296. package/dist/utilities/logger.d.ts.map +1 -1
  297. package/dist/utilities/logger.js +22 -14
  298. package/dist/utilities/logger.js.map +1 -1
  299. package/dist/utilities/reduceFieldsToValues.d.ts.map +1 -1
  300. package/dist/utilities/reduceFieldsToValues.js +3 -1
  301. package/dist/utilities/reduceFieldsToValues.js.map +1 -1
  302. package/dist/utilities/telemetry/conf/index.d.ts +1 -1
  303. package/dist/utilities/telemetry/conf/index.d.ts.map +1 -1
  304. package/dist/utilities/telemetry/conf/index.js +8 -8
  305. package/dist/utilities/telemetry/conf/index.js.map +1 -1
  306. package/dist/utilities/timestamp.d.ts.map +1 -1
  307. package/dist/utilities/timestamp.js +3 -1
  308. package/dist/utilities/timestamp.js.map +1 -1
  309. package/dist/versions/drafts/appendVersionToQueryKey.js +1 -1
  310. package/dist/versions/drafts/appendVersionToQueryKey.js.map +1 -1
  311. package/dist/versions/drafts/getQueryDraftsSort.d.ts.map +1 -1
  312. package/dist/versions/drafts/getQueryDraftsSort.js +3 -1
  313. package/dist/versions/drafts/getQueryDraftsSort.js.map +1 -1
  314. package/dist/versions/saveVersion.d.ts.map +1 -1
  315. package/dist/versions/saveVersion.js +18 -6
  316. package/dist/versions/saveVersion.js.map +1 -1
  317. package/dist/versions/types.d.ts +4 -4
  318. package/dist/versions/types.d.ts.map +1 -1
  319. package/dist/versions/types.js.map +1 -1
  320. package/package.json +7 -8
@@ -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'\nimport { mkdirSync } from 'node:fs'\nimport sanitize from 'sanitize-filename'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { FileData, FileToSave, ProbedImageSize, UploadEdits } from './types.js'\n\nimport { FileRetrievalError, FileUploadError, MissingFile } from '../errors/index.js'\nimport { canResizeImage } from './canResizeImage.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 { resizeAndTransformImageSizes } from './imageResizer.js'\nimport { isImage } from './isImage.js'\nimport { optionallyAppendMetadata } from './optionallyAppendMetadata.js'\n\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\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\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\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 { sharp } = req.payload.config\n\n let file = req.file\n\n const uploadEdits = parseUploadEditsFromReqOrIncomingData({\n data,\n operation,\n originalDoc,\n req,\n })\n\n const {\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 if (!file && uploadEdits && data) {\n const { filename, url } = data as FileData\n\n try {\n if (url && url.startsWith('/') && !disableLocalStorage) {\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && url) {\n file = await getExternalFile({\n data: data 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 (!file) {\n if (throwOnMissingFile) throw new MissingFile(req.t)\n\n return {\n data,\n files: [],\n }\n }\n\n if (!disableLocalStorage) {\n mkdirSync(staticPath, { recursive: true })\n }\n\n let newData = data\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const fileIsAnimatedType = ['image/avif', 'image/gif', 'image/webp'].includes(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 const fileHasAdjustments =\n fileSupportsResize &&\n Boolean(resizeOptions || formatOptions || imageSizes || trimOptions || file.tempFilePath)\n\n const sharpOptions: SharpOptions = {}\n\n if (fileIsAnimatedType) sharpOptions.animated = true\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)\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,\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') mime = 'image/svg+xml'\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 fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n req,\n staticPath,\n })\n }\n\n fileData.filename = fsSafeName\n let fileForResize = file\n\n if (cropData && sharp) {\n const { data: croppedImage, info } = await cropImage({\n cropData,\n dimensions,\n file,\n heightInPixels: uploadEdits.heightInPixels,\n req,\n sharp,\n widthInPixels: uploadEdits.widthInPixels,\n withMetadata,\n })\n\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 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 if (file.tempFilePath) {\n await fs.promises.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path\n } else {\n req.file = fileForResize\n }\n } else {\n filesToSave.push({\n buffer: fileBuffer?.data || file.data,\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 || file.data.length > 0) {\n if (file.tempFilePath) {\n await fs.promises.writeFile(file.tempFilePath, fileBuffer?.data || file.data) // 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 || file.data,\n size: fileBuffer?.info.size,\n }\n }\n }\n }\n\n if (fileSupportsResize && (Array.isArray(imageSizes) || focalPointEnabled !== false)) {\n req.payloadUploadSizes = {}\n const { focalPoint, sizeData, sizesToSave } = await resizeAndTransformImageSizes({\n config: collectionConfig,\n dimensions: !cropData\n ? dimensions\n : {\n ...dimensions,\n height: fileData.height,\n width: fileData.width,\n },\n file: fileForResize,\n mimeType: fileData.mimeType,\n req,\n savedFilename: fsSafeName || file.name,\n sharp,\n staticPath,\n uploadEdits,\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 }\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 operation: 'create' | 'update'\n originalDoc: unknown\n req: PayloadRequest\n}): UploadEdits {\n const { data, 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) return uploadEdits\n\n const incomingData = data as FileData\n const origDoc = originalDoc as FileData\n\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 (origDoc && incomingData.focalX === origDoc.focalX && incomingData.focalY === origDoc.focalY) {\n return undefined\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 return uploadEdits\n}\n"],"names":["fileTypeFromBuffer","fs","mkdirSync","sanitize","FileRetrievalError","FileUploadError","MissingFile","canResizeImage","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","resizeAndTransformImageSizes","isImage","optionallyAppendMetadata","generateFileData","collection","config","collectionConfig","data","operation","originalDoc","overwriteExistingFiles","req","throwOnMissingFile","upload","files","sharp","payload","file","uploadEdits","parseUploadEditsFromReqOrIncomingData","disableLocalStorage","focalPoint","focalPointEnabled","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","withMetadata","staticPath","filename","url","startsWith","filePath","response","uploadConfig","err","t","Error","message","undefined","recursive","newData","filesToSave","fileData","fileIsAnimatedType","includes","mimetype","cropData","crop","fileSupportsResize","fsSafeName","sharpFile","dimensions","fileBuffer","ext","mime","fileHasAdjustments","Boolean","tempFilePath","sharpOptions","animated","rotate","resize","toFormat","format","options","trim","width","height","metadata","toBuffer","resolveWithObject","info","filesize","size","pages","length","name","split","pop","mimeType","baseFilename","substring","lastIndexOf","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","heightInPixels","widthInPixels","push","buffer","path","promises","writeFile","Array","isArray","payloadUploadSizes","sizeData","sizesToSave","savedFilename","sizes","focalX","x","focalY","y","logger","error","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'\nimport { mkdirSync } from 'node:fs'\nimport sanitize from 'sanitize-filename'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { FileData, FileToSave, ProbedImageSize, UploadEdits } from './types.js'\n\nimport { FileRetrievalError, FileUploadError, MissingFile } from '../errors/index.js'\nimport { canResizeImage } from './canResizeImage.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 { resizeAndTransformImageSizes } from './imageResizer.js'\nimport { isImage } from './isImage.js'\nimport { optionallyAppendMetadata } from './optionallyAppendMetadata.js'\n\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\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\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\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 { sharp } = req.payload.config\n\n let file = req.file\n\n const uploadEdits = parseUploadEditsFromReqOrIncomingData({\n data,\n operation,\n originalDoc,\n req,\n })\n\n const {\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 if (!file && uploadEdits && data) {\n const { filename, url } = data as FileData\n\n try {\n if (url && url.startsWith('/') && !disableLocalStorage) {\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && url) {\n file = await getExternalFile({\n data: data 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 (!file) {\n if (throwOnMissingFile) {\n throw new MissingFile(req.t)\n }\n\n return {\n data,\n files: [],\n }\n }\n\n if (!disableLocalStorage) {\n mkdirSync(staticPath, { recursive: true })\n }\n\n let newData = data\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const fileIsAnimatedType = ['image/avif', 'image/gif', 'image/webp'].includes(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 const fileHasAdjustments =\n fileSupportsResize &&\n Boolean(resizeOptions || formatOptions || imageSizes || trimOptions || file.tempFilePath)\n\n const sharpOptions: SharpOptions = {}\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)\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,\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 fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n req,\n staticPath,\n })\n }\n\n fileData.filename = fsSafeName\n let fileForResize = file\n\n if (cropData && sharp) {\n const { data: croppedImage, info } = await cropImage({\n cropData,\n dimensions,\n file,\n heightInPixels: uploadEdits.heightInPixels,\n req,\n sharp,\n widthInPixels: uploadEdits.widthInPixels,\n withMetadata,\n })\n\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 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 if (file.tempFilePath) {\n await fs.promises.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path\n } else {\n req.file = fileForResize\n }\n } else {\n filesToSave.push({\n buffer: fileBuffer?.data || file.data,\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 || file.data.length > 0) {\n if (file.tempFilePath) {\n await fs.promises.writeFile(file.tempFilePath, fileBuffer?.data || file.data) // 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 || file.data,\n size: fileBuffer?.info.size,\n }\n }\n }\n }\n\n if (fileSupportsResize && (Array.isArray(imageSizes) || focalPointEnabled !== false)) {\n req.payloadUploadSizes = {}\n const { focalPoint, sizeData, sizesToSave } = await resizeAndTransformImageSizes({\n config: collectionConfig,\n dimensions: !cropData\n ? dimensions\n : {\n ...dimensions,\n height: fileData.height,\n width: fileData.width,\n },\n file: fileForResize,\n mimeType: fileData.mimeType,\n req,\n savedFilename: fsSafeName || file.name,\n sharp,\n staticPath,\n uploadEdits,\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 }\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 operation: 'create' | 'update'\n originalDoc: unknown\n req: PayloadRequest\n}): UploadEdits {\n const { data, 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 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 (origDoc && incomingData.focalX === origDoc.focalX && incomingData.focalY === origDoc.focalY) {\n return undefined\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 return uploadEdits\n}\n"],"names":["fileTypeFromBuffer","fs","mkdirSync","sanitize","FileRetrievalError","FileUploadError","MissingFile","canResizeImage","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","resizeAndTransformImageSizes","isImage","optionallyAppendMetadata","generateFileData","collection","config","collectionConfig","data","operation","originalDoc","overwriteExistingFiles","req","throwOnMissingFile","upload","files","sharp","payload","file","uploadEdits","parseUploadEditsFromReqOrIncomingData","disableLocalStorage","focalPoint","focalPointEnabled","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","withMetadata","staticPath","filename","url","startsWith","filePath","response","uploadConfig","err","t","Error","message","undefined","recursive","newData","filesToSave","fileData","fileIsAnimatedType","includes","mimetype","cropData","crop","fileSupportsResize","fsSafeName","sharpFile","dimensions","fileBuffer","ext","mime","fileHasAdjustments","Boolean","tempFilePath","sharpOptions","animated","rotate","resize","toFormat","format","options","trim","width","height","metadata","toBuffer","resolveWithObject","info","filesize","size","pages","length","name","split","pop","mimeType","baseFilename","substring","lastIndexOf","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","heightInPixels","widthInPixels","push","buffer","path","promises","writeFile","Array","isArray","payloadUploadSizes","sizeData","sizesToSave","savedFilename","sizes","focalX","x","focalY","y","logger","error","args","query","incomingData","origDoc"],"mappings":"AAEA,SAASA,kBAAkB,QAAQ,YAAW;AAC9C,OAAOC,QAAQ,KAAI;AACnB,SAASC,SAAS,QAAQ,UAAS;AACnC,OAAOC,cAAc,oBAAmB;AAOxC,SAASC,kBAAkB,EAAEC,eAAe,EAAEC,WAAW,QAAQ,qBAAoB;AACrF,SAASC,cAAc,QAAQ,sBAAqB;AACpD,SAASC,SAAS,QAAQ,iBAAgB;AAC1C,SAASC,eAAe,QAAQ,uBAAsB;AACtD,SAASC,aAAa,QAAQ,qBAAoB;AAClD,SAASC,YAAY,QAAQ,oBAAmB;AAChD,SAASC,eAAe,QAAQ,uBAAsB;AACtD,SAASC,4BAA4B,QAAQ,oBAAmB;AAChE,SAASC,OAAO,QAAQ,eAAc;AACtC,SAASC,wBAAwB,QAAQ,gCAA+B;AAkBxE,OAAO,MAAMC,mBAAmB,OAAU,EACxCC,YAAY,EAAEC,QAAQC,gBAAgB,EAAE,EACxCC,IAAI,EACJC,SAAS,EACTC,WAAW,EACXC,sBAAsB,EACtBC,GAAG,EACHC,kBAAkB,EACV;IACR,IAAI,CAACN,iBAAiBO,MAAM,EAAE;QAC5B,OAAO;YACLN;YACAO,OAAO,EAAE;QACX;IACF;IAEA,MAAM,EAAEC,KAAK,EAAE,GAAGJ,IAAIK,OAAO,CAACX,MAAM;IAEpC,IAAIY,OAAON,IAAIM,IAAI;IAEnB,MAAMC,cAAcC,sCAAsC;QACxDZ;QACAC;QACAC;QACAE;IACF;IAEA,MAAM,EACJS,mBAAmB,EACnBC,YAAYC,oBAAoB,IAAI,EACpCC,aAAa,EACbC,UAAU,EACVC,aAAa,EACbC,SAAS,EACTC,WAAW,EACXC,YAAY,EACb,GAAGtB,iBAAiBO,MAAM;IAE3B,MAAMgB,aAAaH;IAEnB,IAAI,CAACT,QAAQC,eAAeX,MAAM;QAChC,MAAM,EAAEuB,QAAQ,EAAEC,GAAG,EAAE,GAAGxB;QAE1B,IAAI;YACF,IAAIwB,OAAOA,IAAIC,UAAU,CAAC,QAAQ,CAACZ,qBAAqB;gBACtD,MAAMa,WAAW,CAAC,EAAEJ,WAAW,CAAC,EAAEC,SAAS,CAAC;gBAC5C,MAAMI,WAAW,MAAMrC,cAAcoC;gBACrChB,OAAOiB;gBACPxB,yBAAyB;YAC3B,OAAO,IAAIoB,YAAYC,KAAK;gBAC1Bd,OAAO,MAAMrB,gBAAgB;oBAC3BW,MAAMA;oBACNI;oBACAwB,cAAc7B,iBAAiBO,MAAM;gBACvC;gBACAH,yBAAyB;YAC3B;QACF,EAAE,OAAO0B,KAAc;YACrB,MAAM,IAAI7C,mBAAmBoB,IAAI0B,CAAC,EAAED,eAAeE,QAAQF,IAAIG,OAAO,GAAGC;QAC3E;IACF;IAEA,IAAI,CAACvB,MAAM;QACT,IAAIL,oBAAoB;YACtB,MAAM,IAAInB,YAAYkB,IAAI0B,CAAC;QAC7B;QAEA,OAAO;YACL9B;YACAO,OAAO,EAAE;QACX;IACF;IAEA,IAAI,CAACM,qBAAqB;QACxB/B,UAAUwC,YAAY;YAAEY,WAAW;QAAK;IAC1C;IAEA,IAAIC,UAAUnC;IACd,MAAMoC,cAA4B,EAAE;IACpC,MAAMC,WAA8B,CAAC;IACrC,MAAMC,qBAAqB;QAAC;QAAc;QAAa;KAAa,CAACC,QAAQ,CAAC7B,KAAK8B,QAAQ;IAC3F,MAAMC,WACJ,OAAO9B,gBAAgB,YAAY,UAAUA,cAAcA,YAAY+B,IAAI,GAAGT;IAEhF,IAAI;QACF,MAAMU,qBAAqBxD,eAAeuB,KAAK8B,QAAQ;QACvD,IAAII;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,MAAMC,qBACJP,sBACAQ,QAAQjC,iBAAiBF,iBAAiBC,cAAcG,eAAeV,KAAK0C,YAAY;QAE1F,MAAMC,eAA6B,CAAC;QAEpC,IAAIf,oBAAoB;YACtBe,aAAaC,QAAQ,GAAG;QAC1B;QAEA,IAAI9C,SAAU8B,CAAAA,sBAAsBY,kBAAiB,GAAI;YACvD,IAAIxC,KAAK0C,YAAY,EAAE;gBACrBP,YAAYrC,MAAME,KAAK0C,YAAY,EAAEC,cAAcE,MAAM,GAAG,mGAAmG;;YACjK,OAAO;gBACLV,YAAYrC,MAAME,KAAKV,IAAI,EAAEqD,cAAcE,MAAM,GAAG,mGAAmG;;YACzJ;YAEA,IAAIL,oBAAoB;gBACtB,IAAIhC,eAAe;oBACjB2B,YAAYA,UAAUW,MAAM,CAACtC;gBAC/B;gBACA,IAAIF,eAAe;oBACjB6B,YAAYA,UAAUY,QAAQ,CAACzC,cAAc0C,MAAM,EAAE1C,cAAc2C,OAAO;gBAC5E;gBACA,IAAIvC,aAAa;oBACfyB,YAAYA,UAAUe,IAAI,CAACxC;gBAC7B;YACF;QACF;QAEA,IAAIuB,sBAAsBjD,QAAQgB,KAAK8B,QAAQ,GAAG;YAChDM,aAAa,MAAMvD,aAAamB;YAChC2B,SAASwB,KAAK,GAAGf,WAAWe,KAAK;YACjCxB,SAASyB,MAAM,GAAGhB,WAAWgB,MAAM;QACrC;QAEA,IAAIjB,WAAW;YACb,MAAMkB,WAAW,MAAMlB,UAAUkB,QAAQ;YACzClB,YAAY,MAAMlD,yBAAyB;gBACzCS;gBACAyC;gBACAxB;YACF;YACA0B,aAAa,MAAMF,UAAUmB,QAAQ,CAAC;gBAAEC,mBAAmB;YAAK;YAC9D,CAAA,EAAEjB,GAAG,EAAEC,IAAI,EAAE,GAAG,MAAMrE,mBAAmBmE,WAAW/C,IAAI,EAAG,gDAAgD;YAAnD;YAC1DqC,SAASwB,KAAK,GAAGd,WAAWmB,IAAI,CAACL,KAAK;YACtCxB,SAASyB,MAAM,GAAGf,WAAWmB,IAAI,CAACJ,MAAM;YACxCzB,SAAS8B,QAAQ,GAAGpB,WAAWmB,IAAI,CAACE,IAAI;YAExC,0GAA0G;YAC1G,IAAIL,SAASM,KAAK,EAAE;gBAClBhC,SAASyB,MAAM,GAAGf,WAAWmB,IAAI,CAACJ,MAAM,GAAGC,SAASM,KAAK;gBACzDhC,SAAS8B,QAAQ,GAAGpB,WAAW/C,IAAI,CAACsE,MAAM;YAC5C;QACF,OAAO;YACLrB,OAAOvC,KAAK8B,QAAQ;YACpBH,SAAS8B,QAAQ,GAAGzD,KAAK0D,IAAI;YAE7B,IAAI1D,KAAK6D,IAAI,CAAChC,QAAQ,CAAC,MAAM;gBAC3BS,MAAMtC,KAAK6D,IAAI,CAACC,KAAK,CAAC,KAAKC,GAAG,GAAGD,KAAK,CAAC,IAAI,CAAC,EAAE;YAChD,OAAO;gBACLxB,MAAM;YACR;QACF;QAEA,gDAAgD;QAChD,IAAIC,SAAS,qBAAqBD,QAAQ,OAAO;YAC/CC,OAAO;QACT;QACAZ,SAASqC,QAAQ,GAAGzB;QAEpB,MAAM0B,eAAe5F,SAAS2B,KAAK6D,IAAI,CAACK,SAAS,CAAC,GAAGlE,KAAK6D,IAAI,CAACM,WAAW,CAAC,SAASnE,KAAK6D,IAAI;QAC7F3B,aAAa,CAAC,EAAE+B,aAAa,EAAE3B,MAAM,CAAC,CAAC,EAAEA,IAAI,CAAC,GAAG,GAAG,CAAC;QAErD,IAAI,CAAC7C,wBAAwB;YAC3ByC,aAAa,MAAMpD,gBAAgB;gBACjCsF,gBAAgB/E,iBAAiBgF,IAAI;gBACrCC,iBAAiBpC;gBACjBxC;gBACAkB;YACF;QACF;QAEAe,SAASd,QAAQ,GAAGqB;QACpB,IAAIqC,gBAAgBvE;QAEpB,IAAI+B,YAAYjC,OAAO;YACrB,MAAM,EAAER,MAAMkF,YAAY,EAAEhB,IAAI,EAAE,GAAG,MAAM9E,UAAU;gBACnDqD;gBACAK;gBACApC;gBACAyE,gBAAgBxE,YAAYwE,cAAc;gBAC1C/E;gBACAI;gBACA4E,eAAezE,YAAYyE,aAAa;gBACxC/D;YACF;YAEAe,YAAYiD,IAAI,CAAC;gBACfC,QAAQJ;gBACRK,MAAM,CAAC,EAAEjE,WAAW,CAAC,EAAEsB,WAAW,CAAC;YACrC;YAEAqC,gBAAgB;gBACd,GAAGvE,IAAI;gBACPV,MAAMkF;gBACNd,MAAMF,KAAKE,IAAI;YACjB;YACA/B,SAASwB,KAAK,GAAGK,KAAKL,KAAK;YAC3BxB,SAASyB,MAAM,GAAGI,KAAKJ,MAAM;YAC7B,IAAIxB,oBAAoB;gBACtB,MAAMyB,WAAW,MAAMlB,UAAUkB,QAAQ;gBACzC1B,SAASyB,MAAM,GAAGC,SAASM,KAAK,GAAGH,KAAKJ,MAAM,GAAGC,SAASM,KAAK,GAAGH,KAAKJ,MAAM;YAC/E;YACAzB,SAAS8B,QAAQ,GAAGD,KAAKE,IAAI;YAE7B,IAAI1D,KAAK0C,YAAY,EAAE;gBACrB,MAAMvE,GAAG2G,QAAQ,CAACC,SAAS,CAAC/E,KAAK0C,YAAY,EAAE8B,cAAc,oCAAoC;;YACnG,OAAO;gBACL9E,IAAIM,IAAI,GAAGuE;YACb;QACF,OAAO;YACL7C,YAAYiD,IAAI,CAAC;gBACfC,QAAQvC,YAAY/C,QAAQU,KAAKV,IAAI;gBACrCuF,MAAM,CAAC,EAAEjE,WAAW,CAAC,EAAEsB,WAAW,CAAC;YACrC;YAEA,sFAAsF;YACtF,IAAIG,YAAY/C,QAAQU,KAAKV,IAAI,CAACsE,MAAM,GAAG,GAAG;gBAC5C,IAAI5D,KAAK0C,YAAY,EAAE;oBACrB,MAAMvE,GAAG2G,QAAQ,CAACC,SAAS,CAAC/E,KAAK0C,YAAY,EAAEL,YAAY/C,QAAQU,KAAKV,IAAI,EAAE,oCAAoC;;gBACpH,OAAO;oBACL,4DAA4D;oBAC5DI,IAAIM,IAAI,GAAG;wBACT,GAAGA,IAAI;wBACPV,MAAM+C,YAAY/C,QAAQU,KAAKV,IAAI;wBACnCoE,MAAMrB,YAAYmB,KAAKE;oBACzB;gBACF;YACF;QACF;QAEA,IAAIzB,sBAAuB+C,CAAAA,MAAMC,OAAO,CAAC1E,eAAeF,sBAAsB,KAAI,GAAI;YACpFX,IAAIwF,kBAAkB,GAAG,CAAC;YAC1B,MAAM,EAAE9E,UAAU,EAAE+E,QAAQ,EAAEC,WAAW,EAAE,GAAG,MAAMrG,6BAA6B;gBAC/EK,QAAQC;gBACR+C,YAAY,CAACL,WACTK,aACA;oBACE,GAAGA,UAAU;oBACbgB,QAAQzB,SAASyB,MAAM;oBACvBD,OAAOxB,SAASwB,KAAK;gBACvB;gBACJnD,MAAMuE;gBACNP,UAAUrC,SAASqC,QAAQ;gBAC3BtE;gBACA2F,eAAenD,cAAclC,KAAK6D,IAAI;gBACtC/D;gBACAc;gBACAX;gBACAU;YACF;YAEAgB,SAAS2D,KAAK,GAAGH;YACjBxD,SAAS4D,MAAM,GAAGnF,YAAYoF;YAC9B7D,SAAS8D,MAAM,GAAGrF,YAAYsF;YAC9BhE,YAAYiD,IAAI,IAAIS;QACtB;IACF,EAAE,OAAOjE,KAAK;QACZzB,IAAIK,OAAO,CAAC4F,MAAM,CAACC,KAAK,CAACzE;QACzB,MAAM,IAAI5C,gBAAgBmB,IAAI0B,CAAC;IACjC;IAEAK,UAAU;QACR,GAAGA,OAAO;QACV,GAAGE,QAAQ;IACb;IAEA,OAAO;QACLrC,MAAMmC;QACN5B,OAAO6B;IACT;AACF,EAAC;AAED;;CAEC,GACD,SAASxB,sCAAsC2F,IAK9C;IACC,MAAM,EAAEvG,IAAI,EAAEC,SAAS,EAAEC,WAAW,EAAEE,GAAG,EAAE,GAAGmG;IAE9C,qEAAqE;IACrE,MAAM5F,cACJP,IAAIoG,KAAK,EAAE7F,eAAe,OAAOP,IAAIoG,KAAK,CAAC7F,WAAW,KAAK,WACtDP,IAAIoG,KAAK,CAAC7F,WAAW,GACtB,CAAC;IAEP,IAAIA,YAAYG,UAAU,EAAE;QAC1B,OAAOH;IACT;IAEA,MAAM8F,eAAezG;IACrB,MAAM0G,UAAUxG;IAEhB,iDAAiD;IACjD,mGAAmG;IACnG,IAAIwG,WAAWD,aAAaR,MAAM,KAAKS,QAAQT,MAAM,IAAIQ,aAAaN,MAAM,KAAKO,QAAQP,MAAM,EAAE;QAC/F,OAAOlE;IACT;IAEA,IAAIwE,cAAcR,UAAUQ,cAAcN,QAAQ;QAChDxF,YAAYG,UAAU,GAAG;YACvBoF,GAAGO,aAAaR,MAAM;YACtBG,GAAGK,aAAaN,MAAM;QACxB;QACA,OAAOxF;IACT;IAEA,8CAA8C;IAC9C,IAAIV,cAAc,UAAU;QAC1BU,YAAYG,UAAU,GAAG;YACvBoF,GAAG;YACHE,GAAG;QACL;IACF;IACA,OAAOzF;AACT"}
@@ -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;AAiBtD,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,gBAAgB,CAAA;IAC5B,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,eAAO,MAAM,mBAAmB,2BAA4B,OAAO,KAAG,KAAK,EA8M1E,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;AAiBtD,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,gBAAgB,CAAA;IAC5B,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,eAAO,MAAM,mBAAmB,2BAA4B,OAAO,KAAG,KAAK,EAkN1E,CAAA"}
@@ -102,7 +102,9 @@ export const getBaseUploadFields = ({ collection, config })=>{
102
102
  hooks: {
103
103
  afterRead: [
104
104
  ({ data, value })=>{
105
- if (value && !data.filename) return value;
105
+ if (value && !data.filename) {
106
+ return value;
107
+ }
106
108
  return generateURL({
107
109
  collectionSlug: collection.slug,
108
110
  config,
@@ -157,7 +159,9 @@ export const getBaseUploadFields = ({ collection, config })=>{
157
159
  hooks: {
158
160
  afterRead: [
159
161
  ({ data, value })=>{
160
- if (value && size.height && size.width && !data.filename) return value;
162
+ if (value && size.height && size.width && !data.filename) {
163
+ return value;
164
+ }
161
165
  const sizeFilename = data?.sizes?.[size.name]?.filename;
162
166
  if (sizeFilename) {
163
167
  return `${config.serverURL}${config.routes.api}/${collection.slug}/file/${sizeFilename}`;
@@ -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 { mimeTypeValidator } from './mimeTypeValidator.js'\n\ntype GenerateURLArgs = {\n collectionSlug: string\n config: Config\n filename?: string\n}\nconst generateURL = ({ collectionSlug, config, filename }: GenerateURLArgs) => {\n if (filename) {\n return `${config.serverURL || ''}${config.routes.api || ''}/${collectionSlug}/file/${filename}`\n }\n return undefined\n}\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 }) => {\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 if (\n typeof adminThumbnail === 'string' &&\n 'sizes' in originalDoc &&\n originalDoc.sizes?.[adminThumbnail]?.filename\n ) {\n return generateURL({\n collectionSlug: collection.slug,\n config,\n filename: originalDoc.sizes?.[adminThumbnail].filename as string,\n })\n }\n\n return null\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, value }) => {\n if (value && !data.filename) return value\n\n return generateURL({\n collectionSlug: collection.slug,\n config,\n filename: data?.filename,\n })\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 hidden: true,\n },\n }\n }),\n )\n }\n\n if (uploadOptions.mimeTypes) {\n mimeType.validate = mimeTypeValidator(uploadOptions.mimeTypes)\n }\n\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 },\n fields: [\n {\n ...url,\n hooks: {\n afterRead: [\n ({ data, value }) => {\n if (value && size.height && size.width && !data.filename) return value\n\n const sizeFilename = data?.sizes?.[size.name]?.filename\n\n if (sizeFilename) {\n return `${config.serverURL}${config.routes.api}/${collection.slug}/file/${sizeFilename}`\n }\n\n return null\n },\n ],\n },\n },\n width,\n height,\n mimeType,\n filesize,\n {\n ...filename,\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":["mimeTypeValidator","generateURL","collectionSlug","config","filename","serverURL","routes","api","undefined","getBaseUploadFields","collection","uploadOptions","upload","mimeType","name","type","admin","hidden","readOnly","label","thumbnailURL","hooks","afterRead","originalDoc","adminThumbnail","doc","sizes","slug","width","t","height","filesize","disableBulkEdit","index","filenameCompoundIndex","unique","url","uploadFields","data","value","focalPoint","imageSizes","resizeOptions","concat","map","mimeTypes","validate","fields","size","sizeFilename"],"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 { mimeTypeValidator } from './mimeTypeValidator.js'\n\ntype GenerateURLArgs = {\n collectionSlug: string\n config: Config\n filename?: string\n}\nconst generateURL = ({ collectionSlug, config, filename }: GenerateURLArgs) => {\n if (filename) {\n return `${config.serverURL || ''}${config.routes.api || ''}/${collectionSlug}/file/${filename}`\n }\n return undefined\n}\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 }) => {\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 if (\n typeof adminThumbnail === 'string' &&\n 'sizes' in originalDoc &&\n originalDoc.sizes?.[adminThumbnail]?.filename\n ) {\n return generateURL({\n collectionSlug: collection.slug,\n config,\n filename: originalDoc.sizes?.[adminThumbnail].filename as string,\n })\n }\n\n return null\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, value }) => {\n if (value && !data.filename) {\n return value\n }\n\n return generateURL({\n collectionSlug: collection.slug,\n config,\n filename: data?.filename,\n })\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 hidden: true,\n },\n }\n }),\n )\n }\n\n if (uploadOptions.mimeTypes) {\n mimeType.validate = mimeTypeValidator(uploadOptions.mimeTypes)\n }\n\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 },\n fields: [\n {\n ...url,\n hooks: {\n afterRead: [\n ({ data, value }) => {\n if (value && size.height && size.width && !data.filename) {\n return value\n }\n\n const sizeFilename = data?.sizes?.[size.name]?.filename\n\n if (sizeFilename) {\n return `${config.serverURL}${config.routes.api}/${collection.slug}/file/${sizeFilename}`\n }\n\n return null\n },\n ],\n },\n },\n width,\n height,\n mimeType,\n filesize,\n {\n ...filename,\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":["mimeTypeValidator","generateURL","collectionSlug","config","filename","serverURL","routes","api","undefined","getBaseUploadFields","collection","uploadOptions","upload","mimeType","name","type","admin","hidden","readOnly","label","thumbnailURL","hooks","afterRead","originalDoc","adminThumbnail","doc","sizes","slug","width","t","height","filesize","disableBulkEdit","index","filenameCompoundIndex","unique","url","uploadFields","data","value","focalPoint","imageSizes","resizeOptions","concat","map","mimeTypes","validate","fields","size","sizeFilename"],"mappings":"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"}
@@ -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;AAI9D,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,CAiCrF,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;AAI9D,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,CAmCrF,CAAA"}
@@ -15,7 +15,9 @@ export const getExternalFile = async ({ data, req, uploadConfig })=>{
15
15
  headers,
16
16
  method: 'GET'
17
17
  });
18
- if (!res.ok) throw new APIError(`Failed to fetch file from ${fileURL}`, res.status);
18
+ if (!res.ok) {
19
+ throw new APIError(`Failed to fetch file from ${fileURL}`, res.status);
20
+ }
19
21
  const data = await res.arrayBuffer();
20
22
  return {
21
23
  name: filename,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/getExternalFile.ts"],"sourcesContent":["import type { PayloadRequest } from '../types/index.js'\nimport type { File, FileData, UploadConfig } from './types.js'\n\nimport { APIError } from '../errors/index.js'\n\ntype Args = {\n data: FileData\n req: PayloadRequest\n uploadConfig: UploadConfig\n}\nexport const getExternalFile = async ({ data, req, uploadConfig }: Args): Promise<File> => {\n const { filename, url } = data\n\n if (typeof url === 'string') {\n let fileURL = url\n if (!url.startsWith('http')) {\n const baseUrl = req.headers.get('origin') || `${req.protocol}://${req.headers.get('host')}`\n fileURL = `${baseUrl}${url}`\n }\n\n const headers = uploadConfig.externalFileHeaderFilter\n ? uploadConfig.externalFileHeaderFilter(Object.fromEntries(new Headers(req.headers)))\n : { cookie: req.headers?.get('cookie') }\n\n const res = await fetch(fileURL, {\n credentials: 'include',\n headers,\n method: 'GET',\n })\n\n if (!res.ok) throw new APIError(`Failed to fetch file from ${fileURL}`, res.status)\n\n const data = await res.arrayBuffer()\n\n return {\n name: filename,\n data: Buffer.from(data),\n mimetype: res.headers.get('content-type') || undefined,\n size: Number(res.headers.get('content-length')) || 0,\n }\n }\n\n throw new APIError('Invalid file url', 400)\n}\n"],"names":["APIError","getExternalFile","data","req","uploadConfig","filename","url","fileURL","startsWith","baseUrl","headers","get","protocol","externalFileHeaderFilter","Object","fromEntries","Headers","cookie","res","fetch","credentials","method","ok","status","arrayBuffer","name","Buffer","from","mimetype","undefined","size","Number"],"mappings":"AAGA,SAASA,QAAQ,QAAQ,qBAAoB;AAO7C,OAAO,MAAMC,kBAAkB,OAAO,EAAEC,IAAI,EAAEC,GAAG,EAAEC,YAAY,EAAQ;IACrE,MAAM,EAAEC,QAAQ,EAAEC,GAAG,EAAE,GAAGJ;IAE1B,IAAI,OAAOI,QAAQ,UAAU;QAC3B,IAAIC,UAAUD;QACd,IAAI,CAACA,IAAIE,UAAU,CAAC,SAAS;YAC3B,MAAMC,UAAUN,IAAIO,OAAO,CAACC,GAAG,CAAC,aAAa,CAAC,EAAER,IAAIS,QAAQ,CAAC,GAAG,EAAET,IAAIO,OAAO,CAACC,GAAG,CAAC,QAAQ,CAAC;YAC3FJ,UAAU,CAAC,EAAEE,QAAQ,EAAEH,IAAI,CAAC;QAC9B;QAEA,MAAMI,UAAUN,aAAaS,wBAAwB,GACjDT,aAAaS,wBAAwB,CAACC,OAAOC,WAAW,CAAC,IAAIC,QAAQb,IAAIO,OAAO,MAChF;YAAEO,QAAQd,IAAIO,OAAO,EAAEC,IAAI;QAAU;QAEzC,MAAMO,MAAM,MAAMC,MAAMZ,SAAS;YAC/Ba,aAAa;YACbV;YACAW,QAAQ;QACV;QAEA,IAAI,CAACH,IAAII,EAAE,EAAE,MAAM,IAAItB,SAAS,CAAC,0BAA0B,EAAEO,QAAQ,CAAC,EAAEW,IAAIK,MAAM;QAElF,MAAMrB,OAAO,MAAMgB,IAAIM,WAAW;QAElC,OAAO;YACLC,MAAMpB;YACNH,MAAMwB,OAAOC,IAAI,CAACzB;YAClB0B,UAAUV,IAAIR,OAAO,CAACC,GAAG,CAAC,mBAAmBkB;YAC7CC,MAAMC,OAAOb,IAAIR,OAAO,CAACC,GAAG,CAAC,sBAAsB;QACrD;IACF;IAEA,MAAM,IAAIX,SAAS,oBAAoB;AACzC,EAAC"}
1
+ {"version":3,"sources":["../../src/uploads/getExternalFile.ts"],"sourcesContent":["import type { PayloadRequest } from '../types/index.js'\nimport type { File, FileData, UploadConfig } from './types.js'\n\nimport { APIError } from '../errors/index.js'\n\ntype Args = {\n data: FileData\n req: PayloadRequest\n uploadConfig: UploadConfig\n}\nexport const getExternalFile = async ({ data, req, uploadConfig }: Args): Promise<File> => {\n const { filename, url } = data\n\n if (typeof url === 'string') {\n let fileURL = url\n if (!url.startsWith('http')) {\n const baseUrl = req.headers.get('origin') || `${req.protocol}://${req.headers.get('host')}`\n fileURL = `${baseUrl}${url}`\n }\n\n const headers = uploadConfig.externalFileHeaderFilter\n ? uploadConfig.externalFileHeaderFilter(Object.fromEntries(new Headers(req.headers)))\n : { cookie: req.headers?.get('cookie') }\n\n const res = await fetch(fileURL, {\n credentials: 'include',\n headers,\n method: 'GET',\n })\n\n if (!res.ok) {\n throw new APIError(`Failed to fetch file from ${fileURL}`, res.status)\n }\n\n const data = await res.arrayBuffer()\n\n return {\n name: filename,\n data: Buffer.from(data),\n mimetype: res.headers.get('content-type') || undefined,\n size: Number(res.headers.get('content-length')) || 0,\n }\n }\n\n throw new APIError('Invalid file url', 400)\n}\n"],"names":["APIError","getExternalFile","data","req","uploadConfig","filename","url","fileURL","startsWith","baseUrl","headers","get","protocol","externalFileHeaderFilter","Object","fromEntries","Headers","cookie","res","fetch","credentials","method","ok","status","arrayBuffer","name","Buffer","from","mimetype","undefined","size","Number"],"mappings":"AAGA,SAASA,QAAQ,QAAQ,qBAAoB;AAO7C,OAAO,MAAMC,kBAAkB,OAAO,EAAEC,IAAI,EAAEC,GAAG,EAAEC,YAAY,EAAQ;IACrE,MAAM,EAAEC,QAAQ,EAAEC,GAAG,EAAE,GAAGJ;IAE1B,IAAI,OAAOI,QAAQ,UAAU;QAC3B,IAAIC,UAAUD;QACd,IAAI,CAACA,IAAIE,UAAU,CAAC,SAAS;YAC3B,MAAMC,UAAUN,IAAIO,OAAO,CAACC,GAAG,CAAC,aAAa,CAAC,EAAER,IAAIS,QAAQ,CAAC,GAAG,EAAET,IAAIO,OAAO,CAACC,GAAG,CAAC,QAAQ,CAAC;YAC3FJ,UAAU,CAAC,EAAEE,QAAQ,EAAEH,IAAI,CAAC;QAC9B;QAEA,MAAMI,UAAUN,aAAaS,wBAAwB,GACjDT,aAAaS,wBAAwB,CAACC,OAAOC,WAAW,CAAC,IAAIC,QAAQb,IAAIO,OAAO,MAChF;YAAEO,QAAQd,IAAIO,OAAO,EAAEC,IAAI;QAAU;QAEzC,MAAMO,MAAM,MAAMC,MAAMZ,SAAS;YAC/Ba,aAAa;YACbV;YACAW,QAAQ;QACV;QAEA,IAAI,CAACH,IAAII,EAAE,EAAE;YACX,MAAM,IAAItB,SAAS,CAAC,0BAA0B,EAAEO,QAAQ,CAAC,EAAEW,IAAIK,MAAM;QACvE;QAEA,MAAMrB,OAAO,MAAMgB,IAAIM,WAAW;QAElC,OAAO;YACLC,MAAMpB;YACNH,MAAMwB,OAAOC,IAAI,CAACzB;YAClB0B,UAAUV,IAAIR,OAAO,CAACC,GAAG,CAAC,mBAAmBkB;YAC7CC,MAAMC,OAAOb,IAAIR,OAAO,CAACC,GAAG,CAAC,sBAAsB;QACrD;IACF;IAEA,MAAM,IAAIX,SAAS,oBAAoB;AACzC,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"imageResizer.d.ts","sourceRoot":"","sources":["../../src/uploads/imageResizer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,KAAK,EAEV,SAAS,EACT,UAAU,EAEV,eAAe,EACf,WAAW,EACZ,MAAM,YAAY,CAAA;AAMnB,KAAK,UAAU,GAAG;IAChB,MAAM,EAAE,yBAAyB,CAAA;IACjC,UAAU,EAAE,eAAe,CAAA;IAC3B,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B,CAAA;AAED,sEAAsE;AACtE,KAAK,gBAAgB,GAAG;IACtB,UAAU,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,CAAA;IACtC,QAAQ,EAAE,SAAS,CAAA;IACnB,WAAW,EAAE,UAAU,EAAE,CAAA;CAC1B,CAAA;AAyLD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,4BAA4B,CAAC,EACjD,MAAM,EACN,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,GAAG,EACH,aAAa,EACb,KAAK,EACL,UAAU,EACV,WAAW,EACX,YAAY,GACb,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoNxC"}
1
+ {"version":3,"file":"imageResizer.d.ts","sourceRoot":"","sources":["../../src/uploads/imageResizer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,KAAK,EAEV,SAAS,EACT,UAAU,EAEV,eAAe,EACf,WAAW,EACZ,MAAM,YAAY,CAAA;AAMnB,KAAK,UAAU,GAAG;IAChB,MAAM,EAAE,yBAAyB,CAAA;IACjC,UAAU,EAAE,eAAe,CAAA;IAC3B,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B,CAAA;AAED,sEAAsE;AACtE,KAAK,gBAAgB,GAAG;IACtB,UAAU,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,CAAA;IACtC,QAAQ,EAAE,SAAS,CAAA;IACnB,WAAW,EAAE,UAAU,EAAE,CAAA;CAC1B,CAAA;AAmMD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,4BAA4B,CAAC,EACjD,MAAM,EACN,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,GAAG,EACH,aAAa,EACb,KAAK,EACL,UAAU,EACV,WAAW,EACX,YAAY,GACb,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgOxC"}
@@ -74,13 +74,23 @@ const createImageName = ({ extension, height, outputImageName, width })=>{
74
74
  }
75
75
  }
76
76
  const originalImageIsSmallerXOrY = originalImage.width < targetWidth || originalImage.height < targetHeight;
77
- if (fit === 'contain' || fit === 'inside') return 'resize';
78
- if (!isNumber(targetHeight) && !isNumber(targetWidth)) return 'resize';
77
+ if (fit === 'contain' || fit === 'inside') {
78
+ return 'resize';
79
+ }
80
+ if (!isNumber(targetHeight) && !isNumber(targetWidth)) {
81
+ return 'resize';
82
+ }
79
83
  const targetAspectRatio = targetWidth / targetHeight;
80
84
  const originalAspectRatio = originalImage.width / originalImage.height;
81
- if (originalAspectRatio === targetAspectRatio) return 'resize';
82
- if (withoutEnlargement && originalImageIsSmallerXOrY) return 'resize';
83
- if (withoutReduction && !originalImageIsSmallerXOrY) return 'resize';
85
+ if (originalAspectRatio === targetAspectRatio) {
86
+ return 'resize';
87
+ }
88
+ if (withoutEnlargement && originalImageIsSmallerXOrY) {
89
+ return 'resize';
90
+ }
91
+ if (withoutReduction && !originalImageIsSmallerXOrY) {
92
+ return 'resize';
93
+ }
84
94
  return hasFocalPoint ? 'resizeWithFocalPoint' : 'resize';
85
95
  };
86
96
  /**
@@ -149,7 +159,9 @@ const createImageName = ({ extension, height, outputImageName, width })=>{
149
159
  'image/webp'
150
160
  ].includes(file.mimetype);
151
161
  const sharpOptions = {};
152
- if (fileIsAnimatedType) sharpOptions.animated = true;
162
+ if (fileIsAnimatedType) {
163
+ sharpOptions.animated = true;
164
+ }
153
165
  const sharpBase = sharp(file.tempFilePath || file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081
154
166
  ;
155
167
  const originalImageMeta = await sharpBase.metadata();
@@ -164,9 +176,11 @@ const createImageName = ({ extension, height, outputImageName, width })=>{
164
176
  hasFocalPoint: Boolean(incomingFocalPoint),
165
177
  imageResizeConfig
166
178
  });
167
- if (resizeAction === 'omit') return createResult({
168
- name: imageResizeConfig.name
169
- });
179
+ if (resizeAction === 'omit') {
180
+ return createResult({
181
+ name: imageResizeConfig.name
182
+ });
183
+ }
170
184
  const imageToResize = sharpBase.clone();
171
185
  let resized = imageToResize;
172
186
  if (resizeAction === 'resizeWithFocalPoint') {
@@ -180,8 +194,12 @@ const createImageName = ({ extension, height, outputImageName, width })=>{
180
194
  if (resizeWidth && !resizeHeight) {
181
195
  resizeHeight = Math.round(resizeWidth / originalAspectRatio);
182
196
  }
183
- if (!resizeHeight) resizeHeight = resizeImageMeta.height;
184
- if (!resizeWidth) resizeWidth = resizeImageMeta.width;
197
+ if (!resizeHeight) {
198
+ resizeHeight = resizeImageMeta.height;
199
+ }
200
+ if (!resizeWidth) {
201
+ resizeWidth = resizeImageMeta.width;
202
+ }
185
203
  const resizeAspectRatio = resizeWidth / resizeHeight;
186
204
  const prioritizeHeight = resizeAspectRatio < originalAspectRatio;
187
205
  // Scales the image before extracting from it
@@ -214,7 +232,9 @@ const createImageName = ({ extension, height, outputImageName, width })=>{
214
232
  }
215
233
  // if the left bound is less than 0, adjust the left bound to 0
216
234
  // keeping the focus on the left
217
- if (leftBound < 0) leftBound = 0;
235
+ if (leftBound < 0) {
236
+ leftBound = 0;
237
+ }
218
238
  const halfResizeY = resizeHeight / 2;
219
239
  const yFocalCenter = resizeImageMeta.height * (incomingFocalPoint.y / 100);
220
240
  const calculatedBottomPixelBound = yFocalCenter + halfResizeY;
@@ -226,7 +246,9 @@ const createImageName = ({ extension, height, outputImageName, width })=>{
226
246
  }
227
247
  // if the top bound is less than 0, adjust the top bound to 0
228
248
  // keeping the image focus near the top
229
- if (topBound < 0) topBound = 0;
249
+ if (topBound < 0) {
250
+ topBound = 0;
251
+ }
230
252
  resized = resized.extract({
231
253
  height: resizeHeight,
232
254
  left: Math.floor(leftBound),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/imageResizer.ts"],"sourcesContent":["import type { Sharp, Metadata as SharpMetadata, SharpOptions } from 'sharp'\n\nimport { fileTypeFromBuffer } from 'file-type'\nimport fs from 'fs'\nimport sanitize from 'sanitize-filename'\n\nimport type { SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { SharpDependency } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { WithMetadata } from './optionallyAppendMetadata.js'\nimport type {\n FileSize,\n FileSizes,\n FileToSave,\n ImageSize,\n ProbedImageSize,\n UploadEdits,\n} from './types.js'\n\nimport { isNumber } from '../utilities/isNumber.js'\nimport fileExists from './fileExists.js'\nimport { optionallyAppendMetadata } from './optionallyAppendMetadata.js'\n\ntype ResizeArgs = {\n config: SanitizedCollectionConfig\n dimensions: ProbedImageSize\n file: PayloadRequest['file']\n mimeType: string\n req: PayloadRequest\n savedFilename: string\n sharp?: SharpDependency\n staticPath: string\n uploadEdits?: UploadEdits\n withMetadata?: WithMetadata\n}\n\n/** Result from resizing and transforming the requested image sizes */\ntype ImageSizesResult = {\n focalPoint?: UploadEdits['focalPoint']\n sizeData: FileSizes\n sizesToSave: FileToSave[]\n}\n\ntype SanitizedImageData = {\n ext: string\n name: string\n}\n\n/**\n * Sanitize the image name and extract the extension from the source image\n *\n * @param sourceImage - the source image\n * @returns the sanitized name and extension\n */\nconst getSanitizedImageData = (sourceImage: string): SanitizedImageData => {\n const extension = sourceImage.split('.').pop()\n const name = sanitize(sourceImage.substring(0, sourceImage.lastIndexOf('.')) || sourceImage)\n return { name, ext: extension }\n}\n\n/**\n * Create a new image name based on the output image name, the dimensions and\n * the extension.\n *\n * Ignore the fact that duplicate names could happen if the there is one\n * size with `width AND height` and one with only `height OR width`. Because\n * space is expensive, we will reuse the same image for both sizes.\n *\n * @param outputImageName - the sanitized image name\n * @param bufferInfo - the buffer info\n * @param extension - the extension to use\n * @returns the new image name that is not taken\n */\ntype CreateImageNameArgs = {\n extension: string\n height: number\n outputImageName: string\n width: number\n}\nconst createImageName = ({\n extension,\n height,\n outputImageName,\n width,\n}: CreateImageNameArgs): string => {\n return `${outputImageName}-${width}x${height}.${extension}`\n}\n\ntype CreateResultArgs = {\n filename?: FileSize['filename']\n filesize?: FileSize['filesize']\n height?: FileSize['height']\n mimeType?: FileSize['mimeType']\n name: string\n sizesToSave?: FileToSave[]\n width?: FileSize['width']\n}\n\n/**\n * Create the result object for the image resize operation based on the\n * provided parameters. If the name is not provided, an empty result object\n * is returned.\n *\n * @param name - the name of the image\n * @param filename - the filename of the image\n * @param width - the width of the image\n * @param height - the height of the image\n * @param filesize - the filesize of the image\n * @param mimeType - the mime type of the image\n * @param sizesToSave - the sizes to save\n * @returns the result object\n */\nconst createResult = ({\n name,\n filename = null,\n filesize = null,\n height = null,\n mimeType = null,\n sizesToSave = [],\n width = null,\n}: CreateResultArgs): ImageSizesResult => {\n return {\n sizeData: {\n [name]: {\n filename,\n filesize,\n height,\n mimeType,\n width,\n },\n },\n sizesToSave,\n }\n}\n\n/**\n * Determine whether or not to resize the image.\n * - resize using image config\n * - resize using image config with focal adjustments\n * - do not resize at all\n *\n * `imageResizeConfig.withoutEnlargement`:\n * - undefined [default]: uploading images with smaller width AND height than the image size will return null\n * - false: always enlarge images to the image size\n * - true: if the image is smaller than the image size, return the original image\n *\n * `imageResizeConfig.withoutReduction`:\n * - false [default]: always enlarge images to the image size\n * - true: if the image is smaller than the image size, return the original image\n *\n * @return 'omit' | 'resize' | 'resizeWithFocalPoint'\n */\nconst getImageResizeAction = ({\n dimensions: originalImage,\n hasFocalPoint,\n imageResizeConfig,\n}: {\n dimensions: ProbedImageSize\n hasFocalPoint?: boolean\n imageResizeConfig: ImageSize\n}): 'omit' | 'resize' | 'resizeWithFocalPoint' => {\n const {\n fit,\n height: targetHeight,\n width: targetWidth,\n withoutEnlargement,\n withoutReduction,\n } = imageResizeConfig\n\n // prevent upscaling by default when x and y are both smaller than target image size\n if (targetHeight && targetWidth) {\n const originalImageIsSmallerXAndY =\n originalImage.width < targetWidth && originalImage.height < targetHeight\n if (withoutEnlargement === undefined && originalImageIsSmallerXAndY) {\n return 'omit' // prevent image size from being enlarged\n }\n }\n\n const originalImageIsSmallerXOrY =\n originalImage.width < targetWidth || originalImage.height < targetHeight\n if (fit === 'contain' || fit === 'inside') return 'resize'\n if (!isNumber(targetHeight) && !isNumber(targetWidth)) return 'resize'\n\n const targetAspectRatio = targetWidth / targetHeight\n const originalAspectRatio = originalImage.width / originalImage.height\n if (originalAspectRatio === targetAspectRatio) return 'resize'\n\n if (withoutEnlargement && originalImageIsSmallerXOrY) return 'resize'\n if (withoutReduction && !originalImageIsSmallerXOrY) return 'resize'\n\n return hasFocalPoint ? 'resizeWithFocalPoint' : 'resize'\n}\n\n/**\n * Sanitize the resize config. If the resize config has the `withoutReduction`\n * property set to true, the `fit` and `position` properties will be set to `contain`\n * and `top left` respectively.\n *\n * @param resizeConfig - the resize config\n * @returns a sanitized resize config\n */\nconst sanitizeResizeConfig = (resizeConfig: ImageSize): ImageSize => {\n if (resizeConfig.withoutReduction) {\n return {\n ...resizeConfig,\n // Why fit `contain` should also be set to https://github.com/lovell/sharp/issues/3595\n fit: resizeConfig?.fit || 'contain',\n position: resizeConfig?.position || 'left top',\n }\n }\n return resizeConfig\n}\n\n/**\n * Used to extract height from images, animated or not.\n *\n * @param sharpMetadata - the sharp metadata\n * @returns the height of the image\n */\nfunction extractHeightFromImage(sharpMetadata: SharpMetadata): number {\n if (sharpMetadata?.pages) {\n return sharpMetadata.height / sharpMetadata.pages\n }\n return sharpMetadata.height\n}\n\n/**\n * For the provided image sizes, handle the resizing and the transforms\n * (format, trim, etc.) of each requested image size and return the result object.\n * This only handles the image sizes. The transforms of the original image\n * are handled in {@link ./generateFileData.ts}.\n *\n * The image will be resized according to the provided\n * resize config. If no image sizes are requested, the resolved data will be empty.\n * For every image that does not need to be resized, a result object with `null`\n * parameters will be returned.\n *\n * @param resizeConfig - the resize config\n * @returns the result of the resize operation(s)\n */\nexport async function resizeAndTransformImageSizes({\n config,\n dimensions,\n file,\n mimeType,\n req,\n savedFilename,\n sharp,\n staticPath,\n uploadEdits,\n withMetadata,\n}: ResizeArgs): Promise<ImageSizesResult> {\n const { focalPoint: focalPointEnabled = true, imageSizes } = config.upload\n\n // Focal point adjustments\n const incomingFocalPoint = 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 defaultResult: ImageSizesResult = {\n ...(focalPointEnabled && incomingFocalPoint && { focalPoint: incomingFocalPoint }),\n sizeData: {},\n sizesToSave: [],\n }\n\n if (!imageSizes || !sharp) {\n return defaultResult\n }\n\n // Determine if the file is animated\n const fileIsAnimatedType = ['image/avif', 'image/gif', 'image/webp'].includes(file.mimetype)\n const sharpOptions: SharpOptions = {}\n\n if (fileIsAnimatedType) sharpOptions.animated = true\n\n const sharpBase: Sharp | undefined = sharp(file.tempFilePath || file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n const originalImageMeta = await sharpBase.metadata()\n\n const resizeImageMeta = {\n height: extractHeightFromImage(originalImageMeta),\n width: originalImageMeta.width,\n }\n\n const results: ImageSizesResult[] = await Promise.all(\n imageSizes.map(async (imageResizeConfig): Promise<ImageSizesResult> => {\n imageResizeConfig = sanitizeResizeConfig(imageResizeConfig)\n\n const resizeAction = getImageResizeAction({\n dimensions,\n hasFocalPoint: Boolean(incomingFocalPoint),\n imageResizeConfig,\n })\n if (resizeAction === 'omit') return createResult({ name: imageResizeConfig.name })\n\n const imageToResize = sharpBase.clone()\n let resized = imageToResize\n\n if (resizeAction === 'resizeWithFocalPoint') {\n let { height: resizeHeight, width: resizeWidth } = imageResizeConfig\n\n const originalAspectRatio = dimensions.width / dimensions.height\n\n // Calculate resizeWidth based on original aspect ratio if it's undefined\n if (resizeHeight && !resizeWidth) {\n resizeWidth = Math.round(resizeHeight * originalAspectRatio)\n }\n\n // Calculate resizeHeight based on original aspect ratio if it's undefined\n if (resizeWidth && !resizeHeight) {\n resizeHeight = Math.round(resizeWidth / originalAspectRatio)\n }\n\n if (!resizeHeight) resizeHeight = resizeImageMeta.height\n if (!resizeWidth) resizeWidth = resizeImageMeta.width\n\n const resizeAspectRatio = resizeWidth / resizeHeight\n const prioritizeHeight = resizeAspectRatio < originalAspectRatio\n // Scales the image before extracting from it\n resized = imageToResize.resize({\n height: prioritizeHeight ? resizeHeight : undefined,\n width: prioritizeHeight ? undefined : resizeWidth,\n })\n\n const metadataAppendedFile = await optionallyAppendMetadata({\n req,\n sharpFile: resized,\n withMetadata,\n })\n\n // Must read from buffer, resized.metadata will return the original image metadata\n const { info } = await metadataAppendedFile.toBuffer({ resolveWithObject: true })\n\n resizeImageMeta.height = extractHeightFromImage({\n ...originalImageMeta,\n height: info.height,\n })\n resizeImageMeta.width = info.width\n\n const halfResizeX = resizeWidth / 2\n const xFocalCenter = resizeImageMeta.width * (incomingFocalPoint.x / 100)\n const calculatedRightPixelBound = xFocalCenter + halfResizeX\n let leftBound = xFocalCenter - halfResizeX\n\n // if the right bound is greater than the image width, adjust the left bound\n // keeping focus on the right\n if (calculatedRightPixelBound > resizeImageMeta.width) {\n leftBound = resizeImageMeta.width - resizeWidth\n }\n\n // if the left bound is less than 0, adjust the left bound to 0\n // keeping the focus on the left\n if (leftBound < 0) leftBound = 0\n\n const halfResizeY = resizeHeight / 2\n const yFocalCenter = resizeImageMeta.height * (incomingFocalPoint.y / 100)\n const calculatedBottomPixelBound = yFocalCenter + halfResizeY\n let topBound = yFocalCenter - halfResizeY\n\n // if the bottom bound is greater than the image height, adjust the top bound\n // keeping the image as far right as possible\n if (calculatedBottomPixelBound > resizeImageMeta.height) {\n topBound = resizeImageMeta.height - resizeHeight\n }\n\n // if the top bound is less than 0, adjust the top bound to 0\n // keeping the image focus near the top\n if (topBound < 0) topBound = 0\n\n resized = resized.extract({\n height: resizeHeight,\n left: Math.floor(leftBound),\n top: Math.floor(topBound),\n width: resizeWidth,\n })\n } else {\n resized = imageToResize.resize(imageResizeConfig)\n }\n\n if (imageResizeConfig.formatOptions) {\n resized = resized.toFormat(\n imageResizeConfig.formatOptions.format,\n imageResizeConfig.formatOptions.options,\n )\n }\n\n if (imageResizeConfig.trimOptions) {\n resized = resized.trim(imageResizeConfig.trimOptions)\n }\n\n const metadataAppendedFile = await optionallyAppendMetadata({\n req,\n sharpFile: resized,\n withMetadata,\n })\n\n const { data: bufferData, info: bufferInfo } = await metadataAppendedFile.toBuffer({\n resolveWithObject: true,\n })\n\n const sanitizedImage = getSanitizedImageData(savedFilename)\n\n if (req.payloadUploadSizes) {\n req.payloadUploadSizes[imageResizeConfig.name] = bufferData\n }\n\n const mimeInfo = await fileTypeFromBuffer(bufferData)\n\n const imageNameWithDimensions = imageResizeConfig.generateImageName\n ? imageResizeConfig.generateImageName({\n extension: mimeInfo?.ext || sanitizedImage.ext,\n height: extractHeightFromImage({\n ...originalImageMeta,\n height: bufferInfo.height,\n }),\n originalName: sanitizedImage.name,\n sizeName: imageResizeConfig.name,\n width: bufferInfo.width,\n })\n : createImageName({\n extension: mimeInfo?.ext || sanitizedImage.ext,\n height: extractHeightFromImage({\n ...originalImageMeta,\n height: bufferInfo.height,\n }),\n outputImageName: sanitizedImage.name,\n width: bufferInfo.width,\n })\n\n const imagePath = `${staticPath}/${imageNameWithDimensions}`\n\n if (await fileExists(imagePath)) {\n try {\n fs.unlinkSync(imagePath)\n } catch {\n // Ignore unlink errors\n }\n }\n\n const { height, size, width } = bufferInfo\n return createResult({\n name: imageResizeConfig.name,\n filename: imageNameWithDimensions,\n filesize: size,\n height:\n fileIsAnimatedType && originalImageMeta.pages ? height / originalImageMeta.pages : height,\n mimeType: mimeInfo?.mime || mimeType,\n sizesToSave: [{ buffer: bufferData, path: imagePath }],\n width,\n })\n }),\n )\n\n return results.reduce(\n (acc, result) => {\n Object.assign(acc.sizeData, result.sizeData)\n acc.sizesToSave.push(...result.sizesToSave)\n return acc\n },\n { ...defaultResult },\n )\n}\n"],"names":["fileTypeFromBuffer","fs","sanitize","isNumber","fileExists","optionallyAppendMetadata","getSanitizedImageData","sourceImage","extension","split","pop","name","substring","lastIndexOf","ext","createImageName","height","outputImageName","width","createResult","filename","filesize","mimeType","sizesToSave","sizeData","getImageResizeAction","dimensions","originalImage","hasFocalPoint","imageResizeConfig","fit","targetHeight","targetWidth","withoutEnlargement","withoutReduction","originalImageIsSmallerXAndY","undefined","originalImageIsSmallerXOrY","targetAspectRatio","originalAspectRatio","sanitizeResizeConfig","resizeConfig","position","extractHeightFromImage","sharpMetadata","pages","resizeAndTransformImageSizes","config","file","req","savedFilename","sharp","staticPath","uploadEdits","withMetadata","focalPoint","focalPointEnabled","imageSizes","upload","incomingFocalPoint","x","Math","round","y","defaultResult","fileIsAnimatedType","includes","mimetype","sharpOptions","animated","sharpBase","tempFilePath","data","rotate","originalImageMeta","metadata","resizeImageMeta","results","Promise","all","map","resizeAction","Boolean","imageToResize","clone","resized","resizeHeight","resizeWidth","resizeAspectRatio","prioritizeHeight","resize","metadataAppendedFile","sharpFile","info","toBuffer","resolveWithObject","halfResizeX","xFocalCenter","calculatedRightPixelBound","leftBound","halfResizeY","yFocalCenter","calculatedBottomPixelBound","topBound","extract","left","floor","top","formatOptions","toFormat","format","options","trimOptions","trim","bufferData","bufferInfo","sanitizedImage","payloadUploadSizes","mimeInfo","imageNameWithDimensions","generateImageName","originalName","sizeName","imagePath","unlinkSync","size","mime","buffer","path","reduce","acc","result","Object","assign","push"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/uploads/imageResizer.ts"],"sourcesContent":["import type { Sharp, Metadata as SharpMetadata, SharpOptions } from 'sharp'\n\nimport { fileTypeFromBuffer } from 'file-type'\nimport fs from 'fs'\nimport sanitize from 'sanitize-filename'\n\nimport type { SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { SharpDependency } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { WithMetadata } from './optionallyAppendMetadata.js'\nimport type {\n FileSize,\n FileSizes,\n FileToSave,\n ImageSize,\n ProbedImageSize,\n UploadEdits,\n} from './types.js'\n\nimport { isNumber } from '../utilities/isNumber.js'\nimport fileExists from './fileExists.js'\nimport { optionallyAppendMetadata } from './optionallyAppendMetadata.js'\n\ntype ResizeArgs = {\n config: SanitizedCollectionConfig\n dimensions: ProbedImageSize\n file: PayloadRequest['file']\n mimeType: string\n req: PayloadRequest\n savedFilename: string\n sharp?: SharpDependency\n staticPath: string\n uploadEdits?: UploadEdits\n withMetadata?: WithMetadata\n}\n\n/** Result from resizing and transforming the requested image sizes */\ntype ImageSizesResult = {\n focalPoint?: UploadEdits['focalPoint']\n sizeData: FileSizes\n sizesToSave: FileToSave[]\n}\n\ntype SanitizedImageData = {\n ext: string\n name: string\n}\n\n/**\n * Sanitize the image name and extract the extension from the source image\n *\n * @param sourceImage - the source image\n * @returns the sanitized name and extension\n */\nconst getSanitizedImageData = (sourceImage: string): SanitizedImageData => {\n const extension = sourceImage.split('.').pop()\n const name = sanitize(sourceImage.substring(0, sourceImage.lastIndexOf('.')) || sourceImage)\n return { name, ext: extension }\n}\n\n/**\n * Create a new image name based on the output image name, the dimensions and\n * the extension.\n *\n * Ignore the fact that duplicate names could happen if the there is one\n * size with `width AND height` and one with only `height OR width`. Because\n * space is expensive, we will reuse the same image for both sizes.\n *\n * @param outputImageName - the sanitized image name\n * @param bufferInfo - the buffer info\n * @param extension - the extension to use\n * @returns the new image name that is not taken\n */\ntype CreateImageNameArgs = {\n extension: string\n height: number\n outputImageName: string\n width: number\n}\nconst createImageName = ({\n extension,\n height,\n outputImageName,\n width,\n}: CreateImageNameArgs): string => {\n return `${outputImageName}-${width}x${height}.${extension}`\n}\n\ntype CreateResultArgs = {\n filename?: FileSize['filename']\n filesize?: FileSize['filesize']\n height?: FileSize['height']\n mimeType?: FileSize['mimeType']\n name: string\n sizesToSave?: FileToSave[]\n width?: FileSize['width']\n}\n\n/**\n * Create the result object for the image resize operation based on the\n * provided parameters. If the name is not provided, an empty result object\n * is returned.\n *\n * @param name - the name of the image\n * @param filename - the filename of the image\n * @param width - the width of the image\n * @param height - the height of the image\n * @param filesize - the filesize of the image\n * @param mimeType - the mime type of the image\n * @param sizesToSave - the sizes to save\n * @returns the result object\n */\nconst createResult = ({\n name,\n filename = null,\n filesize = null,\n height = null,\n mimeType = null,\n sizesToSave = [],\n width = null,\n}: CreateResultArgs): ImageSizesResult => {\n return {\n sizeData: {\n [name]: {\n filename,\n filesize,\n height,\n mimeType,\n width,\n },\n },\n sizesToSave,\n }\n}\n\n/**\n * Determine whether or not to resize the image.\n * - resize using image config\n * - resize using image config with focal adjustments\n * - do not resize at all\n *\n * `imageResizeConfig.withoutEnlargement`:\n * - undefined [default]: uploading images with smaller width AND height than the image size will return null\n * - false: always enlarge images to the image size\n * - true: if the image is smaller than the image size, return the original image\n *\n * `imageResizeConfig.withoutReduction`:\n * - false [default]: always enlarge images to the image size\n * - true: if the image is smaller than the image size, return the original image\n *\n * @return 'omit' | 'resize' | 'resizeWithFocalPoint'\n */\nconst getImageResizeAction = ({\n dimensions: originalImage,\n hasFocalPoint,\n imageResizeConfig,\n}: {\n dimensions: ProbedImageSize\n hasFocalPoint?: boolean\n imageResizeConfig: ImageSize\n}): 'omit' | 'resize' | 'resizeWithFocalPoint' => {\n const {\n fit,\n height: targetHeight,\n width: targetWidth,\n withoutEnlargement,\n withoutReduction,\n } = imageResizeConfig\n\n // prevent upscaling by default when x and y are both smaller than target image size\n if (targetHeight && targetWidth) {\n const originalImageIsSmallerXAndY =\n originalImage.width < targetWidth && originalImage.height < targetHeight\n if (withoutEnlargement === undefined && originalImageIsSmallerXAndY) {\n return 'omit' // prevent image size from being enlarged\n }\n }\n\n const originalImageIsSmallerXOrY =\n originalImage.width < targetWidth || originalImage.height < targetHeight\n if (fit === 'contain' || fit === 'inside') {\n return 'resize'\n }\n if (!isNumber(targetHeight) && !isNumber(targetWidth)) {\n return 'resize'\n }\n\n const targetAspectRatio = targetWidth / targetHeight\n const originalAspectRatio = originalImage.width / originalImage.height\n if (originalAspectRatio === targetAspectRatio) {\n return 'resize'\n }\n\n if (withoutEnlargement && originalImageIsSmallerXOrY) {\n return 'resize'\n }\n if (withoutReduction && !originalImageIsSmallerXOrY) {\n return 'resize'\n }\n\n return hasFocalPoint ? 'resizeWithFocalPoint' : 'resize'\n}\n\n/**\n * Sanitize the resize config. If the resize config has the `withoutReduction`\n * property set to true, the `fit` and `position` properties will be set to `contain`\n * and `top left` respectively.\n *\n * @param resizeConfig - the resize config\n * @returns a sanitized resize config\n */\nconst sanitizeResizeConfig = (resizeConfig: ImageSize): ImageSize => {\n if (resizeConfig.withoutReduction) {\n return {\n ...resizeConfig,\n // Why fit `contain` should also be set to https://github.com/lovell/sharp/issues/3595\n fit: resizeConfig?.fit || 'contain',\n position: resizeConfig?.position || 'left top',\n }\n }\n return resizeConfig\n}\n\n/**\n * Used to extract height from images, animated or not.\n *\n * @param sharpMetadata - the sharp metadata\n * @returns the height of the image\n */\nfunction extractHeightFromImage(sharpMetadata: SharpMetadata): number {\n if (sharpMetadata?.pages) {\n return sharpMetadata.height / sharpMetadata.pages\n }\n return sharpMetadata.height\n}\n\n/**\n * For the provided image sizes, handle the resizing and the transforms\n * (format, trim, etc.) of each requested image size and return the result object.\n * This only handles the image sizes. The transforms of the original image\n * are handled in {@link ./generateFileData.ts}.\n *\n * The image will be resized according to the provided\n * resize config. If no image sizes are requested, the resolved data will be empty.\n * For every image that does not need to be resized, a result object with `null`\n * parameters will be returned.\n *\n * @param resizeConfig - the resize config\n * @returns the result of the resize operation(s)\n */\nexport async function resizeAndTransformImageSizes({\n config,\n dimensions,\n file,\n mimeType,\n req,\n savedFilename,\n sharp,\n staticPath,\n uploadEdits,\n withMetadata,\n}: ResizeArgs): Promise<ImageSizesResult> {\n const { focalPoint: focalPointEnabled = true, imageSizes } = config.upload\n\n // Focal point adjustments\n const incomingFocalPoint = 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 defaultResult: ImageSizesResult = {\n ...(focalPointEnabled && incomingFocalPoint && { focalPoint: incomingFocalPoint }),\n sizeData: {},\n sizesToSave: [],\n }\n\n if (!imageSizes || !sharp) {\n return defaultResult\n }\n\n // Determine if the file is animated\n const fileIsAnimatedType = ['image/avif', 'image/gif', 'image/webp'].includes(file.mimetype)\n const sharpOptions: SharpOptions = {}\n\n if (fileIsAnimatedType) {\n sharpOptions.animated = true\n }\n\n const sharpBase: Sharp | undefined = sharp(file.tempFilePath || file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n const originalImageMeta = await sharpBase.metadata()\n\n const resizeImageMeta = {\n height: extractHeightFromImage(originalImageMeta),\n width: originalImageMeta.width,\n }\n\n const results: ImageSizesResult[] = await Promise.all(\n imageSizes.map(async (imageResizeConfig): Promise<ImageSizesResult> => {\n imageResizeConfig = sanitizeResizeConfig(imageResizeConfig)\n\n const resizeAction = getImageResizeAction({\n dimensions,\n hasFocalPoint: Boolean(incomingFocalPoint),\n imageResizeConfig,\n })\n if (resizeAction === 'omit') {\n return createResult({ name: imageResizeConfig.name })\n }\n\n const imageToResize = sharpBase.clone()\n let resized = imageToResize\n\n if (resizeAction === 'resizeWithFocalPoint') {\n let { height: resizeHeight, width: resizeWidth } = imageResizeConfig\n\n const originalAspectRatio = dimensions.width / dimensions.height\n\n // Calculate resizeWidth based on original aspect ratio if it's undefined\n if (resizeHeight && !resizeWidth) {\n resizeWidth = Math.round(resizeHeight * originalAspectRatio)\n }\n\n // Calculate resizeHeight based on original aspect ratio if it's undefined\n if (resizeWidth && !resizeHeight) {\n resizeHeight = Math.round(resizeWidth / originalAspectRatio)\n }\n\n if (!resizeHeight) {\n resizeHeight = resizeImageMeta.height\n }\n if (!resizeWidth) {\n resizeWidth = resizeImageMeta.width\n }\n\n const resizeAspectRatio = resizeWidth / resizeHeight\n const prioritizeHeight = resizeAspectRatio < originalAspectRatio\n // Scales the image before extracting from it\n resized = imageToResize.resize({\n height: prioritizeHeight ? resizeHeight : undefined,\n width: prioritizeHeight ? undefined : resizeWidth,\n })\n\n const metadataAppendedFile = await optionallyAppendMetadata({\n req,\n sharpFile: resized,\n withMetadata,\n })\n\n // Must read from buffer, resized.metadata will return the original image metadata\n const { info } = await metadataAppendedFile.toBuffer({ resolveWithObject: true })\n\n resizeImageMeta.height = extractHeightFromImage({\n ...originalImageMeta,\n height: info.height,\n })\n resizeImageMeta.width = info.width\n\n const halfResizeX = resizeWidth / 2\n const xFocalCenter = resizeImageMeta.width * (incomingFocalPoint.x / 100)\n const calculatedRightPixelBound = xFocalCenter + halfResizeX\n let leftBound = xFocalCenter - halfResizeX\n\n // if the right bound is greater than the image width, adjust the left bound\n // keeping focus on the right\n if (calculatedRightPixelBound > resizeImageMeta.width) {\n leftBound = resizeImageMeta.width - resizeWidth\n }\n\n // if the left bound is less than 0, adjust the left bound to 0\n // keeping the focus on the left\n if (leftBound < 0) {\n leftBound = 0\n }\n\n const halfResizeY = resizeHeight / 2\n const yFocalCenter = resizeImageMeta.height * (incomingFocalPoint.y / 100)\n const calculatedBottomPixelBound = yFocalCenter + halfResizeY\n let topBound = yFocalCenter - halfResizeY\n\n // if the bottom bound is greater than the image height, adjust the top bound\n // keeping the image as far right as possible\n if (calculatedBottomPixelBound > resizeImageMeta.height) {\n topBound = resizeImageMeta.height - resizeHeight\n }\n\n // if the top bound is less than 0, adjust the top bound to 0\n // keeping the image focus near the top\n if (topBound < 0) {\n topBound = 0\n }\n\n resized = resized.extract({\n height: resizeHeight,\n left: Math.floor(leftBound),\n top: Math.floor(topBound),\n width: resizeWidth,\n })\n } else {\n resized = imageToResize.resize(imageResizeConfig)\n }\n\n if (imageResizeConfig.formatOptions) {\n resized = resized.toFormat(\n imageResizeConfig.formatOptions.format,\n imageResizeConfig.formatOptions.options,\n )\n }\n\n if (imageResizeConfig.trimOptions) {\n resized = resized.trim(imageResizeConfig.trimOptions)\n }\n\n const metadataAppendedFile = await optionallyAppendMetadata({\n req,\n sharpFile: resized,\n withMetadata,\n })\n\n const { data: bufferData, info: bufferInfo } = await metadataAppendedFile.toBuffer({\n resolveWithObject: true,\n })\n\n const sanitizedImage = getSanitizedImageData(savedFilename)\n\n if (req.payloadUploadSizes) {\n req.payloadUploadSizes[imageResizeConfig.name] = bufferData\n }\n\n const mimeInfo = await fileTypeFromBuffer(bufferData)\n\n const imageNameWithDimensions = imageResizeConfig.generateImageName\n ? imageResizeConfig.generateImageName({\n extension: mimeInfo?.ext || sanitizedImage.ext,\n height: extractHeightFromImage({\n ...originalImageMeta,\n height: bufferInfo.height,\n }),\n originalName: sanitizedImage.name,\n sizeName: imageResizeConfig.name,\n width: bufferInfo.width,\n })\n : createImageName({\n extension: mimeInfo?.ext || sanitizedImage.ext,\n height: extractHeightFromImage({\n ...originalImageMeta,\n height: bufferInfo.height,\n }),\n outputImageName: sanitizedImage.name,\n width: bufferInfo.width,\n })\n\n const imagePath = `${staticPath}/${imageNameWithDimensions}`\n\n if (await fileExists(imagePath)) {\n try {\n fs.unlinkSync(imagePath)\n } catch {\n // Ignore unlink errors\n }\n }\n\n const { height, size, width } = bufferInfo\n return createResult({\n name: imageResizeConfig.name,\n filename: imageNameWithDimensions,\n filesize: size,\n height:\n fileIsAnimatedType && originalImageMeta.pages ? height / originalImageMeta.pages : height,\n mimeType: mimeInfo?.mime || mimeType,\n sizesToSave: [{ buffer: bufferData, path: imagePath }],\n width,\n })\n }),\n )\n\n return results.reduce(\n (acc, result) => {\n Object.assign(acc.sizeData, result.sizeData)\n acc.sizesToSave.push(...result.sizesToSave)\n return acc\n },\n { ...defaultResult },\n )\n}\n"],"names":["fileTypeFromBuffer","fs","sanitize","isNumber","fileExists","optionallyAppendMetadata","getSanitizedImageData","sourceImage","extension","split","pop","name","substring","lastIndexOf","ext","createImageName","height","outputImageName","width","createResult","filename","filesize","mimeType","sizesToSave","sizeData","getImageResizeAction","dimensions","originalImage","hasFocalPoint","imageResizeConfig","fit","targetHeight","targetWidth","withoutEnlargement","withoutReduction","originalImageIsSmallerXAndY","undefined","originalImageIsSmallerXOrY","targetAspectRatio","originalAspectRatio","sanitizeResizeConfig","resizeConfig","position","extractHeightFromImage","sharpMetadata","pages","resizeAndTransformImageSizes","config","file","req","savedFilename","sharp","staticPath","uploadEdits","withMetadata","focalPoint","focalPointEnabled","imageSizes","upload","incomingFocalPoint","x","Math","round","y","defaultResult","fileIsAnimatedType","includes","mimetype","sharpOptions","animated","sharpBase","tempFilePath","data","rotate","originalImageMeta","metadata","resizeImageMeta","results","Promise","all","map","resizeAction","Boolean","imageToResize","clone","resized","resizeHeight","resizeWidth","resizeAspectRatio","prioritizeHeight","resize","metadataAppendedFile","sharpFile","info","toBuffer","resolveWithObject","halfResizeX","xFocalCenter","calculatedRightPixelBound","leftBound","halfResizeY","yFocalCenter","calculatedBottomPixelBound","topBound","extract","left","floor","top","formatOptions","toFormat","format","options","trimOptions","trim","bufferData","bufferInfo","sanitizedImage","payloadUploadSizes","mimeInfo","imageNameWithDimensions","generateImageName","originalName","sizeName","imagePath","unlinkSync","size","mime","buffer","path","reduce","acc","result","Object","assign","push"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"optionallyAppendMetadata.d.ts","sourceRoot":"","sources":["../../src/uploads/optionallyAppendMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,OAAO,CAAA;AAE7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAEvD,MAAM,MAAM,YAAY,GACpB,CAAC,CAAC,OAAO,EAAE;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,cAAc,CAAA;CAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,GACjF,OAAO,CAAA;AAEX,wBAAsB,wBAAwB,CAAC,EAC7C,GAAG,EACH,SAAS,EACT,YAAY,GACb,EAAE;IACD,GAAG,EAAE,cAAc,CAAA;IACnB,SAAS,EAAE,KAAK,CAAA;IAChB,YAAY,EAAE,YAAY,CAAA;CAC3B,GAAG,OAAO,CAAC,KAAK,CAAC,CAYjB"}
1
+ {"version":3,"file":"optionallyAppendMetadata.d.ts","sourceRoot":"","sources":["../../src/uploads/optionallyAppendMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,OAAO,CAAA;AAE7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAEvD,MAAM,MAAM,YAAY,GACpB,CAAC,CAAC,OAAO,EAAE;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,cAAc,CAAA;CAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,GACjF,OAAO,CAAA;AAEX,wBAAsB,wBAAwB,CAAC,EAC7C,GAAG,EACH,SAAS,EACT,YAAY,GACb,EAAE;IACD,GAAG,EAAE,cAAc,CAAA;IACnB,SAAS,EAAE,KAAK,CAAA;IAChB,YAAY,EAAE,YAAY,CAAA;CAC3B,GAAG,OAAO,CAAC,KAAK,CAAC,CAcjB"}
@@ -7,7 +7,9 @@ export async function optionallyAppendMetadata({ req, sharpFile, withMetadata })
7
7
  metadata,
8
8
  req
9
9
  });
10
- if (useMetadata) return sharpFile.withMetadata();
10
+ if (useMetadata) {
11
+ return sharpFile.withMetadata();
12
+ }
11
13
  }
12
14
  return sharpFile;
13
15
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/optionallyAppendMetadata.ts"],"sourcesContent":["import type { Sharp, Metadata as SharpMetadata } from 'sharp'\n\nimport type { PayloadRequest } from '../types/index.js'\n\nexport type WithMetadata =\n | ((options: { metadata: SharpMetadata; req: PayloadRequest }) => Promise<boolean>)\n | boolean\n\nexport async function optionallyAppendMetadata({\n req,\n sharpFile,\n withMetadata,\n}: {\n req: PayloadRequest\n sharpFile: Sharp\n withMetadata: WithMetadata\n}): Promise<Sharp> {\n const metadata = await sharpFile.metadata()\n\n if (withMetadata === true) {\n return sharpFile.withMetadata()\n } else if (typeof withMetadata === 'function') {\n const useMetadata = await withMetadata({ metadata, req })\n\n if (useMetadata) return sharpFile.withMetadata()\n }\n\n return sharpFile\n}\n"],"names":["optionallyAppendMetadata","req","sharpFile","withMetadata","metadata","useMetadata"],"mappings":"AAQA,OAAO,eAAeA,yBAAyB,EAC7CC,GAAG,EACHC,SAAS,EACTC,YAAY,EAKb;IACC,MAAMC,WAAW,MAAMF,UAAUE,QAAQ;IAEzC,IAAID,iBAAiB,MAAM;QACzB,OAAOD,UAAUC,YAAY;IAC/B,OAAO,IAAI,OAAOA,iBAAiB,YAAY;QAC7C,MAAME,cAAc,MAAMF,aAAa;YAAEC;YAAUH;QAAI;QAEvD,IAAII,aAAa,OAAOH,UAAUC,YAAY;IAChD;IAEA,OAAOD;AACT"}
1
+ {"version":3,"sources":["../../src/uploads/optionallyAppendMetadata.ts"],"sourcesContent":["import type { Sharp, Metadata as SharpMetadata } from 'sharp'\n\nimport type { PayloadRequest } from '../types/index.js'\n\nexport type WithMetadata =\n | ((options: { metadata: SharpMetadata; req: PayloadRequest }) => Promise<boolean>)\n | boolean\n\nexport async function optionallyAppendMetadata({\n req,\n sharpFile,\n withMetadata,\n}: {\n req: PayloadRequest\n sharpFile: Sharp\n withMetadata: WithMetadata\n}): Promise<Sharp> {\n const metadata = await sharpFile.metadata()\n\n if (withMetadata === true) {\n return sharpFile.withMetadata()\n } else if (typeof withMetadata === 'function') {\n const useMetadata = await withMetadata({ metadata, req })\n\n if (useMetadata) {\n return sharpFile.withMetadata()\n }\n }\n\n return sharpFile\n}\n"],"names":["optionallyAppendMetadata","req","sharpFile","withMetadata","metadata","useMetadata"],"mappings":"AAQA,OAAO,eAAeA,yBAAyB,EAC7CC,GAAG,EACHC,SAAS,EACTC,YAAY,EAKb;IACC,MAAMC,WAAW,MAAMF,UAAUE,QAAQ;IAEzC,IAAID,iBAAiB,MAAM;QACzB,OAAOD,UAAUC,YAAY;IAC/B,OAAO,IAAI,OAAOA,iBAAiB,YAAY;QAC7C,MAAME,cAAc,MAAMF,aAAa;YAAEC;YAAUH;QAAI;QAEvD,IAAII,aAAa;YACf,OAAOH,UAAUC,YAAY;QAC/B;IACF;IAEA,OAAOD;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"configToJSONSchema.d.ts","sourceRoot":"","sources":["../../src/utilities/configToJSONSchema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAMnE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,KAAK,EAA8B,MAAM,2BAA2B,CAAA;AAClF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AA4HvE;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE,OAAO,GAClB,mBAAmB,GAAG,mBAAmB,EAAE,CAK7C;AAED,wBAAgB,kBAAkB;AAChC;;;;GAIG;AACH,sBAAsB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;CAAE,EAC9D,MAAM,EAAE,KAAK,EAAE;AACf;;GAEG;AACH,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAClD,MAAM,CAAC,EAAE,eAAe,GACvB;IACD,UAAU,EAAE;QACV,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;KACzB,CAAA;IACD,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CA+XA;AAGD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,cAAc,EAAE,yBAAyB,GAAG,qBAAqB,EACjE,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAClD,aAAa,EAAE,QAAQ,GAAG,MAAM,GAC/B,WAAW,CA8Cb;AAgHD,wBAAgB,oCAAoC,CAClD,MAAM,EAAE,yBAAyB,GAChC,WAAW,CA0Bb;AAoBD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,aAAa,CAAC,EAAE,QAAQ,GAAG,MAAM,GAChC,WAAW,CAoDb"}
1
+ {"version":3,"file":"configToJSONSchema.d.ts","sourceRoot":"","sources":["../../src/utilities/configToJSONSchema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAMnE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,KAAK,EAA8B,MAAM,2BAA2B,CAAA;AAClF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAgIvE;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE,OAAO,GAClB,mBAAmB,GAAG,mBAAmB,EAAE,CAO7C;AAED,wBAAgB,kBAAkB;AAChC;;;;GAIG;AACH,sBAAsB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;CAAE,EAC9D,MAAM,EAAE,KAAK,EAAE;AACf;;GAEG;AACH,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAClD,MAAM,CAAC,EAAE,eAAe,GACvB;IACD,UAAU,EAAE;QACV,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;KACzB,CAAA;IACD,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAiYA;AAGD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,cAAc,EAAE,yBAAyB,GAAG,qBAAqB,EACjE,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAClD,aAAa,EAAE,QAAQ,GAAG,MAAM,GAC/B,WAAW,CA8Cb;AAgHD,wBAAgB,oCAAoC,CAClD,MAAM,EAAE,yBAAyB,GAChC,WAAW,CA0Bb;AAoBD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,aAAa,CAAC,EAAE,QAAQ,GAAG,MAAM,GAChC,WAAW,CAoDb"}
@@ -7,9 +7,13 @@ import { toWords } from './formatLabels.js';
7
7
  import { getCollectionIDFieldTypes } from './getCollectionIDFieldTypes.js';
8
8
  const fieldIsRequired = (field)=>{
9
9
  const isConditional = Boolean(field?.admin && field?.admin?.condition);
10
- if (isConditional) return false;
10
+ if (isConditional) {
11
+ return false;
12
+ }
11
13
  const isMarkedRequired = 'required' in field && field.required === true;
12
- if (fieldAffectsData(field) && isMarkedRequired) return true;
14
+ if (fieldAffectsData(field) && isMarkedRequired) {
15
+ return true;
16
+ }
13
17
  // if any subfields are required, this field is required
14
18
  if ('fields' in field && field.type !== 'array') {
15
19
  return field.fields.some((subField)=>fieldIsRequired(subField));
@@ -124,7 +128,9 @@ function generateAuthEntitySchemas(entities) {
124
128
  const fieldTypes = [
125
129
  fieldType
126
130
  ];
127
- if (isRequired) return fieldType;
131
+ if (isRequired) {
132
+ return fieldType;
133
+ }
128
134
  fieldTypes.push('null');
129
135
  return fieldTypes;
130
136
  }
@@ -139,7 +145,9 @@ export function fieldsToJSONSchema(/**
139
145
  return {
140
146
  properties: Object.fromEntries(fields.reduce((fieldSchemas, field)=>{
141
147
  const isRequired = fieldAffectsData(field) && fieldIsRequired(field);
142
- if (isRequired) requiredFieldNames.add(field.name);
148
+ if (isRequired) {
149
+ requiredFieldNames.add(field.name);
150
+ }
143
151
  let fieldSchema;
144
152
  switch(field.type){
145
153
  case 'text':