payload 3.80.0-internal.cdd7ef7 → 3.80.0

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 (265) hide show
  1. package/dist/admin/elements/Nav.d.ts +0 -13
  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 +38 -1
  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 +4 -5
  8. package/dist/admin/types.d.ts.map +1 -1
  9. package/dist/admin/types.js.map +1 -1
  10. package/dist/admin/views/folderList.d.ts +56 -0
  11. package/dist/admin/views/folderList.d.ts.map +1 -0
  12. package/dist/admin/views/folderList.js +3 -0
  13. package/dist/admin/views/folderList.js.map +1 -0
  14. package/dist/admin/views/index.d.ts +3 -1
  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 +2 -43
  18. package/dist/admin/views/list.d.ts.map +1 -1
  19. package/dist/admin/views/list.js.map +1 -1
  20. package/dist/bin/generateImportMap/iterateCollections.d.ts.map +1 -1
  21. package/dist/bin/generateImportMap/iterateCollections.js +0 -1
  22. package/dist/bin/generateImportMap/iterateCollections.js.map +1 -1
  23. package/dist/bin/generateImportMap/iterateConfig.d.ts.map +1 -1
  24. package/dist/bin/generateImportMap/iterateConfig.js +0 -7
  25. package/dist/bin/generateImportMap/iterateConfig.js.map +1 -1
  26. package/dist/collections/config/client.d.ts +1 -3
  27. package/dist/collections/config/client.d.ts.map +1 -1
  28. package/dist/collections/config/client.js +0 -11
  29. package/dist/collections/config/client.js.map +1 -1
  30. package/dist/collections/config/defaults.js +1 -1
  31. package/dist/collections/config/defaults.js.map +1 -1
  32. package/dist/collections/config/sanitize.d.ts.map +1 -1
  33. package/dist/collections/config/sanitize.js +7 -3
  34. package/dist/collections/config/sanitize.js.map +1 -1
  35. package/dist/collections/config/types.d.ts +7 -29
  36. package/dist/collections/config/types.d.ts.map +1 -1
  37. package/dist/collections/config/types.js.map +1 -1
  38. package/dist/collections/operations/create.js +17 -17
  39. package/dist/collections/operations/create.js.map +1 -1
  40. package/dist/collections/operations/findByID.js +3 -3
  41. package/dist/collections/operations/findByID.js.map +1 -1
  42. package/dist/collections/operations/update.js +1 -1
  43. package/dist/collections/operations/update.js.map +1 -1
  44. package/dist/collections/operations/utilities/update.d.ts.map +1 -1
  45. package/dist/collections/operations/utilities/update.js +6 -6
  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 +10 -0
  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 +15 -0
  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 +26 -3
  55. package/dist/config/sanitize.js.map +1 -1
  56. package/dist/config/types.d.ts +12 -26
  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 +3 -2
  60. package/dist/exports/shared.d.ts.map +1 -1
  61. package/dist/exports/shared.js +2 -1
  62. package/dist/exports/shared.js.map +1 -1
  63. package/dist/fields/baseFields/slug/index.d.ts +7 -0
  64. package/dist/fields/baseFields/slug/index.d.ts.map +1 -1
  65. package/dist/fields/baseFields/slug/index.js +2 -2
  66. package/dist/fields/baseFields/slug/index.js.map +1 -1
  67. package/dist/fields/config/sanitize.d.ts.map +1 -1
  68. package/dist/fields/config/sanitize.js +0 -4
  69. package/dist/fields/config/sanitize.js.map +1 -1
  70. package/dist/fields/config/sanitizeJoinField.d.ts.map +1 -1
  71. package/dist/fields/config/sanitizeJoinField.js +0 -3
  72. package/dist/fields/config/sanitizeJoinField.js.map +1 -1
  73. package/dist/folders/addFolderCollection.d.ts +10 -0
  74. package/dist/folders/addFolderCollection.d.ts.map +1 -0
  75. package/dist/folders/addFolderCollection.js +26 -0
  76. package/dist/folders/addFolderCollection.js.map +1 -0
  77. package/dist/folders/addFolderFieldToCollection.d.ts +8 -0
  78. package/dist/folders/addFolderFieldToCollection.d.ts.map +1 -0
  79. package/dist/folders/addFolderFieldToCollection.js +20 -0
  80. package/dist/folders/addFolderFieldToCollection.js.map +1 -0
  81. package/dist/folders/buildFolderField.d.ts +8 -0
  82. package/dist/folders/buildFolderField.d.ts.map +1 -0
  83. package/dist/folders/buildFolderField.js +87 -0
  84. package/dist/folders/buildFolderField.js.map +1 -0
  85. package/dist/folders/constants.d.ts +3 -0
  86. package/dist/folders/constants.d.ts.map +1 -0
  87. package/dist/folders/constants.js +4 -0
  88. package/dist/folders/constants.js.map +1 -0
  89. package/dist/folders/createFolderCollection.d.ts +11 -0
  90. package/dist/folders/createFolderCollection.d.ts.map +1 -0
  91. package/dist/folders/createFolderCollection.js +115 -0
  92. package/dist/folders/createFolderCollection.js.map +1 -0
  93. package/dist/folders/hooks/deleteSubfoldersAfterDelete.d.ts +8 -0
  94. package/dist/folders/hooks/deleteSubfoldersAfterDelete.d.ts.map +1 -0
  95. package/dist/folders/hooks/deleteSubfoldersAfterDelete.js +15 -0
  96. package/dist/folders/hooks/deleteSubfoldersAfterDelete.js.map +1 -0
  97. package/dist/folders/hooks/dissasociateAfterDelete.d.ts +8 -0
  98. package/dist/folders/hooks/dissasociateAfterDelete.d.ts.map +1 -0
  99. package/dist/folders/hooks/dissasociateAfterDelete.js +20 -0
  100. package/dist/folders/hooks/dissasociateAfterDelete.js.map +1 -0
  101. package/dist/folders/hooks/ensureSafeCollectionsChange.d.ts +5 -0
  102. package/dist/folders/hooks/ensureSafeCollectionsChange.d.ts.map +1 -0
  103. package/dist/folders/hooks/ensureSafeCollectionsChange.js +107 -0
  104. package/dist/folders/hooks/ensureSafeCollectionsChange.js.map +1 -0
  105. package/dist/folders/hooks/reparentChildFolder.d.ts +24 -0
  106. package/dist/folders/hooks/reparentChildFolder.d.ts.map +1 -0
  107. package/dist/folders/hooks/reparentChildFolder.js +72 -0
  108. package/dist/folders/hooks/reparentChildFolder.js.map +1 -0
  109. package/dist/folders/types.d.ts +118 -0
  110. package/dist/folders/types.d.ts.map +1 -0
  111. package/dist/folders/types.js +3 -0
  112. package/dist/folders/types.js.map +1 -0
  113. package/dist/folders/utils/buildFolderWhereConstraints.d.ts +13 -0
  114. package/dist/folders/utils/buildFolderWhereConstraints.d.ts.map +1 -0
  115. package/dist/folders/utils/buildFolderWhereConstraints.js +45 -0
  116. package/dist/folders/utils/buildFolderWhereConstraints.js.map +1 -0
  117. package/dist/folders/utils/formatFolderOrDocumentItem.d.ts +12 -0
  118. package/dist/folders/utils/formatFolderOrDocumentItem.d.ts.map +1 -0
  119. package/dist/folders/utils/formatFolderOrDocumentItem.js +30 -0
  120. package/dist/folders/utils/formatFolderOrDocumentItem.js.map +1 -0
  121. package/dist/folders/utils/getFolderBreadcrumbs.d.ts +14 -0
  122. package/dist/folders/utils/getFolderBreadcrumbs.d.ts.map +1 -0
  123. package/dist/folders/utils/getFolderBreadcrumbs.js +45 -0
  124. package/dist/folders/utils/getFolderBreadcrumbs.js.map +1 -0
  125. package/dist/folders/utils/getFolderData.d.ts +33 -0
  126. package/dist/folders/utils/getFolderData.d.ts.map +1 -0
  127. package/dist/folders/utils/getFolderData.js +88 -0
  128. package/dist/folders/utils/getFolderData.js.map +1 -0
  129. package/dist/folders/utils/getFoldersAndDocumentsFromJoin.d.ts +24 -0
  130. package/dist/folders/utils/getFoldersAndDocumentsFromJoin.d.ts.map +1 -0
  131. package/dist/folders/utils/getFoldersAndDocumentsFromJoin.js +66 -0
  132. package/dist/folders/utils/getFoldersAndDocumentsFromJoin.js.map +1 -0
  133. package/dist/folders/utils/getOrphanedDocs.d.ts +15 -0
  134. package/dist/folders/utils/getOrphanedDocs.d.ts.map +1 -0
  135. package/dist/folders/utils/getOrphanedDocs.js +40 -0
  136. package/dist/folders/utils/getOrphanedDocs.js.map +1 -0
  137. package/dist/globals/config/types.d.ts +0 -4
  138. package/dist/globals/config/types.d.ts.map +1 -1
  139. package/dist/globals/config/types.js.map +1 -1
  140. package/dist/globals/operations/update.d.ts.map +1 -1
  141. package/dist/globals/operations/update.js +2 -1
  142. package/dist/globals/operations/update.js.map +1 -1
  143. package/dist/index.bundled.d.ts +288 -577
  144. package/dist/index.d.ts +9 -23
  145. package/dist/index.d.ts.map +1 -1
  146. package/dist/index.js +5 -13
  147. package/dist/index.js.map +1 -1
  148. package/dist/preferences/keys.d.ts +4 -8
  149. package/dist/preferences/keys.d.ts.map +1 -1
  150. package/dist/preferences/keys.js +4 -7
  151. package/dist/preferences/keys.js.map +1 -1
  152. package/dist/types/index.d.ts +0 -1
  153. package/dist/types/index.d.ts.map +1 -1
  154. package/dist/types/index.js.map +1 -1
  155. package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
  156. package/dist/utilities/addDataAndFileToRequest.js +7 -1
  157. package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
  158. package/dist/utilities/extractID.js +1 -1
  159. package/dist/utilities/extractID.js.map +1 -1
  160. package/dist/utilities/formatAdminURL.d.ts +2 -13
  161. package/dist/utilities/formatAdminURL.d.ts.map +1 -1
  162. package/dist/utilities/formatAdminURL.js.map +1 -1
  163. package/dist/versions/saveVersion.d.ts +1 -0
  164. package/dist/versions/saveVersion.d.ts.map +1 -1
  165. package/dist/versions/saveVersion.js +16 -66
  166. package/dist/versions/saveVersion.js.map +1 -1
  167. package/dist/versions/updateLatestVersion.d.ts +24 -0
  168. package/dist/versions/updateLatestVersion.d.ts.map +1 -0
  169. package/dist/versions/updateLatestVersion.js +64 -0
  170. package/dist/versions/updateLatestVersion.js.map +1 -0
  171. package/package.json +4 -4
  172. package/dist/admin/views/hierarchyList.d.ts +0 -9
  173. package/dist/admin/views/hierarchyList.d.ts.map +0 -1
  174. package/dist/admin/views/hierarchyList.js +0 -3
  175. package/dist/admin/views/hierarchyList.js.map +0 -1
  176. package/dist/hierarchy/addHierarchyToCollection.d.ts +0 -8
  177. package/dist/hierarchy/addHierarchyToCollection.d.ts.map +0 -1
  178. package/dist/hierarchy/addHierarchyToCollection.js +0 -62
  179. package/dist/hierarchy/addHierarchyToCollection.js.map +0 -1
  180. package/dist/hierarchy/buildParentField.d.ts +0 -11
  181. package/dist/hierarchy/buildParentField.d.ts.map +0 -1
  182. package/dist/hierarchy/buildParentField.js +0 -42
  183. package/dist/hierarchy/buildParentField.js.map +0 -1
  184. package/dist/hierarchy/constants.d.ts +0 -15
  185. package/dist/hierarchy/constants.d.ts.map +0 -1
  186. package/dist/hierarchy/constants.js +0 -11
  187. package/dist/hierarchy/constants.js.map +0 -1
  188. package/dist/hierarchy/createFolderField.d.ts +0 -39
  189. package/dist/hierarchy/createFolderField.d.ts.map +0 -1
  190. package/dist/hierarchy/createFolderField.js +0 -54
  191. package/dist/hierarchy/createFolderField.js.map +0 -1
  192. package/dist/hierarchy/createFoldersCollection.d.ts +0 -57
  193. package/dist/hierarchy/createFoldersCollection.d.ts.map +0 -1
  194. package/dist/hierarchy/createFoldersCollection.js +0 -63
  195. package/dist/hierarchy/createFoldersCollection.js.map +0 -1
  196. package/dist/hierarchy/createTagField.d.ts +0 -44
  197. package/dist/hierarchy/createTagField.d.ts.map +0 -1
  198. package/dist/hierarchy/createTagField.js +0 -48
  199. package/dist/hierarchy/createTagField.js.map +0 -1
  200. package/dist/hierarchy/createTagsCollection.d.ts +0 -54
  201. package/dist/hierarchy/createTagsCollection.d.ts.map +0 -1
  202. package/dist/hierarchy/createTagsCollection.js +0 -56
  203. package/dist/hierarchy/createTagsCollection.js.map +0 -1
  204. package/dist/hierarchy/getInitialTreeData.d.ts +0 -27
  205. package/dist/hierarchy/getInitialTreeData.d.ts.map +0 -1
  206. package/dist/hierarchy/getInitialTreeData.js +0 -125
  207. package/dist/hierarchy/getInitialTreeData.js.map +0 -1
  208. package/dist/hierarchy/hooks/collectionAfterDelete.d.ts +0 -14
  209. package/dist/hierarchy/hooks/collectionAfterDelete.d.ts.map +0 -1
  210. package/dist/hierarchy/hooks/collectionAfterDelete.js +0 -21
  211. package/dist/hierarchy/hooks/collectionAfterDelete.js.map +0 -1
  212. package/dist/hierarchy/hooks/collectionAfterRead.d.ts +0 -27
  213. package/dist/hierarchy/hooks/collectionAfterRead.d.ts.map +0 -1
  214. package/dist/hierarchy/hooks/collectionAfterRead.js +0 -64
  215. package/dist/hierarchy/hooks/collectionAfterRead.js.map +0 -1
  216. package/dist/hierarchy/hooks/collectionBeforeChange.d.ts +0 -19
  217. package/dist/hierarchy/hooks/collectionBeforeChange.d.ts.map +0 -1
  218. package/dist/hierarchy/hooks/collectionBeforeChange.js +0 -90
  219. package/dist/hierarchy/hooks/collectionBeforeChange.js.map +0 -1
  220. package/dist/hierarchy/hooks/collectionBeforeDelete.d.ts +0 -15
  221. package/dist/hierarchy/hooks/collectionBeforeDelete.d.ts.map +0 -1
  222. package/dist/hierarchy/hooks/collectionBeforeDelete.js +0 -20
  223. package/dist/hierarchy/hooks/collectionBeforeDelete.js.map +0 -1
  224. package/dist/hierarchy/hooks/ensureSafeCollectionsChange.d.ts +0 -8
  225. package/dist/hierarchy/hooks/ensureSafeCollectionsChange.d.ts.map +0 -1
  226. package/dist/hierarchy/hooks/ensureSafeCollectionsChange.js +0 -108
  227. package/dist/hierarchy/hooks/ensureSafeCollectionsChange.js.map +0 -1
  228. package/dist/hierarchy/injectHierarchyButton.d.ts +0 -14
  229. package/dist/hierarchy/injectHierarchyButton.d.ts.map +0 -1
  230. package/dist/hierarchy/injectHierarchyButton.js +0 -37
  231. package/dist/hierarchy/injectHierarchyButton.js.map +0 -1
  232. package/dist/hierarchy/resolveHierarchyCollections.d.ts +0 -23
  233. package/dist/hierarchy/resolveHierarchyCollections.d.ts.map +0 -1
  234. package/dist/hierarchy/resolveHierarchyCollections.js +0 -312
  235. package/dist/hierarchy/resolveHierarchyCollections.js.map +0 -1
  236. package/dist/hierarchy/sanitizeHierarchyCollection.d.ts +0 -14
  237. package/dist/hierarchy/sanitizeHierarchyCollection.d.ts.map +0 -1
  238. package/dist/hierarchy/sanitizeHierarchyCollection.js +0 -112
  239. package/dist/hierarchy/sanitizeHierarchyCollection.js.map +0 -1
  240. package/dist/hierarchy/types.d.ts +0 -137
  241. package/dist/hierarchy/types.d.ts.map +0 -1
  242. package/dist/hierarchy/types.js +0 -6
  243. package/dist/hierarchy/types.js.map +0 -1
  244. package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.d.ts +0 -71
  245. package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.d.ts.map +0 -1
  246. package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.js +0 -65
  247. package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.js.map +0 -1
  248. package/dist/hierarchy/utils/computePaths.d.ts +0 -31
  249. package/dist/hierarchy/utils/computePaths.d.ts.map +0 -1
  250. package/dist/hierarchy/utils/computePaths.js +0 -371
  251. package/dist/hierarchy/utils/computePaths.js.map +0 -1
  252. package/dist/hierarchy/utils/findUseAsTitle.d.ts +0 -6
  253. package/dist/hierarchy/utils/findUseAsTitle.d.ts.map +0 -1
  254. package/dist/hierarchy/utils/findUseAsTitle.js +0 -72
  255. package/dist/hierarchy/utils/findUseAsTitle.js.map +0 -1
  256. package/dist/hierarchy/utils/getAncestors.d.ts +0 -34
  257. package/dist/hierarchy/utils/getAncestors.d.ts.map +0 -1
  258. package/dist/hierarchy/utils/getAncestors.js +0 -94
  259. package/dist/hierarchy/utils/getAncestors.js.map +0 -1
  260. package/dist/hierarchy/utils/getLocalizedValue.d.ts +0 -30
  261. package/dist/hierarchy/utils/getLocalizedValue.d.ts.map +0 -1
  262. package/dist/hierarchy/utils/getLocalizedValue.js +0 -46
  263. package/dist/hierarchy/utils/getLocalizedValue.js.map +0 -1
  264. package/dist/hierarchy/utils/getLocalizedValue.spec.js +0 -250
  265. package/dist/hierarchy/utils/getLocalizedValue.spec.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/config/sanitize.ts"],"sourcesContent":["import { deepMergeSimple } from '@payloadcms/translations/utilities'\n\nimport type {\n CollectionConfig,\n SanitizedJoin,\n SanitizedJoins,\n} from '../../collections/config/types.js'\nimport type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { GlobalConfig } from '../../globals/config/types.js'\nimport type { Field } from './types.js'\n\nimport {\n DuplicateFieldName,\n InvalidConfiguration,\n InvalidFieldName,\n InvalidFieldRelationship,\n MissingEditorProp,\n MissingFieldType,\n} from '../../errors/index.js'\nimport { ReservedFieldName } from '../../errors/ReservedFieldName.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels, toWords } from '../../utilities/formatLabels.js'\nimport { validateTimezones } from '../../utilities/validateTimezones.js'\nimport { baseBlockFields } from '../baseFields/baseBlockFields.js'\nimport { baseIDField } from '../baseFields/baseIDField.js'\nimport { baseTimezoneField } from '../baseFields/timezone/baseField.js'\nimport { defaultTimezones } from '../baseFields/timezone/defaultTimezones.js'\nimport { getFieldPaths } from '../getFieldPaths.js'\nimport { setDefaultBeforeDuplicate } from '../setDefaultBeforeDuplicate.js'\nimport { validations } from '../validations.js'\nimport {\n reservedAPIKeyFieldNames,\n reservedBaseAuthFieldNames,\n reservedBaseUploadFieldNames,\n reservedVerifyFieldNames,\n} from './reservedFieldNames.js'\nimport { sanitizeJoinField } from './sanitizeJoinField.js'\nimport {\n fieldAffectsData as _fieldAffectsData,\n fieldIsLocalized,\n fieldIsVirtual,\n tabHasName,\n} from './types.js'\n\ntype Args = {\n collectionConfig?: CollectionConfig\n config: Config\n existingFieldNames?: Set<string>\n fields: Field[]\n globalConfig?: GlobalConfig\n /**\n * Used to prevent unnecessary sanitization of fields that are not top-level.\n */\n isTopLevelField?: boolean\n joinPath?: string\n /**\n * When not passed in, assume that join are not supported (globals, arrays, blocks)\n */\n joins?: SanitizedJoins\n /**\n * A string of '-' separated indexes representing where\n * to find this field in a given field schema array.\n */\n parentIndexPath?: string\n parentIsLocalized: boolean\n /**\n * Path for parent fields relative to their position in the schema.\n */\n parentSchemaPath?: string\n polymorphicJoins?: SanitizedJoin[]\n /**\n * If true, a richText field will require an editor property to be set, as the sanitizeFields function will not add it from the payload config if not present.\n *\n * @default false\n */\n requireFieldLevelRichTextEditor?: boolean\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>\n /**\n * If not null, will validate that upload and relationship fields do not relate to a collection that is not in this array.\n * This validation will be skipped if validRelationships is null.\n */\n validRelationships: null | string[]\n}\n\nexport const sanitizeFields = async ({\n collectionConfig,\n config,\n existingFieldNames = new Set(),\n fields,\n globalConfig,\n isTopLevelField = true,\n joinPath = '',\n joins,\n parentIndexPath = '',\n parentIsLocalized,\n parentSchemaPath = '',\n polymorphicJoins,\n requireFieldLevelRichTextEditor = false,\n richTextSanitizationPromises,\n validRelationships,\n}: Args): Promise<Field[]> => {\n if (!fields) {\n return []\n }\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]!\n\n if ('_sanitized' in field && field._sanitized === true) {\n continue\n }\n\n if ('_sanitized' in field) {\n field._sanitized = true\n }\n\n if (!field.type) {\n throw new MissingFieldType(field)\n }\n\n const fieldAffectsData = _fieldAffectsData(field)\n\n const { indexPath, schemaPath } = getFieldPaths({\n field,\n index: i,\n parentIndexPath,\n parentSchemaPath,\n })\n\n if (isTopLevelField && fieldAffectsData && field.name) {\n if (collectionConfig && collectionConfig.upload) {\n if (reservedBaseUploadFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n }\n\n if (\n collectionConfig &&\n collectionConfig.auth &&\n typeof collectionConfig.auth === 'object' &&\n !collectionConfig.auth.disableLocalStrategy\n ) {\n if (reservedBaseAuthFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n\n if (collectionConfig.auth.verify) {\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n if (reservedAPIKeyFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n if (reservedVerifyFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n }\n }\n }\n\n // assert that field names do not contain forbidden characters\n if (fieldAffectsData && !field?.name) {\n throw new InvalidFieldName(field, 'no field name')\n }\n // assert that field names do not contain forbidden characters\n if (fieldAffectsData && field.name.includes('.')) {\n throw new InvalidFieldName(field, field.name)\n }\n\n // Auto-label\n if (\n 'name' in field &&\n field.name &&\n typeof field.label !== 'object' &&\n typeof field.label !== 'string' &&\n typeof field.label !== 'function' &&\n field.label !== false\n ) {\n field.label = toWords(field.name)\n }\n\n if (\n field.type === 'checkbox' &&\n typeof field.defaultValue === 'undefined' &&\n field.required === true\n ) {\n field.defaultValue = false\n }\n\n if (field.type === 'join') {\n sanitizeJoinField({ config, field, joinPath, joins, parentIsLocalized, polymorphicJoins })\n }\n\n if (field.type === 'relationship' || field.type === 'upload') {\n // Validate that relationTo is not empty\n if (Array.isArray(field.relationTo) && field.relationTo.length === 0) {\n throw new Error(\n `Field \"${field.name}\" of type \"${field.type}\" has an empty relationTo array. At least one collection must be specified.`,\n )\n }\n\n if (validRelationships) {\n const relationships = Array.isArray(field.relationTo)\n ? field.relationTo\n : [field.relationTo]\n\n relationships.forEach((relationship: string) => {\n if (!validRelationships.includes(relationship)) {\n throw new InvalidFieldRelationship(field, relationship)\n }\n })\n }\n\n if (field.min && !field.minRows) {\n console.warn(\n `(payload): The \"min\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"minRows\" instead.`,\n )\n field.minRows = field.min\n }\n\n if (field.max && !field.maxRows) {\n console.warn(\n `(payload): The \"max\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"maxRows\" instead.`,\n )\n field.maxRows = field.max\n }\n }\n\n if (field.type === 'upload') {\n if (!field.admin || !('isSortable' in field.admin)) {\n field.admin = {\n isSortable: true,\n ...field.admin,\n }\n }\n }\n\n if (field.type === 'array' && field.fields) {\n const hasCustomID = field.fields.some((f) => 'name' in f && f.name === 'id')\n if (!hasCustomID) {\n field.fields.push(baseIDField)\n }\n }\n\n if ((field.type === 'blocks' || field.type === 'array') && field.label) {\n field.labels = field.labels || formatLabels(field.name)\n }\n\n if (fieldAffectsData) {\n if (existingFieldNames.has(field.name)) {\n throw new DuplicateFieldName(field.name)\n } else if (!['blockName', 'id'].includes(field.name)) {\n existingFieldNames.add(field.name)\n }\n\n if (typeof field.localized !== 'undefined') {\n let shouldDisableLocalized = !config.localization\n\n if (\n process.env.NEXT_PUBLIC_PAYLOAD_COMPATIBILITY_allowLocalizedWithinLocalized !== 'true' &&\n parentIsLocalized &&\n // @todo PAYLOAD_DO_NOT_SANITIZE_LOCALIZED_PROPERTY=true will be the default in 4.0\n process.env.PAYLOAD_DO_NOT_SANITIZE_LOCALIZED_PROPERTY !== 'true'\n ) {\n shouldDisableLocalized = true\n }\n\n if (shouldDisableLocalized) {\n delete field.localized\n }\n }\n\n if (typeof field.validate === 'undefined') {\n const defaultValidate = validations[field.type as keyof typeof validations]\n if (defaultValidate) {\n field.validate = (val: any, options: any) =>\n defaultValidate(val, { ...field, ...options })\n } else {\n field.validate = (): true => true\n }\n }\n\n if (!field.hooks) {\n field.hooks = {}\n }\n\n if (!field.access) {\n field.access = {}\n }\n\n setDefaultBeforeDuplicate(field, parentIsLocalized)\n }\n\n if (!field.admin) {\n field.admin = {}\n }\n\n // Make sure that the richText field has an editor\n if (field.type === 'richText') {\n const sanitizeRichText = async (_config: SanitizedConfig) => {\n if (!field.editor) {\n if (_config.editor && !requireFieldLevelRichTextEditor) {\n // config.editor should be sanitized at this point\n field.editor = _config.editor\n } else {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n }\n\n if (typeof field.editor === 'function') {\n field.editor = await field.editor({\n config: _config,\n isRoot: requireFieldLevelRichTextEditor,\n parentIsLocalized: (parentIsLocalized || field.localized)!,\n })\n }\n\n if (field.editor.i18n && Object.keys(field.editor.i18n).length >= 0) {\n config.i18n!.translations = deepMergeSimple(config.i18n!.translations!, field.editor.i18n)\n }\n }\n if (richTextSanitizationPromises) {\n richTextSanitizationPromises.push(sanitizeRichText)\n } else {\n await sanitizeRichText(config as unknown as SanitizedConfig)\n }\n }\n\n if (field.type === 'blocks' && field.blocks) {\n if (field.blockReferences && field.blocks?.length) {\n throw new Error('You cannot have both blockReferences and blocks in the same blocks field')\n }\n\n const blockSlugs: string[] = []\n\n for (const block of field.blockReferences ?? field.blocks) {\n const blockSlug = typeof block === 'string' ? block : block.slug\n\n if (blockSlugs.includes(blockSlug)) {\n throw new DuplicateFieldName(blockSlug)\n }\n\n blockSlugs.push(blockSlug)\n\n if (typeof block === 'string') {\n continue\n }\n\n if (block._sanitized === true) {\n continue\n }\n\n block._sanitized = true\n block.fields = block.fields.concat(baseBlockFields)\n block.labels = !block.labels ? formatLabels(block.slug) : block.labels\n\n block.fields = await sanitizeFields({\n collectionConfig,\n config,\n existingFieldNames: new Set(),\n fields: block.fields,\n isTopLevelField: false,\n parentIndexPath: '',\n parentIsLocalized: (parentIsLocalized || field.localized)!,\n parentSchemaPath: schemaPath + '.' + block.slug,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n }\n\n if ('fields' in field && field.fields) {\n field.fields = await sanitizeFields({\n collectionConfig,\n config,\n existingFieldNames: fieldAffectsData ? new Set() : existingFieldNames,\n fields: field.fields,\n isTopLevelField: isTopLevelField && !fieldAffectsData,\n joinPath: fieldAffectsData ? `${joinPath ? joinPath + '.' : ''}${field.name}` : joinPath,\n joins,\n parentIndexPath: fieldAffectsData ? '' : indexPath,\n parentIsLocalized: parentIsLocalized || fieldIsLocalized(field),\n parentSchemaPath: schemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n\n if (field.type === 'tabs') {\n for (let j = 0; j < field.tabs.length; j++) {\n const tab = field.tabs[j]!\n\n const isNamedTab = tabHasName(tab)\n\n if (isNamedTab && typeof tab.label === 'undefined') {\n tab.label = toWords(tab.name)\n }\n\n const { indexPath: tabIndexPath, schemaPath: tabSchemaPath } = getFieldPaths({\n field: tab,\n index: j,\n parentIndexPath: indexPath,\n parentSchemaPath: schemaPath,\n })\n\n if (\n 'admin' in tab &&\n tab.admin?.condition &&\n typeof tab.admin.condition === 'function' &&\n !tab.id\n ) {\n tab.id = tabSchemaPath\n }\n\n tab.fields = await sanitizeFields({\n collectionConfig,\n config,\n existingFieldNames: isNamedTab ? new Set() : existingFieldNames,\n fields: tab.fields,\n isTopLevelField: isTopLevelField && !isNamedTab,\n joinPath: isNamedTab ? `${joinPath ? joinPath + '.' : ''}${tab.name}` : joinPath,\n joins,\n parentIndexPath: isNamedTab ? '' : tabIndexPath,\n parentIsLocalized: parentIsLocalized || (isNamedTab && tab.localized)!,\n parentSchemaPath: tabSchemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n field.tabs[j] = tab\n }\n }\n\n if (field.type === 'ui' && typeof field.admin.disableBulkEdit === 'undefined') {\n field.admin.disableBulkEdit = true\n }\n\n fields[i] = field\n\n // Insert our field after assignment\n if (field.type === 'date' && field.timezone) {\n const name = field.name + '_tz'\n\n let defaultTimezone =\n field.timezone && typeof field.timezone === 'object'\n ? field.timezone.defaultTimezone\n : config.admin?.timezones?.defaultTimezone\n\n const required =\n field.required ||\n (field.timezone && typeof field.timezone === 'object' && field.timezone.required)\n\n const supportedTimezones =\n field.timezone && typeof field.timezone === 'object' && field.timezone.supportedTimezones\n ? field.timezone.supportedTimezones\n : config.admin?.timezones?.supportedTimezones\n\n const options =\n typeof supportedTimezones === 'function'\n ? supportedTimezones({ defaultTimezones })\n : supportedTimezones\n\n validateTimezones({\n source: `field \"${field.name}\" timezone.supportedTimezones`,\n timezones: options,\n })\n\n if (options && options.length === 1 && options[0]?.value) {\n defaultTimezone = options[0].value\n }\n\n // Generate label for timezone field\n // Use parent field's label + ' Tz' if it's a simple string, otherwise fallback to name\n const timezoneLabel = typeof field.label === 'string' ? `${field.label} Tz` : toWords(name)\n\n // Need to set the options here manually so that any database enums are generated correctly\n // The UI component will import the options from the config\n const baseField = baseTimezoneField({\n name,\n defaultValue: defaultTimezone,\n label: timezoneLabel,\n options,\n required,\n })\n\n // Apply override if provided\n const timezoneField =\n typeof field.timezone === 'object' && typeof field.timezone.override === 'function'\n ? field.timezone.override({ baseField })\n : baseField\n\n fields.splice(++i, 0, timezoneField)\n }\n\n if ('virtual' in field && typeof field.virtual === 'string') {\n const virtualField = field\n const fields = (collectionConfig || globalConfig)?.fields\n if (fields) {\n let flattenFields = flattenAllFields({ fields })\n const paths = field.virtual.split('.')\n let isHasMany = false\n\n for (const [i, segment] of paths.entries()) {\n const field = flattenFields.find((e) => e.name === segment)\n if (!field) {\n break\n }\n\n if (field.type === 'group' || field.type === 'tab' || field.type === 'array') {\n flattenFields = field.flattenedFields\n } else if (\n (field.type === 'relationship' || field.type === 'upload') &&\n i !== paths.length - 1 &&\n typeof field.relationTo === 'string'\n ) {\n if (\n field.hasMany &&\n (virtualField.type === 'text' ||\n virtualField.type === 'number' ||\n virtualField.type === 'select')\n ) {\n if (isHasMany) {\n throw new InvalidConfiguration(\n `Virtual field ${virtualField.name} in ${globalConfig ? `global ${globalConfig.slug}` : `collection ${collectionConfig?.slug}`} references 2 or more hasMany relationships on the path ${virtualField.virtual} which is not allowed.`,\n )\n }\n\n isHasMany = true\n virtualField.hasMany = true\n }\n const relatedCollection = config.collections?.find((e) => e.slug === field.relationTo)\n if (relatedCollection) {\n flattenFields = flattenAllFields({ fields: relatedCollection.fields })\n }\n }\n }\n }\n }\n }\n\n return fields\n}\n"],"names":["deepMergeSimple","DuplicateFieldName","InvalidConfiguration","InvalidFieldName","InvalidFieldRelationship","MissingEditorProp","MissingFieldType","ReservedFieldName","flattenAllFields","formatLabels","toWords","validateTimezones","baseBlockFields","baseIDField","baseTimezoneField","defaultTimezones","getFieldPaths","setDefaultBeforeDuplicate","validations","reservedAPIKeyFieldNames","reservedBaseAuthFieldNames","reservedBaseUploadFieldNames","reservedVerifyFieldNames","sanitizeJoinField","fieldAffectsData","_fieldAffectsData","fieldIsLocalized","tabHasName","sanitizeFields","collectionConfig","config","existingFieldNames","Set","fields","globalConfig","isTopLevelField","joinPath","joins","parentIndexPath","parentIsLocalized","parentSchemaPath","polymorphicJoins","requireFieldLevelRichTextEditor","richTextSanitizationPromises","validRelationships","i","length","field","_sanitized","type","indexPath","schemaPath","index","name","upload","includes","auth","disableLocalStrategy","verify","label","defaultValue","required","Array","isArray","relationTo","Error","relationships","forEach","relationship","min","minRows","console","warn","max","maxRows","admin","isSortable","hasCustomID","some","f","push","labels","has","add","localized","shouldDisableLocalized","localization","process","env","NEXT_PUBLIC_PAYLOAD_COMPATIBILITY_allowLocalizedWithinLocalized","PAYLOAD_DO_NOT_SANITIZE_LOCALIZED_PROPERTY","validate","defaultValidate","val","options","hooks","access","sanitizeRichText","_config","editor","isRoot","i18n","Object","keys","translations","blocks","blockReferences","blockSlugs","block","blockSlug","slug","concat","j","tabs","tab","isNamedTab","tabIndexPath","tabSchemaPath","condition","id","disableBulkEdit","timezone","defaultTimezone","timezones","supportedTimezones","source","value","timezoneLabel","baseField","timezoneField","override","splice","virtual","virtualField","flattenFields","paths","split","isHasMany","segment","entries","find","e","flattenedFields","hasMany","relatedCollection","collections"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/fields/config/sanitize.ts"],"sourcesContent":["import { deepMergeSimple } from '@payloadcms/translations/utilities'\n\nimport type {\n CollectionConfig,\n SanitizedJoin,\n SanitizedJoins,\n} from '../../collections/config/types.js'\nimport type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { GlobalConfig } from '../../globals/config/types.js'\nimport type { Field } from './types.js'\n\nimport {\n DuplicateFieldName,\n InvalidConfiguration,\n InvalidFieldName,\n InvalidFieldRelationship,\n MissingEditorProp,\n MissingFieldType,\n} from '../../errors/index.js'\nimport { ReservedFieldName } from '../../errors/ReservedFieldName.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels, toWords } from '../../utilities/formatLabels.js'\nimport { validateTimezones } from '../../utilities/validateTimezones.js'\nimport { baseBlockFields } from '../baseFields/baseBlockFields.js'\nimport { baseIDField } from '../baseFields/baseIDField.js'\nimport { baseTimezoneField } from '../baseFields/timezone/baseField.js'\nimport { defaultTimezones } from '../baseFields/timezone/defaultTimezones.js'\nimport { getFieldPaths } from '../getFieldPaths.js'\nimport { setDefaultBeforeDuplicate } from '../setDefaultBeforeDuplicate.js'\nimport { validations } from '../validations.js'\nimport {\n reservedAPIKeyFieldNames,\n reservedBaseAuthFieldNames,\n reservedBaseUploadFieldNames,\n reservedVerifyFieldNames,\n} from './reservedFieldNames.js'\nimport { sanitizeJoinField } from './sanitizeJoinField.js'\nimport {\n fieldAffectsData as _fieldAffectsData,\n fieldIsLocalized,\n fieldIsVirtual,\n tabHasName,\n} from './types.js'\n\ntype Args = {\n collectionConfig?: CollectionConfig\n config: Config\n existingFieldNames?: Set<string>\n fields: Field[]\n globalConfig?: GlobalConfig\n /**\n * Used to prevent unnecessary sanitization of fields that are not top-level.\n */\n isTopLevelField?: boolean\n joinPath?: string\n /**\n * When not passed in, assume that join are not supported (globals, arrays, blocks)\n */\n joins?: SanitizedJoins\n /**\n * A string of '-' separated indexes representing where\n * to find this field in a given field schema array.\n */\n parentIndexPath?: string\n parentIsLocalized: boolean\n /**\n * Path for parent fields relative to their position in the schema.\n */\n parentSchemaPath?: string\n polymorphicJoins?: SanitizedJoin[]\n /**\n * If true, a richText field will require an editor property to be set, as the sanitizeFields function will not add it from the payload config if not present.\n *\n * @default false\n */\n requireFieldLevelRichTextEditor?: boolean\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>\n /**\n * If not null, will validate that upload and relationship fields do not relate to a collection that is not in this array.\n * This validation will be skipped if validRelationships is null.\n */\n validRelationships: null | string[]\n}\n\nexport const sanitizeFields = async ({\n collectionConfig,\n config,\n existingFieldNames = new Set(),\n fields,\n globalConfig,\n isTopLevelField = true,\n joinPath = '',\n joins,\n parentIndexPath = '',\n parentIsLocalized,\n parentSchemaPath = '',\n polymorphicJoins,\n requireFieldLevelRichTextEditor = false,\n richTextSanitizationPromises,\n validRelationships,\n}: Args): Promise<Field[]> => {\n if (!fields) {\n return []\n }\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]!\n\n if ('_sanitized' in field && field._sanitized === true) {\n continue\n }\n\n if ('_sanitized' in field) {\n field._sanitized = true\n }\n\n if (!field.type) {\n throw new MissingFieldType(field)\n }\n\n const fieldAffectsData = _fieldAffectsData(field)\n\n const { indexPath, schemaPath } = getFieldPaths({\n field,\n index: i,\n parentIndexPath,\n parentSchemaPath,\n })\n\n if (isTopLevelField && fieldAffectsData && field.name) {\n if (collectionConfig && collectionConfig.upload) {\n if (reservedBaseUploadFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n }\n\n if (\n collectionConfig &&\n collectionConfig.auth &&\n typeof collectionConfig.auth === 'object' &&\n !collectionConfig.auth.disableLocalStrategy\n ) {\n if (reservedBaseAuthFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n\n if (collectionConfig.auth.verify) {\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n if (reservedAPIKeyFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n if (reservedVerifyFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n }\n }\n }\n\n // assert that field names do not contain forbidden characters\n if (fieldAffectsData && field.name.includes('.')) {\n throw new InvalidFieldName(field, field.name)\n }\n\n // Auto-label\n if (\n 'name' in field &&\n field.name &&\n typeof field.label !== 'object' &&\n typeof field.label !== 'string' &&\n typeof field.label !== 'function' &&\n field.label !== false\n ) {\n field.label = toWords(field.name)\n }\n\n if (\n field.type === 'checkbox' &&\n typeof field.defaultValue === 'undefined' &&\n field.required === true\n ) {\n field.defaultValue = false\n }\n\n if (field.type === 'join') {\n sanitizeJoinField({ config, field, joinPath, joins, parentIsLocalized, polymorphicJoins })\n }\n\n if (field.type === 'relationship' || field.type === 'upload') {\n // Validate that relationTo is not empty\n if (Array.isArray(field.relationTo) && field.relationTo.length === 0) {\n throw new Error(\n `Field \"${field.name}\" of type \"${field.type}\" has an empty relationTo array. At least one collection must be specified.`,\n )\n }\n\n if (validRelationships) {\n const relationships = Array.isArray(field.relationTo)\n ? field.relationTo\n : [field.relationTo]\n\n relationships.forEach((relationship: string) => {\n if (!validRelationships.includes(relationship)) {\n throw new InvalidFieldRelationship(field, relationship)\n }\n })\n }\n\n if (field.min && !field.minRows) {\n console.warn(\n `(payload): The \"min\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"minRows\" instead.`,\n )\n field.minRows = field.min\n }\n\n if (field.max && !field.maxRows) {\n console.warn(\n `(payload): The \"max\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"maxRows\" instead.`,\n )\n field.maxRows = field.max\n }\n }\n\n if (field.type === 'upload') {\n if (!field.admin || !('isSortable' in field.admin)) {\n field.admin = {\n isSortable: true,\n ...field.admin,\n }\n }\n }\n\n if (field.type === 'array' && field.fields) {\n const hasCustomID = field.fields.some((f) => 'name' in f && f.name === 'id')\n if (!hasCustomID) {\n field.fields.push(baseIDField)\n }\n }\n\n if ((field.type === 'blocks' || field.type === 'array') && field.label) {\n field.labels = field.labels || formatLabels(field.name)\n }\n\n if (fieldAffectsData) {\n if (existingFieldNames.has(field.name)) {\n throw new DuplicateFieldName(field.name)\n } else if (!['blockName', 'id'].includes(field.name)) {\n existingFieldNames.add(field.name)\n }\n\n if (typeof field.localized !== 'undefined') {\n let shouldDisableLocalized = !config.localization\n\n if (\n process.env.NEXT_PUBLIC_PAYLOAD_COMPATIBILITY_allowLocalizedWithinLocalized !== 'true' &&\n parentIsLocalized &&\n // @todo PAYLOAD_DO_NOT_SANITIZE_LOCALIZED_PROPERTY=true will be the default in 4.0\n process.env.PAYLOAD_DO_NOT_SANITIZE_LOCALIZED_PROPERTY !== 'true'\n ) {\n shouldDisableLocalized = true\n }\n\n if (shouldDisableLocalized) {\n delete field.localized\n }\n }\n\n if (typeof field.validate === 'undefined') {\n const defaultValidate = validations[field.type as keyof typeof validations]\n if (defaultValidate) {\n field.validate = (val: any, options: any) =>\n defaultValidate(val, { ...field, ...options })\n } else {\n field.validate = (): true => true\n }\n }\n\n if (!field.hooks) {\n field.hooks = {}\n }\n\n if (!field.access) {\n field.access = {}\n }\n\n setDefaultBeforeDuplicate(field, parentIsLocalized)\n }\n\n if (!field.admin) {\n field.admin = {}\n }\n\n // Make sure that the richText field has an editor\n if (field.type === 'richText') {\n const sanitizeRichText = async (_config: SanitizedConfig) => {\n if (!field.editor) {\n if (_config.editor && !requireFieldLevelRichTextEditor) {\n // config.editor should be sanitized at this point\n field.editor = _config.editor\n } else {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n }\n\n if (typeof field.editor === 'function') {\n field.editor = await field.editor({\n config: _config,\n isRoot: requireFieldLevelRichTextEditor,\n parentIsLocalized: (parentIsLocalized || field.localized)!,\n })\n }\n\n if (field.editor.i18n && Object.keys(field.editor.i18n).length >= 0) {\n config.i18n!.translations = deepMergeSimple(config.i18n!.translations!, field.editor.i18n)\n }\n }\n if (richTextSanitizationPromises) {\n richTextSanitizationPromises.push(sanitizeRichText)\n } else {\n await sanitizeRichText(config as unknown as SanitizedConfig)\n }\n }\n\n if (field.type === 'blocks' && field.blocks) {\n if (field.blockReferences && field.blocks?.length) {\n throw new Error('You cannot have both blockReferences and blocks in the same blocks field')\n }\n\n const blockSlugs: string[] = []\n\n for (const block of field.blockReferences ?? field.blocks) {\n const blockSlug = typeof block === 'string' ? block : block.slug\n\n if (blockSlugs.includes(blockSlug)) {\n throw new DuplicateFieldName(blockSlug)\n }\n\n blockSlugs.push(blockSlug)\n\n if (typeof block === 'string') {\n continue\n }\n\n if (block._sanitized === true) {\n continue\n }\n\n block._sanitized = true\n block.fields = block.fields.concat(baseBlockFields)\n block.labels = !block.labels ? formatLabels(block.slug) : block.labels\n\n block.fields = await sanitizeFields({\n collectionConfig,\n config,\n existingFieldNames: new Set(),\n fields: block.fields,\n isTopLevelField: false,\n parentIndexPath: '',\n parentIsLocalized: (parentIsLocalized || field.localized)!,\n parentSchemaPath: schemaPath + '.' + block.slug,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n }\n\n if ('fields' in field && field.fields) {\n field.fields = await sanitizeFields({\n collectionConfig,\n config,\n existingFieldNames: fieldAffectsData ? new Set() : existingFieldNames,\n fields: field.fields,\n isTopLevelField: isTopLevelField && !fieldAffectsData,\n joinPath: fieldAffectsData ? `${joinPath ? joinPath + '.' : ''}${field.name}` : joinPath,\n joins,\n parentIndexPath: fieldAffectsData ? '' : indexPath,\n parentIsLocalized: parentIsLocalized || fieldIsLocalized(field),\n parentSchemaPath: schemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n\n if (field.type === 'tabs') {\n for (let j = 0; j < field.tabs.length; j++) {\n const tab = field.tabs[j]!\n\n const isNamedTab = tabHasName(tab)\n\n if (isNamedTab && typeof tab.label === 'undefined') {\n tab.label = toWords(tab.name)\n }\n\n const { indexPath: tabIndexPath, schemaPath: tabSchemaPath } = getFieldPaths({\n field: tab,\n index: j,\n parentIndexPath: indexPath,\n parentSchemaPath: schemaPath,\n })\n\n if (\n 'admin' in tab &&\n tab.admin?.condition &&\n typeof tab.admin.condition === 'function' &&\n !tab.id\n ) {\n tab.id = tabSchemaPath\n }\n\n tab.fields = await sanitizeFields({\n collectionConfig,\n config,\n existingFieldNames: isNamedTab ? new Set() : existingFieldNames,\n fields: tab.fields,\n isTopLevelField: isTopLevelField && !isNamedTab,\n joinPath: isNamedTab ? `${joinPath ? joinPath + '.' : ''}${tab.name}` : joinPath,\n joins,\n parentIndexPath: isNamedTab ? '' : tabIndexPath,\n parentIsLocalized: parentIsLocalized || (isNamedTab && tab.localized)!,\n parentSchemaPath: tabSchemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n field.tabs[j] = tab\n }\n }\n\n if (field.type === 'ui' && typeof field.admin.disableBulkEdit === 'undefined') {\n field.admin.disableBulkEdit = true\n }\n\n fields[i] = field\n\n // Insert our field after assignment\n if (field.type === 'date' && field.timezone) {\n const name = field.name + '_tz'\n\n let defaultTimezone =\n field.timezone && typeof field.timezone === 'object'\n ? field.timezone.defaultTimezone\n : config.admin?.timezones?.defaultTimezone\n\n const required =\n field.required ||\n (field.timezone && typeof field.timezone === 'object' && field.timezone.required)\n\n const supportedTimezones =\n field.timezone && typeof field.timezone === 'object' && field.timezone.supportedTimezones\n ? field.timezone.supportedTimezones\n : config.admin?.timezones?.supportedTimezones\n\n const options =\n typeof supportedTimezones === 'function'\n ? supportedTimezones({ defaultTimezones })\n : supportedTimezones\n\n validateTimezones({\n source: `field \"${field.name}\" timezone.supportedTimezones`,\n timezones: options,\n })\n\n if (options && options.length === 1 && options[0]?.value) {\n defaultTimezone = options[0].value\n }\n\n // Generate label for timezone field\n // Use parent field's label + ' Tz' if it's a simple string, otherwise fallback to name\n const timezoneLabel = typeof field.label === 'string' ? `${field.label} Tz` : toWords(name)\n\n // Need to set the options here manually so that any database enums are generated correctly\n // The UI component will import the options from the config\n const baseField = baseTimezoneField({\n name,\n defaultValue: defaultTimezone,\n label: timezoneLabel,\n options,\n required,\n })\n\n // Apply override if provided\n const timezoneField =\n typeof field.timezone === 'object' && typeof field.timezone.override === 'function'\n ? field.timezone.override({ baseField })\n : baseField\n\n fields.splice(++i, 0, timezoneField)\n }\n\n if ('virtual' in field && typeof field.virtual === 'string') {\n const virtualField = field\n const fields = (collectionConfig || globalConfig)?.fields\n if (fields) {\n let flattenFields = flattenAllFields({ fields })\n const paths = field.virtual.split('.')\n let isHasMany = false\n\n for (const [i, segment] of paths.entries()) {\n const field = flattenFields.find((e) => e.name === segment)\n if (!field) {\n break\n }\n\n if (field.type === 'group' || field.type === 'tab' || field.type === 'array') {\n flattenFields = field.flattenedFields\n } else if (\n (field.type === 'relationship' || field.type === 'upload') &&\n i !== paths.length - 1 &&\n typeof field.relationTo === 'string'\n ) {\n if (\n field.hasMany &&\n (virtualField.type === 'text' ||\n virtualField.type === 'number' ||\n virtualField.type === 'select')\n ) {\n if (isHasMany) {\n throw new InvalidConfiguration(\n `Virtual field ${virtualField.name} in ${globalConfig ? `global ${globalConfig.slug}` : `collection ${collectionConfig?.slug}`} references 2 or more hasMany relationships on the path ${virtualField.virtual} which is not allowed.`,\n )\n }\n\n isHasMany = true\n virtualField.hasMany = true\n }\n const relatedCollection = config.collections?.find((e) => e.slug === field.relationTo)\n if (relatedCollection) {\n flattenFields = flattenAllFields({ fields: relatedCollection.fields })\n }\n }\n }\n }\n }\n }\n\n return fields\n}\n"],"names":["deepMergeSimple","DuplicateFieldName","InvalidConfiguration","InvalidFieldName","InvalidFieldRelationship","MissingEditorProp","MissingFieldType","ReservedFieldName","flattenAllFields","formatLabels","toWords","validateTimezones","baseBlockFields","baseIDField","baseTimezoneField","defaultTimezones","getFieldPaths","setDefaultBeforeDuplicate","validations","reservedAPIKeyFieldNames","reservedBaseAuthFieldNames","reservedBaseUploadFieldNames","reservedVerifyFieldNames","sanitizeJoinField","fieldAffectsData","_fieldAffectsData","fieldIsLocalized","tabHasName","sanitizeFields","collectionConfig","config","existingFieldNames","Set","fields","globalConfig","isTopLevelField","joinPath","joins","parentIndexPath","parentIsLocalized","parentSchemaPath","polymorphicJoins","requireFieldLevelRichTextEditor","richTextSanitizationPromises","validRelationships","i","length","field","_sanitized","type","indexPath","schemaPath","index","name","upload","includes","auth","disableLocalStrategy","verify","label","defaultValue","required","Array","isArray","relationTo","Error","relationships","forEach","relationship","min","minRows","console","warn","max","maxRows","admin","isSortable","hasCustomID","some","f","push","labels","has","add","localized","shouldDisableLocalized","localization","process","env","NEXT_PUBLIC_PAYLOAD_COMPATIBILITY_allowLocalizedWithinLocalized","PAYLOAD_DO_NOT_SANITIZE_LOCALIZED_PROPERTY","validate","defaultValidate","val","options","hooks","access","sanitizeRichText","_config","editor","isRoot","i18n","Object","keys","translations","blocks","blockReferences","blockSlugs","block","blockSlug","slug","concat","j","tabs","tab","isNamedTab","tabIndexPath","tabSchemaPath","condition","id","disableBulkEdit","timezone","defaultTimezone","timezones","supportedTimezones","source","value","timezoneLabel","baseField","timezoneField","override","splice","virtual","virtualField","flattenFields","paths","split","isHasMany","segment","entries","find","e","flattenedFields","hasMany","relatedCollection","collections"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sanitizeJoinField.d.ts","sourceRoot":"","sources":["../../../src/fields/config/sanitizeJoinField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AACtF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAO/D,eAAO,MAAM,iBAAiB,2FAQ3B;IACD,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,kBAAkB,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;IAClC,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,SA6FA,CAAA"}
1
+ {"version":3,"file":"sanitizeJoinField.d.ts","sourceRoot":"","sources":["../../../src/fields/config/sanitizeJoinField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AACtF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAO/D,eAAO,MAAM,iBAAiB,2FAQ3B;IACD,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,kBAAkB,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;IAClC,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,SA0FA,CAAA"}
@@ -7,9 +7,6 @@ export const sanitizeJoinField = ({ config, field, joinPath, joins, parentIsLoca
7
7
  if (typeof joins === 'undefined') {
8
8
  throw new APIError('Join fields cannot be added to arrays, blocks or globals.');
9
9
  }
10
- if (!field.admin) {
11
- field.admin = {};
12
- }
13
10
  if (typeof field.maxDepth === 'undefined') {
14
11
  field.maxDepth = 1;
15
12
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/config/sanitizeJoinField.ts"],"sourcesContent":["import type { SanitizedJoin, SanitizedJoins } from '../../collections/config/types.js'\nimport type { Config } from '../../config/types.js'\nimport type { FlattenedJoinField, JoinField } from './types.js'\n\nimport { APIError } from '../../errors/index.js'\nimport { InvalidFieldJoin } from '../../errors/InvalidFieldJoin.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { getFieldByPath } from '../../utilities/getFieldByPath.js'\n\nexport const sanitizeJoinField = ({\n config,\n field,\n joinPath,\n joins,\n parentIsLocalized,\n polymorphicJoins,\n validateOnly,\n}: {\n config: Config\n field: FlattenedJoinField | JoinField\n joinPath?: string\n joins?: SanitizedJoins\n parentIsLocalized: boolean\n polymorphicJoins?: SanitizedJoin[]\n validateOnly?: boolean\n}) => {\n // the `joins` arg is not passed for globals or when recursing on fields that do not allow a join field\n if (typeof joins === 'undefined') {\n throw new APIError('Join fields cannot be added to arrays, blocks or globals.')\n }\n if (!field.admin) {\n field.admin = {}\n }\n if (typeof field.maxDepth === 'undefined') {\n field.maxDepth = 1\n }\n const join: SanitizedJoin = {\n field,\n joinPath: `${joinPath ? joinPath + '.' : ''}${field.name}`,\n parentIsLocalized,\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n targetField: undefined,\n }\n\n if (Array.isArray(field.collection)) {\n for (const collection of field.collection) {\n const sanitizedField = {\n ...field,\n collection,\n } as FlattenedJoinField\n\n sanitizeJoinField({\n config,\n field: sanitizedField,\n joinPath,\n joins,\n parentIsLocalized,\n polymorphicJoins,\n validateOnly: true,\n })\n }\n\n if (Array.isArray(polymorphicJoins)) {\n polymorphicJoins.push(join)\n }\n\n return\n }\n\n const joinCollection = config.collections?.find(\n (collection) => collection.slug === field.collection,\n )\n if (!joinCollection) {\n throw new InvalidFieldJoin(field)\n }\n\n const relationshipField = getFieldByPath({\n fields: flattenAllFields({ cache: true, fields: joinCollection.fields }),\n path: field.on,\n })\n\n if (\n !relationshipField ||\n (relationshipField.field.type !== 'relationship' && relationshipField.field.type !== 'upload')\n ) {\n throw new InvalidFieldJoin(join.field)\n }\n\n if (relationshipField.pathHasLocalized) {\n join.getForeignPath = ({ locale }) => {\n return relationshipField.localizedPath.replace('<locale>', locale!)\n }\n }\n\n if (!relationshipField.field.index && !relationshipField.field.unique) {\n relationshipField.field.index = true\n }\n\n if (validateOnly) {\n return\n }\n\n join.targetField = relationshipField.field\n\n // override the join field localized property to use whatever the relationship field has\n // or if it's nested to a localized array / blocks / tabs / group\n field.localized = relationshipField.field.localized\n // override the join field hasMany property to use whatever the relationship field has\n field.hasMany = relationshipField.field.hasMany\n\n // @ts-expect-error converting JoinField to FlattenedJoinField to track targetField\n field.targetField = join.targetField\n\n if (!joins[field.collection]) {\n joins[field.collection] = [join]\n } else {\n joins[field.collection]?.push(join)\n }\n}\n"],"names":["APIError","InvalidFieldJoin","flattenAllFields","getFieldByPath","sanitizeJoinField","config","field","joinPath","joins","parentIsLocalized","polymorphicJoins","validateOnly","admin","maxDepth","join","name","targetField","undefined","Array","isArray","collection","sanitizedField","push","joinCollection","collections","find","slug","relationshipField","fields","cache","path","on","type","pathHasLocalized","getForeignPath","locale","localizedPath","replace","index","unique","localized","hasMany"],"mappings":"AAIA,SAASA,QAAQ,QAAQ,wBAAuB;AAChD,SAASC,gBAAgB,QAAQ,mCAAkC;AACnE,SAASC,gBAAgB,QAAQ,sCAAqC;AACtE,SAASC,cAAc,QAAQ,oCAAmC;AAElE,OAAO,MAAMC,oBAAoB,CAAC,EAChCC,MAAM,EACNC,KAAK,EACLC,QAAQ,EACRC,KAAK,EACLC,iBAAiB,EACjBC,gBAAgB,EAChBC,YAAY,EASb;IACC,uGAAuG;IACvG,IAAI,OAAOH,UAAU,aAAa;QAChC,MAAM,IAAIR,SAAS;IACrB;IACA,IAAI,CAACM,MAAMM,KAAK,EAAE;QAChBN,MAAMM,KAAK,GAAG,CAAC;IACjB;IACA,IAAI,OAAON,MAAMO,QAAQ,KAAK,aAAa;QACzCP,MAAMO,QAAQ,GAAG;IACnB;IACA,MAAMC,OAAsB;QAC1BR;QACAC,UAAU,GAAGA,WAAWA,WAAW,MAAM,KAAKD,MAAMS,IAAI,EAAE;QAC1DN;QACA,oFAAoF;QACpFO,aAAaC;IACf;IAEA,IAAIC,MAAMC,OAAO,CAACb,MAAMc,UAAU,GAAG;QACnC,KAAK,MAAMA,cAAcd,MAAMc,UAAU,CAAE;YACzC,MAAMC,iBAAiB;gBACrB,GAAGf,KAAK;gBACRc;YACF;YAEAhB,kBAAkB;gBAChBC;gBACAC,OAAOe;gBACPd;gBACAC;gBACAC;gBACAC;gBACAC,cAAc;YAChB;QACF;QAEA,IAAIO,MAAMC,OAAO,CAACT,mBAAmB;YACnCA,iBAAiBY,IAAI,CAACR;QACxB;QAEA;IACF;IAEA,MAAMS,iBAAiBlB,OAAOmB,WAAW,EAAEC,KACzC,CAACL,aAAeA,WAAWM,IAAI,KAAKpB,MAAMc,UAAU;IAEtD,IAAI,CAACG,gBAAgB;QACnB,MAAM,IAAItB,iBAAiBK;IAC7B;IAEA,MAAMqB,oBAAoBxB,eAAe;QACvCyB,QAAQ1B,iBAAiB;YAAE2B,OAAO;YAAMD,QAAQL,eAAeK,MAAM;QAAC;QACtEE,MAAMxB,MAAMyB,EAAE;IAChB;IAEA,IACE,CAACJ,qBACAA,kBAAkBrB,KAAK,CAAC0B,IAAI,KAAK,kBAAkBL,kBAAkBrB,KAAK,CAAC0B,IAAI,KAAK,UACrF;QACA,MAAM,IAAI/B,iBAAiBa,KAAKR,KAAK;IACvC;IAEA,IAAIqB,kBAAkBM,gBAAgB,EAAE;QACtCnB,KAAKoB,cAAc,GAAG,CAAC,EAAEC,MAAM,EAAE;YAC/B,OAAOR,kBAAkBS,aAAa,CAACC,OAAO,CAAC,YAAYF;QAC7D;IACF;IAEA,IAAI,CAACR,kBAAkBrB,KAAK,CAACgC,KAAK,IAAI,CAACX,kBAAkBrB,KAAK,CAACiC,MAAM,EAAE;QACrEZ,kBAAkBrB,KAAK,CAACgC,KAAK,GAAG;IAClC;IAEA,IAAI3B,cAAc;QAChB;IACF;IAEAG,KAAKE,WAAW,GAAGW,kBAAkBrB,KAAK;IAE1C,wFAAwF;IACxF,iEAAiE;IACjEA,MAAMkC,SAAS,GAAGb,kBAAkBrB,KAAK,CAACkC,SAAS;IACnD,sFAAsF;IACtFlC,MAAMmC,OAAO,GAAGd,kBAAkBrB,KAAK,CAACmC,OAAO;IAE/C,mFAAmF;IACnFnC,MAAMU,WAAW,GAAGF,KAAKE,WAAW;IAEpC,IAAI,CAACR,KAAK,CAACF,MAAMc,UAAU,CAAC,EAAE;QAC5BZ,KAAK,CAACF,MAAMc,UAAU,CAAC,GAAG;YAACN;SAAK;IAClC,OAAO;QACLN,KAAK,CAACF,MAAMc,UAAU,CAAC,EAAEE,KAAKR;IAChC;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/fields/config/sanitizeJoinField.ts"],"sourcesContent":["import type { SanitizedJoin, SanitizedJoins } from '../../collections/config/types.js'\nimport type { Config } from '../../config/types.js'\nimport type { FlattenedJoinField, JoinField } from './types.js'\n\nimport { APIError } from '../../errors/index.js'\nimport { InvalidFieldJoin } from '../../errors/InvalidFieldJoin.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { getFieldByPath } from '../../utilities/getFieldByPath.js'\n\nexport const sanitizeJoinField = ({\n config,\n field,\n joinPath,\n joins,\n parentIsLocalized,\n polymorphicJoins,\n validateOnly,\n}: {\n config: Config\n field: FlattenedJoinField | JoinField\n joinPath?: string\n joins?: SanitizedJoins\n parentIsLocalized: boolean\n polymorphicJoins?: SanitizedJoin[]\n validateOnly?: boolean\n}) => {\n // the `joins` arg is not passed for globals or when recursing on fields that do not allow a join field\n if (typeof joins === 'undefined') {\n throw new APIError('Join fields cannot be added to arrays, blocks or globals.')\n }\n if (typeof field.maxDepth === 'undefined') {\n field.maxDepth = 1\n }\n const join: SanitizedJoin = {\n field,\n joinPath: `${joinPath ? joinPath + '.' : ''}${field.name}`,\n parentIsLocalized,\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n targetField: undefined,\n }\n\n if (Array.isArray(field.collection)) {\n for (const collection of field.collection) {\n const sanitizedField = {\n ...field,\n collection,\n } as FlattenedJoinField\n\n sanitizeJoinField({\n config,\n field: sanitizedField,\n joinPath,\n joins,\n parentIsLocalized,\n polymorphicJoins,\n validateOnly: true,\n })\n }\n\n if (Array.isArray(polymorphicJoins)) {\n polymorphicJoins.push(join)\n }\n\n return\n }\n\n const joinCollection = config.collections?.find(\n (collection) => collection.slug === field.collection,\n )\n if (!joinCollection) {\n throw new InvalidFieldJoin(field)\n }\n\n const relationshipField = getFieldByPath({\n fields: flattenAllFields({ cache: true, fields: joinCollection.fields }),\n path: field.on,\n })\n\n if (\n !relationshipField ||\n (relationshipField.field.type !== 'relationship' && relationshipField.field.type !== 'upload')\n ) {\n throw new InvalidFieldJoin(join.field)\n }\n\n if (relationshipField.pathHasLocalized) {\n join.getForeignPath = ({ locale }) => {\n return relationshipField.localizedPath.replace('<locale>', locale!)\n }\n }\n\n if (!relationshipField.field.index && !relationshipField.field.unique) {\n relationshipField.field.index = true\n }\n\n if (validateOnly) {\n return\n }\n\n join.targetField = relationshipField.field\n\n // override the join field localized property to use whatever the relationship field has\n // or if it's nested to a localized array / blocks / tabs / group\n field.localized = relationshipField.field.localized\n // override the join field hasMany property to use whatever the relationship field has\n field.hasMany = relationshipField.field.hasMany\n\n // @ts-expect-error converting JoinField to FlattenedJoinField to track targetField\n field.targetField = join.targetField\n\n if (!joins[field.collection]) {\n joins[field.collection] = [join]\n } else {\n joins[field.collection]?.push(join)\n }\n}\n"],"names":["APIError","InvalidFieldJoin","flattenAllFields","getFieldByPath","sanitizeJoinField","config","field","joinPath","joins","parentIsLocalized","polymorphicJoins","validateOnly","maxDepth","join","name","targetField","undefined","Array","isArray","collection","sanitizedField","push","joinCollection","collections","find","slug","relationshipField","fields","cache","path","on","type","pathHasLocalized","getForeignPath","locale","localizedPath","replace","index","unique","localized","hasMany"],"mappings":"AAIA,SAASA,QAAQ,QAAQ,wBAAuB;AAChD,SAASC,gBAAgB,QAAQ,mCAAkC;AACnE,SAASC,gBAAgB,QAAQ,sCAAqC;AACtE,SAASC,cAAc,QAAQ,oCAAmC;AAElE,OAAO,MAAMC,oBAAoB,CAAC,EAChCC,MAAM,EACNC,KAAK,EACLC,QAAQ,EACRC,KAAK,EACLC,iBAAiB,EACjBC,gBAAgB,EAChBC,YAAY,EASb;IACC,uGAAuG;IACvG,IAAI,OAAOH,UAAU,aAAa;QAChC,MAAM,IAAIR,SAAS;IACrB;IACA,IAAI,OAAOM,MAAMM,QAAQ,KAAK,aAAa;QACzCN,MAAMM,QAAQ,GAAG;IACnB;IACA,MAAMC,OAAsB;QAC1BP;QACAC,UAAU,GAAGA,WAAWA,WAAW,MAAM,KAAKD,MAAMQ,IAAI,EAAE;QAC1DL;QACA,oFAAoF;QACpFM,aAAaC;IACf;IAEA,IAAIC,MAAMC,OAAO,CAACZ,MAAMa,UAAU,GAAG;QACnC,KAAK,MAAMA,cAAcb,MAAMa,UAAU,CAAE;YACzC,MAAMC,iBAAiB;gBACrB,GAAGd,KAAK;gBACRa;YACF;YAEAf,kBAAkB;gBAChBC;gBACAC,OAAOc;gBACPb;gBACAC;gBACAC;gBACAC;gBACAC,cAAc;YAChB;QACF;QAEA,IAAIM,MAAMC,OAAO,CAACR,mBAAmB;YACnCA,iBAAiBW,IAAI,CAACR;QACxB;QAEA;IACF;IAEA,MAAMS,iBAAiBjB,OAAOkB,WAAW,EAAEC,KACzC,CAACL,aAAeA,WAAWM,IAAI,KAAKnB,MAAMa,UAAU;IAEtD,IAAI,CAACG,gBAAgB;QACnB,MAAM,IAAIrB,iBAAiBK;IAC7B;IAEA,MAAMoB,oBAAoBvB,eAAe;QACvCwB,QAAQzB,iBAAiB;YAAE0B,OAAO;YAAMD,QAAQL,eAAeK,MAAM;QAAC;QACtEE,MAAMvB,MAAMwB,EAAE;IAChB;IAEA,IACE,CAACJ,qBACAA,kBAAkBpB,KAAK,CAACyB,IAAI,KAAK,kBAAkBL,kBAAkBpB,KAAK,CAACyB,IAAI,KAAK,UACrF;QACA,MAAM,IAAI9B,iBAAiBY,KAAKP,KAAK;IACvC;IAEA,IAAIoB,kBAAkBM,gBAAgB,EAAE;QACtCnB,KAAKoB,cAAc,GAAG,CAAC,EAAEC,MAAM,EAAE;YAC/B,OAAOR,kBAAkBS,aAAa,CAACC,OAAO,CAAC,YAAYF;QAC7D;IACF;IAEA,IAAI,CAACR,kBAAkBpB,KAAK,CAAC+B,KAAK,IAAI,CAACX,kBAAkBpB,KAAK,CAACgC,MAAM,EAAE;QACrEZ,kBAAkBpB,KAAK,CAAC+B,KAAK,GAAG;IAClC;IAEA,IAAI1B,cAAc;QAChB;IACF;IAEAE,KAAKE,WAAW,GAAGW,kBAAkBpB,KAAK;IAE1C,wFAAwF;IACxF,iEAAiE;IACjEA,MAAMiC,SAAS,GAAGb,kBAAkBpB,KAAK,CAACiC,SAAS;IACnD,sFAAsF;IACtFjC,MAAMkC,OAAO,GAAGd,kBAAkBpB,KAAK,CAACkC,OAAO;IAE/C,mFAAmF;IACnFlC,MAAMS,WAAW,GAAGF,KAAKE,WAAW;IAEpC,IAAI,CAACP,KAAK,CAACF,MAAMa,UAAU,CAAC,EAAE;QAC5BX,KAAK,CAACF,MAAMa,UAAU,CAAC,GAAG;YAACN;SAAK;IAClC,OAAO;QACLL,KAAK,CAACF,MAAMa,UAAU,CAAC,EAAEE,KAAKR;IAChC;AACF,EAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Config, SanitizedConfig } from '../config/types.js';
2
+ import type { CollectionConfig } from '../index.js';
3
+ export declare function addFolderCollection({ collectionSpecific, config, folderEnabledCollections, richTextSanitizationPromises, validRelationships, }: {
4
+ collectionSpecific: boolean;
5
+ config: NonNullable<Config>;
6
+ folderEnabledCollections: CollectionConfig[];
7
+ richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>;
8
+ validRelationships?: string[];
9
+ }): Promise<void>;
10
+ //# sourceMappingURL=addFolderCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addFolderCollection.d.ts","sourceRoot":"","sources":["../../src/folders/addFolderCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAKnD,wBAAsB,mBAAmB,CAAC,EACxC,kBAAkB,EAClB,MAAM,EACN,wBAAwB,EACxB,4BAAiC,EACjC,kBAAuB,GACxB,EAAE;IACD,kBAAkB,EAAE,OAAO,CAAA;IAC3B,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAC3B,wBAAwB,EAAE,gBAAgB,EAAE,CAAA;IAC5C,4BAA4B,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChF,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC9B,GAAG,OAAO,CAAC,IAAI,CAAC,CAgChB"}
@@ -0,0 +1,26 @@
1
+ import { sanitizeCollection } from '../collections/config/sanitize.js';
2
+ import { createFolderCollection } from './createFolderCollection.js';
3
+ export async function addFolderCollection({ collectionSpecific, config, folderEnabledCollections, richTextSanitizationPromises = [], validRelationships = [] }) {
4
+ if (config.folders === false) {
5
+ return;
6
+ }
7
+ let folderCollectionConfig = createFolderCollection({
8
+ slug: config.folders.slug,
9
+ collectionSpecific,
10
+ debug: config.folders.debug,
11
+ folderEnabledCollections,
12
+ folderFieldName: config.folders.fieldName
13
+ });
14
+ const collectionIndex = config.collections.push(folderCollectionConfig);
15
+ if (Array.isArray(config.folders?.collectionOverrides) && config?.folders.collectionOverrides.length) {
16
+ for (const override of config.folders.collectionOverrides){
17
+ folderCollectionConfig = await override({
18
+ collection: folderCollectionConfig
19
+ });
20
+ }
21
+ }
22
+ const sanitizedCollectionWithOverrides = await sanitizeCollection(config, folderCollectionConfig, richTextSanitizationPromises, validRelationships);
23
+ config.collections[collectionIndex - 1] = sanitizedCollectionWithOverrides;
24
+ }
25
+
26
+ //# sourceMappingURL=addFolderCollection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/folders/addFolderCollection.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from '../config/types.js'\nimport type { CollectionConfig } from '../index.js'\n\nimport { sanitizeCollection } from '../collections/config/sanitize.js'\nimport { createFolderCollection } from './createFolderCollection.js'\n\nexport async function addFolderCollection({\n collectionSpecific,\n config,\n folderEnabledCollections,\n richTextSanitizationPromises = [],\n validRelationships = [],\n}: {\n collectionSpecific: boolean\n config: NonNullable<Config>\n folderEnabledCollections: CollectionConfig[]\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>\n validRelationships?: string[]\n}): Promise<void> {\n if (config.folders === false) {\n return\n }\n\n let folderCollectionConfig = createFolderCollection({\n slug: config.folders!.slug as string,\n collectionSpecific,\n debug: config.folders!.debug,\n folderEnabledCollections,\n folderFieldName: config.folders!.fieldName as string,\n })\n\n const collectionIndex = config.collections!.push(folderCollectionConfig)\n\n if (\n Array.isArray(config.folders?.collectionOverrides) &&\n config?.folders.collectionOverrides.length\n ) {\n for (const override of config.folders.collectionOverrides) {\n folderCollectionConfig = await override({ collection: folderCollectionConfig })\n }\n }\n\n const sanitizedCollectionWithOverrides = await sanitizeCollection(\n config as unknown as Config,\n folderCollectionConfig,\n richTextSanitizationPromises,\n validRelationships,\n )\n\n config.collections![collectionIndex - 1] = sanitizedCollectionWithOverrides\n}\n"],"names":["sanitizeCollection","createFolderCollection","addFolderCollection","collectionSpecific","config","folderEnabledCollections","richTextSanitizationPromises","validRelationships","folders","folderCollectionConfig","slug","debug","folderFieldName","fieldName","collectionIndex","collections","push","Array","isArray","collectionOverrides","length","override","collection","sanitizedCollectionWithOverrides"],"mappings":"AAGA,SAASA,kBAAkB,QAAQ,oCAAmC;AACtE,SAASC,sBAAsB,QAAQ,8BAA6B;AAEpE,OAAO,eAAeC,oBAAoB,EACxCC,kBAAkB,EAClBC,MAAM,EACNC,wBAAwB,EACxBC,+BAA+B,EAAE,EACjCC,qBAAqB,EAAE,EAOxB;IACC,IAAIH,OAAOI,OAAO,KAAK,OAAO;QAC5B;IACF;IAEA,IAAIC,yBAAyBR,uBAAuB;QAClDS,MAAMN,OAAOI,OAAO,CAAEE,IAAI;QAC1BP;QACAQ,OAAOP,OAAOI,OAAO,CAAEG,KAAK;QAC5BN;QACAO,iBAAiBR,OAAOI,OAAO,CAAEK,SAAS;IAC5C;IAEA,MAAMC,kBAAkBV,OAAOW,WAAW,CAAEC,IAAI,CAACP;IAEjD,IACEQ,MAAMC,OAAO,CAACd,OAAOI,OAAO,EAAEW,wBAC9Bf,QAAQI,QAAQW,oBAAoBC,QACpC;QACA,KAAK,MAAMC,YAAYjB,OAAOI,OAAO,CAACW,mBAAmB,CAAE;YACzDV,yBAAyB,MAAMY,SAAS;gBAAEC,YAAYb;YAAuB;QAC/E;IACF;IAEA,MAAMc,mCAAmC,MAAMvB,mBAC7CI,QACAK,wBACAH,8BACAC;IAGFH,OAAOW,WAAW,AAAC,CAACD,kBAAkB,EAAE,GAAGS;AAC7C"}
@@ -0,0 +1,8 @@
1
+ import type { SanitizedCollectionConfig } from '../index.js';
2
+ export declare const addFolderFieldToCollection: ({ collection, collectionSpecific, folderFieldName, folderSlug, }: {
3
+ collection: SanitizedCollectionConfig;
4
+ collectionSpecific: boolean;
5
+ folderFieldName: string;
6
+ folderSlug: string;
7
+ }) => void;
8
+ //# sourceMappingURL=addFolderFieldToCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addFolderFieldToCollection.d.ts","sourceRoot":"","sources":["../../src/folders/addFolderFieldToCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAI5D,eAAO,MAAM,0BAA0B,qEAKpC;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,kBAAkB,EAAE,OAAO,CAAA;IAC3B,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;CACnB,KAAG,IAkBH,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { buildFolderField } from './buildFolderField.js';
2
+ export const addFolderFieldToCollection = ({ collection, collectionSpecific, folderFieldName, folderSlug })=>{
3
+ collection.fields.push(buildFolderField({
4
+ collectionSpecific,
5
+ folderFieldName,
6
+ folderSlug,
7
+ overrides: {
8
+ admin: {
9
+ allowCreate: false,
10
+ allowEdit: false,
11
+ components: {
12
+ Cell: '@payloadcms/next/rsc#FolderTableCell',
13
+ Field: '@payloadcms/next/rsc#FolderField'
14
+ }
15
+ }
16
+ }
17
+ }));
18
+ };
19
+
20
+ //# sourceMappingURL=addFolderFieldToCollection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/folders/addFolderFieldToCollection.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../index.js'\n\nimport { buildFolderField } from './buildFolderField.js'\n\nexport const addFolderFieldToCollection = ({\n collection,\n collectionSpecific,\n folderFieldName,\n folderSlug,\n}: {\n collection: SanitizedCollectionConfig\n collectionSpecific: boolean\n folderFieldName: string\n folderSlug: string\n}): void => {\n collection.fields.push(\n buildFolderField({\n collectionSpecific,\n folderFieldName,\n folderSlug,\n overrides: {\n admin: {\n allowCreate: false,\n allowEdit: false,\n components: {\n Cell: '@payloadcms/next/rsc#FolderTableCell',\n Field: '@payloadcms/next/rsc#FolderField',\n },\n },\n },\n }),\n )\n}\n"],"names":["buildFolderField","addFolderFieldToCollection","collection","collectionSpecific","folderFieldName","folderSlug","fields","push","overrides","admin","allowCreate","allowEdit","components","Cell","Field"],"mappings":"AAEA,SAASA,gBAAgB,QAAQ,wBAAuB;AAExD,OAAO,MAAMC,6BAA6B,CAAC,EACzCC,UAAU,EACVC,kBAAkB,EAClBC,eAAe,EACfC,UAAU,EAMX;IACCH,WAAWI,MAAM,CAACC,IAAI,CACpBP,iBAAiB;QACfG;QACAC;QACAC;QACAG,WAAW;YACTC,OAAO;gBACLC,aAAa;gBACbC,WAAW;gBACXC,YAAY;oBACVC,MAAM;oBACNC,OAAO;gBACT;YACF;QACF;IACF;AAEJ,EAAC"}
@@ -0,0 +1,8 @@
1
+ import type { SingleRelationshipField } from '../fields/config/types.js';
2
+ export declare const buildFolderField: ({ collectionSpecific, folderFieldName, folderSlug, overrides, }: {
3
+ collectionSpecific: boolean;
4
+ folderFieldName: string;
5
+ folderSlug: string;
6
+ overrides?: Partial<SingleRelationshipField>;
7
+ }) => SingleRelationshipField;
8
+ //# sourceMappingURL=buildFolderField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildFolderField.d.ts","sourceRoot":"","sources":["../../src/folders/buildFolderField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAKxE,eAAO,MAAM,gBAAgB,oEAK1B;IACD,kBAAkB,EAAE,OAAO,CAAA;IAC3B,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAA;CAC7C,KAAG,uBA4FH,CAAA"}
@@ -0,0 +1,87 @@
1
+ import { extractID } from '../utilities/extractID.js';
2
+ export const buildFolderField = ({ collectionSpecific, folderFieldName, folderSlug, overrides = {} })=>{
3
+ const field = {
4
+ name: folderFieldName,
5
+ type: 'relationship',
6
+ admin: {},
7
+ hasMany: false,
8
+ index: true,
9
+ label: 'Folder',
10
+ relationTo: folderSlug,
11
+ validate: async (value, { collectionSlug, data, overrideAccess, previousValue, req })=>{
12
+ if (!collectionSpecific) {
13
+ // if collection scoping is not enabled, no validation required since folders can contain any type of document
14
+ return true;
15
+ }
16
+ if (!value) {
17
+ // no folder, no validation required
18
+ return true;
19
+ }
20
+ const newID = extractID(value);
21
+ if (previousValue && extractID(previousValue) === newID) {
22
+ // value did not change, no validation required
23
+ return true;
24
+ } else {
25
+ // need to validat the folder value allows this collection type
26
+ let parentFolder = null;
27
+ if (typeof value === 'string' || typeof value === 'number') {
28
+ // need to populate the value with the document
29
+ parentFolder = await req.payload.findByID({
30
+ id: newID,
31
+ collection: folderSlug,
32
+ depth: 0,
33
+ overrideAccess,
34
+ req,
35
+ select: {
36
+ folderType: true
37
+ },
38
+ user: req.user
39
+ });
40
+ }
41
+ if (parentFolder && collectionSlug) {
42
+ const parentFolderTypes = parentFolder.folderType || [];
43
+ // if the parent folder has no folder types, it accepts all collections
44
+ if (parentFolderTypes.length === 0) {
45
+ return true;
46
+ }
47
+ // validation for a folder document
48
+ if (collectionSlug === folderSlug) {
49
+ // ensure the parent accepts ALL folder types
50
+ const folderTypes = 'folderType' in data ? data.folderType : [];
51
+ const invalidSlugs = folderTypes.filter((validCollectionSlug)=>{
52
+ return !parentFolderTypes.includes(validCollectionSlug);
53
+ });
54
+ if (invalidSlugs.length === 0) {
55
+ return true;
56
+ } else {
57
+ return `Folder with ID ${newID} does not allow documents of type ${invalidSlugs.join(', ')}`;
58
+ }
59
+ }
60
+ // validation for a non-folder document
61
+ if (parentFolderTypes.includes(collectionSlug)) {
62
+ return true;
63
+ } else {
64
+ return `Folder with ID ${newID} does not allow documents of type ${collectionSlug}`;
65
+ }
66
+ } else {
67
+ return `Folder with ID ${newID} not found in collection ${folderSlug}`;
68
+ }
69
+ }
70
+ }
71
+ };
72
+ if (overrides?.admin) {
73
+ field.admin = {
74
+ ...field.admin,
75
+ ...overrides.admin || {}
76
+ };
77
+ if (overrides.admin.components) {
78
+ field.admin.components = {
79
+ ...field.admin.components,
80
+ ...overrides.admin.components || {}
81
+ };
82
+ }
83
+ }
84
+ return field;
85
+ };
86
+
87
+ //# sourceMappingURL=buildFolderField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/folders/buildFolderField.ts"],"sourcesContent":["import type { SingleRelationshipField } from '../fields/config/types.js'\nimport type { Document } from '../types/index.js'\n\nimport { extractID } from '../utilities/extractID.js'\n\nexport const buildFolderField = ({\n collectionSpecific,\n folderFieldName,\n folderSlug,\n overrides = {},\n}: {\n collectionSpecific: boolean\n folderFieldName: string\n folderSlug: string\n overrides?: Partial<SingleRelationshipField>\n}): SingleRelationshipField => {\n const field: SingleRelationshipField = {\n name: folderFieldName,\n type: 'relationship',\n admin: {},\n hasMany: false,\n index: true,\n label: 'Folder',\n relationTo: folderSlug,\n validate: async (value, { collectionSlug, data, overrideAccess, previousValue, req }) => {\n if (!collectionSpecific) {\n // if collection scoping is not enabled, no validation required since folders can contain any type of document\n return true\n }\n\n if (!value) {\n // no folder, no validation required\n return true\n }\n\n const newID = extractID<Document>(value)\n if (previousValue && extractID<Document>(previousValue) === newID) {\n // value did not change, no validation required\n return true\n } else {\n // need to validat the folder value allows this collection type\n let parentFolder: Document = null\n if (typeof value === 'string' || typeof value === 'number') {\n // need to populate the value with the document\n parentFolder = await req.payload.findByID({\n id: newID,\n collection: folderSlug,\n depth: 0, // no need to populate nested folders\n overrideAccess,\n req,\n select: {\n folderType: true, // only need to check folderType\n },\n user: req.user,\n })\n }\n\n if (parentFolder && collectionSlug) {\n const parentFolderTypes: string[] = (parentFolder.folderType as string[]) || []\n\n // if the parent folder has no folder types, it accepts all collections\n if (parentFolderTypes.length === 0) {\n return true\n }\n\n // validation for a folder document\n if (collectionSlug === folderSlug) {\n // ensure the parent accepts ALL folder types\n const folderTypes: string[] = 'folderType' in data ? (data.folderType as string[]) : []\n const invalidSlugs = folderTypes.filter((validCollectionSlug: string) => {\n return !parentFolderTypes.includes(validCollectionSlug)\n })\n if (invalidSlugs.length === 0) {\n return true\n } else {\n return `Folder with ID ${newID} does not allow documents of type ${invalidSlugs.join(', ')}`\n }\n }\n\n // validation for a non-folder document\n if (parentFolderTypes.includes(collectionSlug)) {\n return true\n } else {\n return `Folder with ID ${newID} does not allow documents of type ${collectionSlug}`\n }\n } else {\n return `Folder with ID ${newID} not found in collection ${folderSlug}`\n }\n }\n },\n }\n\n if (overrides?.admin) {\n field.admin = {\n ...field.admin,\n ...(overrides.admin || {}),\n }\n\n if (overrides.admin.components) {\n field.admin.components = {\n ...field.admin.components,\n ...(overrides.admin.components || {}),\n }\n }\n }\n\n return field\n}\n"],"names":["extractID","buildFolderField","collectionSpecific","folderFieldName","folderSlug","overrides","field","name","type","admin","hasMany","index","label","relationTo","validate","value","collectionSlug","data","overrideAccess","previousValue","req","newID","parentFolder","payload","findByID","id","collection","depth","select","folderType","user","parentFolderTypes","length","folderTypes","invalidSlugs","filter","validCollectionSlug","includes","join","components"],"mappings":"AAGA,SAASA,SAAS,QAAQ,4BAA2B;AAErD,OAAO,MAAMC,mBAAmB,CAAC,EAC/BC,kBAAkB,EAClBC,eAAe,EACfC,UAAU,EACVC,YAAY,CAAC,CAAC,EAMf;IACC,MAAMC,QAAiC;QACrCC,MAAMJ;QACNK,MAAM;QACNC,OAAO,CAAC;QACRC,SAAS;QACTC,OAAO;QACPC,OAAO;QACPC,YAAYT;QACZU,UAAU,OAAOC,OAAO,EAAEC,cAAc,EAAEC,IAAI,EAAEC,cAAc,EAAEC,aAAa,EAAEC,GAAG,EAAE;YAClF,IAAI,CAAClB,oBAAoB;gBACvB,8GAA8G;gBAC9G,OAAO;YACT;YAEA,IAAI,CAACa,OAAO;gBACV,oCAAoC;gBACpC,OAAO;YACT;YAEA,MAAMM,QAAQrB,UAAoBe;YAClC,IAAII,iBAAiBnB,UAAoBmB,mBAAmBE,OAAO;gBACjE,+CAA+C;gBAC/C,OAAO;YACT,OAAO;gBACL,+DAA+D;gBAC/D,IAAIC,eAAyB;gBAC7B,IAAI,OAAOP,UAAU,YAAY,OAAOA,UAAU,UAAU;oBAC1D,+CAA+C;oBAC/CO,eAAe,MAAMF,IAAIG,OAAO,CAACC,QAAQ,CAAC;wBACxCC,IAAIJ;wBACJK,YAAYtB;wBACZuB,OAAO;wBACPT;wBACAE;wBACAQ,QAAQ;4BACNC,YAAY;wBACd;wBACAC,MAAMV,IAAIU,IAAI;oBAChB;gBACF;gBAEA,IAAIR,gBAAgBN,gBAAgB;oBAClC,MAAMe,oBAA8B,AAACT,aAAaO,UAAU,IAAiB,EAAE;oBAE/E,uEAAuE;oBACvE,IAAIE,kBAAkBC,MAAM,KAAK,GAAG;wBAClC,OAAO;oBACT;oBAEA,mCAAmC;oBACnC,IAAIhB,mBAAmBZ,YAAY;wBACjC,6CAA6C;wBAC7C,MAAM6B,cAAwB,gBAAgBhB,OAAQA,KAAKY,UAAU,GAAgB,EAAE;wBACvF,MAAMK,eAAeD,YAAYE,MAAM,CAAC,CAACC;4BACvC,OAAO,CAACL,kBAAkBM,QAAQ,CAACD;wBACrC;wBACA,IAAIF,aAAaF,MAAM,KAAK,GAAG;4BAC7B,OAAO;wBACT,OAAO;4BACL,OAAO,CAAC,eAAe,EAAEX,MAAM,kCAAkC,EAAEa,aAAaI,IAAI,CAAC,OAAO;wBAC9F;oBACF;oBAEA,uCAAuC;oBACvC,IAAIP,kBAAkBM,QAAQ,CAACrB,iBAAiB;wBAC9C,OAAO;oBACT,OAAO;wBACL,OAAO,CAAC,eAAe,EAAEK,MAAM,kCAAkC,EAAEL,gBAAgB;oBACrF;gBACF,OAAO;oBACL,OAAO,CAAC,eAAe,EAAEK,MAAM,yBAAyB,EAAEjB,YAAY;gBACxE;YACF;QACF;IACF;IAEA,IAAIC,WAAWI,OAAO;QACpBH,MAAMG,KAAK,GAAG;YACZ,GAAGH,MAAMG,KAAK;YACd,GAAIJ,UAAUI,KAAK,IAAI,CAAC,CAAC;QAC3B;QAEA,IAAIJ,UAAUI,KAAK,CAAC8B,UAAU,EAAE;YAC9BjC,MAAMG,KAAK,CAAC8B,UAAU,GAAG;gBACvB,GAAGjC,MAAMG,KAAK,CAAC8B,UAAU;gBACzB,GAAIlC,UAAUI,KAAK,CAAC8B,UAAU,IAAI,CAAC,CAAC;YACtC;QACF;IACF;IAEA,OAAOjC;AACT,EAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const foldersSlug = "payload-folders";
2
+ export declare const parentFolderFieldName = "folder";
3
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/folders/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,oBAAoB,CAAA;AAC5C,eAAO,MAAM,qBAAqB,WAAW,CAAA"}
@@ -0,0 +1,4 @@
1
+ export const foldersSlug = 'payload-folders';
2
+ export const parentFolderFieldName = 'folder';
3
+
4
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/folders/constants.ts"],"sourcesContent":["export const foldersSlug = 'payload-folders'\nexport const parentFolderFieldName = 'folder'\n"],"names":["foldersSlug","parentFolderFieldName"],"mappings":"AAAA,OAAO,MAAMA,cAAc,kBAAiB;AAC5C,OAAO,MAAMC,wBAAwB,SAAQ"}
@@ -0,0 +1,11 @@
1
+ import type { CollectionConfig } from '../collections/config/types.js';
2
+ type CreateFolderCollectionArgs = {
3
+ collectionSpecific: boolean;
4
+ debug?: boolean;
5
+ folderEnabledCollections: CollectionConfig[];
6
+ folderFieldName: string;
7
+ slug: string;
8
+ };
9
+ export declare const createFolderCollection: ({ slug, collectionSpecific, debug, folderEnabledCollections, folderFieldName, }: CreateFolderCollectionArgs) => CollectionConfig;
10
+ export {};
11
+ //# sourceMappingURL=createFolderCollection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createFolderCollection.d.ts","sourceRoot":"","sources":["../../src/folders/createFolderCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAUtE,KAAK,0BAA0B,GAAG;IAChC,kBAAkB,EAAE,OAAO,CAAA;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,wBAAwB,EAAE,gBAAgB,EAAE,CAAA;IAC5C,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AACD,eAAO,MAAM,sBAAsB,oFAMhC,0BAA0B,KAAG,gBAqG/B,CAAA"}
@@ -0,0 +1,115 @@
1
+ import { defaultAccess } from '../auth/defaultAccess.js';
2
+ import { buildFolderField } from './buildFolderField.js';
3
+ import { deleteSubfoldersBeforeDelete } from './hooks/deleteSubfoldersAfterDelete.js';
4
+ import { dissasociateAfterDelete } from './hooks/dissasociateAfterDelete.js';
5
+ import { ensureSafeCollectionsChange } from './hooks/ensureSafeCollectionsChange.js';
6
+ import { reparentChildFolder } from './hooks/reparentChildFolder.js';
7
+ export const createFolderCollection = ({ slug, collectionSpecific, debug, folderEnabledCollections, folderFieldName })=>{
8
+ const { collectionOptions, collectionSlugs } = folderEnabledCollections.reduce((acc, collection)=>{
9
+ acc.collectionSlugs.push(collection.slug);
10
+ acc.collectionOptions.push({
11
+ label: collection.labels?.plural || collection.slug,
12
+ value: collection.slug
13
+ });
14
+ return acc;
15
+ }, {
16
+ collectionOptions: [],
17
+ collectionSlugs: []
18
+ });
19
+ return {
20
+ slug,
21
+ access: {
22
+ create: defaultAccess,
23
+ delete: defaultAccess,
24
+ read: defaultAccess,
25
+ readVersions: defaultAccess,
26
+ update: defaultAccess
27
+ },
28
+ admin: {
29
+ hidden: !debug,
30
+ useAsTitle: 'name'
31
+ },
32
+ fields: [
33
+ {
34
+ name: 'name',
35
+ type: 'text',
36
+ index: true,
37
+ required: true
38
+ },
39
+ buildFolderField({
40
+ collectionSpecific,
41
+ folderFieldName,
42
+ folderSlug: slug,
43
+ overrides: {
44
+ admin: {
45
+ hidden: !debug
46
+ }
47
+ }
48
+ }),
49
+ {
50
+ name: 'documentsAndFolders',
51
+ type: 'join',
52
+ admin: {
53
+ hidden: !debug
54
+ },
55
+ collection: [
56
+ slug,
57
+ ...collectionSlugs
58
+ ],
59
+ hasMany: true,
60
+ on: folderFieldName
61
+ },
62
+ ...collectionSpecific ? [
63
+ {
64
+ name: 'folderType',
65
+ type: 'select',
66
+ admin: {
67
+ components: {
68
+ Field: {
69
+ path: '@payloadcms/next/client#FolderTypeField'
70
+ }
71
+ },
72
+ position: 'sidebar'
73
+ },
74
+ hasMany: true,
75
+ options: collectionOptions
76
+ }
77
+ ] : []
78
+ ],
79
+ hooks: {
80
+ afterChange: [
81
+ reparentChildFolder({
82
+ folderFieldName
83
+ })
84
+ ],
85
+ afterDelete: [
86
+ dissasociateAfterDelete({
87
+ collectionSlugs,
88
+ folderFieldName
89
+ })
90
+ ],
91
+ beforeDelete: [
92
+ deleteSubfoldersBeforeDelete({
93
+ folderFieldName,
94
+ folderSlug: slug
95
+ })
96
+ ],
97
+ beforeValidate: [
98
+ ...collectionSpecific ? [
99
+ ensureSafeCollectionsChange({
100
+ foldersSlug: slug
101
+ })
102
+ ] : []
103
+ ]
104
+ },
105
+ labels: {
106
+ plural: 'Folders',
107
+ singular: 'Folder'
108
+ },
109
+ typescript: {
110
+ interface: 'FolderInterface'
111
+ }
112
+ };
113
+ };
114
+
115
+ //# sourceMappingURL=createFolderCollection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/folders/createFolderCollection.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { Field, Option, SelectField } from '../fields/config/types.js'\n\nimport { defaultAccess } from '../auth/defaultAccess.js'\nimport { buildFolderField } from './buildFolderField.js'\nimport { deleteSubfoldersBeforeDelete } from './hooks/deleteSubfoldersAfterDelete.js'\nimport { dissasociateAfterDelete } from './hooks/dissasociateAfterDelete.js'\nimport { ensureSafeCollectionsChange } from './hooks/ensureSafeCollectionsChange.js'\nimport { reparentChildFolder } from './hooks/reparentChildFolder.js'\n\ntype CreateFolderCollectionArgs = {\n collectionSpecific: boolean\n debug?: boolean\n folderEnabledCollections: CollectionConfig[]\n folderFieldName: string\n slug: string\n}\nexport const createFolderCollection = ({\n slug,\n collectionSpecific,\n debug,\n folderEnabledCollections,\n folderFieldName,\n}: CreateFolderCollectionArgs): CollectionConfig => {\n const { collectionOptions, collectionSlugs } = folderEnabledCollections.reduce(\n (acc, collection: CollectionConfig) => {\n acc.collectionSlugs.push(collection.slug)\n acc.collectionOptions.push({\n label: collection.labels?.plural || collection.slug,\n value: collection.slug,\n })\n\n return acc\n },\n {\n collectionOptions: [] as Option[],\n collectionSlugs: [] as string[],\n },\n )\n\n return {\n slug,\n access: {\n create: defaultAccess,\n delete: defaultAccess,\n read: defaultAccess,\n readVersions: defaultAccess,\n update: defaultAccess,\n },\n admin: {\n hidden: !debug,\n useAsTitle: 'name',\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n index: true,\n required: true,\n },\n buildFolderField({\n collectionSpecific,\n folderFieldName,\n folderSlug: slug,\n overrides: {\n admin: {\n hidden: !debug,\n },\n },\n }),\n {\n name: 'documentsAndFolders',\n type: 'join',\n admin: {\n hidden: !debug,\n },\n collection: [slug, ...collectionSlugs],\n hasMany: true,\n on: folderFieldName,\n },\n ...(collectionSpecific\n ? [\n {\n name: 'folderType',\n type: 'select',\n admin: {\n components: {\n Field: {\n path: '@payloadcms/next/client#FolderTypeField',\n },\n },\n position: 'sidebar',\n },\n hasMany: true,\n options: collectionOptions,\n } satisfies SelectField,\n ]\n : ([] as Field[])),\n ],\n hooks: {\n afterChange: [\n reparentChildFolder({\n folderFieldName,\n }),\n ],\n afterDelete: [\n dissasociateAfterDelete({\n collectionSlugs,\n folderFieldName,\n }),\n ],\n beforeDelete: [deleteSubfoldersBeforeDelete({ folderFieldName, folderSlug: slug })],\n beforeValidate: [\n ...(collectionSpecific ? [ensureSafeCollectionsChange({ foldersSlug: slug })] : []),\n ],\n },\n labels: {\n plural: 'Folders',\n singular: 'Folder',\n },\n typescript: {\n interface: 'FolderInterface',\n },\n }\n}\n"],"names":["defaultAccess","buildFolderField","deleteSubfoldersBeforeDelete","dissasociateAfterDelete","ensureSafeCollectionsChange","reparentChildFolder","createFolderCollection","slug","collectionSpecific","debug","folderEnabledCollections","folderFieldName","collectionOptions","collectionSlugs","reduce","acc","collection","push","label","labels","plural","value","access","create","delete","read","readVersions","update","admin","hidden","useAsTitle","fields","name","type","index","required","folderSlug","overrides","hasMany","on","components","Field","path","position","options","hooks","afterChange","afterDelete","beforeDelete","beforeValidate","foldersSlug","singular","typescript","interface"],"mappings":"AAGA,SAASA,aAAa,QAAQ,2BAA0B;AACxD,SAASC,gBAAgB,QAAQ,wBAAuB;AACxD,SAASC,4BAA4B,QAAQ,yCAAwC;AACrF,SAASC,uBAAuB,QAAQ,qCAAoC;AAC5E,SAASC,2BAA2B,QAAQ,yCAAwC;AACpF,SAASC,mBAAmB,QAAQ,iCAAgC;AASpE,OAAO,MAAMC,yBAAyB,CAAC,EACrCC,IAAI,EACJC,kBAAkB,EAClBC,KAAK,EACLC,wBAAwB,EACxBC,eAAe,EACY;IAC3B,MAAM,EAAEC,iBAAiB,EAAEC,eAAe,EAAE,GAAGH,yBAAyBI,MAAM,CAC5E,CAACC,KAAKC;QACJD,IAAIF,eAAe,CAACI,IAAI,CAACD,WAAWT,IAAI;QACxCQ,IAAIH,iBAAiB,CAACK,IAAI,CAAC;YACzBC,OAAOF,WAAWG,MAAM,EAAEC,UAAUJ,WAAWT,IAAI;YACnDc,OAAOL,WAAWT,IAAI;QACxB;QAEA,OAAOQ;IACT,GACA;QACEH,mBAAmB,EAAE;QACrBC,iBAAiB,EAAE;IACrB;IAGF,OAAO;QACLN;QACAe,QAAQ;YACNC,QAAQvB;YACRwB,QAAQxB;YACRyB,MAAMzB;YACN0B,cAAc1B;YACd2B,QAAQ3B;QACV;QACA4B,OAAO;YACLC,QAAQ,CAACpB;YACTqB,YAAY;QACd;QACAC,QAAQ;YACN;gBACEC,MAAM;gBACNC,MAAM;gBACNC,OAAO;gBACPC,UAAU;YACZ;YACAlC,iBAAiB;gBACfO;gBACAG;gBACAyB,YAAY7B;gBACZ8B,WAAW;oBACTT,OAAO;wBACLC,QAAQ,CAACpB;oBACX;gBACF;YACF;YACA;gBACEuB,MAAM;gBACNC,MAAM;gBACNL,OAAO;oBACLC,QAAQ,CAACpB;gBACX;gBACAO,YAAY;oBAACT;uBAASM;iBAAgB;gBACtCyB,SAAS;gBACTC,IAAI5B;YACN;eACIH,qBACA;gBACE;oBACEwB,MAAM;oBACNC,MAAM;oBACNL,OAAO;wBACLY,YAAY;4BACVC,OAAO;gCACLC,MAAM;4BACR;wBACF;wBACAC,UAAU;oBACZ;oBACAL,SAAS;oBACTM,SAAShC;gBACX;aACD,GACA,EAAE;SACR;QACDiC,OAAO;YACLC,aAAa;gBACXzC,oBAAoB;oBAClBM;gBACF;aACD;YACDoC,aAAa;gBACX5C,wBAAwB;oBACtBU;oBACAF;gBACF;aACD;YACDqC,cAAc;gBAAC9C,6BAA6B;oBAAES;oBAAiByB,YAAY7B;gBAAK;aAAG;YACnF0C,gBAAgB;mBACVzC,qBAAqB;oBAACJ,4BAA4B;wBAAE8C,aAAa3C;oBAAK;iBAAG,GAAG,EAAE;aACnF;QACH;QACAY,QAAQ;YACNC,QAAQ;YACR+B,UAAU;QACZ;QACAC,YAAY;YACVC,WAAW;QACb;IACF;AACF,EAAC"}
@@ -0,0 +1,8 @@
1
+ import type { CollectionBeforeDeleteHook } from '../../index.js';
2
+ type Args = {
3
+ folderFieldName: string;
4
+ folderSlug: string;
5
+ };
6
+ export declare const deleteSubfoldersBeforeDelete: ({ folderFieldName, folderSlug, }: Args) => CollectionBeforeDeleteHook;
7
+ export {};
8
+ //# sourceMappingURL=deleteSubfoldersAfterDelete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteSubfoldersAfterDelete.d.ts","sourceRoot":"","sources":["../../../src/folders/hooks/deleteSubfoldersAfterDelete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAEhE,KAAK,IAAI,GAAG;IACV,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AACD,eAAO,MAAM,4BAA4B,qCAGtC,IAAI,KAAG,0BAYT,CAAA"}