payload 4.0.0-internal.e16cf59 → 4.0.0-internal.e55ccef

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 (678) hide show
  1. package/LICENSE.md +1 -1
  2. package/bin.js +11 -0
  3. package/dist/__testing__/predefinedMigration.d.ts +4 -3
  4. package/dist/__testing__/predefinedMigration.d.ts.map +1 -1
  5. package/dist/admin/RichText.d.ts +4 -17
  6. package/dist/admin/RichText.d.ts.map +1 -1
  7. package/dist/admin/RichText.js.map +1 -1
  8. package/dist/admin/adapters/cookies.d.ts +21 -0
  9. package/dist/admin/adapters/cookies.d.ts.map +1 -0
  10. package/dist/admin/adapters/cookies.js +3 -0
  11. package/dist/admin/adapters/cookies.js.map +1 -0
  12. package/dist/admin/adapters/devReload.d.ts +9 -0
  13. package/dist/admin/adapters/devReload.d.ts.map +1 -0
  14. package/dist/admin/adapters/devReload.js +6 -0
  15. package/dist/admin/adapters/devReload.js.map +1 -0
  16. package/dist/admin/adapters/index.d.ts +7 -0
  17. package/dist/admin/adapters/index.d.ts.map +1 -0
  18. package/dist/admin/adapters/index.js +3 -0
  19. package/dist/admin/adapters/index.js.map +1 -0
  20. package/dist/admin/adapters/render.d.ts +16 -0
  21. package/dist/admin/adapters/render.d.ts.map +1 -0
  22. package/dist/admin/adapters/render.js +7 -0
  23. package/dist/admin/adapters/render.js.map +1 -0
  24. package/dist/admin/adapters/router.d.ts +64 -0
  25. package/dist/admin/adapters/router.d.ts.map +1 -0
  26. package/dist/admin/adapters/router.js +3 -0
  27. package/dist/admin/adapters/router.js.map +1 -0
  28. package/dist/admin/adapters/server.d.ts +23 -0
  29. package/dist/admin/adapters/server.d.ts.map +1 -0
  30. package/dist/admin/adapters/server.js +6 -0
  31. package/dist/admin/adapters/server.js.map +1 -0
  32. package/dist/admin/adapters/views.d.ts +36 -0
  33. package/dist/admin/adapters/views.d.ts.map +1 -0
  34. package/dist/admin/adapters/views.js +7 -0
  35. package/dist/admin/adapters/views.js.map +1 -0
  36. package/dist/admin/elements/Table.d.ts +1 -0
  37. package/dist/admin/elements/Table.d.ts.map +1 -1
  38. package/dist/admin/elements/Table.js.map +1 -1
  39. package/dist/admin/fields/Row.d.ts +2 -2
  40. package/dist/admin/fields/Row.d.ts.map +1 -1
  41. package/dist/admin/fields/Row.js.map +1 -1
  42. package/dist/admin/forms/Description.d.ts +2 -2
  43. package/dist/admin/forms/Description.d.ts.map +1 -1
  44. package/dist/admin/forms/Description.js.map +1 -1
  45. package/dist/admin/forms/Field.d.ts +10 -5
  46. package/dist/admin/forms/Field.d.ts.map +1 -1
  47. package/dist/admin/forms/Field.js.map +1 -1
  48. package/dist/admin/functions/index.d.ts +10 -1
  49. package/dist/admin/functions/index.d.ts.map +1 -1
  50. package/dist/admin/functions/index.js.map +1 -1
  51. package/dist/admin/types.d.ts +3 -2
  52. package/dist/admin/types.d.ts.map +1 -1
  53. package/dist/admin/types.js.map +1 -1
  54. package/dist/admin/views/dashboard.d.ts +7 -0
  55. package/dist/admin/views/dashboard.d.ts.map +1 -1
  56. package/dist/admin/views/dashboard.js.map +1 -1
  57. package/dist/admin/views/document.d.ts +5 -3
  58. package/dist/admin/views/document.d.ts.map +1 -1
  59. package/dist/admin/views/document.js.map +1 -1
  60. package/dist/admin/views/hierarchyList.d.ts +1 -0
  61. package/dist/admin/views/hierarchyList.d.ts.map +1 -1
  62. package/dist/admin/views/hierarchyList.js.map +1 -1
  63. package/dist/admin/views/list.d.ts +10 -1
  64. package/dist/admin/views/list.d.ts.map +1 -1
  65. package/dist/admin/views/list.js.map +1 -1
  66. package/dist/auth/baseFields/apiKey.d.ts +10 -2
  67. package/dist/auth/baseFields/apiKey.d.ts.map +1 -1
  68. package/dist/auth/baseFields/apiKey.js +35 -24
  69. package/dist/auth/baseFields/apiKey.js.map +1 -1
  70. package/dist/auth/cookies.d.ts +2 -2
  71. package/dist/auth/cookies.d.ts.map +1 -1
  72. package/dist/auth/defaultAccess.d.ts +1 -1
  73. package/dist/auth/defaultAccess.d.ts.map +1 -1
  74. package/dist/auth/defaultAccess.js +1 -1
  75. package/dist/auth/defaultAccess.js.map +1 -1
  76. package/dist/auth/defaultUser.d.ts.map +1 -1
  77. package/dist/auth/defaultUser.js +2 -1
  78. package/dist/auth/defaultUser.js.map +1 -1
  79. package/dist/auth/extractJWT.d.ts +1 -1
  80. package/dist/auth/getAuthFields.js +2 -2
  81. package/dist/auth/getAuthFields.js.map +1 -1
  82. package/dist/auth/getFieldsToSign.d.ts +1 -1
  83. package/dist/auth/getLoginOptions.d.ts +1 -1
  84. package/dist/auth/operations/auth.d.ts +2 -2
  85. package/dist/auth/operations/auth.d.ts.map +1 -1
  86. package/dist/auth/operations/auth.js.map +1 -1
  87. package/dist/auth/operations/login.d.ts +2 -1
  88. package/dist/auth/operations/login.d.ts.map +1 -1
  89. package/dist/auth/operations/login.js.map +1 -1
  90. package/dist/auth/operations/me.d.ts +2 -2
  91. package/dist/auth/operations/me.d.ts.map +1 -1
  92. package/dist/auth/operations/me.js.map +1 -1
  93. package/dist/auth/operations/refresh.d.ts.map +1 -1
  94. package/dist/auth/operations/refresh.js +9 -3
  95. package/dist/auth/operations/refresh.js.map +1 -1
  96. package/dist/auth/operations/resetPassword.d.ts.map +1 -1
  97. package/dist/auth/operations/resetPassword.js.map +1 -1
  98. package/dist/auth/sendVerificationEmail.d.ts +2 -2
  99. package/dist/auth/sendVerificationEmail.d.ts.map +1 -1
  100. package/dist/auth/sendVerificationEmail.js +1 -1
  101. package/dist/auth/sendVerificationEmail.js.map +1 -1
  102. package/dist/auth/sessions.d.ts +4 -5
  103. package/dist/auth/sessions.d.ts.map +1 -1
  104. package/dist/auth/sessions.js +5 -3
  105. package/dist/auth/sessions.js.map +1 -1
  106. package/dist/auth/strategies/apiKey.d.ts.map +1 -1
  107. package/dist/auth/strategies/apiKey.js +6 -17
  108. package/dist/auth/strategies/apiKey.js.map +1 -1
  109. package/dist/auth/strategies/local/incrementLoginAttempts.d.ts +2 -2
  110. package/dist/auth/strategies/local/incrementLoginAttempts.d.ts.map +1 -1
  111. package/dist/auth/strategies/local/incrementLoginAttempts.js +1 -1
  112. package/dist/auth/strategies/local/incrementLoginAttempts.js.map +1 -1
  113. package/dist/auth/types.d.ts +25 -21
  114. package/dist/auth/types.d.ts.map +1 -1
  115. package/dist/auth/types.js.map +1 -1
  116. package/dist/bin/build.d.ts +49 -0
  117. package/dist/bin/build.d.ts.map +1 -0
  118. package/dist/bin/build.js +226 -0
  119. package/dist/bin/build.js.map +1 -0
  120. package/dist/bin/build.spec.js +594 -0
  121. package/dist/bin/build.spec.js.map +1 -0
  122. package/dist/bin/frameworkConventions.d.ts +8 -0
  123. package/dist/bin/frameworkConventions.d.ts.map +1 -0
  124. package/dist/bin/frameworkConventions.js +8 -0
  125. package/dist/bin/frameworkConventions.js.map +1 -0
  126. package/dist/bin/generateImportMap/index.d.ts.map +1 -1
  127. package/dist/bin/generateImportMap/index.js +8 -5
  128. package/dist/bin/generateImportMap/index.js.map +1 -1
  129. package/dist/bin/generateImportMap/iterateCollections.d.ts.map +1 -1
  130. package/dist/bin/generateImportMap/iterateCollections.js +11 -0
  131. package/dist/bin/generateImportMap/iterateCollections.js.map +1 -1
  132. package/dist/bin/generateImportMap/iterateConfig.d.ts.map +1 -1
  133. package/dist/bin/generateImportMap/iterateConfig.js +12 -0
  134. package/dist/bin/generateImportMap/iterateConfig.js.map +1 -1
  135. package/dist/bin/generateImportMap/iterateFields.d.ts.map +1 -1
  136. package/dist/bin/generateImportMap/iterateFields.js +4 -1
  137. package/dist/bin/generateImportMap/iterateFields.js.map +1 -1
  138. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.d.ts +5 -1
  139. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.d.ts.map +1 -1
  140. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.js +33 -18
  141. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.js.map +1 -1
  142. package/dist/bin/generateTypes.d.ts +3 -2
  143. package/dist/bin/generateTypes.d.ts.map +1 -1
  144. package/dist/bin/generateTypes.js +11 -1
  145. package/dist/bin/generateTypes.js.map +1 -1
  146. package/dist/bin/index.d.ts.map +1 -1
  147. package/dist/bin/index.js +9 -0
  148. package/dist/bin/index.js.map +1 -1
  149. package/dist/bin/loadEnv.d.ts +3 -1
  150. package/dist/bin/loadEnv.d.ts.map +1 -1
  151. package/dist/bin/loadEnv.js +40 -10
  152. package/dist/bin/loadEnv.js.map +1 -1
  153. package/dist/collections/config/client.d.ts +3 -3
  154. package/dist/collections/config/client.d.ts.map +1 -1
  155. package/dist/collections/config/client.js +1 -0
  156. package/dist/collections/config/client.js.map +1 -1
  157. package/dist/collections/config/defaults.d.ts +0 -4
  158. package/dist/collections/config/defaults.d.ts.map +1 -1
  159. package/dist/collections/config/defaults.js +2 -17
  160. package/dist/collections/config/defaults.js.map +1 -1
  161. package/dist/collections/config/defaults.spec.js +47 -0
  162. package/dist/collections/config/defaults.spec.js.map +1 -0
  163. package/dist/collections/config/sanitize.d.ts +10 -1
  164. package/dist/collections/config/sanitize.d.ts.map +1 -1
  165. package/dist/collections/config/sanitize.js +1 -11
  166. package/dist/collections/config/sanitize.js.map +1 -1
  167. package/dist/collections/config/types.d.ts +13 -9
  168. package/dist/collections/config/types.d.ts.map +1 -1
  169. package/dist/collections/config/types.js.map +1 -1
  170. package/dist/collections/dataloader.d.ts +1 -1
  171. package/dist/collections/endpoints/create.d.ts.map +1 -1
  172. package/dist/collections/endpoints/create.js +0 -2
  173. package/dist/collections/endpoints/create.js.map +1 -1
  174. package/dist/collections/endpoints/updateByID.d.ts.map +1 -1
  175. package/dist/collections/endpoints/updateByID.js +1 -2
  176. package/dist/collections/endpoints/updateByID.js.map +1 -1
  177. package/dist/collections/operations/count.d.ts.map +1 -1
  178. package/dist/collections/operations/count.js +1 -0
  179. package/dist/collections/operations/count.js.map +1 -1
  180. package/dist/collections/operations/create.d.ts +0 -1
  181. package/dist/collections/operations/create.d.ts.map +1 -1
  182. package/dist/collections/operations/create.js +15 -6
  183. package/dist/collections/operations/create.js.map +1 -1
  184. package/dist/collections/operations/delete.d.ts.map +1 -1
  185. package/dist/collections/operations/delete.js +3 -0
  186. package/dist/collections/operations/delete.js.map +1 -1
  187. package/dist/collections/operations/findDistinct.d.ts.map +1 -1
  188. package/dist/collections/operations/findDistinct.js +1 -0
  189. package/dist/collections/operations/findDistinct.js.map +1 -1
  190. package/dist/collections/operations/findVersionByID.d.ts.map +1 -1
  191. package/dist/collections/operations/local/count.d.ts +3 -3
  192. package/dist/collections/operations/local/count.d.ts.map +1 -1
  193. package/dist/collections/operations/local/count.js.map +1 -1
  194. package/dist/collections/operations/local/countVersions.d.ts +3 -3
  195. package/dist/collections/operations/local/countVersions.d.ts.map +1 -1
  196. package/dist/collections/operations/local/countVersions.js.map +1 -1
  197. package/dist/collections/operations/local/create.d.ts +3 -3
  198. package/dist/collections/operations/local/create.d.ts.map +1 -1
  199. package/dist/collections/operations/local/create.js.map +1 -1
  200. package/dist/collections/operations/local/delete.d.ts +3 -3
  201. package/dist/collections/operations/local/delete.d.ts.map +1 -1
  202. package/dist/collections/operations/local/delete.js.map +1 -1
  203. package/dist/collections/operations/local/duplicate.d.ts +3 -3
  204. package/dist/collections/operations/local/duplicate.d.ts.map +1 -1
  205. package/dist/collections/operations/local/duplicate.js.map +1 -1
  206. package/dist/collections/operations/local/find.d.ts +3 -3
  207. package/dist/collections/operations/local/find.d.ts.map +1 -1
  208. package/dist/collections/operations/local/find.js.map +1 -1
  209. package/dist/collections/operations/local/findByID.d.ts +3 -3
  210. package/dist/collections/operations/local/findByID.d.ts.map +1 -1
  211. package/dist/collections/operations/local/findByID.js.map +1 -1
  212. package/dist/collections/operations/local/findDistinct.d.ts +2 -2
  213. package/dist/collections/operations/local/findDistinct.d.ts.map +1 -1
  214. package/dist/collections/operations/local/findDistinct.js.map +1 -1
  215. package/dist/collections/operations/local/findVersionByID.d.ts +3 -3
  216. package/dist/collections/operations/local/findVersionByID.d.ts.map +1 -1
  217. package/dist/collections/operations/local/findVersionByID.js.map +1 -1
  218. package/dist/collections/operations/local/findVersions.d.ts +3 -3
  219. package/dist/collections/operations/local/findVersions.d.ts.map +1 -1
  220. package/dist/collections/operations/local/findVersions.js.map +1 -1
  221. package/dist/collections/operations/local/restoreVersion.d.ts +3 -3
  222. package/dist/collections/operations/local/restoreVersion.d.ts.map +1 -1
  223. package/dist/collections/operations/local/restoreVersion.js.map +1 -1
  224. package/dist/collections/operations/local/update.d.ts +7 -11
  225. package/dist/collections/operations/local/update.d.ts.map +1 -1
  226. package/dist/collections/operations/local/update.js +1 -2
  227. package/dist/collections/operations/local/update.js.map +1 -1
  228. package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
  229. package/dist/collections/operations/update.d.ts +0 -1
  230. package/dist/collections/operations/update.d.ts.map +1 -1
  231. package/dist/collections/operations/update.js +8 -4
  232. package/dist/collections/operations/update.js.map +1 -1
  233. package/dist/collections/operations/updateByID.d.ts +0 -1
  234. package/dist/collections/operations/updateByID.d.ts.map +1 -1
  235. package/dist/collections/operations/updateByID.js +1 -5
  236. package/dist/collections/operations/updateByID.js.map +1 -1
  237. package/dist/collections/operations/utilities/buildAfterOperation.d.ts +1 -1
  238. package/dist/collections/operations/utilities/buildAfterOperation.d.ts.map +1 -1
  239. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.d.ts +9 -0
  240. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.d.ts.map +1 -0
  241. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.js +170 -0
  242. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.js.map +1 -0
  243. package/dist/collections/operations/utilities/types.d.ts +20 -29
  244. package/dist/collections/operations/utilities/types.d.ts.map +1 -1
  245. package/dist/collections/operations/utilities/types.js.map +1 -1
  246. package/dist/collections/operations/utilities/update.d.ts +1 -2
  247. package/dist/collections/operations/utilities/update.d.ts.map +1 -1
  248. package/dist/collections/operations/utilities/update.js +64 -65
  249. package/dist/collections/operations/utilities/update.js.map +1 -1
  250. package/dist/config/build.d.ts.map +1 -1
  251. package/dist/config/build.js +8 -0
  252. package/dist/config/build.js.map +1 -1
  253. package/dist/config/client.d.ts +3 -3
  254. package/dist/config/client.d.ts.map +1 -1
  255. package/dist/config/client.js +2 -1
  256. package/dist/config/client.js.map +1 -1
  257. package/dist/config/defaults.d.ts +0 -4
  258. package/dist/config/defaults.d.ts.map +1 -1
  259. package/dist/config/defaults.js +0 -78
  260. package/dist/config/defaults.js.map +1 -1
  261. package/dist/config/definePlugin.d.ts +10 -10
  262. package/dist/config/definePlugin.d.ts.map +1 -1
  263. package/dist/config/definePlugin.js +7 -11
  264. package/dist/config/definePlugin.js.map +1 -1
  265. package/dist/config/orderable/fractional-indexing.d.ts +23 -23
  266. package/dist/config/orderable/fractional-indexing.d.ts.map +1 -1
  267. package/dist/config/orderable/index.d.ts.map +1 -1
  268. package/dist/config/orderable/index.js +23 -0
  269. package/dist/config/orderable/index.js.map +1 -1
  270. package/dist/config/sanitize.d.ts.map +1 -1
  271. package/dist/config/sanitize.js +139 -27
  272. package/dist/config/sanitize.js.map +1 -1
  273. package/dist/config/types.d.ts +126 -38
  274. package/dist/config/types.d.ts.map +1 -1
  275. package/dist/config/types.js +2 -0
  276. package/dist/config/types.js.map +1 -1
  277. package/dist/database/getLocalizedPaths.d.ts.map +1 -1
  278. package/dist/database/getLocalizedPaths.js +1 -1
  279. package/dist/database/getLocalizedPaths.js.map +1 -1
  280. package/dist/database/migrations/migrationsCollection.d.ts.map +1 -1
  281. package/dist/database/migrations/migrationsCollection.js +2 -1
  282. package/dist/database/migrations/migrationsCollection.js.map +1 -1
  283. package/dist/database/types.d.ts +1 -5
  284. package/dist/database/types.d.ts.map +1 -1
  285. package/dist/database/types.js.map +1 -1
  286. package/dist/errors/APIError.d.ts.map +1 -1
  287. package/dist/errors/AuthenticationError.d.ts.map +1 -1
  288. package/dist/errors/DuplicateCollection.d.ts.map +1 -1
  289. package/dist/errors/DuplicateFieldName.d.ts.map +1 -1
  290. package/dist/errors/DuplicateGlobal.d.ts.map +1 -1
  291. package/dist/errors/ErrorDeletingFile.d.ts.map +1 -1
  292. package/dist/errors/FileRetrievalError.d.ts.map +1 -1
  293. package/dist/errors/FileUploadError.d.ts.map +1 -1
  294. package/dist/errors/Forbidden.d.ts.map +1 -1
  295. package/dist/errors/InvalidConfiguration.d.ts.map +1 -1
  296. package/dist/errors/InvalidFieldJoin.d.ts.map +1 -1
  297. package/dist/errors/InvalidFieldName.d.ts.map +1 -1
  298. package/dist/errors/InvalidFieldRelationship.d.ts.map +1 -1
  299. package/dist/errors/InvalidSchema.d.ts.map +1 -1
  300. package/dist/errors/Locked.d.ts.map +1 -1
  301. package/dist/errors/LockedAuth.d.ts.map +1 -1
  302. package/dist/errors/MissingCollectionLabel.d.ts.map +1 -1
  303. package/dist/errors/MissingEditorProp.d.ts.map +1 -1
  304. package/dist/errors/MissingFieldInputOptions.d.ts.map +1 -1
  305. package/dist/errors/MissingFieldType.d.ts.map +1 -1
  306. package/dist/errors/MissingFile.d.ts.map +1 -1
  307. package/dist/errors/NotFound.d.ts.map +1 -1
  308. package/dist/errors/QueryError.d.ts.map +1 -1
  309. package/dist/errors/ReservedFieldName.d.ts.map +1 -1
  310. package/dist/errors/TimestampsRequired.d.ts.map +1 -1
  311. package/dist/errors/UnauthorizedError.d.ts.map +1 -1
  312. package/dist/errors/UnverifiedEmail.d.ts.map +1 -1
  313. package/dist/errors/ValidationError.d.ts +1 -0
  314. package/dist/errors/ValidationError.d.ts.map +1 -1
  315. package/dist/errors/ValidationError.js.map +1 -1
  316. package/dist/exports/internal.d.ts +2 -0
  317. package/dist/exports/internal.d.ts.map +1 -1
  318. package/dist/exports/internal.js +2 -0
  319. package/dist/exports/internal.js.map +1 -1
  320. package/dist/exports/migrations.d.ts +5 -13
  321. package/dist/exports/migrations.d.ts.map +1 -1
  322. package/dist/exports/migrations.js +5 -13
  323. package/dist/exports/migrations.js.map +1 -1
  324. package/dist/exports/shared.d.ts +24 -2
  325. package/dist/exports/shared.d.ts.map +1 -1
  326. package/dist/exports/shared.js +23 -1
  327. package/dist/exports/shared.js.map +1 -1
  328. package/dist/fields/baseFields/slug/countVersions.d.ts.map +1 -1
  329. package/dist/fields/baseFields/slug/countVersions.js +6 -8
  330. package/dist/fields/baseFields/slug/countVersions.js.map +1 -1
  331. package/dist/fields/baseFields/slug/generateSlug.d.ts +14 -7
  332. package/dist/fields/baseFields/slug/generateSlug.d.ts.map +1 -1
  333. package/dist/fields/baseFields/slug/generateSlug.js +53 -73
  334. package/dist/fields/baseFields/slug/generateSlug.js.map +1 -1
  335. package/dist/fields/baseFields/slug/types.d.ts +14 -0
  336. package/dist/fields/baseFields/slug/types.d.ts.map +1 -0
  337. package/dist/fields/baseFields/slug/types.js +6 -0
  338. package/dist/fields/baseFields/slug/types.js.map +1 -0
  339. package/dist/fields/config/client.d.ts +6 -6
  340. package/dist/fields/config/client.d.ts.map +1 -1
  341. package/dist/fields/config/client.js +14 -14
  342. package/dist/fields/config/client.js.map +1 -1
  343. package/dist/fields/config/sanitize.d.ts.map +1 -1
  344. package/dist/fields/config/sanitize.js +41 -14
  345. package/dist/fields/config/sanitize.js.map +1 -1
  346. package/dist/fields/config/types.d.ts +80 -76
  347. package/dist/fields/config/types.d.ts.map +1 -1
  348. package/dist/fields/config/types.js +1 -1
  349. package/dist/fields/config/types.js.map +1 -1
  350. package/dist/fields/hooks/afterChange/promise.js +1 -1
  351. package/dist/fields/hooks/afterChange/promise.js.map +1 -1
  352. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
  353. package/dist/fields/hooks/afterRead/promise.js +13 -3
  354. package/dist/fields/hooks/afterRead/promise.js.map +1 -1
  355. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  356. package/dist/fields/hooks/beforeChange/promise.js +3 -3
  357. package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
  358. package/dist/fields/hooks/beforeDuplicate/promise.js +2 -2
  359. package/dist/fields/hooks/beforeDuplicate/promise.js.map +1 -1
  360. package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
  361. package/dist/fields/hooks/beforeValidate/promise.js +16 -5
  362. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  363. package/dist/fields/hooks/beforeValidate/stripNullRows.d.ts +10 -0
  364. package/dist/fields/hooks/beforeValidate/stripNullRows.d.ts.map +1 -0
  365. package/dist/fields/hooks/beforeValidate/stripNullRows.js +18 -0
  366. package/dist/fields/hooks/beforeValidate/stripNullRows.js.map +1 -0
  367. package/dist/fields/setDefaultBeforeDuplicate.js +1 -0
  368. package/dist/fields/setDefaultBeforeDuplicate.js.map +1 -1
  369. package/dist/fields/sortableFieldTypes.d.ts.map +1 -1
  370. package/dist/fields/sortableFieldTypes.js +1 -0
  371. package/dist/fields/sortableFieldTypes.js.map +1 -1
  372. package/dist/fields/validations.d.ts +4 -1
  373. package/dist/fields/validations.d.ts.map +1 -1
  374. package/dist/fields/validations.js +12 -4
  375. package/dist/fields/validations.js.map +1 -1
  376. package/dist/globals/config/client.d.ts +4 -4
  377. package/dist/globals/config/sanitize.d.ts +6 -1
  378. package/dist/globals/config/sanitize.d.ts.map +1 -1
  379. package/dist/globals/config/sanitize.js +2 -6
  380. package/dist/globals/config/sanitize.js.map +1 -1
  381. package/dist/globals/config/sanitize.spec.js +43 -0
  382. package/dist/globals/config/sanitize.spec.js.map +1 -0
  383. package/dist/globals/endpoints/update.d.ts.map +1 -1
  384. package/dist/globals/endpoints/update.js +0 -2
  385. package/dist/globals/endpoints/update.js.map +1 -1
  386. package/dist/globals/operations/findVersionByID.d.ts.map +1 -1
  387. package/dist/globals/operations/local/countVersions.d.ts +3 -3
  388. package/dist/globals/operations/local/countVersions.d.ts.map +1 -1
  389. package/dist/globals/operations/local/countVersions.js.map +1 -1
  390. package/dist/globals/operations/local/findOne.d.ts +3 -3
  391. package/dist/globals/operations/local/findOne.d.ts.map +1 -1
  392. package/dist/globals/operations/local/findOne.js.map +1 -1
  393. package/dist/globals/operations/local/findVersionByID.d.ts +3 -3
  394. package/dist/globals/operations/local/findVersionByID.d.ts.map +1 -1
  395. package/dist/globals/operations/local/findVersionByID.js.map +1 -1
  396. package/dist/globals/operations/local/findVersions.d.ts +3 -3
  397. package/dist/globals/operations/local/findVersions.d.ts.map +1 -1
  398. package/dist/globals/operations/local/findVersions.js.map +1 -1
  399. package/dist/globals/operations/local/restoreVersion.d.ts +3 -3
  400. package/dist/globals/operations/local/restoreVersion.d.ts.map +1 -1
  401. package/dist/globals/operations/local/restoreVersion.js.map +1 -1
  402. package/dist/globals/operations/local/update.d.ts +7 -9
  403. package/dist/globals/operations/local/update.d.ts.map +1 -1
  404. package/dist/globals/operations/local/update.js +1 -2
  405. package/dist/globals/operations/local/update.js.map +1 -1
  406. package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
  407. package/dist/globals/operations/update.d.ts +0 -1
  408. package/dist/globals/operations/update.d.ts.map +1 -1
  409. package/dist/globals/operations/update.js +52 -58
  410. package/dist/globals/operations/update.js.map +1 -1
  411. package/dist/hierarchy/resolveHierarchyCollections.js +1 -1
  412. package/dist/hierarchy/resolveHierarchyCollections.js.map +1 -1
  413. package/dist/hierarchy/sanitizeHierarchyCollection.d.ts.map +1 -1
  414. package/dist/hierarchy/sanitizeHierarchyCollection.js +3 -1
  415. package/dist/hierarchy/sanitizeHierarchyCollection.js.map +1 -1
  416. package/dist/hierarchy/types.d.ts +8 -1
  417. package/dist/hierarchy/types.d.ts.map +1 -1
  418. package/dist/hierarchy/types.js.map +1 -1
  419. package/dist/index.bundled.d.ts +864 -468
  420. package/dist/index.d.ts +82 -35
  421. package/dist/index.d.ts.map +1 -1
  422. package/dist/index.js +55 -37
  423. package/dist/index.js.map +1 -1
  424. package/dist/kv/adapters/DatabaseKVAdapter.d.ts.map +1 -1
  425. package/dist/kv/adapters/DatabaseKVAdapter.js +1 -0
  426. package/dist/kv/adapters/DatabaseKVAdapter.js.map +1 -1
  427. package/dist/kv/adapters/InMemoryKVAdapter.d.ts.map +1 -1
  428. package/dist/locked-documents/config.d.ts.map +1 -1
  429. package/dist/locked-documents/config.js +2 -1
  430. package/dist/locked-documents/config.js.map +1 -1
  431. package/dist/preferences/config.d.ts.map +1 -1
  432. package/dist/preferences/config.js +2 -1
  433. package/dist/preferences/config.js.map +1 -1
  434. package/dist/preferences/keys.d.ts +8 -4
  435. package/dist/preferences/keys.d.ts.map +1 -1
  436. package/dist/preferences/keys.js +4 -1
  437. package/dist/preferences/keys.js.map +1 -1
  438. package/dist/preferences/types.d.ts +15 -0
  439. package/dist/preferences/types.d.ts.map +1 -1
  440. package/dist/preferences/types.js +3 -1
  441. package/dist/preferences/types.js.map +1 -1
  442. package/dist/query-presets/config.d.ts.map +1 -1
  443. package/dist/query-presets/config.js +77 -37
  444. package/dist/query-presets/config.js.map +1 -1
  445. package/dist/query-presets/constraints.d.ts.map +1 -1
  446. package/dist/query-presets/constraints.js +3 -2
  447. package/dist/query-presets/constraints.js.map +1 -1
  448. package/dist/query-presets/types.d.ts +1 -1
  449. package/dist/query-presets/types.d.ts.map +1 -1
  450. package/dist/queues/config/collection.d.ts.map +1 -1
  451. package/dist/queues/config/collection.js +2 -1
  452. package/dist/queues/config/collection.js.map +1 -1
  453. package/dist/queues/config/generateJobsJSONSchemas.d.ts +1 -1
  454. package/dist/queues/config/generateJobsJSONSchemas.d.ts.map +1 -1
  455. package/dist/queues/config/generateJobsJSONSchemas.js +33 -12
  456. package/dist/queues/config/generateJobsJSONSchemas.js.map +1 -1
  457. package/dist/queues/config/global.d.ts.map +1 -1
  458. package/dist/queues/config/global.js +2 -1
  459. package/dist/queues/config/global.js.map +1 -1
  460. package/dist/queues/errors/index.d.ts.map +1 -1
  461. package/dist/queues/localAPI.d.ts +8 -8
  462. package/dist/queues/localAPI.d.ts.map +1 -1
  463. package/dist/queues/operations/runJobs/runJob/importHandlerPath.d.ts +1 -1
  464. package/dist/queues/operations/runJobs/runJob/importHandlerPath.d.ts.map +1 -1
  465. package/dist/queues/utilities/getCurrentDate.d.ts.map +1 -1
  466. package/dist/types/constants.d.ts +2 -2
  467. package/dist/types/constants.d.ts.map +1 -1
  468. package/dist/types/index.d.ts +18 -8
  469. package/dist/types/index.d.ts.map +1 -1
  470. package/dist/types/index.js.map +1 -1
  471. package/dist/uploads/cropImage.d.ts.map +1 -1
  472. package/dist/uploads/endpoints/getFileFromURL.d.ts.map +1 -1
  473. package/dist/uploads/endpoints/getFileFromURL.js +9 -5
  474. package/dist/uploads/endpoints/getFileFromURL.js.map +1 -1
  475. package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts.map +1 -1
  476. package/dist/uploads/fetchAPI-multipart/processMultipart.js +4 -0
  477. package/dist/uploads/fetchAPI-multipart/processMultipart.js.map +1 -1
  478. package/dist/uploads/generateFileData.d.ts +2 -1
  479. package/dist/uploads/generateFileData.d.ts.map +1 -1
  480. package/dist/uploads/generateFileData.js +5 -2
  481. package/dist/uploads/generateFileData.js.map +1 -1
  482. package/dist/uploads/getBaseFields.d.ts.map +1 -1
  483. package/dist/uploads/getBaseFields.js +7 -19
  484. package/dist/uploads/getBaseFields.js.map +1 -1
  485. package/dist/uploads/getFileByPath.d.ts +1 -1
  486. package/dist/uploads/image-resizing/getImageResizeAction.d.ts +1 -1
  487. package/dist/uploads/matchMimeType.d.ts +8 -0
  488. package/dist/uploads/matchMimeType.d.ts.map +1 -0
  489. package/dist/uploads/matchMimeType.js +19 -0
  490. package/dist/uploads/matchMimeType.js.map +1 -0
  491. package/dist/uploads/matchMimeType.spec.js +66 -0
  492. package/dist/uploads/matchMimeType.spec.js.map +1 -0
  493. package/dist/uploads/safeFetch.d.ts +1 -1
  494. package/dist/uploads/safeFetch.d.ts.map +1 -1
  495. package/dist/uploads/safeFetch.js +11 -5
  496. package/dist/uploads/safeFetch.js.map +1 -1
  497. package/dist/uploads/types.d.ts +33 -29
  498. package/dist/uploads/types.d.ts.map +1 -1
  499. package/dist/uploads/types.js.map +1 -1
  500. package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
  501. package/dist/utilities/addDataAndFileToRequest.js +6 -0
  502. package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
  503. package/dist/utilities/appendDateTimezoneSelectFields.js +2 -2
  504. package/dist/utilities/appendDateTimezoneSelectFields.js.map +1 -1
  505. package/dist/utilities/configToJSONSchema.d.ts +68 -16
  506. package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
  507. package/dist/utilities/configToJSONSchema.js +312 -117
  508. package/dist/utilities/configToJSONSchema.js.map +1 -1
  509. package/dist/utilities/configToJSONSchema.spec.js +656 -85
  510. package/dist/utilities/configToJSONSchema.spec.js.map +1 -1
  511. package/dist/utilities/createLocalReq.d.ts +2 -2
  512. package/dist/utilities/createLocalReq.d.ts.map +1 -1
  513. package/dist/utilities/createLocalReq.js.map +1 -1
  514. package/dist/utilities/createPayloadRequest.d.ts.map +1 -1
  515. package/dist/utilities/createPayloadRequest.js +1 -0
  516. package/dist/utilities/createPayloadRequest.js.map +1 -1
  517. package/dist/utilities/deepCopyObject.d.ts.map +1 -1
  518. package/dist/utilities/deepCopyObject.js +8 -0
  519. package/dist/utilities/deepCopyObject.js.map +1 -1
  520. package/dist/utilities/dependencies/dependencyChecker.js +1 -1
  521. package/dist/utilities/dependencies/dependencyChecker.js.map +1 -1
  522. package/dist/utilities/dependencies/getDependencies.d.ts.map +1 -1
  523. package/dist/utilities/dependencies/getDependencies.js +5 -5
  524. package/dist/utilities/dependencies/getDependencies.js.map +1 -1
  525. package/dist/utilities/dynamicImport.js +1 -1
  526. package/dist/utilities/dynamicImport.js.map +1 -1
  527. package/dist/utilities/filterDataToSelectedLocales.d.ts.map +1 -1
  528. package/dist/utilities/filterDataToSelectedLocales.js +5 -12
  529. package/dist/utilities/filterDataToSelectedLocales.js.map +1 -1
  530. package/dist/utilities/filterDataToSelectedLocales.spec.js +1 -2
  531. package/dist/utilities/filterDataToSelectedLocales.spec.js.map +1 -1
  532. package/dist/utilities/flattenAllFields.d.ts.map +1 -1
  533. package/dist/utilities/flattenAllFields.js +7 -22
  534. package/dist/utilities/flattenAllFields.js.map +1 -1
  535. package/dist/utilities/formatErrors.d.ts.map +1 -1
  536. package/dist/utilities/formatErrors.js +3 -1
  537. package/dist/utilities/formatErrors.js.map +1 -1
  538. package/dist/utilities/getDataByPath.d.ts.map +1 -1
  539. package/dist/utilities/getEntityPermissions/getEntityPermissions.d.ts.map +1 -1
  540. package/dist/utilities/getEntityPermissions/getEntityPermissions.js +2 -0
  541. package/dist/utilities/getEntityPermissions/getEntityPermissions.js.map +1 -1
  542. package/dist/utilities/getEntityPermissions/populateFieldPermissions.d.ts +7 -1
  543. package/dist/utilities/getEntityPermissions/populateFieldPermissions.d.ts.map +1 -1
  544. package/dist/utilities/getEntityPermissions/populateFieldPermissions.js +24 -7
  545. package/dist/utilities/getEntityPermissions/populateFieldPermissions.js.map +1 -1
  546. package/dist/utilities/getFieldByPath.d.ts.map +1 -1
  547. package/dist/utilities/getFieldByPath.js +1 -1
  548. package/dist/utilities/getFieldByPath.js.map +1 -1
  549. package/dist/utilities/getRequestLanguage.d.ts +2 -2
  550. package/dist/utilities/getRequestLanguage.d.ts.map +1 -1
  551. package/dist/utilities/getRequestLanguage.js.map +1 -1
  552. package/dist/utilities/getRequestOrigin.d.ts +2 -2
  553. package/dist/utilities/getVersionsConfig.d.ts +1 -1
  554. package/dist/utilities/getVersionsConfig.js.map +1 -1
  555. package/dist/utilities/handleEndpoints.d.ts.map +1 -1
  556. package/dist/utilities/handleEndpoints.js +7 -4
  557. package/dist/utilities/handleEndpoints.js.map +1 -1
  558. package/dist/utilities/isEntityHidden.d.ts +2 -2
  559. package/dist/utilities/isURLAllowed.d.ts.map +1 -1
  560. package/dist/utilities/isURLAllowed.js +9 -3
  561. package/dist/utilities/isURLAllowed.js.map +1 -1
  562. package/dist/utilities/isURLAllowed.spec.js +78 -0
  563. package/dist/utilities/isURLAllowed.spec.js.map +1 -0
  564. package/dist/utilities/isValidID.d.ts +1 -1
  565. package/dist/utilities/logger.d.ts +1 -1
  566. package/dist/utilities/mergeLocalizedData.d.ts +14 -4
  567. package/dist/utilities/mergeLocalizedData.d.ts.map +1 -1
  568. package/dist/utilities/mergeLocalizedData.js +54 -46
  569. package/dist/utilities/mergeLocalizedData.js.map +1 -1
  570. package/dist/utilities/mergeLocalizedData.spec.js +23 -23
  571. package/dist/utilities/mergeLocalizedData.spec.js.map +1 -1
  572. package/dist/utilities/miniChalk.d.ts.map +1 -1
  573. package/dist/utilities/parseCookies.d.ts +1 -1
  574. package/dist/utilities/parseParams/index.d.ts +2 -5
  575. package/dist/utilities/parseParams/index.d.ts.map +1 -1
  576. package/dist/utilities/parseParams/index.js.map +1 -1
  577. package/dist/utilities/parseParams/index.spec.js +0 -9
  578. package/dist/utilities/parseParams/index.spec.js.map +1 -1
  579. package/dist/utilities/resolveSelect.d.ts.map +1 -1
  580. package/dist/utilities/telemetry/conf/index.d.ts.map +1 -1
  581. package/dist/utilities/telemetry/events/adminInit.d.ts.map +1 -1
  582. package/dist/utilities/telemetry/events/adminInit.js +2 -3
  583. package/dist/utilities/telemetry/events/adminInit.js.map +1 -1
  584. package/dist/utilities/telemetry/events/serverInit.d.ts.map +1 -1
  585. package/dist/utilities/telemetry/events/serverInit.js +2 -3
  586. package/dist/utilities/telemetry/events/serverInit.js.map +1 -1
  587. package/dist/utilities/telemetry/index.d.ts +15 -4
  588. package/dist/utilities/telemetry/index.d.ts.map +1 -1
  589. package/dist/utilities/telemetry/index.js +6 -1
  590. package/dist/utilities/telemetry/index.js.map +1 -1
  591. package/dist/utilities/telemetry/index.spec.js +43 -0
  592. package/dist/utilities/telemetry/index.spec.js.map +1 -0
  593. package/dist/utilities/transformColumnPreferences.js +4 -2
  594. package/dist/utilities/transformColumnPreferences.js.map +1 -1
  595. package/dist/utilities/traverseFields.d.ts.map +1 -1
  596. package/dist/utilities/traverseFields.js +2 -4
  597. package/dist/utilities/traverseFields.js.map +1 -1
  598. package/dist/utilities/traverseForLocalizedFields.d.ts.map +1 -1
  599. package/dist/utilities/traverseForLocalizedFields.js +3 -0
  600. package/dist/utilities/traverseForLocalizedFields.js.map +1 -1
  601. package/dist/versions/baseFields.d.ts +1 -2
  602. package/dist/versions/baseFields.d.ts.map +1 -1
  603. package/dist/versions/baseFields.js +0 -13
  604. package/dist/versions/baseFields.js.map +1 -1
  605. package/dist/versions/buildCollectionFields.d.ts.map +1 -1
  606. package/dist/versions/buildCollectionFields.js +0 -2
  607. package/dist/versions/buildCollectionFields.js.map +1 -1
  608. package/dist/versions/buildGlobalFields.d.ts.map +1 -1
  609. package/dist/versions/buildGlobalFields.js +0 -2
  610. package/dist/versions/buildGlobalFields.js.map +1 -1
  611. package/dist/versions/buildSingleLocalePublishData.d.ts +32 -0
  612. package/dist/versions/buildSingleLocalePublishData.d.ts.map +1 -0
  613. package/dist/versions/buildSingleLocalePublishData.js +37 -0
  614. package/dist/versions/buildSingleLocalePublishData.js.map +1 -0
  615. package/dist/versions/defaults.d.ts.map +1 -1
  616. package/dist/versions/getLatestCollectionVersion.d.ts.map +1 -1
  617. package/dist/versions/payloadPackageList.d.ts.map +1 -1
  618. package/dist/versions/payloadPackageList.js +0 -1
  619. package/dist/versions/payloadPackageList.js.map +1 -1
  620. package/dist/versions/saveVersion.d.ts +0 -2
  621. package/dist/versions/saveVersion.d.ts.map +1 -1
  622. package/dist/versions/saveVersion.js +12 -17
  623. package/dist/versions/saveVersion.js.map +1 -1
  624. package/dist/versions/schedule/job.d.ts.map +1 -1
  625. package/dist/versions/schedule/job.js +6 -10
  626. package/dist/versions/schedule/job.js.map +1 -1
  627. package/dist/versions/types.d.ts +2 -15
  628. package/dist/versions/types.d.ts.map +1 -1
  629. package/dist/versions/types.js.map +1 -1
  630. package/package.json +23 -20
  631. package/dist/database/migrations/templates/localizeStatus.d.ts +0 -10
  632. package/dist/database/migrations/templates/localizeStatus.d.ts.map +0 -1
  633. package/dist/database/migrations/templates/localizeStatus.js +0 -54
  634. package/dist/database/migrations/templates/localizeStatus.js.map +0 -1
  635. package/dist/fields/baseFields/slug/index.d.ts +0 -89
  636. package/dist/fields/baseFields/slug/index.d.ts.map +0 -1
  637. package/dist/fields/baseFields/slug/index.js +0 -81
  638. package/dist/fields/baseFields/slug/index.js.map +0 -1
  639. package/dist/versions/migrations/localizeStatus/index.d.ts +0 -12
  640. package/dist/versions/migrations/localizeStatus/index.d.ts.map +0 -1
  641. package/dist/versions/migrations/localizeStatus/index.js +0 -33
  642. package/dist/versions/migrations/localizeStatus/index.js.map +0 -1
  643. package/dist/versions/migrations/localizeStatus/mongo/down.d.ts +0 -9
  644. package/dist/versions/migrations/localizeStatus/mongo/down.d.ts.map +0 -1
  645. package/dist/versions/migrations/localizeStatus/mongo/down.js +0 -112
  646. package/dist/versions/migrations/localizeStatus/mongo/down.js.map +0 -1
  647. package/dist/versions/migrations/localizeStatus/mongo/index.d.ts +0 -8
  648. package/dist/versions/migrations/localizeStatus/mongo/index.d.ts.map +0 -1
  649. package/dist/versions/migrations/localizeStatus/mongo/index.js +0 -8
  650. package/dist/versions/migrations/localizeStatus/mongo/index.js.map +0 -1
  651. package/dist/versions/migrations/localizeStatus/mongo/up.d.ts +0 -9
  652. package/dist/versions/migrations/localizeStatus/mongo/up.d.ts.map +0 -1
  653. package/dist/versions/migrations/localizeStatus/mongo/up.js +0 -220
  654. package/dist/versions/migrations/localizeStatus/mongo/up.js.map +0 -1
  655. package/dist/versions/migrations/localizeStatus/sql/down.d.ts +0 -11
  656. package/dist/versions/migrations/localizeStatus/sql/down.d.ts.map +0 -1
  657. package/dist/versions/migrations/localizeStatus/sql/down.js +0 -213
  658. package/dist/versions/migrations/localizeStatus/sql/down.js.map +0 -1
  659. package/dist/versions/migrations/localizeStatus/sql/index.d.ts +0 -8
  660. package/dist/versions/migrations/localizeStatus/sql/index.d.ts.map +0 -1
  661. package/dist/versions/migrations/localizeStatus/sql/index.js +0 -8
  662. package/dist/versions/migrations/localizeStatus/sql/index.js.map +0 -1
  663. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.d.ts +0 -13
  664. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.d.ts.map +0 -1
  665. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.js +0 -51
  666. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.js.map +0 -1
  667. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.d.ts +0 -13
  668. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.d.ts.map +0 -1
  669. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.js +0 -54
  670. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.js.map +0 -1
  671. package/dist/versions/migrations/localizeStatus/sql/up.d.ts +0 -11
  672. package/dist/versions/migrations/localizeStatus/sql/up.d.ts.map +0 -1
  673. package/dist/versions/migrations/localizeStatus/sql/up.js +0 -277
  674. package/dist/versions/migrations/localizeStatus/sql/up.js.map +0 -1
  675. package/dist/versions/saveSnapshot.d.ts +0 -18
  676. package/dist/versions/saveSnapshot.d.ts.map +0 -1
  677. package/dist/versions/saveSnapshot.js +0 -38
  678. package/dist/versions/saveSnapshot.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/uploads/fetchAPI-multipart/processMultipart.ts"],"sourcesContent":["import type { Readable } from 'stream'\n\nimport Busboy from 'busboy'\nimport { status as httpStatus } from 'http-status'\n\nimport type { FetchAPIFileUploadOptions } from '../../config/types.js'\nimport type { FetchAPIFileUploadResponse } from './index.js'\n\nimport { APIError } from '../../errors/APIError.js'\nimport { fileFactory } from './fileFactory.js'\nimport { memHandler, tempFileHandler } from './handlers.js'\nimport { processNested } from './processNested.js'\nimport { createUploadTimer } from './uploadTimer.js'\nimport { buildFields, debugLog, isFunc, parseFileName } from './utilities.js'\n\nconst waitFlushProperty = Symbol('wait flush property symbol')\n\ndeclare global {\n interface Request {\n [waitFlushProperty]?: Promise<any>[]\n }\n}\n\ntype ProcessMultipart = (args: {\n options: FetchAPIFileUploadOptions\n request: Request\n}) => Promise<FetchAPIFileUploadResponse>\nexport const processMultipart: ProcessMultipart = async ({ options, request }) => {\n let parsingRequest = true\n\n let shouldAbortProccessing = false\n let fileCount = 0\n let filesCompleted = 0\n let allFilesHaveResolved: (value?: unknown) => void\n let failedResolvingFiles: (err: Error) => void\n let busboyFinishedResolve: () => void\n let busboyFinishedReject: (err: Error) => void\n\n const allFilesComplete = new Promise((res, rej) => {\n allFilesHaveResolved = res\n failedResolvingFiles = rej\n })\n\n const busboyFinished = new Promise<void>((resolve, reject) => {\n busboyFinishedResolve = resolve\n busboyFinishedReject = reject\n })\n\n const result: FetchAPIFileUploadResponse = {\n fields: undefined!,\n files: undefined!,\n }\n\n const headersObject: Record<string, string> = {}\n request.headers.forEach((value, name) => {\n headersObject[name] = value\n })\n\n const reader = request.body?.getReader()\n\n const busboy = Busboy({ ...options, headers: headersObject })\n\n function abortAndDestroyFile(file: Readable, err: APIError) {\n file.destroy()\n shouldAbortProccessing = true\n failedResolvingFiles(err)\n }\n\n // Build multipart req.body fields\n busboy.on('field', (field, val) => {\n result.fields = buildFields(result.fields, field, val)\n })\n\n // Build req.files fields\n busboy.on('file', (field, file, info) => {\n fileCount += 1\n // Parse file name(cutting huge names, decoding, etc..).\n const { encoding, filename: name, mimeType: mime } = info\n const filename = parseFileName(options, name)\n\n const inferredMimeType =\n (filename && filename.endsWith('.glb') && 'model/gltf-binary') ||\n (filename && filename.endsWith('.gltf') && 'model/gltf+json') ||\n mime\n\n // Define methods and handlers for upload process.\n const { cleanup, complete, dataHandler, getFilePath, getFileSize, getHash, getWritePromise } =\n options.useTempFiles\n ? tempFileHandler(options, field, filename) // Upload into temporary file.\n : memHandler(options, field, filename) // Upload into RAM.\n\n const writePromise = options.useTempFiles\n ? getWritePromise().catch(() => {\n busboy.end()\n cleanup()\n })\n : getWritePromise()\n\n const uploadTimer = createUploadTimer(options.uploadTimeout, () => {\n return abortAndDestroyFile(\n file,\n new APIError(`Upload timeout for ${field}->${filename}, bytes:${getFileSize()}`),\n )\n })\n\n file.on('limit', () => {\n debugLog(options, `Size limit reached for ${field}->${filename}, bytes:${getFileSize()}`)\n uploadTimer.clear()\n\n if (isFunc(options.limitHandler)) {\n options.limitHandler({ request, size: getFileSize() })\n }\n\n // Return error and cleanup files if abortOnLimit set.\n if (options.abortOnLimit) {\n debugLog(options, `Upload file size limit reached ${field}->${filename}.`)\n cleanup()\n abortAndDestroyFile(\n file,\n new APIError(options.responseOnLimit!, httpStatus.REQUEST_ENTITY_TOO_LARGE, {\n size: getFileSize(),\n }),\n )\n }\n })\n\n file.on('data', (data) => {\n uploadTimer.set()\n dataHandler(data)\n })\n\n file.on('end', () => {\n const size = getFileSize()\n debugLog(options, `Upload finished ${field}->${filename}, bytes:${size}`)\n uploadTimer.clear()\n\n if (!name && size === 0) {\n fileCount -= 1\n if (options.useTempFiles) {\n cleanup()\n debugLog(options, `Removing the empty file ${field}->${filename}`)\n }\n return debugLog(options, `Don't add file instance if original name and size are empty`)\n }\n\n filesCompleted += 1\n\n result.files = buildFields(\n result.files,\n field,\n fileFactory(\n {\n name: filename,\n buffer: complete(),\n encoding,\n hash: getHash(),\n mimetype: inferredMimeType,\n size,\n tempFilePath: getFilePath(),\n truncated: Boolean('truncated' in file && file.truncated) || false,\n },\n options,\n ),\n )\n\n if (!request[waitFlushProperty]) {\n request[waitFlushProperty] = []\n }\n request[waitFlushProperty].push(writePromise)\n\n if (filesCompleted === fileCount) {\n allFilesHaveResolved()\n }\n })\n\n file.on('error', (err) => {\n uploadTimer.clear()\n debugLog(options, `File Error: ${err.message}`)\n cleanup()\n failedResolvingFiles(err)\n })\n\n // Start upload process.\n debugLog(options, `New upload started ${field}->${filename}, bytes:${getFileSize()}`)\n uploadTimer.set()\n })\n\n busboy.on('finish', async () => {\n debugLog(options, `Busboy finished parsing request.`)\n if (options.parseNested) {\n result.fields = processNested(result.fields)\n result.files = processNested(result.files)\n }\n\n if (request[waitFlushProperty]) {\n try {\n await Promise.all(request[waitFlushProperty]).then(() => {\n delete request[waitFlushProperty]\n })\n } catch (err) {\n debugLog(options, `Error waiting for file write promises: ${err}`)\n }\n }\n\n busboyFinishedResolve()\n })\n\n busboy.on(\n 'error',\n (err = new APIError('Busboy error parsing multipart request', httpStatus.BAD_REQUEST)) => {\n debugLog(options, `Busboy error`)\n const busboyError =\n err instanceof Error\n ? err\n : new APIError('Busboy error parsing multipart request', httpStatus.BAD_REQUEST)\n\n busboyFinishedReject(busboyError)\n },\n )\n\n while (parsingRequest) {\n const { done, value } = await reader!.read()\n\n if (done) {\n parsingRequest = false\n busboy.end()\n }\n\n if (value && !shouldAbortProccessing) {\n busboy.write(value)\n }\n }\n\n if (fileCount !== 0) {\n await allFilesComplete.catch((e) => {\n throw e\n })\n }\n\n await busboyFinished\n\n return result\n}\n"],"names":["Busboy","status","httpStatus","APIError","fileFactory","memHandler","tempFileHandler","processNested","createUploadTimer","buildFields","debugLog","isFunc","parseFileName","waitFlushProperty","Symbol","processMultipart","options","request","parsingRequest","shouldAbortProccessing","fileCount","filesCompleted","allFilesHaveResolved","failedResolvingFiles","busboyFinishedResolve","busboyFinishedReject","allFilesComplete","Promise","res","rej","busboyFinished","resolve","reject","result","fields","undefined","files","headersObject","headers","forEach","value","name","reader","body","getReader","busboy","abortAndDestroyFile","file","err","destroy","on","field","val","info","encoding","filename","mimeType","mime","inferredMimeType","endsWith","cleanup","complete","dataHandler","getFilePath","getFileSize","getHash","getWritePromise","useTempFiles","writePromise","catch","end","uploadTimer","uploadTimeout","clear","limitHandler","size","abortOnLimit","responseOnLimit","REQUEST_ENTITY_TOO_LARGE","data","set","buffer","hash","mimetype","tempFilePath","truncated","Boolean","push","message","parseNested","all","then","BAD_REQUEST","busboyError","Error","done","read","write","e"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/uploads/fetchAPI-multipart/processMultipart.ts"],"sourcesContent":["import type { Readable } from 'stream'\n\nimport Busboy from 'busboy'\nimport { status as httpStatus } from 'http-status'\n\nimport type { FetchAPIFileUploadOptions } from '../../config/types.js'\nimport type { FetchAPIFileUploadResponse } from './index.js'\n\nimport { APIError } from '../../errors/APIError.js'\nimport { fileFactory } from './fileFactory.js'\nimport { memHandler, tempFileHandler } from './handlers.js'\nimport { processNested } from './processNested.js'\nimport { createUploadTimer } from './uploadTimer.js'\nimport { buildFields, debugLog, isFunc, parseFileName } from './utilities.js'\n\nconst waitFlushProperty = Symbol('wait flush property symbol')\n\ndeclare global {\n interface Request {\n [waitFlushProperty]?: Promise<any>[]\n }\n}\n\ntype ProcessMultipart = (args: {\n options: FetchAPIFileUploadOptions\n request: Request\n}) => Promise<FetchAPIFileUploadResponse>\nexport const processMultipart: ProcessMultipart = async ({ options, request }) => {\n let parsingRequest = true\n\n let shouldAbortProccessing = false\n let fileCount = 0\n let filesCompleted = 0\n let allFilesHaveResolved: (value?: unknown) => void\n let failedResolvingFiles: (err: Error) => void\n let busboyFinishedResolve: () => void\n let busboyFinishedReject: (err: Error) => void\n\n const allFilesComplete = new Promise((res, rej) => {\n allFilesHaveResolved = res\n failedResolvingFiles = rej\n })\n\n // Busboy rejects these from a stream event before the awaits below attach, so\n // Node reports them as unhandled and kills the process on oversize uploads.\n allFilesComplete.catch(() => {})\n\n const busboyFinished = new Promise<void>((resolve, reject) => {\n busboyFinishedResolve = resolve\n busboyFinishedReject = reject\n })\n\n busboyFinished.catch(() => {})\n\n const result: FetchAPIFileUploadResponse = {\n fields: undefined!,\n files: undefined!,\n }\n\n const headersObject: Record<string, string> = {}\n request.headers.forEach((value, name) => {\n headersObject[name] = value\n })\n\n const reader = request.body?.getReader()\n\n const busboy = Busboy({ ...options, headers: headersObject })\n\n function abortAndDestroyFile(file: Readable, err: APIError) {\n file.destroy()\n shouldAbortProccessing = true\n failedResolvingFiles(err)\n }\n\n // Build multipart req.body fields\n busboy.on('field', (field, val) => {\n result.fields = buildFields(result.fields, field, val)\n })\n\n // Build req.files fields\n busboy.on('file', (field, file, info) => {\n fileCount += 1\n // Parse file name(cutting huge names, decoding, etc..).\n const { encoding, filename: name, mimeType: mime } = info\n const filename = parseFileName(options, name)\n\n const inferredMimeType =\n (filename && filename.endsWith('.glb') && 'model/gltf-binary') ||\n (filename && filename.endsWith('.gltf') && 'model/gltf+json') ||\n mime\n\n // Define methods and handlers for upload process.\n const { cleanup, complete, dataHandler, getFilePath, getFileSize, getHash, getWritePromise } =\n options.useTempFiles\n ? tempFileHandler(options, field, filename) // Upload into temporary file.\n : memHandler(options, field, filename) // Upload into RAM.\n\n const writePromise = options.useTempFiles\n ? getWritePromise().catch(() => {\n busboy.end()\n cleanup()\n })\n : getWritePromise()\n\n const uploadTimer = createUploadTimer(options.uploadTimeout, () => {\n return abortAndDestroyFile(\n file,\n new APIError(`Upload timeout for ${field}->${filename}, bytes:${getFileSize()}`),\n )\n })\n\n file.on('limit', () => {\n debugLog(options, `Size limit reached for ${field}->${filename}, bytes:${getFileSize()}`)\n uploadTimer.clear()\n\n if (isFunc(options.limitHandler)) {\n options.limitHandler({ request, size: getFileSize() })\n }\n\n // Return error and cleanup files if abortOnLimit set.\n if (options.abortOnLimit) {\n debugLog(options, `Upload file size limit reached ${field}->${filename}.`)\n cleanup()\n abortAndDestroyFile(\n file,\n new APIError(options.responseOnLimit!, httpStatus.REQUEST_ENTITY_TOO_LARGE, {\n size: getFileSize(),\n }),\n )\n }\n })\n\n file.on('data', (data) => {\n uploadTimer.set()\n dataHandler(data)\n })\n\n file.on('end', () => {\n const size = getFileSize()\n debugLog(options, `Upload finished ${field}->${filename}, bytes:${size}`)\n uploadTimer.clear()\n\n if (!name && size === 0) {\n fileCount -= 1\n if (options.useTempFiles) {\n cleanup()\n debugLog(options, `Removing the empty file ${field}->${filename}`)\n }\n return debugLog(options, `Don't add file instance if original name and size are empty`)\n }\n\n filesCompleted += 1\n\n result.files = buildFields(\n result.files,\n field,\n fileFactory(\n {\n name: filename,\n buffer: complete(),\n encoding,\n hash: getHash(),\n mimetype: inferredMimeType,\n size,\n tempFilePath: getFilePath(),\n truncated: Boolean('truncated' in file && file.truncated) || false,\n },\n options,\n ),\n )\n\n if (!request[waitFlushProperty]) {\n request[waitFlushProperty] = []\n }\n request[waitFlushProperty].push(writePromise)\n\n if (filesCompleted === fileCount) {\n allFilesHaveResolved()\n }\n })\n\n file.on('error', (err) => {\n uploadTimer.clear()\n debugLog(options, `File Error: ${err.message}`)\n cleanup()\n failedResolvingFiles(err)\n })\n\n // Start upload process.\n debugLog(options, `New upload started ${field}->${filename}, bytes:${getFileSize()}`)\n uploadTimer.set()\n })\n\n busboy.on('finish', async () => {\n debugLog(options, `Busboy finished parsing request.`)\n if (options.parseNested) {\n result.fields = processNested(result.fields)\n result.files = processNested(result.files)\n }\n\n if (request[waitFlushProperty]) {\n try {\n await Promise.all(request[waitFlushProperty]).then(() => {\n delete request[waitFlushProperty]\n })\n } catch (err) {\n debugLog(options, `Error waiting for file write promises: ${err}`)\n }\n }\n\n busboyFinishedResolve()\n })\n\n busboy.on(\n 'error',\n (err = new APIError('Busboy error parsing multipart request', httpStatus.BAD_REQUEST)) => {\n debugLog(options, `Busboy error`)\n const busboyError =\n err instanceof Error\n ? err\n : new APIError('Busboy error parsing multipart request', httpStatus.BAD_REQUEST)\n\n busboyFinishedReject(busboyError)\n },\n )\n\n while (parsingRequest) {\n const { done, value } = await reader!.read()\n\n if (done) {\n parsingRequest = false\n busboy.end()\n }\n\n if (value && !shouldAbortProccessing) {\n busboy.write(value)\n }\n }\n\n if (fileCount !== 0) {\n await allFilesComplete.catch((e) => {\n throw e\n })\n }\n\n await busboyFinished\n\n return result\n}\n"],"names":["Busboy","status","httpStatus","APIError","fileFactory","memHandler","tempFileHandler","processNested","createUploadTimer","buildFields","debugLog","isFunc","parseFileName","waitFlushProperty","Symbol","processMultipart","options","request","parsingRequest","shouldAbortProccessing","fileCount","filesCompleted","allFilesHaveResolved","failedResolvingFiles","busboyFinishedResolve","busboyFinishedReject","allFilesComplete","Promise","res","rej","catch","busboyFinished","resolve","reject","result","fields","undefined","files","headersObject","headers","forEach","value","name","reader","body","getReader","busboy","abortAndDestroyFile","file","err","destroy","on","field","val","info","encoding","filename","mimeType","mime","inferredMimeType","endsWith","cleanup","complete","dataHandler","getFilePath","getFileSize","getHash","getWritePromise","useTempFiles","writePromise","end","uploadTimer","uploadTimeout","clear","limitHandler","size","abortOnLimit","responseOnLimit","REQUEST_ENTITY_TOO_LARGE","data","set","buffer","hash","mimetype","tempFilePath","truncated","Boolean","push","message","parseNested","all","then","BAD_REQUEST","busboyError","Error","done","read","write","e"],"mappings":"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"}
@@ -6,6 +6,7 @@ type Args<T> = {
6
6
  collection: Collection;
7
7
  config: SanitizedConfig;
8
8
  data: T;
9
+ draft?: boolean;
9
10
  isDuplicating?: boolean;
10
11
  operation: 'create' | 'update';
11
12
  originalDoc?: T;
@@ -17,6 +18,6 @@ type Result<T> = Promise<{
17
18
  data: T;
18
19
  files: FileToSave[];
19
20
  }>;
20
- export declare const generateFileData: <T>({ collection: { config: collectionConfig }, data, isDuplicating, operation, originalDoc, overwriteExistingFiles, req, throwOnMissingFile, }: Args<T>) => Result<T>;
21
+ export declare const generateFileData: <T>({ collection: { config: collectionConfig }, data, draft, isDuplicating, operation, originalDoc, overwriteExistingFiles, req, throwOnMissingFile, }: Args<T>) => Result<T>;
21
22
  export {};
22
23
  //# sourceMappingURL=generateFileData.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generateFileData.d.ts","sourceRoot":"","sources":["../../src/uploads/generateFileData.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,KAAK,EAAY,UAAU,EAAgC,MAAM,YAAY,CAAA;AAcpF,KAAK,IAAI,CAAC,CAAC,IAAI;IACb,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,WAAW,CAAC,EAAE,CAAC,CAAA;IACf,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,GAAG,EAAE,cAAc,CAAA;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,KAAK,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB,CAAC,CAAA;AA6BF,eAAO,MAAM,gBAAgB,GAAU,CAAC,+IASrC,IAAI,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,CAkWpB,CAAA"}
1
+ {"version":3,"file":"generateFileData.d.ts","sourceRoot":"","sources":["../../src/uploads/generateFileData.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,KAAK,EAAY,UAAU,EAAgC,MAAM,YAAY,CAAA;AAcpF,KAAK,IAAI,CAAC,CAAC,IAAI;IACb,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,WAAW,CAAC,EAAE,CAAC,CAAA;IACf,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,GAAG,EAAE,cAAc,CAAA;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,KAAK,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB,CAAC,CAAA;AA6BF,eAAO,MAAM,gBAAgB,GAAU,CAAC,sJAUrC,IAAI,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,CAmWpB,CAAA"}
@@ -31,7 +31,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
31
31
  }
32
32
  return false;
33
33
  };
34
- export const generateFileData = async ({ collection: { config: collectionConfig }, data, isDuplicating, operation, originalDoc, overwriteExistingFiles, req, throwOnMissingFile })=>{
34
+ export const generateFileData = async ({ collection: { config: collectionConfig }, data, draft, isDuplicating, operation, originalDoc, overwriteExistingFiles, req, throwOnMissingFile })=>{
35
35
  if (!collectionConfig.upload) {
36
36
  return {
37
37
  data,
@@ -321,7 +321,10 @@ export const generateFileData = async ({ collection: { config: collectionConfig
321
321
  }
322
322
  newData = {
323
323
  ...newData,
324
- ...fileData
324
+ ...fileData,
325
+ ...draft ? {
326
+ _status: 'draft'
327
+ } : {}
325
328
  };
326
329
  return {
327
330
  data: newData,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import type { OutputInfo, Sharp, SharpOptions } from 'sharp'\n\nimport { fileTypeFromBuffer } from 'file-type'\nimport fs from 'fs/promises'\nimport sanitize from 'sanitize-filename'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { Document, PayloadRequest } from '../types/index.js'\nimport type { FileData, FileToSave, ProbedImageSize, UploadEdits } from './types.js'\n\nimport { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js'\nimport { isNumber } from '../utilities/isNumber.js'\nimport { canResizeImage } from './canResizeImage.js'\nimport { checkFileRestrictions } from './checkFileRestrictions.js'\nimport { cropImage } from './cropImage.js'\nimport { getExternalFile } from './getExternalFile.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getImageSize } from './getImageSize.js'\nimport { getSafeFileName } from './getSafeFilename.js'\nimport { createImageSizes } from './image-resizing/createImageSizes.js'\nimport { isImage } from './isImage.js'\nimport { optionallyAppendMetadata } from './optionallyAppendMetadata.js'\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc?: T\n overwriteExistingFiles?: boolean\n req: PayloadRequest\n throwOnMissingFile?: boolean\n}\n\ntype Result<T> = Promise<{\n data: T\n files: FileToSave[]\n}>\n\nconst shouldReupload = (\n uploadEdits: UploadEdits,\n fileData: Record<string, unknown> | undefined,\n) => {\n if (!fileData) {\n return false\n }\n\n if (uploadEdits.crop || uploadEdits.heightInPixels || uploadEdits.widthInPixels) {\n return true\n }\n\n // Since uploadEdits always has focalPoint, compare to the value in the data if it was changed\n if (uploadEdits.focalPoint) {\n const incomingFocalX = uploadEdits.focalPoint.x\n const incomingFocalY = uploadEdits.focalPoint.y\n\n const currentFocalX = 'focalX' in fileData && fileData.focalX\n const currentFocalY = 'focalY' in fileData && fileData.focalY\n\n const isEqual = incomingFocalX === currentFocalX && incomingFocalY === currentFocalY\n return !isEqual\n }\n\n return false\n}\n\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n isDuplicating,\n operation,\n originalDoc,\n overwriteExistingFiles,\n req,\n throwOnMissingFile,\n}: Args<T>): Result<T> => {\n if (!collectionConfig.upload) {\n return {\n data,\n files: [],\n }\n }\n\n const { serverURL, sharp } = req.payload.config\n\n let file = isDuplicating ? undefined : req.file\n\n const uploadEdits = parseUploadEditsFromReqOrIncomingData({\n data,\n isDuplicating,\n operation,\n originalDoc,\n req,\n })\n\n const {\n constructorOptions,\n disableLocalStorage,\n focalPoint: focalPointEnabled = true,\n formatOptions,\n imageSizes,\n resizeOptions,\n staticDir,\n trimOptions,\n withMetadata,\n } = collectionConfig.upload\n\n const staticPath = staticDir\n\n const incomingFileData: Document = isDuplicating ? originalDoc : data\n let isLocalFile = false\n\n if (\n !file &&\n (isDuplicating || shouldReupload(uploadEdits, incomingFileData as Record<string, unknown>))\n ) {\n const { filename, url } = incomingFileData as unknown as FileData\n if (filename && (filename.includes('../') || filename.includes('..\\\\'))) {\n throw new Forbidden(req.t)\n }\n\n if ((serverURL && url?.startsWith(serverURL)) || url?.startsWith('/')) {\n isLocalFile = true\n }\n\n try {\n if (!disableLocalStorage && isLocalFile) {\n // File is stored locally\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && url) {\n // File is remote\n file = await getExternalFile({\n data: incomingFileData as unknown as FileData,\n req,\n uploadConfig: collectionConfig.upload,\n })\n overwriteExistingFiles = true\n }\n } catch (err: unknown) {\n throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined)\n }\n }\n\n if (isDuplicating) {\n overwriteExistingFiles = false\n }\n\n if (!file) {\n if (throwOnMissingFile) {\n throw new MissingFile(req.t)\n }\n\n return {\n data: incomingFileData!,\n files: [],\n }\n }\n\n await checkFileRestrictions({\n collection: collectionConfig,\n file,\n req,\n })\n\n if (!disableLocalStorage) {\n await fs.mkdir(staticPath!, { recursive: true })\n }\n\n let newData = incomingFileData as T\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const fileIsAnimatedType = ['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(\n resizeOptions || formatOptions || trimOptions || constructorOptions || file.tempFilePath,\n )\n\n const sharpOptions: SharpOptions = { ...constructorOptions }\n\n if (fileIsAnimatedType) {\n sharpOptions.animated = true\n }\n\n if (sharp && (fileIsAnimatedType || fileHasAdjustments)) {\n if (file.tempFilePath) {\n sharpFile = sharp(file.tempFilePath, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n } else {\n sharpFile = sharp(file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n }\n\n if (fileHasAdjustments) {\n if (resizeOptions) {\n sharpFile = sharpFile.resize(resizeOptions)\n }\n if (formatOptions) {\n sharpFile = sharpFile.toFormat(formatOptions.format, formatOptions.options)\n }\n if (trimOptions) {\n sharpFile = sharpFile.trim(trimOptions)\n }\n }\n }\n\n if (fileSupportsResize || isImage(file.mimetype)) {\n dimensions = await getImageSize(file)\n fileData.width = dimensions.width\n fileData.height = dimensions.height\n }\n\n if (sharpFile) {\n const metadata = await sharpFile.metadata()\n sharpFile = await optionallyAppendMetadata({\n req,\n sharpFile,\n withMetadata: withMetadata!,\n })\n fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true })\n ;({ ext, mime } = (await fileTypeFromBuffer(fileBuffer.data))!) // This is getting an incorrect gif height back.\n fileData.width = fileBuffer.info.width\n fileData.height = fileBuffer.info.height\n fileData.filesize = fileBuffer.info.size\n\n // Animated GIFs + WebP aggregate the height from every frame, so we need to use divide by number of pages\n if (metadata.pages) {\n fileData.height = fileBuffer.info.height / metadata.pages\n fileData.filesize = fileBuffer.data.length\n }\n } else {\n mime = file.mimetype\n fileData.filesize = file.size\n\n if (file.name.includes('.')) {\n ext = file.name.split('.').pop()?.split('?')[0]\n } else {\n ext = ''\n }\n }\n\n // Adjust SVG mime type. fromBuffer modifies it.\n if (mime === 'application/xml' && ext === 'svg') {\n mime = 'image/svg+xml'\n }\n fileData.mimeType = mime\n\n const baseFilename = sanitize(file.name.substring(0, file.name.lastIndexOf('.')) || file.name)\n fsSafeName = `${baseFilename}${ext ? `.${ext}` : ''}`\n\n if (!overwriteExistingFiles) {\n // Extract prefix if present (added by plugin-cloud-storage)\n const prefix = (data as Record<string, unknown>)?.prefix as string | undefined\n fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n prefix,\n req,\n staticPath: staticPath!,\n })\n }\n\n fileData.filename = fsSafeName\n\n let fileForResize = file\n\n if (cropData && sharp) {\n const { data: croppedImage, info } = await cropImage({\n cropData,\n dimensions: dimensions!,\n file,\n heightInPixels: uploadEdits.heightInPixels!,\n req,\n sharp,\n widthInPixels: uploadEdits.widthInPixels!,\n withMetadata,\n })\n\n // Apply resize after cropping to ensure it conforms to resizeOptions\n if (resizeOptions && !resizeOptions.withoutEnlargement) {\n const resizedAfterCrop = await sharp(croppedImage)\n .resize({\n fit: resizeOptions?.fit || 'cover',\n height: resizeOptions?.height,\n position: resizeOptions?.position || 'center',\n width: resizeOptions?.width,\n })\n .toBuffer({ resolveWithObject: true })\n\n filesToSave.push({\n buffer: resizedAfterCrop.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...fileForResize,\n data: resizedAfterCrop.data,\n size: resizedAfterCrop.info.size,\n }\n\n fileData.width = resizedAfterCrop.info.width\n fileData.height = resizedAfterCrop.info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile!.metadata()\n fileData.height = metadata.pages\n ? resizedAfterCrop.info.height / metadata.pages\n : resizedAfterCrop.info.height\n }\n fileData.filesize = resizedAfterCrop.info.size\n } else {\n // If resizeOptions is not present, just save the cropped image\n filesToSave.push({\n buffer: croppedImage,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...file,\n data: croppedImage,\n size: info.size,\n }\n\n fileData.width = info.width\n fileData.height = info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile!.metadata()\n fileData.height = metadata.pages ? info.height / metadata.pages : info.height\n }\n fileData.filesize = info.size\n }\n\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path\n } else {\n req.file = fileForResize\n }\n } else {\n // For non-image files with useTempFiles, read the buffer from the temp file\n // since file.data is empty when using temp files\n let bufferToSave: Buffer\n if (fileBuffer?.data) {\n bufferToSave = fileBuffer.data\n } else if (file.tempFilePath) {\n bufferToSave = await fs.readFile(file.tempFilePath)\n } else {\n bufferToSave = file.data\n }\n\n filesToSave.push({\n buffer: bufferToSave,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n // If using temp files and the image is being resized, write the file to the temp path\n if (fileBuffer?.data || bufferToSave.length > 0) {\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, fileBuffer?.data || bufferToSave) // write fileBuffer to the temp path\n } else {\n // Assign the _possibly modified_ file to the request object\n req.file = {\n ...file,\n data: fileBuffer?.data || bufferToSave,\n size: fileBuffer?.info.size,\n }\n }\n }\n }\n\n if (fileSupportsResize && (Array.isArray(imageSizes) || focalPointEnabled !== false)) {\n req.payloadUploadSizes = {}\n // Focal point adjustments\n const focalPoint =\n focalPointEnabled && uploadEdits?.focalPoint\n ? {\n x: isNumber(uploadEdits.focalPoint.x) ? Math.round(uploadEdits.focalPoint.x) : 50,\n y: isNumber(uploadEdits.focalPoint.y) ? Math.round(uploadEdits.focalPoint.y) : 50,\n }\n : undefined\n\n const { sizeData, sizesToSave } = await createImageSizes({\n config: collectionConfig,\n dimensions: !cropData\n ? dimensions!\n : {\n ...dimensions,\n height: fileData.height!,\n width: fileData.width!,\n },\n file: fileForResize,\n focalPoint,\n mimeType: fileData.mimeType,\n req,\n savedFilename: fsSafeName || file.name,\n sharp,\n staticPath: staticPath!,\n withMetadata,\n })\n\n fileData.sizes = sizeData\n fileData.focalX = focalPoint?.x\n fileData.focalY = focalPoint?.y\n filesToSave.push(...sizesToSave)\n }\n } catch (err) {\n req.payload.logger.error(err)\n throw new FileUploadError(req.t)\n }\n\n newData = {\n ...newData,\n ...fileData,\n }\n\n return {\n data: newData,\n files: filesToSave,\n }\n}\n\n/**\n * Parse upload edits from req or incoming data\n */\nfunction parseUploadEditsFromReqOrIncomingData(args: {\n data: unknown\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc: unknown\n req: PayloadRequest\n}): UploadEdits {\n const { data, isDuplicating, operation, originalDoc, req } = args\n\n // Get intended focal point change from query string or incoming data\n const uploadEdits =\n req.query?.uploadEdits && typeof req.query.uploadEdits === 'object'\n ? (req.query.uploadEdits as UploadEdits)\n : {}\n\n if (uploadEdits.focalPoint) {\n return uploadEdits\n }\n\n const incomingData = data as FileData\n const origDoc = originalDoc as FileData\n\n if (origDoc && 'focalX' in origDoc && 'focalY' in origDoc) {\n // If no change in focal point, return undefined.\n // This prevents a refocal operation triggered from admin, because it always sends the focal point.\n if (incomingData.focalX === origDoc.focalX && incomingData.focalY === origDoc.focalY) {\n return undefined!\n }\n\n if (isDuplicating) {\n uploadEdits.focalPoint = {\n x: incomingData?.focalX || origDoc.focalX!,\n y: incomingData?.focalY || origDoc.focalY!,\n }\n return uploadEdits\n }\n }\n\n if (incomingData?.focalX && incomingData?.focalY) {\n uploadEdits.focalPoint = {\n x: incomingData.focalX,\n y: incomingData.focalY,\n }\n return uploadEdits\n }\n\n // If no focal point is set, default to center\n if (operation === 'create') {\n uploadEdits.focalPoint = {\n x: 50,\n y: 50,\n }\n }\n\n return uploadEdits\n}\n"],"names":["fileTypeFromBuffer","fs","sanitize","FileRetrievalError","FileUploadError","Forbidden","MissingFile","isNumber","canResizeImage","checkFileRestrictions","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","createImageSizes","isImage","optionallyAppendMetadata","shouldReupload","uploadEdits","fileData","crop","heightInPixels","widthInPixels","focalPoint","incomingFocalX","x","incomingFocalY","y","currentFocalX","focalX","currentFocalY","focalY","isEqual","generateFileData","collection","config","collectionConfig","data","isDuplicating","operation","originalDoc","overwriteExistingFiles","req","throwOnMissingFile","upload","files","serverURL","sharp","payload","file","undefined","parseUploadEditsFromReqOrIncomingData","constructorOptions","disableLocalStorage","focalPointEnabled","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","withMetadata","staticPath","incomingFileData","isLocalFile","filename","url","includes","t","startsWith","filePath","response","uploadConfig","err","Error","message","mkdir","recursive","newData","filesToSave","fileIsAnimatedType","mimetype","cropData","fileSupportsResize","fsSafeName","sharpFile","dimensions","fileBuffer","ext","mime","fileHasAdjustments","Boolean","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","prefix","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","withoutEnlargement","resizedAfterCrop","fit","position","push","buffer","path","writeFile","bufferToSave","readFile","Array","isArray","payloadUploadSizes","Math","round","sizeData","sizesToSave","savedFilename","sizes","logger","error","args","query","incomingData","origDoc"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import type { OutputInfo, Sharp, SharpOptions } from 'sharp'\n\nimport { fileTypeFromBuffer } from 'file-type'\nimport fs from 'fs/promises'\nimport sanitize from 'sanitize-filename'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { Document, PayloadRequest } from '../types/index.js'\nimport type { FileData, FileToSave, ProbedImageSize, UploadEdits } from './types.js'\n\nimport { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js'\nimport { isNumber } from '../utilities/isNumber.js'\nimport { canResizeImage } from './canResizeImage.js'\nimport { checkFileRestrictions } from './checkFileRestrictions.js'\nimport { cropImage } from './cropImage.js'\nimport { getExternalFile } from './getExternalFile.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getImageSize } from './getImageSize.js'\nimport { getSafeFileName } from './getSafeFilename.js'\nimport { createImageSizes } from './image-resizing/createImageSizes.js'\nimport { isImage } from './isImage.js'\nimport { optionallyAppendMetadata } from './optionallyAppendMetadata.js'\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n draft?: boolean\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc?: T\n overwriteExistingFiles?: boolean\n req: PayloadRequest\n throwOnMissingFile?: boolean\n}\n\ntype Result<T> = Promise<{\n data: T\n files: FileToSave[]\n}>\n\nconst shouldReupload = (\n uploadEdits: UploadEdits,\n fileData: Record<string, unknown> | undefined,\n) => {\n if (!fileData) {\n return false\n }\n\n if (uploadEdits.crop || uploadEdits.heightInPixels || uploadEdits.widthInPixels) {\n return true\n }\n\n // Since uploadEdits always has focalPoint, compare to the value in the data if it was changed\n if (uploadEdits.focalPoint) {\n const incomingFocalX = uploadEdits.focalPoint.x\n const incomingFocalY = uploadEdits.focalPoint.y\n\n const currentFocalX = 'focalX' in fileData && fileData.focalX\n const currentFocalY = 'focalY' in fileData && fileData.focalY\n\n const isEqual = incomingFocalX === currentFocalX && incomingFocalY === currentFocalY\n return !isEqual\n }\n\n return false\n}\n\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n draft,\n isDuplicating,\n operation,\n originalDoc,\n overwriteExistingFiles,\n req,\n throwOnMissingFile,\n}: Args<T>): Result<T> => {\n if (!collectionConfig.upload) {\n return {\n data,\n files: [],\n }\n }\n\n const { serverURL, sharp } = req.payload.config\n\n let file = isDuplicating ? undefined : req.file\n\n const uploadEdits = parseUploadEditsFromReqOrIncomingData({\n data,\n isDuplicating,\n operation,\n originalDoc,\n req,\n })\n\n const {\n constructorOptions,\n disableLocalStorage,\n focalPoint: focalPointEnabled = true,\n formatOptions,\n imageSizes,\n resizeOptions,\n staticDir,\n trimOptions,\n withMetadata,\n } = collectionConfig.upload\n\n const staticPath = staticDir\n\n const incomingFileData: Document = isDuplicating ? originalDoc : data\n let isLocalFile = false\n\n if (\n !file &&\n (isDuplicating || shouldReupload(uploadEdits, incomingFileData as Record<string, unknown>))\n ) {\n const { filename, url } = incomingFileData as unknown as FileData\n if (filename && (filename.includes('../') || filename.includes('..\\\\'))) {\n throw new Forbidden(req.t)\n }\n\n if ((serverURL && url?.startsWith(serverURL)) || url?.startsWith('/')) {\n isLocalFile = true\n }\n\n try {\n if (!disableLocalStorage && isLocalFile) {\n // File is stored locally\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && url) {\n // File is remote\n file = await getExternalFile({\n data: incomingFileData as unknown as FileData,\n req,\n uploadConfig: collectionConfig.upload,\n })\n overwriteExistingFiles = true\n }\n } catch (err: unknown) {\n throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined)\n }\n }\n\n if (isDuplicating) {\n overwriteExistingFiles = false\n }\n\n if (!file) {\n if (throwOnMissingFile) {\n throw new MissingFile(req.t)\n }\n\n return {\n data: incomingFileData!,\n files: [],\n }\n }\n\n await checkFileRestrictions({\n collection: collectionConfig,\n file,\n req,\n })\n\n if (!disableLocalStorage) {\n await fs.mkdir(staticPath!, { recursive: true })\n }\n\n let newData = incomingFileData as T\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const fileIsAnimatedType = ['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(\n resizeOptions || formatOptions || trimOptions || constructorOptions || file.tempFilePath,\n )\n\n const sharpOptions: SharpOptions = { ...constructorOptions }\n\n if (fileIsAnimatedType) {\n sharpOptions.animated = true\n }\n\n if (sharp && (fileIsAnimatedType || fileHasAdjustments)) {\n if (file.tempFilePath) {\n sharpFile = sharp(file.tempFilePath, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n } else {\n sharpFile = sharp(file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n }\n\n if (fileHasAdjustments) {\n if (resizeOptions) {\n sharpFile = sharpFile.resize(resizeOptions)\n }\n if (formatOptions) {\n sharpFile = sharpFile.toFormat(formatOptions.format, formatOptions.options)\n }\n if (trimOptions) {\n sharpFile = sharpFile.trim(trimOptions)\n }\n }\n }\n\n if (fileSupportsResize || isImage(file.mimetype)) {\n dimensions = await getImageSize(file)\n fileData.width = dimensions.width\n fileData.height = dimensions.height\n }\n\n if (sharpFile) {\n const metadata = await sharpFile.metadata()\n sharpFile = await optionallyAppendMetadata({\n req,\n sharpFile,\n withMetadata: withMetadata!,\n })\n fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true })\n ;({ ext, mime } = (await fileTypeFromBuffer(fileBuffer.data))!) // This is getting an incorrect gif height back.\n fileData.width = fileBuffer.info.width\n fileData.height = fileBuffer.info.height\n fileData.filesize = fileBuffer.info.size\n\n // Animated GIFs + WebP aggregate the height from every frame, so we need to use divide by number of pages\n if (metadata.pages) {\n fileData.height = fileBuffer.info.height / metadata.pages\n fileData.filesize = fileBuffer.data.length\n }\n } else {\n mime = file.mimetype\n fileData.filesize = file.size\n\n if (file.name.includes('.')) {\n ext = file.name.split('.').pop()?.split('?')[0]\n } else {\n ext = ''\n }\n }\n\n // Adjust SVG mime type. fromBuffer modifies it.\n if (mime === 'application/xml' && ext === 'svg') {\n mime = 'image/svg+xml'\n }\n fileData.mimeType = mime\n\n const baseFilename = sanitize(file.name.substring(0, file.name.lastIndexOf('.')) || file.name)\n fsSafeName = `${baseFilename}${ext ? `.${ext}` : ''}`\n\n if (!overwriteExistingFiles) {\n // Extract prefix if present (added by plugin-cloud-storage)\n const prefix = (data as Record<string, unknown>)?.prefix as string | undefined\n fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n prefix,\n req,\n staticPath: staticPath!,\n })\n }\n\n fileData.filename = fsSafeName\n\n let fileForResize = file\n\n if (cropData && sharp) {\n const { data: croppedImage, info } = await cropImage({\n cropData,\n dimensions: dimensions!,\n file,\n heightInPixels: uploadEdits.heightInPixels!,\n req,\n sharp,\n widthInPixels: uploadEdits.widthInPixels!,\n withMetadata,\n })\n\n // Apply resize after cropping to ensure it conforms to resizeOptions\n if (resizeOptions && !resizeOptions.withoutEnlargement) {\n const resizedAfterCrop = await sharp(croppedImage)\n .resize({\n fit: resizeOptions?.fit || 'cover',\n height: resizeOptions?.height,\n position: resizeOptions?.position || 'center',\n width: resizeOptions?.width,\n })\n .toBuffer({ resolveWithObject: true })\n\n filesToSave.push({\n buffer: resizedAfterCrop.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...fileForResize,\n data: resizedAfterCrop.data,\n size: resizedAfterCrop.info.size,\n }\n\n fileData.width = resizedAfterCrop.info.width\n fileData.height = resizedAfterCrop.info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile!.metadata()\n fileData.height = metadata.pages\n ? resizedAfterCrop.info.height / metadata.pages\n : resizedAfterCrop.info.height\n }\n fileData.filesize = resizedAfterCrop.info.size\n } else {\n // If resizeOptions is not present, just save the cropped image\n filesToSave.push({\n buffer: croppedImage,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...file,\n data: croppedImage,\n size: info.size,\n }\n\n fileData.width = info.width\n fileData.height = info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile!.metadata()\n fileData.height = metadata.pages ? info.height / metadata.pages : info.height\n }\n fileData.filesize = info.size\n }\n\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path\n } else {\n req.file = fileForResize\n }\n } else {\n // For non-image files with useTempFiles, read the buffer from the temp file\n // since file.data is empty when using temp files\n let bufferToSave: Buffer\n if (fileBuffer?.data) {\n bufferToSave = fileBuffer.data\n } else if (file.tempFilePath) {\n bufferToSave = await fs.readFile(file.tempFilePath)\n } else {\n bufferToSave = file.data\n }\n\n filesToSave.push({\n buffer: bufferToSave,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n // If using temp files and the image is being resized, write the file to the temp path\n if (fileBuffer?.data || bufferToSave.length > 0) {\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, fileBuffer?.data || bufferToSave) // write fileBuffer to the temp path\n } else {\n // Assign the _possibly modified_ file to the request object\n req.file = {\n ...file,\n data: fileBuffer?.data || bufferToSave,\n size: fileBuffer?.info.size,\n }\n }\n }\n }\n\n if (fileSupportsResize && (Array.isArray(imageSizes) || focalPointEnabled !== false)) {\n req.payloadUploadSizes = {}\n // Focal point adjustments\n const focalPoint =\n focalPointEnabled && uploadEdits?.focalPoint\n ? {\n x: isNumber(uploadEdits.focalPoint.x) ? Math.round(uploadEdits.focalPoint.x) : 50,\n y: isNumber(uploadEdits.focalPoint.y) ? Math.round(uploadEdits.focalPoint.y) : 50,\n }\n : undefined\n\n const { sizeData, sizesToSave } = await createImageSizes({\n config: collectionConfig,\n dimensions: !cropData\n ? dimensions!\n : {\n ...dimensions,\n height: fileData.height!,\n width: fileData.width!,\n },\n file: fileForResize,\n focalPoint,\n mimeType: fileData.mimeType,\n req,\n savedFilename: fsSafeName || file.name,\n sharp,\n staticPath: staticPath!,\n withMetadata,\n })\n\n fileData.sizes = sizeData\n fileData.focalX = focalPoint?.x\n fileData.focalY = focalPoint?.y\n filesToSave.push(...sizesToSave)\n }\n } catch (err) {\n req.payload.logger.error(err)\n throw new FileUploadError(req.t)\n }\n\n newData = {\n ...newData,\n ...fileData,\n ...(draft ? { _status: 'draft' } : {}),\n }\n\n return {\n data: newData,\n files: filesToSave,\n }\n}\n\n/**\n * Parse upload edits from req or incoming data\n */\nfunction parseUploadEditsFromReqOrIncomingData(args: {\n data: unknown\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc: unknown\n req: PayloadRequest\n}): UploadEdits {\n const { data, isDuplicating, operation, originalDoc, req } = args\n\n // Get intended focal point change from query string or incoming data\n const uploadEdits =\n req.query?.uploadEdits && typeof req.query.uploadEdits === 'object'\n ? (req.query.uploadEdits as UploadEdits)\n : {}\n\n if (uploadEdits.focalPoint) {\n return uploadEdits\n }\n\n const incomingData = data as FileData\n const origDoc = originalDoc as FileData\n\n if (origDoc && 'focalX' in origDoc && 'focalY' in origDoc) {\n // If no change in focal point, return undefined.\n // This prevents a refocal operation triggered from admin, because it always sends the focal point.\n if (incomingData.focalX === origDoc.focalX && incomingData.focalY === origDoc.focalY) {\n return undefined!\n }\n\n if (isDuplicating) {\n uploadEdits.focalPoint = {\n x: incomingData?.focalX || origDoc.focalX!,\n y: incomingData?.focalY || origDoc.focalY!,\n }\n return uploadEdits\n }\n }\n\n if (incomingData?.focalX && incomingData?.focalY) {\n uploadEdits.focalPoint = {\n x: incomingData.focalX,\n y: incomingData.focalY,\n }\n return uploadEdits\n }\n\n // If no focal point is set, default to center\n if (operation === 'create') {\n uploadEdits.focalPoint = {\n x: 50,\n y: 50,\n }\n }\n\n return uploadEdits\n}\n"],"names":["fileTypeFromBuffer","fs","sanitize","FileRetrievalError","FileUploadError","Forbidden","MissingFile","isNumber","canResizeImage","checkFileRestrictions","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","createImageSizes","isImage","optionallyAppendMetadata","shouldReupload","uploadEdits","fileData","crop","heightInPixels","widthInPixels","focalPoint","incomingFocalX","x","incomingFocalY","y","currentFocalX","focalX","currentFocalY","focalY","isEqual","generateFileData","collection","config","collectionConfig","data","draft","isDuplicating","operation","originalDoc","overwriteExistingFiles","req","throwOnMissingFile","upload","files","serverURL","sharp","payload","file","undefined","parseUploadEditsFromReqOrIncomingData","constructorOptions","disableLocalStorage","focalPointEnabled","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","withMetadata","staticPath","incomingFileData","isLocalFile","filename","url","includes","t","startsWith","filePath","response","uploadConfig","err","Error","message","mkdir","recursive","newData","filesToSave","fileIsAnimatedType","mimetype","cropData","fileSupportsResize","fsSafeName","sharpFile","dimensions","fileBuffer","ext","mime","fileHasAdjustments","Boolean","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","prefix","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","withoutEnlargement","resizedAfterCrop","fit","position","push","buffer","path","writeFile","bufferToSave","readFile","Array","isArray","payloadUploadSizes","Math","round","sizeData","sizesToSave","savedFilename","sizes","logger","error","_status","args","query","incomingData","origDoc"],"mappings":"AAEA,SAASA,kBAAkB,QAAQ,YAAW;AAC9C,OAAOC,QAAQ,cAAa;AAC5B,OAAOC,cAAc,oBAAmB;AAOxC,SAASC,kBAAkB,EAAEC,eAAe,EAAEC,SAAS,EAAEC,WAAW,QAAQ,qBAAoB;AAChG,SAASC,QAAQ,QAAQ,2BAA0B;AACnD,SAASC,cAAc,QAAQ,sBAAqB;AACpD,SAASC,qBAAqB,QAAQ,6BAA4B;AAClE,SAASC,SAAS,QAAQ,iBAAgB;AAC1C,SAASC,eAAe,QAAQ,uBAAsB;AACtD,SAASC,aAAa,QAAQ,qBAAoB;AAClD,SAASC,YAAY,QAAQ,oBAAmB;AAChD,SAASC,eAAe,QAAQ,uBAAsB;AACtD,SAASC,gBAAgB,QAAQ,uCAAsC;AACvE,SAASC,OAAO,QAAQ,eAAc;AACtC,SAASC,wBAAwB,QAAQ,gCAA+B;AAmBxE,MAAMC,iBAAiB,CACrBC,aACAC;IAEA,IAAI,CAACA,UAAU;QACb,OAAO;IACT;IAEA,IAAID,YAAYE,IAAI,IAAIF,YAAYG,cAAc,IAAIH,YAAYI,aAAa,EAAE;QAC/E,OAAO;IACT;IAEA,8FAA8F;IAC9F,IAAIJ,YAAYK,UAAU,EAAE;QAC1B,MAAMC,iBAAiBN,YAAYK,UAAU,CAACE,CAAC;QAC/C,MAAMC,iBAAiBR,YAAYK,UAAU,CAACI,CAAC;QAE/C,MAAMC,gBAAgB,YAAYT,YAAYA,SAASU,MAAM;QAC7D,MAAMC,gBAAgB,YAAYX,YAAYA,SAASY,MAAM;QAE7D,MAAMC,UAAUR,mBAAmBI,iBAAiBF,mBAAmBI;QACvE,OAAO,CAACE;IACV;IAEA,OAAO;AACT;AAEA,OAAO,MAAMC,mBAAmB,OAAU,EACxCC,YAAY,EAAEC,QAAQC,gBAAgB,EAAE,EACxCC,IAAI,EACJC,KAAK,EACLC,aAAa,EACbC,SAAS,EACTC,WAAW,EACXC,sBAAsB,EACtBC,GAAG,EACHC,kBAAkB,EACV;IACR,IAAI,CAACR,iBAAiBS,MAAM,EAAE;QAC5B,OAAO;YACLR;YACAS,OAAO,EAAE;QACX;IACF;IAEA,MAAM,EAAEC,SAAS,EAAEC,KAAK,EAAE,GAAGL,IAAIM,OAAO,CAACd,MAAM;IAE/C,IAAIe,OAAOX,gBAAgBY,YAAYR,IAAIO,IAAI;IAE/C,MAAMhC,cAAckC,sCAAsC;QACxDf;QACAE;QACAC;QACAC;QACAE;IACF;IAEA,MAAM,EACJU,kBAAkB,EAClBC,mBAAmB,EACnB/B,YAAYgC,oBAAoB,IAAI,EACpCC,aAAa,EACbC,UAAU,EACVC,aAAa,EACbC,SAAS,EACTC,WAAW,EACXC,YAAY,EACb,GAAGzB,iBAAiBS,MAAM;IAE3B,MAAMiB,aAAaH;IAEnB,MAAMI,mBAA6BxB,gBAAgBE,cAAcJ;IACjE,IAAI2B,cAAc;IAElB,IACE,CAACd,QACAX,CAAAA,iBAAiBtB,eAAeC,aAAa6C,iBAA2C,GACzF;QACA,MAAM,EAAEE,QAAQ,EAAEC,GAAG,EAAE,GAAGH;QAC1B,IAAIE,YAAaA,CAAAA,SAASE,QAAQ,CAAC,UAAUF,SAASE,QAAQ,CAAC,OAAM,GAAI;YACvE,MAAM,IAAI/D,UAAUuC,IAAIyB,CAAC;QAC3B;QAEA,IAAI,AAACrB,aAAamB,KAAKG,WAAWtB,cAAemB,KAAKG,WAAW,MAAM;YACrEL,cAAc;QAChB;QAEA,IAAI;YACF,IAAI,CAACV,uBAAuBU,aAAa;gBACvC,yBAAyB;gBACzB,MAAMM,WAAW,GAAGR,WAAW,CAAC,EAAEG,UAAU;gBAC5C,MAAMM,WAAW,MAAM5D,cAAc2D;gBACrCpB,OAAOqB;gBACP7B,yBAAyB;YAC3B,OAAO,IAAIuB,YAAYC,KAAK;gBAC1B,iBAAiB;gBACjBhB,OAAO,MAAMxC,gBAAgB;oBAC3B2B,MAAM0B;oBACNpB;oBACA6B,cAAcpC,iBAAiBS,MAAM;gBACvC;gBACAH,yBAAyB;YAC3B;QACF,EAAE,OAAO+B,KAAc;YACrB,MAAM,IAAIvE,mBAAmByC,IAAIyB,CAAC,EAAEK,eAAeC,QAAQD,IAAIE,OAAO,GAAGxB;QAC3E;IACF;IAEA,IAAIZ,eAAe;QACjBG,yBAAyB;IAC3B;IAEA,IAAI,CAACQ,MAAM;QACT,IAAIN,oBAAoB;YACtB,MAAM,IAAIvC,YAAYsC,IAAIyB,CAAC;QAC7B;QAEA,OAAO;YACL/B,MAAM0B;YACNjB,OAAO,EAAE;QACX;IACF;IAEA,MAAMtC,sBAAsB;QAC1B0B,YAAYE;QACZc;QACAP;IACF;IAEA,IAAI,CAACW,qBAAqB;QACxB,MAAMtD,GAAG4E,KAAK,CAACd,YAAa;YAAEe,WAAW;QAAK;IAChD;IAEA,IAAIC,UAAUf;IACd,MAAMgB,cAA4B,EAAE;IACpC,MAAM5D,WAA8B,CAAC;IACrC,MAAM6D,qBAAqB;QAAC;QAAc;QAAa;KAAa,CAACb,QAAQ,CAACjB,KAAK+B,QAAQ;IAC3F,MAAMC,WACJ,OAAOhE,gBAAgB,YAAY,UAAUA,cAAcA,YAAYE,IAAI,GAAG+B;IAEhF,IAAI;QACF,MAAMgC,qBAAqB5E,eAAe2C,KAAK+B,QAAQ;QACvD,IAAIG;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,MAAMC,qBACJP,sBACAQ,QACEjC,iBAAiBF,iBAAiBI,eAAeP,sBAAsBH,KAAK0C,YAAY;QAG5F,MAAMC,eAA6B;YAAE,GAAGxC,kBAAkB;QAAC;QAE3D,IAAI2B,oBAAoB;YACtBa,aAAaC,QAAQ,GAAG;QAC1B;QAEA,IAAI9C,SAAUgC,CAAAA,sBAAsBU,kBAAiB,GAAI;YACvD,IAAIxC,KAAK0C,YAAY,EAAE;gBACrBP,YAAYrC,MAAME,KAAK0C,YAAY,EAAEC,cAAcE,MAAM,IAAG,mGAAmG;YACjK,OAAO;gBACLV,YAAYrC,MAAME,KAAKb,IAAI,EAAEwD,cAAcE,MAAM,IAAG,mGAAmG;YACzJ;YAEA,IAAIL,oBAAoB;gBACtB,IAAIhC,eAAe;oBACjB2B,YAAYA,UAAUW,MAAM,CAACtC;gBAC/B;gBACA,IAAIF,eAAe;oBACjB6B,YAAYA,UAAUY,QAAQ,CAACzC,cAAc0C,MAAM,EAAE1C,cAAc2C,OAAO;gBAC5E;gBACA,IAAIvC,aAAa;oBACfyB,YAAYA,UAAUe,IAAI,CAACxC;gBAC7B;YACF;QACF;QAEA,IAAIuB,sBAAsBpE,QAAQmC,KAAK+B,QAAQ,GAAG;YAChDK,aAAa,MAAM1E,aAAasC;YAChC/B,SAASkF,KAAK,GAAGf,WAAWe,KAAK;YACjClF,SAASmF,MAAM,GAAGhB,WAAWgB,MAAM;QACrC;QAEA,IAAIjB,WAAW;YACb,MAAMkB,WAAW,MAAMlB,UAAUkB,QAAQ;YACzClB,YAAY,MAAMrE,yBAAyB;gBACzC2B;gBACA0C;gBACAxB,cAAcA;YAChB;YACA0B,aAAa,MAAMF,UAAUmB,QAAQ,CAAC;gBAAEC,mBAAmB;YAAK;YAC9D,CAAA,EAAEjB,GAAG,EAAEC,IAAI,EAAE,GAAI,MAAM1F,mBAAmBwF,WAAWlD,IAAI,EAAK,gDAAgD;YAAnD;YAC7DlB,SAASkF,KAAK,GAAGd,WAAWmB,IAAI,CAACL,KAAK;YACtClF,SAASmF,MAAM,GAAGf,WAAWmB,IAAI,CAACJ,MAAM;YACxCnF,SAASwF,QAAQ,GAAGpB,WAAWmB,IAAI,CAACE,IAAI;YAExC,0GAA0G;YAC1G,IAAIL,SAASM,KAAK,EAAE;gBAClB1F,SAASmF,MAAM,GAAGf,WAAWmB,IAAI,CAACJ,MAAM,GAAGC,SAASM,KAAK;gBACzD1F,SAASwF,QAAQ,GAAGpB,WAAWlD,IAAI,CAACyE,MAAM;YAC5C;QACF,OAAO;YACLrB,OAAOvC,KAAK+B,QAAQ;YACpB9D,SAASwF,QAAQ,GAAGzD,KAAK0D,IAAI;YAE7B,IAAI1D,KAAK6D,IAAI,CAAC5C,QAAQ,CAAC,MAAM;gBAC3BqB,MAAMtC,KAAK6D,IAAI,CAACC,KAAK,CAAC,KAAKC,GAAG,IAAID,MAAM,IAAI,CAAC,EAAE;YACjD,OAAO;gBACLxB,MAAM;YACR;QACF;QAEA,gDAAgD;QAChD,IAAIC,SAAS,qBAAqBD,QAAQ,OAAO;YAC/CC,OAAO;QACT;QACAtE,SAAS+F,QAAQ,GAAGzB;QAEpB,MAAM0B,eAAelH,SAASiD,KAAK6D,IAAI,CAACK,SAAS,CAAC,GAAGlE,KAAK6D,IAAI,CAACM,WAAW,CAAC,SAASnE,KAAK6D,IAAI;QAC7F3B,aAAa,GAAG+B,eAAe3B,MAAM,CAAC,CAAC,EAAEA,KAAK,GAAG,IAAI;QAErD,IAAI,CAAC9C,wBAAwB;YAC3B,4DAA4D;YAC5D,MAAM4E,SAAUjF,MAAkCiF;YAClDlC,aAAa,MAAMvE,gBAAgB;gBACjC0G,gBAAgBnF,iBAAiBoF,IAAI;gBACrCC,iBAAiBrC;gBACjBkC;gBACA3E;gBACAmB,YAAYA;YACd;QACF;QAEA3C,SAAS8C,QAAQ,GAAGmB;QAEpB,IAAIsC,gBAAgBxE;QAEpB,IAAIgC,YAAYlC,OAAO;YACrB,MAAM,EAAEX,MAAMsF,YAAY,EAAEjB,IAAI,EAAE,GAAG,MAAMjG,UAAU;gBACnDyE;gBACAI,YAAYA;gBACZpC;gBACA7B,gBAAgBH,YAAYG,cAAc;gBAC1CsB;gBACAK;gBACA1B,eAAeJ,YAAYI,aAAa;gBACxCuC;YACF;YAEA,qEAAqE;YACrE,IAAIH,iBAAiB,CAACA,cAAckE,kBAAkB,EAAE;gBACtD,MAAMC,mBAAmB,MAAM7E,MAAM2E,cAClC3B,MAAM,CAAC;oBACN8B,KAAKpE,eAAeoE,OAAO;oBAC3BxB,QAAQ5C,eAAe4C;oBACvByB,UAAUrE,eAAeqE,YAAY;oBACrC1B,OAAO3C,eAAe2C;gBACxB,GACCG,QAAQ,CAAC;oBAAEC,mBAAmB;gBAAK;gBAEtC1B,YAAYiD,IAAI,CAAC;oBACfC,QAAQJ,iBAAiBxF,IAAI;oBAC7B6F,MAAM,GAAGpE,WAAW,CAAC,EAAEsB,YAAY;gBACrC;gBAEAsC,gBAAgB;oBACd,GAAGA,aAAa;oBAChBrF,MAAMwF,iBAAiBxF,IAAI;oBAC3BuE,MAAMiB,iBAAiBnB,IAAI,CAACE,IAAI;gBAClC;gBAEAzF,SAASkF,KAAK,GAAGwB,iBAAiBnB,IAAI,CAACL,KAAK;gBAC5ClF,SAASmF,MAAM,GAAGuB,iBAAiBnB,IAAI,CAACJ,MAAM;gBAC9C,IAAItB,oBAAoB;oBACtB,MAAMuB,WAAW,MAAMlB,UAAWkB,QAAQ;oBAC1CpF,SAASmF,MAAM,GAAGC,SAASM,KAAK,GAC5BgB,iBAAiBnB,IAAI,CAACJ,MAAM,GAAGC,SAASM,KAAK,GAC7CgB,iBAAiBnB,IAAI,CAACJ,MAAM;gBAClC;gBACAnF,SAASwF,QAAQ,GAAGkB,iBAAiBnB,IAAI,CAACE,IAAI;YAChD,OAAO;gBACL,+DAA+D;gBAC/D7B,YAAYiD,IAAI,CAAC;oBACfC,QAAQN;oBACRO,MAAM,GAAGpE,WAAW,CAAC,EAAEsB,YAAY;gBACrC;gBAEAsC,gBAAgB;oBACd,GAAGxE,IAAI;oBACPb,MAAMsF;oBACNf,MAAMF,KAAKE,IAAI;gBACjB;gBAEAzF,SAASkF,KAAK,GAAGK,KAAKL,KAAK;gBAC3BlF,SAASmF,MAAM,GAAGI,KAAKJ,MAAM;gBAC7B,IAAItB,oBAAoB;oBACtB,MAAMuB,WAAW,MAAMlB,UAAWkB,QAAQ;oBAC1CpF,SAASmF,MAAM,GAAGC,SAASM,KAAK,GAAGH,KAAKJ,MAAM,GAAGC,SAASM,KAAK,GAAGH,KAAKJ,MAAM;gBAC/E;gBACAnF,SAASwF,QAAQ,GAAGD,KAAKE,IAAI;YAC/B;YAEA,IAAI1D,KAAK0C,YAAY,EAAE;gBACrB,MAAM5F,GAAGmI,SAAS,CAACjF,KAAK0C,YAAY,EAAE+B,eAAc,oCAAoC;YAC1F,OAAO;gBACLhF,IAAIO,IAAI,GAAGwE;YACb;QACF,OAAO;YACL,4EAA4E;YAC5E,iDAAiD;YACjD,IAAIU;YACJ,IAAI7C,YAAYlD,MAAM;gBACpB+F,eAAe7C,WAAWlD,IAAI;YAChC,OAAO,IAAIa,KAAK0C,YAAY,EAAE;gBAC5BwC,eAAe,MAAMpI,GAAGqI,QAAQ,CAACnF,KAAK0C,YAAY;YACpD,OAAO;gBACLwC,eAAelF,KAAKb,IAAI;YAC1B;YAEA0C,YAAYiD,IAAI,CAAC;gBACfC,QAAQG;gBACRF,MAAM,GAAGpE,WAAW,CAAC,EAAEsB,YAAY;YACrC;YAEA,sFAAsF;YACtF,IAAIG,YAAYlD,QAAQ+F,aAAatB,MAAM,GAAG,GAAG;gBAC/C,IAAI5D,KAAK0C,YAAY,EAAE;oBACrB,MAAM5F,GAAGmI,SAAS,CAACjF,KAAK0C,YAAY,EAAEL,YAAYlD,QAAQ+F,eAAc,oCAAoC;gBAC9G,OAAO;oBACL,4DAA4D;oBAC5DzF,IAAIO,IAAI,GAAG;wBACT,GAAGA,IAAI;wBACPb,MAAMkD,YAAYlD,QAAQ+F;wBAC1BxB,MAAMrB,YAAYmB,KAAKE;oBACzB;gBACF;YACF;QACF;QAEA,IAAIzB,sBAAuBmD,CAAAA,MAAMC,OAAO,CAAC9E,eAAeF,sBAAsB,KAAI,GAAI;YACpFZ,IAAI6F,kBAAkB,GAAG,CAAC;YAC1B,0BAA0B;YAC1B,MAAMjH,aACJgC,qBAAqBrC,aAAaK,aAC9B;gBACEE,GAAGnB,SAASY,YAAYK,UAAU,CAACE,CAAC,IAAIgH,KAAKC,KAAK,CAACxH,YAAYK,UAAU,CAACE,CAAC,IAAI;gBAC/EE,GAAGrB,SAASY,YAAYK,UAAU,CAACI,CAAC,IAAI8G,KAAKC,KAAK,CAACxH,YAAYK,UAAU,CAACI,CAAC,IAAI;YACjF,IACAwB;YAEN,MAAM,EAAEwF,QAAQ,EAAEC,WAAW,EAAE,GAAG,MAAM9H,iBAAiB;gBACvDqB,QAAQC;gBACRkD,YAAY,CAACJ,WACTI,aACA;oBACE,GAAGA,UAAU;oBACbgB,QAAQnF,SAASmF,MAAM;oBACvBD,OAAOlF,SAASkF,KAAK;gBACvB;gBACJnD,MAAMwE;gBACNnG;gBACA2F,UAAU/F,SAAS+F,QAAQ;gBAC3BvE;gBACAkG,eAAezD,cAAclC,KAAK6D,IAAI;gBACtC/D;gBACAc,YAAYA;gBACZD;YACF;YAEA1C,SAAS2H,KAAK,GAAGH;YACjBxH,SAASU,MAAM,GAAGN,YAAYE;YAC9BN,SAASY,MAAM,GAAGR,YAAYI;YAC9BoD,YAAYiD,IAAI,IAAIY;QACtB;IACF,EAAE,OAAOnE,KAAK;QACZ9B,IAAIM,OAAO,CAAC8F,MAAM,CAACC,KAAK,CAACvE;QACzB,MAAM,IAAItE,gBAAgBwC,IAAIyB,CAAC;IACjC;IAEAU,UAAU;QACR,GAAGA,OAAO;QACV,GAAG3D,QAAQ;QACX,GAAImB,QAAQ;YAAE2G,SAAS;QAAQ,IAAI,CAAC,CAAC;IACvC;IAEA,OAAO;QACL5G,MAAMyC;QACNhC,OAAOiC;IACT;AACF,EAAC;AAED;;CAEC,GACD,SAAS3B,sCAAsC8F,IAM9C;IACC,MAAM,EAAE7G,IAAI,EAAEE,aAAa,EAAEC,SAAS,EAAEC,WAAW,EAAEE,GAAG,EAAE,GAAGuG;IAE7D,qEAAqE;IACrE,MAAMhI,cACJyB,IAAIwG,KAAK,EAAEjI,eAAe,OAAOyB,IAAIwG,KAAK,CAACjI,WAAW,KAAK,WACtDyB,IAAIwG,KAAK,CAACjI,WAAW,GACtB,CAAC;IAEP,IAAIA,YAAYK,UAAU,EAAE;QAC1B,OAAOL;IACT;IAEA,MAAMkI,eAAe/G;IACrB,MAAMgH,UAAU5G;IAEhB,IAAI4G,WAAW,YAAYA,WAAW,YAAYA,SAAS;QACzD,iDAAiD;QACjD,mGAAmG;QACnG,IAAID,aAAavH,MAAM,KAAKwH,QAAQxH,MAAM,IAAIuH,aAAarH,MAAM,KAAKsH,QAAQtH,MAAM,EAAE;YACpF,OAAOoB;QACT;QAEA,IAAIZ,eAAe;YACjBrB,YAAYK,UAAU,GAAG;gBACvBE,GAAG2H,cAAcvH,UAAUwH,QAAQxH,MAAM;gBACzCF,GAAGyH,cAAcrH,UAAUsH,QAAQtH,MAAM;YAC3C;YACA,OAAOb;QACT;IACF;IAEA,IAAIkI,cAAcvH,UAAUuH,cAAcrH,QAAQ;QAChDb,YAAYK,UAAU,GAAG;YACvBE,GAAG2H,aAAavH,MAAM;YACtBF,GAAGyH,aAAarH,MAAM;QACxB;QACA,OAAOb;IACT;IAEA,8CAA8C;IAC9C,IAAIsB,cAAc,UAAU;QAC1BtB,YAAYK,UAAU,GAAG;YACvBE,GAAG;YACHE,GAAG;QACL;IACF;IAEA,OAAOT;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"getBaseFields.d.ts","sourceRoot":"","sources":["../../src/uploads/getBaseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AA2BtD,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,gBAAgB,CAAA;IAC5B,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,eAAO,MAAM,mBAAmB,2BAA4B,OAAO,KAAG,KAAK,EA4Q1E,CAAA"}
1
+ {"version":3,"file":"getBaseFields.d.ts","sourceRoot":"","sources":["../../src/uploads/getBaseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AAkBtD,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,gBAAgB,CAAA;IAC5B,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,eAAO,MAAM,mBAAmB,2BAA4B,OAAO,KAAG,KAAK,EAyQ1E,CAAA"}
@@ -1,22 +1,13 @@
1
1
  import { generateFilePathOrURL } from './generateFilePathOrURL.js';
2
2
  import { mimeTypeValidator } from './mimeTypeValidator.js';
3
3
  const disabledFromImageSize = (sizeAdmin)=>{
4
- if (!sizeAdmin) {
5
- return {};
6
- }
7
- const disabled = {};
8
- if (sizeAdmin.disableGroupBy) {
9
- disabled.groupBy = true;
10
- }
11
- if (sizeAdmin.disableListColumn) {
12
- disabled.column = true;
13
- }
14
- if (sizeAdmin.disableListFilter) {
15
- disabled.filter = true;
16
- }
17
- return Object.keys(disabled).length ? {
18
- disabled
19
- } : {};
4
+ return {
5
+ disabled: {
6
+ column: sizeAdmin?.disabled?.column ?? false,
7
+ filter: sizeAdmin?.disabled?.filter ?? false,
8
+ groupBy: sizeAdmin?.disabled?.groupBy ?? false
9
+ }
10
+ };
20
11
  };
21
12
  export const getBaseUploadFields = ({ collection, config })=>{
22
13
  const uploadOptions = typeof collection.upload === 'object' ? collection.upload : {};
@@ -167,9 +158,6 @@ export const getBaseUploadFields = ({ collection, config })=>{
167
158
  if (uploadOptions.mimeTypes) {
168
159
  mimeType.validate = mimeTypeValidator(uploadOptions.mimeTypes);
169
160
  }
170
- // In Payload v4, image size subfields (`url`, `width`, `height`, etc.) should
171
- // default to `disabled: { groupBy, column, filter }` to avoid cluttering the
172
- // collection list view and filters by default.
173
161
  if (uploadOptions.imageSizes) {
174
162
  uploadFields = uploadFields.concat([
175
163
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/getBaseFields.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { Config } from '../config/types.js'\nimport type { Field } from '../fields/config/types.js'\nimport type { UploadConfig } from './types.js'\n\nimport { generateFilePathOrURL } from './generateFilePathOrURL.js'\nimport { mimeTypeValidator } from './mimeTypeValidator.js'\n\nconst disabledFromImageSize = (\n sizeAdmin:\n | { disableGroupBy?: boolean; disableListColumn?: boolean; disableListFilter?: boolean }\n | undefined,\n): { disabled?: { column?: boolean; filter?: boolean; groupBy?: boolean } } => {\n if (!sizeAdmin) {\n return {}\n }\n const disabled: { column?: boolean; filter?: boolean; groupBy?: boolean } = {}\n if (sizeAdmin.disableGroupBy) {\n disabled.groupBy = true\n }\n if (sizeAdmin.disableListColumn) {\n disabled.column = true\n }\n if (sizeAdmin.disableListFilter) {\n disabled.filter = true\n }\n return Object.keys(disabled).length ? { disabled } : {}\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, req }) => {\n const adminThumbnail =\n typeof collection.upload !== 'boolean' ? collection.upload?.adminThumbnail : undefined\n\n if (typeof adminThumbnail === 'function') {\n return adminThumbnail({ doc: originalDoc })\n }\n\n return generateFilePathOrURL({\n collectionSlug: collection.slug,\n config,\n filename:\n typeof adminThumbnail === 'string'\n ? (originalDoc.sizes?.[adminThumbnail]?.filename as string)\n : undefined,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath:\n typeof adminThumbnail === 'string'\n ? (originalDoc.sizes?.[adminThumbnail]?.url as string)\n : undefined,\n })\n },\n ],\n },\n label: 'Thumbnail URL',\n }\n\n const width: Field = {\n name: 'width',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:width'),\n }\n\n const height: Field = {\n name: 'height',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:height'),\n }\n\n const filesize: Field = {\n name: 'filesize',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:fileSize'),\n }\n\n const filename: Field = {\n name: 'filename',\n type: 'text',\n admin: {\n disabled: { bulkEdit: true },\n hidden: true,\n readOnly: true,\n },\n index: true,\n label: ({ t }) => t('upload:fileName'),\n }\n\n // Only set unique: true if the collection does not have a compound index\n if (\n collection.upload === true ||\n (typeof collection.upload === 'object' && !collection.upload.filenameCompoundIndex)\n ) {\n filename.unique = true\n }\n\n const url: Field = {\n name: 'url',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: 'URL',\n }\n\n let uploadFields: Field[] = [\n {\n ...url,\n hooks: {\n afterRead: [\n ({ data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection.slug,\n config,\n filename: data?.filename || originalDoc?.filename,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n beforeChange: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename: data?.filename || originalDoc?.filename,\n relative: true,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n },\n },\n thumbnailURL,\n filename,\n mimeType,\n filesize,\n width,\n height,\n ]\n\n // Add focal point fields if not disabled\n if (\n uploadOptions.focalPoint !== false ||\n uploadOptions.imageSizes ||\n uploadOptions.resizeOptions\n ) {\n uploadFields = uploadFields.concat(\n ['focalX', 'focalY'].map((name) => {\n return {\n name,\n type: 'number',\n admin: {\n disabled: { column: true, filter: true, groupBy: true },\n hidden: true,\n },\n }\n }),\n )\n }\n\n if (uploadOptions.mimeTypes) {\n mimeType.validate = mimeTypeValidator(uploadOptions.mimeTypes)\n }\n\n // In Payload v4, image size subfields (`url`, `width`, `height`, etc.) should\n // default to `disabled: { groupBy, column, filter }` to avoid cluttering the\n // collection list view and filters by default.\n if (uploadOptions.imageSizes) {\n uploadFields = uploadFields.concat([\n {\n name: 'sizes',\n type: 'group',\n admin: {\n hidden: true,\n },\n fields: uploadOptions.imageSizes.map((size) => ({\n name: size.name,\n type: 'group',\n admin: {\n hidden: true,\n ...disabledFromImageSize(size.admin),\n },\n fields: [\n {\n ...url,\n admin: {\n ...url.admin,\n ...disabledFromImageSize(size.admin),\n },\n hooks: {\n afterRead: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename:\n data?.sizes?.[size.name]?.filename ||\n originalDoc?.sizes?.[size.name]?.filename,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n beforeChange: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename:\n data?.sizes?.[size.name]?.filename ||\n originalDoc?.sizes?.[size.name]?.filename,\n relative: true,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n },\n },\n {\n ...width,\n admin: {\n ...width.admin,\n ...disabledFromImageSize(size.admin),\n },\n },\n {\n ...height,\n admin: {\n ...height.admin,\n ...disabledFromImageSize(size.admin),\n },\n },\n {\n ...mimeType,\n admin: {\n ...mimeType.admin,\n ...disabledFromImageSize(size.admin),\n },\n },\n {\n ...filesize,\n admin: {\n ...filesize.admin,\n ...disabledFromImageSize(size.admin),\n },\n },\n {\n ...filename,\n admin: {\n ...filename.admin,\n ...disabledFromImageSize(size.admin),\n },\n unique: false,\n },\n ],\n label: size.name,\n })),\n label: ({ t }) => t('upload:sizes'),\n },\n ])\n }\n return uploadFields\n}\n"],"names":["generateFilePathOrURL","mimeTypeValidator","disabledFromImageSize","sizeAdmin","disabled","disableGroupBy","groupBy","disableListColumn","column","disableListFilter","filter","Object","keys","length","getBaseUploadFields","collection","config","uploadOptions","upload","mimeType","name","type","admin","hidden","readOnly","label","thumbnailURL","hooks","afterRead","originalDoc","req","adminThumbnail","undefined","doc","collectionSlug","slug","filename","sizes","relative","serverURL","payload","urlOrPath","url","width","t","height","filesize","bulkEdit","index","filenameCompoundIndex","unique","uploadFields","data","value","beforeChange","focalPoint","imageSizes","resizeOptions","concat","map","mimeTypes","validate","fields","size"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/uploads/getBaseFields.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { Config } from '../config/types.js'\nimport type { Field } from '../fields/config/types.js'\nimport type { UploadConfig } from './types.js'\n\nimport { generateFilePathOrURL } from './generateFilePathOrURL.js'\nimport { mimeTypeValidator } from './mimeTypeValidator.js'\n\nconst disabledFromImageSize = (\n sizeAdmin: { disabled?: { column?: boolean; filter?: boolean; groupBy?: boolean } } | undefined,\n): { disabled: { column: boolean; filter: boolean; groupBy: boolean } } => {\n return {\n disabled: {\n column: sizeAdmin?.disabled?.column ?? false,\n filter: sizeAdmin?.disabled?.filter ?? false,\n groupBy: sizeAdmin?.disabled?.groupBy ?? false,\n },\n }\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, req }) => {\n const adminThumbnail =\n typeof collection.upload !== 'boolean' ? collection.upload?.adminThumbnail : undefined\n\n if (typeof adminThumbnail === 'function') {\n return adminThumbnail({ doc: originalDoc })\n }\n\n return generateFilePathOrURL({\n collectionSlug: collection.slug,\n config,\n filename:\n typeof adminThumbnail === 'string'\n ? (originalDoc.sizes?.[adminThumbnail]?.filename as string)\n : undefined,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath:\n typeof adminThumbnail === 'string'\n ? (originalDoc.sizes?.[adminThumbnail]?.url as string)\n : undefined,\n })\n },\n ],\n },\n label: 'Thumbnail URL',\n }\n\n const width: Field = {\n name: 'width',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:width'),\n }\n\n const height: Field = {\n name: 'height',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:height'),\n }\n\n const filesize: Field = {\n name: 'filesize',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:fileSize'),\n }\n\n const filename: Field = {\n name: 'filename',\n type: 'text',\n admin: {\n disabled: { bulkEdit: true },\n hidden: true,\n readOnly: true,\n },\n index: true,\n label: ({ t }) => t('upload:fileName'),\n }\n\n // Only set unique: true if the collection does not have a compound index\n if (\n collection.upload === true ||\n (typeof collection.upload === 'object' && !collection.upload.filenameCompoundIndex)\n ) {\n filename.unique = true\n }\n\n const url: Field = {\n name: 'url',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: 'URL',\n }\n\n let uploadFields: Field[] = [\n {\n ...url,\n hooks: {\n afterRead: [\n ({ data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection.slug,\n config,\n filename: data?.filename || originalDoc?.filename,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n beforeChange: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename: data?.filename || originalDoc?.filename,\n relative: true,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n },\n },\n thumbnailURL,\n filename,\n mimeType,\n filesize,\n width,\n height,\n ]\n\n // Add focal point fields if not disabled\n if (\n uploadOptions.focalPoint !== false ||\n uploadOptions.imageSizes ||\n uploadOptions.resizeOptions\n ) {\n uploadFields = uploadFields.concat(\n ['focalX', 'focalY'].map((name) => {\n return {\n name,\n type: 'number',\n admin: {\n disabled: { column: true, filter: true, groupBy: true },\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 ...disabledFromImageSize(size.admin),\n },\n fields: [\n {\n ...url,\n admin: {\n ...url.admin,\n ...disabledFromImageSize(size.admin),\n },\n hooks: {\n afterRead: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename:\n data?.sizes?.[size.name]?.filename ||\n originalDoc?.sizes?.[size.name]?.filename,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n beforeChange: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename:\n data?.sizes?.[size.name]?.filename ||\n originalDoc?.sizes?.[size.name]?.filename,\n relative: true,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n },\n },\n {\n ...width,\n admin: {\n ...width.admin,\n ...disabledFromImageSize(size.admin),\n },\n },\n {\n ...height,\n admin: {\n ...height.admin,\n ...disabledFromImageSize(size.admin),\n },\n },\n {\n ...mimeType,\n admin: {\n ...mimeType.admin,\n ...disabledFromImageSize(size.admin),\n },\n },\n {\n ...filesize,\n admin: {\n ...filesize.admin,\n ...disabledFromImageSize(size.admin),\n },\n },\n {\n ...filename,\n admin: {\n ...filename.admin,\n ...disabledFromImageSize(size.admin),\n },\n unique: false,\n },\n ],\n label: size.name,\n })),\n label: ({ t }) => t('upload:sizes'),\n },\n ])\n }\n return uploadFields\n}\n"],"names":["generateFilePathOrURL","mimeTypeValidator","disabledFromImageSize","sizeAdmin","disabled","column","filter","groupBy","getBaseUploadFields","collection","config","uploadOptions","upload","mimeType","name","type","admin","hidden","readOnly","label","thumbnailURL","hooks","afterRead","originalDoc","req","adminThumbnail","undefined","doc","collectionSlug","slug","filename","sizes","relative","serverURL","payload","urlOrPath","url","width","t","height","filesize","bulkEdit","index","filenameCompoundIndex","unique","uploadFields","data","value","beforeChange","focalPoint","imageSizes","resizeOptions","concat","map","mimeTypes","validate","fields","size"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import type { PayloadRequest } from '../types/index.js';
2
- export declare const getFileByPath: (filePath: string) => Promise<PayloadRequest["file"]>;
2
+ export declare const getFileByPath: (filePath: string) => Promise<PayloadRequest['file']>;
3
3
  //# sourceMappingURL=getFileByPath.d.ts.map
@@ -20,5 +20,5 @@ export declare const getImageResizeAction: ({ dimensions: originalImage, hasFoca
20
20
  dimensions: ProbedImageSize;
21
21
  hasFocalPoint?: boolean;
22
22
  imageResizeConfig: ImageSize;
23
- }) => "omit" | "resize" | "resizeWithFocalPoint";
23
+ }) => 'omit' | 'resize' | 'resizeWithFocalPoint';
24
24
  //# sourceMappingURL=getImageResizeAction.d.ts.map
@@ -0,0 +1,8 @@
1
+ import type { PayloadComponent } from '../config/types.js';
2
+ /**
3
+ * Resolves a PayloadComponent from a MIME-type keyed map.
4
+ *
5
+ * Priority: exact match → category wildcard (e.g. `video/*`) → universal fallback (`*`).
6
+ */
7
+ export declare function matchMimeType(map: Record<string, PayloadComponent>, mimeType: string): PayloadComponent | undefined;
8
+ //# sourceMappingURL=matchMimeType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchMimeType.d.ts","sourceRoot":"","sources":["../../src/uploads/matchMimeType.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAE1D;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACrC,QAAQ,EAAE,MAAM,GACf,gBAAgB,GAAG,SAAS,CAY9B"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Resolves a PayloadComponent from a MIME-type keyed map.
3
+ *
4
+ * Priority: exact match → category wildcard (e.g. `video/*`) → universal fallback (`*`).
5
+ */ export function matchMimeType(map, mimeType) {
6
+ if (mimeType in map) {
7
+ return map[mimeType];
8
+ }
9
+ const category = mimeType.split('/')[0];
10
+ if (`${category}/*` in map) {
11
+ return map[`${category}/*`];
12
+ }
13
+ if ('*' in map) {
14
+ return map['*'];
15
+ }
16
+ return undefined;
17
+ }
18
+
19
+ //# sourceMappingURL=matchMimeType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/uploads/matchMimeType.ts"],"sourcesContent":["import type { PayloadComponent } from '../config/types.js'\n\n/**\n * Resolves a PayloadComponent from a MIME-type keyed map.\n *\n * Priority: exact match → category wildcard (e.g. `video/*`) → universal fallback (`*`).\n */\nexport function matchMimeType(\n map: Record<string, PayloadComponent>,\n mimeType: string,\n): PayloadComponent | undefined {\n if (mimeType in map) {\n return map[mimeType]\n }\n const category = mimeType.split('/')[0]\n if (`${category}/*` in map) {\n return map[`${category}/*`]\n }\n if ('*' in map) {\n return map['*']\n }\n return undefined\n}\n"],"names":["matchMimeType","map","mimeType","category","split","undefined"],"mappings":"AAEA;;;;CAIC,GACD,OAAO,SAASA,cACdC,GAAqC,EACrCC,QAAgB;IAEhB,IAAIA,YAAYD,KAAK;QACnB,OAAOA,GAAG,CAACC,SAAS;IACtB;IACA,MAAMC,WAAWD,SAASE,KAAK,CAAC,IAAI,CAAC,EAAE;IACvC,IAAI,GAAGD,SAAS,EAAE,CAAC,IAAIF,KAAK;QAC1B,OAAOA,GAAG,CAAC,GAAGE,SAAS,EAAE,CAAC,CAAC;IAC7B;IACA,IAAI,OAAOF,KAAK;QACd,OAAOA,GAAG,CAAC,IAAI;IACjB;IACA,OAAOI;AACT"}
@@ -0,0 +1,66 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { matchMimeType } from './matchMimeType.js';
3
+ describe('matchMimeType', ()=>{
4
+ it('should return the exact match when present', ()=>{
5
+ const map = {
6
+ 'image/png': 'PngComponent',
7
+ '*': 'FallbackComponent'
8
+ };
9
+ expect(matchMimeType(map, 'image/png')).toBe('PngComponent');
10
+ });
11
+ it('should fall back to the category wildcard when no exact match exists', ()=>{
12
+ const map = {
13
+ 'image/*': 'ImageComponent',
14
+ '*': 'FallbackComponent'
15
+ };
16
+ expect(matchMimeType(map, 'image/png')).toBe('ImageComponent');
17
+ });
18
+ it('should fall back to the universal wildcard when no exact or category match exists', ()=>{
19
+ const map = {
20
+ 'video/*': 'VideoComponent',
21
+ '*': 'FallbackComponent'
22
+ };
23
+ expect(matchMimeType(map, 'image/png')).toBe('FallbackComponent');
24
+ });
25
+ it('should return undefined when no entry matches', ()=>{
26
+ const map = {
27
+ 'video/*': 'VideoComponent'
28
+ };
29
+ expect(matchMimeType(map, 'image/png')).toBeUndefined();
30
+ });
31
+ it('should honor an explicit `false` exact match and not fall through to the wildcard', ()=>{
32
+ const map = {
33
+ 'image/png': false,
34
+ '*': 'FallbackComponent'
35
+ };
36
+ expect(matchMimeType(map, 'image/png')).toBe(false);
37
+ });
38
+ it('should honor an explicit `false` category wildcard and not fall through to the universal wildcard', ()=>{
39
+ const map = {
40
+ 'image/*': false,
41
+ '*': 'FallbackComponent'
42
+ };
43
+ expect(matchMimeType(map, 'image/png')).toBe(false);
44
+ });
45
+ it('should handle an empty-string mime type by falling back to the universal wildcard', ()=>{
46
+ const map = {
47
+ '*': 'FallbackComponent'
48
+ };
49
+ expect(matchMimeType(map, '')).toBe('FallbackComponent');
50
+ });
51
+ it('should handle a mime type without a slash', ()=>{
52
+ const map = {
53
+ 'image/*': 'ImageComponent',
54
+ '*': 'FallbackComponent'
55
+ };
56
+ expect(matchMimeType(map, 'notamimetype')).toBe('FallbackComponent');
57
+ });
58
+ it('should match case-sensitively', ()=>{
59
+ const map = {
60
+ 'image/png': 'PngComponent'
61
+ };
62
+ expect(matchMimeType(map, 'IMAGE/PNG')).toBeUndefined();
63
+ });
64
+ });
65
+
66
+ //# sourceMappingURL=matchMimeType.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/uploads/matchMimeType.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { matchMimeType } from './matchMimeType.js'\n\ndescribe('matchMimeType', () => {\n it('should return the exact match when present', () => {\n const map = { 'image/png': 'PngComponent', '*': 'FallbackComponent' }\n expect(matchMimeType(map, 'image/png')).toBe('PngComponent')\n })\n\n it('should fall back to the category wildcard when no exact match exists', () => {\n const map = { 'image/*': 'ImageComponent', '*': 'FallbackComponent' }\n expect(matchMimeType(map, 'image/png')).toBe('ImageComponent')\n })\n\n it('should fall back to the universal wildcard when no exact or category match exists', () => {\n const map = { 'video/*': 'VideoComponent', '*': 'FallbackComponent' }\n expect(matchMimeType(map, 'image/png')).toBe('FallbackComponent')\n })\n\n it('should return undefined when no entry matches', () => {\n const map = { 'video/*': 'VideoComponent' }\n expect(matchMimeType(map, 'image/png')).toBeUndefined()\n })\n\n it('should honor an explicit `false` exact match and not fall through to the wildcard', () => {\n const map = { 'image/png': false as const, '*': 'FallbackComponent' }\n expect(matchMimeType(map, 'image/png')).toBe(false)\n })\n\n it('should honor an explicit `false` category wildcard and not fall through to the universal wildcard', () => {\n const map = { 'image/*': false as const, '*': 'FallbackComponent' }\n expect(matchMimeType(map, 'image/png')).toBe(false)\n })\n\n it('should handle an empty-string mime type by falling back to the universal wildcard', () => {\n const map = { '*': 'FallbackComponent' }\n expect(matchMimeType(map, '')).toBe('FallbackComponent')\n })\n\n it('should handle a mime type without a slash', () => {\n const map = { 'image/*': 'ImageComponent', '*': 'FallbackComponent' }\n expect(matchMimeType(map, 'notamimetype')).toBe('FallbackComponent')\n })\n\n it('should match case-sensitively', () => {\n const map = { 'image/png': 'PngComponent' }\n expect(matchMimeType(map, 'IMAGE/PNG')).toBeUndefined()\n })\n})\n"],"names":["describe","expect","it","matchMimeType","map","toBe","toBeUndefined"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAE7C,SAASC,aAAa,QAAQ,qBAAoB;AAElDH,SAAS,iBAAiB;IACxBE,GAAG,8CAA8C;QAC/C,MAAME,MAAM;YAAE,aAAa;YAAgB,KAAK;QAAoB;QACpEH,OAAOE,cAAcC,KAAK,cAAcC,IAAI,CAAC;IAC/C;IAEAH,GAAG,wEAAwE;QACzE,MAAME,MAAM;YAAE,WAAW;YAAkB,KAAK;QAAoB;QACpEH,OAAOE,cAAcC,KAAK,cAAcC,IAAI,CAAC;IAC/C;IAEAH,GAAG,qFAAqF;QACtF,MAAME,MAAM;YAAE,WAAW;YAAkB,KAAK;QAAoB;QACpEH,OAAOE,cAAcC,KAAK,cAAcC,IAAI,CAAC;IAC/C;IAEAH,GAAG,iDAAiD;QAClD,MAAME,MAAM;YAAE,WAAW;QAAiB;QAC1CH,OAAOE,cAAcC,KAAK,cAAcE,aAAa;IACvD;IAEAJ,GAAG,qFAAqF;QACtF,MAAME,MAAM;YAAE,aAAa;YAAgB,KAAK;QAAoB;QACpEH,OAAOE,cAAcC,KAAK,cAAcC,IAAI,CAAC;IAC/C;IAEAH,GAAG,qGAAqG;QACtG,MAAME,MAAM;YAAE,WAAW;YAAgB,KAAK;QAAoB;QAClEH,OAAOE,cAAcC,KAAK,cAAcC,IAAI,CAAC;IAC/C;IAEAH,GAAG,qFAAqF;QACtF,MAAME,MAAM;YAAE,KAAK;QAAoB;QACvCH,OAAOE,cAAcC,KAAK,KAAKC,IAAI,CAAC;IACtC;IAEAH,GAAG,6CAA6C;QAC9C,MAAME,MAAM;YAAE,WAAW;YAAkB,KAAK;QAAoB;QACpEH,OAAOE,cAAcC,KAAK,iBAAiBC,IAAI,CAAC;IAClD;IAEAH,GAAG,iCAAiC;QAClC,MAAME,MAAM;YAAE,aAAa;QAAe;QAC1CH,OAAOE,cAAcC,KAAK,cAAcE,aAAa;IACvD;AACF"}
@@ -13,5 +13,5 @@ export declare const _internal_safeFetchGlobal: {
13
13
  * - Validates domain names by resolving them to IP addresses and checking if they're safe.
14
14
  * - Undici was used because it supported interceptors as well as "credentials: include". Native fetch
15
15
  */
16
- export declare const safeFetch: (input: import("undici").RequestInfo, init?: import("undici").RequestInit | undefined) => Promise<Response>;
16
+ export declare const safeFetch: (...args: Parameters<typeof undiciFetch>) => Promise<Response>;
17
17
  //# sourceMappingURL=safeFetch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"safeFetch.d.ts","sourceRoot":"","sources":["../../src/uploads/safeFetch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AAE5B,OAAO,EAAS,KAAK,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,yBAAyB;;CAErC,CAAA;AAgDD;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,4FAAoD,OAAO,CAAC,QAAQ,CA4CzF,CAAA"}
1
+ {"version":3,"file":"safeFetch.d.ts","sourceRoot":"","sources":["../../src/uploads/safeFetch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AAE5B,OAAO,EAAS,KAAK,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,yBAAyB;;CAErC,CAAA;AAsDD;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,YAAmB,UAAU,CAAC,OAAO,WAAW,CAAC,KAAG,OAAO,CAAC,QAAQ,CA4CzF,CAAA"}
@@ -46,11 +46,17 @@ const ssrfFilterInterceptor = (hostname, options, callback)=>{
46
46
  }
47
47
  });
48
48
  };
49
- const safeDispatcher = new Agent({
50
- connect: {
51
- lookup: ssrfFilterInterceptor
49
+ let safeDispatcher;
50
+ const getSafeDispatcher = ()=>{
51
+ if (!safeDispatcher) {
52
+ safeDispatcher = new Agent({
53
+ connect: {
54
+ lookup: ssrfFilterInterceptor
55
+ }
56
+ });
52
57
  }
53
- });
58
+ return safeDispatcher;
59
+ };
54
60
  /**
55
61
  * A "safe" version of undici's fetch that prevents SSRF attacks.
56
62
  *
@@ -73,7 +79,7 @@ const safeDispatcher = new Agent({
73
79
  }
74
80
  return await undiciFetch(url, {
75
81
  ...options,
76
- dispatcher: safeDispatcher,
82
+ dispatcher: getSafeDispatcher(),
77
83
  redirect: 'manual'
78
84
  });
79
85
  } catch (error) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/safeFetch.ts"],"sourcesContent":["import type { LookupFunction } from 'net'\n\nimport { lookup } from 'dns'\nimport ipaddr from 'ipaddr.js'\nimport { Agent, fetch as undiciFetch } from 'undici'\n\n/**\n * @internal this is used to mock the IP `lookup` function in integration tests\n */\nexport const _internal_safeFetchGlobal = {\n lookup,\n}\n\nconst isSafeIp = (ip: string) => {\n try {\n if (!ip) {\n return false\n }\n\n if (!ipaddr.isValid(ip)) {\n return false\n }\n\n const parsedIpAddress = ipaddr.parse(ip)\n const range = parsedIpAddress.range()\n if (range !== 'unicast') {\n return false // Private IP Range\n }\n } catch (ignore) {\n return false\n }\n return true\n}\n\nconst ssrfFilterInterceptor: LookupFunction = (hostname, options, callback) => {\n _internal_safeFetchGlobal.lookup(hostname, options, (err, address, family) => {\n if (err) {\n callback(err, address, family)\n } else {\n let ips = [] as string[]\n if (Array.isArray(address)) {\n ips = address.map((a) => a.address)\n } else {\n ips = [address]\n }\n\n if (ips.some((ip) => !isSafeIp(ip))) {\n callback(new Error(`Blocked unsafe attempt to ${hostname}`), address, family)\n return\n }\n\n callback(null, address, family)\n }\n })\n}\n\nconst safeDispatcher = new Agent({\n connect: { lookup: ssrfFilterInterceptor },\n})\n/**\n * A \"safe\" version of undici's fetch that prevents SSRF attacks.\n *\n * - Utilizes a custom dispatcher that filters out requests to unsafe IP addresses.\n * - Validates domain names by resolving them to IP addresses and checking if they're safe.\n * - Undici was used because it supported interceptors as well as \"credentials: include\". Native fetch\n */\nexport const safeFetch = async (...args: Parameters<typeof undiciFetch>): Promise<Response> => {\n const [unverifiedUrl, options] = args\n\n try {\n const url = new URL(unverifiedUrl)\n\n let hostname = url.hostname\n\n // Strip brackets from IPv6 addresses (e.g., \"[::1]\" => \"::1\")\n if (hostname.startsWith('[') && hostname.endsWith(']')) {\n hostname = hostname.slice(1, -1)\n }\n\n if (ipaddr.isValid(hostname)) {\n if (!isSafeIp(hostname)) {\n throw new Error(`Blocked unsafe attempt to ${hostname}`)\n }\n }\n return (await undiciFetch(url, {\n ...options,\n dispatcher: safeDispatcher,\n redirect: 'manual', // Prevent automatic redirects\n })) as unknown as Response\n } catch (error) {\n if (error instanceof Error) {\n if (error.cause instanceof Error && error.cause.message.includes('unsafe')) {\n // Errors thrown from within interceptors always have 'fetch error' as the message\n // The desired message we want to bubble up is in the cause\n throw new Error(error.cause.message)\n } else {\n let stringifiedUrl: string | undefined = undefined\n if (typeof unverifiedUrl === 'string') {\n stringifiedUrl = unverifiedUrl\n } else if (unverifiedUrl instanceof URL) {\n stringifiedUrl = unverifiedUrl.toString()\n } else if (unverifiedUrl instanceof Request) {\n stringifiedUrl = unverifiedUrl.url\n }\n\n throw new Error(`Failed to fetch from ${stringifiedUrl}, ${error.message}`)\n }\n }\n throw error\n }\n}\n"],"names":["lookup","ipaddr","Agent","fetch","undiciFetch","_internal_safeFetchGlobal","isSafeIp","ip","isValid","parsedIpAddress","parse","range","ignore","ssrfFilterInterceptor","hostname","options","callback","err","address","family","ips","Array","isArray","map","a","some","Error","safeDispatcher","connect","safeFetch","args","unverifiedUrl","url","URL","startsWith","endsWith","slice","dispatcher","redirect","error","cause","message","includes","stringifiedUrl","undefined","toString","Request"],"mappings":"AAEA,SAASA,MAAM,QAAQ,MAAK;AAC5B,OAAOC,YAAY,YAAW;AAC9B,SAASC,KAAK,EAAEC,SAASC,WAAW,QAAQ,SAAQ;AAEpD;;CAEC,GACD,OAAO,MAAMC,4BAA4B;IACvCL;AACF,EAAC;AAED,MAAMM,WAAW,CAACC;IAChB,IAAI;QACF,IAAI,CAACA,IAAI;YACP,OAAO;QACT;QAEA,IAAI,CAACN,OAAOO,OAAO,CAACD,KAAK;YACvB,OAAO;QACT;QAEA,MAAME,kBAAkBR,OAAOS,KAAK,CAACH;QACrC,MAAMI,QAAQF,gBAAgBE,KAAK;QACnC,IAAIA,UAAU,WAAW;YACvB,OAAO,MAAM,mBAAmB;;QAClC;IACF,EAAE,OAAOC,QAAQ;QACf,OAAO;IACT;IACA,OAAO;AACT;AAEA,MAAMC,wBAAwC,CAACC,UAAUC,SAASC;IAChEX,0BAA0BL,MAAM,CAACc,UAAUC,SAAS,CAACE,KAAKC,SAASC;QACjE,IAAIF,KAAK;YACPD,SAASC,KAAKC,SAASC;QACzB,OAAO;YACL,IAAIC,MAAM,EAAE;YACZ,IAAIC,MAAMC,OAAO,CAACJ,UAAU;gBAC1BE,MAAMF,QAAQK,GAAG,CAAC,CAACC,IAAMA,EAAEN,OAAO;YACpC,OAAO;gBACLE,MAAM;oBAACF;iBAAQ;YACjB;YAEA,IAAIE,IAAIK,IAAI,CAAC,CAAClB,KAAO,CAACD,SAASC,MAAM;gBACnCS,SAAS,IAAIU,MAAM,CAAC,0BAA0B,EAAEZ,UAAU,GAAGI,SAASC;gBACtE;YACF;YAEAH,SAAS,MAAME,SAASC;QAC1B;IACF;AACF;AAEA,MAAMQ,iBAAiB,IAAIzB,MAAM;IAC/B0B,SAAS;QAAE5B,QAAQa;IAAsB;AAC3C;AACA;;;;;;CAMC,GACD,OAAO,MAAMgB,YAAY,OAAO,GAAGC;IACjC,MAAM,CAACC,eAAehB,QAAQ,GAAGe;IAEjC,IAAI;QACF,MAAME,MAAM,IAAIC,IAAIF;QAEpB,IAAIjB,WAAWkB,IAAIlB,QAAQ;QAE3B,8DAA8D;QAC9D,IAAIA,SAASoB,UAAU,CAAC,QAAQpB,SAASqB,QAAQ,CAAC,MAAM;YACtDrB,WAAWA,SAASsB,KAAK,CAAC,GAAG,CAAC;QAChC;QAEA,IAAInC,OAAOO,OAAO,CAACM,WAAW;YAC5B,IAAI,CAACR,SAASQ,WAAW;gBACvB,MAAM,IAAIY,MAAM,CAAC,0BAA0B,EAAEZ,UAAU;YACzD;QACF;QACA,OAAQ,MAAMV,YAAY4B,KAAK;YAC7B,GAAGjB,OAAO;YACVsB,YAAYV;YACZW,UAAU;QACZ;IACF,EAAE,OAAOC,OAAO;QACd,IAAIA,iBAAiBb,OAAO;YAC1B,IAAIa,MAAMC,KAAK,YAAYd,SAASa,MAAMC,KAAK,CAACC,OAAO,CAACC,QAAQ,CAAC,WAAW;gBAC1E,kFAAkF;gBAClF,2DAA2D;gBAC3D,MAAM,IAAIhB,MAAMa,MAAMC,KAAK,CAACC,OAAO;YACrC,OAAO;gBACL,IAAIE,iBAAqCC;gBACzC,IAAI,OAAOb,kBAAkB,UAAU;oBACrCY,iBAAiBZ;gBACnB,OAAO,IAAIA,yBAAyBE,KAAK;oBACvCU,iBAAiBZ,cAAcc,QAAQ;gBACzC,OAAO,IAAId,yBAAyBe,SAAS;oBAC3CH,iBAAiBZ,cAAcC,GAAG;gBACpC;gBAEA,MAAM,IAAIN,MAAM,CAAC,qBAAqB,EAAEiB,eAAe,EAAE,EAAEJ,MAAME,OAAO,EAAE;YAC5E;QACF;QACA,MAAMF;IACR;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/uploads/safeFetch.ts"],"sourcesContent":["import type { LookupFunction } from 'net'\n\nimport { lookup } from 'dns'\nimport ipaddr from 'ipaddr.js'\nimport { Agent, fetch as undiciFetch } from 'undici'\n\n/**\n * @internal this is used to mock the IP `lookup` function in integration tests\n */\nexport const _internal_safeFetchGlobal = {\n lookup,\n}\n\nconst isSafeIp = (ip: string) => {\n try {\n if (!ip) {\n return false\n }\n\n if (!ipaddr.isValid(ip)) {\n return false\n }\n\n const parsedIpAddress = ipaddr.parse(ip)\n const range = parsedIpAddress.range()\n if (range !== 'unicast') {\n return false // Private IP Range\n }\n } catch (ignore) {\n return false\n }\n return true\n}\n\nconst ssrfFilterInterceptor: LookupFunction = (hostname, options, callback) => {\n _internal_safeFetchGlobal.lookup(hostname, options, (err, address, family) => {\n if (err) {\n callback(err, address, family)\n } else {\n let ips = [] as string[]\n if (Array.isArray(address)) {\n ips = address.map((a) => a.address)\n } else {\n ips = [address]\n }\n\n if (ips.some((ip) => !isSafeIp(ip))) {\n callback(new Error(`Blocked unsafe attempt to ${hostname}`), address, family)\n return\n }\n\n callback(null, address, family)\n }\n })\n}\n\nlet safeDispatcher: Agent | undefined\n\nconst getSafeDispatcher = (): Agent => {\n if (!safeDispatcher) {\n safeDispatcher = new Agent({ connect: { lookup: ssrfFilterInterceptor } })\n }\n return safeDispatcher\n}\n\n/**\n * A \"safe\" version of undici's fetch that prevents SSRF attacks.\n *\n * - Utilizes a custom dispatcher that filters out requests to unsafe IP addresses.\n * - Validates domain names by resolving them to IP addresses and checking if they're safe.\n * - Undici was used because it supported interceptors as well as \"credentials: include\". Native fetch\n */\nexport const safeFetch = async (...args: Parameters<typeof undiciFetch>): Promise<Response> => {\n const [unverifiedUrl, options] = args\n\n try {\n const url = new URL(unverifiedUrl)\n\n let hostname = url.hostname\n\n // Strip brackets from IPv6 addresses (e.g., \"[::1]\" => \"::1\")\n if (hostname.startsWith('[') && hostname.endsWith(']')) {\n hostname = hostname.slice(1, -1)\n }\n\n if (ipaddr.isValid(hostname)) {\n if (!isSafeIp(hostname)) {\n throw new Error(`Blocked unsafe attempt to ${hostname}`)\n }\n }\n return (await undiciFetch(url, {\n ...options,\n dispatcher: getSafeDispatcher(),\n redirect: 'manual', // Prevent automatic redirects\n })) as unknown as Response\n } catch (error) {\n if (error instanceof Error) {\n if (error.cause instanceof Error && error.cause.message.includes('unsafe')) {\n // Errors thrown from within interceptors always have 'fetch error' as the message\n // The desired message we want to bubble up is in the cause\n throw new Error(error.cause.message)\n } else {\n let stringifiedUrl: string | undefined = undefined\n if (typeof unverifiedUrl === 'string') {\n stringifiedUrl = unverifiedUrl\n } else if (unverifiedUrl instanceof URL) {\n stringifiedUrl = unverifiedUrl.toString()\n } else if (unverifiedUrl instanceof Request) {\n stringifiedUrl = unverifiedUrl.url\n }\n\n throw new Error(`Failed to fetch from ${stringifiedUrl}, ${error.message}`)\n }\n }\n throw error\n }\n}\n"],"names":["lookup","ipaddr","Agent","fetch","undiciFetch","_internal_safeFetchGlobal","isSafeIp","ip","isValid","parsedIpAddress","parse","range","ignore","ssrfFilterInterceptor","hostname","options","callback","err","address","family","ips","Array","isArray","map","a","some","Error","safeDispatcher","getSafeDispatcher","connect","safeFetch","args","unverifiedUrl","url","URL","startsWith","endsWith","slice","dispatcher","redirect","error","cause","message","includes","stringifiedUrl","undefined","toString","Request"],"mappings":"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"}