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/generateFileData.ts"],"sourcesContent":["import { fileTypeFromBuffer } from 'file-type'\nimport fs from 'fs/promises'\nimport { createHash, randomUUID } from 'node:crypto'\nimport { openAsBlob } from 'node:fs'\n\nimport type { Collection, TypeWithID } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { Document, PayloadRequest } from '../types/index.js'\nimport type { ExternalUploadSource } from './sanitizeUploadData.js'\nimport type { PreparedUploadTransformation } from './transformers/uploadTransformerBridge.js'\nimport type { FileData, FileSizes, FileToSave, UploadEdits } from './types.js'\n\nimport { resolveBranch } from '../branching/resolveBranch.js'\nimport { MAIN_BRANCH } from '../branching/types.js'\nimport { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js'\nimport { formatAdminURL } from '../utilities/formatAdminURL.js'\nimport { isNumber } from '../utilities/isNumber.js'\nimport { canResizeImage } from './canResizeImage.js'\nimport { checkFileRestrictions } from './checkFileRestrictions.js'\nimport { downloadFileToBuffer } from './downloadFileToBuffer.js'\nimport { getOriginalFilename } from './fileVersioning/naming.js'\nimport { generateImageSizeFilename } from './generateImageSizeFilename.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getFileExtension, getSanitizedUploadFilename } from './getFileTypeIdentity.js'\nimport { getImageSize } from './getImageSize.js'\nimport { getSafeFileName, incrementName } from './getSafeFilename.js'\nimport { hasCropOrResizeEdit } from './hasCropOrResizeEdit.js'\nimport { hasFullFileContents } from './hasFullFileContents.js'\nimport { isProcessableImage } from './isProcessableImage.js'\nimport { parseFilename } from './parseFilename.js'\nimport { planTransformerPipeline } from './transformers/planTransformerPipeline.js'\nimport { transformUploadFile } from './transformers/transformUploadFile.js'\nimport {\n getUploadTransformerInternal,\n setUploadFilePath,\n} from './transformers/uploadTransformerBridge.js'\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n draft?: boolean\n externalUploadSource?: ExternalUploadSource\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc?: T\n overwriteExistingFiles?: boolean\n req: PayloadRequest\n throwOnMissingFile?: boolean\n}\n\ntype Result<T> = Promise<{\n data: T\n files: FileToSave[]\n}>\n\nconst shouldReupload = (\n uploadEdits: undefined | UploadEdits,\n fileData: Record<string, unknown> | undefined,\n) => {\n if (!fileData || !uploadEdits) {\n return false\n }\n\n if (hasCropOrResizeEdit(uploadEdits)) {\n return true\n }\n\n // Since uploadEdits always has focalPoint, compare to the value in the data if it was changed\n if (uploadEdits.focalPoint) {\n const incomingFocalX = uploadEdits.focalPoint.x\n const incomingFocalY = uploadEdits.focalPoint.y\n\n const currentFocalX = 'focalX' in fileData && fileData.focalX\n const currentFocalY = 'focalY' in fileData && fileData.focalY\n\n const isEqual = incomingFocalX === currentFocalX && incomingFocalY === currentFocalY\n return !isEqual\n }\n\n return false\n}\n\nexport type TempFileHandling =\n | { sourcePath: string; type: 'copyFromTempFile' }\n | { type: 'skip' }\n | { type: 'useBuffer' }\n\n/**\n * Decides how to get a file's bytes onto disk when no transformer rewrote it (a transformed\n * file is already an in-memory buffer, so it always takes the `useBuffer` path). Copies straight\n * from the temp file when possible, rather than reading a potentially large temp file into memory\n * just to write it back out - see the `generateFileData` function doc for why.\n */\nexport const resolveTempFileHandling = ({\n disableLocalStorage,\n hasProcessedBuffer,\n tempFilePath,\n}: {\n disableLocalStorage: boolean\n hasProcessedBuffer: boolean\n tempFilePath: string | undefined\n}): TempFileHandling => {\n if (hasProcessedBuffer || !tempFilePath) {\n return { type: 'useBuffer' }\n }\n\n return disableLocalStorage\n ? { type: 'skip' }\n : { type: 'copyFromTempFile', sourcePath: tempFilePath }\n}\n\n/**\n * Builds the document's file metadata and the list of files to write to disk.\n *\n * A large client upload may arrive as a temp file instead of an in-memory buffer (see\n * getFileFromUploadInstructions.ts), and `file.data` can hold only a partial probe rather than\n * the full file. To avoid loading such files into memory unnecessarily, no transformer runs\n * unless the full bytes are available, this skips reading a temp file entirely when local\n * storage is disabled, and copies it straight to its destination when local storage is enabled.\n */\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n draft,\n externalUploadSource,\n isDuplicating,\n operation,\n originalDoc,\n overwriteExistingFiles,\n req,\n throwOnMissingFile,\n}: Args<T>): Result<T> => {\n if (!collectionConfig.upload) {\n return {\n data,\n files: [],\n }\n }\n\n const { serverURL } = req.payload.config\n\n let file = isDuplicating ? undefined : req.file\n\n const uploadEdits = parseUploadEditsFromReqOrIncomingData({\n data,\n isDuplicating,\n operation,\n // Only a duplication source informs edit parsing. Updates now also pass `originalDoc` so the\n // stored file can be reprocessed, and that must not change which edits are applied.\n originalDoc: isDuplicating ? originalDoc : undefined,\n req,\n })\n\n const {\n disableLocalStorage,\n focalPoint: focalPointEnabled = true,\n staticDir,\n } = collectionConfig.upload\n const hasManagedCloudStorage = Boolean(collectionConfig.upload.fileOperations)\n const uploadReference = file?.uploadReference\n const hasProviderDirectReference =\n uploadReference && typeof uploadReference === 'object' && !('uploadId' in uploadReference)\n const verifiedOriginal = req.context?._payloadVerifiedProviderOriginal as\n | {\n _objectKey?: string\n filename: string\n key: string\n prefix?: string\n signedReceipt: string\n }\n | undefined\n const providerOriginal =\n hasProviderDirectReference &&\n 'signedReceipt' in uploadReference &&\n uploadReference.signedReceipt === verifiedOriginal?.signedReceipt &&\n verifiedOriginal &&\n typeof collectionConfig.upload.adapter === 'string'\n ? {\n _objectKey: verifiedOriginal._objectKey,\n filename: verifiedOriginal.filename,\n key: verifiedOriginal.key,\n prefix: verifiedOriginal.prefix,\n }\n : undefined\n const shouldStageCloudFiles = hasManagedCloudStorage && !hasProviderDirectReference\n\n const staticPath = staticDir\n\n const incomingFileData: Document = isDuplicating ? originalDoc : data\n const currentFileData = (operation === 'update' ? originalDoc : incomingFileData) as\n | FileData\n | undefined\n const retainedOriginal =\n operation === 'update' &&\n !file &&\n !externalUploadSource &&\n typeof currentFileData?.original?.filename === 'string' &&\n typeof currentFileData.original.url === 'string'\n ? currentFileData.original\n : undefined\n const fileSourceData = externalUploadSource ?? retainedOriginal ?? currentFileData\n let isLocalFile = false\n\n if (\n !file &&\n fileSourceData &&\n (externalUploadSource ||\n isDuplicating ||\n shouldReupload(uploadEdits, incomingFileData as Record<string, unknown>))\n ) {\n const { filename, url } = fileSourceData\n if (filename && (filename.includes('../') || filename.includes('..\\\\'))) {\n throw new Forbidden(req.t)\n }\n\n if ((serverURL && url?.startsWith(serverURL)) || url?.startsWith('/')) {\n isLocalFile = true\n }\n\n try {\n if (!externalUploadSource && !disableLocalStorage && isLocalFile) {\n // File is stored locally\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && retainedOriginal && hasManagedCloudStorage) {\n const { retrieveFileResponse } = await import('./endpoints/getFile.js')\n const response = await retrieveFileResponse({\n collection: { config: collectionConfig },\n doc: originalDoc as TypeWithID,\n filename,\n operation: 'transform',\n req,\n })\n if (!response.ok) {\n throw new Error(`Unable to read retained original ${filename}`)\n }\n const buffer = Buffer.from(await response.arrayBuffer())\n file = {\n name: filename,\n data: buffer,\n mimetype: retainedOriginal.mimeType,\n size: buffer.length,\n }\n overwriteExistingFiles = true\n } else if (filename && url) {\n // File is remote\n file = await downloadFileToBuffer({\n data: fileSourceData,\n req,\n uploadConfig: collectionConfig.upload,\n })\n overwriteExistingFiles = !externalUploadSource\n }\n } catch (err: unknown) {\n throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined)\n }\n\n if (file && retainedOriginal && currentFileData?.filename) {\n file = { ...file, name: currentFileData.filename }\n }\n }\n\n if (isDuplicating) {\n overwriteExistingFiles = false\n }\n\n if (!file) {\n if (throwOnMissingFile) {\n throw new MissingFile(req.t)\n }\n\n return {\n data: incomingFileData!,\n files: [],\n }\n }\n\n const detectedFileType = await checkFileRestrictions({\n collection: collectionConfig,\n file,\n req,\n })\n\n const shouldUseDetectedFileType =\n detectedFileType &&\n (isProcessableImage(file.mimetype) || isProcessableImage(detectedFileType.mime))\n\n if (shouldUseDetectedFileType && detectedFileType.mime !== file.mimetype) {\n file = { ...file, mimetype: detectedFileType.mime }\n }\n\n if (!disableLocalStorage) {\n await fs.mkdir(staticPath!, { recursive: true })\n }\n\n let newData = incomingFileData as T\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const crop = uploadEdits?.crop\n const isResettingCrop =\n retainedOriginal &&\n crop?.unit === '%' &&\n Number(crop.width) === 100 &&\n Number(crop.height) === 100 &&\n Number(crop.x) === 0 &&\n Number(crop.y) === 0 &&\n (uploadEdits.widthInPixels === undefined ||\n Number(uploadEdits.widthInPixels) === retainedOriginal.width) &&\n (uploadEdits.heightInPixels === undefined ||\n Number(uploadEdits.heightInPixels) === retainedOriginal.height)\n const hasFocalPointChange =\n uploadEdits?.focalPoint &&\n (Number(uploadEdits.focalPoint.x) !== (currentFileData?.focalX ?? 50) ||\n Number(uploadEdits.focalPoint.y) !== (currentFileData?.focalY ?? 50))\n const editsForTransformer = isResettingCrop\n ? { ...uploadEdits, crop: undefined, heightInPixels: undefined, widthInPixels: undefined }\n : uploadEdits\n\n try {\n const pipeline = await planTransformerPipeline({\n args: {\n collectionSlug: collectionConfig.slug,\n mimeType: file.mimetype,\n operation: 'upload',\n req,\n },\n capability: 'transformFile',\n transformers: req.payload.config.upload?.transformers ?? [],\n })\n\n // A large client upload can arrive as a bounded probe alongside a temp file. Transformers\n // need the whole file, so leave such an upload untouched rather than buffering it.\n const canRunTransformers = pipeline.length > 0 && hasFullFileContents(file)\n\n const bridgeTransformers = canRunTransformers\n ? pipeline.filter((transformer) =>\n Boolean(getUploadTransformerInternal(transformer)?.prepareUpload),\n )\n : []\n\n const bridgeTransformer =\n bridgeTransformers.find((transformer) =>\n getUploadTransformerInternal(transformer)!.handlesCollection?.({\n collectionSlug: collectionConfig.slug,\n }),\n ) ?? bridgeTransformers[0]\n\n // The chosen bridge's task options are private to it, so other bridges must not see them.\n const bridgeTaskPipeline = pipeline.filter(\n (transformer) =>\n transformer === bridgeTransformer || !bridgeTransformers.includes(transformer),\n )\n\n let originalWebFile: File | undefined\n let mainWebFile: File | undefined\n let hasDimensionsFromBridge = false\n let sizeResults: PreparedUploadTransformation[] = []\n\n if (canRunTransformers) {\n const fileContents = file.tempFilePath ? await openAsBlob(file.tempFilePath) : file.data\n originalWebFile = new File([fileContents], file.name, { type: file.mimetype })\n if (file.tempFilePath) {\n setUploadFilePath(originalWebFile, file.tempFilePath)\n }\n\n if (bridgeTransformer) {\n const bridge = getUploadTransformerInternal(bridgeTransformer)!\n\n const results = await bridge.prepareUpload!({\n collectionSlug: collectionConfig.slug,\n file: originalWebFile,\n req,\n transform: (task) =>\n transformUploadFile({\n collectionSlug: collectionConfig.slug,\n file: task.file ?? originalWebFile!,\n options: task.options,\n pipeline: bridgeTaskPipeline,\n req,\n }),\n uploadEdits: editsForTransformer,\n })\n\n const mainResult = results.find((result) => result.fieldPath === 'filename')\n\n mainWebFile = mainResult?.file ?? originalWebFile\n fileData.width = mainResult?.width\n fileData.height = mainResult?.height\n hasDimensionsFromBridge = true\n sizeResults = results.filter((result) => result.fieldPath !== 'filename')\n } else {\n mainWebFile = await transformUploadFile({\n collectionSlug: collectionConfig.slug,\n file: originalWebFile,\n options: undefined,\n pipeline,\n req,\n })\n }\n }\n\n // Saved for any resizable image, not just one a transformer processed, so it's kept with no\n // transformer registered and on a header-only client upload.\n if (\n focalPointEnabled &&\n uploadEdits?.focalPoint &&\n (hasDimensionsFromBridge || canResizeImage(file.mimetype))\n ) {\n fileData.focalX = isNumber(uploadEdits.focalPoint.x)\n ? Math.round(uploadEdits.focalPoint.x)\n : 50\n fileData.focalY = isNumber(uploadEdits.focalPoint.y)\n ? Math.round(uploadEdits.focalPoint.y)\n : 50\n }\n\n const fileWasTransformed = Boolean(mainWebFile && mainWebFile !== originalWebFile)\n const hasReusableOriginalMain = Boolean(\n isResettingCrop && !fileWasTransformed && retainedOriginal,\n )\n const hasReusableCurrentMain = Boolean(\n !hasReusableOriginalMain &&\n !fileWasTransformed &&\n retainedOriginal &&\n currentFileData?.filename,\n )\n if (hasReusableOriginalMain && !hasFocalPointChange && retainedOriginal) {\n return {\n data: {\n ...incomingFileData,\n _objectKey: retainedOriginal._objectKey,\n filename: retainedOriginal.filename,\n filesize: retainedOriginal.filesize,\n height: retainedOriginal.height,\n mimeType: retainedOriginal.mimeType,\n original: retainedOriginal,\n prefix: retainedOriginal.prefix,\n url: retainedOriginal.url,\n variants: currentFileData?.variants,\n width: retainedOriginal.width,\n ...(draft ? { _status: 'draft' } : {}),\n } as T,\n files: [],\n }\n }\n const mainBuffer = fileWasTransformed\n ? Buffer.from(await mainWebFile!.arrayBuffer())\n : undefined\n\n // A transformed file is named after what the transformer returned, not the upload.\n const outputName = hasReusableOriginalMain\n ? retainedOriginal!.filename\n : (fileWasTransformed && mainWebFile!.name) || file.name\n\n let mimeType: string\n let ext: string | undefined\n\n if (mainBuffer) {\n // Detected bytes win for binary formats (Sharp keeps the input's name and type on a\n // converted output), but text-like output such as CSV has no signature to detect, so\n // fall back to the type and extension the transformer declared on the returned File.\n const typeResult = await fileTypeFromBuffer(mainBuffer)\n ext =\n typeResult?.ext ?? (getFileExtension(getSanitizedUploadFilename(outputName)) || undefined)\n mimeType = typeResult?.mime ?? (mainWebFile!.type || file.mimetype)\n } else {\n mimeType = file.mimetype\n ext = getFileExtension(getSanitizedUploadFilename(file.name))\n }\n\n // Adjust SVG mime type. fromBuffer modifies it.\n if (mimeType === 'application/xml' && ext === 'svg') {\n mimeType = 'image/svg+xml'\n }\n fileData.mimeType = mimeType\n fileData.filesize = mainBuffer ? mainBuffer.length : file.size\n\n // Only probe formats that could carry dimensions - probing reads the file, and a large\n // non-image upload may only exist as a temp file we deliberately never buffer.\n if (!hasDimensionsFromBridge && isProcessableImage(mimeType)) {\n try {\n const probed = await getImageSize({\n file: mainBuffer ? { ...file, data: mainBuffer, tempFilePath: undefined } : file,\n })\n fileData.width = probed.width\n fileData.height = probed.height\n } catch {\n // Not a recognized image format — leave width/height unset.\n }\n }\n\n let fsSafeName = getSanitizedUploadFilename(outputName, ext)\n const branch = resolveBranch(req)\n const isIsolatedProviderUpload = Boolean(\n file.uploadReference &&\n typeof file.uploadReference === 'object' &&\n !Array.isArray(file.uploadReference) &&\n '_objectKey' in file.uploadReference &&\n typeof file.uploadReference._objectKey === 'string',\n )\n const shouldIsolateBranchFile = branch !== MAIN_BRANCH && !isIsolatedProviderUpload\n\n if (shouldIsolateBranchFile) {\n fsSafeName = getBranchUploadFilename({ branch, filename: fsSafeName })\n overwriteExistingFiles = false\n }\n const isDuplicatingAnOriginal =\n isDuplicating && file.name === (originalDoc as FileData | undefined)?.original?.filename\n\n // A provider reference without a receipt names an object the client already stored; renaming\n // it would point the document at a key that was never uploaded.\n const isUnverifiedProviderReference = Boolean(hasProviderDirectReference && !providerOriginal)\n\n if (\n !fileWasTransformed &&\n !retainedOriginal &&\n !providerOriginal &&\n !isDuplicatingAnOriginal &&\n !isUnverifiedProviderReference\n ) {\n fsSafeName = getOriginalFilename({ filename: fsSafeName })\n }\n\n if (hasReusableOriginalMain) {\n fsSafeName = retainedOriginal!.filename\n } else if (hasReusableCurrentMain) {\n fsSafeName = currentFileData!.filename\n } else if (\n !overwriteExistingFiles ||\n !disableLocalStorage ||\n (shouldStageCloudFiles && retainedOriginal)\n ) {\n // Extract prefix if present (added by plugin-cloud-storage)\n const prefix = (data as Record<string, unknown>)?.prefix as string | undefined\n fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n prefix,\n req,\n staticPath: staticPath!,\n })\n }\n\n fileData.filename = fsSafeName\n if (hasReusableOriginalMain) {\n fileData.url = retainedOriginal!.url\n } else if (hasReusableCurrentMain) {\n fileData.filesize = currentFileData!.filesize\n fileData.height = currentFileData!.height\n fileData.mimeType = currentFileData!.mimeType\n fileData.url = currentFileData!.url\n fileData.width = currentFileData!.width\n req.file = { ...file, name: currentFileData!.filename }\n }\n\n const hasGeneratedProviderRepresentations = Boolean(\n providerOriginal &&\n (fileWasTransformed || sizeResults.some((result) => Boolean(result.file))),\n )\n const newObjectKey =\n hasManagedCloudStorage && (shouldStageCloudFiles || hasGeneratedProviderRepresentations)\n ? randomUUID()\n : undefined\n if (newObjectKey) {\n fileData._objectKey = newObjectKey\n }\n if (providerOriginal && !fileWasTransformed) {\n fileData._objectKey = providerOriginal._objectKey\n fileData.prefix = providerOriginal.prefix\n }\n if (hasReusableOriginalMain && retainedOriginal) {\n fileData._objectKey = retainedOriginal._objectKey\n fileData.prefix = retainedOriginal.prefix\n }\n\n if (!disableLocalStorage || shouldStageCloudFiles || providerOriginal) {\n const originalFilename =\n retainedOriginal?.filename ??\n providerOriginal?.filename ??\n (fileWasTransformed\n ? await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: getOriginalFilename({\n filename: getSanitizedUploadFilename(file.name),\n }),\n req,\n staticPath: staticPath!,\n })\n : fsSafeName)\n const original =\n retainedOriginal ??\n ({\n _objectKey: providerOriginal ? providerOriginal._objectKey : newObjectKey,\n filename: originalFilename,\n filesize: file.size,\n mimeType: file.mimetype,\n prefix: providerOriginal?.prefix ?? currentFileData?.prefix,\n url: formatAdminURL({\n apiRoute: req.payload.config.routes.api,\n path: `/${collectionConfig.slug}/file/${encodeURIComponent(originalFilename)}`,\n relative: true,\n serverURL: req.payload.config.serverURL,\n }),\n } as NonNullable<FileData['original']>)\n\n if (!retainedOriginal && isProcessableImage(file.mimetype)) {\n try {\n const dimensions = await getImageSize({ file })\n original.width = dimensions.width\n original.height = dimensions.height\n } catch {\n // Files with an image MIME type may not have readable dimensions.\n }\n }\n\n fileData.original = original\n\n if (providerOriginal) {\n if (!fileWasTransformed) {\n fileData.filename = originalFilename\n }\n }\n\n if (fileWasTransformed && !retainedOriginal && !providerOriginal) {\n filesToSave.push({\n buffer: Buffer.from(await originalWebFile!.arrayBuffer()),\n path: `${staticPath}/${originalFilename}`,\n })\n }\n }\n\n if (mainBuffer) {\n // The stored bytes are no longer the ones the client uploaded, so the client's upload\n // reference must not be reused for them.\n delete file.uploadReference\n\n filesToSave.push({\n buffer: mainBuffer,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, mainBuffer)\n } else {\n req.file = {\n ...file,\n data: mainBuffer,\n size: mainBuffer.length,\n }\n }\n } else if (!hasReusableOriginalMain && !hasReusableCurrentMain) {\n // file.data is empty when useTempFiles is on, so the real content lives at\n // file.tempFilePath instead (see the function doc for why we avoid buffering it).\n const tempFileHandling = resolveTempFileHandling({\n disableLocalStorage: Boolean(disableLocalStorage) && !shouldStageCloudFiles,\n hasProcessedBuffer: false,\n tempFilePath: file.tempFilePath,\n })\n\n if (tempFileHandling.type === 'copyFromTempFile') {\n filesToSave.push({\n path: `${staticPath}/${fsSafeName}`,\n sourcePath: tempFileHandling.sourcePath,\n })\n } else if (tempFileHandling.type === 'useBuffer') {\n const bufferToSave = file.tempFilePath ? await fs.readFile(file.tempFilePath) : file.data\n\n // A 'header'/'none' content requirement (see getFileContentRequirement.ts) means\n // file.data is only a partial probe, not the real content - never save it as-is.\n const fileDataIsPartialView = !file.tempFilePath && bufferToSave.length !== file.size\n\n if (!fileDataIsPartialView) {\n filesToSave.push({\n buffer: bufferToSave,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n if (bufferToSave.length > 0) {\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, bufferToSave)\n } else {\n // Keep req.file in sync, since downstream hooks/plugins may read it.\n req.file = {\n ...file,\n data: bufferToSave,\n size: bufferToSave.length,\n }\n }\n }\n }\n }\n }\n\n if (sizeResults.length > 0) {\n req.payloadUploadSizes = {}\n const sizes: FileSizes = {}\n const { name: baseName, ext: baseExt } = parseFilename(fsSafeName)\n const plannedNames = new Set([fileData.original?.filename, fsSafeName])\n const plannedSizeBuffers = new Map<string, Buffer>()\n\n for (const result of sizeResults) {\n const sizeName = result.fieldPath.slice('variants.'.length)\n\n if (!result.file) {\n sizes[sizeName] = {\n filename: null,\n filesize: null,\n height: null,\n mimeType: null,\n url: null,\n width: null,\n }\n continue\n }\n\n const sizeBuffer = Buffer.from(await result.file.arrayBuffer())\n const sizeTypeResult = await fileTypeFromBuffer(sizeBuffer)\n const sizeExt = sizeTypeResult?.ext || baseExt\n const sizeMimeType = sizeTypeResult?.mime || result.mimeType || fileData.mimeType\n\n req.payloadUploadSizes[sizeName] = sizeBuffer\n\n const imageSizeConfig = collectionConfig.upload.variants?.find(\n (imageSize) => imageSize.name === sizeName,\n )\n\n const imageNameWithDimensions = imageSizeConfig?.generateImageName\n ? imageSizeConfig.generateImageName({\n extension: sizeExt,\n height: result.height!,\n originalName: baseName,\n sizeName,\n width: result.width!,\n })\n : generateImageSizeFilename({\n extension: sizeExt,\n height: result.height!,\n outputImageName: baseName,\n width: result.width!,\n })\n\n let imageName = imageNameWithDimensions\n\n if (!disableLocalStorage || shouldStageCloudFiles) {\n const prefix = (data as Record<string, unknown>)?.prefix as string | undefined\n\n while (true) {\n imageName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: imageName,\n prefix,\n req,\n staticPath: disableLocalStorage ? undefined : staticPath!,\n })\n if (plannedSizeBuffers.get(imageName)?.equals(sizeBuffer)) {\n break\n }\n if (!plannedNames.has(imageName)) {\n break\n }\n imageName = incrementName(imageName)\n }\n plannedNames.add(imageName)\n }\n\n const imagePath = `${staticPath}/${imageName}`\n\n sizes[sizeName] = {\n _objectKey: newObjectKey,\n filename: imageName,\n filesize: sizeBuffer.length,\n height: result.height!,\n mimeType: sizeMimeType,\n prefix: providerOriginal?.prefix ?? currentFileData?.prefix,\n url: null,\n width: result.width!,\n }\n\n if (!plannedSizeBuffers.has(imageName)) {\n plannedSizeBuffers.set(imageName, sizeBuffer)\n filesToSave.push({\n buffer: sizeBuffer,\n path: imagePath,\n })\n }\n }\n\n fileData.variants = sizes\n }\n } catch (err) {\n req.payload.logger.error(err)\n throw new FileUploadError(req.t)\n }\n\n newData = {\n ...newData,\n ...fileData,\n ...(draft ? { _status: 'draft' } : {}),\n }\n\n return {\n data: newData,\n files: filesToSave,\n }\n}\n\nconst maximumFilesystemFilenameByteLength = 255\n// `getSafeFileName` can add a numeric suffix. Reserve `-` plus 11 digits for that step.\nconst deduplicationSuffixByteReserve = 12\n\n/** Adds a stable branch suffix without exceeding the common filesystem filename byte limit. */\nexport const getBranchUploadFilename = ({\n branch,\n filename,\n}: {\n branch: string\n filename: string\n}): string => {\n const maximumInitialFilenameByteLength =\n maximumFilesystemFilenameByteLength - deduplicationSuffixByteReserve\n const ext = getFileExtension(filename)\n let extension = ext ? `.${ext}` : ''\n const name = extension ? filename.slice(0, -extension.length) : filename\n const escapedBranch = branch.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const unscopedName = name.replace(new RegExp(`-${escapedBranch}(?:-\\\\d+)?$`), '')\n const branchHash = createHash('sha256').update(branch).digest('hex').slice(0, 12)\n const minimumBranchSuffix = `-${branchHash}`\n const maximumExtensionByteLength =\n maximumInitialFilenameByteLength - Buffer.byteLength(minimumBranchSuffix) - 1\n\n extension = truncateUtf8ByByteLength({\n maximumByteLength: maximumExtensionByteLength,\n value: extension,\n })\n\n const maximumBranchSuffixByteLength =\n maximumInitialFilenameByteLength - Buffer.byteLength(extension) - 1\n let branchSuffix = `-${branch}`\n\n if (Buffer.byteLength(branchSuffix) > maximumBranchSuffixByteLength) {\n const maximumBranchPrefixByteLength =\n maximumBranchSuffixByteLength - Buffer.byteLength(minimumBranchSuffix) - 1\n const branchPrefix = truncateUtf8ByByteLength({\n maximumByteLength: maximumBranchPrefixByteLength,\n value: branch,\n })\n\n branchSuffix = branchPrefix ? `-${branchPrefix}${minimumBranchSuffix}` : minimumBranchSuffix\n }\n\n const maximumNameByteLength =\n maximumInitialFilenameByteLength -\n Buffer.byteLength(branchSuffix) -\n Buffer.byteLength(extension)\n const truncatedName = truncateUtf8ByByteLength({\n maximumByteLength: maximumNameByteLength,\n value: unscopedName,\n })\n\n return `${truncatedName}${branchSuffix}${extension}`\n}\n\nconst truncateUtf8ByByteLength = ({\n maximumByteLength,\n value,\n}: {\n maximumByteLength: number\n value: string\n}): string => {\n let byteLength = 0\n let result = ''\n\n for (const character of value) {\n const characterByteLength = Buffer.byteLength(character)\n\n if (byteLength + characterByteLength > maximumByteLength) {\n break\n }\n\n byteLength += characterByteLength\n result += character\n }\n\n return result\n}\n\n/**\n * Parse upload edits from req or incoming data\n */\nfunction parseUploadEditsFromReqOrIncomingData(args: {\n data: unknown\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc: unknown\n req: PayloadRequest\n}): UploadEdits {\n const { data, isDuplicating, operation, originalDoc, req } = args\n\n // Get intended focal point change from query string or incoming data\n const uploadEdits =\n req.query?.uploadEdits && typeof req.query.uploadEdits === 'object'\n ? (req.query.uploadEdits as UploadEdits)\n : {}\n\n if (uploadEdits.focalPoint) {\n return uploadEdits\n }\n\n const incomingData = data as FileData\n const origDoc = originalDoc as FileData\n\n if (origDoc && 'focalX' in origDoc && 'focalY' in origDoc) {\n // Admin always resends the current focal point, so treat an unchanged value as no edit.\n if (incomingData?.focalX === origDoc.focalX && incomingData?.focalY === origDoc.focalY) {\n return undefined!\n }\n\n if (isDuplicating) {\n uploadEdits.focalPoint = {\n x: incomingData?.focalX || origDoc.focalX!,\n y: incomingData?.focalY || origDoc.focalY!,\n }\n return uploadEdits\n }\n }\n\n if (incomingData?.focalX && incomingData?.focalY) {\n uploadEdits.focalPoint = {\n x: incomingData.focalX,\n y: incomingData.focalY,\n }\n return uploadEdits\n }\n\n // If no focal point is set, default to center\n if (operation === 'create') {\n uploadEdits.focalPoint = {\n x: 50,\n y: 50,\n }\n }\n\n return uploadEdits\n}\n"],"names":["fileTypeFromBuffer","fs","createHash","randomUUID","openAsBlob","resolveBranch","MAIN_BRANCH","FileRetrievalError","FileUploadError","Forbidden","MissingFile","formatAdminURL","isNumber","canResizeImage","checkFileRestrictions","downloadFileToBuffer","getOriginalFilename","generateImageSizeFilename","getFileByPath","getFileExtension","getSanitizedUploadFilename","getImageSize","getSafeFileName","incrementName","hasCropOrResizeEdit","hasFullFileContents","isProcessableImage","parseFilename","planTransformerPipeline","transformUploadFile","getUploadTransformerInternal","setUploadFilePath","shouldReupload","uploadEdits","fileData","focalPoint","incomingFocalX","x","incomingFocalY","y","currentFocalX","focalX","currentFocalY","focalY","isEqual","resolveTempFileHandling","disableLocalStorage","hasProcessedBuffer","tempFilePath","type","sourcePath","generateFileData","collection","config","collectionConfig","data","draft","externalUploadSource","isDuplicating","operation","originalDoc","overwriteExistingFiles","req","throwOnMissingFile","upload","files","serverURL","payload","file","undefined","parseUploadEditsFromReqOrIncomingData","focalPointEnabled","staticDir","hasManagedCloudStorage","Boolean","fileOperations","uploadReference","hasProviderDirectReference","verifiedOriginal","context","_payloadVerifiedProviderOriginal","providerOriginal","signedReceipt","adapter","_objectKey","filename","key","prefix","shouldStageCloudFiles","staticPath","incomingFileData","currentFileData","retainedOriginal","original","url","fileSourceData","isLocalFile","includes","t","startsWith","filePath","response","retrieveFileResponse","doc","ok","Error","buffer","Buffer","from","arrayBuffer","name","mimetype","mimeType","size","length","uploadConfig","err","message","detectedFileType","shouldUseDetectedFileType","mime","mkdir","recursive","newData","filesToSave","crop","isResettingCrop","unit","Number","width","height","widthInPixels","heightInPixels","hasFocalPointChange","editsForTransformer","pipeline","args","collectionSlug","slug","capability","transformers","canRunTransformers","bridgeTransformers","filter","transformer","prepareUpload","bridgeTransformer","find","handlesCollection","bridgeTaskPipeline","originalWebFile","mainWebFile","hasDimensionsFromBridge","sizeResults","fileContents","File","bridge","results","transform","task","options","mainResult","result","fieldPath","Math","round","fileWasTransformed","hasReusableOriginalMain","hasReusableCurrentMain","filesize","variants","_status","mainBuffer","outputName","ext","typeResult","probed","fsSafeName","branch","isIsolatedProviderUpload","Array","isArray","shouldIsolateBranchFile","getBranchUploadFilename","isDuplicatingAnOriginal","isUnverifiedProviderReference","desiredFilename","hasGeneratedProviderRepresentations","some","newObjectKey","originalFilename","apiRoute","routes","api","path","encodeURIComponent","relative","dimensions","push","writeFile","tempFileHandling","bufferToSave","readFile","fileDataIsPartialView","payloadUploadSizes","sizes","baseName","baseExt","plannedNames","Set","plannedSizeBuffers","Map","sizeName","slice","sizeBuffer","sizeTypeResult","sizeExt","sizeMimeType","imageSizeConfig","imageSize","imageNameWithDimensions","generateImageName","extension","originalName","outputImageName","imageName","get","equals","has","add","imagePath","set","logger","error","maximumFilesystemFilenameByteLength","deduplicationSuffixByteReserve","maximumInitialFilenameByteLength","escapedBranch","replace","unscopedName","RegExp","branchHash","update","digest","minimumBranchSuffix","maximumExtensionByteLength","byteLength","truncateUtf8ByByteLength","maximumByteLength","value","maximumBranchSuffixByteLength","branchSuffix","maximumBranchPrefixByteLength","branchPrefix","maximumNameByteLength","truncatedName","character","characterByteLength","query","incomingData","origDoc"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import { fileTypeFromBuffer } from 'file-type'\nimport fs from 'fs/promises'\nimport { randomUUID } from 'node:crypto'\nimport { openAsBlob } from 'node:fs'\n\nimport type { Collection, TypeWithID } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { Document, PayloadRequest } from '../types/index.js'\nimport type { ExternalUploadSource } from './sanitizeUploadData.js'\nimport type { PreparedUploadTransformation } from './transformers/uploadTransformerBridge.js'\nimport type { FileData, FileSizes, FileToSave, UploadEdits } from './types.js'\n\nimport { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js'\nimport { formatAdminURL } from '../utilities/formatAdminURL.js'\nimport { isNumber } from '../utilities/isNumber.js'\nimport { canResizeImage } from './canResizeImage.js'\nimport { checkFileRestrictions } from './checkFileRestrictions.js'\nimport { downloadFileToBuffer } from './downloadFileToBuffer.js'\nimport { getOriginalFilename } from './fileVersioning/naming.js'\nimport { generateImageSizeFilename } from './generateImageSizeFilename.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getFileExtension, getSanitizedUploadFilename } from './getFileTypeIdentity.js'\nimport { getImageSize } from './getImageSize.js'\nimport { getSafeFileName, incrementName } from './getSafeFilename.js'\nimport { hasCropOrResizeEdit } from './hasCropOrResizeEdit.js'\nimport { hasFullFileContents } from './hasFullFileContents.js'\nimport { isProcessableImage } from './isProcessableImage.js'\nimport { parseFilename } from './parseFilename.js'\nimport { planTransformerPipeline } from './transformers/planTransformerPipeline.js'\nimport { transformUploadFile } from './transformers/transformUploadFile.js'\nimport {\n getUploadTransformerInternal,\n setUploadFilePath,\n} from './transformers/uploadTransformerBridge.js'\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n draft?: boolean\n externalUploadSource?: ExternalUploadSource\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc?: T\n overwriteExistingFiles?: boolean\n req: PayloadRequest\n throwOnMissingFile?: boolean\n}\n\ntype Result<T> = Promise<{\n data: T\n files: FileToSave[]\n}>\n\nconst shouldReupload = (\n uploadEdits: undefined | UploadEdits,\n fileData: Record<string, unknown> | undefined,\n) => {\n if (!fileData || !uploadEdits) {\n return false\n }\n\n if (hasCropOrResizeEdit(uploadEdits)) {\n return true\n }\n\n // Since uploadEdits always has focalPoint, compare to the value in the data if it was changed\n if (uploadEdits.focalPoint) {\n const incomingFocalX = uploadEdits.focalPoint.x\n const incomingFocalY = uploadEdits.focalPoint.y\n\n const currentFocalX = 'focalX' in fileData && fileData.focalX\n const currentFocalY = 'focalY' in fileData && fileData.focalY\n\n const isEqual = incomingFocalX === currentFocalX && incomingFocalY === currentFocalY\n return !isEqual\n }\n\n return false\n}\n\nexport type TempFileHandling =\n | { sourcePath: string; type: 'copyFromTempFile' }\n | { type: 'skip' }\n | { type: 'useBuffer' }\n\n/**\n * Decides how to get a file's bytes onto disk when no transformer rewrote it (a transformed\n * file is already an in-memory buffer, so it always takes the `useBuffer` path). Copies straight\n * from the temp file when possible, rather than reading a potentially large temp file into memory\n * just to write it back out - see the `generateFileData` function doc for why.\n */\nexport const resolveTempFileHandling = ({\n disableLocalStorage,\n hasProcessedBuffer,\n tempFilePath,\n}: {\n disableLocalStorage: boolean\n hasProcessedBuffer: boolean\n tempFilePath: string | undefined\n}): TempFileHandling => {\n if (hasProcessedBuffer || !tempFilePath) {\n return { type: 'useBuffer' }\n }\n\n return disableLocalStorage\n ? { type: 'skip' }\n : { type: 'copyFromTempFile', sourcePath: tempFilePath }\n}\n\n/**\n * Builds the document's file metadata and the list of files to write to disk.\n *\n * A large client upload may arrive as a temp file instead of an in-memory buffer (see\n * getFileFromUploadInstructions.ts), and `file.data` can hold only a partial probe rather than\n * the full file. To avoid loading such files into memory unnecessarily, no transformer runs\n * unless the full bytes are available, this skips reading a temp file entirely when local\n * storage is disabled, and copies it straight to its destination when local storage is enabled.\n */\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n draft,\n externalUploadSource,\n isDuplicating,\n operation,\n originalDoc,\n overwriteExistingFiles,\n req,\n throwOnMissingFile,\n}: Args<T>): Result<T> => {\n if (!collectionConfig.upload) {\n return {\n data,\n files: [],\n }\n }\n\n const { serverURL } = req.payload.config\n\n let file = isDuplicating ? undefined : req.file\n\n const uploadEdits = parseUploadEditsFromReqOrIncomingData({\n data,\n isDuplicating,\n operation,\n // Only a duplication source informs edit parsing. Updates now also pass `originalDoc` so the\n // stored file can be reprocessed, and that must not change which edits are applied.\n originalDoc: isDuplicating ? originalDoc : undefined,\n req,\n })\n\n const {\n disableLocalStorage,\n focalPoint: focalPointEnabled = true,\n staticDir,\n } = collectionConfig.upload\n const hasManagedCloudStorage = Boolean(collectionConfig.upload.fileOperations)\n const uploadReference = file?.uploadReference\n const hasProviderDirectReference =\n uploadReference && typeof uploadReference === 'object' && !('uploadId' in uploadReference)\n const verifiedOriginal = req.context?._payloadVerifiedProviderOriginal as\n | {\n _objectKey?: string\n filename: string\n key: string\n prefix?: string\n signedReceipt: string\n }\n | undefined\n const providerOriginal =\n hasProviderDirectReference &&\n 'signedReceipt' in uploadReference &&\n uploadReference.signedReceipt === verifiedOriginal?.signedReceipt &&\n verifiedOriginal &&\n typeof collectionConfig.upload.adapter === 'string'\n ? {\n _objectKey: verifiedOriginal._objectKey,\n filename: verifiedOriginal.filename,\n key: verifiedOriginal.key,\n prefix: verifiedOriginal.prefix,\n }\n : undefined\n const shouldStageCloudFiles = hasManagedCloudStorage && !hasProviderDirectReference\n\n const staticPath = staticDir\n\n const incomingFileData: Document = isDuplicating ? originalDoc : data\n const currentFileData = (operation === 'update' ? originalDoc : incomingFileData) as\n | FileData\n | undefined\n const retainedOriginal =\n operation === 'update' &&\n !file &&\n !externalUploadSource &&\n typeof currentFileData?.original?.filename === 'string' &&\n typeof currentFileData.original.url === 'string'\n ? currentFileData.original\n : undefined\n const fileSourceData = externalUploadSource ?? retainedOriginal ?? currentFileData\n let isLocalFile = false\n\n if (\n !file &&\n fileSourceData &&\n (externalUploadSource ||\n isDuplicating ||\n shouldReupload(uploadEdits, incomingFileData as Record<string, unknown>))\n ) {\n const { filename, url } = fileSourceData\n if (filename && (filename.includes('../') || filename.includes('..\\\\'))) {\n throw new Forbidden(req.t)\n }\n\n if ((serverURL && url?.startsWith(serverURL)) || url?.startsWith('/')) {\n isLocalFile = true\n }\n\n try {\n if (!externalUploadSource && !disableLocalStorage && isLocalFile) {\n // File is stored locally\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && retainedOriginal && hasManagedCloudStorage) {\n const { retrieveFileResponse } = await import('./endpoints/getFile.js')\n const response = await retrieveFileResponse({\n collection: { config: collectionConfig },\n doc: originalDoc as TypeWithID,\n filename,\n operation: 'transform',\n req,\n })\n if (!response.ok) {\n throw new Error(`Unable to read retained original ${filename}`)\n }\n const buffer = Buffer.from(await response.arrayBuffer())\n file = {\n name: filename,\n data: buffer,\n mimetype: retainedOriginal.mimeType,\n size: buffer.length,\n }\n overwriteExistingFiles = true\n } else if (filename && url) {\n // File is remote\n file = await downloadFileToBuffer({\n data: fileSourceData,\n req,\n uploadConfig: collectionConfig.upload,\n })\n overwriteExistingFiles = !externalUploadSource\n }\n } catch (err: unknown) {\n throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined)\n }\n\n if (file && retainedOriginal && currentFileData?.filename) {\n file = { ...file, name: currentFileData.filename }\n }\n }\n\n if (isDuplicating) {\n overwriteExistingFiles = false\n }\n\n if (!file) {\n if (throwOnMissingFile) {\n throw new MissingFile(req.t)\n }\n\n return {\n data: incomingFileData!,\n files: [],\n }\n }\n\n const detectedFileType = await checkFileRestrictions({\n collection: collectionConfig,\n file,\n req,\n })\n\n const shouldUseDetectedFileType =\n detectedFileType &&\n (isProcessableImage(file.mimetype) || isProcessableImage(detectedFileType.mime))\n\n if (shouldUseDetectedFileType && detectedFileType.mime !== file.mimetype) {\n file = { ...file, mimetype: detectedFileType.mime }\n }\n\n if (!disableLocalStorage) {\n await fs.mkdir(staticPath!, { recursive: true })\n }\n\n let newData = incomingFileData as T\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const crop = uploadEdits?.crop\n const isResettingCrop =\n retainedOriginal &&\n crop?.unit === '%' &&\n Number(crop.width) === 100 &&\n Number(crop.height) === 100 &&\n Number(crop.x) === 0 &&\n Number(crop.y) === 0 &&\n (uploadEdits.widthInPixels === undefined ||\n Number(uploadEdits.widthInPixels) === retainedOriginal.width) &&\n (uploadEdits.heightInPixels === undefined ||\n Number(uploadEdits.heightInPixels) === retainedOriginal.height)\n const hasFocalPointChange =\n uploadEdits?.focalPoint &&\n (Number(uploadEdits.focalPoint.x) !== (currentFileData?.focalX ?? 50) ||\n Number(uploadEdits.focalPoint.y) !== (currentFileData?.focalY ?? 50))\n const editsForTransformer = isResettingCrop\n ? { ...uploadEdits, crop: undefined, heightInPixels: undefined, widthInPixels: undefined }\n : uploadEdits\n\n try {\n const pipeline = await planTransformerPipeline({\n args: {\n collectionSlug: collectionConfig.slug,\n mimeType: file.mimetype,\n operation: 'upload',\n req,\n },\n capability: 'transformFile',\n transformers: req.payload.config.upload?.transformers ?? [],\n })\n\n // A large client upload can arrive as a bounded probe alongside a temp file. Transformers\n // need the whole file, so leave such an upload untouched rather than buffering it.\n const canRunTransformers = pipeline.length > 0 && hasFullFileContents(file)\n\n const bridgeTransformers = canRunTransformers\n ? pipeline.filter((transformer) =>\n Boolean(getUploadTransformerInternal(transformer)?.prepareUpload),\n )\n : []\n\n const bridgeTransformer =\n bridgeTransformers.find((transformer) =>\n getUploadTransformerInternal(transformer)!.handlesCollection?.({\n collectionSlug: collectionConfig.slug,\n }),\n ) ?? bridgeTransformers[0]\n\n // The chosen bridge's task options are private to it, so other bridges must not see them.\n const bridgeTaskPipeline = pipeline.filter(\n (transformer) =>\n transformer === bridgeTransformer || !bridgeTransformers.includes(transformer),\n )\n\n let originalWebFile: File | undefined\n let mainWebFile: File | undefined\n let hasDimensionsFromBridge = false\n let sizeResults: PreparedUploadTransformation[] = []\n\n if (canRunTransformers) {\n const fileContents = file.tempFilePath ? await openAsBlob(file.tempFilePath) : file.data\n originalWebFile = new File([fileContents], file.name, { type: file.mimetype })\n if (file.tempFilePath) {\n setUploadFilePath(originalWebFile, file.tempFilePath)\n }\n\n if (bridgeTransformer) {\n const bridge = getUploadTransformerInternal(bridgeTransformer)!\n\n const results = await bridge.prepareUpload!({\n collectionSlug: collectionConfig.slug,\n file: originalWebFile,\n req,\n transform: (task) =>\n transformUploadFile({\n collectionSlug: collectionConfig.slug,\n file: task.file ?? originalWebFile!,\n options: task.options,\n pipeline: bridgeTaskPipeline,\n req,\n }),\n uploadEdits: editsForTransformer,\n })\n\n const mainResult = results.find((result) => result.fieldPath === 'filename')\n\n mainWebFile = mainResult?.file ?? originalWebFile\n fileData.width = mainResult?.width\n fileData.height = mainResult?.height\n hasDimensionsFromBridge = true\n sizeResults = results.filter((result) => result.fieldPath !== 'filename')\n } else {\n mainWebFile = await transformUploadFile({\n collectionSlug: collectionConfig.slug,\n file: originalWebFile,\n options: undefined,\n pipeline,\n req,\n })\n }\n }\n\n // Saved for any resizable image, not just one a transformer processed, so it's kept with no\n // transformer registered and on a header-only client upload.\n if (\n focalPointEnabled &&\n uploadEdits?.focalPoint &&\n (hasDimensionsFromBridge || canResizeImage(file.mimetype))\n ) {\n fileData.focalX = isNumber(uploadEdits.focalPoint.x)\n ? Math.round(uploadEdits.focalPoint.x)\n : 50\n fileData.focalY = isNumber(uploadEdits.focalPoint.y)\n ? Math.round(uploadEdits.focalPoint.y)\n : 50\n }\n\n const fileWasTransformed = Boolean(mainWebFile && mainWebFile !== originalWebFile)\n const hasReusableOriginalMain = Boolean(\n isResettingCrop && !fileWasTransformed && retainedOriginal,\n )\n if (hasReusableOriginalMain && !hasFocalPointChange && retainedOriginal) {\n return {\n data: {\n ...incomingFileData,\n _objectKey: retainedOriginal._objectKey,\n filename: retainedOriginal.filename,\n filesize: retainedOriginal.filesize,\n height: retainedOriginal.height,\n mimeType: retainedOriginal.mimeType,\n original: retainedOriginal,\n prefix: retainedOriginal.prefix,\n url: retainedOriginal.url,\n variants: currentFileData?.variants,\n width: retainedOriginal.width,\n ...(draft ? { _status: 'draft' } : {}),\n } as T,\n files: [],\n }\n }\n const mainBuffer = fileWasTransformed\n ? Buffer.from(await mainWebFile!.arrayBuffer())\n : undefined\n\n // A transformed file is named after what the transformer returned, not the upload.\n const outputName = hasReusableOriginalMain\n ? retainedOriginal!.filename\n : (fileWasTransformed && mainWebFile!.name) || file.name\n\n let mimeType: string\n let ext: string | undefined\n\n if (mainBuffer) {\n // Detected bytes win for binary formats (Sharp keeps the input's name and type on a\n // converted output), but text-like output such as CSV has no signature to detect, so\n // fall back to the type and extension the transformer declared on the returned File.\n const typeResult = await fileTypeFromBuffer(mainBuffer)\n ext =\n typeResult?.ext ?? (getFileExtension(getSanitizedUploadFilename(outputName)) || undefined)\n mimeType = typeResult?.mime ?? (mainWebFile!.type || file.mimetype)\n } else {\n mimeType = file.mimetype\n ext = getFileExtension(getSanitizedUploadFilename(file.name))\n }\n\n // Adjust SVG mime type. fromBuffer modifies it.\n if (mimeType === 'application/xml' && ext === 'svg') {\n mimeType = 'image/svg+xml'\n }\n fileData.mimeType = mimeType\n fileData.filesize = mainBuffer ? mainBuffer.length : file.size\n\n // Only probe formats that could carry dimensions - probing reads the file, and a large\n // non-image upload may only exist as a temp file we deliberately never buffer.\n if (!hasDimensionsFromBridge && isProcessableImage(mimeType)) {\n try {\n const probed = await getImageSize({\n file: mainBuffer ? { ...file, data: mainBuffer, tempFilePath: undefined } : file,\n })\n fileData.width = probed.width\n fileData.height = probed.height\n } catch {\n // Not a recognized image format — leave width/height unset.\n }\n }\n\n let fsSafeName = getSanitizedUploadFilename(outputName, ext)\n const isDuplicatingAnOriginal =\n isDuplicating && file.name === (originalDoc as FileData | undefined)?.original?.filename\n\n // A provider reference without a receipt names an object the client already stored; renaming\n // it would point the document at a key that was never uploaded.\n const isUnverifiedProviderReference = Boolean(hasProviderDirectReference && !providerOriginal)\n\n if (\n !fileWasTransformed &&\n !retainedOriginal &&\n !providerOriginal &&\n !isDuplicatingAnOriginal &&\n !isUnverifiedProviderReference\n ) {\n fsSafeName = getOriginalFilename({ filename: fsSafeName })\n }\n\n if (hasReusableOriginalMain) {\n fsSafeName = retainedOriginal!.filename\n } else if (\n !overwriteExistingFiles ||\n !disableLocalStorage ||\n (shouldStageCloudFiles && retainedOriginal)\n ) {\n // Extract prefix if present (added by plugin-cloud-storage)\n const prefix = (data as Record<string, unknown>)?.prefix as string | undefined\n fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n prefix,\n req,\n staticPath: staticPath!,\n })\n }\n\n fileData.filename = fsSafeName\n if (hasReusableOriginalMain) {\n fileData.url = retainedOriginal!.url\n }\n\n const hasGeneratedProviderRepresentations = Boolean(\n providerOriginal &&\n (fileWasTransformed || sizeResults.some((result) => Boolean(result.file))),\n )\n const newObjectKey =\n hasManagedCloudStorage && (shouldStageCloudFiles || hasGeneratedProviderRepresentations)\n ? randomUUID()\n : undefined\n if (newObjectKey) {\n fileData._objectKey = newObjectKey\n }\n if (providerOriginal && !fileWasTransformed) {\n fileData._objectKey = providerOriginal._objectKey\n fileData.prefix = providerOriginal.prefix\n }\n if (hasReusableOriginalMain && retainedOriginal) {\n fileData._objectKey = retainedOriginal._objectKey\n fileData.prefix = retainedOriginal.prefix\n }\n\n if (!disableLocalStorage || shouldStageCloudFiles || providerOriginal) {\n const originalFilename =\n retainedOriginal?.filename ??\n providerOriginal?.filename ??\n (fileWasTransformed\n ? await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: getOriginalFilename({\n filename: getSanitizedUploadFilename(file.name),\n }),\n req,\n staticPath: staticPath!,\n })\n : fsSafeName)\n const original = retainedOriginal ?? {\n _objectKey: providerOriginal ? providerOriginal._objectKey : newObjectKey,\n filename: originalFilename,\n filesize: file.size,\n mimeType: file.mimetype,\n prefix: providerOriginal?.prefix ?? currentFileData?.prefix,\n url: formatAdminURL({\n apiRoute: req.payload.config.routes.api,\n path: `/${collectionConfig.slug}/file/${encodeURIComponent(originalFilename)}`,\n relative: true,\n serverURL: req.payload.config.serverURL,\n }),\n }\n\n if (!retainedOriginal && isProcessableImage(file.mimetype)) {\n try {\n const dimensions = await getImageSize({ file })\n original.width = dimensions.width\n original.height = dimensions.height\n } catch {\n // Files with an image MIME type may not have readable dimensions.\n }\n }\n\n fileData.original = original\n\n if (providerOriginal) {\n if (!fileWasTransformed) {\n fileData.filename = originalFilename\n }\n }\n\n if (fileWasTransformed && !retainedOriginal && !providerOriginal) {\n filesToSave.push({\n buffer: Buffer.from(await originalWebFile!.arrayBuffer()),\n path: `${staticPath}/${originalFilename}`,\n })\n }\n }\n\n if (mainBuffer) {\n // The stored bytes are no longer the ones the client uploaded, so the client's upload\n // reference must not be reused for them.\n delete file.uploadReference\n\n filesToSave.push({\n buffer: mainBuffer,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, mainBuffer)\n } else {\n req.file = {\n ...file,\n data: mainBuffer,\n size: mainBuffer.length,\n }\n }\n } else if (!hasReusableOriginalMain) {\n // file.data is empty when useTempFiles is on, so the real content lives at\n // file.tempFilePath instead (see the function doc for why we avoid buffering it).\n const tempFileHandling = resolveTempFileHandling({\n disableLocalStorage: Boolean(disableLocalStorage) && !shouldStageCloudFiles,\n hasProcessedBuffer: false,\n tempFilePath: file.tempFilePath,\n })\n\n if (tempFileHandling.type === 'copyFromTempFile') {\n filesToSave.push({\n path: `${staticPath}/${fsSafeName}`,\n sourcePath: tempFileHandling.sourcePath,\n })\n } else if (tempFileHandling.type === 'useBuffer') {\n const bufferToSave = file.tempFilePath ? await fs.readFile(file.tempFilePath) : file.data\n\n // A 'header'/'none' content requirement (see getFileContentRequirement.ts) means\n // file.data is only a partial probe, not the real content - never save it as-is.\n const fileDataIsPartialView = !file.tempFilePath && bufferToSave.length !== file.size\n\n if (!fileDataIsPartialView) {\n filesToSave.push({\n buffer: bufferToSave,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n if (bufferToSave.length > 0) {\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, bufferToSave)\n } else {\n // Keep req.file in sync, since downstream hooks/plugins may read it.\n req.file = {\n ...file,\n data: bufferToSave,\n size: bufferToSave.length,\n }\n }\n }\n }\n }\n }\n\n if (sizeResults.length > 0) {\n req.payloadUploadSizes = {}\n const sizes: FileSizes = {}\n const { name: baseName, ext: baseExt } = parseFilename(fsSafeName)\n const plannedNames = new Set([fileData.original?.filename, fsSafeName])\n const plannedSizeBuffers = new Map<string, Buffer>()\n\n for (const result of sizeResults) {\n const sizeName = result.fieldPath.slice('variants.'.length)\n\n if (!result.file) {\n sizes[sizeName] = {\n filename: null,\n filesize: null,\n height: null,\n mimeType: null,\n url: null,\n width: null,\n }\n continue\n }\n\n const sizeBuffer = Buffer.from(await result.file.arrayBuffer())\n const sizeTypeResult = await fileTypeFromBuffer(sizeBuffer)\n const sizeExt = sizeTypeResult?.ext || baseExt\n const sizeMimeType = sizeTypeResult?.mime || result.mimeType || fileData.mimeType\n\n req.payloadUploadSizes[sizeName] = sizeBuffer\n\n const imageSizeConfig = collectionConfig.upload.variants?.find(\n (imageSize) => imageSize.name === sizeName,\n )\n\n const imageNameWithDimensions = imageSizeConfig?.generateImageName\n ? imageSizeConfig.generateImageName({\n extension: sizeExt,\n height: result.height!,\n originalName: baseName,\n sizeName,\n width: result.width!,\n })\n : generateImageSizeFilename({\n extension: sizeExt,\n height: result.height!,\n outputImageName: baseName,\n width: result.width!,\n })\n\n let imageName = imageNameWithDimensions\n\n if (!disableLocalStorage || shouldStageCloudFiles) {\n const prefix = (data as Record<string, unknown>)?.prefix as string | undefined\n\n while (true) {\n imageName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: imageName,\n prefix,\n req,\n staticPath: disableLocalStorage ? undefined : staticPath!,\n })\n if (plannedSizeBuffers.get(imageName)?.equals(sizeBuffer)) {\n break\n }\n if (!plannedNames.has(imageName)) {\n break\n }\n imageName = incrementName(imageName)\n }\n plannedNames.add(imageName)\n }\n\n const imagePath = `${staticPath}/${imageName}`\n\n sizes[sizeName] = {\n _objectKey: newObjectKey,\n filename: imageName,\n filesize: sizeBuffer.length,\n height: result.height!,\n mimeType: sizeMimeType,\n prefix: providerOriginal?.prefix ?? currentFileData?.prefix,\n url: null,\n width: result.width!,\n }\n\n if (!plannedSizeBuffers.has(imageName)) {\n plannedSizeBuffers.set(imageName, sizeBuffer)\n filesToSave.push({\n buffer: sizeBuffer,\n path: imagePath,\n })\n }\n }\n\n fileData.variants = sizes\n }\n } catch (err) {\n req.payload.logger.error(err)\n throw new FileUploadError(req.t)\n }\n\n newData = {\n ...newData,\n ...fileData,\n ...(draft ? { _status: 'draft' } : {}),\n }\n\n return {\n data: newData,\n files: filesToSave,\n }\n}\n\n/**\n * Parse upload edits from req or incoming data\n */\nfunction parseUploadEditsFromReqOrIncomingData(args: {\n data: unknown\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc: unknown\n req: PayloadRequest\n}): UploadEdits {\n const { data, isDuplicating, operation, originalDoc, req } = args\n\n // Get intended focal point change from query string or incoming data\n const uploadEdits =\n req.query?.uploadEdits && typeof req.query.uploadEdits === 'object'\n ? (req.query.uploadEdits as UploadEdits)\n : {}\n\n if (uploadEdits.focalPoint) {\n return uploadEdits\n }\n\n const incomingData = data as FileData\n const origDoc = originalDoc as FileData\n\n if (origDoc && 'focalX' in origDoc && 'focalY' in origDoc) {\n // Admin always resends the current focal point, so treat an unchanged value as no edit.\n if (incomingData?.focalX === origDoc.focalX && incomingData?.focalY === origDoc.focalY) {\n return undefined!\n }\n\n if (isDuplicating) {\n uploadEdits.focalPoint = {\n x: incomingData?.focalX || origDoc.focalX!,\n y: incomingData?.focalY || origDoc.focalY!,\n }\n return uploadEdits\n }\n }\n\n if (incomingData?.focalX && incomingData?.focalY) {\n uploadEdits.focalPoint = {\n x: incomingData.focalX,\n y: incomingData.focalY,\n }\n return uploadEdits\n }\n\n // If no focal point is set, default to center\n if (operation === 'create') {\n uploadEdits.focalPoint = {\n x: 50,\n y: 50,\n }\n }\n\n return uploadEdits\n}\n"],"names":["fileTypeFromBuffer","fs","randomUUID","openAsBlob","FileRetrievalError","FileUploadError","Forbidden","MissingFile","formatAdminURL","isNumber","canResizeImage","checkFileRestrictions","downloadFileToBuffer","getOriginalFilename","generateImageSizeFilename","getFileByPath","getFileExtension","getSanitizedUploadFilename","getImageSize","getSafeFileName","incrementName","hasCropOrResizeEdit","hasFullFileContents","isProcessableImage","parseFilename","planTransformerPipeline","transformUploadFile","getUploadTransformerInternal","setUploadFilePath","shouldReupload","uploadEdits","fileData","focalPoint","incomingFocalX","x","incomingFocalY","y","currentFocalX","focalX","currentFocalY","focalY","isEqual","resolveTempFileHandling","disableLocalStorage","hasProcessedBuffer","tempFilePath","type","sourcePath","generateFileData","collection","config","collectionConfig","data","draft","externalUploadSource","isDuplicating","operation","originalDoc","overwriteExistingFiles","req","throwOnMissingFile","upload","files","serverURL","payload","file","undefined","parseUploadEditsFromReqOrIncomingData","focalPointEnabled","staticDir","hasManagedCloudStorage","Boolean","fileOperations","uploadReference","hasProviderDirectReference","verifiedOriginal","context","_payloadVerifiedProviderOriginal","providerOriginal","signedReceipt","adapter","_objectKey","filename","key","prefix","shouldStageCloudFiles","staticPath","incomingFileData","currentFileData","retainedOriginal","original","url","fileSourceData","isLocalFile","includes","t","startsWith","filePath","response","retrieveFileResponse","doc","ok","Error","buffer","Buffer","from","arrayBuffer","name","mimetype","mimeType","size","length","uploadConfig","err","message","detectedFileType","shouldUseDetectedFileType","mime","mkdir","recursive","newData","filesToSave","crop","isResettingCrop","unit","Number","width","height","widthInPixels","heightInPixels","hasFocalPointChange","editsForTransformer","pipeline","args","collectionSlug","slug","capability","transformers","canRunTransformers","bridgeTransformers","filter","transformer","prepareUpload","bridgeTransformer","find","handlesCollection","bridgeTaskPipeline","originalWebFile","mainWebFile","hasDimensionsFromBridge","sizeResults","fileContents","File","bridge","results","transform","task","options","mainResult","result","fieldPath","Math","round","fileWasTransformed","hasReusableOriginalMain","filesize","variants","_status","mainBuffer","outputName","ext","typeResult","probed","fsSafeName","isDuplicatingAnOriginal","isUnverifiedProviderReference","desiredFilename","hasGeneratedProviderRepresentations","some","newObjectKey","originalFilename","apiRoute","routes","api","path","encodeURIComponent","relative","dimensions","push","writeFile","tempFileHandling","bufferToSave","readFile","fileDataIsPartialView","payloadUploadSizes","sizes","baseName","baseExt","plannedNames","Set","plannedSizeBuffers","Map","sizeName","slice","sizeBuffer","sizeTypeResult","sizeExt","sizeMimeType","imageSizeConfig","imageSize","imageNameWithDimensions","generateImageName","extension","originalName","outputImageName","imageName","get","equals","has","add","imagePath","set","logger","error","query","incomingData","origDoc"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getBaseFields.d.ts","sourceRoot":"","sources":["../../src/uploads/getBaseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"getBaseFields.d.ts","sourceRoot":"","sources":["../../src/uploads/getBaseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AAmBtD,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,gBAAgB,CAAA;IAC5B,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,eAAO,MAAM,mBAAmB,2BAA4B,OAAO,KAAG,KAAK,EA4U1E,CAAA"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { appendBranchToFileURL } from './appendBranchToFileURL.js';
|
|
2
1
|
import { generateFilePathOrURL } from './generateFilePathOrURL.js';
|
|
3
2
|
import { mimeTypeValidator } from './mimeTypeValidator.js';
|
|
4
3
|
import { validateUploadFilename } from './validateUploadFilename.js';
|
|
@@ -35,24 +34,17 @@ export const getBaseUploadFields = ({ collection, config })=>{
|
|
|
35
34
|
({ originalDoc, req })=>{
|
|
36
35
|
const adminThumbnail = typeof collection.upload !== 'boolean' ? collection.upload?.adminThumbnail : undefined;
|
|
37
36
|
if (typeof adminThumbnail === 'function') {
|
|
38
|
-
|
|
37
|
+
return adminThumbnail({
|
|
39
38
|
doc: originalDoc
|
|
40
39
|
});
|
|
41
|
-
return typeof customThumbnailURL === 'string' ? appendBranchToFileURL({
|
|
42
|
-
req,
|
|
43
|
-
url: customThumbnailURL
|
|
44
|
-
}) : customThumbnailURL;
|
|
45
40
|
}
|
|
46
|
-
return
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
serverURL: req.payload.config.serverURL,
|
|
54
|
-
urlOrPath: typeof adminThumbnail === 'string' ? originalDoc.variants?.[adminThumbnail]?.url : undefined
|
|
55
|
-
})
|
|
41
|
+
return generateFilePathOrURL({
|
|
42
|
+
collectionSlug: collection.slug,
|
|
43
|
+
config,
|
|
44
|
+
filename: typeof adminThumbnail === 'string' ? originalDoc.variants?.[adminThumbnail]?.filename : undefined,
|
|
45
|
+
relative: false,
|
|
46
|
+
serverURL: req.payload.config.serverURL,
|
|
47
|
+
urlOrPath: typeof adminThumbnail === 'string' ? originalDoc.variants?.[adminThumbnail]?.url : undefined
|
|
56
48
|
});
|
|
57
49
|
}
|
|
58
50
|
]
|
|
@@ -118,16 +110,13 @@ export const getBaseUploadFields = ({ collection, config })=>{
|
|
|
118
110
|
...url,
|
|
119
111
|
hooks: {
|
|
120
112
|
afterRead: [
|
|
121
|
-
({ data, originalDoc, req, value })=>
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
serverURL: req.payload.config.serverURL,
|
|
129
|
-
urlOrPath: value
|
|
130
|
-
})
|
|
113
|
+
({ data, originalDoc, req, value })=>generateFilePathOrURL({
|
|
114
|
+
collectionSlug: collection.slug,
|
|
115
|
+
config,
|
|
116
|
+
filename: data?.filename || originalDoc?.filename,
|
|
117
|
+
relative: false,
|
|
118
|
+
serverURL: req.payload.config.serverURL,
|
|
119
|
+
urlOrPath: value
|
|
131
120
|
})
|
|
132
121
|
],
|
|
133
122
|
beforeChange: [
|
|
@@ -165,16 +154,13 @@ export const getBaseUploadFields = ({ collection, config })=>{
|
|
|
165
154
|
hooks: {
|
|
166
155
|
afterRead: [
|
|
167
156
|
({ data, originalDoc, req, value })=>{
|
|
168
|
-
return
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
serverURL: req.payload.config.serverURL,
|
|
176
|
-
urlOrPath: value
|
|
177
|
-
})
|
|
157
|
+
return generateFilePathOrURL({
|
|
158
|
+
collectionSlug: collection.slug,
|
|
159
|
+
config,
|
|
160
|
+
filename: data?.original?.filename || originalDoc?.original?.filename,
|
|
161
|
+
relative: false,
|
|
162
|
+
serverURL: req.payload.config.serverURL,
|
|
163
|
+
urlOrPath: value
|
|
178
164
|
});
|
|
179
165
|
}
|
|
180
166
|
],
|
|
@@ -264,16 +250,13 @@ export const getBaseUploadFields = ({ collection, config })=>{
|
|
|
264
250
|
},
|
|
265
251
|
hooks: {
|
|
266
252
|
afterRead: [
|
|
267
|
-
({ collection, data, originalDoc, req, value })=>
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
serverURL: req.payload.config.serverURL,
|
|
275
|
-
urlOrPath: value
|
|
276
|
-
})
|
|
253
|
+
({ collection, data, originalDoc, req, value })=>generateFilePathOrURL({
|
|
254
|
+
collectionSlug: collection?.slug,
|
|
255
|
+
config,
|
|
256
|
+
filename: data?.variants?.[size.name]?.filename || originalDoc?.variants?.[size.name]?.filename,
|
|
257
|
+
relative: false,
|
|
258
|
+
serverURL: req.payload.config.serverURL,
|
|
259
|
+
urlOrPath: value
|
|
277
260
|
})
|
|
278
261
|
],
|
|
279
262
|
beforeChange: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/uploads/getBaseFields.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { Config } from '../config/types.js'\nimport type { Field } from '../fields/config/types.js'\nimport type { SanitizedUploadConfig } from './types.js'\n\nimport { appendBranchToFileURL } from './appendBranchToFileURL.js'\nimport { generateFilePathOrURL } from './generateFilePathOrURL.js'\nimport { mimeTypeValidator } from './mimeTypeValidator.js'\nimport { validateUploadFilename } from './validateUploadFilename.js'\n\nconst disabledFromImageSize = (\n sizeAdmin: { disabled?: { column?: boolean; filter?: boolean; groupBy?: boolean } } | undefined,\n): { disabled: { column: boolean; filter: boolean; groupBy: boolean } } => {\n return {\n disabled: {\n column: sizeAdmin?.disabled?.column ?? false,\n filter: sizeAdmin?.disabled?.filter ?? false,\n groupBy: sizeAdmin?.disabled?.groupBy ?? false,\n },\n }\n}\n\ntype Options = {\n collection: CollectionConfig\n config: Config\n}\n\nexport const getBaseUploadFields = ({ collection, config }: Options): Field[] => {\n // `variants` only exists once a transformer (e.g. Sharp) has written it back during init.\n const uploadOptions: Partial<SanitizedUploadConfig> =\n typeof collection.upload === 'object' ? collection.upload : {}\n\n const mimeType: Field = {\n name: 'mimeType',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: 'MIME Type',\n }\n\n const thumbnailURL: Field = {\n name: 'thumbnailURL',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n hooks: {\n afterRead: [\n ({ originalDoc, req }) => {\n const adminThumbnail =\n typeof collection.upload !== 'boolean' ? collection.upload?.adminThumbnail : undefined\n\n if (typeof adminThumbnail === 'function') {\n const customThumbnailURL = adminThumbnail({ doc: originalDoc })\n\n return typeof customThumbnailURL === 'string'\n ? appendBranchToFileURL({ req, url: customThumbnailURL })\n : customThumbnailURL\n }\n\n return appendBranchToFileURL({\n req,\n url: generateFilePathOrURL({\n collectionSlug: collection.slug,\n config,\n filename:\n typeof adminThumbnail === 'string'\n ? (originalDoc.variants?.[adminThumbnail]?.filename as string)\n : undefined,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath:\n typeof adminThumbnail === 'string'\n ? (originalDoc.variants?.[adminThumbnail]?.url as string)\n : undefined,\n }),\n })\n },\n ],\n },\n label: 'Thumbnail URL',\n }\n\n const width: Field = {\n name: 'width',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:width'),\n }\n\n const height: Field = {\n name: 'height',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:height'),\n }\n\n const filesize: Field = {\n name: 'filesize',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:fileSize'),\n }\n\n const filename: Field = {\n name: 'filename',\n type: 'text',\n admin: {\n disabled: { bulkEdit: true },\n hidden: true,\n readOnly: true,\n },\n index: true,\n label: ({ t }) => t('upload:fileName'),\n validate: validateUploadFilename,\n }\n\n // Only set unique: true if the collection does not have a compound index\n if (\n collection.upload === true ||\n (typeof collection.upload === 'object' && !collection.upload.filenameCompoundIndex)\n ) {\n filename.unique = true\n }\n\n const url: Field = {\n name: 'url',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: 'URL',\n }\n\n let uploadFields: Field[] = [\n {\n ...url,\n hooks: {\n afterRead: [\n ({ data, originalDoc, req, value }) =>\n appendBranchToFileURL({\n req,\n url: generateFilePathOrURL({\n collectionSlug: collection.slug,\n config,\n filename: data?.filename || originalDoc?.filename,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n }),\n ],\n beforeChange: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename: data?.filename || originalDoc?.filename,\n relative: true,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n },\n },\n thumbnailURL,\n filename,\n mimeType,\n filesize,\n width,\n height,\n {\n name: 'original',\n type: 'group',\n admin: {\n hidden: true,\n readOnly: true,\n },\n fields: [\n { ...filename, unique: false },\n {\n ...url,\n hooks: {\n afterRead: [\n ({ data, originalDoc, req, value }) => {\n return appendBranchToFileURL({\n req,\n url: generateFilePathOrURL({\n collectionSlug: collection.slug,\n config,\n filename: data?.original?.filename || originalDoc?.original?.filename,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n })\n },\n ],\n beforeChange: [\n ({ data, originalDoc, req, value }) => {\n return generateFilePathOrURL({\n collectionSlug: collection.slug,\n config,\n filename: data?.original?.filename || originalDoc?.original?.filename,\n relative: true,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n })\n },\n ],\n },\n },\n mimeType,\n filesize,\n width,\n height,\n {\n name: 'prefix',\n type: 'text',\n admin: { disabled: true, hidden: true, readOnly: true },\n },\n {\n name: '_objectKey',\n type: 'text',\n admin: { disabled: true, hidden: true, readOnly: true },\n },\n ],\n },\n ]\n\n // Add focal point fields if not disabled\n if (\n uploadOptions.focalPoint !== false ||\n uploadOptions.variants ||\n uploadOptions.hasImageAdjustments\n ) {\n uploadFields = uploadFields.concat(\n ['focalX', 'focalY'].map((name) => {\n return {\n name,\n type: 'number',\n admin: {\n disabled: { column: true, filter: true, groupBy: true },\n hidden: true,\n },\n }\n }),\n )\n }\n\n if (uploadOptions.mimeTypes) {\n mimeType.validate = mimeTypeValidator(uploadOptions.mimeTypes)\n }\n\n if (uploadOptions.variants) {\n uploadFields = uploadFields.concat([\n {\n name: 'variants',\n type: 'group',\n admin: {\n hidden: true,\n },\n fields: uploadOptions.variants.map((size) => ({\n name: size.name,\n type: 'group',\n admin: {\n hidden: true,\n ...disabledFromImageSize(size.admin),\n },\n fields: [\n {\n ...url,\n admin: {\n ...url.admin,\n ...disabledFromImageSize(size.admin),\n },\n hooks: {\n afterRead: [\n ({ collection, data, originalDoc, req, value }) =>\n appendBranchToFileURL({\n req,\n url: generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename:\n data?.variants?.[size.name]?.filename ||\n originalDoc?.variants?.[size.name]?.filename,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n }),\n ],\n beforeChange: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename:\n data?.variants?.[size.name]?.filename ||\n originalDoc?.variants?.[size.name]?.filename,\n relative: true,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n },\n },\n {\n ...width,\n admin: {\n ...width.admin,\n ...disabledFromImageSize(size.admin),\n },\n },\n {\n ...height,\n admin: {\n ...height.admin,\n ...disabledFromImageSize(size.admin),\n },\n },\n {\n ...mimeType,\n admin: {\n ...mimeType.admin,\n ...disabledFromImageSize(size.admin),\n },\n },\n {\n ...filesize,\n admin: {\n ...filesize.admin,\n ...disabledFromImageSize(size.admin),\n },\n },\n {\n ...filename,\n admin: {\n ...filename.admin,\n ...disabledFromImageSize(size.admin),\n },\n unique: false,\n },\n {\n name: 'prefix',\n type: 'text',\n admin: { disabled: true, hidden: true, readOnly: true },\n },\n {\n name: '_objectKey',\n type: 'text',\n admin: { disabled: true, hidden: true, readOnly: true },\n },\n ],\n label: size.name,\n })),\n label: ({ t }) => t('upload:sizes'),\n },\n ])\n }\n return uploadFields\n}\n"],"names":["appendBranchToFileURL","generateFilePathOrURL","mimeTypeValidator","validateUploadFilename","disabledFromImageSize","sizeAdmin","disabled","column","filter","groupBy","getBaseUploadFields","collection","config","uploadOptions","upload","mimeType","name","type","admin","hidden","readOnly","label","thumbnailURL","hooks","afterRead","originalDoc","req","adminThumbnail","undefined","customThumbnailURL","doc","url","collectionSlug","slug","filename","variants","relative","serverURL","payload","urlOrPath","width","t","height","filesize","bulkEdit","index","validate","filenameCompoundIndex","unique","uploadFields","data","value","beforeChange","fields","original","focalPoint","hasImageAdjustments","concat","map","mimeTypes","size"],"mappings":"AAKA,SAASA,qBAAqB,QAAQ,6BAA4B;AAClE,SAASC,qBAAqB,QAAQ,6BAA4B;AAClE,SAASC,iBAAiB,QAAQ,yBAAwB;AAC1D,SAASC,sBAAsB,QAAQ,8BAA6B;AAEpE,MAAMC,wBAAwB,CAC5BC;IAEA,OAAO;QACLC,UAAU;YACRC,QAAQF,WAAWC,UAAUC,UAAU;YACvCC,QAAQH,WAAWC,UAAUE,UAAU;YACvCC,SAASJ,WAAWC,UAAUG,WAAW;QAC3C;IACF;AACF;AAOA,OAAO,MAAMC,sBAAsB,CAAC,EAAEC,UAAU,EAAEC,MAAM,EAAW;IACjE,0FAA0F;IAC1F,MAAMC,gBACJ,OAAOF,WAAWG,MAAM,KAAK,WAAWH,WAAWG,MAAM,GAAG,CAAC;IAE/D,MAAMC,WAAkB;QACtBC,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,QAAQ;YACRC,UAAU;QACZ;QACAC,OAAO;IACT;IAEA,MAAMC,eAAsB;QAC1BN,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,QAAQ;YACRC,UAAU;QACZ;QACAG,OAAO;YACLC,WAAW;gBACT,CAAC,EAAEC,WAAW,EAAEC,GAAG,EAAE;oBACnB,MAAMC,iBACJ,OAAOhB,WAAWG,MAAM,KAAK,YAAYH,WAAWG,MAAM,EAAEa,iBAAiBC;oBAE/E,IAAI,OAAOD,mBAAmB,YAAY;wBACxC,MAAME,qBAAqBF,eAAe;4BAAEG,KAAKL;wBAAY;wBAE7D,OAAO,OAAOI,uBAAuB,WACjC7B,sBAAsB;4BAAE0B;4BAAKK,KAAKF;wBAAmB,KACrDA;oBACN;oBAEA,OAAO7B,sBAAsB;wBAC3B0B;wBACAK,KAAK9B,sBAAsB;4BACzB+B,gBAAgBrB,WAAWsB,IAAI;4BAC/BrB;4BACAsB,UACE,OAAOP,mBAAmB,WACrBF,YAAYU,QAAQ,EAAE,CAACR,eAAe,EAAEO,WACzCN;4BACNQ,UAAU;4BACVC,WAAWX,IAAIY,OAAO,CAAC1B,MAAM,CAACyB,SAAS;4BACvCE,WACE,OAAOZ,mBAAmB,WACrBF,YAAYU,QAAQ,EAAE,CAACR,eAAe,EAAEI,MACzCH;wBACR;oBACF;gBACF;aACD;QACH;QACAP,OAAO;IACT;IAEA,MAAMmB,QAAe;QACnBxB,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,QAAQ;YACRC,UAAU;QACZ;QACAC,OAAO,CAAC,EAAEoB,CAAC,EAAE,GAAKA,EAAE;IACtB;IAEA,MAAMC,SAAgB;QACpB1B,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,QAAQ;YACRC,UAAU;QACZ;QACAC,OAAO,CAAC,EAAEoB,CAAC,EAAE,GAAKA,EAAE;IACtB;IAEA,MAAME,WAAkB;QACtB3B,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,QAAQ;YACRC,UAAU;QACZ;QACAC,OAAO,CAAC,EAAEoB,CAAC,EAAE,GAAKA,EAAE;IACtB;IAEA,MAAMP,WAAkB;QACtBlB,MAAM;QACNC,MAAM;QACNC,OAAO;YACLZ,UAAU;gBAAEsC,UAAU;YAAK;YAC3BzB,QAAQ;YACRC,UAAU;QACZ;QACAyB,OAAO;QACPxB,OAAO,CAAC,EAAEoB,CAAC,EAAE,GAAKA,EAAE;QACpBK,UAAU3C;IACZ;IAEA,yEAAyE;IACzE,IACEQ,WAAWG,MAAM,KAAK,QACrB,OAAOH,WAAWG,MAAM,KAAK,YAAY,CAACH,WAAWG,MAAM,CAACiC,qBAAqB,EAClF;QACAb,SAASc,MAAM,GAAG;IACpB;IAEA,MAAMjB,MAAa;QACjBf,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,QAAQ;YACRC,UAAU;QACZ;QACAC,OAAO;IACT;IAEA,IAAI4B,eAAwB;QAC1B;YACE,GAAGlB,GAAG;YACNR,OAAO;gBACLC,WAAW;oBACT,CAAC,EAAE0B,IAAI,EAAEzB,WAAW,EAAEC,GAAG,EAAEyB,KAAK,EAAE,GAChCnD,sBAAsB;4BACpB0B;4BACAK,KAAK9B,sBAAsB;gCACzB+B,gBAAgBrB,WAAWsB,IAAI;gCAC/BrB;gCACAsB,UAAUgB,MAAMhB,YAAYT,aAAaS;gCACzCE,UAAU;gCACVC,WAAWX,IAAIY,OAAO,CAAC1B,MAAM,CAACyB,SAAS;gCACvCE,WAAWY;4BACb;wBACF;iBACH;gBACDC,cAAc;oBACZ,CAAC,EAAEzC,UAAU,EAAEuC,IAAI,EAAEzB,WAAW,EAAEC,GAAG,EAAEyB,KAAK,EAAE,GAC5ClD,sBAAsB;4BACpB+B,gBAAgBrB,YAAYsB;4BAC5BrB;4BACAsB,UAAUgB,MAAMhB,YAAYT,aAAaS;4BACzCE,UAAU;4BACVC,WAAWX,IAAIY,OAAO,CAAC1B,MAAM,CAACyB,SAAS;4BACvCE,WAAWY;wBACb;iBACH;YACH;QACF;QACA7B;QACAY;QACAnB;QACA4B;QACAH;QACAE;QACA;YACE1B,MAAM;YACNC,MAAM;YACNC,OAAO;gBACLC,QAAQ;gBACRC,UAAU;YACZ;YACAiC,QAAQ;gBACN;oBAAE,GAAGnB,QAAQ;oBAAEc,QAAQ;gBAAM;gBAC7B;oBACE,GAAGjB,GAAG;oBACNR,OAAO;wBACLC,WAAW;4BACT,CAAC,EAAE0B,IAAI,EAAEzB,WAAW,EAAEC,GAAG,EAAEyB,KAAK,EAAE;gCAChC,OAAOnD,sBAAsB;oCAC3B0B;oCACAK,KAAK9B,sBAAsB;wCACzB+B,gBAAgBrB,WAAWsB,IAAI;wCAC/BrB;wCACAsB,UAAUgB,MAAMI,UAAUpB,YAAYT,aAAa6B,UAAUpB;wCAC7DE,UAAU;wCACVC,WAAWX,IAAIY,OAAO,CAAC1B,MAAM,CAACyB,SAAS;wCACvCE,WAAWY;oCACb;gCACF;4BACF;yBACD;wBACDC,cAAc;4BACZ,CAAC,EAAEF,IAAI,EAAEzB,WAAW,EAAEC,GAAG,EAAEyB,KAAK,EAAE;gCAChC,OAAOlD,sBAAsB;oCAC3B+B,gBAAgBrB,WAAWsB,IAAI;oCAC/BrB;oCACAsB,UAAUgB,MAAMI,UAAUpB,YAAYT,aAAa6B,UAAUpB;oCAC7DE,UAAU;oCACVC,WAAWX,IAAIY,OAAO,CAAC1B,MAAM,CAACyB,SAAS;oCACvCE,WAAWY;gCACb;4BACF;yBACD;oBACH;gBACF;gBACApC;gBACA4B;gBACAH;gBACAE;gBACA;oBACE1B,MAAM;oBACNC,MAAM;oBACNC,OAAO;wBAAEZ,UAAU;wBAAMa,QAAQ;wBAAMC,UAAU;oBAAK;gBACxD;gBACA;oBACEJ,MAAM;oBACNC,MAAM;oBACNC,OAAO;wBAAEZ,UAAU;wBAAMa,QAAQ;wBAAMC,UAAU;oBAAK;gBACxD;aACD;QACH;KACD;IAED,yCAAyC;IACzC,IACEP,cAAc0C,UAAU,KAAK,SAC7B1C,cAAcsB,QAAQ,IACtBtB,cAAc2C,mBAAmB,EACjC;QACAP,eAAeA,aAAaQ,MAAM,CAChC;YAAC;YAAU;SAAS,CAACC,GAAG,CAAC,CAAC1C;YACxB,OAAO;gBACLA;gBACAC,MAAM;gBACNC,OAAO;oBACLZ,UAAU;wBAAEC,QAAQ;wBAAMC,QAAQ;wBAAMC,SAAS;oBAAK;oBACtDU,QAAQ;gBACV;YACF;QACF;IAEJ;IAEA,IAAIN,cAAc8C,SAAS,EAAE;QAC3B5C,SAAS+B,QAAQ,GAAG5C,kBAAkBW,cAAc8C,SAAS;IAC/D;IAEA,IAAI9C,cAAcsB,QAAQ,EAAE;QAC1Bc,eAAeA,aAAaQ,MAAM,CAAC;YACjC;gBACEzC,MAAM;gBACNC,MAAM;gBACNC,OAAO;oBACLC,QAAQ;gBACV;gBACAkC,QAAQxC,cAAcsB,QAAQ,CAACuB,GAAG,CAAC,CAACE,OAAU,CAAA;wBAC5C5C,MAAM4C,KAAK5C,IAAI;wBACfC,MAAM;wBACNC,OAAO;4BACLC,QAAQ;4BACR,GAAGf,sBAAsBwD,KAAK1C,KAAK,CAAC;wBACtC;wBACAmC,QAAQ;4BACN;gCACE,GAAGtB,GAAG;gCACNb,OAAO;oCACL,GAAGa,IAAIb,KAAK;oCACZ,GAAGd,sBAAsBwD,KAAK1C,KAAK,CAAC;gCACtC;gCACAK,OAAO;oCACLC,WAAW;wCACT,CAAC,EAAEb,UAAU,EAAEuC,IAAI,EAAEzB,WAAW,EAAEC,GAAG,EAAEyB,KAAK,EAAE,GAC5CnD,sBAAsB;gDACpB0B;gDACAK,KAAK9B,sBAAsB;oDACzB+B,gBAAgBrB,YAAYsB;oDAC5BrB;oDACAsB,UACEgB,MAAMf,UAAU,CAACyB,KAAK5C,IAAI,CAAC,EAAEkB,YAC7BT,aAAaU,UAAU,CAACyB,KAAK5C,IAAI,CAAC,EAAEkB;oDACtCE,UAAU;oDACVC,WAAWX,IAAIY,OAAO,CAAC1B,MAAM,CAACyB,SAAS;oDACvCE,WAAWY;gDACb;4CACF;qCACH;oCACDC,cAAc;wCACZ,CAAC,EAAEzC,UAAU,EAAEuC,IAAI,EAAEzB,WAAW,EAAEC,GAAG,EAAEyB,KAAK,EAAE,GAC5ClD,sBAAsB;gDACpB+B,gBAAgBrB,YAAYsB;gDAC5BrB;gDACAsB,UACEgB,MAAMf,UAAU,CAACyB,KAAK5C,IAAI,CAAC,EAAEkB,YAC7BT,aAAaU,UAAU,CAACyB,KAAK5C,IAAI,CAAC,EAAEkB;gDACtCE,UAAU;gDACVC,WAAWX,IAAIY,OAAO,CAAC1B,MAAM,CAACyB,SAAS;gDACvCE,WAAWY;4CACb;qCACH;gCACH;4BACF;4BACA;gCACE,GAAGX,KAAK;gCACRtB,OAAO;oCACL,GAAGsB,MAAMtB,KAAK;oCACd,GAAGd,sBAAsBwD,KAAK1C,KAAK,CAAC;gCACtC;4BACF;4BACA;gCACE,GAAGwB,MAAM;gCACTxB,OAAO;oCACL,GAAGwB,OAAOxB,KAAK;oCACf,GAAGd,sBAAsBwD,KAAK1C,KAAK,CAAC;gCACtC;4BACF;4BACA;gCACE,GAAGH,QAAQ;gCACXG,OAAO;oCACL,GAAGH,SAASG,KAAK;oCACjB,GAAGd,sBAAsBwD,KAAK1C,KAAK,CAAC;gCACtC;4BACF;4BACA;gCACE,GAAGyB,QAAQ;gCACXzB,OAAO;oCACL,GAAGyB,SAASzB,KAAK;oCACjB,GAAGd,sBAAsBwD,KAAK1C,KAAK,CAAC;gCACtC;4BACF;4BACA;gCACE,GAAGgB,QAAQ;gCACXhB,OAAO;oCACL,GAAGgB,SAAShB,KAAK;oCACjB,GAAGd,sBAAsBwD,KAAK1C,KAAK,CAAC;gCACtC;gCACA8B,QAAQ;4BACV;4BACA;gCACEhC,MAAM;gCACNC,MAAM;gCACNC,OAAO;oCAAEZ,UAAU;oCAAMa,QAAQ;oCAAMC,UAAU;gCAAK;4BACxD;4BACA;gCACEJ,MAAM;gCACNC,MAAM;gCACNC,OAAO;oCAAEZ,UAAU;oCAAMa,QAAQ;oCAAMC,UAAU;gCAAK;4BACxD;yBACD;wBACDC,OAAOuC,KAAK5C,IAAI;oBAClB,CAAA;gBACAK,OAAO,CAAC,EAAEoB,CAAC,EAAE,GAAKA,EAAE;YACtB;SACD;IACH;IACA,OAAOQ;AACT,EAAC"}
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/getBaseFields.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { Config } from '../config/types.js'\nimport type { Field } from '../fields/config/types.js'\nimport type { SanitizedUploadConfig } from './types.js'\n\nimport { generateFilePathOrURL } from './generateFilePathOrURL.js'\nimport { mimeTypeValidator } from './mimeTypeValidator.js'\nimport { validateUploadFilename } from './validateUploadFilename.js'\n\nconst disabledFromImageSize = (\n sizeAdmin: { disabled?: { column?: boolean; filter?: boolean; groupBy?: boolean } } | undefined,\n): { disabled: { column: boolean; filter: boolean; groupBy: boolean } } => {\n return {\n disabled: {\n column: sizeAdmin?.disabled?.column ?? false,\n filter: sizeAdmin?.disabled?.filter ?? false,\n groupBy: sizeAdmin?.disabled?.groupBy ?? false,\n },\n }\n}\n\ntype Options = {\n collection: CollectionConfig\n config: Config\n}\n\nexport const getBaseUploadFields = ({ collection, config }: Options): Field[] => {\n // `variants` only exists once a transformer (e.g. Sharp) has written it back during init.\n const uploadOptions: Partial<SanitizedUploadConfig> =\n typeof collection.upload === 'object' ? collection.upload : {}\n\n const mimeType: Field = {\n name: 'mimeType',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: 'MIME Type',\n }\n\n const thumbnailURL: Field = {\n name: 'thumbnailURL',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n hooks: {\n afterRead: [\n ({ originalDoc, req }) => {\n const adminThumbnail =\n typeof collection.upload !== 'boolean' ? collection.upload?.adminThumbnail : undefined\n\n if (typeof adminThumbnail === 'function') {\n return adminThumbnail({ doc: originalDoc })\n }\n\n return generateFilePathOrURL({\n collectionSlug: collection.slug,\n config,\n filename:\n typeof adminThumbnail === 'string'\n ? (originalDoc.variants?.[adminThumbnail]?.filename as string)\n : undefined,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath:\n typeof adminThumbnail === 'string'\n ? (originalDoc.variants?.[adminThumbnail]?.url as string)\n : undefined,\n })\n },\n ],\n },\n label: 'Thumbnail URL',\n }\n\n const width: Field = {\n name: 'width',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:width'),\n }\n\n const height: Field = {\n name: 'height',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:height'),\n }\n\n const filesize: Field = {\n name: 'filesize',\n type: 'number',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: ({ t }) => t('upload:fileSize'),\n }\n\n const filename: Field = {\n name: 'filename',\n type: 'text',\n admin: {\n disabled: { bulkEdit: true },\n hidden: true,\n readOnly: true,\n },\n index: true,\n label: ({ t }) => t('upload:fileName'),\n validate: validateUploadFilename,\n }\n\n // Only set unique: true if the collection does not have a compound index\n if (\n collection.upload === true ||\n (typeof collection.upload === 'object' && !collection.upload.filenameCompoundIndex)\n ) {\n filename.unique = true\n }\n\n const url: Field = {\n name: 'url',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: 'URL',\n }\n\n let uploadFields: Field[] = [\n {\n ...url,\n hooks: {\n afterRead: [\n ({ data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection.slug,\n config,\n filename: data?.filename || originalDoc?.filename,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n beforeChange: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename: data?.filename || originalDoc?.filename,\n relative: true,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n },\n },\n thumbnailURL,\n filename,\n mimeType,\n filesize,\n width,\n height,\n {\n name: 'original',\n type: 'group',\n admin: {\n hidden: true,\n readOnly: true,\n },\n fields: [\n { ...filename, unique: false },\n {\n ...url,\n hooks: {\n afterRead: [\n ({ data, originalDoc, req, value }) => {\n return generateFilePathOrURL({\n collectionSlug: collection.slug,\n config,\n filename: data?.original?.filename || originalDoc?.original?.filename,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n })\n },\n ],\n beforeChange: [\n ({ data, originalDoc, req, value }) => {\n return generateFilePathOrURL({\n collectionSlug: collection.slug,\n config,\n filename: data?.original?.filename || originalDoc?.original?.filename,\n relative: true,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n })\n },\n ],\n },\n },\n mimeType,\n filesize,\n width,\n height,\n {\n name: 'prefix',\n type: 'text',\n admin: { disabled: true, hidden: true, readOnly: true },\n },\n {\n name: '_objectKey',\n type: 'text',\n admin: { disabled: true, hidden: true, readOnly: true },\n },\n ],\n },\n ]\n\n // Add focal point fields if not disabled\n if (\n uploadOptions.focalPoint !== false ||\n uploadOptions.variants ||\n uploadOptions.hasImageAdjustments\n ) {\n uploadFields = uploadFields.concat(\n ['focalX', 'focalY'].map((name) => {\n return {\n name,\n type: 'number',\n admin: {\n disabled: { column: true, filter: true, groupBy: true },\n hidden: true,\n },\n }\n }),\n )\n }\n\n if (uploadOptions.mimeTypes) {\n mimeType.validate = mimeTypeValidator(uploadOptions.mimeTypes)\n }\n\n if (uploadOptions.variants) {\n uploadFields = uploadFields.concat([\n {\n name: 'variants',\n type: 'group',\n admin: {\n hidden: true,\n },\n fields: uploadOptions.variants.map((size) => ({\n name: size.name,\n type: 'group',\n admin: {\n hidden: true,\n ...disabledFromImageSize(size.admin),\n },\n fields: [\n {\n ...url,\n admin: {\n ...url.admin,\n ...disabledFromImageSize(size.admin),\n },\n hooks: {\n afterRead: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename:\n data?.variants?.[size.name]?.filename ||\n originalDoc?.variants?.[size.name]?.filename,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n beforeChange: [\n ({ collection, data, originalDoc, req, value }) =>\n generateFilePathOrURL({\n collectionSlug: collection?.slug as string,\n config,\n filename:\n data?.variants?.[size.name]?.filename ||\n originalDoc?.variants?.[size.name]?.filename,\n relative: true,\n serverURL: req.payload.config.serverURL,\n urlOrPath: value,\n }),\n ],\n },\n },\n {\n ...width,\n admin: {\n ...width.admin,\n ...disabledFromImageSize(size.admin),\n },\n },\n {\n ...height,\n admin: {\n ...height.admin,\n ...disabledFromImageSize(size.admin),\n },\n },\n {\n ...mimeType,\n admin: {\n ...mimeType.admin,\n ...disabledFromImageSize(size.admin),\n },\n },\n {\n ...filesize,\n admin: {\n ...filesize.admin,\n ...disabledFromImageSize(size.admin),\n },\n },\n {\n ...filename,\n admin: {\n ...filename.admin,\n ...disabledFromImageSize(size.admin),\n },\n unique: false,\n },\n {\n name: 'prefix',\n type: 'text',\n admin: { disabled: true, hidden: true, readOnly: true },\n },\n {\n name: '_objectKey',\n type: 'text',\n admin: { disabled: true, hidden: true, readOnly: true },\n },\n ],\n label: size.name,\n })),\n label: ({ t }) => t('upload:sizes'),\n },\n ])\n }\n return uploadFields\n}\n"],"names":["generateFilePathOrURL","mimeTypeValidator","validateUploadFilename","disabledFromImageSize","sizeAdmin","disabled","column","filter","groupBy","getBaseUploadFields","collection","config","uploadOptions","upload","mimeType","name","type","admin","hidden","readOnly","label","thumbnailURL","hooks","afterRead","originalDoc","req","adminThumbnail","undefined","doc","collectionSlug","slug","filename","variants","relative","serverURL","payload","urlOrPath","url","width","t","height","filesize","bulkEdit","index","validate","filenameCompoundIndex","unique","uploadFields","data","value","beforeChange","fields","original","focalPoint","hasImageAdjustments","concat","map","mimeTypes","size"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/uploads/getFileContentRequirement.ts"],"sourcesContent":["import type { SanitizedUploadConfig } from './types.js'\n\nimport { canResizeImage } from './canResizeImage.js'\nimport { isAnimatedImage } from './isAnimatedImage.js'\nimport { isImage } from './isImage.js'\n\n/**\n * Bytes read from the start of a file to sniff its mime type and, for images, probe its\n * dimensions. Generous enough to cover real-world header/metadata layouts (EXIF, ICC\n * profiles, etc.) while staying tiny next to a multi-gigabyte upload.\n */\nexport const HEADER_PROBE_BYTE_LENGTH = 1024 * 1024\n\nexport type FileContentRequirement = 'full' | 'header' | 'none'\n\n/**\n * Decides how much of an uploaded file's content, if any, is needed to save the document -\n * so a client upload (e.g. Azure's chunkLargeFiles) only pays for what post-processing\n * actually reads instead of always being re-downloaded in full.\n *\n * - `full`: local storage needs the real bytes, or a registered file transformer will adjust\n * the image (`upload.hasImageAdjustments`), or a custom `transformFile` transformer will\n * process the file (`hasTransformFileStages`), or the file is animated, or additional image\n * sizes will be generated from it, or the collection restricts mime types (which also runs\n * SVG/PDF content-safety checks that must see the whole file), or the request itself carries\n * a crop/resize edit (`uploadEdits`) that will be applied to the fetched bytes.\n * - `header`: the file is an image and only its dimensions are needed.\n * - `none`: nothing downstream reads file content at all.\n */\nexport function getFileContentRequirement({\n hasSizeEdits,\n hasTransformFileStages,\n mimeType,\n uploadConfig,\n}: {\n /**\n * Whether the request's `uploadEdits` (crop, heightInPixels, widthInPixels) will resize the\n * fetched file - if so, the full file is needed even when the collection config alone would\n * only require a header probe.\n */\n hasSizeEdits?: boolean\n /**\n * Whether a registered transformer without its own content projection (anything other than a\n * built-in bridge transformer like `sharpTransformer`) will run `transformFile` on this file.\n * Such a transformer reads the whole file, so neither a header probe nor no content is enough.\n */\n hasTransformFileStages?: boolean\n mimeType: string\n uploadConfig: SanitizedUploadConfig\n}): FileContentRequirement {\n if (!uploadConfig.disableLocalStorage) {\n return 'full'\n }\n\n const hasMimeTypeAllowList =\n Array.isArray(uploadConfig.mimeTypes) && uploadConfig.mimeTypes.length > 0\n\n if (hasMimeTypeAllowList || hasTransformFileStages) {\n return 'full'\n }\n\n const isResizableImage = canResizeImage(mimeType)\n // `hasImageAdjustments` and `variants` are the transformer-agnostic projection a file\n // transformer writes back onto the sanitized upload config at startup (see\n // `@payloadcms/transformer-sharp`'s `initSharpCollections`), so core can make this decision\n // without knowing which transformer is registered or how it is configured.\n const hasConfiguredAdjustments = Boolean(\n uploadConfig.hasImageAdjustments ||\n
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/getFileContentRequirement.ts"],"sourcesContent":["import type { SanitizedUploadConfig } from './types.js'\n\nimport { canResizeImage } from './canResizeImage.js'\nimport { isAnimatedImage } from './isAnimatedImage.js'\nimport { isImage } from './isImage.js'\n\n/**\n * Bytes read from the start of a file to sniff its mime type and, for images, probe its\n * dimensions. Generous enough to cover real-world header/metadata layouts (EXIF, ICC\n * profiles, etc.) while staying tiny next to a multi-gigabyte upload.\n */\nexport const HEADER_PROBE_BYTE_LENGTH = 1024 * 1024\n\nexport type FileContentRequirement = 'full' | 'header' | 'none'\n\n/**\n * Decides how much of an uploaded file's content, if any, is needed to save the document -\n * so a client upload (e.g. Azure's chunkLargeFiles) only pays for what post-processing\n * actually reads instead of always being re-downloaded in full.\n *\n * - `full`: local storage needs the real bytes, or a registered file transformer will adjust\n * the image (`upload.hasImageAdjustments`), or a custom `transformFile` transformer will\n * process the file (`hasTransformFileStages`), or the file is animated, or additional image\n * sizes will be generated from it, or the collection restricts mime types (which also runs\n * SVG/PDF content-safety checks that must see the whole file), or the request itself carries\n * a crop/resize edit (`uploadEdits`) that will be applied to the fetched bytes.\n * - `header`: the file is an image and only its dimensions are needed.\n * - `none`: nothing downstream reads file content at all.\n */\nexport function getFileContentRequirement({\n hasSizeEdits,\n hasTransformFileStages,\n mimeType,\n uploadConfig,\n}: {\n /**\n * Whether the request's `uploadEdits` (crop, heightInPixels, widthInPixels) will resize the\n * fetched file - if so, the full file is needed even when the collection config alone would\n * only require a header probe.\n */\n hasSizeEdits?: boolean\n /**\n * Whether a registered transformer without its own content projection (anything other than a\n * built-in bridge transformer like `sharpTransformer`) will run `transformFile` on this file.\n * Such a transformer reads the whole file, so neither a header probe nor no content is enough.\n */\n hasTransformFileStages?: boolean\n mimeType: string\n uploadConfig: SanitizedUploadConfig\n}): FileContentRequirement {\n if (!uploadConfig.disableLocalStorage) {\n return 'full'\n }\n\n const hasMimeTypeAllowList =\n Array.isArray(uploadConfig.mimeTypes) && uploadConfig.mimeTypes.length > 0\n\n if (hasMimeTypeAllowList || hasTransformFileStages) {\n return 'full'\n }\n\n const isResizableImage = canResizeImage(mimeType)\n // `hasImageAdjustments` and `variants` are the transformer-agnostic projection a file\n // transformer writes back onto the sanitized upload config at startup (see\n // `@payloadcms/transformer-sharp`'s `initSharpCollections`), so core can make this decision\n // without knowing which transformer is registered or how it is configured.\n const hasConfiguredAdjustments = Boolean(\n uploadConfig.hasImageAdjustments ||\n (Array.isArray(uploadConfig.variants) && uploadConfig.variants.length > 0),\n )\n\n if (hasSizeEdits || (isResizableImage && hasConfiguredAdjustments) || isAnimatedImage(mimeType)) {\n return 'full'\n }\n\n if (isResizableImage || isImage(mimeType)) {\n return 'header'\n }\n\n return 'none'\n}\n"],"names":["canResizeImage","isAnimatedImage","isImage","HEADER_PROBE_BYTE_LENGTH","getFileContentRequirement","hasSizeEdits","hasTransformFileStages","mimeType","uploadConfig","disableLocalStorage","hasMimeTypeAllowList","Array","isArray","mimeTypes","length","isResizableImage","hasConfiguredAdjustments","Boolean","hasImageAdjustments","variants"],"mappings":"AAEA,SAASA,cAAc,QAAQ,sBAAqB;AACpD,SAASC,eAAe,QAAQ,uBAAsB;AACtD,SAASC,OAAO,QAAQ,eAAc;AAEtC;;;;CAIC,GACD,OAAO,MAAMC,2BAA2B,OAAO,KAAI;AAInD;;;;;;;;;;;;;CAaC,GACD,OAAO,SAASC,0BAA0B,EACxCC,YAAY,EACZC,sBAAsB,EACtBC,QAAQ,EACRC,YAAY,EAgBb;IACC,IAAI,CAACA,aAAaC,mBAAmB,EAAE;QACrC,OAAO;IACT;IAEA,MAAMC,uBACJC,MAAMC,OAAO,CAACJ,aAAaK,SAAS,KAAKL,aAAaK,SAAS,CAACC,MAAM,GAAG;IAE3E,IAAIJ,wBAAwBJ,wBAAwB;QAClD,OAAO;IACT;IAEA,MAAMS,mBAAmBf,eAAeO;IACxC,sFAAsF;IACtF,2EAA2E;IAC3E,4FAA4F;IAC5F,2EAA2E;IAC3E,MAAMS,2BAA2BC,QAC/BT,aAAaU,mBAAmB,IAC/BP,MAAMC,OAAO,CAACJ,aAAaW,QAAQ,KAAKX,aAAaW,QAAQ,CAACL,MAAM,GAAG;IAG1E,IAAIT,gBAAiBU,oBAAoBC,4BAA6Bf,gBAAgBM,WAAW;QAC/F,OAAO;IACT;IAEA,IAAIQ,oBAAoBb,QAAQK,WAAW;QACzC,OAAO;IACT;IAEA,OAAO;AACT"}
|