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
@@ -9,7 +9,6 @@ export type GetInitialTreeDataArgs = {
9
9
  filterByCollections?: string[];
10
10
  limit?: number;
11
11
  payload: PayloadRequest['payload'];
12
- req?: PayloadRequest;
13
12
  /** The currently selected node ID. When provided, ensures siblings are loaded to include this node. */
14
13
  selectedNodeId?: null | number | string;
15
14
  /** The parent ID of the selected node. Required when selectedNodeId is provided. */
@@ -17,7 +16,6 @@ export type GetInitialTreeDataArgs = {
17
16
  user: PayloadRequest['user'];
18
17
  };
19
18
  export type InitialTreeData = {
20
- branch: null | string;
21
19
  docs: TypeWithID[];
22
20
  loadedParents: Record<string, {
23
21
  hasMore: boolean;
@@ -25,5 +23,5 @@ export type InitialTreeData = {
25
23
  totalDocs: number;
26
24
  }>;
27
25
  };
28
- export declare const getInitialTreeData: ({ baseFilter, collectionSlug, expandedNodeIds, filterByCollections, limit, payload, req, selectedNodeId, selectedNodeParentId, user, }: GetInitialTreeDataArgs) => Promise<InitialTreeData>;
26
+ export declare const getInitialTreeData: ({ baseFilter, collectionSlug, expandedNodeIds, filterByCollections, limit, payload, selectedNodeId, selectedNodeParentId, user, }: GetInitialTreeDataArgs) => Promise<InitialTreeData>;
29
27
  //# sourceMappingURL=getInitialTreeData.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getInitialTreeData.d.ts","sourceRoot":"","sources":["../../src/hierarchy/getInitialTreeData.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAK9D,MAAM,MAAM,sBAAsB,GAAG;IACnC,gEAAgE;IAChE,UAAU,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IACrC,+FAA+F;IAC/F,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAA;IAClC,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,uGAAuG;IACvG,cAAc,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;IACvC,oFAAoF;IACpF,oBAAoB,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;IAC7C,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,IAAI,GAAG,MAAM,CAAA;IACrB,IAAI,EAAE,UAAU,EAAE,CAAA;IAElB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC7F,CAAA;AAED,eAAO,MAAM,kBAAkB,2IAW5B,sBAAsB,KAAG,OAAO,CAAC,eAAe,CA4IlD,CAAA"}
1
+ {"version":3,"file":"getInitialTreeData.d.ts","sourceRoot":"","sources":["../../src/hierarchy/getInitialTreeData.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAI9D,MAAM,MAAM,sBAAsB,GAAG;IACnC,gEAAgE;IAChE,UAAU,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IACrC,+FAA+F;IAC/F,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAA;IAClC,uGAAuG;IACvG,cAAc,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;IACvC,oFAAoF;IACpF,oBAAoB,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;IAC7C,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,UAAU,EAAE,CAAA;IAElB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC7F,CAAA;AAED,eAAO,MAAM,kBAAkB,sIAU5B,sBAAsB,KAAG,OAAO,CAAC,eAAe,CA0IlD,CAAA"}
@@ -1,6 +1,5 @@
1
- import { MAIN_BRANCH } from '../branching/types.js';
2
1
  import { DEFAULT_HIERARCHY_TREE_LIMIT } from '../hierarchy/constants.js';
3
- export const getInitialTreeData = async ({ baseFilter, collectionSlug, expandedNodeIds = [], filterByCollections, limit, payload, req, selectedNodeId, selectedNodeParentId, user })=>{
2
+ export const getInitialTreeData = async ({ baseFilter, collectionSlug, expandedNodeIds = [], filterByCollections, limit, payload, selectedNodeId, selectedNodeParentId, user })=>{
4
3
  const collectionConfig = payload.collections[collectionSlug]?.config;
5
4
  if (!collectionConfig || !collectionConfig.hierarchy) {
6
5
  throw new Error(`Collection ${collectionSlug} is not a hierarchy`);
@@ -76,7 +75,6 @@ export const getInitialTreeData = async ({ baseFilter, collectionSlug, expandedN
76
75
  limit: effectiveLimit,
77
76
  overrideAccess: false,
78
77
  page: currentPage,
79
- req,
80
78
  sort: useAsTitle,
81
79
  user,
82
80
  where: whereClause
@@ -119,7 +117,6 @@ export const getInitialTreeData = async ({ baseFilter, collectionSlug, expandedN
119
117
  });
120
118
  }
121
119
  return {
122
- branch: req?.branch && req.branch !== MAIN_BRANCH ? req.branch : null,
123
120
  docs: allDocs,
124
121
  loadedParents
125
122
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hierarchy/getInitialTreeData.ts"],"sourcesContent":["import type { TypeWithID } from '../collections/config/types.js'\nimport type { PayloadRequest, Where } from '../types/index.js'\n\nimport { MAIN_BRANCH } from '../branching/types.js'\nimport { DEFAULT_HIERARCHY_TREE_LIMIT } from '../hierarchy/constants.js'\n\nexport type GetInitialTreeDataArgs = {\n /** Base filter to apply to all queries (e.g., tenant filter) */\n baseFilter?: null | Where\n collectionSlug: string\n expandedNodeIds?: (number | string)[]\n /** Filter tree to only show folders that allow these collection types (or are unrestricted) */\n filterByCollections?: string[]\n limit?: number\n payload: PayloadRequest['payload']\n req?: PayloadRequest\n /** The currently selected node ID. When provided, ensures siblings are loaded to include this node. */\n selectedNodeId?: null | number | string\n /** The parent ID of the selected node. Required when selectedNodeId is provided. */\n selectedNodeParentId?: null | number | string\n user: PayloadRequest['user']\n}\n\nexport type InitialTreeData = {\n branch: null | string\n docs: TypeWithID[]\n // Metadata about what was loaded - keyed by parent ID ('null' for root)\n loadedParents: Record<string, { hasMore: boolean; loadedCount?: number; totalDocs: number }>\n}\n\nexport const getInitialTreeData = async ({\n baseFilter,\n collectionSlug,\n expandedNodeIds = [],\n filterByCollections,\n limit,\n payload,\n req,\n selectedNodeId,\n selectedNodeParentId,\n user,\n}: GetInitialTreeDataArgs): Promise<InitialTreeData> => {\n const collectionConfig = payload.collections[collectionSlug]?.config\n\n if (!collectionConfig || !collectionConfig.hierarchy) {\n throw new Error(`Collection ${collectionSlug} is not a hierarchy`)\n }\n\n const hierarchyConfig = collectionConfig.hierarchy\n const parentFieldName = hierarchyConfig.parentFieldName\n const useAsTitle = collectionConfig.admin?.useAsTitle ?? 'id'\n\n // Get typeFieldName for filtering\n const typeFieldName =\n hierarchyConfig.collectionSpecific && typeof hierarchyConfig.collectionSpecific === 'object'\n ? hierarchyConfig.collectionSpecific.fieldName\n : undefined\n\n // Build filter condition if filterByCollections is provided\n // Exclude the hierarchy collection itself (folders always show folders)\n const filteredTypes = filterByCollections?.filter((t) => t !== collectionSlug)\n\n // Get all possible type values from relatedCollections for detecting empty arrays\n const allPossibleTypes = hierarchyConfig.relatedCollections\n ? Object.keys(hierarchyConfig.relatedCollections)\n : []\n\n const filterCondition =\n filteredTypes?.length && typeFieldName\n ? {\n or: [\n { [typeFieldName]: { in: filteredTypes } },\n { [typeFieldName]: { exists: false } }, // Include unrestricted folders (field doesn't exist)\n // Include unrestricted folders with empty allowedTypes array\n // Using not_in with all possible values matches empty arrays in both MongoDB and Postgres\n ...(allPossibleTypes.length > 0\n ? [{ [typeFieldName]: { not_in: allPossibleTypes } }]\n : []),\n ],\n }\n : null\n\n // Use limit from config if not provided, fallback to config's treeLimit\n const effectiveLimit = limit ?? hierarchyConfig.admin?.treeLimit ?? DEFAULT_HIERARCHY_TREE_LIMIT\n\n const allDocs: TypeWithID[] = []\n const loadedParents: Record<\n string,\n { hasMore: boolean; loadedCount: number; totalDocs: number }\n > = {}\n\n // Normalize selectedNodeParentId: treat null/undefined as 'null' (root level)\n const normalizedSelectedParentId =\n selectedNodeParentId === null || selectedNodeParentId === undefined\n ? 'null'\n : String(selectedNodeParentId)\n\n // Helper to check if selectedNodeId is among siblings at a given parent level\n const needsSelectedNodeIncluded = (parentKey: string): boolean => {\n return !!selectedNodeId && normalizedSelectedParentId === parentKey\n }\n\n // Helper to fetch children with optional selectedNodeId inclusion\n const fetchChildrenForParent = async (\n parentKey: string,\n parentCondition: Where,\n ): Promise<void> => {\n const mustIncludeSelected = needsSelectedNodeIncluded(parentKey)\n let accumulatedDocs: TypeWithID[] = []\n let currentPage = 1\n let hasMore = true\n let totalDocs = 0\n let foundSelected = false\n\n // Combine parent condition with filter condition and baseFilter\n const conditions: Where[] = [parentCondition]\n if (filterCondition) {\n conditions.push(filterCondition)\n }\n if (baseFilter) {\n conditions.push(baseFilter)\n }\n const whereClause = conditions.length > 1 ? { and: conditions } : parentCondition\n\n while (hasMore) {\n const result = await payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: effectiveLimit,\n overrideAccess: false,\n page: currentPage,\n req,\n sort: useAsTitle,\n user,\n where: whereClause,\n })\n\n accumulatedDocs = [...accumulatedDocs, ...result.docs]\n totalDocs = result.totalDocs\n hasMore = result.hasNextPage\n\n // Check if selectedNodeId is in this page's results\n if (mustIncludeSelected && !foundSelected) {\n foundSelected = result.docs.some(\n (doc: TypeWithID) => String(doc.id) === String(selectedNodeId),\n )\n }\n\n // Stop if we've found the selected node OR we only need first page\n if (!mustIncludeSelected || foundSelected || !hasMore) {\n break\n }\n\n currentPage++\n }\n\n allDocs.push(...accumulatedDocs)\n loadedParents[parentKey] = {\n hasMore,\n loadedCount: accumulatedDocs.length,\n totalDocs,\n }\n }\n\n // Query 1: Fetch root nodes\n await fetchChildrenForParent('null', {\n [parentFieldName]: { exists: false },\n })\n\n // Query 2: For each expanded node, fetch its children\n for (const parentId of expandedNodeIds) {\n await fetchChildrenForParent(String(parentId), {\n [parentFieldName]: { equals: parentId },\n })\n }\n\n return {\n branch: req?.branch && req.branch !== MAIN_BRANCH ? req.branch : null,\n docs: allDocs,\n loadedParents,\n }\n}\n"],"names":["MAIN_BRANCH","DEFAULT_HIERARCHY_TREE_LIMIT","getInitialTreeData","baseFilter","collectionSlug","expandedNodeIds","filterByCollections","limit","payload","req","selectedNodeId","selectedNodeParentId","user","collectionConfig","collections","config","hierarchy","Error","hierarchyConfig","parentFieldName","useAsTitle","admin","typeFieldName","collectionSpecific","fieldName","undefined","filteredTypes","filter","t","allPossibleTypes","relatedCollections","Object","keys","filterCondition","length","or","in","exists","not_in","effectiveLimit","treeLimit","allDocs","loadedParents","normalizedSelectedParentId","String","needsSelectedNodeIncluded","parentKey","fetchChildrenForParent","parentCondition","mustIncludeSelected","accumulatedDocs","currentPage","hasMore","totalDocs","foundSelected","conditions","push","whereClause","and","result","find","collection","depth","overrideAccess","page","sort","where","docs","hasNextPage","some","doc","id","loadedCount","parentId","equals","branch"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/hierarchy/getInitialTreeData.ts"],"sourcesContent":["import type { TypeWithID } from '../collections/config/types.js'\nimport type { PayloadRequest, Where } from '../types/index.js'\n\nimport { DEFAULT_HIERARCHY_TREE_LIMIT } from '../hierarchy/constants.js'\n\nexport type GetInitialTreeDataArgs = {\n /** Base filter to apply to all queries (e.g., tenant filter) */\n baseFilter?: null | Where\n collectionSlug: string\n expandedNodeIds?: (number | string)[]\n /** Filter tree to only show folders that allow these collection types (or are unrestricted) */\n filterByCollections?: string[]\n limit?: number\n payload: PayloadRequest['payload']\n /** The currently selected node ID. When provided, ensures siblings are loaded to include this node. */\n selectedNodeId?: null | number | string\n /** The parent ID of the selected node. Required when selectedNodeId is provided. */\n selectedNodeParentId?: null | number | string\n user: PayloadRequest['user']\n}\n\nexport type InitialTreeData = {\n docs: TypeWithID[]\n // Metadata about what was loaded - keyed by parent ID ('null' for root)\n loadedParents: Record<string, { hasMore: boolean; loadedCount?: number; totalDocs: number }>\n}\n\nexport const getInitialTreeData = async ({\n baseFilter,\n collectionSlug,\n expandedNodeIds = [],\n filterByCollections,\n limit,\n payload,\n selectedNodeId,\n selectedNodeParentId,\n user,\n}: GetInitialTreeDataArgs): Promise<InitialTreeData> => {\n const collectionConfig = payload.collections[collectionSlug]?.config\n\n if (!collectionConfig || !collectionConfig.hierarchy) {\n throw new Error(`Collection ${collectionSlug} is not a hierarchy`)\n }\n\n const hierarchyConfig = collectionConfig.hierarchy\n const parentFieldName = hierarchyConfig.parentFieldName\n const useAsTitle = collectionConfig.admin?.useAsTitle ?? 'id'\n\n // Get typeFieldName for filtering\n const typeFieldName =\n hierarchyConfig.collectionSpecific && typeof hierarchyConfig.collectionSpecific === 'object'\n ? hierarchyConfig.collectionSpecific.fieldName\n : undefined\n\n // Build filter condition if filterByCollections is provided\n // Exclude the hierarchy collection itself (folders always show folders)\n const filteredTypes = filterByCollections?.filter((t) => t !== collectionSlug)\n\n // Get all possible type values from relatedCollections for detecting empty arrays\n const allPossibleTypes = hierarchyConfig.relatedCollections\n ? Object.keys(hierarchyConfig.relatedCollections)\n : []\n\n const filterCondition =\n filteredTypes?.length && typeFieldName\n ? {\n or: [\n { [typeFieldName]: { in: filteredTypes } },\n { [typeFieldName]: { exists: false } }, // Include unrestricted folders (field doesn't exist)\n // Include unrestricted folders with empty allowedTypes array\n // Using not_in with all possible values matches empty arrays in both MongoDB and Postgres\n ...(allPossibleTypes.length > 0\n ? [{ [typeFieldName]: { not_in: allPossibleTypes } }]\n : []),\n ],\n }\n : null\n\n // Use limit from config if not provided, fallback to config's treeLimit\n const effectiveLimit = limit ?? hierarchyConfig.admin?.treeLimit ?? DEFAULT_HIERARCHY_TREE_LIMIT\n\n const allDocs: TypeWithID[] = []\n const loadedParents: Record<\n string,\n { hasMore: boolean; loadedCount: number; totalDocs: number }\n > = {}\n\n // Normalize selectedNodeParentId: treat null/undefined as 'null' (root level)\n const normalizedSelectedParentId =\n selectedNodeParentId === null || selectedNodeParentId === undefined\n ? 'null'\n : String(selectedNodeParentId)\n\n // Helper to check if selectedNodeId is among siblings at a given parent level\n const needsSelectedNodeIncluded = (parentKey: string): boolean => {\n return !!selectedNodeId && normalizedSelectedParentId === parentKey\n }\n\n // Helper to fetch children with optional selectedNodeId inclusion\n const fetchChildrenForParent = async (\n parentKey: string,\n parentCondition: Where,\n ): Promise<void> => {\n const mustIncludeSelected = needsSelectedNodeIncluded(parentKey)\n let accumulatedDocs: TypeWithID[] = []\n let currentPage = 1\n let hasMore = true\n let totalDocs = 0\n let foundSelected = false\n\n // Combine parent condition with filter condition and baseFilter\n const conditions: Where[] = [parentCondition]\n if (filterCondition) {\n conditions.push(filterCondition)\n }\n if (baseFilter) {\n conditions.push(baseFilter)\n }\n const whereClause = conditions.length > 1 ? { and: conditions } : parentCondition\n\n while (hasMore) {\n const result = await payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: effectiveLimit,\n overrideAccess: false,\n page: currentPage,\n sort: useAsTitle,\n user,\n where: whereClause,\n })\n\n accumulatedDocs = [...accumulatedDocs, ...result.docs]\n totalDocs = result.totalDocs\n hasMore = result.hasNextPage\n\n // Check if selectedNodeId is in this page's results\n if (mustIncludeSelected && !foundSelected) {\n foundSelected = result.docs.some(\n (doc: TypeWithID) => String(doc.id) === String(selectedNodeId),\n )\n }\n\n // Stop if we've found the selected node OR we only need first page\n if (!mustIncludeSelected || foundSelected || !hasMore) {\n break\n }\n\n currentPage++\n }\n\n allDocs.push(...accumulatedDocs)\n loadedParents[parentKey] = {\n hasMore,\n loadedCount: accumulatedDocs.length,\n totalDocs,\n }\n }\n\n // Query 1: Fetch root nodes\n await fetchChildrenForParent('null', {\n [parentFieldName]: { exists: false },\n })\n\n // Query 2: For each expanded node, fetch its children\n for (const parentId of expandedNodeIds) {\n await fetchChildrenForParent(String(parentId), {\n [parentFieldName]: { equals: parentId },\n })\n }\n\n return {\n docs: allDocs,\n loadedParents,\n }\n}\n"],"names":["DEFAULT_HIERARCHY_TREE_LIMIT","getInitialTreeData","baseFilter","collectionSlug","expandedNodeIds","filterByCollections","limit","payload","selectedNodeId","selectedNodeParentId","user","collectionConfig","collections","config","hierarchy","Error","hierarchyConfig","parentFieldName","useAsTitle","admin","typeFieldName","collectionSpecific","fieldName","undefined","filteredTypes","filter","t","allPossibleTypes","relatedCollections","Object","keys","filterCondition","length","or","in","exists","not_in","effectiveLimit","treeLimit","allDocs","loadedParents","normalizedSelectedParentId","String","needsSelectedNodeIncluded","parentKey","fetchChildrenForParent","parentCondition","mustIncludeSelected","accumulatedDocs","currentPage","hasMore","totalDocs","foundSelected","conditions","push","whereClause","and","result","find","collection","depth","overrideAccess","page","sort","where","docs","hasNextPage","some","doc","id","loadedCount","parentId","equals"],"mappings":"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"}
@@ -93,7 +93,7 @@ import { injectHierarchyButton } from './injectHierarchyButton.js';
93
93
  if (hierarchyConfig.collectionSpecific) {
94
94
  injectTypeField({
95
95
  config,
96
- hierarchyCollection: hierarchyCollection,
96
+ hierarchyCollection,
97
97
  parentFieldName: hierarchyConfig.parentFieldName,
98
98
  sanitizedRelatedCollections,
99
99
  typeFieldName: hierarchyConfig.collectionSpecific.fieldName
@@ -116,7 +116,7 @@ import { injectHierarchyButton } from './injectHierarchyButton.js';
116
116
  // Add afterDelete hook to clear folder references from related documents
117
117
  if (Object.keys(sanitizedRelatedCollections).length > 0) {
118
118
  injectAfterDeleteHook({
119
- hierarchyCollection: hierarchyCollection,
119
+ hierarchyCollection,
120
120
  sanitizedRelatedCollections
121
121
  });
122
122
  }
@@ -233,7 +233,13 @@ const validateCollectionSpecificHierarchy = async ({ hierarchySlug, options, typ
233
233
  options: collectionOptions
234
234
  };
235
235
  hierarchyCollection.fields = hierarchyCollection.fields || [];
236
- hierarchyCollection.fields.push(typeField);
236
+ // This can run again on the same `fields` array, so replace the field if it already exists
237
+ const existingTypeFieldIndex = hierarchyCollection.fields.findIndex((field)=>fieldAffectsData(field) && field.name === typeFieldName);
238
+ if (existingTypeFieldIndex === -1) {
239
+ hierarchyCollection.fields.push(typeField);
240
+ } else {
241
+ hierarchyCollection.fields[existingTypeFieldIndex] = typeField;
242
+ }
237
243
  // Recompute flattenedFields since we added a field after initial sanitization
238
244
  // This is required for the field to be queryable
239
245
  if ('flattenedFields' in hierarchyCollection) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hierarchy/resolveHierarchyCollections.ts"],"sourcesContent":["import type { CollectionConfig, SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { Config } from '../config/types.js'\nimport type {\n JoinField,\n Option,\n RelationshipField,\n SelectField,\n Validate,\n} from '../fields/config/types.js'\nimport type { Document } from '../types/index.js'\nimport type {\n HierarchyJoinFieldConfig,\n SanitizedHierarchyConfig,\n SanitizedHierarchyRelatedCollection,\n} from './types.js'\n\nimport { sanitizeJoinField } from '../fields/config/sanitizeJoinField.js'\nimport { fieldAffectsData } from '../fields/config/types.js'\nimport { extractID } from '../utilities/extractID.js'\nimport { flattenAllFields } from '../utilities/flattenAllFields.js'\nimport { getHierarchyFieldName } from './constants.js'\nimport { hierarchyCollectionAfterDelete } from './hooks/collectionAfterDelete.js'\nimport { injectHierarchyButton } from './injectHierarchyButton.js'\n\n/**\n * Resolves hierarchy relationships across collections.\n *\n * This function runs after individual collection sanitization to establish\n * cross-collection hierarchy relationships. It discovers which collections\n * reference each hierarchy and configures the necessary fields, components,\n * and hooks.\n *\n * @remarks\n * Must be called after all collections are sanitized.\n *\n * **What it does:**\n * - Discovers related collections by scanning for hierarchy relationship fields\n * - Injects `HierarchyButton` component when `custom.hierarchy.injectHeaderButton` is set\n * - Adds `collectionSpecific` validation to ensure hierarchy items accept the document type\n * - Injects the `hierarchyType` select field when `collectionSpecific` is enabled\n * - Injects join field when `joinField` is configured\n * - Adds `afterDelete` hook to clear hierarchy references when items are deleted\n * - Populates `relatedCollections` in the sanitized hierarchy config\n */\nexport const resolveHierarchyCollections = (config: Config): void => {\n const hierarchyCollections =\n config.collections?.filter((col) => col.hierarchy && typeof col.hierarchy === 'object') || []\n\n for (const hierarchyCollection of hierarchyCollections) {\n const hierarchy = hierarchyCollection.hierarchy\n\n // TypeScript guard - hierarchy is guaranteed to be an object by the filter above\n if (!hierarchy || typeof hierarchy !== 'object') {\n continue\n }\n\n const hierarchyConfig = hierarchy as SanitizedHierarchyConfig\n const defaultFieldName = getHierarchyFieldName(hierarchyCollection.slug)\n const parentFieldName = hierarchyConfig.parentFieldName ?? defaultFieldName\n const isParentFieldNameOverridden = parentFieldName !== defaultFieldName\n const collectionSpecific = hierarchyConfig.collectionSpecific\n const typeFieldName = collectionSpecific ? collectionSpecific.fieldName : undefined\n const allowHasMany = hierarchyConfig.allowHasMany ?? true\n\n // Build relatedCollections by scanning all collections for hierarchy fields\n const sanitizedRelatedCollections: Record<string, SanitizedHierarchyRelatedCollection> = {}\n\n const selfParentField = hierarchyCollection.fields.find(\n (field) =>\n fieldAffectsData(field) &&\n field.name === parentFieldName &&\n field.type === 'relationship' &&\n (field as RelationshipField).relationTo === hierarchyCollection.slug,\n ) as RelationshipField | undefined\n\n // Check if the hierarchy collection's own parent field should be replaced with a header button\n if (selfParentField?.custom?.hierarchy?.injectHeaderButton === true) {\n injectHierarchyButton({\n collection: hierarchyCollection,\n fieldName: parentFieldName,\n hierarchyCollectionSlug: hierarchyCollection.slug,\n parentFieldName: hierarchyConfig.parentFieldName,\n })\n }\n\n for (const collection of config.collections || []) {\n // Skip the hierarchy collection itself (handled above)\n if (collection.slug === hierarchyCollection.slug) {\n continue\n }\n\n // Find hierarchy field by the default name (what createFolderField uses)\n const hierarchyField = collection.fields.find(\n (field) =>\n fieldAffectsData(field) &&\n field.name === defaultFieldName &&\n field.type === 'relationship' &&\n (field as RelationshipField).relationTo === hierarchyCollection.slug,\n ) as RelationshipField | undefined\n\n // If parentFieldName is overridden, rename the field to match\n if (hierarchyField && isParentFieldNameOverridden) {\n hierarchyField.name = parentFieldName\n }\n\n if (!hierarchyField) {\n continue\n }\n\n const fieldHasMany = hierarchyField.hasMany ?? allowHasMany\n\n // If collectionSpecific, inject validation to check hierarchy allows this collection type\n if (collectionSpecific) {\n injectCollectionSpecificValidation({\n hierarchyField,\n hierarchySlug: hierarchyCollection.slug,\n typeFieldName: typeFieldName!,\n })\n }\n\n // Store discovered collection with hasMany info\n sanitizedRelatedCollections[collection.slug] = {\n fieldName: parentFieldName,\n hasMany: fieldHasMany,\n }\n\n // Inject HierarchyButton if field requests it\n if (hierarchyField.custom?.hierarchy?.injectHeaderButton === true) {\n injectHierarchyButton({\n collection,\n fieldName: parentFieldName,\n hierarchyCollectionSlug: hierarchyCollection.slug,\n parentFieldName: hierarchyConfig.parentFieldName,\n })\n }\n }\n\n // If collectionSpecific, add type field to hierarchy collection\n if (hierarchyConfig.collectionSpecific) {\n injectTypeField({\n config,\n hierarchyCollection: hierarchyCollection as SanitizedCollectionConfig,\n parentFieldName: hierarchyConfig.parentFieldName,\n sanitizedRelatedCollections,\n typeFieldName: hierarchyConfig.collectionSpecific.fieldName,\n })\n }\n\n // If joinField is configured, add the join field to query children\n if (hierarchyConfig.joinField) {\n injectJoinField({\n config,\n hierarchyCollection: hierarchyCollection as SanitizedCollectionConfig,\n joinFieldConfig: hierarchyConfig.joinField,\n parentFieldName,\n relatedSlugs: Object.keys(sanitizedRelatedCollections),\n })\n }\n\n // Update hierarchy config with sanitized relatedCollections\n if (hierarchyConfig) {\n hierarchyConfig.relatedCollections = sanitizedRelatedCollections\n }\n\n // Add afterDelete hook to clear folder references from related documents\n if (Object.keys(sanitizedRelatedCollections).length > 0) {\n injectAfterDeleteHook({\n hierarchyCollection: hierarchyCollection as SanitizedCollectionConfig,\n sanitizedRelatedCollections,\n })\n }\n\n // Add sidebar tab for this hierarchy collection (unless explicitly disabled)\n if (hierarchyConfig.admin.injectSidebarTab !== false) {\n injectSidebarTab({\n config,\n hierarchyCollection,\n hierarchyConfig,\n })\n\n // Hide from nav when sidebar tab is injected (unless user explicitly set group)\n if (hierarchyCollection.admin?.group === undefined) {\n hierarchyCollection.admin = {\n ...hierarchyCollection.admin,\n group: false,\n }\n }\n }\n }\n}\n\n/**\n * Injects validation for collectionSpecific hierarchy fields.\n * Ensures the selected hierarchy item allows documents of this collection type.\n */\nfunction injectCollectionSpecificValidation({\n hierarchyField,\n hierarchySlug,\n typeFieldName,\n}: {\n hierarchyField: RelationshipField\n hierarchySlug: string\n typeFieldName: string\n}): void {\n const existingValidate = hierarchyField.validate\n\n const validate: Validate<unknown> = async (value, options) => {\n // Run existing validation first if present\n if (existingValidate) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const existingResult = await existingValidate(value as any, options as any)\n if (existingResult !== true) {\n return existingResult\n }\n }\n\n return validateCollectionSpecificHierarchy({\n hierarchySlug,\n options,\n typeFieldName,\n value,\n })\n }\n\n hierarchyField.validate = validate\n}\n\ntype HierarchyValidationOptions = Parameters<Validate<unknown>>[1]\n\nconst validateCollectionSpecificHierarchy = async ({\n hierarchySlug,\n options,\n typeFieldName,\n value,\n}: {\n hierarchySlug: string\n options: HierarchyValidationOptions\n typeFieldName: string\n value: unknown\n}): Promise<string | true> => {\n if (!value || (Array.isArray(value) && value.length === 0)) {\n return true\n }\n\n const { collectionSlug, overrideAccess, previousValue, req } = options\n const newIDs = (Array.isArray(value) ? value : [value]).map((item) => extractID<Document>(item))\n\n const previousIDs = new Set(\n (Array.isArray(previousValue) ? previousValue : previousValue ? [previousValue] : []).map(\n (item) => extractID<Document>(item),\n ),\n )\n\n for (const newID of newIDs) {\n if (previousIDs.has(newID)) {\n continue\n }\n\n let parentItem: Document | null = null\n if (typeof newID === 'string' || typeof newID === 'number') {\n try {\n parentItem = await req.payload.findByID({\n id: newID,\n collection: hierarchySlug,\n depth: 0,\n overrideAccess: overrideAccess ?? false,\n req,\n select: { [typeFieldName]: true },\n })\n } catch {\n return `Hierarchy item with ID ${newID} not found`\n }\n }\n\n if (!parentItem) {\n return `Hierarchy item with ID ${newID} not found`\n }\n\n const allowedTypes: string[] = (parentItem[typeFieldName] as string[]) || []\n\n if (allowedTypes.length === 0 || (collectionSlug && allowedTypes.includes(collectionSlug))) {\n continue\n }\n\n return `Hierarchy item \"${newID}\" does not allow documents of type \"${collectionSlug}\"`\n }\n\n return true\n}\n\n/**\n * Injects the hierarchyType select field into a hierarchy collection.\n */\nfunction injectTypeField({\n config,\n hierarchyCollection,\n parentFieldName,\n sanitizedRelatedCollections,\n typeFieldName,\n}: {\n config: Config\n hierarchyCollection: CollectionConfig | SanitizedCollectionConfig\n parentFieldName: string\n sanitizedRelatedCollections: Record<string, SanitizedHierarchyRelatedCollection>\n typeFieldName: string\n}): void {\n const collectionOptions: Option[] = Object.keys(sanitizedRelatedCollections).map((slug) => {\n const relatedCollection = config.collections?.find((c) => c.slug === slug)\n\n return {\n label: relatedCollection?.labels?.plural || slug,\n value: slug,\n }\n })\n\n const typeField: SelectField = {\n name: typeFieldName,\n type: 'select',\n admin: {\n components: {\n Field: {\n path: '@payloadcms/ui/rsc#HierarchyTypeFieldServer',\n serverProps: {\n collectionOptions,\n parentFieldName,\n },\n },\n },\n position: 'sidebar',\n },\n hasMany: true,\n label: ({ t }) => t('general:allowedTypes'),\n options: collectionOptions,\n }\n\n hierarchyCollection.fields = hierarchyCollection.fields || []\n hierarchyCollection.fields.push(typeField)\n\n // Recompute flattenedFields since we added a field after initial sanitization\n // This is required for the field to be queryable\n if ('flattenedFields' in hierarchyCollection) {\n hierarchyCollection.flattenedFields = flattenAllFields({\n fields: hierarchyCollection.fields,\n })\n }\n}\n\n/**\n * Injects a join field to query all children of a hierarchy item.\n */\nfunction injectJoinField({\n config,\n hierarchyCollection,\n joinFieldConfig,\n parentFieldName,\n relatedSlugs,\n}: {\n config: Config\n hierarchyCollection: SanitizedCollectionConfig\n joinFieldConfig: HierarchyJoinFieldConfig\n parentFieldName: string\n relatedSlugs: string[]\n}): void {\n const { name, admin: userAdmin, ...userConfig } = joinFieldConfig\n\n const hasJoinField = hierarchyCollection.fields?.some(\n (field) => 'name' in field && field.name === name,\n )\n\n if (hasJoinField) {\n return\n }\n\n const joinField: JoinField = {\n // User config (spread first so auto-generated values take precedence for required fields)\n ...userConfig,\n // Auto-generated values (these cannot be overridden)\n name,\n type: 'join',\n collection: [hierarchyCollection.slug, ...relatedSlugs],\n hasMany: true,\n on: parentFieldName,\n // Merge admin config\n admin: {\n ...userAdmin,\n },\n }\n\n hierarchyCollection.fields = hierarchyCollection.fields || []\n hierarchyCollection.fields.push(joinField)\n\n // Sanitize the join field to register it properly\n sanitizeJoinField({\n config,\n field: joinField,\n joins: hierarchyCollection.joins,\n parentIsLocalized: false,\n polymorphicJoins: hierarchyCollection.polymorphicJoins,\n })\n\n // Recompute flattenedFields since we added a field after initial sanitization\n hierarchyCollection.flattenedFields = flattenAllFields({\n fields: hierarchyCollection.fields,\n })\n}\n\n/**\n * Injects afterDelete hook to clear hierarchy references from related documents.\n */\nfunction injectAfterDeleteHook({\n hierarchyCollection,\n sanitizedRelatedCollections,\n}: {\n hierarchyCollection: CollectionConfig | SanitizedCollectionConfig\n sanitizedRelatedCollections: Record<string, SanitizedHierarchyRelatedCollection>\n}): void {\n // Build map of collection slugs to their field names\n const relatedCollectionFieldMap: Record<string, string> = {}\n for (const [slug, relatedConfig] of Object.entries(sanitizedRelatedCollections)) {\n relatedCollectionFieldMap[slug] = relatedConfig.fieldName\n }\n\n hierarchyCollection.hooks = hierarchyCollection.hooks || {}\n hierarchyCollection.hooks.afterDelete = [\n ...(hierarchyCollection.hooks.afterDelete || []),\n hierarchyCollectionAfterDelete({ relatedCollections: relatedCollectionFieldMap }),\n ]\n}\n\n/**\n * Injects a sidebar tab for a hierarchy collection.\n */\nfunction injectSidebarTab({\n config,\n hierarchyCollection,\n hierarchyConfig,\n}: {\n config: Config\n hierarchyCollection: CollectionConfig\n hierarchyConfig: SanitizedHierarchyConfig\n}): void {\n const tabSlug = `hierarchy-${hierarchyCollection.slug}`\n const Icon = hierarchyConfig.admin.components.Icon\n\n // Initialize admin config structure\n config.admin = config.admin || {}\n config.admin.components = config.admin.components || {}\n config.admin.components.sidebar = config.admin.components.sidebar || {}\n config.admin.components.sidebar.tabs = config.admin.components.sidebar.tabs || []\n\n // Check if tab already exists\n const hasTab = config.admin.components.sidebar.tabs.some((tab) => tab.slug === tabSlug)\n\n if (!hasTab) {\n config.admin.components.sidebar.tabs.push({\n slug: tabSlug,\n components: {\n Content: {\n clientProps: {\n hierarchyCollectionSlug: hierarchyCollection.slug,\n },\n path: '@payloadcms/ui/rsc#HierarchySidebarTabServer',\n },\n Icon,\n },\n label: hierarchyCollection.labels?.plural || hierarchyCollection.slug,\n })\n }\n}\n"],"names":["sanitizeJoinField","fieldAffectsData","extractID","flattenAllFields","getHierarchyFieldName","hierarchyCollectionAfterDelete","injectHierarchyButton","resolveHierarchyCollections","config","hierarchyCollections","collections","filter","col","hierarchy","hierarchyCollection","hierarchyConfig","defaultFieldName","slug","parentFieldName","isParentFieldNameOverridden","collectionSpecific","typeFieldName","fieldName","undefined","allowHasMany","sanitizedRelatedCollections","selfParentField","fields","find","field","name","type","relationTo","custom","injectHeaderButton","collection","hierarchyCollectionSlug","hierarchyField","fieldHasMany","hasMany","injectCollectionSpecificValidation","hierarchySlug","injectTypeField","joinField","injectJoinField","joinFieldConfig","relatedSlugs","Object","keys","relatedCollections","length","injectAfterDeleteHook","admin","injectSidebarTab","group","existingValidate","validate","value","options","existingResult","validateCollectionSpecificHierarchy","Array","isArray","collectionSlug","overrideAccess","previousValue","req","newIDs","map","item","previousIDs","Set","newID","has","parentItem","payload","findByID","id","depth","select","allowedTypes","includes","collectionOptions","relatedCollection","c","label","labels","plural","typeField","components","Field","path","serverProps","position","t","push","flattenedFields","userAdmin","userConfig","hasJoinField","some","on","joins","parentIsLocalized","polymorphicJoins","relatedCollectionFieldMap","relatedConfig","entries","hooks","afterDelete","tabSlug","Icon","sidebar","tabs","hasTab","tab","Content","clientProps"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/hierarchy/resolveHierarchyCollections.ts"],"sourcesContent":["import type { CollectionConfig, SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { Config } from '../config/types.js'\nimport type {\n JoinField,\n Option,\n RelationshipField,\n SelectField,\n Validate,\n} from '../fields/config/types.js'\nimport type { Document } from '../types/index.js'\nimport type {\n HierarchyJoinFieldConfig,\n SanitizedHierarchyConfig,\n SanitizedHierarchyRelatedCollection,\n} from './types.js'\n\nimport { sanitizeJoinField } from '../fields/config/sanitizeJoinField.js'\nimport { fieldAffectsData } from '../fields/config/types.js'\nimport { extractID } from '../utilities/extractID.js'\nimport { flattenAllFields } from '../utilities/flattenAllFields.js'\nimport { getHierarchyFieldName } from './constants.js'\nimport { hierarchyCollectionAfterDelete } from './hooks/collectionAfterDelete.js'\nimport { injectHierarchyButton } from './injectHierarchyButton.js'\n\n/**\n * Resolves hierarchy relationships across collections.\n *\n * This function runs after individual collection sanitization to establish\n * cross-collection hierarchy relationships. It discovers which collections\n * reference each hierarchy and configures the necessary fields, components,\n * and hooks.\n *\n * @remarks\n * Must be called after all collections are sanitized.\n *\n * **What it does:**\n * - Discovers related collections by scanning for hierarchy relationship fields\n * - Injects `HierarchyButton` component when `custom.hierarchy.injectHeaderButton` is set\n * - Adds `collectionSpecific` validation to ensure hierarchy items accept the document type\n * - Injects the `hierarchyType` select field when `collectionSpecific` is enabled\n * - Injects join field when `joinField` is configured\n * - Adds `afterDelete` hook to clear hierarchy references when items are deleted\n * - Populates `relatedCollections` in the sanitized hierarchy config\n */\nexport const resolveHierarchyCollections = (config: Config): void => {\n const hierarchyCollections =\n config.collections?.filter((col) => col.hierarchy && typeof col.hierarchy === 'object') || []\n\n for (const hierarchyCollection of hierarchyCollections) {\n const hierarchy = hierarchyCollection.hierarchy\n\n // TypeScript guard - hierarchy is guaranteed to be an object by the filter above\n if (!hierarchy || typeof hierarchy !== 'object') {\n continue\n }\n\n const hierarchyConfig = hierarchy as SanitizedHierarchyConfig\n const defaultFieldName = getHierarchyFieldName(hierarchyCollection.slug)\n const parentFieldName = hierarchyConfig.parentFieldName ?? defaultFieldName\n const isParentFieldNameOverridden = parentFieldName !== defaultFieldName\n const collectionSpecific = hierarchyConfig.collectionSpecific\n const typeFieldName = collectionSpecific ? collectionSpecific.fieldName : undefined\n const allowHasMany = hierarchyConfig.allowHasMany ?? true\n\n // Build relatedCollections by scanning all collections for hierarchy fields\n const sanitizedRelatedCollections: Record<string, SanitizedHierarchyRelatedCollection> = {}\n\n const selfParentField = hierarchyCollection.fields.find(\n (field) =>\n fieldAffectsData(field) &&\n field.name === parentFieldName &&\n field.type === 'relationship' &&\n field.relationTo === hierarchyCollection.slug,\n ) as RelationshipField | undefined\n\n // Check if the hierarchy collection's own parent field should be replaced with a header button\n if (selfParentField?.custom?.hierarchy?.injectHeaderButton === true) {\n injectHierarchyButton({\n collection: hierarchyCollection,\n fieldName: parentFieldName,\n hierarchyCollectionSlug: hierarchyCollection.slug,\n parentFieldName: hierarchyConfig.parentFieldName,\n })\n }\n\n for (const collection of config.collections || []) {\n // Skip the hierarchy collection itself (handled above)\n if (collection.slug === hierarchyCollection.slug) {\n continue\n }\n\n // Find hierarchy field by the default name (what createFolderField uses)\n const hierarchyField = collection.fields.find(\n (field) =>\n fieldAffectsData(field) &&\n field.name === defaultFieldName &&\n field.type === 'relationship' &&\n field.relationTo === hierarchyCollection.slug,\n ) as RelationshipField | undefined\n\n // If parentFieldName is overridden, rename the field to match\n if (hierarchyField && isParentFieldNameOverridden) {\n hierarchyField.name = parentFieldName\n }\n\n if (!hierarchyField) {\n continue\n }\n\n const fieldHasMany = hierarchyField.hasMany ?? allowHasMany\n\n // If collectionSpecific, inject validation to check hierarchy allows this collection type\n if (collectionSpecific) {\n injectCollectionSpecificValidation({\n hierarchyField,\n hierarchySlug: hierarchyCollection.slug,\n typeFieldName: typeFieldName!,\n })\n }\n\n // Store discovered collection with hasMany info\n sanitizedRelatedCollections[collection.slug] = {\n fieldName: parentFieldName,\n hasMany: fieldHasMany,\n }\n\n // Inject HierarchyButton if field requests it\n if (hierarchyField.custom?.hierarchy?.injectHeaderButton === true) {\n injectHierarchyButton({\n collection,\n fieldName: parentFieldName,\n hierarchyCollectionSlug: hierarchyCollection.slug,\n parentFieldName: hierarchyConfig.parentFieldName,\n })\n }\n }\n\n // If collectionSpecific, add type field to hierarchy collection\n if (hierarchyConfig.collectionSpecific) {\n injectTypeField({\n config,\n hierarchyCollection,\n parentFieldName: hierarchyConfig.parentFieldName,\n sanitizedRelatedCollections,\n typeFieldName: hierarchyConfig.collectionSpecific.fieldName,\n })\n }\n\n // If joinField is configured, add the join field to query children\n if (hierarchyConfig.joinField) {\n injectJoinField({\n config,\n hierarchyCollection: hierarchyCollection as SanitizedCollectionConfig,\n joinFieldConfig: hierarchyConfig.joinField,\n parentFieldName,\n relatedSlugs: Object.keys(sanitizedRelatedCollections),\n })\n }\n\n // Update hierarchy config with sanitized relatedCollections\n if (hierarchyConfig) {\n hierarchyConfig.relatedCollections = sanitizedRelatedCollections\n }\n\n // Add afterDelete hook to clear folder references from related documents\n if (Object.keys(sanitizedRelatedCollections).length > 0) {\n injectAfterDeleteHook({\n hierarchyCollection,\n sanitizedRelatedCollections,\n })\n }\n\n // Add sidebar tab for this hierarchy collection (unless explicitly disabled)\n if (hierarchyConfig.admin.injectSidebarTab !== false) {\n injectSidebarTab({\n config,\n hierarchyCollection,\n hierarchyConfig,\n })\n\n // Hide from nav when sidebar tab is injected (unless user explicitly set group)\n if (hierarchyCollection.admin?.group === undefined) {\n hierarchyCollection.admin = {\n ...hierarchyCollection.admin,\n group: false,\n }\n }\n }\n }\n}\n\n/**\n * Injects validation for collectionSpecific hierarchy fields.\n * Ensures the selected hierarchy item allows documents of this collection type.\n */\nfunction injectCollectionSpecificValidation({\n hierarchyField,\n hierarchySlug,\n typeFieldName,\n}: {\n hierarchyField: RelationshipField\n hierarchySlug: string\n typeFieldName: string\n}): void {\n const existingValidate = hierarchyField.validate\n\n const validate: Validate<unknown> = async (value, options) => {\n // Run existing validation first if present\n if (existingValidate) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const existingResult = await existingValidate(value as any, options as any)\n if (existingResult !== true) {\n return existingResult\n }\n }\n\n return validateCollectionSpecificHierarchy({\n hierarchySlug,\n options,\n typeFieldName,\n value,\n })\n }\n\n hierarchyField.validate = validate\n}\n\ntype HierarchyValidationOptions = Parameters<Validate<unknown>>[1]\n\nconst validateCollectionSpecificHierarchy = async ({\n hierarchySlug,\n options,\n typeFieldName,\n value,\n}: {\n hierarchySlug: string\n options: HierarchyValidationOptions\n typeFieldName: string\n value: unknown\n}): Promise<string | true> => {\n if (!value || (Array.isArray(value) && value.length === 0)) {\n return true\n }\n\n const { collectionSlug, overrideAccess, previousValue, req } = options\n const newIDs = (Array.isArray(value) ? value : [value]).map((item) => extractID<Document>(item))\n\n const previousIDs = new Set(\n (Array.isArray(previousValue) ? previousValue : previousValue ? [previousValue] : []).map(\n (item) => extractID<Document>(item),\n ),\n )\n\n for (const newID of newIDs) {\n if (previousIDs.has(newID)) {\n continue\n }\n\n let parentItem: Document | null = null\n if (typeof newID === 'string' || typeof newID === 'number') {\n try {\n parentItem = await req.payload.findByID({\n id: newID,\n collection: hierarchySlug,\n depth: 0,\n overrideAccess: overrideAccess ?? false,\n req,\n select: { [typeFieldName]: true },\n })\n } catch {\n return `Hierarchy item with ID ${newID} not found`\n }\n }\n\n if (!parentItem) {\n return `Hierarchy item with ID ${newID} not found`\n }\n\n const allowedTypes: string[] = (parentItem[typeFieldName] as string[]) || []\n\n if (allowedTypes.length === 0 || (collectionSlug && allowedTypes.includes(collectionSlug))) {\n continue\n }\n\n return `Hierarchy item \"${newID}\" does not allow documents of type \"${collectionSlug}\"`\n }\n\n return true\n}\n\n/**\n * Injects the hierarchyType select field into a hierarchy collection.\n */\nfunction injectTypeField({\n config,\n hierarchyCollection,\n parentFieldName,\n sanitizedRelatedCollections,\n typeFieldName,\n}: {\n config: Config\n hierarchyCollection: CollectionConfig | SanitizedCollectionConfig\n parentFieldName: string\n sanitizedRelatedCollections: Record<string, SanitizedHierarchyRelatedCollection>\n typeFieldName: string\n}): void {\n const collectionOptions: Option[] = Object.keys(sanitizedRelatedCollections).map((slug) => {\n const relatedCollection = config.collections?.find((c) => c.slug === slug)\n\n return {\n label: relatedCollection?.labels?.plural || slug,\n value: slug,\n }\n })\n\n const typeField: SelectField = {\n name: typeFieldName,\n type: 'select',\n admin: {\n components: {\n Field: {\n path: '@payloadcms/ui/rsc#HierarchyTypeFieldServer',\n serverProps: {\n collectionOptions,\n parentFieldName,\n },\n },\n },\n position: 'sidebar',\n },\n hasMany: true,\n label: ({ t }) => t('general:allowedTypes'),\n options: collectionOptions,\n }\n\n hierarchyCollection.fields = hierarchyCollection.fields || []\n\n // This can run again on the same `fields` array, so replace the field if it already exists\n const existingTypeFieldIndex = hierarchyCollection.fields.findIndex(\n (field) => fieldAffectsData(field) && field.name === typeFieldName,\n )\n\n if (existingTypeFieldIndex === -1) {\n hierarchyCollection.fields.push(typeField)\n } else {\n hierarchyCollection.fields[existingTypeFieldIndex] = typeField\n }\n\n // Recompute flattenedFields since we added a field after initial sanitization\n // This is required for the field to be queryable\n if ('flattenedFields' in hierarchyCollection) {\n hierarchyCollection.flattenedFields = flattenAllFields({\n fields: hierarchyCollection.fields,\n })\n }\n}\n\n/**\n * Injects a join field to query all children of a hierarchy item.\n */\nfunction injectJoinField({\n config,\n hierarchyCollection,\n joinFieldConfig,\n parentFieldName,\n relatedSlugs,\n}: {\n config: Config\n hierarchyCollection: SanitizedCollectionConfig\n joinFieldConfig: HierarchyJoinFieldConfig\n parentFieldName: string\n relatedSlugs: string[]\n}): void {\n const { name, admin: userAdmin, ...userConfig } = joinFieldConfig\n\n const hasJoinField = hierarchyCollection.fields?.some(\n (field) => 'name' in field && field.name === name,\n )\n\n if (hasJoinField) {\n return\n }\n\n const joinField: JoinField = {\n // User config (spread first so auto-generated values take precedence for required fields)\n ...userConfig,\n // Auto-generated values (these cannot be overridden)\n name,\n type: 'join',\n collection: [hierarchyCollection.slug, ...relatedSlugs],\n hasMany: true,\n on: parentFieldName,\n // Merge admin config\n admin: {\n ...userAdmin,\n },\n }\n\n hierarchyCollection.fields = hierarchyCollection.fields || []\n hierarchyCollection.fields.push(joinField)\n\n // Sanitize the join field to register it properly\n sanitizeJoinField({\n config,\n field: joinField,\n joins: hierarchyCollection.joins,\n parentIsLocalized: false,\n polymorphicJoins: hierarchyCollection.polymorphicJoins,\n })\n\n // Recompute flattenedFields since we added a field after initial sanitization\n hierarchyCollection.flattenedFields = flattenAllFields({\n fields: hierarchyCollection.fields,\n })\n}\n\n/**\n * Injects afterDelete hook to clear hierarchy references from related documents.\n */\nfunction injectAfterDeleteHook({\n hierarchyCollection,\n sanitizedRelatedCollections,\n}: {\n hierarchyCollection: CollectionConfig | SanitizedCollectionConfig\n sanitizedRelatedCollections: Record<string, SanitizedHierarchyRelatedCollection>\n}): void {\n // Build map of collection slugs to their field names\n const relatedCollectionFieldMap: Record<string, string> = {}\n for (const [slug, relatedConfig] of Object.entries(sanitizedRelatedCollections)) {\n relatedCollectionFieldMap[slug] = relatedConfig.fieldName\n }\n\n hierarchyCollection.hooks = hierarchyCollection.hooks || {}\n hierarchyCollection.hooks.afterDelete = [\n ...(hierarchyCollection.hooks.afterDelete || []),\n hierarchyCollectionAfterDelete({ relatedCollections: relatedCollectionFieldMap }),\n ]\n}\n\n/**\n * Injects a sidebar tab for a hierarchy collection.\n */\nfunction injectSidebarTab({\n config,\n hierarchyCollection,\n hierarchyConfig,\n}: {\n config: Config\n hierarchyCollection: CollectionConfig\n hierarchyConfig: SanitizedHierarchyConfig\n}): void {\n const tabSlug = `hierarchy-${hierarchyCollection.slug}`\n const Icon = hierarchyConfig.admin.components.Icon\n\n // Initialize admin config structure\n config.admin = config.admin || {}\n config.admin.components = config.admin.components || {}\n config.admin.components.sidebar = config.admin.components.sidebar || {}\n config.admin.components.sidebar.tabs = config.admin.components.sidebar.tabs || []\n\n // Check if tab already exists\n const hasTab = config.admin.components.sidebar.tabs.some((tab) => tab.slug === tabSlug)\n\n if (!hasTab) {\n config.admin.components.sidebar.tabs.push({\n slug: tabSlug,\n components: {\n Content: {\n clientProps: {\n hierarchyCollectionSlug: hierarchyCollection.slug,\n },\n path: '@payloadcms/ui/rsc#HierarchySidebarTabServer',\n },\n Icon,\n },\n label: hierarchyCollection.labels?.plural || hierarchyCollection.slug,\n })\n }\n}\n"],"names":["sanitizeJoinField","fieldAffectsData","extractID","flattenAllFields","getHierarchyFieldName","hierarchyCollectionAfterDelete","injectHierarchyButton","resolveHierarchyCollections","config","hierarchyCollections","collections","filter","col","hierarchy","hierarchyCollection","hierarchyConfig","defaultFieldName","slug","parentFieldName","isParentFieldNameOverridden","collectionSpecific","typeFieldName","fieldName","undefined","allowHasMany","sanitizedRelatedCollections","selfParentField","fields","find","field","name","type","relationTo","custom","injectHeaderButton","collection","hierarchyCollectionSlug","hierarchyField","fieldHasMany","hasMany","injectCollectionSpecificValidation","hierarchySlug","injectTypeField","joinField","injectJoinField","joinFieldConfig","relatedSlugs","Object","keys","relatedCollections","length","injectAfterDeleteHook","admin","injectSidebarTab","group","existingValidate","validate","value","options","existingResult","validateCollectionSpecificHierarchy","Array","isArray","collectionSlug","overrideAccess","previousValue","req","newIDs","map","item","previousIDs","Set","newID","has","parentItem","payload","findByID","id","depth","select","allowedTypes","includes","collectionOptions","relatedCollection","c","label","labels","plural","typeField","components","Field","path","serverProps","position","t","existingTypeFieldIndex","findIndex","push","flattenedFields","userAdmin","userConfig","hasJoinField","some","on","joins","parentIsLocalized","polymorphicJoins","relatedCollectionFieldMap","relatedConfig","entries","hooks","afterDelete","tabSlug","Icon","sidebar","tabs","hasTab","tab","Content","clientProps"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"computePaths.d.ts","sourceRoot":"","sources":["../../../src/hierarchy/utils/computePaths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAClF,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAQpE,KAAK,gBAAgB,GAAG;IACtB,UAAU,EAAE,yBAAyB,CAAA;IACrC,GAAG,EAAE,QAAQ,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED,KAAK,kBAAkB,GAAG;IACxB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAA;IACzC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAA;CAC3C,CAAA;AAgFD;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2dtF"}
1
+ {"version":3,"file":"computePaths.d.ts","sourceRoot":"","sources":["../../../src/hierarchy/utils/computePaths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAClF,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAQpE,KAAK,gBAAgB,GAAG;IACtB,UAAU,EAAE,yBAAyB,CAAA;IACrC,GAAG,EAAE,QAAQ,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED,KAAK,kBAAkB,GAAG;IACxB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAA;IACzC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAA;CAC3C,CAAA;AAgFD;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0dtF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hierarchy/utils/computePaths.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { Document, PayloadRequest } from '../../types/index.js'\n\nimport { slugify as payloadSlugify } from '../../utilities/slugify.js'\nimport { HIERARCHY_SLUG_PATH_FIELD, HIERARCHY_TITLE_PATH_FIELD } from '../constants.js'\nimport { buildLocalizedHierarchyPaths } from './buildLocalizedHierarchyPaths.js'\nimport { findFieldByName, findUseAsTitleField } from './findUseAsTitle.js'\nimport { getLocalizedValue } from './getLocalizedValue.js'\n\ntype ComputePathsArgs = {\n collection: SanitizedCollectionConfig\n doc: Document\n draft?: boolean\n locale?: string\n parentFieldName: string\n req: PayloadRequest\n slugPathFieldName?: string\n titlePathFieldName?: string\n}\n\ntype ComputePathsResult = {\n slugPath: Record<string, string> | string\n titlePath: Record<string, string> | string\n}\n\n// Helper to get title value - returns string for single locale, object for 'all' locales\nconst getTitleValue = ({\n document,\n isTitleLocalized = false,\n locale,\n req,\n titleFieldName,\n}: {\n document: Document\n isTitleLocalized?: boolean\n locale?: string\n req: PayloadRequest\n titleFieldName: string\n}): Record<string, string> | string => {\n const titleValue = document[titleFieldName]\n\n if (!titleValue) {\n return document.id?.toString() || 'untitled'\n }\n\n // If field is localized and we want all locales, return the full object\n if (isTitleLocalized && locale === 'all' && typeof titleValue === 'object') {\n return titleValue\n }\n\n // Single locale - use getLocalizedValue to handle fallback\n if (isTitleLocalized && typeof titleValue === 'object') {\n const localizedValue = getLocalizedValue({\n fallbackLocale: req.fallbackLocale,\n fieldType: 'text',\n locale: locale || req.locale || 'en',\n value: titleValue,\n })\n return localizedValue || document.id?.toString() || 'untitled'\n }\n\n return titleValue\n}\n\n// Helper to get slug value from a dedicated slug field\nconst getSlugFieldValue = ({\n document,\n isSlugLocalized = false,\n locale,\n req,\n slugFieldName,\n}: {\n document: Document\n isSlugLocalized?: boolean\n locale?: string\n req: PayloadRequest\n slugFieldName: string\n}): Record<string, string> | string | undefined => {\n const slugValue = document[slugFieldName]\n\n if (!slugValue) {\n return undefined\n }\n\n // If field is localized and we want all locales, return the full object\n if (isSlugLocalized && locale === 'all' && typeof slugValue === 'object') {\n return slugValue\n }\n\n // Single locale - use getLocalizedValue to handle fallback\n if (isSlugLocalized && typeof slugValue === 'object') {\n const localizedValue = getLocalizedValue({\n fallbackLocale: req.fallbackLocale,\n fieldType: 'text',\n locale: locale || req.locale || 'en',\n value: slugValue,\n })\n return localizedValue || undefined\n }\n\n return slugValue\n}\n\n/**\n * Computes both slug and title breadcrumb paths for a document by walking up the parent chain.\n * More efficient than computing them separately since it only walks the chain once.\n *\n * Note: Ancestor fetches always use `overrideAccess: true` to ensure paths are complete.\n * If a user can read a document, they should see its full breadcrumb path even if they\n * cannot read all ancestor documents. This prevents broken breadcrumbs and provides\n * better UX at the cost of minimal information leakage (ancestor titles in paths).\n *\n * @param args - Configuration for path computation\n * @returns Object with slugPath and titlePath\n */\nexport async function computePaths(args: ComputePathsArgs): Promise<ComputePathsResult> {\n const {\n collection,\n doc,\n draft = false,\n locale,\n parentFieldName,\n req,\n slugPathFieldName = HIERARCHY_SLUG_PATH_FIELD,\n titlePathFieldName = HIERARCHY_TITLE_PATH_FIELD,\n } = args\n\n const slugify =\n (collection.hierarchy !== false && collection.hierarchy.slugify) ||\n ((text: string) => payloadSlugify(text) || '')\n const { localized: isTitleLocalized, titleFieldName } = findUseAsTitleField(collection)\n\n // Check for dedicated slug field\n const slugFieldName = collection.hierarchy !== false ? collection.hierarchy.slugField : undefined\n const slugFieldInfo = slugFieldName ? findFieldByName(collection, slugFieldName) : undefined\n const isSlugFieldLocalized = slugFieldInfo?.localized ?? false\n\n // Initialize cache if it doesn't exist\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const context = req.context as any\n if (!context.hierarchyAncestorCache) {\n context.hierarchyAncestorCache = {}\n }\n if (!context.hierarchyAncestorCache[collection.slug]) {\n context.hierarchyAncestorCache[collection.slug] = {}\n }\n\n // Initialize cache stats if debug is enabled\n if (req.payload.config.debug && !context.hierarchyCacheStats) {\n context.hierarchyCacheStats = {\n hits: 0,\n misses: 0,\n queries: 0,\n }\n }\n\n const parentValue = doc[parentFieldName]\n let parentID: number | string | undefined\n\n if (!parentValue) {\n // No parent - root document\n parentID = undefined\n } else {\n // Extract ID from parent value\n // Parent can be:\n // - Plain ID (string/number)\n // - Populated object with { id: ... }\n if (typeof parentValue === 'object' && 'id' in parentValue) {\n parentID = parentValue.id\n } else {\n parentID = parentValue as number | string\n }\n }\n\n if (parentID) {\n // Parent is always from the same collection (self-referential)\n const parentCollectionConfig = collection\n const parentHierarchyConfig = parentCollectionConfig.hierarchy\n\n // If parent collection doesn't have hierarchy, we can't compute paths through it\n if (!parentHierarchyConfig || !parentCollectionConfig) {\n const titleValue = getTitleValue({\n document: doc,\n isTitleLocalized,\n locale,\n req,\n titleFieldName,\n })\n\n const slugValue = slugFieldName\n ? getSlugFieldValue({\n document: doc,\n isSlugLocalized: isSlugFieldLocalized,\n locale,\n req,\n slugFieldName,\n })\n : undefined\n\n if (isTitleLocalized && locale === 'all') {\n return buildLocalizedHierarchyPaths({\n req,\n slugify,\n slugValue: slugValue as Record<string, string> | undefined,\n titleValue: titleValue as Record<string, string>,\n })\n }\n\n return {\n slugPath: slugValue !== undefined ? (slugValue as string) : slugify(titleValue as string),\n titlePath: titleValue as string,\n }\n }\n\n // Initialize cache for parent collection if needed\n if (!context.hierarchyAncestorCache[collection.slug]) {\n context.hierarchyAncestorCache[collection.slug] = {}\n }\n\n const cache = context.hierarchyAncestorCache[collection.slug]\n const cacheKey = `${parentID}_${locale || 'default'}`\n\n // Check cache first\n let parent = cache[cacheKey]\n\n if (parent) {\n // Cache hit\n if (context.hierarchyCacheStats) {\n context.hierarchyCacheStats.hits += 1\n }\n } else {\n // Cache miss - fetch parent\n if (context.hierarchyCacheStats) {\n context.hierarchyCacheStats.misses += 1\n context.hierarchyCacheStats.queries += 1\n }\n\n const parentTitleField = findUseAsTitleField(parentCollectionConfig).titleFieldName\n\n // parentID is guaranteed to be defined here (we're inside if (parentID))\n const validParentID = parentID\n\n // Create new context with computeHierarchyPaths enabled to trigger recursive path computation\n const parentReq = {\n ...req,\n context: {\n ...req.context,\n computeHierarchyPaths: true,\n },\n }\n\n // Fetch parent\n // When locale === 'all', we need special handling because Payload doesn't support\n // fetching all locales of a draft document (drafts are stored per-locale).\n // Strategy: Try published first, fallback to fetching each locale separately for drafts.\n const fetchParent = async () => {\n if (locale === 'all') {\n try {\n // First try to fetch published version with all locales\n return await req.payload.findByID({\n id: validParentID,\n collection: collection.slug,\n depth: 0,\n locale,\n overrideAccess: true,\n req: parentReq,\n select: {\n [parentHierarchyConfig.parentFieldName]: true,\n [parentHierarchyConfig.slugPathFieldName]: true,\n [parentHierarchyConfig.titlePathFieldName]: true,\n [parentTitleField]: true,\n ...(slugFieldName ? { [slugFieldName]: true } : {}),\n },\n user: req.user,\n })\n } catch (_error) {\n // Published version not found, must be a draft\n // Payload doesn't support fetching all locales of a draft with a single query\n // So we need to fetch each locale separately and combine the path data\n const locales = req.payload.config.localization\n ? req.payload.config.localization.localeCodes\n : []\n const parentPathsByLocale: Record<\n string,\n { slugPath?: string; title?: string; titlePath?: string }\n > = {}\n\n // Get parent collection's slugify function (may differ from child's)\n const parentSlugify =\n (parentCollectionConfig.hierarchy !== false &&\n parentCollectionConfig.hierarchy.slugify) ||\n ((text: string) => payloadSlugify(text) || '')\n\n // Fetch parent for each locale to get paths\n for (const loc of locales) {\n // Create a new request with this specific locale but keep computeHierarchyPaths flag\n const localeReq = {\n ...req,\n context: {\n ...req.context,\n computeHierarchyPaths: true,\n },\n locale: loc,\n }\n\n try {\n const parentForLocale = await req.payload.findByID({\n id: validParentID,\n collection: collection.slug,\n depth: 0,\n draft: true,\n locale: loc,\n overrideAccess: true,\n req: localeReq,\n user: req.user,\n })\n\n // Extract the path fields and title from the parent\n // If paths weren't computed (undefined), compute them manually for root documents\n let parentSlugPath = parentForLocale[parentHierarchyConfig.slugPathFieldName]\n let parentTitlePath = parentForLocale[parentHierarchyConfig.titlePathFieldName]\n const parentTitle = parentForLocale[parentTitleField]\n\n // If paths are undefined, this might be a root document - compute paths from title\n if (!parentSlugPath && parentTitle) {\n parentSlugPath = parentSlugify(parentTitle)\n }\n if (!parentTitlePath && parentTitle) {\n parentTitlePath = parentTitle\n }\n\n parentPathsByLocale[loc] = {\n slugPath: parentSlugPath,\n title: parentTitle,\n titlePath: parentTitlePath,\n }\n } catch (_localeError) {\n // This locale doesn't exist, skip it\n }\n }\n\n // Combine the path data from all locales into a single parent object\n const combinedSlugPaths: Record<string, string | undefined> = {}\n const combinedTitlePaths: Record<string, string | undefined> = {}\n const combinedTitles: Record<string, string | undefined> = {}\n\n for (const loc of locales) {\n if (parentPathsByLocale[loc]) {\n combinedSlugPaths[loc] = parentPathsByLocale[loc].slugPath\n combinedTitlePaths[loc] = parentPathsByLocale[loc].titlePath\n combinedTitles[loc] = parentPathsByLocale[loc].title\n }\n }\n\n // Return a parent object with only the hierarchy fields we need\n // (all properly formatted as multi-locale objects)\n return {\n id: validParentID,\n [parentHierarchyConfig.slugPathFieldName]: combinedSlugPaths,\n [parentHierarchyConfig.titlePathFieldName]: combinedTitlePaths,\n [parentTitleField]: combinedTitles,\n }\n }\n } else {\n // Normal case: single locale, can pass draft parameter\n return await req.payload.findByID({\n id: validParentID,\n collection: collection.slug,\n depth: 0,\n draft,\n locale,\n overrideAccess: true,\n req: parentReq,\n select: {\n [parentHierarchyConfig.parentFieldName]: true,\n [parentHierarchyConfig.slugPathFieldName]: true,\n [parentHierarchyConfig.titlePathFieldName]: true,\n [parentTitleField]: true,\n ...(slugFieldName ? { [slugFieldName]: true } : {}),\n },\n user: req.user,\n })\n }\n }\n\n try {\n parent = await fetchParent()\n\n // Store in cache\n cache[cacheKey] = parent\n } catch {\n // If we can't fetch the parent at all (even with fallbacks), treat this as a root document\n // This can happen with complex draft/locale combinations\n parentID = undefined\n }\n }\n\n // If parent fetch failed, treat as root document\n if (!parentID || !parent) {\n const titleValue = getTitleValue({\n document: doc,\n isTitleLocalized,\n locale,\n req,\n titleFieldName,\n })\n\n const slugValue = slugFieldName\n ? getSlugFieldValue({\n document: doc,\n isSlugLocalized: isSlugFieldLocalized,\n locale,\n req,\n slugFieldName,\n })\n : undefined\n\n if (isTitleLocalized && locale === 'all') {\n return buildLocalizedHierarchyPaths({\n req,\n slugify,\n slugValue: slugValue as Record<string, string> | undefined,\n titleValue: titleValue as Record<string, string>,\n })\n }\n\n return {\n slugPath: slugValue !== undefined ? (slugValue as string) : slugify(titleValue as string),\n titlePath: titleValue as string,\n }\n }\n\n const docTitle = getTitleValue({ document: doc, isTitleLocalized, locale, req, titleFieldName })\n\n // Cache the current document (in its own collection's cache)\n const currentDocCacheKey = `${doc.id}_${locale || 'default'}`\n if (!context.hierarchyAncestorCache[collection.slug]) {\n context.hierarchyAncestorCache[collection.slug] = {}\n }\n context.hierarchyAncestorCache[collection.slug][currentDocCacheKey] = {\n [parentFieldName]: parentID,\n [slugPathFieldName]: undefined, // Will be set below\n [titleFieldName]: docTitle,\n [titlePathFieldName]: undefined, // Will be set below\n }\n\n // Get parent's path field names from hierarchy config\n const parentSlugPathFieldName =\n parentCollectionConfig.hierarchy !== false\n ? parentCollectionConfig.hierarchy.slugPathFieldName\n : HIERARCHY_SLUG_PATH_FIELD\n const parentTitlePathFieldName =\n parentCollectionConfig.hierarchy !== false\n ? parentCollectionConfig.hierarchy.titlePathFieldName\n : HIERARCHY_TITLE_PATH_FIELD\n\n // Handle localized case (locale === 'all' with localized title field)\n if (isTitleLocalized && locale === 'all') {\n // Parent might have non-localized title field, resulting in string paths instead of objects\n // Convert parent paths to objects if they're strings (use same value for all locales)\n let parentSlugPathObj: Record<string, string> | undefined = parent[\n parentSlugPathFieldName\n ] as Record<string, string> | undefined\n let parentTitlePathObj: Record<string, string> | undefined = parent[\n parentTitlePathFieldName\n ] as Record<string, string> | undefined\n\n // If parent paths are strings (non-localized parent), convert to objects for all locales\n if (typeof parentSlugPathObj === 'string') {\n const locales = req.payload.config.localization\n ? req.payload.config.localization.localeCodes\n : []\n const slugValue = parentSlugPathObj\n parentSlugPathObj = {}\n for (const loc of locales) {\n parentSlugPathObj[loc] = slugValue\n }\n }\n\n if (typeof parentTitlePathObj === 'string') {\n const locales = req.payload.config.localization\n ? req.payload.config.localization.localeCodes\n : []\n const titleValue = parentTitlePathObj\n parentTitlePathObj = {}\n for (const loc of locales) {\n parentTitlePathObj[loc] = titleValue\n }\n }\n\n // Get slug value if slugField is configured\n const docSlugValue = slugFieldName\n ? getSlugFieldValue({\n document: doc,\n isSlugLocalized: isSlugFieldLocalized,\n locale,\n req,\n slugFieldName,\n })\n : undefined\n\n // If parent paths are undefined (parent fetch failed or paths not computed),\n // buildLocalizedHierarchyPaths will handle it by using just the child's title\n const result = buildLocalizedHierarchyPaths({\n parentSlugPath: parentSlugPathObj,\n parentTitlePath: parentTitlePathObj,\n req,\n slugify,\n slugValue: docSlugValue as Record<string, string> | undefined,\n titleValue: docTitle as Record<string, string>,\n })\n\n // Update cache with computed paths\n context.hierarchyAncestorCache[collection.slug][currentDocCacheKey][slugPathFieldName] =\n result.slugPath\n context.hierarchyAncestorCache[collection.slug][currentDocCacheKey][titlePathFieldName] =\n result.titlePath\n\n return result\n }\n\n // Single locale case - get slug value if slugField is configured\n const singleLocaleSlugValue = slugFieldName\n ? getSlugFieldValue({\n document: doc,\n isSlugLocalized: isSlugFieldLocalized,\n locale,\n req,\n slugFieldName,\n })\n : undefined\n\n const slugSegment =\n singleLocaleSlugValue !== undefined\n ? (singleLocaleSlugValue as string)\n : slugify(docTitle as string)\n\n const result = {\n slugPath: (parent[parentSlugPathFieldName] as string) + '/' + slugSegment,\n titlePath: (parent[parentTitlePathFieldName] as string) + '/' + (docTitle as string),\n }\n\n // Update cache with computed paths\n context.hierarchyAncestorCache[collection.slug][currentDocCacheKey][slugPathFieldName] =\n result.slugPath\n context.hierarchyAncestorCache[collection.slug][currentDocCacheKey][titlePathFieldName] =\n result.titlePath\n\n return result\n } else {\n // Root document (no parent)\n const titleValue = getTitleValue({\n document: doc,\n isTitleLocalized,\n locale,\n req,\n titleFieldName,\n })\n context.hierarchyAncestorCache[collection.slug][doc.id] = {\n [parentFieldName]: null,\n [titleFieldName]: titleValue,\n }\n\n const rootSlugValue = slugFieldName\n ? getSlugFieldValue({\n document: doc,\n isSlugLocalized: isSlugFieldLocalized,\n locale,\n req,\n slugFieldName,\n })\n : undefined\n\n // Handle localized case (locale === 'all' with localized title field)\n if (isTitleLocalized && locale === 'all') {\n return buildLocalizedHierarchyPaths({\n req,\n slugify,\n slugValue: rootSlugValue as Record<string, string> | undefined,\n titleValue: titleValue as Record<string, string>,\n })\n }\n\n // Single locale case\n return {\n slugPath:\n rootSlugValue !== undefined ? (rootSlugValue as string) : slugify(titleValue as string),\n titlePath: titleValue as string,\n }\n }\n}\n"],"names":["slugify","payloadSlugify","HIERARCHY_SLUG_PATH_FIELD","HIERARCHY_TITLE_PATH_FIELD","buildLocalizedHierarchyPaths","findFieldByName","findUseAsTitleField","getLocalizedValue","getTitleValue","document","isTitleLocalized","locale","req","titleFieldName","titleValue","id","toString","localizedValue","fallbackLocale","fieldType","value","getSlugFieldValue","isSlugLocalized","slugFieldName","slugValue","undefined","computePaths","args","collection","doc","draft","parentFieldName","slugPathFieldName","titlePathFieldName","hierarchy","text","localized","slugField","slugFieldInfo","isSlugFieldLocalized","context","hierarchyAncestorCache","slug","payload","config","debug","hierarchyCacheStats","hits","misses","queries","parentValue","parentID","parentCollectionConfig","parentHierarchyConfig","slugPath","titlePath","cache","cacheKey","parent","parentTitleField","validParentID","parentReq","computeHierarchyPaths","fetchParent","findByID","depth","overrideAccess","select","user","_error","locales","localization","localeCodes","parentPathsByLocale","parentSlugify","loc","localeReq","parentForLocale","parentSlugPath","parentTitlePath","parentTitle","title","_localeError","combinedSlugPaths","combinedTitlePaths","combinedTitles","docTitle","currentDocCacheKey","parentSlugPathFieldName","parentTitlePathFieldName","parentSlugPathObj","parentTitlePathObj","docSlugValue","result","singleLocaleSlugValue","slugSegment","rootSlugValue"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/hierarchy/utils/computePaths.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { Document, PayloadRequest } from '../../types/index.js'\n\nimport { slugify as payloadSlugify } from '../../utilities/slugify.js'\nimport { HIERARCHY_SLUG_PATH_FIELD, HIERARCHY_TITLE_PATH_FIELD } from '../constants.js'\nimport { buildLocalizedHierarchyPaths } from './buildLocalizedHierarchyPaths.js'\nimport { findFieldByName, findUseAsTitleField } from './findUseAsTitle.js'\nimport { getLocalizedValue } from './getLocalizedValue.js'\n\ntype ComputePathsArgs = {\n collection: SanitizedCollectionConfig\n doc: Document\n draft?: boolean\n locale?: string\n parentFieldName: string\n req: PayloadRequest\n slugPathFieldName?: string\n titlePathFieldName?: string\n}\n\ntype ComputePathsResult = {\n slugPath: Record<string, string> | string\n titlePath: Record<string, string> | string\n}\n\n// Helper to get title value - returns string for single locale, object for 'all' locales\nconst getTitleValue = ({\n document,\n isTitleLocalized = false,\n locale,\n req,\n titleFieldName,\n}: {\n document: Document\n isTitleLocalized?: boolean\n locale?: string\n req: PayloadRequest\n titleFieldName: string\n}): Record<string, string> | string => {\n const titleValue = document[titleFieldName]\n\n if (!titleValue) {\n return document.id?.toString() || 'untitled'\n }\n\n // If field is localized and we want all locales, return the full object\n if (isTitleLocalized && locale === 'all' && typeof titleValue === 'object') {\n return titleValue\n }\n\n // Single locale - use getLocalizedValue to handle fallback\n if (isTitleLocalized && typeof titleValue === 'object') {\n const localizedValue = getLocalizedValue({\n fallbackLocale: req.fallbackLocale,\n fieldType: 'text',\n locale: locale || req.locale || 'en',\n value: titleValue,\n })\n return localizedValue || document.id?.toString() || 'untitled'\n }\n\n return titleValue\n}\n\n// Helper to get slug value from a dedicated slug field\nconst getSlugFieldValue = ({\n document,\n isSlugLocalized = false,\n locale,\n req,\n slugFieldName,\n}: {\n document: Document\n isSlugLocalized?: boolean\n locale?: string\n req: PayloadRequest\n slugFieldName: string\n}): Record<string, string> | string | undefined => {\n const slugValue = document[slugFieldName]\n\n if (!slugValue) {\n return undefined\n }\n\n // If field is localized and we want all locales, return the full object\n if (isSlugLocalized && locale === 'all' && typeof slugValue === 'object') {\n return slugValue\n }\n\n // Single locale - use getLocalizedValue to handle fallback\n if (isSlugLocalized && typeof slugValue === 'object') {\n const localizedValue = getLocalizedValue({\n fallbackLocale: req.fallbackLocale,\n fieldType: 'text',\n locale: locale || req.locale || 'en',\n value: slugValue,\n })\n return localizedValue || undefined\n }\n\n return slugValue\n}\n\n/**\n * Computes both slug and title breadcrumb paths for a document by walking up the parent chain.\n * More efficient than computing them separately since it only walks the chain once.\n *\n * Note: Ancestor fetches always use `overrideAccess: true` to ensure paths are complete.\n * If a user can read a document, they should see its full breadcrumb path even if they\n * cannot read all ancestor documents. This prevents broken breadcrumbs and provides\n * better UX at the cost of minimal information leakage (ancestor titles in paths).\n *\n * @param args - Configuration for path computation\n * @returns Object with slugPath and titlePath\n */\nexport async function computePaths(args: ComputePathsArgs): Promise<ComputePathsResult> {\n const {\n collection,\n doc,\n draft = false,\n locale,\n parentFieldName,\n req,\n slugPathFieldName = HIERARCHY_SLUG_PATH_FIELD,\n titlePathFieldName = HIERARCHY_TITLE_PATH_FIELD,\n } = args\n\n const slugify =\n (collection.hierarchy !== false && collection.hierarchy.slugify) ||\n ((text: string) => payloadSlugify(text) || '')\n const { localized: isTitleLocalized, titleFieldName } = findUseAsTitleField(collection)\n\n // Check for dedicated slug field\n const slugFieldName = collection.hierarchy !== false ? collection.hierarchy.slugField : undefined\n const slugFieldInfo = slugFieldName ? findFieldByName(collection, slugFieldName) : undefined\n const isSlugFieldLocalized = slugFieldInfo?.localized ?? false\n\n // Initialize cache if it doesn't exist\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const context = req.context as any\n if (!context.hierarchyAncestorCache) {\n context.hierarchyAncestorCache = {}\n }\n if (!context.hierarchyAncestorCache[collection.slug]) {\n context.hierarchyAncestorCache[collection.slug] = {}\n }\n\n // Initialize cache stats if debug is enabled\n if (req.payload.config.debug && !context.hierarchyCacheStats) {\n context.hierarchyCacheStats = {\n hits: 0,\n misses: 0,\n queries: 0,\n }\n }\n\n const parentValue = doc[parentFieldName]\n let parentID: number | string | undefined\n\n if (!parentValue) {\n // No parent - root document\n parentID = undefined\n } else {\n // Extract ID from parent value\n // Parent can be:\n // - Plain ID (string/number)\n // - Populated object with { id: ... }\n if (typeof parentValue === 'object' && 'id' in parentValue) {\n parentID = parentValue.id\n } else {\n parentID = parentValue as number | string\n }\n }\n\n if (parentID) {\n // Parent is always from the same collection (self-referential)\n const parentCollectionConfig = collection\n const parentHierarchyConfig = parentCollectionConfig.hierarchy\n\n // If parent collection doesn't have hierarchy, we can't compute paths through it\n if (!parentHierarchyConfig || !parentCollectionConfig) {\n const titleValue = getTitleValue({\n document: doc,\n isTitleLocalized,\n locale,\n req,\n titleFieldName,\n })\n\n const slugValue = slugFieldName\n ? getSlugFieldValue({\n document: doc,\n isSlugLocalized: isSlugFieldLocalized,\n locale,\n req,\n slugFieldName,\n })\n : undefined\n\n if (isTitleLocalized && locale === 'all') {\n return buildLocalizedHierarchyPaths({\n req,\n slugify,\n slugValue: slugValue as Record<string, string> | undefined,\n titleValue: titleValue as Record<string, string>,\n })\n }\n\n return {\n slugPath: slugValue !== undefined ? slugValue : slugify(titleValue as string),\n titlePath: titleValue as string,\n }\n }\n\n // Initialize cache for parent collection if needed\n if (!context.hierarchyAncestorCache[collection.slug]) {\n context.hierarchyAncestorCache[collection.slug] = {}\n }\n\n const cache = context.hierarchyAncestorCache[collection.slug]\n const cacheKey = `${parentID}_${locale || 'default'}`\n\n // Check cache first\n let parent = cache[cacheKey]\n\n if (parent) {\n // Cache hit\n if (context.hierarchyCacheStats) {\n context.hierarchyCacheStats.hits += 1\n }\n } else {\n // Cache miss - fetch parent\n if (context.hierarchyCacheStats) {\n context.hierarchyCacheStats.misses += 1\n context.hierarchyCacheStats.queries += 1\n }\n\n const parentTitleField = findUseAsTitleField(parentCollectionConfig).titleFieldName\n\n // parentID is guaranteed to be defined here (we're inside if (parentID))\n const validParentID = parentID\n\n // Create new context with computeHierarchyPaths enabled to trigger recursive path computation\n const parentReq = {\n ...req,\n context: {\n ...req.context,\n computeHierarchyPaths: true,\n },\n }\n\n // Fetch parent\n // When locale === 'all', we need special handling because Payload doesn't support\n // fetching all locales of a draft document (drafts are stored per-locale).\n // Strategy: Try published first, fallback to fetching each locale separately for drafts.\n const fetchParent = async () => {\n if (locale === 'all') {\n try {\n // First try to fetch published version with all locales\n return await req.payload.findByID({\n id: validParentID,\n collection: collection.slug,\n depth: 0,\n locale,\n overrideAccess: true,\n req: parentReq,\n select: {\n [parentHierarchyConfig.parentFieldName]: true,\n [parentHierarchyConfig.slugPathFieldName]: true,\n [parentHierarchyConfig.titlePathFieldName]: true,\n [parentTitleField]: true,\n ...(slugFieldName ? { [slugFieldName]: true } : {}),\n },\n user: req.user,\n })\n } catch (_error) {\n // Published version not found, must be a draft\n // Payload doesn't support fetching all locales of a draft with a single query\n // So we need to fetch each locale separately and combine the path data\n const locales = req.payload.config.localization\n ? req.payload.config.localization.localeCodes\n : []\n const parentPathsByLocale: Record<\n string,\n { slugPath?: string; title?: string; titlePath?: string }\n > = {}\n\n // Get parent collection's slugify function (may differ from child's)\n const parentSlugify =\n (parentCollectionConfig.hierarchy !== false &&\n parentCollectionConfig.hierarchy.slugify) ||\n ((text: string) => payloadSlugify(text) || '')\n\n // Fetch parent for each locale to get paths\n for (const loc of locales) {\n // Create a new request with this specific locale but keep computeHierarchyPaths flag\n const localeReq = {\n ...req,\n context: {\n ...req.context,\n computeHierarchyPaths: true,\n },\n locale: loc,\n }\n\n try {\n const parentForLocale = await req.payload.findByID({\n id: validParentID,\n collection: collection.slug,\n depth: 0,\n draft: true,\n locale: loc,\n overrideAccess: true,\n req: localeReq,\n user: req.user,\n })\n\n // Extract the path fields and title from the parent\n // If paths weren't computed (undefined), compute them manually for root documents\n let parentSlugPath = parentForLocale[parentHierarchyConfig.slugPathFieldName]\n let parentTitlePath = parentForLocale[parentHierarchyConfig.titlePathFieldName]\n const parentTitle = parentForLocale[parentTitleField]\n\n // If paths are undefined, this might be a root document - compute paths from title\n if (!parentSlugPath && parentTitle) {\n parentSlugPath = parentSlugify(parentTitle)\n }\n if (!parentTitlePath && parentTitle) {\n parentTitlePath = parentTitle\n }\n\n parentPathsByLocale[loc] = {\n slugPath: parentSlugPath,\n title: parentTitle,\n titlePath: parentTitlePath,\n }\n } catch (_localeError) {\n // This locale doesn't exist, skip it\n }\n }\n\n // Combine the path data from all locales into a single parent object\n const combinedSlugPaths: Record<string, string | undefined> = {}\n const combinedTitlePaths: Record<string, string | undefined> = {}\n const combinedTitles: Record<string, string | undefined> = {}\n\n for (const loc of locales) {\n if (parentPathsByLocale[loc]) {\n combinedSlugPaths[loc] = parentPathsByLocale[loc].slugPath\n combinedTitlePaths[loc] = parentPathsByLocale[loc].titlePath\n combinedTitles[loc] = parentPathsByLocale[loc].title\n }\n }\n\n // Return a parent object with only the hierarchy fields we need\n // (all properly formatted as multi-locale objects)\n return {\n id: validParentID,\n [parentHierarchyConfig.slugPathFieldName]: combinedSlugPaths,\n [parentHierarchyConfig.titlePathFieldName]: combinedTitlePaths,\n [parentTitleField]: combinedTitles,\n }\n }\n } else {\n // Normal case: single locale, can pass draft parameter\n return await req.payload.findByID({\n id: validParentID,\n collection: collection.slug,\n depth: 0,\n draft,\n locale,\n overrideAccess: true,\n req: parentReq,\n select: {\n [parentHierarchyConfig.parentFieldName]: true,\n [parentHierarchyConfig.slugPathFieldName]: true,\n [parentHierarchyConfig.titlePathFieldName]: true,\n [parentTitleField]: true,\n ...(slugFieldName ? { [slugFieldName]: true } : {}),\n },\n user: req.user,\n })\n }\n }\n\n try {\n parent = await fetchParent()\n\n // Store in cache\n cache[cacheKey] = parent\n } catch {\n // If we can't fetch the parent at all (even with fallbacks), treat this as a root document\n // This can happen with complex draft/locale combinations\n parentID = undefined\n }\n }\n\n // If parent fetch failed, treat as root document\n if (!parentID || !parent) {\n const titleValue = getTitleValue({\n document: doc,\n isTitleLocalized,\n locale,\n req,\n titleFieldName,\n })\n\n const slugValue = slugFieldName\n ? getSlugFieldValue({\n document: doc,\n isSlugLocalized: isSlugFieldLocalized,\n locale,\n req,\n slugFieldName,\n })\n : undefined\n\n if (isTitleLocalized && locale === 'all') {\n return buildLocalizedHierarchyPaths({\n req,\n slugify,\n slugValue: slugValue as Record<string, string> | undefined,\n titleValue: titleValue as Record<string, string>,\n })\n }\n\n return {\n slugPath: slugValue !== undefined ? slugValue : slugify(titleValue as string),\n titlePath: titleValue as string,\n }\n }\n\n const docTitle = getTitleValue({ document: doc, isTitleLocalized, locale, req, titleFieldName })\n\n // Cache the current document (in its own collection's cache)\n const currentDocCacheKey = `${doc.id}_${locale || 'default'}`\n if (!context.hierarchyAncestorCache[collection.slug]) {\n context.hierarchyAncestorCache[collection.slug] = {}\n }\n context.hierarchyAncestorCache[collection.slug][currentDocCacheKey] = {\n [parentFieldName]: parentID,\n [slugPathFieldName]: undefined, // Will be set below\n [titleFieldName]: docTitle,\n [titlePathFieldName]: undefined, // Will be set below\n }\n\n // Get parent's path field names from hierarchy config\n const parentSlugPathFieldName =\n parentCollectionConfig.hierarchy !== false\n ? parentCollectionConfig.hierarchy.slugPathFieldName\n : HIERARCHY_SLUG_PATH_FIELD\n const parentTitlePathFieldName =\n parentCollectionConfig.hierarchy !== false\n ? parentCollectionConfig.hierarchy.titlePathFieldName\n : HIERARCHY_TITLE_PATH_FIELD\n\n // Handle localized case (locale === 'all' with localized title field)\n if (isTitleLocalized && locale === 'all') {\n // Parent might have non-localized title field, resulting in string paths instead of objects\n // Convert parent paths to objects if they're strings (use same value for all locales)\n let parentSlugPathObj: Record<string, string> | undefined = parent[\n parentSlugPathFieldName\n ] as Record<string, string> | undefined\n let parentTitlePathObj: Record<string, string> | undefined = parent[\n parentTitlePathFieldName\n ] as Record<string, string> | undefined\n\n // If parent paths are strings (non-localized parent), convert to objects for all locales\n if (typeof parentSlugPathObj === 'string') {\n const locales = req.payload.config.localization\n ? req.payload.config.localization.localeCodes\n : []\n const slugValue = parentSlugPathObj\n parentSlugPathObj = {}\n for (const loc of locales) {\n parentSlugPathObj[loc] = slugValue\n }\n }\n\n if (typeof parentTitlePathObj === 'string') {\n const locales = req.payload.config.localization\n ? req.payload.config.localization.localeCodes\n : []\n const titleValue = parentTitlePathObj\n parentTitlePathObj = {}\n for (const loc of locales) {\n parentTitlePathObj[loc] = titleValue\n }\n }\n\n // Get slug value if slugField is configured\n const docSlugValue = slugFieldName\n ? getSlugFieldValue({\n document: doc,\n isSlugLocalized: isSlugFieldLocalized,\n locale,\n req,\n slugFieldName,\n })\n : undefined\n\n // If parent paths are undefined (parent fetch failed or paths not computed),\n // buildLocalizedHierarchyPaths will handle it by using just the child's title\n const result = buildLocalizedHierarchyPaths({\n parentSlugPath: parentSlugPathObj,\n parentTitlePath: parentTitlePathObj,\n req,\n slugify,\n slugValue: docSlugValue as Record<string, string> | undefined,\n titleValue: docTitle as Record<string, string>,\n })\n\n // Update cache with computed paths\n context.hierarchyAncestorCache[collection.slug][currentDocCacheKey][slugPathFieldName] =\n result.slugPath\n context.hierarchyAncestorCache[collection.slug][currentDocCacheKey][titlePathFieldName] =\n result.titlePath\n\n return result\n }\n\n // Single locale case - get slug value if slugField is configured\n const singleLocaleSlugValue = slugFieldName\n ? getSlugFieldValue({\n document: doc,\n isSlugLocalized: isSlugFieldLocalized,\n locale,\n req,\n slugFieldName,\n })\n : undefined\n\n const slugSegment =\n singleLocaleSlugValue !== undefined\n ? (singleLocaleSlugValue as string)\n : slugify(docTitle as string)\n\n const result = {\n slugPath: (parent[parentSlugPathFieldName] as string) + '/' + slugSegment,\n titlePath: (parent[parentTitlePathFieldName] as string) + '/' + (docTitle as string),\n }\n\n // Update cache with computed paths\n context.hierarchyAncestorCache[collection.slug][currentDocCacheKey][slugPathFieldName] =\n result.slugPath\n context.hierarchyAncestorCache[collection.slug][currentDocCacheKey][titlePathFieldName] =\n result.titlePath\n\n return result\n } else {\n // Root document (no parent)\n const titleValue = getTitleValue({\n document: doc,\n isTitleLocalized,\n locale,\n req,\n titleFieldName,\n })\n context.hierarchyAncestorCache[collection.slug][doc.id] = {\n [parentFieldName]: null,\n [titleFieldName]: titleValue,\n }\n\n const rootSlugValue = slugFieldName\n ? getSlugFieldValue({\n document: doc,\n isSlugLocalized: isSlugFieldLocalized,\n locale,\n req,\n slugFieldName,\n })\n : undefined\n\n // Handle localized case (locale === 'all' with localized title field)\n if (isTitleLocalized && locale === 'all') {\n return buildLocalizedHierarchyPaths({\n req,\n slugify,\n slugValue: rootSlugValue as Record<string, string> | undefined,\n titleValue: titleValue as Record<string, string>,\n })\n }\n\n // Single locale case\n return {\n slugPath: rootSlugValue !== undefined ? rootSlugValue : slugify(titleValue as string),\n titlePath: titleValue as string,\n }\n }\n}\n"],"names":["slugify","payloadSlugify","HIERARCHY_SLUG_PATH_FIELD","HIERARCHY_TITLE_PATH_FIELD","buildLocalizedHierarchyPaths","findFieldByName","findUseAsTitleField","getLocalizedValue","getTitleValue","document","isTitleLocalized","locale","req","titleFieldName","titleValue","id","toString","localizedValue","fallbackLocale","fieldType","value","getSlugFieldValue","isSlugLocalized","slugFieldName","slugValue","undefined","computePaths","args","collection","doc","draft","parentFieldName","slugPathFieldName","titlePathFieldName","hierarchy","text","localized","slugField","slugFieldInfo","isSlugFieldLocalized","context","hierarchyAncestorCache","slug","payload","config","debug","hierarchyCacheStats","hits","misses","queries","parentValue","parentID","parentCollectionConfig","parentHierarchyConfig","slugPath","titlePath","cache","cacheKey","parent","parentTitleField","validParentID","parentReq","computeHierarchyPaths","fetchParent","findByID","depth","overrideAccess","select","user","_error","locales","localization","localeCodes","parentPathsByLocale","parentSlugify","loc","localeReq","parentForLocale","parentSlugPath","parentTitlePath","parentTitle","title","_localeError","combinedSlugPaths","combinedTitlePaths","combinedTitles","docTitle","currentDocCacheKey","parentSlugPathFieldName","parentTitlePathFieldName","parentSlugPathObj","parentTitlePathObj","docSlugValue","result","singleLocaleSlugValue","slugSegment","rootSlugValue"],"mappings":"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"}