payload 4.0.0-internal.ea6e8f8 → 4.0.0-internal.ee5d8bd
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/adapters/router.d.ts +1 -1
- package/dist/admin/adapters/router.d.ts.map +1 -1
- package/dist/admin/adapters/router.js.map +1 -1
- package/dist/admin/forms/Diff.d.ts +0 -4
- package/dist/admin/forms/Diff.d.ts.map +1 -1
- package/dist/admin/forms/Diff.js.map +1 -1
- package/dist/admin/forms/Form.d.ts +0 -2
- package/dist/admin/forms/Form.d.ts.map +1 -1
- package/dist/admin/forms/Form.js.map +1 -1
- package/dist/admin/initAdminContext.d.ts.map +1 -1
- package/dist/admin/initAdminContext.js +0 -10
- package/dist/admin/initAdminContext.js.map +1 -1
- package/dist/auth/createAuthToken.d.ts +26 -0
- package/dist/auth/createAuthToken.d.ts.map +1 -0
- package/dist/auth/createAuthToken.js +39 -0
- package/dist/auth/createAuthToken.js.map +1 -0
- package/dist/auth/endpoints/refresh.d.ts.map +1 -1
- package/dist/auth/endpoints/refresh.js +2 -1
- package/dist/auth/endpoints/refresh.js.map +1 -1
- package/dist/auth/getFieldsToSign.js.map +1 -1
- package/dist/auth/loginWithCookie.d.ts.map +1 -1
- package/dist/auth/loginWithCookie.js +1 -0
- package/dist/auth/loginWithCookie.js.map +1 -1
- package/dist/auth/operations/local/login.d.ts.map +1 -1
- package/dist/auth/operations/local/login.js +1 -0
- package/dist/auth/operations/local/login.js.map +1 -1
- package/dist/auth/operations/login.d.ts +2 -0
- package/dist/auth/operations/login.d.ts.map +1 -1
- package/dist/auth/operations/login.js +6 -19
- package/dist/auth/operations/login.js.map +1 -1
- package/dist/auth/operations/refresh.d.ts +8 -0
- package/dist/auth/operations/refresh.d.ts.map +1 -1
- package/dist/auth/operations/refresh.js +50 -19
- package/dist/auth/operations/refresh.js.map +1 -1
- package/dist/auth/operations/resetPassword.d.ts.map +1 -1
- package/dist/auth/operations/resetPassword.js +54 -20
- package/dist/auth/operations/resetPassword.js.map +1 -1
- package/dist/auth/refreshAuthToken.d.ts +32 -0
- package/dist/auth/refreshAuthToken.d.ts.map +1 -0
- package/dist/auth/refreshAuthToken.js +113 -0
- package/dist/auth/refreshAuthToken.js.map +1 -0
- package/dist/auth/serverFunctions/cookies.js.map +1 -1
- package/dist/auth/serverFunctions/login.js.map +1 -1
- package/dist/auth/sessions.d.ts +9 -2
- package/dist/auth/sessions.d.ts.map +1 -1
- package/dist/auth/sessions.js +6 -5
- package/dist/auth/sessions.js.map +1 -1
- package/dist/auth/types.d.ts +25 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/cli/commands/data/utilities.d.ts +1 -1
- package/dist/cli/commands/data/utilities.d.ts.map +1 -1
- package/dist/cli/commands/data/utilities.js.map +1 -1
- package/dist/cli/defineCLICommand.js +1 -1
- package/dist/cli/defineCLICommand.js.map +1 -1
- package/dist/collections/config/client.d.ts +1 -1
- package/dist/collections/config/client.d.ts.map +1 -1
- package/dist/collections/config/client.js +0 -1
- package/dist/collections/config/client.js.map +1 -1
- package/dist/collections/config/defaults.d.ts +2 -0
- package/dist/collections/config/defaults.d.ts.map +1 -1
- package/dist/collections/config/defaults.js +4 -0
- 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 +3 -0
- package/dist/collections/config/sanitize.js.map +1 -1
- package/dist/collections/config/sanitizeCompoundIndexes.d.ts.map +1 -1
- package/dist/collections/config/sanitizeCompoundIndexes.js +0 -9
- package/dist/collections/config/sanitizeCompoundIndexes.js.map +1 -1
- package/dist/collections/config/types.d.ts +4 -21
- package/dist/collections/config/types.d.ts.map +1 -1
- package/dist/collections/config/types.js.map +1 -1
- package/dist/collections/dataloader.d.ts +1 -10
- package/dist/collections/dataloader.d.ts.map +1 -1
- package/dist/collections/dataloader.js +6 -14
- package/dist/collections/dataloader.js.map +1 -1
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +0 -13
- 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 +121 -638
- 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 +32 -238
- package/dist/collections/operations/deleteByID.js.map +1 -1
- package/dist/collections/operations/findByID.d.ts.map +1 -1
- package/dist/collections/operations/findByID.js +0 -6
- package/dist/collections/operations/findByID.js.map +1 -1
- package/dist/collections/operations/findDistinct.d.ts.map +1 -1
- package/dist/collections/operations/findDistinct.js +6 -7
- package/dist/collections/operations/findDistinct.js.map +1 -1
- package/dist/collections/operations/findVersionByID.d.ts.map +1 -1
- package/dist/collections/operations/findVersionByID.js +7 -0
- 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 +5 -0
- package/dist/collections/operations/findVersions.js.map +1 -1
- package/dist/collections/operations/local/count.d.ts +4 -9
- package/dist/collections/operations/local/count.d.ts.map +1 -1
- package/dist/collections/operations/local/count.js.map +1 -1
- package/dist/collections/operations/local/countVersions.d.ts +0 -4
- package/dist/collections/operations/local/countVersions.d.ts.map +1 -1
- package/dist/collections/operations/local/countVersions.js.map +1 -1
- package/dist/collections/operations/local/create.d.ts +4 -9
- package/dist/collections/operations/local/create.d.ts.map +1 -1
- package/dist/collections/operations/local/create.js.map +1 -1
- package/dist/collections/operations/local/delete.d.ts +4 -9
- package/dist/collections/operations/local/delete.d.ts.map +1 -1
- package/dist/collections/operations/local/delete.js.map +1 -1
- package/dist/collections/operations/local/duplicate.d.ts +0 -5
- package/dist/collections/operations/local/duplicate.d.ts.map +1 -1
- package/dist/collections/operations/local/duplicate.js.map +1 -1
- package/dist/collections/operations/local/find.d.ts +4 -9
- package/dist/collections/operations/local/find.d.ts.map +1 -1
- package/dist/collections/operations/local/find.js.map +1 -1
- package/dist/collections/operations/local/findByID.d.ts +4 -9
- package/dist/collections/operations/local/findByID.d.ts.map +1 -1
- package/dist/collections/operations/local/findByID.js.map +1 -1
- package/dist/collections/operations/local/findDistinct.d.ts +0 -5
- package/dist/collections/operations/local/findDistinct.d.ts.map +1 -1
- package/dist/collections/operations/local/findDistinct.js.map +1 -1
- package/dist/collections/operations/local/findVersionByID.d.ts +0 -5
- package/dist/collections/operations/local/findVersionByID.d.ts.map +1 -1
- package/dist/collections/operations/local/findVersionByID.js.map +1 -1
- package/dist/collections/operations/local/findVersions.d.ts +0 -5
- package/dist/collections/operations/local/findVersions.d.ts.map +1 -1
- package/dist/collections/operations/local/findVersions.js.map +1 -1
- package/dist/collections/operations/local/restoreVersion.d.ts +0 -5
- package/dist/collections/operations/local/restoreVersion.d.ts.map +1 -1
- package/dist/collections/operations/local/restoreVersion.js.map +1 -1
- package/dist/collections/operations/local/update.d.ts +4 -9
- package/dist/collections/operations/local/update.d.ts.map +1 -1
- package/dist/collections/operations/local/update.js.map +1 -1
- package/dist/collections/operations/renameFile.js +1 -1
- package/dist/collections/operations/renameFile.js.map +1 -1
- package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
- package/dist/collections/operations/restoreVersion.js +76 -157
- 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 +171 -357
- package/dist/collections/operations/update.js.map +1 -1
- package/dist/collections/operations/updateByID.d.ts +0 -15
- package/dist/collections/operations/updateByID.d.ts.map +1 -1
- package/dist/collections/operations/updateByID.js +60 -265
- package/dist/collections/operations/updateByID.js.map +1 -1
- package/dist/collections/operations/utilities/buildBeforeOperation.d.ts.map +1 -1
- package/dist/collections/operations/utilities/buildBeforeOperation.js +0 -7
- package/dist/collections/operations/utilities/buildBeforeOperation.js.map +1 -1
- package/dist/collections/operations/utilities/update.d.ts +1 -14
- package/dist/collections/operations/utilities/update.d.ts.map +1 -1
- package/dist/collections/operations/utilities/update.js +20 -92
- package/dist/collections/operations/utilities/update.js.map +1 -1
- package/dist/collections/operations/validate.js +4 -4
- package/dist/collections/operations/validate.js.map +1 -1
- package/dist/config/client.d.ts +1 -3
- package/dist/config/client.d.ts.map +1 -1
- package/dist/config/client.js +1 -9
- package/dist/config/client.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +1 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/definePlugin.js.map +1 -1
- package/dist/config/sanitize.d.ts.map +1 -1
- package/dist/config/sanitize.js +2 -40
- package/dist/config/sanitize.js.map +1 -1
- package/dist/config/types.d.ts +13 -21
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/database/defaultCopy.d.ts.map +1 -1
- package/dist/database/defaultCopy.js +0 -1
- package/dist/database/defaultCopy.js.map +1 -1
- package/dist/database/types.d.ts +4 -75
- package/dist/database/types.d.ts.map +1 -1
- package/dist/database/types.js.map +1 -1
- package/dist/exports/build-config.d.ts +9 -0
- package/dist/exports/build-config.d.ts.map +1 -0
- package/dist/exports/build-config.js +38 -0
- package/dist/exports/build-config.js.map +1 -0
- package/dist/exports/shared.d.ts +0 -2
- package/dist/exports/shared.d.ts.map +1 -1
- package/dist/exports/shared.js +0 -2
- package/dist/exports/shared.js.map +1 -1
- package/dist/fields/baseFields/authorship/index.d.ts +1 -2
- package/dist/fields/baseFields/authorship/index.d.ts.map +1 -1
- package/dist/fields/baseFields/authorship/index.js +0 -12
- package/dist/fields/baseFields/authorship/index.js.map +1 -1
- package/dist/fields/config/client.js.map +1 -1
- package/dist/fields/config/reservedFieldNames.d.ts.map +1 -1
- package/dist/fields/config/reservedFieldNames.js.map +1 -1
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/config/types.js.map +1 -1
- package/dist/fields/hooks/afterChange/promise.js.map +1 -1
- package/dist/fields/hooks/afterRead/index.d.ts +0 -8
- package/dist/fields/hooks/afterRead/index.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/index.js +2 -6
- package/dist/fields/hooks/afterRead/index.js.map +1 -1
- package/dist/fields/hooks/afterRead/promise.d.ts +1 -3
- package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/promise.js +17 -41
- package/dist/fields/hooks/afterRead/promise.js.map +1 -1
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js +0 -2
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js.map +1 -1
- package/dist/fields/hooks/afterRead/traverseFields.d.ts +1 -3
- package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/traverseFields.js +2 -4
- package/dist/fields/hooks/afterRead/traverseFields.js.map +1 -1
- package/dist/fields/hooks/afterRead/virtualFieldPopulationPromise.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/virtualFieldPopulationPromise.js +0 -3
- package/dist/fields/hooks/afterRead/virtualFieldPopulationPromise.js.map +1 -1
- package/dist/fields/hooks/beforeChange/flattenValidationData.d.ts +14 -0
- package/dist/fields/hooks/beforeChange/flattenValidationData.d.ts.map +1 -0
- package/dist/fields/hooks/beforeChange/flattenValidationData.js +36 -0
- package/dist/fields/hooks/beforeChange/flattenValidationData.js.map +1 -0
- package/dist/fields/hooks/beforeChange/promise.d.ts +2 -1
- package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/promise.js +96 -22
- package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
- package/dist/fields/hooks/beforeChange/traverseFields.d.ts +2 -1
- package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/traverseFields.js +2 -1
- package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.js +0 -8
- package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
- package/dist/fields/validations.d.ts.map +1 -1
- package/dist/fields/validations.js +4 -1
- package/dist/fields/validations.js.map +1 -1
- package/dist/globals/config/types.d.ts +2 -6
- package/dist/globals/config/types.d.ts.map +1 -1
- package/dist/globals/config/types.js.map +1 -1
- package/dist/globals/operations/countGlobalVersions.d.ts.map +1 -1
- package/dist/globals/operations/countGlobalVersions.js +0 -7
- package/dist/globals/operations/countGlobalVersions.js.map +1 -1
- package/dist/globals/operations/findOne.d.ts.map +1 -1
- package/dist/globals/operations/findOne.js +0 -7
- 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 -6
- 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 +4 -6
- package/dist/globals/operations/findVersions.js.map +1 -1
- package/dist/globals/operations/local/countVersions.d.ts +0 -5
- package/dist/globals/operations/local/countVersions.d.ts.map +1 -1
- package/dist/globals/operations/local/countVersions.js.map +1 -1
- package/dist/globals/operations/local/findOne.d.ts +0 -5
- package/dist/globals/operations/local/findOne.d.ts.map +1 -1
- package/dist/globals/operations/local/findOne.js.map +1 -1
- package/dist/globals/operations/local/findVersionByID.d.ts +0 -5
- package/dist/globals/operations/local/findVersionByID.d.ts.map +1 -1
- package/dist/globals/operations/local/findVersionByID.js.map +1 -1
- package/dist/globals/operations/local/findVersions.d.ts +0 -5
- package/dist/globals/operations/local/findVersions.d.ts.map +1 -1
- package/dist/globals/operations/local/findVersions.js.map +1 -1
- package/dist/globals/operations/local/restoreVersion.d.ts +0 -5
- package/dist/globals/operations/local/restoreVersion.d.ts.map +1 -1
- package/dist/globals/operations/local/restoreVersion.js.map +1 -1
- package/dist/globals/operations/local/update.d.ts +0 -5
- package/dist/globals/operations/local/update.d.ts.map +1 -1
- package/dist/globals/operations/local/update.js +18 -61
- package/dist/globals/operations/local/update.js.map +1 -1
- package/dist/globals/operations/restoreVersion.d.ts +2 -3
- package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
- package/dist/globals/operations/restoreVersion.js +24 -61
- package/dist/globals/operations/restoreVersion.js.map +1 -1
- package/dist/globals/operations/update.d.ts.map +1 -1
- package/dist/globals/operations/update.js +8 -86
- package/dist/globals/operations/update.js.map +1 -1
- package/dist/globals/operations/validate.js +1 -1
- package/dist/globals/operations/validate.js.map +1 -1
- package/dist/hierarchy/addHierarchyToCollection.d.ts.map +1 -1
- package/dist/hierarchy/addHierarchyToCollection.js +32 -21
- package/dist/hierarchy/addHierarchyToCollection.js.map +1 -1
- package/dist/hierarchy/createFolderField.js.map +1 -1
- package/dist/hierarchy/getInitialTreeData.d.ts +1 -3
- package/dist/hierarchy/getInitialTreeData.d.ts.map +1 -1
- package/dist/hierarchy/getInitialTreeData.js +1 -4
- package/dist/hierarchy/getInitialTreeData.js.map +1 -1
- package/dist/hierarchy/resolveHierarchyCollections.js +9 -3
- package/dist/hierarchy/resolveHierarchyCollections.js.map +1 -1
- package/dist/hierarchy/utils/computePaths.d.ts.map +1 -1
- package/dist/hierarchy/utils/computePaths.js.map +1 -1
- package/dist/index.bundled.d.ts +4336 -5501
- package/dist/index.d.ts +27 -51
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -37
- package/dist/index.js.map +1 -1
- package/dist/llm-instructions/getInstructionsCollection.d.ts.map +1 -1
- package/dist/llm-instructions/getInstructionsCollection.js +2 -0
- package/dist/llm-instructions/getInstructionsCollection.js.map +1 -1
- package/dist/preferences/keys.d.ts +4 -11
- package/dist/preferences/keys.d.ts.map +1 -1
- package/dist/preferences/keys.js +3 -10
- package/dist/preferences/keys.js.map +1 -1
- package/dist/preferences/types.d.ts +0 -19
- package/dist/preferences/types.d.ts.map +1 -1
- package/dist/preferences/types.js.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js +1 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js.map +1 -1
- package/dist/types/index.d.ts +0 -13
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/uploads/deleteAssociatedFiles.d.ts.map +1 -1
- package/dist/uploads/deleteAssociatedFiles.js +29 -108
- package/dist/uploads/deleteAssociatedFiles.js.map +1 -1
- package/dist/uploads/endpoints/getFile.d.ts.map +1 -1
- package/dist/uploads/endpoints/getFile.js +0 -5
- package/dist/uploads/endpoints/getFile.js.map +1 -1
- package/dist/uploads/fileExists.d.ts.map +1 -1
- package/dist/uploads/fileExists.js +2 -5
- package/dist/uploads/fileExists.js.map +1 -1
- package/dist/uploads/fileVersioning/archive.d.ts.map +1 -1
- package/dist/uploads/fileVersioning/archive.js +1 -15
- package/dist/uploads/fileVersioning/archive.js.map +1 -1
- package/dist/uploads/fileVersioning/cleanup.d.ts +0 -7
- package/dist/uploads/fileVersioning/cleanup.d.ts.map +1 -1
- package/dist/uploads/fileVersioning/cleanup.js +0 -12
- package/dist/uploads/fileVersioning/cleanup.js.map +1 -1
- package/dist/uploads/fileVersioning/cloudStorage.d.ts.map +1 -1
- package/dist/uploads/fileVersioning/cloudStorage.js +1 -16
- package/dist/uploads/fileVersioning/cloudStorage.js.map +1 -1
- package/dist/uploads/fileVersioning/resolveHistoricalFile.js.map +1 -1
- package/dist/uploads/formatFilesize.js +1 -1
- package/dist/uploads/formatFilesize.js.map +1 -1
- package/dist/uploads/generateFileData.d.ts +0 -5
- package/dist/uploads/generateFileData.d.ts.map +1 -1
- package/dist/uploads/generateFileData.js +2 -74
- package/dist/uploads/generateFileData.js.map +1 -1
- package/dist/uploads/getBaseFields.d.ts.map +1 -1
- package/dist/uploads/getBaseFields.js +29 -46
- package/dist/uploads/getBaseFields.js.map +1 -1
- package/dist/uploads/getFileContentRequirement.js.map +1 -1
- package/dist/uploads/getFileFromUploadInstructions.js.map +1 -1
- package/dist/uploads/getSafeFilename.d.ts.map +1 -1
- package/dist/uploads/getSafeFilename.js +3 -5
- package/dist/uploads/getSafeFilename.js.map +1 -1
- package/dist/uploads/safeFetch.js.map +1 -1
- package/dist/uploads/stagedUpload.js.map +1 -1
- package/dist/uploads/transformers/handleDynamicFileRequest.js +11 -2
- package/dist/uploads/transformers/handleDynamicFileRequest.js.map +1 -1
- package/dist/uploads/types.d.ts +0 -11
- package/dist/uploads/types.d.ts.map +1 -1
- package/dist/uploads/types.js.map +1 -1
- package/dist/uploads/uploadFiles.d.ts +1 -4
- package/dist/uploads/uploadFiles.d.ts.map +1 -1
- package/dist/uploads/uploadFiles.js +5 -29
- package/dist/uploads/uploadFiles.js.map +1 -1
- package/dist/utilities/addSelectGenericsToGeneretedTypes.d.ts.map +1 -1
- package/dist/utilities/addSelectGenericsToGeneretedTypes.js +0 -1
- package/dist/utilities/addSelectGenericsToGeneretedTypes.js.map +1 -1
- package/dist/utilities/appendDateTimezoneSelectFields.js.map +1 -1
- package/dist/utilities/assertNoValidationWrite.d.ts.map +1 -1
- package/dist/utilities/assertNoValidationWrite.js +0 -4
- package/dist/utilities/assertNoValidationWrite.js.map +1 -1
- package/dist/utilities/checkDocumentLockStatus.d.ts +6 -15
- package/dist/utilities/checkDocumentLockStatus.d.ts.map +1 -1
- package/dist/utilities/checkDocumentLockStatus.js +11 -44
- package/dist/utilities/checkDocumentLockStatus.js.map +1 -1
- package/dist/utilities/cloneValidationRequest.js.map +1 -1
- package/dist/utilities/commitTransaction.d.ts +0 -4
- package/dist/utilities/commitTransaction.d.ts.map +1 -1
- package/dist/utilities/commitTransaction.js +1 -41
- package/dist/utilities/commitTransaction.js.map +1 -1
- package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
- package/dist/utilities/configToJSONSchema.js +2 -18
- package/dist/utilities/configToJSONSchema.js.map +1 -1
- package/dist/utilities/createPayloadRequest.d.ts +0 -5
- package/dist/utilities/createPayloadRequest.d.ts.map +1 -1
- package/dist/utilities/createPayloadRequest.js +3 -50
- package/dist/utilities/createPayloadRequest.js.map +1 -1
- package/dist/utilities/createPayloadRequestFromWebRequest.d.ts +12 -1
- package/dist/utilities/createPayloadRequestFromWebRequest.d.ts.map +1 -1
- package/dist/utilities/createPayloadRequestFromWebRequest.js +9 -5
- package/dist/utilities/createPayloadRequestFromWebRequest.js.map +1 -1
- package/dist/utilities/deepCopyObject.js.map +1 -1
- package/dist/utilities/documentMatchingWhereExists.js +1 -1
- package/dist/utilities/documentMatchingWhereExists.js.map +1 -1
- package/dist/utilities/entityInputSchema/validateEntityData.d.ts.map +1 -1
- package/dist/utilities/entityInputSchema/validateEntityData.js.map +1 -1
- package/dist/utilities/filterDataToSelectedLocales.js.map +1 -1
- package/dist/utilities/getEntityPermissions/getEntityPermissions.d.ts.map +1 -1
- package/dist/utilities/getEntityPermissions/getEntityPermissions.js +1 -0
- package/dist/utilities/getEntityPermissions/getEntityPermissions.js.map +1 -1
- package/dist/utilities/getEntityPermissions/populateFieldPermissions.js.map +1 -1
- package/dist/utilities/getVersionsConfig.d.ts +4 -0
- package/dist/utilities/getVersionsConfig.d.ts.map +1 -1
- package/dist/utilities/getVersionsConfig.js +5 -0
- package/dist/utilities/getVersionsConfig.js.map +1 -1
- package/dist/utilities/handleEndpoints.d.ts.map +1 -1
- package/dist/utilities/handleEndpoints.js +10 -9
- package/dist/utilities/handleEndpoints.js.map +1 -1
- package/dist/utilities/httpStatus.d.ts +0 -2
- package/dist/utilities/httpStatus.d.ts.map +1 -1
- package/dist/utilities/httpStatus.js +1 -3
- package/dist/utilities/httpStatus.js.map +1 -1
- package/dist/utilities/initTransaction.d.ts.map +1 -1
- package/dist/utilities/initTransaction.js +7 -35
- package/dist/utilities/initTransaction.js.map +1 -1
- package/dist/utilities/killTransaction.d.ts.map +1 -1
- package/dist/utilities/killTransaction.js +0 -27
- package/dist/utilities/killTransaction.js.map +1 -1
- package/dist/utilities/parseParams/index.js.map +1 -1
- package/dist/utilities/parseValidationLocale.js.map +1 -1
- package/dist/utilities/sanitizePopulateParam.js.map +1 -1
- package/dist/utilities/telemetry/conf/index.d.ts +4 -1
- package/dist/utilities/telemetry/conf/index.d.ts.map +1 -1
- package/dist/utilities/telemetry/conf/index.js.map +1 -1
- package/dist/utilities/telemetry/featureInfo/getFeatureInfo.js.map +1 -1
- package/dist/versions/allLocalesPublicationStatus.js.map +1 -1
- package/dist/versions/buildCollectionFields.d.ts.map +1 -1
- package/dist/versions/buildCollectionFields.js +0 -23
- package/dist/versions/buildCollectionFields.js.map +1 -1
- package/dist/versions/buildGlobalFields.d.ts.map +1 -1
- package/dist/versions/buildGlobalFields.js +0 -14
- package/dist/versions/buildGlobalFields.js.map +1 -1
- package/dist/versions/buildVersionCompoundIndexes.d.ts.map +1 -1
- package/dist/versions/buildVersionCompoundIndexes.js +2 -8
- package/dist/versions/buildVersionCompoundIndexes.js.map +1 -1
- package/dist/versions/deleteCollectionVersions.d.ts +1 -2
- package/dist/versions/deleteCollectionVersions.d.ts.map +1 -1
- package/dist/versions/deleteCollectionVersions.js +8 -37
- package/dist/versions/deleteCollectionVersions.js.map +1 -1
- package/dist/versions/deleteScheduledPublishJobs.d.ts.map +1 -1
- package/dist/versions/deleteScheduledPublishJobs.js +0 -4
- package/dist/versions/deleteScheduledPublishJobs.js.map +1 -1
- package/dist/versions/drafts/appendVersionToQueryKey.d.ts.map +1 -1
- package/dist/versions/drafts/appendVersionToQueryKey.js +1 -9
- package/dist/versions/drafts/appendVersionToQueryKey.js.map +1 -1
- package/dist/versions/drafts/replaceWithDraftIfAvailable.d.ts.map +1 -1
- package/dist/versions/drafts/replaceWithDraftIfAvailable.js +1 -8
- package/dist/versions/drafts/replaceWithDraftIfAvailable.js.map +1 -1
- package/dist/versions/enforceMaxVersions.d.ts +0 -1
- package/dist/versions/enforceMaxVersions.d.ts.map +1 -1
- package/dist/versions/enforceMaxVersions.js +6 -22
- package/dist/versions/enforceMaxVersions.js.map +1 -1
- package/dist/versions/getLatestCollectionVersion.d.ts.map +1 -1
- package/dist/versions/getLatestCollectionVersion.js +2 -10
- package/dist/versions/getLatestCollectionVersion.js.map +1 -1
- package/dist/versions/getLatestGlobalVersion.d.ts +2 -6
- package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
- package/dist/versions/getLatestGlobalVersion.js +21 -65
- package/dist/versions/getLatestGlobalVersion.js.map +1 -1
- package/dist/versions/isInheritedReadVersionsAccess.js.map +1 -1
- package/dist/versions/saveVersion.d.ts +0 -7
- package/dist/versions/saveVersion.d.ts.map +1 -1
- package/dist/versions/saveVersion.js +4 -27
- package/dist/versions/saveVersion.js.map +1 -1
- package/dist/versions/updateLatestVersion.d.ts +0 -1
- package/dist/versions/updateLatestVersion.d.ts.map +1 -1
- package/dist/versions/updateLatestVersion.js +7 -24
- package/dist/versions/updateLatestVersion.js.map +1 -1
- package/package.json +30 -28
- package/skills/payload/reference/ENDPOINTS.md +3 -9
- package/skills/payload/reference/PLUGIN-DEVELOPMENT.md +4 -4
- package/dist/admin/getAdminPreferences.d.ts +0 -10
- package/dist/admin/getAdminPreferences.d.ts.map +0 -1
- package/dist/admin/getAdminPreferences.js +0 -53
- package/dist/admin/getAdminPreferences.js.map +0 -1
- package/dist/admin/getRequestBranch.d.ts +0 -6
- package/dist/admin/getRequestBranch.d.ts.map +0 -1
- package/dist/admin/getRequestBranch.js +0 -17
- package/dist/admin/getRequestBranch.js.map +0 -1
- package/dist/branching/appendBranchFilter.d.ts +0 -30
- package/dist/branching/appendBranchFilter.d.ts.map +0 -1
- package/dist/branching/appendBranchFilter.js +0 -105
- package/dist/branching/appendBranchFilter.js.map +0 -1
- package/dist/branching/assertBranchAccess.d.ts +0 -10
- package/dist/branching/assertBranchAccess.d.ts.map +0 -1
- package/dist/branching/assertBranchAccess.js +0 -36
- package/dist/branching/assertBranchAccess.js.map +0 -1
- package/dist/branching/assertBranchActionAccess.d.ts +0 -10
- package/dist/branching/assertBranchActionAccess.d.ts.map +0 -1
- package/dist/branching/assertBranchActionAccess.js +0 -15
- package/dist/branching/assertBranchActionAccess.js.map +0 -1
- package/dist/branching/assertBranchCreatedDocumentsUnreferenced.d.ts +0 -53
- package/dist/branching/assertBranchCreatedDocumentsUnreferenced.d.ts.map +0 -1
- package/dist/branching/assertBranchCreatedDocumentsUnreferenced.js +0 -833
- package/dist/branching/assertBranchCreatedDocumentsUnreferenced.js.map +0 -1
- package/dist/branching/assertBranchReadable.d.ts +0 -36
- package/dist/branching/assertBranchReadable.d.ts.map +0 -1
- package/dist/branching/assertBranchReadable.js +0 -83
- package/dist/branching/assertBranchReadable.js.map +0 -1
- package/dist/branching/assertBranchUpdateAccess.d.ts +0 -8
- package/dist/branching/assertBranchUpdateAccess.d.ts.map +0 -1
- package/dist/branching/assertBranchUpdateAccess.js +0 -12
- package/dist/branching/assertBranchUpdateAccess.js.map +0 -1
- package/dist/branching/assertBranchWritable.d.ts +0 -18
- package/dist/branching/assertBranchWritable.d.ts.map +0 -1
- package/dist/branching/assertBranchWritable.js +0 -46
- package/dist/branching/assertBranchWritable.js.map +0 -1
- package/dist/branching/branchIDs.d.ts +0 -38
- package/dist/branching/branchIDs.d.ts.map +0 -1
- package/dist/branching/branchIDs.js +0 -113
- package/dist/branching/branchIDs.js.map +0 -1
- package/dist/branching/branchSelect.d.ts +0 -42
- package/dist/branching/branchSelect.d.ts.map +0 -1
- package/dist/branching/branchSelect.js +0 -97
- package/dist/branching/branchSelect.js.map +0 -1
- package/dist/branching/checkFieldAccess.d.ts +0 -21
- package/dist/branching/checkFieldAccess.d.ts.map +0 -1
- package/dist/branching/checkFieldAccess.js +0 -238
- package/dist/branching/checkFieldAccess.js.map +0 -1
- package/dist/branching/collections.d.ts +0 -14
- package/dist/branching/collections.d.ts.map +0 -1
- package/dist/branching/collections.js +0 -713
- package/dist/branching/collections.js.map +0 -1
- package/dist/branching/combineBranchAccess.d.ts +0 -6
- package/dist/branching/combineBranchAccess.d.ts.map +0 -1
- package/dist/branching/combineBranchAccess.js +0 -22
- package/dist/branching/combineBranchAccess.js.map +0 -1
- package/dist/branching/copyUploadFilesToBranch.d.ts +0 -9
- package/dist/branching/copyUploadFilesToBranch.d.ts.map +0 -1
- package/dist/branching/copyUploadFilesToBranch.js +0 -126
- package/dist/branching/copyUploadFilesToBranch.js.map +0 -1
- package/dist/branching/createShadowRow.d.ts +0 -70
- package/dist/branching/createShadowRow.d.ts.map +0 -1
- package/dist/branching/createShadowRow.js +0 -296
- package/dist/branching/createShadowRow.js.map +0 -1
- package/dist/branching/discard.d.ts +0 -52
- package/dist/branching/discard.d.ts.map +0 -1
- package/dist/branching/discard.js +0 -428
- package/dist/branching/discard.js.map +0 -1
- package/dist/branching/effectiveOperations.d.ts +0 -55
- package/dist/branching/effectiveOperations.d.ts.map +0 -1
- package/dist/branching/effectiveOperations.js +0 -472
- package/dist/branching/effectiveOperations.js.map +0 -1
- package/dist/branching/endpoints/discard.d.ts +0 -15
- package/dist/branching/endpoints/discard.d.ts.map +0 -1
- package/dist/branching/endpoints/discard.js +0 -55
- package/dist/branching/endpoints/discard.js.map +0 -1
- package/dist/branching/endpoints/merge.d.ts +0 -34
- package/dist/branching/endpoints/merge.d.ts.map +0 -1
- package/dist/branching/endpoints/merge.js +0 -119
- package/dist/branching/endpoints/merge.js.map +0 -1
- package/dist/branching/forkDocument.d.ts +0 -20
- package/dist/branching/forkDocument.d.ts.map +0 -1
- package/dist/branching/forkDocument.js +0 -169
- package/dist/branching/forkDocument.js.map +0 -1
- package/dist/branching/globalMergeWrites.d.ts +0 -21
- package/dist/branching/globalMergeWrites.d.ts.map +0 -1
- package/dist/branching/globalMergeWrites.js +0 -146
- package/dist/branching/globalMergeWrites.js.map +0 -1
- package/dist/branching/globals.d.ts +0 -49
- package/dist/branching/globals.d.ts.map +0 -1
- package/dist/branching/globals.js +0 -197
- package/dist/branching/globals.js.map +0 -1
- package/dist/branching/hooks.d.ts +0 -24
- package/dist/branching/hooks.d.ts.map +0 -1
- package/dist/branching/hooks.js +0 -92
- package/dist/branching/hooks.js.map +0 -1
- package/dist/branching/injectBranchFields.d.ts +0 -40
- package/dist/branching/injectBranchFields.d.ts.map +0 -1
- package/dist/branching/injectBranchFields.js +0 -229
- package/dist/branching/injectBranchFields.js.map +0 -1
- package/dist/branching/merge/applyMergeChange.d.ts +0 -27
- package/dist/branching/merge/applyMergeChange.d.ts.map +0 -1
- package/dist/branching/merge/applyMergeChange.js +0 -853
- package/dist/branching/merge/applyMergeChange.js.map +0 -1
- package/dist/branching/merge/branchMergeStatus.d.ts +0 -12
- package/dist/branching/merge/branchMergeStatus.d.ts.map +0 -1
- package/dist/branching/merge/branchMergeStatus.js +0 -74
- package/dist/branching/merge/branchMergeStatus.js.map +0 -1
- package/dist/branching/merge/executeMerge.d.ts +0 -22
- package/dist/branching/merge/executeMerge.d.ts.map +0 -1
- package/dist/branching/merge/executeMerge.js +0 -600
- package/dist/branching/merge/executeMerge.js.map +0 -1
- package/dist/branching/merge/finalizeMerge.d.ts +0 -40
- package/dist/branching/merge/finalizeMerge.d.ts.map +0 -1
- package/dist/branching/merge/finalizeMerge.js +0 -237
- package/dist/branching/merge/finalizeMerge.js.map +0 -1
- package/dist/branching/merge/mergeLedger.d.ts +0 -40
- package/dist/branching/merge/mergeLedger.d.ts.map +0 -1
- package/dist/branching/merge/mergeLedger.js +0 -130
- package/dist/branching/merge/mergeLedger.js.map +0 -1
- package/dist/branching/merge/prepareMerge.d.ts +0 -41
- package/dist/branching/merge/prepareMerge.d.ts.map +0 -1
- package/dist/branching/merge/prepareMerge.js +0 -234
- package/dist/branching/merge/prepareMerge.js.map +0 -1
- package/dist/branching/merge/recoverMerge.d.ts +0 -16
- package/dist/branching/merge/recoverMerge.d.ts.map +0 -1
- package/dist/branching/merge/recoverMerge.js +0 -199
- package/dist/branching/merge/recoverMerge.js.map +0 -1
- package/dist/branching/merge/retryFailedCleanups.d.ts +0 -36
- package/dist/branching/merge/retryFailedCleanups.d.ts.map +0 -1
- package/dist/branching/merge/retryFailedCleanups.js +0 -335
- package/dist/branching/merge/retryFailedCleanups.js.map +0 -1
- package/dist/branching/merge/utilities.d.ts +0 -35
- package/dist/branching/merge/utilities.d.ts.map +0 -1
- package/dist/branching/merge/utilities.js +0 -54
- package/dist/branching/merge/utilities.js.map +0 -1
- package/dist/branching/merge.d.ts +0 -88
- package/dist/branching/merge.d.ts.map +0 -1
- package/dist/branching/merge.js +0 -163
- package/dist/branching/merge.js.map +0 -1
- package/dist/branching/mergeWriteGuard.d.ts +0 -20
- package/dist/branching/mergeWriteGuard.d.ts.map +0 -1
- package/dist/branching/mergeWriteGuard.js +0 -27
- package/dist/branching/mergeWriteGuard.js.map +0 -1
- package/dist/branching/preflight.d.ts +0 -71
- package/dist/branching/preflight.d.ts.map +0 -1
- package/dist/branching/preflight.js +0 -757
- package/dist/branching/preflight.js.map +0 -1
- package/dist/branching/readLocalizedBranchWrite.d.ts +0 -14
- package/dist/branching/readLocalizedBranchWrite.d.ts.map +0 -1
- package/dist/branching/readLocalizedBranchWrite.js +0 -90
- package/dist/branching/readLocalizedBranchWrite.js.map +0 -1
- package/dist/branching/readMergeSnapshot.d.ts +0 -18
- package/dist/branching/readMergeSnapshot.d.ts.map +0 -1
- package/dist/branching/readMergeSnapshot.js +0 -99
- package/dist/branching/readMergeSnapshot.js.map +0 -1
- package/dist/branching/resolveBranch.d.ts +0 -153
- package/dist/branching/resolveBranch.d.ts.map +0 -1
- package/dist/branching/resolveBranch.js +0 -363
- package/dist/branching/resolveBranch.js.map +0 -1
- package/dist/branching/resolveBranchActionAccess.d.ts +0 -8
- package/dist/branching/resolveBranchActionAccess.d.ts.map +0 -1
- package/dist/branching/resolveBranchActionAccess.js +0 -9
- package/dist/branching/resolveBranchActionAccess.js.map +0 -1
- package/dist/branching/resolveBranchQuery.d.ts +0 -48
- package/dist/branching/resolveBranchQuery.d.ts.map +0 -1
- package/dist/branching/resolveBranchQuery.js +0 -115
- package/dist/branching/resolveBranchQuery.js.map +0 -1
- package/dist/branching/resolveBranchRowID.d.ts +0 -22
- package/dist/branching/resolveBranchRowID.d.ts.map +0 -1
- package/dist/branching/resolveBranchRowID.js +0 -70
- package/dist/branching/resolveBranchRowID.js.map +0 -1
- package/dist/branching/sanitizeBranchingConfig.d.ts +0 -31
- package/dist/branching/sanitizeBranchingConfig.d.ts.map +0 -1
- package/dist/branching/sanitizeBranchingConfig.js +0 -110
- package/dist/branching/sanitizeBranchingConfig.js.map +0 -1
- package/dist/branching/schedule/job.d.ts +0 -51
- package/dist/branching/schedule/job.d.ts.map +0 -1
- package/dist/branching/schedule/job.js +0 -151
- package/dist/branching/schedule/job.js.map +0 -1
- package/dist/branching/selectBranchChanges.d.ts +0 -8
- package/dist/branching/selectBranchChanges.d.ts.map +0 -1
- package/dist/branching/selectBranchChanges.js +0 -9
- package/dist/branching/selectBranchChanges.js.map +0 -1
- package/dist/branching/stripBranchMergeData.d.ts +0 -11
- package/dist/branching/stripBranchMergeData.d.ts.map +0 -1
- package/dist/branching/stripBranchMergeData.js +0 -20
- package/dist/branching/stripBranchMergeData.js.map +0 -1
- package/dist/branching/tombstone.d.ts +0 -91
- package/dist/branching/tombstone.d.ts.map +0 -1
- package/dist/branching/tombstone.js +0 -546
- package/dist/branching/tombstone.js.map +0 -1
- package/dist/branching/types.d.ts +0 -158
- package/dist/branching/types.d.ts.map +0 -1
- package/dist/branching/types.js +0 -54
- package/dist/branching/types.js.map +0 -1
- package/dist/branching/validation.d.ts +0 -47
- package/dist/branching/validation.d.ts.map +0 -1
- package/dist/branching/validation.js +0 -272
- package/dist/branching/validation.js.map +0 -1
- package/dist/branching/versions.d.ts +0 -131
- package/dist/branching/versions.d.ts.map +0 -1
- package/dist/branching/versions.js +0 -572
- package/dist/branching/versions.js.map +0 -1
- package/dist/collections/operations/utilities/createOperationRetryRequest.d.ts +0 -23
- package/dist/collections/operations/utilities/createOperationRetryRequest.d.ts.map +0 -1
- package/dist/collections/operations/utilities/createOperationRetryRequest.js +0 -683
- package/dist/collections/operations/utilities/createOperationRetryRequest.js.map +0 -1
- package/dist/fields/hooks/beforeValidate/throwOnAccessDenied.d.ts +0 -3
- package/dist/fields/hooks/beforeValidate/throwOnAccessDenied.d.ts.map +0 -1
- package/dist/fields/hooks/beforeValidate/throwOnAccessDenied.js +0 -3
- package/dist/fields/hooks/beforeValidate/throwOnAccessDenied.js.map +0 -1
- package/dist/uploads/appendBranchToFileURL.d.ts +0 -6
- package/dist/uploads/appendBranchToFileURL.d.ts.map +0 -1
- package/dist/uploads/appendBranchToFileURL.js +0 -24
- package/dist/uploads/appendBranchToFileURL.js.map +0 -1
- package/dist/uploads/deleteUploadFilesExclusiveToDocument.d.ts +0 -15
- package/dist/uploads/deleteUploadFilesExclusiveToDocument.d.ts.map +0 -1
- package/dist/uploads/deleteUploadFilesExclusiveToDocument.js +0 -62
- package/dist/uploads/deleteUploadFilesExclusiveToDocument.js.map +0 -1
- package/dist/uploads/fileIdentity.d.ts +0 -24
- package/dist/uploads/fileIdentity.d.ts.map +0 -1
- package/dist/uploads/fileIdentity.js +0 -36
- package/dist/uploads/fileIdentity.js.map +0 -1
- package/dist/uploads/fileQuarantine.d.ts +0 -17
- package/dist/uploads/fileQuarantine.d.ts.map +0 -1
- package/dist/uploads/fileQuarantine.js +0 -52
- package/dist/uploads/fileQuarantine.js.map +0 -1
- package/dist/uploads/linkFileWithoutOverwrite.d.ts +0 -13
- package/dist/uploads/linkFileWithoutOverwrite.d.ts.map +0 -1
- package/dist/uploads/linkFileWithoutOverwrite.js +0 -13
- package/dist/uploads/linkFileWithoutOverwrite.js.map +0 -1
- package/dist/uploads/uploadFileRollback.d.ts +0 -31
- package/dist/uploads/uploadFileRollback.d.ts.map +0 -1
- package/dist/uploads/uploadFileRollback.js +0 -269
- package/dist/uploads/uploadFileRollback.js.map +0 -1
- package/dist/utilities/extractRelationshipID.d.ts +0 -4
- package/dist/utilities/extractRelationshipID.d.ts.map +0 -1
- package/dist/utilities/extractRelationshipID.js +0 -14
- package/dist/utilities/extractRelationshipID.js.map +0 -1
- package/dist/utilities/transactionCallbacks.d.ts +0 -77
- package/dist/utilities/transactionCallbacks.d.ts.map +0 -1
- package/dist/utilities/transactionCallbacks.js +0 -299
- package/dist/utilities/transactionCallbacks.js.map +0 -1
- package/dist/utilities/transactionMutationTracker.d.ts +0 -21
- package/dist/utilities/transactionMutationTracker.d.ts.map +0 -1
- package/dist/utilities/transactionMutationTracker.js +0 -71
- package/dist/utilities/transactionMutationTracker.js.map +0 -1
|
@@ -2,10 +2,7 @@ import fs from 'fs/promises';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { APIError, ErrorDeletingFile } from '../errors/index.js';
|
|
4
4
|
import { httpStatus } from '../utilities/httpStatus.js';
|
|
5
|
-
import { beginDeferredCleanupScopeIfNeeded, clearDeferredCleanupScope, flushDeferredCleanupScope, scheduleAfterTransactionCommit } from '../utilities/transactionCallbacks.js';
|
|
6
5
|
import { fileExists } from './fileExists.js';
|
|
7
|
-
import { getFileIdentity, hasRenameStableFileIdentity } from './fileIdentity.js';
|
|
8
|
-
import { discardQuarantinedFile, quarantineFile, restoreQuarantinedFile } from './fileQuarantine.js';
|
|
9
6
|
import { withLegacyUploadFileData } from './fileVersioning/storedFiles.js';
|
|
10
7
|
export const deleteAssociatedFiles = async ({ collectionConfig, config, doc, files = [], overrideDelete, req })=>{
|
|
11
8
|
if (!collectionConfig.upload) {
|
|
@@ -19,94 +16,42 @@ export const deleteAssociatedFiles = async ({ collectionConfig, config, doc, fil
|
|
|
19
16
|
if (collectionConfig.versions || stored.original) {
|
|
20
17
|
return;
|
|
21
18
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
19
|
+
if (overrideDelete || files.length > 0) {
|
|
20
|
+
const { staticDir: staticPath } = collectionConfig.upload;
|
|
21
|
+
const fileToDelete = resolveFilePath({
|
|
22
|
+
filename: doc.filename,
|
|
23
|
+
staticPath
|
|
24
|
+
});
|
|
25
|
+
try {
|
|
26
|
+
await deleteFile({
|
|
27
|
+
filePath: fileToDelete,
|
|
31
28
|
staticPath
|
|
32
29
|
});
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
} catch (ignore) {
|
|
31
|
+
throw new ErrorDeletingFile(req.t);
|
|
32
|
+
}
|
|
33
|
+
if (doc.variants) {
|
|
34
|
+
const sizes = Object.values(doc.variants);
|
|
35
|
+
// Since forEach will not wait until unlink is finished it could
|
|
36
|
+
// happen that two operations will try to delete the same file.
|
|
37
|
+
// To avoid this it is recommended to use "sync" instead
|
|
38
|
+
for (const size of sizes){
|
|
39
|
+
const sizeToDelete = resolveFilePath({
|
|
40
|
+
filename: size.filename,
|
|
37
41
|
staticPath
|
|
38
42
|
});
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
// Since forEach will not wait until unlink is finished it could
|
|
43
|
-
// happen that two operations will try to delete the same file.
|
|
44
|
-
// To avoid this it is recommended to use "sync" instead
|
|
45
|
-
for (const variant of variants){
|
|
46
|
-
const variantToDelete = resolveFilePath({
|
|
47
|
-
filename: variant.filename,
|
|
43
|
+
try {
|
|
44
|
+
await deleteFile({
|
|
45
|
+
filePath: sizeToDelete,
|
|
48
46
|
staticPath
|
|
49
47
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
filePath: variantToDelete,
|
|
53
|
-
req,
|
|
54
|
-
staticPath
|
|
55
|
-
});
|
|
56
|
-
}
|
|
48
|
+
} catch (ignore) {
|
|
49
|
+
throw new ErrorDeletingFile(req.t);
|
|
57
50
|
}
|
|
58
51
|
}
|
|
59
52
|
}
|
|
60
|
-
if (cleanupScope) {
|
|
61
|
-
await flushDeferredCleanupScope({
|
|
62
|
-
req,
|
|
63
|
-
scope: cleanupScope
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
} catch (error) {
|
|
67
|
-
if (cleanupScope) {
|
|
68
|
-
clearDeferredCleanupScope({
|
|
69
|
-
req,
|
|
70
|
-
scope: cleanupScope
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
throw error;
|
|
74
53
|
}
|
|
75
54
|
};
|
|
76
|
-
const scheduleFileDeletion = async ({ filePath, req, staticPath })=>{
|
|
77
|
-
let isFileDeletionSafe;
|
|
78
|
-
try {
|
|
79
|
-
isFileDeletionSafe = await assertFileDeletionIsSafe({
|
|
80
|
-
filePath,
|
|
81
|
-
staticPath
|
|
82
|
-
});
|
|
83
|
-
} catch (ignore) {
|
|
84
|
-
throw new ErrorDeletingFile(req.t);
|
|
85
|
-
}
|
|
86
|
-
if (!isFileDeletionSafe) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
const fileIdentity = await getFileIdentity({
|
|
90
|
-
filePath: filePath
|
|
91
|
-
});
|
|
92
|
-
if (!fileIdentity) {
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
await scheduleAfterTransactionCommit({
|
|
96
|
-
callback: async ()=>{
|
|
97
|
-
try {
|
|
98
|
-
await deleteFile({
|
|
99
|
-
fileIdentity,
|
|
100
|
-
filePath,
|
|
101
|
-
staticPath
|
|
102
|
-
});
|
|
103
|
-
} catch (ignore) {
|
|
104
|
-
throw new ErrorDeletingFile(req.t);
|
|
105
|
-
}
|
|
106
|
-
},
|
|
107
|
-
req
|
|
108
|
-
});
|
|
109
|
-
};
|
|
110
55
|
const resolveFilePath = ({ filename, staticPath })=>{
|
|
111
56
|
if (!filename || !staticPath) {
|
|
112
57
|
return;
|
|
@@ -121,37 +66,13 @@ const resolveFilePath = ({ filename, staticPath })=>{
|
|
|
121
66
|
}
|
|
122
67
|
return filePath;
|
|
123
68
|
};
|
|
124
|
-
const deleteFile = async ({
|
|
125
|
-
if (!
|
|
126
|
-
filePath,
|
|
127
|
-
staticPath
|
|
128
|
-
})) {
|
|
69
|
+
const deleteFile = async ({ filePath, staticPath })=>{
|
|
70
|
+
if (!filePath || !staticPath) {
|
|
129
71
|
return;
|
|
130
72
|
}
|
|
131
|
-
|
|
132
|
-
filePath: filePath
|
|
133
|
-
});
|
|
134
|
-
if (!quarantinedFile) {
|
|
73
|
+
if (!await fileExists(filePath)) {
|
|
135
74
|
return;
|
|
136
75
|
}
|
|
137
|
-
if (!hasRenameStableFileIdentity({
|
|
138
|
-
actual: quarantinedFile.fileIdentity,
|
|
139
|
-
expected: fileIdentity
|
|
140
|
-
})) {
|
|
141
|
-
await restoreQuarantinedFile({
|
|
142
|
-
quarantinedFile,
|
|
143
|
-
targetFilePath: filePath
|
|
144
|
-
});
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
await discardQuarantinedFile({
|
|
148
|
-
quarantinedFile
|
|
149
|
-
});
|
|
150
|
-
};
|
|
151
|
-
const assertFileDeletionIsSafe = async ({ filePath, staticPath })=>{
|
|
152
|
-
if (!filePath || !staticPath || !await fileExists(filePath)) {
|
|
153
|
-
return false;
|
|
154
|
-
}
|
|
155
76
|
const [resolvedDir, resolvedParent] = await Promise.all([
|
|
156
77
|
fs.realpath(staticPath),
|
|
157
78
|
fs.realpath(path.dirname(filePath))
|
|
@@ -163,7 +84,7 @@ const assertFileDeletionIsSafe = async ({ filePath, staticPath })=>{
|
|
|
163
84
|
})) {
|
|
164
85
|
throw new APIError('Invalid filename.', httpStatus.BAD_REQUEST);
|
|
165
86
|
}
|
|
166
|
-
|
|
87
|
+
await fs.unlink(filePath);
|
|
167
88
|
};
|
|
168
89
|
const isWithinDirectory = ({ directory, target })=>{
|
|
169
90
|
const relativePath = path.relative(directory, target);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/uploads/deleteAssociatedFiles.ts"],"sourcesContent":["import fs from 'fs/promises'\nimport path from 'path'\n\nimport type { SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { FileIdentity } from './fileIdentity.js'\nimport type { FileData, FileToSave } from './types.js'\n\nimport { APIError, ErrorDeletingFile } from '../errors/index.js'\nimport { httpStatus } from '../utilities/httpStatus.js'\nimport {\n beginDeferredCleanupScopeIfNeeded,\n clearDeferredCleanupScope,\n flushDeferredCleanupScope,\n scheduleAfterTransactionCommit,\n} from '../utilities/transactionCallbacks.js'\nimport { fileExists } from './fileExists.js'\nimport { getFileIdentity, hasRenameStableFileIdentity } from './fileIdentity.js'\nimport { discardQuarantinedFile, quarantineFile, restoreQuarantinedFile } from './fileQuarantine.js'\nimport { withLegacyUploadFileData } from './fileVersioning/storedFiles.js'\n\ntype Args = {\n collectionConfig: SanitizedCollectionConfig\n config: SanitizedConfig\n doc: Record<string, unknown>\n files?: FileToSave[]\n overrideDelete: boolean\n req: PayloadRequest\n}\n\nexport const deleteAssociatedFiles: (args: Args) => Promise<void> = async ({\n collectionConfig,\n config,\n doc,\n files = [],\n overrideDelete,\n req,\n}) => {\n if (!collectionConfig.upload) {\n return\n }\n const stored = withLegacyUploadFileData({ collection: collectionConfig, config, doc })\n\n if (collectionConfig.versions || stored.original) {\n return\n }\n\n const cleanupScope = await beginDeferredCleanupScopeIfNeeded({ req })\n const replacementFilePaths = new Set(files.map((file) => path.resolve(file.path)))\n\n try {\n if (overrideDelete || files.length > 0) {\n const { staticDir: staticPath } = collectionConfig.upload\n\n const fileToDelete = resolveFilePath({\n filename: doc.filename as string,\n staticPath,\n })\n\n if (fileToDelete && !replacementFilePaths.has(fileToDelete)) {\n await scheduleFileDeletion({ filePath: fileToDelete, req, staticPath })\n }\n\n if (doc.variants) {\n const variants: FileData[] = Object.values(doc.variants)\n // Since forEach will not wait until unlink is finished it could\n // happen that two operations will try to delete the same file.\n // To avoid this it is recommended to use \"sync\" instead\n\n for (const variant of variants) {\n const variantToDelete = resolveFilePath({ filename: variant.filename, staticPath })\n if (variantToDelete && !replacementFilePaths.has(variantToDelete)) {\n await scheduleFileDeletion({ filePath: variantToDelete, req, staticPath })\n }\n }\n }\n }\n\n if (cleanupScope) {\n await flushDeferredCleanupScope({ req, scope: cleanupScope })\n }\n } catch (error) {\n if (cleanupScope) {\n clearDeferredCleanupScope({ req, scope: cleanupScope })\n }\n\n throw error\n }\n}\n\nconst scheduleFileDeletion = async ({\n filePath,\n req,\n staticPath,\n}: {\n filePath?: string\n req: PayloadRequest\n staticPath?: string\n}): Promise<void> => {\n let isFileDeletionSafe: boolean\n\n try {\n isFileDeletionSafe = await assertFileDeletionIsSafe({ filePath, staticPath })\n } catch (ignore) {\n throw new ErrorDeletingFile(req.t)\n }\n\n if (!isFileDeletionSafe) {\n return\n }\n\n const fileIdentity = await getFileIdentity({ filePath: filePath! })\n\n if (!fileIdentity) {\n return\n }\n\n await scheduleAfterTransactionCommit({\n callback: async () => {\n try {\n await deleteFile({ fileIdentity, filePath, staticPath })\n } catch (ignore) {\n throw new ErrorDeletingFile(req.t)\n }\n },\n req,\n })\n}\n\nconst resolveFilePath = ({\n filename,\n staticPath,\n}: {\n filename?: null | string\n staticPath?: string\n}) => {\n if (!filename || !staticPath) {\n return\n }\n\n const resolvedDir = path.resolve(staticPath)\n const filePath = path.resolve(resolvedDir, filename)\n\n if (!isWithinDirectory({ directory: resolvedDir, target: filePath })) {\n throw new APIError('Invalid filename.', httpStatus.BAD_REQUEST)\n }\n\n return filePath\n}\n\nconst deleteFile = async ({\n fileIdentity,\n filePath,\n staticPath,\n}: {\n fileIdentity: FileIdentity\n filePath?: string\n staticPath?: string\n}) => {\n if (!(await assertFileDeletionIsSafe({ filePath, staticPath }))) {\n return\n }\n\n const quarantinedFile = await quarantineFile({ filePath: filePath! })\n\n if (!quarantinedFile) {\n return\n }\n\n if (\n !hasRenameStableFileIdentity({ actual: quarantinedFile.fileIdentity, expected: fileIdentity })\n ) {\n await restoreQuarantinedFile({ quarantinedFile, targetFilePath: filePath! })\n return\n }\n\n await discardQuarantinedFile({ quarantinedFile })\n}\n\nconst assertFileDeletionIsSafe = async ({\n filePath,\n staticPath,\n}: {\n filePath?: string\n staticPath?: string\n}): Promise<boolean> => {\n if (!filePath || !staticPath || !(await fileExists(filePath))) {\n return false\n }\n\n const [resolvedDir, resolvedParent] = await Promise.all([\n fs.realpath(staticPath),\n fs.realpath(path.dirname(filePath)),\n ])\n const resolvedTarget = path.join(resolvedParent, path.basename(filePath))\n\n if (!isWithinDirectory({ directory: resolvedDir, target: resolvedTarget })) {\n throw new APIError('Invalid filename.', httpStatus.BAD_REQUEST)\n }\n\n return true\n}\n\nconst isWithinDirectory = ({ directory, target }: { directory: string; target: string }) => {\n const relativePath = path.relative(directory, target)\n\n return (\n relativePath === '' ||\n (relativePath !== '..' &&\n !relativePath.startsWith(`..${path.sep}`) &&\n !path.isAbsolute(relativePath))\n )\n}\n"],"names":["fs","path","APIError","ErrorDeletingFile","httpStatus","beginDeferredCleanupScopeIfNeeded","clearDeferredCleanupScope","flushDeferredCleanupScope","scheduleAfterTransactionCommit","fileExists","getFileIdentity","hasRenameStableFileIdentity","discardQuarantinedFile","quarantineFile","restoreQuarantinedFile","withLegacyUploadFileData","deleteAssociatedFiles","collectionConfig","config","doc","files","overrideDelete","req","upload","stored","collection","versions","original","cleanupScope","replacementFilePaths","Set","map","file","resolve","length","staticDir","staticPath","fileToDelete","resolveFilePath","filename","has","scheduleFileDeletion","filePath","variants","Object","values","variant","variantToDelete","scope","error","isFileDeletionSafe","assertFileDeletionIsSafe","ignore","t","fileIdentity","callback","deleteFile","resolvedDir","isWithinDirectory","directory","target","BAD_REQUEST","quarantinedFile","actual","expected","targetFilePath","resolvedParent","Promise","all","realpath","dirname","resolvedTarget","join","basename","relativePath","relative","startsWith","sep","isAbsolute"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/deleteAssociatedFiles.ts"],"sourcesContent":["import fs from 'fs/promises'\nimport path from 'path'\n\nimport type { SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { FileData, FileToSave } from './types.js'\n\nimport { APIError, ErrorDeletingFile } from '../errors/index.js'\nimport { httpStatus } from '../utilities/httpStatus.js'\nimport { fileExists } from './fileExists.js'\nimport { withLegacyUploadFileData } from './fileVersioning/storedFiles.js'\n\ntype Args = {\n collectionConfig: SanitizedCollectionConfig\n config: SanitizedConfig\n doc: Record<string, unknown>\n files?: FileToSave[]\n overrideDelete: boolean\n req: PayloadRequest\n}\n\nexport const deleteAssociatedFiles: (args: Args) => Promise<void> = async ({\n collectionConfig,\n config,\n doc,\n files = [],\n overrideDelete,\n req,\n}) => {\n if (!collectionConfig.upload) {\n return\n }\n const stored = withLegacyUploadFileData({ collection: collectionConfig, config, doc })\n\n if (collectionConfig.versions || stored.original) {\n return\n }\n if (overrideDelete || files.length > 0) {\n const { staticDir: staticPath } = collectionConfig.upload\n\n const fileToDelete = resolveFilePath({\n filename: doc.filename as string,\n staticPath,\n })\n\n try {\n await deleteFile({ filePath: fileToDelete, staticPath })\n } catch (ignore) {\n throw new ErrorDeletingFile(req.t)\n }\n\n if (doc.variants) {\n const sizes: FileData[] = Object.values(doc.variants)\n // Since forEach will not wait until unlink is finished it could\n // happen that two operations will try to delete the same file.\n // To avoid this it is recommended to use \"sync\" instead\n\n for (const size of sizes) {\n const sizeToDelete = resolveFilePath({ filename: size.filename, staticPath })\n try {\n await deleteFile({ filePath: sizeToDelete, staticPath })\n } catch (ignore) {\n throw new ErrorDeletingFile(req.t)\n }\n }\n }\n }\n}\n\nconst resolveFilePath = ({\n filename,\n staticPath,\n}: {\n filename?: null | string\n staticPath?: string\n}) => {\n if (!filename || !staticPath) {\n return\n }\n\n const resolvedDir = path.resolve(staticPath)\n const filePath = path.resolve(resolvedDir, filename)\n\n if (!isWithinDirectory({ directory: resolvedDir, target: filePath })) {\n throw new APIError('Invalid filename.', httpStatus.BAD_REQUEST)\n }\n\n return filePath\n}\n\nconst deleteFile = async ({ filePath, staticPath }: { filePath?: string; staticPath?: string }) => {\n if (!filePath || !staticPath) {\n return\n }\n\n if (!(await fileExists(filePath))) {\n return\n }\n\n const [resolvedDir, resolvedParent] = await Promise.all([\n fs.realpath(staticPath),\n fs.realpath(path.dirname(filePath)),\n ])\n const resolvedTarget = path.join(resolvedParent, path.basename(filePath))\n\n if (!isWithinDirectory({ directory: resolvedDir, target: resolvedTarget })) {\n throw new APIError('Invalid filename.', httpStatus.BAD_REQUEST)\n }\n\n await fs.unlink(filePath)\n}\n\nconst isWithinDirectory = ({ directory, target }: { directory: string; target: string }) => {\n const relativePath = path.relative(directory, target)\n\n return (\n relativePath === '' ||\n (relativePath !== '..' &&\n !relativePath.startsWith(`..${path.sep}`) &&\n !path.isAbsolute(relativePath))\n )\n}\n"],"names":["fs","path","APIError","ErrorDeletingFile","httpStatus","fileExists","withLegacyUploadFileData","deleteAssociatedFiles","collectionConfig","config","doc","files","overrideDelete","req","upload","stored","collection","versions","original","length","staticDir","staticPath","fileToDelete","resolveFilePath","filename","deleteFile","filePath","ignore","t","variants","sizes","Object","values","size","sizeToDelete","resolvedDir","resolve","isWithinDirectory","directory","target","BAD_REQUEST","resolvedParent","Promise","all","realpath","dirname","resolvedTarget","join","basename","unlink","relativePath","relative","startsWith","sep","isAbsolute"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFile.d.ts","sourceRoot":"","sources":["../../../src/uploads/endpoints/getFile.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"getFile.d.ts","sourceRoot":"","sources":["../../../src/uploads/endpoints/getFile.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAiBvD,eAAO,MAAM,cAAc,EAAE,cAmD5B,CAAA;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,EACzC,UAAU,EACV,GAAG,EACH,QAAQ,EACR,SAAkB,EAClB,MAAM,EACN,GAAG,GACJ,EAAE;IACD,UAAU,EAAE,UAAU,CAAA;IACtB,GAAG,CAAC,EAAE,UAAU,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,oBAAoB,CAAA;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiJpB"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { fileTypeFromFile } from 'file-type';
|
|
2
2
|
import fsPromises from 'fs/promises';
|
|
3
3
|
import path from 'path';
|
|
4
|
-
import { assertBranchReadable } from '../../branching/assertBranchReadable.js';
|
|
5
4
|
import { APIError } from '../../errors/APIError.js';
|
|
6
5
|
import { NotFound } from '../../errors/NotFound.js';
|
|
7
6
|
import { getRequestCollection } from '../../utilities/getRequestEntity.js';
|
|
@@ -23,10 +22,6 @@ export const getFileHandler = async (req)=>{
|
|
|
23
22
|
if (!collection.config.upload) {
|
|
24
23
|
throw new APIError(`This collection is not an upload collection: ${collection.config.slug}`, httpStatus.BAD_REQUEST);
|
|
25
24
|
}
|
|
26
|
-
await assertBranchReadable({
|
|
27
|
-
collectionSlug: collection.config.slug,
|
|
28
|
-
req
|
|
29
|
-
});
|
|
30
25
|
const versionID = req.searchParams?.get('version');
|
|
31
26
|
if (collection.config.versions && versionID) {
|
|
32
27
|
const historical = await resolveHistoricalFile({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/uploads/endpoints/getFile.ts"],"sourcesContent":["import type { Stats } from 'fs'\n\nimport { fileTypeFromFile } from 'file-type'\nimport fsPromises from 'fs/promises'\nimport path from 'path'\n\nimport type { Collection, TypeWithID } from '../../collections/config/types.js'\nimport type { PayloadHandler } from '../../config/types.js'\nimport type { PayloadRequest } from '../../types/index.js'\nimport type { FileHandlerOperation } from '../types.js'\n\nimport { assertBranchReadable } from '../../branching/assertBranchReadable.js'\nimport { APIError } from '../../errors/APIError.js'\nimport { NotFound } from '../../errors/NotFound.js'\nimport { getRequestCollection } from '../../utilities/getRequestEntity.js'\nimport { headersWithCors } from '../../utilities/headersWithCors.js'\nimport { httpStatus } from '../../utilities/httpStatus.js'\nimport { checkFileAccess } from '../checkFileAccess.js'\nimport { streamFile } from '../fetchAPI-stream-file/index.js'\nimport { resolveHistoricalFile } from '../fileVersioning/resolveHistoricalFile.js'\nimport { getFileTypeFallback } from '../getFileTypeFallback.js'\nimport { getFileExtension, isXmlMimeType } from '../getFileTypeIdentity.js'\nimport { parseRangeHeader } from '../parseRangeHeader.js'\nimport { handleDynamicFileRequest } from '../transformers/handleDynamicFileRequest.js'\nimport { resolveUploadDocument } from '../transformers/resolveUploadDocument.js'\nimport { uploadContentSecurityPolicy } from '../uploadContentSecurityPolicy.js'\n\nexport const getFileHandler: PayloadHandler = async (req) => {\n const collection = getRequestCollection(req)\n\n const filename = req.routeParams?.filename as string\n const prefix = req.searchParams?.get('prefix') ?? undefined\n\n if (!collection.config.upload) {\n throw new APIError(\n `This collection is not an upload collection: ${collection.config.slug}`,\n httpStatus.BAD_REQUEST,\n )\n }\n\n await assertBranchReadable({ collectionSlug: collection.config.slug, req })\n\n const versionID = req.searchParams?.get('version')\n\n if (collection.config.versions && versionID) {\n const historical = await resolveHistoricalFile({\n collection,\n filename,\n prefix,\n req,\n versionID,\n })\n\n return retrieveFileResponse({ collection, doc: historical, filename, prefix, req })\n }\n\n if (req.payload.config.upload.transformers.length > 0) {\n return handleDynamicFileRequest({ collection, filename, prefix, req })\n }\n\n const accessResult = (await checkFileAccess({\n collection,\n filename,\n prefix,\n req,\n }))!\n\n if (accessResult instanceof Response) {\n return accessResult\n }\n\n const current = collection.config.versions\n ? (accessResult ?? (await resolveUploadDocument({ collection, filename, prefix, req })))\n : undefined\n\n if (collection.config.versions && !current) {\n throw new NotFound(req.t)\n }\n\n return retrieveFileResponse({ collection, doc: accessResult ?? current, filename, prefix, req })\n}\n\n/**\n * Shared by the ordinary `read` endpoint and, via `operation: 'transform'`, by\n * `getSourceFileResponse` for internal source retrieval. `transform` ignores the\n * `Range` header and skips `modifyResponseHeaders`/CORS wrapping, since those are\n * applied once, later, to the transformer pipeline's final response.\n */\nexport async function retrieveFileResponse({\n collection,\n doc,\n filename,\n operation = 'read',\n prefix,\n req,\n}: {\n collection: Collection\n doc?: TypeWithID\n filename: string\n operation?: FileHandlerOperation\n prefix?: string\n req: PayloadRequest\n}): Promise<Response> {\n if (collection.config.upload && collection.config.upload.handlers?.length) {\n let customResponse: null | Response | void = null\n const headers = new Headers()\n\n for (const handler of collection.config.upload.handlers) {\n customResponse = await handler(req, {\n doc: doc!,\n headers,\n params: {\n collection: collection.config.slug,\n filename,\n operation,\n prefix,\n },\n })\n if (customResponse && customResponse instanceof Response) {\n break\n }\n }\n\n if (customResponse instanceof Response) {\n return customResponse\n }\n }\n\n // Local filesystem fallback — cloud storage handlers return a Response above\n // and have their own filename validation via sanitizeFilename.\n const fileDir = collection.config.upload?.staticDir || collection.config.slug\n const resolvedDir = path.resolve(fileDir)\n const filePath = path.resolve(resolvedDir, filename)\n\n if (!filePath.startsWith(resolvedDir + path.sep)) {\n throw new APIError('Invalid filename.', httpStatus.BAD_REQUEST)\n }\n\n let stats: Stats\n\n try {\n stats = await fsPromises.stat(filePath)\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n req.payload.logger.error(\n `File ${filename} for collection ${collection.config.slug} is missing on the disk. Expected path: ${filePath}`,\n )\n\n // Omit going to the routeError handler by returning response instead of\n // throwing an error to cut down log noise. The response still matches what you get with APIError to not leak details to the user.\n return Response.json(\n {\n errors: [\n {\n message: 'Something went wrong.',\n },\n ],\n },\n {\n headers: headersWithCors({\n headers: new Headers(),\n req,\n }),\n status: 500,\n },\n )\n }\n\n throw err\n }\n\n const fileTypeResult = (await fileTypeFromFile(filePath)) || getFileTypeFallback(filePath)\n let mimeType = fileTypeResult.mime\n\n if (\n getFileExtension(filePath).toLowerCase() === 'svg' &&\n fileTypeResult.mime === 'application/xml'\n ) {\n mimeType = 'image/svg+xml'\n }\n\n const isTransformSource = operation === 'transform'\n\n // The client's Range header must never leak into an internal source retrieval —\n // a transformer needs the complete original bytes to decode.\n const rangeHeader = isTransformSource ? null : req.headers.get('range')\n const rangeResult = parseRangeHeader({\n fileSize: stats.size,\n rangeHeader,\n })\n\n if (rangeResult.type === 'invalid') {\n let headers = new Headers()\n headers.set('Content-Range', `bytes */${stats.size}`)\n headers = collection.config.upload?.modifyResponseHeaders\n ? collection.config.upload.modifyResponseHeaders({ headers }) || headers\n : headers\n\n return new Response(null, {\n headers: headersWithCors({\n headers,\n req,\n }),\n status: httpStatus.REQUESTED_RANGE_NOT_SATISFIABLE,\n })\n }\n\n let headers = new Headers()\n headers.set('Content-Type', mimeType)\n headers.set('Accept-Ranges', 'bytes')\n\n if (isXmlMimeType(mimeType)) {\n headers.set('Content-Security-Policy', uploadContentSecurityPolicy)\n }\n\n let data: ReadableStream\n let status: number\n const isPartial = rangeResult.type === 'partial'\n const range = rangeResult.range\n\n if (isPartial && range) {\n const contentLength = range.end - range.start + 1\n headers.set('Content-Length', String(contentLength))\n headers.set('Content-Range', `bytes ${range.start}-${range.end}/${stats.size}`)\n data = streamFile({ filePath, options: { end: range.end, start: range.start } })\n status = httpStatus.PARTIAL_CONTENT\n } else {\n headers.set('Content-Length', String(stats.size))\n data = streamFile({ filePath })\n status = httpStatus.OK\n }\n\n if (isTransformSource) {\n return new Response(data, { headers, status })\n }\n\n headers = collection.config.upload?.modifyResponseHeaders\n ? collection.config.upload.modifyResponseHeaders({ headers }) || headers\n : headers\n\n return new Response(data, {\n headers: headersWithCors({\n headers,\n req,\n }),\n status,\n })\n}\n"],"names":["fileTypeFromFile","fsPromises","path","assertBranchReadable","APIError","NotFound","getRequestCollection","headersWithCors","httpStatus","checkFileAccess","streamFile","resolveHistoricalFile","getFileTypeFallback","getFileExtension","isXmlMimeType","parseRangeHeader","handleDynamicFileRequest","resolveUploadDocument","uploadContentSecurityPolicy","getFileHandler","req","collection","filename","routeParams","prefix","searchParams","get","undefined","config","upload","slug","BAD_REQUEST","collectionSlug","versionID","versions","historical","retrieveFileResponse","doc","payload","transformers","length","accessResult","Response","current","t","operation","handlers","customResponse","headers","Headers","handler","params","fileDir","staticDir","resolvedDir","resolve","filePath","startsWith","sep","stats","stat","err","code","logger","error","json","errors","message","status","fileTypeResult","mimeType","mime","toLowerCase","isTransformSource","rangeHeader","rangeResult","fileSize","size","type","set","modifyResponseHeaders","REQUESTED_RANGE_NOT_SATISFIABLE","data","isPartial","range","contentLength","end","start","String","options","PARTIAL_CONTENT","OK"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/uploads/endpoints/getFile.ts"],"sourcesContent":["import type { Stats } from 'fs'\n\nimport { fileTypeFromFile } from 'file-type'\nimport fsPromises from 'fs/promises'\nimport path from 'path'\n\nimport type { Collection, TypeWithID } from '../../collections/config/types.js'\nimport type { PayloadHandler } from '../../config/types.js'\nimport type { PayloadRequest } from '../../types/index.js'\nimport type { FileHandlerOperation } from '../types.js'\n\nimport { APIError } from '../../errors/APIError.js'\nimport { NotFound } from '../../errors/NotFound.js'\nimport { getRequestCollection } from '../../utilities/getRequestEntity.js'\nimport { headersWithCors } from '../../utilities/headersWithCors.js'\nimport { httpStatus } from '../../utilities/httpStatus.js'\nimport { checkFileAccess } from '../checkFileAccess.js'\nimport { streamFile } from '../fetchAPI-stream-file/index.js'\nimport { resolveHistoricalFile } from '../fileVersioning/resolveHistoricalFile.js'\nimport { getFileTypeFallback } from '../getFileTypeFallback.js'\nimport { getFileExtension, isXmlMimeType } from '../getFileTypeIdentity.js'\nimport { parseRangeHeader } from '../parseRangeHeader.js'\nimport { handleDynamicFileRequest } from '../transformers/handleDynamicFileRequest.js'\nimport { resolveUploadDocument } from '../transformers/resolveUploadDocument.js'\nimport { uploadContentSecurityPolicy } from '../uploadContentSecurityPolicy.js'\n\nexport const getFileHandler: PayloadHandler = async (req) => {\n const collection = getRequestCollection(req)\n\n const filename = req.routeParams?.filename as string\n const prefix = req.searchParams?.get('prefix') ?? undefined\n\n if (!collection.config.upload) {\n throw new APIError(\n `This collection is not an upload collection: ${collection.config.slug}`,\n httpStatus.BAD_REQUEST,\n )\n }\n\n const versionID = req.searchParams?.get('version')\n\n if (collection.config.versions && versionID) {\n const historical = await resolveHistoricalFile({\n collection,\n filename,\n prefix,\n req,\n versionID,\n })\n\n return retrieveFileResponse({ collection, doc: historical, filename, prefix, req })\n }\n\n if (req.payload.config.upload.transformers.length > 0) {\n return handleDynamicFileRequest({ collection, filename, prefix, req })\n }\n\n const accessResult = (await checkFileAccess({\n collection,\n filename,\n prefix,\n req,\n }))!\n\n if (accessResult instanceof Response) {\n return accessResult\n }\n\n const current = collection.config.versions\n ? (accessResult ?? (await resolveUploadDocument({ collection, filename, prefix, req })))\n : undefined\n\n if (collection.config.versions && !current) {\n throw new NotFound(req.t)\n }\n\n return retrieveFileResponse({ collection, doc: accessResult ?? current, filename, prefix, req })\n}\n\n/**\n * Shared by the ordinary `read` endpoint and, via `operation: 'transform'`, by\n * `getSourceFileResponse` for internal source retrieval. `transform` ignores the\n * `Range` header and skips `modifyResponseHeaders`/CORS wrapping, since those are\n * applied once, later, to the transformer pipeline's final response.\n */\nexport async function retrieveFileResponse({\n collection,\n doc,\n filename,\n operation = 'read',\n prefix,\n req,\n}: {\n collection: Collection\n doc?: TypeWithID\n filename: string\n operation?: FileHandlerOperation\n prefix?: string\n req: PayloadRequest\n}): Promise<Response> {\n if (collection.config.upload && collection.config.upload.handlers?.length) {\n let customResponse: null | Response | void = null\n const headers = new Headers()\n\n for (const handler of collection.config.upload.handlers) {\n customResponse = await handler(req, {\n doc: doc!,\n headers,\n params: {\n collection: collection.config.slug,\n filename,\n operation,\n prefix,\n },\n })\n if (customResponse && customResponse instanceof Response) {\n break\n }\n }\n\n if (customResponse instanceof Response) {\n return customResponse\n }\n }\n\n // Local filesystem fallback — cloud storage handlers return a Response above\n // and have their own filename validation via sanitizeFilename.\n const fileDir = collection.config.upload?.staticDir || collection.config.slug\n const resolvedDir = path.resolve(fileDir)\n const filePath = path.resolve(resolvedDir, filename)\n\n if (!filePath.startsWith(resolvedDir + path.sep)) {\n throw new APIError('Invalid filename.', httpStatus.BAD_REQUEST)\n }\n\n let stats: Stats\n\n try {\n stats = await fsPromises.stat(filePath)\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') {\n req.payload.logger.error(\n `File ${filename} for collection ${collection.config.slug} is missing on the disk. Expected path: ${filePath}`,\n )\n\n // Omit going to the routeError handler by returning response instead of\n // throwing an error to cut down log noise. The response still matches what you get with APIError to not leak details to the user.\n return Response.json(\n {\n errors: [\n {\n message: 'Something went wrong.',\n },\n ],\n },\n {\n headers: headersWithCors({\n headers: new Headers(),\n req,\n }),\n status: 500,\n },\n )\n }\n\n throw err\n }\n\n const fileTypeResult = (await fileTypeFromFile(filePath)) || getFileTypeFallback(filePath)\n let mimeType = fileTypeResult.mime\n\n if (\n getFileExtension(filePath).toLowerCase() === 'svg' &&\n fileTypeResult.mime === 'application/xml'\n ) {\n mimeType = 'image/svg+xml'\n }\n\n const isTransformSource = operation === 'transform'\n\n // The client's Range header must never leak into an internal source retrieval —\n // a transformer needs the complete original bytes to decode.\n const rangeHeader = isTransformSource ? null : req.headers.get('range')\n const rangeResult = parseRangeHeader({\n fileSize: stats.size,\n rangeHeader,\n })\n\n if (rangeResult.type === 'invalid') {\n let headers = new Headers()\n headers.set('Content-Range', `bytes */${stats.size}`)\n headers = collection.config.upload?.modifyResponseHeaders\n ? collection.config.upload.modifyResponseHeaders({ headers }) || headers\n : headers\n\n return new Response(null, {\n headers: headersWithCors({\n headers,\n req,\n }),\n status: httpStatus.REQUESTED_RANGE_NOT_SATISFIABLE,\n })\n }\n\n let headers = new Headers()\n headers.set('Content-Type', mimeType)\n headers.set('Accept-Ranges', 'bytes')\n\n if (isXmlMimeType(mimeType)) {\n headers.set('Content-Security-Policy', uploadContentSecurityPolicy)\n }\n\n let data: ReadableStream\n let status: number\n const isPartial = rangeResult.type === 'partial'\n const range = rangeResult.range\n\n if (isPartial && range) {\n const contentLength = range.end - range.start + 1\n headers.set('Content-Length', String(contentLength))\n headers.set('Content-Range', `bytes ${range.start}-${range.end}/${stats.size}`)\n data = streamFile({ filePath, options: { end: range.end, start: range.start } })\n status = httpStatus.PARTIAL_CONTENT\n } else {\n headers.set('Content-Length', String(stats.size))\n data = streamFile({ filePath })\n status = httpStatus.OK\n }\n\n if (isTransformSource) {\n return new Response(data, { headers, status })\n }\n\n headers = collection.config.upload?.modifyResponseHeaders\n ? collection.config.upload.modifyResponseHeaders({ headers }) || headers\n : headers\n\n return new Response(data, {\n headers: headersWithCors({\n headers,\n req,\n }),\n status,\n })\n}\n"],"names":["fileTypeFromFile","fsPromises","path","APIError","NotFound","getRequestCollection","headersWithCors","httpStatus","checkFileAccess","streamFile","resolveHistoricalFile","getFileTypeFallback","getFileExtension","isXmlMimeType","parseRangeHeader","handleDynamicFileRequest","resolveUploadDocument","uploadContentSecurityPolicy","getFileHandler","req","collection","filename","routeParams","prefix","searchParams","get","undefined","config","upload","slug","BAD_REQUEST","versionID","versions","historical","retrieveFileResponse","doc","payload","transformers","length","accessResult","Response","current","t","operation","handlers","customResponse","headers","Headers","handler","params","fileDir","staticDir","resolvedDir","resolve","filePath","startsWith","sep","stats","stat","err","code","logger","error","json","errors","message","status","fileTypeResult","mimeType","mime","toLowerCase","isTransformSource","rangeHeader","rangeResult","fileSize","size","type","set","modifyResponseHeaders","REQUESTED_RANGE_NOT_SATISFIABLE","data","isPartial","range","contentLength","end","start","String","options","PARTIAL_CONTENT","OK"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileExists.d.ts","sourceRoot":"","sources":["../../src/uploads/fileExists.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,aAAoB,MAAM,KAAG,OAAO,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"fileExists.d.ts","sourceRoot":"","sources":["../../src/uploads/fileExists.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,aAAoB,MAAM,KAAG,OAAO,CAAC,OAAO,CAQlE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/uploads/fileExists.ts"],"sourcesContent":["import fs from 'fs/promises'\n\nexport const fileExists = async (filename: string): Promise<boolean> => {\n try {\n await fs.stat(filename)\n\n return true\n } catch (
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/fileExists.ts"],"sourcesContent":["import fs from 'fs/promises'\n\nexport const fileExists = async (filename: string): Promise<boolean> => {\n try {\n await fs.stat(filename)\n\n return true\n } catch (ignore) {\n return false\n }\n}\n"],"names":["fs","fileExists","filename","stat","ignore"],"mappings":"AAAA,OAAOA,QAAQ,cAAa;AAE5B,OAAO,MAAMC,aAAa,OAAOC;IAC/B,IAAI;QACF,MAAMF,GAAGG,IAAI,CAACD;QAEd,OAAO;IACT,EAAE,OAAOE,QAAQ;QACf,OAAO;IACT;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/uploads/fileVersioning/archive.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAElF,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/uploads/fileVersioning/archive.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAElF,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAuBhD,eAAO,MAAM,kBAAkB,GAAU,CAAC,yDAQvC;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,OAAO,EAAE,UAAU,CAAA;IACnB,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;IACnB,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAA;CACxB,KAAG,OAAO,CAAC,CAAC,CA0DZ,CAAA;AA4BD,gGAAgG;AAChG,eAAO,MAAM,yBAAyB,+DAOnC;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,OAAO,EAAE,UAAU,CAAA;IACnB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,IAAI,EAAE,UAAU,CAAA;IAChB,GAAG,EAAE,cAAc,CAAA;IACnB,iBAAiB,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAA;CAClD,KAAG,OAAO,CAAC,IAAI,CAkHf,CAAA;AA2CD,eAAO,MAAM,2BAA2B,sCAIrC;IACD,KAAK,EAAE,cAAc,CAAA;IACrB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,OAAO,EAAE,UAAU,CAAA;CACpB,KAAG,UAAU,GAAG,SA+ChB,CAAA"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import { resolveBranchRowID } from '../../branching/resolveBranchRowID.js';
|
|
4
|
-
import { branchField, branchParentField } from '../../branching/types.js';
|
|
5
3
|
import { saveVersion } from '../../versions/saveVersion.js';
|
|
6
4
|
import { removeUnreferencedStagedObjects, scheduleUnreferencedFileCleanup } from './cleanup.js';
|
|
7
5
|
import { runFileOperationPlan, stageLocalUploadFiles } from './fileOperationManager.js';
|
|
@@ -181,12 +179,6 @@ export const runLocalFileUpdate = async ({ id, collection, current, files, next,
|
|
|
181
179
|
collection: collection.slug,
|
|
182
180
|
req,
|
|
183
181
|
versionData: {
|
|
184
|
-
...row[branchField] !== undefined ? {
|
|
185
|
-
[branchField]: row[branchField]
|
|
186
|
-
} : {},
|
|
187
|
-
...row[branchParentField] !== undefined ? {
|
|
188
|
-
[branchParentField]: row[branchParentField]
|
|
189
|
-
} : {},
|
|
190
182
|
createdAt: row.createdAt,
|
|
191
183
|
latest: row.latest,
|
|
192
184
|
parent: row.parent,
|
|
@@ -218,13 +210,7 @@ const getOutgoingLocalFiles = ({ collection, config, current, next, req })=>{
|
|
|
218
210
|
return currentFiles.filter((file)=>!nextIdentities.has(getStoredFileIdentity(file)));
|
|
219
211
|
};
|
|
220
212
|
const getVersions = async ({ id, collection, req })=>{
|
|
221
|
-
const versionParent = await resolveBranchRowID({
|
|
222
|
-
id,
|
|
223
|
-
collectionSlug: collection.slug,
|
|
224
|
-
req
|
|
225
|
-
});
|
|
226
213
|
const { docs } = await req.payload.db.findVersions({
|
|
227
|
-
branch: false,
|
|
228
214
|
collection: collection.slug,
|
|
229
215
|
limit: 0,
|
|
230
216
|
pagination: false,
|
|
@@ -232,7 +218,7 @@ const getVersions = async ({ id, collection, req })=>{
|
|
|
232
218
|
sort: '-updatedAt',
|
|
233
219
|
where: {
|
|
234
220
|
parent: {
|
|
235
|
-
equals:
|
|
221
|
+
equals: id
|
|
236
222
|
}
|
|
237
223
|
}
|
|
238
224
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/uploads/fileVersioning/archive.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { Config } from '../../config/types.js'\nimport type { JsonObject, PayloadRequest } from '../../types/index.js'\nimport type { FileToSave } from '../types.js'\nimport type { StagedObject } from './fileOperationManager.js'\nimport type { StoredFileList } from './types.js'\n\nimport { resolveBranchRowID } from '../../branching/resolveBranchRowID.js'\nimport { branchField, branchParentField } from '../../branching/types.js'\nimport { saveVersion } from '../../versions/saveVersion.js'\nimport { removeUnreferencedStagedObjects, scheduleUnreferencedFileCleanup } from './cleanup.js'\nimport { runFileOperationPlan, stageLocalUploadFiles } from './fileOperationManager.js'\nimport { copyLocalFile } from './localStorage.js'\nimport { getArchivedFilename } from './naming.js'\nimport {\n collectStoredFiles,\n getStoredFileIdentity,\n withLegacyUploadFileData,\n} from './storedFiles.js'\n\ntype VersionRow = {\n [branchField]?: null | string\n [branchParentField]?: null | number | string\n createdAt: string\n id: number | string\n latest?: boolean\n parent: number | string\n publishedLocale?: string\n updatedAt: string\n version: JsonObject\n}\n\nexport const runLocalFileUpdate = async <T>({\n id,\n collection,\n current,\n files,\n next,\n req,\n write,\n}: {\n collection: SanitizedCollectionConfig\n current: JsonObject\n files: FileToSave[]\n id: number | string\n next: JsonObject\n req: PayloadRequest\n write: () => Promise<T>\n}): Promise<T> => {\n const storedCurrent = withLegacyUploadFileData({\n collection,\n config: req.payload.config,\n doc: current,\n })\n const nextDoc = { ...storedCurrent, ...next }\n\n if (\n !hasLocalFileChange({\n collection,\n config: req.payload.config,\n current,\n hasNewFiles: files.length > 0,\n next: nextDoc,\n req,\n })\n ) {\n return write()\n }\n\n return runFileOperationPlan({\n cleanupStagedAfterWriteFailure: (objects) =>\n removeUnreferencedStagedObjects({ collection, objects, req }),\n req,\n stage: ({ trackStagedObject }) =>\n stageLocalUploadFiles({\n files,\n staticDir: collection.upload.staticDir!,\n trackStagedObject,\n }),\n write: async ({ trackStagedObject }) => {\n await archiveOutgoingLocalFiles({\n id,\n collection,\n current,\n next: nextDoc,\n req,\n trackStagedObject,\n })\n\n const result = await write()\n\n await scheduleUnreferencedFileCleanup({\n candidates: getOutgoingLocalFiles({\n collection,\n config: req.payload.config,\n current,\n next: nextDoc,\n req,\n }),\n collection,\n req,\n })\n\n return result\n },\n })\n}\n\n/** Also detects removals, which have no new upload to stage. */\nconst hasLocalFileChange = ({\n collection,\n config,\n current,\n hasNewFiles,\n next,\n req,\n}: {\n collection: SanitizedCollectionConfig\n config: Pick<Config, 'routes' | 'serverURL'>\n current: JsonObject\n hasNewFiles: boolean\n next: JsonObject\n req: PayloadRequest\n}): boolean =>\n !collection.upload.disableLocalStorage &&\n (hasNewFiles ||\n getOutgoingLocalFiles({\n collection,\n config,\n current,\n next,\n req,\n }).length > 0)\n\n/** Preserves outgoing local objects and repairs every retained version that referenced them. */\nexport const archiveOutgoingLocalFiles = async ({\n id,\n collection,\n current,\n next,\n req,\n trackStagedObject,\n}: {\n collection: SanitizedCollectionConfig\n current: JsonObject\n id: number | string\n next: JsonObject\n req: PayloadRequest\n trackStagedObject: (object: StagedObject) => void\n}): Promise<void> => {\n const outgoing = getOutgoingLocalFiles({\n collection,\n config: req.payload.config,\n current,\n next,\n req,\n })\n\n if (!outgoing.length || !collection.versions) {\n return\n }\n\n const currentWithState = withLegacyUploadFileData({\n collection,\n config: req.payload.config,\n doc: current,\n })\n let versions = await getVersions({ id, collection, req })\n\n if (!versions.length) {\n await saveVersion({\n id,\n collection,\n docWithLocales: currentWithState,\n draft: false,\n operation: 'update',\n payload: req.payload,\n req,\n })\n versions = await getVersions({ id, collection, req })\n }\n\n const replacements = new Map<string, string>()\n for (const file of outgoing) {\n const identity = getStoredFileIdentity(file)\n const newestVersion = versions.find(({ version }) => {\n const stored = withLegacyUploadFileData({\n collection,\n config: req.payload.config,\n doc: version,\n })\n\n return collectStoredFiles({ collection, doc: stored, req }).some(\n (candidate) => getStoredFileIdentity(candidate) === identity,\n )\n })\n\n if (!newestVersion) {\n continue\n }\n\n const directory = path.posix.dirname(file.key)\n let archivedKey: string\n let suffix = 0\n\n while (true) {\n const archivedFilename = getArchivedFilename({\n filename: path.posix.basename(file.key),\n versionID: suffix ? `${newestVersion.id}-${suffix}` : newestVersion.id,\n })\n archivedKey = directory === '.' ? archivedFilename : `${directory}/${archivedFilename}`\n\n try {\n await copyLocalFile({\n from: file.key,\n staticDir: collection.upload.staticDir!,\n to: archivedKey,\n })\n break\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'EEXIST') {\n throw err\n }\n suffix += 1\n }\n }\n trackStagedObject({\n key: archivedKey,\n remove: () => fs.rm(path.join(collection.upload.staticDir!, archivedKey), { force: true }),\n })\n replacements.set(identity, archivedKey)\n }\n\n for (const row of versions) {\n const stored = withLegacyUploadFileData({\n collection,\n config: req.payload.config,\n doc: row.version,\n })\n const version = replaceStoredFileReferences({\n files: collectStoredFiles({ collection, doc: stored, req }),\n replacements,\n version: stored,\n })\n\n if (!version) {\n continue\n }\n\n await req.payload.db.updateVersion({\n id: row.id,\n collection: collection.slug,\n req,\n versionData: {\n ...(row[branchField] !== undefined ? { [branchField]: row[branchField] } : {}),\n ...(row[branchParentField] !== undefined\n ? { [branchParentField]: row[branchParentField] }\n : {}),\n createdAt: row.createdAt,\n latest: row.latest,\n parent: row.parent,\n publishedLocale: row.publishedLocale,\n updatedAt: row.updatedAt,\n version,\n },\n })\n }\n}\n\nconst getOutgoingLocalFiles = ({\n collection,\n config,\n current,\n next,\n req,\n}: {\n collection: SanitizedCollectionConfig\n config: Pick<Config, 'routes' | 'serverURL'>\n current: JsonObject\n next: JsonObject\n req: PayloadRequest\n}): StoredFileList => {\n const currentWithState = withLegacyUploadFileData({ collection, config, doc: current })\n const currentFiles = collectStoredFiles({ collection, doc: currentWithState, req })\n const nextFiles = collectStoredFiles({ collection, doc: next, req, trustGenerated: true })\n const nextIdentities = new Set(nextFiles.map(getStoredFileIdentity))\n return currentFiles.filter((file) => !nextIdentities.has(getStoredFileIdentity(file)))\n}\n\nconst getVersions = async ({\n id,\n collection,\n req,\n}: {\n collection: SanitizedCollectionConfig\n id: number | string\n req: PayloadRequest\n}): Promise<VersionRow[]> => {\n const versionParent = await resolveBranchRowID({\n id,\n collectionSlug: collection.slug,\n req,\n })\n const { docs } = await req.payload.db.findVersions<JsonObject>({\n branch: false,\n collection: collection.slug,\n limit: 0,\n pagination: false,\n req,\n sort: '-updatedAt',\n where: { parent: { equals: versionParent } },\n })\n\n return docs as VersionRow[]\n}\n\nexport const replaceStoredFileReferences = ({\n files,\n replacements,\n version,\n}: {\n files: StoredFileList\n replacements: Map<string, string>\n version: JsonObject\n}): JsonObject | undefined => {\n if (!files.length) {\n return\n }\n\n const archived = structuredClone(version)\n let hasChanged = false\n\n for (const file of files) {\n const archivedKey = replacements.get(getStoredFileIdentity(file))\n\n if (!archivedKey) {\n continue\n }\n\n const archivedFilename = path.posix.basename(archivedKey)\n\n for (const role of file.roles) {\n let stored: JsonObject | undefined\n switch (role.type) {\n case 'default':\n stored = archived\n break\n case 'original':\n stored = archived.original as JsonObject | undefined\n break\n case 'size':\n stored = (archived.variants as Record<string, JsonObject> | undefined)?.[role.sizeKey]\n break\n }\n\n if (typeof stored?.filename === 'string') {\n const previousFilename = stored.filename\n const directory = path.posix.dirname(previousFilename)\n const filename = directory === '.' ? archivedFilename : `${directory}/${archivedFilename}`\n stored.filename = filename\n stored.url = replaceURLFilename({\n filename,\n previousFilename,\n url: stored.url,\n })\n hasChanged = true\n }\n }\n }\n\n return hasChanged ? archived : undefined\n}\n\nconst replaceURLFilename = ({\n filename,\n previousFilename,\n url,\n}: {\n filename: string\n previousFilename: string\n url: unknown\n}): unknown => {\n if (typeof url !== 'string') {\n return url\n }\n\n const previous = encodeURIComponent(previousFilename)\n const index = url.lastIndexOf(`/${previous}`)\n\n return index < 0\n ? url\n : `${url.slice(0, index + 1)}${encodeURIComponent(filename)}${url.slice(index + 1 + previous.length)}`\n}\n"],"names":["fs","path","resolveBranchRowID","branchField","branchParentField","saveVersion","removeUnreferencedStagedObjects","scheduleUnreferencedFileCleanup","runFileOperationPlan","stageLocalUploadFiles","copyLocalFile","getArchivedFilename","collectStoredFiles","getStoredFileIdentity","withLegacyUploadFileData","runLocalFileUpdate","id","collection","current","files","next","req","write","storedCurrent","config","payload","doc","nextDoc","hasLocalFileChange","hasNewFiles","length","cleanupStagedAfterWriteFailure","objects","stage","trackStagedObject","staticDir","upload","archiveOutgoingLocalFiles","result","candidates","getOutgoingLocalFiles","disableLocalStorage","outgoing","versions","currentWithState","getVersions","docWithLocales","draft","operation","replacements","Map","file","identity","newestVersion","find","version","stored","some","candidate","directory","posix","dirname","key","archivedKey","suffix","archivedFilename","filename","basename","versionID","from","to","err","code","remove","rm","join","force","set","row","replaceStoredFileReferences","db","updateVersion","slug","versionData","undefined","createdAt","latest","parent","publishedLocale","updatedAt","currentFiles","nextFiles","trustGenerated","nextIdentities","Set","map","filter","has","versionParent","collectionSlug","docs","findVersions","branch","limit","pagination","sort","where","equals","archived","structuredClone","hasChanged","get","role","roles","type","original","variants","sizeKey","previousFilename","url","replaceURLFilename","previous","encodeURIComponent","index","lastIndexOf","slice"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/uploads/fileVersioning/archive.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { Config } from '../../config/types.js'\nimport type { JsonObject, PayloadRequest } from '../../types/index.js'\nimport type { FileToSave } from '../types.js'\nimport type { StagedObject } from './fileOperationManager.js'\nimport type { StoredFileList } from './types.js'\n\nimport { saveVersion } from '../../versions/saveVersion.js'\nimport { removeUnreferencedStagedObjects, scheduleUnreferencedFileCleanup } from './cleanup.js'\nimport { runFileOperationPlan, stageLocalUploadFiles } from './fileOperationManager.js'\nimport { copyLocalFile } from './localStorage.js'\nimport { getArchivedFilename } from './naming.js'\nimport {\n collectStoredFiles,\n getStoredFileIdentity,\n withLegacyUploadFileData,\n} from './storedFiles.js'\n\ntype VersionRow = {\n createdAt: string\n id: number | string\n latest?: boolean\n parent: number | string\n publishedLocale?: string\n updatedAt: string\n version: JsonObject\n}\n\nexport const runLocalFileUpdate = async <T>({\n id,\n collection,\n current,\n files,\n next,\n req,\n write,\n}: {\n collection: SanitizedCollectionConfig\n current: JsonObject\n files: FileToSave[]\n id: number | string\n next: JsonObject\n req: PayloadRequest\n write: () => Promise<T>\n}): Promise<T> => {\n const storedCurrent = withLegacyUploadFileData({\n collection,\n config: req.payload.config,\n doc: current,\n })\n const nextDoc = { ...storedCurrent, ...next }\n\n if (\n !hasLocalFileChange({\n collection,\n config: req.payload.config,\n current,\n hasNewFiles: files.length > 0,\n next: nextDoc,\n req,\n })\n ) {\n return write()\n }\n\n return runFileOperationPlan({\n cleanupStagedAfterWriteFailure: (objects) =>\n removeUnreferencedStagedObjects({ collection, objects, req }),\n req,\n stage: ({ trackStagedObject }) =>\n stageLocalUploadFiles({\n files,\n staticDir: collection.upload.staticDir!,\n trackStagedObject,\n }),\n write: async ({ trackStagedObject }) => {\n await archiveOutgoingLocalFiles({\n id,\n collection,\n current,\n next: nextDoc,\n req,\n trackStagedObject,\n })\n\n const result = await write()\n\n await scheduleUnreferencedFileCleanup({\n candidates: getOutgoingLocalFiles({\n collection,\n config: req.payload.config,\n current,\n next: nextDoc,\n req,\n }),\n collection,\n req,\n })\n\n return result\n },\n })\n}\n\n/** Also detects removals, which have no new upload to stage. */\nconst hasLocalFileChange = ({\n collection,\n config,\n current,\n hasNewFiles,\n next,\n req,\n}: {\n collection: SanitizedCollectionConfig\n config: Pick<Config, 'routes' | 'serverURL'>\n current: JsonObject\n hasNewFiles: boolean\n next: JsonObject\n req: PayloadRequest\n}): boolean =>\n !collection.upload.disableLocalStorage &&\n (hasNewFiles ||\n getOutgoingLocalFiles({\n collection,\n config,\n current,\n next,\n req,\n }).length > 0)\n\n/** Preserves outgoing local objects and repairs every retained version that referenced them. */\nexport const archiveOutgoingLocalFiles = async ({\n id,\n collection,\n current,\n next,\n req,\n trackStagedObject,\n}: {\n collection: SanitizedCollectionConfig\n current: JsonObject\n id: number | string\n next: JsonObject\n req: PayloadRequest\n trackStagedObject: (object: StagedObject) => void\n}): Promise<void> => {\n const outgoing = getOutgoingLocalFiles({\n collection,\n config: req.payload.config,\n current,\n next,\n req,\n })\n\n if (!outgoing.length || !collection.versions) {\n return\n }\n\n const currentWithState = withLegacyUploadFileData({\n collection,\n config: req.payload.config,\n doc: current,\n })\n let versions = await getVersions({ id, collection, req })\n\n if (!versions.length) {\n await saveVersion({\n id,\n collection,\n docWithLocales: currentWithState,\n draft: false,\n operation: 'update',\n payload: req.payload,\n req,\n })\n versions = await getVersions({ id, collection, req })\n }\n\n const replacements = new Map<string, string>()\n for (const file of outgoing) {\n const identity = getStoredFileIdentity(file)\n const newestVersion = versions.find(({ version }) => {\n const stored = withLegacyUploadFileData({\n collection,\n config: req.payload.config,\n doc: version,\n })\n\n return collectStoredFiles({ collection, doc: stored, req }).some(\n (candidate) => getStoredFileIdentity(candidate) === identity,\n )\n })\n\n if (!newestVersion) {\n continue\n }\n\n const directory = path.posix.dirname(file.key)\n let archivedKey: string\n let suffix = 0\n\n while (true) {\n const archivedFilename = getArchivedFilename({\n filename: path.posix.basename(file.key),\n versionID: suffix ? `${newestVersion.id}-${suffix}` : newestVersion.id,\n })\n archivedKey = directory === '.' ? archivedFilename : `${directory}/${archivedFilename}`\n\n try {\n await copyLocalFile({\n from: file.key,\n staticDir: collection.upload.staticDir!,\n to: archivedKey,\n })\n break\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'EEXIST') {\n throw err\n }\n suffix += 1\n }\n }\n trackStagedObject({\n key: archivedKey,\n remove: () => fs.rm(path.join(collection.upload.staticDir!, archivedKey), { force: true }),\n })\n replacements.set(identity, archivedKey)\n }\n\n for (const row of versions) {\n const stored = withLegacyUploadFileData({\n collection,\n config: req.payload.config,\n doc: row.version,\n })\n const version = replaceStoredFileReferences({\n files: collectStoredFiles({ collection, doc: stored, req }),\n replacements,\n version: stored,\n })\n\n if (!version) {\n continue\n }\n\n await req.payload.db.updateVersion({\n id: row.id,\n collection: collection.slug,\n req,\n versionData: {\n createdAt: row.createdAt,\n latest: row.latest,\n parent: row.parent,\n publishedLocale: row.publishedLocale,\n updatedAt: row.updatedAt,\n version,\n },\n })\n }\n}\n\nconst getOutgoingLocalFiles = ({\n collection,\n config,\n current,\n next,\n req,\n}: {\n collection: SanitizedCollectionConfig\n config: Pick<Config, 'routes' | 'serverURL'>\n current: JsonObject\n next: JsonObject\n req: PayloadRequest\n}): StoredFileList => {\n const currentWithState = withLegacyUploadFileData({ collection, config, doc: current })\n const currentFiles = collectStoredFiles({ collection, doc: currentWithState, req })\n const nextFiles = collectStoredFiles({ collection, doc: next, req, trustGenerated: true })\n const nextIdentities = new Set(nextFiles.map(getStoredFileIdentity))\n return currentFiles.filter((file) => !nextIdentities.has(getStoredFileIdentity(file)))\n}\n\nconst getVersions = async ({\n id,\n collection,\n req,\n}: {\n collection: SanitizedCollectionConfig\n id: number | string\n req: PayloadRequest\n}): Promise<VersionRow[]> => {\n const { docs } = await req.payload.db.findVersions<JsonObject>({\n collection: collection.slug,\n limit: 0,\n pagination: false,\n req,\n sort: '-updatedAt',\n where: { parent: { equals: id } },\n })\n\n return docs\n}\n\nexport const replaceStoredFileReferences = ({\n files,\n replacements,\n version,\n}: {\n files: StoredFileList\n replacements: Map<string, string>\n version: JsonObject\n}): JsonObject | undefined => {\n if (!files.length) {\n return\n }\n\n const archived = structuredClone(version)\n let hasChanged = false\n\n for (const file of files) {\n const archivedKey = replacements.get(getStoredFileIdentity(file))\n\n if (!archivedKey) {\n continue\n }\n\n const archivedFilename = path.posix.basename(archivedKey)\n\n for (const role of file.roles) {\n let stored: JsonObject | undefined\n switch (role.type) {\n case 'default':\n stored = archived\n break\n case 'original':\n stored = archived.original as JsonObject | undefined\n break\n case 'size':\n stored = (archived.variants as Record<string, JsonObject> | undefined)?.[role.sizeKey]\n break\n }\n\n if (typeof stored?.filename === 'string') {\n const previousFilename = stored.filename\n const directory = path.posix.dirname(previousFilename)\n const filename = directory === '.' ? archivedFilename : `${directory}/${archivedFilename}`\n stored.filename = filename\n stored.url = replaceURLFilename({\n filename,\n previousFilename,\n url: stored.url,\n })\n hasChanged = true\n }\n }\n }\n\n return hasChanged ? archived : undefined\n}\n\nconst replaceURLFilename = ({\n filename,\n previousFilename,\n url,\n}: {\n filename: string\n previousFilename: string\n url: unknown\n}): unknown => {\n if (typeof url !== 'string') {\n return url\n }\n\n const previous = encodeURIComponent(previousFilename)\n const index = url.lastIndexOf(`/${previous}`)\n\n return index < 0\n ? url\n : `${url.slice(0, index + 1)}${encodeURIComponent(filename)}${url.slice(index + 1 + previous.length)}`\n}\n"],"names":["fs","path","saveVersion","removeUnreferencedStagedObjects","scheduleUnreferencedFileCleanup","runFileOperationPlan","stageLocalUploadFiles","copyLocalFile","getArchivedFilename","collectStoredFiles","getStoredFileIdentity","withLegacyUploadFileData","runLocalFileUpdate","id","collection","current","files","next","req","write","storedCurrent","config","payload","doc","nextDoc","hasLocalFileChange","hasNewFiles","length","cleanupStagedAfterWriteFailure","objects","stage","trackStagedObject","staticDir","upload","archiveOutgoingLocalFiles","result","candidates","getOutgoingLocalFiles","disableLocalStorage","outgoing","versions","currentWithState","getVersions","docWithLocales","draft","operation","replacements","Map","file","identity","newestVersion","find","version","stored","some","candidate","directory","posix","dirname","key","archivedKey","suffix","archivedFilename","filename","basename","versionID","from","to","err","code","remove","rm","join","force","set","row","replaceStoredFileReferences","db","updateVersion","slug","versionData","createdAt","latest","parent","publishedLocale","updatedAt","currentFiles","nextFiles","trustGenerated","nextIdentities","Set","map","filter","has","docs","findVersions","limit","pagination","sort","where","equals","archived","structuredClone","hasChanged","get","role","roles","type","original","variants","sizeKey","previousFilename","url","replaceURLFilename","undefined","previous","encodeURIComponent","index","lastIndexOf","slice"],"mappings":"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"}
|
|
@@ -14,13 +14,6 @@ export declare const collectVersionFiles: ({ collection, parentID, req, where, }
|
|
|
14
14
|
req: PayloadRequest;
|
|
15
15
|
where?: Where;
|
|
16
16
|
}) => Promise<StoredFileList>;
|
|
17
|
-
/** Collects every stored file that can become unreferenced when a document is deleted. */
|
|
18
|
-
export declare const collectDocumentDeleteFileCandidates: ({ collection, doc, parentID, req, }: {
|
|
19
|
-
collection: SanitizedCollectionConfig;
|
|
20
|
-
doc: JsonObject;
|
|
21
|
-
parentID: number | string;
|
|
22
|
-
req: PayloadRequest;
|
|
23
|
-
}) => Promise<StoredFileList>;
|
|
24
17
|
/** Confirms that deleted references have no survivors before and after commit. */
|
|
25
18
|
export declare const scheduleUnreferencedFileCleanup: ({ candidates, collection, req, }: {
|
|
26
19
|
candidates: StoredFileList;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../../src/uploads/fileVersioning/cleanup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAc,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,YAAY,CAAA;AAY5D,eAAO,MAAM,kBAAkB,8BAI5B;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,GAAG,EAAE,UAAU,CAAA;IACf,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,OAAO,CAAC,cAAc,CAQzB,CAAA;AAED,qFAAqF;AACrF,eAAO,MAAM,mBAAmB,0CAK7B;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,GAAG,EAAE,cAAc,CAAA;IACnB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,KAAG,OAAO,CAAC,cAAc,CAwBzB,CAAA;AAED,
|
|
1
|
+
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../../src/uploads/fileVersioning/cleanup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAc,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,YAAY,CAAA;AAY5D,eAAO,MAAM,kBAAkB,8BAI5B;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,GAAG,EAAE,UAAU,CAAA;IACf,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,OAAO,CAAC,cAAc,CAQzB,CAAA;AAED,qFAAqF;AACrF,eAAO,MAAM,mBAAmB,0CAK7B;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,GAAG,EAAE,cAAc,CAAA;IACnB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,KAAG,OAAO,CAAC,cAAc,CAwBzB,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,+BAA+B,qCAIzC;IACD,UAAU,EAAE,cAAc,CAAA;IAC1B,UAAU,EAAE,yBAAyB,CAAA;IACrC,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,OAAO,CAAC,IAAI,CAmCf,CAAA;AAED,uGAAuG;AACvG,eAAO,MAAM,+BAA+B,kCAIzC;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,OAAO,CAAC,IAAI,CAsBf,CAAA"}
|
|
@@ -53,18 +53,6 @@ export const collectStoredFiles = async ({ collection, doc, req })=>{
|
|
|
53
53
|
page += 1;
|
|
54
54
|
}
|
|
55
55
|
};
|
|
56
|
-
/** Collects every stored file that can become unreferenced when a document is deleted. */ export const collectDocumentDeleteFileCandidates = async ({ collection, doc, parentID, req })=>[
|
|
57
|
-
...await collectStoredFiles({
|
|
58
|
-
collection,
|
|
59
|
-
doc,
|
|
60
|
-
req
|
|
61
|
-
}),
|
|
62
|
-
...collection.versions ? await collectVersionFiles({
|
|
63
|
-
collection,
|
|
64
|
-
parentID,
|
|
65
|
-
req
|
|
66
|
-
}) : []
|
|
67
|
-
];
|
|
68
56
|
/** Confirms that deleted references have no survivors before and after commit. */ export const scheduleUnreferencedFileCleanup = async ({ candidates, collection, req })=>{
|
|
69
57
|
const unique = new Map(candidates.map((file)=>[
|
|
70
58
|
getStoredFileIdentity(file),
|