payload 3.80.0-internal-debug.cd99b1f → 3.80.0-internal.21e9c47

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 (259) hide show
  1. package/dist/admin/elements/Nav.d.ts +10 -0
  2. package/dist/admin/elements/Nav.d.ts.map +1 -1
  3. package/dist/admin/elements/Nav.js.map +1 -1
  4. package/dist/admin/functions/index.d.ts +1 -38
  5. package/dist/admin/functions/index.d.ts.map +1 -1
  6. package/dist/admin/functions/index.js.map +1 -1
  7. package/dist/admin/types.d.ts +5 -4
  8. package/dist/admin/types.d.ts.map +1 -1
  9. package/dist/admin/types.js.map +1 -1
  10. package/dist/admin/views/hierarchyList.d.ts +9 -0
  11. package/dist/admin/views/hierarchyList.d.ts.map +1 -0
  12. package/dist/admin/views/hierarchyList.js +3 -0
  13. package/dist/admin/views/hierarchyList.js.map +1 -0
  14. package/dist/admin/views/index.d.ts +1 -3
  15. package/dist/admin/views/index.d.ts.map +1 -1
  16. package/dist/admin/views/index.js.map +1 -1
  17. package/dist/admin/views/list.d.ts +37 -1
  18. package/dist/admin/views/list.d.ts.map +1 -1
  19. package/dist/admin/views/list.js.map +1 -1
  20. package/dist/auth/operations/me.js +5 -5
  21. package/dist/auth/operations/me.js.map +1 -1
  22. package/dist/bin/generateImportMap/iterateCollections.d.ts.map +1 -1
  23. package/dist/bin/generateImportMap/iterateCollections.js +1 -0
  24. package/dist/bin/generateImportMap/iterateCollections.js.map +1 -1
  25. package/dist/bin/generateImportMap/iterateConfig.d.ts.map +1 -1
  26. package/dist/bin/generateImportMap/iterateConfig.js +7 -0
  27. package/dist/bin/generateImportMap/iterateConfig.js.map +1 -1
  28. package/dist/collections/config/client.d.ts +3 -1
  29. package/dist/collections/config/client.d.ts.map +1 -1
  30. package/dist/collections/config/client.js +11 -0
  31. package/dist/collections/config/client.js.map +1 -1
  32. package/dist/collections/config/defaults.js +1 -1
  33. package/dist/collections/config/defaults.js.map +1 -1
  34. package/dist/collections/config/sanitize.d.ts.map +1 -1
  35. package/dist/collections/config/sanitize.js +3 -7
  36. package/dist/collections/config/sanitize.js.map +1 -1
  37. package/dist/collections/config/types.d.ts +29 -7
  38. package/dist/collections/config/types.d.ts.map +1 -1
  39. package/dist/collections/config/types.js.map +1 -1
  40. package/dist/collections/operations/create.js +17 -17
  41. package/dist/collections/operations/create.js.map +1 -1
  42. package/dist/collections/operations/findByID.js +3 -3
  43. package/dist/collections/operations/findByID.js.map +1 -1
  44. package/dist/collections/operations/utilities/update.d.ts.map +1 -1
  45. package/dist/collections/operations/utilities/update.js +5 -4
  46. package/dist/collections/operations/utilities/update.js.map +1 -1
  47. package/dist/config/client.d.ts.map +1 -1
  48. package/dist/config/client.js +0 -10
  49. package/dist/config/client.js.map +1 -1
  50. package/dist/config/defaults.d.ts.map +1 -1
  51. package/dist/config/defaults.js +0 -15
  52. package/dist/config/defaults.js.map +1 -1
  53. package/dist/config/sanitize.d.ts.map +1 -1
  54. package/dist/config/sanitize.js +3 -26
  55. package/dist/config/sanitize.js.map +1 -1
  56. package/dist/config/types.d.ts +26 -12
  57. package/dist/config/types.d.ts.map +1 -1
  58. package/dist/config/types.js.map +1 -1
  59. package/dist/exports/shared.d.ts +2 -3
  60. package/dist/exports/shared.d.ts.map +1 -1
  61. package/dist/exports/shared.js +1 -2
  62. package/dist/exports/shared.js.map +1 -1
  63. package/dist/fields/config/sanitize.d.ts.map +1 -1
  64. package/dist/fields/config/sanitize.js +4 -0
  65. package/dist/fields/config/sanitize.js.map +1 -1
  66. package/dist/fields/config/sanitizeJoinField.d.ts.map +1 -1
  67. package/dist/fields/config/sanitizeJoinField.js +3 -0
  68. package/dist/fields/config/sanitizeJoinField.js.map +1 -1
  69. package/dist/globals/config/types.d.ts +4 -0
  70. package/dist/globals/config/types.d.ts.map +1 -1
  71. package/dist/globals/config/types.js.map +1 -1
  72. package/dist/hierarchy/addHierarchyToCollection.d.ts +8 -0
  73. package/dist/hierarchy/addHierarchyToCollection.d.ts.map +1 -0
  74. package/dist/hierarchy/addHierarchyToCollection.js +62 -0
  75. package/dist/hierarchy/addHierarchyToCollection.js.map +1 -0
  76. package/dist/hierarchy/buildParentField.d.ts +11 -0
  77. package/dist/hierarchy/buildParentField.d.ts.map +1 -0
  78. package/dist/hierarchy/buildParentField.js +42 -0
  79. package/dist/hierarchy/buildParentField.js.map +1 -0
  80. package/dist/hierarchy/constants.d.ts +15 -0
  81. package/dist/hierarchy/constants.d.ts.map +1 -0
  82. package/dist/hierarchy/constants.js +11 -0
  83. package/dist/hierarchy/constants.js.map +1 -0
  84. package/dist/hierarchy/createFolderField.d.ts +39 -0
  85. package/dist/hierarchy/createFolderField.d.ts.map +1 -0
  86. package/dist/hierarchy/createFolderField.js +54 -0
  87. package/dist/hierarchy/createFolderField.js.map +1 -0
  88. package/dist/hierarchy/createFoldersCollection.d.ts +57 -0
  89. package/dist/hierarchy/createFoldersCollection.d.ts.map +1 -0
  90. package/dist/hierarchy/createFoldersCollection.js +63 -0
  91. package/dist/hierarchy/createFoldersCollection.js.map +1 -0
  92. package/dist/hierarchy/createTagField.d.ts +44 -0
  93. package/dist/hierarchy/createTagField.d.ts.map +1 -0
  94. package/dist/hierarchy/createTagField.js +48 -0
  95. package/dist/hierarchy/createTagField.js.map +1 -0
  96. package/dist/hierarchy/createTagsCollection.d.ts +54 -0
  97. package/dist/hierarchy/createTagsCollection.d.ts.map +1 -0
  98. package/dist/hierarchy/createTagsCollection.js +56 -0
  99. package/dist/hierarchy/createTagsCollection.js.map +1 -0
  100. package/dist/hierarchy/endpoints/findRelated.d.ts +7 -0
  101. package/dist/hierarchy/endpoints/findRelated.d.ts.map +1 -0
  102. package/dist/hierarchy/endpoints/findRelated.js +36 -0
  103. package/dist/hierarchy/endpoints/findRelated.js.map +1 -0
  104. package/dist/hierarchy/getInitialTreeData.d.ts +24 -0
  105. package/dist/hierarchy/getInitialTreeData.d.ts.map +1 -0
  106. package/dist/hierarchy/getInitialTreeData.js +120 -0
  107. package/dist/hierarchy/getInitialTreeData.js.map +1 -0
  108. package/dist/hierarchy/hooks/collectionAfterDelete.d.ts +14 -0
  109. package/dist/hierarchy/hooks/collectionAfterDelete.d.ts.map +1 -0
  110. package/dist/hierarchy/hooks/collectionAfterDelete.js +21 -0
  111. package/dist/hierarchy/hooks/collectionAfterDelete.js.map +1 -0
  112. package/dist/hierarchy/hooks/collectionAfterRead.d.ts +27 -0
  113. package/dist/hierarchy/hooks/collectionAfterRead.d.ts.map +1 -0
  114. package/dist/hierarchy/hooks/collectionAfterRead.js +64 -0
  115. package/dist/hierarchy/hooks/collectionAfterRead.js.map +1 -0
  116. package/dist/hierarchy/hooks/collectionBeforeChange.d.ts +19 -0
  117. package/dist/hierarchy/hooks/collectionBeforeChange.d.ts.map +1 -0
  118. package/dist/hierarchy/hooks/collectionBeforeChange.js +90 -0
  119. package/dist/hierarchy/hooks/collectionBeforeChange.js.map +1 -0
  120. package/dist/hierarchy/hooks/collectionBeforeDelete.d.ts +15 -0
  121. package/dist/hierarchy/hooks/collectionBeforeDelete.d.ts.map +1 -0
  122. package/dist/hierarchy/hooks/collectionBeforeDelete.js +20 -0
  123. package/dist/hierarchy/hooks/collectionBeforeDelete.js.map +1 -0
  124. package/dist/hierarchy/hooks/ensureSafeCollectionsChange.d.ts +8 -0
  125. package/dist/hierarchy/hooks/ensureSafeCollectionsChange.d.ts.map +1 -0
  126. package/dist/hierarchy/hooks/ensureSafeCollectionsChange.js +108 -0
  127. package/dist/hierarchy/hooks/ensureSafeCollectionsChange.js.map +1 -0
  128. package/dist/hierarchy/injectHierarchyButton.d.ts +14 -0
  129. package/dist/hierarchy/injectHierarchyButton.d.ts.map +1 -0
  130. package/dist/hierarchy/injectHierarchyButton.js +37 -0
  131. package/dist/hierarchy/injectHierarchyButton.js.map +1 -0
  132. package/dist/hierarchy/operations/findRelatedDocuments.d.ts +24 -0
  133. package/dist/hierarchy/operations/findRelatedDocuments.d.ts.map +1 -0
  134. package/dist/hierarchy/operations/findRelatedDocuments.js +73 -0
  135. package/dist/hierarchy/operations/findRelatedDocuments.js.map +1 -0
  136. package/dist/hierarchy/operations/index.d.ts +2 -0
  137. package/dist/hierarchy/operations/index.d.ts.map +1 -0
  138. package/dist/hierarchy/operations/index.js +3 -0
  139. package/dist/hierarchy/operations/index.js.map +1 -0
  140. package/dist/hierarchy/resolveHierarchyCollections.d.ts +23 -0
  141. package/dist/hierarchy/resolveHierarchyCollections.d.ts.map +1 -0
  142. package/dist/hierarchy/resolveHierarchyCollections.js +312 -0
  143. package/dist/hierarchy/resolveHierarchyCollections.js.map +1 -0
  144. package/dist/hierarchy/sanitizeHierarchyCollection.d.ts +14 -0
  145. package/dist/hierarchy/sanitizeHierarchyCollection.d.ts.map +1 -0
  146. package/dist/hierarchy/sanitizeHierarchyCollection.js +125 -0
  147. package/dist/hierarchy/sanitizeHierarchyCollection.js.map +1 -0
  148. package/dist/hierarchy/types.d.ts +137 -0
  149. package/dist/hierarchy/types.d.ts.map +1 -0
  150. package/dist/hierarchy/types.js +6 -0
  151. package/dist/hierarchy/types.js.map +1 -0
  152. package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.d.ts +71 -0
  153. package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.d.ts.map +1 -0
  154. package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.js +65 -0
  155. package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.js.map +1 -0
  156. package/dist/hierarchy/utils/computePaths.d.ts +31 -0
  157. package/dist/hierarchy/utils/computePaths.d.ts.map +1 -0
  158. package/dist/hierarchy/utils/computePaths.js +371 -0
  159. package/dist/hierarchy/utils/computePaths.js.map +1 -0
  160. package/dist/hierarchy/utils/findUseAsTitle.d.ts +6 -0
  161. package/dist/hierarchy/utils/findUseAsTitle.d.ts.map +1 -0
  162. package/dist/hierarchy/utils/findUseAsTitle.js +72 -0
  163. package/dist/hierarchy/utils/findUseAsTitle.js.map +1 -0
  164. package/dist/hierarchy/utils/getAncestors.d.ts +34 -0
  165. package/dist/hierarchy/utils/getAncestors.d.ts.map +1 -0
  166. package/dist/hierarchy/utils/getAncestors.js +94 -0
  167. package/dist/hierarchy/utils/getAncestors.js.map +1 -0
  168. package/dist/hierarchy/utils/getLocalizedValue.d.ts +30 -0
  169. package/dist/hierarchy/utils/getLocalizedValue.d.ts.map +1 -0
  170. package/dist/hierarchy/utils/getLocalizedValue.js +46 -0
  171. package/dist/hierarchy/utils/getLocalizedValue.js.map +1 -0
  172. package/dist/hierarchy/utils/getLocalizedValue.spec.js +250 -0
  173. package/dist/hierarchy/utils/getLocalizedValue.spec.js.map +1 -0
  174. package/dist/index.bundled.d.ts +567 -280
  175. package/dist/index.d.ts +23 -9
  176. package/dist/index.d.ts.map +1 -1
  177. package/dist/index.js +13 -5
  178. package/dist/index.js.map +1 -1
  179. package/dist/preferences/keys.d.ts +8 -4
  180. package/dist/preferences/keys.d.ts.map +1 -1
  181. package/dist/preferences/keys.js +7 -4
  182. package/dist/preferences/keys.js.map +1 -1
  183. package/dist/types/index.d.ts +1 -0
  184. package/dist/types/index.d.ts.map +1 -1
  185. package/dist/types/index.js.map +1 -1
  186. package/dist/utilities/extractID.js +1 -1
  187. package/dist/utilities/extractID.js.map +1 -1
  188. package/dist/utilities/formatAdminURL.d.ts +13 -2
  189. package/dist/utilities/formatAdminURL.d.ts.map +1 -1
  190. package/dist/utilities/formatAdminURL.js.map +1 -1
  191. package/package.json +2 -2
  192. package/dist/admin/views/folderList.d.ts +0 -56
  193. package/dist/admin/views/folderList.d.ts.map +0 -1
  194. package/dist/admin/views/folderList.js +0 -3
  195. package/dist/admin/views/folderList.js.map +0 -1
  196. package/dist/folders/addFolderCollection.d.ts +0 -10
  197. package/dist/folders/addFolderCollection.d.ts.map +0 -1
  198. package/dist/folders/addFolderCollection.js +0 -26
  199. package/dist/folders/addFolderCollection.js.map +0 -1
  200. package/dist/folders/addFolderFieldToCollection.d.ts +0 -8
  201. package/dist/folders/addFolderFieldToCollection.d.ts.map +0 -1
  202. package/dist/folders/addFolderFieldToCollection.js +0 -20
  203. package/dist/folders/addFolderFieldToCollection.js.map +0 -1
  204. package/dist/folders/buildFolderField.d.ts +0 -8
  205. package/dist/folders/buildFolderField.d.ts.map +0 -1
  206. package/dist/folders/buildFolderField.js +0 -87
  207. package/dist/folders/buildFolderField.js.map +0 -1
  208. package/dist/folders/constants.d.ts +0 -3
  209. package/dist/folders/constants.d.ts.map +0 -1
  210. package/dist/folders/constants.js +0 -4
  211. package/dist/folders/constants.js.map +0 -1
  212. package/dist/folders/createFolderCollection.d.ts +0 -11
  213. package/dist/folders/createFolderCollection.d.ts.map +0 -1
  214. package/dist/folders/createFolderCollection.js +0 -115
  215. package/dist/folders/createFolderCollection.js.map +0 -1
  216. package/dist/folders/hooks/deleteSubfoldersAfterDelete.d.ts +0 -8
  217. package/dist/folders/hooks/deleteSubfoldersAfterDelete.d.ts.map +0 -1
  218. package/dist/folders/hooks/deleteSubfoldersAfterDelete.js +0 -15
  219. package/dist/folders/hooks/deleteSubfoldersAfterDelete.js.map +0 -1
  220. package/dist/folders/hooks/dissasociateAfterDelete.d.ts +0 -8
  221. package/dist/folders/hooks/dissasociateAfterDelete.d.ts.map +0 -1
  222. package/dist/folders/hooks/dissasociateAfterDelete.js +0 -20
  223. package/dist/folders/hooks/dissasociateAfterDelete.js.map +0 -1
  224. package/dist/folders/hooks/ensureSafeCollectionsChange.d.ts +0 -5
  225. package/dist/folders/hooks/ensureSafeCollectionsChange.d.ts.map +0 -1
  226. package/dist/folders/hooks/ensureSafeCollectionsChange.js +0 -107
  227. package/dist/folders/hooks/ensureSafeCollectionsChange.js.map +0 -1
  228. package/dist/folders/hooks/reparentChildFolder.d.ts +0 -24
  229. package/dist/folders/hooks/reparentChildFolder.d.ts.map +0 -1
  230. package/dist/folders/hooks/reparentChildFolder.js +0 -72
  231. package/dist/folders/hooks/reparentChildFolder.js.map +0 -1
  232. package/dist/folders/types.d.ts +0 -118
  233. package/dist/folders/types.d.ts.map +0 -1
  234. package/dist/folders/types.js +0 -3
  235. package/dist/folders/types.js.map +0 -1
  236. package/dist/folders/utils/buildFolderWhereConstraints.d.ts +0 -13
  237. package/dist/folders/utils/buildFolderWhereConstraints.d.ts.map +0 -1
  238. package/dist/folders/utils/buildFolderWhereConstraints.js +0 -45
  239. package/dist/folders/utils/buildFolderWhereConstraints.js.map +0 -1
  240. package/dist/folders/utils/formatFolderOrDocumentItem.d.ts +0 -12
  241. package/dist/folders/utils/formatFolderOrDocumentItem.d.ts.map +0 -1
  242. package/dist/folders/utils/formatFolderOrDocumentItem.js +0 -30
  243. package/dist/folders/utils/formatFolderOrDocumentItem.js.map +0 -1
  244. package/dist/folders/utils/getFolderBreadcrumbs.d.ts +0 -14
  245. package/dist/folders/utils/getFolderBreadcrumbs.d.ts.map +0 -1
  246. package/dist/folders/utils/getFolderBreadcrumbs.js +0 -45
  247. package/dist/folders/utils/getFolderBreadcrumbs.js.map +0 -1
  248. package/dist/folders/utils/getFolderData.d.ts +0 -33
  249. package/dist/folders/utils/getFolderData.d.ts.map +0 -1
  250. package/dist/folders/utils/getFolderData.js +0 -88
  251. package/dist/folders/utils/getFolderData.js.map +0 -1
  252. package/dist/folders/utils/getFoldersAndDocumentsFromJoin.d.ts +0 -24
  253. package/dist/folders/utils/getFoldersAndDocumentsFromJoin.d.ts.map +0 -1
  254. package/dist/folders/utils/getFoldersAndDocumentsFromJoin.js +0 -66
  255. package/dist/folders/utils/getFoldersAndDocumentsFromJoin.js.map +0 -1
  256. package/dist/folders/utils/getOrphanedDocs.d.ts +0 -15
  257. package/dist/folders/utils/getOrphanedDocs.d.ts.map +0 -1
  258. package/dist/folders/utils/getOrphanedDocs.js +0 -40
  259. package/dist/folders/utils/getOrphanedDocs.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hierarchy/createFolderField.ts"],"sourcesContent":["import type { RelationshipField, SingleRelationshipField } from '../fields/config/types.js'\n\nimport { getHierarchyFieldName } from './constants.js'\n\n/**\n * Options for creating a folder relationship field.\n * All SingleRelationshipField properties are available except name, type, relationTo, and hasMany\n * which are managed by the folder system.\n */\nexport type CreateFolderFieldOptions = {\n /**\n * The slug of the hierarchy collection this field references (e.g., 'folders')\n */\n relationTo: string\n} & Pick<Partial<SingleRelationshipField>, 'admin' | 'label' | 'required'>\n\n/**\n * Creates a relationship field for folder-style hierarchies (single-select).\n *\n * This field:\n * - Has hasMany:false (single folder selection)\n * - Uses NullField to render nothing in the form (no DOM output)\n * - Injects a header button for folder selection via miller columns UI\n *\n * Use this in your collection's fields array to add a folder relationship.\n * The field name is automatically generated based on the hierarchy slug.\n *\n * @example\n * import { createFolderField } from 'payload'\n *\n * const Posts: CollectionConfig = {\n * slug: 'posts',\n * fields: [\n * { name: 'title', type: 'text' },\n * createFolderField({\n * relationTo: 'folders',\n * label: 'Folder',\n * }),\n * ],\n * }\n */\nexport function createFolderField(options: CreateFolderFieldOptions): RelationshipField {\n const { admin: adminOverrides, label, relationTo, ...restOptions } = options\n const { components: componentOverrides, ...restAdminOverrides } = adminOverrides || {}\n\n return {\n name: getHierarchyFieldName(relationTo),\n type: 'relationship',\n admin: {\n position: 'sidebar',\n ...restAdminOverrides,\n components: {\n // NullField renders nothing - the header button handles the UI\n Field: '@payloadcms/ui#NullField',\n ...componentOverrides,\n },\n },\n custom: {\n hierarchy: {\n injectHeaderButton: true,\n },\n },\n hasMany: false,\n index: true,\n label: label ?? 'Folder',\n relationTo,\n ...restOptions,\n } as RelationshipField\n}\n"],"names":["getHierarchyFieldName","createFolderField","options","admin","adminOverrides","label","relationTo","restOptions","components","componentOverrides","restAdminOverrides","name","type","position","Field","custom","hierarchy","injectHeaderButton","hasMany","index"],"mappings":"AAEA,SAASA,qBAAqB,QAAQ,iBAAgB;AActD;;;;;;;;;;;;;;;;;;;;;;;;CAwBC,GACD,OAAO,SAASC,kBAAkBC,OAAiC;IACjE,MAAM,EAAEC,OAAOC,cAAc,EAAEC,KAAK,EAAEC,UAAU,EAAE,GAAGC,aAAa,GAAGL;IACrE,MAAM,EAAEM,YAAYC,kBAAkB,EAAE,GAAGC,oBAAoB,GAAGN,kBAAkB,CAAC;IAErF,OAAO;QACLO,MAAMX,sBAAsBM;QAC5BM,MAAM;QACNT,OAAO;YACLU,UAAU;YACV,GAAGH,kBAAkB;YACrBF,YAAY;gBACV,+DAA+D;gBAC/DM,OAAO;gBACP,GAAGL,kBAAkB;YACvB;QACF;QACAM,QAAQ;YACNC,WAAW;gBACTC,oBAAoB;YACtB;QACF;QACAC,SAAS;QACTC,OAAO;QACPd,OAAOA,SAAS;QAChBC;QACA,GAAGC,WAAW;IAChB;AACF"}
@@ -0,0 +1,57 @@
1
+ import type { CollectionConfig } from '../collections/config/types.js';
2
+ import type { HierarchyConfig } from './types.js';
3
+ /**
4
+ * Hierarchy options for folder collections - all fields optional since defaults are applied.
5
+ * Cannot override `allowHasMany` - folders always use single-select.
6
+ */
7
+ type FolderHierarchyOptions = {
8
+ parentFieldName?: string;
9
+ } & Partial<Omit<HierarchyConfig, 'allowHasMany' | 'parentFieldName'>>;
10
+ /**
11
+ * Options for creating a folder collection.
12
+ * Same as CollectionConfig but with `useAsTitle` required.
13
+ */
14
+ export type CreateFoldersCollectionOptions = {
15
+ /**
16
+ * Hierarchy configuration (defaults applied for folder behavior)
17
+ * Cannot override `allowHasMany` - folders always use single-select
18
+ */
19
+ hierarchy?: FolderHierarchyOptions;
20
+ /**
21
+ * Field name to use as the display title in the folder tree.
22
+ * Required to ensure folders display meaningful names.
23
+ */
24
+ useAsTitle: string;
25
+ } & Omit<CollectionConfig, 'admin' | 'hierarchy'> & Partial<Pick<CollectionConfig, 'admin'>>;
26
+ /**
27
+ * Creates a collection config for a folder-style hierarchy.
28
+ *
29
+ * This helper provides:
30
+ * - `hierarchy.allowHasMany: false` (enforced, folders are single-select)
31
+ * - Default folder icon component
32
+ * - Required `useAsTitle` to ensure folders display meaningful names
33
+ * - `admin.group: false` by default to hide from collections list
34
+ * (folder collections are accessed via their dedicated sidebar tab)
35
+ *
36
+ * @example
37
+ * import { createFoldersCollection, createFolderField } from 'payload'
38
+ *
39
+ * const Folders = createFoldersCollection({
40
+ * slug: 'folders',
41
+ * useAsTitle: 'name',
42
+ * fields: [
43
+ * { name: 'name', type: 'text', required: true },
44
+ * ],
45
+ * })
46
+ *
47
+ * // Then in related collections:
48
+ * const Posts: CollectionConfig = {
49
+ * slug: 'posts',
50
+ * fields: [
51
+ * createFolderField({ relationTo: 'folders' }),
52
+ * ],
53
+ * }
54
+ */
55
+ export declare function createFoldersCollection(options: CreateFoldersCollectionOptions): CollectionConfig;
56
+ export {};
57
+ //# sourceMappingURL=createFoldersCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createFoldersCollection.d.ts","sourceRoot":"","sources":["../../src/hierarchy/createFoldersCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAIjD;;;GAGG;AACH,KAAK,sBAAsB,GAAG;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAA;AAEtE;;;GAGG;AACH,MAAM,MAAM,8BAA8B,GAAG;IAC3C;;;OAGG;IACH,SAAS,CAAC,EAAE,sBAAsB,CAAA;IAClC;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAA;CACnB,GAAG,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,WAAW,CAAC,GAC/C,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAA;AAE1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,8BAA8B,GAAG,gBAAgB,CAiCjG"}
@@ -0,0 +1,63 @@
1
+ import { getHierarchyFieldName } from './constants.js';
2
+ /**
3
+ * Creates a collection config for a folder-style hierarchy.
4
+ *
5
+ * This helper provides:
6
+ * - `hierarchy.allowHasMany: false` (enforced, folders are single-select)
7
+ * - Default folder icon component
8
+ * - Required `useAsTitle` to ensure folders display meaningful names
9
+ * - `admin.group: false` by default to hide from collections list
10
+ * (folder collections are accessed via their dedicated sidebar tab)
11
+ *
12
+ * @example
13
+ * import { createFoldersCollection, createFolderField } from 'payload'
14
+ *
15
+ * const Folders = createFoldersCollection({
16
+ * slug: 'folders',
17
+ * useAsTitle: 'name',
18
+ * fields: [
19
+ * { name: 'name', type: 'text', required: true },
20
+ * ],
21
+ * })
22
+ *
23
+ * // Then in related collections:
24
+ * const Posts: CollectionConfig = {
25
+ * slug: 'posts',
26
+ * fields: [
27
+ * createFolderField({ relationTo: 'folders' }),
28
+ * ],
29
+ * }
30
+ */ export function createFoldersCollection(options) {
31
+ const { admin: adminOverrides, hierarchy: hierarchyOverrides, useAsTitle, ...rest } = options;
32
+ const slug = rest.slug;
33
+ // Default parent field to match the hierarchy field name pattern
34
+ // This enables the joinField to work with both subfolders and related documents
35
+ const parentFieldName = hierarchyOverrides?.parentFieldName ?? getHierarchyFieldName(slug);
36
+ return {
37
+ labels: {
38
+ plural: 'Folders',
39
+ singular: 'Folder'
40
+ },
41
+ ...rest,
42
+ admin: {
43
+ group: false,
44
+ ...adminOverrides,
45
+ useAsTitle
46
+ },
47
+ hierarchy: {
48
+ ...hierarchyOverrides,
49
+ admin: {
50
+ ...hierarchyOverrides?.admin,
51
+ components: {
52
+ Icon: '@payloadcms/ui#FolderIcon',
53
+ ...hierarchyOverrides?.admin?.components
54
+ },
55
+ useHeaderButton: hierarchyOverrides?.admin?.useHeaderButton ?? true
56
+ },
57
+ allowHasMany: false,
58
+ parentFieldName
59
+ }
60
+ };
61
+ }
62
+
63
+ //# sourceMappingURL=createFoldersCollection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hierarchy/createFoldersCollection.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { HierarchyConfig } from './types.js'\n\nimport { getHierarchyFieldName } from './constants.js'\n\n/**\n * Hierarchy options for folder collections - all fields optional since defaults are applied.\n * Cannot override `allowHasMany` - folders always use single-select.\n */\ntype FolderHierarchyOptions = {\n parentFieldName?: string\n} & Partial<Omit<HierarchyConfig, 'allowHasMany' | 'parentFieldName'>>\n\n/**\n * Options for creating a folder collection.\n * Same as CollectionConfig but with `useAsTitle` required.\n */\nexport type CreateFoldersCollectionOptions = {\n /**\n * Hierarchy configuration (defaults applied for folder behavior)\n * Cannot override `allowHasMany` - folders always use single-select\n */\n hierarchy?: FolderHierarchyOptions\n /**\n * Field name to use as the display title in the folder tree.\n * Required to ensure folders display meaningful names.\n */\n useAsTitle: string\n} & Omit<CollectionConfig, 'admin' | 'hierarchy'> &\n Partial<Pick<CollectionConfig, 'admin'>>\n\n/**\n * Creates a collection config for a folder-style hierarchy.\n *\n * This helper provides:\n * - `hierarchy.allowHasMany: false` (enforced, folders are single-select)\n * - Default folder icon component\n * - Required `useAsTitle` to ensure folders display meaningful names\n * - `admin.group: false` by default to hide from collections list\n * (folder collections are accessed via their dedicated sidebar tab)\n *\n * @example\n * import { createFoldersCollection, createFolderField } from 'payload'\n *\n * const Folders = createFoldersCollection({\n * slug: 'folders',\n * useAsTitle: 'name',\n * fields: [\n * { name: 'name', type: 'text', required: true },\n * ],\n * })\n *\n * // Then in related collections:\n * const Posts: CollectionConfig = {\n * slug: 'posts',\n * fields: [\n * createFolderField({ relationTo: 'folders' }),\n * ],\n * }\n */\nexport function createFoldersCollection(options: CreateFoldersCollectionOptions): CollectionConfig {\n const { admin: adminOverrides, hierarchy: hierarchyOverrides, useAsTitle, ...rest } = options\n const slug = rest.slug\n\n // Default parent field to match the hierarchy field name pattern\n // This enables the joinField to work with both subfolders and related documents\n const parentFieldName = hierarchyOverrides?.parentFieldName ?? getHierarchyFieldName(slug)\n\n return {\n labels: {\n plural: 'Folders',\n singular: 'Folder',\n },\n ...rest,\n admin: {\n group: false,\n ...adminOverrides,\n useAsTitle,\n },\n hierarchy: {\n ...hierarchyOverrides,\n admin: {\n ...hierarchyOverrides?.admin,\n components: {\n Icon: '@payloadcms/ui#FolderIcon',\n ...hierarchyOverrides?.admin?.components,\n },\n useHeaderButton: hierarchyOverrides?.admin?.useHeaderButton ?? true,\n },\n allowHasMany: false,\n parentFieldName,\n },\n }\n}\n"],"names":["getHierarchyFieldName","createFoldersCollection","options","admin","adminOverrides","hierarchy","hierarchyOverrides","useAsTitle","rest","slug","parentFieldName","labels","plural","singular","group","components","Icon","useHeaderButton","allowHasMany"],"mappings":"AAGA,SAASA,qBAAqB,QAAQ,iBAAgB;AA4BtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BC,GACD,OAAO,SAASC,wBAAwBC,OAAuC;IAC7E,MAAM,EAAEC,OAAOC,cAAc,EAAEC,WAAWC,kBAAkB,EAAEC,UAAU,EAAE,GAAGC,MAAM,GAAGN;IACtF,MAAMO,OAAOD,KAAKC,IAAI;IAEtB,iEAAiE;IACjE,gFAAgF;IAChF,MAAMC,kBAAkBJ,oBAAoBI,mBAAmBV,sBAAsBS;IAErF,OAAO;QACLE,QAAQ;YACNC,QAAQ;YACRC,UAAU;QACZ;QACA,GAAGL,IAAI;QACPL,OAAO;YACLW,OAAO;YACP,GAAGV,cAAc;YACjBG;QACF;QACAF,WAAW;YACT,GAAGC,kBAAkB;YACrBH,OAAO;gBACL,GAAGG,oBAAoBH,KAAK;gBAC5BY,YAAY;oBACVC,MAAM;oBACN,GAAGV,oBAAoBH,OAAOY,UAAU;gBAC1C;gBACAE,iBAAiBX,oBAAoBH,OAAOc,mBAAmB;YACjE;YACAC,cAAc;YACdR;QACF;IACF;AACF"}
@@ -0,0 +1,44 @@
1
+ import type { RelationshipField } from '../fields/config/types.js';
2
+ /**
3
+ * Options for creating a tag relationship field.
4
+ * All RelationshipFieldMany properties are available except name, type, and relationTo
5
+ * which are managed by the tag system.
6
+ */
7
+ export type CreateTagFieldOptions = {
8
+ /**
9
+ * Whether to allow multiple tags (defaults to true)
10
+ * @default true
11
+ */
12
+ hasMany?: boolean;
13
+ /**
14
+ * The slug of the hierarchy collection this field references (e.g., 'tags')
15
+ */
16
+ relationTo: string;
17
+ } & Pick<Partial<RelationshipField>, 'admin' | 'label' | 'required'>;
18
+ /**
19
+ * Creates a relationship field for tag-style hierarchies (multi-select by default).
20
+ *
21
+ * This field:
22
+ * - Has hasMany:true by default (multiple tag selection)
23
+ * - Is positioned in the sidebar by default
24
+ * - Does NOT inject a header button (tags use standard relationship UI)
25
+ *
26
+ * Use this in your collection's fields array to add a tag relationship.
27
+ * The field name is automatically generated based on the hierarchy slug.
28
+ *
29
+ * @example
30
+ * import { createTagField } from 'payload'
31
+ *
32
+ * const Posts: CollectionConfig = {
33
+ * slug: 'posts',
34
+ * fields: [
35
+ * { name: 'title', type: 'text' },
36
+ * createTagField({
37
+ * relationTo: 'tags',
38
+ * label: 'Tags',
39
+ * }),
40
+ * ],
41
+ * }
42
+ */
43
+ export declare function createTagField(options: CreateTagFieldOptions): RelationshipField;
44
+ //# sourceMappingURL=createTagField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTagField.d.ts","sourceRoot":"","sources":["../../src/hierarchy/createTagField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAIlE;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;CACnB,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC,CAAA;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,iBAAiB,CAqBhF"}
@@ -0,0 +1,48 @@
1
+ import { getHierarchyFieldName } from './constants.js';
2
+ /**
3
+ * Creates a relationship field for tag-style hierarchies (multi-select by default).
4
+ *
5
+ * This field:
6
+ * - Has hasMany:true by default (multiple tag selection)
7
+ * - Is positioned in the sidebar by default
8
+ * - Does NOT inject a header button (tags use standard relationship UI)
9
+ *
10
+ * Use this in your collection's fields array to add a tag relationship.
11
+ * The field name is automatically generated based on the hierarchy slug.
12
+ *
13
+ * @example
14
+ * import { createTagField } from 'payload'
15
+ *
16
+ * const Posts: CollectionConfig = {
17
+ * slug: 'posts',
18
+ * fields: [
19
+ * { name: 'title', type: 'text' },
20
+ * createTagField({
21
+ * relationTo: 'tags',
22
+ * label: 'Tags',
23
+ * }),
24
+ * ],
25
+ * }
26
+ */ export function createTagField(options) {
27
+ const { admin: adminOverrides, hasMany = true, label, relationTo, ...restOptions } = options;
28
+ const { components: componentOverrides, ...restAdminOverrides } = adminOverrides || {};
29
+ return {
30
+ name: getHierarchyFieldName(relationTo),
31
+ type: 'relationship',
32
+ admin: {
33
+ position: 'sidebar',
34
+ ...restAdminOverrides,
35
+ components: {
36
+ Field: '@payloadcms/ui/rsc#HierarchyField',
37
+ ...componentOverrides
38
+ }
39
+ },
40
+ hasMany,
41
+ index: true,
42
+ label: label ?? 'Tags',
43
+ relationTo,
44
+ ...restOptions
45
+ };
46
+ }
47
+
48
+ //# sourceMappingURL=createTagField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hierarchy/createTagField.ts"],"sourcesContent":["import type { RelationshipField } from '../fields/config/types.js'\n\nimport { getHierarchyFieldName } from './constants.js'\n\n/**\n * Options for creating a tag relationship field.\n * All RelationshipFieldMany properties are available except name, type, and relationTo\n * which are managed by the tag system.\n */\nexport type CreateTagFieldOptions = {\n /**\n * Whether to allow multiple tags (defaults to true)\n * @default true\n */\n hasMany?: boolean\n /**\n * The slug of the hierarchy collection this field references (e.g., 'tags')\n */\n relationTo: string\n} & Pick<Partial<RelationshipField>, 'admin' | 'label' | 'required'>\n\n/**\n * Creates a relationship field for tag-style hierarchies (multi-select by default).\n *\n * This field:\n * - Has hasMany:true by default (multiple tag selection)\n * - Is positioned in the sidebar by default\n * - Does NOT inject a header button (tags use standard relationship UI)\n *\n * Use this in your collection's fields array to add a tag relationship.\n * The field name is automatically generated based on the hierarchy slug.\n *\n * @example\n * import { createTagField } from 'payload'\n *\n * const Posts: CollectionConfig = {\n * slug: 'posts',\n * fields: [\n * { name: 'title', type: 'text' },\n * createTagField({\n * relationTo: 'tags',\n * label: 'Tags',\n * }),\n * ],\n * }\n */\nexport function createTagField(options: CreateTagFieldOptions): RelationshipField {\n const { admin: adminOverrides, hasMany = true, label, relationTo, ...restOptions } = options\n const { components: componentOverrides, ...restAdminOverrides } = adminOverrides || {}\n\n return {\n name: getHierarchyFieldName(relationTo),\n type: 'relationship',\n admin: {\n position: 'sidebar',\n ...restAdminOverrides,\n components: {\n Field: '@payloadcms/ui/rsc#HierarchyField',\n ...componentOverrides,\n },\n },\n hasMany,\n index: true,\n label: label ?? 'Tags',\n relationTo,\n ...restOptions,\n } as RelationshipField\n}\n"],"names":["getHierarchyFieldName","createTagField","options","admin","adminOverrides","hasMany","label","relationTo","restOptions","components","componentOverrides","restAdminOverrides","name","type","position","Field","index"],"mappings":"AAEA,SAASA,qBAAqB,QAAQ,iBAAgB;AAmBtD;;;;;;;;;;;;;;;;;;;;;;;;CAwBC,GACD,OAAO,SAASC,eAAeC,OAA8B;IAC3D,MAAM,EAAEC,OAAOC,cAAc,EAAEC,UAAU,IAAI,EAAEC,KAAK,EAAEC,UAAU,EAAE,GAAGC,aAAa,GAAGN;IACrF,MAAM,EAAEO,YAAYC,kBAAkB,EAAE,GAAGC,oBAAoB,GAAGP,kBAAkB,CAAC;IAErF,OAAO;QACLQ,MAAMZ,sBAAsBO;QAC5BM,MAAM;QACNV,OAAO;YACLW,UAAU;YACV,GAAGH,kBAAkB;YACrBF,YAAY;gBACVM,OAAO;gBACP,GAAGL,kBAAkB;YACvB;QACF;QACAL;QACAW,OAAO;QACPV,OAAOA,SAAS;QAChBC;QACA,GAAGC,WAAW;IAChB;AACF"}
@@ -0,0 +1,54 @@
1
+ import type { CollectionConfig } from '../collections/config/types.js';
2
+ import type { HierarchyConfig } from './types.js';
3
+ /**
4
+ * Hierarchy options for tag collections - all fields optional since defaults are applied.
5
+ */
6
+ type TagHierarchyOptions = {
7
+ parentFieldName?: string;
8
+ } & Partial<Omit<HierarchyConfig, 'parentFieldName'>>;
9
+ /**
10
+ * Options for creating a tag collection.
11
+ * Same as CollectionConfig but with `useAsTitle` required.
12
+ */
13
+ export type CreateTagsCollectionOptions = {
14
+ /**
15
+ * Hierarchy configuration (defaults applied for tag behavior)
16
+ * `allowHasMany` defaults to true but can be overridden
17
+ */
18
+ hierarchy?: TagHierarchyOptions;
19
+ /**
20
+ * Field name to use as the display title in the tag tree.
21
+ * Required to ensure tags display meaningful names.
22
+ */
23
+ useAsTitle: string;
24
+ } & Omit<CollectionConfig, 'admin' | 'hierarchy'> & Partial<Pick<CollectionConfig, 'admin'>>;
25
+ /**
26
+ * Creates a collection config for a tag-style hierarchy.
27
+ *
28
+ * This helper provides:
29
+ * - `hierarchy.allowHasMany: true` by default (can be overridden)
30
+ * - Default tag icon component
31
+ * - Required `useAsTitle` to ensure tags display meaningful names
32
+ *
33
+ * @example
34
+ * import { createTagsCollection, createTagField } from 'payload'
35
+ *
36
+ * const Tags = createTagsCollection({
37
+ * slug: 'tags',
38
+ * useAsTitle: 'name',
39
+ * fields: [
40
+ * { name: 'name', type: 'text', required: true },
41
+ * ],
42
+ * })
43
+ *
44
+ * // Then in related collections:
45
+ * const Posts: CollectionConfig = {
46
+ * slug: 'posts',
47
+ * fields: [
48
+ * createTagField({ relationTo: 'tags' }),
49
+ * ],
50
+ * }
51
+ */
52
+ export declare function createTagsCollection(options: CreateTagsCollectionOptions): CollectionConfig;
53
+ export {};
54
+ //# sourceMappingURL=createTagsCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTagsCollection.d.ts","sourceRoot":"","sources":["../../src/hierarchy/createTagsCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAIjD;;GAEG;AACH,KAAK,mBAAmB,GAAG;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC,CAAA;AAErD;;;GAGG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC;;;OAGG;IACH,SAAS,CAAC,EAAE,mBAAmB,CAAA;IAC/B;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAA;CACnB,GAAG,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,WAAW,CAAC,GAC/C,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAA;AAE1C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,gBAAgB,CA2B3F"}
@@ -0,0 +1,56 @@
1
+ import { getHierarchyFieldName } from './constants.js';
2
+ /**
3
+ * Creates a collection config for a tag-style hierarchy.
4
+ *
5
+ * This helper provides:
6
+ * - `hierarchy.allowHasMany: true` by default (can be overridden)
7
+ * - Default tag icon component
8
+ * - Required `useAsTitle` to ensure tags display meaningful names
9
+ *
10
+ * @example
11
+ * import { createTagsCollection, createTagField } from 'payload'
12
+ *
13
+ * const Tags = createTagsCollection({
14
+ * slug: 'tags',
15
+ * useAsTitle: 'name',
16
+ * fields: [
17
+ * { name: 'name', type: 'text', required: true },
18
+ * ],
19
+ * })
20
+ *
21
+ * // Then in related collections:
22
+ * const Posts: CollectionConfig = {
23
+ * slug: 'posts',
24
+ * fields: [
25
+ * createTagField({ relationTo: 'tags' }),
26
+ * ],
27
+ * }
28
+ */ export function createTagsCollection(options) {
29
+ const { admin: adminOverrides, hierarchy: hierarchyOverrides, useAsTitle, ...rest } = options;
30
+ return {
31
+ labels: {
32
+ plural: 'Tags',
33
+ singular: 'Tag'
34
+ },
35
+ ...rest,
36
+ admin: {
37
+ group: false,
38
+ ...adminOverrides,
39
+ useAsTitle
40
+ },
41
+ hierarchy: {
42
+ allowHasMany: true,
43
+ ...hierarchyOverrides,
44
+ admin: {
45
+ ...hierarchyOverrides?.admin,
46
+ components: {
47
+ Icon: '@payloadcms/ui#TagIcon',
48
+ ...hierarchyOverrides?.admin?.components
49
+ }
50
+ },
51
+ parentFieldName: hierarchyOverrides?.parentFieldName ?? getHierarchyFieldName(rest.slug)
52
+ }
53
+ };
54
+ }
55
+
56
+ //# sourceMappingURL=createTagsCollection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hierarchy/createTagsCollection.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { HierarchyConfig } from './types.js'\n\nimport { getHierarchyFieldName } from './constants.js'\n\n/**\n * Hierarchy options for tag collections - all fields optional since defaults are applied.\n */\ntype TagHierarchyOptions = {\n parentFieldName?: string\n} & Partial<Omit<HierarchyConfig, 'parentFieldName'>>\n\n/**\n * Options for creating a tag collection.\n * Same as CollectionConfig but with `useAsTitle` required.\n */\nexport type CreateTagsCollectionOptions = {\n /**\n * Hierarchy configuration (defaults applied for tag behavior)\n * `allowHasMany` defaults to true but can be overridden\n */\n hierarchy?: TagHierarchyOptions\n /**\n * Field name to use as the display title in the tag tree.\n * Required to ensure tags display meaningful names.\n */\n useAsTitle: string\n} & Omit<CollectionConfig, 'admin' | 'hierarchy'> &\n Partial<Pick<CollectionConfig, 'admin'>>\n\n/**\n * Creates a collection config for a tag-style hierarchy.\n *\n * This helper provides:\n * - `hierarchy.allowHasMany: true` by default (can be overridden)\n * - Default tag icon component\n * - Required `useAsTitle` to ensure tags display meaningful names\n *\n * @example\n * import { createTagsCollection, createTagField } from 'payload'\n *\n * const Tags = createTagsCollection({\n * slug: 'tags',\n * useAsTitle: 'name',\n * fields: [\n * { name: 'name', type: 'text', required: true },\n * ],\n * })\n *\n * // Then in related collections:\n * const Posts: CollectionConfig = {\n * slug: 'posts',\n * fields: [\n * createTagField({ relationTo: 'tags' }),\n * ],\n * }\n */\nexport function createTagsCollection(options: CreateTagsCollectionOptions): CollectionConfig {\n const { admin: adminOverrides, hierarchy: hierarchyOverrides, useAsTitle, ...rest } = options\n\n return {\n labels: {\n plural: 'Tags',\n singular: 'Tag',\n },\n ...rest,\n admin: {\n group: false,\n ...adminOverrides,\n useAsTitle,\n },\n hierarchy: {\n allowHasMany: true,\n ...hierarchyOverrides,\n admin: {\n ...hierarchyOverrides?.admin,\n components: {\n Icon: '@payloadcms/ui#TagIcon',\n ...hierarchyOverrides?.admin?.components,\n },\n },\n parentFieldName: hierarchyOverrides?.parentFieldName ?? getHierarchyFieldName(rest.slug),\n },\n }\n}\n"],"names":["getHierarchyFieldName","createTagsCollection","options","admin","adminOverrides","hierarchy","hierarchyOverrides","useAsTitle","rest","labels","plural","singular","group","allowHasMany","components","Icon","parentFieldName","slug"],"mappings":"AAGA,SAASA,qBAAqB,QAAQ,iBAAgB;AA2BtD;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BC,GACD,OAAO,SAASC,qBAAqBC,OAAoC;IACvE,MAAM,EAAEC,OAAOC,cAAc,EAAEC,WAAWC,kBAAkB,EAAEC,UAAU,EAAE,GAAGC,MAAM,GAAGN;IAEtF,OAAO;QACLO,QAAQ;YACNC,QAAQ;YACRC,UAAU;QACZ;QACA,GAAGH,IAAI;QACPL,OAAO;YACLS,OAAO;YACP,GAAGR,cAAc;YACjBG;QACF;QACAF,WAAW;YACTQ,cAAc;YACd,GAAGP,kBAAkB;YACrBH,OAAO;gBACL,GAAGG,oBAAoBH,KAAK;gBAC5BW,YAAY;oBACVC,MAAM;oBACN,GAAGT,oBAAoBH,OAAOW,UAAU;gBAC1C;YACF;YACAE,iBAAiBV,oBAAoBU,mBAAmBhB,sBAAsBQ,KAAKS,IAAI;QACzF;IACF;AACF"}
@@ -0,0 +1,7 @@
1
+ import type { PayloadHandler } from '../../config/types.js';
2
+ /**
3
+ * Endpoint to find all documents related to a hierarchy item
4
+ * GET /api/{collection}/{id}/related
5
+ */
6
+ export declare const findRelatedHandler: PayloadHandler;
7
+ //# sourceMappingURL=findRelated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findRelated.d.ts","sourceRoot":"","sources":["../../../src/hierarchy/endpoints/findRelated.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAO3D;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,cAwBhC,CAAA"}
@@ -0,0 +1,36 @@
1
+ import { status as httpStatus } from 'http-status';
2
+ import { getRequestCollectionWithID } from '../../utilities/getRequestEntity.js';
3
+ import { headersWithCors } from '../../utilities/headersWithCors.js';
4
+ import { parseParams } from '../../utilities/parseParams/index.js';
5
+ import { findRelatedDocuments } from '../operations/findRelatedDocuments.js';
6
+ /**
7
+ * Endpoint to find all documents related to a hierarchy item
8
+ * GET /api/{collection}/{id}/related
9
+ */ export const findRelatedHandler = async (req)=>{
10
+ if (!req.user) {
11
+ return Response.json({
12
+ message: 'Unauthorized'
13
+ }, {
14
+ status: httpStatus.UNAUTHORIZED
15
+ });
16
+ }
17
+ const { id, collection } = getRequestCollectionWithID(req);
18
+ const { depth, limit, page } = parseParams(req.query);
19
+ const result = await findRelatedDocuments({
20
+ id,
21
+ collection: collection.config,
22
+ depth: depth || 0,
23
+ limit: limit || 50,
24
+ page: page || 1,
25
+ req
26
+ });
27
+ return Response.json(result, {
28
+ headers: headersWithCors({
29
+ headers: new Headers(),
30
+ req
31
+ }),
32
+ status: httpStatus.OK
33
+ });
34
+ };
35
+
36
+ //# sourceMappingURL=findRelated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/hierarchy/endpoints/findRelated.ts"],"sourcesContent":["import { status as httpStatus } from 'http-status'\n\nimport type { PayloadHandler } from '../../config/types.js'\n\nimport { getRequestCollectionWithID } from '../../utilities/getRequestEntity.js'\nimport { headersWithCors } from '../../utilities/headersWithCors.js'\nimport { parseParams } from '../../utilities/parseParams/index.js'\nimport { findRelatedDocuments } from '../operations/findRelatedDocuments.js'\n\n/**\n * Endpoint to find all documents related to a hierarchy item\n * GET /api/{collection}/{id}/related\n */\nexport const findRelatedHandler: PayloadHandler = async (req) => {\n if (!req.user) {\n return Response.json({ message: 'Unauthorized' }, { status: httpStatus.UNAUTHORIZED })\n }\n\n const { id, collection } = getRequestCollectionWithID(req)\n const { depth, limit, page } = parseParams(req.query)\n\n const result = await findRelatedDocuments({\n id,\n collection: collection.config,\n depth: depth || 0,\n limit: limit || 50,\n page: page || 1,\n req,\n })\n\n return Response.json(result, {\n headers: headersWithCors({\n headers: new Headers(),\n req,\n }),\n status: httpStatus.OK,\n })\n}\n"],"names":["status","httpStatus","getRequestCollectionWithID","headersWithCors","parseParams","findRelatedDocuments","findRelatedHandler","req","user","Response","json","message","UNAUTHORIZED","id","collection","depth","limit","page","query","result","config","headers","Headers","OK"],"mappings":"AAAA,SAASA,UAAUC,UAAU,QAAQ,cAAa;AAIlD,SAASC,0BAA0B,QAAQ,sCAAqC;AAChF,SAASC,eAAe,QAAQ,qCAAoC;AACpE,SAASC,WAAW,QAAQ,uCAAsC;AAClE,SAASC,oBAAoB,QAAQ,wCAAuC;AAE5E;;;CAGC,GACD,OAAO,MAAMC,qBAAqC,OAAOC;IACvD,IAAI,CAACA,IAAIC,IAAI,EAAE;QACb,OAAOC,SAASC,IAAI,CAAC;YAAEC,SAAS;QAAe,GAAG;YAAEX,QAAQC,WAAWW,YAAY;QAAC;IACtF;IAEA,MAAM,EAAEC,EAAE,EAAEC,UAAU,EAAE,GAAGZ,2BAA2BK;IACtD,MAAM,EAAEQ,KAAK,EAAEC,KAAK,EAAEC,IAAI,EAAE,GAAGb,YAAYG,IAAIW,KAAK;IAEpD,MAAMC,SAAS,MAAMd,qBAAqB;QACxCQ;QACAC,YAAYA,WAAWM,MAAM;QAC7BL,OAAOA,SAAS;QAChBC,OAAOA,SAAS;QAChBC,MAAMA,QAAQ;QACdV;IACF;IAEA,OAAOE,SAASC,IAAI,CAACS,QAAQ;QAC3BE,SAASlB,gBAAgB;YACvBkB,SAAS,IAAIC;YACbf;QACF;QACAP,QAAQC,WAAWsB,EAAE;IACvB;AACF,EAAC"}
@@ -0,0 +1,24 @@
1
+ import type { TypeWithID } from '../collections/config/types.js';
2
+ import type { PayloadRequest } from '../types/index.js';
3
+ export type GetInitialTreeDataArgs = {
4
+ collectionSlug: string;
5
+ expandedNodeIds?: (number | string)[];
6
+ /** Filter tree to only show folders that allow these collection types (or are unrestricted) */
7
+ filterByCollections?: string[];
8
+ limit?: number;
9
+ req: PayloadRequest;
10
+ /** The currently selected node ID. When provided, ensures siblings are loaded to include this node. */
11
+ selectedNodeId?: null | number | string;
12
+ /** The parent ID of the selected node. Required when selectedNodeId is provided. */
13
+ selectedNodeParentId?: null | number | string;
14
+ };
15
+ export type InitialTreeData = {
16
+ docs: TypeWithID[];
17
+ loadedParents: Record<string, {
18
+ hasMore: boolean;
19
+ loadedCount?: number;
20
+ totalDocs: number;
21
+ }>;
22
+ };
23
+ export declare const getInitialTreeData: ({ collectionSlug, expandedNodeIds, filterByCollections, limit, req, selectedNodeId, selectedNodeParentId, }: GetInitialTreeDataArgs) => Promise<InitialTreeData>;
24
+ //# sourceMappingURL=getInitialTreeData.d.ts.map
@@ -0,0 +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,EAAS,MAAM,mBAAmB,CAAA;AAI9D,MAAM,MAAM,sBAAsB,GAAG;IACnC,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,GAAG,EAAE,cAAc,CAAA;IACnB,uGAAuG;IACvG,cAAc,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;IACvC,oFAAoF;IACpF,oBAAoB,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;CAC9C,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,gHAQ5B,sBAAsB,KAAG,OAAO,CAAC,eAAe,CAsIlD,CAAA"}
@@ -0,0 +1,120 @@
1
+ import { DEFAULT_HIERARCHY_TREE_LIMIT } from '../hierarchy/constants.js';
2
+ export const getInitialTreeData = async ({ collectionSlug, expandedNodeIds = [], filterByCollections, limit, req, selectedNodeId, selectedNodeParentId })=>{
3
+ const collectionConfig = req.payload.collections[collectionSlug]?.config;
4
+ if (!collectionConfig || !collectionConfig.hierarchy) {
5
+ throw new Error(`Collection ${collectionSlug} is not a hierarchy`);
6
+ }
7
+ const hierarchyConfig = collectionConfig.hierarchy;
8
+ const parentFieldName = hierarchyConfig.parentFieldName;
9
+ const useAsTitle = collectionConfig.admin?.useAsTitle ?? 'id';
10
+ // Get typeFieldName for filtering
11
+ const typeFieldName = hierarchyConfig.collectionSpecific && typeof hierarchyConfig.collectionSpecific === 'object' ? hierarchyConfig.collectionSpecific.fieldName : undefined;
12
+ // Build filter condition if filterByCollections is provided
13
+ // Exclude the hierarchy collection itself (folders always show folders)
14
+ const filteredTypes = filterByCollections?.filter((t)=>t !== collectionSlug);
15
+ // Get all possible type values from relatedCollections for detecting empty arrays
16
+ const allPossibleTypes = hierarchyConfig.relatedCollections ? Object.keys(hierarchyConfig.relatedCollections) : [];
17
+ const filterCondition = filteredTypes?.length && typeFieldName ? {
18
+ or: [
19
+ {
20
+ [typeFieldName]: {
21
+ in: filteredTypes
22
+ }
23
+ },
24
+ {
25
+ [typeFieldName]: {
26
+ exists: false
27
+ }
28
+ },
29
+ // Include unrestricted folders with empty allowedTypes array
30
+ // Using not_in with all possible values matches empty arrays in both MongoDB and Postgres
31
+ ...allPossibleTypes.length > 0 ? [
32
+ {
33
+ [typeFieldName]: {
34
+ not_in: allPossibleTypes
35
+ }
36
+ }
37
+ ] : []
38
+ ]
39
+ } : null;
40
+ // Use limit from config if not provided, fallback to config's treeLimit
41
+ const effectiveLimit = limit ?? hierarchyConfig.admin?.treeLimit ?? DEFAULT_HIERARCHY_TREE_LIMIT;
42
+ const allDocs = [];
43
+ const loadedParents = {};
44
+ // Normalize selectedNodeParentId: treat null/undefined as 'null' (root level)
45
+ const normalizedSelectedParentId = selectedNodeParentId === null || selectedNodeParentId === undefined ? 'null' : String(selectedNodeParentId);
46
+ // Helper to check if selectedNodeId is among siblings at a given parent level
47
+ const needsSelectedNodeIncluded = (parentKey)=>{
48
+ return !!selectedNodeId && normalizedSelectedParentId === parentKey;
49
+ };
50
+ // Helper to fetch children with optional selectedNodeId inclusion
51
+ const fetchChildrenForParent = async (parentKey, parentCondition)=>{
52
+ const mustIncludeSelected = needsSelectedNodeIncluded(parentKey);
53
+ let accumulatedDocs = [];
54
+ let currentPage = 1;
55
+ let hasMore = true;
56
+ let totalDocs = 0;
57
+ let foundSelected = false;
58
+ // Combine parent condition with filter condition
59
+ const whereClause = filterCondition ? {
60
+ and: [
61
+ parentCondition,
62
+ filterCondition
63
+ ]
64
+ } : parentCondition;
65
+ while(hasMore){
66
+ const result = await req.payload.find({
67
+ collection: collectionSlug,
68
+ depth: 0,
69
+ limit: effectiveLimit,
70
+ overrideAccess: false,
71
+ page: currentPage,
72
+ req,
73
+ sort: useAsTitle,
74
+ user: req.user,
75
+ where: whereClause
76
+ });
77
+ accumulatedDocs = [
78
+ ...accumulatedDocs,
79
+ ...result.docs
80
+ ];
81
+ totalDocs = result.totalDocs;
82
+ hasMore = result.hasNextPage;
83
+ // Check if selectedNodeId is in this page's results
84
+ if (mustIncludeSelected && !foundSelected) {
85
+ foundSelected = result.docs.some((doc)=>String(doc.id) === String(selectedNodeId));
86
+ }
87
+ // Stop if we've found the selected node OR we only need first page
88
+ if (!mustIncludeSelected || foundSelected || !hasMore) {
89
+ break;
90
+ }
91
+ currentPage++;
92
+ }
93
+ allDocs.push(...accumulatedDocs);
94
+ loadedParents[parentKey] = {
95
+ hasMore,
96
+ loadedCount: accumulatedDocs.length,
97
+ totalDocs
98
+ };
99
+ };
100
+ // Query 1: Fetch root nodes
101
+ await fetchChildrenForParent('null', {
102
+ [parentFieldName]: {
103
+ exists: false
104
+ }
105
+ });
106
+ // Query 2: For each expanded node, fetch its children
107
+ for (const parentId of expandedNodeIds){
108
+ await fetchChildrenForParent(String(parentId), {
109
+ [parentFieldName]: {
110
+ equals: parentId
111
+ }
112
+ });
113
+ }
114
+ return {
115
+ docs: allDocs,
116
+ loadedParents
117
+ };
118
+ };
119
+
120
+ //# sourceMappingURL=getInitialTreeData.js.map
@@ -0,0 +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 { DEFAULT_HIERARCHY_TREE_LIMIT } from '../hierarchy/constants.js'\n\nexport type GetInitialTreeDataArgs = {\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 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}\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 collectionSlug,\n expandedNodeIds = [],\n filterByCollections,\n limit,\n req,\n selectedNodeId,\n selectedNodeParentId,\n}: GetInitialTreeDataArgs): Promise<InitialTreeData> => {\n const collectionConfig = req.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\n const whereClause = filterCondition\n ? { and: [parentCondition, filterCondition] }\n : parentCondition\n\n while (hasMore) {\n const result = await req.payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: effectiveLimit,\n overrideAccess: false,\n page: currentPage,\n req,\n sort: useAsTitle,\n user: req.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","collectionSlug","expandedNodeIds","filterByCollections","limit","req","selectedNodeId","selectedNodeParentId","collectionConfig","payload","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","whereClause","and","result","find","collection","depth","overrideAccess","page","sort","user","where","docs","hasNextPage","some","doc","id","push","loadedCount","parentId","equals"],"mappings":"AAGA,SAASA,4BAA4B,QAAQ,4BAA2B;AAqBxE,OAAO,MAAMC,qBAAqB,OAAO,EACvCC,cAAc,EACdC,kBAAkB,EAAE,EACpBC,mBAAmB,EACnBC,KAAK,EACLC,GAAG,EACHC,cAAc,EACdC,oBAAoB,EACG;IACvB,MAAMC,mBAAmBH,IAAII,OAAO,CAACC,WAAW,CAACT,eAAe,EAAEU;IAElE,IAAI,CAACH,oBAAoB,CAACA,iBAAiBI,SAAS,EAAE;QACpD,MAAM,IAAIC,MAAM,CAAC,WAAW,EAAEZ,eAAe,mBAAmB,CAAC;IACnE;IAEA,MAAMa,kBAAkBN,iBAAiBI,SAAS;IAClD,MAAMG,kBAAkBD,gBAAgBC,eAAe;IACvD,MAAMC,aAAaR,iBAAiBS,KAAK,EAAED,cAAc;IAEzD,kCAAkC;IAClC,MAAME,gBACJJ,gBAAgBK,kBAAkB,IAAI,OAAOL,gBAAgBK,kBAAkB,KAAK,WAChFL,gBAAgBK,kBAAkB,CAACC,SAAS,GAC5CC;IAEN,4DAA4D;IAC5D,wEAAwE;IACxE,MAAMC,gBAAgBnB,qBAAqBoB,OAAO,CAACC,IAAMA,MAAMvB;IAE/D,kFAAkF;IAClF,MAAMwB,mBAAmBX,gBAAgBY,kBAAkB,GACvDC,OAAOC,IAAI,CAACd,gBAAgBY,kBAAkB,IAC9C,EAAE;IAEN,MAAMG,kBACJP,eAAeQ,UAAUZ,gBACrB;QACEa,IAAI;YACF;gBAAE,CAACb,cAAc,EAAE;oBAAEc,IAAIV;gBAAc;YAAE;YACzC;gBAAE,CAACJ,cAAc,EAAE;oBAAEe,QAAQ;gBAAM;YAAE;YACrC,6DAA6D;YAC7D,0FAA0F;eACtFR,iBAAiBK,MAAM,GAAG,IAC1B;gBAAC;oBAAE,CAACZ,cAAc,EAAE;wBAAEgB,QAAQT;oBAAiB;gBAAE;aAAE,GACnD,EAAE;SACP;IACH,IACA;IAEN,wEAAwE;IACxE,MAAMU,iBAAiB/B,SAASU,gBAAgBG,KAAK,EAAEmB,aAAarC;IAEpE,MAAMsC,UAAwB,EAAE;IAChC,MAAMC,gBAGF,CAAC;IAEL,8EAA8E;IAC9E,MAAMC,6BACJhC,yBAAyB,QAAQA,yBAAyBc,YACtD,SACAmB,OAAOjC;IAEb,8EAA8E;IAC9E,MAAMkC,4BAA4B,CAACC;QACjC,OAAO,CAAC,CAACpC,kBAAkBiC,+BAA+BG;IAC5D;IAEA,kEAAkE;IAClE,MAAMC,yBAAyB,OAC7BD,WACAE;QAEA,MAAMC,sBAAsBJ,0BAA0BC;QACtD,IAAII,kBAAgC,EAAE;QACtC,IAAIC,cAAc;QAClB,IAAIC,UAAU;QACd,IAAIC,YAAY;QAChB,IAAIC,gBAAgB;QAEpB,iDAAiD;QACjD,MAAMC,cAActB,kBAChB;YAAEuB,KAAK;gBAACR;gBAAiBf;aAAgB;QAAC,IAC1Ce;QAEJ,MAAOI,QAAS;YACd,MAAMK,SAAS,MAAMhD,IAAII,OAAO,CAAC6C,IAAI,CAAC;gBACpCC,YAAYtD;gBACZuD,OAAO;gBACPpD,OAAO+B;gBACPsB,gBAAgB;gBAChBC,MAAMX;gBACN1C;gBACAsD,MAAM3C;gBACN4C,MAAMvD,IAAIuD,IAAI;gBACdC,OAAOV;YACT;YAEAL,kBAAkB;mBAAIA;mBAAoBO,OAAOS,IAAI;aAAC;YACtDb,YAAYI,OAAOJ,SAAS;YAC5BD,UAAUK,OAAOU,WAAW;YAE5B,oDAAoD;YACpD,IAAIlB,uBAAuB,CAACK,eAAe;gBACzCA,gBAAgBG,OAAOS,IAAI,CAACE,IAAI,CAC9B,CAACC,MAAoBzB,OAAOyB,IAAIC,EAAE,MAAM1B,OAAOlC;YAEnD;YAEA,mEAAmE;YACnE,IAAI,CAACuC,uBAAuBK,iBAAiB,CAACF,SAAS;gBACrD;YACF;YAEAD;QACF;QAEAV,QAAQ8B,IAAI,IAAIrB;QAChBR,aAAa,CAACI,UAAU,GAAG;YACzBM;YACAoB,aAAatB,gBAAgBhB,MAAM;YACnCmB;QACF;IACF;IAEA,4BAA4B;IAC5B,MAAMN,uBAAuB,QAAQ;QACnC,CAAC5B,gBAAgB,EAAE;YAAEkB,QAAQ;QAAM;IACrC;IAEA,sDAAsD;IACtD,KAAK,MAAMoC,YAAYnE,gBAAiB;QACtC,MAAMyC,uBAAuBH,OAAO6B,WAAW;YAC7C,CAACtD,gBAAgB,EAAE;gBAAEuD,QAAQD;YAAS;QACxC;IACF;IAEA,OAAO;QACLP,MAAMzB;QACNC;IACF;AACF,EAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * afterDelete Hook Responsibilities:
3
+ * - Clear folder references from related documents when folder is deleted
4
+ */
5
+ import type { CollectionAfterDeleteHook } from '../../index.js';
6
+ type Args = {
7
+ /**
8
+ * Map of collection slugs to their field names
9
+ */
10
+ relatedCollections: Record<string, string>;
11
+ };
12
+ export declare const hierarchyCollectionAfterDelete: ({ relatedCollections }: Args) => CollectionAfterDeleteHook;
13
+ export {};
14
+ //# sourceMappingURL=collectionAfterDelete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectionAfterDelete.d.ts","sourceRoot":"","sources":["../../../src/hierarchy/hooks/collectionAfterDelete.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAE/D,KAAK,IAAI,GAAG;IACV;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC3C,CAAA;AAED,eAAO,MAAM,8BAA8B,2BAChB,IAAI,KAAG,yBAgB/B,CAAA"}