payload 4.0.0-internal.ea6e8f8 → 4.0.0-internal.ee5d8bd

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 (703) hide show
  1. package/dist/admin/adapters/router.d.ts +1 -1
  2. package/dist/admin/adapters/router.d.ts.map +1 -1
  3. package/dist/admin/adapters/router.js.map +1 -1
  4. package/dist/admin/forms/Diff.d.ts +0 -4
  5. package/dist/admin/forms/Diff.d.ts.map +1 -1
  6. package/dist/admin/forms/Diff.js.map +1 -1
  7. package/dist/admin/forms/Form.d.ts +0 -2
  8. package/dist/admin/forms/Form.d.ts.map +1 -1
  9. package/dist/admin/forms/Form.js.map +1 -1
  10. package/dist/admin/initAdminContext.d.ts.map +1 -1
  11. package/dist/admin/initAdminContext.js +0 -10
  12. package/dist/admin/initAdminContext.js.map +1 -1
  13. package/dist/auth/createAuthToken.d.ts +26 -0
  14. package/dist/auth/createAuthToken.d.ts.map +1 -0
  15. package/dist/auth/createAuthToken.js +39 -0
  16. package/dist/auth/createAuthToken.js.map +1 -0
  17. package/dist/auth/endpoints/refresh.d.ts.map +1 -1
  18. package/dist/auth/endpoints/refresh.js +2 -1
  19. package/dist/auth/endpoints/refresh.js.map +1 -1
  20. package/dist/auth/getFieldsToSign.js.map +1 -1
  21. package/dist/auth/loginWithCookie.d.ts.map +1 -1
  22. package/dist/auth/loginWithCookie.js +1 -0
  23. package/dist/auth/loginWithCookie.js.map +1 -1
  24. package/dist/auth/operations/local/login.d.ts.map +1 -1
  25. package/dist/auth/operations/local/login.js +1 -0
  26. package/dist/auth/operations/local/login.js.map +1 -1
  27. package/dist/auth/operations/login.d.ts +2 -0
  28. package/dist/auth/operations/login.d.ts.map +1 -1
  29. package/dist/auth/operations/login.js +6 -19
  30. package/dist/auth/operations/login.js.map +1 -1
  31. package/dist/auth/operations/refresh.d.ts +8 -0
  32. package/dist/auth/operations/refresh.d.ts.map +1 -1
  33. package/dist/auth/operations/refresh.js +50 -19
  34. package/dist/auth/operations/refresh.js.map +1 -1
  35. package/dist/auth/operations/resetPassword.d.ts.map +1 -1
  36. package/dist/auth/operations/resetPassword.js +54 -20
  37. package/dist/auth/operations/resetPassword.js.map +1 -1
  38. package/dist/auth/refreshAuthToken.d.ts +32 -0
  39. package/dist/auth/refreshAuthToken.d.ts.map +1 -0
  40. package/dist/auth/refreshAuthToken.js +113 -0
  41. package/dist/auth/refreshAuthToken.js.map +1 -0
  42. package/dist/auth/serverFunctions/cookies.js.map +1 -1
  43. package/dist/auth/serverFunctions/login.js.map +1 -1
  44. package/dist/auth/sessions.d.ts +9 -2
  45. package/dist/auth/sessions.d.ts.map +1 -1
  46. package/dist/auth/sessions.js +6 -5
  47. package/dist/auth/sessions.js.map +1 -1
  48. package/dist/auth/types.d.ts +25 -1
  49. package/dist/auth/types.d.ts.map +1 -1
  50. package/dist/auth/types.js.map +1 -1
  51. package/dist/cli/commands/data/utilities.d.ts +1 -1
  52. package/dist/cli/commands/data/utilities.d.ts.map +1 -1
  53. package/dist/cli/commands/data/utilities.js.map +1 -1
  54. package/dist/cli/defineCLICommand.js +1 -1
  55. package/dist/cli/defineCLICommand.js.map +1 -1
  56. package/dist/collections/config/client.d.ts +1 -1
  57. package/dist/collections/config/client.d.ts.map +1 -1
  58. package/dist/collections/config/client.js +0 -1
  59. package/dist/collections/config/client.js.map +1 -1
  60. package/dist/collections/config/defaults.d.ts +2 -0
  61. package/dist/collections/config/defaults.d.ts.map +1 -1
  62. package/dist/collections/config/defaults.js +4 -0
  63. package/dist/collections/config/defaults.js.map +1 -1
  64. package/dist/collections/config/sanitize.d.ts.map +1 -1
  65. package/dist/collections/config/sanitize.js +3 -0
  66. package/dist/collections/config/sanitize.js.map +1 -1
  67. package/dist/collections/config/sanitizeCompoundIndexes.d.ts.map +1 -1
  68. package/dist/collections/config/sanitizeCompoundIndexes.js +0 -9
  69. package/dist/collections/config/sanitizeCompoundIndexes.js.map +1 -1
  70. package/dist/collections/config/types.d.ts +4 -21
  71. package/dist/collections/config/types.d.ts.map +1 -1
  72. package/dist/collections/config/types.js.map +1 -1
  73. package/dist/collections/dataloader.d.ts +1 -10
  74. package/dist/collections/dataloader.d.ts.map +1 -1
  75. package/dist/collections/dataloader.js +6 -14
  76. package/dist/collections/dataloader.js.map +1 -1
  77. package/dist/collections/operations/create.d.ts.map +1 -1
  78. package/dist/collections/operations/create.js +0 -13
  79. package/dist/collections/operations/create.js.map +1 -1
  80. package/dist/collections/operations/delete.d.ts.map +1 -1
  81. package/dist/collections/operations/delete.js +121 -638
  82. package/dist/collections/operations/delete.js.map +1 -1
  83. package/dist/collections/operations/deleteByID.d.ts.map +1 -1
  84. package/dist/collections/operations/deleteByID.js +32 -238
  85. package/dist/collections/operations/deleteByID.js.map +1 -1
  86. package/dist/collections/operations/findByID.d.ts.map +1 -1
  87. package/dist/collections/operations/findByID.js +0 -6
  88. package/dist/collections/operations/findByID.js.map +1 -1
  89. package/dist/collections/operations/findDistinct.d.ts.map +1 -1
  90. package/dist/collections/operations/findDistinct.js +6 -7
  91. package/dist/collections/operations/findDistinct.js.map +1 -1
  92. package/dist/collections/operations/findVersionByID.d.ts.map +1 -1
  93. package/dist/collections/operations/findVersionByID.js +7 -0
  94. package/dist/collections/operations/findVersionByID.js.map +1 -1
  95. package/dist/collections/operations/findVersions.d.ts.map +1 -1
  96. package/dist/collections/operations/findVersions.js +5 -0
  97. package/dist/collections/operations/findVersions.js.map +1 -1
  98. package/dist/collections/operations/local/count.d.ts +4 -9
  99. package/dist/collections/operations/local/count.d.ts.map +1 -1
  100. package/dist/collections/operations/local/count.js.map +1 -1
  101. package/dist/collections/operations/local/countVersions.d.ts +0 -4
  102. package/dist/collections/operations/local/countVersions.d.ts.map +1 -1
  103. package/dist/collections/operations/local/countVersions.js.map +1 -1
  104. package/dist/collections/operations/local/create.d.ts +4 -9
  105. package/dist/collections/operations/local/create.d.ts.map +1 -1
  106. package/dist/collections/operations/local/create.js.map +1 -1
  107. package/dist/collections/operations/local/delete.d.ts +4 -9
  108. package/dist/collections/operations/local/delete.d.ts.map +1 -1
  109. package/dist/collections/operations/local/delete.js.map +1 -1
  110. package/dist/collections/operations/local/duplicate.d.ts +0 -5
  111. package/dist/collections/operations/local/duplicate.d.ts.map +1 -1
  112. package/dist/collections/operations/local/duplicate.js.map +1 -1
  113. package/dist/collections/operations/local/find.d.ts +4 -9
  114. package/dist/collections/operations/local/find.d.ts.map +1 -1
  115. package/dist/collections/operations/local/find.js.map +1 -1
  116. package/dist/collections/operations/local/findByID.d.ts +4 -9
  117. package/dist/collections/operations/local/findByID.d.ts.map +1 -1
  118. package/dist/collections/operations/local/findByID.js.map +1 -1
  119. package/dist/collections/operations/local/findDistinct.d.ts +0 -5
  120. package/dist/collections/operations/local/findDistinct.d.ts.map +1 -1
  121. package/dist/collections/operations/local/findDistinct.js.map +1 -1
  122. package/dist/collections/operations/local/findVersionByID.d.ts +0 -5
  123. package/dist/collections/operations/local/findVersionByID.d.ts.map +1 -1
  124. package/dist/collections/operations/local/findVersionByID.js.map +1 -1
  125. package/dist/collections/operations/local/findVersions.d.ts +0 -5
  126. package/dist/collections/operations/local/findVersions.d.ts.map +1 -1
  127. package/dist/collections/operations/local/findVersions.js.map +1 -1
  128. package/dist/collections/operations/local/restoreVersion.d.ts +0 -5
  129. package/dist/collections/operations/local/restoreVersion.d.ts.map +1 -1
  130. package/dist/collections/operations/local/restoreVersion.js.map +1 -1
  131. package/dist/collections/operations/local/update.d.ts +4 -9
  132. package/dist/collections/operations/local/update.d.ts.map +1 -1
  133. package/dist/collections/operations/local/update.js.map +1 -1
  134. package/dist/collections/operations/renameFile.js +1 -1
  135. package/dist/collections/operations/renameFile.js.map +1 -1
  136. package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
  137. package/dist/collections/operations/restoreVersion.js +76 -157
  138. package/dist/collections/operations/restoreVersion.js.map +1 -1
  139. package/dist/collections/operations/update.d.ts.map +1 -1
  140. package/dist/collections/operations/update.js +171 -357
  141. package/dist/collections/operations/update.js.map +1 -1
  142. package/dist/collections/operations/updateByID.d.ts +0 -15
  143. package/dist/collections/operations/updateByID.d.ts.map +1 -1
  144. package/dist/collections/operations/updateByID.js +60 -265
  145. package/dist/collections/operations/updateByID.js.map +1 -1
  146. package/dist/collections/operations/utilities/buildBeforeOperation.d.ts.map +1 -1
  147. package/dist/collections/operations/utilities/buildBeforeOperation.js +0 -7
  148. package/dist/collections/operations/utilities/buildBeforeOperation.js.map +1 -1
  149. package/dist/collections/operations/utilities/update.d.ts +1 -14
  150. package/dist/collections/operations/utilities/update.d.ts.map +1 -1
  151. package/dist/collections/operations/utilities/update.js +20 -92
  152. package/dist/collections/operations/utilities/update.js.map +1 -1
  153. package/dist/collections/operations/validate.js +4 -4
  154. package/dist/collections/operations/validate.js.map +1 -1
  155. package/dist/config/client.d.ts +1 -3
  156. package/dist/config/client.d.ts.map +1 -1
  157. package/dist/config/client.js +1 -9
  158. package/dist/config/client.js.map +1 -1
  159. package/dist/config/defaults.d.ts.map +1 -1
  160. package/dist/config/defaults.js +1 -0
  161. package/dist/config/defaults.js.map +1 -1
  162. package/dist/config/definePlugin.js.map +1 -1
  163. package/dist/config/sanitize.d.ts.map +1 -1
  164. package/dist/config/sanitize.js +2 -40
  165. package/dist/config/sanitize.js.map +1 -1
  166. package/dist/config/types.d.ts +13 -21
  167. package/dist/config/types.d.ts.map +1 -1
  168. package/dist/config/types.js.map +1 -1
  169. package/dist/database/defaultCopy.d.ts.map +1 -1
  170. package/dist/database/defaultCopy.js +0 -1
  171. package/dist/database/defaultCopy.js.map +1 -1
  172. package/dist/database/types.d.ts +4 -75
  173. package/dist/database/types.d.ts.map +1 -1
  174. package/dist/database/types.js.map +1 -1
  175. package/dist/exports/build-config.d.ts +9 -0
  176. package/dist/exports/build-config.d.ts.map +1 -0
  177. package/dist/exports/build-config.js +38 -0
  178. package/dist/exports/build-config.js.map +1 -0
  179. package/dist/exports/shared.d.ts +0 -2
  180. package/dist/exports/shared.d.ts.map +1 -1
  181. package/dist/exports/shared.js +0 -2
  182. package/dist/exports/shared.js.map +1 -1
  183. package/dist/fields/baseFields/authorship/index.d.ts +1 -2
  184. package/dist/fields/baseFields/authorship/index.d.ts.map +1 -1
  185. package/dist/fields/baseFields/authorship/index.js +0 -12
  186. package/dist/fields/baseFields/authorship/index.js.map +1 -1
  187. package/dist/fields/config/client.js.map +1 -1
  188. package/dist/fields/config/reservedFieldNames.d.ts.map +1 -1
  189. package/dist/fields/config/reservedFieldNames.js.map +1 -1
  190. package/dist/fields/config/types.d.ts.map +1 -1
  191. package/dist/fields/config/types.js.map +1 -1
  192. package/dist/fields/hooks/afterChange/promise.js.map +1 -1
  193. package/dist/fields/hooks/afterRead/index.d.ts +0 -8
  194. package/dist/fields/hooks/afterRead/index.d.ts.map +1 -1
  195. package/dist/fields/hooks/afterRead/index.js +2 -6
  196. package/dist/fields/hooks/afterRead/index.js.map +1 -1
  197. package/dist/fields/hooks/afterRead/promise.d.ts +1 -3
  198. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
  199. package/dist/fields/hooks/afterRead/promise.js +17 -41
  200. package/dist/fields/hooks/afterRead/promise.js.map +1 -1
  201. package/dist/fields/hooks/afterRead/relationshipPopulationPromise.d.ts.map +1 -1
  202. package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js +0 -2
  203. package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js.map +1 -1
  204. package/dist/fields/hooks/afterRead/traverseFields.d.ts +1 -3
  205. package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -1
  206. package/dist/fields/hooks/afterRead/traverseFields.js +2 -4
  207. package/dist/fields/hooks/afterRead/traverseFields.js.map +1 -1
  208. package/dist/fields/hooks/afterRead/virtualFieldPopulationPromise.d.ts.map +1 -1
  209. package/dist/fields/hooks/afterRead/virtualFieldPopulationPromise.js +0 -3
  210. package/dist/fields/hooks/afterRead/virtualFieldPopulationPromise.js.map +1 -1
  211. package/dist/fields/hooks/beforeChange/flattenValidationData.d.ts +14 -0
  212. package/dist/fields/hooks/beforeChange/flattenValidationData.d.ts.map +1 -0
  213. package/dist/fields/hooks/beforeChange/flattenValidationData.js +36 -0
  214. package/dist/fields/hooks/beforeChange/flattenValidationData.js.map +1 -0
  215. package/dist/fields/hooks/beforeChange/promise.d.ts +2 -1
  216. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  217. package/dist/fields/hooks/beforeChange/promise.js +96 -22
  218. package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
  219. package/dist/fields/hooks/beforeChange/traverseFields.d.ts +2 -1
  220. package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
  221. package/dist/fields/hooks/beforeChange/traverseFields.js +2 -1
  222. package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
  223. package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
  224. package/dist/fields/hooks/beforeValidate/promise.js +0 -8
  225. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  226. package/dist/fields/validations.d.ts.map +1 -1
  227. package/dist/fields/validations.js +4 -1
  228. package/dist/fields/validations.js.map +1 -1
  229. package/dist/globals/config/types.d.ts +2 -6
  230. package/dist/globals/config/types.d.ts.map +1 -1
  231. package/dist/globals/config/types.js.map +1 -1
  232. package/dist/globals/operations/countGlobalVersions.d.ts.map +1 -1
  233. package/dist/globals/operations/countGlobalVersions.js +0 -7
  234. package/dist/globals/operations/countGlobalVersions.js.map +1 -1
  235. package/dist/globals/operations/findOne.d.ts.map +1 -1
  236. package/dist/globals/operations/findOne.js +0 -7
  237. package/dist/globals/operations/findOne.js.map +1 -1
  238. package/dist/globals/operations/findVersionByID.d.ts.map +1 -1
  239. package/dist/globals/operations/findVersionByID.js +6 -6
  240. package/dist/globals/operations/findVersionByID.js.map +1 -1
  241. package/dist/globals/operations/findVersions.d.ts.map +1 -1
  242. package/dist/globals/operations/findVersions.js +4 -6
  243. package/dist/globals/operations/findVersions.js.map +1 -1
  244. package/dist/globals/operations/local/countVersions.d.ts +0 -5
  245. package/dist/globals/operations/local/countVersions.d.ts.map +1 -1
  246. package/dist/globals/operations/local/countVersions.js.map +1 -1
  247. package/dist/globals/operations/local/findOne.d.ts +0 -5
  248. package/dist/globals/operations/local/findOne.d.ts.map +1 -1
  249. package/dist/globals/operations/local/findOne.js.map +1 -1
  250. package/dist/globals/operations/local/findVersionByID.d.ts +0 -5
  251. package/dist/globals/operations/local/findVersionByID.d.ts.map +1 -1
  252. package/dist/globals/operations/local/findVersionByID.js.map +1 -1
  253. package/dist/globals/operations/local/findVersions.d.ts +0 -5
  254. package/dist/globals/operations/local/findVersions.d.ts.map +1 -1
  255. package/dist/globals/operations/local/findVersions.js.map +1 -1
  256. package/dist/globals/operations/local/restoreVersion.d.ts +0 -5
  257. package/dist/globals/operations/local/restoreVersion.d.ts.map +1 -1
  258. package/dist/globals/operations/local/restoreVersion.js.map +1 -1
  259. package/dist/globals/operations/local/update.d.ts +0 -5
  260. package/dist/globals/operations/local/update.d.ts.map +1 -1
  261. package/dist/globals/operations/local/update.js +18 -61
  262. package/dist/globals/operations/local/update.js.map +1 -1
  263. package/dist/globals/operations/restoreVersion.d.ts +2 -3
  264. package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
  265. package/dist/globals/operations/restoreVersion.js +24 -61
  266. package/dist/globals/operations/restoreVersion.js.map +1 -1
  267. package/dist/globals/operations/update.d.ts.map +1 -1
  268. package/dist/globals/operations/update.js +8 -86
  269. package/dist/globals/operations/update.js.map +1 -1
  270. package/dist/globals/operations/validate.js +1 -1
  271. package/dist/globals/operations/validate.js.map +1 -1
  272. package/dist/hierarchy/addHierarchyToCollection.d.ts.map +1 -1
  273. package/dist/hierarchy/addHierarchyToCollection.js +32 -21
  274. package/dist/hierarchy/addHierarchyToCollection.js.map +1 -1
  275. package/dist/hierarchy/createFolderField.js.map +1 -1
  276. package/dist/hierarchy/getInitialTreeData.d.ts +1 -3
  277. package/dist/hierarchy/getInitialTreeData.d.ts.map +1 -1
  278. package/dist/hierarchy/getInitialTreeData.js +1 -4
  279. package/dist/hierarchy/getInitialTreeData.js.map +1 -1
  280. package/dist/hierarchy/resolveHierarchyCollections.js +9 -3
  281. package/dist/hierarchy/resolveHierarchyCollections.js.map +1 -1
  282. package/dist/hierarchy/utils/computePaths.d.ts.map +1 -1
  283. package/dist/hierarchy/utils/computePaths.js.map +1 -1
  284. package/dist/index.bundled.d.ts +4336 -5501
  285. package/dist/index.d.ts +27 -51
  286. package/dist/index.d.ts.map +1 -1
  287. package/dist/index.js +14 -37
  288. package/dist/index.js.map +1 -1
  289. package/dist/llm-instructions/getInstructionsCollection.d.ts.map +1 -1
  290. package/dist/llm-instructions/getInstructionsCollection.js +2 -0
  291. package/dist/llm-instructions/getInstructionsCollection.js.map +1 -1
  292. package/dist/preferences/keys.d.ts +4 -11
  293. package/dist/preferences/keys.d.ts.map +1 -1
  294. package/dist/preferences/keys.js +3 -10
  295. package/dist/preferences/keys.js.map +1 -1
  296. package/dist/preferences/types.d.ts +0 -19
  297. package/dist/preferences/types.d.ts.map +1 -1
  298. package/dist/preferences/types.js.map +1 -1
  299. package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js +1 -1
  300. package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js.map +1 -1
  301. package/dist/types/index.d.ts +0 -13
  302. package/dist/types/index.d.ts.map +1 -1
  303. package/dist/types/index.js.map +1 -1
  304. package/dist/uploads/deleteAssociatedFiles.d.ts.map +1 -1
  305. package/dist/uploads/deleteAssociatedFiles.js +29 -108
  306. package/dist/uploads/deleteAssociatedFiles.js.map +1 -1
  307. package/dist/uploads/endpoints/getFile.d.ts.map +1 -1
  308. package/dist/uploads/endpoints/getFile.js +0 -5
  309. package/dist/uploads/endpoints/getFile.js.map +1 -1
  310. package/dist/uploads/fileExists.d.ts.map +1 -1
  311. package/dist/uploads/fileExists.js +2 -5
  312. package/dist/uploads/fileExists.js.map +1 -1
  313. package/dist/uploads/fileVersioning/archive.d.ts.map +1 -1
  314. package/dist/uploads/fileVersioning/archive.js +1 -15
  315. package/dist/uploads/fileVersioning/archive.js.map +1 -1
  316. package/dist/uploads/fileVersioning/cleanup.d.ts +0 -7
  317. package/dist/uploads/fileVersioning/cleanup.d.ts.map +1 -1
  318. package/dist/uploads/fileVersioning/cleanup.js +0 -12
  319. package/dist/uploads/fileVersioning/cleanup.js.map +1 -1
  320. package/dist/uploads/fileVersioning/cloudStorage.d.ts.map +1 -1
  321. package/dist/uploads/fileVersioning/cloudStorage.js +1 -16
  322. package/dist/uploads/fileVersioning/cloudStorage.js.map +1 -1
  323. package/dist/uploads/fileVersioning/resolveHistoricalFile.js.map +1 -1
  324. package/dist/uploads/formatFilesize.js +1 -1
  325. package/dist/uploads/formatFilesize.js.map +1 -1
  326. package/dist/uploads/generateFileData.d.ts +0 -5
  327. package/dist/uploads/generateFileData.d.ts.map +1 -1
  328. package/dist/uploads/generateFileData.js +2 -74
  329. package/dist/uploads/generateFileData.js.map +1 -1
  330. package/dist/uploads/getBaseFields.d.ts.map +1 -1
  331. package/dist/uploads/getBaseFields.js +29 -46
  332. package/dist/uploads/getBaseFields.js.map +1 -1
  333. package/dist/uploads/getFileContentRequirement.js.map +1 -1
  334. package/dist/uploads/getFileFromUploadInstructions.js.map +1 -1
  335. package/dist/uploads/getSafeFilename.d.ts.map +1 -1
  336. package/dist/uploads/getSafeFilename.js +3 -5
  337. package/dist/uploads/getSafeFilename.js.map +1 -1
  338. package/dist/uploads/safeFetch.js.map +1 -1
  339. package/dist/uploads/stagedUpload.js.map +1 -1
  340. package/dist/uploads/transformers/handleDynamicFileRequest.js +11 -2
  341. package/dist/uploads/transformers/handleDynamicFileRequest.js.map +1 -1
  342. package/dist/uploads/types.d.ts +0 -11
  343. package/dist/uploads/types.d.ts.map +1 -1
  344. package/dist/uploads/types.js.map +1 -1
  345. package/dist/uploads/uploadFiles.d.ts +1 -4
  346. package/dist/uploads/uploadFiles.d.ts.map +1 -1
  347. package/dist/uploads/uploadFiles.js +5 -29
  348. package/dist/uploads/uploadFiles.js.map +1 -1
  349. package/dist/utilities/addSelectGenericsToGeneretedTypes.d.ts.map +1 -1
  350. package/dist/utilities/addSelectGenericsToGeneretedTypes.js +0 -1
  351. package/dist/utilities/addSelectGenericsToGeneretedTypes.js.map +1 -1
  352. package/dist/utilities/appendDateTimezoneSelectFields.js.map +1 -1
  353. package/dist/utilities/assertNoValidationWrite.d.ts.map +1 -1
  354. package/dist/utilities/assertNoValidationWrite.js +0 -4
  355. package/dist/utilities/assertNoValidationWrite.js.map +1 -1
  356. package/dist/utilities/checkDocumentLockStatus.d.ts +6 -15
  357. package/dist/utilities/checkDocumentLockStatus.d.ts.map +1 -1
  358. package/dist/utilities/checkDocumentLockStatus.js +11 -44
  359. package/dist/utilities/checkDocumentLockStatus.js.map +1 -1
  360. package/dist/utilities/cloneValidationRequest.js.map +1 -1
  361. package/dist/utilities/commitTransaction.d.ts +0 -4
  362. package/dist/utilities/commitTransaction.d.ts.map +1 -1
  363. package/dist/utilities/commitTransaction.js +1 -41
  364. package/dist/utilities/commitTransaction.js.map +1 -1
  365. package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
  366. package/dist/utilities/configToJSONSchema.js +2 -18
  367. package/dist/utilities/configToJSONSchema.js.map +1 -1
  368. package/dist/utilities/createPayloadRequest.d.ts +0 -5
  369. package/dist/utilities/createPayloadRequest.d.ts.map +1 -1
  370. package/dist/utilities/createPayloadRequest.js +3 -50
  371. package/dist/utilities/createPayloadRequest.js.map +1 -1
  372. package/dist/utilities/createPayloadRequestFromWebRequest.d.ts +12 -1
  373. package/dist/utilities/createPayloadRequestFromWebRequest.d.ts.map +1 -1
  374. package/dist/utilities/createPayloadRequestFromWebRequest.js +9 -5
  375. package/dist/utilities/createPayloadRequestFromWebRequest.js.map +1 -1
  376. package/dist/utilities/deepCopyObject.js.map +1 -1
  377. package/dist/utilities/documentMatchingWhereExists.js +1 -1
  378. package/dist/utilities/documentMatchingWhereExists.js.map +1 -1
  379. package/dist/utilities/entityInputSchema/validateEntityData.d.ts.map +1 -1
  380. package/dist/utilities/entityInputSchema/validateEntityData.js.map +1 -1
  381. package/dist/utilities/filterDataToSelectedLocales.js.map +1 -1
  382. package/dist/utilities/getEntityPermissions/getEntityPermissions.d.ts.map +1 -1
  383. package/dist/utilities/getEntityPermissions/getEntityPermissions.js +1 -0
  384. package/dist/utilities/getEntityPermissions/getEntityPermissions.js.map +1 -1
  385. package/dist/utilities/getEntityPermissions/populateFieldPermissions.js.map +1 -1
  386. package/dist/utilities/getVersionsConfig.d.ts +4 -0
  387. package/dist/utilities/getVersionsConfig.d.ts.map +1 -1
  388. package/dist/utilities/getVersionsConfig.js +5 -0
  389. package/dist/utilities/getVersionsConfig.js.map +1 -1
  390. package/dist/utilities/handleEndpoints.d.ts.map +1 -1
  391. package/dist/utilities/handleEndpoints.js +10 -9
  392. package/dist/utilities/handleEndpoints.js.map +1 -1
  393. package/dist/utilities/httpStatus.d.ts +0 -2
  394. package/dist/utilities/httpStatus.d.ts.map +1 -1
  395. package/dist/utilities/httpStatus.js +1 -3
  396. package/dist/utilities/httpStatus.js.map +1 -1
  397. package/dist/utilities/initTransaction.d.ts.map +1 -1
  398. package/dist/utilities/initTransaction.js +7 -35
  399. package/dist/utilities/initTransaction.js.map +1 -1
  400. package/dist/utilities/killTransaction.d.ts.map +1 -1
  401. package/dist/utilities/killTransaction.js +0 -27
  402. package/dist/utilities/killTransaction.js.map +1 -1
  403. package/dist/utilities/parseParams/index.js.map +1 -1
  404. package/dist/utilities/parseValidationLocale.js.map +1 -1
  405. package/dist/utilities/sanitizePopulateParam.js.map +1 -1
  406. package/dist/utilities/telemetry/conf/index.d.ts +4 -1
  407. package/dist/utilities/telemetry/conf/index.d.ts.map +1 -1
  408. package/dist/utilities/telemetry/conf/index.js.map +1 -1
  409. package/dist/utilities/telemetry/featureInfo/getFeatureInfo.js.map +1 -1
  410. package/dist/versions/allLocalesPublicationStatus.js.map +1 -1
  411. package/dist/versions/buildCollectionFields.d.ts.map +1 -1
  412. package/dist/versions/buildCollectionFields.js +0 -23
  413. package/dist/versions/buildCollectionFields.js.map +1 -1
  414. package/dist/versions/buildGlobalFields.d.ts.map +1 -1
  415. package/dist/versions/buildGlobalFields.js +0 -14
  416. package/dist/versions/buildGlobalFields.js.map +1 -1
  417. package/dist/versions/buildVersionCompoundIndexes.d.ts.map +1 -1
  418. package/dist/versions/buildVersionCompoundIndexes.js +2 -8
  419. package/dist/versions/buildVersionCompoundIndexes.js.map +1 -1
  420. package/dist/versions/deleteCollectionVersions.d.ts +1 -2
  421. package/dist/versions/deleteCollectionVersions.d.ts.map +1 -1
  422. package/dist/versions/deleteCollectionVersions.js +8 -37
  423. package/dist/versions/deleteCollectionVersions.js.map +1 -1
  424. package/dist/versions/deleteScheduledPublishJobs.d.ts.map +1 -1
  425. package/dist/versions/deleteScheduledPublishJobs.js +0 -4
  426. package/dist/versions/deleteScheduledPublishJobs.js.map +1 -1
  427. package/dist/versions/drafts/appendVersionToQueryKey.d.ts.map +1 -1
  428. package/dist/versions/drafts/appendVersionToQueryKey.js +1 -9
  429. package/dist/versions/drafts/appendVersionToQueryKey.js.map +1 -1
  430. package/dist/versions/drafts/replaceWithDraftIfAvailable.d.ts.map +1 -1
  431. package/dist/versions/drafts/replaceWithDraftIfAvailable.js +1 -8
  432. package/dist/versions/drafts/replaceWithDraftIfAvailable.js.map +1 -1
  433. package/dist/versions/enforceMaxVersions.d.ts +0 -1
  434. package/dist/versions/enforceMaxVersions.d.ts.map +1 -1
  435. package/dist/versions/enforceMaxVersions.js +6 -22
  436. package/dist/versions/enforceMaxVersions.js.map +1 -1
  437. package/dist/versions/getLatestCollectionVersion.d.ts.map +1 -1
  438. package/dist/versions/getLatestCollectionVersion.js +2 -10
  439. package/dist/versions/getLatestCollectionVersion.js.map +1 -1
  440. package/dist/versions/getLatestGlobalVersion.d.ts +2 -6
  441. package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
  442. package/dist/versions/getLatestGlobalVersion.js +21 -65
  443. package/dist/versions/getLatestGlobalVersion.js.map +1 -1
  444. package/dist/versions/isInheritedReadVersionsAccess.js.map +1 -1
  445. package/dist/versions/saveVersion.d.ts +0 -7
  446. package/dist/versions/saveVersion.d.ts.map +1 -1
  447. package/dist/versions/saveVersion.js +4 -27
  448. package/dist/versions/saveVersion.js.map +1 -1
  449. package/dist/versions/updateLatestVersion.d.ts +0 -1
  450. package/dist/versions/updateLatestVersion.d.ts.map +1 -1
  451. package/dist/versions/updateLatestVersion.js +7 -24
  452. package/dist/versions/updateLatestVersion.js.map +1 -1
  453. package/package.json +30 -28
  454. package/skills/payload/reference/ENDPOINTS.md +3 -9
  455. package/skills/payload/reference/PLUGIN-DEVELOPMENT.md +4 -4
  456. package/dist/admin/getAdminPreferences.d.ts +0 -10
  457. package/dist/admin/getAdminPreferences.d.ts.map +0 -1
  458. package/dist/admin/getAdminPreferences.js +0 -53
  459. package/dist/admin/getAdminPreferences.js.map +0 -1
  460. package/dist/admin/getRequestBranch.d.ts +0 -6
  461. package/dist/admin/getRequestBranch.d.ts.map +0 -1
  462. package/dist/admin/getRequestBranch.js +0 -17
  463. package/dist/admin/getRequestBranch.js.map +0 -1
  464. package/dist/branching/appendBranchFilter.d.ts +0 -30
  465. package/dist/branching/appendBranchFilter.d.ts.map +0 -1
  466. package/dist/branching/appendBranchFilter.js +0 -105
  467. package/dist/branching/appendBranchFilter.js.map +0 -1
  468. package/dist/branching/assertBranchAccess.d.ts +0 -10
  469. package/dist/branching/assertBranchAccess.d.ts.map +0 -1
  470. package/dist/branching/assertBranchAccess.js +0 -36
  471. package/dist/branching/assertBranchAccess.js.map +0 -1
  472. package/dist/branching/assertBranchActionAccess.d.ts +0 -10
  473. package/dist/branching/assertBranchActionAccess.d.ts.map +0 -1
  474. package/dist/branching/assertBranchActionAccess.js +0 -15
  475. package/dist/branching/assertBranchActionAccess.js.map +0 -1
  476. package/dist/branching/assertBranchCreatedDocumentsUnreferenced.d.ts +0 -53
  477. package/dist/branching/assertBranchCreatedDocumentsUnreferenced.d.ts.map +0 -1
  478. package/dist/branching/assertBranchCreatedDocumentsUnreferenced.js +0 -833
  479. package/dist/branching/assertBranchCreatedDocumentsUnreferenced.js.map +0 -1
  480. package/dist/branching/assertBranchReadable.d.ts +0 -36
  481. package/dist/branching/assertBranchReadable.d.ts.map +0 -1
  482. package/dist/branching/assertBranchReadable.js +0 -83
  483. package/dist/branching/assertBranchReadable.js.map +0 -1
  484. package/dist/branching/assertBranchUpdateAccess.d.ts +0 -8
  485. package/dist/branching/assertBranchUpdateAccess.d.ts.map +0 -1
  486. package/dist/branching/assertBranchUpdateAccess.js +0 -12
  487. package/dist/branching/assertBranchUpdateAccess.js.map +0 -1
  488. package/dist/branching/assertBranchWritable.d.ts +0 -18
  489. package/dist/branching/assertBranchWritable.d.ts.map +0 -1
  490. package/dist/branching/assertBranchWritable.js +0 -46
  491. package/dist/branching/assertBranchWritable.js.map +0 -1
  492. package/dist/branching/branchIDs.d.ts +0 -38
  493. package/dist/branching/branchIDs.d.ts.map +0 -1
  494. package/dist/branching/branchIDs.js +0 -113
  495. package/dist/branching/branchIDs.js.map +0 -1
  496. package/dist/branching/branchSelect.d.ts +0 -42
  497. package/dist/branching/branchSelect.d.ts.map +0 -1
  498. package/dist/branching/branchSelect.js +0 -97
  499. package/dist/branching/branchSelect.js.map +0 -1
  500. package/dist/branching/checkFieldAccess.d.ts +0 -21
  501. package/dist/branching/checkFieldAccess.d.ts.map +0 -1
  502. package/dist/branching/checkFieldAccess.js +0 -238
  503. package/dist/branching/checkFieldAccess.js.map +0 -1
  504. package/dist/branching/collections.d.ts +0 -14
  505. package/dist/branching/collections.d.ts.map +0 -1
  506. package/dist/branching/collections.js +0 -713
  507. package/dist/branching/collections.js.map +0 -1
  508. package/dist/branching/combineBranchAccess.d.ts +0 -6
  509. package/dist/branching/combineBranchAccess.d.ts.map +0 -1
  510. package/dist/branching/combineBranchAccess.js +0 -22
  511. package/dist/branching/combineBranchAccess.js.map +0 -1
  512. package/dist/branching/copyUploadFilesToBranch.d.ts +0 -9
  513. package/dist/branching/copyUploadFilesToBranch.d.ts.map +0 -1
  514. package/dist/branching/copyUploadFilesToBranch.js +0 -126
  515. package/dist/branching/copyUploadFilesToBranch.js.map +0 -1
  516. package/dist/branching/createShadowRow.d.ts +0 -70
  517. package/dist/branching/createShadowRow.d.ts.map +0 -1
  518. package/dist/branching/createShadowRow.js +0 -296
  519. package/dist/branching/createShadowRow.js.map +0 -1
  520. package/dist/branching/discard.d.ts +0 -52
  521. package/dist/branching/discard.d.ts.map +0 -1
  522. package/dist/branching/discard.js +0 -428
  523. package/dist/branching/discard.js.map +0 -1
  524. package/dist/branching/effectiveOperations.d.ts +0 -55
  525. package/dist/branching/effectiveOperations.d.ts.map +0 -1
  526. package/dist/branching/effectiveOperations.js +0 -472
  527. package/dist/branching/effectiveOperations.js.map +0 -1
  528. package/dist/branching/endpoints/discard.d.ts +0 -15
  529. package/dist/branching/endpoints/discard.d.ts.map +0 -1
  530. package/dist/branching/endpoints/discard.js +0 -55
  531. package/dist/branching/endpoints/discard.js.map +0 -1
  532. package/dist/branching/endpoints/merge.d.ts +0 -34
  533. package/dist/branching/endpoints/merge.d.ts.map +0 -1
  534. package/dist/branching/endpoints/merge.js +0 -119
  535. package/dist/branching/endpoints/merge.js.map +0 -1
  536. package/dist/branching/forkDocument.d.ts +0 -20
  537. package/dist/branching/forkDocument.d.ts.map +0 -1
  538. package/dist/branching/forkDocument.js +0 -169
  539. package/dist/branching/forkDocument.js.map +0 -1
  540. package/dist/branching/globalMergeWrites.d.ts +0 -21
  541. package/dist/branching/globalMergeWrites.d.ts.map +0 -1
  542. package/dist/branching/globalMergeWrites.js +0 -146
  543. package/dist/branching/globalMergeWrites.js.map +0 -1
  544. package/dist/branching/globals.d.ts +0 -49
  545. package/dist/branching/globals.d.ts.map +0 -1
  546. package/dist/branching/globals.js +0 -197
  547. package/dist/branching/globals.js.map +0 -1
  548. package/dist/branching/hooks.d.ts +0 -24
  549. package/dist/branching/hooks.d.ts.map +0 -1
  550. package/dist/branching/hooks.js +0 -92
  551. package/dist/branching/hooks.js.map +0 -1
  552. package/dist/branching/injectBranchFields.d.ts +0 -40
  553. package/dist/branching/injectBranchFields.d.ts.map +0 -1
  554. package/dist/branching/injectBranchFields.js +0 -229
  555. package/dist/branching/injectBranchFields.js.map +0 -1
  556. package/dist/branching/merge/applyMergeChange.d.ts +0 -27
  557. package/dist/branching/merge/applyMergeChange.d.ts.map +0 -1
  558. package/dist/branching/merge/applyMergeChange.js +0 -853
  559. package/dist/branching/merge/applyMergeChange.js.map +0 -1
  560. package/dist/branching/merge/branchMergeStatus.d.ts +0 -12
  561. package/dist/branching/merge/branchMergeStatus.d.ts.map +0 -1
  562. package/dist/branching/merge/branchMergeStatus.js +0 -74
  563. package/dist/branching/merge/branchMergeStatus.js.map +0 -1
  564. package/dist/branching/merge/executeMerge.d.ts +0 -22
  565. package/dist/branching/merge/executeMerge.d.ts.map +0 -1
  566. package/dist/branching/merge/executeMerge.js +0 -600
  567. package/dist/branching/merge/executeMerge.js.map +0 -1
  568. package/dist/branching/merge/finalizeMerge.d.ts +0 -40
  569. package/dist/branching/merge/finalizeMerge.d.ts.map +0 -1
  570. package/dist/branching/merge/finalizeMerge.js +0 -237
  571. package/dist/branching/merge/finalizeMerge.js.map +0 -1
  572. package/dist/branching/merge/mergeLedger.d.ts +0 -40
  573. package/dist/branching/merge/mergeLedger.d.ts.map +0 -1
  574. package/dist/branching/merge/mergeLedger.js +0 -130
  575. package/dist/branching/merge/mergeLedger.js.map +0 -1
  576. package/dist/branching/merge/prepareMerge.d.ts +0 -41
  577. package/dist/branching/merge/prepareMerge.d.ts.map +0 -1
  578. package/dist/branching/merge/prepareMerge.js +0 -234
  579. package/dist/branching/merge/prepareMerge.js.map +0 -1
  580. package/dist/branching/merge/recoverMerge.d.ts +0 -16
  581. package/dist/branching/merge/recoverMerge.d.ts.map +0 -1
  582. package/dist/branching/merge/recoverMerge.js +0 -199
  583. package/dist/branching/merge/recoverMerge.js.map +0 -1
  584. package/dist/branching/merge/retryFailedCleanups.d.ts +0 -36
  585. package/dist/branching/merge/retryFailedCleanups.d.ts.map +0 -1
  586. package/dist/branching/merge/retryFailedCleanups.js +0 -335
  587. package/dist/branching/merge/retryFailedCleanups.js.map +0 -1
  588. package/dist/branching/merge/utilities.d.ts +0 -35
  589. package/dist/branching/merge/utilities.d.ts.map +0 -1
  590. package/dist/branching/merge/utilities.js +0 -54
  591. package/dist/branching/merge/utilities.js.map +0 -1
  592. package/dist/branching/merge.d.ts +0 -88
  593. package/dist/branching/merge.d.ts.map +0 -1
  594. package/dist/branching/merge.js +0 -163
  595. package/dist/branching/merge.js.map +0 -1
  596. package/dist/branching/mergeWriteGuard.d.ts +0 -20
  597. package/dist/branching/mergeWriteGuard.d.ts.map +0 -1
  598. package/dist/branching/mergeWriteGuard.js +0 -27
  599. package/dist/branching/mergeWriteGuard.js.map +0 -1
  600. package/dist/branching/preflight.d.ts +0 -71
  601. package/dist/branching/preflight.d.ts.map +0 -1
  602. package/dist/branching/preflight.js +0 -757
  603. package/dist/branching/preflight.js.map +0 -1
  604. package/dist/branching/readLocalizedBranchWrite.d.ts +0 -14
  605. package/dist/branching/readLocalizedBranchWrite.d.ts.map +0 -1
  606. package/dist/branching/readLocalizedBranchWrite.js +0 -90
  607. package/dist/branching/readLocalizedBranchWrite.js.map +0 -1
  608. package/dist/branching/readMergeSnapshot.d.ts +0 -18
  609. package/dist/branching/readMergeSnapshot.d.ts.map +0 -1
  610. package/dist/branching/readMergeSnapshot.js +0 -99
  611. package/dist/branching/readMergeSnapshot.js.map +0 -1
  612. package/dist/branching/resolveBranch.d.ts +0 -153
  613. package/dist/branching/resolveBranch.d.ts.map +0 -1
  614. package/dist/branching/resolveBranch.js +0 -363
  615. package/dist/branching/resolveBranch.js.map +0 -1
  616. package/dist/branching/resolveBranchActionAccess.d.ts +0 -8
  617. package/dist/branching/resolveBranchActionAccess.d.ts.map +0 -1
  618. package/dist/branching/resolveBranchActionAccess.js +0 -9
  619. package/dist/branching/resolveBranchActionAccess.js.map +0 -1
  620. package/dist/branching/resolveBranchQuery.d.ts +0 -48
  621. package/dist/branching/resolveBranchQuery.d.ts.map +0 -1
  622. package/dist/branching/resolveBranchQuery.js +0 -115
  623. package/dist/branching/resolveBranchQuery.js.map +0 -1
  624. package/dist/branching/resolveBranchRowID.d.ts +0 -22
  625. package/dist/branching/resolveBranchRowID.d.ts.map +0 -1
  626. package/dist/branching/resolveBranchRowID.js +0 -70
  627. package/dist/branching/resolveBranchRowID.js.map +0 -1
  628. package/dist/branching/sanitizeBranchingConfig.d.ts +0 -31
  629. package/dist/branching/sanitizeBranchingConfig.d.ts.map +0 -1
  630. package/dist/branching/sanitizeBranchingConfig.js +0 -110
  631. package/dist/branching/sanitizeBranchingConfig.js.map +0 -1
  632. package/dist/branching/schedule/job.d.ts +0 -51
  633. package/dist/branching/schedule/job.d.ts.map +0 -1
  634. package/dist/branching/schedule/job.js +0 -151
  635. package/dist/branching/schedule/job.js.map +0 -1
  636. package/dist/branching/selectBranchChanges.d.ts +0 -8
  637. package/dist/branching/selectBranchChanges.d.ts.map +0 -1
  638. package/dist/branching/selectBranchChanges.js +0 -9
  639. package/dist/branching/selectBranchChanges.js.map +0 -1
  640. package/dist/branching/stripBranchMergeData.d.ts +0 -11
  641. package/dist/branching/stripBranchMergeData.d.ts.map +0 -1
  642. package/dist/branching/stripBranchMergeData.js +0 -20
  643. package/dist/branching/stripBranchMergeData.js.map +0 -1
  644. package/dist/branching/tombstone.d.ts +0 -91
  645. package/dist/branching/tombstone.d.ts.map +0 -1
  646. package/dist/branching/tombstone.js +0 -546
  647. package/dist/branching/tombstone.js.map +0 -1
  648. package/dist/branching/types.d.ts +0 -158
  649. package/dist/branching/types.d.ts.map +0 -1
  650. package/dist/branching/types.js +0 -54
  651. package/dist/branching/types.js.map +0 -1
  652. package/dist/branching/validation.d.ts +0 -47
  653. package/dist/branching/validation.d.ts.map +0 -1
  654. package/dist/branching/validation.js +0 -272
  655. package/dist/branching/validation.js.map +0 -1
  656. package/dist/branching/versions.d.ts +0 -131
  657. package/dist/branching/versions.d.ts.map +0 -1
  658. package/dist/branching/versions.js +0 -572
  659. package/dist/branching/versions.js.map +0 -1
  660. package/dist/collections/operations/utilities/createOperationRetryRequest.d.ts +0 -23
  661. package/dist/collections/operations/utilities/createOperationRetryRequest.d.ts.map +0 -1
  662. package/dist/collections/operations/utilities/createOperationRetryRequest.js +0 -683
  663. package/dist/collections/operations/utilities/createOperationRetryRequest.js.map +0 -1
  664. package/dist/fields/hooks/beforeValidate/throwOnAccessDenied.d.ts +0 -3
  665. package/dist/fields/hooks/beforeValidate/throwOnAccessDenied.d.ts.map +0 -1
  666. package/dist/fields/hooks/beforeValidate/throwOnAccessDenied.js +0 -3
  667. package/dist/fields/hooks/beforeValidate/throwOnAccessDenied.js.map +0 -1
  668. package/dist/uploads/appendBranchToFileURL.d.ts +0 -6
  669. package/dist/uploads/appendBranchToFileURL.d.ts.map +0 -1
  670. package/dist/uploads/appendBranchToFileURL.js +0 -24
  671. package/dist/uploads/appendBranchToFileURL.js.map +0 -1
  672. package/dist/uploads/deleteUploadFilesExclusiveToDocument.d.ts +0 -15
  673. package/dist/uploads/deleteUploadFilesExclusiveToDocument.d.ts.map +0 -1
  674. package/dist/uploads/deleteUploadFilesExclusiveToDocument.js +0 -62
  675. package/dist/uploads/deleteUploadFilesExclusiveToDocument.js.map +0 -1
  676. package/dist/uploads/fileIdentity.d.ts +0 -24
  677. package/dist/uploads/fileIdentity.d.ts.map +0 -1
  678. package/dist/uploads/fileIdentity.js +0 -36
  679. package/dist/uploads/fileIdentity.js.map +0 -1
  680. package/dist/uploads/fileQuarantine.d.ts +0 -17
  681. package/dist/uploads/fileQuarantine.d.ts.map +0 -1
  682. package/dist/uploads/fileQuarantine.js +0 -52
  683. package/dist/uploads/fileQuarantine.js.map +0 -1
  684. package/dist/uploads/linkFileWithoutOverwrite.d.ts +0 -13
  685. package/dist/uploads/linkFileWithoutOverwrite.d.ts.map +0 -1
  686. package/dist/uploads/linkFileWithoutOverwrite.js +0 -13
  687. package/dist/uploads/linkFileWithoutOverwrite.js.map +0 -1
  688. package/dist/uploads/uploadFileRollback.d.ts +0 -31
  689. package/dist/uploads/uploadFileRollback.d.ts.map +0 -1
  690. package/dist/uploads/uploadFileRollback.js +0 -269
  691. package/dist/uploads/uploadFileRollback.js.map +0 -1
  692. package/dist/utilities/extractRelationshipID.d.ts +0 -4
  693. package/dist/utilities/extractRelationshipID.d.ts.map +0 -1
  694. package/dist/utilities/extractRelationshipID.js +0 -14
  695. package/dist/utilities/extractRelationshipID.js.map +0 -1
  696. package/dist/utilities/transactionCallbacks.d.ts +0 -77
  697. package/dist/utilities/transactionCallbacks.d.ts.map +0 -1
  698. package/dist/utilities/transactionCallbacks.js +0 -299
  699. package/dist/utilities/transactionCallbacks.js.map +0 -1
  700. package/dist/utilities/transactionMutationTracker.d.ts +0 -21
  701. package/dist/utilities/transactionMutationTracker.d.ts.map +0 -1
  702. package/dist/utilities/transactionMutationTracker.js +0 -71
  703. package/dist/utilities/transactionMutationTracker.js.map +0 -1
@@ -2,10 +2,7 @@ import fs from 'fs/promises';
2
2
  import path from 'path';
3
3
  import { APIError, ErrorDeletingFile } from '../errors/index.js';
4
4
  import { httpStatus } from '../utilities/httpStatus.js';
5
- import { beginDeferredCleanupScopeIfNeeded, clearDeferredCleanupScope, flushDeferredCleanupScope, scheduleAfterTransactionCommit } from '../utilities/transactionCallbacks.js';
6
5
  import { fileExists } from './fileExists.js';
7
- import { getFileIdentity, hasRenameStableFileIdentity } from './fileIdentity.js';
8
- import { discardQuarantinedFile, quarantineFile, restoreQuarantinedFile } from './fileQuarantine.js';
9
6
  import { withLegacyUploadFileData } from './fileVersioning/storedFiles.js';
10
7
  export const deleteAssociatedFiles = async ({ collectionConfig, config, doc, files = [], overrideDelete, req })=>{
11
8
  if (!collectionConfig.upload) {
@@ -19,94 +16,42 @@ export const deleteAssociatedFiles = async ({ collectionConfig, config, doc, fil
19
16
  if (collectionConfig.versions || stored.original) {
20
17
  return;
21
18
  }
22
- const cleanupScope = await beginDeferredCleanupScopeIfNeeded({
23
- req
24
- });
25
- const replacementFilePaths = new Set(files.map((file)=>path.resolve(file.path)));
26
- try {
27
- if (overrideDelete || files.length > 0) {
28
- const { staticDir: staticPath } = collectionConfig.upload;
29
- const fileToDelete = resolveFilePath({
30
- filename: doc.filename,
19
+ if (overrideDelete || files.length > 0) {
20
+ const { staticDir: staticPath } = collectionConfig.upload;
21
+ const fileToDelete = resolveFilePath({
22
+ filename: doc.filename,
23
+ staticPath
24
+ });
25
+ try {
26
+ await deleteFile({
27
+ filePath: fileToDelete,
31
28
  staticPath
32
29
  });
33
- if (fileToDelete && !replacementFilePaths.has(fileToDelete)) {
34
- await scheduleFileDeletion({
35
- filePath: fileToDelete,
36
- req,
30
+ } catch (ignore) {
31
+ throw new ErrorDeletingFile(req.t);
32
+ }
33
+ if (doc.variants) {
34
+ const sizes = Object.values(doc.variants);
35
+ // Since forEach will not wait until unlink is finished it could
36
+ // happen that two operations will try to delete the same file.
37
+ // To avoid this it is recommended to use "sync" instead
38
+ for (const size of sizes){
39
+ const sizeToDelete = resolveFilePath({
40
+ filename: size.filename,
37
41
  staticPath
38
42
  });
39
- }
40
- if (doc.variants) {
41
- const variants = Object.values(doc.variants);
42
- // Since forEach will not wait until unlink is finished it could
43
- // happen that two operations will try to delete the same file.
44
- // To avoid this it is recommended to use "sync" instead
45
- for (const variant of variants){
46
- const variantToDelete = resolveFilePath({
47
- filename: variant.filename,
43
+ try {
44
+ await deleteFile({
45
+ filePath: sizeToDelete,
48
46
  staticPath
49
47
  });
50
- if (variantToDelete && !replacementFilePaths.has(variantToDelete)) {
51
- await scheduleFileDeletion({
52
- filePath: variantToDelete,
53
- req,
54
- staticPath
55
- });
56
- }
48
+ } catch (ignore) {
49
+ throw new ErrorDeletingFile(req.t);
57
50
  }
58
51
  }
59
52
  }
60
- if (cleanupScope) {
61
- await flushDeferredCleanupScope({
62
- req,
63
- scope: cleanupScope
64
- });
65
- }
66
- } catch (error) {
67
- if (cleanupScope) {
68
- clearDeferredCleanupScope({
69
- req,
70
- scope: cleanupScope
71
- });
72
- }
73
- throw error;
74
53
  }
75
54
  };
76
- const scheduleFileDeletion = async ({ filePath, req, staticPath })=>{
77
- let isFileDeletionSafe;
78
- try {
79
- isFileDeletionSafe = await assertFileDeletionIsSafe({
80
- filePath,
81
- staticPath
82
- });
83
- } catch (ignore) {
84
- throw new ErrorDeletingFile(req.t);
85
- }
86
- if (!isFileDeletionSafe) {
87
- return;
88
- }
89
- const fileIdentity = await getFileIdentity({
90
- filePath: filePath
91
- });
92
- if (!fileIdentity) {
93
- return;
94
- }
95
- await scheduleAfterTransactionCommit({
96
- callback: async ()=>{
97
- try {
98
- await deleteFile({
99
- fileIdentity,
100
- filePath,
101
- staticPath
102
- });
103
- } catch (ignore) {
104
- throw new ErrorDeletingFile(req.t);
105
- }
106
- },
107
- req
108
- });
109
- };
110
55
  const resolveFilePath = ({ filename, staticPath })=>{
111
56
  if (!filename || !staticPath) {
112
57
  return;
@@ -121,37 +66,13 @@ const resolveFilePath = ({ filename, staticPath })=>{
121
66
  }
122
67
  return filePath;
123
68
  };
124
- const deleteFile = async ({ fileIdentity, filePath, staticPath })=>{
125
- if (!await assertFileDeletionIsSafe({
126
- filePath,
127
- staticPath
128
- })) {
69
+ const deleteFile = async ({ filePath, staticPath })=>{
70
+ if (!filePath || !staticPath) {
129
71
  return;
130
72
  }
131
- const quarantinedFile = await quarantineFile({
132
- filePath: filePath
133
- });
134
- if (!quarantinedFile) {
73
+ if (!await fileExists(filePath)) {
135
74
  return;
136
75
  }
137
- if (!hasRenameStableFileIdentity({
138
- actual: quarantinedFile.fileIdentity,
139
- expected: fileIdentity
140
- })) {
141
- await restoreQuarantinedFile({
142
- quarantinedFile,
143
- targetFilePath: filePath
144
- });
145
- return;
146
- }
147
- await discardQuarantinedFile({
148
- quarantinedFile
149
- });
150
- };
151
- const assertFileDeletionIsSafe = async ({ filePath, staticPath })=>{
152
- if (!filePath || !staticPath || !await fileExists(filePath)) {
153
- return false;
154
- }
155
76
  const [resolvedDir, resolvedParent] = await Promise.all([
156
77
  fs.realpath(staticPath),
157
78
  fs.realpath(path.dirname(filePath))
@@ -163,7 +84,7 @@ const assertFileDeletionIsSafe = async ({ filePath, staticPath })=>{
163
84
  })) {
164
85
  throw new APIError('Invalid filename.', httpStatus.BAD_REQUEST);
165
86
  }
166
- return true;
87
+ await fs.unlink(filePath);
167
88
  };
168
89
  const isWithinDirectory = ({ directory, target })=>{
169
90
  const relativePath = path.relative(directory, target);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/deleteAssociatedFiles.ts"],"sourcesContent":["import fs from 'fs/promises'\nimport path from 'path'\n\nimport type { SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { FileIdentity } from './fileIdentity.js'\nimport type { FileData, FileToSave } from './types.js'\n\nimport { APIError, ErrorDeletingFile } from '../errors/index.js'\nimport { httpStatus } from '../utilities/httpStatus.js'\nimport {\n beginDeferredCleanupScopeIfNeeded,\n clearDeferredCleanupScope,\n flushDeferredCleanupScope,\n scheduleAfterTransactionCommit,\n} from '../utilities/transactionCallbacks.js'\nimport { fileExists } from './fileExists.js'\nimport { getFileIdentity, hasRenameStableFileIdentity } from './fileIdentity.js'\nimport { discardQuarantinedFile, quarantineFile, restoreQuarantinedFile } from './fileQuarantine.js'\nimport { withLegacyUploadFileData } from './fileVersioning/storedFiles.js'\n\ntype Args = {\n collectionConfig: SanitizedCollectionConfig\n config: SanitizedConfig\n doc: Record<string, unknown>\n files?: FileToSave[]\n overrideDelete: boolean\n req: PayloadRequest\n}\n\nexport const deleteAssociatedFiles: (args: Args) => Promise<void> = async ({\n collectionConfig,\n config,\n doc,\n files = [],\n overrideDelete,\n req,\n}) => {\n if (!collectionConfig.upload) {\n return\n }\n const stored = withLegacyUploadFileData({ collection: collectionConfig, config, doc })\n\n if (collectionConfig.versions || stored.original) {\n return\n }\n\n const cleanupScope = await beginDeferredCleanupScopeIfNeeded({ req })\n const replacementFilePaths = new Set(files.map((file) => path.resolve(file.path)))\n\n try {\n if (overrideDelete || files.length > 0) {\n const { staticDir: staticPath } = collectionConfig.upload\n\n const fileToDelete = resolveFilePath({\n filename: doc.filename as string,\n staticPath,\n })\n\n if (fileToDelete && !replacementFilePaths.has(fileToDelete)) {\n await scheduleFileDeletion({ filePath: fileToDelete, req, staticPath })\n }\n\n if (doc.variants) {\n const variants: FileData[] = Object.values(doc.variants)\n // Since forEach will not wait until unlink is finished it could\n // happen that two operations will try to delete the same file.\n // To avoid this it is recommended to use \"sync\" instead\n\n for (const variant of variants) {\n const variantToDelete = resolveFilePath({ filename: variant.filename, staticPath })\n if (variantToDelete && !replacementFilePaths.has(variantToDelete)) {\n await scheduleFileDeletion({ filePath: variantToDelete, req, staticPath })\n }\n }\n }\n }\n\n if (cleanupScope) {\n await flushDeferredCleanupScope({ req, scope: cleanupScope })\n }\n } catch (error) {\n if (cleanupScope) {\n clearDeferredCleanupScope({ req, scope: cleanupScope })\n }\n\n throw error\n }\n}\n\nconst scheduleFileDeletion = async ({\n filePath,\n req,\n staticPath,\n}: {\n filePath?: string\n req: PayloadRequest\n staticPath?: string\n}): Promise<void> => {\n let isFileDeletionSafe: boolean\n\n try {\n isFileDeletionSafe = await assertFileDeletionIsSafe({ filePath, staticPath })\n } catch (ignore) {\n throw new ErrorDeletingFile(req.t)\n }\n\n if (!isFileDeletionSafe) {\n return\n }\n\n const fileIdentity = await getFileIdentity({ filePath: filePath! })\n\n if (!fileIdentity) {\n return\n }\n\n await scheduleAfterTransactionCommit({\n callback: async () => {\n try {\n await deleteFile({ fileIdentity, filePath, staticPath })\n } catch (ignore) {\n throw new ErrorDeletingFile(req.t)\n }\n },\n req,\n })\n}\n\nconst resolveFilePath = ({\n filename,\n staticPath,\n}: {\n filename?: null | string\n staticPath?: string\n}) => {\n if (!filename || !staticPath) {\n return\n }\n\n const resolvedDir = path.resolve(staticPath)\n const filePath = path.resolve(resolvedDir, filename)\n\n if (!isWithinDirectory({ directory: resolvedDir, target: filePath })) {\n throw new APIError('Invalid filename.', httpStatus.BAD_REQUEST)\n }\n\n return filePath\n}\n\nconst deleteFile = async ({\n fileIdentity,\n filePath,\n staticPath,\n}: {\n fileIdentity: FileIdentity\n filePath?: string\n staticPath?: string\n}) => {\n if (!(await assertFileDeletionIsSafe({ filePath, staticPath }))) {\n return\n }\n\n const quarantinedFile = await quarantineFile({ filePath: filePath! })\n\n if (!quarantinedFile) {\n return\n }\n\n if (\n !hasRenameStableFileIdentity({ actual: quarantinedFile.fileIdentity, expected: fileIdentity })\n ) {\n await restoreQuarantinedFile({ quarantinedFile, targetFilePath: filePath! })\n return\n }\n\n await discardQuarantinedFile({ quarantinedFile })\n}\n\nconst assertFileDeletionIsSafe = async ({\n filePath,\n staticPath,\n}: {\n filePath?: string\n staticPath?: string\n}): Promise<boolean> => {\n if (!filePath || !staticPath || !(await fileExists(filePath))) {\n return false\n }\n\n const [resolvedDir, resolvedParent] = await Promise.all([\n fs.realpath(staticPath),\n fs.realpath(path.dirname(filePath)),\n ])\n const resolvedTarget = path.join(resolvedParent, path.basename(filePath))\n\n if (!isWithinDirectory({ directory: resolvedDir, target: resolvedTarget })) {\n throw new APIError('Invalid filename.', httpStatus.BAD_REQUEST)\n }\n\n return true\n}\n\nconst isWithinDirectory = ({ directory, target }: { directory: string; target: string }) => {\n const relativePath = path.relative(directory, target)\n\n return (\n relativePath === '' ||\n (relativePath !== '..' &&\n !relativePath.startsWith(`..${path.sep}`) &&\n !path.isAbsolute(relativePath))\n )\n}\n"],"names":["fs","path","APIError","ErrorDeletingFile","httpStatus","beginDeferredCleanupScopeIfNeeded","clearDeferredCleanupScope","flushDeferredCleanupScope","scheduleAfterTransactionCommit","fileExists","getFileIdentity","hasRenameStableFileIdentity","discardQuarantinedFile","quarantineFile","restoreQuarantinedFile","withLegacyUploadFileData","deleteAssociatedFiles","collectionConfig","config","doc","files","overrideDelete","req","upload","stored","collection","versions","original","cleanupScope","replacementFilePaths","Set","map","file","resolve","length","staticDir","staticPath","fileToDelete","resolveFilePath","filename","has","scheduleFileDeletion","filePath","variants","Object","values","variant","variantToDelete","scope","error","isFileDeletionSafe","assertFileDeletionIsSafe","ignore","t","fileIdentity","callback","deleteFile","resolvedDir","isWithinDirectory","directory","target","BAD_REQUEST","quarantinedFile","actual","expected","targetFilePath","resolvedParent","Promise","all","realpath","dirname","resolvedTarget","join","basename","relativePath","relative","startsWith","sep","isAbsolute"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/uploads/deleteAssociatedFiles.ts"],"sourcesContent":["import fs from 'fs/promises'\nimport path from 'path'\n\nimport type { SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { FileData, FileToSave } from './types.js'\n\nimport { APIError, ErrorDeletingFile } from '../errors/index.js'\nimport { httpStatus } from '../utilities/httpStatus.js'\nimport { fileExists } from './fileExists.js'\nimport { withLegacyUploadFileData } from './fileVersioning/storedFiles.js'\n\ntype Args = {\n collectionConfig: SanitizedCollectionConfig\n config: SanitizedConfig\n doc: Record<string, unknown>\n files?: FileToSave[]\n overrideDelete: boolean\n req: PayloadRequest\n}\n\nexport const deleteAssociatedFiles: (args: Args) => Promise<void> = async ({\n collectionConfig,\n config,\n doc,\n files = [],\n overrideDelete,\n req,\n}) => {\n if (!collectionConfig.upload) {\n return\n }\n const stored = withLegacyUploadFileData({ collection: collectionConfig, config, doc })\n\n if (collectionConfig.versions || stored.original) {\n return\n }\n if (overrideDelete || files.length > 0) {\n const { staticDir: staticPath } = collectionConfig.upload\n\n const fileToDelete = resolveFilePath({\n filename: doc.filename as string,\n staticPath,\n })\n\n try {\n await deleteFile({ filePath: fileToDelete, staticPath })\n } catch (ignore) {\n throw new ErrorDeletingFile(req.t)\n }\n\n if (doc.variants) {\n const sizes: FileData[] = Object.values(doc.variants)\n // Since forEach will not wait until unlink is finished it could\n // happen that two operations will try to delete the same file.\n // To avoid this it is recommended to use \"sync\" instead\n\n for (const size of sizes) {\n const sizeToDelete = resolveFilePath({ filename: size.filename, staticPath })\n try {\n await deleteFile({ filePath: sizeToDelete, staticPath })\n } catch (ignore) {\n throw new ErrorDeletingFile(req.t)\n }\n }\n }\n }\n}\n\nconst resolveFilePath = ({\n filename,\n staticPath,\n}: {\n filename?: null | string\n staticPath?: string\n}) => {\n if (!filename || !staticPath) {\n return\n }\n\n const resolvedDir = path.resolve(staticPath)\n const filePath = path.resolve(resolvedDir, filename)\n\n if (!isWithinDirectory({ directory: resolvedDir, target: filePath })) {\n throw new APIError('Invalid filename.', httpStatus.BAD_REQUEST)\n }\n\n return filePath\n}\n\nconst deleteFile = async ({ filePath, staticPath }: { filePath?: string; staticPath?: string }) => {\n if (!filePath || !staticPath) {\n return\n }\n\n if (!(await fileExists(filePath))) {\n return\n }\n\n const [resolvedDir, resolvedParent] = await Promise.all([\n fs.realpath(staticPath),\n fs.realpath(path.dirname(filePath)),\n ])\n const resolvedTarget = path.join(resolvedParent, path.basename(filePath))\n\n if (!isWithinDirectory({ directory: resolvedDir, target: resolvedTarget })) {\n throw new APIError('Invalid filename.', httpStatus.BAD_REQUEST)\n }\n\n await fs.unlink(filePath)\n}\n\nconst isWithinDirectory = ({ directory, target }: { directory: string; target: string }) => {\n const relativePath = path.relative(directory, target)\n\n return (\n relativePath === '' ||\n (relativePath !== '..' &&\n !relativePath.startsWith(`..${path.sep}`) &&\n !path.isAbsolute(relativePath))\n )\n}\n"],"names":["fs","path","APIError","ErrorDeletingFile","httpStatus","fileExists","withLegacyUploadFileData","deleteAssociatedFiles","collectionConfig","config","doc","files","overrideDelete","req","upload","stored","collection","versions","original","length","staticDir","staticPath","fileToDelete","resolveFilePath","filename","deleteFile","filePath","ignore","t","variants","sizes","Object","values","size","sizeToDelete","resolvedDir","resolve","isWithinDirectory","directory","target","BAD_REQUEST","resolvedParent","Promise","all","realpath","dirname","resolvedTarget","join","basename","unlink","relativePath","relative","startsWith","sep","isAbsolute"],"mappings":"AAAA,OAAOA,QAAQ,cAAa;AAC5B,OAAOC,UAAU,OAAM;AAOvB,SAASC,QAAQ,EAAEC,iBAAiB,QAAQ,qBAAoB;AAChE,SAASC,UAAU,QAAQ,6BAA4B;AACvD,SAASC,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,wBAAwB,QAAQ,kCAAiC;AAW1E,OAAO,MAAMC,wBAAuD,OAAO,EACzEC,gBAAgB,EAChBC,MAAM,EACNC,GAAG,EACHC,QAAQ,EAAE,EACVC,cAAc,EACdC,GAAG,EACJ;IACC,IAAI,CAACL,iBAAiBM,MAAM,EAAE;QAC5B;IACF;IACA,MAAMC,SAAST,yBAAyB;QAAEU,YAAYR;QAAkBC;QAAQC;IAAI;IAEpF,IAAIF,iBAAiBS,QAAQ,IAAIF,OAAOG,QAAQ,EAAE;QAChD;IACF;IACA,IAAIN,kBAAkBD,MAAMQ,MAAM,GAAG,GAAG;QACtC,MAAM,EAAEC,WAAWC,UAAU,EAAE,GAAGb,iBAAiBM,MAAM;QAEzD,MAAMQ,eAAeC,gBAAgB;YACnCC,UAAUd,IAAIc,QAAQ;YACtBH;QACF;QAEA,IAAI;YACF,MAAMI,WAAW;gBAAEC,UAAUJ;gBAAcD;YAAW;QACxD,EAAE,OAAOM,QAAQ;YACf,MAAM,IAAIxB,kBAAkBU,IAAIe,CAAC;QACnC;QAEA,IAAIlB,IAAImB,QAAQ,EAAE;YAChB,MAAMC,QAAoBC,OAAOC,MAAM,CAACtB,IAAImB,QAAQ;YACpD,gEAAgE;YAChE,+DAA+D;YAC/D,wDAAwD;YAExD,KAAK,MAAMI,QAAQH,MAAO;gBACxB,MAAMI,eAAeX,gBAAgB;oBAAEC,UAAUS,KAAKT,QAAQ;oBAAEH;gBAAW;gBAC3E,IAAI;oBACF,MAAMI,WAAW;wBAAEC,UAAUQ;wBAAcb;oBAAW;gBACxD,EAAE,OAAOM,QAAQ;oBACf,MAAM,IAAIxB,kBAAkBU,IAAIe,CAAC;gBACnC;YACF;QACF;IACF;AACF,EAAC;AAED,MAAML,kBAAkB,CAAC,EACvBC,QAAQ,EACRH,UAAU,EAIX;IACC,IAAI,CAACG,YAAY,CAACH,YAAY;QAC5B;IACF;IAEA,MAAMc,cAAclC,KAAKmC,OAAO,CAACf;IACjC,MAAMK,WAAWzB,KAAKmC,OAAO,CAACD,aAAaX;IAE3C,IAAI,CAACa,kBAAkB;QAAEC,WAAWH;QAAaI,QAAQb;IAAS,IAAI;QACpE,MAAM,IAAIxB,SAAS,qBAAqBE,WAAWoC,WAAW;IAChE;IAEA,OAAOd;AACT;AAEA,MAAMD,aAAa,OAAO,EAAEC,QAAQ,EAAEL,UAAU,EAA8C;IAC5F,IAAI,CAACK,YAAY,CAACL,YAAY;QAC5B;IACF;IAEA,IAAI,CAAE,MAAMhB,WAAWqB,WAAY;QACjC;IACF;IAEA,MAAM,CAACS,aAAaM,eAAe,GAAG,MAAMC,QAAQC,GAAG,CAAC;QACtD3C,GAAG4C,QAAQ,CAACvB;QACZrB,GAAG4C,QAAQ,CAAC3C,KAAK4C,OAAO,CAACnB;KAC1B;IACD,MAAMoB,iBAAiB7C,KAAK8C,IAAI,CAACN,gBAAgBxC,KAAK+C,QAAQ,CAACtB;IAE/D,IAAI,CAACW,kBAAkB;QAAEC,WAAWH;QAAaI,QAAQO;IAAe,IAAI;QAC1E,MAAM,IAAI5C,SAAS,qBAAqBE,WAAWoC,WAAW;IAChE;IAEA,MAAMxC,GAAGiD,MAAM,CAACvB;AAClB;AAEA,MAAMW,oBAAoB,CAAC,EAAEC,SAAS,EAAEC,MAAM,EAAyC;IACrF,MAAMW,eAAejD,KAAKkD,QAAQ,CAACb,WAAWC;IAE9C,OACEW,iBAAiB,MAChBA,iBAAiB,QAChB,CAACA,aAAaE,UAAU,CAAC,CAAC,EAAE,EAAEnD,KAAKoD,GAAG,EAAE,KACxC,CAACpD,KAAKqD,UAAU,CAACJ;AAEvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"getFile.d.ts","sourceRoot":"","sources":["../../../src/uploads/endpoints/getFile.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAkBvD,eAAO,MAAM,cAAc,EAAE,cAqD5B,CAAA;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,EACzC,UAAU,EACV,GAAG,EACH,QAAQ,EACR,SAAkB,EAClB,MAAM,EACN,GAAG,GACJ,EAAE;IACD,UAAU,EAAE,UAAU,CAAA;IACtB,GAAG,CAAC,EAAE,UAAU,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,oBAAoB,CAAA;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiJpB"}
1
+ {"version":3,"file":"getFile.d.ts","sourceRoot":"","sources":["../../../src/uploads/endpoints/getFile.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAiBvD,eAAO,MAAM,cAAc,EAAE,cAmD5B,CAAA;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,EACzC,UAAU,EACV,GAAG,EACH,QAAQ,EACR,SAAkB,EAClB,MAAM,EACN,GAAG,GACJ,EAAE;IACD,UAAU,EAAE,UAAU,CAAA;IACtB,GAAG,CAAC,EAAE,UAAU,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,oBAAoB,CAAA;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiJpB"}
@@ -1,7 +1,6 @@
1
1
  import { fileTypeFromFile } from 'file-type';
2
2
  import fsPromises from 'fs/promises';
3
3
  import path from 'path';
4
- import { assertBranchReadable } from '../../branching/assertBranchReadable.js';
5
4
  import { APIError } from '../../errors/APIError.js';
6
5
  import { NotFound } from '../../errors/NotFound.js';
7
6
  import { getRequestCollection } from '../../utilities/getRequestEntity.js';
@@ -23,10 +22,6 @@ export const getFileHandler = async (req)=>{
23
22
  if (!collection.config.upload) {
24
23
  throw new APIError(`This collection is not an upload collection: ${collection.config.slug}`, httpStatus.BAD_REQUEST);
25
24
  }
26
- await assertBranchReadable({
27
- collectionSlug: collection.config.slug,
28
- req
29
- });
30
25
  const versionID = req.searchParams?.get('version');
31
26
  if (collection.config.versions && versionID) {
32
27
  const historical = await resolveHistoricalFile({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/uploads/endpoints/getFile.ts"],"sourcesContent":["import type { Stats } from 'fs'\n\nimport { fileTypeFromFile } from 'file-type'\nimport fsPromises from 'fs/promises'\nimport path from 'path'\n\nimport type { Collection, TypeWithID } from '../../collections/config/types.js'\nimport type { PayloadHandler } from '../../config/types.js'\nimport type { PayloadRequest } from '../../types/index.js'\nimport type { FileHandlerOperation } from '../types.js'\n\nimport { assertBranchReadable } from '../../branching/assertBranchReadable.js'\nimport { APIError } from '../../errors/APIError.js'\nimport { NotFound } from '../../errors/NotFound.js'\nimport { getRequestCollection } from '../../utilities/getRequestEntity.js'\nimport { headersWithCors } from '../../utilities/headersWithCors.js'\nimport { httpStatus } from '../../utilities/httpStatus.js'\nimport { checkFileAccess } from '../checkFileAccess.js'\nimport { streamFile } from '../fetchAPI-stream-file/index.js'\nimport { resolveHistoricalFile } from '../fileVersioning/resolveHistoricalFile.js'\nimport { getFileTypeFallback } from '../getFileTypeFallback.js'\nimport { getFileExtension, isXmlMimeType } from '../getFileTypeIdentity.js'\nimport { parseRangeHeader } from '../parseRangeHeader.js'\nimport { handleDynamicFileRequest } from '../transformers/handleDynamicFileRequest.js'\nimport { resolveUploadDocument } from '../transformers/resolveUploadDocument.js'\nimport { uploadContentSecurityPolicy } from '../uploadContentSecurityPolicy.js'\n\nexport const getFileHandler: PayloadHandler = async (req) => {\n const collection = getRequestCollection(req)\n\n const filename = req.routeParams?.filename as string\n const prefix = req.searchParams?.get('prefix') ?? undefined\n\n if (!collection.config.upload) {\n throw new APIError(\n `This collection is not an upload collection: ${collection.config.slug}`,\n httpStatus.BAD_REQUEST,\n )\n }\n\n await assertBranchReadable({ collectionSlug: collection.config.slug, req })\n\n const versionID = req.searchParams?.get('version')\n\n if (collection.config.versions && versionID) {\n const historical = await resolveHistoricalFile({\n collection,\n filename,\n prefix,\n req,\n versionID,\n })\n\n return retrieveFileResponse({ collection, doc: historical, filename, prefix, req })\n }\n\n if (req.payload.config.upload.transformers.length > 0) {\n return handleDynamicFileRequest({ collection, filename, prefix, req })\n }\n\n const accessResult = (await checkFileAccess({\n collection,\n filename,\n prefix,\n req,\n }))!\n\n if (accessResult instanceof Response) {\n return accessResult\n }\n\n const current = collection.config.versions\n ? (accessResult ?? (await resolveUploadDocument({ collection, filename, prefix, req })))\n : undefined\n\n if (collection.config.versions && !current) {\n throw new NotFound(req.t)\n }\n\n return retrieveFileResponse({ collection, doc: accessResult ?? current, filename, prefix, req })\n}\n\n/**\n * Shared by the ordinary `read` endpoint and, via `operation: 'transform'`, by\n * `getSourceFileResponse` for internal source retrieval. `transform` ignores the\n * `Range` header and skips `modifyResponseHeaders`/CORS wrapping, since those are\n * applied once, later, to the transformer pipeline's final response.\n */\nexport async function retrieveFileResponse({\n collection,\n doc,\n filename,\n operation = 'read',\n prefix,\n req,\n}: {\n collection: Collection\n doc?: TypeWithID\n filename: string\n operation?: FileHandlerOperation\n prefix?: string\n req: PayloadRequest\n}): Promise<Response> {\n if (collection.config.upload && collection.config.upload.handlers?.length) {\n let customResponse: null | Response | void = null\n const headers = new Headers()\n\n for (const handler of collection.config.upload.handlers) {\n customResponse = await handler(req, {\n doc: doc!,\n headers,\n params: {\n collection: collection.config.slug,\n filename,\n operation,\n prefix,\n },\n })\n if (customResponse && customResponse instanceof Response) {\n break\n }\n }\n\n if (customResponse instanceof Response) {\n return customResponse\n }\n }\n\n // Local filesystem fallback — cloud storage handlers return a Response above\n // and have their own filename validation via sanitizeFilename.\n const fileDir = collection.config.upload?.staticDir || collection.config.slug\n const resolvedDir = path.resolve(fileDir)\n const filePath = path.resolve(resolvedDir, filename)\n\n if (!filePath.startsWith(resolvedDir + path.sep)) {\n throw new APIError('Invalid filename.', httpStatus.BAD_REQUEST)\n }\n\n let stats: Stats\n\n try {\n stats = await fsPromises.stat(filePath)\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n req.payload.logger.error(\n `File ${filename} for collection ${collection.config.slug} is missing on the disk. Expected path: ${filePath}`,\n )\n\n // Omit going to the routeError handler by returning response instead of\n // throwing an error to cut down log noise. The response still matches what you get with APIError to not leak details to the user.\n return Response.json(\n {\n errors: [\n {\n message: 'Something went wrong.',\n },\n ],\n },\n {\n headers: headersWithCors({\n headers: new Headers(),\n req,\n }),\n status: 500,\n },\n )\n }\n\n throw err\n }\n\n const fileTypeResult = (await fileTypeFromFile(filePath)) || getFileTypeFallback(filePath)\n let mimeType = fileTypeResult.mime\n\n if (\n getFileExtension(filePath).toLowerCase() === 'svg' &&\n fileTypeResult.mime === 'application/xml'\n ) {\n mimeType = 'image/svg+xml'\n }\n\n const isTransformSource = operation === 'transform'\n\n // The client's Range header must never leak into an internal source retrieval —\n // a transformer needs the complete original bytes to decode.\n const rangeHeader = isTransformSource ? null : req.headers.get('range')\n const rangeResult = parseRangeHeader({\n fileSize: stats.size,\n rangeHeader,\n })\n\n if (rangeResult.type === 'invalid') {\n let headers = new Headers()\n headers.set('Content-Range', `bytes */${stats.size}`)\n headers = collection.config.upload?.modifyResponseHeaders\n ? collection.config.upload.modifyResponseHeaders({ headers }) || headers\n : headers\n\n return new Response(null, {\n headers: headersWithCors({\n headers,\n req,\n }),\n status: httpStatus.REQUESTED_RANGE_NOT_SATISFIABLE,\n })\n }\n\n let headers = new Headers()\n headers.set('Content-Type', mimeType)\n headers.set('Accept-Ranges', 'bytes')\n\n if (isXmlMimeType(mimeType)) {\n headers.set('Content-Security-Policy', uploadContentSecurityPolicy)\n }\n\n let data: ReadableStream\n let status: number\n const isPartial = rangeResult.type === 'partial'\n const range = rangeResult.range\n\n if (isPartial && range) {\n const contentLength = range.end - range.start + 1\n headers.set('Content-Length', String(contentLength))\n headers.set('Content-Range', `bytes ${range.start}-${range.end}/${stats.size}`)\n data = streamFile({ filePath, options: { end: range.end, start: range.start } })\n status = httpStatus.PARTIAL_CONTENT\n } else {\n headers.set('Content-Length', String(stats.size))\n data = streamFile({ filePath })\n status = httpStatus.OK\n }\n\n if (isTransformSource) {\n return new Response(data, { headers, status })\n }\n\n headers = collection.config.upload?.modifyResponseHeaders\n ? collection.config.upload.modifyResponseHeaders({ headers }) || headers\n : headers\n\n return new Response(data, {\n headers: headersWithCors({\n headers,\n req,\n }),\n status,\n })\n}\n"],"names":["fileTypeFromFile","fsPromises","path","assertBranchReadable","APIError","NotFound","getRequestCollection","headersWithCors","httpStatus","checkFileAccess","streamFile","resolveHistoricalFile","getFileTypeFallback","getFileExtension","isXmlMimeType","parseRangeHeader","handleDynamicFileRequest","resolveUploadDocument","uploadContentSecurityPolicy","getFileHandler","req","collection","filename","routeParams","prefix","searchParams","get","undefined","config","upload","slug","BAD_REQUEST","collectionSlug","versionID","versions","historical","retrieveFileResponse","doc","payload","transformers","length","accessResult","Response","current","t","operation","handlers","customResponse","headers","Headers","handler","params","fileDir","staticDir","resolvedDir","resolve","filePath","startsWith","sep","stats","stat","err","code","logger","error","json","errors","message","status","fileTypeResult","mimeType","mime","toLowerCase","isTransformSource","rangeHeader","rangeResult","fileSize","size","type","set","modifyResponseHeaders","REQUESTED_RANGE_NOT_SATISFIABLE","data","isPartial","range","contentLength","end","start","String","options","PARTIAL_CONTENT","OK"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/uploads/endpoints/getFile.ts"],"sourcesContent":["import type { Stats } from 'fs'\n\nimport { fileTypeFromFile } from 'file-type'\nimport fsPromises from 'fs/promises'\nimport path from 'path'\n\nimport type { Collection, TypeWithID } from '../../collections/config/types.js'\nimport type { PayloadHandler } from '../../config/types.js'\nimport type { PayloadRequest } from '../../types/index.js'\nimport type { FileHandlerOperation } from '../types.js'\n\nimport { APIError } from '../../errors/APIError.js'\nimport { NotFound } from '../../errors/NotFound.js'\nimport { getRequestCollection } from '../../utilities/getRequestEntity.js'\nimport { headersWithCors } from '../../utilities/headersWithCors.js'\nimport { httpStatus } from '../../utilities/httpStatus.js'\nimport { checkFileAccess } from '../checkFileAccess.js'\nimport { streamFile } from '../fetchAPI-stream-file/index.js'\nimport { resolveHistoricalFile } from '../fileVersioning/resolveHistoricalFile.js'\nimport { getFileTypeFallback } from '../getFileTypeFallback.js'\nimport { getFileExtension, isXmlMimeType } from '../getFileTypeIdentity.js'\nimport { parseRangeHeader } from '../parseRangeHeader.js'\nimport { handleDynamicFileRequest } from '../transformers/handleDynamicFileRequest.js'\nimport { resolveUploadDocument } from '../transformers/resolveUploadDocument.js'\nimport { uploadContentSecurityPolicy } from '../uploadContentSecurityPolicy.js'\n\nexport const getFileHandler: PayloadHandler = async (req) => {\n const collection = getRequestCollection(req)\n\n const filename = req.routeParams?.filename as string\n const prefix = req.searchParams?.get('prefix') ?? undefined\n\n if (!collection.config.upload) {\n throw new APIError(\n `This collection is not an upload collection: ${collection.config.slug}`,\n httpStatus.BAD_REQUEST,\n )\n }\n\n const versionID = req.searchParams?.get('version')\n\n if (collection.config.versions && versionID) {\n const historical = await resolveHistoricalFile({\n collection,\n filename,\n prefix,\n req,\n versionID,\n })\n\n return retrieveFileResponse({ collection, doc: historical, filename, prefix, req })\n }\n\n if (req.payload.config.upload.transformers.length > 0) {\n return handleDynamicFileRequest({ collection, filename, prefix, req })\n }\n\n const accessResult = (await checkFileAccess({\n collection,\n filename,\n prefix,\n req,\n }))!\n\n if (accessResult instanceof Response) {\n return accessResult\n }\n\n const current = collection.config.versions\n ? (accessResult ?? (await resolveUploadDocument({ collection, filename, prefix, req })))\n : undefined\n\n if (collection.config.versions && !current) {\n throw new NotFound(req.t)\n }\n\n return retrieveFileResponse({ collection, doc: accessResult ?? current, filename, prefix, req })\n}\n\n/**\n * Shared by the ordinary `read` endpoint and, via `operation: 'transform'`, by\n * `getSourceFileResponse` for internal source retrieval. `transform` ignores the\n * `Range` header and skips `modifyResponseHeaders`/CORS wrapping, since those are\n * applied once, later, to the transformer pipeline's final response.\n */\nexport async function retrieveFileResponse({\n collection,\n doc,\n filename,\n operation = 'read',\n prefix,\n req,\n}: {\n collection: Collection\n doc?: TypeWithID\n filename: string\n operation?: FileHandlerOperation\n prefix?: string\n req: PayloadRequest\n}): Promise<Response> {\n if (collection.config.upload && collection.config.upload.handlers?.length) {\n let customResponse: null | Response | void = null\n const headers = new Headers()\n\n for (const handler of collection.config.upload.handlers) {\n customResponse = await handler(req, {\n doc: doc!,\n headers,\n params: {\n collection: collection.config.slug,\n filename,\n operation,\n prefix,\n },\n })\n if (customResponse && customResponse instanceof Response) {\n break\n }\n }\n\n if (customResponse instanceof Response) {\n return customResponse\n }\n }\n\n // Local filesystem fallback — cloud storage handlers return a Response above\n // and have their own filename validation via sanitizeFilename.\n const fileDir = collection.config.upload?.staticDir || collection.config.slug\n const resolvedDir = path.resolve(fileDir)\n const filePath = path.resolve(resolvedDir, filename)\n\n if (!filePath.startsWith(resolvedDir + path.sep)) {\n throw new APIError('Invalid filename.', httpStatus.BAD_REQUEST)\n }\n\n let stats: Stats\n\n try {\n stats = await fsPromises.stat(filePath)\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n req.payload.logger.error(\n `File ${filename} for collection ${collection.config.slug} is missing on the disk. Expected path: ${filePath}`,\n )\n\n // Omit going to the routeError handler by returning response instead of\n // throwing an error to cut down log noise. The response still matches what you get with APIError to not leak details to the user.\n return Response.json(\n {\n errors: [\n {\n message: 'Something went wrong.',\n },\n ],\n },\n {\n headers: headersWithCors({\n headers: new Headers(),\n req,\n }),\n status: 500,\n },\n )\n }\n\n throw err\n }\n\n const fileTypeResult = (await fileTypeFromFile(filePath)) || getFileTypeFallback(filePath)\n let mimeType = fileTypeResult.mime\n\n if (\n getFileExtension(filePath).toLowerCase() === 'svg' &&\n fileTypeResult.mime === 'application/xml'\n ) {\n mimeType = 'image/svg+xml'\n }\n\n const isTransformSource = operation === 'transform'\n\n // The client's Range header must never leak into an internal source retrieval —\n // a transformer needs the complete original bytes to decode.\n const rangeHeader = isTransformSource ? null : req.headers.get('range')\n const rangeResult = parseRangeHeader({\n fileSize: stats.size,\n rangeHeader,\n })\n\n if (rangeResult.type === 'invalid') {\n let headers = new Headers()\n headers.set('Content-Range', `bytes */${stats.size}`)\n headers = collection.config.upload?.modifyResponseHeaders\n ? collection.config.upload.modifyResponseHeaders({ headers }) || headers\n : headers\n\n return new Response(null, {\n headers: headersWithCors({\n headers,\n req,\n }),\n status: httpStatus.REQUESTED_RANGE_NOT_SATISFIABLE,\n })\n }\n\n let headers = new Headers()\n headers.set('Content-Type', mimeType)\n headers.set('Accept-Ranges', 'bytes')\n\n if (isXmlMimeType(mimeType)) {\n headers.set('Content-Security-Policy', uploadContentSecurityPolicy)\n }\n\n let data: ReadableStream\n let status: number\n const isPartial = rangeResult.type === 'partial'\n const range = rangeResult.range\n\n if (isPartial && range) {\n const contentLength = range.end - range.start + 1\n headers.set('Content-Length', String(contentLength))\n headers.set('Content-Range', `bytes ${range.start}-${range.end}/${stats.size}`)\n data = streamFile({ filePath, options: { end: range.end, start: range.start } })\n status = httpStatus.PARTIAL_CONTENT\n } else {\n headers.set('Content-Length', String(stats.size))\n data = streamFile({ filePath })\n status = httpStatus.OK\n }\n\n if (isTransformSource) {\n return new Response(data, { headers, status })\n }\n\n headers = collection.config.upload?.modifyResponseHeaders\n ? collection.config.upload.modifyResponseHeaders({ headers }) || headers\n : headers\n\n return new Response(data, {\n headers: headersWithCors({\n headers,\n req,\n }),\n status,\n })\n}\n"],"names":["fileTypeFromFile","fsPromises","path","APIError","NotFound","getRequestCollection","headersWithCors","httpStatus","checkFileAccess","streamFile","resolveHistoricalFile","getFileTypeFallback","getFileExtension","isXmlMimeType","parseRangeHeader","handleDynamicFileRequest","resolveUploadDocument","uploadContentSecurityPolicy","getFileHandler","req","collection","filename","routeParams","prefix","searchParams","get","undefined","config","upload","slug","BAD_REQUEST","versionID","versions","historical","retrieveFileResponse","doc","payload","transformers","length","accessResult","Response","current","t","operation","handlers","customResponse","headers","Headers","handler","params","fileDir","staticDir","resolvedDir","resolve","filePath","startsWith","sep","stats","stat","err","code","logger","error","json","errors","message","status","fileTypeResult","mimeType","mime","toLowerCase","isTransformSource","rangeHeader","rangeResult","fileSize","size","type","set","modifyResponseHeaders","REQUESTED_RANGE_NOT_SATISFIABLE","data","isPartial","range","contentLength","end","start","String","options","PARTIAL_CONTENT","OK"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"fileExists.d.ts","sourceRoot":"","sources":["../../src/uploads/fileExists.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,aAAoB,MAAM,KAAG,OAAO,CAAC,OAAO,CAYlE,CAAA"}
1
+ {"version":3,"file":"fileExists.d.ts","sourceRoot":"","sources":["../../src/uploads/fileExists.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,aAAoB,MAAM,KAAG,OAAO,CAAC,OAAO,CAQlE,CAAA"}
@@ -3,11 +3,8 @@ export const fileExists = async (filename)=>{
3
3
  try {
4
4
  await fs.stat(filename);
5
5
  return true;
6
- } catch (error) {
7
- if (error.code === 'ENOENT') {
8
- return false;
9
- }
10
- throw error;
6
+ } catch (ignore) {
7
+ return false;
11
8
  }
12
9
  };
13
10
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/fileExists.ts"],"sourcesContent":["import fs from 'fs/promises'\n\nexport const fileExists = async (filename: string): Promise<boolean> => {\n try {\n await fs.stat(filename)\n\n return true\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return false\n }\n\n throw error\n }\n}\n"],"names":["fs","fileExists","filename","stat","error","code"],"mappings":"AAAA,OAAOA,QAAQ,cAAa;AAE5B,OAAO,MAAMC,aAAa,OAAOC;IAC/B,IAAI;QACF,MAAMF,GAAGG,IAAI,CAACD;QAEd,OAAO;IACT,EAAE,OAAOE,OAAO;QACd,IAAI,AAACA,MAAgCC,IAAI,KAAK,UAAU;YACtD,OAAO;QACT;QAEA,MAAMD;IACR;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/uploads/fileExists.ts"],"sourcesContent":["import fs from 'fs/promises'\n\nexport const fileExists = async (filename: string): Promise<boolean> => {\n try {\n await fs.stat(filename)\n\n return true\n } catch (ignore) {\n return false\n }\n}\n"],"names":["fs","fileExists","filename","stat","ignore"],"mappings":"AAAA,OAAOA,QAAQ,cAAa;AAE5B,OAAO,MAAMC,aAAa,OAAOC;IAC/B,IAAI;QACF,MAAMF,GAAGG,IAAI,CAACD;QAEd,OAAO;IACT,EAAE,OAAOE,QAAQ;QACf,OAAO;IACT;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/uploads/fileVersioning/archive.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAElF,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AA2BhD,eAAO,MAAM,kBAAkB,GAAU,CAAC,yDAQvC;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,OAAO,EAAE,UAAU,CAAA;IACnB,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;IACnB,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAA;CACxB,KAAG,OAAO,CAAC,CAAC,CA0DZ,CAAA;AA4BD,gGAAgG;AAChG,eAAO,MAAM,yBAAyB,+DAOnC;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,OAAO,EAAE,UAAU,CAAA;IACnB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;IACnB,iBAAiB,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAA;CAClD,KAAG,OAAO,CAAC,IAAI,CAsHf,CAAA;AAiDD,eAAO,MAAM,2BAA2B,sCAIrC;IACD,KAAK,EAAE,cAAc,CAAA;IACrB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,OAAO,EAAE,UAAU,CAAA;CACpB,KAAG,UAAU,GAAG,SA+ChB,CAAA"}
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/uploads/fileVersioning/archive.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAElF,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAuBhD,eAAO,MAAM,kBAAkB,GAAU,CAAC,yDAQvC;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,OAAO,EAAE,UAAU,CAAA;IACnB,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;IACnB,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAA;CACxB,KAAG,OAAO,CAAC,CAAC,CA0DZ,CAAA;AA4BD,gGAAgG;AAChG,eAAO,MAAM,yBAAyB,+DAOnC;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,OAAO,EAAE,UAAU,CAAA;IACnB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;IACnB,iBAAiB,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAA;CAClD,KAAG,OAAO,CAAC,IAAI,CAkHf,CAAA;AA2CD,eAAO,MAAM,2BAA2B,sCAIrC;IACD,KAAK,EAAE,cAAc,CAAA;IACrB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,OAAO,EAAE,UAAU,CAAA;CACpB,KAAG,UAAU,GAAG,SA+ChB,CAAA"}
@@ -1,7 +1,5 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
- import { resolveBranchRowID } from '../../branching/resolveBranchRowID.js';
4
- import { branchField, branchParentField } from '../../branching/types.js';
5
3
  import { saveVersion } from '../../versions/saveVersion.js';
6
4
  import { removeUnreferencedStagedObjects, scheduleUnreferencedFileCleanup } from './cleanup.js';
7
5
  import { runFileOperationPlan, stageLocalUploadFiles } from './fileOperationManager.js';
@@ -181,12 +179,6 @@ export const runLocalFileUpdate = async ({ id, collection, current, files, next,
181
179
  collection: collection.slug,
182
180
  req,
183
181
  versionData: {
184
- ...row[branchField] !== undefined ? {
185
- [branchField]: row[branchField]
186
- } : {},
187
- ...row[branchParentField] !== undefined ? {
188
- [branchParentField]: row[branchParentField]
189
- } : {},
190
182
  createdAt: row.createdAt,
191
183
  latest: row.latest,
192
184
  parent: row.parent,
@@ -218,13 +210,7 @@ const getOutgoingLocalFiles = ({ collection, config, current, next, req })=>{
218
210
  return currentFiles.filter((file)=>!nextIdentities.has(getStoredFileIdentity(file)));
219
211
  };
220
212
  const getVersions = async ({ id, collection, req })=>{
221
- const versionParent = await resolveBranchRowID({
222
- id,
223
- collectionSlug: collection.slug,
224
- req
225
- });
226
213
  const { docs } = await req.payload.db.findVersions({
227
- branch: false,
228
214
  collection: collection.slug,
229
215
  limit: 0,
230
216
  pagination: false,
@@ -232,7 +218,7 @@ const getVersions = async ({ id, collection, req })=>{
232
218
  sort: '-updatedAt',
233
219
  where: {
234
220
  parent: {
235
- equals: versionParent
221
+ equals: id
236
222
  }
237
223
  }
238
224
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/uploads/fileVersioning/archive.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { Config } from '../../config/types.js'\nimport type { JsonObject, PayloadRequest } from '../../types/index.js'\nimport type { FileToSave } from '../types.js'\nimport type { StagedObject } from './fileOperationManager.js'\nimport type { StoredFileList } from './types.js'\n\nimport { resolveBranchRowID } from '../../branching/resolveBranchRowID.js'\nimport { branchField, branchParentField } from '../../branching/types.js'\nimport { saveVersion } from '../../versions/saveVersion.js'\nimport { removeUnreferencedStagedObjects, scheduleUnreferencedFileCleanup } from './cleanup.js'\nimport { runFileOperationPlan, stageLocalUploadFiles } from './fileOperationManager.js'\nimport { copyLocalFile } from './localStorage.js'\nimport { getArchivedFilename } from './naming.js'\nimport {\n collectStoredFiles,\n getStoredFileIdentity,\n withLegacyUploadFileData,\n} from './storedFiles.js'\n\ntype VersionRow = {\n [branchField]?: null | string\n [branchParentField]?: null | number | string\n createdAt: string\n id: number | string\n latest?: boolean\n parent: number | string\n publishedLocale?: string\n updatedAt: string\n version: JsonObject\n}\n\nexport const runLocalFileUpdate = async <T>({\n id,\n collection,\n current,\n files,\n next,\n req,\n write,\n}: {\n collection: SanitizedCollectionConfig\n current: JsonObject\n files: FileToSave[]\n id: number | string\n next: JsonObject\n req: PayloadRequest\n write: () => Promise<T>\n}): Promise<T> => {\n const storedCurrent = withLegacyUploadFileData({\n collection,\n config: req.payload.config,\n doc: current,\n })\n const nextDoc = { ...storedCurrent, ...next }\n\n if (\n !hasLocalFileChange({\n collection,\n config: req.payload.config,\n current,\n hasNewFiles: files.length > 0,\n next: nextDoc,\n req,\n })\n ) {\n return write()\n }\n\n return runFileOperationPlan({\n cleanupStagedAfterWriteFailure: (objects) =>\n removeUnreferencedStagedObjects({ collection, objects, req }),\n req,\n stage: ({ trackStagedObject }) =>\n stageLocalUploadFiles({\n files,\n staticDir: collection.upload.staticDir!,\n trackStagedObject,\n }),\n write: async ({ trackStagedObject }) => {\n await archiveOutgoingLocalFiles({\n id,\n collection,\n current,\n next: nextDoc,\n req,\n trackStagedObject,\n })\n\n const result = await write()\n\n await scheduleUnreferencedFileCleanup({\n candidates: getOutgoingLocalFiles({\n collection,\n config: req.payload.config,\n current,\n next: nextDoc,\n req,\n }),\n collection,\n req,\n })\n\n return result\n },\n })\n}\n\n/** Also detects removals, which have no new upload to stage. */\nconst hasLocalFileChange = ({\n collection,\n config,\n current,\n hasNewFiles,\n next,\n req,\n}: {\n collection: SanitizedCollectionConfig\n config: Pick<Config, 'routes' | 'serverURL'>\n current: JsonObject\n hasNewFiles: boolean\n next: JsonObject\n req: PayloadRequest\n}): boolean =>\n !collection.upload.disableLocalStorage &&\n (hasNewFiles ||\n getOutgoingLocalFiles({\n collection,\n config,\n current,\n next,\n req,\n }).length > 0)\n\n/** Preserves outgoing local objects and repairs every retained version that referenced them. */\nexport const archiveOutgoingLocalFiles = async ({\n id,\n collection,\n current,\n next,\n req,\n trackStagedObject,\n}: {\n collection: SanitizedCollectionConfig\n current: JsonObject\n id: number | string\n next: JsonObject\n req: PayloadRequest\n trackStagedObject: (object: StagedObject) => void\n}): Promise<void> => {\n const outgoing = getOutgoingLocalFiles({\n collection,\n config: req.payload.config,\n current,\n next,\n req,\n })\n\n if (!outgoing.length || !collection.versions) {\n return\n }\n\n const currentWithState = withLegacyUploadFileData({\n collection,\n config: req.payload.config,\n doc: current,\n })\n let versions = await getVersions({ id, collection, req })\n\n if (!versions.length) {\n await saveVersion({\n id,\n collection,\n docWithLocales: currentWithState,\n draft: false,\n operation: 'update',\n payload: req.payload,\n req,\n })\n versions = await getVersions({ id, collection, req })\n }\n\n const replacements = new Map<string, string>()\n for (const file of outgoing) {\n const identity = getStoredFileIdentity(file)\n const newestVersion = versions.find(({ version }) => {\n const stored = withLegacyUploadFileData({\n collection,\n config: req.payload.config,\n doc: version,\n })\n\n return collectStoredFiles({ collection, doc: stored, req }).some(\n (candidate) => getStoredFileIdentity(candidate) === identity,\n )\n })\n\n if (!newestVersion) {\n continue\n }\n\n const directory = path.posix.dirname(file.key)\n let archivedKey: string\n let suffix = 0\n\n while (true) {\n const archivedFilename = getArchivedFilename({\n filename: path.posix.basename(file.key),\n versionID: suffix ? `${newestVersion.id}-${suffix}` : newestVersion.id,\n })\n archivedKey = directory === '.' ? archivedFilename : `${directory}/${archivedFilename}`\n\n try {\n await copyLocalFile({\n from: file.key,\n staticDir: collection.upload.staticDir!,\n to: archivedKey,\n })\n break\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'EEXIST') {\n throw err\n }\n suffix += 1\n }\n }\n trackStagedObject({\n key: archivedKey,\n remove: () => fs.rm(path.join(collection.upload.staticDir!, archivedKey), { force: true }),\n })\n replacements.set(identity, archivedKey)\n }\n\n for (const row of versions) {\n const stored = withLegacyUploadFileData({\n collection,\n config: req.payload.config,\n doc: row.version,\n })\n const version = replaceStoredFileReferences({\n files: collectStoredFiles({ collection, doc: stored, req }),\n replacements,\n version: stored,\n })\n\n if (!version) {\n continue\n }\n\n await req.payload.db.updateVersion({\n id: row.id,\n collection: collection.slug,\n req,\n versionData: {\n ...(row[branchField] !== undefined ? { [branchField]: row[branchField] } : {}),\n ...(row[branchParentField] !== undefined\n ? { [branchParentField]: row[branchParentField] }\n : {}),\n createdAt: row.createdAt,\n latest: row.latest,\n parent: row.parent,\n publishedLocale: row.publishedLocale,\n updatedAt: row.updatedAt,\n version,\n },\n })\n }\n}\n\nconst getOutgoingLocalFiles = ({\n collection,\n config,\n current,\n next,\n req,\n}: {\n collection: SanitizedCollectionConfig\n config: Pick<Config, 'routes' | 'serverURL'>\n current: JsonObject\n next: JsonObject\n req: PayloadRequest\n}): StoredFileList => {\n const currentWithState = withLegacyUploadFileData({ collection, config, doc: current })\n const currentFiles = collectStoredFiles({ collection, doc: currentWithState, req })\n const nextFiles = collectStoredFiles({ collection, doc: next, req, trustGenerated: true })\n const nextIdentities = new Set(nextFiles.map(getStoredFileIdentity))\n return currentFiles.filter((file) => !nextIdentities.has(getStoredFileIdentity(file)))\n}\n\nconst getVersions = async ({\n id,\n collection,\n req,\n}: {\n collection: SanitizedCollectionConfig\n id: number | string\n req: PayloadRequest\n}): Promise<VersionRow[]> => {\n const versionParent = await resolveBranchRowID({\n id,\n collectionSlug: collection.slug,\n req,\n })\n const { docs } = await req.payload.db.findVersions<JsonObject>({\n branch: false,\n collection: collection.slug,\n limit: 0,\n pagination: false,\n req,\n sort: '-updatedAt',\n where: { parent: { equals: versionParent } },\n })\n\n return docs as VersionRow[]\n}\n\nexport const replaceStoredFileReferences = ({\n files,\n replacements,\n version,\n}: {\n files: StoredFileList\n replacements: Map<string, string>\n version: JsonObject\n}): JsonObject | undefined => {\n if (!files.length) {\n return\n }\n\n const archived = structuredClone(version)\n let hasChanged = false\n\n for (const file of files) {\n const archivedKey = replacements.get(getStoredFileIdentity(file))\n\n if (!archivedKey) {\n continue\n }\n\n const archivedFilename = path.posix.basename(archivedKey)\n\n for (const role of file.roles) {\n let stored: JsonObject | undefined\n switch (role.type) {\n case 'default':\n stored = archived\n break\n case 'original':\n stored = archived.original as JsonObject | undefined\n break\n case 'size':\n stored = (archived.variants as Record<string, JsonObject> | undefined)?.[role.sizeKey]\n break\n }\n\n if (typeof stored?.filename === 'string') {\n const previousFilename = stored.filename\n const directory = path.posix.dirname(previousFilename)\n const filename = directory === '.' ? archivedFilename : `${directory}/${archivedFilename}`\n stored.filename = filename\n stored.url = replaceURLFilename({\n filename,\n previousFilename,\n url: stored.url,\n })\n hasChanged = true\n }\n }\n }\n\n return hasChanged ? archived : undefined\n}\n\nconst replaceURLFilename = ({\n filename,\n previousFilename,\n url,\n}: {\n filename: string\n previousFilename: string\n url: unknown\n}): unknown => {\n if (typeof url !== 'string') {\n return url\n }\n\n const previous = encodeURIComponent(previousFilename)\n const index = url.lastIndexOf(`/${previous}`)\n\n return index < 0\n ? url\n : `${url.slice(0, index + 1)}${encodeURIComponent(filename)}${url.slice(index + 1 + previous.length)}`\n}\n"],"names":["fs","path","resolveBranchRowID","branchField","branchParentField","saveVersion","removeUnreferencedStagedObjects","scheduleUnreferencedFileCleanup","runFileOperationPlan","stageLocalUploadFiles","copyLocalFile","getArchivedFilename","collectStoredFiles","getStoredFileIdentity","withLegacyUploadFileData","runLocalFileUpdate","id","collection","current","files","next","req","write","storedCurrent","config","payload","doc","nextDoc","hasLocalFileChange","hasNewFiles","length","cleanupStagedAfterWriteFailure","objects","stage","trackStagedObject","staticDir","upload","archiveOutgoingLocalFiles","result","candidates","getOutgoingLocalFiles","disableLocalStorage","outgoing","versions","currentWithState","getVersions","docWithLocales","draft","operation","replacements","Map","file","identity","newestVersion","find","version","stored","some","candidate","directory","posix","dirname","key","archivedKey","suffix","archivedFilename","filename","basename","versionID","from","to","err","code","remove","rm","join","force","set","row","replaceStoredFileReferences","db","updateVersion","slug","versionData","undefined","createdAt","latest","parent","publishedLocale","updatedAt","currentFiles","nextFiles","trustGenerated","nextIdentities","Set","map","filter","has","versionParent","collectionSlug","docs","findVersions","branch","limit","pagination","sort","where","equals","archived","structuredClone","hasChanged","get","role","roles","type","original","variants","sizeKey","previousFilename","url","replaceURLFilename","previous","encodeURIComponent","index","lastIndexOf","slice"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/uploads/fileVersioning/archive.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { Config } from '../../config/types.js'\nimport type { JsonObject, PayloadRequest } from '../../types/index.js'\nimport type { FileToSave } from '../types.js'\nimport type { StagedObject } from './fileOperationManager.js'\nimport type { StoredFileList } from './types.js'\n\nimport { saveVersion } from '../../versions/saveVersion.js'\nimport { removeUnreferencedStagedObjects, scheduleUnreferencedFileCleanup } from './cleanup.js'\nimport { runFileOperationPlan, stageLocalUploadFiles } from './fileOperationManager.js'\nimport { copyLocalFile } from './localStorage.js'\nimport { getArchivedFilename } from './naming.js'\nimport {\n collectStoredFiles,\n getStoredFileIdentity,\n withLegacyUploadFileData,\n} from './storedFiles.js'\n\ntype VersionRow = {\n createdAt: string\n id: number | string\n latest?: boolean\n parent: number | string\n publishedLocale?: string\n updatedAt: string\n version: JsonObject\n}\n\nexport const runLocalFileUpdate = async <T>({\n id,\n collection,\n current,\n files,\n next,\n req,\n write,\n}: {\n collection: SanitizedCollectionConfig\n current: JsonObject\n files: FileToSave[]\n id: number | string\n next: JsonObject\n req: PayloadRequest\n write: () => Promise<T>\n}): Promise<T> => {\n const storedCurrent = withLegacyUploadFileData({\n collection,\n config: req.payload.config,\n doc: current,\n })\n const nextDoc = { ...storedCurrent, ...next }\n\n if (\n !hasLocalFileChange({\n collection,\n config: req.payload.config,\n current,\n hasNewFiles: files.length > 0,\n next: nextDoc,\n req,\n })\n ) {\n return write()\n }\n\n return runFileOperationPlan({\n cleanupStagedAfterWriteFailure: (objects) =>\n removeUnreferencedStagedObjects({ collection, objects, req }),\n req,\n stage: ({ trackStagedObject }) =>\n stageLocalUploadFiles({\n files,\n staticDir: collection.upload.staticDir!,\n trackStagedObject,\n }),\n write: async ({ trackStagedObject }) => {\n await archiveOutgoingLocalFiles({\n id,\n collection,\n current,\n next: nextDoc,\n req,\n trackStagedObject,\n })\n\n const result = await write()\n\n await scheduleUnreferencedFileCleanup({\n candidates: getOutgoingLocalFiles({\n collection,\n config: req.payload.config,\n current,\n next: nextDoc,\n req,\n }),\n collection,\n req,\n })\n\n return result\n },\n })\n}\n\n/** Also detects removals, which have no new upload to stage. */\nconst hasLocalFileChange = ({\n collection,\n config,\n current,\n hasNewFiles,\n next,\n req,\n}: {\n collection: SanitizedCollectionConfig\n config: Pick<Config, 'routes' | 'serverURL'>\n current: JsonObject\n hasNewFiles: boolean\n next: JsonObject\n req: PayloadRequest\n}): boolean =>\n !collection.upload.disableLocalStorage &&\n (hasNewFiles ||\n getOutgoingLocalFiles({\n collection,\n config,\n current,\n next,\n req,\n }).length > 0)\n\n/** Preserves outgoing local objects and repairs every retained version that referenced them. */\nexport const archiveOutgoingLocalFiles = async ({\n id,\n collection,\n current,\n next,\n req,\n trackStagedObject,\n}: {\n collection: SanitizedCollectionConfig\n current: JsonObject\n id: number | string\n next: JsonObject\n req: PayloadRequest\n trackStagedObject: (object: StagedObject) => void\n}): Promise<void> => {\n const outgoing = getOutgoingLocalFiles({\n collection,\n config: req.payload.config,\n current,\n next,\n req,\n })\n\n if (!outgoing.length || !collection.versions) {\n return\n }\n\n const currentWithState = withLegacyUploadFileData({\n collection,\n config: req.payload.config,\n doc: current,\n })\n let versions = await getVersions({ id, collection, req })\n\n if (!versions.length) {\n await saveVersion({\n id,\n collection,\n docWithLocales: currentWithState,\n draft: false,\n operation: 'update',\n payload: req.payload,\n req,\n })\n versions = await getVersions({ id, collection, req })\n }\n\n const replacements = new Map<string, string>()\n for (const file of outgoing) {\n const identity = getStoredFileIdentity(file)\n const newestVersion = versions.find(({ version }) => {\n const stored = withLegacyUploadFileData({\n collection,\n config: req.payload.config,\n doc: version,\n })\n\n return collectStoredFiles({ collection, doc: stored, req }).some(\n (candidate) => getStoredFileIdentity(candidate) === identity,\n )\n })\n\n if (!newestVersion) {\n continue\n }\n\n const directory = path.posix.dirname(file.key)\n let archivedKey: string\n let suffix = 0\n\n while (true) {\n const archivedFilename = getArchivedFilename({\n filename: path.posix.basename(file.key),\n versionID: suffix ? `${newestVersion.id}-${suffix}` : newestVersion.id,\n })\n archivedKey = directory === '.' ? archivedFilename : `${directory}/${archivedFilename}`\n\n try {\n await copyLocalFile({\n from: file.key,\n staticDir: collection.upload.staticDir!,\n to: archivedKey,\n })\n break\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'EEXIST') {\n throw err\n }\n suffix += 1\n }\n }\n trackStagedObject({\n key: archivedKey,\n remove: () => fs.rm(path.join(collection.upload.staticDir!, archivedKey), { force: true }),\n })\n replacements.set(identity, archivedKey)\n }\n\n for (const row of versions) {\n const stored = withLegacyUploadFileData({\n collection,\n config: req.payload.config,\n doc: row.version,\n })\n const version = replaceStoredFileReferences({\n files: collectStoredFiles({ collection, doc: stored, req }),\n replacements,\n version: stored,\n })\n\n if (!version) {\n continue\n }\n\n await req.payload.db.updateVersion({\n id: row.id,\n collection: collection.slug,\n req,\n versionData: {\n createdAt: row.createdAt,\n latest: row.latest,\n parent: row.parent,\n publishedLocale: row.publishedLocale,\n updatedAt: row.updatedAt,\n version,\n },\n })\n }\n}\n\nconst getOutgoingLocalFiles = ({\n collection,\n config,\n current,\n next,\n req,\n}: {\n collection: SanitizedCollectionConfig\n config: Pick<Config, 'routes' | 'serverURL'>\n current: JsonObject\n next: JsonObject\n req: PayloadRequest\n}): StoredFileList => {\n const currentWithState = withLegacyUploadFileData({ collection, config, doc: current })\n const currentFiles = collectStoredFiles({ collection, doc: currentWithState, req })\n const nextFiles = collectStoredFiles({ collection, doc: next, req, trustGenerated: true })\n const nextIdentities = new Set(nextFiles.map(getStoredFileIdentity))\n return currentFiles.filter((file) => !nextIdentities.has(getStoredFileIdentity(file)))\n}\n\nconst getVersions = async ({\n id,\n collection,\n req,\n}: {\n collection: SanitizedCollectionConfig\n id: number | string\n req: PayloadRequest\n}): Promise<VersionRow[]> => {\n const { docs } = await req.payload.db.findVersions<JsonObject>({\n collection: collection.slug,\n limit: 0,\n pagination: false,\n req,\n sort: '-updatedAt',\n where: { parent: { equals: id } },\n })\n\n return docs\n}\n\nexport const replaceStoredFileReferences = ({\n files,\n replacements,\n version,\n}: {\n files: StoredFileList\n replacements: Map<string, string>\n version: JsonObject\n}): JsonObject | undefined => {\n if (!files.length) {\n return\n }\n\n const archived = structuredClone(version)\n let hasChanged = false\n\n for (const file of files) {\n const archivedKey = replacements.get(getStoredFileIdentity(file))\n\n if (!archivedKey) {\n continue\n }\n\n const archivedFilename = path.posix.basename(archivedKey)\n\n for (const role of file.roles) {\n let stored: JsonObject | undefined\n switch (role.type) {\n case 'default':\n stored = archived\n break\n case 'original':\n stored = archived.original as JsonObject | undefined\n break\n case 'size':\n stored = (archived.variants as Record<string, JsonObject> | undefined)?.[role.sizeKey]\n break\n }\n\n if (typeof stored?.filename === 'string') {\n const previousFilename = stored.filename\n const directory = path.posix.dirname(previousFilename)\n const filename = directory === '.' ? archivedFilename : `${directory}/${archivedFilename}`\n stored.filename = filename\n stored.url = replaceURLFilename({\n filename,\n previousFilename,\n url: stored.url,\n })\n hasChanged = true\n }\n }\n }\n\n return hasChanged ? archived : undefined\n}\n\nconst replaceURLFilename = ({\n filename,\n previousFilename,\n url,\n}: {\n filename: string\n previousFilename: string\n url: unknown\n}): unknown => {\n if (typeof url !== 'string') {\n return url\n }\n\n const previous = encodeURIComponent(previousFilename)\n const index = url.lastIndexOf(`/${previous}`)\n\n return index < 0\n ? url\n : `${url.slice(0, index + 1)}${encodeURIComponent(filename)}${url.slice(index + 1 + previous.length)}`\n}\n"],"names":["fs","path","saveVersion","removeUnreferencedStagedObjects","scheduleUnreferencedFileCleanup","runFileOperationPlan","stageLocalUploadFiles","copyLocalFile","getArchivedFilename","collectStoredFiles","getStoredFileIdentity","withLegacyUploadFileData","runLocalFileUpdate","id","collection","current","files","next","req","write","storedCurrent","config","payload","doc","nextDoc","hasLocalFileChange","hasNewFiles","length","cleanupStagedAfterWriteFailure","objects","stage","trackStagedObject","staticDir","upload","archiveOutgoingLocalFiles","result","candidates","getOutgoingLocalFiles","disableLocalStorage","outgoing","versions","currentWithState","getVersions","docWithLocales","draft","operation","replacements","Map","file","identity","newestVersion","find","version","stored","some","candidate","directory","posix","dirname","key","archivedKey","suffix","archivedFilename","filename","basename","versionID","from","to","err","code","remove","rm","join","force","set","row","replaceStoredFileReferences","db","updateVersion","slug","versionData","createdAt","latest","parent","publishedLocale","updatedAt","currentFiles","nextFiles","trustGenerated","nextIdentities","Set","map","filter","has","docs","findVersions","limit","pagination","sort","where","equals","archived","structuredClone","hasChanged","get","role","roles","type","original","variants","sizeKey","previousFilename","url","replaceURLFilename","undefined","previous","encodeURIComponent","index","lastIndexOf","slice"],"mappings":"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"}
@@ -14,13 +14,6 @@ export declare const collectVersionFiles: ({ collection, parentID, req, where, }
14
14
  req: PayloadRequest;
15
15
  where?: Where;
16
16
  }) => Promise<StoredFileList>;
17
- /** Collects every stored file that can become unreferenced when a document is deleted. */
18
- export declare const collectDocumentDeleteFileCandidates: ({ collection, doc, parentID, req, }: {
19
- collection: SanitizedCollectionConfig;
20
- doc: JsonObject;
21
- parentID: number | string;
22
- req: PayloadRequest;
23
- }) => Promise<StoredFileList>;
24
17
  /** Confirms that deleted references have no survivors before and after commit. */
25
18
  export declare const scheduleUnreferencedFileCleanup: ({ candidates, collection, req, }: {
26
19
  candidates: StoredFileList;
@@ -1 +1 @@
1
- {"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../../src/uploads/fileVersioning/cleanup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAc,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,YAAY,CAAA;AAY5D,eAAO,MAAM,kBAAkB,8BAI5B;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,GAAG,EAAE,UAAU,CAAA;IACf,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,OAAO,CAAC,cAAc,CAQzB,CAAA;AAED,qFAAqF;AACrF,eAAO,MAAM,mBAAmB,0CAK7B;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,GAAG,EAAE,cAAc,CAAA;IACnB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,KAAG,OAAO,CAAC,cAAc,CAwBzB,CAAA;AAED,0FAA0F;AAC1F,eAAO,MAAM,mCAAmC,wCAK7C;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,GAAG,EAAE,UAAU,CAAA;IACf,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,OAAO,CAAC,cAAc,CAGzB,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,+BAA+B,qCAIzC;IACD,UAAU,EAAE,cAAc,CAAA;IAC1B,UAAU,EAAE,yBAAyB,CAAA;IACrC,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,OAAO,CAAC,IAAI,CAmCf,CAAA;AAED,uGAAuG;AACvG,eAAO,MAAM,+BAA+B,kCAIzC;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,OAAO,CAAC,IAAI,CAsBf,CAAA"}
1
+ {"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../../src/uploads/fileVersioning/cleanup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAc,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,YAAY,CAAA;AAY5D,eAAO,MAAM,kBAAkB,8BAI5B;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,GAAG,EAAE,UAAU,CAAA;IACf,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,OAAO,CAAC,cAAc,CAQzB,CAAA;AAED,qFAAqF;AACrF,eAAO,MAAM,mBAAmB,0CAK7B;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,GAAG,EAAE,cAAc,CAAA;IACnB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,KAAG,OAAO,CAAC,cAAc,CAwBzB,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,+BAA+B,qCAIzC;IACD,UAAU,EAAE,cAAc,CAAA;IAC1B,UAAU,EAAE,yBAAyB,CAAA;IACrC,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,OAAO,CAAC,IAAI,CAmCf,CAAA;AAED,uGAAuG;AACvG,eAAO,MAAM,+BAA+B,kCAIzC;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,OAAO,CAAC,IAAI,CAsBf,CAAA"}
@@ -53,18 +53,6 @@ export const collectStoredFiles = async ({ collection, doc, req })=>{
53
53
  page += 1;
54
54
  }
55
55
  };
56
- /** Collects every stored file that can become unreferenced when a document is deleted. */ export const collectDocumentDeleteFileCandidates = async ({ collection, doc, parentID, req })=>[
57
- ...await collectStoredFiles({
58
- collection,
59
- doc,
60
- req
61
- }),
62
- ...collection.versions ? await collectVersionFiles({
63
- collection,
64
- parentID,
65
- req
66
- }) : []
67
- ];
68
56
  /** Confirms that deleted references have no survivors before and after commit. */ export const scheduleUnreferencedFileCleanup = async ({ candidates, collection, req })=>{
69
57
  const unique = new Map(candidates.map((file)=>[
70
58
  getStoredFileIdentity(file),