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
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { fieldAffectsData, tabHasName } from '../fields/config/types.js';
|
|
2
|
+
import { endSpan, startSpan } from './sanitizeProfiler.js';
|
|
3
|
+
let __flattenDepth = 0;
|
|
2
4
|
export const flattenBlock = ({ block })=>{
|
|
3
5
|
return {
|
|
4
6
|
...block,
|
|
@@ -13,114 +15,121 @@ const flattenedFieldsCache = new Map();
|
|
|
13
15
|
* @param cache
|
|
14
16
|
* @param fields
|
|
15
17
|
*/ export const flattenAllFields = ({ cache, fields })=>{
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
const __profSpan = __flattenDepth === 0 ? startSpan('flattenAllFields', String(fields.length)) : -1;
|
|
19
|
+
__flattenDepth++;
|
|
20
|
+
try {
|
|
21
|
+
if (cache) {
|
|
22
|
+
const maybeFields = flattenedFieldsCache.get(fields);
|
|
23
|
+
if (maybeFields) {
|
|
24
|
+
return maybeFields;
|
|
25
|
+
}
|
|
20
26
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
const result = [];
|
|
28
|
+
for (const field of fields){
|
|
29
|
+
switch(field.type){
|
|
30
|
+
case 'array':
|
|
31
|
+
case 'group':
|
|
32
|
+
{
|
|
33
|
+
if (fieldAffectsData(field)) {
|
|
34
|
+
result.push({
|
|
35
|
+
...field,
|
|
36
|
+
flattenedFields: flattenAllFields({
|
|
37
|
+
fields: field.fields
|
|
38
|
+
})
|
|
39
|
+
});
|
|
40
|
+
} else {
|
|
41
|
+
for (const nestedField of flattenAllFields({
|
|
32
42
|
fields: field.fields
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
for (const nestedField of flattenAllFields({
|
|
37
|
-
fields: field.fields
|
|
38
|
-
})){
|
|
39
|
-
result.push(nestedField);
|
|
43
|
+
})){
|
|
44
|
+
result.push(nestedField);
|
|
45
|
+
}
|
|
40
46
|
}
|
|
47
|
+
break;
|
|
41
48
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
case 'blocks':
|
|
50
|
+
{
|
|
51
|
+
const blocks = [];
|
|
52
|
+
let blockReferences = undefined;
|
|
53
|
+
if (field.blockReferences) {
|
|
54
|
+
blockReferences = [];
|
|
55
|
+
for (const block of field.blockReferences){
|
|
56
|
+
if (typeof block === 'string') {
|
|
57
|
+
blockReferences.push(block);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
blockReferences.push(flattenBlock({
|
|
61
|
+
block
|
|
62
|
+
}));
|
|
54
63
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
+
} else {
|
|
65
|
+
for (const block of field.blocks){
|
|
66
|
+
if (typeof block === 'string') {
|
|
67
|
+
blocks.push(block);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
blocks.push(flattenBlock({
|
|
71
|
+
block
|
|
72
|
+
}));
|
|
64
73
|
}
|
|
65
|
-
blocks.push(flattenBlock({
|
|
66
|
-
block
|
|
67
|
-
}));
|
|
68
74
|
}
|
|
75
|
+
const resultField = {
|
|
76
|
+
...field,
|
|
77
|
+
blockReferences,
|
|
78
|
+
blocks
|
|
79
|
+
};
|
|
80
|
+
result.push(resultField);
|
|
81
|
+
break;
|
|
69
82
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
case 'row':
|
|
80
|
-
{
|
|
81
|
-
for (const nestedField of flattenAllFields({
|
|
82
|
-
fields: field.fields
|
|
83
|
-
})){
|
|
84
|
-
result.push(nestedField);
|
|
83
|
+
case 'collapsible':
|
|
84
|
+
case 'row':
|
|
85
|
+
{
|
|
86
|
+
for (const nestedField of flattenAllFields({
|
|
87
|
+
fields: field.fields
|
|
88
|
+
})){
|
|
89
|
+
result.push(nestedField);
|
|
90
|
+
}
|
|
91
|
+
break;
|
|
85
92
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
if (!tabHasName(tab)) {
|
|
97
|
-
for (const nestedField of flattenAllFields({
|
|
98
|
-
fields: tab.fields
|
|
99
|
-
})){
|
|
100
|
-
result.push(nestedField);
|
|
101
|
-
}
|
|
102
|
-
} else {
|
|
103
|
-
result.push({
|
|
104
|
-
...tab,
|
|
105
|
-
type: 'tab',
|
|
106
|
-
flattenedFields: flattenAllFields({
|
|
93
|
+
case 'join':
|
|
94
|
+
{
|
|
95
|
+
result.push(field);
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
case 'tabs':
|
|
99
|
+
{
|
|
100
|
+
for (const tab of field.tabs){
|
|
101
|
+
if (!tabHasName(tab)) {
|
|
102
|
+
for (const nestedField of flattenAllFields({
|
|
107
103
|
fields: tab.fields
|
|
108
|
-
})
|
|
109
|
-
|
|
104
|
+
})){
|
|
105
|
+
result.push(nestedField);
|
|
106
|
+
}
|
|
107
|
+
} else {
|
|
108
|
+
result.push({
|
|
109
|
+
...tab,
|
|
110
|
+
type: 'tab',
|
|
111
|
+
flattenedFields: flattenAllFields({
|
|
112
|
+
fields: tab.fields
|
|
113
|
+
})
|
|
114
|
+
});
|
|
115
|
+
}
|
|
110
116
|
}
|
|
117
|
+
break;
|
|
111
118
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
result.push(field);
|
|
119
|
+
default:
|
|
120
|
+
{
|
|
121
|
+
if (field.type !== 'ui') {
|
|
122
|
+
result.push(field);
|
|
123
|
+
}
|
|
118
124
|
}
|
|
119
|
-
|
|
125
|
+
}
|
|
120
126
|
}
|
|
127
|
+
flattenedFieldsCache.set(fields, result);
|
|
128
|
+
return result;
|
|
129
|
+
} finally{
|
|
130
|
+
__flattenDepth--;
|
|
131
|
+
endSpan(__profSpan);
|
|
121
132
|
}
|
|
122
|
-
flattenedFieldsCache.set(fields, result);
|
|
123
|
-
return result;
|
|
124
133
|
};
|
|
125
134
|
|
|
126
135
|
//# sourceMappingURL=flattenAllFields.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/flattenAllFields.ts"],"sourcesContent":["import type {\n Block,\n Field,\n FlattenedBlock,\n FlattenedBlocksField,\n FlattenedField,\n FlattenedJoinField,\n} from '../fields/config/types.js'\n\nimport { fieldAffectsData, tabHasName } from '../fields/config/types.js'\n\nexport const flattenBlock = ({ block }: { block: Block }): FlattenedBlock => {\n return {\n ...block,\n flattenedFields: flattenAllFields({ fields: block.fields }),\n }\n}\n\nconst flattenedFieldsCache = new Map<Field[], FlattenedField[]>()\n\n/**\n * Flattens all fields in a collection, preserving the nested field structure.\n * @param cache\n * @param fields\n */\nexport const flattenAllFields = ({\n cache,\n fields,\n}: {\n /** Allows you to get FlattenedField[] from Field[] anywhere without performance overhead by caching. */\n cache?: boolean\n fields: Field[]\n}): FlattenedField[] => {\n if (cache) {\n const maybeFields = flattenedFieldsCache.get(fields)\n if (maybeFields) {\n return maybeFields\n }\n }\n\n const result: FlattenedField[] = []\n\n for (const field of fields) {\n switch (field.type) {\n case 'array':\n case 'group': {\n if (fieldAffectsData(field)) {\n result.push({ ...field, flattenedFields: flattenAllFields({ fields: field.fields }) })\n } else {\n for (const nestedField of flattenAllFields({ fields: field.fields })) {\n result.push(nestedField)\n }\n }\n break\n }\n\n case 'blocks': {\n const blocks: FlattenedBlock[] = []\n let blockReferences: (FlattenedBlock | string)[] | undefined = undefined\n if (field.blockReferences) {\n blockReferences = []\n for (const block of field.blockReferences) {\n if (typeof block === 'string') {\n blockReferences.push(block)\n continue\n }\n blockReferences.push(flattenBlock({ block }))\n }\n } else {\n for (const block of field.blocks) {\n if (typeof block === 'string') {\n blocks.push(block)\n continue\n }\n blocks.push(flattenBlock({ block }))\n }\n }\n\n const resultField: FlattenedBlocksField = {\n ...field,\n blockReferences,\n blocks,\n }\n\n result.push(resultField)\n break\n }\n\n case 'collapsible':\n case 'row': {\n for (const nestedField of flattenAllFields({ fields: field.fields })) {\n result.push(nestedField)\n }\n break\n }\n\n case 'join': {\n result.push(field as FlattenedJoinField)\n break\n }\n\n case 'tabs': {\n for (const tab of field.tabs) {\n if (!tabHasName(tab)) {\n for (const nestedField of flattenAllFields({ fields: tab.fields })) {\n result.push(nestedField)\n }\n } else {\n result.push({\n ...tab,\n type: 'tab',\n flattenedFields: flattenAllFields({ fields: tab.fields }),\n })\n }\n }\n break\n }\n\n default: {\n if (field.type !== 'ui') {\n result.push(field)\n }\n }\n }\n }\n\n flattenedFieldsCache.set(fields, result)\n\n return result\n}\n"],"names":["fieldAffectsData","tabHasName","flattenBlock","block","flattenedFields","flattenAllFields","fields","flattenedFieldsCache","Map","cache","maybeFields","get","result","field","type","push","nestedField","blocks","blockReferences","undefined","resultField","tab","tabs","set"],"mappings":"AASA,SAASA,gBAAgB,EAAEC,UAAU,QAAQ,4BAA2B;
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/flattenAllFields.ts"],"sourcesContent":["import type {\n Block,\n Field,\n FlattenedBlock,\n FlattenedBlocksField,\n FlattenedField,\n FlattenedJoinField,\n} from '../fields/config/types.js'\n\nimport { fieldAffectsData, tabHasName } from '../fields/config/types.js'\nimport { endSpan, startSpan } from './sanitizeProfiler.js'\n\nlet __flattenDepth = 0\n\nexport const flattenBlock = ({ block }: { block: Block }): FlattenedBlock => {\n return {\n ...block,\n flattenedFields: flattenAllFields({ fields: block.fields }),\n }\n}\n\nconst flattenedFieldsCache = new Map<Field[], FlattenedField[]>()\n\n/**\n * Flattens all fields in a collection, preserving the nested field structure.\n * @param cache\n * @param fields\n */\nexport const flattenAllFields = ({\n cache,\n fields,\n}: {\n /** Allows you to get FlattenedField[] from Field[] anywhere without performance overhead by caching. */\n cache?: boolean\n fields: Field[]\n}): FlattenedField[] => {\n const __profSpan = __flattenDepth === 0 ? startSpan('flattenAllFields', String(fields.length)) : -1\n __flattenDepth++\n try {\n\n if (cache) {\n const maybeFields = flattenedFieldsCache.get(fields)\n if (maybeFields) {\n return maybeFields\n }\n }\n\n const result: FlattenedField[] = []\n\n for (const field of fields) {\n switch (field.type) {\n case 'array':\n case 'group': {\n if (fieldAffectsData(field)) {\n result.push({ ...field, flattenedFields: flattenAllFields({ fields: field.fields }) })\n } else {\n for (const nestedField of flattenAllFields({ fields: field.fields })) {\n result.push(nestedField)\n }\n }\n break\n }\n\n case 'blocks': {\n const blocks: FlattenedBlock[] = []\n let blockReferences: (FlattenedBlock | string)[] | undefined = undefined\n if (field.blockReferences) {\n blockReferences = []\n for (const block of field.blockReferences) {\n if (typeof block === 'string') {\n blockReferences.push(block)\n continue\n }\n blockReferences.push(flattenBlock({ block }))\n }\n } else {\n for (const block of field.blocks) {\n if (typeof block === 'string') {\n blocks.push(block)\n continue\n }\n blocks.push(flattenBlock({ block }))\n }\n }\n\n const resultField: FlattenedBlocksField = {\n ...field,\n blockReferences,\n blocks,\n }\n\n result.push(resultField)\n break\n }\n\n case 'collapsible':\n case 'row': {\n for (const nestedField of flattenAllFields({ fields: field.fields })) {\n result.push(nestedField)\n }\n break\n }\n\n case 'join': {\n result.push(field as FlattenedJoinField)\n break\n }\n\n case 'tabs': {\n for (const tab of field.tabs) {\n if (!tabHasName(tab)) {\n for (const nestedField of flattenAllFields({ fields: tab.fields })) {\n result.push(nestedField)\n }\n } else {\n result.push({\n ...tab,\n type: 'tab',\n flattenedFields: flattenAllFields({ fields: tab.fields }),\n })\n }\n }\n break\n }\n\n default: {\n if (field.type !== 'ui') {\n result.push(field)\n }\n }\n }\n }\n\n flattenedFieldsCache.set(fields, result)\n\n return result\n } finally {\n __flattenDepth--\n endSpan(__profSpan)\n }\n}\n"],"names":["fieldAffectsData","tabHasName","endSpan","startSpan","__flattenDepth","flattenBlock","block","flattenedFields","flattenAllFields","fields","flattenedFieldsCache","Map","cache","__profSpan","String","length","maybeFields","get","result","field","type","push","nestedField","blocks","blockReferences","undefined","resultField","tab","tabs","set"],"mappings":"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"}
|
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
import type { Config } from '../config/types.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Builds correct URLs for admin panel and API routing.
|
|
4
|
+
* Use this for both admin routes (`adminRoute`) and API routes (`apiRoute`).
|
|
5
|
+
*
|
|
4
6
|
* Its primary responsibilities are:
|
|
5
|
-
* 1. Read from your `routes.admin` config and appropriately handle `"/"`
|
|
7
|
+
* 1. Read from your `routes.admin` or `routes.api` config and appropriately handle `"/"` paths
|
|
6
8
|
* 2. Prepend the `basePath` from your Next.js config, if specified
|
|
7
9
|
* 3. Return relative or absolute URLs, as needed
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* // Admin route
|
|
13
|
+
* formatAdminURL({ adminRoute, path: `/collections/${slug}` })
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* // API route with query params
|
|
17
|
+
* const queryString = qs.stringify({ where, limit, page }, { addQueryPrefix: true })
|
|
18
|
+
* formatAdminURL({ apiRoute: api, path: `/${slug}${queryString}`, serverURL })
|
|
8
19
|
*/
|
|
9
20
|
type BaseFormatURLArgs = {
|
|
10
21
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatAdminURL.d.ts","sourceRoot":"","sources":["../../src/utilities/formatAdminURL.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD
|
|
1
|
+
{"version":3,"file":"formatAdminURL.d.ts","sourceRoot":"","sources":["../../src/utilities/formatAdminURL.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD;;;;;;;;;;;;;;;;;GAiBG;AACH,KAAK,iBAAiB,GAAG;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,CAAA;IAC/B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;AAE7B,KAAK,aAAa,GACd,CAAC;IACC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IAClD,QAAQ,CAAC,EAAE,KAAK,CAAA;CACjB,GAAG,iBAAiB,CAAC,GACtB,CAAC;IACC,UAAU,CAAC,EAAE,KAAK,CAAA;IAClB,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;CAC/C,GAAG,iBAAiB,CAAC,CAAA;AAE1B,eAAO,MAAM,cAAc,SAAU,aAAa,KAAG,MAyBpD,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/formatAdminURL.ts"],"sourcesContent":["import type { Config } from '../config/types.js'\n\n/**\n *
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/formatAdminURL.ts"],"sourcesContent":["import type { Config } from '../config/types.js'\n\n/**\n * Builds correct URLs for admin panel and API routing.\n * Use this for both admin routes (`adminRoute`) and API routes (`apiRoute`).\n *\n * Its primary responsibilities are:\n * 1. Read from your `routes.admin` or `routes.api` config and appropriately handle `\"/\"` paths\n * 2. Prepend the `basePath` from your Next.js config, if specified\n * 3. Return relative or absolute URLs, as needed\n *\n * @example\n * // Admin route\n * formatAdminURL({ adminRoute, path: `/collections/${slug}` })\n *\n * @example\n * // API route with query params\n * const queryString = qs.stringify({ where, limit, page }, { addQueryPrefix: true })\n * formatAdminURL({ apiRoute: api, path: `/${slug}${queryString}`, serverURL })\n */\ntype BaseFormatURLArgs = {\n /**\n * The subpath of your application, if specified.\n * @see https://nextjs.org/docs/app/api-reference/config/next-config-js/basePath\n * @example '/docs'\n */\n basePath?: string\n includeBasePath?: boolean\n path?: '' | `/${string}` | null\n /**\n * Return a relative URL, e.g. ignore `serverURL`.\n * Useful for route-matching, etc.\n */\n relative?: boolean\n} & Pick<Config, 'serverURL'>\n\ntype FormatURLArgs =\n | ({\n adminRoute: NonNullable<Config['routes']>['admin']\n apiRoute?: never\n } & BaseFormatURLArgs)\n | ({\n adminRoute?: never\n apiRoute: NonNullable<Config['routes']>['api']\n } & BaseFormatURLArgs)\n\nexport const formatAdminURL = (args: FormatURLArgs): string => {\n const {\n adminRoute,\n apiRoute,\n includeBasePath: includeBasePathArg,\n path = '',\n relative = false,\n serverURL,\n } = args\n const basePath = process.env.NEXT_BASE_PATH || args.basePath || ''\n const routePath = adminRoute || apiRoute\n const segments = [routePath && routePath !== '/' && routePath, path && path].filter(Boolean)\n const pathname = segments.join('') || '/'\n const pathnameWithBase = (basePath + pathname).replace(/\\/$/, '') || '/'\n const includeBasePath = includeBasePathArg ?? (adminRoute ? false : true)\n\n if (relative || !serverURL) {\n if (includeBasePath && basePath) {\n return pathnameWithBase\n }\n return pathname\n }\n\n const serverURLObj = new URL(serverURL)\n return new URL(pathnameWithBase, serverURLObj.origin).toString()\n}\n"],"names":["formatAdminURL","args","adminRoute","apiRoute","includeBasePath","includeBasePathArg","path","relative","serverURL","basePath","process","env","NEXT_BASE_PATH","routePath","segments","filter","Boolean","pathname","join","pathnameWithBase","replace","serverURLObj","URL","origin","toString"],"mappings":"AA8CA,OAAO,MAAMA,iBAAiB,CAACC;IAC7B,MAAM,EACJC,UAAU,EACVC,QAAQ,EACRC,iBAAiBC,kBAAkB,EACnCC,OAAO,EAAE,EACTC,WAAW,KAAK,EAChBC,SAAS,EACV,GAAGP;IACJ,MAAMQ,WAAWC,QAAQC,GAAG,CAACC,cAAc,IAAIX,KAAKQ,QAAQ,IAAI;IAChE,MAAMI,YAAYX,cAAcC;IAChC,MAAMW,WAAW;QAACD,aAAaA,cAAc,OAAOA;QAAWP,QAAQA;KAAK,CAACS,MAAM,CAACC;IACpF,MAAMC,WAAWH,SAASI,IAAI,CAAC,OAAO;IACtC,MAAMC,mBAAmB,AAACV,CAAAA,WAAWQ,QAAO,EAAGG,OAAO,CAAC,OAAO,OAAO;IACrE,MAAMhB,kBAAkBC,sBAAuBH,CAAAA,aAAa,QAAQ,IAAG;IAEvE,IAAIK,YAAY,CAACC,WAAW;QAC1B,IAAIJ,mBAAmBK,UAAU;YAC/B,OAAOU;QACT;QACA,OAAOF;IACT;IAEA,MAAMI,eAAe,IAAIC,IAAId;IAC7B,OAAO,IAAIc,IAAIH,kBAAkBE,aAAaE,MAAM,EAAEC,QAAQ;AAChE,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleEndpoints.d.ts","sourceRoot":"","sources":["../../src/utilities/handleEndpoints.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAA4B,eAAe,EAAE,MAAM,oBAAoB,CAAA;AA0BnF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,eAAe,kFAMzB;IACD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAA;IAClD,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;CACjB,KAAG,OAAO,CAAC,QAAQ,
|
|
1
|
+
{"version":3,"file":"handleEndpoints.d.ts","sourceRoot":"","sources":["../../src/utilities/handleEndpoints.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAA4B,eAAe,EAAE,MAAM,oBAAoB,CAAA;AA0BnF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,eAAe,kFAMzB;IACD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAA;IAClD,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,OAAO,EAAE,OAAO,CAAA;CACjB,KAAG,OAAO,CAAC,QAAQ,CA+MnB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/handleEndpoints.ts"],"sourcesContent":["import { status as httpStatus } from 'http-status'\nimport { match } from 'path-to-regexp'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { Endpoint, PayloadHandler, SanitizedConfig } from '../config/types.js'\nimport type { APIError } from '../errors/APIError.js'\nimport type { GlobalConfig } from '../globals/config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\n\nimport { createPayloadRequest } from './createPayloadRequest.js'\nimport { formatAdminURL } from './formatAdminURL.js'\nimport { headersWithCors } from './headersWithCors.js'\nimport { mergeHeaders } from './mergeHeaders.js'\nimport { routeError } from './routeError.js'\n\nconst notFoundResponse = (req: PayloadRequest, pathname?: string) => {\n return Response.json(\n {\n message: `Route not found \"${pathname ?? new URL(req.url!).pathname}\"`,\n },\n {\n headers: headersWithCors({\n headers: new Headers(),\n req,\n }),\n status: httpStatus.NOT_FOUND,\n },\n )\n}\n\n/**\n * Attaches the Payload REST API to any backend framework that uses Fetch Request/Response\n * like Next.js (app router), Remix, Bun, Hono.\n *\n * ### Example: Using Hono\n * ```ts\n * import { handleEndpoints } from 'payload';\n * import { serve } from '@hono/node-server';\n * import { loadEnv } from 'payload/node';\n *\n * const port = 3001;\n * loadEnv();\n *\n * const { default: config } = await import('@payload-config');\n *\n * const server = serve({\n * fetch: async (request) => {\n * const response = await handleEndpoints({\n * config,\n * request: request.clone(),\n * });\n *\n * return response;\n * },\n * port,\n * });\n *\n * server.on('listening', () => {\n * console.log(`API server is listening on http://localhost:${port}/api`);\n * });\n * ```\n */\nexport const handleEndpoints = async ({\n basePath = '',\n config: incomingConfig,\n path,\n payloadInstanceCacheKey,\n request,\n}: {\n basePath?: string\n config: Promise<SanitizedConfig> | SanitizedConfig\n /** Override path from the request */\n path?: string\n payloadInstanceCacheKey?: string\n request: Request\n}): Promise<Response> => {\n let handler!: PayloadHandler\n let req: PayloadRequest\n let collection!: Collection\n\n // This can be used against GET request search params size limit.\n // Instead you can do POST request with a text body as search params.\n // We use this internally for relationships querying on the frontend\n // packages/ui/src/fields/Relationship/index.tsx\n if (\n request.method.toLowerCase() === 'post' &&\n (request.headers.get('X-Payload-HTTP-Method-Override') === 'GET' ||\n request.headers.get('X-HTTP-Method-Override') === 'GET')\n ) {\n let url = request.url\n let data: any = undefined\n\n if (request.headers.get('Content-Type') === 'application/x-www-form-urlencoded') {\n const search = await request.text()\n url = `${request.url}?${search}`\n } else if (request.headers.get('Content-Type') === 'application/json') {\n // May not be supported by every endpoint\n data = await request.json()\n\n // locale and fallbackLocale is read by createPayloadRequest to populate req.locale and req.fallbackLocale\n // => add to searchParams\n if (data?.locale) {\n url += `?locale=${data.locale}`\n }\n if (data?.fallbackLocale) {\n url += `&fallbackLocale=${data.depth}`\n }\n }\n\n const req = new Request(url, {\n // @ts-expect-error // TODO: check if this is required\n cache: request.cache,\n credentials: request.credentials,\n headers: request.headers,\n method: 'GET',\n signal: request.signal,\n })\n\n if (data) {\n // @ts-expect-error attach data to request - less overhead than using urlencoded\n req.data = data\n }\n\n const response = await handleEndpoints({\n basePath,\n config: incomingConfig,\n path,\n payloadInstanceCacheKey,\n request: req,\n })\n\n return response\n }\n\n try {\n req = await createPayloadRequest({\n canSetHeaders: true,\n config: incomingConfig,\n payloadInstanceCacheKey,\n request,\n })\n\n const { payload } = req\n const { config } = payload\n\n const pathname = path ?? new URL(req.url!).pathname\n const baseAPIPath = formatAdminURL({\n apiRoute: config.routes.api,\n path: '',\n })\n\n if (!pathname.startsWith(baseAPIPath)) {\n return notFoundResponse(req, pathname)\n }\n\n // /api/posts/route -> /posts/route\n let adjustedPathname = pathname.replace(baseAPIPath, '')\n\n let isGlobals = false\n\n // /globals/header/route -> /header/route\n if (adjustedPathname.startsWith('/globals')) {\n isGlobals = true\n adjustedPathname = adjustedPathname.replace('/globals', '')\n }\n\n const segments = adjustedPathname.split('/')\n // remove empty string first element\n segments.shift()\n\n const firstParam = segments[0]\n\n let globalConfig!: GlobalConfig\n\n // first param can be a global slug or collection slug, find the relevant config\n if (firstParam) {\n if (isGlobals) {\n globalConfig = payload.globals.config.find((each) => each.slug === firstParam)!\n } else if (payload.collections[firstParam]) {\n collection = payload.collections[firstParam]\n }\n }\n\n let endpoints: Endpoint[] | false = config.endpoints\n\n if (collection) {\n endpoints = collection.config.endpoints\n // /posts/route -> /route\n adjustedPathname = adjustedPathname.replace(`/${collection.config.slug}`, '')\n } else if (globalConfig) {\n // /header/route -> /route\n adjustedPathname = adjustedPathname.replace(`/${globalConfig.slug}`, '')\n endpoints = globalConfig.endpoints!\n }\n\n // sanitize when endpoint.path is '/'\n if (adjustedPathname === '') {\n adjustedPathname = '/'\n }\n\n if (endpoints === false) {\n return Response.json(\n {\n message: `Cannot ${req.method?.toUpperCase()} ${req.url}`,\n },\n {\n headers: headersWithCors({\n headers: new Headers(),\n req,\n }),\n status: httpStatus.NOT_IMPLEMENTED,\n },\n )\n }\n\n // Find the relevant endpoint configuration\n const endpoint = endpoints?.find((endpoint) => {\n if (endpoint.method !== req.method?.toLowerCase()) {\n return false\n }\n\n const pathMatchFn = match(endpoint.path, { decode: decodeURIComponent })\n\n const matchResult = pathMatchFn(adjustedPathname)\n\n if (!matchResult) {\n return false\n }\n\n req.routeParams = matchResult.params as Record<string, unknown>\n\n // Inject to routeParams the slug as well so it can be used later\n if (collection) {\n req.routeParams.collection = collection.config.slug\n } else if (globalConfig) {\n req.routeParams.global = globalConfig.slug\n }\n\n return true\n })\n\n if (endpoint) {\n handler = endpoint.handler\n }\n\n if (!handler) {\n // If no custom handler found and this is an OPTIONS request,\n // return default CORS response for preflight requests\n if (req.method?.toLowerCase() === 'options') {\n return Response.json(\n {},\n {\n headers: headersWithCors({\n headers: new Headers(),\n req,\n }),\n status: 200,\n },\n )\n }\n\n return notFoundResponse(req, pathname)\n }\n\n const response = await handler(req)\n\n return new Response(response.body, {\n headers: headersWithCors({\n headers: mergeHeaders(req.responseHeaders ?? new Headers(), response.headers),\n req,\n }),\n status: response.status,\n statusText: response.statusText,\n })\n } catch (_err) {\n const err = _err as APIError\n return routeError({\n collection,\n config: incomingConfig,\n err,\n req: req!,\n })\n }\n}\n"],"names":["status","httpStatus","match","createPayloadRequest","formatAdminURL","headersWithCors","mergeHeaders","routeError","notFoundResponse","req","pathname","Response","json","message","URL","url","headers","Headers","NOT_FOUND","handleEndpoints","basePath","config","incomingConfig","path","payloadInstanceCacheKey","request","handler","collection","method","toLowerCase","get","data","undefined","search","text","locale","fallbackLocale","depth","Request","cache","credentials","signal","response","canSetHeaders","payload","baseAPIPath","apiRoute","routes","api","startsWith","adjustedPathname","replace","isGlobals","segments","split","shift","firstParam","globalConfig","globals","find","each","slug","collections","endpoints","toUpperCase","NOT_IMPLEMENTED","endpoint","pathMatchFn","decode","decodeURIComponent","matchResult","routeParams","params","global","body","responseHeaders","statusText","_err","err"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/handleEndpoints.ts"],"sourcesContent":["import { status as httpStatus } from 'http-status'\nimport { match } from 'path-to-regexp'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { Endpoint, PayloadHandler, SanitizedConfig } from '../config/types.js'\nimport type { APIError } from '../errors/APIError.js'\nimport type { GlobalConfig } from '../globals/config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\n\nimport { createPayloadRequest } from './createPayloadRequest.js'\nimport { formatAdminURL } from './formatAdminURL.js'\nimport { headersWithCors } from './headersWithCors.js'\nimport { mergeHeaders } from './mergeHeaders.js'\nimport { routeError } from './routeError.js'\n\nconst notFoundResponse = (req: PayloadRequest, pathname?: string) => {\n return Response.json(\n {\n message: `Route not found \"${pathname ?? new URL(req.url!).pathname}\"`,\n },\n {\n headers: headersWithCors({\n headers: new Headers(),\n req,\n }),\n status: httpStatus.NOT_FOUND,\n },\n )\n}\n\n/**\n * Attaches the Payload REST API to any backend framework that uses Fetch Request/Response\n * like Next.js (app router), Remix, Bun, Hono.\n *\n * ### Example: Using Hono\n * ```ts\n * import { handleEndpoints } from 'payload';\n * import { serve } from '@hono/node-server';\n * import { loadEnv } from 'payload/node';\n *\n * const port = 3001;\n * loadEnv();\n *\n * const { default: config } = await import('@payload-config');\n *\n * const server = serve({\n * fetch: async (request) => {\n * const response = await handleEndpoints({\n * config,\n * request: request.clone(),\n * });\n *\n * return response;\n * },\n * port,\n * });\n *\n * server.on('listening', () => {\n * console.log(`API server is listening on http://localhost:${port}/api`);\n * });\n * ```\n */\nexport const handleEndpoints = async ({\n basePath = '',\n config: incomingConfig,\n path,\n payloadInstanceCacheKey,\n request,\n}: {\n basePath?: string\n config: Promise<SanitizedConfig> | SanitizedConfig\n /** Override path from the request */\n path?: string\n payloadInstanceCacheKey?: string\n request: Request\n}): Promise<Response> => {\n let handler!: PayloadHandler\n let req: PayloadRequest\n let collection!: Collection\n\n // This can be used against GET request search params size limit.\n // Instead you can do POST request with a text body as search params.\n // We use this internally for relationships querying on the frontend\n // packages/ui/src/fields/Relationship/index.tsx\n if (\n request.method.toLowerCase() === 'post' &&\n (request.headers.get('X-Payload-HTTP-Method-Override') === 'GET' ||\n request.headers.get('X-HTTP-Method-Override') === 'GET')\n ) {\n let url = request.url\n let data: any = undefined\n\n if (request.headers.get('Content-Type') === 'application/x-www-form-urlencoded') {\n const search = await request.text()\n url = `${request.url}?${search}`\n } else if (request.headers.get('Content-Type') === 'application/json') {\n // May not be supported by every endpoint\n data = await request.json()\n\n // locale and fallbackLocale is read by createPayloadRequest to populate req.locale and req.fallbackLocale\n // => add to searchParams\n if (data?.locale) {\n url += `?locale=${data.locale}`\n }\n if (data?.fallbackLocale) {\n url += `&fallbackLocale=${data.depth}`\n }\n }\n\n const req = new Request(url, {\n cache: request.cache,\n credentials: request.credentials,\n headers: request.headers,\n method: 'GET',\n signal: request.signal,\n })\n\n if (data) {\n // @ts-expect-error attach data to request - less overhead than using urlencoded\n req.data = data\n }\n\n const response = await handleEndpoints({\n basePath,\n config: incomingConfig,\n path,\n payloadInstanceCacheKey,\n request: req,\n })\n\n return response\n }\n\n try {\n req = await createPayloadRequest({\n canSetHeaders: true,\n config: incomingConfig,\n payloadInstanceCacheKey,\n request,\n })\n\n const { payload } = req\n const { config } = payload\n\n const pathname = path ?? new URL(req.url!).pathname\n const baseAPIPath = formatAdminURL({\n apiRoute: config.routes.api,\n path: '',\n })\n\n if (!pathname.startsWith(baseAPIPath)) {\n return notFoundResponse(req, pathname)\n }\n\n // /api/posts/route -> /posts/route\n let adjustedPathname = pathname.replace(baseAPIPath, '')\n\n let isGlobals = false\n\n // /globals/header/route -> /header/route\n if (adjustedPathname.startsWith('/globals')) {\n isGlobals = true\n adjustedPathname = adjustedPathname.replace('/globals', '')\n }\n\n const segments = adjustedPathname.split('/')\n // remove empty string first element\n segments.shift()\n\n const firstParam = segments[0]\n\n let globalConfig!: GlobalConfig\n\n // first param can be a global slug or collection slug, find the relevant config\n if (firstParam) {\n if (isGlobals) {\n globalConfig = payload.globals.config.find((each) => each.slug === firstParam)!\n } else if (payload.collections[firstParam]) {\n collection = payload.collections[firstParam]\n }\n }\n\n let endpoints: Endpoint[] | false = config.endpoints\n\n if (collection) {\n endpoints = collection.config.endpoints\n // /posts/route -> /route\n adjustedPathname = adjustedPathname.replace(`/${collection.config.slug}`, '')\n } else if (globalConfig) {\n // /header/route -> /route\n adjustedPathname = adjustedPathname.replace(`/${globalConfig.slug}`, '')\n endpoints = globalConfig.endpoints!\n }\n\n // sanitize when endpoint.path is '/'\n if (adjustedPathname === '') {\n adjustedPathname = '/'\n }\n\n if (endpoints === false) {\n return Response.json(\n {\n message: `Cannot ${req.method?.toUpperCase()} ${req.url}`,\n },\n {\n headers: headersWithCors({\n headers: new Headers(),\n req,\n }),\n status: httpStatus.NOT_IMPLEMENTED,\n },\n )\n }\n\n // Find the relevant endpoint configuration\n const endpoint = endpoints?.find((endpoint) => {\n if (endpoint.method !== req.method?.toLowerCase()) {\n return false\n }\n\n const pathMatchFn = match(endpoint.path, { decode: decodeURIComponent })\n\n const matchResult = pathMatchFn(adjustedPathname)\n\n if (!matchResult) {\n return false\n }\n\n req.routeParams = matchResult.params as Record<string, unknown>\n\n // Inject to routeParams the slug as well so it can be used later\n if (collection) {\n req.routeParams.collection = collection.config.slug\n } else if (globalConfig) {\n req.routeParams.global = globalConfig.slug\n }\n\n return true\n })\n\n if (endpoint) {\n handler = endpoint.handler\n }\n\n if (!handler) {\n // If no custom handler found and this is an OPTIONS request,\n // return default CORS response for preflight requests\n if (req.method?.toLowerCase() === 'options') {\n return Response.json(\n {},\n {\n headers: headersWithCors({\n headers: new Headers(),\n req,\n }),\n status: 200,\n },\n )\n }\n\n return notFoundResponse(req, pathname)\n }\n\n const response = await handler(req)\n\n return new Response(response.body, {\n headers: headersWithCors({\n headers: mergeHeaders(req.responseHeaders ?? new Headers(), response.headers),\n req,\n }),\n status: response.status,\n statusText: response.statusText,\n })\n } catch (_err) {\n const err = _err as APIError\n return routeError({\n collection,\n config: incomingConfig,\n err,\n req: req!,\n })\n }\n}\n"],"names":["status","httpStatus","match","createPayloadRequest","formatAdminURL","headersWithCors","mergeHeaders","routeError","notFoundResponse","req","pathname","Response","json","message","URL","url","headers","Headers","NOT_FOUND","handleEndpoints","basePath","config","incomingConfig","path","payloadInstanceCacheKey","request","handler","collection","method","toLowerCase","get","data","undefined","search","text","locale","fallbackLocale","depth","Request","cache","credentials","signal","response","canSetHeaders","payload","baseAPIPath","apiRoute","routes","api","startsWith","adjustedPathname","replace","isGlobals","segments","split","shift","firstParam","globalConfig","globals","find","each","slug","collections","endpoints","toUpperCase","NOT_IMPLEMENTED","endpoint","pathMatchFn","decode","decodeURIComponent","matchResult","routeParams","params","global","body","responseHeaders","statusText","_err","err"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PayloadRequest, SelectFn, SelectFnOperation, SelectType } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Invoke an entity-level `select` config (always a function form) and return
|
|
4
|
+
* the resolved select to pass into `sanitizeSelect`.
|
|
5
|
+
*
|
|
6
|
+
* - No config → caller's `select` unchanged.
|
|
7
|
+
* - Function returning `SelectType` → replaces the caller's `select`.
|
|
8
|
+
* - Function returning `undefined` → caller's `select` unchanged.
|
|
9
|
+
*/
|
|
10
|
+
export declare const resolveSelect: <TSelect extends SelectType = SelectType>({ config, operation, req, select, }: {
|
|
11
|
+
config?: SelectFn<TSelect>;
|
|
12
|
+
operation: SelectFnOperation;
|
|
13
|
+
req: PayloadRequest;
|
|
14
|
+
select?: SelectType;
|
|
15
|
+
}) => SelectType | undefined;
|
|
16
|
+
//# sourceMappingURL=resolveSelect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/resolveSelect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEhG;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,SAAS,UAAU,oDAKrD;IACD,MAAM,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC1B,SAAS,EAAE,iBAAiB,CAAA;IAC5B,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB,KAAG,UAAU,GAAG,SAMhB,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Invoke an entity-level `select` config (always a function form) and return
|
|
3
|
+
* the resolved select to pass into `sanitizeSelect`.
|
|
4
|
+
*
|
|
5
|
+
* - No config → caller's `select` unchanged.
|
|
6
|
+
* - Function returning `SelectType` → replaces the caller's `select`.
|
|
7
|
+
* - Function returning `undefined` → caller's `select` unchanged.
|
|
8
|
+
*/ export const resolveSelect = ({ config, operation, req, select })=>{
|
|
9
|
+
if (typeof config !== 'function') {
|
|
10
|
+
return select;
|
|
11
|
+
}
|
|
12
|
+
return config({
|
|
13
|
+
operation,
|
|
14
|
+
req,
|
|
15
|
+
select
|
|
16
|
+
}) ?? select;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=resolveSelect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/resolveSelect.ts"],"sourcesContent":["import type { PayloadRequest, SelectFn, SelectFnOperation, SelectType } from '../types/index.js'\n\n/**\n * Invoke an entity-level `select` config (always a function form) and return\n * the resolved select to pass into `sanitizeSelect`.\n *\n * - No config → caller's `select` unchanged.\n * - Function returning `SelectType` → replaces the caller's `select`.\n * - Function returning `undefined` → caller's `select` unchanged.\n */\nexport const resolveSelect = <TSelect extends SelectType = SelectType>({\n config,\n operation,\n req,\n select,\n}: {\n config?: SelectFn<TSelect>\n operation: SelectFnOperation\n req: PayloadRequest\n select?: SelectType\n}): SelectType | undefined => {\n if (typeof config !== 'function') {\n return select\n }\n\n return config({ operation, req, select }) ?? select\n}\n"],"names":["resolveSelect","config","operation","req","select"],"mappings":"AAEA;;;;;;;CAOC,GACD,OAAO,MAAMA,gBAAgB,CAA0C,EACrEC,MAAM,EACNC,SAAS,EACTC,GAAG,EACHC,MAAM,EAMP;IACC,IAAI,OAAOH,WAAW,YAAY;QAChC,OAAOG;IACT;IAEA,OAAOH,OAAO;QAAEC;QAAWC;QAAKC;IAAO,MAAMA;AAC/C,EAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight hierarchical span profiler for config sanitization.
|
|
3
|
+
*
|
|
4
|
+
* No-op unless PAYLOAD_PROFILE_SANITIZE=1.
|
|
5
|
+
*
|
|
6
|
+
* Records every span with its parent, computing self-time vs children-time
|
|
7
|
+
* for accurate hotspot analysis. Sequential async-await flow means a simple
|
|
8
|
+
* stack works (no concurrent overlap between spans within sanitizeConfig).
|
|
9
|
+
*/
|
|
10
|
+
export type SpanRecord = {
|
|
11
|
+
childrenTime: number;
|
|
12
|
+
depth: number;
|
|
13
|
+
duration: number;
|
|
14
|
+
meta?: string;
|
|
15
|
+
name: string;
|
|
16
|
+
parent: number;
|
|
17
|
+
selfTime: number;
|
|
18
|
+
start: number;
|
|
19
|
+
};
|
|
20
|
+
export declare const profilerEnabled: boolean;
|
|
21
|
+
export declare const startSpan: (name: string, meta?: string) => number;
|
|
22
|
+
export declare const endSpan: (idx: number) => void;
|
|
23
|
+
export declare const profileAsync: <T>(name: string, fn: () => Promise<T>, meta?: string) => Promise<T>;
|
|
24
|
+
export declare const profileSync: <T>(name: string, fn: () => T, meta?: string) => T;
|
|
25
|
+
export declare const resetProfiler: () => void;
|
|
26
|
+
export declare const getProfilerRecords: () => SpanRecord[];
|
|
27
|
+
type Aggregate = {
|
|
28
|
+
childrenTime: number;
|
|
29
|
+
count: number;
|
|
30
|
+
maxSelf: number;
|
|
31
|
+
maxTotal: number;
|
|
32
|
+
name: string;
|
|
33
|
+
totalSelf: number;
|
|
34
|
+
totalTime: number;
|
|
35
|
+
};
|
|
36
|
+
export declare const aggregateByName: () => Aggregate[];
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=sanitizeProfiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizeProfiler.d.ts","sourceRoot":"","sources":["../../src/utilities/sanitizeProfiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAKD,eAAO,MAAM,eAAe,SAAU,CAAA;AAEtC,eAAO,MAAM,SAAS,SAAU,MAAM,SAAS,MAAM,KAAG,MAkBvD,CAAA;AAED,eAAO,MAAM,OAAO,QAAS,MAAM,KAAG,IAWrC,CAAA;AAED,eAAO,MAAM,YAAY,GAAU,CAAC,QAC5B,MAAM,MACR,MAAM,OAAO,CAAC,CAAC,CAAC,SACb,MAAM,KACZ,OAAO,CAAC,CAAC,CAUX,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,CAAC,QAAQ,MAAM,MAAM,MAAM,CAAC,SAAS,MAAM,KAAG,CAUzE,CAAA;AAED,eAAO,MAAM,aAAa,QAAO,IAGhC,CAAA;AAED,eAAO,MAAM,kBAAkB,QAAO,UAAU,EAAa,CAAA;AAE7D,KAAK,SAAS,GAAG;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,eAAe,QAAO,SAAS,EA4B3C,CAAA"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight hierarchical span profiler for config sanitization.
|
|
3
|
+
*
|
|
4
|
+
* No-op unless PAYLOAD_PROFILE_SANITIZE=1.
|
|
5
|
+
*
|
|
6
|
+
* Records every span with its parent, computing self-time vs children-time
|
|
7
|
+
* for accurate hotspot analysis. Sequential async-await flow means a simple
|
|
8
|
+
* stack works (no concurrent overlap between spans within sanitizeConfig).
|
|
9
|
+
*/ const enabled = process.env.PAYLOAD_PROFILE_SANITIZE === '1';
|
|
10
|
+
const records = [];
|
|
11
|
+
const stack = [];
|
|
12
|
+
export const profilerEnabled = enabled;
|
|
13
|
+
export const startSpan = (name, meta)=>{
|
|
14
|
+
if (!enabled) {
|
|
15
|
+
return -1;
|
|
16
|
+
}
|
|
17
|
+
const idx = records.length;
|
|
18
|
+
const parent = stack.length > 0 ? stack[stack.length - 1] : -1;
|
|
19
|
+
records.push({
|
|
20
|
+
name,
|
|
21
|
+
childrenTime: 0,
|
|
22
|
+
depth: stack.length,
|
|
23
|
+
duration: 0,
|
|
24
|
+
meta,
|
|
25
|
+
parent,
|
|
26
|
+
selfTime: 0,
|
|
27
|
+
start: performance.now()
|
|
28
|
+
});
|
|
29
|
+
stack.push(idx);
|
|
30
|
+
return idx;
|
|
31
|
+
};
|
|
32
|
+
export const endSpan = (idx)=>{
|
|
33
|
+
if (idx < 0) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const rec = records[idx];
|
|
37
|
+
rec.duration = performance.now() - rec.start;
|
|
38
|
+
rec.selfTime = rec.duration - rec.childrenTime;
|
|
39
|
+
if (rec.parent >= 0) {
|
|
40
|
+
records[rec.parent].childrenTime += rec.duration;
|
|
41
|
+
}
|
|
42
|
+
stack.pop();
|
|
43
|
+
};
|
|
44
|
+
export const profileAsync = async (name, fn, meta)=>{
|
|
45
|
+
if (!enabled) {
|
|
46
|
+
return fn();
|
|
47
|
+
}
|
|
48
|
+
const idx = startSpan(name, meta);
|
|
49
|
+
try {
|
|
50
|
+
return await fn();
|
|
51
|
+
} finally{
|
|
52
|
+
endSpan(idx);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
export const profileSync = (name, fn, meta)=>{
|
|
56
|
+
if (!enabled) {
|
|
57
|
+
return fn();
|
|
58
|
+
}
|
|
59
|
+
const idx = startSpan(name, meta);
|
|
60
|
+
try {
|
|
61
|
+
return fn();
|
|
62
|
+
} finally{
|
|
63
|
+
endSpan(idx);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
export const resetProfiler = ()=>{
|
|
67
|
+
records.length = 0;
|
|
68
|
+
stack.length = 0;
|
|
69
|
+
};
|
|
70
|
+
export const getProfilerRecords = ()=>records;
|
|
71
|
+
export const aggregateByName = ()=>{
|
|
72
|
+
const map = new Map();
|
|
73
|
+
for (const rec of records){
|
|
74
|
+
let agg = map.get(rec.name);
|
|
75
|
+
if (!agg) {
|
|
76
|
+
agg = {
|
|
77
|
+
name: rec.name,
|
|
78
|
+
childrenTime: 0,
|
|
79
|
+
count: 0,
|
|
80
|
+
maxSelf: 0,
|
|
81
|
+
maxTotal: 0,
|
|
82
|
+
totalSelf: 0,
|
|
83
|
+
totalTime: 0
|
|
84
|
+
};
|
|
85
|
+
map.set(rec.name, agg);
|
|
86
|
+
}
|
|
87
|
+
agg.count += 1;
|
|
88
|
+
agg.totalTime += rec.duration;
|
|
89
|
+
agg.totalSelf += rec.selfTime;
|
|
90
|
+
agg.childrenTime += rec.childrenTime;
|
|
91
|
+
if (rec.duration > agg.maxTotal) {
|
|
92
|
+
agg.maxTotal = rec.duration;
|
|
93
|
+
}
|
|
94
|
+
if (rec.selfTime > agg.maxSelf) {
|
|
95
|
+
agg.maxSelf = rec.selfTime;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return Array.from(map.values()).sort((a, b)=>b.totalSelf - a.totalSelf);
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
//# sourceMappingURL=sanitizeProfiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/sanitizeProfiler.ts"],"sourcesContent":["/**\n * Lightweight hierarchical span profiler for config sanitization.\n *\n * No-op unless PAYLOAD_PROFILE_SANITIZE=1.\n *\n * Records every span with its parent, computing self-time vs children-time\n * for accurate hotspot analysis. Sequential async-await flow means a simple\n * stack works (no concurrent overlap between spans within sanitizeConfig).\n */\n\nconst enabled = process.env.PAYLOAD_PROFILE_SANITIZE === '1'\n\nexport type SpanRecord = {\n childrenTime: number\n depth: number\n duration: number\n meta?: string\n name: string\n parent: number\n selfTime: number\n start: number\n}\n\nconst records: SpanRecord[] = []\nconst stack: number[] = []\n\nexport const profilerEnabled = enabled\n\nexport const startSpan = (name: string, meta?: string): number => {\n if (!enabled) {\n return -1\n }\n const idx = records.length\n const parent = stack.length > 0 ? stack[stack.length - 1]! : -1\n records.push({\n name,\n childrenTime: 0,\n depth: stack.length,\n duration: 0,\n meta,\n parent,\n selfTime: 0,\n start: performance.now(),\n })\n stack.push(idx)\n return idx\n}\n\nexport const endSpan = (idx: number): void => {\n if (idx < 0) {\n return\n }\n const rec = records[idx]!\n rec.duration = performance.now() - rec.start\n rec.selfTime = rec.duration - rec.childrenTime\n if (rec.parent >= 0) {\n records[rec.parent]!.childrenTime += rec.duration\n }\n stack.pop()\n}\n\nexport const profileAsync = async <T>(\n name: string,\n fn: () => Promise<T>,\n meta?: string,\n): Promise<T> => {\n if (!enabled) {\n return fn()\n }\n const idx = startSpan(name, meta)\n try {\n return await fn()\n } finally {\n endSpan(idx)\n }\n}\n\nexport const profileSync = <T>(name: string, fn: () => T, meta?: string): T => {\n if (!enabled) {\n return fn()\n }\n const idx = startSpan(name, meta)\n try {\n return fn()\n } finally {\n endSpan(idx)\n }\n}\n\nexport const resetProfiler = (): void => {\n records.length = 0\n stack.length = 0\n}\n\nexport const getProfilerRecords = (): SpanRecord[] => records\n\ntype Aggregate = {\n childrenTime: number\n count: number\n maxSelf: number\n maxTotal: number\n name: string\n totalSelf: number\n totalTime: number\n}\n\nexport const aggregateByName = (): Aggregate[] => {\n const map = new Map<string, Aggregate>()\n for (const rec of records) {\n let agg = map.get(rec.name)\n if (!agg) {\n agg = {\n name: rec.name,\n childrenTime: 0,\n count: 0,\n maxSelf: 0,\n maxTotal: 0,\n totalSelf: 0,\n totalTime: 0,\n }\n map.set(rec.name, agg)\n }\n agg.count += 1\n agg.totalTime += rec.duration\n agg.totalSelf += rec.selfTime\n agg.childrenTime += rec.childrenTime\n if (rec.duration > agg.maxTotal) {\n agg.maxTotal = rec.duration\n }\n if (rec.selfTime > agg.maxSelf) {\n agg.maxSelf = rec.selfTime\n }\n }\n return Array.from(map.values()).sort((a, b) => b.totalSelf - a.totalSelf)\n}\n"],"names":["enabled","process","env","PAYLOAD_PROFILE_SANITIZE","records","stack","profilerEnabled","startSpan","name","meta","idx","length","parent","push","childrenTime","depth","duration","selfTime","start","performance","now","endSpan","rec","pop","profileAsync","fn","profileSync","resetProfiler","getProfilerRecords","aggregateByName","map","Map","agg","get","count","maxSelf","maxTotal","totalSelf","totalTime","set","Array","from","values","sort","a","b"],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import type { FlattenedField } from '../fields/config/types.js';
|
|
2
2
|
import type { SelectType } from '../types/index.js';
|
|
3
|
-
export declare const sanitizeSelect: ({ fields,
|
|
3
|
+
export declare const sanitizeSelect: ({ fields, select, versions, }: {
|
|
4
4
|
fields: FlattenedField[];
|
|
5
|
-
forceSelect?: SelectType;
|
|
6
5
|
select?: SelectType;
|
|
7
6
|
versions?: boolean;
|
|
8
7
|
}) => SelectType | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitizeSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/sanitizeSelect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sanitizeSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/sanitizeSelect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,KAAK,EAAqB,UAAU,EAAE,MAAM,mBAAmB,CAAA;AA+GtE,eAAO,MAAM,cAAc,kCAIxB;IACD,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,KAAG,UAAU,GAAG,SAqChB,CAAA"}
|