payload 3.84.1 → 4.0.0-internal.d28e9fb
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.
- package/README.md +5 -5
- package/dist/admin/elements/Nav.d.ts +13 -0
- package/dist/admin/elements/Nav.d.ts.map +1 -1
- package/dist/admin/elements/Nav.js.map +1 -1
- package/dist/admin/functions/index.d.ts +1 -38
- package/dist/admin/functions/index.d.ts.map +1 -1
- package/dist/admin/functions/index.js.map +1 -1
- package/dist/admin/types.d.ts +5 -4
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/admin/types.js.map +1 -1
- package/dist/admin/views/hierarchyList.d.ts +9 -0
- package/dist/admin/views/hierarchyList.d.ts.map +1 -0
- package/dist/admin/views/hierarchyList.js +3 -0
- package/dist/admin/views/hierarchyList.js.map +1 -0
- package/dist/admin/views/index.d.ts +1 -3
- package/dist/admin/views/index.d.ts.map +1 -1
- package/dist/admin/views/index.js.map +1 -1
- package/dist/admin/views/list.d.ts +43 -2
- package/dist/admin/views/list.d.ts.map +1 -1
- package/dist/admin/views/list.js.map +1 -1
- package/dist/bin/generateImportMap/iterateCollections.d.ts.map +1 -1
- package/dist/bin/generateImportMap/iterateCollections.js +1 -0
- package/dist/bin/generateImportMap/iterateCollections.js.map +1 -1
- package/dist/bin/generateImportMap/iterateConfig.d.ts.map +1 -1
- package/dist/bin/generateImportMap/iterateConfig.js +7 -0
- package/dist/bin/generateImportMap/iterateConfig.js.map +1 -1
- package/dist/bin/generateImportMap/iterateGlobals.d.ts.map +1 -1
- package/dist/bin/generateImportMap/iterateGlobals.js +20 -8
- package/dist/bin/generateImportMap/iterateGlobals.js.map +1 -1
- package/dist/bin/index.d.ts.map +1 -1
- package/dist/bin/index.js +1 -3
- package/dist/bin/index.js.map +1 -1
- package/dist/collections/config/client.d.ts +4 -2
- package/dist/collections/config/client.d.ts.map +1 -1
- package/dist/collections/config/client.js +13 -1
- package/dist/collections/config/client.js.map +1 -1
- package/dist/collections/config/defaults.js +1 -1
- package/dist/collections/config/defaults.js.map +1 -1
- package/dist/collections/config/sanitize.d.ts.map +1 -1
- package/dist/collections/config/sanitize.js +231 -184
- package/dist/collections/config/sanitize.js.map +1 -1
- package/dist/collections/config/types.d.ts +76 -91
- package/dist/collections/config/types.d.ts.map +1 -1
- package/dist/collections/config/types.js.map +1 -1
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +24 -19
- package/dist/collections/operations/create.js.map +1 -1
- package/dist/collections/operations/delete.d.ts.map +1 -1
- package/dist/collections/operations/delete.js +7 -2
- package/dist/collections/operations/delete.js.map +1 -1
- package/dist/collections/operations/deleteByID.d.ts.map +1 -1
- package/dist/collections/operations/deleteByID.js +7 -2
- package/dist/collections/operations/deleteByID.js.map +1 -1
- package/dist/collections/operations/find.d.ts.map +1 -1
- package/dist/collections/operations/find.js +7 -2
- package/dist/collections/operations/find.js.map +1 -1
- package/dist/collections/operations/findByID.d.ts.map +1 -1
- package/dist/collections/operations/findByID.js +10 -5
- package/dist/collections/operations/findByID.js.map +1 -1
- package/dist/collections/operations/findVersionByID.d.ts.map +1 -1
- package/dist/collections/operations/findVersionByID.js +6 -4
- package/dist/collections/operations/findVersionByID.js.map +1 -1
- package/dist/collections/operations/findVersions.d.ts.map +1 -1
- package/dist/collections/operations/findVersions.js +6 -4
- package/dist/collections/operations/findVersions.js.map +1 -1
- package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
- package/dist/collections/operations/restoreVersion.js +7 -2
- package/dist/collections/operations/restoreVersion.js.map +1 -1
- package/dist/collections/operations/update.d.ts.map +1 -1
- package/dist/collections/operations/update.js +7 -2
- package/dist/collections/operations/update.js.map +1 -1
- package/dist/collections/operations/updateByID.d.ts.map +1 -1
- package/dist/collections/operations/updateByID.js +7 -2
- package/dist/collections/operations/updateByID.js.map +1 -1
- package/dist/collections/operations/utilities/update.d.ts.map +1 -1
- package/dist/collections/operations/utilities/update.js +5 -4
- package/dist/collections/operations/utilities/update.js.map +1 -1
- package/dist/config/client.d.ts.map +1 -1
- package/dist/config/client.js +0 -10
- package/dist/config/client.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +0 -15
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/orderable/index.d.ts.map +1 -1
- package/dist/config/orderable/index.js +0 -4
- package/dist/config/orderable/index.js.map +1 -1
- package/dist/config/sanitize.d.ts.map +1 -1
- package/dist/config/sanitize.js +252 -266
- package/dist/config/sanitize.js.map +1 -1
- package/dist/config/types.d.ts +120 -13
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/exports/internal.d.ts +1 -0
- package/dist/exports/internal.d.ts.map +1 -1
- package/dist/exports/internal.js +1 -0
- package/dist/exports/internal.js.map +1 -1
- package/dist/exports/shared.d.ts +5 -3
- package/dist/exports/shared.d.ts.map +1 -1
- package/dist/exports/shared.js +3 -2
- package/dist/exports/shared.js.map +1 -1
- package/dist/fields/baseFields/slug/index.d.ts.map +1 -1
- package/dist/fields/baseFields/slug/index.js +6 -4
- package/dist/fields/baseFields/slug/index.js.map +1 -1
- package/dist/fields/config/client.d.ts.map +1 -1
- package/dist/fields/config/client.js +3 -2
- package/dist/fields/config/client.js.map +1 -1
- package/dist/fields/config/sanitize.d.ts.map +1 -1
- package/dist/fields/config/sanitize.js +335 -322
- package/dist/fields/config/sanitize.js.map +1 -1
- package/dist/fields/config/sanitizeJoinField.d.ts.map +1 -1
- package/dist/fields/config/sanitizeJoinField.js +3 -0
- package/dist/fields/config/sanitizeJoinField.js.map +1 -1
- package/dist/fields/config/types.d.ts +17 -73
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/config/types.js +11 -1
- package/dist/fields/config/types.js.map +1 -1
- package/dist/fields/isFieldDisabled.d.ts +12 -0
- package/dist/fields/isFieldDisabled.d.ts.map +1 -0
- package/dist/fields/isFieldDisabled.js +15 -0
- package/dist/fields/isFieldDisabled.js.map +1 -0
- package/dist/fields/isFieldDisabled.spec.js +134 -0
- package/dist/fields/isFieldDisabled.spec.js.map +1 -0
- package/dist/fields/validations.js +1 -1
- package/dist/fields/validations.js.map +1 -1
- package/dist/globals/config/client.d.ts +1 -1
- package/dist/globals/config/client.d.ts.map +1 -1
- package/dist/globals/config/client.js +2 -1
- package/dist/globals/config/client.js.map +1 -1
- package/dist/globals/config/sanitize.d.ts.map +1 -1
- package/dist/globals/config/sanitize.js +132 -122
- package/dist/globals/config/sanitize.js.map +1 -1
- package/dist/globals/config/types.d.ts +4 -57
- package/dist/globals/config/types.d.ts.map +1 -1
- package/dist/globals/config/types.js.map +1 -1
- package/dist/globals/operations/findOne.d.ts.map +1 -1
- package/dist/globals/operations/findOne.js +7 -2
- package/dist/globals/operations/findOne.js.map +1 -1
- package/dist/globals/operations/findVersionByID.d.ts.map +1 -1
- package/dist/globals/operations/findVersionByID.js +6 -4
- package/dist/globals/operations/findVersionByID.js.map +1 -1
- package/dist/globals/operations/findVersions.d.ts.map +1 -1
- package/dist/globals/operations/findVersions.js +6 -4
- package/dist/globals/operations/findVersions.js.map +1 -1
- package/dist/globals/operations/update.d.ts.map +1 -1
- package/dist/globals/operations/update.js +7 -2
- package/dist/globals/operations/update.js.map +1 -1
- package/dist/hierarchy/addHierarchyToCollection.d.ts +9 -0
- package/dist/hierarchy/addHierarchyToCollection.d.ts.map +1 -0
- package/dist/hierarchy/addHierarchyToCollection.js +76 -0
- package/dist/hierarchy/addHierarchyToCollection.js.map +1 -0
- package/dist/hierarchy/buildParentField.d.ts +11 -0
- package/dist/hierarchy/buildParentField.d.ts.map +1 -0
- package/dist/hierarchy/buildParentField.js +42 -0
- package/dist/hierarchy/buildParentField.js.map +1 -0
- package/dist/hierarchy/constants.d.ts +15 -0
- package/dist/hierarchy/constants.d.ts.map +1 -0
- package/dist/hierarchy/constants.js +11 -0
- package/dist/hierarchy/constants.js.map +1 -0
- package/dist/hierarchy/createFolderField.d.ts +39 -0
- package/dist/hierarchy/createFolderField.d.ts.map +1 -0
- package/dist/hierarchy/createFolderField.js +54 -0
- package/dist/hierarchy/createFolderField.js.map +1 -0
- package/dist/hierarchy/createTagField.d.ts +44 -0
- package/dist/hierarchy/createTagField.d.ts.map +1 -0
- package/dist/hierarchy/createTagField.js +48 -0
- package/dist/hierarchy/createTagField.js.map +1 -0
- package/dist/hierarchy/getInitialTreeData.d.ts +27 -0
- package/dist/hierarchy/getInitialTreeData.d.ts.map +1 -0
- package/dist/hierarchy/getInitialTreeData.js +125 -0
- package/dist/hierarchy/getInitialTreeData.js.map +1 -0
- package/dist/hierarchy/hooks/collectionAfterDelete.d.ts +14 -0
- package/dist/hierarchy/hooks/collectionAfterDelete.d.ts.map +1 -0
- package/dist/hierarchy/hooks/collectionAfterDelete.js +21 -0
- package/dist/hierarchy/hooks/collectionAfterDelete.js.map +1 -0
- package/dist/hierarchy/hooks/collectionAfterRead.d.ts +27 -0
- package/dist/hierarchy/hooks/collectionAfterRead.d.ts.map +1 -0
- package/dist/hierarchy/hooks/collectionAfterRead.js +72 -0
- package/dist/hierarchy/hooks/collectionAfterRead.js.map +1 -0
- package/dist/hierarchy/hooks/collectionBeforeChange.d.ts +19 -0
- package/dist/hierarchy/hooks/collectionBeforeChange.d.ts.map +1 -0
- package/dist/hierarchy/hooks/collectionBeforeChange.js +90 -0
- package/dist/hierarchy/hooks/collectionBeforeChange.js.map +1 -0
- package/dist/hierarchy/hooks/collectionBeforeDelete.d.ts +15 -0
- package/dist/hierarchy/hooks/collectionBeforeDelete.d.ts.map +1 -0
- package/dist/hierarchy/hooks/collectionBeforeDelete.js +20 -0
- package/dist/hierarchy/hooks/collectionBeforeDelete.js.map +1 -0
- package/dist/hierarchy/hooks/collectionBeforeOperation.d.ts +33 -0
- package/dist/hierarchy/hooks/collectionBeforeOperation.d.ts.map +1 -0
- package/dist/hierarchy/hooks/collectionBeforeOperation.js +66 -0
- package/dist/hierarchy/hooks/collectionBeforeOperation.js.map +1 -0
- package/dist/hierarchy/hooks/ensureSafeCollectionsChange.d.ts +8 -0
- package/dist/hierarchy/hooks/ensureSafeCollectionsChange.d.ts.map +1 -0
- package/dist/hierarchy/hooks/ensureSafeCollectionsChange.js +108 -0
- package/dist/hierarchy/hooks/ensureSafeCollectionsChange.js.map +1 -0
- package/dist/hierarchy/injectHierarchyButton.d.ts +14 -0
- package/dist/hierarchy/injectHierarchyButton.d.ts.map +1 -0
- package/dist/hierarchy/injectHierarchyButton.js +37 -0
- package/dist/hierarchy/injectHierarchyButton.js.map +1 -0
- package/dist/hierarchy/presets.d.ts +13 -0
- package/dist/hierarchy/presets.d.ts.map +1 -0
- package/dist/hierarchy/presets.js +52 -0
- package/dist/hierarchy/presets.js.map +1 -0
- package/dist/hierarchy/resolveHierarchyCollections.d.ts +23 -0
- package/dist/hierarchy/resolveHierarchyCollections.d.ts.map +1 -0
- package/dist/hierarchy/resolveHierarchyCollections.js +321 -0
- package/dist/hierarchy/resolveHierarchyCollections.js.map +1 -0
- package/dist/hierarchy/sanitizeHierarchyCollection.d.ts +14 -0
- package/dist/hierarchy/sanitizeHierarchyCollection.d.ts.map +1 -0
- package/dist/hierarchy/sanitizeHierarchyCollection.js +117 -0
- package/dist/hierarchy/sanitizeHierarchyCollection.js.map +1 -0
- package/dist/hierarchy/types.d.ts +155 -0
- package/dist/hierarchy/types.d.ts.map +1 -0
- package/dist/hierarchy/types.js +6 -0
- package/dist/hierarchy/types.js.map +1 -0
- package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.d.ts +77 -0
- package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.d.ts.map +1 -0
- package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.js +77 -0
- package/dist/hierarchy/utils/buildLocalizedHierarchyPaths.js.map +1 -0
- package/dist/hierarchy/utils/computePaths.d.ts +31 -0
- package/dist/hierarchy/utils/computePaths.d.ts.map +1 -0
- package/dist/hierarchy/utils/computePaths.js +445 -0
- package/dist/hierarchy/utils/computePaths.js.map +1 -0
- package/dist/hierarchy/utils/findUseAsTitle.d.ts +14 -0
- package/dist/hierarchy/utils/findUseAsTitle.d.ts.map +1 -0
- package/dist/hierarchy/utils/findUseAsTitle.js +89 -0
- package/dist/hierarchy/utils/findUseAsTitle.js.map +1 -0
- package/dist/hierarchy/utils/getAncestors.d.ts +34 -0
- package/dist/hierarchy/utils/getAncestors.d.ts.map +1 -0
- package/dist/hierarchy/utils/getAncestors.js +94 -0
- package/dist/hierarchy/utils/getAncestors.js.map +1 -0
- package/dist/hierarchy/utils/getLocalizedValue.d.ts +30 -0
- package/dist/hierarchy/utils/getLocalizedValue.d.ts.map +1 -0
- package/dist/hierarchy/utils/getLocalizedValue.js +46 -0
- package/dist/hierarchy/utils/getLocalizedValue.js.map +1 -0
- package/dist/hierarchy/utils/getLocalizedValue.spec.js +250 -0
- package/dist/hierarchy/utils/getLocalizedValue.spec.js.map +1 -0
- package/dist/index.bundled.d.ts +709 -530
- package/dist/index.d.ts +28 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -8
- package/dist/index.js.map +1 -1
- package/dist/preferences/keys.d.ts +8 -4
- package/dist/preferences/keys.d.ts.map +1 -1
- package/dist/preferences/keys.js +7 -4
- package/dist/preferences/keys.js.map +1 -1
- package/dist/preferences/types.d.ts +1 -1
- package/dist/preferences/types.d.ts.map +1 -1
- package/dist/preferences/types.js.map +1 -1
- package/dist/query-presets/config.d.ts.map +1 -1
- package/dist/query-presets/config.js +5 -1
- package/dist/query-presets/config.js.map +1 -1
- package/dist/queues/config/types/index.d.ts +0 -21
- package/dist/queues/config/types/index.d.ts.map +1 -1
- package/dist/queues/config/types/index.js.map +1 -1
- package/dist/queues/config/types/taskTypes.d.ts +0 -20
- package/dist/queues/config/types/taskTypes.d.ts.map +1 -1
- package/dist/queues/config/types/taskTypes.js.map +1 -1
- package/dist/queues/errors/handleWorkflowError.d.ts.map +1 -1
- package/dist/queues/errors/handleWorkflowError.js +9 -1
- package/dist/queues/errors/handleWorkflowError.js.map +1 -1
- package/dist/queues/localAPI.d.ts.map +1 -1
- package/dist/queues/localAPI.js +26 -67
- package/dist/queues/localAPI.js.map +1 -1
- package/dist/queues/operations/handleSchedules/index.d.ts.map +1 -1
- package/dist/queues/operations/handleSchedules/index.js +1 -4
- package/dist/queues/operations/handleSchedules/index.js.map +1 -1
- package/dist/queues/operations/runJobs/index.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/index.js +40 -37
- package/dist/queues/operations/runJobs/index.js.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js +3 -22
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getUpdateJobFunction.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getUpdateJobFunction.js +0 -2
- package/dist/queues/operations/runJobs/runJob/getUpdateJobFunction.js.map +1 -1
- package/dist/queues/utilities/updateJob.d.ts +1 -3
- package/dist/queues/utilities/updateJob.d.ts.map +1 -1
- package/dist/queues/utilities/updateJob.js +2 -18
- package/dist/queues/utilities/updateJob.js.map +1 -1
- package/dist/types/index.d.ts +44 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/uploads/getBaseFields.d.ts.map +1 -1
- package/dist/uploads/getBaseFields.js +35 -69
- package/dist/uploads/getBaseFields.js.map +1 -1
- package/dist/uploads/getSafeFilename.d.ts +9 -4
- package/dist/uploads/getSafeFilename.d.ts.map +1 -1
- package/dist/uploads/getSafeFilename.js +5 -5
- package/dist/uploads/getSafeFilename.js.map +1 -1
- package/dist/utilities/appendDateTimezoneSelectFields.d.ts +13 -0
- package/dist/utilities/appendDateTimezoneSelectFields.d.ts.map +1 -0
- package/dist/utilities/appendDateTimezoneSelectFields.js +47 -0
- package/dist/utilities/appendDateTimezoneSelectFields.js.map +1 -0
- package/dist/utilities/appendUploadSelectFields.d.ts.map +1 -1
- package/dist/utilities/appendUploadSelectFields.js +3 -0
- package/dist/utilities/appendUploadSelectFields.js.map +1 -1
- package/dist/utilities/extractID.js +1 -1
- package/dist/utilities/extractID.js.map +1 -1
- package/dist/utilities/flattenAllFields.d.ts.map +1 -1
- package/dist/utilities/flattenAllFields.js +102 -93
- package/dist/utilities/flattenAllFields.js.map +1 -1
- package/dist/utilities/formatAdminURL.d.ts +13 -2
- package/dist/utilities/formatAdminURL.d.ts.map +1 -1
- package/dist/utilities/formatAdminURL.js.map +1 -1
- package/dist/utilities/handleEndpoints.d.ts.map +1 -1
- package/dist/utilities/handleEndpoints.js +0 -1
- package/dist/utilities/handleEndpoints.js.map +1 -1
- package/dist/utilities/resolveSelect.d.ts +16 -0
- package/dist/utilities/resolveSelect.d.ts.map +1 -0
- package/dist/utilities/resolveSelect.js +19 -0
- package/dist/utilities/resolveSelect.js.map +1 -0
- package/dist/utilities/sanitizeProfiler.d.ts +38 -0
- package/dist/utilities/sanitizeProfiler.d.ts.map +1 -0
- package/dist/utilities/sanitizeProfiler.js +101 -0
- package/dist/utilities/sanitizeProfiler.js.map +1 -0
- package/dist/utilities/sanitizeSelect.d.ts +1 -2
- package/dist/utilities/sanitizeSelect.d.ts.map +1 -1
- package/dist/utilities/sanitizeSelect.js +19 -25
- package/dist/utilities/sanitizeSelect.js.map +1 -1
- package/dist/versions/baseFields.d.ts.map +1 -1
- package/dist/versions/baseFields.js +3 -2
- package/dist/versions/baseFields.js.map +1 -1
- package/dist/versions/buildCollectionFields.d.ts.map +1 -1
- package/dist/versions/buildCollectionFields.js +0 -1
- package/dist/versions/buildCollectionFields.js.map +1 -1
- package/dist/versions/buildGlobalFields.d.ts.map +1 -1
- package/dist/versions/buildGlobalFields.js +0 -1
- package/dist/versions/buildGlobalFields.js.map +1 -1
- package/dist/versions/payloadPackageList.d.ts.map +1 -1
- package/dist/versions/payloadPackageList.js +0 -1
- package/dist/versions/payloadPackageList.js.map +1 -1
- package/package.json +4 -4
- package/dist/admin/views/folderList.d.ts +0 -56
- package/dist/admin/views/folderList.d.ts.map +0 -1
- package/dist/admin/views/folderList.js +0 -3
- package/dist/admin/views/folderList.js.map +0 -1
- package/dist/folders/addFolderCollection.d.ts +0 -10
- package/dist/folders/addFolderCollection.d.ts.map +0 -1
- package/dist/folders/addFolderCollection.js +0 -26
- package/dist/folders/addFolderCollection.js.map +0 -1
- package/dist/folders/addFolderFieldToCollection.d.ts +0 -8
- package/dist/folders/addFolderFieldToCollection.d.ts.map +0 -1
- package/dist/folders/addFolderFieldToCollection.js +0 -20
- package/dist/folders/addFolderFieldToCollection.js.map +0 -1
- package/dist/folders/buildFolderField.d.ts +0 -8
- package/dist/folders/buildFolderField.d.ts.map +0 -1
- package/dist/folders/buildFolderField.js +0 -87
- package/dist/folders/buildFolderField.js.map +0 -1
- package/dist/folders/constants.d.ts +0 -3
- package/dist/folders/constants.d.ts.map +0 -1
- package/dist/folders/constants.js +0 -4
- package/dist/folders/constants.js.map +0 -1
- package/dist/folders/createFolderCollection.d.ts +0 -11
- package/dist/folders/createFolderCollection.d.ts.map +0 -1
- package/dist/folders/createFolderCollection.js +0 -115
- package/dist/folders/createFolderCollection.js.map +0 -1
- package/dist/folders/hooks/deleteSubfoldersAfterDelete.d.ts +0 -8
- package/dist/folders/hooks/deleteSubfoldersAfterDelete.d.ts.map +0 -1
- package/dist/folders/hooks/deleteSubfoldersAfterDelete.js +0 -15
- package/dist/folders/hooks/deleteSubfoldersAfterDelete.js.map +0 -1
- package/dist/folders/hooks/dissasociateAfterDelete.d.ts +0 -8
- package/dist/folders/hooks/dissasociateAfterDelete.d.ts.map +0 -1
- package/dist/folders/hooks/dissasociateAfterDelete.js +0 -20
- package/dist/folders/hooks/dissasociateAfterDelete.js.map +0 -1
- package/dist/folders/hooks/ensureSafeCollectionsChange.d.ts +0 -5
- package/dist/folders/hooks/ensureSafeCollectionsChange.d.ts.map +0 -1
- package/dist/folders/hooks/ensureSafeCollectionsChange.js +0 -107
- package/dist/folders/hooks/ensureSafeCollectionsChange.js.map +0 -1
- package/dist/folders/hooks/reparentChildFolder.d.ts +0 -24
- package/dist/folders/hooks/reparentChildFolder.d.ts.map +0 -1
- package/dist/folders/hooks/reparentChildFolder.js +0 -72
- package/dist/folders/hooks/reparentChildFolder.js.map +0 -1
- package/dist/folders/types.d.ts +0 -118
- package/dist/folders/types.d.ts.map +0 -1
- package/dist/folders/types.js +0 -3
- package/dist/folders/types.js.map +0 -1
- package/dist/folders/utils/buildFolderWhereConstraints.d.ts +0 -13
- package/dist/folders/utils/buildFolderWhereConstraints.d.ts.map +0 -1
- package/dist/folders/utils/buildFolderWhereConstraints.js +0 -45
- package/dist/folders/utils/buildFolderWhereConstraints.js.map +0 -1
- package/dist/folders/utils/formatFolderOrDocumentItem.d.ts +0 -12
- package/dist/folders/utils/formatFolderOrDocumentItem.d.ts.map +0 -1
- package/dist/folders/utils/formatFolderOrDocumentItem.js +0 -30
- package/dist/folders/utils/formatFolderOrDocumentItem.js.map +0 -1
- package/dist/folders/utils/getFolderBreadcrumbs.d.ts +0 -14
- package/dist/folders/utils/getFolderBreadcrumbs.d.ts.map +0 -1
- package/dist/folders/utils/getFolderBreadcrumbs.js +0 -45
- package/dist/folders/utils/getFolderBreadcrumbs.js.map +0 -1
- package/dist/folders/utils/getFolderData.d.ts +0 -33
- package/dist/folders/utils/getFolderData.d.ts.map +0 -1
- package/dist/folders/utils/getFolderData.js +0 -88
- package/dist/folders/utils/getFolderData.js.map +0 -1
- package/dist/folders/utils/getFoldersAndDocumentsFromJoin.d.ts +0 -24
- package/dist/folders/utils/getFoldersAndDocumentsFromJoin.d.ts.map +0 -1
- package/dist/folders/utils/getFoldersAndDocumentsFromJoin.js +0 -66
- package/dist/folders/utils/getFoldersAndDocumentsFromJoin.js.map +0 -1
- package/dist/folders/utils/getOrphanedDocs.d.ts +0 -15
- package/dist/folders/utils/getOrphanedDocs.d.ts.map +0 -1
- package/dist/folders/utils/getOrphanedDocs.js +0 -40
- package/dist/folders/utils/getOrphanedDocs.js.map +0 -1
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { DEFAULT_HIERARCHY_TREE_LIMIT } from '../hierarchy/constants.js';
|
|
2
|
+
export const getInitialTreeData = async ({ baseFilter, collectionSlug, expandedNodeIds = [], filterByCollections, limit, payload, selectedNodeId, selectedNodeParentId, user })=>{
|
|
3
|
+
const collectionConfig = payload.collections[collectionSlug]?.config;
|
|
4
|
+
if (!collectionConfig || !collectionConfig.hierarchy) {
|
|
5
|
+
throw new Error(`Collection ${collectionSlug} is not a hierarchy`);
|
|
6
|
+
}
|
|
7
|
+
const hierarchyConfig = collectionConfig.hierarchy;
|
|
8
|
+
const parentFieldName = hierarchyConfig.parentFieldName;
|
|
9
|
+
const useAsTitle = collectionConfig.admin?.useAsTitle ?? 'id';
|
|
10
|
+
// Get typeFieldName for filtering
|
|
11
|
+
const typeFieldName = hierarchyConfig.collectionSpecific && typeof hierarchyConfig.collectionSpecific === 'object' ? hierarchyConfig.collectionSpecific.fieldName : undefined;
|
|
12
|
+
// Build filter condition if filterByCollections is provided
|
|
13
|
+
// Exclude the hierarchy collection itself (folders always show folders)
|
|
14
|
+
const filteredTypes = filterByCollections?.filter((t)=>t !== collectionSlug);
|
|
15
|
+
// Get all possible type values from relatedCollections for detecting empty arrays
|
|
16
|
+
const allPossibleTypes = hierarchyConfig.relatedCollections ? Object.keys(hierarchyConfig.relatedCollections) : [];
|
|
17
|
+
const filterCondition = filteredTypes?.length && typeFieldName ? {
|
|
18
|
+
or: [
|
|
19
|
+
{
|
|
20
|
+
[typeFieldName]: {
|
|
21
|
+
in: filteredTypes
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
[typeFieldName]: {
|
|
26
|
+
exists: false
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
// Include unrestricted folders with empty allowedTypes array
|
|
30
|
+
// Using not_in with all possible values matches empty arrays in both MongoDB and Postgres
|
|
31
|
+
...allPossibleTypes.length > 0 ? [
|
|
32
|
+
{
|
|
33
|
+
[typeFieldName]: {
|
|
34
|
+
not_in: allPossibleTypes
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
] : []
|
|
38
|
+
]
|
|
39
|
+
} : null;
|
|
40
|
+
// Use limit from config if not provided, fallback to config's treeLimit
|
|
41
|
+
const effectiveLimit = limit ?? hierarchyConfig.admin?.treeLimit ?? DEFAULT_HIERARCHY_TREE_LIMIT;
|
|
42
|
+
const allDocs = [];
|
|
43
|
+
const loadedParents = {};
|
|
44
|
+
// Normalize selectedNodeParentId: treat null/undefined as 'null' (root level)
|
|
45
|
+
const normalizedSelectedParentId = selectedNodeParentId === null || selectedNodeParentId === undefined ? 'null' : String(selectedNodeParentId);
|
|
46
|
+
// Helper to check if selectedNodeId is among siblings at a given parent level
|
|
47
|
+
const needsSelectedNodeIncluded = (parentKey)=>{
|
|
48
|
+
return !!selectedNodeId && normalizedSelectedParentId === parentKey;
|
|
49
|
+
};
|
|
50
|
+
// Helper to fetch children with optional selectedNodeId inclusion
|
|
51
|
+
const fetchChildrenForParent = async (parentKey, parentCondition)=>{
|
|
52
|
+
const mustIncludeSelected = needsSelectedNodeIncluded(parentKey);
|
|
53
|
+
let accumulatedDocs = [];
|
|
54
|
+
let currentPage = 1;
|
|
55
|
+
let hasMore = true;
|
|
56
|
+
let totalDocs = 0;
|
|
57
|
+
let foundSelected = false;
|
|
58
|
+
// Combine parent condition with filter condition and baseFilter
|
|
59
|
+
const conditions = [
|
|
60
|
+
parentCondition
|
|
61
|
+
];
|
|
62
|
+
if (filterCondition) {
|
|
63
|
+
conditions.push(filterCondition);
|
|
64
|
+
}
|
|
65
|
+
if (baseFilter) {
|
|
66
|
+
conditions.push(baseFilter);
|
|
67
|
+
}
|
|
68
|
+
const whereClause = conditions.length > 1 ? {
|
|
69
|
+
and: conditions
|
|
70
|
+
} : parentCondition;
|
|
71
|
+
while(hasMore){
|
|
72
|
+
const result = await payload.find({
|
|
73
|
+
collection: collectionSlug,
|
|
74
|
+
depth: 0,
|
|
75
|
+
limit: effectiveLimit,
|
|
76
|
+
overrideAccess: false,
|
|
77
|
+
page: currentPage,
|
|
78
|
+
sort: useAsTitle,
|
|
79
|
+
user,
|
|
80
|
+
where: whereClause
|
|
81
|
+
});
|
|
82
|
+
accumulatedDocs = [
|
|
83
|
+
...accumulatedDocs,
|
|
84
|
+
...result.docs
|
|
85
|
+
];
|
|
86
|
+
totalDocs = result.totalDocs;
|
|
87
|
+
hasMore = result.hasNextPage;
|
|
88
|
+
// Check if selectedNodeId is in this page's results
|
|
89
|
+
if (mustIncludeSelected && !foundSelected) {
|
|
90
|
+
foundSelected = result.docs.some((doc)=>String(doc.id) === String(selectedNodeId));
|
|
91
|
+
}
|
|
92
|
+
// Stop if we've found the selected node OR we only need first page
|
|
93
|
+
if (!mustIncludeSelected || foundSelected || !hasMore) {
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
currentPage++;
|
|
97
|
+
}
|
|
98
|
+
allDocs.push(...accumulatedDocs);
|
|
99
|
+
loadedParents[parentKey] = {
|
|
100
|
+
hasMore,
|
|
101
|
+
loadedCount: accumulatedDocs.length,
|
|
102
|
+
totalDocs
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
// Query 1: Fetch root nodes
|
|
106
|
+
await fetchChildrenForParent('null', {
|
|
107
|
+
[parentFieldName]: {
|
|
108
|
+
exists: false
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
// Query 2: For each expanded node, fetch its children
|
|
112
|
+
for (const parentId of expandedNodeIds){
|
|
113
|
+
await fetchChildrenForParent(String(parentId), {
|
|
114
|
+
[parentFieldName]: {
|
|
115
|
+
equals: parentId
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
docs: allDocs,
|
|
121
|
+
loadedParents
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
//# sourceMappingURL=getInitialTreeData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hierarchy/getInitialTreeData.ts"],"sourcesContent":["import type { TypeWithID } from '../collections/config/types.js'\nimport type { PayloadRequest, Where } from '../types/index.js'\n\nimport { DEFAULT_HIERARCHY_TREE_LIMIT } from '../hierarchy/constants.js'\n\nexport type GetInitialTreeDataArgs = {\n /** Base filter to apply to all queries (e.g., tenant filter) */\n baseFilter?: null | Where\n collectionSlug: string\n expandedNodeIds?: (number | string)[]\n /** Filter tree to only show folders that allow these collection types (or are unrestricted) */\n filterByCollections?: string[]\n limit?: number\n payload: PayloadRequest['payload']\n /** The currently selected node ID. When provided, ensures siblings are loaded to include this node. */\n selectedNodeId?: null | number | string\n /** The parent ID of the selected node. Required when selectedNodeId is provided. */\n selectedNodeParentId?: null | number | string\n user: PayloadRequest['user']\n}\n\nexport type InitialTreeData = {\n docs: TypeWithID[]\n // Metadata about what was loaded - keyed by parent ID ('null' for root)\n loadedParents: Record<string, { hasMore: boolean; loadedCount?: number; totalDocs: number }>\n}\n\nexport const getInitialTreeData = async ({\n baseFilter,\n collectionSlug,\n expandedNodeIds = [],\n filterByCollections,\n limit,\n payload,\n selectedNodeId,\n selectedNodeParentId,\n user,\n}: GetInitialTreeDataArgs): Promise<InitialTreeData> => {\n const collectionConfig = payload.collections[collectionSlug]?.config\n\n if (!collectionConfig || !collectionConfig.hierarchy) {\n throw new Error(`Collection ${collectionSlug} is not a hierarchy`)\n }\n\n const hierarchyConfig = collectionConfig.hierarchy\n const parentFieldName = hierarchyConfig.parentFieldName\n const useAsTitle = collectionConfig.admin?.useAsTitle ?? 'id'\n\n // Get typeFieldName for filtering\n const typeFieldName =\n hierarchyConfig.collectionSpecific && typeof hierarchyConfig.collectionSpecific === 'object'\n ? hierarchyConfig.collectionSpecific.fieldName\n : undefined\n\n // Build filter condition if filterByCollections is provided\n // Exclude the hierarchy collection itself (folders always show folders)\n const filteredTypes = filterByCollections?.filter((t) => t !== collectionSlug)\n\n // Get all possible type values from relatedCollections for detecting empty arrays\n const allPossibleTypes = hierarchyConfig.relatedCollections\n ? Object.keys(hierarchyConfig.relatedCollections)\n : []\n\n const filterCondition =\n filteredTypes?.length && typeFieldName\n ? {\n or: [\n { [typeFieldName]: { in: filteredTypes } },\n { [typeFieldName]: { exists: false } }, // Include unrestricted folders (field doesn't exist)\n // Include unrestricted folders with empty allowedTypes array\n // Using not_in with all possible values matches empty arrays in both MongoDB and Postgres\n ...(allPossibleTypes.length > 0\n ? [{ [typeFieldName]: { not_in: allPossibleTypes } }]\n : []),\n ],\n }\n : null\n\n // Use limit from config if not provided, fallback to config's treeLimit\n const effectiveLimit = limit ?? hierarchyConfig.admin?.treeLimit ?? DEFAULT_HIERARCHY_TREE_LIMIT\n\n const allDocs: TypeWithID[] = []\n const loadedParents: Record<\n string,\n { hasMore: boolean; loadedCount: number; totalDocs: number }\n > = {}\n\n // Normalize selectedNodeParentId: treat null/undefined as 'null' (root level)\n const normalizedSelectedParentId =\n selectedNodeParentId === null || selectedNodeParentId === undefined\n ? 'null'\n : String(selectedNodeParentId)\n\n // Helper to check if selectedNodeId is among siblings at a given parent level\n const needsSelectedNodeIncluded = (parentKey: string): boolean => {\n return !!selectedNodeId && normalizedSelectedParentId === parentKey\n }\n\n // Helper to fetch children with optional selectedNodeId inclusion\n const fetchChildrenForParent = async (\n parentKey: string,\n parentCondition: Where,\n ): Promise<void> => {\n const mustIncludeSelected = needsSelectedNodeIncluded(parentKey)\n let accumulatedDocs: TypeWithID[] = []\n let currentPage = 1\n let hasMore = true\n let totalDocs = 0\n let foundSelected = false\n\n // Combine parent condition with filter condition and baseFilter\n const conditions: Where[] = [parentCondition]\n if (filterCondition) {\n conditions.push(filterCondition)\n }\n if (baseFilter) {\n conditions.push(baseFilter)\n }\n const whereClause = conditions.length > 1 ? { and: conditions } : parentCondition\n\n while (hasMore) {\n const result = await payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: effectiveLimit,\n overrideAccess: false,\n page: currentPage,\n sort: useAsTitle,\n user,\n where: whereClause,\n })\n\n accumulatedDocs = [...accumulatedDocs, ...result.docs]\n totalDocs = result.totalDocs\n hasMore = result.hasNextPage\n\n // Check if selectedNodeId is in this page's results\n if (mustIncludeSelected && !foundSelected) {\n foundSelected = result.docs.some(\n (doc: TypeWithID) => String(doc.id) === String(selectedNodeId),\n )\n }\n\n // Stop if we've found the selected node OR we only need first page\n if (!mustIncludeSelected || foundSelected || !hasMore) {\n break\n }\n\n currentPage++\n }\n\n allDocs.push(...accumulatedDocs)\n loadedParents[parentKey] = {\n hasMore,\n loadedCount: accumulatedDocs.length,\n totalDocs,\n }\n }\n\n // Query 1: Fetch root nodes\n await fetchChildrenForParent('null', {\n [parentFieldName]: { exists: false },\n })\n\n // Query 2: For each expanded node, fetch its children\n for (const parentId of expandedNodeIds) {\n await fetchChildrenForParent(String(parentId), {\n [parentFieldName]: { equals: parentId },\n })\n }\n\n return {\n docs: allDocs,\n loadedParents,\n }\n}\n"],"names":["DEFAULT_HIERARCHY_TREE_LIMIT","getInitialTreeData","baseFilter","collectionSlug","expandedNodeIds","filterByCollections","limit","payload","selectedNodeId","selectedNodeParentId","user","collectionConfig","collections","config","hierarchy","Error","hierarchyConfig","parentFieldName","useAsTitle","admin","typeFieldName","collectionSpecific","fieldName","undefined","filteredTypes","filter","t","allPossibleTypes","relatedCollections","Object","keys","filterCondition","length","or","in","exists","not_in","effectiveLimit","treeLimit","allDocs","loadedParents","normalizedSelectedParentId","String","needsSelectedNodeIncluded","parentKey","fetchChildrenForParent","parentCondition","mustIncludeSelected","accumulatedDocs","currentPage","hasMore","totalDocs","foundSelected","conditions","push","whereClause","and","result","find","collection","depth","overrideAccess","page","sort","where","docs","hasNextPage","some","doc","id","loadedCount","parentId","equals"],"mappings":"AAGA,SAASA,4BAA4B,QAAQ,4BAA2B;AAwBxE,OAAO,MAAMC,qBAAqB,OAAO,EACvCC,UAAU,EACVC,cAAc,EACdC,kBAAkB,EAAE,EACpBC,mBAAmB,EACnBC,KAAK,EACLC,OAAO,EACPC,cAAc,EACdC,oBAAoB,EACpBC,IAAI,EACmB;IACvB,MAAMC,mBAAmBJ,QAAQK,WAAW,CAACT,eAAe,EAAEU;IAE9D,IAAI,CAACF,oBAAoB,CAACA,iBAAiBG,SAAS,EAAE;QACpD,MAAM,IAAIC,MAAM,CAAC,WAAW,EAAEZ,eAAe,mBAAmB,CAAC;IACnE;IAEA,MAAMa,kBAAkBL,iBAAiBG,SAAS;IAClD,MAAMG,kBAAkBD,gBAAgBC,eAAe;IACvD,MAAMC,aAAaP,iBAAiBQ,KAAK,EAAED,cAAc;IAEzD,kCAAkC;IAClC,MAAME,gBACJJ,gBAAgBK,kBAAkB,IAAI,OAAOL,gBAAgBK,kBAAkB,KAAK,WAChFL,gBAAgBK,kBAAkB,CAACC,SAAS,GAC5CC;IAEN,4DAA4D;IAC5D,wEAAwE;IACxE,MAAMC,gBAAgBnB,qBAAqBoB,OAAO,CAACC,IAAMA,MAAMvB;IAE/D,kFAAkF;IAClF,MAAMwB,mBAAmBX,gBAAgBY,kBAAkB,GACvDC,OAAOC,IAAI,CAACd,gBAAgBY,kBAAkB,IAC9C,EAAE;IAEN,MAAMG,kBACJP,eAAeQ,UAAUZ,gBACrB;QACEa,IAAI;YACF;gBAAE,CAACb,cAAc,EAAE;oBAAEc,IAAIV;gBAAc;YAAE;YACzC;gBAAE,CAACJ,cAAc,EAAE;oBAAEe,QAAQ;gBAAM;YAAE;YACrC,6DAA6D;YAC7D,0FAA0F;eACtFR,iBAAiBK,MAAM,GAAG,IAC1B;gBAAC;oBAAE,CAACZ,cAAc,EAAE;wBAAEgB,QAAQT;oBAAiB;gBAAE;aAAE,GACnD,EAAE;SACP;IACH,IACA;IAEN,wEAAwE;IACxE,MAAMU,iBAAiB/B,SAASU,gBAAgBG,KAAK,EAAEmB,aAAatC;IAEpE,MAAMuC,UAAwB,EAAE;IAChC,MAAMC,gBAGF,CAAC;IAEL,8EAA8E;IAC9E,MAAMC,6BACJhC,yBAAyB,QAAQA,yBAAyBc,YACtD,SACAmB,OAAOjC;IAEb,8EAA8E;IAC9E,MAAMkC,4BAA4B,CAACC;QACjC,OAAO,CAAC,CAACpC,kBAAkBiC,+BAA+BG;IAC5D;IAEA,kEAAkE;IAClE,MAAMC,yBAAyB,OAC7BD,WACAE;QAEA,MAAMC,sBAAsBJ,0BAA0BC;QACtD,IAAII,kBAAgC,EAAE;QACtC,IAAIC,cAAc;QAClB,IAAIC,UAAU;QACd,IAAIC,YAAY;QAChB,IAAIC,gBAAgB;QAEpB,gEAAgE;QAChE,MAAMC,aAAsB;YAACP;SAAgB;QAC7C,IAAIf,iBAAiB;YACnBsB,WAAWC,IAAI,CAACvB;QAClB;QACA,IAAI7B,YAAY;YACdmD,WAAWC,IAAI,CAACpD;QAClB;QACA,MAAMqD,cAAcF,WAAWrB,MAAM,GAAG,IAAI;YAAEwB,KAAKH;QAAW,IAAIP;QAElE,MAAOI,QAAS;YACd,MAAMO,SAAS,MAAMlD,QAAQmD,IAAI,CAAC;gBAChCC,YAAYxD;gBACZyD,OAAO;gBACPtD,OAAO+B;gBACPwB,gBAAgB;gBAChBC,MAAMb;gBACNc,MAAM7C;gBACNR;gBACAsD,OAAOT;YACT;YAEAP,kBAAkB;mBAAIA;mBAAoBS,OAAOQ,IAAI;aAAC;YACtDd,YAAYM,OAAON,SAAS;YAC5BD,UAAUO,OAAOS,WAAW;YAE5B,oDAAoD;YACpD,IAAInB,uBAAuB,CAACK,eAAe;gBACzCA,gBAAgBK,OAAOQ,IAAI,CAACE,IAAI,CAC9B,CAACC,MAAoB1B,OAAO0B,IAAIC,EAAE,MAAM3B,OAAOlC;YAEnD;YAEA,mEAAmE;YACnE,IAAI,CAACuC,uBAAuBK,iBAAiB,CAACF,SAAS;gBACrD;YACF;YAEAD;QACF;QAEAV,QAAQe,IAAI,IAAIN;QAChBR,aAAa,CAACI,UAAU,GAAG;YACzBM;YACAoB,aAAatB,gBAAgBhB,MAAM;YACnCmB;QACF;IACF;IAEA,4BAA4B;IAC5B,MAAMN,uBAAuB,QAAQ;QACnC,CAAC5B,gBAAgB,EAAE;YAAEkB,QAAQ;QAAM;IACrC;IAEA,sDAAsD;IACtD,KAAK,MAAMoC,YAAYnE,gBAAiB;QACtC,MAAMyC,uBAAuBH,OAAO6B,WAAW;YAC7C,CAACtD,gBAAgB,EAAE;gBAAEuD,QAAQD;YAAS;QACxC;IACF;IAEA,OAAO;QACLN,MAAM1B;QACNC;IACF;AACF,EAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* afterDelete Hook Responsibilities:
|
|
3
|
+
* - Clear folder references from related documents when folder is deleted
|
|
4
|
+
*/
|
|
5
|
+
import type { CollectionAfterDeleteHook } from '../../index.js';
|
|
6
|
+
type Args = {
|
|
7
|
+
/**
|
|
8
|
+
* Map of collection slugs to their field names
|
|
9
|
+
*/
|
|
10
|
+
relatedCollections: Record<string, string>;
|
|
11
|
+
};
|
|
12
|
+
export declare const hierarchyCollectionAfterDelete: ({ relatedCollections }: Args) => CollectionAfterDeleteHook;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=collectionAfterDelete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectionAfterDelete.d.ts","sourceRoot":"","sources":["../../../src/hierarchy/hooks/collectionAfterDelete.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAE/D,KAAK,IAAI,GAAG;IACV;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC3C,CAAA;AAED,eAAO,MAAM,8BAA8B,2BAChB,IAAI,KAAG,yBAgB/B,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* afterDelete Hook Responsibilities:
|
|
3
|
+
* - Clear folder references from related documents when folder is deleted
|
|
4
|
+
*/ export const hierarchyCollectionAfterDelete = ({ relatedCollections })=>async ({ id, req })=>{
|
|
5
|
+
for (const [collectionSlug, fieldName] of Object.entries(relatedCollections)){
|
|
6
|
+
await req.payload.update({
|
|
7
|
+
collection: collectionSlug,
|
|
8
|
+
data: {
|
|
9
|
+
[fieldName]: null
|
|
10
|
+
},
|
|
11
|
+
req,
|
|
12
|
+
where: {
|
|
13
|
+
[fieldName]: {
|
|
14
|
+
equals: id
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=collectionAfterDelete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hierarchy/hooks/collectionAfterDelete.ts"],"sourcesContent":["/**\n * afterDelete Hook Responsibilities:\n * - Clear folder references from related documents when folder is deleted\n */\n\nimport type { CollectionAfterDeleteHook } from '../../index.js'\n\ntype Args = {\n /**\n * Map of collection slugs to their field names\n */\n relatedCollections: Record<string, string>\n}\n\nexport const hierarchyCollectionAfterDelete =\n ({ relatedCollections }: Args): CollectionAfterDeleteHook =>\n async ({ id, req }) => {\n for (const [collectionSlug, fieldName] of Object.entries(relatedCollections)) {\n await req.payload.update({\n collection: collectionSlug,\n data: {\n [fieldName]: null,\n },\n req,\n where: {\n [fieldName]: {\n equals: id,\n },\n },\n })\n }\n }\n"],"names":["hierarchyCollectionAfterDelete","relatedCollections","id","req","collectionSlug","fieldName","Object","entries","payload","update","collection","data","where","equals"],"mappings":"AAAA;;;CAGC,GAWD,OAAO,MAAMA,iCACX,CAAC,EAAEC,kBAAkB,EAAQ,GAC7B,OAAO,EAAEC,EAAE,EAAEC,GAAG,EAAE;QAChB,KAAK,MAAM,CAACC,gBAAgBC,UAAU,IAAIC,OAAOC,OAAO,CAACN,oBAAqB;YAC5E,MAAME,IAAIK,OAAO,CAACC,MAAM,CAAC;gBACvBC,YAAYN;gBACZO,MAAM;oBACJ,CAACN,UAAU,EAAE;gBACf;gBACAF;gBACAS,OAAO;oBACL,CAACP,UAAU,EAAE;wBACXQ,QAAQX;oBACV;gBACF;YACF;QACF;IACF,EAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* afterRead Hook Responsibilities:
|
|
3
|
+
* - Automatically compute and attach _h_slugPath and _h_titlePath to documents
|
|
4
|
+
* - Use cached ancestors to optimize queries when reading multiple documents
|
|
5
|
+
* - Only computes when explicitly requested via:
|
|
6
|
+
* 1. context.computeHierarchyPaths flag
|
|
7
|
+
* 2. ?computeHierarchyPaths=true query param
|
|
8
|
+
* 3. Selecting path fields in query (select parameter)
|
|
9
|
+
*/
|
|
10
|
+
import type { CollectionAfterReadHook } from '../../index.js';
|
|
11
|
+
type Args = {
|
|
12
|
+
/**
|
|
13
|
+
* The name of the field that contains the parent document ID
|
|
14
|
+
*/
|
|
15
|
+
parentFieldName: string;
|
|
16
|
+
/**
|
|
17
|
+
* The name of the field to populate with the slug-based path
|
|
18
|
+
*/
|
|
19
|
+
slugPathFieldName: string;
|
|
20
|
+
/**
|
|
21
|
+
* The name of the field to populate with the title-based path
|
|
22
|
+
*/
|
|
23
|
+
titlePathFieldName: string;
|
|
24
|
+
};
|
|
25
|
+
export declare const hierarchyCollectionAfterRead: ({ parentFieldName, slugPathFieldName, titlePathFieldName }: Args) => CollectionAfterReadHook;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=collectionAfterRead.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectionAfterRead.d.ts","sourceRoot":"","sources":["../../../src/hierarchy/hooks/collectionAfterRead.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAkB,MAAM,gBAAgB,CAAA;AAgC7E,KAAK,IAAI,GAAG;IACV;;OAEG;IACH,eAAe,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,iBAAiB,EAAE,MAAM,CAAA;IACzB;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,4BAA4B,+DACsB,IAAI,KAAG,uBAuDnE,CAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* afterRead Hook Responsibilities:
|
|
3
|
+
* - Automatically compute and attach _h_slugPath and _h_titlePath to documents
|
|
4
|
+
* - Use cached ancestors to optimize queries when reading multiple documents
|
|
5
|
+
* - Only computes when explicitly requested via:
|
|
6
|
+
* 1. context.computeHierarchyPaths flag
|
|
7
|
+
* 2. ?computeHierarchyPaths=true query param
|
|
8
|
+
* 3. Selecting path fields in query (select parameter)
|
|
9
|
+
*/ import { computePaths } from '../utils/computePaths.js';
|
|
10
|
+
import { findUseAsTitleField } from '../utils/findUseAsTitle.js';
|
|
11
|
+
/**
|
|
12
|
+
* Checks if path fields are being selected in the query
|
|
13
|
+
*/ function isPathFieldSelected(req, slugPathFieldName, titlePathFieldName) {
|
|
14
|
+
// Check query.select parameter (REST API)
|
|
15
|
+
const selectParam = req.query?.select;
|
|
16
|
+
if (selectParam) {
|
|
17
|
+
if (typeof selectParam === 'string') {
|
|
18
|
+
const selectedFields = selectParam.split(',').map((f)=>f.trim());
|
|
19
|
+
return selectedFields.includes(slugPathFieldName) || selectedFields.includes(titlePathFieldName);
|
|
20
|
+
}
|
|
21
|
+
// Could be an array or object depending on query parser
|
|
22
|
+
if (Array.isArray(selectParam)) {
|
|
23
|
+
return selectParam.includes(slugPathFieldName) || selectParam.includes(titlePathFieldName);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
export const hierarchyCollectionAfterRead = ({ parentFieldName, slugPathFieldName, titlePathFieldName })=>async ({ collection, context, doc, req })=>{
|
|
29
|
+
// Skip if deleting
|
|
30
|
+
if (context?.isDeleting) {
|
|
31
|
+
return doc;
|
|
32
|
+
}
|
|
33
|
+
// Determine if paths should be computed
|
|
34
|
+
const shouldComputePaths = context?.computeHierarchyPaths === true || // Explicit flag in context
|
|
35
|
+
context?.computeHierarchyPathsViaSelect === true || // Flag from beforeOperation (select-triggered)
|
|
36
|
+
req.query?.computeHierarchyPaths === 'true' || // Query parameter
|
|
37
|
+
isPathFieldSelected(req, slugPathFieldName, titlePathFieldName) // Field selection detection
|
|
38
|
+
;
|
|
39
|
+
if (!shouldComputePaths) {
|
|
40
|
+
return doc;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const { localized: isTitleLocalized } = findUseAsTitleField(collection);
|
|
44
|
+
const { slugPath, titlePath } = await computePaths({
|
|
45
|
+
collection,
|
|
46
|
+
doc,
|
|
47
|
+
draft: doc._status === 'draft',
|
|
48
|
+
locale: isTitleLocalized && req.locale === 'all' ? 'all' : req.locale === 'all' ? undefined : req.locale || undefined,
|
|
49
|
+
parentFieldName,
|
|
50
|
+
req,
|
|
51
|
+
slugPathFieldName,
|
|
52
|
+
titlePathFieldName
|
|
53
|
+
});
|
|
54
|
+
// Attach computed paths to document using configured field names
|
|
55
|
+
doc[slugPathFieldName] = slugPath;
|
|
56
|
+
doc[titlePathFieldName] = titlePath;
|
|
57
|
+
} catch (error) {
|
|
58
|
+
// If path computation fails, log but don't break the document read
|
|
59
|
+
// eslint-disable-next-line no-console
|
|
60
|
+
console.error(`Failed to compute hierarchy paths for document ${doc.id}:`, error);
|
|
61
|
+
}
|
|
62
|
+
// Strip auto-added fields that were only included for path computation
|
|
63
|
+
const autoAddedFields = context?.hierarchyAutoSelectedFields;
|
|
64
|
+
if (autoAddedFields && autoAddedFields.length > 0) {
|
|
65
|
+
for (const fieldName of autoAddedFields){
|
|
66
|
+
delete doc[fieldName];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return doc;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=collectionAfterRead.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hierarchy/hooks/collectionAfterRead.ts"],"sourcesContent":["/**\n * afterRead Hook Responsibilities:\n * - Automatically compute and attach _h_slugPath and _h_titlePath to documents\n * - Use cached ancestors to optimize queries when reading multiple documents\n * - Only computes when explicitly requested via:\n * 1. context.computeHierarchyPaths flag\n * 2. ?computeHierarchyPaths=true query param\n * 3. Selecting path fields in query (select parameter)\n */\n\nimport type { CollectionAfterReadHook, PayloadRequest } from '../../index.js'\n\nimport { computePaths } from '../utils/computePaths.js'\nimport { findUseAsTitleField } from '../utils/findUseAsTitle.js'\n\n/**\n * Checks if path fields are being selected in the query\n */\nfunction isPathFieldSelected(\n req: PayloadRequest,\n slugPathFieldName: string,\n titlePathFieldName: string,\n): boolean {\n // Check query.select parameter (REST API)\n const selectParam = req.query?.select\n\n if (selectParam) {\n if (typeof selectParam === 'string') {\n const selectedFields = selectParam.split(',').map((f) => f.trim())\n return (\n selectedFields.includes(slugPathFieldName) || selectedFields.includes(titlePathFieldName)\n )\n }\n // Could be an array or object depending on query parser\n if (Array.isArray(selectParam)) {\n return selectParam.includes(slugPathFieldName) || selectParam.includes(titlePathFieldName)\n }\n }\n\n return false\n}\n\ntype Args = {\n /**\n * The name of the field that contains the parent document ID\n */\n parentFieldName: string\n /**\n * The name of the field to populate with the slug-based path\n */\n slugPathFieldName: string\n /**\n * The name of the field to populate with the title-based path\n */\n titlePathFieldName: string\n}\n\nexport const hierarchyCollectionAfterRead =\n ({ parentFieldName, slugPathFieldName, titlePathFieldName }: Args): CollectionAfterReadHook =>\n async ({ collection, context, doc, req }) => {\n // Skip if deleting\n if (context?.isDeleting) {\n return doc\n }\n\n // Determine if paths should be computed\n const shouldComputePaths =\n context?.computeHierarchyPaths === true || // Explicit flag in context\n context?.computeHierarchyPathsViaSelect === true || // Flag from beforeOperation (select-triggered)\n req.query?.computeHierarchyPaths === 'true' || // Query parameter\n isPathFieldSelected(req, slugPathFieldName, titlePathFieldName) // Field selection detection\n\n if (!shouldComputePaths) {\n return doc\n }\n\n try {\n const { localized: isTitleLocalized } = findUseAsTitleField(collection)\n\n const { slugPath, titlePath } = await computePaths({\n collection,\n doc,\n draft: doc._status === 'draft',\n locale:\n isTitleLocalized && req.locale === 'all'\n ? 'all'\n : req.locale === 'all'\n ? undefined\n : req.locale || undefined,\n parentFieldName,\n req,\n slugPathFieldName,\n titlePathFieldName,\n })\n\n // Attach computed paths to document using configured field names\n doc[slugPathFieldName] = slugPath\n doc[titlePathFieldName] = titlePath\n } catch (error) {\n // If path computation fails, log but don't break the document read\n // eslint-disable-next-line no-console\n console.error(`Failed to compute hierarchy paths for document ${doc.id}:`, error)\n }\n\n // Strip auto-added fields that were only included for path computation\n const autoAddedFields = context?.hierarchyAutoSelectedFields as string[] | undefined\n if (autoAddedFields && autoAddedFields.length > 0) {\n for (const fieldName of autoAddedFields) {\n delete doc[fieldName]\n }\n }\n\n return doc\n }\n"],"names":["computePaths","findUseAsTitleField","isPathFieldSelected","req","slugPathFieldName","titlePathFieldName","selectParam","query","select","selectedFields","split","map","f","trim","includes","Array","isArray","hierarchyCollectionAfterRead","parentFieldName","collection","context","doc","isDeleting","shouldComputePaths","computeHierarchyPaths","computeHierarchyPathsViaSelect","localized","isTitleLocalized","slugPath","titlePath","draft","_status","locale","undefined","error","console","id","autoAddedFields","hierarchyAutoSelectedFields","length","fieldName"],"mappings":"AAAA;;;;;;;;CAQC,GAID,SAASA,YAAY,QAAQ,2BAA0B;AACvD,SAASC,mBAAmB,QAAQ,6BAA4B;AAEhE;;CAEC,GACD,SAASC,oBACPC,GAAmB,EACnBC,iBAAyB,EACzBC,kBAA0B;IAE1B,0CAA0C;IAC1C,MAAMC,cAAcH,IAAII,KAAK,EAAEC;IAE/B,IAAIF,aAAa;QACf,IAAI,OAAOA,gBAAgB,UAAU;YACnC,MAAMG,iBAAiBH,YAAYI,KAAK,CAAC,KAAKC,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI;YAC/D,OACEJ,eAAeK,QAAQ,CAACV,sBAAsBK,eAAeK,QAAQ,CAACT;QAE1E;QACA,wDAAwD;QACxD,IAAIU,MAAMC,OAAO,CAACV,cAAc;YAC9B,OAAOA,YAAYQ,QAAQ,CAACV,sBAAsBE,YAAYQ,QAAQ,CAACT;QACzE;IACF;IAEA,OAAO;AACT;AAiBA,OAAO,MAAMY,+BACX,CAAC,EAAEC,eAAe,EAAEd,iBAAiB,EAAEC,kBAAkB,EAAQ,GACjE,OAAO,EAAEc,UAAU,EAAEC,OAAO,EAAEC,GAAG,EAAElB,GAAG,EAAE;QACtC,mBAAmB;QACnB,IAAIiB,SAASE,YAAY;YACvB,OAAOD;QACT;QAEA,wCAAwC;QACxC,MAAME,qBACJH,SAASI,0BAA0B,QAAQ,2BAA2B;QACtEJ,SAASK,mCAAmC,QAAQ,+CAA+C;QACnGtB,IAAII,KAAK,EAAEiB,0BAA0B,UAAU,kBAAkB;QACjEtB,oBAAoBC,KAAKC,mBAAmBC,oBAAoB,4BAA4B;;QAE9F,IAAI,CAACkB,oBAAoB;YACvB,OAAOF;QACT;QAEA,IAAI;YACF,MAAM,EAAEK,WAAWC,gBAAgB,EAAE,GAAG1B,oBAAoBkB;YAE5D,MAAM,EAAES,QAAQ,EAAEC,SAAS,EAAE,GAAG,MAAM7B,aAAa;gBACjDmB;gBACAE;gBACAS,OAAOT,IAAIU,OAAO,KAAK;gBACvBC,QACEL,oBAAoBxB,IAAI6B,MAAM,KAAK,QAC/B,QACA7B,IAAI6B,MAAM,KAAK,QACbC,YACA9B,IAAI6B,MAAM,IAAIC;gBACtBf;gBACAf;gBACAC;gBACAC;YACF;YAEA,iEAAiE;YACjEgB,GAAG,CAACjB,kBAAkB,GAAGwB;YACzBP,GAAG,CAAChB,mBAAmB,GAAGwB;QAC5B,EAAE,OAAOK,OAAO;YACd,mEAAmE;YACnE,sCAAsC;YACtCC,QAAQD,KAAK,CAAC,CAAC,+CAA+C,EAAEb,IAAIe,EAAE,CAAC,CAAC,CAAC,EAAEF;QAC7E;QAEA,uEAAuE;QACvE,MAAMG,kBAAkBjB,SAASkB;QACjC,IAAID,mBAAmBA,gBAAgBE,MAAM,GAAG,GAAG;YACjD,KAAK,MAAMC,aAAaH,gBAAiB;gBACvC,OAAOhB,GAAG,CAACmB,UAAU;YACvB;QACF;QAEA,OAAOnB;IACT,EAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* beforeChange Hook Responsibilities:
|
|
3
|
+
* - Validate circular references when parent changes
|
|
4
|
+
* - Prevent moving a folder into its own subfolder
|
|
5
|
+
*
|
|
6
|
+
* Does NOT handle:
|
|
7
|
+
* - Tree structure (no stored tree anymore)
|
|
8
|
+
* - Path computation (done in afterRead)
|
|
9
|
+
*/
|
|
10
|
+
import type { CollectionBeforeChangeHook } from '../../index.js';
|
|
11
|
+
type Args = {
|
|
12
|
+
/**
|
|
13
|
+
* The name of the field that contains the parent document ID
|
|
14
|
+
*/
|
|
15
|
+
parentFieldName: string;
|
|
16
|
+
};
|
|
17
|
+
export declare const hierarchyCollectionBeforeChange: ({ parentFieldName }: Args) => CollectionBeforeChangeHook;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=collectionBeforeChange.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectionBeforeChange.d.ts","sourceRoot":"","sources":["../../../src/hierarchy/hooks/collectionBeforeChange.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,0BAA0B,EAI3B,MAAM,gBAAgB,CAAA;AAEvB,KAAK,IAAI,GAAG;IACV;;OAEG;IACH,eAAe,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,+BAA+B,wBACpB,IAAI,KAAG,0BAgC5B,CAAA"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* beforeChange Hook Responsibilities:
|
|
3
|
+
* - Validate circular references when parent changes
|
|
4
|
+
* - Prevent moving a folder into its own subfolder
|
|
5
|
+
*
|
|
6
|
+
* Does NOT handle:
|
|
7
|
+
* - Tree structure (no stored tree anymore)
|
|
8
|
+
* - Path computation (done in afterRead)
|
|
9
|
+
*/ export const hierarchyCollectionBeforeChange = ({ parentFieldName })=>async ({ collection, data, operation, originalDoc, req })=>{
|
|
10
|
+
// Determine the new parent ID
|
|
11
|
+
const newParentID = data[parentFieldName] !== undefined ? data[parentFieldName] : originalDoc?.[parentFieldName];
|
|
12
|
+
const parentChanged = operation === 'update' && data[parentFieldName] !== undefined && data[parentFieldName] !== originalDoc?.[parentFieldName];
|
|
13
|
+
// Validate circular references when parent is changing
|
|
14
|
+
if (parentChanged && newParentID) {
|
|
15
|
+
// Extract parent ID (could be plain ID or populated object with id)
|
|
16
|
+
const parentId = typeof newParentID === 'object' && 'id' in newParentID ? newParentID.id : newParentID;
|
|
17
|
+
// Prevent self-referential parent
|
|
18
|
+
if (parentId === (originalDoc?.id || data.id)) {
|
|
19
|
+
throw new Error('Document cannot be its own parent');
|
|
20
|
+
}
|
|
21
|
+
// Check for true circular references (loops in the chain), but allow
|
|
22
|
+
// moving into a child - that will be handled by afterChange reparenting
|
|
23
|
+
await validateNoCircularReference({
|
|
24
|
+
collection,
|
|
25
|
+
currentDocId: originalDoc?.id,
|
|
26
|
+
parentId,
|
|
27
|
+
req
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return data;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Walks up the parent chain to detect true circular references (loops).
|
|
34
|
+
* Does NOT throw when moving into a child - that case is handled by afterChange
|
|
35
|
+
* which will automatically reparent the child.
|
|
36
|
+
*/ async function validateNoCircularReference({ collection, currentDocId, parentId, req }) {
|
|
37
|
+
const parentFieldName = collection.hierarchy && collection.hierarchy !== true ? collection.hierarchy.parentFieldName : undefined;
|
|
38
|
+
if (!parentFieldName) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const fieldName = parentFieldName;
|
|
42
|
+
async function checkAncestor(ancestorId, visitedNodes = new Set()) {
|
|
43
|
+
// Create unique key for this node
|
|
44
|
+
const nodeKey = `${collection.slug}:${ancestorId}`;
|
|
45
|
+
// Check if we've visited this node before (true loop in the chain)
|
|
46
|
+
if (visitedNodes.has(nodeKey)) {
|
|
47
|
+
throw new Error(`Circular reference detected: the parent chain contains a loop`);
|
|
48
|
+
}
|
|
49
|
+
// If we've reached the current document, this means we're trying to move into a child
|
|
50
|
+
if (ancestorId === currentDocId) {
|
|
51
|
+
throw new Error('Cannot move folder into its own subfolder');
|
|
52
|
+
}
|
|
53
|
+
// Add this node to visited set
|
|
54
|
+
visitedNodes.add(nodeKey);
|
|
55
|
+
try {
|
|
56
|
+
const ancestor = await req.payload.findByID({
|
|
57
|
+
id: ancestorId,
|
|
58
|
+
collection: collection.slug,
|
|
59
|
+
depth: 0,
|
|
60
|
+
req,
|
|
61
|
+
select: {
|
|
62
|
+
[fieldName]: true
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
const nextParent = ancestor?.[fieldName];
|
|
66
|
+
if (!nextParent) {
|
|
67
|
+
return; // No parent, end of chain
|
|
68
|
+
}
|
|
69
|
+
// Extract next parent ID (could be plain ID or populated object)
|
|
70
|
+
let nextParentId = nextParent;
|
|
71
|
+
if (typeof nextParent === 'object' && 'id' in nextParent) {
|
|
72
|
+
nextParentId = nextParent.id;
|
|
73
|
+
}
|
|
74
|
+
// Continue traversal if parent exists
|
|
75
|
+
if (nextParentId !== null && nextParentId !== undefined && (typeof nextParentId === 'string' || typeof nextParentId === 'number')) {
|
|
76
|
+
return checkAncestor(nextParentId, visitedNodes);
|
|
77
|
+
}
|
|
78
|
+
} catch (error) {
|
|
79
|
+
// If it's our validation error, re-throw it
|
|
80
|
+
if (error instanceof Error && error.message?.includes('Circular reference detected')) {
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
// Non-existent parent can't create a circular reference
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
await checkAncestor(parentId);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
//# sourceMappingURL=collectionBeforeChange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hierarchy/hooks/collectionBeforeChange.ts"],"sourcesContent":["/**\n * beforeChange Hook Responsibilities:\n * - Validate circular references when parent changes\n * - Prevent moving a folder into its own subfolder\n *\n * Does NOT handle:\n * - Tree structure (no stored tree anymore)\n * - Path computation (done in afterRead)\n */\n\nimport type {\n CollectionBeforeChangeHook,\n CollectionConfig,\n JsonObject,\n PayloadRequest,\n} from '../../index.js'\n\ntype Args = {\n /**\n * The name of the field that contains the parent document ID\n */\n parentFieldName: string\n}\n\nexport const hierarchyCollectionBeforeChange =\n ({ parentFieldName }: Args): CollectionBeforeChangeHook =>\n async ({ collection, data, operation, originalDoc, req }) => {\n // Determine the new parent ID\n const newParentID =\n data[parentFieldName] !== undefined ? data[parentFieldName] : originalDoc?.[parentFieldName]\n const parentChanged =\n operation === 'update' &&\n data[parentFieldName] !== undefined &&\n data[parentFieldName] !== originalDoc?.[parentFieldName]\n\n // Validate circular references when parent is changing\n if (parentChanged && newParentID) {\n // Extract parent ID (could be plain ID or populated object with id)\n const parentId =\n typeof newParentID === 'object' && 'id' in newParentID ? newParentID.id : newParentID\n\n // Prevent self-referential parent\n if (parentId === (originalDoc?.id || data.id)) {\n throw new Error('Document cannot be its own parent')\n }\n\n // Check for true circular references (loops in the chain), but allow\n // moving into a child - that will be handled by afterChange reparenting\n await validateNoCircularReference({\n collection,\n currentDocId: originalDoc?.id,\n parentId,\n req,\n })\n }\n\n return data\n }\n\n/**\n * Walks up the parent chain to detect true circular references (loops).\n * Does NOT throw when moving into a child - that case is handled by afterChange\n * which will automatically reparent the child.\n */\nasync function validateNoCircularReference({\n collection,\n currentDocId,\n parentId,\n req,\n}: {\n collection: CollectionConfig\n currentDocId: number | string\n parentId: number | string\n req: PayloadRequest\n}) {\n const parentFieldName =\n collection.hierarchy && collection.hierarchy !== true\n ? collection.hierarchy.parentFieldName\n : undefined\n\n if (!parentFieldName) {\n return\n }\n\n const fieldName = parentFieldName\n\n async function checkAncestor(\n ancestorId: number | string,\n visitedNodes: Set<string> = new Set(),\n ): Promise<void> {\n // Create unique key for this node\n const nodeKey = `${collection.slug}:${ancestorId}`\n\n // Check if we've visited this node before (true loop in the chain)\n if (visitedNodes.has(nodeKey)) {\n throw new Error(`Circular reference detected: the parent chain contains a loop`)\n }\n\n // If we've reached the current document, this means we're trying to move into a child\n if (ancestorId === currentDocId) {\n throw new Error('Cannot move folder into its own subfolder')\n }\n\n // Add this node to visited set\n visitedNodes.add(nodeKey)\n\n try {\n const ancestor = (await req.payload.findByID({\n id: ancestorId,\n collection: collection.slug,\n depth: 0,\n req,\n select: {\n [fieldName]: true,\n },\n })) as JsonObject\n\n const nextParent = ancestor?.[fieldName]\n\n if (!nextParent) {\n return // No parent, end of chain\n }\n\n // Extract next parent ID (could be plain ID or populated object)\n let nextParentId = nextParent\n if (typeof nextParent === 'object' && 'id' in nextParent) {\n nextParentId = nextParent.id\n }\n\n // Continue traversal if parent exists\n if (\n nextParentId !== null &&\n nextParentId !== undefined &&\n (typeof nextParentId === 'string' || typeof nextParentId === 'number')\n ) {\n return checkAncestor(nextParentId, visitedNodes)\n }\n } catch (error) {\n // If it's our validation error, re-throw it\n if (error instanceof Error && error.message?.includes('Circular reference detected')) {\n throw error\n }\n // Non-existent parent can't create a circular reference\n return\n }\n }\n\n await checkAncestor(parentId)\n}\n"],"names":["hierarchyCollectionBeforeChange","parentFieldName","collection","data","operation","originalDoc","req","newParentID","undefined","parentChanged","parentId","id","Error","validateNoCircularReference","currentDocId","hierarchy","fieldName","checkAncestor","ancestorId","visitedNodes","Set","nodeKey","slug","has","add","ancestor","payload","findByID","depth","select","nextParent","nextParentId","error","message","includes"],"mappings":"AAAA;;;;;;;;CAQC,GAgBD,OAAO,MAAMA,kCACX,CAAC,EAAEC,eAAe,EAAQ,GAC1B,OAAO,EAAEC,UAAU,EAAEC,IAAI,EAAEC,SAAS,EAAEC,WAAW,EAAEC,GAAG,EAAE;QACtD,8BAA8B;QAC9B,MAAMC,cACJJ,IAAI,CAACF,gBAAgB,KAAKO,YAAYL,IAAI,CAACF,gBAAgB,GAAGI,aAAa,CAACJ,gBAAgB;QAC9F,MAAMQ,gBACJL,cAAc,YACdD,IAAI,CAACF,gBAAgB,KAAKO,aAC1BL,IAAI,CAACF,gBAAgB,KAAKI,aAAa,CAACJ,gBAAgB;QAE1D,uDAAuD;QACvD,IAAIQ,iBAAiBF,aAAa;YAChC,oEAAoE;YACpE,MAAMG,WACJ,OAAOH,gBAAgB,YAAY,QAAQA,cAAcA,YAAYI,EAAE,GAAGJ;YAE5E,kCAAkC;YAClC,IAAIG,aAAcL,CAAAA,aAAaM,MAAMR,KAAKQ,EAAE,AAAD,GAAI;gBAC7C,MAAM,IAAIC,MAAM;YAClB;YAEA,qEAAqE;YACrE,wEAAwE;YACxE,MAAMC,4BAA4B;gBAChCX;gBACAY,cAAcT,aAAaM;gBAC3BD;gBACAJ;YACF;QACF;QAEA,OAAOH;IACT,EAAC;AAEH;;;;CAIC,GACD,eAAeU,4BAA4B,EACzCX,UAAU,EACVY,YAAY,EACZJ,QAAQ,EACRJ,GAAG,EAMJ;IACC,MAAML,kBACJC,WAAWa,SAAS,IAAIb,WAAWa,SAAS,KAAK,OAC7Cb,WAAWa,SAAS,CAACd,eAAe,GACpCO;IAEN,IAAI,CAACP,iBAAiB;QACpB;IACF;IAEA,MAAMe,YAAYf;IAElB,eAAegB,cACbC,UAA2B,EAC3BC,eAA4B,IAAIC,KAAK;QAErC,kCAAkC;QAClC,MAAMC,UAAU,GAAGnB,WAAWoB,IAAI,CAAC,CAAC,EAAEJ,YAAY;QAElD,mEAAmE;QACnE,IAAIC,aAAaI,GAAG,CAACF,UAAU;YAC7B,MAAM,IAAIT,MAAM,CAAC,6DAA6D,CAAC;QACjF;QAEA,sFAAsF;QACtF,IAAIM,eAAeJ,cAAc;YAC/B,MAAM,IAAIF,MAAM;QAClB;QAEA,+BAA+B;QAC/BO,aAAaK,GAAG,CAACH;QAEjB,IAAI;YACF,MAAMI,WAAY,MAAMnB,IAAIoB,OAAO,CAACC,QAAQ,CAAC;gBAC3ChB,IAAIO;gBACJhB,YAAYA,WAAWoB,IAAI;gBAC3BM,OAAO;gBACPtB;gBACAuB,QAAQ;oBACN,CAACb,UAAU,EAAE;gBACf;YACF;YAEA,MAAMc,aAAaL,UAAU,CAACT,UAAU;YAExC,IAAI,CAACc,YAAY;gBACf,QAAO,0BAA0B;YACnC;YAEA,iEAAiE;YACjE,IAAIC,eAAeD;YACnB,IAAI,OAAOA,eAAe,YAAY,QAAQA,YAAY;gBACxDC,eAAeD,WAAWnB,EAAE;YAC9B;YAEA,sCAAsC;YACtC,IACEoB,iBAAiB,QACjBA,iBAAiBvB,aAChB,CAAA,OAAOuB,iBAAiB,YAAY,OAAOA,iBAAiB,QAAO,GACpE;gBACA,OAAOd,cAAcc,cAAcZ;YACrC;QACF,EAAE,OAAOa,OAAO;YACd,4CAA4C;YAC5C,IAAIA,iBAAiBpB,SAASoB,MAAMC,OAAO,EAAEC,SAAS,gCAAgC;gBACpF,MAAMF;YACR;YACA,wDAAwD;YACxD;QACF;IACF;IAEA,MAAMf,cAAcP;AACtB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* beforeDelete Hook Responsibilities:
|
|
3
|
+
* - Delete child folders when parent is deleted (cascade delete)
|
|
4
|
+
* - Set context flag for deletion tracking
|
|
5
|
+
*/
|
|
6
|
+
import type { CollectionBeforeDeleteHook } from '../../index.js';
|
|
7
|
+
type Args = {
|
|
8
|
+
/**
|
|
9
|
+
* The name of the field that contains the parent document ID
|
|
10
|
+
*/
|
|
11
|
+
parentFieldName: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const hierarchyCollectionBeforeDelete: ({ parentFieldName }: Args) => CollectionBeforeDeleteHook;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=collectionBeforeDelete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectionBeforeDelete.d.ts","sourceRoot":"","sources":["../../../src/hierarchy/hooks/collectionBeforeDelete.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAEhE,KAAK,IAAI,GAAG;IACV;;OAEG;IACH,eAAe,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,+BAA+B,wBACpB,IAAI,KAAG,0BAe5B,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* beforeDelete Hook Responsibilities:
|
|
3
|
+
* - Delete child folders when parent is deleted (cascade delete)
|
|
4
|
+
* - Set context flag for deletion tracking
|
|
5
|
+
*/ export const hierarchyCollectionBeforeDelete = ({ parentFieldName })=>async ({ id, collection, req })=>{
|
|
6
|
+
req.context = req.context || {};
|
|
7
|
+
req.context.isDeleting = true;
|
|
8
|
+
// Delete all child folders (cascade delete)
|
|
9
|
+
await req.payload.delete({
|
|
10
|
+
collection: collection.slug,
|
|
11
|
+
req,
|
|
12
|
+
where: {
|
|
13
|
+
[parentFieldName]: {
|
|
14
|
+
equals: id
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=collectionBeforeDelete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hierarchy/hooks/collectionBeforeDelete.ts"],"sourcesContent":["/**\n * beforeDelete Hook Responsibilities:\n * - Delete child folders when parent is deleted (cascade delete)\n * - Set context flag for deletion tracking\n */\n\nimport type { CollectionBeforeDeleteHook } from '../../index.js'\n\ntype Args = {\n /**\n * The name of the field that contains the parent document ID\n */\n parentFieldName: string\n}\n\nexport const hierarchyCollectionBeforeDelete =\n ({ parentFieldName }: Args): CollectionBeforeDeleteHook =>\n async ({ id, collection, req }) => {\n req.context = req.context || {}\n req.context.isDeleting = true\n\n // Delete all child folders (cascade delete)\n await req.payload.delete({\n collection: collection.slug,\n req,\n where: {\n [parentFieldName]: {\n equals: id,\n },\n },\n })\n }\n"],"names":["hierarchyCollectionBeforeDelete","parentFieldName","id","collection","req","context","isDeleting","payload","delete","slug","where","equals"],"mappings":"AAAA;;;;CAIC,GAWD,OAAO,MAAMA,kCACX,CAAC,EAAEC,eAAe,EAAQ,GAC1B,OAAO,EAAEC,EAAE,EAAEC,UAAU,EAAEC,GAAG,EAAE;QAC5BA,IAAIC,OAAO,GAAGD,IAAIC,OAAO,IAAI,CAAC;QAC9BD,IAAIC,OAAO,CAACC,UAAU,GAAG;QAEzB,4CAA4C;QAC5C,MAAMF,IAAIG,OAAO,CAACC,MAAM,CAAC;YACvBL,YAAYA,WAAWM,IAAI;YAC3BL;YACAM,OAAO;gBACL,CAACT,gBAAgB,EAAE;oBACjBU,QAAQT;gBACV;YACF;QACF;IACF,EAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* beforeOperation Hook Responsibilities:
|
|
3
|
+
* - Detect when path fields (_h_slugPath, _h_titlePath) are selected
|
|
4
|
+
* - Auto-include required fields (parent, title, slugField) for ancestor traversal
|
|
5
|
+
* - Track auto-added fields in context so afterRead can strip them from response
|
|
6
|
+
*/
|
|
7
|
+
import type { BeforeOperationHook } from '../../collections/config/types.js';
|
|
8
|
+
import type { CollectionSlug } from '../../index.js';
|
|
9
|
+
type Args = {
|
|
10
|
+
/**
|
|
11
|
+
* The name of the field that contains the parent document ID
|
|
12
|
+
*/
|
|
13
|
+
parentFieldName: string;
|
|
14
|
+
/**
|
|
15
|
+
* Optional dedicated slug field for path generation
|
|
16
|
+
*/
|
|
17
|
+
slugFieldName?: string;
|
|
18
|
+
/**
|
|
19
|
+
* The name of the field to populate with the slug-based path
|
|
20
|
+
*/
|
|
21
|
+
slugPathFieldName: string;
|
|
22
|
+
/**
|
|
23
|
+
* The name of the title field (from useAsTitle)
|
|
24
|
+
*/
|
|
25
|
+
titleFieldName: string;
|
|
26
|
+
/**
|
|
27
|
+
* The name of the field to populate with the title-based path
|
|
28
|
+
*/
|
|
29
|
+
titlePathFieldName: string;
|
|
30
|
+
};
|
|
31
|
+
export declare const hierarchyCollectionBeforeOperation: <TSlug extends CollectionSlug>({ parentFieldName, slugFieldName, slugPathFieldName, titleFieldName, titlePathFieldName, }: Args) => BeforeOperationHook<TSlug>;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=collectionBeforeOperation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectionBeforeOperation.d.ts","sourceRoot":"","sources":["../../../src/hierarchy/hooks/collectionBeforeOperation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,KAAK,IAAI,GAAG;IACV;;OAEG;IACH,eAAe,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,iBAAiB,EAAE,MAAM,CAAA;IACzB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAA;CAC3B,CAAA;AA0BD,eAAO,MAAM,kCAAkC,GAAI,KAAK,SAAS,cAAc,8FAM5E,IAAI,KAAG,mBAAmB,CAAC,KAAK,CA0DlC,CAAA"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* beforeOperation Hook Responsibilities:
|
|
3
|
+
* - Detect when path fields (_h_slugPath, _h_titlePath) are selected
|
|
4
|
+
* - Auto-include required fields (parent, title, slugField) for ancestor traversal
|
|
5
|
+
* - Track auto-added fields in context so afterRead can strip them from response
|
|
6
|
+
*/ /**
|
|
7
|
+
* Checks if a field is selected in the select object
|
|
8
|
+
*/ function isFieldInSelect(select, fieldName) {
|
|
9
|
+
if (!select) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
return select[fieldName] === true;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Checks if path fields are being selected
|
|
16
|
+
*/ function isPathFieldSelected(select, slugPathFieldName, titlePathFieldName) {
|
|
17
|
+
if (!select) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return isFieldInSelect(select, slugPathFieldName) || isFieldInSelect(select, titlePathFieldName);
|
|
21
|
+
}
|
|
22
|
+
export const hierarchyCollectionBeforeOperation = ({ parentFieldName, slugFieldName, slugPathFieldName, titleFieldName, titlePathFieldName })=>{
|
|
23
|
+
return (hookArgs)=>{
|
|
24
|
+
const { args, context, operation } = hookArgs;
|
|
25
|
+
// Only process read operations that have select
|
|
26
|
+
if (operation !== 'find' && operation !== 'findByID' && operation !== 'read' && operation !== 'findDistinct' && operation !== 'readDistinct') {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Type guard - these operations have select in their args
|
|
30
|
+
const operationArgs = args;
|
|
31
|
+
const select = operationArgs.select;
|
|
32
|
+
// No select means all fields are returned - no augmentation needed
|
|
33
|
+
if (!select || typeof select !== 'object') {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
// Check if path fields are being selected
|
|
37
|
+
if (!isPathFieldSelected(select, slugPathFieldName, titlePathFieldName)) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Track which fields we auto-add so afterRead can strip them
|
|
41
|
+
const autoAddedFields = [];
|
|
42
|
+
// Add parent field if not already selected
|
|
43
|
+
if (!isFieldInSelect(select, parentFieldName)) {
|
|
44
|
+
select[parentFieldName] = true;
|
|
45
|
+
autoAddedFields.push(parentFieldName);
|
|
46
|
+
}
|
|
47
|
+
// Add title field if not already selected
|
|
48
|
+
if (!isFieldInSelect(select, titleFieldName)) {
|
|
49
|
+
select[titleFieldName] = true;
|
|
50
|
+
autoAddedFields.push(titleFieldName);
|
|
51
|
+
}
|
|
52
|
+
// Add slug field if configured and not already selected
|
|
53
|
+
if (slugFieldName && !isFieldInSelect(select, slugFieldName)) {
|
|
54
|
+
select[slugFieldName] = true;
|
|
55
|
+
autoAddedFields.push(slugFieldName);
|
|
56
|
+
}
|
|
57
|
+
// Store auto-added fields in context for afterRead to clean up
|
|
58
|
+
if (autoAddedFields.length > 0) {
|
|
59
|
+
context.hierarchyAutoSelectedFields = autoAddedFields;
|
|
60
|
+
}
|
|
61
|
+
// Set flag to trigger path computation in afterRead
|
|
62
|
+
context.computeHierarchyPathsViaSelect = true;
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=collectionBeforeOperation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/hierarchy/hooks/collectionBeforeOperation.ts"],"sourcesContent":["/**\n * beforeOperation Hook Responsibilities:\n * - Detect when path fields (_h_slugPath, _h_titlePath) are selected\n * - Auto-include required fields (parent, title, slugField) for ancestor traversal\n * - Track auto-added fields in context so afterRead can strip them from response\n */\n\nimport type { BeforeOperationHook } from '../../collections/config/types.js'\nimport type { CollectionSlug } from '../../index.js'\n\ntype Args = {\n /**\n * The name of the field that contains the parent document ID\n */\n parentFieldName: string\n /**\n * Optional dedicated slug field for path generation\n */\n slugFieldName?: string\n /**\n * The name of the field to populate with the slug-based path\n */\n slugPathFieldName: string\n /**\n * The name of the title field (from useAsTitle)\n */\n titleFieldName: string\n /**\n * The name of the field to populate with the title-based path\n */\n titlePathFieldName: string\n}\n\n/**\n * Checks if a field is selected in the select object\n */\nfunction isFieldInSelect(select: Record<string, unknown> | undefined, fieldName: string): boolean {\n if (!select) {\n return false\n }\n return select[fieldName] === true\n}\n\n/**\n * Checks if path fields are being selected\n */\nfunction isPathFieldSelected(\n select: Record<string, unknown> | undefined,\n slugPathFieldName: string,\n titlePathFieldName: string,\n): boolean {\n if (!select) {\n return false\n }\n return isFieldInSelect(select, slugPathFieldName) || isFieldInSelect(select, titlePathFieldName)\n}\n\nexport const hierarchyCollectionBeforeOperation = <TSlug extends CollectionSlug>({\n parentFieldName,\n slugFieldName,\n slugPathFieldName,\n titleFieldName,\n titlePathFieldName,\n}: Args): BeforeOperationHook<TSlug> => {\n return (hookArgs) => {\n const { args, context, operation } = hookArgs\n\n // Only process read operations that have select\n if (\n operation !== 'find' &&\n operation !== 'findByID' &&\n operation !== 'read' &&\n operation !== 'findDistinct' &&\n operation !== 'readDistinct'\n ) {\n return\n }\n\n // Type guard - these operations have select in their args\n const operationArgs = args as { select?: Record<string, unknown> }\n const select = operationArgs.select\n\n // No select means all fields are returned - no augmentation needed\n if (!select || typeof select !== 'object') {\n return\n }\n\n // Check if path fields are being selected\n if (!isPathFieldSelected(select, slugPathFieldName, titlePathFieldName)) {\n return\n }\n\n // Track which fields we auto-add so afterRead can strip them\n const autoAddedFields: string[] = []\n\n // Add parent field if not already selected\n if (!isFieldInSelect(select, parentFieldName)) {\n select[parentFieldName] = true\n autoAddedFields.push(parentFieldName)\n }\n\n // Add title field if not already selected\n if (!isFieldInSelect(select, titleFieldName)) {\n select[titleFieldName] = true\n autoAddedFields.push(titleFieldName)\n }\n\n // Add slug field if configured and not already selected\n if (slugFieldName && !isFieldInSelect(select, slugFieldName)) {\n select[slugFieldName] = true\n autoAddedFields.push(slugFieldName)\n }\n\n // Store auto-added fields in context for afterRead to clean up\n if (autoAddedFields.length > 0) {\n context.hierarchyAutoSelectedFields = autoAddedFields\n }\n\n // Set flag to trigger path computation in afterRead\n context.computeHierarchyPathsViaSelect = true\n }\n}\n"],"names":["isFieldInSelect","select","fieldName","isPathFieldSelected","slugPathFieldName","titlePathFieldName","hierarchyCollectionBeforeOperation","parentFieldName","slugFieldName","titleFieldName","hookArgs","args","context","operation","operationArgs","autoAddedFields","push","length","hierarchyAutoSelectedFields","computeHierarchyPathsViaSelect"],"mappings":"AAAA;;;;;CAKC,GA4BD;;CAEC,GACD,SAASA,gBAAgBC,MAA2C,EAAEC,SAAiB;IACrF,IAAI,CAACD,QAAQ;QACX,OAAO;IACT;IACA,OAAOA,MAAM,CAACC,UAAU,KAAK;AAC/B;AAEA;;CAEC,GACD,SAASC,oBACPF,MAA2C,EAC3CG,iBAAyB,EACzBC,kBAA0B;IAE1B,IAAI,CAACJ,QAAQ;QACX,OAAO;IACT;IACA,OAAOD,gBAAgBC,QAAQG,sBAAsBJ,gBAAgBC,QAAQI;AAC/E;AAEA,OAAO,MAAMC,qCAAqC,CAA+B,EAC/EC,eAAe,EACfC,aAAa,EACbJ,iBAAiB,EACjBK,cAAc,EACdJ,kBAAkB,EACb;IACL,OAAO,CAACK;QACN,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAEC,SAAS,EAAE,GAAGH;QAErC,gDAAgD;QAChD,IACEG,cAAc,UACdA,cAAc,cACdA,cAAc,UACdA,cAAc,kBACdA,cAAc,gBACd;YACA;QACF;QAEA,0DAA0D;QAC1D,MAAMC,gBAAgBH;QACtB,MAAMV,SAASa,cAAcb,MAAM;QAEnC,mEAAmE;QACnE,IAAI,CAACA,UAAU,OAAOA,WAAW,UAAU;YACzC;QACF;QAEA,0CAA0C;QAC1C,IAAI,CAACE,oBAAoBF,QAAQG,mBAAmBC,qBAAqB;YACvE;QACF;QAEA,6DAA6D;QAC7D,MAAMU,kBAA4B,EAAE;QAEpC,2CAA2C;QAC3C,IAAI,CAACf,gBAAgBC,QAAQM,kBAAkB;YAC7CN,MAAM,CAACM,gBAAgB,GAAG;YAC1BQ,gBAAgBC,IAAI,CAACT;QACvB;QAEA,0CAA0C;QAC1C,IAAI,CAACP,gBAAgBC,QAAQQ,iBAAiB;YAC5CR,MAAM,CAACQ,eAAe,GAAG;YACzBM,gBAAgBC,IAAI,CAACP;QACvB;QAEA,wDAAwD;QACxD,IAAID,iBAAiB,CAACR,gBAAgBC,QAAQO,gBAAgB;YAC5DP,MAAM,CAACO,cAAc,GAAG;YACxBO,gBAAgBC,IAAI,CAACR;QACvB;QAEA,+DAA+D;QAC/D,IAAIO,gBAAgBE,MAAM,GAAG,GAAG;YAC9BL,QAAQM,2BAA2B,GAAGH;QACxC;QAEA,oDAAoD;QACpDH,QAAQO,8BAA8B,GAAG;IAC3C;AACF,EAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type CollectionBeforeValidateHook, type CollectionSlug } from '../../index.js';
|
|
2
|
+
export declare const ensureSafeCollectionsChange: ({ folderFieldName, foldersSlug, parentFieldName, typeFieldName, }: {
|
|
3
|
+
folderFieldName: string;
|
|
4
|
+
foldersSlug: CollectionSlug;
|
|
5
|
+
parentFieldName?: string;
|
|
6
|
+
typeFieldName?: string;
|
|
7
|
+
}) => CollectionBeforeValidateHook;
|
|
8
|
+
//# sourceMappingURL=ensureSafeCollectionsChange.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensureSafeCollectionsChange.d.ts","sourceRoot":"","sources":["../../../src/hierarchy/hooks/ensureSafeCollectionsChange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,4BAA4B,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAIjG,eAAO,MAAM,2BAA2B,sEAMnC;IACD,eAAe,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,cAAc,CAAA;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,KAAG,4BAmIH,CAAA"}
|