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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utilities/parseParams/index.spec.ts"],"sourcesContent":["import * as qs from 'qs-esm'\nimport { describe, it, expect } from 'vitest'\nimport { parseParams, booleanParams, numberParams } from './index.js'\n\ndescribe('parseParams', () => {\n describe('boolean parameters', () => {\n booleanParams.forEach((param) => {\n describe(param, () => {\n it('should parse string \"true\" to boolean true', () => {\n const result = parseParams({ [param]: 'true' })\n expect(result[param]).toBe(true)\n })\n\n it('should parse string \"false\" to boolean false', () => {\n const result = parseParams({ [param]: 'false' })\n expect(result[param]).toBe(false)\n })\n\n it('should parse boolean true to boolean true', () => {\n const result = parseParams({ [param]: true })\n expect(result[param]).toBe(true)\n })\n\n it('should parse boolean false to boolean false', () => {\n const result = parseParams({ [param]: false })\n expect(result[param]).toBe(false)\n })\n\n it('should return undefined for truthy strings (not exact \"true\")', () => {\n const result = parseParams({ [param]: '1' })\n expect(result[param]).toBeUndefined()\n })\n\n it('should return undefined for falsy strings (not exact \"false\")', () => {\n const result = parseParams({ [param]: '0' })\n expect(result[param]).toBeUndefined()\n })\n\n it('should return undefined for empty string', () => {\n const result = parseParams({ [param]: '' })\n expect(result[param]).toBeUndefined()\n })\n })\n })\n })\n\n describe('number parameters', () => {\n numberParams.forEach((param) => {\n describe(param, () => {\n it('should parse valid number string to number', () => {\n const result = parseParams({ [param]: '42' })\n expect(result[param]).toBe(42)\n })\n\n it('should parse zero string to zero', () => {\n const result = parseParams({ [param]: '0' })\n expect(result[param]).toBe(0)\n })\n\n it('should parse negative number string to negative number', () => {\n const result = parseParams({ [param]: '-5' })\n expect(result[param]).toBe(-5)\n })\n\n it('should parse decimal number string to decimal number', () => {\n const result = parseParams({ [param]: '3.14' })\n expect(result[param]).toBe(3.14)\n })\n\n it('should not parse invalid number strings', () => {\n const result = parseParams({ [param]: 'not-a-number' })\n expect(result[param]).toBe('not-a-number') // remains as string\n })\n\n it('should not parse empty string', () => {\n const result = parseParams({ [param]: '' })\n expect(result[param]).toBe('') // remains as string\n })\n\n it('should handle already numeric values', () => {\n const result = parseParams({ [param]: 123 })\n expect(result[param]).toBe(123)\n })\n })\n })\n })\n\n describe('sort parameter', () => {\n it('should parse comma-separated string to array', () => {\n const result = parseParams({ sort: 'name,createdAt,-updatedAt' })\n expect(result.sort).toEqual(['name', 'createdAt', '-updatedAt'])\n })\n\n it('should parse single value string to array with one element', () => {\n const result = parseParams({ sort: 'name' })\n expect(result.sort).toEqual(['name'])\n })\n\n it('should handle empty string', () => {\n const result = parseParams({ sort: '' })\n expect(result.sort).toEqual([''])\n })\n\n it('should handle comma-separated string with spaces', () => {\n const result = parseParams({ sort: 'name, createdAt , -updatedAt' })\n expect(result.sort).toEqual(['name', ' createdAt ', ' -updatedAt'])\n })\n\n it('should parse array of strings', () => {\n const result = parseParams({ sort: ['name', '-createdAt'] })\n expect(result.sort).toEqual(['name', '-createdAt'])\n })\n\n it('should return undefined for non-string sort values', () => {\n const result = parseParams({ sort: 123 as any })\n expect(result.sort).toBeUndefined()\n })\n\n it('should return undefined for array with non-string sort values', () => {\n const result = parseParams({ sort: ['name', 123] as any })\n expect(result.sort).toBeUndefined()\n })\n\n it('should handle qs-esm array sort parsing', () => {\n const query = qs.stringify({ sort: ['title', '-createdAt'] })\n const parsed = qs.parse(query)\n const result = parseParams(parsed)\n expect(result.sort).toEqual(['title', '-createdAt'])\n })\n\n it('should return undefined for null sort values', () => {\n const result = parseParams({ sort: null as any })\n expect(result.sort).toBeUndefined()\n })\n })\n\n describe('data parameter', () => {\n it('should parse valid JSON string', () => {\n const data = { name: 'test', value: 42 }\n const result = parseParams({ data: JSON.stringify(data) })\n expect(result.data).toEqual(data)\n })\n\n it('should parse empty object JSON string', () => {\n const result = parseParams({ data: '{}' })\n expect(result.data).toEqual({})\n })\n\n it('should parse array JSON string', () => {\n const data = [1, 2, 3]\n const result = parseParams({ data: JSON.stringify(data) })\n expect(result.data).toEqual(data)\n })\n\n it('should not process empty string', () => {\n const result = parseParams({ data: '' })\n expect(result.data).toBe('') // empty string is not processed, remains as string\n })\n\n it('should throw error for invalid JSON', () => {\n expect(() => {\n parseParams({ data: 'invalid-json' })\n }).toThrow()\n })\n\n it('should not process non-string data values', () => {\n const result = parseParams({ data: { already: 'parsed' } as any })\n expect(result.data).toEqual({ already: 'parsed' })\n })\n })\n\n describe('special parameters', () => {\n it('should handle populate parameter', () => {\n const result = parseParams({ populate: 'field1,field2' })\n expect(result).toHaveProperty('populate')\n // Note: actual sanitization logic is tested in sanitizePopulateParam tests\n })\n\n it('should handle select parameter', () => {\n const result = parseParams({ select: 'field1,field2' })\n expect(result).toHaveProperty('select')\n // Note: actual sanitization logic is tested in sanitizeSelectParam tests\n })\n\n it('should handle joins parameter', () => {\n const joins = { collection: 'posts' }\n const result = parseParams({ joins })\n expect(result).toHaveProperty('joins')\n // Note: actual sanitization logic is tested in sanitizeJoinParams tests\n })\n })\n\n describe('selectedLocales parameter', () => {\n it('should pass through selectedLocales as-is', () => {\n const selectedLocales = 'en,es,fr'\n const result = parseParams({ selectedLocales })\n expect(result.selectedLocales).toBe(selectedLocales)\n })\n })\n\n describe('publishSpecificLocale parameter', () => {\n it('should pass through publishSpecificLocale as-is', () => {\n const publishSpecificLocale = 'en'\n const result = parseParams({ publishSpecificLocale })\n expect(result.publishSpecificLocale).toBe(publishSpecificLocale)\n })\n })\n\n describe('field parameter', () => {\n it('should pass through field as-is', () => {\n const field = 'myField'\n const result = parseParams({ field })\n expect(result.field).toBe(field)\n })\n })\n\n describe('where parameter', () => {\n it('should pass through where as-is', () => {\n const where = { name: { equals: 'test' } }\n const result = parseParams({ where })\n expect(result.where).toBe(where)\n })\n\n it('should parse where when it is a JSON string', () => {\n const where = { read: { equals: false } }\n const result = parseParams({ where: JSON.stringify(where) })\n expect(result.where).toEqual(where)\n })\n\n it('should not process empty string where', () => {\n const result = parseParams({ where: '' })\n expect(result.where).toBe('')\n })\n\n it('should throw error for invalid JSON where', () => {\n expect(() => {\n parseParams({ where: 'invalid-json' })\n }).toThrow()\n })\n })\n\n describe('edge cases', () => {\n it('should handle empty params object', () => {\n const result = parseParams({})\n expect(result).toEqual({})\n })\n\n it('should throw error for null params (current implementation bug)', () => {\n expect(() => {\n parseParams(null as any)\n }).toThrow(TypeError)\n })\n\n it('should throw error for undefined params (current implementation bug)', () => {\n expect(() => {\n parseParams(undefined as any)\n }).toThrow(TypeError)\n })\n\n it('should preserve unknown parameters', () => {\n const result = parseParams({ customParam: 'customValue' })\n expect(result.customParam).toBe('customValue')\n })\n\n it('should handle mixed parameter types', () => {\n const result = parseParams({\n draft: 'true',\n depth: '5',\n sort: 'name,createdAt',\n data: '{\"test\": true}',\n customParam: 'custom',\n })\n\n expect(result.draft).toBe(true)\n expect(result.depth).toBe(5)\n expect(result.sort).toEqual(['name', 'createdAt'])\n expect(result.data).toEqual({ test: true })\n expect(result.customParam).toBe('custom')\n })\n })\n\n describe('parameter preservation', () => {\n it('should not modify parameters that are not in known lists', () => {\n const params = {\n unknownBoolean: 'true',\n unknownNumber: '42',\n unknownString: 'test',\n }\n const result = parseParams(params)\n\n expect(result.unknownBoolean).toBe('true') // should remain string\n expect(result.unknownNumber).toBe('42') // should remain string\n expect(result.unknownString).toBe('test')\n })\n\n it('should only process parameters that exist in the input', () => {\n const result = parseParams({ draft: 'true' })\n\n expect(result.draft).toBe(true)\n expect(result).not.toHaveProperty('autosave')\n expect(result).not.toHaveProperty('depth')\n expect(result).not.toHaveProperty('sort')\n })\n })\n})\n"],"names":["qs","describe","it","expect","parseParams","booleanParams","numberParams","forEach","param","result","toBe","toBeUndefined","sort","toEqual","query","stringify","parsed","parse","data","name","value","JSON","toThrow","already","populate","toHaveProperty","select","joins","collection","selectedLocales","publishSpecificLocale","field","where","equals","read","TypeError","undefined","customParam","draft","depth","test","params","unknownBoolean","unknownNumber","unknownString","not"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/utilities/parseParams/index.spec.ts"],"sourcesContent":["import * as qs from 'qs-esm'\nimport { describe, it, expect } from 'vitest'\nimport { parseParams, booleanParams, numberParams } from './index.js'\n\ndescribe('parseParams', () => {\n describe('boolean parameters', () => {\n it('should parse disabled all-locale publication flags as false', () => {\n const result = parseParams({\n publishAllLocales: 'false',\n unpublishAllLocales: 'false',\n })\n\n expect(result.publishAllLocales).toBe(false)\n expect(result.unpublishAllLocales).toBe(false)\n })\n\n booleanParams.forEach((param) => {\n describe(param, () => {\n it('should parse string \"true\" to boolean true', () => {\n const result = parseParams({ [param]: 'true' })\n expect(result[param]).toBe(true)\n })\n\n it('should parse string \"false\" to boolean false', () => {\n const result = parseParams({ [param]: 'false' })\n expect(result[param]).toBe(false)\n })\n\n it('should parse boolean true to boolean true', () => {\n const result = parseParams({ [param]: true })\n expect(result[param]).toBe(true)\n })\n\n it('should parse boolean false to boolean false', () => {\n const result = parseParams({ [param]: false })\n expect(result[param]).toBe(false)\n })\n\n it('should return undefined for truthy strings (not exact \"true\")', () => {\n const result = parseParams({ [param]: '1' })\n expect(result[param]).toBeUndefined()\n })\n\n it('should return undefined for falsy strings (not exact \"false\")', () => {\n const result = parseParams({ [param]: '0' })\n expect(result[param]).toBeUndefined()\n })\n\n it('should return undefined for empty string', () => {\n const result = parseParams({ [param]: '' })\n expect(result[param]).toBeUndefined()\n })\n })\n })\n })\n\n describe('number parameters', () => {\n numberParams.forEach((param) => {\n describe(param, () => {\n it('should parse valid number string to number', () => {\n const result = parseParams({ [param]: '42' })\n expect(result[param]).toBe(42)\n })\n\n it('should parse zero string to zero', () => {\n const result = parseParams({ [param]: '0' })\n expect(result[param]).toBe(0)\n })\n\n it('should parse negative number string to negative number', () => {\n const result = parseParams({ [param]: '-5' })\n expect(result[param]).toBe(-5)\n })\n\n it('should parse decimal number string to decimal number', () => {\n const result = parseParams({ [param]: '3.14' })\n expect(result[param]).toBe(3.14)\n })\n\n it('should not parse invalid number strings', () => {\n const result = parseParams({ [param]: 'not-a-number' })\n expect(result[param]).toBe('not-a-number') // remains as string\n })\n\n it('should not parse empty string', () => {\n const result = parseParams({ [param]: '' })\n expect(result[param]).toBe('') // remains as string\n })\n\n it('should handle already numeric values', () => {\n const result = parseParams({ [param]: 123 })\n expect(result[param]).toBe(123)\n })\n })\n })\n })\n\n describe('sort parameter', () => {\n it('should parse comma-separated string to array', () => {\n const result = parseParams({ sort: 'name,createdAt,-updatedAt' })\n expect(result.sort).toEqual(['name', 'createdAt', '-updatedAt'])\n })\n\n it('should parse single value string to array with one element', () => {\n const result = parseParams({ sort: 'name' })\n expect(result.sort).toEqual(['name'])\n })\n\n it('should handle empty string', () => {\n const result = parseParams({ sort: '' })\n expect(result.sort).toEqual([''])\n })\n\n it('should handle comma-separated string with spaces', () => {\n const result = parseParams({ sort: 'name, createdAt , -updatedAt' })\n expect(result.sort).toEqual(['name', ' createdAt ', ' -updatedAt'])\n })\n\n it('should parse array of strings', () => {\n const result = parseParams({ sort: ['name', '-createdAt'] })\n expect(result.sort).toEqual(['name', '-createdAt'])\n })\n\n it('should return undefined for non-string sort values', () => {\n const result = parseParams({ sort: 123 as any })\n expect(result.sort).toBeUndefined()\n })\n\n it('should return undefined for array with non-string sort values', () => {\n const result = parseParams({ sort: ['name', 123] as any })\n expect(result.sort).toBeUndefined()\n })\n\n it('should handle qs-esm array sort parsing', () => {\n const query = qs.stringify({ sort: ['title', '-createdAt'] })\n const parsed = qs.parse(query)\n const result = parseParams(parsed)\n expect(result.sort).toEqual(['title', '-createdAt'])\n })\n\n it('should return undefined for null sort values', () => {\n const result = parseParams({ sort: null as any })\n expect(result.sort).toBeUndefined()\n })\n })\n\n describe('data parameter', () => {\n it('should parse valid JSON string', () => {\n const data = { name: 'test', value: 42 }\n const result = parseParams({ data: JSON.stringify(data) })\n expect(result.data).toEqual(data)\n })\n\n it('should parse empty object JSON string', () => {\n const result = parseParams({ data: '{}' })\n expect(result.data).toEqual({})\n })\n\n it('should parse array JSON string', () => {\n const data = [1, 2, 3]\n const result = parseParams({ data: JSON.stringify(data) })\n expect(result.data).toEqual(data)\n })\n\n it('should not process empty string', () => {\n const result = parseParams({ data: '' })\n expect(result.data).toBe('') // empty string is not processed, remains as string\n })\n\n it('should throw error for invalid JSON', () => {\n expect(() => {\n parseParams({ data: 'invalid-json' })\n }).toThrow()\n })\n\n it('should not process non-string data values', () => {\n const result = parseParams({ data: { already: 'parsed' } as any })\n expect(result.data).toEqual({ already: 'parsed' })\n })\n })\n\n describe('special parameters', () => {\n it('should handle populate parameter', () => {\n const result = parseParams({ populate: 'field1,field2' })\n expect(result).toHaveProperty('populate')\n // Note: actual sanitization logic is tested in sanitizePopulateParam tests\n })\n\n it('should handle select parameter', () => {\n const result = parseParams({ select: 'field1,field2' })\n expect(result).toHaveProperty('select')\n // Note: actual sanitization logic is tested in sanitizeSelectParam tests\n })\n\n it('should handle joins parameter', () => {\n const joins = { collection: 'posts' }\n const result = parseParams({ joins })\n expect(result).toHaveProperty('joins')\n // Note: actual sanitization logic is tested in sanitizeJoinParams tests\n })\n })\n\n describe('selectedLocales parameter', () => {\n it('should pass through selectedLocales as-is', () => {\n const selectedLocales = 'en,es,fr'\n const result = parseParams({ selectedLocales })\n expect(result.selectedLocales).toBe(selectedLocales)\n })\n })\n\n describe('publishSpecificLocale parameter', () => {\n it('should pass through publishSpecificLocale as-is', () => {\n const publishSpecificLocale = 'en'\n const result = parseParams({ publishSpecificLocale })\n expect(result.publishSpecificLocale).toBe(publishSpecificLocale)\n })\n })\n\n describe('field parameter', () => {\n it('should pass through field as-is', () => {\n const field = 'myField'\n const result = parseParams({ field })\n expect(result.field).toBe(field)\n })\n })\n\n describe('where parameter', () => {\n it('should pass through where as-is', () => {\n const where = { name: { equals: 'test' } }\n const result = parseParams({ where })\n expect(result.where).toBe(where)\n })\n\n it('should parse where when it is a JSON string', () => {\n const where = { read: { equals: false } }\n const result = parseParams({ where: JSON.stringify(where) })\n expect(result.where).toEqual(where)\n })\n\n it('should not process empty string where', () => {\n const result = parseParams({ where: '' })\n expect(result.where).toBe('')\n })\n\n it('should throw error for invalid JSON where', () => {\n expect(() => {\n parseParams({ where: 'invalid-json' })\n }).toThrow()\n })\n })\n\n describe('edge cases', () => {\n it('should handle empty params object', () => {\n const result = parseParams({})\n expect(result).toEqual({})\n })\n\n it('should throw error for null params (current implementation bug)', () => {\n expect(() => {\n parseParams(null as any)\n }).toThrow(TypeError)\n })\n\n it('should throw error for undefined params (current implementation bug)', () => {\n expect(() => {\n parseParams(undefined as any)\n }).toThrow(TypeError)\n })\n\n it('should preserve unknown parameters', () => {\n const result = parseParams({ customParam: 'customValue' })\n expect(result.customParam).toBe('customValue')\n })\n\n it('should handle mixed parameter types', () => {\n const result = parseParams({\n draft: 'true',\n depth: '5',\n sort: 'name,createdAt',\n data: '{\"test\": true}',\n customParam: 'custom',\n })\n\n expect(result.draft).toBe(true)\n expect(result.depth).toBe(5)\n expect(result.sort).toEqual(['name', 'createdAt'])\n expect(result.data).toEqual({ test: true })\n expect(result.customParam).toBe('custom')\n })\n })\n\n describe('parameter preservation', () => {\n it('should not modify parameters that are not in known lists', () => {\n const params = {\n unknownBoolean: 'true',\n unknownNumber: '42',\n unknownString: 'test',\n }\n const result = parseParams(params)\n\n expect(result.unknownBoolean).toBe('true') // should remain string\n expect(result.unknownNumber).toBe('42') // should remain string\n expect(result.unknownString).toBe('test')\n })\n\n it('should only process parameters that exist in the input', () => {\n const result = parseParams({ draft: 'true' })\n\n expect(result.draft).toBe(true)\n expect(result).not.toHaveProperty('autosave')\n expect(result).not.toHaveProperty('depth')\n expect(result).not.toHaveProperty('sort')\n })\n })\n})\n"],"names":["qs","describe","it","expect","parseParams","booleanParams","numberParams","result","publishAllLocales","unpublishAllLocales","toBe","forEach","param","toBeUndefined","sort","toEqual","query","stringify","parsed","parse","data","name","value","JSON","toThrow","already","populate","toHaveProperty","select","joins","collection","selectedLocales","publishSpecificLocale","field","where","equals","read","TypeError","undefined","customParam","draft","depth","test","params","unknownBoolean","unknownNumber","unknownString","not"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/utilities/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,KAAK,EAAkC,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/utilities/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,KAAK,EAAkC,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAuGlG,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE;IAC1C;;OAEG;IACH,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,IAAI,CAAA;IACjB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,KAAK,OAAO,GAAG,IAAI,CAAA;AAEpB,KAAK,kBAAkB,GAAG;IACxB,QAAQ,EAAE,sBAAsB,CAAA;IAChC,aAAa,CAAC,EAAE,CAAC,MAAM,UAAU,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAA;IAC5D,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAAA;IACjC,MAAM,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,oJAYxB,kBAAkB,KAAG,IAgVvB,CAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { fieldAffectsData, fieldHasSubFields, fieldShouldBeLocalized, tabHasName } from '../fields/config/types.js';
|
|
2
|
+
import { expandOwnDottedKey } from './fieldPath.js';
|
|
2
3
|
const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, field, fillEmpty, leavesFirst, parentIsLocalized, parentPath, parentRef })=>{
|
|
3
4
|
if (fillEmpty) {
|
|
4
5
|
if (field.type === 'array') {
|
|
@@ -379,20 +380,10 @@ const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, fie
|
|
|
379
380
|
// Fallback: Handle dot-notation paths when no fields matched
|
|
380
381
|
if (!fieldsMatched && ref && typeof ref === 'object') {
|
|
381
382
|
Object.keys(ref).forEach((key)=>{
|
|
382
|
-
if (
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
const remainingPath = key.substring(firstDotIndex + 1);
|
|
387
|
-
// Create nested structure for this field
|
|
388
|
-
if (!ref[fieldName]) {
|
|
389
|
-
;
|
|
390
|
-
ref[fieldName] = {};
|
|
391
|
-
}
|
|
392
|
-
const nestedRef = ref[fieldName];
|
|
393
|
-
// Move the value to the nested structure
|
|
394
|
-
nestedRef[remainingPath] = ref[key];
|
|
395
|
-
delete ref[key];
|
|
383
|
+
if (expandOwnDottedKey({
|
|
384
|
+
key,
|
|
385
|
+
target: ref
|
|
386
|
+
})) {
|
|
396
387
|
// Recursively process the newly created nested structure
|
|
397
388
|
// The field traversal will naturally handle it if the field exists in the schema
|
|
398
389
|
traverseFields({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/traverseFields.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from '../config/types.js'\nimport type { ArrayField, Block, BlocksField, Field, TabAsField } from '../fields/config/types.js'\n\nimport {\n fieldAffectsData,\n fieldHasSubFields,\n fieldShouldBeLocalized,\n tabHasName,\n} from '../fields/config/types.js'\n\nconst traverseArrayOrBlocksField = ({\n callback,\n callbackStack,\n config,\n data,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized,\n parentPath,\n parentRef,\n}: {\n callback: TraverseFieldsCallback\n callbackStack: (() => ReturnType<TraverseFieldsCallback>)[]\n config?: Config | SanitizedConfig\n data: Record<string, unknown>[]\n field: ArrayField | BlocksField\n fillEmpty: boolean\n leavesFirst: boolean\n parentIsLocalized: boolean\n parentPath: string\n parentRef?: unknown\n}) => {\n if (fillEmpty) {\n if (field.type === 'array') {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n })\n }\n if (field.type === 'blocks') {\n for (const _block of field.blockReferences ?? field.blocks) {\n // TODO: iterate over blocks mapped to block slug in v4, or pass through payload.blocks\n const block =\n typeof _block === 'string' ? config?.blocks?.find((b) => b.slug === _block) : _block\n if (block) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: block.fields,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n })\n }\n }\n }\n return\n }\n for (const ref of data) {\n let fields!: Field[]\n if (field.type === 'blocks' && typeof ref?.blockType === 'string') {\n // TODO: iterate over blocks mapped to block slug in v4, or pass through payload.blocks\n const block = field.blockReferences\n ? ((config?.blocks?.find((b) => b.slug === ref.blockType) ??\n field.blockReferences.find(\n (b) => typeof b !== 'string' && b.slug === ref.blockType,\n )) as Block)\n : field.blocks.find((b) => b.slug === ref.blockType)\n\n fields = block?.fields as Field[]\n } else if (field.type === 'array') {\n fields = field.fields\n }\n\n if (fields) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n ref,\n })\n }\n }\n}\n\nexport type TraverseFieldsCallback = (args: {\n /**\n * The current field\n */\n field: Field | TabAsField\n /**\n * Function that when called will skip the current field and continue to the next\n */\n next?: () => void\n parentIsLocalized: boolean\n parentPath: string\n /**\n * The parent reference object\n */\n parentRef?: Record<string, unknown> | unknown\n /**\n * The current reference object\n */\n ref?: Record<string, unknown> | unknown\n}) => boolean | void\n\ntype TraverseFieldsArgs = {\n callback: TraverseFieldsCallback\n callbackStack?: (() => ReturnType<TraverseFieldsCallback>)[]\n config?: Config | SanitizedConfig\n fields: (Field | TabAsField)[]\n fillEmpty?: boolean\n isTopLevel?: boolean\n /**\n * @default false\n *\n * if this is `true`, the callback functions of the leaf fields will be called before the parent fields.\n * The return value of the callback function will be ignored.\n */\n leavesFirst?: boolean\n parentIsLocalized?: boolean\n parentPath?: string\n parentRef?: Record<string, unknown> | unknown\n ref?: Record<string, unknown> | unknown\n}\n\n/**\n * Iterate a recurse an array of fields, calling a callback for each field\n *\n * @param fields\n * @param callback callback called for each field, discontinue looping if callback returns truthy\n * @param fillEmpty fill empty properties to use this without data\n * @param ref the data or any artifacts assigned in the callback during field recursion\n * @param parentRef the data or any artifacts assigned in the callback during field recursion one level up\n */\nexport const traverseFields = ({\n callback,\n callbackStack: _callbackStack = [],\n config,\n fields,\n fillEmpty = true,\n isTopLevel = true,\n leavesFirst = false,\n parentIsLocalized = false,\n parentPath = '',\n parentRef = {},\n ref = {},\n}: TraverseFieldsArgs): void => {\n const fieldsMatched = fields.some((field) => {\n let callbackStack: (() => ReturnType<TraverseFieldsCallback>)[] = []\n if (!isTopLevel) {\n callbackStack = _callbackStack\n }\n let skip = false\n const next = () => {\n skip = true\n }\n\n if (!ref || typeof ref !== 'object') {\n return\n }\n\n if (\n !leavesFirst &&\n callback &&\n callback({ field, next, parentIsLocalized, parentPath, parentRef, ref })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field,\n next,\n parentIsLocalized,\n parentPath,\n parentRef,\n ref,\n }),\n )\n }\n\n if (skip) {\n return false\n }\n\n // avoid mutation of ref for all fields\n let currentRef = ref\n let currentParentRef = parentRef\n\n if (field.type === 'tabs' && 'tabs' in field) {\n for (const tab of field.tabs) {\n const tabIsLocalized = fieldShouldBeLocalized({ field: tab, parentIsLocalized })\n let tabRef = ref\n\n if (skip) {\n return false\n }\n\n if ('name' in tab && tab.name) {\n if (\n !ref[tab.name as keyof typeof ref] ||\n typeof ref[tab.name as keyof typeof ref] !== 'object'\n ) {\n if (fillEmpty) {\n if (tabIsLocalized) {\n ;(ref as Record<string, any>)[tab.name] = { en: {} }\n } else {\n ;(ref as Record<string, any>)[tab.name] = {}\n }\n } else {\n continue\n }\n }\n\n if (\n callback &&\n !leavesFirst &&\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n }),\n )\n }\n\n tabRef = tabRef[tab.name as keyof typeof tabRef]\n\n if (tabIsLocalized) {\n for (const key in tabRef as Record<string, unknown>) {\n if (\n tabRef[key as keyof typeof tabRef] &&\n typeof tabRef[key as keyof typeof tabRef] === 'object'\n ) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: tab.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: true,\n parentPath: `${parentPath}${tab.name}.`,\n parentRef: currentParentRef,\n ref: tabRef[key as keyof typeof tabRef],\n })\n }\n }\n }\n } else {\n if (\n callback &&\n !leavesFirst &&\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n }),\n )\n }\n }\n\n if (!tabIsLocalized) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: tab.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentPath: tabHasName(tab) ? `${parentPath}${tab.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n }\n\n if (skip) {\n return false\n }\n }\n\n return\n }\n\n if (field.type === 'tab' || fieldHasSubFields(field) || field.type === 'blocks') {\n if ('name' in field && field.name) {\n currentParentRef = currentRef\n if (!ref[field.name as keyof typeof ref]) {\n if (fillEmpty) {\n if (field.type === 'group' || field.type === 'tab') {\n if (fieldShouldBeLocalized({ field, parentIsLocalized })) {\n ;(ref as Record<string, any>)[field.name] = { en: {} }\n } else {\n ;(ref as Record<string, any>)[field.name] = {}\n }\n } else if (field.type === 'array' || field.type === 'blocks') {\n if (fieldShouldBeLocalized({ field, parentIsLocalized })) {\n ;(ref as Record<string, any>)[field.name] = { en: [] }\n } else {\n ;(ref as Record<string, any>)[field.name] = []\n }\n }\n } else {\n return\n }\n }\n currentRef = ref[field.name as keyof typeof ref]\n }\n\n if (\n (field.type === 'tab' || field.type === 'group') &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n currentRef &&\n typeof currentRef === 'object'\n ) {\n if (fieldAffectsData(field)) {\n for (const key in currentRef as Record<string, unknown>) {\n if (currentRef[key as keyof typeof currentRef]) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: true,\n parentPath: field.name ? `${parentPath}${field.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: currentRef[key as keyof typeof currentRef],\n })\n }\n }\n } else {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentRef: currentParentRef,\n ref: currentRef,\n })\n }\n\n return\n }\n\n if (\n (field.type === 'blocks' || field.type === 'array') &&\n currentRef &&\n typeof currentRef === 'object'\n ) {\n if (fieldShouldBeLocalized({ field, parentIsLocalized })) {\n if (Array.isArray(currentRef)) {\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: currentRef,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized: true,\n parentPath,\n parentRef: currentParentRef,\n })\n } else {\n for (const key in currentRef as Record<string, unknown>) {\n const localeData = currentRef[key as keyof typeof currentRef]\n if (!Array.isArray(localeData)) {\n continue\n }\n\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: localeData,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized: true,\n parentPath,\n parentRef: currentParentRef,\n })\n }\n }\n } else if (Array.isArray(currentRef)) {\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: currentRef as Record<string, unknown>[],\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized,\n parentPath,\n parentRef: currentParentRef,\n })\n }\n } else if (currentRef && typeof currentRef === 'object' && 'fields' in field) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentPath: 'name' in field && field.name ? `${parentPath}${field.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: currentRef,\n })\n }\n }\n\n if (isTopLevel) {\n callbackStack.reverse().forEach((cb) => {\n cb()\n })\n }\n })\n\n // Fallback: Handle dot-notation paths when no fields matched\n if (!fieldsMatched && ref && typeof ref === 'object') {\n Object.keys(ref).forEach((key) => {\n if (key.includes('.')) {\n // Split on first dot only\n const firstDotIndex = key.indexOf('.')\n const fieldName = key.substring(0, firstDotIndex)\n const remainingPath = key.substring(firstDotIndex + 1)\n\n // Create nested structure for this field\n if (!ref[fieldName as keyof typeof ref]) {\n ;(ref as Record<string, unknown>)[fieldName] = {}\n }\n\n const nestedRef = ref[fieldName as keyof typeof ref] as Record<string, unknown>\n\n // Move the value to the nested structure\n nestedRef[remainingPath] = (ref as Record<string, unknown>)[key]\n delete (ref as Record<string, unknown>)[key]\n\n // Recursively process the newly created nested structure\n // The field traversal will naturally handle it if the field exists in the schema\n traverseFields({\n callback,\n callbackStack: _callbackStack,\n config,\n fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentPath,\n parentRef,\n ref,\n })\n }\n })\n }\n}\n"],"names":["fieldAffectsData","fieldHasSubFields","fieldShouldBeLocalized","tabHasName","traverseArrayOrBlocksField","callback","callbackStack","config","data","field","fillEmpty","leavesFirst","parentIsLocalized","parentPath","parentRef","type","traverseFields","fields","isTopLevel","localized","name","_block","blockReferences","blocks","block","find","b","slug","ref","blockType","_callbackStack","fieldsMatched","some","skip","next","push","currentRef","currentParentRef","tab","tabs","tabIsLocalized","tabRef","en","key","Array","isArray","localeData","reverse","forEach","cb","Object","keys","includes","firstDotIndex","indexOf","fieldName","substring","remainingPath","nestedRef"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/traverseFields.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from '../config/types.js'\nimport type { ArrayField, Block, BlocksField, Field, TabAsField } from '../fields/config/types.js'\n\nimport {\n fieldAffectsData,\n fieldHasSubFields,\n fieldShouldBeLocalized,\n tabHasName,\n} from '../fields/config/types.js'\nimport { expandOwnDottedKey } from './fieldPath.js'\n\nconst traverseArrayOrBlocksField = ({\n callback,\n callbackStack,\n config,\n data,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized,\n parentPath,\n parentRef,\n}: {\n callback: TraverseFieldsCallback\n callbackStack: (() => ReturnType<TraverseFieldsCallback>)[]\n config?: Config | SanitizedConfig\n data: Record<string, unknown>[]\n field: ArrayField | BlocksField\n fillEmpty: boolean\n leavesFirst: boolean\n parentIsLocalized: boolean\n parentPath: string\n parentRef?: unknown\n}) => {\n if (fillEmpty) {\n if (field.type === 'array') {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n })\n }\n if (field.type === 'blocks') {\n for (const _block of field.blockReferences ?? field.blocks) {\n // TODO: iterate over blocks mapped to block slug in v4, or pass through payload.blocks\n const block =\n typeof _block === 'string' ? config?.blocks?.find((b) => b.slug === _block) : _block\n if (block) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: block.fields,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n })\n }\n }\n }\n return\n }\n for (const ref of data) {\n let fields!: Field[]\n if (field.type === 'blocks' && typeof ref?.blockType === 'string') {\n // TODO: iterate over blocks mapped to block slug in v4, or pass through payload.blocks\n const block = field.blockReferences\n ? ((config?.blocks?.find((b) => b.slug === ref.blockType) ??\n field.blockReferences.find(\n (b) => typeof b !== 'string' && b.slug === ref.blockType,\n )) as Block)\n : field.blocks.find((b) => b.slug === ref.blockType)\n\n fields = block?.fields as Field[]\n } else if (field.type === 'array') {\n fields = field.fields\n }\n\n if (fields) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n ref,\n })\n }\n }\n}\n\nexport type TraverseFieldsCallback = (args: {\n /**\n * The current field\n */\n field: Field | TabAsField\n /**\n * Function that when called will skip the current field and continue to the next\n */\n next?: () => void\n parentIsLocalized: boolean\n parentPath: string\n /**\n * The parent reference object\n */\n parentRef?: Record<string, unknown> | unknown\n /**\n * The current reference object\n */\n ref?: Record<string, unknown> | unknown\n}) => boolean | void\n\ntype TraverseFieldsArgs = {\n callback: TraverseFieldsCallback\n callbackStack?: (() => ReturnType<TraverseFieldsCallback>)[]\n config?: Config | SanitizedConfig\n fields: (Field | TabAsField)[]\n fillEmpty?: boolean\n isTopLevel?: boolean\n /**\n * @default false\n *\n * if this is `true`, the callback functions of the leaf fields will be called before the parent fields.\n * The return value of the callback function will be ignored.\n */\n leavesFirst?: boolean\n parentIsLocalized?: boolean\n parentPath?: string\n parentRef?: Record<string, unknown> | unknown\n ref?: Record<string, unknown> | unknown\n}\n\n/**\n * Iterate a recurse an array of fields, calling a callback for each field\n *\n * @param fields\n * @param callback callback called for each field, discontinue looping if callback returns truthy\n * @param fillEmpty fill empty properties to use this without data\n * @param ref the data or any artifacts assigned in the callback during field recursion\n * @param parentRef the data or any artifacts assigned in the callback during field recursion one level up\n */\nexport const traverseFields = ({\n callback,\n callbackStack: _callbackStack = [],\n config,\n fields,\n fillEmpty = true,\n isTopLevel = true,\n leavesFirst = false,\n parentIsLocalized = false,\n parentPath = '',\n parentRef = {},\n ref = {},\n}: TraverseFieldsArgs): void => {\n const fieldsMatched = fields.some((field) => {\n let callbackStack: (() => ReturnType<TraverseFieldsCallback>)[] = []\n if (!isTopLevel) {\n callbackStack = _callbackStack\n }\n let skip = false\n const next = () => {\n skip = true\n }\n\n if (!ref || typeof ref !== 'object') {\n return\n }\n\n if (\n !leavesFirst &&\n callback &&\n callback({ field, next, parentIsLocalized, parentPath, parentRef, ref })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field,\n next,\n parentIsLocalized,\n parentPath,\n parentRef,\n ref,\n }),\n )\n }\n\n if (skip) {\n return false\n }\n\n // avoid mutation of ref for all fields\n let currentRef = ref\n let currentParentRef = parentRef\n\n if (field.type === 'tabs' && 'tabs' in field) {\n for (const tab of field.tabs) {\n const tabIsLocalized = fieldShouldBeLocalized({ field: tab, parentIsLocalized })\n let tabRef = ref\n\n if (skip) {\n return false\n }\n\n if ('name' in tab && tab.name) {\n if (\n !ref[tab.name as keyof typeof ref] ||\n typeof ref[tab.name as keyof typeof ref] !== 'object'\n ) {\n if (fillEmpty) {\n if (tabIsLocalized) {\n ;(ref as Record<string, any>)[tab.name] = { en: {} }\n } else {\n ;(ref as Record<string, any>)[tab.name] = {}\n }\n } else {\n continue\n }\n }\n\n if (\n callback &&\n !leavesFirst &&\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n }),\n )\n }\n\n tabRef = tabRef[tab.name as keyof typeof tabRef]\n\n if (tabIsLocalized) {\n for (const key in tabRef as Record<string, unknown>) {\n if (\n tabRef[key as keyof typeof tabRef] &&\n typeof tabRef[key as keyof typeof tabRef] === 'object'\n ) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: tab.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: true,\n parentPath: `${parentPath}${tab.name}.`,\n parentRef: currentParentRef,\n ref: tabRef[key as keyof typeof tabRef],\n })\n }\n }\n }\n } else {\n if (\n callback &&\n !leavesFirst &&\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n }),\n )\n }\n }\n\n if (!tabIsLocalized) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: tab.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentPath: tabHasName(tab) ? `${parentPath}${tab.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n }\n\n if (skip) {\n return false\n }\n }\n\n return\n }\n\n if (field.type === 'tab' || fieldHasSubFields(field) || field.type === 'blocks') {\n if ('name' in field && field.name) {\n currentParentRef = currentRef\n if (!ref[field.name as keyof typeof ref]) {\n if (fillEmpty) {\n if (field.type === 'group' || field.type === 'tab') {\n if (fieldShouldBeLocalized({ field, parentIsLocalized })) {\n ;(ref as Record<string, any>)[field.name] = { en: {} }\n } else {\n ;(ref as Record<string, any>)[field.name] = {}\n }\n } else if (field.type === 'array' || field.type === 'blocks') {\n if (fieldShouldBeLocalized({ field, parentIsLocalized })) {\n ;(ref as Record<string, any>)[field.name] = { en: [] }\n } else {\n ;(ref as Record<string, any>)[field.name] = []\n }\n }\n } else {\n return\n }\n }\n currentRef = ref[field.name as keyof typeof ref]\n }\n\n if (\n (field.type === 'tab' || field.type === 'group') &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n currentRef &&\n typeof currentRef === 'object'\n ) {\n if (fieldAffectsData(field)) {\n for (const key in currentRef as Record<string, unknown>) {\n if (currentRef[key as keyof typeof currentRef]) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: true,\n parentPath: field.name ? `${parentPath}${field.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: currentRef[key as keyof typeof currentRef],\n })\n }\n }\n } else {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentRef: currentParentRef,\n ref: currentRef,\n })\n }\n\n return\n }\n\n if (\n (field.type === 'blocks' || field.type === 'array') &&\n currentRef &&\n typeof currentRef === 'object'\n ) {\n if (fieldShouldBeLocalized({ field, parentIsLocalized })) {\n if (Array.isArray(currentRef)) {\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: currentRef,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized: true,\n parentPath,\n parentRef: currentParentRef,\n })\n } else {\n for (const key in currentRef as Record<string, unknown>) {\n const localeData = currentRef[key as keyof typeof currentRef]\n if (!Array.isArray(localeData)) {\n continue\n }\n\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: localeData,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized: true,\n parentPath,\n parentRef: currentParentRef,\n })\n }\n }\n } else if (Array.isArray(currentRef)) {\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: currentRef as Record<string, unknown>[],\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized,\n parentPath,\n parentRef: currentParentRef,\n })\n }\n } else if (currentRef && typeof currentRef === 'object' && 'fields' in field) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentPath: 'name' in field && field.name ? `${parentPath}${field.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: currentRef,\n })\n }\n }\n\n if (isTopLevel) {\n callbackStack.reverse().forEach((cb) => {\n cb()\n })\n }\n })\n\n // Fallback: Handle dot-notation paths when no fields matched\n if (!fieldsMatched && ref && typeof ref === 'object') {\n Object.keys(ref).forEach((key) => {\n if (expandOwnDottedKey({ key, target: ref as Record<string, unknown> })) {\n // Recursively process the newly created nested structure\n // The field traversal will naturally handle it if the field exists in the schema\n traverseFields({\n callback,\n callbackStack: _callbackStack,\n config,\n fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentPath,\n parentRef,\n ref,\n })\n }\n })\n }\n}\n"],"names":["fieldAffectsData","fieldHasSubFields","fieldShouldBeLocalized","tabHasName","expandOwnDottedKey","traverseArrayOrBlocksField","callback","callbackStack","config","data","field","fillEmpty","leavesFirst","parentIsLocalized","parentPath","parentRef","type","traverseFields","fields","isTopLevel","localized","name","_block","blockReferences","blocks","block","find","b","slug","ref","blockType","_callbackStack","fieldsMatched","some","skip","next","push","currentRef","currentParentRef","tab","tabs","tabIsLocalized","tabRef","en","key","Array","isArray","localeData","reverse","forEach","cb","Object","keys","target"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unflatten.d.ts","sourceRoot":"","sources":["../../src/utilities/unflatten.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"unflatten.d.ts","sourceRoot":"","sources":["../../src/utilities/unflatten.ts"],"names":[],"mappings":"AA6BA,UAAU,IAAI;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,GAAG,CAAA;IACZ,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,eAAO,MAAM,SAAS,WAAY,GAAG,SAAS,IAAI,QAoEjD,CAAA"}
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
* Copyright (c) 2020, Feross Aboukhadijeh <https://feross.org>
|
|
13
13
|
* Reference: https://www.npmjs.com/package/is-buffer
|
|
14
14
|
* All rights reserved.
|
|
15
|
-
*/
|
|
15
|
+
*/ import { hasUnsupportedFieldPathSegment, setOwnProperty } from './fieldPath.js';
|
|
16
|
+
function isBuffer(obj) {
|
|
16
17
|
return obj != null && obj.constructor != null && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj);
|
|
17
18
|
}
|
|
18
19
|
export const unflatten = (target, opts)=>{
|
|
@@ -33,21 +34,28 @@ export const unflatten = (target, opts)=>{
|
|
|
33
34
|
const sortedKeys = Object.keys(target).sort((keyA, keyB)=>keyA.length - keyB.length);
|
|
34
35
|
sortedKeys.forEach((key)=>{
|
|
35
36
|
const split = key.split(delimiter);
|
|
37
|
+
if (hasUnsupportedFieldPathSegment({
|
|
38
|
+
segments: split
|
|
39
|
+
})) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
36
42
|
let key1 = getkey(split.shift());
|
|
37
43
|
let key2 = getkey(split[0]);
|
|
38
44
|
let recipient = result;
|
|
39
45
|
while(key2 !== undefined){
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
const type = Object.prototype.toString.call(recipient[key1]);
|
|
46
|
+
const currentValue = Object.hasOwn(recipient, key1) ? recipient[key1] : undefined;
|
|
47
|
+
const type = Object.prototype.toString.call(currentValue);
|
|
44
48
|
const isobject = type === '[object Object]' || type === '[object Array]';
|
|
45
49
|
// do not write over falsey, non-undefined values if overwrite is false
|
|
46
|
-
if (!overwrite && !isobject && typeof
|
|
50
|
+
if (!overwrite && !isobject && typeof currentValue !== 'undefined') {
|
|
47
51
|
return;
|
|
48
52
|
}
|
|
49
|
-
if (overwrite && !isobject || !overwrite &&
|
|
50
|
-
|
|
53
|
+
if (overwrite && !isobject || !overwrite && currentValue == null) {
|
|
54
|
+
setOwnProperty({
|
|
55
|
+
key: key1,
|
|
56
|
+
target: recipient,
|
|
57
|
+
value: typeof key2 === 'number' && !opts.object ? [] : {}
|
|
58
|
+
});
|
|
51
59
|
}
|
|
52
60
|
recipient = recipient[key1];
|
|
53
61
|
if (split.length > 0) {
|
|
@@ -56,7 +64,11 @@ export const unflatten = (target, opts)=>{
|
|
|
56
64
|
}
|
|
57
65
|
}
|
|
58
66
|
// unflatten again for 'messy objects'
|
|
59
|
-
|
|
67
|
+
setOwnProperty({
|
|
68
|
+
key: key1,
|
|
69
|
+
target: recipient,
|
|
70
|
+
value: recursive ? unflatten(target[key], opts) : target[key]
|
|
71
|
+
});
|
|
60
72
|
});
|
|
61
73
|
return result;
|
|
62
74
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/unflatten.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * Copyright (c) 2014, Hugh Kennedy\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * Copyright (c) 2020, Feross Aboukhadijeh <https://feross.org>\n * Reference: https://www.npmjs.com/package/is-buffer\n * All rights reserved.\n */\nfunction isBuffer(obj: any) {\n return (\n obj != null &&\n obj.constructor != null &&\n typeof obj.constructor.isBuffer === 'function' &&\n obj.constructor.isBuffer(obj)\n )\n}\n\ninterface Opts {\n delimiter?: string\n object?: any\n overwrite?: boolean\n recursive?: boolean\n}\n\nexport const unflatten = (target: any, opts?: Opts) => {\n opts = opts || {}\n\n const delimiter = opts.delimiter || '.'\n const overwrite = opts.overwrite || false\n const recursive = opts.recursive || false\n const result = {}\n\n const isbuffer = isBuffer(target)\n\n if (isbuffer || Object.prototype.toString.call(target) !== '[object Object]') {\n return target\n }\n\n // safely ensure that the key is an integer.\n const getkey = (key: any) => {\n const parsedKey = Number(key)\n return isNaN(parsedKey) || key.indexOf('.') !== -1 || opts.object ? key : parsedKey\n }\n\n const sortedKeys = Object.keys(target).sort((keyA, keyB) => keyA.length - keyB.length)\n\n sortedKeys.forEach((key) => {\n const split = key.split(delimiter)\n let key1 = getkey(split.shift())\n let key2 = getkey(split[0])\n let recipient = result as Record<string, any>\n\n while (key2 !== undefined) {\n
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/unflatten.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * Copyright (c) 2014, Hugh Kennedy\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * Copyright (c) 2020, Feross Aboukhadijeh <https://feross.org>\n * Reference: https://www.npmjs.com/package/is-buffer\n * All rights reserved.\n */\nimport { hasUnsupportedFieldPathSegment, setOwnProperty } from './fieldPath.js'\n\nfunction isBuffer(obj: any) {\n return (\n obj != null &&\n obj.constructor != null &&\n typeof obj.constructor.isBuffer === 'function' &&\n obj.constructor.isBuffer(obj)\n )\n}\n\ninterface Opts {\n delimiter?: string\n object?: any\n overwrite?: boolean\n recursive?: boolean\n}\n\nexport const unflatten = (target: any, opts?: Opts) => {\n opts = opts || {}\n\n const delimiter = opts.delimiter || '.'\n const overwrite = opts.overwrite || false\n const recursive = opts.recursive || false\n const result = {}\n\n const isbuffer = isBuffer(target)\n\n if (isbuffer || Object.prototype.toString.call(target) !== '[object Object]') {\n return target\n }\n\n // safely ensure that the key is an integer.\n const getkey = (key: any) => {\n const parsedKey = Number(key)\n return isNaN(parsedKey) || key.indexOf('.') !== -1 || opts.object ? key : parsedKey\n }\n\n const sortedKeys = Object.keys(target).sort((keyA, keyB) => keyA.length - keyB.length)\n\n sortedKeys.forEach((key) => {\n const split = key.split(delimiter)\n\n if (hasUnsupportedFieldPathSegment({ segments: split })) {\n return\n }\n\n let key1 = getkey(split.shift())\n let key2 = getkey(split[0])\n let recipient = result as Record<string, any>\n\n while (key2 !== undefined) {\n const currentValue = Object.hasOwn(recipient, key1) ? recipient[key1] : undefined\n const type = Object.prototype.toString.call(currentValue)\n const isobject = type === '[object Object]' || type === '[object Array]'\n\n // do not write over falsey, non-undefined values if overwrite is false\n if (!overwrite && !isobject && typeof currentValue !== 'undefined') {\n return\n }\n\n if ((overwrite && !isobject) || (!overwrite && currentValue == null)) {\n setOwnProperty({\n key: key1,\n target: recipient,\n value: typeof key2 === 'number' && !opts.object ? [] : {},\n })\n }\n\n recipient = recipient[key1]\n\n if (split.length > 0) {\n key1 = getkey(split.shift())\n key2 = getkey(split[0])\n }\n }\n\n // unflatten again for 'messy objects'\n setOwnProperty({\n key: key1,\n target: recipient,\n value: recursive ? unflatten(target[key], opts) : target[key],\n })\n })\n\n return result\n}\n"],"names":["hasUnsupportedFieldPathSegment","setOwnProperty","isBuffer","obj","unflatten","target","opts","delimiter","overwrite","recursive","result","isbuffer","Object","prototype","toString","call","getkey","key","parsedKey","Number","isNaN","indexOf","object","sortedKeys","keys","sort","keyA","keyB","length","forEach","split","segments","key1","shift","key2","recipient","undefined","currentValue","hasOwn","type","isobject","value"],"mappings":"AAAA,qDAAqD,GACrD;;;;;;;;;;CAUC,GAED;;;;CAIC,GACD,SAASA,8BAA8B,EAAEC,cAAc,QAAQ,iBAAgB;AAE/E,SAASC,SAASC,GAAQ;IACxB,OACEA,OAAO,QACPA,IAAI,WAAW,IAAI,QACnB,OAAOA,IAAI,WAAW,CAACD,QAAQ,KAAK,cACpCC,IAAI,WAAW,CAACD,QAAQ,CAACC;AAE7B;AASA,OAAO,MAAMC,YAAY,CAACC,QAAaC;IACrCA,OAAOA,QAAQ,CAAC;IAEhB,MAAMC,YAAYD,KAAKC,SAAS,IAAI;IACpC,MAAMC,YAAYF,KAAKE,SAAS,IAAI;IACpC,MAAMC,YAAYH,KAAKG,SAAS,IAAI;IACpC,MAAMC,SAAS,CAAC;IAEhB,MAAMC,WAAWT,SAASG;IAE1B,IAAIM,YAAYC,OAAOC,SAAS,CAACC,QAAQ,CAACC,IAAI,CAACV,YAAY,mBAAmB;QAC5E,OAAOA;IACT;IAEA,4CAA4C;IAC5C,MAAMW,SAAS,CAACC;QACd,MAAMC,YAAYC,OAAOF;QACzB,OAAOG,MAAMF,cAAcD,IAAII,OAAO,CAAC,SAAS,CAAC,KAAKf,KAAKgB,MAAM,GAAGL,MAAMC;IAC5E;IAEA,MAAMK,aAAaX,OAAOY,IAAI,CAACnB,QAAQoB,IAAI,CAAC,CAACC,MAAMC,OAASD,KAAKE,MAAM,GAAGD,KAAKC,MAAM;IAErFL,WAAWM,OAAO,CAAC,CAACZ;QAClB,MAAMa,QAAQb,IAAIa,KAAK,CAACvB;QAExB,IAAIP,+BAA+B;YAAE+B,UAAUD;QAAM,IAAI;YACvD;QACF;QAEA,IAAIE,OAAOhB,OAAOc,MAAMG,KAAK;QAC7B,IAAIC,OAAOlB,OAAOc,KAAK,CAAC,EAAE;QAC1B,IAAIK,YAAYzB;QAEhB,MAAOwB,SAASE,UAAW;YACzB,MAAMC,eAAezB,OAAO0B,MAAM,CAACH,WAAWH,QAAQG,SAAS,CAACH,KAAK,GAAGI;YACxE,MAAMG,OAAO3B,OAAOC,SAAS,CAACC,QAAQ,CAACC,IAAI,CAACsB;YAC5C,MAAMG,WAAWD,SAAS,qBAAqBA,SAAS;YAExD,uEAAuE;YACvE,IAAI,CAAC/B,aAAa,CAACgC,YAAY,OAAOH,iBAAiB,aAAa;gBAClE;YACF;YAEA,IAAI,AAAC7B,aAAa,CAACgC,YAAc,CAAChC,aAAa6B,gBAAgB,MAAO;gBACpEpC,eAAe;oBACbgB,KAAKe;oBACL3B,QAAQ8B;oBACRM,OAAO,OAAOP,SAAS,YAAY,CAAC5B,KAAKgB,MAAM,GAAG,EAAE,GAAG,CAAC;gBAC1D;YACF;YAEAa,YAAYA,SAAS,CAACH,KAAK;YAE3B,IAAIF,MAAMF,MAAM,GAAG,GAAG;gBACpBI,OAAOhB,OAAOc,MAAMG,KAAK;gBACzBC,OAAOlB,OAAOc,KAAK,CAAC,EAAE;YACxB;QACF;QAEA,sCAAsC;QACtC7B,eAAe;YACbgB,KAAKe;YACL3B,QAAQ8B;YACRM,OAAOhC,YAAYL,UAAUC,MAAM,CAACY,IAAI,EAAEX,QAAQD,MAAM,CAACY,IAAI;QAC/D;IACF;IAEA,OAAOP;AACT,EAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { unflatten } from './unflatten.js';
|
|
3
|
+
describe('unflatten', ()=>{
|
|
4
|
+
it('should handle constrained object paths', ()=>{
|
|
5
|
+
const marker = 'constrainedUnflattenMarker';
|
|
6
|
+
const originalDescriptor = Object.getOwnPropertyDescriptor(Object.prototype, marker);
|
|
7
|
+
const target = JSON.parse(`{"__proto__.${marker}":"value","constructor.value":"local","prototype.value":"local","profile.displayName":"Ada"}`);
|
|
8
|
+
let result;
|
|
9
|
+
let processStateChanged = false;
|
|
10
|
+
try {
|
|
11
|
+
result = unflatten(target);
|
|
12
|
+
processStateChanged = Object.hasOwn(Object.prototype, marker);
|
|
13
|
+
} finally{
|
|
14
|
+
if (originalDescriptor) {
|
|
15
|
+
Object.defineProperty(Object.prototype, marker, originalDescriptor);
|
|
16
|
+
} else {
|
|
17
|
+
delete Object.prototype[marker];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
expect(processStateChanged).toBe(false);
|
|
21
|
+
expect(Object.getOwnPropertyDescriptor(Object.prototype, marker)).toEqual(originalDescriptor);
|
|
22
|
+
expect(result).toEqual({
|
|
23
|
+
constructor: {
|
|
24
|
+
value: 'local'
|
|
25
|
+
},
|
|
26
|
+
profile: {
|
|
27
|
+
displayName: 'Ada'
|
|
28
|
+
},
|
|
29
|
+
prototype: {
|
|
30
|
+
value: 'local'
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
expect(Object.hasOwn(result, 'constructor')).toBe(true);
|
|
34
|
+
expect(Object.hasOwn(result, 'prototype')).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=unflatten.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/unflatten.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { unflatten } from './unflatten.js'\n\ndescribe('unflatten', () => {\n it('should handle constrained object paths', () => {\n const marker = 'constrainedUnflattenMarker'\n const originalDescriptor = Object.getOwnPropertyDescriptor(Object.prototype, marker)\n const target = JSON.parse(\n `{\"__proto__.${marker}\":\"value\",\"constructor.value\":\"local\",\"prototype.value\":\"local\",\"profile.displayName\":\"Ada\"}`,\n ) as Record<string, unknown>\n let result: Record<string, unknown> | undefined\n let processStateChanged = false\n\n try {\n result = unflatten(target)\n processStateChanged = Object.hasOwn(Object.prototype, marker)\n } finally {\n if (originalDescriptor) {\n Object.defineProperty(Object.prototype, marker, originalDescriptor)\n } else {\n delete (Object.prototype as Record<string, unknown>)[marker]\n }\n }\n\n expect(processStateChanged).toBe(false)\n expect(Object.getOwnPropertyDescriptor(Object.prototype, marker)).toEqual(originalDescriptor)\n expect(result).toEqual({\n constructor: { value: 'local' },\n profile: {\n displayName: 'Ada',\n },\n prototype: { value: 'local' },\n })\n expect(Object.hasOwn(result as object, 'constructor')).toBe(true)\n expect(Object.hasOwn(result as object, 'prototype')).toBe(true)\n })\n})\n"],"names":["describe","expect","it","unflatten","marker","originalDescriptor","Object","getOwnPropertyDescriptor","prototype","target","JSON","parse","result","processStateChanged","hasOwn","defineProperty","toBe","toEqual","value","profile","displayName"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAE7C,SAASC,SAAS,QAAQ,iBAAgB;AAE1CH,SAAS,aAAa;IACpBE,GAAG,0CAA0C;QAC3C,MAAME,SAAS;QACf,MAAMC,qBAAqBC,OAAOC,wBAAwB,CAACD,OAAOE,SAAS,EAAEJ;QAC7E,MAAMK,SAASC,KAAKC,KAAK,CACvB,CAAC,YAAY,EAAEP,OAAO,4FAA4F,CAAC;QAErH,IAAIQ;QACJ,IAAIC,sBAAsB;QAE1B,IAAI;YACFD,SAAST,UAAUM;YACnBI,sBAAsBP,OAAOQ,MAAM,CAACR,OAAOE,SAAS,EAAEJ;QACxD,SAAU;YACR,IAAIC,oBAAoB;gBACtBC,OAAOS,cAAc,CAACT,OAAOE,SAAS,EAAEJ,QAAQC;YAClD,OAAO;gBACL,OAAO,AAACC,OAAOE,SAAS,AAA4B,CAACJ,OAAO;YAC9D;QACF;QAEAH,OAAOY,qBAAqBG,IAAI,CAAC;QACjCf,OAAOK,OAAOC,wBAAwB,CAACD,OAAOE,SAAS,EAAEJ,SAASa,OAAO,CAACZ;QAC1EJ,OAAOW,QAAQK,OAAO,CAAC;YACrB,aAAa;gBAAEC,OAAO;YAAQ;YAC9BC,SAAS;gBACPC,aAAa;YACf;YACAZ,WAAW;gBAAEU,OAAO;YAAQ;QAC9B;QACAjB,OAAOK,OAAOQ,MAAM,CAACF,QAAkB,gBAAgBI,IAAI,CAAC;QAC5Df,OAAOK,OAAOQ,MAAM,CAACF,QAAkB,cAAcI,IAAI,CAAC;IAC5D;AACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { JsonObject } from '../types/index.js';
|
|
2
|
+
export type AllLocalesPublicationStatus = 'draft' | 'published';
|
|
3
|
+
type AllLocalesPublicationIntent = {
|
|
4
|
+
hadStatus: boolean;
|
|
5
|
+
previousStatus: unknown;
|
|
6
|
+
status: AllLocalesPublicationStatus;
|
|
7
|
+
};
|
|
8
|
+
export declare const buildAllLocalesPublicationHookDoc: <TDoc extends JsonObject>({ doc, docWithLocales, status, }: {
|
|
9
|
+
doc: TDoc;
|
|
10
|
+
docWithLocales: JsonObject;
|
|
11
|
+
status: AllLocalesPublicationStatus | undefined;
|
|
12
|
+
}) => TDoc;
|
|
13
|
+
export declare const getAllLocalesPublicationStatus: ({ hasLocalizedStatus, publishAllLocales, unpublishAllLocales, }: {
|
|
14
|
+
hasLocalizedStatus: boolean;
|
|
15
|
+
publishAllLocales: boolean;
|
|
16
|
+
unpublishAllLocales: boolean;
|
|
17
|
+
}) => AllLocalesPublicationStatus | undefined;
|
|
18
|
+
export declare const hasAuthorizedAllLocalesPublicationStatus: ({ data, fieldAccessDenied, fieldValue, status, }: {
|
|
19
|
+
data: JsonObject;
|
|
20
|
+
fieldAccessDenied: boolean;
|
|
21
|
+
fieldValue: unknown;
|
|
22
|
+
status: AllLocalesPublicationStatus | undefined;
|
|
23
|
+
}) => boolean;
|
|
24
|
+
export declare const normalizeAllLocalesPublicationStatus: ({ data, status, }: {
|
|
25
|
+
data: JsonObject;
|
|
26
|
+
status: AllLocalesPublicationStatus | undefined;
|
|
27
|
+
}) => AllLocalesPublicationIntent | undefined;
|
|
28
|
+
export declare const reconcileAllLocalesPublicationStatus: ({ data, intent, status, }: {
|
|
29
|
+
data: JsonObject;
|
|
30
|
+
intent: AllLocalesPublicationIntent | undefined;
|
|
31
|
+
status: AllLocalesPublicationStatus | undefined;
|
|
32
|
+
}) => AllLocalesPublicationStatus | undefined;
|
|
33
|
+
export declare const validateAllLocalesPublicationFlags: ({ publishAllLocales, unpublishAllLocales, }: {
|
|
34
|
+
publishAllLocales?: boolean;
|
|
35
|
+
unpublishAllLocales?: boolean;
|
|
36
|
+
}) => void;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=allLocalesPublicationStatus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allLocalesPublicationStatus.d.ts","sourceRoot":"","sources":["../../src/versions/allLocalesPublicationStatus.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAInD,MAAM,MAAM,2BAA2B,GAAG,OAAO,GAAG,WAAW,CAAA;AAE/D,KAAK,2BAA2B,GAAG;IACjC,SAAS,EAAE,OAAO,CAAA;IAClB,cAAc,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,2BAA2B,CAAA;CACpC,CAAA;AAED,eAAO,MAAM,iCAAiC,GAAI,IAAI,SAAS,UAAU,oCAItE;IACD,GAAG,EAAE,IAAI,CAAA;IACT,cAAc,EAAE,UAAU,CAAA;IAC1B,MAAM,EAAE,2BAA2B,GAAG,SAAS,CAAA;CAChD,KAAG,IASH,CAAA;AAED,eAAO,MAAM,8BAA8B,oEAIxC;IACD,kBAAkB,EAAE,OAAO,CAAA;IAC3B,iBAAiB,EAAE,OAAO,CAAA;IAC1B,mBAAmB,EAAE,OAAO,CAAA;CAC7B,KAAG,2BAA2B,GAAG,SAcjC,CAAA;AAED,eAAO,MAAM,wCAAwC,qDAKlD;IACD,IAAI,EAAE,UAAU,CAAA;IAChB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,UAAU,EAAE,OAAO,CAAA;IACnB,MAAM,EAAE,2BAA2B,GAAG,SAAS,CAAA;CAChD,KAAG,OAEH,CAAA;AAED,eAAO,MAAM,oCAAoC,sBAG9C;IACD,IAAI,EAAE,UAAU,CAAA;IAChB,MAAM,EAAE,2BAA2B,GAAG,SAAS,CAAA;CAChD,KAAG,2BAA2B,GAAG,SAcjC,CAAA;AAED,eAAO,MAAM,oCAAoC,8BAI9C;IACD,IAAI,EAAE,UAAU,CAAA;IAChB,MAAM,EAAE,2BAA2B,GAAG,SAAS,CAAA;IAC/C,MAAM,EAAE,2BAA2B,GAAG,SAAS,CAAA;CAChD,KAAG,2BAA2B,GAAG,SAUjC,CAAA;AAED,eAAO,MAAM,kCAAkC,gDAG5C;IACD,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B,KAAG,IAOH,CAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { status as httpStatus } from 'http-status';
|
|
2
|
+
import { APIError } from '../errors/index.js';
|
|
3
|
+
export const buildAllLocalesPublicationHookDoc = ({ doc, docWithLocales, status })=>{
|
|
4
|
+
if (status && typeof docWithLocales._status === 'object' && docWithLocales._status !== null) {
|
|
5
|
+
return {
|
|
6
|
+
...doc,
|
|
7
|
+
_status: {
|
|
8
|
+
...docWithLocales._status
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
return doc;
|
|
13
|
+
};
|
|
14
|
+
export const getAllLocalesPublicationStatus = ({ hasLocalizedStatus, publishAllLocales, unpublishAllLocales })=>{
|
|
15
|
+
if (!hasLocalizedStatus) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
if (unpublishAllLocales) {
|
|
19
|
+
return 'draft';
|
|
20
|
+
}
|
|
21
|
+
if (publishAllLocales) {
|
|
22
|
+
return 'published';
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
};
|
|
26
|
+
export const hasAuthorizedAllLocalesPublicationStatus = ({ data, fieldAccessDenied, fieldValue, status })=>{
|
|
27
|
+
return Boolean(status && !fieldAccessDenied && data._status === status && fieldValue === status);
|
|
28
|
+
};
|
|
29
|
+
export const normalizeAllLocalesPublicationStatus = ({ data, status })=>{
|
|
30
|
+
if (!status) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
const intent = {
|
|
34
|
+
hadStatus: Object.prototype.hasOwnProperty.call(data, '_status'),
|
|
35
|
+
previousStatus: data._status,
|
|
36
|
+
status
|
|
37
|
+
};
|
|
38
|
+
data._status = status;
|
|
39
|
+
return intent;
|
|
40
|
+
};
|
|
41
|
+
export const reconcileAllLocalesPublicationStatus = ({ data, intent, status })=>{
|
|
42
|
+
if (intent && intent.status !== status && data._status === intent.status) {
|
|
43
|
+
if (intent.hadStatus) {
|
|
44
|
+
data._status = intent.previousStatus;
|
|
45
|
+
} else {
|
|
46
|
+
delete data._status;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return status && data._status === status ? status : undefined;
|
|
50
|
+
};
|
|
51
|
+
export const validateAllLocalesPublicationFlags = ({ publishAllLocales, unpublishAllLocales })=>{
|
|
52
|
+
if (publishAllLocales && unpublishAllLocales) {
|
|
53
|
+
throw new APIError('publishAllLocales and unpublishAllLocales cannot both be true.', httpStatus.BAD_REQUEST);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=allLocalesPublicationStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/versions/allLocalesPublicationStatus.ts"],"sourcesContent":["import { status as httpStatus } from 'http-status'\n\nimport type { JsonObject } from '../types/index.js'\n\nimport { APIError } from '../errors/index.js'\n\nexport type AllLocalesPublicationStatus = 'draft' | 'published'\n\ntype AllLocalesPublicationIntent = {\n hadStatus: boolean\n previousStatus: unknown\n status: AllLocalesPublicationStatus\n}\n\nexport const buildAllLocalesPublicationHookDoc = <TDoc extends JsonObject>({\n doc,\n docWithLocales,\n status,\n}: {\n doc: TDoc\n docWithLocales: JsonObject\n status: AllLocalesPublicationStatus | undefined\n}): TDoc => {\n if (status && typeof docWithLocales._status === 'object' && docWithLocales._status !== null) {\n return {\n ...doc,\n _status: { ...(docWithLocales._status as JsonObject) },\n } as TDoc\n }\n\n return doc\n}\n\nexport const getAllLocalesPublicationStatus = ({\n hasLocalizedStatus,\n publishAllLocales,\n unpublishAllLocales,\n}: {\n hasLocalizedStatus: boolean\n publishAllLocales: boolean\n unpublishAllLocales: boolean\n}): AllLocalesPublicationStatus | undefined => {\n if (!hasLocalizedStatus) {\n return undefined\n }\n\n if (unpublishAllLocales) {\n return 'draft'\n }\n\n if (publishAllLocales) {\n return 'published'\n }\n\n return undefined\n}\n\nexport const hasAuthorizedAllLocalesPublicationStatus = ({\n data,\n fieldAccessDenied,\n fieldValue,\n status,\n}: {\n data: JsonObject\n fieldAccessDenied: boolean\n fieldValue: unknown\n status: AllLocalesPublicationStatus | undefined\n}): boolean => {\n return Boolean(status && !fieldAccessDenied && data._status === status && fieldValue === status)\n}\n\nexport const normalizeAllLocalesPublicationStatus = ({\n data,\n status,\n}: {\n data: JsonObject\n status: AllLocalesPublicationStatus | undefined\n}): AllLocalesPublicationIntent | undefined => {\n if (!status) {\n return undefined\n }\n\n const intent = {\n hadStatus: Object.prototype.hasOwnProperty.call(data, '_status'),\n previousStatus: data._status,\n status,\n }\n\n data._status = status\n\n return intent\n}\n\nexport const reconcileAllLocalesPublicationStatus = ({\n data,\n intent,\n status,\n}: {\n data: JsonObject\n intent: AllLocalesPublicationIntent | undefined\n status: AllLocalesPublicationStatus | undefined\n}): AllLocalesPublicationStatus | undefined => {\n if (intent && intent.status !== status && data._status === intent.status) {\n if (intent.hadStatus) {\n data._status = intent.previousStatus\n } else {\n delete data._status\n }\n }\n\n return status && data._status === status ? status : undefined\n}\n\nexport const validateAllLocalesPublicationFlags = ({\n publishAllLocales,\n unpublishAllLocales,\n}: {\n publishAllLocales?: boolean\n unpublishAllLocales?: boolean\n}): void => {\n if (publishAllLocales && unpublishAllLocales) {\n throw new APIError(\n 'publishAllLocales and unpublishAllLocales cannot both be true.',\n httpStatus.BAD_REQUEST,\n )\n }\n}\n"],"names":["status","httpStatus","APIError","buildAllLocalesPublicationHookDoc","doc","docWithLocales","_status","getAllLocalesPublicationStatus","hasLocalizedStatus","publishAllLocales","unpublishAllLocales","undefined","hasAuthorizedAllLocalesPublicationStatus","data","fieldAccessDenied","fieldValue","Boolean","normalizeAllLocalesPublicationStatus","intent","hadStatus","Object","prototype","hasOwnProperty","call","previousStatus","reconcileAllLocalesPublicationStatus","validateAllLocalesPublicationFlags","BAD_REQUEST"],"mappings":"AAAA,SAASA,UAAUC,UAAU,QAAQ,cAAa;AAIlD,SAASC,QAAQ,QAAQ,qBAAoB;AAU7C,OAAO,MAAMC,oCAAoC,CAA0B,EACzEC,GAAG,EACHC,cAAc,EACdL,MAAM,EAKP;IACC,IAAIA,UAAU,OAAOK,eAAeC,OAAO,KAAK,YAAYD,eAAeC,OAAO,KAAK,MAAM;QAC3F,OAAO;YACL,GAAGF,GAAG;YACNE,SAAS;gBAAE,GAAID,eAAeC,OAAO;YAAgB;QACvD;IACF;IAEA,OAAOF;AACT,EAAC;AAED,OAAO,MAAMG,iCAAiC,CAAC,EAC7CC,kBAAkB,EAClBC,iBAAiB,EACjBC,mBAAmB,EAKpB;IACC,IAAI,CAACF,oBAAoB;QACvB,OAAOG;IACT;IAEA,IAAID,qBAAqB;QACvB,OAAO;IACT;IAEA,IAAID,mBAAmB;QACrB,OAAO;IACT;IAEA,OAAOE;AACT,EAAC;AAED,OAAO,MAAMC,2CAA2C,CAAC,EACvDC,IAAI,EACJC,iBAAiB,EACjBC,UAAU,EACVf,MAAM,EAMP;IACC,OAAOgB,QAAQhB,UAAU,CAACc,qBAAqBD,KAAKP,OAAO,KAAKN,UAAUe,eAAef;AAC3F,EAAC;AAED,OAAO,MAAMiB,uCAAuC,CAAC,EACnDJ,IAAI,EACJb,MAAM,EAIP;IACC,IAAI,CAACA,QAAQ;QACX,OAAOW;IACT;IAEA,MAAMO,SAAS;QACbC,WAAWC,OAAOC,SAAS,CAACC,cAAc,CAACC,IAAI,CAACV,MAAM;QACtDW,gBAAgBX,KAAKP,OAAO;QAC5BN;IACF;IAEAa,KAAKP,OAAO,GAAGN;IAEf,OAAOkB;AACT,EAAC;AAED,OAAO,MAAMO,uCAAuC,CAAC,EACnDZ,IAAI,EACJK,MAAM,EACNlB,MAAM,EAKP;IACC,IAAIkB,UAAUA,OAAOlB,MAAM,KAAKA,UAAUa,KAAKP,OAAO,KAAKY,OAAOlB,MAAM,EAAE;QACxE,IAAIkB,OAAOC,SAAS,EAAE;YACpBN,KAAKP,OAAO,GAAGY,OAAOM,cAAc;QACtC,OAAO;YACL,OAAOX,KAAKP,OAAO;QACrB;IACF;IAEA,OAAON,UAAUa,KAAKP,OAAO,KAAKN,SAASA,SAASW;AACtD,EAAC;AAED,OAAO,MAAMe,qCAAqC,CAAC,EACjDjB,iBAAiB,EACjBC,mBAAmB,EAIpB;IACC,IAAID,qBAAqBC,qBAAqB;QAC5C,MAAM,IAAIR,SACR,kEACAD,WAAW0B,WAAW;IAE1B;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLatestGlobalVersion.d.ts","sourceRoot":"","sources":["../../src/versions/getLatestGlobalVersion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"getLatestGlobalVersion.d.ts","sourceRoot":"","sources":["../../src/versions/getLatestGlobalVersion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAQjF,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,qBAAqB,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,eAAO,MAAM,sBAAsB,8DAQhC,IAAI,KAAG,OAAO,CAAC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAsD5D,CAAA"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { hasWhereAccessResult } from '../auth/types.js';
|
|
2
|
+
import { combineQueries } from '../database/combineQueries.js';
|
|
1
3
|
import { hasDraftsEnabled } from '../utilities/getVersionsConfig.js';
|
|
4
|
+
import { appendVersionToQueryKey } from './drafts/appendVersionToQueryKey.js';
|
|
2
5
|
export const getLatestGlobalVersion = async ({ slug, config, locale, payload, published, req, where })=>{
|
|
3
6
|
let latestVersion;
|
|
4
7
|
const whereQuery = published ? {
|
|
@@ -17,7 +20,7 @@ export const getLatestGlobalVersion = async ({ slug, config, locale, payload, pu
|
|
|
17
20
|
locale: locale || req?.locale || undefined,
|
|
18
21
|
pagination: false,
|
|
19
22
|
req,
|
|
20
|
-
where: whereQuery
|
|
23
|
+
where: combineQueries(appendVersionToQueryKey(where), whereQuery)
|
|
21
24
|
})).docs[0];
|
|
22
25
|
}
|
|
23
26
|
const global = await payload.db.findGlobal({
|
|
@@ -26,7 +29,12 @@ export const getLatestGlobalVersion = async ({ slug, config, locale, payload, pu
|
|
|
26
29
|
req,
|
|
27
30
|
where
|
|
28
31
|
});
|
|
29
|
-
const
|
|
32
|
+
const existingGlobal = hasWhereAccessResult(where) ? await payload.db.findGlobal({
|
|
33
|
+
slug,
|
|
34
|
+
locale,
|
|
35
|
+
req
|
|
36
|
+
}) : global;
|
|
37
|
+
const globalExists = Boolean(existingGlobal && Object.keys(existingGlobal).length > 0);
|
|
30
38
|
if (!latestVersion) {
|
|
31
39
|
return {
|
|
32
40
|
global,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/versions/getLatestGlobalVersion.ts"],"sourcesContent":["import type { SanitizedGlobalConfig } from '../globals/config/types.js'\nimport type { Document, Payload, PayloadRequest, Where } from '../types/index.js'\nimport type { TypeWithVersion } from './types.js'\n\nimport { hasDraftsEnabled } from '../utilities/getVersionsConfig.js'\n\ntype Args = {\n config: SanitizedGlobalConfig\n locale?: string\n payload: Payload\n published?: boolean\n req?: PayloadRequest\n slug: string\n where: Where\n}\n\nexport const getLatestGlobalVersion = async ({\n slug,\n config,\n locale,\n payload,\n published,\n req,\n where,\n}: Args): Promise<{ global: Document; globalExists: boolean }> => {\n let latestVersion: TypeWithVersion<Document> | undefined\n\n const whereQuery = published\n ? { 'version._status': { equals: 'published' } }\n : { latest: { equals: true } }\n\n if (hasDraftsEnabled(config)) {\n latestVersion = (\n await payload.db.findGlobalVersions({\n global: slug,\n limit: 1,\n locale: locale || req?.locale || undefined,\n pagination: false,\n req,\n where: whereQuery as unknown as Where,\n })\n ).docs[0]\n }\n\n const global = await payload.db.findGlobal({\n slug,\n locale,\n req,\n where,\n })\n const globalExists = Boolean(
|
|
1
|
+
{"version":3,"sources":["../../src/versions/getLatestGlobalVersion.ts"],"sourcesContent":["import type { SanitizedGlobalConfig } from '../globals/config/types.js'\nimport type { Document, Payload, PayloadRequest, Where } from '../types/index.js'\nimport type { TypeWithVersion } from './types.js'\n\nimport { hasWhereAccessResult } from '../auth/types.js'\nimport { combineQueries } from '../database/combineQueries.js'\nimport { hasDraftsEnabled } from '../utilities/getVersionsConfig.js'\nimport { appendVersionToQueryKey } from './drafts/appendVersionToQueryKey.js'\n\ntype Args = {\n config: SanitizedGlobalConfig\n locale?: string\n payload: Payload\n published?: boolean\n req?: PayloadRequest\n slug: string\n where: Where\n}\n\nexport const getLatestGlobalVersion = async ({\n slug,\n config,\n locale,\n payload,\n published,\n req,\n where,\n}: Args): Promise<{ global: Document; globalExists: boolean }> => {\n let latestVersion: TypeWithVersion<Document> | undefined\n\n const whereQuery = published\n ? { 'version._status': { equals: 'published' } }\n : { latest: { equals: true } }\n\n if (hasDraftsEnabled(config)) {\n latestVersion = (\n await payload.db.findGlobalVersions({\n global: slug,\n limit: 1,\n locale: locale || req?.locale || undefined,\n pagination: false,\n req,\n where: combineQueries(appendVersionToQueryKey(where), whereQuery as unknown as Where),\n })\n ).docs[0]\n }\n\n const global = await payload.db.findGlobal({\n slug,\n locale,\n req,\n where,\n })\n const existingGlobal = hasWhereAccessResult(where)\n ? await payload.db.findGlobal({\n slug,\n locale,\n req,\n })\n : global\n const globalExists = Boolean(existingGlobal && Object.keys(existingGlobal).length > 0)\n\n if (!latestVersion) {\n return {\n global,\n globalExists,\n }\n }\n\n if (!latestVersion.version.createdAt) {\n latestVersion.version.createdAt = latestVersion.createdAt\n }\n\n if (!latestVersion.version.updatedAt) {\n latestVersion.version.updatedAt = latestVersion.updatedAt\n }\n\n return {\n global: latestVersion.version,\n globalExists,\n }\n}\n"],"names":["hasWhereAccessResult","combineQueries","hasDraftsEnabled","appendVersionToQueryKey","getLatestGlobalVersion","slug","config","locale","payload","published","req","where","latestVersion","whereQuery","equals","latest","db","findGlobalVersions","global","limit","undefined","pagination","docs","findGlobal","existingGlobal","globalExists","Boolean","Object","keys","length","version","createdAt","updatedAt"],"mappings":"AAIA,SAASA,oBAAoB,QAAQ,mBAAkB;AACvD,SAASC,cAAc,QAAQ,gCAA+B;AAC9D,SAASC,gBAAgB,QAAQ,oCAAmC;AACpE,SAASC,uBAAuB,QAAQ,sCAAqC;AAY7E,OAAO,MAAMC,yBAAyB,OAAO,EAC3CC,IAAI,EACJC,MAAM,EACNC,MAAM,EACNC,OAAO,EACPC,SAAS,EACTC,GAAG,EACHC,KAAK,EACA;IACL,IAAIC;IAEJ,MAAMC,aAAaJ,YACf;QAAE,mBAAmB;YAAEK,QAAQ;QAAY;IAAE,IAC7C;QAAEC,QAAQ;YAAED,QAAQ;QAAK;IAAE;IAE/B,IAAIZ,iBAAiBI,SAAS;QAC5BM,gBAAgB,AACd,CAAA,MAAMJ,QAAQQ,EAAE,CAACC,kBAAkB,CAAC;YAClCC,QAAQb;YACRc,OAAO;YACPZ,QAAQA,UAAUG,KAAKH,UAAUa;YACjCC,YAAY;YACZX;YACAC,OAAOV,eAAeE,wBAAwBQ,QAAQE;QACxD,EAAC,EACDS,IAAI,CAAC,EAAE;IACX;IAEA,MAAMJ,SAAS,MAAMV,QAAQQ,EAAE,CAACO,UAAU,CAAC;QACzClB;QACAE;QACAG;QACAC;IACF;IACA,MAAMa,iBAAiBxB,qBAAqBW,SACxC,MAAMH,QAAQQ,EAAE,CAACO,UAAU,CAAC;QAC1BlB;QACAE;QACAG;IACF,KACAQ;IACJ,MAAMO,eAAeC,QAAQF,kBAAkBG,OAAOC,IAAI,CAACJ,gBAAgBK,MAAM,GAAG;IAEpF,IAAI,CAACjB,eAAe;QAClB,OAAO;YACLM;YACAO;QACF;IACF;IAEA,IAAI,CAACb,cAAckB,OAAO,CAACC,SAAS,EAAE;QACpCnB,cAAckB,OAAO,CAACC,SAAS,GAAGnB,cAAcmB,SAAS;IAC3D;IAEA,IAAI,CAACnB,cAAckB,OAAO,CAACE,SAAS,EAAE;QACpCpB,cAAckB,OAAO,CAACE,SAAS,GAAGpB,cAAcoB,SAAS;IAC3D;IAEA,OAAO;QACLd,QAAQN,cAAckB,OAAO;QAC7BL;IACF;AACF,EAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type RestoredStatus = 'draft' | 'published';
|
|
2
|
+
/**
|
|
3
|
+
* Returns the distinct publication statuses a restore will write, so `access.update` can be
|
|
4
|
+
* checked for each one. `_status` is a scalar, or a per-locale object when
|
|
5
|
+
* `versions.drafts.localizeStatus` is on - a localized restore can publish and unpublish locales
|
|
6
|
+
* at once, so both intents are returned and each must pass. Empty when `_status` is absent.
|
|
7
|
+
*/
|
|
8
|
+
export declare const getRestoredStatusesToAuthorize: (rawStatus: unknown) => RestoredStatus[];
|
|
9
|
+
//# sourceMappingURL=getRestoredStatusesToAuthorize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getRestoredStatusesToAuthorize.d.ts","sourceRoot":"","sources":["../../src/versions/getRestoredStatusesToAuthorize.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,WAAW,CAAA;AAElD;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,cAAe,OAAO,KAAG,cAAc,EAgBjF,CAAA"}
|