payload 3.0.0-beta.53 → 3.0.0-beta.55

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 (561) hide show
  1. package/dist/admin/LanguageOptions.js.map +1 -1
  2. package/dist/admin/RichText.js.map +1 -1
  3. package/dist/admin/elements/Cell.d.ts +0 -1
  4. package/dist/admin/elements/Cell.d.ts.map +1 -1
  5. package/dist/admin/elements/Cell.js.map +1 -1
  6. package/dist/admin/elements/DatePicker.js.map +1 -1
  7. package/dist/admin/elements/PreviewButton.js.map +1 -1
  8. package/dist/admin/elements/PublishButton.js.map +1 -1
  9. package/dist/admin/elements/SaveButton.js.map +1 -1
  10. package/dist/admin/elements/SaveDraftButton.js.map +1 -1
  11. package/dist/admin/elements/Tab.d.ts +0 -1
  12. package/dist/admin/elements/Tab.d.ts.map +1 -1
  13. package/dist/admin/elements/Tab.js.map +1 -1
  14. package/dist/admin/elements/Upload.d.ts +3 -0
  15. package/dist/admin/elements/Upload.d.ts.map +1 -0
  16. package/dist/admin/elements/Upload.js +3 -0
  17. package/dist/admin/elements/Upload.js.map +1 -0
  18. package/dist/admin/elements/WithServerSideProps.js.map +1 -1
  19. package/dist/admin/forms/Error.d.ts +0 -1
  20. package/dist/admin/forms/Error.d.ts.map +1 -1
  21. package/dist/admin/forms/Error.js.map +1 -1
  22. package/dist/admin/forms/FieldDescription.js.map +1 -1
  23. package/dist/admin/forms/FieldTypes.d.ts +0 -1
  24. package/dist/admin/forms/FieldTypes.d.ts.map +1 -1
  25. package/dist/admin/forms/FieldTypes.js.map +1 -1
  26. package/dist/admin/forms/Form.js.map +1 -1
  27. package/dist/admin/forms/Label.d.ts +0 -1
  28. package/dist/admin/forms/Label.d.ts.map +1 -1
  29. package/dist/admin/forms/Label.js.map +1 -1
  30. package/dist/admin/forms/RowLabel.js.map +1 -1
  31. package/dist/admin/types.d.ts +1 -0
  32. package/dist/admin/types.d.ts.map +1 -1
  33. package/dist/admin/types.js.map +1 -1
  34. package/dist/admin/views/types.d.ts +0 -1
  35. package/dist/admin/views/types.d.ts.map +1 -1
  36. package/dist/admin/views/types.js.map +1 -1
  37. package/dist/assets/assets.d.js.map +1 -1
  38. package/dist/auth/baseFields/accountLock.d.ts.map +1 -1
  39. package/dist/auth/baseFields/accountLock.js.map +1 -1
  40. package/dist/auth/baseFields/apiKey.d.ts.map +1 -1
  41. package/dist/auth/baseFields/apiKey.js.map +1 -1
  42. package/dist/auth/baseFields/auth.js.map +1 -1
  43. package/dist/auth/baseFields/verification.d.ts.map +1 -1
  44. package/dist/auth/baseFields/verification.js.map +1 -1
  45. package/dist/auth/cookies.d.ts +3 -3
  46. package/dist/auth/cookies.d.ts.map +1 -1
  47. package/dist/auth/cookies.js.map +1 -1
  48. package/dist/auth/crypto.js.map +1 -1
  49. package/dist/auth/defaultAccess.js.map +1 -1
  50. package/dist/auth/defaultUser.js.map +1 -1
  51. package/dist/auth/executeAccess.d.ts.map +1 -1
  52. package/dist/auth/executeAccess.js.map +1 -1
  53. package/dist/auth/executeAuthStrategies.d.ts +2 -2
  54. package/dist/auth/executeAuthStrategies.d.ts.map +1 -1
  55. package/dist/auth/executeAuthStrategies.js.map +1 -1
  56. package/dist/auth/extractJWT.d.ts +1 -1
  57. package/dist/auth/extractJWT.d.ts.map +1 -1
  58. package/dist/auth/extractJWT.js.map +1 -1
  59. package/dist/auth/getAccessResults.js.map +1 -1
  60. package/dist/auth/getFieldsToSign.d.ts +1 -1
  61. package/dist/auth/getFieldsToSign.d.ts.map +1 -1
  62. package/dist/auth/getFieldsToSign.js.map +1 -1
  63. package/dist/auth/index.js.map +1 -1
  64. package/dist/auth/isLocked.js.map +1 -1
  65. package/dist/auth/operations/access.d.ts.map +1 -1
  66. package/dist/auth/operations/access.js.map +1 -1
  67. package/dist/auth/operations/auth.d.ts +2 -3
  68. package/dist/auth/operations/auth.d.ts.map +1 -1
  69. package/dist/auth/operations/auth.js +0 -4
  70. package/dist/auth/operations/auth.js.map +1 -1
  71. package/dist/auth/operations/forgotPassword.d.ts.map +1 -1
  72. package/dist/auth/operations/forgotPassword.js.map +1 -1
  73. package/dist/auth/operations/init.d.ts.map +1 -1
  74. package/dist/auth/operations/init.js.map +1 -1
  75. package/dist/auth/operations/local/auth.d.ts.map +1 -1
  76. package/dist/auth/operations/local/auth.js.map +1 -1
  77. package/dist/auth/operations/local/forgotPassword.d.ts +3 -3
  78. package/dist/auth/operations/local/forgotPassword.d.ts.map +1 -1
  79. package/dist/auth/operations/local/forgotPassword.js.map +1 -1
  80. package/dist/auth/operations/local/index.js.map +1 -1
  81. package/dist/auth/operations/local/login.d.ts +4 -4
  82. package/dist/auth/operations/local/login.d.ts.map +1 -1
  83. package/dist/auth/operations/local/login.js.map +1 -1
  84. package/dist/auth/operations/local/resetPassword.d.ts +3 -3
  85. package/dist/auth/operations/local/resetPassword.d.ts.map +1 -1
  86. package/dist/auth/operations/local/resetPassword.js.map +1 -1
  87. package/dist/auth/operations/local/unlock.d.ts +3 -3
  88. package/dist/auth/operations/local/unlock.d.ts.map +1 -1
  89. package/dist/auth/operations/local/unlock.js.map +1 -1
  90. package/dist/auth/operations/local/verifyEmail.d.ts +3 -3
  91. package/dist/auth/operations/local/verifyEmail.d.ts.map +1 -1
  92. package/dist/auth/operations/local/verifyEmail.js.map +1 -1
  93. package/dist/auth/operations/login.d.ts +4 -4
  94. package/dist/auth/operations/login.d.ts.map +1 -1
  95. package/dist/auth/operations/login.js.map +1 -1
  96. package/dist/auth/operations/logout.d.ts.map +1 -1
  97. package/dist/auth/operations/logout.js.map +1 -1
  98. package/dist/auth/operations/me.d.ts +1 -0
  99. package/dist/auth/operations/me.d.ts.map +1 -1
  100. package/dist/auth/operations/me.js +1 -0
  101. package/dist/auth/operations/me.js.map +1 -1
  102. package/dist/auth/operations/refresh.d.ts +1 -0
  103. package/dist/auth/operations/refresh.d.ts.map +1 -1
  104. package/dist/auth/operations/refresh.js +1 -0
  105. package/dist/auth/operations/refresh.js.map +1 -1
  106. package/dist/auth/operations/registerFirstUser.d.ts +7 -10
  107. package/dist/auth/operations/registerFirstUser.d.ts.map +1 -1
  108. package/dist/auth/operations/registerFirstUser.js.map +1 -1
  109. package/dist/auth/operations/resetPassword.d.ts.map +1 -1
  110. package/dist/auth/operations/resetPassword.js.map +1 -1
  111. package/dist/auth/operations/unlock.d.ts.map +1 -1
  112. package/dist/auth/operations/unlock.js.map +1 -1
  113. package/dist/auth/operations/verifyEmail.d.ts.map +1 -1
  114. package/dist/auth/operations/verifyEmail.js.map +1 -1
  115. package/dist/auth/sendVerificationEmail.js.map +1 -1
  116. package/dist/auth/strategies/apiKey.js.map +1 -1
  117. package/dist/auth/strategies/jwt.js.map +1 -1
  118. package/dist/auth/strategies/local/authenticate.d.ts.map +1 -1
  119. package/dist/auth/strategies/local/authenticate.js.map +1 -1
  120. package/dist/auth/strategies/local/generatePasswordSaltHash.d.ts.map +1 -1
  121. package/dist/auth/strategies/local/generatePasswordSaltHash.js.map +1 -1
  122. package/dist/auth/strategies/local/incrementLoginAttempts.d.ts.map +1 -1
  123. package/dist/auth/strategies/local/incrementLoginAttempts.js.map +1 -1
  124. package/dist/auth/strategies/local/register.d.ts.map +1 -1
  125. package/dist/auth/strategies/local/register.js.map +1 -1
  126. package/dist/auth/strategies/local/resetLoginAttempts.d.ts.map +1 -1
  127. package/dist/auth/strategies/local/resetLoginAttempts.js.map +1 -1
  128. package/dist/auth/types.d.ts +1 -2
  129. package/dist/auth/types.d.ts.map +1 -1
  130. package/dist/auth/types.js.map +1 -1
  131. package/dist/bin/generateTypes.js.map +1 -1
  132. package/dist/bin/index.js.map +1 -1
  133. package/dist/bin/loadEnv.js.map +1 -1
  134. package/dist/bin/loader/clientExtensions.js.map +1 -1
  135. package/dist/bin/loader/compile.js.map +1 -1
  136. package/dist/bin/loader/ignores.js.map +1 -1
  137. package/dist/bin/loader/index.js.map +1 -1
  138. package/dist/bin/loader/read-default-tsconfig.js.map +1 -1
  139. package/dist/bin/loader/resolveOriginalPath.js.map +1 -1
  140. package/dist/bin/migrate.d.ts.map +1 -1
  141. package/dist/bin/migrate.js.map +1 -1
  142. package/dist/collections/config/build.js.map +1 -1
  143. package/dist/collections/config/client.d.ts +79 -109
  144. package/dist/collections/config/client.d.ts.map +1 -1
  145. package/dist/collections/config/client.js.map +1 -1
  146. package/dist/collections/config/defaults.js.map +1 -1
  147. package/dist/collections/config/sanitize.d.ts.map +1 -1
  148. package/dist/collections/config/sanitize.js.map +1 -1
  149. package/dist/collections/config/schema.d.ts.map +1 -1
  150. package/dist/collections/config/schema.js +3 -5
  151. package/dist/collections/config/schema.js.map +1 -1
  152. package/dist/collections/config/types.d.ts +17 -10
  153. package/dist/collections/config/types.d.ts.map +1 -1
  154. package/dist/collections/config/types.js.map +1 -1
  155. package/dist/collections/dataloader.js.map +1 -1
  156. package/dist/collections/operations/count.d.ts +3 -2
  157. package/dist/collections/operations/count.d.ts.map +1 -1
  158. package/dist/collections/operations/count.js.map +1 -1
  159. package/dist/collections/operations/create.d.ts +5 -9
  160. package/dist/collections/operations/create.d.ts.map +1 -1
  161. package/dist/collections/operations/create.js.map +1 -1
  162. package/dist/collections/operations/delete.d.ts +5 -5
  163. package/dist/collections/operations/delete.d.ts.map +1 -1
  164. package/dist/collections/operations/delete.js.map +1 -1
  165. package/dist/collections/operations/deleteByID.d.ts +4 -3
  166. package/dist/collections/operations/deleteByID.d.ts.map +1 -1
  167. package/dist/collections/operations/deleteByID.js.map +1 -1
  168. package/dist/collections/operations/docAccess.js.map +1 -1
  169. package/dist/collections/operations/duplicate.d.ts +3 -3
  170. package/dist/collections/operations/duplicate.d.ts.map +1 -1
  171. package/dist/collections/operations/duplicate.js.map +1 -1
  172. package/dist/collections/operations/find.d.ts +3 -2
  173. package/dist/collections/operations/find.d.ts.map +1 -1
  174. package/dist/collections/operations/find.js.map +1 -1
  175. package/dist/collections/operations/findByID.d.ts +3 -2
  176. package/dist/collections/operations/findByID.d.ts.map +1 -1
  177. package/dist/collections/operations/findByID.js +2 -3
  178. package/dist/collections/operations/findByID.js.map +1 -1
  179. package/dist/collections/operations/findVersionByID.d.ts +1 -1
  180. package/dist/collections/operations/findVersionByID.d.ts.map +1 -1
  181. package/dist/collections/operations/findVersionByID.js.map +1 -1
  182. package/dist/collections/operations/findVersions.d.ts +1 -1
  183. package/dist/collections/operations/findVersions.d.ts.map +1 -1
  184. package/dist/collections/operations/findVersions.js.map +1 -1
  185. package/dist/collections/operations/local/count.d.ts +5 -5
  186. package/dist/collections/operations/local/count.d.ts.map +1 -1
  187. package/dist/collections/operations/local/count.js.map +1 -1
  188. package/dist/collections/operations/local/create.d.ts +7 -7
  189. package/dist/collections/operations/local/create.d.ts.map +1 -1
  190. package/dist/collections/operations/local/create.js.map +1 -1
  191. package/dist/collections/operations/local/delete.d.ts +12 -12
  192. package/dist/collections/operations/local/delete.d.ts.map +1 -1
  193. package/dist/collections/operations/local/delete.js.map +1 -1
  194. package/dist/collections/operations/local/duplicate.d.ts +6 -5
  195. package/dist/collections/operations/local/duplicate.d.ts.map +1 -1
  196. package/dist/collections/operations/local/duplicate.js.map +1 -1
  197. package/dist/collections/operations/local/find.d.ts +7 -6
  198. package/dist/collections/operations/local/find.d.ts.map +1 -1
  199. package/dist/collections/operations/local/find.js +1 -1
  200. package/dist/collections/operations/local/find.js.map +1 -1
  201. package/dist/collections/operations/local/findByID.d.ts +7 -6
  202. package/dist/collections/operations/local/findByID.d.ts.map +1 -1
  203. package/dist/collections/operations/local/findByID.js.map +1 -1
  204. package/dist/collections/operations/local/findVersionByID.d.ts +7 -6
  205. package/dist/collections/operations/local/findVersionByID.d.ts.map +1 -1
  206. package/dist/collections/operations/local/findVersionByID.js.map +1 -1
  207. package/dist/collections/operations/local/findVersions.d.ts +7 -6
  208. package/dist/collections/operations/local/findVersions.d.ts.map +1 -1
  209. package/dist/collections/operations/local/findVersions.js.map +1 -1
  210. package/dist/collections/operations/local/index.d.ts +2 -2
  211. package/dist/collections/operations/local/index.d.ts.map +1 -1
  212. package/dist/collections/operations/local/index.js +2 -2
  213. package/dist/collections/operations/local/index.js.map +1 -1
  214. package/dist/collections/operations/local/restoreVersion.d.ts +7 -6
  215. package/dist/collections/operations/local/restoreVersion.d.ts.map +1 -1
  216. package/dist/collections/operations/local/restoreVersion.js.map +1 -1
  217. package/dist/collections/operations/local/update.d.ts +12 -12
  218. package/dist/collections/operations/local/update.d.ts.map +1 -1
  219. package/dist/collections/operations/local/update.js.map +1 -1
  220. package/dist/collections/operations/restoreVersion.d.ts +1 -1
  221. package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
  222. package/dist/collections/operations/restoreVersion.js.map +1 -1
  223. package/dist/collections/operations/update.d.ts +5 -6
  224. package/dist/collections/operations/update.d.ts.map +1 -1
  225. package/dist/collections/operations/update.js.map +1 -1
  226. package/dist/collections/operations/updateByID.d.ts +5 -7
  227. package/dist/collections/operations/updateByID.d.ts.map +1 -1
  228. package/dist/collections/operations/updateByID.js.map +1 -1
  229. package/dist/collections/operations/utils.d.ts +39 -36
  230. package/dist/collections/operations/utils.d.ts.map +1 -1
  231. package/dist/collections/operations/utils.js +0 -1
  232. package/dist/collections/operations/utils.js.map +1 -1
  233. package/dist/config/build.js.map +1 -1
  234. package/dist/config/client.d.ts.map +1 -1
  235. package/dist/config/client.js.map +1 -1
  236. package/dist/config/defaults.js.map +1 -1
  237. package/dist/config/find.js.map +1 -1
  238. package/dist/config/sanitize.d.ts.map +1 -1
  239. package/dist/config/sanitize.js.map +1 -1
  240. package/dist/config/schema.js.map +1 -1
  241. package/dist/config/shared/adminViewSchema.js.map +1 -1
  242. package/dist/config/shared/componentSchema.js.map +1 -1
  243. package/dist/config/shared/openGraphSchema.js.map +1 -1
  244. package/dist/config/types.d.ts +2 -3
  245. package/dist/config/types.d.ts.map +1 -1
  246. package/dist/config/types.js.map +1 -1
  247. package/dist/config/validate.js.map +1 -1
  248. package/dist/database/combineQueries.js.map +1 -1
  249. package/dist/database/createDatabaseAdapter.js.map +1 -1
  250. package/dist/database/flattenWhereToOperators.js.map +1 -1
  251. package/dist/database/getLocalizedPaths.js.map +1 -1
  252. package/dist/database/migrations/createMigration.js.map +1 -1
  253. package/dist/database/migrations/getMigrations.js.map +1 -1
  254. package/dist/database/migrations/getPredefinedMigration.d.ts.map +1 -1
  255. package/dist/database/migrations/getPredefinedMigration.js.map +1 -1
  256. package/dist/database/migrations/migrate.js.map +1 -1
  257. package/dist/database/migrations/migrateDown.js.map +1 -1
  258. package/dist/database/migrations/migrateRefresh.js.map +1 -1
  259. package/dist/database/migrations/migrateReset.js.map +1 -1
  260. package/dist/database/migrations/migrateStatus.js.map +1 -1
  261. package/dist/database/migrations/migrationTemplate.js.map +1 -1
  262. package/dist/database/migrations/migrationsCollection.js.map +1 -1
  263. package/dist/database/migrations/readMigrationFiles.d.ts.map +1 -1
  264. package/dist/database/migrations/readMigrationFiles.js.map +1 -1
  265. package/dist/database/queryValidation/types.js.map +1 -1
  266. package/dist/database/queryValidation/validateQueryPaths.js.map +1 -1
  267. package/dist/database/queryValidation/validateSearchParams.js.map +1 -1
  268. package/dist/database/types.d.ts +5 -6
  269. package/dist/database/types.d.ts.map +1 -1
  270. package/dist/database/types.js.map +1 -1
  271. package/dist/email/consoleEmailAdapter.js.map +1 -1
  272. package/dist/email/defaults.js.map +1 -1
  273. package/dist/email/getStringifiedToAddress.js.map +1 -1
  274. package/dist/email/sendEmail.js.map +1 -1
  275. package/dist/email/types.js.map +1 -1
  276. package/dist/errors/APIError.js.map +1 -1
  277. package/dist/errors/AuthenticationError.js.map +1 -1
  278. package/dist/errors/DuplicateCollection.js.map +1 -1
  279. package/dist/errors/DuplicateFieldName.js.map +1 -1
  280. package/dist/errors/DuplicateGlobal.js.map +1 -1
  281. package/dist/errors/ErrorDeletingFile.js.map +1 -1
  282. package/dist/errors/FileRetrievalError.js.map +1 -1
  283. package/dist/errors/FileUploadError.js.map +1 -1
  284. package/dist/errors/Forbidden.js.map +1 -1
  285. package/dist/errors/InvalidConfiguration.js.map +1 -1
  286. package/dist/errors/InvalidFieldName.js.map +1 -1
  287. package/dist/errors/InvalidFieldRelationship.js.map +1 -1
  288. package/dist/errors/InvalidSchema.js.map +1 -1
  289. package/dist/errors/LockedAuth.js.map +1 -1
  290. package/dist/errors/MissingCollectionLabel.js.map +1 -1
  291. package/dist/errors/MissingEditorProp.js.map +1 -1
  292. package/dist/errors/MissingFieldInputOptions.js.map +1 -1
  293. package/dist/errors/MissingFieldType.js.map +1 -1
  294. package/dist/errors/MissingFile.js.map +1 -1
  295. package/dist/errors/NotFound.js.map +1 -1
  296. package/dist/errors/QueryError.js.map +1 -1
  297. package/dist/errors/TimestampsRequired.js.map +1 -1
  298. package/dist/errors/UnathorizedError.js.map +1 -1
  299. package/dist/errors/ValidationError.js.map +1 -1
  300. package/dist/errors/index.js.map +1 -1
  301. package/dist/errors/types.js.map +1 -1
  302. package/dist/exports/i18n/ar.js.map +1 -1
  303. package/dist/exports/i18n/az.js.map +1 -1
  304. package/dist/exports/i18n/bg.js.map +1 -1
  305. package/dist/exports/i18n/cs.js.map +1 -1
  306. package/dist/exports/i18n/de.js.map +1 -1
  307. package/dist/exports/i18n/en.js.map +1 -1
  308. package/dist/exports/i18n/es.js.map +1 -1
  309. package/dist/exports/i18n/fa.js.map +1 -1
  310. package/dist/exports/i18n/fr.js.map +1 -1
  311. package/dist/exports/i18n/he.js.map +1 -1
  312. package/dist/exports/i18n/hr.js.map +1 -1
  313. package/dist/exports/i18n/hu.js.map +1 -1
  314. package/dist/exports/i18n/it.js.map +1 -1
  315. package/dist/exports/i18n/ja.js.map +1 -1
  316. package/dist/exports/i18n/ko.js.map +1 -1
  317. package/dist/exports/i18n/my.js.map +1 -1
  318. package/dist/exports/i18n/nb.js.map +1 -1
  319. package/dist/exports/i18n/nl.js.map +1 -1
  320. package/dist/exports/i18n/pl.js.map +1 -1
  321. package/dist/exports/i18n/pt.js.map +1 -1
  322. package/dist/exports/i18n/ro.js.map +1 -1
  323. package/dist/exports/i18n/rs.js.map +1 -1
  324. package/dist/exports/i18n/rsLatin.js.map +1 -1
  325. package/dist/exports/i18n/ru.js.map +1 -1
  326. package/dist/exports/i18n/sv.js.map +1 -1
  327. package/dist/exports/i18n/th.js.map +1 -1
  328. package/dist/exports/i18n/tr.js.map +1 -1
  329. package/dist/exports/i18n/uk.js.map +1 -1
  330. package/dist/exports/i18n/vi.js.map +1 -1
  331. package/dist/exports/i18n/zh.js.map +1 -1
  332. package/dist/exports/i18n/zhTw.js.map +1 -1
  333. package/dist/exports/node.js.map +1 -1
  334. package/dist/exports/shared.js.map +1 -1
  335. package/dist/fields/baseFields/baseBlockFields.js.map +1 -1
  336. package/dist/fields/baseFields/baseIDField.js.map +1 -1
  337. package/dist/fields/config/client.d.ts +333 -334
  338. package/dist/fields/config/client.d.ts.map +1 -1
  339. package/dist/fields/config/client.js.map +1 -1
  340. package/dist/fields/config/sanitize.d.ts.map +1 -1
  341. package/dist/fields/config/sanitize.js.map +1 -1
  342. package/dist/fields/config/sanitize.spec.js.map +1 -1
  343. package/dist/fields/config/schema.js +1 -1
  344. package/dist/fields/config/schema.js.map +1 -1
  345. package/dist/fields/config/types.d.ts +7 -6
  346. package/dist/fields/config/types.d.ts.map +1 -1
  347. package/dist/fields/config/types.js.map +1 -1
  348. package/dist/fields/getDefaultValue.js.map +1 -1
  349. package/dist/fields/getFieldPaths.js.map +1 -1
  350. package/dist/fields/hooks/afterChange/index.d.ts.map +1 -1
  351. package/dist/fields/hooks/afterChange/index.js.map +1 -1
  352. package/dist/fields/hooks/afterChange/promise.d.ts.map +1 -1
  353. package/dist/fields/hooks/afterChange/promise.js.map +1 -1
  354. package/dist/fields/hooks/afterChange/traverseFields.d.ts.map +1 -1
  355. package/dist/fields/hooks/afterChange/traverseFields.js.map +1 -1
  356. package/dist/fields/hooks/afterRead/index.js.map +1 -1
  357. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
  358. package/dist/fields/hooks/afterRead/promise.js.map +1 -1
  359. package/dist/fields/hooks/afterRead/relationshipPopulationPromise.d.ts.map +1 -1
  360. package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js.map +1 -1
  361. package/dist/fields/hooks/afterRead/traverseFields.js.map +1 -1
  362. package/dist/fields/hooks/beforeChange/beforeDuplicate.js.map +1 -1
  363. package/dist/fields/hooks/beforeChange/cloneDataFromOriginalDoc.js.map +1 -1
  364. package/dist/fields/hooks/beforeChange/getExistingRowDoc.d.ts.map +1 -1
  365. package/dist/fields/hooks/beforeChange/getExistingRowDoc.js.map +1 -1
  366. package/dist/fields/hooks/beforeChange/index.d.ts.map +1 -1
  367. package/dist/fields/hooks/beforeChange/index.js.map +1 -1
  368. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  369. package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
  370. package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
  371. package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
  372. package/dist/fields/hooks/beforeValidate/index.d.ts.map +1 -1
  373. package/dist/fields/hooks/beforeValidate/index.js.map +1 -1
  374. package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
  375. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  376. package/dist/fields/hooks/beforeValidate/traverseFields.d.ts.map +1 -1
  377. package/dist/fields/hooks/beforeValidate/traverseFields.js.map +1 -1
  378. package/dist/fields/mergeBaseFields.js.map +1 -1
  379. package/dist/fields/setDefaultBeforeDuplicate.js.map +1 -1
  380. package/dist/fields/sortableFieldTypes.js.map +1 -1
  381. package/dist/fields/validations.d.ts +6 -7
  382. package/dist/fields/validations.d.ts.map +1 -1
  383. package/dist/fields/validations.js +1 -1
  384. package/dist/fields/validations.js.map +1 -1
  385. package/dist/fields/validations.spec.js.map +1 -1
  386. package/dist/globals/config/client.d.ts +2 -2
  387. package/dist/globals/config/client.js.map +1 -1
  388. package/dist/globals/config/sanitize.d.ts.map +1 -1
  389. package/dist/globals/config/sanitize.js.map +1 -1
  390. package/dist/globals/config/schema.js.map +1 -1
  391. package/dist/globals/config/types.d.ts +2 -3
  392. package/dist/globals/config/types.d.ts.map +1 -1
  393. package/dist/globals/config/types.js.map +1 -1
  394. package/dist/globals/operations/docAccess.d.ts.map +1 -1
  395. package/dist/globals/operations/docAccess.js.map +1 -1
  396. package/dist/globals/operations/findOne.d.ts.map +1 -1
  397. package/dist/globals/operations/findOne.js.map +1 -1
  398. package/dist/globals/operations/findVersionByID.d.ts.map +1 -1
  399. package/dist/globals/operations/findVersionByID.js.map +1 -1
  400. package/dist/globals/operations/findVersions.d.ts.map +1 -1
  401. package/dist/globals/operations/findVersions.js.map +1 -1
  402. package/dist/globals/operations/local/findOne.d.ts +7 -6
  403. package/dist/globals/operations/local/findOne.d.ts.map +1 -1
  404. package/dist/globals/operations/local/findOne.js.map +1 -1
  405. package/dist/globals/operations/local/findVersionByID.d.ts +7 -6
  406. package/dist/globals/operations/local/findVersionByID.d.ts.map +1 -1
  407. package/dist/globals/operations/local/findVersionByID.js.map +1 -1
  408. package/dist/globals/operations/local/findVersions.d.ts +7 -6
  409. package/dist/globals/operations/local/findVersions.d.ts.map +1 -1
  410. package/dist/globals/operations/local/findVersions.js.map +1 -1
  411. package/dist/globals/operations/local/index.js.map +1 -1
  412. package/dist/globals/operations/local/restoreVersion.d.ts +7 -6
  413. package/dist/globals/operations/local/restoreVersion.d.ts.map +1 -1
  414. package/dist/globals/operations/local/restoreVersion.js.map +1 -1
  415. package/dist/globals/operations/local/update.d.ts +7 -6
  416. package/dist/globals/operations/local/update.d.ts.map +1 -1
  417. package/dist/globals/operations/local/update.js.map +1 -1
  418. package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
  419. package/dist/globals/operations/restoreVersion.js.map +1 -1
  420. package/dist/globals/operations/update.d.ts +5 -7
  421. package/dist/globals/operations/update.d.ts.map +1 -1
  422. package/dist/globals/operations/update.js.map +1 -1
  423. package/dist/index.d.ts +55 -44
  424. package/dist/index.d.ts.map +1 -1
  425. package/dist/index.js +2 -3
  426. package/dist/index.js.map +1 -1
  427. package/dist/preferences/deleteUserPreferences.js.map +1 -1
  428. package/dist/preferences/operations/delete.js.map +1 -1
  429. package/dist/preferences/operations/findOne.d.ts +2 -2
  430. package/dist/preferences/operations/findOne.d.ts.map +1 -1
  431. package/dist/preferences/operations/findOne.js.map +1 -1
  432. package/dist/preferences/operations/update.js.map +1 -1
  433. package/dist/preferences/preferencesCollection.js.map +1 -1
  434. package/dist/preferences/requestHandlers/delete.js.map +1 -1
  435. package/dist/preferences/requestHandlers/findOne.js.map +1 -1
  436. package/dist/preferences/requestHandlers/update.js.map +1 -1
  437. package/dist/preferences/types.js.map +1 -1
  438. package/dist/translations/getLocalI18n.js.map +1 -1
  439. package/dist/types/constants.js.map +1 -1
  440. package/dist/types/index.d.ts +3 -4
  441. package/dist/types/index.d.ts.map +1 -1
  442. package/dist/types/index.js.map +1 -1
  443. package/dist/uploads/canResizeImage.js.map +1 -1
  444. package/dist/uploads/cropImage.js +3 -3
  445. package/dist/uploads/cropImage.js.map +1 -1
  446. package/dist/uploads/deleteAssociatedFiles.js.map +1 -1
  447. package/dist/uploads/docWithFilenameExists.d.ts.map +1 -1
  448. package/dist/uploads/docWithFilenameExists.js.map +1 -1
  449. package/dist/uploads/fileExists.d.ts.map +1 -1
  450. package/dist/uploads/fileExists.js.map +1 -1
  451. package/dist/uploads/formatFilesize.js.map +1 -1
  452. package/dist/uploads/generateFileData.d.ts.map +1 -1
  453. package/dist/uploads/generateFileData.js.map +1 -1
  454. package/dist/uploads/getBaseFields.js.map +1 -1
  455. package/dist/uploads/getExternalFile.d.ts.map +1 -1
  456. package/dist/uploads/getExternalFile.js.map +1 -1
  457. package/dist/uploads/getFileByPath.d.ts +1 -1
  458. package/dist/uploads/getFileByPath.d.ts.map +1 -1
  459. package/dist/uploads/getFileByPath.js.map +1 -1
  460. package/dist/uploads/getImageSize.js.map +1 -1
  461. package/dist/uploads/getSafeFilename.js.map +1 -1
  462. package/dist/uploads/imageResizer.js.map +1 -1
  463. package/dist/uploads/isImage.js.map +1 -1
  464. package/dist/uploads/mimeTypeValidator.js.map +1 -1
  465. package/dist/uploads/mimeTypeValidator.spec.js.map +1 -1
  466. package/dist/uploads/saveBufferToFile.d.ts +0 -1
  467. package/dist/uploads/saveBufferToFile.d.ts.map +1 -1
  468. package/dist/uploads/saveBufferToFile.js.map +1 -1
  469. package/dist/uploads/tempFile.js.map +1 -1
  470. package/dist/uploads/types.d.ts +74 -7
  471. package/dist/uploads/types.d.ts.map +1 -1
  472. package/dist/uploads/types.js.map +1 -1
  473. package/dist/uploads/unlinkTempFiles.js.map +1 -1
  474. package/dist/uploads/uploadFiles.d.ts.map +1 -1
  475. package/dist/uploads/uploadFiles.js.map +1 -1
  476. package/dist/utilities/checkDuplicateCollections.js.map +1 -1
  477. package/dist/utilities/combineMerge.js.map +1 -1
  478. package/dist/utilities/commitTransaction.js.map +1 -1
  479. package/dist/utilities/configToJSONSchema.js.map +1 -1
  480. package/dist/utilities/configToJSONSchema.spec.js.map +1 -1
  481. package/dist/utilities/convertData.js.map +1 -1
  482. package/dist/utilities/createArrayFromCommaDelineated.js.map +1 -1
  483. package/dist/utilities/createLocalReq.js.map +1 -1
  484. package/dist/utilities/deepCopyObject.js.map +1 -1
  485. package/dist/utilities/deepMerge.js.map +1 -1
  486. package/dist/utilities/dependencies/getDependencies.d.ts.map +1 -1
  487. package/dist/utilities/dependencies/getDependencies.js +21 -4
  488. package/dist/utilities/dependencies/getDependencies.js.map +1 -1
  489. package/dist/utilities/dependencies/isError.js.map +1 -1
  490. package/dist/utilities/dependencies/realPath.d.ts +0 -1
  491. package/dist/utilities/dependencies/realPath.d.ts.map +1 -1
  492. package/dist/utilities/dependencies/realPath.js.map +1 -1
  493. package/dist/utilities/dependencies/resolveFrom.js.map +1 -1
  494. package/dist/utilities/fieldSchemaToJSON.d.ts.map +1 -1
  495. package/dist/utilities/fieldSchemaToJSON.js.map +1 -1
  496. package/dist/utilities/flattenTopLevelFields.js.map +1 -1
  497. package/dist/utilities/formatLabels.js.map +1 -1
  498. package/dist/utilities/formatLabels.spec.js.map +1 -1
  499. package/dist/utilities/getCSSVariable.js.map +1 -1
  500. package/dist/utilities/getCollectionIDFieldTypes.js.map +1 -1
  501. package/dist/utilities/getEntityPolicies.js.map +1 -1
  502. package/dist/utilities/getObjectDotNotation.d.ts.map +1 -1
  503. package/dist/utilities/getObjectDotNotation.js.map +1 -1
  504. package/dist/utilities/getUniqueListBy.js.map +1 -1
  505. package/dist/utilities/importWithoutClientFiles.d.ts.map +1 -1
  506. package/dist/utilities/importWithoutClientFiles.js.map +1 -1
  507. package/dist/utilities/initTransaction.js.map +1 -1
  508. package/dist/utilities/isEntityHidden.d.ts +2 -2
  509. package/dist/utilities/isEntityHidden.js.map +1 -1
  510. package/dist/utilities/isNumber.js.map +1 -1
  511. package/dist/utilities/isPlainObject.js.map +1 -1
  512. package/dist/utilities/isReactComponent.js.map +1 -1
  513. package/dist/utilities/isValidID.d.ts +1 -1
  514. package/dist/utilities/isValidID.js.map +1 -1
  515. package/dist/utilities/isolateObjectProperty.js.map +1 -1
  516. package/dist/utilities/killTransaction.js.map +1 -1
  517. package/dist/utilities/logger.d.ts.map +1 -1
  518. package/dist/utilities/logger.js.map +1 -1
  519. package/dist/utilities/mapAsync.js.map +1 -1
  520. package/dist/utilities/mergeListSearchAndWhere.js.map +1 -1
  521. package/dist/utilities/overwriteMerge.js.map +1 -1
  522. package/dist/utilities/parseCookies.d.ts +1 -1
  523. package/dist/utilities/parseCookies.d.ts.map +1 -1
  524. package/dist/utilities/parseCookies.js.map +1 -1
  525. package/dist/utilities/sanitizeInternalFields.d.ts.map +1 -1
  526. package/dist/utilities/sanitizeInternalFields.js.map +1 -1
  527. package/dist/utilities/setsAreEqual.d.ts.map +1 -1
  528. package/dist/utilities/setsAreEqual.js.map +1 -1
  529. package/dist/utilities/telemetry/events/adminInit.js.map +1 -1
  530. package/dist/utilities/telemetry/events/serverInit.d.ts.map +1 -1
  531. package/dist/utilities/telemetry/events/serverInit.js.map +1 -1
  532. package/dist/utilities/telemetry/index.d.ts +1 -1
  533. package/dist/utilities/telemetry/index.d.ts.map +1 -1
  534. package/dist/utilities/telemetry/index.js.map +1 -1
  535. package/dist/utilities/telemetry/oneWayHash.d.ts +0 -1
  536. package/dist/utilities/telemetry/oneWayHash.d.ts.map +1 -1
  537. package/dist/utilities/telemetry/oneWayHash.js.map +1 -1
  538. package/dist/utilities/timestamp.js.map +1 -1
  539. package/dist/utilities/toKebabCase.js.map +1 -1
  540. package/dist/utilities/wait.js.map +1 -1
  541. package/dist/utilities/wordBoundariesRegex.js.map +1 -1
  542. package/dist/versions/baseFields.js.map +1 -1
  543. package/dist/versions/buildCollectionFields.js.map +1 -1
  544. package/dist/versions/buildGlobalFields.js.map +1 -1
  545. package/dist/versions/defaults.js.map +1 -1
  546. package/dist/versions/deleteCollectionVersions.d.ts.map +1 -1
  547. package/dist/versions/deleteCollectionVersions.js.map +1 -1
  548. package/dist/versions/drafts/appendVersionToQueryKey.js.map +1 -1
  549. package/dist/versions/drafts/getQueryDraftsSort.js.map +1 -1
  550. package/dist/versions/drafts/replaceWithDraftIfAvailable.d.ts.map +1 -1
  551. package/dist/versions/drafts/replaceWithDraftIfAvailable.js.map +1 -1
  552. package/dist/versions/enforceMaxVersions.d.ts.map +1 -1
  553. package/dist/versions/enforceMaxVersions.js.map +1 -1
  554. package/dist/versions/getLatestCollectionVersion.d.ts.map +1 -1
  555. package/dist/versions/getLatestCollectionVersion.js.map +1 -1
  556. package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
  557. package/dist/versions/getLatestGlobalVersion.js.map +1 -1
  558. package/dist/versions/saveVersion.d.ts.map +1 -1
  559. package/dist/versions/saveVersion.js.map +1 -1
  560. package/dist/versions/types.js.map +1 -1
  561. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/docWithFilenameExists.ts"],"sourcesContent":["import type { PayloadRequestWithData } from '../types/index.js'\n\ntype Args = {\n collectionSlug: string\n filename: string\n path: string\n req: PayloadRequestWithData\n}\n\nconst docWithFilenameExists = async ({ collectionSlug, filename, req }: Args): Promise<boolean> => {\n const doc = await req.payload.db.findOne({\n collection: collectionSlug,\n req,\n where: {\n filename: {\n equals: filename,\n },\n },\n })\n if (doc) return true\n\n return false\n}\n\nexport default docWithFilenameExists\n"],"names":["docWithFilenameExists","collectionSlug","filename","req","doc","payload","db","findOne","collection","where","equals"],"rangeMappings":";;;;;;;;;;;;;","mappings":"AASA,MAAMA,wBAAwB,OAAO,EAAEC,cAAc,EAAEC,QAAQ,EAAEC,GAAG,EAAQ;IAC1E,MAAMC,MAAM,MAAMD,IAAIE,OAAO,CAACC,EAAE,CAACC,OAAO,CAAC;QACvCC,YAAYP;QACZE;QACAM,OAAO;YACLP,UAAU;gBACRQ,QAAQR;YACV;QACF;IACF;IACA,IAAIE,KAAK,OAAO;IAEhB,OAAO;AACT;AAEA,eAAeJ,sBAAqB"}
1
+ {"version":3,"sources":["../../src/uploads/docWithFilenameExists.ts"],"sourcesContent":["import type { PayloadRequestWithData } from '../types/index.js'\n\ntype Args = {\n collectionSlug: string\n filename: string\n path: string\n req: PayloadRequestWithData\n}\n\nconst docWithFilenameExists = async ({ collectionSlug, filename, req }: Args): Promise<boolean> => {\n const doc = await req.payload.db.findOne({\n collection: collectionSlug,\n req,\n where: {\n filename: {\n equals: filename,\n },\n },\n })\n if (doc) return true\n\n return false\n}\n\nexport default docWithFilenameExists\n"],"names":["docWithFilenameExists","collectionSlug","filename","req","doc","payload","db","findOne","collection","where","equals"],"mappings":"AASA,MAAMA,wBAAwB,OAAO,EAAEC,cAAc,EAAEC,QAAQ,EAAEC,GAAG,EAAQ;IAC1E,MAAMC,MAAM,MAAMD,IAAIE,OAAO,CAACC,EAAE,CAACC,OAAO,CAAC;QACvCC,YAAYP;QACZE;QACAM,OAAO;YACLP,UAAU;gBACRQ,QAAQR;YACV;QACF;IACF;IACA,IAAIE,KAAK,OAAO;IAEhB,OAAO;AACT;AAEA,eAAeJ,sBAAqB"}
@@ -1 +1 @@
1
- {"version":3,"file":"fileExists.d.ts","sourceRoot":"","sources":["../../src/uploads/fileExists.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,UAAU,aAAoB,MAAM,KAAG,QAAQ,OAAO,CAQ3D,CAAA;AAED,eAAe,UAAU,CAAA"}
1
+ {"version":3,"file":"fileExists.d.ts","sourceRoot":"","sources":["../../src/uploads/fileExists.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,UAAU,aAAoB,MAAM,KAAG,OAAO,CAAC,OAAO,CAQ3D,CAAA;AAED,eAAe,UAAU,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/fileExists.ts"],"sourcesContent":["import fs from 'fs'\n\nconst fileExists = async (filename: string): Promise<boolean> => {\n try {\n await fs.promises.stat(filename)\n\n return true\n } catch (err) {\n return false\n }\n}\n\nexport default fileExists\n"],"names":["fs","fileExists","filename","promises","stat","err"],"rangeMappings":";;;;;;;;;","mappings":"AAAA,OAAOA,QAAQ,KAAI;AAEnB,MAAMC,aAAa,OAAOC;IACxB,IAAI;QACF,MAAMF,GAAGG,QAAQ,CAACC,IAAI,CAACF;QAEvB,OAAO;IACT,EAAE,OAAOG,KAAK;QACZ,OAAO;IACT;AACF;AAEA,eAAeJ,WAAU"}
1
+ {"version":3,"sources":["../../src/uploads/fileExists.ts"],"sourcesContent":["import fs from 'fs'\n\nconst fileExists = async (filename: string): Promise<boolean> => {\n try {\n await fs.promises.stat(filename)\n\n return true\n } catch (err) {\n return false\n }\n}\n\nexport default fileExists\n"],"names":["fs","fileExists","filename","promises","stat","err"],"mappings":"AAAA,OAAOA,QAAQ,KAAI;AAEnB,MAAMC,aAAa,OAAOC;IACxB,IAAI;QACF,MAAMF,GAAGG,QAAQ,CAACC,IAAI,CAACF;QAEvB,OAAO;IACT,EAAE,OAAOG,KAAK;QACZ,OAAO;IACT;AACF;AAEA,eAAeJ,WAAU"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/formatFilesize.ts"],"sourcesContent":["export function formatFilesize(bytes: number, decimals = 0): string {\n if (bytes === 0) return '0 bytes'\n\n const k = 1024\n const dm = decimals < 0 ? 0 : decimals\n const sizes = [' bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\n\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n\n return `${parseFloat((bytes / k ** i).toFixed(dm))}${sizes[i]}`\n}\n"],"names":["formatFilesize","bytes","decimals","k","dm","sizes","i","Math","floor","log","parseFloat","toFixed"],"rangeMappings":";;;;;;;;;;;;;;;;;","mappings":"AAAA,OAAO,SAASA,eAAeC,KAAa,EAAEC,WAAW,CAAC;IACxD,IAAID,UAAU,GAAG,OAAO;IAExB,MAAME,IAAI;IACV,MAAMC,KAAKF,WAAW,IAAI,IAAIA;IAC9B,MAAMG,QAAQ;QAAC;QAAU;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;KAAK;IAExE,MAAMC,IAAIC,KAAKC,KAAK,CAACD,KAAKE,GAAG,CAACR,SAASM,KAAKE,GAAG,CAACN;IAEhD,OAAO,CAAC,EAAEO,WAAW,AAACT,CAAAA,QAAQE,KAAKG,CAAAA,EAAGK,OAAO,CAACP,KAAK,EAAEC,KAAK,CAACC,EAAE,CAAC,CAAC;AACjE"}
1
+ {"version":3,"sources":["../../src/uploads/formatFilesize.ts"],"sourcesContent":["export function formatFilesize(bytes: number, decimals = 0): string {\n if (bytes === 0) return '0 bytes'\n\n const k = 1024\n const dm = decimals < 0 ? 0 : decimals\n const sizes = [' bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\n\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n\n return `${parseFloat((bytes / k ** i).toFixed(dm))}${sizes[i]}`\n}\n"],"names":["formatFilesize","bytes","decimals","k","dm","sizes","i","Math","floor","log","parseFloat","toFixed"],"mappings":"AAAA,OAAO,SAASA,eAAeC,KAAa,EAAEC,WAAW,CAAC;IACxD,IAAID,UAAU,GAAG,OAAO;IAExB,MAAME,IAAI;IACV,MAAMC,KAAKF,WAAW,IAAI,IAAIA;IAC9B,MAAMG,QAAQ;QAAC;QAAU;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;KAAK;IAExE,MAAMC,IAAIC,KAAKC,KAAK,CAACD,KAAKE,GAAG,CAACR,SAASM,KAAKE,GAAG,CAACN;IAEhD,OAAO,CAAC,EAAEO,WAAW,AAACT,CAAAA,QAAQE,KAAKG,CAAAA,EAAGK,OAAO,CAACP,KAAK,EAAEC,KAAK,CAACC,EAAE,CAAC,CAAC;AACjE"}
@@ -1 +1 @@
1
- {"version":3,"file":"generateFileData.d.ts","sourceRoot":"","sources":["../../src/uploads/generateFileData.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,KAAK,EAAY,UAAU,EAAgC,MAAM,YAAY,CAAA;AAYpF,KAAK,IAAI,CAAC,CAAC,IAAI;IACb,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,WAAW,CAAC,EAAE,CAAC,CAAA;IACf,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,GAAG,EAAE,sBAAsB,CAAA;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,KAAK,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB,CAAC,CAAA;AAEF,eAAO,MAAM,gBAAgB,oIAQ1B,KAAK,CAAC,CAAC,KAAG,OAAO,CAAC,CAoPpB,CAAA"}
1
+ {"version":3,"file":"generateFileData.d.ts","sourceRoot":"","sources":["../../src/uploads/generateFileData.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,KAAK,EAAY,UAAU,EAAgC,MAAM,YAAY,CAAA;AAYpF,KAAK,IAAI,CAAC,CAAC,IAAI;IACb,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,WAAW,CAAC,EAAE,CAAC,CAAA;IACf,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,GAAG,EAAE,sBAAsB,CAAA;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,KAAK,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB,CAAC,CAAA;AAEF,eAAO,MAAM,gBAAgB,GAAU,CAAC,gIAQrC,IAAI,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,CAoPpB,CAAA"}
@@ -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 mkdirp from 'mkdirp'\nimport sanitize from 'sanitize-filename'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequestWithData } 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'\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: PayloadRequestWithData\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 } = 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 mkdirp.sync(staticPath)\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 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()\n } else {\n ext = ''\n }\n }\n\n // Adust 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({ cropData, dimensions, file, sharp })\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 })\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: PayloadRequestWithData\n}): UploadEdits {\n const { data, operation, originalDoc, req } = args\n\n // Get intended focal point change from query string or incoming data\n const {\n uploadEdits = {},\n }: {\n uploadEdits?: UploadEdits\n } = req.query || {}\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","mkdirp","sanitize","FileRetrievalError","FileUploadError","MissingFile","canResizeImage","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","resizeAndTransformImageSizes","isImage","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","staticPath","filename","url","startsWith","filePath","response","uploadConfig","err","t","Error","message","undefined","sync","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","push","buffer","path","promises","writeFile","Array","isArray","payloadUploadSizes","sizeData","sizesToSave","savedFilename","sizes","focalX","x","focalY","y","logger","error","args","query","incomingData","origDoc"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","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 mkdirp from 'mkdirp'\nimport sanitize from 'sanitize-filename'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequestWithData } 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'\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: PayloadRequestWithData\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 } = 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 mkdirp.sync(staticPath)\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 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()\n } else {\n ext = ''\n }\n }\n\n // Adust 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({ cropData, dimensions, file, sharp })\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 })\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: PayloadRequestWithData\n}): UploadEdits {\n const { data, operation, originalDoc, req } = args\n\n // Get intended focal point change from query string or incoming data\n const {\n uploadEdits = {},\n }: {\n uploadEdits?: UploadEdits\n } = req.query || {}\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","mkdirp","sanitize","FileRetrievalError","FileUploadError","MissingFile","canResizeImage","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","resizeAndTransformImageSizes","isImage","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","staticPath","filename","url","startsWith","filePath","response","uploadConfig","err","t","Error","message","undefined","sync","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","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 +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 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) 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) 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","unique","url","uploadFields","data","value","focalPoint","imageSizes","resizeOptions","concat","map","mimeTypes","validate","fields","size","sizeFilename"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","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 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) 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) 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","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,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAI9D,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,QAAQ,CAAA;IACd,GAAG,EAAE,sBAAsB,CAAA;IAC3B,YAAY,EAAE,YAAY,CAAA;CAC3B,CAAA;AACD,eAAO,MAAM,eAAe,gCAAuC,IAAI,KAAG,QAAQ,IAAI,CAiCrF,CAAA"}
1
+ {"version":3,"file":"getExternalFile.d.ts","sourceRoot":"","sources":["../../src/uploads/getExternalFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAI9D,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,QAAQ,CAAA;IACd,GAAG,EAAE,sBAAsB,CAAA;IAC3B,YAAY,EAAE,YAAY,CAAA;CAC3B,CAAA;AACD,eAAO,MAAM,eAAe,gCAAuC,IAAI,KAAG,OAAO,CAAC,IAAI,CAiCrF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/getExternalFile.ts"],"sourcesContent":["import type { PayloadRequestWithData } 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: PayloadRequestWithData\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"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;","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 { PayloadRequestWithData } 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: PayloadRequestWithData\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,3 +1,3 @@
1
1
  import type { PayloadRequestWithData } from '../types/index.js';
2
- export declare const getFileByPath: (filePath: string) => Promise<PayloadRequestWithData['file']>;
2
+ export declare const getFileByPath: (filePath: string) => Promise<PayloadRequestWithData["file"]>;
3
3
  //# sourceMappingURL=getFileByPath.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getFileByPath.d.ts","sourceRoot":"","sources":["../../src/uploads/getFileByPath.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAM/D,eAAO,MAAM,aAAa,aAAoB,MAAM,KAAG,QAAQ,sBAAsB,CAAC,MAAM,CAAC,CAoB5F,CAAA"}
1
+ {"version":3,"file":"getFileByPath.d.ts","sourceRoot":"","sources":["../../src/uploads/getFileByPath.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAM/D,eAAO,MAAM,aAAa,aAAoB,MAAM,KAAG,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAoB5F,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/getFileByPath.ts"],"sourcesContent":["import { fileTypeFromFile } from 'file-type'\nimport fs from 'fs'\nimport path from 'path'\n\nimport type { PayloadRequestWithData } from '../types/index.js'\n\nconst mimeTypeEstimate = {\n svg: 'image/svg+xml',\n}\n\nexport const getFileByPath = async (filePath: string): Promise<PayloadRequestWithData['file']> => {\n if (typeof filePath === 'string') {\n const data = fs.readFileSync(filePath)\n const mimetype = fileTypeFromFile(filePath)\n const { size } = fs.statSync(filePath)\n\n const name = path.basename(filePath)\n const ext = path.extname(filePath).slice(1)\n\n const mime = (await mimetype)?.mime || mimeTypeEstimate[ext]\n\n return {\n name,\n data,\n mimetype: mime,\n size,\n }\n }\n\n return undefined\n}\n"],"names":["fileTypeFromFile","fs","path","mimeTypeEstimate","svg","getFileByPath","filePath","data","readFileSync","mimetype","size","statSync","name","basename","ext","extname","slice","mime","undefined"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,gBAAgB,QAAQ,YAAW;AAC5C,OAAOC,QAAQ,KAAI;AACnB,OAAOC,UAAU,OAAM;AAIvB,MAAMC,mBAAmB;IACvBC,KAAK;AACP;AAEA,OAAO,MAAMC,gBAAgB,OAAOC;IAClC,IAAI,OAAOA,aAAa,UAAU;QAChC,MAAMC,OAAON,GAAGO,YAAY,CAACF;QAC7B,MAAMG,WAAWT,iBAAiBM;QAClC,MAAM,EAAEI,IAAI,EAAE,GAAGT,GAAGU,QAAQ,CAACL;QAE7B,MAAMM,OAAOV,KAAKW,QAAQ,CAACP;QAC3B,MAAMQ,MAAMZ,KAAKa,OAAO,CAACT,UAAUU,KAAK,CAAC;QAEzC,MAAMC,OAAO,AAAC,CAAA,MAAMR,QAAO,GAAIQ,QAAQd,gBAAgB,CAACW,IAAI;QAE5D,OAAO;YACLF;YACAL;YACAE,UAAUQ;YACVP;QACF;IACF;IAEA,OAAOQ;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/uploads/getFileByPath.ts"],"sourcesContent":["import { fileTypeFromFile } from 'file-type'\nimport fs from 'fs'\nimport path from 'path'\n\nimport type { PayloadRequestWithData } from '../types/index.js'\n\nconst mimeTypeEstimate = {\n svg: 'image/svg+xml',\n}\n\nexport const getFileByPath = async (filePath: string): Promise<PayloadRequestWithData['file']> => {\n if (typeof filePath === 'string') {\n const data = fs.readFileSync(filePath)\n const mimetype = fileTypeFromFile(filePath)\n const { size } = fs.statSync(filePath)\n\n const name = path.basename(filePath)\n const ext = path.extname(filePath).slice(1)\n\n const mime = (await mimetype)?.mime || mimeTypeEstimate[ext]\n\n return {\n name,\n data,\n mimetype: mime,\n size,\n }\n }\n\n return undefined\n}\n"],"names":["fileTypeFromFile","fs","path","mimeTypeEstimate","svg","getFileByPath","filePath","data","readFileSync","mimetype","size","statSync","name","basename","ext","extname","slice","mime","undefined"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,YAAW;AAC5C,OAAOC,QAAQ,KAAI;AACnB,OAAOC,UAAU,OAAM;AAIvB,MAAMC,mBAAmB;IACvBC,KAAK;AACP;AAEA,OAAO,MAAMC,gBAAgB,OAAOC;IAClC,IAAI,OAAOA,aAAa,UAAU;QAChC,MAAMC,OAAON,GAAGO,YAAY,CAACF;QAC7B,MAAMG,WAAWT,iBAAiBM;QAClC,MAAM,EAAEI,IAAI,EAAE,GAAGT,GAAGU,QAAQ,CAACL;QAE7B,MAAMM,OAAOV,KAAKW,QAAQ,CAACP;QAC3B,MAAMQ,MAAMZ,KAAKa,OAAO,CAACT,UAAUU,KAAK,CAAC;QAEzC,MAAMC,OAAO,AAAC,CAAA,MAAMR,QAAO,GAAIQ,QAAQd,gBAAgB,CAACW,IAAI;QAE5D,OAAO;YACLF;YACAL;YACAE,UAAUQ;YACVP;QACF;IACF;IAEA,OAAOQ;AACT,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/getImageSize.ts"],"sourcesContent":["import fs from 'fs'\nimport sizeOfImport from 'image-size'\nimport { promisify } from 'util'\n\nimport type { PayloadRequestWithData } from '../types/index.js'\nimport type { ProbedImageSize } from './types.js'\n\nimport { temporaryFileTask } from './tempFile.js'\n\nconst { imageSize } = sizeOfImport\nconst imageSizePromise = promisify(imageSize)\n\nexport async function getImageSize(file: PayloadRequestWithData['file']): Promise<ProbedImageSize> {\n if (file.tempFilePath) {\n return imageSizePromise(file.tempFilePath)\n }\n\n // Tiff file do not support buffers or streams, so we must write to file first\n // then retrieve dimensions. https://github.com/image-size/image-size/issues/103\n if (file.mimetype === 'image/tiff') {\n const dimensions = await temporaryFileTask(\n async (filepath: string) => {\n fs.writeFileSync(filepath, file.data)\n return imageSizePromise(filepath)\n },\n { extension: 'tiff' },\n )\n return dimensions\n }\n\n return imageSize(file.data)\n}\n"],"names":["fs","sizeOfImport","promisify","temporaryFileTask","imageSize","imageSizePromise","getImageSize","file","tempFilePath","mimetype","dimensions","filepath","writeFileSync","data","extension"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,OAAOA,QAAQ,KAAI;AACnB,OAAOC,kBAAkB,aAAY;AACrC,SAASC,SAAS,QAAQ,OAAM;AAKhC,SAASC,iBAAiB,QAAQ,gBAAe;AAEjD,MAAM,EAAEC,SAAS,EAAE,GAAGH;AACtB,MAAMI,mBAAmBH,UAAUE;AAEnC,OAAO,eAAeE,aAAaC,IAAoC;IACrE,IAAIA,KAAKC,YAAY,EAAE;QACrB,OAAOH,iBAAiBE,KAAKC,YAAY;IAC3C;IAEA,8EAA8E;IAC9E,gFAAgF;IAChF,IAAID,KAAKE,QAAQ,KAAK,cAAc;QAClC,MAAMC,aAAa,MAAMP,kBACvB,OAAOQ;YACLX,GAAGY,aAAa,CAACD,UAAUJ,KAAKM,IAAI;YACpC,OAAOR,iBAAiBM;QAC1B,GACA;YAAEG,WAAW;QAAO;QAEtB,OAAOJ;IACT;IAEA,OAAON,UAAUG,KAAKM,IAAI;AAC5B"}
1
+ {"version":3,"sources":["../../src/uploads/getImageSize.ts"],"sourcesContent":["import fs from 'fs'\nimport sizeOfImport from 'image-size'\nimport { promisify } from 'util'\n\nimport type { PayloadRequestWithData } from '../types/index.js'\nimport type { ProbedImageSize } from './types.js'\n\nimport { temporaryFileTask } from './tempFile.js'\n\nconst { imageSize } = sizeOfImport\nconst imageSizePromise = promisify(imageSize)\n\nexport async function getImageSize(file: PayloadRequestWithData['file']): Promise<ProbedImageSize> {\n if (file.tempFilePath) {\n return imageSizePromise(file.tempFilePath)\n }\n\n // Tiff file do not support buffers or streams, so we must write to file first\n // then retrieve dimensions. https://github.com/image-size/image-size/issues/103\n if (file.mimetype === 'image/tiff') {\n const dimensions = await temporaryFileTask(\n async (filepath: string) => {\n fs.writeFileSync(filepath, file.data)\n return imageSizePromise(filepath)\n },\n { extension: 'tiff' },\n )\n return dimensions\n }\n\n return imageSize(file.data)\n}\n"],"names":["fs","sizeOfImport","promisify","temporaryFileTask","imageSize","imageSizePromise","getImageSize","file","tempFilePath","mimetype","dimensions","filepath","writeFileSync","data","extension"],"mappings":"AAAA,OAAOA,QAAQ,KAAI;AACnB,OAAOC,kBAAkB,aAAY;AACrC,SAASC,SAAS,QAAQ,OAAM;AAKhC,SAASC,iBAAiB,QAAQ,gBAAe;AAEjD,MAAM,EAAEC,SAAS,EAAE,GAAGH;AACtB,MAAMI,mBAAmBH,UAAUE;AAEnC,OAAO,eAAeE,aAAaC,IAAoC;IACrE,IAAIA,KAAKC,YAAY,EAAE;QACrB,OAAOH,iBAAiBE,KAAKC,YAAY;IAC3C;IAEA,8EAA8E;IAC9E,gFAAgF;IAChF,IAAID,KAAKE,QAAQ,KAAK,cAAc;QAClC,MAAMC,aAAa,MAAMP,kBACvB,OAAOQ;YACLX,GAAGY,aAAa,CAACD,UAAUJ,KAAKM,IAAI;YACpC,OAAOR,iBAAiBM;QAC1B,GACA;YAAEG,WAAW;QAAO;QAEtB,OAAOJ;IACT;IAEA,OAAON,UAAUG,KAAKM,IAAI;AAC5B"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/getSafeFilename.ts"],"sourcesContent":["import sanitize from 'sanitize-filename'\n\nimport type { PayloadRequestWithData } from '../types/index.js'\n\nimport docWithFilenameExists from './docWithFilenameExists.js'\nimport fileExists from './fileExists.js'\n\nconst incrementName = (name: string) => {\n const extension = name.split('.').pop()\n const baseFilename = sanitize(name.substring(0, name.lastIndexOf('.')) || name)\n let incrementedName = baseFilename\n const regex = /(.*)-(\\d+)$/\n const found = baseFilename.match(regex)\n if (found === null) {\n incrementedName += '-1'\n } else {\n const matchedName = found[1]\n const matchedNumber = found[2]\n const incremented = Number(matchedNumber) + 1\n incrementedName = `${matchedName}-${incremented}`\n }\n return `${incrementedName}.${extension}`\n}\n\ntype Args = {\n collectionSlug: string\n desiredFilename: string\n req: PayloadRequestWithData\n staticPath: string\n}\n\nexport async function getSafeFileName({\n collectionSlug,\n desiredFilename,\n req,\n staticPath,\n}: Args): Promise<string> {\n let modifiedFilename = desiredFilename\n\n // eslint-disable-next-line no-await-in-loop\n while (\n (await docWithFilenameExists({\n collectionSlug,\n filename: modifiedFilename,\n path: staticPath,\n req,\n })) ||\n (await fileExists(`${staticPath}/${modifiedFilename}`))\n ) {\n modifiedFilename = incrementName(modifiedFilename)\n }\n return modifiedFilename\n}\n"],"names":["sanitize","docWithFilenameExists","fileExists","incrementName","name","extension","split","pop","baseFilename","substring","lastIndexOf","incrementedName","regex","found","match","matchedName","matchedNumber","incremented","Number","getSafeFileName","collectionSlug","desiredFilename","req","staticPath","modifiedFilename","filename","path"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,OAAOA,cAAc,oBAAmB;AAIxC,OAAOC,2BAA2B,6BAA4B;AAC9D,OAAOC,gBAAgB,kBAAiB;AAExC,MAAMC,gBAAgB,CAACC;IACrB,MAAMC,YAAYD,KAAKE,KAAK,CAAC,KAAKC,GAAG;IACrC,MAAMC,eAAeR,SAASI,KAAKK,SAAS,CAAC,GAAGL,KAAKM,WAAW,CAAC,SAASN;IAC1E,IAAIO,kBAAkBH;IACtB,MAAMI,QAAQ;IACd,MAAMC,QAAQL,aAAaM,KAAK,CAACF;IACjC,IAAIC,UAAU,MAAM;QAClBF,mBAAmB;IACrB,OAAO;QACL,MAAMI,cAAcF,KAAK,CAAC,EAAE;QAC5B,MAAMG,gBAAgBH,KAAK,CAAC,EAAE;QAC9B,MAAMI,cAAcC,OAAOF,iBAAiB;QAC5CL,kBAAkB,CAAC,EAAEI,YAAY,CAAC,EAAEE,YAAY,CAAC;IACnD;IACA,OAAO,CAAC,EAAEN,gBAAgB,CAAC,EAAEN,UAAU,CAAC;AAC1C;AASA,OAAO,eAAec,gBAAgB,EACpCC,cAAc,EACdC,eAAe,EACfC,GAAG,EACHC,UAAU,EACL;IACL,IAAIC,mBAAmBH;IAEvB,4CAA4C;IAC5C,MACE,AAAC,MAAMpB,sBAAsB;QAC3BmB;QACAK,UAAUD;QACVE,MAAMH;QACND;IACF,MACC,MAAMpB,WAAW,CAAC,EAAEqB,WAAW,CAAC,EAAEC,iBAAiB,CAAC,EACrD;QACAA,mBAAmBrB,cAAcqB;IACnC;IACA,OAAOA;AACT"}
1
+ {"version":3,"sources":["../../src/uploads/getSafeFilename.ts"],"sourcesContent":["import sanitize from 'sanitize-filename'\n\nimport type { PayloadRequestWithData } from '../types/index.js'\n\nimport docWithFilenameExists from './docWithFilenameExists.js'\nimport fileExists from './fileExists.js'\n\nconst incrementName = (name: string) => {\n const extension = name.split('.').pop()\n const baseFilename = sanitize(name.substring(0, name.lastIndexOf('.')) || name)\n let incrementedName = baseFilename\n const regex = /(.*)-(\\d+)$/\n const found = baseFilename.match(regex)\n if (found === null) {\n incrementedName += '-1'\n } else {\n const matchedName = found[1]\n const matchedNumber = found[2]\n const incremented = Number(matchedNumber) + 1\n incrementedName = `${matchedName}-${incremented}`\n }\n return `${incrementedName}.${extension}`\n}\n\ntype Args = {\n collectionSlug: string\n desiredFilename: string\n req: PayloadRequestWithData\n staticPath: string\n}\n\nexport async function getSafeFileName({\n collectionSlug,\n desiredFilename,\n req,\n staticPath,\n}: Args): Promise<string> {\n let modifiedFilename = desiredFilename\n\n // eslint-disable-next-line no-await-in-loop\n while (\n (await docWithFilenameExists({\n collectionSlug,\n filename: modifiedFilename,\n path: staticPath,\n req,\n })) ||\n (await fileExists(`${staticPath}/${modifiedFilename}`))\n ) {\n modifiedFilename = incrementName(modifiedFilename)\n }\n return modifiedFilename\n}\n"],"names":["sanitize","docWithFilenameExists","fileExists","incrementName","name","extension","split","pop","baseFilename","substring","lastIndexOf","incrementedName","regex","found","match","matchedName","matchedNumber","incremented","Number","getSafeFileName","collectionSlug","desiredFilename","req","staticPath","modifiedFilename","filename","path"],"mappings":"AAAA,OAAOA,cAAc,oBAAmB;AAIxC,OAAOC,2BAA2B,6BAA4B;AAC9D,OAAOC,gBAAgB,kBAAiB;AAExC,MAAMC,gBAAgB,CAACC;IACrB,MAAMC,YAAYD,KAAKE,KAAK,CAAC,KAAKC,GAAG;IACrC,MAAMC,eAAeR,SAASI,KAAKK,SAAS,CAAC,GAAGL,KAAKM,WAAW,CAAC,SAASN;IAC1E,IAAIO,kBAAkBH;IACtB,MAAMI,QAAQ;IACd,MAAMC,QAAQL,aAAaM,KAAK,CAACF;IACjC,IAAIC,UAAU,MAAM;QAClBF,mBAAmB;IACrB,OAAO;QACL,MAAMI,cAAcF,KAAK,CAAC,EAAE;QAC5B,MAAMG,gBAAgBH,KAAK,CAAC,EAAE;QAC9B,MAAMI,cAAcC,OAAOF,iBAAiB;QAC5CL,kBAAkB,CAAC,EAAEI,YAAY,CAAC,EAAEE,YAAY,CAAC;IACnD;IACA,OAAO,CAAC,EAAEN,gBAAgB,CAAC,EAAEN,UAAU,CAAC;AAC1C;AASA,OAAO,eAAec,gBAAgB,EACpCC,cAAc,EACdC,eAAe,EACfC,GAAG,EACHC,UAAU,EACL;IACL,IAAIC,mBAAmBH;IAEvB,4CAA4C;IAC5C,MACE,AAAC,MAAMpB,sBAAsB;QAC3BmB;QACAK,UAAUD;QACVE,MAAMH;QACND;IACF,MACC,MAAMpB,WAAW,CAAC,EAAEqB,WAAW,CAAC,EAAEC,iBAAiB,CAAC,EACrD;QACAA,mBAAmBrB,cAAcqB;IACnC;IACA,OAAOA;AACT"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/imageResizer.ts"],"sourcesContent":["import type { OutputInfo, Sharp, 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 { PayloadRequestWithData } from '../types/index.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'\n\ntype ResizeArgs = {\n config: SanitizedCollectionConfig\n dimensions: ProbedImageSize\n file: PayloadRequestWithData['file']\n mimeType: string\n req: PayloadRequestWithData\n savedFilename: string\n sharp?: SharpDependency\n staticPath: string\n uploadEdits?: UploadEdits\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 */\nconst createImageName = (\n outputImageName: string,\n { height, width }: OutputInfo,\n extension: string,\n) => `${outputImageName}-${width}x${height}.${extension}`\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 * Check if the image needs to be resized according to the requested dimensions\n * and the original image size. If the resize options withoutEnlargement or withoutReduction are provided,\n * the image will be resized regardless of the requested dimensions, given that the\n * width or height to be resized is provided.\n *\n * @param resizeConfig - object containing the requested dimensions and resize options\n * @param original - the original image size\n * @returns true if resizing is not needed, false otherwise\n */\nconst preventResize = (\n { height: desiredHeight, width: desiredWidth, withoutEnlargement, withoutReduction }: ImageSize,\n original: ProbedImageSize,\n): boolean => {\n // default is to allow reduction\n if (withoutReduction !== undefined) {\n return false // needs resize\n }\n\n // default is to prevent enlargement\n if (withoutEnlargement !== undefined) {\n return false // needs resize\n }\n\n const isWidthOrHeightNotDefined = !desiredHeight || !desiredWidth\n if (isWidthOrHeightNotDefined) {\n // If width and height are not defined, it means there is a format conversion\n // and the image needs to be \"resized\" (transformed).\n return false // needs resize\n }\n\n const hasInsufficientWidth = desiredWidth > original.width\n const hasInsufficientHeight = desiredHeight > original.height\n if (hasInsufficientWidth && hasInsufficientHeight) {\n // doesn't need resize - prevent enlargement. This should only happen if both width and height are insufficient.\n // if only one dimension is insufficient and the other is sufficient, resizing needs to happen, as the image\n // should be resized to the sufficient dimension.\n return true // do not create a new size\n }\n\n return false // needs resize\n}\n\n/**\n * Check if the image should be passed directly to sharp without payload adjusting properties.\n *\n * @param resizeConfig - object containing the requested dimensions and resize options\n * @param original - the original image size\n * @returns true if the image should passed directly to sharp\n */\nconst applyPayloadAdjustments = (\n { fit, height, width, withoutEnlargement, withoutReduction }: ImageSize,\n original: ProbedImageSize,\n) => {\n if (fit === 'contain' || fit === 'inside') return false\n if (!isNumber(height) && !isNumber(width)) return false\n\n const targetAspectRatio = width / height\n const originalAspectRatio = original.width / original.height\n if (originalAspectRatio === targetAspectRatio) return false\n\n const skipEnlargement = withoutEnlargement && (original.height < height || original.width < width)\n const skipReduction = withoutReduction && (original.height > height || original.width > width)\n if (skipEnlargement || skipReduction) return false\n\n return true\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 * 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}: 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\n const results: ImageSizesResult[] = await Promise.all(\n imageSizes.map(async (imageResizeConfig): Promise<ImageSizesResult> => {\n imageResizeConfig = sanitizeResizeConfig(imageResizeConfig)\n\n // This checks if a resize should happen. If not, the resized image will be\n // skipped COMPLETELY and thus will not be included in the resulting images.\n // All further format/trim options will thus be skipped as well.\n if (preventResize(imageResizeConfig, dimensions)) {\n return createResult({ name: imageResizeConfig.name })\n }\n\n const imageToResize = sharpBase.clone()\n let resized = imageToResize\n\n const metadata = await sharpBase.metadata()\n\n if (incomingFocalPoint && applyPayloadAdjustments(imageResizeConfig, dimensions)) {\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 // Scale the image up or down to fit the resize dimensions\n const scaledImage = imageToResize.resize({\n height: resizeHeight,\n width: resizeWidth,\n })\n\n const { info: scaledImageInfo } = await scaledImage.toBuffer({ resolveWithObject: true })\n\n const safeResizeWidth = resizeWidth ?? scaledImageInfo.width\n const maxOffsetX = scaledImageInfo.width - safeResizeWidth\n const leftFocalEdge = Math.round(\n scaledImageInfo.width * (incomingFocalPoint.x / 100) - safeResizeWidth / 2,\n )\n const safeOffsetX = Math.min(Math.max(0, leftFocalEdge), maxOffsetX)\n\n const isAnimated = fileIsAnimatedType && metadata.pages\n\n let safeResizeHeight = resizeHeight ?? scaledImageInfo.height\n\n if (isAnimated && resizeHeight === undefined) {\n safeResizeHeight = scaledImageInfo.height / metadata.pages\n }\n\n const maxOffsetY = isAnimated\n ? safeResizeHeight - (resizeHeight ?? safeResizeHeight)\n : scaledImageInfo.height - safeResizeHeight\n\n const topFocalEdge = Math.round(\n scaledImageInfo.height * (incomingFocalPoint.y / 100) - safeResizeHeight / 2,\n )\n const safeOffsetY = Math.min(Math.max(0, topFocalEdge), maxOffsetY)\n\n // extract the focal area from the scaled image\n resized = (fileIsAnimatedType ? imageToResize : scaledImage).extract({\n height: safeResizeHeight,\n left: safeOffsetX,\n top: safeOffsetY,\n width: safeResizeWidth,\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 { data: bufferData, info: bufferInfo } = await resized.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 = createImageName(\n sanitizedImage.name,\n bufferInfo,\n mimeInfo?.ext || sanitizedImage.ext,\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: fileIsAnimatedType && metadata.pages ? height / metadata.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","getSanitizedImageData","sourceImage","extension","split","pop","name","substring","lastIndexOf","ext","createImageName","outputImageName","height","width","createResult","filename","filesize","mimeType","sizesToSave","sizeData","preventResize","desiredHeight","desiredWidth","withoutEnlargement","withoutReduction","original","undefined","isWidthOrHeightNotDefined","hasInsufficientWidth","hasInsufficientHeight","applyPayloadAdjustments","fit","targetAspectRatio","originalAspectRatio","skipEnlargement","skipReduction","sanitizeResizeConfig","resizeConfig","position","resizeAndTransformImageSizes","config","dimensions","file","req","savedFilename","sharp","staticPath","uploadEdits","focalPoint","focalPointEnabled","imageSizes","upload","incomingFocalPoint","x","Math","round","y","defaultResult","fileIsAnimatedType","includes","mimetype","sharpOptions","animated","sharpBase","tempFilePath","data","rotate","results","Promise","all","map","imageResizeConfig","imageToResize","clone","resized","metadata","resizeHeight","resizeWidth","scaledImage","resize","info","scaledImageInfo","toBuffer","resolveWithObject","safeResizeWidth","maxOffsetX","leftFocalEdge","safeOffsetX","min","max","isAnimated","pages","safeResizeHeight","maxOffsetY","topFocalEdge","safeOffsetY","extract","left","top","formatOptions","toFormat","format","options","trimOptions","trim","bufferData","bufferInfo","sanitizedImage","payloadUploadSizes","mimeInfo","imageNameWithDimensions","imagePath","unlinkSync","size","mime","buffer","path","reduce","acc","result","Object","assign","push"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../src/uploads/imageResizer.ts"],"sourcesContent":["import type { OutputInfo, Sharp, 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 { PayloadRequestWithData } from '../types/index.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'\n\ntype ResizeArgs = {\n config: SanitizedCollectionConfig\n dimensions: ProbedImageSize\n file: PayloadRequestWithData['file']\n mimeType: string\n req: PayloadRequestWithData\n savedFilename: string\n sharp?: SharpDependency\n staticPath: string\n uploadEdits?: UploadEdits\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 */\nconst createImageName = (\n outputImageName: string,\n { height, width }: OutputInfo,\n extension: string,\n) => `${outputImageName}-${width}x${height}.${extension}`\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 * Check if the image needs to be resized according to the requested dimensions\n * and the original image size. If the resize options withoutEnlargement or withoutReduction are provided,\n * the image will be resized regardless of the requested dimensions, given that the\n * width or height to be resized is provided.\n *\n * @param resizeConfig - object containing the requested dimensions and resize options\n * @param original - the original image size\n * @returns true if resizing is not needed, false otherwise\n */\nconst preventResize = (\n { height: desiredHeight, width: desiredWidth, withoutEnlargement, withoutReduction }: ImageSize,\n original: ProbedImageSize,\n): boolean => {\n // default is to allow reduction\n if (withoutReduction !== undefined) {\n return false // needs resize\n }\n\n // default is to prevent enlargement\n if (withoutEnlargement !== undefined) {\n return false // needs resize\n }\n\n const isWidthOrHeightNotDefined = !desiredHeight || !desiredWidth\n if (isWidthOrHeightNotDefined) {\n // If width and height are not defined, it means there is a format conversion\n // and the image needs to be \"resized\" (transformed).\n return false // needs resize\n }\n\n const hasInsufficientWidth = desiredWidth > original.width\n const hasInsufficientHeight = desiredHeight > original.height\n if (hasInsufficientWidth && hasInsufficientHeight) {\n // doesn't need resize - prevent enlargement. This should only happen if both width and height are insufficient.\n // if only one dimension is insufficient and the other is sufficient, resizing needs to happen, as the image\n // should be resized to the sufficient dimension.\n return true // do not create a new size\n }\n\n return false // needs resize\n}\n\n/**\n * Check if the image should be passed directly to sharp without payload adjusting properties.\n *\n * @param resizeConfig - object containing the requested dimensions and resize options\n * @param original - the original image size\n * @returns true if the image should passed directly to sharp\n */\nconst applyPayloadAdjustments = (\n { fit, height, width, withoutEnlargement, withoutReduction }: ImageSize,\n original: ProbedImageSize,\n) => {\n if (fit === 'contain' || fit === 'inside') return false\n if (!isNumber(height) && !isNumber(width)) return false\n\n const targetAspectRatio = width / height\n const originalAspectRatio = original.width / original.height\n if (originalAspectRatio === targetAspectRatio) return false\n\n const skipEnlargement = withoutEnlargement && (original.height < height || original.width < width)\n const skipReduction = withoutReduction && (original.height > height || original.width > width)\n if (skipEnlargement || skipReduction) return false\n\n return true\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 * 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}: 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\n const results: ImageSizesResult[] = await Promise.all(\n imageSizes.map(async (imageResizeConfig): Promise<ImageSizesResult> => {\n imageResizeConfig = sanitizeResizeConfig(imageResizeConfig)\n\n // This checks if a resize should happen. If not, the resized image will be\n // skipped COMPLETELY and thus will not be included in the resulting images.\n // All further format/trim options will thus be skipped as well.\n if (preventResize(imageResizeConfig, dimensions)) {\n return createResult({ name: imageResizeConfig.name })\n }\n\n const imageToResize = sharpBase.clone()\n let resized = imageToResize\n\n const metadata = await sharpBase.metadata()\n\n if (incomingFocalPoint && applyPayloadAdjustments(imageResizeConfig, dimensions)) {\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 // Scale the image up or down to fit the resize dimensions\n const scaledImage = imageToResize.resize({\n height: resizeHeight,\n width: resizeWidth,\n })\n\n const { info: scaledImageInfo } = await scaledImage.toBuffer({ resolveWithObject: true })\n\n const safeResizeWidth = resizeWidth ?? scaledImageInfo.width\n const maxOffsetX = scaledImageInfo.width - safeResizeWidth\n const leftFocalEdge = Math.round(\n scaledImageInfo.width * (incomingFocalPoint.x / 100) - safeResizeWidth / 2,\n )\n const safeOffsetX = Math.min(Math.max(0, leftFocalEdge), maxOffsetX)\n\n const isAnimated = fileIsAnimatedType && metadata.pages\n\n let safeResizeHeight = resizeHeight ?? scaledImageInfo.height\n\n if (isAnimated && resizeHeight === undefined) {\n safeResizeHeight = scaledImageInfo.height / metadata.pages\n }\n\n const maxOffsetY = isAnimated\n ? safeResizeHeight - (resizeHeight ?? safeResizeHeight)\n : scaledImageInfo.height - safeResizeHeight\n\n const topFocalEdge = Math.round(\n scaledImageInfo.height * (incomingFocalPoint.y / 100) - safeResizeHeight / 2,\n )\n const safeOffsetY = Math.min(Math.max(0, topFocalEdge), maxOffsetY)\n\n // extract the focal area from the scaled image\n resized = (fileIsAnimatedType ? imageToResize : scaledImage).extract({\n height: safeResizeHeight,\n left: safeOffsetX,\n top: safeOffsetY,\n width: safeResizeWidth,\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 { data: bufferData, info: bufferInfo } = await resized.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 = createImageName(\n sanitizedImage.name,\n bufferInfo,\n mimeInfo?.ext || sanitizedImage.ext,\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: fileIsAnimatedType && metadata.pages ? height / metadata.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","getSanitizedImageData","sourceImage","extension","split","pop","name","substring","lastIndexOf","ext","createImageName","outputImageName","height","width","createResult","filename","filesize","mimeType","sizesToSave","sizeData","preventResize","desiredHeight","desiredWidth","withoutEnlargement","withoutReduction","original","undefined","isWidthOrHeightNotDefined","hasInsufficientWidth","hasInsufficientHeight","applyPayloadAdjustments","fit","targetAspectRatio","originalAspectRatio","skipEnlargement","skipReduction","sanitizeResizeConfig","resizeConfig","position","resizeAndTransformImageSizes","config","dimensions","file","req","savedFilename","sharp","staticPath","uploadEdits","focalPoint","focalPointEnabled","imageSizes","upload","incomingFocalPoint","x","Math","round","y","defaultResult","fileIsAnimatedType","includes","mimetype","sharpOptions","animated","sharpBase","tempFilePath","data","rotate","results","Promise","all","map","imageResizeConfig","imageToResize","clone","resized","metadata","resizeHeight","resizeWidth","scaledImage","resize","info","scaledImageInfo","toBuffer","resolveWithObject","safeResizeWidth","maxOffsetX","leftFocalEdge","safeOffsetX","min","max","isAnimated","pages","safeResizeHeight","maxOffsetY","topFocalEdge","safeOffsetY","extract","left","top","formatOptions","toFormat","format","options","trimOptions","trim","bufferData","bufferInfo","sanitizedImage","payloadUploadSizes","mimeInfo","imageNameWithDimensions","imagePath","unlinkSync","size","mime","buffer","path","reduce","acc","result","Object","assign","push"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/isImage.ts"],"sourcesContent":["export function isImage(mimeType: string): boolean {\n return (\n ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml', 'image/webp', 'image/avif'].indexOf(\n mimeType,\n ) > -1\n )\n}\n"],"names":["isImage","mimeType","indexOf"],"rangeMappings":";;;;;;;;;","mappings":"AAAA,OAAO,SAASA,QAAQC,QAAgB;IACtC,OACE;QAAC;QAAc;QAAa;QAAa;QAAiB;QAAc;KAAa,CAACC,OAAO,CAC3FD,YACE,CAAC;AAET"}
1
+ {"version":3,"sources":["../../src/uploads/isImage.ts"],"sourcesContent":["export function isImage(mimeType: string): boolean {\n return (\n ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml', 'image/webp', 'image/avif'].indexOf(\n mimeType,\n ) > -1\n )\n}\n"],"names":["isImage","mimeType","indexOf"],"mappings":"AAAA,OAAO,SAASA,QAAQC,QAAgB;IACtC,OACE;QAAC;QAAc;QAAa;QAAa;QAAiB;QAAc;KAAa,CAACC,OAAO,CAC3FD,YACE,CAAC;AAET"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/mimeTypeValidator.ts"],"sourcesContent":["import type { Validate } from '../fields/config/types.js'\n\nexport const mimeTypeValidator =\n (mimeTypes: string[]): Validate =>\n (val: string, { siblingData }) => {\n if (!siblingData.filename) {\n return true\n }\n\n if (!val) {\n return 'Invalid file type'\n }\n\n const cleanedMimeTypes = mimeTypes.map((v) => v.replace('*', ''))\n return !cleanedMimeTypes.some((v) => val.startsWith(v)) ? `Invalid file type: '${val}'` : true\n }\n"],"names":["mimeTypeValidator","mimeTypes","val","siblingData","filename","cleanedMimeTypes","map","v","replace","some","startsWith"],"rangeMappings":";;;;;;;;;","mappings":"AAEA,OAAO,MAAMA,oBACX,CAACC,YACD,CAACC,KAAa,EAAEC,WAAW,EAAE;QAC3B,IAAI,CAACA,YAAYC,QAAQ,EAAE;YACzB,OAAO;QACT;QAEA,IAAI,CAACF,KAAK;YACR,OAAO;QACT;QAEA,MAAMG,mBAAmBJ,UAAUK,GAAG,CAAC,CAACC,IAAMA,EAAEC,OAAO,CAAC,KAAK;QAC7D,OAAO,CAACH,iBAAiBI,IAAI,CAAC,CAACF,IAAML,IAAIQ,UAAU,CAACH,MAAM,CAAC,oBAAoB,EAAEL,IAAI,CAAC,CAAC,GAAG;IAC5F,EAAC"}
1
+ {"version":3,"sources":["../../src/uploads/mimeTypeValidator.ts"],"sourcesContent":["import type { Validate } from '../fields/config/types.js'\n\nexport const mimeTypeValidator =\n (mimeTypes: string[]): Validate =>\n (val: string, { siblingData }) => {\n if (!siblingData.filename) {\n return true\n }\n\n if (!val) {\n return 'Invalid file type'\n }\n\n const cleanedMimeTypes = mimeTypes.map((v) => v.replace('*', ''))\n return !cleanedMimeTypes.some((v) => val.startsWith(v)) ? `Invalid file type: '${val}'` : true\n }\n"],"names":["mimeTypeValidator","mimeTypes","val","siblingData","filename","cleanedMimeTypes","map","v","replace","some","startsWith"],"mappings":"AAEA,OAAO,MAAMA,oBACX,CAACC,YACD,CAACC,KAAa,EAAEC,WAAW,EAAE;QAC3B,IAAI,CAACA,YAAYC,QAAQ,EAAE;YACzB,OAAO;QACT;QAEA,IAAI,CAACF,KAAK;YACR,OAAO;QACT;QAEA,MAAMG,mBAAmBJ,UAAUK,GAAG,CAAC,CAACC,IAAMA,EAAEC,OAAO,CAAC,KAAK;QAC7D,OAAO,CAACH,iBAAiBI,IAAI,CAAC,CAACF,IAAML,IAAIQ,UAAU,CAACH,MAAM,CAAC,oBAAoB,EAAEL,IAAI,CAAC,CAAC,GAAG;IAC5F,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/mimeTypeValidator.spec.ts"],"sourcesContent":["import type { ValidateOptions } from '../fields/config/types'\n\nimport { mimeTypeValidator } from './mimeTypeValidator'\n\nconst options = { siblingData: { filename: 'file.xyz' } } as ValidateOptions<\n undefined,\n undefined,\n undefined\n>\n\ndescribe('mimeTypeValidator', () => {\n it('should validate single mimeType', () => {\n const mimeTypes = ['image/png']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('image/png', options)).toBe(true)\n })\n\n it('should validate multiple mimeTypes', () => {\n const mimeTypes = ['image/png', 'application/pdf']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('image/png', options)).toBe(true)\n expect(validate('application/pdf', options)).toBe(true)\n })\n\n it('should validate using wildcard', () => {\n const mimeTypes = ['image/*']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('image/png', options)).toBe(true)\n expect(validate('image/gif', options)).toBe(true)\n })\n\n it('should validate multiple wildcards', () => {\n const mimeTypes = ['image/*', 'audio/*']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('image/png', options)).toBe(true)\n expect(validate('audio/mpeg', options)).toBe(true)\n })\n\n it('should not validate when unmatched', () => {\n const mimeTypes = ['image/png']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('audio/mpeg', options)).toBe(\"Invalid file type: 'audio/mpeg'\")\n })\n\n it('should not validate when unmatched - multiple mimeTypes', () => {\n const mimeTypes = ['image/png', 'application/pdf']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('audio/mpeg', options)).toBe(\"Invalid file type: 'audio/mpeg'\")\n })\n\n it('should not validate using wildcard - unmatched', () => {\n const mimeTypes = ['image/*']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('audio/mpeg', options)).toBe(\"Invalid file type: 'audio/mpeg'\")\n })\n\n it('should not validate multiple wildcards - unmatched', () => {\n const mimeTypes = ['image/*', 'audio/*']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('video/mp4', options)).toBe(\"Invalid file type: 'video/mp4'\")\n expect(validate('application/pdf', options)).toBe(\"Invalid file type: 'application/pdf'\")\n })\n\n it('should not error when mimeType is missing', () => {\n const mimeTypes = ['image/*', 'application/pdf']\n const validate = mimeTypeValidator(mimeTypes)\n let value\n expect(validate(value, options)).toBe('Invalid file type')\n })\n})\n"],"names":["mimeTypeValidator","options","siblingData","filename","describe","it","mimeTypes","validate","expect","toBe","value"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAEA,SAASA,iBAAiB,QAAQ,sBAAqB;AAEvD,MAAMC,UAAU;IAAEC,aAAa;QAAEC,UAAU;IAAW;AAAE;AAMxDC,SAAS,qBAAqB;IAC5BC,GAAG,mCAAmC;QACpC,MAAMC,YAAY;YAAC;SAAY;QAC/B,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;IAC9C;IAEAJ,GAAG,sCAAsC;QACvC,MAAMC,YAAY;YAAC;YAAa;SAAkB;QAClD,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;QAC5CD,OAAOD,SAAS,mBAAmBN,UAAUQ,IAAI,CAAC;IACpD;IAEAJ,GAAG,kCAAkC;QACnC,MAAMC,YAAY;YAAC;SAAU;QAC7B,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;QAC5CD,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;IAC9C;IAEAJ,GAAG,sCAAsC;QACvC,MAAMC,YAAY;YAAC;YAAW;SAAU;QACxC,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;QAC5CD,OAAOD,SAAS,cAAcN,UAAUQ,IAAI,CAAC;IAC/C;IAEAJ,GAAG,sCAAsC;QACvC,MAAMC,YAAY;YAAC;SAAY;QAC/B,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,cAAcN,UAAUQ,IAAI,CAAC;IAC/C;IAEAJ,GAAG,2DAA2D;QAC5D,MAAMC,YAAY;YAAC;YAAa;SAAkB;QAClD,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,cAAcN,UAAUQ,IAAI,CAAC;IAC/C;IAEAJ,GAAG,kDAAkD;QACnD,MAAMC,YAAY;YAAC;SAAU;QAC7B,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,cAAcN,UAAUQ,IAAI,CAAC;IAC/C;IAEAJ,GAAG,sDAAsD;QACvD,MAAMC,YAAY;YAAC;YAAW;SAAU;QACxC,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;QAC5CD,OAAOD,SAAS,mBAAmBN,UAAUQ,IAAI,CAAC;IACpD;IAEAJ,GAAG,6CAA6C;QAC9C,MAAMC,YAAY;YAAC;YAAW;SAAkB;QAChD,MAAMC,WAAWP,kBAAkBM;QACnC,IAAII;QACJF,OAAOD,SAASG,OAAOT,UAAUQ,IAAI,CAAC;IACxC;AACF"}
1
+ {"version":3,"sources":["../../src/uploads/mimeTypeValidator.spec.ts"],"sourcesContent":["import type { ValidateOptions } from '../fields/config/types'\n\nimport { mimeTypeValidator } from './mimeTypeValidator'\n\nconst options = { siblingData: { filename: 'file.xyz' } } as ValidateOptions<\n undefined,\n undefined,\n undefined\n>\n\ndescribe('mimeTypeValidator', () => {\n it('should validate single mimeType', () => {\n const mimeTypes = ['image/png']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('image/png', options)).toBe(true)\n })\n\n it('should validate multiple mimeTypes', () => {\n const mimeTypes = ['image/png', 'application/pdf']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('image/png', options)).toBe(true)\n expect(validate('application/pdf', options)).toBe(true)\n })\n\n it('should validate using wildcard', () => {\n const mimeTypes = ['image/*']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('image/png', options)).toBe(true)\n expect(validate('image/gif', options)).toBe(true)\n })\n\n it('should validate multiple wildcards', () => {\n const mimeTypes = ['image/*', 'audio/*']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('image/png', options)).toBe(true)\n expect(validate('audio/mpeg', options)).toBe(true)\n })\n\n it('should not validate when unmatched', () => {\n const mimeTypes = ['image/png']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('audio/mpeg', options)).toBe(\"Invalid file type: 'audio/mpeg'\")\n })\n\n it('should not validate when unmatched - multiple mimeTypes', () => {\n const mimeTypes = ['image/png', 'application/pdf']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('audio/mpeg', options)).toBe(\"Invalid file type: 'audio/mpeg'\")\n })\n\n it('should not validate using wildcard - unmatched', () => {\n const mimeTypes = ['image/*']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('audio/mpeg', options)).toBe(\"Invalid file type: 'audio/mpeg'\")\n })\n\n it('should not validate multiple wildcards - unmatched', () => {\n const mimeTypes = ['image/*', 'audio/*']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('video/mp4', options)).toBe(\"Invalid file type: 'video/mp4'\")\n expect(validate('application/pdf', options)).toBe(\"Invalid file type: 'application/pdf'\")\n })\n\n it('should not error when mimeType is missing', () => {\n const mimeTypes = ['image/*', 'application/pdf']\n const validate = mimeTypeValidator(mimeTypes)\n let value\n expect(validate(value, options)).toBe('Invalid file type')\n })\n})\n"],"names":["mimeTypeValidator","options","siblingData","filename","describe","it","mimeTypes","validate","expect","toBe","value"],"mappings":"AAEA,SAASA,iBAAiB,QAAQ,sBAAqB;AAEvD,MAAMC,UAAU;IAAEC,aAAa;QAAEC,UAAU;IAAW;AAAE;AAMxDC,SAAS,qBAAqB;IAC5BC,GAAG,mCAAmC;QACpC,MAAMC,YAAY;YAAC;SAAY;QAC/B,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;IAC9C;IAEAJ,GAAG,sCAAsC;QACvC,MAAMC,YAAY;YAAC;YAAa;SAAkB;QAClD,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;QAC5CD,OAAOD,SAAS,mBAAmBN,UAAUQ,IAAI,CAAC;IACpD;IAEAJ,GAAG,kCAAkC;QACnC,MAAMC,YAAY;YAAC;SAAU;QAC7B,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;QAC5CD,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;IAC9C;IAEAJ,GAAG,sCAAsC;QACvC,MAAMC,YAAY;YAAC;YAAW;SAAU;QACxC,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;QAC5CD,OAAOD,SAAS,cAAcN,UAAUQ,IAAI,CAAC;IAC/C;IAEAJ,GAAG,sCAAsC;QACvC,MAAMC,YAAY;YAAC;SAAY;QAC/B,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,cAAcN,UAAUQ,IAAI,CAAC;IAC/C;IAEAJ,GAAG,2DAA2D;QAC5D,MAAMC,YAAY;YAAC;YAAa;SAAkB;QAClD,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,cAAcN,UAAUQ,IAAI,CAAC;IAC/C;IAEAJ,GAAG,kDAAkD;QACnD,MAAMC,YAAY;YAAC;SAAU;QAC7B,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,cAAcN,UAAUQ,IAAI,CAAC;IAC/C;IAEAJ,GAAG,sDAAsD;QACvD,MAAMC,YAAY;YAAC;YAAW;SAAU;QACxC,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;QAC5CD,OAAOD,SAAS,mBAAmBN,UAAUQ,IAAI,CAAC;IACpD;IAEAJ,GAAG,6CAA6C;QAC9C,MAAMC,YAAY;YAAC;YAAW;SAAkB;QAChD,MAAMC,WAAWP,kBAAkBM;QACnC,IAAII;QACJF,OAAOD,SAASG,OAAOT,UAAUQ,IAAI,CAAC;IACxC;AACF"}
@@ -1,4 +1,3 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
1
  /**
3
2
  * Save buffer data to a file.
4
3
  * @param {Buffer} buffer - buffer to save to a file.
@@ -1 +1 @@
1
- {"version":3,"file":"saveBufferToFile.d.ts","sourceRoot":"","sources":["../../src/uploads/saveBufferToFile.ts"],"names":[],"mappings":";AAGA;;;;GAIG;AACH,QAAA,MAAM,gBAAgB,WAAkB,MAAM,YAAY,MAAM,KAAG,QAAQ,IAAI,CAU9E,CAAA;AAED,eAAe,gBAAgB,CAAA"}
1
+ {"version":3,"file":"saveBufferToFile.d.ts","sourceRoot":"","sources":["../../src/uploads/saveBufferToFile.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,QAAA,MAAM,gBAAgB,WAAkB,MAAM,YAAY,MAAM,KAAG,OAAO,CAAC,IAAI,CAU9E,CAAA;AAED,eAAe,gBAAgB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/saveBufferToFile.ts"],"sourcesContent":["import fs from 'fs'\nimport { Readable } from 'stream'\n\n/**\n * Save buffer data to a file.\n * @param {Buffer} buffer - buffer to save to a file.\n * @param {string} filePath - path to a file.\n */\nconst saveBufferToFile = async (buffer: Buffer, filePath: string): Promise<void> => {\n // Setup readable stream from buffer.\n let streamData = buffer\n const readStream = new Readable()\n readStream._read = () => {\n readStream.push(streamData)\n streamData = null\n }\n // Setup file system writable stream.\n return fs.writeFileSync(filePath, buffer)\n}\n\nexport default saveBufferToFile\n"],"names":["fs","Readable","saveBufferToFile","buffer","filePath","streamData","readStream","_read","push","writeFileSync"],"rangeMappings":";;;;;;;;;;;;;;;;;","mappings":"AAAA,OAAOA,QAAQ,KAAI;AACnB,SAASC,QAAQ,QAAQ,SAAQ;AAEjC;;;;CAIC,GACD,MAAMC,mBAAmB,OAAOC,QAAgBC;IAC9C,qCAAqC;IACrC,IAAIC,aAAaF;IACjB,MAAMG,aAAa,IAAIL;IACvBK,WAAWC,KAAK,GAAG;QACjBD,WAAWE,IAAI,CAACH;QAChBA,aAAa;IACf;IACA,qCAAqC;IACrC,OAAOL,GAAGS,aAAa,CAACL,UAAUD;AACpC;AAEA,eAAeD,iBAAgB"}
1
+ {"version":3,"sources":["../../src/uploads/saveBufferToFile.ts"],"sourcesContent":["import fs from 'fs'\nimport { Readable } from 'stream'\n\n/**\n * Save buffer data to a file.\n * @param {Buffer} buffer - buffer to save to a file.\n * @param {string} filePath - path to a file.\n */\nconst saveBufferToFile = async (buffer: Buffer, filePath: string): Promise<void> => {\n // Setup readable stream from buffer.\n let streamData = buffer\n const readStream = new Readable()\n readStream._read = () => {\n readStream.push(streamData)\n streamData = null\n }\n // Setup file system writable stream.\n return fs.writeFileSync(filePath, buffer)\n}\n\nexport default saveBufferToFile\n"],"names":["fs","Readable","saveBufferToFile","buffer","filePath","streamData","readStream","_read","push","writeFileSync"],"mappings":"AAAA,OAAOA,QAAQ,KAAI;AACnB,SAASC,QAAQ,QAAQ,SAAQ;AAEjC;;;;CAIC,GACD,MAAMC,mBAAmB,OAAOC,QAAgBC;IAC9C,qCAAqC;IACrC,IAAIC,aAAaF;IACjB,MAAMG,aAAa,IAAIL;IACvBK,WAAWC,KAAK,GAAG;QACjBD,WAAWE,IAAI,CAACH;QAChBA,aAAa;IACf;IACA,qCAAqC;IACrC,OAAOL,GAAGS,aAAa,CAACL,UAAUD;AACpC;AAEA,eAAeD,iBAAgB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/tempFile.ts"],"sourcesContent":["import { promises as fsPromises } from 'fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { v4 as uuid } from 'uuid'\n\nasync function runTask(temporaryPath: string, callback) {\n try {\n return await callback(temporaryPath)\n } finally {\n await fsPromises.rm(temporaryPath, { force: true, maxRetries: 2, recursive: true })\n }\n}\n\ntype Options = {\n extension?: string\n name?: string\n}\n\nexport const temporaryFileTask = async (callback, options: Options = {}) => {\n const filePath = await temporaryFile(options)\n return runTask(filePath, callback)\n}\n\nasync function temporaryFile(options: Options) {\n if (options.name) {\n if (options.extension !== undefined && options.extension !== null) {\n throw new Error('The `name` and `extension` options are mutually exclusive')\n }\n\n return path.join(await temporaryDirectory(), options.name)\n }\n\n return (\n (await getPath()) +\n (options.extension === undefined || options.extension === null\n ? ''\n : '.' + options.extension.replace(/^\\./, ''))\n )\n}\n\nasync function temporaryDirectory({ prefix = '' } = {}) {\n const directory = await getPath(prefix)\n await fsPromises.mkdir(directory)\n return directory\n}\n\nasync function getPath(prefix = ''): Promise<string> {\n const temporaryDirectory = await fsPromises.realpath(os.tmpdir())\n return path.join(temporaryDirectory, prefix + uuid())\n}\n"],"names":["promises","fsPromises","os","path","v4","uuid","runTask","temporaryPath","callback","rm","force","maxRetries","recursive","temporaryFileTask","options","filePath","temporaryFile","name","extension","undefined","Error","join","temporaryDirectory","getPath","replace","prefix","directory","mkdir","realpath","tmpdir"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,YAAYC,UAAU,QAAQ,KAAI;AAC3C,OAAOC,QAAQ,UAAS;AACxB,OAAOC,UAAU,YAAW;AAC5B,SAASC,MAAMC,IAAI,QAAQ,OAAM;AAEjC,eAAeC,QAAQC,aAAqB,EAAEC,QAAQ;IACpD,IAAI;QACF,OAAO,MAAMA,SAASD;IACxB,SAAU;QACR,MAAMN,WAAWQ,EAAE,CAACF,eAAe;YAAEG,OAAO;YAAMC,YAAY;YAAGC,WAAW;QAAK;IACnF;AACF;AAOA,OAAO,MAAMC,oBAAoB,OAAOL,UAAUM,UAAmB,CAAC,CAAC;IACrE,MAAMC,WAAW,MAAMC,cAAcF;IACrC,OAAOR,QAAQS,UAAUP;AAC3B,EAAC;AAED,eAAeQ,cAAcF,OAAgB;IAC3C,IAAIA,QAAQG,IAAI,EAAE;QAChB,IAAIH,QAAQI,SAAS,KAAKC,aAAaL,QAAQI,SAAS,KAAK,MAAM;YACjE,MAAM,IAAIE,MAAM;QAClB;QAEA,OAAOjB,KAAKkB,IAAI,CAAC,MAAMC,sBAAsBR,QAAQG,IAAI;IAC3D;IAEA,OACE,AAAC,MAAMM,YACNT,CAAAA,QAAQI,SAAS,KAAKC,aAAaL,QAAQI,SAAS,KAAK,OACtD,KACA,MAAMJ,QAAQI,SAAS,CAACM,OAAO,CAAC,OAAO,GAAE;AAEjD;AAEA,eAAeF,mBAAmB,EAAEG,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;IACpD,MAAMC,YAAY,MAAMH,QAAQE;IAChC,MAAMxB,WAAW0B,KAAK,CAACD;IACvB,OAAOA;AACT;AAEA,eAAeH,QAAQE,SAAS,EAAE;IAChC,MAAMH,qBAAqB,MAAMrB,WAAW2B,QAAQ,CAAC1B,GAAG2B,MAAM;IAC9D,OAAO1B,KAAKkB,IAAI,CAACC,oBAAoBG,SAASpB;AAChD"}
1
+ {"version":3,"sources":["../../src/uploads/tempFile.ts"],"sourcesContent":["import { promises as fsPromises } from 'fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { v4 as uuid } from 'uuid'\n\nasync function runTask(temporaryPath: string, callback) {\n try {\n return await callback(temporaryPath)\n } finally {\n await fsPromises.rm(temporaryPath, { force: true, maxRetries: 2, recursive: true })\n }\n}\n\ntype Options = {\n extension?: string\n name?: string\n}\n\nexport const temporaryFileTask = async (callback, options: Options = {}) => {\n const filePath = await temporaryFile(options)\n return runTask(filePath, callback)\n}\n\nasync function temporaryFile(options: Options) {\n if (options.name) {\n if (options.extension !== undefined && options.extension !== null) {\n throw new Error('The `name` and `extension` options are mutually exclusive')\n }\n\n return path.join(await temporaryDirectory(), options.name)\n }\n\n return (\n (await getPath()) +\n (options.extension === undefined || options.extension === null\n ? ''\n : '.' + options.extension.replace(/^\\./, ''))\n )\n}\n\nasync function temporaryDirectory({ prefix = '' } = {}) {\n const directory = await getPath(prefix)\n await fsPromises.mkdir(directory)\n return directory\n}\n\nasync function getPath(prefix = ''): Promise<string> {\n const temporaryDirectory = await fsPromises.realpath(os.tmpdir())\n return path.join(temporaryDirectory, prefix + uuid())\n}\n"],"names":["promises","fsPromises","os","path","v4","uuid","runTask","temporaryPath","callback","rm","force","maxRetries","recursive","temporaryFileTask","options","filePath","temporaryFile","name","extension","undefined","Error","join","temporaryDirectory","getPath","replace","prefix","directory","mkdir","realpath","tmpdir"],"mappings":"AAAA,SAASA,YAAYC,UAAU,QAAQ,KAAI;AAC3C,OAAOC,QAAQ,UAAS;AACxB,OAAOC,UAAU,YAAW;AAC5B,SAASC,MAAMC,IAAI,QAAQ,OAAM;AAEjC,eAAeC,QAAQC,aAAqB,EAAEC,QAAQ;IACpD,IAAI;QACF,OAAO,MAAMA,SAASD;IACxB,SAAU;QACR,MAAMN,WAAWQ,EAAE,CAACF,eAAe;YAAEG,OAAO;YAAMC,YAAY;YAAGC,WAAW;QAAK;IACnF;AACF;AAOA,OAAO,MAAMC,oBAAoB,OAAOL,UAAUM,UAAmB,CAAC,CAAC;IACrE,MAAMC,WAAW,MAAMC,cAAcF;IACrC,OAAOR,QAAQS,UAAUP;AAC3B,EAAC;AAED,eAAeQ,cAAcF,OAAgB;IAC3C,IAAIA,QAAQG,IAAI,EAAE;QAChB,IAAIH,QAAQI,SAAS,KAAKC,aAAaL,QAAQI,SAAS,KAAK,MAAM;YACjE,MAAM,IAAIE,MAAM;QAClB;QAEA,OAAOjB,KAAKkB,IAAI,CAAC,MAAMC,sBAAsBR,QAAQG,IAAI;IAC3D;IAEA,OACE,AAAC,MAAMM,YACNT,CAAAA,QAAQI,SAAS,KAAKC,aAAaL,QAAQI,SAAS,KAAK,OACtD,KACA,MAAMJ,QAAQI,SAAS,CAACM,OAAO,CAAC,OAAO,GAAE;AAEjD;AAEA,eAAeF,mBAAmB,EAAEG,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;IACpD,MAAMC,YAAY,MAAMH,QAAQE;IAChC,MAAMxB,WAAW0B,KAAK,CAACD;IACvB,OAAOA;AACT;AAEA,eAAeH,QAAQE,SAAS,EAAE;IAChC,MAAMH,qBAAqB,MAAMrB,WAAW2B,QAAQ,CAAC1B,GAAG2B,MAAM;IAC9D,OAAO1B,KAAKkB,IAAI,CAACC,oBAAoBG,SAASpB;AAChD"}
@@ -1,4 +1,3 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
1
  import type { ResizeOptions, Sharp } from 'sharp';
3
2
  import type { TypeWithID } from '../collections/config/types.js';
4
3
  import type { PayloadRequestWithData } from '../types/index.js';
@@ -29,7 +28,7 @@ export type ProbedImageSize = {
29
28
  width: number;
30
29
  };
31
30
  /**
32
- * Params sent to the sharp toFormat() function
31
+ * Params sent to the sharp `toFormat()` function
33
32
  * @link https://sharp.pixelplumbing.com/api-output#toformat
34
33
  */
35
34
  export type ImageUploadFormatOptions = {
@@ -65,37 +64,87 @@ export type GetAdminThumbnail = (args: {
65
64
  }) => false | null | string;
66
65
  export type UploadConfig = {
67
66
  /**
68
- * The adapter to use for uploads.
67
+ * The adapter name to use for uploads. Used for storage adapter telemetry.
68
+ * @default undefined
69
69
  */
70
70
  adapter?: string;
71
71
  /**
72
72
  * Represents an admin thumbnail, which can be either a React component or a string.
73
73
  * - If a string, it should be one of the image size names.
74
- * - If a React component, register a function that generates the thumbnail URL using the `useAdminThumbnail` hook.
74
+ * - A function that generates a fully qualified URL for the thumbnail, receives the doc as the only argument.
75
75
  **/
76
76
  adminThumbnail?: GetAdminThumbnail | string;
77
+ /**
78
+ * Enables cropping of images.
79
+ * @default true
80
+ */
77
81
  crop?: boolean;
82
+ /**
83
+ * Disable the ability to save files to disk.
84
+ * @default false
85
+ */
78
86
  disableLocalStorage?: boolean;
79
87
  /**
80
- * Accepts existing headers and can filter/modify them.
88
+ * Ability to filter/modify Request Headers when fetching a file.
81
89
  *
82
90
  * Useful for adding custom headers to fetch from external providers.
91
+ * @default undefined
83
92
  */
84
93
  externalFileHeaderFilter?: (headers: Record<string, string>) => Record<string, string>;
94
+ /**
95
+ * Require files to be uploaded when creating a document.
96
+ * @default true
97
+ */
85
98
  filesRequiredOnCreate?: boolean;
99
+ /**
100
+ * Enables focal point positioning for image manipulation.
101
+ * @default false
102
+ */
86
103
  focalPoint?: boolean;
87
- /** Options for original upload file only. For sizes, set each formatOptions individually. */
104
+ /**
105
+ * Format options for the uploaded file. Formatting image sizes needs to be done within each formatOptions individually.
106
+ */
88
107
  formatOptions?: ImageUploadFormatOptions;
108
+ /**
109
+ * Custom handlers to run when a file is fetched.
110
+ *
111
+ * - If a handler returns a Response, the response will be sent to the client and no further handlers will be run.
112
+ * - If a handler returns null, the next handler will be run.
113
+ * - If no handlers return a response the file will be returned by default.
114
+ *
115
+ * @default undefined
116
+ */
89
117
  handlers?: ((req: PayloadRequestWithData, args: {
90
118
  doc: TypeWithID;
91
119
  params: {
92
120
  collection: string;
93
121
  filename: string;
94
122
  };
95
- }) => Promise<Response> | Response)[];
123
+ }) => Promise<Response> | Promise<void> | Response | void)[];
96
124
  imageSizes?: ImageSize[];
125
+ /**
126
+ * Restrict mimeTypes in the file picker. Array of valid mime types or mimetype wildcards
127
+ * @example ['image/*', 'application/pdf']
128
+ * @default undefined
129
+ */
97
130
  mimeTypes?: string[];
131
+ /**
132
+ * Ability to modify the response headers fetching a file.
133
+ * @default undefined
134
+ */
135
+ modifyResponseHeaders?: ({ headers }: {
136
+ headers: Headers;
137
+ }) => Headers;
138
+ /**
139
+ * Sharp resize options for the original image.
140
+ * @link https://sharp.pixelplumbing.com/api-resize#resize
141
+ * @default undefined
142
+ */
98
143
  resizeOptions?: ResizeOptions;
144
+ /**
145
+ * The directory to serve static files from. Defaults to collection slug.
146
+ * @default undefined
147
+ */
99
148
  staticDir?: string;
100
149
  trimOptions?: ImageUploadTrimOptions;
101
150
  };
@@ -103,13 +152,31 @@ export type SanitizedUploadConfig = UploadConfig & {
103
152
  staticDir: UploadConfig['staticDir'];
104
153
  };
105
154
  export type File = {
155
+ /**
156
+ * The buffer of the file.
157
+ */
106
158
  data: Buffer;
159
+ /**
160
+ * The mimetype of the file.
161
+ */
107
162
  mimetype: string;
163
+ /**
164
+ * The name of the file.
165
+ */
108
166
  name: string;
167
+ /**
168
+ * The size of the file in bytes.
169
+ */
109
170
  size: number;
110
171
  };
111
172
  export type FileToSave = {
173
+ /**
174
+ * The buffer of the file.
175
+ */
112
176
  buffer: Buffer;
177
+ /**
178
+ * The path to save the file.
179
+ */
113
180
  path: string;
114
181
  };
115
182
  export type UploadEdits = {