payload 3.89.0 → 3.90.0
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/forms/Field.d.ts +2 -0
- package/dist/admin/forms/Field.d.ts.map +1 -1
- package/dist/admin/forms/Field.js.map +1 -1
- package/dist/admin/forms/Form.d.ts +2 -0
- package/dist/admin/forms/Form.d.ts.map +1 -1
- package/dist/admin/forms/Form.js.map +1 -1
- package/dist/admin/functions/index.d.ts +3 -1
- package/dist/admin/functions/index.d.ts.map +1 -1
- package/dist/admin/functions/index.js.map +1 -1
- package/dist/admin/views/dashboard.d.ts +1 -1
- package/dist/admin/views/dashboard.d.ts.map +1 -1
- package/dist/admin/views/dashboard.js.map +1 -1
- package/dist/auth/applyUserReadAccess.d.ts +15 -0
- package/dist/auth/applyUserReadAccess.d.ts.map +1 -0
- package/dist/auth/applyUserReadAccess.js +41 -0
- package/dist/auth/applyUserReadAccess.js.map +1 -0
- package/dist/auth/baseFields/apiKey/canCreateOrUpdateAPIKey.d.ts +4 -0
- package/dist/auth/baseFields/apiKey/canCreateOrUpdateAPIKey.d.ts.map +1 -0
- package/dist/auth/baseFields/apiKey/canCreateOrUpdateAPIKey.js +20 -0
- package/dist/auth/baseFields/apiKey/canCreateOrUpdateAPIKey.js.map +1 -0
- package/dist/auth/baseFields/apiKey/encryptAPIKey.d.ts +4 -0
- package/dist/auth/baseFields/apiKey/encryptAPIKey.d.ts.map +1 -0
- package/dist/auth/baseFields/apiKey/encryptAPIKey.js +16 -0
- package/dist/auth/baseFields/apiKey/encryptAPIKey.js.map +1 -0
- package/dist/auth/baseFields/apiKey/index.d.ts +6 -0
- package/dist/auth/baseFields/apiKey/index.d.ts.map +1 -0
- package/dist/auth/baseFields/apiKey/index.js +112 -0
- package/dist/auth/baseFields/apiKey/index.js.map +1 -0
- package/dist/auth/baseFields/apiKey/omitAPIKey.d.ts +4 -0
- package/dist/auth/baseFields/apiKey/omitAPIKey.d.ts.map +1 -0
- package/dist/auth/baseFields/apiKey/omitAPIKey.js +8 -0
- package/dist/auth/baseFields/apiKey/omitAPIKey.js.map +1 -0
- package/dist/auth/baseFields/apiKey/omitAPIKeyIndex.d.ts +4 -0
- package/dist/auth/baseFields/apiKey/omitAPIKeyIndex.d.ts.map +1 -0
- package/dist/auth/baseFields/apiKey/omitAPIKeyIndex.js +5 -0
- package/dist/auth/baseFields/apiKey/omitAPIKeyIndex.js.map +1 -0
- package/dist/auth/baseFields/apiKey/omitEncryptedAPIKey.d.ts +4 -0
- package/dist/auth/baseFields/apiKey/omitEncryptedAPIKey.d.ts.map +1 -0
- package/dist/auth/baseFields/apiKey/omitEncryptedAPIKey.js +5 -0
- package/dist/auth/baseFields/apiKey/omitEncryptedAPIKey.js.map +1 -0
- package/dist/auth/baseFields/apiKey/setAPIKeyIndex.d.ts +4 -0
- package/dist/auth/baseFields/apiKey/setAPIKeyIndex.d.ts.map +1 -0
- package/dist/auth/baseFields/apiKey/setAPIKeyIndex.js +17 -0
- package/dist/auth/baseFields/apiKey/setAPIKeyIndex.js.map +1 -0
- package/dist/auth/baseFields/auth.d.ts +1 -0
- package/dist/auth/baseFields/auth.d.ts.map +1 -1
- package/dist/auth/baseFields/auth.js +9 -0
- package/dist/auth/baseFields/auth.js.map +1 -1
- package/dist/auth/defaultUnlockAccess.d.ts +3 -0
- package/dist/auth/defaultUnlockAccess.d.ts.map +1 -0
- package/dist/auth/defaultUnlockAccess.js +8 -0
- package/dist/auth/defaultUnlockAccess.js.map +1 -0
- package/dist/auth/endpoints/index.d.ts +1 -0
- package/dist/auth/endpoints/index.d.ts.map +1 -1
- package/dist/auth/endpoints/index.js +8 -0
- package/dist/auth/endpoints/index.js.map +1 -1
- package/dist/auth/endpoints/revealAPIKey.d.ts +7 -0
- package/dist/auth/endpoints/revealAPIKey.d.ts.map +1 -0
- package/dist/auth/endpoints/revealAPIKey.js +120 -0
- package/dist/auth/endpoints/revealAPIKey.js.map +1 -0
- package/dist/auth/executeAccess.d.ts +3 -1
- package/dist/auth/executeAccess.d.ts.map +1 -1
- package/dist/auth/executeAccess.js +2 -1
- package/dist/auth/executeAccess.js.map +1 -1
- package/dist/auth/getAuthFields.d.ts +1 -1
- package/dist/auth/getAuthFields.d.ts.map +1 -1
- package/dist/auth/getAuthFields.js +7 -4
- package/dist/auth/getAuthFields.js.map +1 -1
- package/dist/auth/getFieldsToSign.d.ts.map +1 -1
- package/dist/auth/getFieldsToSign.js +17 -10
- package/dist/auth/getFieldsToSign.js.map +1 -1
- package/dist/auth/getFieldsToSign.spec.js +114 -0
- package/dist/auth/getFieldsToSign.spec.js.map +1 -0
- package/dist/auth/jwt.d.ts.map +1 -1
- package/dist/auth/jwt.js +2 -0
- package/dist/auth/jwt.js.map +1 -1
- package/dist/auth/jwt.spec.js +24 -0
- package/dist/auth/jwt.spec.js.map +1 -0
- package/dist/auth/jwtAuth.d.ts +9 -0
- package/dist/auth/jwtAuth.d.ts.map +1 -0
- package/dist/auth/jwtAuth.js +8 -0
- package/dist/auth/jwtAuth.js.map +1 -0
- package/dist/auth/operations/auth.d.ts.map +1 -1
- package/dist/auth/operations/auth.js +2 -1
- package/dist/auth/operations/auth.js.map +1 -1
- package/dist/auth/operations/forgotPassword.d.ts.map +1 -1
- package/dist/auth/operations/forgotPassword.js +95 -7
- package/dist/auth/operations/forgotPassword.js.map +1 -1
- package/dist/auth/operations/local/auth.js +3 -1
- package/dist/auth/operations/local/auth.js.map +1 -1
- package/dist/auth/operations/login.d.ts.map +1 -1
- package/dist/auth/operations/login.js +48 -26
- package/dist/auth/operations/login.js.map +1 -1
- package/dist/auth/operations/refresh.d.ts.map +1 -1
- package/dist/auth/operations/refresh.js +32 -9
- package/dist/auth/operations/refresh.js.map +1 -1
- package/dist/auth/operations/registerFirstUser.d.ts.map +1 -1
- package/dist/auth/operations/registerFirstUser.js +3 -4
- package/dist/auth/operations/registerFirstUser.js.map +1 -1
- package/dist/auth/operations/resetPassword.d.ts.map +1 -1
- package/dist/auth/operations/resetPassword.js +31 -22
- package/dist/auth/operations/resetPassword.js.map +1 -1
- package/dist/auth/operations/unlock.d.ts.map +1 -1
- package/dist/auth/operations/unlock.js +1 -0
- package/dist/auth/operations/unlock.js.map +1 -1
- package/dist/auth/strategies/apiKey.d.ts.map +1 -1
- package/dist/auth/strategies/apiKey.js +15 -1
- package/dist/auth/strategies/apiKey.js.map +1 -1
- package/dist/auth/strategies/jwt.d.ts.map +1 -1
- package/dist/auth/strategies/jwt.js +61 -10
- package/dist/auth/strategies/jwt.js.map +1 -1
- package/dist/auth/strategies/jwt.spec.js +281 -0
- package/dist/auth/strategies/jwt.spec.js.map +1 -0
- package/dist/auth/strategies/local/authenticate.d.ts +5 -1
- package/dist/auth/strategies/local/authenticate.d.ts.map +1 -1
- package/dist/auth/strategies/local/authenticate.js +8 -3
- package/dist/auth/strategies/local/authenticate.js.map +1 -1
- package/dist/auth/strategies/local/authenticate.spec.js +37 -10
- package/dist/auth/strategies/local/authenticate.spec.js.map +1 -1
- package/dist/auth/strategies/local/generatePasswordSaltHash.d.ts +9 -1
- package/dist/auth/strategies/local/generatePasswordSaltHash.d.ts.map +1 -1
- package/dist/auth/strategies/local/generatePasswordSaltHash.js +61 -34
- package/dist/auth/strategies/local/generatePasswordSaltHash.js.map +1 -1
- package/dist/auth/types.d.ts +16 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/collections/config/client.d.ts +1 -0
- package/dist/collections/config/client.d.ts.map +1 -1
- package/dist/collections/config/client.js +3 -0
- package/dist/collections/config/client.js.map +1 -1
- package/dist/collections/config/defaults.d.ts.map +1 -1
- package/dist/collections/config/defaults.js +4 -2
- 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 +17 -6
- package/dist/collections/config/sanitize.js.map +1 -1
- package/dist/collections/endpoints/index.d.ts +1 -0
- package/dist/collections/endpoints/index.d.ts.map +1 -1
- package/dist/collections/endpoints/index.js +6 -5
- package/dist/collections/endpoints/index.js.map +1 -1
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +105 -8
- package/dist/collections/operations/create.js.map +1 -1
- package/dist/collections/operations/deleteByID.js +13 -13
- package/dist/collections/operations/deleteByID.js.map +1 -1
- package/dist/collections/operations/findDistinct.d.ts.map +1 -1
- package/dist/collections/operations/findDistinct.js +96 -18
- package/dist/collections/operations/findDistinct.js.map +1 -1
- package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
- package/dist/collections/operations/restoreVersion.js +47 -13
- 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 +118 -18
- package/dist/collections/operations/update.js.map +1 -1
- package/dist/collections/operations/updateByID.d.ts.map +1 -1
- package/dist/collections/operations/updateByID.js +62 -2
- package/dist/collections/operations/updateByID.js.map +1 -1
- package/dist/collections/operations/utilities/update.d.ts.map +1 -1
- package/dist/collections/operations/utilities/update.js +71 -15
- package/dist/collections/operations/utilities/update.js.map +1 -1
- package/dist/config/orderable/index.d.ts.map +1 -1
- package/dist/config/orderable/index.js +67 -14
- package/dist/config/orderable/index.js.map +1 -1
- package/dist/config/sanitize.d.ts.map +1 -1
- package/dist/config/sanitize.js +1 -1
- package/dist/config/sanitize.js.map +1 -1
- package/dist/config/types.d.ts +13 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/database/getLocalizedPaths.d.ts +2 -1
- package/dist/database/getLocalizedPaths.d.ts.map +1 -1
- package/dist/database/getLocalizedPaths.js +12 -3
- package/dist/database/getLocalizedPaths.js.map +1 -1
- package/dist/database/isNestedRelationshipQuery.d.ts +9 -0
- package/dist/database/isNestedRelationshipQuery.d.ts.map +1 -0
- package/dist/database/isNestedRelationshipQuery.js +14 -0
- package/dist/database/isNestedRelationshipQuery.js.map +1 -0
- package/dist/database/prefixWherePaths.d.ts +6 -0
- package/dist/database/prefixWherePaths.d.ts.map +1 -0
- package/dist/database/prefixWherePaths.js +19 -0
- package/dist/database/prefixWherePaths.js.map +1 -0
- package/dist/database/prefixWherePaths.spec.js +46 -0
- package/dist/database/prefixWherePaths.spec.js.map +1 -0
- package/dist/database/queryValidation/validateQueryPaths.d.ts +2 -1
- package/dist/database/queryValidation/validateQueryPaths.d.ts.map +1 -1
- package/dist/database/queryValidation/validateQueryPaths.js +4 -1
- package/dist/database/queryValidation/validateQueryPaths.js.map +1 -1
- package/dist/database/queryValidation/validateSearchParams.d.ts +2 -1
- package/dist/database/queryValidation/validateSearchParams.d.ts.map +1 -1
- package/dist/database/queryValidation/validateSearchParams.js +82 -4
- package/dist/database/queryValidation/validateSearchParams.js.map +1 -1
- package/dist/database/types.d.ts +5 -0
- package/dist/database/types.d.ts.map +1 -1
- package/dist/database/types.js.map +1 -1
- package/dist/email/normalizeSendEmailOptions.js.map +1 -1
- package/dist/email/types.d.ts +4 -1
- package/dist/email/types.d.ts.map +1 -1
- package/dist/email/types.js.map +1 -1
- package/dist/exports/internal.d.ts +7 -0
- package/dist/exports/internal.d.ts.map +1 -1
- package/dist/exports/internal.js +7 -1
- package/dist/exports/internal.js.map +1 -1
- package/dist/exports/shared.d.ts +3 -0
- package/dist/exports/shared.d.ts.map +1 -1
- package/dist/exports/shared.js +3 -0
- package/dist/exports/shared.js.map +1 -1
- package/dist/fields/config/types.d.ts +7 -5
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/config/types.js.map +1 -1
- package/dist/fields/hooks/beforeChange/index.d.ts +7 -1
- package/dist/fields/hooks/beforeChange/index.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/index.js +4 -2
- package/dist/fields/hooks/beforeChange/index.js.map +1 -1
- package/dist/fields/hooks/beforeChange/index.spec.js +206 -0
- package/dist/fields/hooks/beforeChange/index.spec.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 +51 -9
- 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 +3 -2
- package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
- package/dist/fields/hooks/beforeDuplicate/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeDuplicate/promise.js +4 -0
- package/dist/fields/hooks/beforeDuplicate/promise.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/getFallbackValue.d.ts +2 -1
- package/dist/fields/hooks/beforeValidate/getFallbackValue.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/getFallbackValue.js +2 -2
- package/dist/fields/hooks/beforeValidate/getFallbackValue.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/index.d.ts +6 -1
- package/dist/fields/hooks/beforeValidate/index.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/index.js +3 -1
- package/dist/fields/hooks/beforeValidate/index.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/index.spec.js +90 -0
- package/dist/fields/hooks/beforeValidate/index.spec.js.map +1 -0
- package/dist/fields/hooks/beforeValidate/promise.d.ts +6 -1
- package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.js +23 -8
- package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.d.ts +6 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.js +3 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.js.map +1 -1
- package/dist/fields/validations.d.ts.map +1 -1
- package/dist/fields/validations.js +3 -1
- package/dist/fields/validations.js.map +1 -1
- package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
- package/dist/globals/operations/restoreVersion.js +45 -11
- 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 +95 -16
- package/dist/globals/operations/update.js.map +1 -1
- package/dist/index.bundled.d.ts +102 -24
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/preferences/config.d.ts.map +1 -1
- package/dist/preferences/config.js +2 -1
- package/dist/preferences/config.js.map +1 -1
- package/dist/query-presets/access.d.ts.map +1 -1
- package/dist/query-presets/access.js +2 -1
- package/dist/query-presets/access.js.map +1 -1
- package/dist/queues/config/types/index.d.ts +2 -1
- package/dist/queues/config/types/index.d.ts.map +1 -1
- package/dist/queues/config/types/index.js.map +1 -1
- package/dist/uploads/assertClientUploadAccess.d.ts +7 -0
- package/dist/uploads/assertClientUploadAccess.d.ts.map +1 -0
- package/dist/uploads/assertClientUploadAccess.js +27 -0
- package/dist/uploads/assertClientUploadAccess.js.map +1 -0
- package/dist/uploads/assertClientUploadAllowed.d.ts +11 -0
- package/dist/uploads/assertClientUploadAllowed.d.ts.map +1 -0
- package/dist/uploads/assertClientUploadAllowed.js +46 -0
- package/dist/uploads/assertClientUploadAllowed.js.map +1 -0
- package/dist/uploads/assertClientUploadAllowed.spec.js +91 -0
- package/dist/uploads/assertClientUploadAllowed.spec.js.map +1 -0
- package/dist/uploads/checkFileRestrictions.d.ts +4 -1
- package/dist/uploads/checkFileRestrictions.d.ts.map +1 -1
- package/dist/uploads/checkFileRestrictions.js +66 -26
- package/dist/uploads/checkFileRestrictions.js.map +1 -1
- package/dist/uploads/clientUploadReceipt.d.ts +23 -0
- package/dist/uploads/clientUploadReceipt.d.ts.map +1 -0
- package/dist/uploads/clientUploadReceipt.js +55 -0
- package/dist/uploads/clientUploadReceipt.js.map +1 -0
- package/dist/uploads/deleteAssociatedFiles.d.ts.map +1 -1
- package/dist/uploads/deleteAssociatedFiles.js +33 -8
- package/dist/uploads/deleteAssociatedFiles.js.map +1 -1
- package/dist/uploads/deleteAssociatedFiles.spec.js +124 -0
- package/dist/uploads/deleteAssociatedFiles.spec.js.map +1 -0
- package/dist/uploads/detectSvgFromXml.d.ts +1 -3
- package/dist/uploads/detectSvgFromXml.d.ts.map +1 -1
- package/dist/uploads/detectSvgFromXml.js +3 -40
- package/dist/uploads/detectSvgFromXml.js.map +1 -1
- package/dist/uploads/endpoints/getFile.d.ts.map +1 -1
- package/dist/uploads/endpoints/getFile.js +5 -3
- package/dist/uploads/endpoints/getFile.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/handlers.d.ts +2 -2
- package/dist/uploads/fetchAPI-multipart/handlers.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/handlers.js +18 -5
- package/dist/uploads/fetchAPI-multipart/handlers.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/index.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/index.js +24 -2
- package/dist/uploads/fetchAPI-multipart/index.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts +0 -6
- package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/processMultipart.js +146 -126
- package/dist/uploads/fetchAPI-multipart/processMultipart.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/processMultipart.spec.js +663 -0
- package/dist/uploads/fetchAPI-multipart/processMultipart.spec.js.map +1 -0
- package/dist/uploads/generateFileData.d.ts +3 -1
- package/dist/uploads/generateFileData.d.ts.map +1 -1
- package/dist/uploads/generateFileData.js +29 -16
- package/dist/uploads/generateFileData.js.map +1 -1
- package/dist/uploads/getBaseFields.d.ts.map +1 -1
- package/dist/uploads/getBaseFields.js +3 -1
- package/dist/uploads/getBaseFields.js.map +1 -1
- package/dist/uploads/getExternalFile.d.ts +1 -1
- package/dist/uploads/getExternalFile.d.ts.map +1 -1
- package/dist/uploads/getExternalFile.js +60 -15
- package/dist/uploads/getExternalFile.js.map +1 -1
- package/dist/uploads/getFileTypeFallback.d.ts.map +1 -1
- package/dist/uploads/getFileTypeFallback.js +3 -1
- package/dist/uploads/getFileTypeFallback.js.map +1 -1
- package/dist/uploads/getFileTypeIdentity.d.ts +19 -0
- package/dist/uploads/getFileTypeIdentity.d.ts.map +1 -0
- package/dist/uploads/getFileTypeIdentity.js +34 -0
- package/dist/uploads/getFileTypeIdentity.js.map +1 -0
- package/dist/uploads/getFileTypeIdentity.spec.js +43 -0
- package/dist/uploads/getFileTypeIdentity.spec.js.map +1 -0
- package/dist/uploads/isProcessableImage.d.ts +2 -0
- package/dist/uploads/isProcessableImage.d.ts.map +1 -0
- package/dist/uploads/isProcessableImage.js +7 -0
- package/dist/uploads/isProcessableImage.js.map +1 -0
- package/dist/uploads/safeFetch.d.ts.map +1 -1
- package/dist/uploads/safeFetch.js +3 -2
- package/dist/uploads/safeFetch.js.map +1 -1
- package/dist/uploads/sanitizeUploadData.d.ts +26 -0
- package/dist/uploads/sanitizeUploadData.d.ts.map +1 -0
- package/dist/uploads/sanitizeUploadData.js +159 -0
- package/dist/uploads/sanitizeUploadData.js.map +1 -0
- package/dist/uploads/sanitizeUploadData.spec.js +255 -0
- package/dist/uploads/sanitizeUploadData.spec.js.map +1 -0
- package/dist/uploads/types.d.ts +11 -3
- package/dist/uploads/types.d.ts.map +1 -1
- package/dist/uploads/types.js.map +1 -1
- package/dist/uploads/uploadContentSecurityPolicy.d.ts +2 -0
- package/dist/uploads/uploadContentSecurityPolicy.d.ts.map +1 -0
- package/dist/uploads/uploadContentSecurityPolicy.js +3 -0
- package/dist/uploads/uploadContentSecurityPolicy.js.map +1 -0
- package/dist/uploads/validateISOBaseMediaFile.d.ts +4 -0
- package/dist/uploads/validateISOBaseMediaFile.d.ts.map +1 -0
- package/dist/uploads/validateISOBaseMediaFile.js +91 -0
- package/dist/uploads/validateISOBaseMediaFile.js.map +1 -0
- package/dist/uploads/validateISOBaseMediaFile.spec.js +130 -0
- package/dist/uploads/validateISOBaseMediaFile.spec.js.map +1 -0
- package/dist/uploads/validateSvg.d.ts +10 -4
- package/dist/uploads/validateSvg.d.ts.map +1 -1
- package/dist/uploads/validateSvg.js +280 -40
- package/dist/uploads/validateSvg.js.map +1 -1
- package/dist/uploads/validateSvg.spec.js +123 -0
- package/dist/uploads/validateSvg.spec.js.map +1 -0
- package/dist/uploads/validateUploadFilename.d.ts +3 -0
- package/dist/uploads/validateUploadFilename.d.ts.map +1 -0
- package/dist/uploads/validateUploadFilename.js +13 -0
- package/dist/uploads/validateUploadFilename.js.map +1 -0
- package/dist/uploads/validateUploadFilename.spec.js +24 -0
- package/dist/uploads/validateUploadFilename.spec.js.map +1 -0
- package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
- package/dist/utilities/addDataAndFileToRequest.js +28 -1
- package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
- package/dist/utilities/addDataAndFileToRequest.spec.js +158 -0
- package/dist/utilities/addDataAndFileToRequest.spec.js.map +1 -1
- package/dist/utilities/createPayloadRequest.d.ts.map +1 -1
- package/dist/utilities/createPayloadRequest.js +2 -1
- package/dist/utilities/createPayloadRequest.js.map +1 -1
- package/dist/utilities/deepCopyObject.d.ts.map +1 -1
- package/dist/utilities/deepCopyObject.js +110 -19
- package/dist/utilities/deepCopyObject.js.map +1 -1
- package/dist/utilities/deepCopyObject.spec.js +216 -0
- package/dist/utilities/deepCopyObject.spec.js.map +1 -0
- package/dist/utilities/fieldPath.d.ts +13 -0
- package/dist/utilities/fieldPath.d.ts.map +1 -0
- package/dist/utilities/fieldPath.js +51 -0
- package/dist/utilities/fieldPath.js.map +1 -0
- package/dist/utilities/fieldPath.spec.js +155 -0
- package/dist/utilities/fieldPath.spec.js.map +1 -0
- package/dist/utilities/getEntityPermissions/getEntityPermissions.d.ts.map +1 -1
- package/dist/utilities/getEntityPermissions/getEntityPermissions.js +2 -0
- package/dist/utilities/getEntityPermissions/getEntityPermissions.js.map +1 -1
- package/dist/utilities/getObjectDotNotation.d.ts.map +1 -1
- package/dist/utilities/getObjectDotNotation.js +7 -1
- package/dist/utilities/getObjectDotNotation.js.map +1 -1
- package/dist/utilities/getObjectDotNotation.spec.js +33 -0
- package/dist/utilities/getObjectDotNotation.spec.js.map +1 -0
- package/dist/utilities/getSafeRedirect.spec.js +14 -0
- package/dist/utilities/getSafeRedirect.spec.js.map +1 -1
- package/dist/utilities/getTopLevelFieldNames.d.ts +2 -0
- package/dist/utilities/getTopLevelFieldNames.d.ts.map +1 -0
- package/dist/utilities/getTopLevelFieldNames.js +3 -0
- package/dist/utilities/getTopLevelFieldNames.js.map +1 -0
- package/dist/utilities/getTopLevelFieldNames.spec.js +18 -0
- package/dist/utilities/getTopLevelFieldNames.spec.js.map +1 -0
- package/dist/utilities/handleEndpoints.js +1 -1
- package/dist/utilities/handleEndpoints.js.map +1 -1
- package/dist/utilities/parseParams/index.d.ts.map +1 -1
- package/dist/utilities/parseParams/index.js +3 -1
- package/dist/utilities/parseParams/index.js.map +1 -1
- package/dist/utilities/parseParams/index.spec.js +8 -0
- package/dist/utilities/parseParams/index.spec.js.map +1 -1
- package/dist/utilities/traverseFields.d.ts.map +1 -1
- package/dist/utilities/traverseFields.js +5 -14
- package/dist/utilities/traverseFields.js.map +1 -1
- package/dist/utilities/unflatten.d.ts.map +1 -1
- package/dist/utilities/unflatten.js +21 -9
- package/dist/utilities/unflatten.js.map +1 -1
- package/dist/utilities/unflatten.spec.js +38 -0
- package/dist/utilities/unflatten.spec.js.map +1 -0
- package/dist/versions/allLocalesPublicationStatus.d.ts +38 -0
- package/dist/versions/allLocalesPublicationStatus.d.ts.map +1 -0
- package/dist/versions/allLocalesPublicationStatus.js +57 -0
- package/dist/versions/allLocalesPublicationStatus.js.map +1 -0
- package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
- package/dist/versions/getLatestGlobalVersion.js +10 -2
- package/dist/versions/getLatestGlobalVersion.js.map +1 -1
- package/dist/versions/getRestoredStatusesToAuthorize.d.ts +9 -0
- package/dist/versions/getRestoredStatusesToAuthorize.d.ts.map +1 -0
- package/dist/versions/getRestoredStatusesToAuthorize.js +22 -0
- package/dist/versions/getRestoredStatusesToAuthorize.js.map +1 -0
- package/dist/versions/getRestoredStatusesToAuthorize.spec.js +50 -0
- package/dist/versions/getRestoredStatusesToAuthorize.spec.js.map +1 -0
- package/dist/versions/schedule/job.d.ts +2 -2
- package/dist/versions/schedule/job.d.ts.map +1 -1
- package/dist/versions/schedule/job.js +11 -7
- package/dist/versions/schedule/job.js.map +1 -1
- package/dist/versions/schedule/types.d.ts +5 -1
- package/dist/versions/schedule/types.d.ts.map +1 -1
- package/dist/versions/schedule/types.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/uploads/fetchAPI-multipart/processMultipart.spec.ts"],"sourcesContent":["import fs from 'fs'\nimport { mkdtemp, readFile, readdir, rm, stat, writeFile } from 'fs/promises'\nimport { tmpdir } from 'os'\nimport path from 'path'\nimport { describe, expect, it, vi } from 'vitest'\n\nimport { processMultipartFormdata } from './index.js'\n\nconst requestFor = (form: FormData) =>\n new Request('http://localhost/api/media', { body: form, method: 'POST' })\nconst fileForm = (size: number) => {\n const form = new FormData()\n form.append('file', new Blob([new Uint8Array(size)]), 'sample.bin')\n return form\n}\n\nconst streamedFileRequest = ({\n chunk,\n chunkCount,\n isClosed = true,\n onCancel,\n}: {\n chunk: Uint8Array\n chunkCount: number\n isClosed?: boolean\n onCancel?: () => void\n}) => {\n const header = Buffer.from(\n '--sample\\r\\nContent-Disposition: form-data; name=\"file\"; filename=\"sample.bin\"\\r\\nContent-Type: application/octet-stream\\r\\n\\r\\n',\n )\n const footer = Buffer.from('\\r\\n--sample--\\r\\n')\n let chunksRead = 0\n const body = new ReadableStream<Uint8Array>({\n cancel() {\n onCancel?.()\n },\n pull(controller) {\n if (chunksRead === 0) {\n controller.enqueue(header)\n } else if (chunksRead <= chunkCount) {\n controller.enqueue(chunk)\n } else if (isClosed) {\n controller.enqueue(footer)\n controller.close()\n }\n chunksRead += 1\n },\n })\n\n return new Request('http://localhost/api/media', {\n body,\n duplex: 'half',\n method: 'POST',\n headers: { 'content-type': 'multipart/form-data; boundary=sample' },\n } as RequestInit)\n}\n\ndescribe('multipart limits', () => {\n it('should reject files above the default size with a partial limit override', async () => {\n await expect(\n processMultipartFormdata({\n options: { limits: { fields: 2 } },\n request: requestFor(fileForm(20 * 1024 * 1024 + 1)),\n }).then(() => 'accepted'),\n ).rejects.toMatchObject({ status: 413 })\n })\n\n it.each([\n {\n kind: 'files',\n count: 3,\n append: ({ form, index }: { form: FormData; index: number }) =>\n form.append('file', new Blob(['sample']), `sample-${index}.txt`),\n },\n {\n kind: 'fields',\n count: 3,\n append: ({ form, index }: { form: FormData; index: number }) =>\n form.append(`field${index}`, 'sample'),\n },\n ])('should reject requests above the configured $kind count', async ({ kind, count, append }) => {\n const form = new FormData()\n for (let i = 0; i < count; i++) {\n append({ form, index: i })\n }\n await expect(\n processMultipartFormdata({ options: { limits: { [kind]: 2 } }, request: requestFor(form) }),\n ).rejects.toMatchObject({ status: 413 })\n })\n\n it('should preserve explicitly requested file truncation', async () => {\n const result = await processMultipartFormdata({\n options: { abortOnLimit: false, limits: { fileSize: 3 } },\n request: requestFor(fileForm(6)),\n })\n expect(result.files.file).toMatchObject({ size: 3, truncated: true })\n })\n\n it('should parse ordinary files and fields', async () => {\n const form = fileForm(6)\n form.append('_payload', '{\"title\":\"Sample\"}')\n const result = await processMultipartFormdata({ request: requestFor(form) })\n expect(result.files.file.size).toBe(6)\n expect(result.fields._payload).toBe('{\"title\":\"Sample\"}')\n })\n\n it.each([\n { label: 'NaN', requestSizeLimit: Number.NaN },\n { label: 'a negative value', requestSizeLimit: -1 },\n { label: 'negative Infinity', requestSizeLimit: -Infinity },\n { label: 'a fractional value', requestSizeLimit: 1.5 },\n { label: 'an unsafe integer', requestSizeLimit: Number.MAX_SAFE_INTEGER + 1 },\n ])('should reject $label as a request size limit', async ({ requestSizeLimit }) => {\n const request = requestFor(fileForm(1))\n\n await expect(\n processMultipartFormdata({ options: { requestSizeLimit }, request }),\n ).rejects.toThrow(\n 'requestSizeLimit must be Infinity or a non-negative safe integer representing bytes',\n )\n expect(request.body!.locked).toBe(false)\n })\n\n it('should accept zero as a request size limit', async () => {\n await expect(\n processMultipartFormdata({\n options: { requestSizeLimit: 0 },\n request: requestFor(fileForm(1)),\n }),\n ).rejects.toThrow('Multipart request size limit has been reached')\n })\n\n it.each([Number.MAX_SAFE_INTEGER, Infinity])(\n 'should accept %s as a request size limit',\n async (requestSizeLimit) => {\n const result = await processMultipartFormdata({\n options: { requestSizeLimit },\n request: requestFor(fileForm(1)),\n })\n expect(result.files.file.size).toBe(1)\n },\n )\n})\n\ndescribe('multipart streaming', () => {\n it('should cancel an unfinished body promptly when a file reaches its limit', async () => {\n let cancelled = false\n const body = new ReadableStream({\n start(controller) {\n controller.enqueue(\n Buffer.from(\n '--sample\\r\\nContent-Disposition: form-data; name=\"file\"; filename=\"sample.txt\"\\r\\nContent-Type: text/plain\\r\\n\\r\\nsample data',\n ),\n )\n },\n cancel() {\n cancelled = true\n },\n })\n const request = new Request('http://localhost/api/media', {\n body,\n duplex: 'half',\n method: 'POST',\n headers: { 'content-type': 'multipart/form-data; boundary=sample' },\n } as RequestInit)\n await expect(\n processMultipartFormdata({ options: { limits: { fileSize: 3 } }, request }),\n ).rejects.toMatchObject({ status: 413 })\n expect(cancelled).toBe(true)\n }, 1000)\n\n it.each([\n { label: 'omitted', override: {} },\n { label: 'explicitly undefined', override: { requestSizeLimit: undefined } },\n ])('should enforce the default request size when it is $label', async ({ override }) => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n try {\n const options = {\n limits: { fileSize: Infinity },\n tempFileDir: directory,\n useTempFiles: true,\n ...override,\n }\n await expect(\n processMultipartFormdata({\n options,\n request: streamedFileRequest({\n chunk: Buffer.alloc(1024 * 1024),\n chunkCount: 51,\n }),\n }),\n ).rejects.toMatchObject({ status: 413 })\n expect(await readdir(directory)).toEqual([])\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n })\n\n it('should accept requests within the default request size', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n try {\n const result = await processMultipartFormdata({\n options: {\n limits: { fileSize: Infinity },\n tempFileDir: directory,\n useTempFiles: true,\n },\n request: streamedFileRequest({\n chunk: Buffer.alloc(1024 * 1024),\n chunkCount: 49,\n }),\n })\n expect((await stat(result.files.file.tempFilePath!)).size).toBe(49 * 1024 * 1024)\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n })\n\n it('should accept requests above the default size with a larger finite limit', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n try {\n const result = await processMultipartFormdata({\n options: {\n limits: { fileSize: Infinity },\n requestSizeLimit: 52 * 1024 * 1024,\n tempFileDir: directory,\n useTempFiles: true,\n },\n request: streamedFileRequest({\n chunk: Buffer.alloc(1024 * 1024),\n chunkCount: 51,\n }),\n })\n expect((await stat(result.files.file.tempFilePath!)).size).toBe(51 * 1024 * 1024)\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n })\n\n it('should accept requests above the default size when the limit is disabled', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n try {\n const result = await processMultipartFormdata({\n options: {\n limits: { fileSize: Infinity },\n requestSizeLimit: Infinity,\n tempFileDir: directory,\n useTempFiles: true,\n },\n request: streamedFileRequest({\n chunk: Buffer.alloc(1024 * 1024),\n chunkCount: 51,\n }),\n })\n expect((await stat(result.files.file.tempFilePath!)).size).toBe(51 * 1024 * 1024)\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n })\n\n it('should cancel and clean up before forwarding a chunk above the request size limit', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n let isCancelled = false\n try {\n await expect(\n processMultipartFormdata({\n options: {\n limits: { fileSize: 192 * 1024 },\n requestSizeLimit: 200 * 1024,\n responseOnLimit: 'File size limit has been reached',\n tempFileDir: directory,\n useTempFiles: true,\n },\n request: streamedFileRequest({\n chunk: Buffer.alloc(128 * 1024),\n chunkCount: 2,\n isClosed: false,\n onCancel: () => {\n isCancelled = true\n },\n }),\n }),\n ).rejects.toThrow('Multipart request size limit has been reached')\n expect(isCancelled).toBe(true)\n expect(await readdir(directory)).toEqual([])\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n }, 1000)\n\n it.each([\n {\n kind: 'files',\n count: 4,\n append: ({ form, index }: { form: FormData; index: number }) =>\n form.append('file', new Blob(['sample']), `sample-${index}.txt`),\n },\n {\n kind: 'fields',\n count: 21,\n append: ({ form, index }: { form: FormData; index: number }) =>\n form.append(`field${index}`, 'sample'),\n },\n ])(\n 'should enforce the default $kind count with another limit overridden',\n async ({ count, append }) => {\n const form = new FormData()\n for (let i = 0; i < count; i++) {\n append({ form, index: i })\n }\n await expect(\n processMultipartFormdata({\n options: { limits: { fileSize: 100 } },\n request: requestFor(form),\n }).then(() => 'accepted'),\n ).rejects.toMatchObject({ status: 413 })\n },\n )\n\n it('should accept an explicitly increased file count', async () => {\n const form = new FormData()\n for (let i = 0; i < 11; i++) form.append(`file${i}`, new Blob(['sample']), `sample-${i}.txt`)\n const result = await processMultipartFormdata({\n options: { limits: { files: 11 } },\n request: requestFor(form),\n })\n expect(Object.keys(result.files)).toHaveLength(11)\n })\n\n it('should reject oversized fields', async () => {\n const form = new FormData()\n form.append('title', 'sample')\n await expect(\n processMultipartFormdata({\n options: { limits: { fieldSize: 3 } },\n request: requestFor(form),\n }),\n ).rejects.toMatchObject({ status: 413 })\n })\n\n it('should reject requests above the configured part count', async () => {\n const form = fileForm(6)\n form.append('title', 'sample')\n await expect(\n processMultipartFormdata({ options: { limits: { parts: 1 } }, request: requestFor(form) }),\n ).rejects.toMatchObject({ status: 413 })\n })\n\n it('should remove completed and partial temporary files after a limit', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n try {\n const form = new FormData()\n form.append('first', new Blob(['ok']), 'first.txt')\n form.append('second', new Blob(['sample']), 'second.txt')\n await expect(\n processMultipartFormdata({\n options: { limits: { fileSize: 3 }, tempFileDir: directory, useTempFiles: true },\n request: requestFor(form),\n }),\n ).rejects.toMatchObject({ status: 413 })\n expect(await readdir(directory)).toEqual([])\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n })\n\n it('should flush ordinary temporary files before returning', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n try {\n const result = await processMultipartFormdata({\n options: { tempFileDir: directory, useTempFiles: true },\n request: requestFor(fileForm(100_000)),\n })\n expect((await readFile(result.files.file.tempFilePath!)).length).toBe(100_000)\n expect(result.files.file.data.length).toBe(0)\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n })\n\n it('should reject incomplete multipart data without waiting for upload timers', async () => {\n const request = new Request('http://localhost/api/media', {\n body: '--sample\\r\\nContent-Disposition: form-data; name=\"file\"; filename=\"sample.txt\"\\r\\n\\r\\nsample',\n method: 'POST',\n headers: { 'content-type': 'multipart/form-data; boundary=sample' },\n })\n await expect(processMultipartFormdata({ request })).rejects.toThrow()\n }, 1000)\n})\n\ndescribe('multipart completion', () => {\n it('should finish an empty temporary file part', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n try {\n const request = new Request('http://localhost/api/media', {\n body: '--sample\\r\\nContent-Disposition: form-data; name=\"file\"; filename=\"\"\\r\\nContent-Type: application/octet-stream\\r\\n\\r\\n\\r\\n--sample--\\r\\n',\n method: 'POST',\n headers: { 'content-type': 'multipart/form-data; boundary=sample' },\n })\n const result = await processMultipartFormdata({\n options: { tempFileDir: directory, useTempFiles: true },\n request,\n })\n expect(result.files).toBeUndefined()\n expect(await readdir(directory)).toEqual([])\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n }, 1000)\n\n it('should cancel a stalled upload on timeout', async () => {\n let cancelled = false\n const body = new ReadableStream({\n start(controller) {\n controller.enqueue(\n Buffer.from(\n '--sample\\r\\nContent-Disposition: form-data; name=\"file\"; filename=\"sample.txt\"\\r\\nContent-Type: text/plain\\r\\n\\r\\nsample',\n ),\n )\n },\n cancel() {\n cancelled = true\n },\n })\n const request = new Request('http://localhost/api/media', {\n body,\n duplex: 'half',\n method: 'POST',\n headers: { 'content-type': 'multipart/form-data; boundary=sample' },\n } as RequestInit)\n await expect(\n processMultipartFormdata({ options: { uploadTimeout: 10 }, request }),\n ).rejects.toThrow('Upload timeout')\n expect(cancelled).toBe(true)\n }, 1000)\n\n it('should preserve defaults for undefined limit values', async () => {\n await expect(\n processMultipartFormdata({\n options: { abortOnLimit: undefined, limits: { fileSize: undefined } },\n request: requestFor(fileForm(20 * 1024 * 1024 + 1)),\n }).then(() => 'accepted'),\n ).rejects.toMatchObject({ status: 413 })\n })\n})\n\nit('should wait for temporary file backpressure before reading more body chunks', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n const createWriteStream = fs.createWriteStream\n let releaseWrite: () => void\n let startedWrite: () => void\n const gate = new Promise<void>((resolve) => {\n releaseWrite = resolve\n })\n const started = new Promise<void>((resolve) => {\n startedWrite = resolve\n })\n const spy = vi.spyOn(fs, 'createWriteStream').mockImplementation((filePath) => {\n const stream = createWriteStream(filePath, { highWaterMark: 1 })\n const write = stream._write.bind(stream)\n stream._write = (chunk, encoding, callback) => {\n startedWrite()\n void gate.then(() => write(chunk, encoding, callback))\n }\n const writev = stream._writev!.bind(stream)\n stream._writev = (chunks, callback) => {\n startedWrite()\n void gate.then(() => writev(chunks, callback))\n }\n return stream\n })\n let pulls = 0\n const body = new ReadableStream({\n pull(controller) {\n pulls++\n if (pulls === 1)\n controller.enqueue(\n Buffer.from(\n '--sample\\r\\nContent-Disposition: form-data; name=\"file\"; filename=\"sample.bin\"\\r\\nContent-Type: application/octet-stream\\r\\n\\r\\n',\n ),\n )\n else if (pulls <= 17) controller.enqueue(Buffer.alloc(64 * 1024))\n else {\n controller.enqueue(Buffer.from('\\r\\n--sample--\\r\\n'))\n controller.close()\n }\n },\n })\n const request = new Request('http://localhost/api/media', {\n body,\n duplex: 'half',\n method: 'POST',\n headers: { 'content-type': 'multipart/form-data; boundary=sample' },\n } as RequestInit)\n const parsing = processMultipartFormdata({\n options: { tempFileDir: directory, useTempFiles: true },\n request,\n })\n try {\n await started\n await new Promise<void>((resolve) => setImmediate(resolve))\n expect(pulls).toBeLessThanOrEqual(4)\n } finally {\n releaseWrite!()\n try {\n const result = await parsing\n expect((await readFile(result.files.file.tempFilePath!)).length).toBe(1024 * 1024)\n } finally {\n spy.mockRestore()\n await rm(directory, { recursive: true, force: true })\n }\n }\n})\n\nit('should reject temporary file write errors and release the request', async () => {\n const directory = await mkdtemp(path.join(tmpdir(), 'multipart-'))\n try {\n const destination = path.join(directory, 'sample.txt')\n await writeFile(destination, 'sample')\n const request = requestFor(fileForm(100_000))\n await expect(\n processMultipartFormdata({\n options: { tempFileDir: destination, useTempFiles: true },\n request,\n }),\n ).rejects.toMatchObject({ code: 'ENOTDIR' })\n expect(request.body!.locked).toBe(false)\n } finally {\n await rm(directory, { recursive: true, force: true })\n }\n}, 1000)\n\nit('should propagate body read errors without leaving the reader locked', async () => {\n const body = new ReadableStream({\n start(controller) {\n controller.error(new Error('Read failed'))\n },\n })\n const request = new Request('http://localhost/api/media', {\n body,\n duplex: 'half',\n method: 'POST',\n headers: { 'content-type': 'multipart/form-data; boundary=sample' },\n } as RequestInit)\n await expect(processMultipartFormdata({ request })).rejects.toThrow('Read failed')\n expect(body.locked).toBe(false)\n})\n"],"names":["fs","mkdtemp","readFile","readdir","rm","stat","writeFile","tmpdir","path","describe","expect","it","vi","processMultipartFormdata","requestFor","form","Request","body","method","fileForm","size","FormData","append","Blob","Uint8Array","streamedFileRequest","chunk","chunkCount","isClosed","onCancel","header","Buffer","from","footer","chunksRead","ReadableStream","cancel","pull","controller","enqueue","close","duplex","headers","options","limits","fields","request","then","rejects","toMatchObject","status","each","kind","count","index","i","result","abortOnLimit","fileSize","files","file","truncated","toBe","_payload","label","requestSizeLimit","Number","NaN","Infinity","MAX_SAFE_INTEGER","toThrow","locked","cancelled","start","override","undefined","directory","join","tempFileDir","useTempFiles","alloc","toEqual","recursive","force","tempFilePath","isCancelled","responseOnLimit","Object","keys","toHaveLength","fieldSize","parts","length","data","toBeUndefined","uploadTimeout","createWriteStream","releaseWrite","startedWrite","gate","Promise","resolve","started","spy","spyOn","mockImplementation","filePath","stream","highWaterMark","write","_write","bind","encoding","callback","writev","_writev","chunks","pulls","parsing","setImmediate","toBeLessThanOrEqual","mockRestore","destination","code","error","Error"],"mappings":"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"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import type { Collection } from '../collections/config/types.js';
|
|
2
2
|
import type { SanitizedConfig } from '../config/types.js';
|
|
3
3
|
import type { PayloadRequest } from '../types/index.js';
|
|
4
|
+
import type { ExternalUploadSource } from './sanitizeUploadData.js';
|
|
4
5
|
import type { FileToSave } from './types.js';
|
|
5
6
|
type Args<T> = {
|
|
6
7
|
collection: Collection;
|
|
7
8
|
config: SanitizedConfig;
|
|
8
9
|
data: T;
|
|
9
10
|
draft?: boolean;
|
|
11
|
+
externalUploadSource?: ExternalUploadSource;
|
|
10
12
|
isDuplicating?: boolean;
|
|
11
13
|
operation: 'create' | 'update';
|
|
12
14
|
originalDoc?: T;
|
|
@@ -26,6 +28,6 @@ type Result<T> = Promise<{
|
|
|
26
28
|
* loading it into memory unnecessarily, this skips reading the temp file entirely when local
|
|
27
29
|
* storage is disabled, and copies it straight to its destination when local storage is enabled.
|
|
28
30
|
*/
|
|
29
|
-
export declare const generateFileData: <T>({ collection: { config: collectionConfig }, data, draft, isDuplicating, operation, originalDoc, overwriteExistingFiles, req, throwOnMissingFile, }: Args<T>) => Result<T>;
|
|
31
|
+
export declare const generateFileData: <T>({ collection: { config: collectionConfig }, data, draft, externalUploadSource, isDuplicating, operation, originalDoc, overwriteExistingFiles, req, throwOnMissingFile, }: Args<T>) => Result<T>;
|
|
30
32
|
export {};
|
|
31
33
|
//# sourceMappingURL=generateFileData.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateFileData.d.ts","sourceRoot":"","sources":["../../src/uploads/generateFileData.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generateFileData.d.ts","sourceRoot":"","sources":["../../src/uploads/generateFileData.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AACnE,OAAO,KAAK,EAAY,UAAU,EAAgC,MAAM,YAAY,CAAA;AAiBpF,KAAK,IAAI,CAAC,CAAC,IAAI;IACb,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;IAC3C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,WAAW,CAAC,EAAE,CAAC,CAAA;IACf,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,GAAG,EAAE,cAAc,CAAA;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,KAAK,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB,CAAC,CAAA;AA6BF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,GAAU,CAAC,4KAWrC,IAAI,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,CA4YpB,CAAA"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { fileTypeFromBuffer } from 'file-type';
|
|
2
2
|
import fs from 'fs/promises';
|
|
3
|
-
import sanitize from 'sanitize-filename';
|
|
4
3
|
import { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js';
|
|
5
4
|
import { isNumber } from '../utilities/isNumber.js';
|
|
6
5
|
import { canResizeImage } from './canResizeImage.js';
|
|
@@ -8,14 +7,16 @@ import { checkFileRestrictions } from './checkFileRestrictions.js';
|
|
|
8
7
|
import { cropImage } from './cropImage.js';
|
|
9
8
|
import { getExternalFile } from './getExternalFile.js';
|
|
10
9
|
import { getFileByPath } from './getFileByPath.js';
|
|
10
|
+
import { getFileExtension, getSanitizedUploadFilename } from './getFileTypeIdentity.js';
|
|
11
11
|
import { getImageSize } from './getImageSize.js';
|
|
12
12
|
import { getSafeFileName } from './getSafeFilename.js';
|
|
13
13
|
import { createImageSizes } from './image-resizing/createImageSizes.js';
|
|
14
14
|
import { isAnimatedImage } from './isAnimatedImage.js';
|
|
15
15
|
import { isImage } from './isImage.js';
|
|
16
|
+
import { isProcessableImage } from './isProcessableImage.js';
|
|
16
17
|
import { optionallyAppendMetadata } from './optionallyAppendMetadata.js';
|
|
17
18
|
const shouldReupload = (uploadEdits, fileData)=>{
|
|
18
|
-
if (!fileData) {
|
|
19
|
+
if (!fileData || !uploadEdits) {
|
|
19
20
|
return false;
|
|
20
21
|
}
|
|
21
22
|
if (uploadEdits.crop || uploadEdits.heightInPixels || uploadEdits.widthInPixels) {
|
|
@@ -39,7 +40,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
39
40
|
* in-memory buffer, and that temp file can be far larger than server memory allows. To avoid
|
|
40
41
|
* loading it into memory unnecessarily, this skips reading the temp file entirely when local
|
|
41
42
|
* storage is disabled, and copies it straight to its destination when local storage is enabled.
|
|
42
|
-
*/ export const generateFileData = async ({ collection: { config: collectionConfig }, data, draft, isDuplicating, operation, originalDoc, overwriteExistingFiles, req, throwOnMissingFile })=>{
|
|
43
|
+
*/ export const generateFileData = async ({ collection: { config: collectionConfig }, data, draft, externalUploadSource, isDuplicating, operation, originalDoc, overwriteExistingFiles, req, throwOnMissingFile })=>{
|
|
43
44
|
if (!collectionConfig.upload) {
|
|
44
45
|
return {
|
|
45
46
|
data,
|
|
@@ -52,15 +53,18 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
52
53
|
data,
|
|
53
54
|
isDuplicating,
|
|
54
55
|
operation,
|
|
55
|
-
originalDoc
|
|
56
|
+
// Only a duplication source informs edit parsing. Updates now also pass `originalDoc` so the
|
|
57
|
+
// stored file can be reprocessed, and that must not change which edits are applied.
|
|
58
|
+
originalDoc: isDuplicating ? originalDoc : undefined,
|
|
56
59
|
req
|
|
57
60
|
});
|
|
58
61
|
const { constructorOptions, disableLocalStorage, focalPoint: focalPointEnabled = true, formatOptions, imageSizes, resizeOptions, staticDir, trimOptions, withMetadata } = collectionConfig.upload;
|
|
59
62
|
const staticPath = staticDir;
|
|
60
63
|
const incomingFileData = isDuplicating ? originalDoc : data;
|
|
64
|
+
const fileSourceData = externalUploadSource ?? (operation === 'update' ? originalDoc : incomingFileData);
|
|
61
65
|
let isLocalFile = false;
|
|
62
|
-
if (!file && (isDuplicating || shouldReupload(uploadEdits, incomingFileData))) {
|
|
63
|
-
const { filename, url } =
|
|
66
|
+
if (!file && fileSourceData && (externalUploadSource || isDuplicating || shouldReupload(uploadEdits, incomingFileData))) {
|
|
67
|
+
const { filename, url } = fileSourceData;
|
|
64
68
|
if (filename && (filename.includes('../') || filename.includes('..\\'))) {
|
|
65
69
|
throw new Forbidden(req.t);
|
|
66
70
|
}
|
|
@@ -68,7 +72,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
68
72
|
isLocalFile = true;
|
|
69
73
|
}
|
|
70
74
|
try {
|
|
71
|
-
if (!disableLocalStorage && isLocalFile) {
|
|
75
|
+
if (!externalUploadSource && !disableLocalStorage && isLocalFile) {
|
|
72
76
|
// File is stored locally
|
|
73
77
|
const filePath = `${staticPath}/${filename}`;
|
|
74
78
|
const response = await getFileByPath(filePath);
|
|
@@ -77,11 +81,11 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
77
81
|
} else if (filename && url) {
|
|
78
82
|
// File is remote
|
|
79
83
|
file = await getExternalFile({
|
|
80
|
-
data:
|
|
84
|
+
data: fileSourceData,
|
|
81
85
|
req,
|
|
82
86
|
uploadConfig: collectionConfig.upload
|
|
83
87
|
});
|
|
84
|
-
overwriteExistingFiles =
|
|
88
|
+
overwriteExistingFiles = !externalUploadSource;
|
|
85
89
|
}
|
|
86
90
|
} catch (err) {
|
|
87
91
|
throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined);
|
|
@@ -99,11 +103,18 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
99
103
|
files: []
|
|
100
104
|
};
|
|
101
105
|
}
|
|
102
|
-
await checkFileRestrictions({
|
|
106
|
+
const detectedFileType = await checkFileRestrictions({
|
|
103
107
|
collection: collectionConfig,
|
|
104
108
|
file,
|
|
105
109
|
req
|
|
106
110
|
});
|
|
111
|
+
const shouldUseDetectedFileType = detectedFileType && (isProcessableImage(file.mimetype) || isProcessableImage(detectedFileType.mime));
|
|
112
|
+
if (shouldUseDetectedFileType && detectedFileType.mime !== file.mimetype) {
|
|
113
|
+
file = {
|
|
114
|
+
...file,
|
|
115
|
+
mimetype: detectedFileType.mime
|
|
116
|
+
};
|
|
117
|
+
}
|
|
107
118
|
if (!disableLocalStorage) {
|
|
108
119
|
await fs.mkdir(staticPath, {
|
|
109
120
|
recursive: true
|
|
@@ -152,7 +163,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
152
163
|
if (fileSupportsResize || isImage(file.mimetype)) {
|
|
153
164
|
dimensions = await getImageSize({
|
|
154
165
|
file,
|
|
155
|
-
sharp
|
|
166
|
+
sharp: fileSupportsResize ? sharp : undefined
|
|
156
167
|
});
|
|
157
168
|
fileData.width = dimensions.width;
|
|
158
169
|
fileData.height = dimensions.height;
|
|
@@ -167,6 +178,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
167
178
|
fileBuffer = await sharpFile.toBuffer({
|
|
168
179
|
resolveWithObject: true
|
|
169
180
|
});
|
|
181
|
+
delete file.clientUploadContext;
|
|
170
182
|
({ ext, mime } = await fileTypeFromBuffer(fileBuffer.data) // This is getting an incorrect gif height back.
|
|
171
183
|
);
|
|
172
184
|
fileData.width = fileBuffer.info.width;
|
|
@@ -181,7 +193,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
181
193
|
mime = file.mimetype;
|
|
182
194
|
fileData.filesize = file.size;
|
|
183
195
|
if (file.name.includes('.')) {
|
|
184
|
-
ext = file.name
|
|
196
|
+
ext = getFileExtension(getSanitizedUploadFilename(file.name));
|
|
185
197
|
} else {
|
|
186
198
|
ext = '';
|
|
187
199
|
}
|
|
@@ -191,8 +203,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
191
203
|
mime = 'image/svg+xml';
|
|
192
204
|
}
|
|
193
205
|
fileData.mimeType = mime;
|
|
194
|
-
|
|
195
|
-
fsSafeName = `${baseFilename}${ext ? `.${ext}` : ''}`;
|
|
206
|
+
fsSafeName = getSanitizedUploadFilename(file.name, ext);
|
|
196
207
|
if (!overwriteExistingFiles) {
|
|
197
208
|
// Extract prefix if present (added by plugin-cloud-storage)
|
|
198
209
|
const prefix = data?.prefix;
|
|
@@ -206,7 +217,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
206
217
|
}
|
|
207
218
|
fileData.filename = fsSafeName;
|
|
208
219
|
let fileForResize = file;
|
|
209
|
-
if (cropData && sharp) {
|
|
220
|
+
if (cropData && fileSupportsResize && sharp) {
|
|
210
221
|
const { data: croppedImage, info } = await cropImage({
|
|
211
222
|
cropData,
|
|
212
223
|
dimensions: dimensions,
|
|
@@ -262,6 +273,8 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
262
273
|
}
|
|
263
274
|
fileData.filesize = info.size;
|
|
264
275
|
}
|
|
276
|
+
delete file.clientUploadContext;
|
|
277
|
+
delete fileForResize.clientUploadContext;
|
|
265
278
|
if (file.tempFilePath) {
|
|
266
279
|
await fs.writeFile(file.tempFilePath, croppedImage); // write fileBuffer to the temp path
|
|
267
280
|
} else {
|
|
@@ -374,7 +387,7 @@ const shouldReupload = (uploadEdits, fileData)=>{
|
|
|
374
387
|
if (origDoc && 'focalX' in origDoc && 'focalY' in origDoc) {
|
|
375
388
|
// If no change in focal point, return undefined.
|
|
376
389
|
// This prevents a refocal operation triggered from admin, because it always sends the focal point.
|
|
377
|
-
if (incomingData
|
|
390
|
+
if (incomingData?.focalX === origDoc.focalX && incomingData?.focalY === origDoc.focalY) {
|
|
378
391
|
return undefined;
|
|
379
392
|
}
|
|
380
393
|
if (isDuplicating) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import type { OutputInfo, Sharp, SharpOptions } from 'sharp'\n\nimport { fileTypeFromBuffer } from 'file-type'\nimport fs from 'fs/promises'\nimport sanitize from 'sanitize-filename'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { Document, PayloadRequest } from '../types/index.js'\nimport type { FileData, FileToSave, ProbedImageSize, UploadEdits } from './types.js'\n\nimport { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js'\nimport { isNumber } from '../utilities/isNumber.js'\nimport { canResizeImage } from './canResizeImage.js'\nimport { checkFileRestrictions } from './checkFileRestrictions.js'\nimport { cropImage } from './cropImage.js'\nimport { getExternalFile } from './getExternalFile.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getImageSize } from './getImageSize.js'\nimport { getSafeFileName } from './getSafeFilename.js'\nimport { createImageSizes } from './image-resizing/createImageSizes.js'\nimport { isAnimatedImage } from './isAnimatedImage.js'\nimport { isImage } from './isImage.js'\nimport { optionallyAppendMetadata } from './optionallyAppendMetadata.js'\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n draft?: boolean\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: UploadEdits,\n fileData: Record<string, unknown> | undefined,\n) => {\n if (!fileData) {\n return false\n }\n\n if (uploadEdits.crop || uploadEdits.heightInPixels || uploadEdits.widthInPixels) {\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\n/**\n * Builds the document's file metadata and the list of files to write to disk.\n *\n * A file uploaded with `useTempFiles` enabled arrives as a temp file path instead of an\n * in-memory buffer, and that temp file can be far larger than server memory allows. To avoid\n * loading it into memory unnecessarily, this skips reading the 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 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, sharp } = req.payload.config\n\n let file = isDuplicating ? undefined : req.file\n\n const uploadEdits = parseUploadEditsFromReqOrIncomingData({\n data,\n isDuplicating,\n operation,\n originalDoc,\n req,\n })\n\n const {\n constructorOptions,\n disableLocalStorage,\n focalPoint: focalPointEnabled = true,\n formatOptions,\n imageSizes,\n resizeOptions,\n staticDir,\n trimOptions,\n withMetadata,\n } = collectionConfig.upload\n\n const staticPath = staticDir\n\n const incomingFileData: Document = isDuplicating ? originalDoc : data\n let isLocalFile = false\n\n if (\n !file &&\n (isDuplicating || shouldReupload(uploadEdits, incomingFileData as Record<string, unknown>))\n ) {\n const { filename, url } = incomingFileData as unknown as FileData\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 (!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 && url) {\n // File is remote\n file = await getExternalFile({\n data: incomingFileData as unknown as FileData,\n req,\n uploadConfig: collectionConfig.upload,\n })\n overwriteExistingFiles = true\n }\n } catch (err: unknown) {\n throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined)\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 await checkFileRestrictions({\n collection: collectionConfig,\n file,\n req,\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 fileIsAnimatedType = isAnimatedImage(file.mimetype)\n const cropData =\n typeof uploadEdits === 'object' && 'crop' in uploadEdits ? uploadEdits.crop : undefined\n\n try {\n const fileSupportsResize = canResizeImage(file.mimetype)\n let fsSafeName: string\n let sharpFile: Sharp | undefined\n let dimensions: ProbedImageSize | undefined\n let fileBuffer!: { data: Buffer; info: OutputInfo }\n let ext\n let mime: string\n // Depends only on configured resize/format/trim options, not on whether the bytes are on\n // disk or in memory.\n const fileHasAdjustments =\n fileSupportsResize &&\n Boolean(resizeOptions || formatOptions || trimOptions || constructorOptions)\n\n const sharpOptions: SharpOptions = { ...constructorOptions }\n\n if (fileIsAnimatedType) {\n sharpOptions.animated = true\n }\n\n if (sharp && (fileIsAnimatedType || fileHasAdjustments)) {\n if (file.tempFilePath) {\n sharpFile = sharp(file.tempFilePath, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n } else {\n sharpFile = sharp(file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n }\n\n if (fileHasAdjustments) {\n if (resizeOptions) {\n sharpFile = sharpFile.resize(resizeOptions)\n }\n if (formatOptions) {\n sharpFile = sharpFile.toFormat(formatOptions.format, formatOptions.options)\n }\n if (trimOptions) {\n sharpFile = sharpFile.trim(trimOptions)\n }\n }\n }\n\n if (fileSupportsResize || isImage(file.mimetype)) {\n dimensions = await getImageSize({ file, sharp })\n fileData.width = dimensions.width\n fileData.height = dimensions.height\n }\n\n if (sharpFile) {\n const metadata = await sharpFile.metadata()\n sharpFile = await optionallyAppendMetadata({\n req,\n sharpFile,\n withMetadata: withMetadata!,\n })\n fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true })\n ;({ ext, mime } = (await fileTypeFromBuffer(fileBuffer.data))!) // This is getting an incorrect gif height back.\n fileData.width = fileBuffer.info.width\n fileData.height = fileBuffer.info.height\n fileData.filesize = fileBuffer.info.size\n\n // Animated GIFs + WebP aggregate the height from every frame, so we need to use divide by number of pages\n if (metadata.pages) {\n fileData.height = fileBuffer.info.height / metadata.pages\n fileData.filesize = fileBuffer.data.length\n }\n } else {\n mime = file.mimetype\n fileData.filesize = file.size\n\n if (file.name.includes('.')) {\n ext = file.name.split('.').pop()?.split('?')[0]\n } else {\n ext = ''\n }\n }\n\n // Adjust SVG mime type. fromBuffer modifies it.\n if (mime === 'application/xml' && ext === 'svg') {\n mime = 'image/svg+xml'\n }\n fileData.mimeType = mime\n\n const baseFilename = sanitize(file.name.substring(0, file.name.lastIndexOf('.')) || file.name)\n fsSafeName = `${baseFilename}${ext ? `.${ext}` : ''}`\n\n if (!overwriteExistingFiles) {\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\n let fileForResize = file\n\n if (cropData && sharp) {\n const { data: croppedImage, info } = await cropImage({\n cropData,\n dimensions: dimensions!,\n file,\n heightInPixels: uploadEdits.heightInPixels!,\n req,\n sharp,\n widthInPixels: uploadEdits.widthInPixels!,\n withMetadata,\n })\n\n // Apply resize after cropping to ensure it conforms to resizeOptions\n if (resizeOptions && !resizeOptions.withoutEnlargement) {\n const resizedAfterCrop = await sharp(croppedImage)\n .resize({\n fit: resizeOptions?.fit || 'cover',\n height: resizeOptions?.height,\n position: resizeOptions?.position || 'center',\n width: resizeOptions?.width,\n })\n .toBuffer({ resolveWithObject: true })\n\n filesToSave.push({\n buffer: resizedAfterCrop.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...fileForResize,\n data: resizedAfterCrop.data,\n size: resizedAfterCrop.info.size,\n }\n\n fileData.width = resizedAfterCrop.info.width\n fileData.height = resizedAfterCrop.info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile!.metadata()\n fileData.height = metadata.pages\n ? resizedAfterCrop.info.height / metadata.pages\n : resizedAfterCrop.info.height\n }\n fileData.filesize = resizedAfterCrop.info.size\n } else {\n // If resizeOptions is not present, just save the cropped image\n filesToSave.push({\n buffer: croppedImage,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...file,\n data: croppedImage,\n size: info.size,\n }\n\n fileData.width = info.width\n fileData.height = info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile!.metadata()\n fileData.height = metadata.pages ? info.height / metadata.pages : info.height\n }\n fileData.filesize = info.size\n }\n\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path\n } else {\n req.file = fileForResize\n }\n } else {\n // For non-image files with useTempFiles, read the buffer from the temp file\n // since file.data is empty when using temp files.\n //\n // When local storage is disabled, filesToSave is never written to disk (create/update\n // skip uploadFiles for it), and an unmodified temp file's bytes on disk are already\n // correct, so there's nothing to read into memory or write back out. Skipping this avoids\n // buffering the entire file just to discard or rewrite it unchanged - a tempFilePath can\n // point at a file far larger than server memory allows.\n const skipTempFileBuffer =\n disableLocalStorage && Boolean(file.tempFilePath) && !fileBuffer?.data\n\n // When local storage is enabled and the temp file itself is unmodified, copy it straight\n // to its destination instead of reading it into memory first - a tempFilePath can point at\n // a file far larger than server memory allows.\n const shouldCopyFromTempFile =\n !fileBuffer?.data && Boolean(file.tempFilePath) && !disableLocalStorage\n\n if (shouldCopyFromTempFile) {\n filesToSave.push({\n path: `${staticPath}/${fsSafeName}`,\n sourcePath: file.tempFilePath!,\n })\n } else {\n let bufferToSave: Buffer\n if (fileBuffer?.data) {\n bufferToSave = fileBuffer.data\n } else if (file.tempFilePath) {\n bufferToSave = skipTempFileBuffer ? Buffer.alloc(0) : await fs.readFile(file.tempFilePath)\n } else {\n bufferToSave = file.data\n }\n\n if (!skipTempFileBuffer) {\n filesToSave.push({\n buffer: bufferToSave,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n // If using temp files and the image is being resized, write the file to the temp path\n if (fileBuffer?.data || bufferToSave.length > 0) {\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, fileBuffer?.data || bufferToSave) // write fileBuffer to the temp path\n } else {\n // Assign the _possibly modified_ file to the request object\n req.file = {\n ...file,\n data: fileBuffer?.data || bufferToSave,\n size: fileBuffer?.info.size,\n }\n }\n }\n }\n }\n }\n\n if (fileSupportsResize && (Array.isArray(imageSizes) || focalPointEnabled !== false)) {\n req.payloadUploadSizes = {}\n // Focal point adjustments\n const focalPoint =\n focalPointEnabled && uploadEdits?.focalPoint\n ? {\n x: isNumber(uploadEdits.focalPoint.x) ? Math.round(uploadEdits.focalPoint.x) : 50,\n y: isNumber(uploadEdits.focalPoint.y) ? Math.round(uploadEdits.focalPoint.y) : 50,\n }\n : undefined\n\n const { sizeData, sizesToSave } = await createImageSizes({\n config: collectionConfig,\n dimensions: !cropData\n ? dimensions!\n : {\n ...dimensions,\n height: fileData.height!,\n width: fileData.width!,\n },\n file: fileForResize,\n focalPoint,\n mimeType: fileData.mimeType,\n req,\n savedFilename: fsSafeName || file.name,\n sharp,\n staticPath: staticPath!,\n withMetadata,\n })\n\n fileData.sizes = sizeData\n fileData.focalX = focalPoint?.x\n fileData.focalY = focalPoint?.y\n filesToSave.push(...sizesToSave)\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 // If no change in focal point, return undefined.\n // This prevents a refocal operation triggered from admin, because it always sends the focal point.\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","sanitize","FileRetrievalError","FileUploadError","Forbidden","MissingFile","isNumber","canResizeImage","checkFileRestrictions","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","createImageSizes","isAnimatedImage","isImage","optionallyAppendMetadata","shouldReupload","uploadEdits","fileData","crop","heightInPixels","widthInPixels","focalPoint","incomingFocalX","x","incomingFocalY","y","currentFocalX","focalX","currentFocalY","focalY","isEqual","generateFileData","collection","config","collectionConfig","data","draft","isDuplicating","operation","originalDoc","overwriteExistingFiles","req","throwOnMissingFile","upload","files","serverURL","sharp","payload","file","undefined","parseUploadEditsFromReqOrIncomingData","constructorOptions","disableLocalStorage","focalPointEnabled","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","withMetadata","staticPath","incomingFileData","isLocalFile","filename","url","includes","t","startsWith","filePath","response","uploadConfig","err","Error","message","mkdir","recursive","newData","filesToSave","fileIsAnimatedType","mimetype","cropData","fileSupportsResize","fsSafeName","sharpFile","dimensions","fileBuffer","ext","mime","fileHasAdjustments","Boolean","sharpOptions","animated","tempFilePath","rotate","resize","toFormat","format","options","trim","width","height","metadata","toBuffer","resolveWithObject","info","filesize","size","pages","length","name","split","pop","mimeType","baseFilename","substring","lastIndexOf","prefix","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","withoutEnlargement","resizedAfterCrop","fit","position","push","buffer","path","writeFile","skipTempFileBuffer","shouldCopyFromTempFile","sourcePath","bufferToSave","Buffer","alloc","readFile","Array","isArray","payloadUploadSizes","Math","round","sizeData","sizesToSave","savedFilename","sizes","logger","error","_status","args","query","incomingData","origDoc"],"mappings":"AAEA,SAASA,kBAAkB,QAAQ,YAAW;AAC9C,OAAOC,QAAQ,cAAa;AAC5B,OAAOC,cAAc,oBAAmB;AAOxC,SAASC,kBAAkB,EAAEC,eAAe,EAAEC,SAAS,EAAEC,WAAW,QAAQ,qBAAoB;AAChG,SAASC,QAAQ,QAAQ,2BAA0B;AACnD,SAASC,cAAc,QAAQ,sBAAqB;AACpD,SAASC,qBAAqB,QAAQ,6BAA4B;AAClE,SAASC,SAAS,QAAQ,iBAAgB;AAC1C,SAASC,eAAe,QAAQ,uBAAsB;AACtD,SAASC,aAAa,QAAQ,qBAAoB;AAClD,SAASC,YAAY,QAAQ,oBAAmB;AAChD,SAASC,eAAe,QAAQ,uBAAsB;AACtD,SAASC,gBAAgB,QAAQ,uCAAsC;AACvE,SAASC,eAAe,QAAQ,uBAAsB;AACtD,SAASC,OAAO,QAAQ,eAAc;AACtC,SAASC,wBAAwB,QAAQ,gCAA+B;AAmBxE,MAAMC,iBAAiB,CACrBC,aACAC;IAEA,IAAI,CAACA,UAAU;QACb,OAAO;IACT;IAEA,IAAID,YAAYE,IAAI,IAAIF,YAAYG,cAAc,IAAIH,YAAYI,aAAa,EAAE;QAC/E,OAAO;IACT;IAEA,8FAA8F;IAC9F,IAAIJ,YAAYK,UAAU,EAAE;QAC1B,MAAMC,iBAAiBN,YAAYK,UAAU,CAACE,CAAC;QAC/C,MAAMC,iBAAiBR,YAAYK,UAAU,CAACI,CAAC;QAE/C,MAAMC,gBAAgB,YAAYT,YAAYA,SAASU,MAAM;QAC7D,MAAMC,gBAAgB,YAAYX,YAAYA,SAASY,MAAM;QAE7D,MAAMC,UAAUR,mBAAmBI,iBAAiBF,mBAAmBI;QACvE,OAAO,CAACE;IACV;IAEA,OAAO;AACT;AAEA;;;;;;;CAOC,GACD,OAAO,MAAMC,mBAAmB,OAAU,EACxCC,YAAY,EAAEC,QAAQC,gBAAgB,EAAE,EACxCC,IAAI,EACJC,KAAK,EACLC,aAAa,EACbC,SAAS,EACTC,WAAW,EACXC,sBAAsB,EACtBC,GAAG,EACHC,kBAAkB,EACV;IACR,IAAI,CAACR,iBAAiBS,MAAM,EAAE;QAC5B,OAAO;YACLR;YACAS,OAAO,EAAE;QACX;IACF;IAEA,MAAM,EAAEC,SAAS,EAAEC,KAAK,EAAE,GAAGL,IAAIM,OAAO,CAACd,MAAM;IAE/C,IAAIe,OAAOX,gBAAgBY,YAAYR,IAAIO,IAAI;IAE/C,MAAMhC,cAAckC,sCAAsC;QACxDf;QACAE;QACAC;QACAC;QACAE;IACF;IAEA,MAAM,EACJU,kBAAkB,EAClBC,mBAAmB,EACnB/B,YAAYgC,oBAAoB,IAAI,EACpCC,aAAa,EACbC,UAAU,EACVC,aAAa,EACbC,SAAS,EACTC,WAAW,EACXC,YAAY,EACb,GAAGzB,iBAAiBS,MAAM;IAE3B,MAAMiB,aAAaH;IAEnB,MAAMI,mBAA6BxB,gBAAgBE,cAAcJ;IACjE,IAAI2B,cAAc;IAElB,IACE,CAACd,QACAX,CAAAA,iBAAiBtB,eAAeC,aAAa6C,iBAA2C,GACzF;QACA,MAAM,EAAEE,QAAQ,EAAEC,GAAG,EAAE,GAAGH;QAC1B,IAAIE,YAAaA,CAAAA,SAASE,QAAQ,CAAC,UAAUF,SAASE,QAAQ,CAAC,OAAM,GAAI;YACvE,MAAM,IAAIhE,UAAUwC,IAAIyB,CAAC;QAC3B;QAEA,IAAI,AAACrB,aAAamB,KAAKG,WAAWtB,cAAemB,KAAKG,WAAW,MAAM;YACrEL,cAAc;QAChB;QAEA,IAAI;YACF,IAAI,CAACV,uBAAuBU,aAAa;gBACvC,yBAAyB;gBACzB,MAAMM,WAAW,GAAGR,WAAW,CAAC,EAAEG,UAAU;gBAC5C,MAAMM,WAAW,MAAM7D,cAAc4D;gBACrCpB,OAAOqB;gBACP7B,yBAAyB;YAC3B,OAAO,IAAIuB,YAAYC,KAAK;gBAC1B,iBAAiB;gBACjBhB,OAAO,MAAMzC,gBAAgB;oBAC3B4B,MAAM0B;oBACNpB;oBACA6B,cAAcpC,iBAAiBS,MAAM;gBACvC;gBACAH,yBAAyB;YAC3B;QACF,EAAE,OAAO+B,KAAc;YACrB,MAAM,IAAIxE,mBAAmB0C,IAAIyB,CAAC,EAAEK,eAAeC,QAAQD,IAAIE,OAAO,GAAGxB;QAC3E;IACF;IAEA,IAAIZ,eAAe;QACjBG,yBAAyB;IAC3B;IAEA,IAAI,CAACQ,MAAM;QACT,IAAIN,oBAAoB;YACtB,MAAM,IAAIxC,YAAYuC,IAAIyB,CAAC;QAC7B;QAEA,OAAO;YACL/B,MAAM0B;YACNjB,OAAO,EAAE;QACX;IACF;IAEA,MAAMvC,sBAAsB;QAC1B2B,YAAYE;QACZc;QACAP;IACF;IAEA,IAAI,CAACW,qBAAqB;QACxB,MAAMvD,GAAG6E,KAAK,CAACd,YAAa;YAAEe,WAAW;QAAK;IAChD;IAEA,IAAIC,UAAUf;IACd,MAAMgB,cAA4B,EAAE;IACpC,MAAM5D,WAA8B,CAAC;IACrC,MAAM6D,qBAAqBlE,gBAAgBoC,KAAK+B,QAAQ;IACxD,MAAMC,WACJ,OAAOhE,gBAAgB,YAAY,UAAUA,cAAcA,YAAYE,IAAI,GAAG+B;IAEhF,IAAI;QACF,MAAMgC,qBAAqB7E,eAAe4C,KAAK+B,QAAQ;QACvD,IAAIG;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,yFAAyF;QACzF,qBAAqB;QACrB,MAAMC,qBACJP,sBACAQ,QAAQjC,iBAAiBF,iBAAiBI,eAAeP;QAE3D,MAAMuC,eAA6B;YAAE,GAAGvC,kBAAkB;QAAC;QAE3D,IAAI2B,oBAAoB;YACtBY,aAAaC,QAAQ,GAAG;QAC1B;QAEA,IAAI7C,SAAUgC,CAAAA,sBAAsBU,kBAAiB,GAAI;YACvD,IAAIxC,KAAK4C,YAAY,EAAE;gBACrBT,YAAYrC,MAAME,KAAK4C,YAAY,EAAEF,cAAcG,MAAM,IAAG,mGAAmG;YACjK,OAAO;gBACLV,YAAYrC,MAAME,KAAKb,IAAI,EAAEuD,cAAcG,MAAM,IAAG,mGAAmG;YACzJ;YAEA,IAAIL,oBAAoB;gBACtB,IAAIhC,eAAe;oBACjB2B,YAAYA,UAAUW,MAAM,CAACtC;gBAC/B;gBACA,IAAIF,eAAe;oBACjB6B,YAAYA,UAAUY,QAAQ,CAACzC,cAAc0C,MAAM,EAAE1C,cAAc2C,OAAO;gBAC5E;gBACA,IAAIvC,aAAa;oBACfyB,YAAYA,UAAUe,IAAI,CAACxC;gBAC7B;YACF;QACF;QAEA,IAAIuB,sBAAsBpE,QAAQmC,KAAK+B,QAAQ,GAAG;YAChDK,aAAa,MAAM3E,aAAa;gBAAEuC;gBAAMF;YAAM;YAC9C7B,SAASkF,KAAK,GAAGf,WAAWe,KAAK;YACjClF,SAASmF,MAAM,GAAGhB,WAAWgB,MAAM;QACrC;QAEA,IAAIjB,WAAW;YACb,MAAMkB,WAAW,MAAMlB,UAAUkB,QAAQ;YACzClB,YAAY,MAAMrE,yBAAyB;gBACzC2B;gBACA0C;gBACAxB,cAAcA;YAChB;YACA0B,aAAa,MAAMF,UAAUmB,QAAQ,CAAC;gBAAEC,mBAAmB;YAAK;YAC9D,CAAA,EAAEjB,GAAG,EAAEC,IAAI,EAAE,GAAI,MAAM3F,mBAAmByF,WAAWlD,IAAI,EAAK,gDAAgD;YAAnD;YAC7DlB,SAASkF,KAAK,GAAGd,WAAWmB,IAAI,CAACL,KAAK;YACtClF,SAASmF,MAAM,GAAGf,WAAWmB,IAAI,CAACJ,MAAM;YACxCnF,SAASwF,QAAQ,GAAGpB,WAAWmB,IAAI,CAACE,IAAI;YAExC,0GAA0G;YAC1G,IAAIL,SAASM,KAAK,EAAE;gBAClB1F,SAASmF,MAAM,GAAGf,WAAWmB,IAAI,CAACJ,MAAM,GAAGC,SAASM,KAAK;gBACzD1F,SAASwF,QAAQ,GAAGpB,WAAWlD,IAAI,CAACyE,MAAM;YAC5C;QACF,OAAO;YACLrB,OAAOvC,KAAK+B,QAAQ;YACpB9D,SAASwF,QAAQ,GAAGzD,KAAK0D,IAAI;YAE7B,IAAI1D,KAAK6D,IAAI,CAAC5C,QAAQ,CAAC,MAAM;gBAC3BqB,MAAMtC,KAAK6D,IAAI,CAACC,KAAK,CAAC,KAAKC,GAAG,IAAID,MAAM,IAAI,CAAC,EAAE;YACjD,OAAO;gBACLxB,MAAM;YACR;QACF;QAEA,gDAAgD;QAChD,IAAIC,SAAS,qBAAqBD,QAAQ,OAAO;YAC/CC,OAAO;QACT;QACAtE,SAAS+F,QAAQ,GAAGzB;QAEpB,MAAM0B,eAAenH,SAASkD,KAAK6D,IAAI,CAACK,SAAS,CAAC,GAAGlE,KAAK6D,IAAI,CAACM,WAAW,CAAC,SAASnE,KAAK6D,IAAI;QAC7F3B,aAAa,GAAG+B,eAAe3B,MAAM,CAAC,CAAC,EAAEA,KAAK,GAAG,IAAI;QAErD,IAAI,CAAC9C,wBAAwB;YAC3B,4DAA4D;YAC5D,MAAM4E,SAAUjF,MAAkCiF;YAClDlC,aAAa,MAAMxE,gBAAgB;gBACjC2G,gBAAgBnF,iBAAiBoF,IAAI;gBACrCC,iBAAiBrC;gBACjBkC;gBACA3E;gBACAmB,YAAYA;YACd;QACF;QAEA3C,SAAS8C,QAAQ,GAAGmB;QAEpB,IAAIsC,gBAAgBxE;QAEpB,IAAIgC,YAAYlC,OAAO;YACrB,MAAM,EAAEX,MAAMsF,YAAY,EAAEjB,IAAI,EAAE,GAAG,MAAMlG,UAAU;gBACnD0E;gBACAI,YAAYA;gBACZpC;gBACA7B,gBAAgBH,YAAYG,cAAc;gBAC1CsB;gBACAK;gBACA1B,eAAeJ,YAAYI,aAAa;gBACxCuC;YACF;YAEA,qEAAqE;YACrE,IAAIH,iBAAiB,CAACA,cAAckE,kBAAkB,EAAE;gBACtD,MAAMC,mBAAmB,MAAM7E,MAAM2E,cAClC3B,MAAM,CAAC;oBACN8B,KAAKpE,eAAeoE,OAAO;oBAC3BxB,QAAQ5C,eAAe4C;oBACvByB,UAAUrE,eAAeqE,YAAY;oBACrC1B,OAAO3C,eAAe2C;gBACxB,GACCG,QAAQ,CAAC;oBAAEC,mBAAmB;gBAAK;gBAEtC1B,YAAYiD,IAAI,CAAC;oBACfC,QAAQJ,iBAAiBxF,IAAI;oBAC7B6F,MAAM,GAAGpE,WAAW,CAAC,EAAEsB,YAAY;gBACrC;gBAEAsC,gBAAgB;oBACd,GAAGA,aAAa;oBAChBrF,MAAMwF,iBAAiBxF,IAAI;oBAC3BuE,MAAMiB,iBAAiBnB,IAAI,CAACE,IAAI;gBAClC;gBAEAzF,SAASkF,KAAK,GAAGwB,iBAAiBnB,IAAI,CAACL,KAAK;gBAC5ClF,SAASmF,MAAM,GAAGuB,iBAAiBnB,IAAI,CAACJ,MAAM;gBAC9C,IAAItB,oBAAoB;oBACtB,MAAMuB,WAAW,MAAMlB,UAAWkB,QAAQ;oBAC1CpF,SAASmF,MAAM,GAAGC,SAASM,KAAK,GAC5BgB,iBAAiBnB,IAAI,CAACJ,MAAM,GAAGC,SAASM,KAAK,GAC7CgB,iBAAiBnB,IAAI,CAACJ,MAAM;gBAClC;gBACAnF,SAASwF,QAAQ,GAAGkB,iBAAiBnB,IAAI,CAACE,IAAI;YAChD,OAAO;gBACL,+DAA+D;gBAC/D7B,YAAYiD,IAAI,CAAC;oBACfC,QAAQN;oBACRO,MAAM,GAAGpE,WAAW,CAAC,EAAEsB,YAAY;gBACrC;gBAEAsC,gBAAgB;oBACd,GAAGxE,IAAI;oBACPb,MAAMsF;oBACNf,MAAMF,KAAKE,IAAI;gBACjB;gBAEAzF,SAASkF,KAAK,GAAGK,KAAKL,KAAK;gBAC3BlF,SAASmF,MAAM,GAAGI,KAAKJ,MAAM;gBAC7B,IAAItB,oBAAoB;oBACtB,MAAMuB,WAAW,MAAMlB,UAAWkB,QAAQ;oBAC1CpF,SAASmF,MAAM,GAAGC,SAASM,KAAK,GAAGH,KAAKJ,MAAM,GAAGC,SAASM,KAAK,GAAGH,KAAKJ,MAAM;gBAC/E;gBACAnF,SAASwF,QAAQ,GAAGD,KAAKE,IAAI;YAC/B;YAEA,IAAI1D,KAAK4C,YAAY,EAAE;gBACrB,MAAM/F,GAAGoI,SAAS,CAACjF,KAAK4C,YAAY,EAAE6B,eAAc,oCAAoC;YAC1F,OAAO;gBACLhF,IAAIO,IAAI,GAAGwE;YACb;QACF,OAAO;YACL,4EAA4E;YAC5E,kDAAkD;YAClD,EAAE;YACF,sFAAsF;YACtF,oFAAoF;YACpF,0FAA0F;YAC1F,yFAAyF;YACzF,wDAAwD;YACxD,MAAMU,qBACJ9E,uBAAuBqC,QAAQzC,KAAK4C,YAAY,KAAK,CAACP,YAAYlD;YAEpE,yFAAyF;YACzF,2FAA2F;YAC3F,+CAA+C;YAC/C,MAAMgG,yBACJ,CAAC9C,YAAYlD,QAAQsD,QAAQzC,KAAK4C,YAAY,KAAK,CAACxC;YAEtD,IAAI+E,wBAAwB;gBAC1BtD,YAAYiD,IAAI,CAAC;oBACfE,MAAM,GAAGpE,WAAW,CAAC,EAAEsB,YAAY;oBACnCkD,YAAYpF,KAAK4C,YAAY;gBAC/B;YACF,OAAO;gBACL,IAAIyC;gBACJ,IAAIhD,YAAYlD,MAAM;oBACpBkG,eAAehD,WAAWlD,IAAI;gBAChC,OAAO,IAAIa,KAAK4C,YAAY,EAAE;oBAC5ByC,eAAeH,qBAAqBI,OAAOC,KAAK,CAAC,KAAK,MAAM1I,GAAG2I,QAAQ,CAACxF,KAAK4C,YAAY;gBAC3F,OAAO;oBACLyC,eAAerF,KAAKb,IAAI;gBAC1B;gBAEA,IAAI,CAAC+F,oBAAoB;oBACvBrD,YAAYiD,IAAI,CAAC;wBACfC,QAAQM;wBACRL,MAAM,GAAGpE,WAAW,CAAC,EAAEsB,YAAY;oBACrC;oBAEA,sFAAsF;oBACtF,IAAIG,YAAYlD,QAAQkG,aAAazB,MAAM,GAAG,GAAG;wBAC/C,IAAI5D,KAAK4C,YAAY,EAAE;4BACrB,MAAM/F,GAAGoI,SAAS,CAACjF,KAAK4C,YAAY,EAAEP,YAAYlD,QAAQkG,eAAc,oCAAoC;wBAC9G,OAAO;4BACL,4DAA4D;4BAC5D5F,IAAIO,IAAI,GAAG;gCACT,GAAGA,IAAI;gCACPb,MAAMkD,YAAYlD,QAAQkG;gCAC1B3B,MAAMrB,YAAYmB,KAAKE;4BACzB;wBACF;oBACF;gBACF;YACF;QACF;QAEA,IAAIzB,sBAAuBwD,CAAAA,MAAMC,OAAO,CAACnF,eAAeF,sBAAsB,KAAI,GAAI;YACpFZ,IAAIkG,kBAAkB,GAAG,CAAC;YAC1B,0BAA0B;YAC1B,MAAMtH,aACJgC,qBAAqBrC,aAAaK,aAC9B;gBACEE,GAAGpB,SAASa,YAAYK,UAAU,CAACE,CAAC,IAAIqH,KAAKC,KAAK,CAAC7H,YAAYK,UAAU,CAACE,CAAC,IAAI;gBAC/EE,GAAGtB,SAASa,YAAYK,UAAU,CAACI,CAAC,IAAImH,KAAKC,KAAK,CAAC7H,YAAYK,UAAU,CAACI,CAAC,IAAI;YACjF,IACAwB;YAEN,MAAM,EAAE6F,QAAQ,EAAEC,WAAW,EAAE,GAAG,MAAMpI,iBAAiB;gBACvDsB,QAAQC;gBACRkD,YAAY,CAACJ,WACTI,aACA;oBACE,GAAGA,UAAU;oBACbgB,QAAQnF,SAASmF,MAAM;oBACvBD,OAAOlF,SAASkF,KAAK;gBACvB;gBACJnD,MAAMwE;gBACNnG;gBACA2F,UAAU/F,SAAS+F,QAAQ;gBAC3BvE;gBACAuG,eAAe9D,cAAclC,KAAK6D,IAAI;gBACtC/D;gBACAc,YAAYA;gBACZD;YACF;YAEA1C,SAASgI,KAAK,GAAGH;YACjB7H,SAASU,MAAM,GAAGN,YAAYE;YAC9BN,SAASY,MAAM,GAAGR,YAAYI;YAC9BoD,YAAYiD,IAAI,IAAIiB;QACtB;IACF,EAAE,OAAOxE,KAAK;QACZ9B,IAAIM,OAAO,CAACmG,MAAM,CAACC,KAAK,CAAC5E;QACzB,MAAM,IAAIvE,gBAAgByC,IAAIyB,CAAC;IACjC;IAEAU,UAAU;QACR,GAAGA,OAAO;QACV,GAAG3D,QAAQ;QACX,GAAImB,QAAQ;YAAEgH,SAAS;QAAQ,IAAI,CAAC,CAAC;IACvC;IAEA,OAAO;QACLjH,MAAMyC;QACNhC,OAAOiC;IACT;AACF,EAAC;AAED;;CAEC,GACD,SAAS3B,sCAAsCmG,IAM9C;IACC,MAAM,EAAElH,IAAI,EAAEE,aAAa,EAAEC,SAAS,EAAEC,WAAW,EAAEE,GAAG,EAAE,GAAG4G;IAE7D,qEAAqE;IACrE,MAAMrI,cACJyB,IAAI6G,KAAK,EAAEtI,eAAe,OAAOyB,IAAI6G,KAAK,CAACtI,WAAW,KAAK,WACtDyB,IAAI6G,KAAK,CAACtI,WAAW,GACtB,CAAC;IAEP,IAAIA,YAAYK,UAAU,EAAE;QAC1B,OAAOL;IACT;IAEA,MAAMuI,eAAepH;IACrB,MAAMqH,UAAUjH;IAEhB,IAAIiH,WAAW,YAAYA,WAAW,YAAYA,SAAS;QACzD,iDAAiD;QACjD,mGAAmG;QACnG,IAAID,aAAa5H,MAAM,KAAK6H,QAAQ7H,MAAM,IAAI4H,aAAa1H,MAAM,KAAK2H,QAAQ3H,MAAM,EAAE;YACpF,OAAOoB;QACT;QAEA,IAAIZ,eAAe;YACjBrB,YAAYK,UAAU,GAAG;gBACvBE,GAAGgI,cAAc5H,UAAU6H,QAAQ7H,MAAM;gBACzCF,GAAG8H,cAAc1H,UAAU2H,QAAQ3H,MAAM;YAC3C;YACA,OAAOb;QACT;IACF;IAEA,IAAIuI,cAAc5H,UAAU4H,cAAc1H,QAAQ;QAChDb,YAAYK,UAAU,GAAG;YACvBE,GAAGgI,aAAa5H,MAAM;YACtBF,GAAG8H,aAAa1H,MAAM;QACxB;QACA,OAAOb;IACT;IAEA,8CAA8C;IAC9C,IAAIsB,cAAc,UAAU;QAC1BtB,YAAYK,UAAU,GAAG;YACvBE,GAAG;YACHE,GAAG;QACL;IACF;IAEA,OAAOT;AACT"}
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import type { OutputInfo, Sharp, SharpOptions } from 'sharp'\n\nimport { fileTypeFromBuffer } from 'file-type'\nimport fs from 'fs/promises'\n\nimport type { Collection } 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 { FileData, FileToSave, ProbedImageSize, UploadEdits } from './types.js'\n\nimport { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js'\nimport { isNumber } from '../utilities/isNumber.js'\nimport { canResizeImage } from './canResizeImage.js'\nimport { checkFileRestrictions } from './checkFileRestrictions.js'\nimport { cropImage } from './cropImage.js'\nimport { getExternalFile } from './getExternalFile.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getFileExtension, getSanitizedUploadFilename } from './getFileTypeIdentity.js'\nimport { getImageSize } from './getImageSize.js'\nimport { getSafeFileName } from './getSafeFilename.js'\nimport { createImageSizes } from './image-resizing/createImageSizes.js'\nimport { isAnimatedImage } from './isAnimatedImage.js'\nimport { isImage } from './isImage.js'\nimport { isProcessableImage } from './isProcessableImage.js'\nimport { optionallyAppendMetadata } from './optionallyAppendMetadata.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 (uploadEdits.crop || uploadEdits.heightInPixels || uploadEdits.widthInPixels) {\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\n/**\n * Builds the document's file metadata and the list of files to write to disk.\n *\n * A file uploaded with `useTempFiles` enabled arrives as a temp file path instead of an\n * in-memory buffer, and that temp file can be far larger than server memory allows. To avoid\n * loading it into memory unnecessarily, this skips reading the 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, sharp } = 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 constructorOptions,\n disableLocalStorage,\n focalPoint: focalPointEnabled = true,\n formatOptions,\n imageSizes,\n resizeOptions,\n staticDir,\n trimOptions,\n withMetadata,\n } = collectionConfig.upload\n\n const staticPath = staticDir\n\n const incomingFileData: Document = isDuplicating ? originalDoc : data\n const fileSourceData =\n externalUploadSource ?? (operation === 'update' ? originalDoc : incomingFileData)\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 as unknown as FileData\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 && url) {\n // File is remote\n file = await getExternalFile({\n data: fileSourceData as unknown as FileData,\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\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 fileIsAnimatedType = isAnimatedImage(file.mimetype)\n const cropData =\n typeof uploadEdits === 'object' && 'crop' in uploadEdits ? uploadEdits.crop : undefined\n\n try {\n const fileSupportsResize = canResizeImage(file.mimetype)\n let fsSafeName: string\n let sharpFile: Sharp | undefined\n let dimensions: ProbedImageSize | undefined\n let fileBuffer!: { data: Buffer; info: OutputInfo }\n let ext\n let mime: string\n // Depends only on configured resize/format/trim options, not on whether the bytes are on\n // disk or in memory.\n const fileHasAdjustments =\n fileSupportsResize &&\n Boolean(resizeOptions || formatOptions || trimOptions || constructorOptions)\n\n const sharpOptions: SharpOptions = { ...constructorOptions }\n\n if (fileIsAnimatedType) {\n sharpOptions.animated = true\n }\n\n if (sharp && (fileIsAnimatedType || fileHasAdjustments)) {\n if (file.tempFilePath) {\n sharpFile = sharp(file.tempFilePath, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n } else {\n sharpFile = sharp(file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n }\n\n if (fileHasAdjustments) {\n if (resizeOptions) {\n sharpFile = sharpFile.resize(resizeOptions)\n }\n if (formatOptions) {\n sharpFile = sharpFile.toFormat(formatOptions.format, formatOptions.options)\n }\n if (trimOptions) {\n sharpFile = sharpFile.trim(trimOptions)\n }\n }\n }\n\n if (fileSupportsResize || isImage(file.mimetype)) {\n dimensions = await getImageSize({ file, sharp: fileSupportsResize ? sharp : undefined })\n fileData.width = dimensions.width\n fileData.height = dimensions.height\n }\n\n if (sharpFile) {\n const metadata = await sharpFile.metadata()\n sharpFile = await optionallyAppendMetadata({\n req,\n sharpFile,\n withMetadata: withMetadata!,\n })\n fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true })\n delete file.clientUploadContext\n ;({ ext, mime } = (await fileTypeFromBuffer(fileBuffer.data))!) // This is getting an incorrect gif height back.\n fileData.width = fileBuffer.info.width\n fileData.height = fileBuffer.info.height\n fileData.filesize = fileBuffer.info.size\n\n // Animated GIFs + WebP aggregate the height from every frame, so we need to use divide by number of pages\n if (metadata.pages) {\n fileData.height = fileBuffer.info.height / metadata.pages\n fileData.filesize = fileBuffer.data.length\n }\n } else {\n mime = file.mimetype\n fileData.filesize = file.size\n\n if (file.name.includes('.')) {\n ext = getFileExtension(getSanitizedUploadFilename(file.name))\n } else {\n ext = ''\n }\n }\n\n // Adjust SVG mime type. fromBuffer modifies it.\n if (mime === 'application/xml' && ext === 'svg') {\n mime = 'image/svg+xml'\n }\n fileData.mimeType = mime\n\n fsSafeName = getSanitizedUploadFilename(file.name, ext)\n\n if (!overwriteExistingFiles) {\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\n let fileForResize = file\n\n if (cropData && fileSupportsResize && sharp) {\n const { data: croppedImage, info } = await cropImage({\n cropData,\n dimensions: dimensions!,\n file,\n heightInPixels: uploadEdits.heightInPixels!,\n req,\n sharp,\n widthInPixels: uploadEdits.widthInPixels!,\n withMetadata,\n })\n\n // Apply resize after cropping to ensure it conforms to resizeOptions\n if (resizeOptions && !resizeOptions.withoutEnlargement) {\n const resizedAfterCrop = await sharp(croppedImage)\n .resize({\n fit: resizeOptions?.fit || 'cover',\n height: resizeOptions?.height,\n position: resizeOptions?.position || 'center',\n width: resizeOptions?.width,\n })\n .toBuffer({ resolveWithObject: true })\n\n filesToSave.push({\n buffer: resizedAfterCrop.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...fileForResize,\n data: resizedAfterCrop.data,\n size: resizedAfterCrop.info.size,\n }\n\n fileData.width = resizedAfterCrop.info.width\n fileData.height = resizedAfterCrop.info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile!.metadata()\n fileData.height = metadata.pages\n ? resizedAfterCrop.info.height / metadata.pages\n : resizedAfterCrop.info.height\n }\n fileData.filesize = resizedAfterCrop.info.size\n } else {\n // If resizeOptions is not present, just save the cropped image\n filesToSave.push({\n buffer: croppedImage,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...file,\n data: croppedImage,\n size: info.size,\n }\n\n fileData.width = info.width\n fileData.height = info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile!.metadata()\n fileData.height = metadata.pages ? info.height / metadata.pages : info.height\n }\n fileData.filesize = info.size\n }\n\n delete file.clientUploadContext\n delete fileForResize.clientUploadContext\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path\n } else {\n req.file = fileForResize\n }\n } else {\n // For non-image files with useTempFiles, read the buffer from the temp file\n // since file.data is empty when using temp files.\n //\n // When local storage is disabled, filesToSave is never written to disk (create/update\n // skip uploadFiles for it), and an unmodified temp file's bytes on disk are already\n // correct, so there's nothing to read into memory or write back out. Skipping this avoids\n // buffering the entire file just to discard or rewrite it unchanged - a tempFilePath can\n // point at a file far larger than server memory allows.\n const skipTempFileBuffer =\n disableLocalStorage && Boolean(file.tempFilePath) && !fileBuffer?.data\n\n // When local storage is enabled and the temp file itself is unmodified, copy it straight\n // to its destination instead of reading it into memory first - a tempFilePath can point at\n // a file far larger than server memory allows.\n const shouldCopyFromTempFile =\n !fileBuffer?.data && Boolean(file.tempFilePath) && !disableLocalStorage\n\n if (shouldCopyFromTempFile) {\n filesToSave.push({\n path: `${staticPath}/${fsSafeName}`,\n sourcePath: file.tempFilePath!,\n })\n } else {\n let bufferToSave: Buffer\n if (fileBuffer?.data) {\n bufferToSave = fileBuffer.data\n } else if (file.tempFilePath) {\n bufferToSave = skipTempFileBuffer ? Buffer.alloc(0) : await fs.readFile(file.tempFilePath)\n } else {\n bufferToSave = file.data\n }\n\n if (!skipTempFileBuffer) {\n filesToSave.push({\n buffer: bufferToSave,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n // If using temp files and the image is being resized, write the file to the temp path\n if (fileBuffer?.data || bufferToSave.length > 0) {\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, fileBuffer?.data || bufferToSave) // write fileBuffer to the temp path\n } else {\n // Assign the _possibly modified_ file to the request object\n req.file = {\n ...file,\n data: fileBuffer?.data || bufferToSave,\n size: fileBuffer?.info.size,\n }\n }\n }\n }\n }\n }\n\n if (fileSupportsResize && (Array.isArray(imageSizes) || focalPointEnabled !== false)) {\n req.payloadUploadSizes = {}\n // Focal point adjustments\n const focalPoint =\n focalPointEnabled && uploadEdits?.focalPoint\n ? {\n x: isNumber(uploadEdits.focalPoint.x) ? Math.round(uploadEdits.focalPoint.x) : 50,\n y: isNumber(uploadEdits.focalPoint.y) ? Math.round(uploadEdits.focalPoint.y) : 50,\n }\n : undefined\n\n const { sizeData, sizesToSave } = await createImageSizes({\n config: collectionConfig,\n dimensions: !cropData\n ? dimensions!\n : {\n ...dimensions,\n height: fileData.height!,\n width: fileData.width!,\n },\n file: fileForResize,\n focalPoint,\n mimeType: fileData.mimeType,\n req,\n savedFilename: fsSafeName || file.name,\n sharp,\n staticPath: staticPath!,\n withMetadata,\n })\n\n fileData.sizes = sizeData\n fileData.focalX = focalPoint?.x\n fileData.focalY = focalPoint?.y\n filesToSave.push(...sizesToSave)\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 // If no change in focal point, return undefined.\n // This prevents a refocal operation triggered from admin, because it always sends the focal point.\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","FileRetrievalError","FileUploadError","Forbidden","MissingFile","isNumber","canResizeImage","checkFileRestrictions","cropImage","getExternalFile","getFileByPath","getFileExtension","getSanitizedUploadFilename","getImageSize","getSafeFileName","createImageSizes","isAnimatedImage","isImage","isProcessableImage","optionallyAppendMetadata","shouldReupload","uploadEdits","fileData","crop","heightInPixels","widthInPixels","focalPoint","incomingFocalX","x","incomingFocalY","y","currentFocalX","focalX","currentFocalY","focalY","isEqual","generateFileData","collection","config","collectionConfig","data","draft","externalUploadSource","isDuplicating","operation","originalDoc","overwriteExistingFiles","req","throwOnMissingFile","upload","files","serverURL","sharp","payload","file","undefined","parseUploadEditsFromReqOrIncomingData","constructorOptions","disableLocalStorage","focalPointEnabled","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","withMetadata","staticPath","incomingFileData","fileSourceData","isLocalFile","filename","url","includes","t","startsWith","filePath","response","uploadConfig","err","Error","message","detectedFileType","shouldUseDetectedFileType","mimetype","mime","mkdir","recursive","newData","filesToSave","fileIsAnimatedType","cropData","fileSupportsResize","fsSafeName","sharpFile","dimensions","fileBuffer","ext","fileHasAdjustments","Boolean","sharpOptions","animated","tempFilePath","rotate","resize","toFormat","format","options","trim","width","height","metadata","toBuffer","resolveWithObject","clientUploadContext","info","filesize","size","pages","length","name","mimeType","prefix","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","withoutEnlargement","resizedAfterCrop","fit","position","push","buffer","path","writeFile","skipTempFileBuffer","shouldCopyFromTempFile","sourcePath","bufferToSave","Buffer","alloc","readFile","Array","isArray","payloadUploadSizes","Math","round","sizeData","sizesToSave","savedFilename","sizes","logger","error","_status","args","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;AAOtD,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,gBAAgB,CAAA;IAC5B,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,eAAO,MAAM,mBAAmB,2BAA4B,OAAO,KAAG,KAAK,EA6R1E,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { generateFilePathOrURL } from './generateFilePathOrURL.js';
|
|
2
2
|
import { mimeTypeValidator } from './mimeTypeValidator.js';
|
|
3
|
+
import { validateUploadFilename } from './validateUploadFilename.js';
|
|
3
4
|
export const getBaseUploadFields = ({ collection, config })=>{
|
|
4
5
|
const uploadOptions = typeof collection.upload === 'object' ? collection.upload : {};
|
|
5
6
|
const mimeType = {
|
|
@@ -76,7 +77,8 @@ export const getBaseUploadFields = ({ collection, config })=>{
|
|
|
76
77
|
readOnly: true
|
|
77
78
|
},
|
|
78
79
|
index: true,
|
|
79
|
-
label: ({ t })=>t('upload:fileName')
|
|
80
|
+
label: ({ t })=>t('upload:fileName'),
|
|
81
|
+
validate: validateUploadFilename
|
|
80
82
|
};
|
|
81
83
|
// Only set unique: true if the collection does not have a compound index
|
|
82
84
|
if (collection.upload === true || typeof collection.upload === 'object' && !collection.upload.filenameCompoundIndex) {
|
|
@@ -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 { UploadConfig } from './types.js'\n\nimport { generateFilePathOrURL } from './generateFilePathOrURL.js'\nimport { mimeTypeValidator } from './mimeTypeValidator.js'\n\ntype Options = {\n collection: CollectionConfig\n config: Config\n}\n\nexport const getBaseUploadFields = ({ collection, config }: Options): Field[] => {\n const uploadOptions: UploadConfig = 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.sizes?.[adminThumbnail]?.filename as string)\n : undefined,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath:\n typeof adminThumbnail === 'string'\n ? (originalDoc.sizes?.[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 disableBulkEdit: true,\n hidden: true,\n readOnly: true,\n },\n index: true,\n label: ({ t }) => t('upload:fileName'),\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\n // Add focal point fields if not disabled\n if (\n uploadOptions.focalPoint !== false ||\n uploadOptions.imageSizes ||\n uploadOptions.resizeOptions\n ) {\n uploadFields = uploadFields.concat(\n ['focalX', 'focalY'].map((name) => {\n return {\n name,\n type: 'number',\n admin: {\n disableGroupBy: true,\n disableListColumn: true,\n disableListFilter: true,\n hidden: true,\n },\n }\n }),\n )\n }\n\n if (uploadOptions.mimeTypes) {\n mimeType.validate = mimeTypeValidator(uploadOptions.mimeTypes)\n }\n\n // In Payload v4, image size subfields (`url`, `width`, `height`, etc.) should\n // default to `disableGroupBy: true`, `disableListColumn: true` and `disableListFilter: true`\n // to avoid cluttering the collection list view and filters by default.\n if (uploadOptions.imageSizes) {\n uploadFields = uploadFields.concat([\n {\n name: 'sizes',\n type: 'group',\n admin: {\n hidden: true,\n },\n fields: uploadOptions.imageSizes.map((size) => ({\n name: size.name,\n type: 'group',\n admin: {\n hidden: true,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n fields: [\n {\n ...url,\n admin: {\n ...url.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\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?.sizes?.[size.name]?.filename ||\n originalDoc?.sizes?.[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?.sizes?.[size.name]?.filename ||\n originalDoc?.sizes?.[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 ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n },\n {\n ...height,\n admin: {\n ...height.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n },\n {\n ...mimeType,\n admin: {\n ...mimeType.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n },\n {\n ...filesize,\n admin: {\n ...filesize.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n },\n {\n ...filename,\n admin: {\n ...filename.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n unique: false,\n },\n ],\n label: size.name,\n })),\n label: ({ t }) => t('upload:sizes'),\n },\n ])\n }\n return uploadFields\n}\n"],"names":["generateFilePathOrURL","mimeTypeValidator","getBaseUploadFields","collection","config","uploadOptions","upload","mimeType","name","type","admin","hidden","readOnly","label","thumbnailURL","hooks","afterRead","originalDoc","req","adminThumbnail","undefined","doc","collectionSlug","slug","filename","sizes","relative","serverURL","payload","urlOrPath","url","width","t","height","filesize","disableBulkEdit","index","filenameCompoundIndex","unique","uploadFields","data","value","beforeChange","focalPoint","imageSizes","resizeOptions","concat","map","disableGroupBy","disableListColumn","disableListFilter","mimeTypes","validate","fields","size"],"mappings":"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"}
|
|
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 { UploadConfig } from './types.js'\n\nimport { generateFilePathOrURL } from './generateFilePathOrURL.js'\nimport { mimeTypeValidator } from './mimeTypeValidator.js'\nimport { validateUploadFilename } from './validateUploadFilename.js'\n\ntype Options = {\n collection: CollectionConfig\n config: Config\n}\n\nexport const getBaseUploadFields = ({ collection, config }: Options): Field[] => {\n const uploadOptions: UploadConfig = 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.sizes?.[adminThumbnail]?.filename as string)\n : undefined,\n relative: false,\n serverURL: req.payload.config.serverURL,\n urlOrPath:\n typeof adminThumbnail === 'string'\n ? (originalDoc.sizes?.[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 disableBulkEdit: 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\n // Add focal point fields if not disabled\n if (\n uploadOptions.focalPoint !== false ||\n uploadOptions.imageSizes ||\n uploadOptions.resizeOptions\n ) {\n uploadFields = uploadFields.concat(\n ['focalX', 'focalY'].map((name) => {\n return {\n name,\n type: 'number',\n admin: {\n disableGroupBy: true,\n disableListColumn: true,\n disableListFilter: true,\n hidden: true,\n },\n }\n }),\n )\n }\n\n if (uploadOptions.mimeTypes) {\n mimeType.validate = mimeTypeValidator(uploadOptions.mimeTypes)\n }\n\n // In Payload v4, image size subfields (`url`, `width`, `height`, etc.) should\n // default to `disableGroupBy: true`, `disableListColumn: true` and `disableListFilter: true`\n // to avoid cluttering the collection list view and filters by default.\n if (uploadOptions.imageSizes) {\n uploadFields = uploadFields.concat([\n {\n name: 'sizes',\n type: 'group',\n admin: {\n hidden: true,\n },\n fields: uploadOptions.imageSizes.map((size) => ({\n name: size.name,\n type: 'group',\n admin: {\n hidden: true,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n fields: [\n {\n ...url,\n admin: {\n ...url.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\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?.sizes?.[size.name]?.filename ||\n originalDoc?.sizes?.[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?.sizes?.[size.name]?.filename ||\n originalDoc?.sizes?.[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 ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n },\n {\n ...height,\n admin: {\n ...height.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n },\n {\n ...mimeType,\n admin: {\n ...mimeType.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n },\n {\n ...filesize,\n admin: {\n ...filesize.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n },\n {\n ...filename,\n admin: {\n ...filename.admin,\n ...(size.admin?.disableGroupBy && { disableGroupBy: true }),\n ...(size.admin?.disableListColumn && { disableListColumn: true }),\n ...(size.admin?.disableListFilter && { disableListFilter: true }),\n },\n unique: false,\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","getBaseUploadFields","collection","config","uploadOptions","upload","mimeType","name","type","admin","hidden","readOnly","label","thumbnailURL","hooks","afterRead","originalDoc","req","adminThumbnail","undefined","doc","collectionSlug","slug","filename","sizes","relative","serverURL","payload","urlOrPath","url","width","t","height","filesize","disableBulkEdit","index","validate","filenameCompoundIndex","unique","uploadFields","data","value","beforeChange","focalPoint","imageSizes","resizeOptions","concat","map","disableGroupBy","disableListColumn","disableListFilter","mimeTypes","fields","size"],"mappings":"AAKA,SAASA,qBAAqB,QAAQ,6BAA4B;AAClE,SAASC,iBAAiB,QAAQ,yBAAwB;AAC1D,SAASC,sBAAsB,QAAQ,8BAA6B;AAOpE,OAAO,MAAMC,sBAAsB,CAAC,EAAEC,UAAU,EAAEC,MAAM,EAAW;IACjE,MAAMC,gBAA8B,OAAOF,WAAWG,MAAM,KAAK,WAAWH,WAAWG,MAAM,GAAG,CAAC;IAEjG,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,OAAOA,eAAe;4BAAEE,KAAKJ;wBAAY;oBAC3C;oBAEA,OAAOlB,sBAAsB;wBAC3BuB,gBAAgBnB,WAAWoB,IAAI;wBAC/BnB;wBACAoB,UACE,OAAOL,mBAAmB,WACrBF,YAAYQ,KAAK,EAAE,CAACN,eAAe,EAAEK,WACtCJ;wBACNM,UAAU;wBACVC,WAAWT,IAAIU,OAAO,CAACxB,MAAM,CAACuB,SAAS;wBACvCE,WACE,OAAOV,mBAAmB,WACrBF,YAAYQ,KAAK,EAAE,CAACN,eAAe,EAAEW,MACtCV;oBACR;gBACF;aACD;QACH;QACAP,OAAO;IACT;IAEA,MAAMkB,QAAe;QACnBvB,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,QAAQ;YACRC,UAAU;QACZ;QACAC,OAAO,CAAC,EAAEmB,CAAC,EAAE,GAAKA,EAAE;IACtB;IAEA,MAAMC,SAAgB;QACpBzB,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,QAAQ;YACRC,UAAU;QACZ;QACAC,OAAO,CAAC,EAAEmB,CAAC,EAAE,GAAKA,EAAE;IACtB;IAEA,MAAME,WAAkB;QACtB1B,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,QAAQ;YACRC,UAAU;QACZ;QACAC,OAAO,CAAC,EAAEmB,CAAC,EAAE,GAAKA,EAAE;IACtB;IAEA,MAAMR,WAAkB;QACtBhB,MAAM;QACNC,MAAM;QACNC,OAAO;YACLyB,iBAAiB;YACjBxB,QAAQ;YACRC,UAAU;QACZ;QACAwB,OAAO;QACPvB,OAAO,CAAC,EAAEmB,CAAC,EAAE,GAAKA,EAAE;QACpBK,UAAUpC;IACZ;IAEA,yEAAyE;IACzE,IACEE,WAAWG,MAAM,KAAK,QACrB,OAAOH,WAAWG,MAAM,KAAK,YAAY,CAACH,WAAWG,MAAM,CAACgC,qBAAqB,EAClF;QACAd,SAASe,MAAM,GAAG;IACpB;IAEA,MAAMT,MAAa;QACjBtB,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,QAAQ;YACRC,UAAU;QACZ;QACAC,OAAO;IACT;IAEA,IAAI2B,eAAwB;QAC1B;YACE,GAAGV,GAAG;YACNf,OAAO;gBACLC,WAAW;oBACT,CAAC,EAAEyB,IAAI,EAAExB,WAAW,EAAEC,GAAG,EAAEwB,KAAK,EAAE,GAChC3C,sBAAsB;4BACpBuB,gBAAgBnB,WAAWoB,IAAI;4BAC/BnB;4BACAoB,UAAUiB,MAAMjB,YAAYP,aAAaO;4BACzCE,UAAU;4BACVC,WAAWT,IAAIU,OAAO,CAACxB,MAAM,CAACuB,SAAS;4BACvCE,WAAWa;wBACb;iBACH;gBACDC,cAAc;oBACZ,CAAC,EAAExC,UAAU,EAAEsC,IAAI,EAAExB,WAAW,EAAEC,GAAG,EAAEwB,KAAK,EAAE,GAC5C3C,sBAAsB;4BACpBuB,gBAAgBnB,YAAYoB;4BAC5BnB;4BACAoB,UAAUiB,MAAMjB,YAAYP,aAAaO;4BACzCE,UAAU;4BACVC,WAAWT,IAAIU,OAAO,CAACxB,MAAM,CAACuB,SAAS;4BACvCE,WAAWa;wBACb;iBACH;YACH;QACF;QACA5B;QACAU;QACAjB;QACA2B;QACAH;QACAE;KACD;IAED,yCAAyC;IACzC,IACE5B,cAAcuC,UAAU,KAAK,SAC7BvC,cAAcwC,UAAU,IACxBxC,cAAcyC,aAAa,EAC3B;QACAN,eAAeA,aAAaO,MAAM,CAChC;YAAC;YAAU;SAAS,CAACC,GAAG,CAAC,CAACxC;YACxB,OAAO;gBACLA;gBACAC,MAAM;gBACNC,OAAO;oBACLuC,gBAAgB;oBAChBC,mBAAmB;oBACnBC,mBAAmB;oBACnBxC,QAAQ;gBACV;YACF;QACF;IAEJ;IAEA,IAAIN,cAAc+C,SAAS,EAAE;QAC3B7C,SAAS8B,QAAQ,GAAGrC,kBAAkBK,cAAc+C,SAAS;IAC/D;IAEA,8EAA8E;IAC9E,6FAA6F;IAC7F,uEAAuE;IACvE,IAAI/C,cAAcwC,UAAU,EAAE;QAC5BL,eAAeA,aAAaO,MAAM,CAAC;YACjC;gBACEvC,MAAM;gBACNC,MAAM;gBACNC,OAAO;oBACLC,QAAQ;gBACV;gBACA0C,QAAQhD,cAAcwC,UAAU,CAACG,GAAG,CAAC,CAACM,OAAU,CAAA;wBAC9C9C,MAAM8C,KAAK9C,IAAI;wBACfC,MAAM;wBACNC,OAAO;4BACLC,QAAQ;4BACR,GAAI2C,KAAK5C,KAAK,EAAEuC,kBAAkB;gCAAEA,gBAAgB;4BAAK,CAAC;4BAC1D,GAAIK,KAAK5C,KAAK,EAAEwC,qBAAqB;gCAAEA,mBAAmB;4BAAK,CAAC;4BAChE,GAAII,KAAK5C,KAAK,EAAEyC,qBAAqB;gCAAEA,mBAAmB;4BAAK,CAAC;wBAClE;wBACAE,QAAQ;4BACN;gCACE,GAAGvB,GAAG;gCACNpB,OAAO;oCACL,GAAGoB,IAAIpB,KAAK;oCACZ,GAAI4C,KAAK5C,KAAK,EAAEuC,kBAAkB;wCAAEA,gBAAgB;oCAAK,CAAC;oCAC1D,GAAIK,KAAK5C,KAAK,EAAEwC,qBAAqB;wCAAEA,mBAAmB;oCAAK,CAAC;oCAChE,GAAII,KAAK5C,KAAK,EAAEyC,qBAAqB;wCAAEA,mBAAmB;oCAAK,CAAC;gCAClE;gCACApC,OAAO;oCACLC,WAAW;wCACT,CAAC,EAAEb,UAAU,EAAEsC,IAAI,EAAExB,WAAW,EAAEC,GAAG,EAAEwB,KAAK,EAAE,GAC5C3C,sBAAsB;gDACpBuB,gBAAgBnB,YAAYoB;gDAC5BnB;gDACAoB,UACEiB,MAAMhB,OAAO,CAAC6B,KAAK9C,IAAI,CAAC,EAAEgB,YAC1BP,aAAaQ,OAAO,CAAC6B,KAAK9C,IAAI,CAAC,EAAEgB;gDACnCE,UAAU;gDACVC,WAAWT,IAAIU,OAAO,CAACxB,MAAM,CAACuB,SAAS;gDACvCE,WAAWa;4CACb;qCACH;oCACDC,cAAc;wCACZ,CAAC,EAAExC,UAAU,EAAEsC,IAAI,EAAExB,WAAW,EAAEC,GAAG,EAAEwB,KAAK,EAAE,GAC5C3C,sBAAsB;gDACpBuB,gBAAgBnB,YAAYoB;gDAC5BnB;gDACAoB,UACEiB,MAAMhB,OAAO,CAAC6B,KAAK9C,IAAI,CAAC,EAAEgB,YAC1BP,aAAaQ,OAAO,CAAC6B,KAAK9C,IAAI,CAAC,EAAEgB;gDACnCE,UAAU;gDACVC,WAAWT,IAAIU,OAAO,CAACxB,MAAM,CAACuB,SAAS;gDACvCE,WAAWa;4CACb;qCACH;gCACH;4BACF;4BACA;gCACE,GAAGX,KAAK;gCACRrB,OAAO;oCACL,GAAGqB,MAAMrB,KAAK;oCACd,GAAI4C,KAAK5C,KAAK,EAAEuC,kBAAkB;wCAAEA,gBAAgB;oCAAK,CAAC;oCAC1D,GAAIK,KAAK5C,KAAK,EAAEwC,qBAAqB;wCAAEA,mBAAmB;oCAAK,CAAC;oCAChE,GAAII,KAAK5C,KAAK,EAAEyC,qBAAqB;wCAAEA,mBAAmB;oCAAK,CAAC;gCAClE;4BACF;4BACA;gCACE,GAAGlB,MAAM;gCACTvB,OAAO;oCACL,GAAGuB,OAAOvB,KAAK;oCACf,GAAI4C,KAAK5C,KAAK,EAAEuC,kBAAkB;wCAAEA,gBAAgB;oCAAK,CAAC;oCAC1D,GAAIK,KAAK5C,KAAK,EAAEwC,qBAAqB;wCAAEA,mBAAmB;oCAAK,CAAC;oCAChE,GAAII,KAAK5C,KAAK,EAAEyC,qBAAqB;wCAAEA,mBAAmB;oCAAK,CAAC;gCAClE;4BACF;4BACA;gCACE,GAAG5C,QAAQ;gCACXG,OAAO;oCACL,GAAGH,SAASG,KAAK;oCACjB,GAAI4C,KAAK5C,KAAK,EAAEuC,kBAAkB;wCAAEA,gBAAgB;oCAAK,CAAC;oCAC1D,GAAIK,KAAK5C,KAAK,EAAEwC,qBAAqB;wCAAEA,mBAAmB;oCAAK,CAAC;oCAChE,GAAII,KAAK5C,KAAK,EAAEyC,qBAAqB;wCAAEA,mBAAmB;oCAAK,CAAC;gCAClE;4BACF;4BACA;gCACE,GAAGjB,QAAQ;gCACXxB,OAAO;oCACL,GAAGwB,SAASxB,KAAK;oCACjB,GAAI4C,KAAK5C,KAAK,EAAEuC,kBAAkB;wCAAEA,gBAAgB;oCAAK,CAAC;oCAC1D,GAAIK,KAAK5C,KAAK,EAAEwC,qBAAqB;wCAAEA,mBAAmB;oCAAK,CAAC;oCAChE,GAAII,KAAK5C,KAAK,EAAEyC,qBAAqB;wCAAEA,mBAAmB;oCAAK,CAAC;gCAClE;4BACF;4BACA;gCACE,GAAG3B,QAAQ;gCACXd,OAAO;oCACL,GAAGc,SAASd,KAAK;oCACjB,GAAI4C,KAAK5C,KAAK,EAAEuC,kBAAkB;wCAAEA,gBAAgB;oCAAK,CAAC;oCAC1D,GAAIK,KAAK5C,KAAK,EAAEwC,qBAAqB;wCAAEA,mBAAmB;oCAAK,CAAC;oCAChE,GAAII,KAAK5C,KAAK,EAAEyC,qBAAqB;wCAAEA,mBAAmB;oCAAK,CAAC;gCAClE;gCACAZ,QAAQ;4BACV;yBACD;wBACD1B,OAAOyC,KAAK9C,IAAI;oBAClB,CAAA;gBACAK,OAAO,CAAC,EAAEmB,CAAC,EAAE,GAAKA,EAAE;YACtB;SACD;IACH;IACA,OAAOQ;AACT,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getExternalFile.d.ts","sourceRoot":"","sources":["../../src/uploads/getExternalFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"getExternalFile.d.ts","sourceRoot":"","sources":["../../src/uploads/getExternalFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAO9D,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,KAAK,CAAC,CAAA;IACxC,GAAG,EAAE,cAAc,CAAA;IACnB,YAAY,EAAE,YAAY,CAAA;CAC3B,CAAA;AAmCD,eAAO,MAAM,eAAe,gCAAuC,IAAI,KAAG,OAAO,CAAC,IAAI,CAmHrF,CAAA"}
|