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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/uploads/fileVersioning/cleanup.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { JsonObject, PayloadRequest, SelectType, Where } from '../../types/index.js'\nimport type { StagedObject } from './fileOperationManager.js'\nimport type { StoredFile, StoredFileList } from './types.js'\n\nimport { deferFileCleanup } from './fileOperationManager.js'\nimport { normalizeStorageKey } from './naming.js'\nimport {\n collectStoredFiles as collectStoredFileLocations,\n getStoredFileIdentity,\n withLegacyCloudUploadFileData,\n} from './storedFiles.js'\n\nconst pageSize = 100\n\nexport const collectStoredFiles = async ({\n collection,\n doc,\n req,\n}: {\n collection: SanitizedCollectionConfig\n doc: JsonObject\n req: PayloadRequest\n}): Promise<StoredFileList> => {\n const stored = await withLegacyCloudUploadFileData({\n collection,\n doc,\n req,\n })\n\n return collectStoredFileLocations({ collection, doc: stored, req })\n}\n\n/** Reads all saved versions in batches before a parent or its history is deleted. */\nexport const collectVersionFiles = async ({\n collection,\n parentID,\n req,\n where,\n}: {\n collection: SanitizedCollectionConfig\n parentID: number | string\n req: PayloadRequest\n where?: Where\n}): Promise<StoredFileList> => {\n const files: StoredFileList = []\n let page = 1\n\n while (true) {\n const versions = await req.payload.db.findVersions<JsonObject>({\n collection: collection.slug,\n limit: pageSize,\n page,\n req,\n where: where\n ? { and: [{ parent: { equals: parentID } }, where] }\n : { parent: { equals: parentID } },\n })\n\n for (const row of versions.docs) {\n files.push(...(await collectStoredFiles({ collection, doc: row.version, req })))\n }\n\n if (versions.docs.length < pageSize) {\n return files\n }\n page += 1\n }\n}\n\n/** Collects every stored file that can become unreferenced when a document is deleted. */\nexport const collectDocumentDeleteFileCandidates = async ({\n collection,\n doc,\n parentID,\n req,\n}: {\n collection: SanitizedCollectionConfig\n doc: JsonObject\n parentID: number | string\n req: PayloadRequest\n}): Promise<StoredFileList> => [\n ...(await collectStoredFiles({ collection, doc, req })),\n ...(collection.versions ? await collectVersionFiles({ collection, parentID, req }) : []),\n]\n\n/** Confirms that deleted references have no survivors before and after commit. */\nexport const scheduleUnreferencedFileCleanup = async ({\n candidates,\n collection,\n req,\n}: {\n candidates: StoredFileList\n collection: SanitizedCollectionConfig\n req: PayloadRequest\n}): Promise<void> => {\n const unique = new Map(candidates.map((file) => [getStoredFileIdentity(file), file]))\n\n if (!unique.size) {\n return\n }\n\n const unreferenced = await findUnreferenced({ candidates: [...unique.values()], collection, req })\n\n if (!unreferenced.length) {\n return\n }\n\n await deferFileCleanup({\n cleanup: async () => {\n const stillUnreferenced = await findUnreferenced({\n candidates: unreferenced,\n collection,\n req,\n })\n\n for (const file of stillUnreferenced) {\n try {\n await deleteStoredFile({ collection, file, req })\n } catch (err) {\n req.payload.logger.error({\n err,\n msg: `Failed to delete unreferenced upload file ${file.key}. Verify the object is unreferenced and remove it manually.`,\n })\n }\n }\n },\n req,\n shouldCleanupAfterFailure: true,\n })\n}\n\n/** Removes objects staged by a failed write unless a persisted document or version references them. */\nexport const removeUnreferencedStagedObjects = async ({\n collection,\n objects,\n req,\n}: {\n collection: SanitizedCollectionConfig\n objects: StagedObject[]\n req: PayloadRequest\n}): Promise<void> => {\n const unreferenced = await findUnreferenced({\n candidates: objects.map(({ key }) => ({ key, roles: [] })),\n collection,\n req,\n })\n const identities = new Set(unreferenced.map(getStoredFileIdentity))\n\n for (const object of objects) {\n if (!identities.has(getStoredFileIdentity(object))) {\n continue\n }\n\n try {\n await object.remove()\n } catch (err) {\n req.payload.logger.error({\n err,\n msg: `Failed to remove staged upload file ${object.key}`,\n })\n }\n }\n}\n\nconst findUnreferenced = async ({\n candidates,\n collection,\n req,\n}: {\n candidates: StoredFileList\n collection: SanitizedCollectionConfig\n req: PayloadRequest\n}): Promise<StoredFileList> => {\n const variantsField = collection.flattenedFields.find((field) => field.name === 'variants')\n const variantNames =\n variantsField?.type === 'group'\n ? variantsField.flattenedFields\n .filter(\n (field) =>\n field.type === 'group' &&\n field.flattenedFields.some((nested) => nested.name === 'filename'),\n )\n .map((field) => field.name)\n : []\n const filenamePaths = [\n 'filename',\n 'original.filename',\n ...variantNames.map((name) => `variants.${name}.filename`),\n ]\n // A removed schema field cannot prove the absence of historical references.\n // Retain those variant objects until their saved location data is migrated.\n const remaining = new Map(\n candidates\n .filter((file) =>\n file.roles.every((role) => role.type !== 'size' || variantNames.includes(role.sizeKey)),\n )\n .map((file) => [getStoredFileIdentity(file), file]),\n )\n const representationSelect: SelectType = {\n _objectKey: true,\n filename: true,\n prefix: true,\n url: true,\n }\n const select: SelectType = {\n ...representationSelect,\n filesize: true,\n mimeType: true,\n original: representationSelect,\n ...(variantNames.length\n ? { variants: Object.fromEntries(variantNames.map((name) => [name, representationSelect])) }\n : {}),\n }\n // Legacy filenames may include folders. Match every possible filename suffix,\n // then verify the adapter's complete key before accepting a reference.\n const filenames = [\n ...new Set(\n [...remaining.values()].flatMap(({ key }) => {\n const parts = normalizeStorageKey({ key }).split('/')\n return parts.map((_, index) => parts.slice(index).join('/'))\n }),\n ),\n ]\n\n for (let offset = 0; offset < filenames.length && remaining.size; offset += pageSize) {\n const batch = filenames.slice(offset, offset + pageSize)\n const where: Where = { or: filenamePaths.map((field) => ({ [field]: { in: batch } })) }\n let page = 1\n\n while (remaining.size) {\n const docs = await req.payload.db.find<JsonObject>({\n collection: collection.slug,\n limit: pageSize,\n page,\n pagination: true,\n req,\n select,\n sort: 'id',\n where,\n })\n\n for (const doc of docs.docs) {\n await removeReferenced({ collection, doc, remaining, req })\n }\n if (docs.docs.length < pageSize) {\n break\n }\n page += 1\n }\n\n if (collection.versions) {\n page = 1\n const versionWhere: Where = {\n or: filenamePaths.map((field) => ({ [`version.${field}`]: { in: batch } })),\n }\n\n while (remaining.size) {\n const versions = await req.payload.db.findVersions<JsonObject>({\n collection: collection.slug,\n limit: pageSize,\n page,\n pagination: true,\n req,\n select: { version: select },\n sort: 'id',\n where: versionWhere,\n })\n\n for (const row of versions.docs) {\n await removeReferenced({ collection, doc: row.version, remaining, req })\n }\n if (versions.docs.length < pageSize) {\n break\n }\n page += 1\n }\n }\n }\n\n return [...remaining.values()]\n}\n\nconst removeReferenced = async ({\n collection,\n doc,\n remaining,\n req,\n}: {\n collection: SanitizedCollectionConfig\n doc: JsonObject\n remaining: Map<string, StoredFile>\n req: PayloadRequest\n}): Promise<void> => {\n for (const file of await collectStoredFiles({ collection, doc, req })) {\n remaining.delete(getStoredFileIdentity(file))\n }\n}\n\nconst deleteStoredFile = async ({\n collection,\n file,\n req,\n}: {\n collection: SanitizedCollectionConfig\n file: StoredFile\n req: PayloadRequest\n}): Promise<void> => {\n const operations = collection.upload.fileOperations\n if (!operations) {\n const staticDir = collection.upload.staticDir\n\n if (!staticDir) {\n throw new Error(`No local storage directory is configured for ${collection.slug}`)\n }\n\n const key = normalizeStorageKey({ key: file.key })\n const directory = await fs.realpath(staticDir)\n const target = path.resolve(directory, key)\n const relative = path.relative(directory, target)\n\n if (!relative || relative.startsWith('..') || path.isAbsolute(relative)) {\n throw new Error(`Invalid local storage key: ${key}`)\n }\n\n try {\n const parent = await fs.realpath(path.dirname(target))\n const parentRelative = path.relative(directory, parent)\n\n if (parentRelative.startsWith('..') || path.isAbsolute(parentRelative)) {\n throw new Error(`Local storage key escapes its directory: ${key}`)\n }\n\n await fs.unlink(target)\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw err\n }\n }\n\n return\n }\n\n await operations.delete({ key: file.key, req })\n}\n"],"names":["fs","path","deferFileCleanup","normalizeStorageKey","collectStoredFiles","collectStoredFileLocations","getStoredFileIdentity","withLegacyCloudUploadFileData","pageSize","collection","doc","req","stored","collectVersionFiles","parentID","where","files","page","versions","payload","db","findVersions","slug","limit","and","parent","equals","row","docs","push","version","length","collectDocumentDeleteFileCandidates","scheduleUnreferencedFileCleanup","candidates","unique","Map","map","file","size","unreferenced","findUnreferenced","values","cleanup","stillUnreferenced","deleteStoredFile","err","logger","error","msg","key","shouldCleanupAfterFailure","removeUnreferencedStagedObjects","objects","roles","identities","Set","object","has","remove","variantsField","flattenedFields","find","field","name","variantNames","type","filter","some","nested","filenamePaths","remaining","every","role","includes","sizeKey","representationSelect","_objectKey","filename","prefix","url","select","filesize","mimeType","original","variants","Object","fromEntries","filenames","flatMap","parts","split","_","index","slice","join","offset","batch","or","in","pagination","sort","removeReferenced","versionWhere","delete","operations","upload","fileOperations","staticDir","Error","directory","realpath","target","resolve","relative","startsWith","isAbsolute","dirname","parentRelative","unlink","code"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/uploads/fileVersioning/cleanup.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { JsonObject, PayloadRequest, SelectType, Where } from '../../types/index.js'\nimport type { StagedObject } from './fileOperationManager.js'\nimport type { StoredFile, StoredFileList } from './types.js'\n\nimport { deferFileCleanup } from './fileOperationManager.js'\nimport { normalizeStorageKey } from './naming.js'\nimport {\n collectStoredFiles as collectStoredFileLocations,\n getStoredFileIdentity,\n withLegacyCloudUploadFileData,\n} from './storedFiles.js'\n\nconst pageSize = 100\n\nexport const collectStoredFiles = async ({\n collection,\n doc,\n req,\n}: {\n collection: SanitizedCollectionConfig\n doc: JsonObject\n req: PayloadRequest\n}): Promise<StoredFileList> => {\n const stored = await withLegacyCloudUploadFileData({\n collection,\n doc,\n req,\n })\n\n return collectStoredFileLocations({ collection, doc: stored, req })\n}\n\n/** Reads all saved versions in batches before a parent or its history is deleted. */\nexport const collectVersionFiles = async ({\n collection,\n parentID,\n req,\n where,\n}: {\n collection: SanitizedCollectionConfig\n parentID: number | string\n req: PayloadRequest\n where?: Where\n}): Promise<StoredFileList> => {\n const files: StoredFileList = []\n let page = 1\n\n while (true) {\n const versions = await req.payload.db.findVersions<JsonObject>({\n collection: collection.slug,\n limit: pageSize,\n page,\n req,\n where: where\n ? { and: [{ parent: { equals: parentID } }, where] }\n : { parent: { equals: parentID } },\n })\n\n for (const row of versions.docs) {\n files.push(...(await collectStoredFiles({ collection, doc: row.version, req })))\n }\n\n if (versions.docs.length < pageSize) {\n return files\n }\n page += 1\n }\n}\n\n/** Confirms that deleted references have no survivors before and after commit. */\nexport const scheduleUnreferencedFileCleanup = async ({\n candidates,\n collection,\n req,\n}: {\n candidates: StoredFileList\n collection: SanitizedCollectionConfig\n req: PayloadRequest\n}): Promise<void> => {\n const unique = new Map(candidates.map((file) => [getStoredFileIdentity(file), file]))\n\n if (!unique.size) {\n return\n }\n\n const unreferenced = await findUnreferenced({ candidates: [...unique.values()], collection, req })\n\n if (!unreferenced.length) {\n return\n }\n\n await deferFileCleanup({\n cleanup: async () => {\n const stillUnreferenced = await findUnreferenced({\n candidates: unreferenced,\n collection,\n req,\n })\n\n for (const file of stillUnreferenced) {\n try {\n await deleteStoredFile({ collection, file, req })\n } catch (err) {\n req.payload.logger.error({\n err,\n msg: `Failed to delete unreferenced upload file ${file.key}. Verify the object is unreferenced and remove it manually.`,\n })\n }\n }\n },\n req,\n shouldCleanupAfterFailure: true,\n })\n}\n\n/** Removes objects staged by a failed write unless a persisted document or version references them. */\nexport const removeUnreferencedStagedObjects = async ({\n collection,\n objects,\n req,\n}: {\n collection: SanitizedCollectionConfig\n objects: StagedObject[]\n req: PayloadRequest\n}): Promise<void> => {\n const unreferenced = await findUnreferenced({\n candidates: objects.map(({ key }) => ({ key, roles: [] })),\n collection,\n req,\n })\n const identities = new Set(unreferenced.map(getStoredFileIdentity))\n\n for (const object of objects) {\n if (!identities.has(getStoredFileIdentity(object))) {\n continue\n }\n\n try {\n await object.remove()\n } catch (err) {\n req.payload.logger.error({\n err,\n msg: `Failed to remove staged upload file ${object.key}`,\n })\n }\n }\n}\n\nconst findUnreferenced = async ({\n candidates,\n collection,\n req,\n}: {\n candidates: StoredFileList\n collection: SanitizedCollectionConfig\n req: PayloadRequest\n}): Promise<StoredFileList> => {\n const variantsField = collection.flattenedFields.find((field) => field.name === 'variants')\n const variantNames =\n variantsField?.type === 'group'\n ? variantsField.flattenedFields\n .filter(\n (field) =>\n field.type === 'group' &&\n field.flattenedFields.some((nested) => nested.name === 'filename'),\n )\n .map((field) => field.name)\n : []\n const filenamePaths = [\n 'filename',\n 'original.filename',\n ...variantNames.map((name) => `variants.${name}.filename`),\n ]\n // A removed schema field cannot prove the absence of historical references.\n // Retain those variant objects until their saved location data is migrated.\n const remaining = new Map(\n candidates\n .filter((file) =>\n file.roles.every((role) => role.type !== 'size' || variantNames.includes(role.sizeKey)),\n )\n .map((file) => [getStoredFileIdentity(file), file]),\n )\n const representationSelect: SelectType = {\n _objectKey: true,\n filename: true,\n prefix: true,\n url: true,\n }\n const select: SelectType = {\n ...representationSelect,\n filesize: true,\n mimeType: true,\n original: representationSelect,\n ...(variantNames.length\n ? { variants: Object.fromEntries(variantNames.map((name) => [name, representationSelect])) }\n : {}),\n }\n // Legacy filenames may include folders. Match every possible filename suffix,\n // then verify the adapter's complete key before accepting a reference.\n const filenames = [\n ...new Set(\n [...remaining.values()].flatMap(({ key }) => {\n const parts = normalizeStorageKey({ key }).split('/')\n return parts.map((_, index) => parts.slice(index).join('/'))\n }),\n ),\n ]\n\n for (let offset = 0; offset < filenames.length && remaining.size; offset += pageSize) {\n const batch = filenames.slice(offset, offset + pageSize)\n const where: Where = { or: filenamePaths.map((field) => ({ [field]: { in: batch } })) }\n let page = 1\n\n while (remaining.size) {\n const docs = await req.payload.db.find<JsonObject>({\n collection: collection.slug,\n limit: pageSize,\n page,\n pagination: true,\n req,\n select,\n sort: 'id',\n where,\n })\n\n for (const doc of docs.docs) {\n await removeReferenced({ collection, doc, remaining, req })\n }\n if (docs.docs.length < pageSize) {\n break\n }\n page += 1\n }\n\n if (collection.versions) {\n page = 1\n const versionWhere: Where = {\n or: filenamePaths.map((field) => ({ [`version.${field}`]: { in: batch } })),\n }\n\n while (remaining.size) {\n const versions = await req.payload.db.findVersions<JsonObject>({\n collection: collection.slug,\n limit: pageSize,\n page,\n pagination: true,\n req,\n select: { version: select },\n sort: 'id',\n where: versionWhere,\n })\n\n for (const row of versions.docs) {\n await removeReferenced({ collection, doc: row.version, remaining, req })\n }\n if (versions.docs.length < pageSize) {\n break\n }\n page += 1\n }\n }\n }\n\n return [...remaining.values()]\n}\n\nconst removeReferenced = async ({\n collection,\n doc,\n remaining,\n req,\n}: {\n collection: SanitizedCollectionConfig\n doc: JsonObject\n remaining: Map<string, StoredFile>\n req: PayloadRequest\n}): Promise<void> => {\n for (const file of await collectStoredFiles({ collection, doc, req })) {\n remaining.delete(getStoredFileIdentity(file))\n }\n}\n\nconst deleteStoredFile = async ({\n collection,\n file,\n req,\n}: {\n collection: SanitizedCollectionConfig\n file: StoredFile\n req: PayloadRequest\n}): Promise<void> => {\n const operations = collection.upload.fileOperations\n if (!operations) {\n const staticDir = collection.upload.staticDir\n\n if (!staticDir) {\n throw new Error(`No local storage directory is configured for ${collection.slug}`)\n }\n\n const key = normalizeStorageKey({ key: file.key })\n const directory = await fs.realpath(staticDir)\n const target = path.resolve(directory, key)\n const relative = path.relative(directory, target)\n\n if (!relative || relative.startsWith('..') || path.isAbsolute(relative)) {\n throw new Error(`Invalid local storage key: ${key}`)\n }\n\n try {\n const parent = await fs.realpath(path.dirname(target))\n const parentRelative = path.relative(directory, parent)\n\n if (parentRelative.startsWith('..') || path.isAbsolute(parentRelative)) {\n throw new Error(`Local storage key escapes its directory: ${key}`)\n }\n\n await fs.unlink(target)\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw err\n }\n }\n\n return\n }\n\n await operations.delete({ key: file.key, req })\n}\n"],"names":["fs","path","deferFileCleanup","normalizeStorageKey","collectStoredFiles","collectStoredFileLocations","getStoredFileIdentity","withLegacyCloudUploadFileData","pageSize","collection","doc","req","stored","collectVersionFiles","parentID","where","files","page","versions","payload","db","findVersions","slug","limit","and","parent","equals","row","docs","push","version","length","scheduleUnreferencedFileCleanup","candidates","unique","Map","map","file","size","unreferenced","findUnreferenced","values","cleanup","stillUnreferenced","deleteStoredFile","err","logger","error","msg","key","shouldCleanupAfterFailure","removeUnreferencedStagedObjects","objects","roles","identities","Set","object","has","remove","variantsField","flattenedFields","find","field","name","variantNames","type","filter","some","nested","filenamePaths","remaining","every","role","includes","sizeKey","representationSelect","_objectKey","filename","prefix","url","select","filesize","mimeType","original","variants","Object","fromEntries","filenames","flatMap","parts","split","_","index","slice","join","offset","batch","or","in","pagination","sort","removeReferenced","versionWhere","delete","operations","upload","fileOperations","staticDir","Error","directory","realpath","target","resolve","relative","startsWith","isAbsolute","dirname","parentRelative","unlink","code"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudStorage.d.ts","sourceRoot":"","sources":["../../../src/uploads/fileVersioning/cloudStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"cloudStorage.d.ts","sourceRoot":"","sources":["../../../src/uploads/fileVersioning/cloudStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAgB7C,yFAAyF;AACzF,eAAO,MAAM,qBAAqB,YAAa;IAAE,GAAG,EAAE,cAAc,CAAA;CAAE,KAAG,CAAC,MAAM,IAAI,CAmBnF,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAU,CAAC,4CAMzC;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,GAAG,EAAE,cAAc,CAAA;IACnB,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAA;CACxB,KAAG,OAAO,CAAC,CAAC,CAqCZ,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAU,CAAC,yDAQvC;IACD,UAAU,EAAE,yBAAyB,CAAA;IACrC,OAAO,EAAE,UAAU,CAAA;IACnB,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,GAAG,EAAE,cAAc,CAAA;IACnB,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAA;CACxB,KAAG,OAAO,CAAC,CAAC,CAqEZ,CAAA"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { resolveBranchRowID } from '../../branching/resolveBranchRowID.js';
|
|
2
|
-
import { branchField, branchParentField } from '../../branching/types.js';
|
|
3
1
|
import { saveVersion } from '../../versions/saveVersion.js';
|
|
4
2
|
import { collectStoredFiles as collectSavedFiles, removeUnreferencedStagedObjects, scheduleUnreferencedFileCleanup } from './cleanup.js';
|
|
5
3
|
import { runFileCreationPlan, runFileOperationPlan } from './fileOperationManager.js';
|
|
@@ -180,28 +178,21 @@ export const runCloudFileUpdate = async ({ id, collection, current, data, files,
|
|
|
180
178
|
});
|
|
181
179
|
};
|
|
182
180
|
const persistLegacyCloudVersions = async ({ id, collection, current, req })=>{
|
|
183
|
-
const versionParent = await resolveBranchRowID({
|
|
184
|
-
id,
|
|
185
|
-
collectionSlug: collection.slug,
|
|
186
|
-
req
|
|
187
|
-
});
|
|
188
181
|
let page = 1;
|
|
189
182
|
let hasVersions = false;
|
|
190
183
|
while(true){
|
|
191
184
|
const versions = await req.payload.db.findVersions({
|
|
192
|
-
branch: false,
|
|
193
185
|
collection: collection.slug,
|
|
194
186
|
limit: 100,
|
|
195
187
|
page,
|
|
196
188
|
req,
|
|
197
189
|
where: {
|
|
198
190
|
parent: {
|
|
199
|
-
equals:
|
|
191
|
+
equals: id
|
|
200
192
|
}
|
|
201
193
|
}
|
|
202
194
|
});
|
|
203
195
|
for (const row of versions.docs){
|
|
204
|
-
const branchVersion = row;
|
|
205
196
|
hasVersions = true;
|
|
206
197
|
if (hasStoredOriginal({
|
|
207
198
|
doc: row.version
|
|
@@ -223,12 +214,6 @@ const persistLegacyCloudVersions = async ({ id, collection, current, req })=>{
|
|
|
223
214
|
collection: collection.slug,
|
|
224
215
|
req,
|
|
225
216
|
versionData: {
|
|
226
|
-
...branchVersion[branchField] !== undefined ? {
|
|
227
|
-
[branchField]: branchVersion[branchField]
|
|
228
|
-
} : {},
|
|
229
|
-
...branchVersion[branchParentField] !== undefined ? {
|
|
230
|
-
[branchParentField]: branchVersion[branchParentField]
|
|
231
|
-
} : {},
|
|
232
217
|
createdAt: row.createdAt,
|
|
233
218
|
latest: row.latest,
|
|
234
219
|
parent: row.parent,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/uploads/fileVersioning/cloudStorage.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { JsonObject, PayloadRequest } from '../../types/index.js'\nimport type { FileToSave } from '../types.js'\nimport type { StagedObject } from './fileOperationManager.js'\n\nimport { resolveBranchRowID } from '../../branching/resolveBranchRowID.js'\nimport { branchField, branchParentField } from '../../branching/types.js'\nimport { saveVersion } from '../../versions/saveVersion.js'\nimport {\n collectStoredFiles as collectSavedFiles,\n removeUnreferencedStagedObjects,\n scheduleUnreferencedFileCleanup,\n} from './cleanup.js'\nimport { runFileCreationPlan, runFileOperationPlan } from './fileOperationManager.js'\nimport {\n collectStoredFiles,\n getStoredFileIdentity,\n withLegacyCloudUploadFileData,\n} from './storedFiles.js'\n\ntype BranchVersionMetadata = {\n [branchField]?: null | string\n [branchParentField]?: null | number | string\n}\n\n/** Preserve the caller's cloud flags; nested Local API calls can replace req.context. */\nexport const captureCloudHookState = ({ req }: { req: PayloadRequest }): (() => void) => {\n const previousState = ['_payloadManagedCloudStorage', '_payloadManagedCloudMetadata'].map(\n (key) => ({\n hasProperty: Object.hasOwn(req.context ?? {}, key),\n key,\n value: req.context?.[key],\n }),\n )\n\n return () => {\n req.context ??= {}\n for (const { hasProperty, key, value } of previousState) {\n if (hasProperty) {\n req.context[key] = value\n } else {\n delete req.context[key]\n }\n }\n }\n}\n\nexport const runCloudFileCreation = async <T>({\n collection,\n data,\n files,\n req,\n write,\n}: {\n collection: SanitizedCollectionConfig\n data: JsonObject\n files: FileToSave[]\n req: PayloadRequest\n write: () => Promise<T>\n}): Promise<T> => {\n const operations = collection.upload.fileOperations\n\n if (\n !operations ||\n req.context?.skipCloudStorage ||\n (files.length === 0 && !req.context?._payloadVerifiedProviderOriginal)\n ) {\n return write()\n }\n\n let metadata: Record<string, unknown> = {}\n\n return runFileCreationPlan({\n cleanupStagedAfterWriteFailure: (objects) =>\n removeUnreferencedStagedObjects({ collection, objects, req }),\n req,\n stage: async ({ trackStagedObject }) => {\n trackClientUploadOriginal({ collection, data, req, trackStagedObject })\n const staged = await operations.stage({\n data,\n files,\n req,\n trackStagedObject,\n })\n metadata = staged.metadata\n Object.assign(data, metadata)\n },\n // Create's version and afterChange hooks run after the database insert. The\n // outer create operation restores the previous guard after those hooks finish.\n write: () => {\n req.context ??= {}\n req.context._payloadManagedCloudStorage = true\n req.context._payloadManagedCloudMetadata = metadata\n return write()\n },\n })\n}\n\nexport const runCloudFileUpdate = async <T>({\n id,\n collection,\n current,\n data,\n files,\n req,\n write,\n}: {\n collection: SanitizedCollectionConfig\n current: JsonObject\n data: JsonObject\n files: FileToSave[]\n id: number | string\n req: PayloadRequest\n write: () => Promise<T>\n}): Promise<T> => {\n const operations = collection.upload.fileOperations\n const storedCurrent = operations\n ? await withLegacyCloudUploadFileData({ collection, doc: current, req })\n : current\n const nextFiles = collectStoredFiles({\n collection,\n doc: { ...storedCurrent, ...data },\n req,\n trustGenerated: true,\n })\n const currentFiles = collectStoredFiles({ collection, doc: storedCurrent, req })\n const nextIdentities = new Set(nextFiles.map(getStoredFileIdentity))\n const hasStoredFileChange =\n nextIdentities.size !== currentFiles.length ||\n currentFiles.some((file) => !nextIdentities.has(getStoredFileIdentity(file)))\n\n if (\n !operations ||\n req.context?.skipCloudStorage ||\n (files.length === 0 && !req.context?._payloadVerifiedProviderOriginal && !hasStoredFileChange)\n ) {\n return write()\n }\n\n let metadata: Record<string, unknown> = {}\n\n return runFileOperationPlan({\n cleanupStagedAfterWriteFailure: (objects) =>\n removeUnreferencedStagedObjects({ collection, objects, req }),\n req,\n stage: async ({ trackStagedObject }) => {\n if (files.length === 0 && !req.context?._payloadVerifiedProviderOriginal) {\n return\n }\n trackClientUploadOriginal({ collection, data, req, trackStagedObject })\n const staged = await operations.stage({\n data,\n files,\n req,\n trackStagedObject,\n })\n metadata = staged.metadata\n Object.assign(data, metadata)\n },\n write: async () => {\n if (\n collection.versions &&\n !hasStoredOriginal({ doc: current }) &&\n hasStoredOriginal({ doc: storedCurrent })\n ) {\n await persistLegacyCloudVersions({ id, collection, current: storedCurrent, req })\n }\n\n const result = await withCloudHookGuard({\n metadata,\n req,\n write,\n })\n\n await scheduleUnreferencedFileCleanup({\n candidates: await collectSavedFiles({ collection, doc: storedCurrent, req }),\n collection,\n req,\n })\n\n return result\n },\n })\n}\n\n/** Track a verified client-uploaded source, retaining it if another document still references it. */\nconst trackClientUploadOriginal = ({\n collection,\n data,\n req,\n trackStagedObject,\n}: {\n collection: SanitizedCollectionConfig\n data: JsonObject\n req: PayloadRequest\n trackStagedObject: (object: StagedObject) => void\n}): void => {\n const verifiedOriginal = req.context?._payloadVerifiedProviderOriginal as\n | { key: string }\n | undefined\n\n if (!verifiedOriginal) {\n return\n }\n\n const original = collectStoredFiles({ collection, doc: data, req, trustGenerated: true }).find(\n ({ key, roles }) =>\n key === verifiedOriginal.key && roles.some((role) => role.type === 'original'),\n )\n\n if (!original) {\n return\n }\n\n const object: StagedObject = {\n key: original.key,\n remove: () => collection.upload.fileOperations!.delete({ key: original.key, req }),\n }\n\n trackStagedObject({\n key: object.key,\n remove: () => removeUnreferencedStagedObjects({ collection, objects: [object], req }),\n })\n}\n\nconst persistLegacyCloudVersions = async ({\n id,\n collection,\n current,\n req,\n}: {\n collection: SanitizedCollectionConfig\n current: JsonObject\n id: number | string\n req: PayloadRequest\n}): Promise<void> => {\n const versionParent = await resolveBranchRowID({\n id,\n collectionSlug: collection.slug,\n req,\n })\n let page = 1\n let hasVersions = false\n\n while (true) {\n const versions = await req.payload.db.findVersions<JsonObject>({\n branch: false,\n collection: collection.slug,\n limit: 100,\n page,\n req,\n where: { parent: { equals: versionParent } },\n })\n\n for (const row of versions.docs) {\n const branchVersion = row as BranchVersionMetadata & typeof row\n\n hasVersions = true\n if (hasStoredOriginal({ doc: row.version })) {\n continue\n }\n\n const version = await withLegacyCloudUploadFileData({\n collection,\n doc: row.version,\n req,\n })\n if (!hasStoredOriginal({ doc: version })) {\n continue\n }\n\n await req.payload.db.updateVersion({\n id: row.id,\n collection: collection.slug,\n req,\n versionData: {\n ...(branchVersion[branchField] !== undefined\n ? { [branchField]: branchVersion[branchField] }\n : {}),\n ...(branchVersion[branchParentField] !== undefined\n ? { [branchParentField]: branchVersion[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 if (versions.docs.length < 100) {\n break\n }\n page += 1\n }\n\n if (!hasVersions && hasStoredOriginal({ doc: current })) {\n await saveVersion({\n id,\n collection,\n docWithLocales: current,\n draft: false,\n operation: 'update',\n payload: req.payload,\n req,\n })\n }\n}\n\nconst hasStoredOriginal = ({ doc }: { doc: JsonObject }): boolean =>\n Boolean(\n doc.original &&\n typeof doc.original === 'object' &&\n typeof (doc.original as Record<string, unknown>).filename === 'string',\n )\n\nconst withCloudHookGuard = async <T>({\n metadata,\n req,\n write,\n}: {\n metadata: Record<string, unknown>\n req: PayloadRequest\n write: () => Promise<T>\n}): Promise<T> => {\n const restoreCloudHookState = captureCloudHookState({ req })\n req.context ??= {}\n req.context._payloadManagedCloudStorage = true\n req.context._payloadManagedCloudMetadata = metadata\n\n try {\n return await write()\n } finally {\n restoreCloudHookState()\n }\n}\n"],"names":["resolveBranchRowID","branchField","branchParentField","saveVersion","collectStoredFiles","collectSavedFiles","removeUnreferencedStagedObjects","scheduleUnreferencedFileCleanup","runFileCreationPlan","runFileOperationPlan","getStoredFileIdentity","withLegacyCloudUploadFileData","captureCloudHookState","req","previousState","map","key","hasProperty","Object","hasOwn","context","value","runCloudFileCreation","collection","data","files","write","operations","upload","fileOperations","skipCloudStorage","length","_payloadVerifiedProviderOriginal","metadata","cleanupStagedAfterWriteFailure","objects","stage","trackStagedObject","trackClientUploadOriginal","staged","assign","_payloadManagedCloudStorage","_payloadManagedCloudMetadata","runCloudFileUpdate","id","current","storedCurrent","doc","nextFiles","trustGenerated","currentFiles","nextIdentities","Set","hasStoredFileChange","size","some","file","has","versions","hasStoredOriginal","persistLegacyCloudVersions","result","withCloudHookGuard","candidates","verifiedOriginal","original","find","roles","role","type","object","remove","delete","versionParent","collectionSlug","slug","page","hasVersions","payload","db","findVersions","branch","limit","where","parent","equals","row","docs","branchVersion","version","updateVersion","versionData","undefined","createdAt","latest","publishedLocale","updatedAt","docWithLocales","draft","operation","Boolean","filename","restoreCloudHookState"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/uploads/fileVersioning/cloudStorage.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../../collections/config/types.js'\nimport type { JsonObject, PayloadRequest } from '../../types/index.js'\nimport type { FileToSave } from '../types.js'\nimport type { StagedObject } from './fileOperationManager.js'\n\nimport { saveVersion } from '../../versions/saveVersion.js'\nimport {\n collectStoredFiles as collectSavedFiles,\n removeUnreferencedStagedObjects,\n scheduleUnreferencedFileCleanup,\n} from './cleanup.js'\nimport { runFileCreationPlan, runFileOperationPlan } from './fileOperationManager.js'\nimport {\n collectStoredFiles,\n getStoredFileIdentity,\n withLegacyCloudUploadFileData,\n} from './storedFiles.js'\n\n/** Preserve the caller's cloud flags; nested Local API calls can replace req.context. */\nexport const captureCloudHookState = ({ req }: { req: PayloadRequest }): (() => void) => {\n const previousState = ['_payloadManagedCloudStorage', '_payloadManagedCloudMetadata'].map(\n (key) => ({\n hasProperty: Object.hasOwn(req.context ?? {}, key),\n key,\n value: req.context?.[key],\n }),\n )\n\n return () => {\n req.context ??= {}\n for (const { hasProperty, key, value } of previousState) {\n if (hasProperty) {\n req.context[key] = value\n } else {\n delete req.context[key]\n }\n }\n }\n}\n\nexport const runCloudFileCreation = async <T>({\n collection,\n data,\n files,\n req,\n write,\n}: {\n collection: SanitizedCollectionConfig\n data: JsonObject\n files: FileToSave[]\n req: PayloadRequest\n write: () => Promise<T>\n}): Promise<T> => {\n const operations = collection.upload.fileOperations\n\n if (\n !operations ||\n req.context?.skipCloudStorage ||\n (files.length === 0 && !req.context?._payloadVerifiedProviderOriginal)\n ) {\n return write()\n }\n\n let metadata: Record<string, unknown> = {}\n\n return runFileCreationPlan({\n cleanupStagedAfterWriteFailure: (objects) =>\n removeUnreferencedStagedObjects({ collection, objects, req }),\n req,\n stage: async ({ trackStagedObject }) => {\n trackClientUploadOriginal({ collection, data, req, trackStagedObject })\n const staged = await operations.stage({\n data,\n files,\n req,\n trackStagedObject,\n })\n metadata = staged.metadata\n Object.assign(data, metadata)\n },\n // Create's version and afterChange hooks run after the database insert. The\n // outer create operation restores the previous guard after those hooks finish.\n write: () => {\n req.context ??= {}\n req.context._payloadManagedCloudStorage = true\n req.context._payloadManagedCloudMetadata = metadata\n return write()\n },\n })\n}\n\nexport const runCloudFileUpdate = async <T>({\n id,\n collection,\n current,\n data,\n files,\n req,\n write,\n}: {\n collection: SanitizedCollectionConfig\n current: JsonObject\n data: JsonObject\n files: FileToSave[]\n id: number | string\n req: PayloadRequest\n write: () => Promise<T>\n}): Promise<T> => {\n const operations = collection.upload.fileOperations\n const storedCurrent = operations\n ? await withLegacyCloudUploadFileData({ collection, doc: current, req })\n : current\n const nextFiles = collectStoredFiles({\n collection,\n doc: { ...storedCurrent, ...data },\n req,\n trustGenerated: true,\n })\n const currentFiles = collectStoredFiles({ collection, doc: storedCurrent, req })\n const nextIdentities = new Set(nextFiles.map(getStoredFileIdentity))\n const hasStoredFileChange =\n nextIdentities.size !== currentFiles.length ||\n currentFiles.some((file) => !nextIdentities.has(getStoredFileIdentity(file)))\n\n if (\n !operations ||\n req.context?.skipCloudStorage ||\n (files.length === 0 && !req.context?._payloadVerifiedProviderOriginal && !hasStoredFileChange)\n ) {\n return write()\n }\n\n let metadata: Record<string, unknown> = {}\n\n return runFileOperationPlan({\n cleanupStagedAfterWriteFailure: (objects) =>\n removeUnreferencedStagedObjects({ collection, objects, req }),\n req,\n stage: async ({ trackStagedObject }) => {\n if (files.length === 0 && !req.context?._payloadVerifiedProviderOriginal) {\n return\n }\n trackClientUploadOriginal({ collection, data, req, trackStagedObject })\n const staged = await operations.stage({\n data,\n files,\n req,\n trackStagedObject,\n })\n metadata = staged.metadata\n Object.assign(data, metadata)\n },\n write: async () => {\n if (\n collection.versions &&\n !hasStoredOriginal({ doc: current }) &&\n hasStoredOriginal({ doc: storedCurrent })\n ) {\n await persistLegacyCloudVersions({ id, collection, current: storedCurrent, req })\n }\n\n const result = await withCloudHookGuard({\n metadata,\n req,\n write,\n })\n\n await scheduleUnreferencedFileCleanup({\n candidates: await collectSavedFiles({ collection, doc: storedCurrent, req }),\n collection,\n req,\n })\n\n return result\n },\n })\n}\n\n/** Track a verified client-uploaded source, retaining it if another document still references it. */\nconst trackClientUploadOriginal = ({\n collection,\n data,\n req,\n trackStagedObject,\n}: {\n collection: SanitizedCollectionConfig\n data: JsonObject\n req: PayloadRequest\n trackStagedObject: (object: StagedObject) => void\n}): void => {\n const verifiedOriginal = req.context?._payloadVerifiedProviderOriginal as\n | { key: string }\n | undefined\n\n if (!verifiedOriginal) {\n return\n }\n\n const original = collectStoredFiles({ collection, doc: data, req, trustGenerated: true }).find(\n ({ key, roles }) =>\n key === verifiedOriginal.key && roles.some((role) => role.type === 'original'),\n )\n\n if (!original) {\n return\n }\n\n const object: StagedObject = {\n key: original.key,\n remove: () => collection.upload.fileOperations!.delete({ key: original.key, req }),\n }\n\n trackStagedObject({\n key: object.key,\n remove: () => removeUnreferencedStagedObjects({ collection, objects: [object], req }),\n })\n}\n\nconst persistLegacyCloudVersions = async ({\n id,\n collection,\n current,\n req,\n}: {\n collection: SanitizedCollectionConfig\n current: JsonObject\n id: number | string\n req: PayloadRequest\n}): Promise<void> => {\n let page = 1\n let hasVersions = false\n\n while (true) {\n const versions = await req.payload.db.findVersions<JsonObject>({\n collection: collection.slug,\n limit: 100,\n page,\n req,\n where: { parent: { equals: id } },\n })\n\n for (const row of versions.docs) {\n hasVersions = true\n if (hasStoredOriginal({ doc: row.version })) {\n continue\n }\n\n const version = await withLegacyCloudUploadFileData({\n collection,\n doc: row.version,\n req,\n })\n if (!hasStoredOriginal({ doc: 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 if (versions.docs.length < 100) {\n break\n }\n page += 1\n }\n\n if (!hasVersions && hasStoredOriginal({ doc: current })) {\n await saveVersion({\n id,\n collection,\n docWithLocales: current,\n draft: false,\n operation: 'update',\n payload: req.payload,\n req,\n })\n }\n}\n\nconst hasStoredOriginal = ({ doc }: { doc: JsonObject }): boolean =>\n Boolean(\n doc.original &&\n typeof doc.original === 'object' &&\n typeof (doc.original as Record<string, unknown>).filename === 'string',\n )\n\nconst withCloudHookGuard = async <T>({\n metadata,\n req,\n write,\n}: {\n metadata: Record<string, unknown>\n req: PayloadRequest\n write: () => Promise<T>\n}): Promise<T> => {\n const restoreCloudHookState = captureCloudHookState({ req })\n req.context ??= {}\n req.context._payloadManagedCloudStorage = true\n req.context._payloadManagedCloudMetadata = metadata\n\n try {\n return await write()\n } finally {\n restoreCloudHookState()\n }\n}\n"],"names":["saveVersion","collectStoredFiles","collectSavedFiles","removeUnreferencedStagedObjects","scheduleUnreferencedFileCleanup","runFileCreationPlan","runFileOperationPlan","getStoredFileIdentity","withLegacyCloudUploadFileData","captureCloudHookState","req","previousState","map","key","hasProperty","Object","hasOwn","context","value","runCloudFileCreation","collection","data","files","write","operations","upload","fileOperations","skipCloudStorage","length","_payloadVerifiedProviderOriginal","metadata","cleanupStagedAfterWriteFailure","objects","stage","trackStagedObject","trackClientUploadOriginal","staged","assign","_payloadManagedCloudStorage","_payloadManagedCloudMetadata","runCloudFileUpdate","id","current","storedCurrent","doc","nextFiles","trustGenerated","currentFiles","nextIdentities","Set","hasStoredFileChange","size","some","file","has","versions","hasStoredOriginal","persistLegacyCloudVersions","result","withCloudHookGuard","candidates","verifiedOriginal","original","find","roles","role","type","object","remove","delete","page","hasVersions","payload","db","findVersions","slug","limit","where","parent","equals","row","docs","version","updateVersion","versionData","createdAt","latest","publishedLocale","updatedAt","docWithLocales","draft","operation","Boolean","filename","restoreCloudHookState"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/uploads/fileVersioning/resolveHistoricalFile.ts"],"sourcesContent":["import type { Collection, TypeWithID } from '../../collections/config/types.js'\nimport type { JsonObject, PayloadRequest } from '../../types/index.js'\n\nimport { Forbidden } from '../../errors/Forbidden.js'\nimport { NotFound } from '../../errors/NotFound.js'\nimport { checkFileAccess } from '../checkFileAccess.js'\nimport { collectStoredFiles, withLegacyCloudUploadFileData } from './storedFiles.js'\n\ntype StoredVersion = {\n id: number | string\n parent: number | string\n version: JsonObject\n}\n\n/** Finds an exact saved object reference, including sizes removed from the current config. */\nexport const resolveHistoricalFile = async ({\n collection,\n filename,\n prefix,\n req,\n versionID,\n}: {\n collection: Collection\n filename: string\n prefix?: string\n req: PayloadRequest\n versionID: string\n}): Promise<TypeWithID> => {\n const { docs } = await req.payload.db.findVersions<JsonObject>({\n collection: collection.config.slug,\n limit: 1,\n req,\n where: { id: { equals: versionID } },\n })\n const matched = docs[0]\n\n // Check both policies before exposing a missing version or a filename mismatch.\n await checkFileAccess({ collection, documentID: matched?.parent, filename, req })\n const authorized = await req.payload.findVersionByID({\n id: versionID,\n collection: collection.config.slug,\n depth: 0,\n overrideAccess: false,\n req,\n showHiddenFields: true,\n })\n\n if (!authorized) {\n throw new Forbidden(req.t)\n }\n\n if (!matched) {\n throw new NotFound(req.t)\n }\n\n const historical = await resolveVersionFile({ collection, filename, prefix, req, row: matched })\n\n if (!historical) {\n throw new NotFound(req.t)\n }\n\n return historical\n}\n\nconst resolveVersionFile = async ({\n collection,\n filename,\n prefix,\n req,\n row,\n}: {\n collection: Collection\n filename: string\n prefix?: string\n req: PayloadRequest\n row: StoredVersion\n}): Promise<TypeWithID | undefined> => {\n const saved = await withLegacyCloudUploadFileData({\n collection: collection.config,\n doc: row.version,\n req,\n })\n const hasFile = collectStoredFiles({ collection: collection.config, doc: saved, req }).some(\n (file) =>\n file.roles.some((role) => {\n const representation =\n role.type === 'size'\n ? (saved.variants as Record<string, JsonObject> | undefined)?.[role.sizeKey]\n : role.type === 'original'\n ? (saved.original as JsonObject | undefined)\n : saved\n return (\n representation?.filename === filename && (!prefix || representation.prefix === prefix)\n )\n }),\n )\n\n if (!hasFile) {\n return\n }\n\n return { ...saved, id: row.parent }
|
|
1
|
+
{"version":3,"sources":["../../../src/uploads/fileVersioning/resolveHistoricalFile.ts"],"sourcesContent":["import type { Collection, TypeWithID } from '../../collections/config/types.js'\nimport type { JsonObject, PayloadRequest } from '../../types/index.js'\n\nimport { Forbidden } from '../../errors/Forbidden.js'\nimport { NotFound } from '../../errors/NotFound.js'\nimport { checkFileAccess } from '../checkFileAccess.js'\nimport { collectStoredFiles, withLegacyCloudUploadFileData } from './storedFiles.js'\n\ntype StoredVersion = {\n id: number | string\n parent: number | string\n version: JsonObject\n}\n\n/** Finds an exact saved object reference, including sizes removed from the current config. */\nexport const resolveHistoricalFile = async ({\n collection,\n filename,\n prefix,\n req,\n versionID,\n}: {\n collection: Collection\n filename: string\n prefix?: string\n req: PayloadRequest\n versionID: string\n}): Promise<TypeWithID> => {\n const { docs } = await req.payload.db.findVersions<JsonObject>({\n collection: collection.config.slug,\n limit: 1,\n req,\n where: { id: { equals: versionID } },\n })\n const matched = docs[0]\n\n // Check both policies before exposing a missing version or a filename mismatch.\n await checkFileAccess({ collection, documentID: matched?.parent, filename, req })\n const authorized = await req.payload.findVersionByID({\n id: versionID,\n collection: collection.config.slug,\n depth: 0,\n overrideAccess: false,\n req,\n showHiddenFields: true,\n })\n\n if (!authorized) {\n throw new Forbidden(req.t)\n }\n\n if (!matched) {\n throw new NotFound(req.t)\n }\n\n const historical = await resolveVersionFile({ collection, filename, prefix, req, row: matched })\n\n if (!historical) {\n throw new NotFound(req.t)\n }\n\n return historical\n}\n\nconst resolveVersionFile = async ({\n collection,\n filename,\n prefix,\n req,\n row,\n}: {\n collection: Collection\n filename: string\n prefix?: string\n req: PayloadRequest\n row: StoredVersion\n}): Promise<TypeWithID | undefined> => {\n const saved = await withLegacyCloudUploadFileData({\n collection: collection.config,\n doc: row.version,\n req,\n })\n const hasFile = collectStoredFiles({ collection: collection.config, doc: saved, req }).some(\n (file) =>\n file.roles.some((role) => {\n const representation =\n role.type === 'size'\n ? (saved.variants as Record<string, JsonObject> | undefined)?.[role.sizeKey]\n : role.type === 'original'\n ? (saved.original as JsonObject | undefined)\n : saved\n return (\n representation?.filename === filename && (!prefix || representation.prefix === prefix)\n )\n }),\n )\n\n if (!hasFile) {\n return\n }\n\n return { ...saved, id: row.parent }\n}\n"],"names":["Forbidden","NotFound","checkFileAccess","collectStoredFiles","withLegacyCloudUploadFileData","resolveHistoricalFile","collection","filename","prefix","req","versionID","docs","payload","db","findVersions","config","slug","limit","where","id","equals","matched","documentID","parent","authorized","findVersionByID","depth","overrideAccess","showHiddenFields","t","historical","resolveVersionFile","row","saved","doc","version","hasFile","some","file","roles","role","representation","type","variants","sizeKey","original"],"mappings":"AAGA,SAASA,SAAS,QAAQ,4BAA2B;AACrD,SAASC,QAAQ,QAAQ,2BAA0B;AACnD,SAASC,eAAe,QAAQ,wBAAuB;AACvD,SAASC,kBAAkB,EAAEC,6BAA6B,QAAQ,mBAAkB;AAQpF,4FAA4F,GAC5F,OAAO,MAAMC,wBAAwB,OAAO,EAC1CC,UAAU,EACVC,QAAQ,EACRC,MAAM,EACNC,GAAG,EACHC,SAAS,EAOV;IACC,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMF,IAAIG,OAAO,CAACC,EAAE,CAACC,YAAY,CAAa;QAC7DR,YAAYA,WAAWS,MAAM,CAACC,IAAI;QAClCC,OAAO;QACPR;QACAS,OAAO;YAAEC,IAAI;gBAAEC,QAAQV;YAAU;QAAE;IACrC;IACA,MAAMW,UAAUV,IAAI,CAAC,EAAE;IAEvB,gFAAgF;IAChF,MAAMT,gBAAgB;QAAEI;QAAYgB,YAAYD,SAASE;QAAQhB;QAAUE;IAAI;IAC/E,MAAMe,aAAa,MAAMf,IAAIG,OAAO,CAACa,eAAe,CAAC;QACnDN,IAAIT;QACJJ,YAAYA,WAAWS,MAAM,CAACC,IAAI;QAClCU,OAAO;QACPC,gBAAgB;QAChBlB;QACAmB,kBAAkB;IACpB;IAEA,IAAI,CAACJ,YAAY;QACf,MAAM,IAAIxB,UAAUS,IAAIoB,CAAC;IAC3B;IAEA,IAAI,CAACR,SAAS;QACZ,MAAM,IAAIpB,SAASQ,IAAIoB,CAAC;IAC1B;IAEA,MAAMC,aAAa,MAAMC,mBAAmB;QAAEzB;QAAYC;QAAUC;QAAQC;QAAKuB,KAAKX;IAAQ;IAE9F,IAAI,CAACS,YAAY;QACf,MAAM,IAAI7B,SAASQ,IAAIoB,CAAC;IAC1B;IAEA,OAAOC;AACT,EAAC;AAED,MAAMC,qBAAqB,OAAO,EAChCzB,UAAU,EACVC,QAAQ,EACRC,MAAM,EACNC,GAAG,EACHuB,GAAG,EAOJ;IACC,MAAMC,QAAQ,MAAM7B,8BAA8B;QAChDE,YAAYA,WAAWS,MAAM;QAC7BmB,KAAKF,IAAIG,OAAO;QAChB1B;IACF;IACA,MAAM2B,UAAUjC,mBAAmB;QAAEG,YAAYA,WAAWS,MAAM;QAAEmB,KAAKD;QAAOxB;IAAI,GAAG4B,IAAI,CACzF,CAACC,OACCA,KAAKC,KAAK,CAACF,IAAI,CAAC,CAACG;YACf,MAAMC,iBACJD,KAAKE,IAAI,KAAK,SACTT,MAAMU,QAAQ,EAA6C,CAACH,KAAKI,OAAO,CAAC,GAC1EJ,KAAKE,IAAI,KAAK,aACXT,MAAMY,QAAQ,GACfZ;YACR,OACEQ,gBAAgBlC,aAAaA,YAAa,CAAA,CAACC,UAAUiC,eAAejC,MAAM,KAAKA,MAAK;QAExF;IAGJ,IAAI,CAAC4B,SAAS;QACZ;IACF;IAEA,OAAO;QAAE,GAAGH,KAAK;QAAEd,IAAIa,IAAIT,MAAM;IAAC;AACpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/uploads/formatFilesize.ts"],"sourcesContent":["export function formatFilesize(bytes: number, decimals =
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/formatFilesize.ts"],"sourcesContent":["export function formatFilesize(bytes: number, decimals = 1): string {\n if (bytes === 0) {\n return '0 bytes'\n }\n\n const k = 1024\n const dm = decimals < 0 ? 0 : decimals\n const sizes = [' bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\n\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n\n return `${parseFloat((bytes / k ** i).toFixed(dm))}${sizes[i]}`\n}\n"],"names":["formatFilesize","bytes","decimals","k","dm","sizes","i","Math","floor","log","parseFloat","toFixed"],"mappings":"AAAA,OAAO,SAASA,eAAeC,KAAa,EAAEC,WAAW,CAAC;IACxD,IAAID,UAAU,GAAG;QACf,OAAO;IACT;IAEA,MAAME,IAAI;IACV,MAAMC,KAAKF,WAAW,IAAI,IAAIA;IAC9B,MAAMG,QAAQ;QAAC;QAAU;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;KAAK;IAExE,MAAMC,IAAIC,KAAKC,KAAK,CAACD,KAAKE,GAAG,CAACR,SAASM,KAAKE,GAAG,CAACN;IAEhD,OAAO,GAAGO,WAAW,AAACT,CAAAA,QAAQE,KAAKG,CAAAA,EAAGK,OAAO,CAACP,OAAOC,KAAK,CAACC,EAAE,EAAE;AACjE"}
|
|
@@ -49,10 +49,5 @@ export declare const resolveTempFileHandling: ({ disableLocalStorage, hasProcess
|
|
|
49
49
|
* storage is disabled, and copies it straight to its destination when local storage is enabled.
|
|
50
50
|
*/
|
|
51
51
|
export declare const generateFileData: <T>({ collection: { config: collectionConfig }, data, draft, externalUploadSource, isDuplicating, operation, originalDoc, overwriteExistingFiles, req, throwOnMissingFile, }: Args<T>) => Result<T>;
|
|
52
|
-
/** Adds a stable branch suffix without exceeding the common filesystem filename byte limit. */
|
|
53
|
-
export declare const getBranchUploadFilename: ({ branch, filename, }: {
|
|
54
|
-
branch: string;
|
|
55
|
-
filename: string;
|
|
56
|
-
}) => string;
|
|
57
52
|
export {};
|
|
58
53
|
//# sourceMappingURL=generateFileData.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateFileData.d.ts","sourceRoot":"","sources":["../../src/uploads/generateFileData.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,gCAAgC,CAAA;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAEnE,OAAO,KAAK,EAAuB,UAAU,EAAe,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"generateFileData.d.ts","sourceRoot":"","sources":["../../src/uploads/generateFileData.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,gCAAgC,CAAA;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAEnE,OAAO,KAAK,EAAuB,UAAU,EAAe,MAAM,YAAY,CAAA;AAwB9E,KAAK,IAAI,CAAC,CAAC,IAAI;IACb,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;IAC3C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,WAAW,CAAC,EAAE,CAAC,CAAA;IACf,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,GAAG,EAAE,cAAc,CAAA;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,KAAK,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB,CAAC,CAAA;AA6BF,MAAM,MAAM,gBAAgB,GACxB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAA;AAEzB;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,+DAIjC;IACD,mBAAmB,EAAE,OAAO,CAAA;IAC5B,kBAAkB,EAAE,OAAO,CAAA;IAC3B,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;CACjC,KAAG,gBAQH,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,GAAU,CAAC,4KAWrC,IAAI,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,CAooBpB,CAAA"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { fileTypeFromBuffer } from 'file-type';
|
|
2
2
|
import fs from 'fs/promises';
|
|
3
|
-
import {
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
4
|
import { openAsBlob } from 'node:fs';
|
|
5
|
-
import { resolveBranch } from '../branching/resolveBranch.js';
|
|
6
|
-
import { MAIN_BRANCH } from '../branching/types.js';
|
|
7
5
|
import { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js';
|
|
8
6
|
import { formatAdminURL } from '../utilities/formatAdminURL.js';
|
|
9
7
|
import { isNumber } from '../utilities/isNumber.js';
|
|
@@ -273,7 +271,6 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
273
271
|
}
|
|
274
272
|
const fileWasTransformed = Boolean(mainWebFile && mainWebFile !== originalWebFile);
|
|
275
273
|
const hasReusableOriginalMain = Boolean(isResettingCrop && !fileWasTransformed && retainedOriginal);
|
|
276
|
-
const hasReusableCurrentMain = Boolean(!hasReusableOriginalMain && !fileWasTransformed && retainedOriginal && currentFileData?.filename);
|
|
277
274
|
if (hasReusableOriginalMain && !hasFocalPointChange && retainedOriginal) {
|
|
278
275
|
return {
|
|
279
276
|
data: {
|
|
@@ -335,16 +332,6 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
335
332
|
}
|
|
336
333
|
}
|
|
337
334
|
let fsSafeName = getSanitizedUploadFilename(outputName, ext);
|
|
338
|
-
const branch = resolveBranch(req);
|
|
339
|
-
const isIsolatedProviderUpload = Boolean(file.uploadReference && typeof file.uploadReference === 'object' && !Array.isArray(file.uploadReference) && '_objectKey' in file.uploadReference && typeof file.uploadReference._objectKey === 'string');
|
|
340
|
-
const shouldIsolateBranchFile = branch !== MAIN_BRANCH && !isIsolatedProviderUpload;
|
|
341
|
-
if (shouldIsolateBranchFile) {
|
|
342
|
-
fsSafeName = getBranchUploadFilename({
|
|
343
|
-
branch,
|
|
344
|
-
filename: fsSafeName
|
|
345
|
-
});
|
|
346
|
-
overwriteExistingFiles = false;
|
|
347
|
-
}
|
|
348
335
|
const isDuplicatingAnOriginal = isDuplicating && file.name === originalDoc?.original?.filename;
|
|
349
336
|
// A provider reference without a receipt names an object the client already stored; renaming
|
|
350
337
|
// it would point the document at a key that was never uploaded.
|
|
@@ -356,8 +343,6 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
356
343
|
}
|
|
357
344
|
if (hasReusableOriginalMain) {
|
|
358
345
|
fsSafeName = retainedOriginal.filename;
|
|
359
|
-
} else if (hasReusableCurrentMain) {
|
|
360
|
-
fsSafeName = currentFileData.filename;
|
|
361
346
|
} else if (!overwriteExistingFiles || !disableLocalStorage || shouldStageCloudFiles && retainedOriginal) {
|
|
362
347
|
// Extract prefix if present (added by plugin-cloud-storage)
|
|
363
348
|
const prefix = data?.prefix;
|
|
@@ -372,16 +357,6 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
372
357
|
fileData.filename = fsSafeName;
|
|
373
358
|
if (hasReusableOriginalMain) {
|
|
374
359
|
fileData.url = retainedOriginal.url;
|
|
375
|
-
} else if (hasReusableCurrentMain) {
|
|
376
|
-
fileData.filesize = currentFileData.filesize;
|
|
377
|
-
fileData.height = currentFileData.height;
|
|
378
|
-
fileData.mimeType = currentFileData.mimeType;
|
|
379
|
-
fileData.url = currentFileData.url;
|
|
380
|
-
fileData.width = currentFileData.width;
|
|
381
|
-
req.file = {
|
|
382
|
-
...file,
|
|
383
|
-
name: currentFileData.filename
|
|
384
|
-
};
|
|
385
360
|
}
|
|
386
361
|
const hasGeneratedProviderRepresentations = Boolean(providerOriginal && (fileWasTransformed || sizeResults.some((result)=>Boolean(result.file))));
|
|
387
362
|
const newObjectKey = hasManagedCloudStorage && (shouldStageCloudFiles || hasGeneratedProviderRepresentations) ? randomUUID() : undefined;
|
|
@@ -459,7 +434,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
459
434
|
size: mainBuffer.length
|
|
460
435
|
};
|
|
461
436
|
}
|
|
462
|
-
} else if (!hasReusableOriginalMain
|
|
437
|
+
} else if (!hasReusableOriginalMain) {
|
|
463
438
|
// file.data is empty when useTempFiles is on, so the real content lives at
|
|
464
439
|
// file.tempFilePath instead (see the function doc for why we avoid buffering it).
|
|
465
440
|
const tempFileHandling = resolveTempFileHandling({
|
|
@@ -595,53 +570,6 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
595
570
|
files: filesToSave
|
|
596
571
|
};
|
|
597
572
|
};
|
|
598
|
-
const maximumFilesystemFilenameByteLength = 255;
|
|
599
|
-
// `getSafeFileName` can add a numeric suffix. Reserve `-` plus 11 digits for that step.
|
|
600
|
-
const deduplicationSuffixByteReserve = 12;
|
|
601
|
-
/** Adds a stable branch suffix without exceeding the common filesystem filename byte limit. */ export const getBranchUploadFilename = ({ branch, filename })=>{
|
|
602
|
-
const maximumInitialFilenameByteLength = maximumFilesystemFilenameByteLength - deduplicationSuffixByteReserve;
|
|
603
|
-
const ext = getFileExtension(filename);
|
|
604
|
-
let extension = ext ? `.${ext}` : '';
|
|
605
|
-
const name = extension ? filename.slice(0, -extension.length) : filename;
|
|
606
|
-
const escapedBranch = branch.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
607
|
-
const unscopedName = name.replace(new RegExp(`-${escapedBranch}(?:-\\d+)?$`), '');
|
|
608
|
-
const branchHash = createHash('sha256').update(branch).digest('hex').slice(0, 12);
|
|
609
|
-
const minimumBranchSuffix = `-${branchHash}`;
|
|
610
|
-
const maximumExtensionByteLength = maximumInitialFilenameByteLength - Buffer.byteLength(minimumBranchSuffix) - 1;
|
|
611
|
-
extension = truncateUtf8ByByteLength({
|
|
612
|
-
maximumByteLength: maximumExtensionByteLength,
|
|
613
|
-
value: extension
|
|
614
|
-
});
|
|
615
|
-
const maximumBranchSuffixByteLength = maximumInitialFilenameByteLength - Buffer.byteLength(extension) - 1;
|
|
616
|
-
let branchSuffix = `-${branch}`;
|
|
617
|
-
if (Buffer.byteLength(branchSuffix) > maximumBranchSuffixByteLength) {
|
|
618
|
-
const maximumBranchPrefixByteLength = maximumBranchSuffixByteLength - Buffer.byteLength(minimumBranchSuffix) - 1;
|
|
619
|
-
const branchPrefix = truncateUtf8ByByteLength({
|
|
620
|
-
maximumByteLength: maximumBranchPrefixByteLength,
|
|
621
|
-
value: branch
|
|
622
|
-
});
|
|
623
|
-
branchSuffix = branchPrefix ? `-${branchPrefix}${minimumBranchSuffix}` : minimumBranchSuffix;
|
|
624
|
-
}
|
|
625
|
-
const maximumNameByteLength = maximumInitialFilenameByteLength - Buffer.byteLength(branchSuffix) - Buffer.byteLength(extension);
|
|
626
|
-
const truncatedName = truncateUtf8ByByteLength({
|
|
627
|
-
maximumByteLength: maximumNameByteLength,
|
|
628
|
-
value: unscopedName
|
|
629
|
-
});
|
|
630
|
-
return `${truncatedName}${branchSuffix}${extension}`;
|
|
631
|
-
};
|
|
632
|
-
const truncateUtf8ByByteLength = ({ maximumByteLength, value })=>{
|
|
633
|
-
let byteLength = 0;
|
|
634
|
-
let result = '';
|
|
635
|
-
for (const character of value){
|
|
636
|
-
const characterByteLength = Buffer.byteLength(character);
|
|
637
|
-
if (byteLength + characterByteLength > maximumByteLength) {
|
|
638
|
-
break;
|
|
639
|
-
}
|
|
640
|
-
byteLength += characterByteLength;
|
|
641
|
-
result += character;
|
|
642
|
-
}
|
|
643
|
-
return result;
|
|
644
|
-
};
|
|
645
573
|
/**
|
|
646
574
|
* Parse upload edits from req or incoming data
|
|
647
575
|
*/ function parseUploadEditsFromReqOrIncomingData(args) {
|