payload 3.0.0-alpha.41 → 3.0.0-alpha.43
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/auth.js +1 -1
- package/config.js +1 -1
- package/database.js +1 -1
- package/dist/admin/RichText.js +1 -1
- package/dist/admin/RichText.js.map +1 -0
- package/dist/admin/elements/Cell.js +1 -1
- package/dist/admin/elements/Cell.js.map +1 -0
- package/dist/admin/elements/DatePicker.js +1 -1
- package/dist/admin/elements/DatePicker.js.map +1 -0
- package/dist/admin/elements/PreviewButton.js +1 -1
- package/dist/admin/elements/PreviewButton.js.map +1 -0
- package/dist/admin/elements/PublishButton.js +1 -1
- package/dist/admin/elements/PublishButton.js.map +1 -0
- package/dist/admin/elements/SaveButton.js +1 -1
- package/dist/admin/elements/SaveButton.js.map +1 -0
- package/dist/admin/elements/SaveDraftButton.js +1 -1
- package/dist/admin/elements/SaveDraftButton.js.map +1 -0
- package/dist/admin/elements/Tab.js +1 -1
- package/dist/admin/elements/Tab.js.map +1 -0
- package/dist/admin/forms/Error.js +1 -1
- package/dist/admin/forms/Error.js.map +1 -0
- package/dist/admin/forms/FieldDescription.js +1 -1
- package/dist/admin/forms/FieldDescription.js.map +1 -0
- package/dist/admin/forms/FieldTypes.js +1 -1
- package/dist/admin/forms/FieldTypes.js.map +1 -0
- package/dist/admin/forms/Form.js +1 -1
- package/dist/admin/forms/Form.js.map +1 -0
- package/dist/admin/forms/Label.js +1 -1
- package/dist/admin/forms/Label.js.map +1 -0
- package/dist/admin/forms/RowLabel.js +1 -1
- package/dist/admin/forms/RowLabel.js.map +1 -0
- package/dist/admin/types.js +1 -1
- package/dist/admin/types.js.map +1 -0
- package/dist/admin/views/types.js +1 -1
- package/dist/admin/views/types.js.map +1 -0
- package/dist/assets/assets.d.js +1 -1
- package/dist/assets/assets.d.js.map +1 -0
- package/dist/auth/baseFields/accountLock.js +1 -1
- package/dist/auth/baseFields/accountLock.js.map +1 -0
- package/dist/auth/baseFields/apiKey.js +1 -1
- package/dist/auth/baseFields/apiKey.js.map +1 -0
- package/dist/auth/baseFields/auth.js +1 -1
- package/dist/auth/baseFields/auth.js.map +1 -0
- package/dist/auth/baseFields/verification.js +1 -1
- package/dist/auth/baseFields/verification.js.map +1 -0
- package/dist/auth/cookies.js +1 -1
- package/dist/auth/cookies.js.map +1 -0
- package/dist/auth/crypto.js +1 -1
- package/dist/auth/crypto.js.map +1 -0
- package/dist/auth/defaultAccess.js +1 -1
- package/dist/auth/defaultAccess.js.map +1 -0
- package/dist/auth/defaultUser.js +1 -1
- package/dist/auth/defaultUser.js.map +1 -0
- package/dist/auth/executeAccess.js +1 -1
- package/dist/auth/executeAccess.js.map +1 -0
- package/dist/auth/extractJWT.js +1 -1
- package/dist/auth/extractJWT.js.map +1 -0
- package/dist/auth/getAccessResults.js +1 -1
- package/dist/auth/getAccessResults.js.map +1 -0
- package/dist/auth/getAuthenticatedUser.js +1 -1
- package/dist/auth/getAuthenticatedUser.js.map +1 -0
- package/dist/auth/getFieldsToSign.js +1 -1
- package/dist/auth/getFieldsToSign.js.map +1 -0
- package/dist/auth/index.js +1 -1
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/isLocked.js +1 -1
- package/dist/auth/isLocked.js.map +1 -0
- package/dist/auth/operations/access.js +1 -1
- package/dist/auth/operations/access.js.map +1 -0
- package/dist/auth/operations/forgotPassword.js +1 -1
- package/dist/auth/operations/forgotPassword.js.map +1 -0
- package/dist/auth/operations/init.js +1 -1
- package/dist/auth/operations/init.js.map +1 -0
- package/dist/auth/operations/local/forgotPassword.js +1 -1
- package/dist/auth/operations/local/forgotPassword.js.map +1 -0
- package/dist/auth/operations/local/index.js +1 -1
- package/dist/auth/operations/local/index.js.map +1 -0
- package/dist/auth/operations/local/login.js +1 -1
- package/dist/auth/operations/local/login.js.map +1 -0
- package/dist/auth/operations/local/resetPassword.js +1 -1
- package/dist/auth/operations/local/resetPassword.js.map +1 -0
- package/dist/auth/operations/local/unlock.js +1 -1
- package/dist/auth/operations/local/unlock.js.map +1 -0
- package/dist/auth/operations/local/verifyEmail.js +1 -1
- package/dist/auth/operations/local/verifyEmail.js.map +1 -0
- package/dist/auth/operations/login.js +1 -1
- package/dist/auth/operations/login.js.map +1 -0
- package/dist/auth/operations/logout.js +1 -1
- package/dist/auth/operations/logout.js.map +1 -0
- package/dist/auth/operations/me.js +1 -1
- package/dist/auth/operations/me.js.map +1 -0
- package/dist/auth/operations/refresh.js +1 -1
- package/dist/auth/operations/refresh.js.map +1 -0
- package/dist/auth/operations/registerFirstUser.js +1 -1
- package/dist/auth/operations/registerFirstUser.js.map +1 -0
- package/dist/auth/operations/resetPassword.js +1 -1
- package/dist/auth/operations/resetPassword.js.map +1 -0
- package/dist/auth/operations/unlock.js +1 -1
- package/dist/auth/operations/unlock.js.map +1 -0
- package/dist/auth/operations/verifyEmail.js +1 -1
- package/dist/auth/operations/verifyEmail.js.map +1 -0
- package/dist/auth/sendVerificationEmail.js +1 -1
- package/dist/auth/sendVerificationEmail.js.map +1 -0
- package/dist/auth/strategies/apiKey.js +1 -1
- package/dist/auth/strategies/apiKey.js.map +1 -0
- package/dist/auth/strategies/jwt.js +1 -1
- package/dist/auth/strategies/jwt.js.map +1 -0
- package/dist/auth/strategies/local/authenticate.js +1 -1
- package/dist/auth/strategies/local/authenticate.js.map +1 -0
- package/dist/auth/strategies/local/generatePasswordSaltHash.js +1 -1
- package/dist/auth/strategies/local/generatePasswordSaltHash.js.map +1 -0
- package/dist/auth/strategies/local/incrementLoginAttempts.js +1 -1
- package/dist/auth/strategies/local/incrementLoginAttempts.js.map +1 -0
- package/dist/auth/strategies/local/register.js +1 -1
- package/dist/auth/strategies/local/register.js.map +1 -0
- package/dist/auth/strategies/local/resetLoginAttempts.js +1 -1
- package/dist/auth/strategies/local/resetLoginAttempts.js.map +1 -0
- package/dist/auth/types.js +1 -1
- package/dist/auth/types.js.map +1 -0
- package/dist/bin/generateTypes.js +1 -1
- package/dist/bin/generateTypes.js.map +1 -0
- package/dist/bin/index.js +1 -1
- package/dist/bin/index.js.map +1 -0
- package/dist/bin/loadEnv.js +1 -1
- package/dist/bin/loadEnv.js.map +1 -0
- package/dist/bin/migrate.js +1 -1
- package/dist/bin/migrate.js.map +1 -0
- package/dist/bin/register/clientExtensions.js +1 -1
- package/dist/bin/register/clientExtensions.js.map +1 -0
- package/dist/bin/register/index.js +1 -1
- package/dist/bin/register/index.js.map +1 -0
- package/dist/bin/register/read-default-tsconfig.js +1 -1
- package/dist/bin/register/read-default-tsconfig.js.map +1 -0
- package/dist/bin/register/register.js +1 -1
- package/dist/bin/register/register.js.map +1 -0
- package/dist/collections/config/build.js +1 -1
- package/dist/collections/config/build.js.map +1 -0
- package/dist/collections/config/defaults.js +1 -1
- package/dist/collections/config/defaults.js.map +1 -0
- package/dist/collections/config/sanitize.js +1 -1
- package/dist/collections/config/sanitize.js.map +1 -0
- package/dist/collections/config/schema.js +1 -1
- package/dist/collections/config/schema.js.map +1 -0
- package/dist/collections/config/types.js +1 -1
- package/dist/collections/config/types.js.map +1 -0
- package/dist/collections/dataloader.js +1 -1
- package/dist/collections/dataloader.js.map +1 -0
- package/dist/collections/operations/create.js +1 -1
- package/dist/collections/operations/create.js.map +1 -0
- package/dist/collections/operations/delete.js +1 -1
- package/dist/collections/operations/delete.js.map +1 -0
- package/dist/collections/operations/deleteByID.js +1 -1
- package/dist/collections/operations/deleteByID.js.map +1 -0
- package/dist/collections/operations/docAccess.js +1 -1
- package/dist/collections/operations/docAccess.js.map +1 -0
- package/dist/collections/operations/find.js +1 -1
- package/dist/collections/operations/find.js.map +1 -0
- package/dist/collections/operations/findByID.js +1 -1
- package/dist/collections/operations/findByID.js.map +1 -0
- package/dist/collections/operations/findVersionByID.js +1 -1
- package/dist/collections/operations/findVersionByID.js.map +1 -0
- package/dist/collections/operations/findVersions.js +1 -1
- package/dist/collections/operations/findVersions.js.map +1 -0
- package/dist/collections/operations/local/create.js +1 -1
- package/dist/collections/operations/local/create.js.map +1 -0
- package/dist/collections/operations/local/delete.js +1 -1
- package/dist/collections/operations/local/delete.js.map +1 -0
- package/dist/collections/operations/local/find.js +1 -1
- package/dist/collections/operations/local/find.js.map +1 -0
- package/dist/collections/operations/local/findByID.js +1 -1
- package/dist/collections/operations/local/findByID.js.map +1 -0
- package/dist/collections/operations/local/findVersionByID.js +1 -1
- package/dist/collections/operations/local/findVersionByID.js.map +1 -0
- package/dist/collections/operations/local/findVersions.js +1 -1
- package/dist/collections/operations/local/findVersions.js.map +1 -0
- package/dist/collections/operations/local/index.js +1 -1
- package/dist/collections/operations/local/index.js.map +1 -0
- package/dist/collections/operations/local/restoreVersion.js +1 -1
- package/dist/collections/operations/local/restoreVersion.js.map +1 -0
- package/dist/collections/operations/local/update.js +1 -1
- package/dist/collections/operations/local/update.js.map +1 -0
- package/dist/collections/operations/restoreVersion.js +1 -1
- package/dist/collections/operations/restoreVersion.js.map +1 -0
- package/dist/collections/operations/update.js +1 -1
- package/dist/collections/operations/update.js.map +1 -0
- package/dist/collections/operations/updateByID.js +1 -1
- package/dist/collections/operations/updateByID.js.map +1 -0
- package/dist/collections/operations/utils.js +1 -1
- package/dist/collections/operations/utils.js.map +1 -0
- package/dist/config/build.js +1 -1
- package/dist/config/build.js.map +1 -0
- package/dist/config/createClientConfig.js +1 -1
- package/dist/config/createClientConfig.js.map +1 -0
- package/dist/config/defaults.js +1 -1
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/find.js +1 -1
- package/dist/config/find.js.map +1 -0
- package/dist/config/load.js +1 -1
- package/dist/config/load.js.map +1 -0
- package/dist/config/sanitize.js +1 -1
- package/dist/config/sanitize.js.map +1 -0
- package/dist/config/schema.js +1 -1
- package/dist/config/schema.js.map +1 -0
- package/dist/config/shared/adminViewSchema.js +1 -1
- package/dist/config/shared/adminViewSchema.js.map +1 -0
- package/dist/config/shared/componentSchema.js +1 -1
- package/dist/config/shared/componentSchema.js.map +1 -0
- package/dist/config/types.js +1 -1
- package/dist/config/types.js.map +1 -0
- package/dist/config/validate.js +1 -1
- package/dist/config/validate.js.map +1 -0
- package/dist/database/combineQueries.js +1 -1
- package/dist/database/combineQueries.js.map +1 -0
- package/dist/database/createDatabaseAdapter.js +1 -1
- package/dist/database/createDatabaseAdapter.js.map +1 -0
- package/dist/database/flattenWhereToOperators.js +1 -1
- package/dist/database/flattenWhereToOperators.js.map +1 -0
- package/dist/database/getLocalizedPaths.js +1 -1
- package/dist/database/getLocalizedPaths.js.map +1 -0
- package/dist/database/migrations/createMigration.js +1 -1
- package/dist/database/migrations/createMigration.js.map +1 -0
- package/dist/database/migrations/getMigrations.js +1 -1
- package/dist/database/migrations/getMigrations.js.map +1 -0
- package/dist/database/migrations/migrate.js +1 -1
- package/dist/database/migrations/migrate.js.map +1 -0
- package/dist/database/migrations/migrateDown.js +1 -1
- package/dist/database/migrations/migrateDown.js.map +1 -0
- package/dist/database/migrations/migrateRefresh.js +1 -1
- package/dist/database/migrations/migrateRefresh.js.map +1 -0
- package/dist/database/migrations/migrateReset.js +1 -1
- package/dist/database/migrations/migrateReset.js.map +1 -0
- package/dist/database/migrations/migrateStatus.js +1 -1
- package/dist/database/migrations/migrateStatus.js.map +1 -0
- package/dist/database/migrations/migrationTemplate.js +1 -1
- package/dist/database/migrations/migrationTemplate.js.map +1 -0
- package/dist/database/migrations/migrationsCollection.js +1 -1
- package/dist/database/migrations/migrationsCollection.js.map +1 -0
- package/dist/database/migrations/readMigrationFiles.js +1 -1
- package/dist/database/migrations/readMigrationFiles.js.map +1 -0
- package/dist/database/queryValidation/types.js +1 -1
- package/dist/database/queryValidation/types.js.map +1 -0
- package/dist/database/queryValidation/validateQueryPaths.js +1 -1
- package/dist/database/queryValidation/validateQueryPaths.js.map +1 -0
- package/dist/database/queryValidation/validateSearchParams.js +1 -1
- package/dist/database/queryValidation/validateSearchParams.js.map +1 -0
- package/dist/database/types.js +1 -1
- package/dist/database/types.js.map +1 -0
- package/dist/email/build.js +1 -1
- package/dist/email/build.js.map +1 -0
- package/dist/email/defaults.js +1 -1
- package/dist/email/defaults.js.map +1 -0
- package/dist/email/mockHandler.js +1 -1
- package/dist/email/mockHandler.js.map +1 -0
- package/dist/email/sendEmail.js +1 -1
- package/dist/email/sendEmail.js.map +1 -0
- package/dist/email/types.js +1 -1
- package/dist/email/types.js.map +1 -0
- package/dist/errors/APIError.js +1 -1
- package/dist/errors/APIError.js.map +1 -0
- package/dist/errors/AuthenticationError.js +1 -1
- package/dist/errors/AuthenticationError.js.map +1 -0
- package/dist/errors/DuplicateCollection.js +1 -1
- package/dist/errors/DuplicateCollection.js.map +1 -0
- package/dist/errors/DuplicateFieldName.js +1 -1
- package/dist/errors/DuplicateFieldName.js.map +1 -0
- package/dist/errors/DuplicateGlobal.js +1 -1
- package/dist/errors/DuplicateGlobal.js.map +1 -0
- package/dist/errors/ErrorDeletingFile.js +1 -1
- package/dist/errors/ErrorDeletingFile.js.map +1 -0
- package/dist/errors/FileUploadError.js +1 -1
- package/dist/errors/FileUploadError.js.map +1 -0
- package/dist/errors/Forbidden.js +1 -1
- package/dist/errors/Forbidden.js.map +1 -0
- package/dist/errors/InvalidConfiguration.js +1 -1
- package/dist/errors/InvalidConfiguration.js.map +1 -0
- package/dist/errors/InvalidFieldName.js +1 -1
- package/dist/errors/InvalidFieldName.js.map +1 -0
- package/dist/errors/InvalidFieldRelationship.js +1 -1
- package/dist/errors/InvalidFieldRelationship.js.map +1 -0
- package/dist/errors/InvalidSchema.js +1 -1
- package/dist/errors/InvalidSchema.js.map +1 -0
- package/dist/errors/LockedAuth.js +1 -1
- package/dist/errors/LockedAuth.js.map +1 -0
- package/dist/errors/MissingCollectionLabel.js +1 -1
- package/dist/errors/MissingCollectionLabel.js.map +1 -0
- package/dist/errors/MissingFieldInputOptions.js +1 -1
- package/dist/errors/MissingFieldInputOptions.js.map +1 -0
- package/dist/errors/MissingFieldType.js +1 -1
- package/dist/errors/MissingFieldType.js.map +1 -0
- package/dist/errors/MissingFile.js +1 -1
- package/dist/errors/MissingFile.js.map +1 -0
- package/dist/errors/NotFound.js +1 -1
- package/dist/errors/NotFound.js.map +1 -0
- package/dist/errors/QueryError.js +1 -1
- package/dist/errors/QueryError.js.map +1 -0
- package/dist/errors/TimestampsRequired.js +1 -1
- package/dist/errors/TimestampsRequired.js.map +1 -0
- package/dist/errors/UnathorizedError.js +1 -1
- package/dist/errors/UnathorizedError.js.map +1 -0
- package/dist/errors/ValidationError.js +1 -1
- package/dist/errors/ValidationError.js.map +1 -0
- package/dist/errors/index.js +1 -1
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/types.js +1 -1
- package/dist/errors/types.js.map +1 -0
- package/dist/exports/auth.js +1 -1
- package/dist/exports/auth.js.map +1 -0
- package/dist/exports/components/utilities.js +1 -1
- package/dist/exports/components/utilities.js.map +1 -0
- package/dist/exports/config.js +1 -1
- package/dist/exports/config.js.map +1 -0
- package/dist/exports/database.js +1 -1
- package/dist/exports/database.js.map +1 -0
- package/dist/exports/errors.js +1 -1
- package/dist/exports/errors.js.map +1 -0
- package/dist/exports/fields/index.js +1 -1
- package/dist/exports/fields/index.js.map +1 -0
- package/dist/exports/fields/validations.js +1 -1
- package/dist/exports/fields/validations.js.map +1 -0
- package/dist/exports/operations.js +1 -1
- package/dist/exports/operations.js.map +1 -0
- package/dist/exports/types.js +1 -1
- package/dist/exports/types.js.map +1 -0
- package/dist/exports/utilities.js +1 -1
- package/dist/exports/utilities.js.map +1 -0
- package/dist/exports/versions.js +1 -1
- package/dist/exports/versions.js.map +1 -0
- package/dist/fields/baseFields/baseBlockFields.js +1 -1
- package/dist/fields/baseFields/baseBlockFields.js.map +1 -0
- package/dist/fields/baseFields/baseIDField.js +1 -1
- package/dist/fields/baseFields/baseIDField.js.map +1 -0
- package/dist/fields/config/sanitize.js +1 -1
- package/dist/fields/config/sanitize.js.map +1 -0
- package/dist/fields/config/sanitize.spec.js +1 -1
- package/dist/fields/config/sanitize.spec.js.map +1 -0
- package/dist/fields/config/schema.js +1 -1
- package/dist/fields/config/schema.js.map +1 -0
- package/dist/fields/config/types.js +1 -1
- package/dist/fields/config/types.js.map +1 -0
- package/dist/fields/getDefaultValue.js +1 -1
- package/dist/fields/getDefaultValue.js.map +1 -0
- package/dist/fields/hooks/afterChange/index.js +1 -1
- package/dist/fields/hooks/afterChange/index.js.map +1 -0
- package/dist/fields/hooks/afterChange/promise.js +1 -1
- package/dist/fields/hooks/afterChange/promise.js.map +1 -0
- package/dist/fields/hooks/afterChange/traverseFields.js +1 -1
- package/dist/fields/hooks/afterChange/traverseFields.js.map +1 -0
- package/dist/fields/hooks/afterRead/index.js +1 -1
- package/dist/fields/hooks/afterRead/index.js.map +1 -0
- package/dist/fields/hooks/afterRead/promise.js +1 -1
- package/dist/fields/hooks/afterRead/promise.js.map +1 -0
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js +1 -1
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js.map +1 -0
- package/dist/fields/hooks/afterRead/traverseFields.js +1 -1
- package/dist/fields/hooks/afterRead/traverseFields.js.map +1 -0
- package/dist/fields/hooks/beforeChange/cloneDataFromOriginalDoc.js +1 -1
- package/dist/fields/hooks/beforeChange/cloneDataFromOriginalDoc.js.map +1 -0
- package/dist/fields/hooks/beforeChange/getExistingRowDoc.js +1 -1
- package/dist/fields/hooks/beforeChange/getExistingRowDoc.js.map +1 -0
- package/dist/fields/hooks/beforeChange/index.js +1 -1
- package/dist/fields/hooks/beforeChange/index.js.map +1 -0
- package/dist/fields/hooks/beforeChange/promise.js +1 -1
- package/dist/fields/hooks/beforeChange/promise.js.map +1 -0
- package/dist/fields/hooks/beforeChange/traverseFields.js +1 -1
- package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -0
- package/dist/fields/hooks/beforeValidate/index.js +1 -1
- package/dist/fields/hooks/beforeValidate/index.js.map +1 -0
- package/dist/fields/hooks/beforeValidate/promise.js +1 -1
- package/dist/fields/hooks/beforeValidate/promise.js.map +1 -0
- package/dist/fields/hooks/beforeValidate/traverseFields.js +1 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.js.map +1 -0
- package/dist/fields/mergeBaseFields.js +1 -1
- package/dist/fields/mergeBaseFields.js.map +1 -0
- package/dist/fields/sortableFieldTypes.js +1 -1
- package/dist/fields/sortableFieldTypes.js.map +1 -0
- package/dist/fields/validations.js +1 -1
- package/dist/fields/validations.js.map +1 -0
- package/dist/fields/validations.spec.js +1 -1
- package/dist/fields/validations.spec.js.map +1 -0
- package/dist/globals/config/sanitize.js +1 -1
- package/dist/globals/config/sanitize.js.map +1 -0
- package/dist/globals/config/schema.js +1 -1
- package/dist/globals/config/schema.js.map +1 -0
- package/dist/globals/config/types.js +1 -1
- package/dist/globals/config/types.js.map +1 -0
- package/dist/globals/operations/docAccess.js +1 -1
- package/dist/globals/operations/docAccess.js.map +1 -0
- package/dist/globals/operations/findOne.js +1 -1
- package/dist/globals/operations/findOne.js.map +1 -0
- package/dist/globals/operations/findVersionByID.js +1 -1
- package/dist/globals/operations/findVersionByID.js.map +1 -0
- package/dist/globals/operations/findVersions.js +1 -1
- package/dist/globals/operations/findVersions.js.map +1 -0
- package/dist/globals/operations/local/findOne.js +1 -1
- package/dist/globals/operations/local/findOne.js.map +1 -0
- package/dist/globals/operations/local/findVersionByID.js +1 -1
- package/dist/globals/operations/local/findVersionByID.js.map +1 -0
- package/dist/globals/operations/local/findVersions.js +1 -1
- package/dist/globals/operations/local/findVersions.js.map +1 -0
- package/dist/globals/operations/local/index.js +1 -1
- package/dist/globals/operations/local/index.js.map +1 -0
- package/dist/globals/operations/local/restoreVersion.js +1 -1
- package/dist/globals/operations/local/restoreVersion.js.map +1 -0
- package/dist/globals/operations/local/update.js +1 -1
- package/dist/globals/operations/local/update.js.map +1 -0
- package/dist/globals/operations/restoreVersion.js +1 -1
- package/dist/globals/operations/restoreVersion.js.map +1 -0
- package/dist/globals/operations/update.js +1 -1
- package/dist/globals/operations/update.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -0
- package/dist/localization/middleware.js +1 -1
- package/dist/localization/middleware.js.map +1 -0
- package/dist/localization/sanitizeFallbackLocale.js +1 -1
- package/dist/localization/sanitizeFallbackLocale.js.map +1 -0
- package/dist/preferences/deleteUserPreferences.js +1 -1
- package/dist/preferences/deleteUserPreferences.js.map +1 -0
- package/dist/preferences/operations/delete.d.ts.map +1 -1
- package/dist/preferences/operations/delete.js +1 -2
- package/dist/preferences/operations/delete.js.map +1 -0
- package/dist/preferences/operations/findOne.js +1 -1
- package/dist/preferences/operations/findOne.js.map +1 -0
- package/dist/preferences/operations/update.js +1 -1
- package/dist/preferences/operations/update.js.map +1 -0
- package/dist/preferences/preferencesCollection.js +1 -1
- package/dist/preferences/preferencesCollection.js.map +1 -0
- package/dist/preferences/requestHandlers/delete.js +1 -1
- package/dist/preferences/requestHandlers/delete.js.map +1 -0
- package/dist/preferences/requestHandlers/findOne.js +1 -1
- package/dist/preferences/requestHandlers/findOne.js.map +1 -0
- package/dist/preferences/requestHandlers/update.js +1 -1
- package/dist/preferences/requestHandlers/update.js.map +1 -0
- package/dist/preferences/types.js +1 -1
- package/dist/preferences/types.js.map +1 -0
- package/dist/translations/extractTranslations.js +1 -1
- package/dist/translations/extractTranslations.js.map +1 -0
- package/dist/translations/getLocalI18n.js +1 -1
- package/dist/translations/getLocalI18n.js.map +1 -0
- package/dist/types/constants.js +1 -1
- package/dist/types/constants.js.map +1 -0
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -0
- package/dist/uploads/canResizeImage.js +1 -1
- package/dist/uploads/canResizeImage.js.map +1 -0
- package/dist/uploads/cropImage.js +1 -1
- package/dist/uploads/cropImage.js.map +1 -0
- package/dist/uploads/deleteAssociatedFiles.js +1 -1
- package/dist/uploads/deleteAssociatedFiles.js.map +1 -0
- package/dist/uploads/docWithFilenameExists.js +1 -1
- package/dist/uploads/docWithFilenameExists.js.map +1 -0
- package/dist/uploads/fileExists.js +1 -1
- package/dist/uploads/fileExists.js.map +1 -0
- package/dist/uploads/formatFilesize.js +1 -1
- package/dist/uploads/formatFilesize.js.map +1 -0
- package/dist/uploads/generateFileData.js +1 -1
- package/dist/uploads/generateFileData.js.map +1 -0
- package/dist/uploads/getBaseFields.js +1 -1
- package/dist/uploads/getBaseFields.js.map +1 -0
- package/dist/uploads/getExternalFile.js +1 -1
- package/dist/uploads/getExternalFile.js.map +1 -0
- package/dist/uploads/getFileByPath.js +1 -1
- package/dist/uploads/getFileByPath.js.map +1 -0
- package/dist/uploads/getImageSize.js +1 -1
- package/dist/uploads/getImageSize.js.map +1 -0
- package/dist/uploads/getSafeFilename.js +1 -1
- package/dist/uploads/getSafeFilename.js.map +1 -0
- package/dist/uploads/imageResizer.js +1 -1
- package/dist/uploads/imageResizer.js.map +1 -0
- package/dist/uploads/isImage.d.ts.map +1 -1
- package/dist/uploads/isImage.js +3 -2
- package/dist/uploads/isImage.js.map +1 -0
- package/dist/uploads/mimeTypeValidator.js +1 -1
- package/dist/uploads/mimeTypeValidator.js.map +1 -0
- package/dist/uploads/mimeTypeValidator.spec.js +1 -1
- package/dist/uploads/mimeTypeValidator.spec.js.map +1 -0
- package/dist/uploads/saveBufferToFile.js +1 -1
- package/dist/uploads/saveBufferToFile.js.map +1 -0
- package/dist/uploads/types.js +1 -1
- package/dist/uploads/types.js.map +1 -0
- package/dist/uploads/unlinkTempFiles.js +1 -1
- package/dist/uploads/unlinkTempFiles.js.map +1 -0
- package/dist/uploads/uploadFiles.js +1 -1
- package/dist/uploads/uploadFiles.js.map +1 -0
- package/dist/utilities/checkDuplicateCollections.js +1 -1
- package/dist/utilities/checkDuplicateCollections.js.map +1 -0
- package/dist/utilities/combineMerge.js +1 -1
- package/dist/utilities/combineMerge.js.map +1 -0
- package/dist/utilities/commitTransaction.js +1 -1
- package/dist/utilities/commitTransaction.js.map +1 -0
- package/dist/utilities/configToJSONSchema.js +1 -1
- package/dist/utilities/configToJSONSchema.js.map +1 -0
- package/dist/utilities/configToJSONSchema.spec.js +1 -1
- package/dist/utilities/configToJSONSchema.spec.js.map +1 -0
- package/dist/utilities/convertData.js +1 -1
- package/dist/utilities/convertData.js.map +1 -0
- package/dist/utilities/createArrayFromCommaDelineated.js +1 -1
- package/dist/utilities/createArrayFromCommaDelineated.js.map +1 -0
- package/dist/utilities/createLocalReq.js +1 -1
- package/dist/utilities/createLocalReq.js.map +1 -0
- package/dist/utilities/deepCopyObject.js +1 -1
- package/dist/utilities/deepCopyObject.js.map +1 -0
- package/dist/utilities/deepMerge.js +1 -1
- package/dist/utilities/deepMerge.js.map +1 -0
- package/dist/utilities/fieldSchemaToJSON.js +1 -1
- package/dist/utilities/fieldSchemaToJSON.js.map +1 -0
- package/dist/utilities/flattenTopLevelFields.js +1 -1
- package/dist/utilities/flattenTopLevelFields.js.map +1 -0
- package/dist/utilities/formatLabels.js +1 -1
- package/dist/utilities/formatLabels.js.map +1 -0
- package/dist/utilities/formatLabels.spec.js +1 -1
- package/dist/utilities/formatLabels.spec.js.map +1 -0
- package/dist/utilities/getCSSVariable.js +1 -1
- package/dist/utilities/getCSSVariable.js.map +1 -0
- package/dist/utilities/getCollectionIDFieldTypes.js +1 -1
- package/dist/utilities/getCollectionIDFieldTypes.js.map +1 -0
- package/dist/utilities/getEntityPolicies.js +1 -1
- package/dist/utilities/getEntityPolicies.js.map +1 -0
- package/dist/utilities/getIDType.js +1 -1
- package/dist/utilities/getIDType.js.map +1 -0
- package/dist/utilities/getObjectDotNotation.js +1 -1
- package/dist/utilities/getObjectDotNotation.js.map +1 -0
- package/dist/utilities/getUniqueListBy.js +1 -1
- package/dist/utilities/getUniqueListBy.js.map +1 -0
- package/dist/utilities/initTransaction.js +1 -1
- package/dist/utilities/initTransaction.js.map +1 -0
- package/dist/utilities/isEntityHidden.js +1 -1
- package/dist/utilities/isEntityHidden.js.map +1 -0
- package/dist/utilities/isNumber.js +1 -1
- package/dist/utilities/isNumber.js.map +1 -0
- package/dist/utilities/isPlainObject.js +1 -1
- package/dist/utilities/isPlainObject.js.map +1 -0
- package/dist/utilities/isValidID.js +1 -1
- package/dist/utilities/isValidID.js.map +1 -0
- package/dist/utilities/isolateObjectProperty.js +1 -1
- package/dist/utilities/isolateObjectProperty.js.map +1 -0
- package/dist/utilities/killTransaction.js +1 -1
- package/dist/utilities/killTransaction.js.map +1 -0
- package/dist/utilities/logger.js +1 -1
- package/dist/utilities/logger.js.map +1 -0
- package/dist/utilities/mapAsync.js +1 -1
- package/dist/utilities/mapAsync.js.map +1 -0
- package/dist/utilities/overwriteMerge.js +1 -1
- package/dist/utilities/overwriteMerge.js.map +1 -0
- package/dist/utilities/parseCookies.js +1 -1
- package/dist/utilities/parseCookies.js.map +1 -0
- package/dist/utilities/sanitizeInternalFields.js +1 -1
- package/dist/utilities/sanitizeInternalFields.js.map +1 -0
- package/dist/utilities/setsAreEqual.js +1 -1
- package/dist/utilities/setsAreEqual.js.map +1 -0
- package/dist/utilities/telemetry/events/adminInit.js +1 -1
- package/dist/utilities/telemetry/events/adminInit.js.map +1 -0
- package/dist/utilities/telemetry/events/serverInit.js +1 -1
- package/dist/utilities/telemetry/events/serverInit.js.map +1 -0
- package/dist/utilities/telemetry/index.js +1 -1
- package/dist/utilities/telemetry/index.js.map +1 -0
- package/dist/utilities/telemetry/oneWayHash.js +1 -1
- package/dist/utilities/telemetry/oneWayHash.js.map +1 -0
- package/dist/utilities/timestamp.js +1 -1
- package/dist/utilities/timestamp.js.map +1 -0
- package/dist/utilities/toKebabCase.js +1 -1
- package/dist/utilities/toKebabCase.js.map +1 -0
- package/dist/utilities/wait.js +1 -1
- package/dist/utilities/wait.js.map +1 -0
- package/dist/utilities/wordBoundariesRegex.js +1 -1
- package/dist/utilities/wordBoundariesRegex.js.map +1 -0
- package/dist/versions/baseFields.js +1 -1
- package/dist/versions/baseFields.js.map +1 -0
- package/dist/versions/buildCollectionFields.js +1 -1
- package/dist/versions/buildCollectionFields.js.map +1 -0
- package/dist/versions/buildGlobalFields.js +1 -1
- package/dist/versions/buildGlobalFields.js.map +1 -0
- package/dist/versions/deleteCollectionVersions.js +1 -1
- package/dist/versions/deleteCollectionVersions.js.map +1 -0
- package/dist/versions/drafts/appendVersionToQueryKey.js +1 -1
- package/dist/versions/drafts/appendVersionToQueryKey.js.map +1 -0
- package/dist/versions/drafts/getQueryDraftsSort.js +1 -1
- package/dist/versions/drafts/getQueryDraftsSort.js.map +1 -0
- package/dist/versions/drafts/replaceWithDraftIfAvailable.js +1 -1
- package/dist/versions/drafts/replaceWithDraftIfAvailable.js.map +1 -0
- package/dist/versions/enforceMaxVersions.js +1 -1
- package/dist/versions/enforceMaxVersions.js.map +1 -0
- package/dist/versions/getLatestCollectionVersion.js +1 -1
- package/dist/versions/getLatestCollectionVersion.js.map +1 -0
- package/dist/versions/getLatestGlobalVersion.js +1 -1
- package/dist/versions/getLatestGlobalVersion.js.map +1 -0
- package/dist/versions/getVersionsModelName.js +1 -1
- package/dist/versions/getVersionsModelName.js.map +1 -0
- package/dist/versions/saveVersion.js +1 -1
- package/dist/versions/saveVersion.js.map +1 -0
- package/dist/versions/types.js +1 -1
- package/dist/versions/types.js.map +1 -0
- package/errors.js +1 -1
- package/operations.js +1 -1
- package/package.json +2 -2
- package/types.js +1 -1
- package/utilities.js +1 -1
- package/versions.js +1 -1
|
@@ -32,4 +32,4 @@ async function getSafeFileName({ collectionSlug, desiredFilename, req, staticPat
|
|
|
32
32
|
}
|
|
33
33
|
export default getSafeFileName;
|
|
34
34
|
|
|
35
|
-
//# sourceMappingURL=
|
|
35
|
+
//# sourceMappingURL=getSafeFilename.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/getSafeFilename.ts"],"sourcesContent":["import sanitize from 'sanitize-filename'\n\nimport type { PayloadRequest } from '../types/index.js'\n\nimport docWithFilenameExists from './docWithFilenameExists.js'\nimport fileExists from './fileExists.js'\n\nconst incrementName = (name: string) => {\n const extension = name.split('.').pop()\n const baseFilename = sanitize(name.substring(0, name.lastIndexOf('.')) || name)\n let incrementedName = baseFilename\n const regex = /(.*)-(\\d+)$/\n const found = baseFilename.match(regex)\n if (found === null) {\n incrementedName += '-1'\n } else {\n const matchedName = found[1]\n const matchedNumber = found[2]\n const incremented = Number(matchedNumber) + 1\n incrementedName = `${matchedName}-${incremented}`\n }\n return `${incrementedName}.${extension}`\n}\n\ntype Args = {\n collectionSlug: string\n desiredFilename: string\n req: PayloadRequest\n staticPath: string\n}\n\nasync function getSafeFileName({\n collectionSlug,\n desiredFilename,\n req,\n staticPath,\n}: Args): Promise<string> {\n let modifiedFilename = desiredFilename\n\n // eslint-disable-next-line no-await-in-loop\n while (\n (await docWithFilenameExists({\n collectionSlug,\n filename: modifiedFilename,\n path: staticPath,\n req,\n })) ||\n (await fileExists(`${staticPath}/${modifiedFilename}`))\n ) {\n modifiedFilename = incrementName(modifiedFilename)\n }\n return modifiedFilename\n}\n\nexport default getSafeFileName\n"],"names":["sanitize","docWithFilenameExists","fileExists","incrementName","name","extension","split","pop","baseFilename","substring","lastIndexOf","incrementedName","regex","found","match","matchedName","matchedNumber","incremented","Number","getSafeFileName","collectionSlug","desiredFilename","req","staticPath","modifiedFilename","filename","path"],"mappings":"AAAA,OAAOA,cAAc,oBAAmB;AAIxC,OAAOC,2BAA2B,6BAA4B;AAC9D,OAAOC,gBAAgB,kBAAiB;AAExC,MAAMC,gBAAgB,CAACC;IACrB,MAAMC,YAAYD,KAAKE,KAAK,CAAC,KAAKC,GAAG;IACrC,MAAMC,eAAeR,SAASI,KAAKK,SAAS,CAAC,GAAGL,KAAKM,WAAW,CAAC,SAASN;IAC1E,IAAIO,kBAAkBH;IACtB,MAAMI,QAAQ;IACd,MAAMC,QAAQL,aAAaM,KAAK,CAACF;IACjC,IAAIC,UAAU,MAAM;QAClBF,mBAAmB;IACrB,OAAO;QACL,MAAMI,cAAcF,KAAK,CAAC,EAAE;QAC5B,MAAMG,gBAAgBH,KAAK,CAAC,EAAE;QAC9B,MAAMI,cAAcC,OAAOF,iBAAiB;QAC5CL,kBAAkB,CAAC,EAAEI,YAAY,CAAC,EAAEE,YAAY,CAAC;IACnD;IACA,OAAO,CAAC,EAAEN,gBAAgB,CAAC,EAAEN,UAAU,CAAC;AAC1C;AASA,eAAec,gBAAgB,EAC7BC,cAAc,EACdC,eAAe,EACfC,GAAG,EACHC,UAAU,EACL;IACL,IAAIC,mBAAmBH;IAEvB,4CAA4C;IAC5C,MACE,AAAC,MAAMpB,sBAAsB;QAC3BmB;QACAK,UAAUD;QACVE,MAAMH;QACND;IACF,MACC,MAAMpB,WAAW,CAAC,EAAEqB,WAAW,CAAC,EAAEC,iBAAiB,CAAC,EACrD;QACAA,mBAAmBrB,cAAcqB;IACnC;IACA,OAAOA;AACT;AAEA,eAAeL,gBAAe"}
|
|
@@ -236,4 +236,4 @@ import fileExists from './fileExists.js';
|
|
|
236
236
|
});
|
|
237
237
|
}
|
|
238
238
|
|
|
239
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91cGxvYWRzL2ltYWdlUmVzaXplci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE91dHB1dEluZm8gfSBmcm9tICdzaGFycCdcblxuaW1wb3J0IGZpbGVUeXBlIGZyb20gJ2ZpbGUtdHlwZSdcbmNvbnN0IHsgZnJvbUJ1ZmZlciB9ID0gZmlsZVR5cGVcblxuaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHNhbml0aXplIGZyb20gJ3Nhbml0aXplLWZpbGVuYW1lJ1xuXG5pbXBvcnQgdHlwZSB7IFNhbml0aXplZENvbGxlY3Rpb25Db25maWcgfSBmcm9tICcuLi9jb2xsZWN0aW9ucy9jb25maWcvdHlwZXMuanMnXG5pbXBvcnQgdHlwZSB7IFNoYXJwRGVwZW5kZW5jeSB9IGZyb20gJy4uL2NvbmZpZy90eXBlcy5qcydcbmltcG9ydCB0eXBlIHsgQ3VzdG9tUGF5bG9hZFJlcXVlc3QsIFBheWxvYWRSZXF1ZXN0LCBVcGxvYWRFZGl0cyB9IGZyb20gJy4uL3R5cGVzL2luZGV4LmpzJ1xuaW1wb3J0IHR5cGUgeyBGaWxlU2l6ZSwgRmlsZVNpemVzLCBGaWxlVG9TYXZlLCBJbWFnZVNpemUsIFByb2JlZEltYWdlU2l6ZSB9IGZyb20gJy4vdHlwZXMuanMnXG5cbmltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2lzTnVtYmVyLmpzJ1xuaW1wb3J0IGZpbGVFeGlzdHMgZnJvbSAnLi9maWxlRXhpc3RzLmpzJ1xuXG50eXBlIFJlc2l6ZUFyZ3MgPSB7XG4gIGNvbmZpZzogU2FuaXRpemVkQ29sbGVjdGlvbkNvbmZpZ1xuICBkaW1lbnNpb25zOiBQcm9iZWRJbWFnZVNpemVcbiAgZmlsZTogQ3VzdG9tUGF5bG9hZFJlcXVlc3RbJ2ZpbGUnXVxuICBtaW1lVHlwZTogc3RyaW5nXG4gIHJlcTogUGF5bG9hZFJlcXVlc3QgJiB7XG4gICAgcXVlcnk/OiB7XG4gICAgICB1cGxvYWRFZGl0cz86IFVwbG9hZEVkaXRzXG4gICAgfVxuICB9XG4gIHNhdmVkRmlsZW5hbWU6IHN0cmluZ1xuICBzaGFycDogU2hhcnBEZXBlbmRlbmN5XG4gIHN0YXRpY1BhdGg6IHN0cmluZ1xufVxuXG4vKiogUmVzdWx0IGZyb20gcmVzaXppbmcgYW5kIHRyYW5zZm9ybWluZyB0aGUgcmVxdWVzdGVkIGltYWdlIHNpemVzICovXG50eXBlIEltYWdlU2l6ZXNSZXN1bHQgPSB7XG4gIHNpemVEYXRhOiBGaWxlU2l6ZXNcbiAgc2l6ZXNUb1NhdmU6IEZpbGVUb1NhdmVbXVxufVxuXG50eXBlIFNhbml0aXplZEltYWdlRGF0YSA9IHtcbiAgZXh0OiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG59XG5cbi8qKlxuICogU2FuaXRpemUgdGhlIGltYWdlIG5hbWUgYW5kIGV4dHJhY3QgdGhlIGV4dGVuc2lvbiBmcm9tIHRoZSBzb3VyY2UgaW1hZ2VcbiAqXG4gKiBAcGFyYW0gc291cmNlSW1hZ2UgLSB0aGUgc291cmNlIGltYWdlXG4gKiBAcmV0dXJucyB0aGUgc2FuaXRpemVkIG5hbWUgYW5kIGV4dGVuc2lvblxuICovXG5jb25zdCBnZXRTYW5pdGl6ZWRJbWFnZURhdGEgPSAoc291cmNlSW1hZ2U6IHN0cmluZyk6IFNhbml0aXplZEltYWdlRGF0YSA9PiB7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IHNvdXJjZUltYWdlLnNwbGl0KCcuJykucG9wKClcbiAgY29uc3QgbmFtZSA9IHNhbml0aXplKHNvdXJjZUltYWdlLnN1YnN0cmluZygwLCBzb3VyY2VJbWFnZS5sYXN0SW5kZXhPZignLicpKSB8fCBzb3VyY2VJbWFnZSlcbiAgcmV0dXJuIHsgbmFtZSwgZXh0OiBleHRlbnNpb24gfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBpbWFnZSBuYW1lIGJhc2VkIG9uIHRoZSBvdXRwdXQgaW1hZ2UgbmFtZSwgdGhlIGRpbWVuc2lvbnMgYW5kXG4gKiB0aGUgZXh0ZW5zaW9uLlxuICpcbiAqIElnbm9yZSB0aGUgZmFjdCB0aGF0IGR1cGxpY2F0ZSBuYW1lcyBjb3VsZCBoYXBwZW4gaWYgdGhlIHRoZXJlIGlzIG9uZVxuICogc2l6ZSB3aXRoIGB3aWR0aCBBTkQgaGVpZ2h0YCBhbmQgb25lIHdpdGggb25seSBgaGVpZ2h0IE9SIHdpZHRoYC4gQmVjYXVzZVxuICogc3BhY2UgaXMgZXhwZW5zaXZlLCB3ZSB3aWxsIHJldXNlIHRoZSBzYW1lIGltYWdlIGZvciBib3RoIHNpemVzLlxuICpcbiAqIEBwYXJhbSBvdXRwdXRJbWFnZU5hbWUgLSB0aGUgc2FuaXRpemVkIGltYWdlIG5hbWVcbiAqIEBwYXJhbSBidWZmZXJJbmZvIC0gdGhlIGJ1ZmZlciBpbmZvXG4gKiBAcGFyYW0gZXh0ZW5zaW9uIC0gdGhlIGV4dGVuc2lvbiB0byB1c2VcbiAqIEByZXR1cm5zIHRoZSBuZXcgaW1hZ2UgbmFtZSB0aGF0IGlzIG5vdCB0YWtlblxuICovXG5jb25zdCBjcmVhdGVJbWFnZU5hbWUgPSAoXG4gIG91dHB1dEltYWdlTmFtZTogc3RyaW5nLFxuICB7IGhlaWdodCwgd2lkdGggfTogT3V0cHV0SW5mbyxcbiAgZXh0ZW5zaW9uOiBzdHJpbmcsXG4pID0+IGAke291dHB1dEltYWdlTmFtZX0tJHt3aWR0aH14JHtoZWlnaHR9LiR7ZXh0ZW5zaW9ufWBcblxuLyoqXG4gKiBDcmVhdGUgdGhlIHJlc3VsdCBvYmplY3QgZm9yIHRoZSBpbWFnZSByZXNpemUgb3BlcmF0aW9uIGJhc2VkIG9uIHRoZVxuICogcHJvdmlkZWQgcGFyYW1ldGVycy4gSWYgdGhlIG5hbWUgaXMgbm90IHByb3ZpZGVkLCBhbiBlbXB0eSByZXN1bHQgb2JqZWN0XG4gKiBpcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBpbWFnZVxuICogQHBhcmFtIGZpbGVuYW1lIC0gdGhlIGZpbGVuYW1lIG9mIHRoZSBpbWFnZVxuICogQHBhcmFtIHdpZHRoIC0gdGhlIHdpZHRoIG9mIHRoZSBpbWFnZVxuICogQHBhcmFtIGhlaWdodCAtIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlXG4gKiBAcGFyYW0gZmlsZXNpemUgLSB0aGUgZmlsZXNpemUgb2YgdGhlIGltYWdlXG4gKiBAcGFyYW0gbWltZVR5cGUgLSB0aGUgbWltZSB0eXBlIG9mIHRoZSBpbWFnZVxuICogQHBhcmFtIHNpemVzVG9TYXZlIC0gdGhlIHNpemVzIHRvIHNhdmVcbiAqIEByZXR1cm5zIHRoZSByZXN1bHQgb2JqZWN0XG4gKi9cbmNvbnN0IGNyZWF0ZVJlc3VsdCA9IChcbiAgbmFtZTogc3RyaW5nLFxuICBmaWxlbmFtZTogRmlsZVNpemVbJ2ZpbGVuYW1lJ10gPSBudWxsLFxuICB3aWR0aDogRmlsZVNpemVbJ3dpZHRoJ10gPSBudWxsLFxuICBoZWlnaHQ6IEZpbGVTaXplWydoZWlnaHQnXSA9IG51bGwsXG4gIGZpbGVzaXplOiBGaWxlU2l6ZVsnZmlsZXNpemUnXSA9IG51bGwsXG4gIG1pbWVUeXBlOiBGaWxlU2l6ZVsnbWltZVR5cGUnXSA9IG51bGwsXG4gIHNpemVzVG9TYXZlOiBGaWxlVG9TYXZlW10gPSBbXSxcbik6IEltYWdlU2l6ZXNSZXN1bHQgPT4gKHtcbiAgc2l6ZURhdGE6IHtcbiAgICBbbmFtZV06IHtcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgZmlsZXNpemUsXG4gICAgICBoZWlnaHQsXG4gICAgICBtaW1lVHlwZSxcbiAgICAgIHdpZHRoLFxuICAgIH0sXG4gIH0sXG4gIHNpemVzVG9TYXZlLFxufSlcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgaW1hZ2UgbmVlZHMgdG8gYmUgcmVzaXplZCBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZCBkaW1lbnNpb25zXG4gKiBhbmQgdGhlIG9yaWdpbmFsIGltYWdlIHNpemUuIElmIHRoZSByZXNpemUgb3B0aW9ucyB3aXRob3V0RW5sYXJnZW1lbnQgb3Igd2l0aG91dFJlZHVjdGlvbiBhcmUgcHJvdmlkZWQsXG4gKiB0aGUgaW1hZ2Ugd2lsbCBiZSByZXNpemVkIHJlZ2FyZGxlc3Mgb2YgdGhlIHJlcXVlc3RlZCBkaW1lbnNpb25zLCBnaXZlbiB0aGF0IHRoZVxuICogd2lkdGggb3IgaGVpZ2h0IHRvIGJlIHJlc2l6ZWQgaXMgcHJvdmlkZWQuXG4gKlxuICogQHBhcmFtIHJlc2l6ZUNvbmZpZyAtIG9iamVjdCBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQgZGltZW5zaW9ucyBhbmQgcmVzaXplIG9wdGlvbnNcbiAqIEBwYXJhbSBvcmlnaW5hbCAtIHRoZSBvcmlnaW5hbCBpbWFnZSBzaXplXG4gKiBAcmV0dXJucyB0cnVlIGlmIHJlc2l6aW5nIGlzIG5vdCBuZWVkZWQsIGZhbHNlIG90aGVyd2lzZVxuICovXG5jb25zdCBwcmV2ZW50UmVzaXplID0gKFxuICB7IGhlaWdodDogZGVzaXJlZEhlaWdodCwgd2lkdGg6IGRlc2lyZWRXaWR0aCwgd2l0aG91dEVubGFyZ2VtZW50LCB3aXRob3V0UmVkdWN0aW9uIH06IEltYWdlU2l6ZSxcbiAgb3JpZ2luYWw6IFByb2JlZEltYWdlU2l6ZSxcbik6IGJvb2xlYW4gPT4ge1xuICAvLyBkZWZhdWx0IGlzIHRvIGFsbG93IHJlZHVjdGlvblxuICBpZiAod2l0aG91dFJlZHVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlIC8vIG5lZWRzIHJlc2l6ZVxuICB9XG5cbiAgLy8gZGVmYXVsdCBpcyB0byBwcmV2ZW50IGVubGFyZ2VtZW50XG4gIGlmICh3aXRob3V0RW5sYXJnZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZSAvLyBuZWVkcyByZXNpemVcbiAgfVxuXG4gIGNvbnN0IGlzV2lkdGhPckhlaWdodE5vdERlZmluZWQgPSAhZGVzaXJlZEhlaWdodCB8fCAhZGVzaXJlZFdpZHRoXG4gIGlmIChpc1dpZHRoT3JIZWlnaHROb3REZWZpbmVkKSB7XG4gICAgLy8gSWYgd2lkdGggYW5kIGhlaWdodCBhcmUgbm90IGRlZmluZWQsIGl0IG1lYW5zIHRoZXJlIGlzIGEgZm9ybWF0IGNvbnZlcnNpb25cbiAgICAvLyBhbmQgdGhlIGltYWdlIG5lZWRzIHRvIGJlIFwicmVzaXplZFwiICh0cmFuc2Zvcm1lZCkuXG4gICAgcmV0dXJuIGZhbHNlIC8vIG5lZWRzIHJlc2l6ZVxuICB9XG5cbiAgY29uc3QgaGFzSW5zdWZmaWNpZW50V2lkdGggPSBkZXNpcmVkV2lkdGggPiBvcmlnaW5hbC53aWR0aFxuICBjb25zdCBoYXNJbnN1ZmZpY2llbnRIZWlnaHQgPSBkZXNpcmVkSGVpZ2h0ID4gb3JpZ2luYWwuaGVpZ2h0XG4gIGlmIChoYXNJbnN1ZmZpY2llbnRXaWR0aCAmJiBoYXNJbnN1ZmZpY2llbnRIZWlnaHQpIHtcbiAgICAvLyBkb2Vzbid0IG5lZWQgcmVzaXplIC0gcHJldmVudCBlbmxhcmdlbWVudC4gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgYm90aCB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBpbnN1ZmZpY2llbnQuXG4gICAgLy8gaWYgb25seSBvbmUgZGltZW5zaW9uIGlzIGluc3VmZmljaWVudCBhbmQgdGhlIG90aGVyIGlzIHN1ZmZpY2llbnQsIHJlc2l6aW5nIG5lZWRzIHRvIGhhcHBlbiwgYXMgdGhlIGltYWdlXG4gICAgLy8gc2hvdWxkIGJlIHJlc2l6ZWQgdG8gdGhlIHN1ZmZpY2llbnQgZGltZW5zaW9uLlxuICAgIHJldHVybiB0cnVlIC8vIGRvIG5vdCBjcmVhdGUgYSBuZXcgc2l6ZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlIC8vIG5lZWRzIHJlc2l6ZVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBpbWFnZSBzaG91bGQgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHNoYXJwIHdpdGhvdXQgcGF5bG9hZCBhZGp1c3RpbmcgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0gcmVzaXplQ29uZmlnIC0gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBkaW1lbnNpb25zIGFuZCByZXNpemUgb3B0aW9uc1xuICogQHBhcmFtIG9yaWdpbmFsIC0gdGhlIG9yaWdpbmFsIGltYWdlIHNpemVcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGltYWdlIHNob3VsZCBwYXNzZWQgZGlyZWN0bHkgdG8gc2hhcnBcbiAqL1xuY29uc3QgYXBwbHlQYXlsb2FkQWRqdXN0bWVudHMgPSAoXG4gIHsgZml0LCBoZWlnaHQsIHdpZHRoLCB3aXRob3V0RW5sYXJnZW1lbnQsIHdpdGhvdXRSZWR1Y3Rpb24gfTogSW1hZ2VTaXplLFxuICBvcmlnaW5hbDogUHJvYmVkSW1hZ2VTaXplLFxuKSA9PiB7XG4gIGlmIChmaXQgPT09ICdjb250YWluJyB8fCBmaXQgPT09ICdpbnNpZGUnKSByZXR1cm4gZmFsc2VcbiAgaWYgKCFpc051bWJlcihoZWlnaHQpICYmICFpc051bWJlcih3aWR0aCkpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHRhcmdldEFzcGVjdFJhdGlvID0gd2lkdGggLyBoZWlnaHRcbiAgY29uc3Qgb3JpZ2luYWxBc3BlY3RSYXRpbyA9IG9yaWdpbmFsLndpZHRoIC8gb3JpZ2luYWwuaGVpZ2h0XG4gIGlmIChvcmlnaW5hbEFzcGVjdFJhdGlvID09PSB0YXJnZXRBc3BlY3RSYXRpbykgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3Qgc2tpcEVubGFyZ2VtZW50ID0gd2l0aG91dEVubGFyZ2VtZW50ICYmIChvcmlnaW5hbC5oZWlnaHQgPCBoZWlnaHQgfHwgb3JpZ2luYWwud2lkdGggPCB3aWR0aClcbiAgY29uc3Qgc2tpcFJlZHVjdGlvbiA9IHdpdGhvdXRSZWR1Y3Rpb24gJiYgKG9yaWdpbmFsLmhlaWdodCA+IGhlaWdodCB8fCBvcmlnaW5hbC53aWR0aCA+IHdpZHRoKVxuICBpZiAoc2tpcEVubGFyZ2VtZW50IHx8IHNraXBSZWR1Y3Rpb24pIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogU2FuaXRpemUgdGhlIHJlc2l6ZSBjb25maWcuIElmIHRoZSByZXNpemUgY29uZmlnIGhhcyB0aGUgYHdpdGhvdXRSZWR1Y3Rpb25gXG4gKiBwcm9wZXJ0eSBzZXQgdG8gdHJ1ZSwgdGhlIGBmaXRgIGFuZCBgcG9zaXRpb25gIHByb3BlcnRpZXMgd2lsbCBiZSBzZXQgdG8gYGNvbnRhaW5gXG4gKiBhbmQgYHRvcCBsZWZ0YCByZXNwZWN0aXZlbHkuXG4gKlxuICogQHBhcmFtIHJlc2l6ZUNvbmZpZyAtIHRoZSByZXNpemUgY29uZmlnXG4gKiBAcmV0dXJucyBhIHNhbml0aXplZCByZXNpemUgY29uZmlnXG4gKi9cbmNvbnN0IHNhbml0aXplUmVzaXplQ29uZmlnID0gKHJlc2l6ZUNvbmZpZzogSW1hZ2VTaXplKTogSW1hZ2VTaXplID0+IHtcbiAgaWYgKHJlc2l6ZUNvbmZpZy53aXRob3V0UmVkdWN0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlc2l6ZUNvbmZpZyxcbiAgICAgIC8vIFdoeSBmaXQgYGNvbnRhaW5gIHNob3VsZCBhbHNvIGJlIHNldCB0byBodHRwczovL2dpdGh1Yi5jb20vbG92ZWxsL3NoYXJwL2lzc3Vlcy8zNTk1XG4gICAgICBmaXQ6IHJlc2l6ZUNvbmZpZz8uZml0IHx8ICdjb250YWluJyxcbiAgICAgIHBvc2l0aW9uOiByZXNpemVDb25maWc/LnBvc2l0aW9uIHx8ICdsZWZ0IHRvcCcsXG4gICAgfVxuICB9XG4gIHJldHVybiByZXNpemVDb25maWdcbn1cblxuLyoqXG4gKiBGb3IgdGhlIHByb3ZpZGVkIGltYWdlIHNpemVzLCBoYW5kbGUgdGhlIHJlc2l6aW5nIGFuZCB0aGUgdHJhbnNmb3Jtc1xuICogKGZvcm1hdCwgdHJpbSwgZXRjLikgb2YgZWFjaCByZXF1ZXN0ZWQgaW1hZ2Ugc2l6ZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQgb2JqZWN0LlxuICogVGhpcyBvbmx5IGhhbmRsZXMgdGhlIGltYWdlIHNpemVzLiBUaGUgdHJhbnNmb3JtcyBvZiB0aGUgb3JpZ2luYWwgaW1hZ2VcbiAqIGFyZSBoYW5kbGVkIGluIHtAbGluayAuL2dlbmVyYXRlRmlsZURhdGEudHN9LlxuICpcbiAqIFRoZSBpbWFnZSB3aWxsIGJlIHJlc2l6ZWQgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZFxuICogcmVzaXplIGNvbmZpZy4gSWYgbm8gaW1hZ2Ugc2l6ZXMgYXJlIHJlcXVlc3RlZCwgdGhlIHJlc29sdmVkIGRhdGEgd2lsbCBiZSBlbXB0eS5cbiAqIEZvciBldmVyeSBpbWFnZSB0aGF0IGRvcyBub3QgbmVlZCB0byBiZSByZXNpemVkLCBhbiByZXN1bHQgb2JqZWN0IHdpdGggYG51bGxgXG4gKiBwYXJhbWV0ZXJzIHdpbGwgYmUgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHJlc2l6ZUNvbmZpZyAtIHRoZSByZXNpemUgY29uZmlnXG4gKiBAcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSByZXNpemUgb3BlcmF0aW9uKHMpXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIHJlc2l6ZUFuZFRyYW5zZm9ybUltYWdlU2l6ZXMoe1xuICBjb25maWcsXG4gIGRpbWVuc2lvbnMsXG4gIGZpbGUsXG4gIG1pbWVUeXBlLFxuICByZXEsXG4gIHNhdmVkRmlsZW5hbWUsXG4gIHNoYXJwLFxuICBzdGF0aWNQYXRoLFxufTogUmVzaXplQXJncyk6IFByb21pc2U8SW1hZ2VTaXplc1Jlc3VsdD4ge1xuICBjb25zdCB7IGltYWdlU2l6ZXMgfSA9IGNvbmZpZy51cGxvYWRcbiAgLy8gTm90aW5nIHRvIHJlc2l6ZSBoZXJlIHNvIHJldHVybiBhcyBlYXJseSBhcyBwb3NzaWJsZVxuICBpZiAoIWltYWdlU2l6ZXMpIHJldHVybiB7IHNpemVEYXRhOiB7fSwgc2l6ZXNUb1NhdmU6IFtdIH1cblxuICBjb25zdCBzaGFycEJhc2UgPSBzaGFycChmaWxlLnRlbXBGaWxlUGF0aCB8fCBmaWxlLmRhdGEpLnJvdGF0ZSgpIC8vIHBhc3Mgcm90YXRlKCkgdG8gYXV0by1yb3RhdGUgYmFzZWQgb24gRVhJRiBkYXRhLiBodHRwczovL2dpdGh1Yi5jb20vcGF5bG9hZGNtcy9wYXlsb2FkL3B1bGwvMzA4MVxuXG4gIGNvbnN0IHJlc3VsdHM6IEltYWdlU2l6ZXNSZXN1bHRbXSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGltYWdlU2l6ZXMubWFwKGFzeW5jIChpbWFnZVJlc2l6ZUNvbmZpZyk6IFByb21pc2U8SW1hZ2VTaXplc1Jlc3VsdD4gPT4ge1xuICAgICAgaW1hZ2VSZXNpemVDb25maWcgPSBzYW5pdGl6ZVJlc2l6ZUNvbmZpZyhpbWFnZVJlc2l6ZUNvbmZpZylcblxuICAgICAgLy8gVGhpcyBjaGVja3MgaWYgYSByZXNpemUgc2hvdWxkIGhhcHBlbi4gSWYgbm90LCB0aGUgcmVzaXplZCBpbWFnZSB3aWxsIGJlXG4gICAgICAvLyBza2lwcGVkIENPTVBMRVRFTFkgYW5kIHRodXMgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBpbWFnZXMuXG4gICAgICAvLyBBbGwgZnVydGhlciBmb3JtYXQvdHJpbSBvcHRpb25zIHdpbGwgdGh1cyBiZSBza2lwcGVkIGFzIHdlbGwuXG4gICAgICBpZiAocHJldmVudFJlc2l6ZShpbWFnZVJlc2l6ZUNvbmZpZywgZGltZW5zaW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdChpbWFnZVJlc2l6ZUNvbmZpZy5uYW1lKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpbWFnZVRvUmVzaXplID0gc2hhcnBCYXNlLmNsb25lKClcbiAgICAgIGxldCByZXNpemVkID0gaW1hZ2VUb1Jlc2l6ZVxuXG4gICAgICBpZiAoXG4gICAgICAgIHJlcS5xdWVyeT8udXBsb2FkRWRpdHM/LmZvY2FsUG9pbnQgJiZcbiAgICAgICAgYXBwbHlQYXlsb2FkQWRqdXN0bWVudHMoaW1hZ2VSZXNpemVDb25maWcsIGRpbWVuc2lvbnMpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgeyBoZWlnaHQ6IHJlc2l6ZUhlaWdodCwgd2lkdGg6IHJlc2l6ZVdpZHRoIH0gPSBpbWFnZVJlc2l6ZUNvbmZpZ1xuICAgICAgICBjb25zdCByZXNpemVBc3BlY3RSYXRpbyA9IHJlc2l6ZVdpZHRoIC8gcmVzaXplSGVpZ2h0XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQXNwZWN0UmF0aW8gPSBkaW1lbnNpb25zLndpZHRoIC8gZGltZW5zaW9ucy5oZWlnaHRcbiAgICAgICAgY29uc3QgcHJpb3JpdGl6ZUhlaWdodCA9IHJlc2l6ZUFzcGVjdFJhdGlvIDwgb3JpZ2luYWxBc3BlY3RSYXRpb1xuXG4gICAgICAgIC8vIFNjYWxlIHRoZSBpbWFnZSB1cCBvciBkb3duIHRvIGZpdCB0aGUgcmVzaXplIGRpbWVuc2lvbnNcbiAgICAgICAgY29uc3Qgc2NhbGVkSW1hZ2UgPSBpbWFnZVRvUmVzaXplLnJlc2l6ZSh7XG4gICAgICAgICAgaGVpZ2h0OiBwcmlvcml0aXplSGVpZ2h0ID8gcmVzaXplSGVpZ2h0IDogbnVsbCxcbiAgICAgICAgICB3aWR0aDogcHJpb3JpdGl6ZUhlaWdodCA/IG51bGwgOiByZXNpemVXaWR0aCxcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgeyBpbmZvOiBzY2FsZWRJbWFnZUluZm8gfSA9IGF3YWl0IHNjYWxlZEltYWdlLnRvQnVmZmVyKHsgcmVzb2x2ZVdpdGhPYmplY3Q6IHRydWUgfSlcblxuICAgICAgICAvLyBGb2NhbCBwb2ludCBhZGp1c3RtZW50c1xuICAgICAgICBjb25zdCBmb2NhbFBvaW50ID0ge1xuICAgICAgICAgIHg6IGlzTnVtYmVyKHJlcS5xdWVyeS51cGxvYWRFZGl0cy5mb2NhbFBvaW50Py54KVxuICAgICAgICAgICAgPyByZXEucXVlcnkudXBsb2FkRWRpdHMuZm9jYWxQb2ludC54XG4gICAgICAgICAgICA6IDUwLFxuICAgICAgICAgIHk6IGlzTnVtYmVyKHJlcS5xdWVyeS51cGxvYWRFZGl0cy5mb2NhbFBvaW50Py55KVxuICAgICAgICAgICAgPyByZXEucXVlcnkudXBsb2FkRWRpdHMuZm9jYWxQb2ludC55XG4gICAgICAgICAgICA6IDUwLFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2FmZVJlc2l6ZVdpZHRoID0gcmVzaXplV2lkdGggPz8gc2NhbGVkSW1hZ2VJbmZvLndpZHRoXG4gICAgICAgIGNvbnN0IG1heE9mZnNldFggPSBzY2FsZWRJbWFnZUluZm8ud2lkdGggLSBzYWZlUmVzaXplV2lkdGhcbiAgICAgICAgY29uc3QgbGVmdEZvY2FsRWRnZSA9IE1hdGgucm91bmQoXG4gICAgICAgICAgc2NhbGVkSW1hZ2VJbmZvLndpZHRoICogKGZvY2FsUG9pbnQueCAvIDEwMCkgLSBzYWZlUmVzaXplV2lkdGggLyAyLFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHNhZmVPZmZzZXRYID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgbGVmdEZvY2FsRWRnZSksIG1heE9mZnNldFgpXG5cbiAgICAgICAgY29uc3Qgc2FmZVJlc2l6ZUhlaWdodCA9IHJlc2l6ZUhlaWdodCA/PyBzY2FsZWRJbWFnZUluZm8uaGVpZ2h0XG4gICAgICAgIGNvbnN0IG1heE9mZnNldFkgPSBzY2FsZWRJbWFnZUluZm8uaGVpZ2h0IC0gc2FmZVJlc2l6ZUhlaWdodFxuICAgICAgICBjb25zdCB0b3BGb2NhbEVkZ2UgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIHNjYWxlZEltYWdlSW5mby5oZWlnaHQgKiAoZm9jYWxQb2ludC55IC8gMTAwKSAtIHNhZmVSZXNpemVIZWlnaHQgLyAyLFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHNhZmVPZmZzZXRZID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgdG9wRm9jYWxFZGdlKSwgbWF4T2Zmc2V0WSlcblxuICAgICAgICAvLyBleHRyYWN0IHRoZSBmb2NhbCBhcmVhIGZyb20gdGhlIHNjYWxlZCBpbWFnZVxuICAgICAgICByZXNpemVkID0gc2NhbGVkSW1hZ2UuZXh0cmFjdCh7XG4gICAgICAgICAgaGVpZ2h0OiBzYWZlUmVzaXplSGVpZ2h0LFxuICAgICAgICAgIGxlZnQ6IHNhZmVPZmZzZXRYLFxuICAgICAgICAgIHRvcDogc2FmZU9mZnNldFksXG4gICAgICAgICAgd2lkdGg6IHNhZmVSZXNpemVXaWR0aCxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2l6ZWQgPSBpbWFnZVRvUmVzaXplLnJlc2l6ZShpbWFnZVJlc2l6ZUNvbmZpZylcbiAgICAgIH1cblxuICAgICAgaWYgKGltYWdlUmVzaXplQ29uZmlnLmZvcm1hdE9wdGlvbnMpIHtcbiAgICAgICAgcmVzaXplZCA9IHJlc2l6ZWQudG9Gb3JtYXQoXG4gICAgICAgICAgaW1hZ2VSZXNpemVDb25maWcuZm9ybWF0T3B0aW9ucy5mb3JtYXQsXG4gICAgICAgICAgaW1hZ2VSZXNpemVDb25maWcuZm9ybWF0T3B0aW9ucy5vcHRpb25zLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGlmIChpbWFnZVJlc2l6ZUNvbmZpZy50cmltT3B0aW9ucykge1xuICAgICAgICByZXNpemVkID0gcmVzaXplZC50cmltKGltYWdlUmVzaXplQ29uZmlnLnRyaW1PcHRpb25zKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGRhdGE6IGJ1ZmZlckRhdGEsIGluZm86IGJ1ZmZlckluZm8gfSA9IGF3YWl0IHJlc2l6ZWQudG9CdWZmZXIoe1xuICAgICAgICByZXNvbHZlV2l0aE9iamVjdDogdHJ1ZSxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHNhbml0aXplZEltYWdlID0gZ2V0U2FuaXRpemVkSW1hZ2VEYXRhKHNhdmVkRmlsZW5hbWUpXG5cbiAgICAgIHJlcS5wYXlsb2FkVXBsb2FkU2l6ZXNbaW1hZ2VSZXNpemVDb25maWcubmFtZV0gPSBidWZmZXJEYXRhXG5cbiAgICAgIGNvbnN0IG1pbWVJbmZvID0gYXdhaXQgZnJvbUJ1ZmZlcihidWZmZXJEYXRhKVxuXG4gICAgICBjb25zdCBpbWFnZU5hbWVXaXRoRGltZW5zaW9ucyA9IGNyZWF0ZUltYWdlTmFtZShcbiAgICAgICAgc2FuaXRpemVkSW1hZ2UubmFtZSxcbiAgICAgICAgYnVmZmVySW5mbyxcbiAgICAgICAgbWltZUluZm8/LmV4dCB8fCBzYW5pdGl6ZWRJbWFnZS5leHQsXG4gICAgICApXG5cbiAgICAgIGNvbnN0IGltYWdlUGF0aCA9IGAke3N0YXRpY1BhdGh9LyR7aW1hZ2VOYW1lV2l0aERpbWVuc2lvbnN9YFxuXG4gICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhpbWFnZVBhdGgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZnMudW5saW5rU3luYyhpbWFnZVBhdGgpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yZSB1bmxpbmsgZXJyb3JzXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBoZWlnaHQsIHNpemUsIHdpZHRoIH0gPSBidWZmZXJJbmZvXG4gICAgICByZXR1cm4gY3JlYXRlUmVzdWx0KFxuICAgICAgICBpbWFnZVJlc2l6ZUNvbmZpZy5uYW1lLFxuICAgICAgICBpbWFnZU5hbWVXaXRoRGltZW5zaW9ucyxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgbWltZUluZm8/Lm1pbWUgfHwgbWltZVR5cGUsXG4gICAgICAgIFt7IGJ1ZmZlcjogYnVmZmVyRGF0YSwgcGF0aDogaW1hZ2VQYXRoIH1dLFxuICAgICAgKVxuICAgIH0pLFxuICApXG5cbiAgcmV0dXJuIHJlc3VsdHMucmVkdWNlKFxuICAgIChhY2MsIHJlc3VsdCkgPT4ge1xuICAgICAgT2JqZWN0LmFzc2lnbihhY2Muc2l6ZURhdGEsIHJlc3VsdC5zaXplRGF0YSlcbiAgICAgIGFjYy5zaXplc1RvU2F2ZS5wdXNoKC4uLnJlc3VsdC5zaXplc1RvU2F2ZSlcbiAgICAgIHJldHVybiBhY2NcbiAgICB9LFxuICAgIHsgc2l6ZURhdGE6IHt9LCBzaXplc1RvU2F2ZTogW10gfSxcbiAgKVxufVxuIl0sIm5hbWVzIjpbImZpbGVUeXBlIiwiZnJvbUJ1ZmZlciIsImZzIiwic2FuaXRpemUiLCJpc051bWJlciIsImZpbGVFeGlzdHMiLCJnZXRTYW5pdGl6ZWRJbWFnZURhdGEiLCJzb3VyY2VJbWFnZSIsImV4dGVuc2lvbiIsInNwbGl0IiwicG9wIiwibmFtZSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiZXh0IiwiY3JlYXRlSW1hZ2VOYW1lIiwib3V0cHV0SW1hZ2VOYW1lIiwiaGVpZ2h0Iiwid2lkdGgiLCJjcmVhdGVSZXN1bHQiLCJmaWxlbmFtZSIsImZpbGVzaXplIiwibWltZVR5cGUiLCJzaXplc1RvU2F2ZSIsInNpemVEYXRhIiwicHJldmVudFJlc2l6ZSIsImRlc2lyZWRIZWlnaHQiLCJkZXNpcmVkV2lkdGgiLCJ3aXRob3V0RW5sYXJnZW1lbnQiLCJ3aXRob3V0UmVkdWN0aW9uIiwib3JpZ2luYWwiLCJ1bmRlZmluZWQiLCJpc1dpZHRoT3JIZWlnaHROb3REZWZpbmVkIiwiaGFzSW5zdWZmaWNpZW50V2lkdGgiLCJoYXNJbnN1ZmZpY2llbnRIZWlnaHQiLCJhcHBseVBheWxvYWRBZGp1c3RtZW50cyIsImZpdCIsInRhcmdldEFzcGVjdFJhdGlvIiwib3JpZ2luYWxBc3BlY3RSYXRpbyIsInNraXBFbmxhcmdlbWVudCIsInNraXBSZWR1Y3Rpb24iLCJzYW5pdGl6ZVJlc2l6ZUNvbmZpZyIsInJlc2l6ZUNvbmZpZyIsInBvc2l0aW9uIiwicmVzaXplQW5kVHJhbnNmb3JtSW1hZ2VTaXplcyIsImNvbmZpZyIsImRpbWVuc2lvbnMiLCJmaWxlIiwicmVxIiwic2F2ZWRGaWxlbmFtZSIsInNoYXJwIiwic3RhdGljUGF0aCIsImltYWdlU2l6ZXMiLCJ1cGxvYWQiLCJzaGFycEJhc2UiLCJ0ZW1wRmlsZVBhdGgiLCJkYXRhIiwicm90YXRlIiwicmVzdWx0cyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJpbWFnZVJlc2l6ZUNvbmZpZyIsImltYWdlVG9SZXNpemUiLCJjbG9uZSIsInJlc2l6ZWQiLCJxdWVyeSIsInVwbG9hZEVkaXRzIiwiZm9jYWxQb2ludCIsInJlc2l6ZUhlaWdodCIsInJlc2l6ZVdpZHRoIiwicmVzaXplQXNwZWN0UmF0aW8iLCJwcmlvcml0aXplSGVpZ2h0Iiwic2NhbGVkSW1hZ2UiLCJyZXNpemUiLCJpbmZvIiwic2NhbGVkSW1hZ2VJbmZvIiwidG9CdWZmZXIiLCJyZXNvbHZlV2l0aE9iamVjdCIsIngiLCJ5Iiwic2FmZVJlc2l6ZVdpZHRoIiwibWF4T2Zmc2V0WCIsImxlZnRGb2NhbEVkZ2UiLCJNYXRoIiwicm91bmQiLCJzYWZlT2Zmc2V0WCIsIm1pbiIsIm1heCIsInNhZmVSZXNpemVIZWlnaHQiLCJtYXhPZmZzZXRZIiwidG9wRm9jYWxFZGdlIiwic2FmZU9mZnNldFkiLCJleHRyYWN0IiwibGVmdCIsInRvcCIsImZvcm1hdE9wdGlvbnMiLCJ0b0Zvcm1hdCIsImZvcm1hdCIsIm9wdGlvbnMiLCJ0cmltT3B0aW9ucyIsInRyaW0iLCJidWZmZXJEYXRhIiwiYnVmZmVySW5mbyIsInNhbml0aXplZEltYWdlIiwicGF5bG9hZFVwbG9hZFNpemVzIiwibWltZUluZm8iLCJpbWFnZU5hbWVXaXRoRGltZW5zaW9ucyIsImltYWdlUGF0aCIsInVubGlua1N5bmMiLCJzaXplIiwibWltZSIsImJ1ZmZlciIsInBhdGgiLCJyZWR1Y2UiLCJhY2MiLCJyZXN1bHQiLCJPYmplY3QiLCJhc3NpZ24iLCJwdXNoIl0sIm1hcHBpbmdzIjoiQUFFQSxPQUFPQSxjQUFjLFlBQVc7QUFDaEMsTUFBTSxFQUFFQyxVQUFVLEVBQUUsR0FBR0Q7QUFFdkIsT0FBT0UsUUFBUSxLQUFJO0FBQ25CLE9BQU9DLGNBQWMsb0JBQW1CO0FBT3hDLFNBQVNDLFFBQVEsUUFBUSwyQkFBMEI7QUFDbkQsT0FBT0MsZ0JBQWdCLGtCQUFpQjtBQTRCeEM7Ozs7O0NBS0MsR0FDRCxNQUFNQyx3QkFBd0IsQ0FBQ0M7SUFDN0IsTUFBTUMsWUFBWUQsWUFBWUUsS0FBSyxDQUFDLEtBQUtDLEdBQUc7SUFDNUMsTUFBTUMsT0FBT1IsU0FBU0ksWUFBWUssU0FBUyxDQUFDLEdBQUdMLFlBQVlNLFdBQVcsQ0FBQyxTQUFTTjtJQUNoRixPQUFPO1FBQUVJO1FBQU1HLEtBQUtOO0lBQVU7QUFDaEM7QUFFQTs7Ozs7Ozs7Ozs7O0NBWUMsR0FDRCxNQUFNTyxrQkFBa0IsQ0FDdEJDLGlCQUNBLEVBQUVDLE1BQU0sRUFBRUMsS0FBSyxFQUFjLEVBQzdCVixZQUNHLENBQUMsRUFBRVEsZ0JBQWdC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
|
|
239
|
+
//# sourceMappingURL=imageResizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/imageResizer.ts"],"sourcesContent":["import type { OutputInfo } from 'sharp'\n\nimport fileType from 'file-type'\nconst { fromBuffer } = fileType\n\nimport fs from 'fs'\nimport sanitize from 'sanitize-filename'\n\nimport type { SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { SharpDependency } from '../config/types.js'\nimport type { CustomPayloadRequest, PayloadRequest, UploadEdits } from '../types/index.js'\nimport type { FileSize, FileSizes, FileToSave, ImageSize, ProbedImageSize } from './types.js'\n\nimport { isNumber } from '../utilities/isNumber.js'\nimport fileExists from './fileExists.js'\n\ntype ResizeArgs = {\n config: SanitizedCollectionConfig\n dimensions: ProbedImageSize\n file: CustomPayloadRequest['file']\n mimeType: string\n req: PayloadRequest & {\n query?: {\n uploadEdits?: UploadEdits\n }\n }\n savedFilename: string\n sharp: SharpDependency\n staticPath: string\n}\n\n/** Result from resizing and transforming the requested image sizes */\ntype ImageSizesResult = {\n sizeData: FileSizes\n sizesToSave: FileToSave[]\n}\n\ntype SanitizedImageData = {\n ext: string\n name: string\n}\n\n/**\n * Sanitize the image name and extract the extension from the source image\n *\n * @param sourceImage - the source image\n * @returns the sanitized name and extension\n */\nconst getSanitizedImageData = (sourceImage: string): SanitizedImageData => {\n const extension = sourceImage.split('.').pop()\n const name = sanitize(sourceImage.substring(0, sourceImage.lastIndexOf('.')) || sourceImage)\n return { name, ext: extension }\n}\n\n/**\n * Create a new image name based on the output image name, the dimensions and\n * the extension.\n *\n * Ignore the fact that duplicate names could happen if the there is one\n * size with `width AND height` and one with only `height OR width`. Because\n * space is expensive, we will reuse the same image for both sizes.\n *\n * @param outputImageName - the sanitized image name\n * @param bufferInfo - the buffer info\n * @param extension - the extension to use\n * @returns the new image name that is not taken\n */\nconst createImageName = (\n outputImageName: string,\n { height, width }: OutputInfo,\n extension: string,\n) => `${outputImageName}-${width}x${height}.${extension}`\n\n/**\n * Create the result object for the image resize operation based on the\n * provided parameters. If the name is not provided, an empty result object\n * is returned.\n *\n * @param name - the name of the image\n * @param filename - the filename of the image\n * @param width - the width of the image\n * @param height - the height of the image\n * @param filesize - the filesize of the image\n * @param mimeType - the mime type of the image\n * @param sizesToSave - the sizes to save\n * @returns the result object\n */\nconst createResult = (\n name: string,\n filename: FileSize['filename'] = null,\n width: FileSize['width'] = null,\n height: FileSize['height'] = null,\n filesize: FileSize['filesize'] = null,\n mimeType: FileSize['mimeType'] = null,\n sizesToSave: FileToSave[] = [],\n): ImageSizesResult => ({\n sizeData: {\n [name]: {\n filename,\n filesize,\n height,\n mimeType,\n width,\n },\n },\n sizesToSave,\n})\n\n/**\n * Check if the image needs to be resized according to the requested dimensions\n * and the original image size. If the resize options withoutEnlargement or withoutReduction are provided,\n * the image will be resized regardless of the requested dimensions, given that the\n * width or height to be resized is provided.\n *\n * @param resizeConfig - object containing the requested dimensions and resize options\n * @param original - the original image size\n * @returns true if resizing is not needed, false otherwise\n */\nconst preventResize = (\n { height: desiredHeight, width: desiredWidth, withoutEnlargement, withoutReduction }: ImageSize,\n original: ProbedImageSize,\n): boolean => {\n // default is to allow reduction\n if (withoutReduction !== undefined) {\n return false // needs resize\n }\n\n // default is to prevent enlargement\n if (withoutEnlargement !== undefined) {\n return false // needs resize\n }\n\n const isWidthOrHeightNotDefined = !desiredHeight || !desiredWidth\n if (isWidthOrHeightNotDefined) {\n // If width and height are not defined, it means there is a format conversion\n // and the image needs to be \"resized\" (transformed).\n return false // needs resize\n }\n\n const hasInsufficientWidth = desiredWidth > original.width\n const hasInsufficientHeight = desiredHeight > original.height\n if (hasInsufficientWidth && hasInsufficientHeight) {\n // doesn't need resize - prevent enlargement. This should only happen if both width and height are insufficient.\n // if only one dimension is insufficient and the other is sufficient, resizing needs to happen, as the image\n // should be resized to the sufficient dimension.\n return true // do not create a new size\n }\n\n return false // needs resize\n}\n\n/**\n * Check if the image should be passed directly to sharp without payload adjusting properties.\n *\n * @param resizeConfig - object containing the requested dimensions and resize options\n * @param original - the original image size\n * @returns true if the image should passed directly to sharp\n */\nconst applyPayloadAdjustments = (\n { fit, height, width, withoutEnlargement, withoutReduction }: ImageSize,\n original: ProbedImageSize,\n) => {\n if (fit === 'contain' || fit === 'inside') return false\n if (!isNumber(height) && !isNumber(width)) return false\n\n const targetAspectRatio = width / height\n const originalAspectRatio = original.width / original.height\n if (originalAspectRatio === targetAspectRatio) return false\n\n const skipEnlargement = withoutEnlargement && (original.height < height || original.width < width)\n const skipReduction = withoutReduction && (original.height > height || original.width > width)\n if (skipEnlargement || skipReduction) return false\n\n return true\n}\n\n/**\n * Sanitize the resize config. If the resize config has the `withoutReduction`\n * property set to true, the `fit` and `position` properties will be set to `contain`\n * and `top left` respectively.\n *\n * @param resizeConfig - the resize config\n * @returns a sanitized resize config\n */\nconst sanitizeResizeConfig = (resizeConfig: ImageSize): ImageSize => {\n if (resizeConfig.withoutReduction) {\n return {\n ...resizeConfig,\n // Why fit `contain` should also be set to https://github.com/lovell/sharp/issues/3595\n fit: resizeConfig?.fit || 'contain',\n position: resizeConfig?.position || 'left top',\n }\n }\n return resizeConfig\n}\n\n/**\n * For the provided image sizes, handle the resizing and the transforms\n * (format, trim, etc.) of each requested image size and return the result object.\n * This only handles the image sizes. The transforms of the original image\n * are handled in {@link ./generateFileData.ts}.\n *\n * The image will be resized according to the provided\n * resize config. If no image sizes are requested, the resolved data will be empty.\n * For every image that dos not need to be resized, an result object with `null`\n * parameters will be returned.\n *\n * @param resizeConfig - the resize config\n * @returns the result of the resize operation(s)\n */\nexport default async function resizeAndTransformImageSizes({\n config,\n dimensions,\n file,\n mimeType,\n req,\n savedFilename,\n sharp,\n staticPath,\n}: ResizeArgs): Promise<ImageSizesResult> {\n const { imageSizes } = config.upload\n // Noting to resize here so return as early as possible\n if (!imageSizes) return { sizeData: {}, sizesToSave: [] }\n\n const sharpBase = sharp(file.tempFilePath || file.data).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n\n const results: ImageSizesResult[] = await Promise.all(\n imageSizes.map(async (imageResizeConfig): Promise<ImageSizesResult> => {\n imageResizeConfig = sanitizeResizeConfig(imageResizeConfig)\n\n // This checks if a resize should happen. If not, the resized image will be\n // skipped COMPLETELY and thus will not be included in the resulting images.\n // All further format/trim options will thus be skipped as well.\n if (preventResize(imageResizeConfig, dimensions)) {\n return createResult(imageResizeConfig.name)\n }\n\n const imageToResize = sharpBase.clone()\n let resized = imageToResize\n\n if (\n req.query?.uploadEdits?.focalPoint &&\n applyPayloadAdjustments(imageResizeConfig, dimensions)\n ) {\n const { height: resizeHeight, width: resizeWidth } = imageResizeConfig\n const resizeAspectRatio = resizeWidth / resizeHeight\n const originalAspectRatio = dimensions.width / dimensions.height\n const prioritizeHeight = resizeAspectRatio < originalAspectRatio\n\n // Scale the image up or down to fit the resize dimensions\n const scaledImage = imageToResize.resize({\n height: prioritizeHeight ? resizeHeight : null,\n width: prioritizeHeight ? null : resizeWidth,\n })\n const { info: scaledImageInfo } = await scaledImage.toBuffer({ resolveWithObject: true })\n\n // Focal point adjustments\n const focalPoint = {\n x: isNumber(req.query.uploadEdits.focalPoint?.x)\n ? req.query.uploadEdits.focalPoint.x\n : 50,\n y: isNumber(req.query.uploadEdits.focalPoint?.y)\n ? req.query.uploadEdits.focalPoint.y\n : 50,\n }\n\n const safeResizeWidth = resizeWidth ?? scaledImageInfo.width\n const maxOffsetX = scaledImageInfo.width - safeResizeWidth\n const leftFocalEdge = Math.round(\n scaledImageInfo.width * (focalPoint.x / 100) - safeResizeWidth / 2,\n )\n const safeOffsetX = Math.min(Math.max(0, leftFocalEdge), maxOffsetX)\n\n const safeResizeHeight = resizeHeight ?? scaledImageInfo.height\n const maxOffsetY = scaledImageInfo.height - safeResizeHeight\n const topFocalEdge = Math.round(\n scaledImageInfo.height * (focalPoint.y / 100) - safeResizeHeight / 2,\n )\n const safeOffsetY = Math.min(Math.max(0, topFocalEdge), maxOffsetY)\n\n // extract the focal area from the scaled image\n resized = scaledImage.extract({\n height: safeResizeHeight,\n left: safeOffsetX,\n top: safeOffsetY,\n width: safeResizeWidth,\n })\n } else {\n resized = imageToResize.resize(imageResizeConfig)\n }\n\n if (imageResizeConfig.formatOptions) {\n resized = resized.toFormat(\n imageResizeConfig.formatOptions.format,\n imageResizeConfig.formatOptions.options,\n )\n }\n\n if (imageResizeConfig.trimOptions) {\n resized = resized.trim(imageResizeConfig.trimOptions)\n }\n\n const { data: bufferData, info: bufferInfo } = await resized.toBuffer({\n resolveWithObject: true,\n })\n\n const sanitizedImage = getSanitizedImageData(savedFilename)\n\n req.payloadUploadSizes[imageResizeConfig.name] = bufferData\n\n const mimeInfo = await fromBuffer(bufferData)\n\n const imageNameWithDimensions = createImageName(\n sanitizedImage.name,\n bufferInfo,\n mimeInfo?.ext || sanitizedImage.ext,\n )\n\n const imagePath = `${staticPath}/${imageNameWithDimensions}`\n\n if (await fileExists(imagePath)) {\n try {\n fs.unlinkSync(imagePath)\n } catch {\n // Ignore unlink errors\n }\n }\n\n const { height, size, width } = bufferInfo\n return createResult(\n imageResizeConfig.name,\n imageNameWithDimensions,\n width,\n height,\n size,\n mimeInfo?.mime || mimeType,\n [{ buffer: bufferData, path: imagePath }],\n )\n }),\n )\n\n return results.reduce(\n (acc, result) => {\n Object.assign(acc.sizeData, result.sizeData)\n acc.sizesToSave.push(...result.sizesToSave)\n return acc\n },\n { sizeData: {}, sizesToSave: [] },\n )\n}\n"],"names":["fileType","fromBuffer","fs","sanitize","isNumber","fileExists","getSanitizedImageData","sourceImage","extension","split","pop","name","substring","lastIndexOf","ext","createImageName","outputImageName","height","width","createResult","filename","filesize","mimeType","sizesToSave","sizeData","preventResize","desiredHeight","desiredWidth","withoutEnlargement","withoutReduction","original","undefined","isWidthOrHeightNotDefined","hasInsufficientWidth","hasInsufficientHeight","applyPayloadAdjustments","fit","targetAspectRatio","originalAspectRatio","skipEnlargement","skipReduction","sanitizeResizeConfig","resizeConfig","position","resizeAndTransformImageSizes","config","dimensions","file","req","savedFilename","sharp","staticPath","imageSizes","upload","sharpBase","tempFilePath","data","rotate","results","Promise","all","map","imageResizeConfig","imageToResize","clone","resized","query","uploadEdits","focalPoint","resizeHeight","resizeWidth","resizeAspectRatio","prioritizeHeight","scaledImage","resize","info","scaledImageInfo","toBuffer","resolveWithObject","x","y","safeResizeWidth","maxOffsetX","leftFocalEdge","Math","round","safeOffsetX","min","max","safeResizeHeight","maxOffsetY","topFocalEdge","safeOffsetY","extract","left","top","formatOptions","toFormat","format","options","trimOptions","trim","bufferData","bufferInfo","sanitizedImage","payloadUploadSizes","mimeInfo","imageNameWithDimensions","imagePath","unlinkSync","size","mime","buffer","path","reduce","acc","result","Object","assign","push"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isImage.d.ts","sourceRoot":"","sources":["../../src/uploads/isImage.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"isImage.d.ts","sourceRoot":"","sources":["../../src/uploads/isImage.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMzD"}
|
package/dist/uploads/isImage.js
CHANGED
|
@@ -4,8 +4,9 @@ export default function isImage(mimeType) {
|
|
|
4
4
|
'image/png',
|
|
5
5
|
'image/gif',
|
|
6
6
|
'image/svg+xml',
|
|
7
|
-
'image/webp'
|
|
7
|
+
'image/webp',
|
|
8
|
+
'image/avif'
|
|
8
9
|
].indexOf(mimeType) > -1;
|
|
9
10
|
}
|
|
10
11
|
|
|
11
|
-
//# sourceMappingURL=
|
|
12
|
+
//# sourceMappingURL=isImage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/isImage.ts"],"sourcesContent":["export default function isImage(mimeType: string): boolean {\n return (\n ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml', 'image/webp', 'image/avif'].indexOf(\n mimeType,\n ) > -1\n )\n}\n"],"names":["isImage","mimeType","indexOf"],"mappings":"AAAA,eAAe,SAASA,QAAQC,QAAgB;IAC9C,OACE;QAAC;QAAc;QAAa;QAAa;QAAiB;QAAc;KAAa,CAACC,OAAO,CAC3FD,YACE,CAAC;AAET"}
|
|
@@ -9,4 +9,4 @@ export const mimeTypeValidator = (mimeTypes)=>(val, { siblingData })=>{
|
|
|
9
9
|
return !cleanedMimeTypes.some((v)=>val.startsWith(v)) ? `Invalid file type: '${val}'` : true;
|
|
10
10
|
};
|
|
11
11
|
|
|
12
|
-
//# sourceMappingURL=
|
|
12
|
+
//# sourceMappingURL=mimeTypeValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/mimeTypeValidator.ts"],"sourcesContent":["import type { Validate } from '../fields/config/types.js'\n\nexport const mimeTypeValidator =\n (mimeTypes: string[]): Validate =>\n (val: string, { siblingData }) => {\n if (!siblingData.filename) {\n return true\n }\n\n if (!val) {\n return 'Invalid file type'\n }\n\n const cleanedMimeTypes = mimeTypes.map((v) => v.replace('*', ''))\n return !cleanedMimeTypes.some((v) => val.startsWith(v)) ? `Invalid file type: '${val}'` : true\n }\n"],"names":["mimeTypeValidator","mimeTypes","val","siblingData","filename","cleanedMimeTypes","map","v","replace","some","startsWith"],"mappings":"AAEA,OAAO,MAAMA,oBACX,CAACC,YACD,CAACC,KAAa,EAAEC,WAAW,EAAE;QAC3B,IAAI,CAACA,YAAYC,QAAQ,EAAE;YACzB,OAAO;QACT;QAEA,IAAI,CAACF,KAAK;YACR,OAAO;QACT;QAEA,MAAMG,mBAAmBJ,UAAUK,GAAG,CAAC,CAACC,IAAMA,EAAEC,OAAO,CAAC,KAAK;QAC7D,OAAO,CAACH,iBAAiBI,IAAI,CAAC,CAACF,IAAML,IAAIQ,UAAU,CAACH,MAAM,CAAC,oBAAoB,EAAEL,IAAI,CAAC,CAAC,GAAG;IAC5F,EAAC"}
|
|
@@ -80,4 +80,4 @@ describe('mimeTypeValidator', ()=>{
|
|
|
80
80
|
});
|
|
81
81
|
});
|
|
82
82
|
|
|
83
|
-
//# sourceMappingURL=
|
|
83
|
+
//# sourceMappingURL=mimeTypeValidator.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/mimeTypeValidator.spec.ts"],"sourcesContent":["import type { ValidateOptions } from '../fields/config/types'\n\nimport { mimeTypeValidator } from './mimeTypeValidator'\n\nconst options = { siblingData: { filename: 'file.xyz' } } as ValidateOptions<\n undefined,\n undefined,\n undefined\n>\n\ndescribe('mimeTypeValidator', () => {\n it('should validate single mimeType', () => {\n const mimeTypes = ['image/png']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('image/png', options)).toBe(true)\n })\n\n it('should validate multiple mimeTypes', () => {\n const mimeTypes = ['image/png', 'application/pdf']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('image/png', options)).toBe(true)\n expect(validate('application/pdf', options)).toBe(true)\n })\n\n it('should validate using wildcard', () => {\n const mimeTypes = ['image/*']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('image/png', options)).toBe(true)\n expect(validate('image/gif', options)).toBe(true)\n })\n\n it('should validate multiple wildcards', () => {\n const mimeTypes = ['image/*', 'audio/*']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('image/png', options)).toBe(true)\n expect(validate('audio/mpeg', options)).toBe(true)\n })\n\n it('should not validate when unmatched', () => {\n const mimeTypes = ['image/png']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('audio/mpeg', options)).toBe(\"Invalid file type: 'audio/mpeg'\")\n })\n\n it('should not validate when unmatched - multiple mimeTypes', () => {\n const mimeTypes = ['image/png', 'application/pdf']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('audio/mpeg', options)).toBe(\"Invalid file type: 'audio/mpeg'\")\n })\n\n it('should not validate using wildcard - unmatched', () => {\n const mimeTypes = ['image/*']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('audio/mpeg', options)).toBe(\"Invalid file type: 'audio/mpeg'\")\n })\n\n it('should not validate multiple wildcards - unmatched', () => {\n const mimeTypes = ['image/*', 'audio/*']\n const validate = mimeTypeValidator(mimeTypes)\n expect(validate('video/mp4', options)).toBe(\"Invalid file type: 'video/mp4'\")\n expect(validate('application/pdf', options)).toBe(\"Invalid file type: 'application/pdf'\")\n })\n\n it('should not error when mimeType is missing', () => {\n const mimeTypes = ['image/*', 'application/pdf']\n const validate = mimeTypeValidator(mimeTypes)\n let value\n expect(validate(value, options)).toBe('Invalid file type')\n })\n})\n"],"names":["mimeTypeValidator","options","siblingData","filename","describe","it","mimeTypes","validate","expect","toBe","value"],"mappings":"AAEA,SAASA,iBAAiB,QAAQ,sBAAqB;AAEvD,MAAMC,UAAU;IAAEC,aAAa;QAAEC,UAAU;IAAW;AAAE;AAMxDC,SAAS,qBAAqB;IAC5BC,GAAG,mCAAmC;QACpC,MAAMC,YAAY;YAAC;SAAY;QAC/B,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;IAC9C;IAEAJ,GAAG,sCAAsC;QACvC,MAAMC,YAAY;YAAC;YAAa;SAAkB;QAClD,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;QAC5CD,OAAOD,SAAS,mBAAmBN,UAAUQ,IAAI,CAAC;IACpD;IAEAJ,GAAG,kCAAkC;QACnC,MAAMC,YAAY;YAAC;SAAU;QAC7B,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;QAC5CD,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;IAC9C;IAEAJ,GAAG,sCAAsC;QACvC,MAAMC,YAAY;YAAC;YAAW;SAAU;QACxC,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;QAC5CD,OAAOD,SAAS,cAAcN,UAAUQ,IAAI,CAAC;IAC/C;IAEAJ,GAAG,sCAAsC;QACvC,MAAMC,YAAY;YAAC;SAAY;QAC/B,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,cAAcN,UAAUQ,IAAI,CAAC;IAC/C;IAEAJ,GAAG,2DAA2D;QAC5D,MAAMC,YAAY;YAAC;YAAa;SAAkB;QAClD,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,cAAcN,UAAUQ,IAAI,CAAC;IAC/C;IAEAJ,GAAG,kDAAkD;QACnD,MAAMC,YAAY;YAAC;SAAU;QAC7B,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,cAAcN,UAAUQ,IAAI,CAAC;IAC/C;IAEAJ,GAAG,sDAAsD;QACvD,MAAMC,YAAY;YAAC;YAAW;SAAU;QACxC,MAAMC,WAAWP,kBAAkBM;QACnCE,OAAOD,SAAS,aAAaN,UAAUQ,IAAI,CAAC;QAC5CD,OAAOD,SAAS,mBAAmBN,UAAUQ,IAAI,CAAC;IACpD;IAEAJ,GAAG,6CAA6C;QAC9C,MAAMC,YAAY;YAAC;YAAW;SAAkB;QAChD,MAAMC,WAAWP,kBAAkBM;QACnC,IAAII;QACJF,OAAOD,SAASG,OAAOT,UAAUQ,IAAI,CAAC;IACxC;AACF"}
|
|
@@ -17,4 +17,4 @@ import { Readable } from 'stream';
|
|
|
17
17
|
};
|
|
18
18
|
export default saveBufferToFile;
|
|
19
19
|
|
|
20
|
-
//# sourceMappingURL=
|
|
20
|
+
//# sourceMappingURL=saveBufferToFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/saveBufferToFile.ts"],"sourcesContent":["import fs from 'fs'\nimport { Readable } from 'stream'\n\n/**\n * Save buffer data to a file.\n * @param {Buffer} buffer - buffer to save to a file.\n * @param {string} filePath - path to a file.\n */\nconst saveBufferToFile = async (buffer: Buffer, filePath: string): Promise<void> => {\n // Setup readable stream from buffer.\n let streamData = buffer\n const readStream = new Readable()\n readStream._read = () => {\n readStream.push(streamData)\n streamData = null\n }\n // Setup file system writable stream.\n return fs.writeFileSync(filePath, buffer)\n}\n\nexport default saveBufferToFile\n"],"names":["fs","Readable","saveBufferToFile","buffer","filePath","streamData","readStream","_read","push","writeFileSync"],"mappings":"AAAA,OAAOA,QAAQ,KAAI;AACnB,SAASC,QAAQ,QAAQ,SAAQ;AAEjC;;;;CAIC,GACD,MAAMC,mBAAmB,OAAOC,QAAgBC;IAC9C,qCAAqC;IACrC,IAAIC,aAAaF;IACjB,MAAMG,aAAa,IAAIL;IACvBK,WAAWC,KAAK,GAAG;QACjBD,WAAWE,IAAI,CAACH;QAChBA,aAAa;IACf;IACA,qCAAqC;IACrC,OAAOL,GAAGS,aAAa,CAACL,UAAUD;AACpC;AAEA,eAAeD,iBAAgB"}
|
package/dist/uploads/types.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { };
|
|
2
2
|
|
|
3
|
-
//# sourceMappingURL=
|
|
3
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/types.ts"],"sourcesContent":["import type express from 'express'\nimport type serveStatic from 'serve-static'\nimport type { ResizeOptions, Sharp } from 'sharp'\n\nimport type { PayloadRequest } from '../types/index.js'\n\nexport type FileSize = {\n filename: null | string\n filesize: null | number\n height: null | number\n mimeType: null | string\n width: null | number\n}\n\nexport type FileSizes = {\n [size: string]: FileSize\n}\n\nexport type FileData = {\n filename: string\n filesize: number\n height: number\n mimeType: string\n sizes: FileSizes\n tempFilePath?: string\n url?: string\n width: number\n}\n\nexport type ProbedImageSize = {\n height: number\n width: number\n}\n\n/**\n * Params sent to the sharp toFormat() function\n * @link https://sharp.pixelplumbing.com/api-output#toformat\n */\nexport type ImageUploadFormatOptions = {\n format: Parameters<Sharp['toFormat']>[0]\n options?: Parameters<Sharp['toFormat']>[1]\n}\n\n/**\n * Params sent to the sharp trim() function\n * @link https://sharp.pixelplumbing.com/api-resize#trim\n */\nexport type ImageUploadTrimOptions = Parameters<Sharp['trim']>[0]\n\nexport type ImageSize = Omit<ResizeOptions, 'withoutEnlargement'> & {\n /**\n * @deprecated prefer position\n */\n crop?: string // comes from sharp package\n formatOptions?: ImageUploadFormatOptions\n name: string\n trimOptions?: ImageUploadTrimOptions\n /**\n * When an uploaded image is smaller than the defined image size, we have 3 options:\n *\n * `undefined | false | true`\n *\n * 1. `undefined` [default]: uploading images with smaller width AND height than the image size will return null\n * 2. `false`: always enlarge images to the image size\n * 3. `true`: if the image is smaller than the image size, return the original image\n */\n withoutEnlargement?: ResizeOptions['withoutEnlargement']\n}\n\nexport type GetAdminThumbnail = (args: { doc: Record<string, unknown> }) => false | null | string\n\nexport type UploadConfig = {\n /**\n * Represents an admin thumbnail, which can be either a React component or a string.\n * - If a string, it should be one of the image size names.\n * - If a React component, register a function that generates the thumbnail URL using the `useAdminThumbnail` hook.\n **/\n adminThumbnail?: React.ComponentType | string\n crop?: boolean\n disableLocalStorage?: boolean\n filesRequiredOnCreate?: boolean\n focalPoint?: boolean\n /** Options for original upload file only. For sizes, set each formatOptions individually. */\n formatOptions?: ImageUploadFormatOptions\n handlers?: ((\n req: PayloadRequest,\n args: { params: { collection: string; filename: string } },\n ) => Promise<Response> | Response)[]\n imageSizes?: ImageSize[]\n mimeTypes?: string[]\n resizeOptions?: ResizeOptions\n staticDir?: string\n staticOptions?: serveStatic.ServeStaticOptions<express.Response<any, Record<string, any>>>\n trimOptions?: ImageUploadTrimOptions\n}\n\nexport type SanitizedUploadConfig = UploadConfig & {\n staticDir: UploadConfig['staticDir']\n}\n\nexport type File = {\n data: Buffer\n mimetype: string\n name: string\n size: number\n}\n\nexport type FileToSave = {\n buffer: Buffer\n path: string\n}\n"],"names":[],"mappings":"AA2GA,WAGC"}
|
|
@@ -21,4 +21,4 @@ const unlinkFile = promisify(fs.unlink);
|
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
-
//# sourceMappingURL=
|
|
24
|
+
//# sourceMappingURL=unlinkTempFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/unlinkTempFiles.ts"],"sourcesContent":["import fs from 'fs'\nimport { promisify } from 'util'\n\nimport type { SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\n\nimport { mapAsync } from '../utilities/mapAsync.js'\n\nconst unlinkFile = promisify(fs.unlink)\n\ntype Args = {\n collectionConfig: SanitizedCollectionConfig\n config: SanitizedConfig\n req: PayloadRequest\n}\n/**\n * Cleanup temp files after operation lifecycle\n */\nexport const unlinkTempFiles: (args: Args) => Promise<void> = async ({\n collectionConfig,\n config,\n req,\n}) => {\n if (config.upload?.useTempFiles && collectionConfig.upload) {\n const { file } = req\n const fileArray = [{ file }]\n await mapAsync(fileArray, async ({ file }) => {\n // Still need this check because this will not be populated if using local API\n if (file?.tempFilePath) {\n await unlinkFile(file.tempFilePath)\n }\n })\n }\n}\n"],"names":["fs","promisify","mapAsync","unlinkFile","unlink","unlinkTempFiles","collectionConfig","config","req","upload","useTempFiles","file","fileArray","tempFilePath"],"mappings":"AAAA,OAAOA,QAAQ,KAAI;AACnB,SAASC,SAAS,QAAQ,OAAM;AAMhC,SAASC,QAAQ,QAAQ,2BAA0B;AAEnD,MAAMC,aAAaF,UAAUD,GAAGI,MAAM;AAOtC;;CAEC,GACD,OAAO,MAAMC,kBAAiD,OAAO,EACnEC,gBAAgB,EAChBC,MAAM,EACNC,GAAG,EACJ;IACC,IAAID,OAAOE,MAAM,EAAEC,gBAAgBJ,iBAAiBG,MAAM,EAAE;QAC1D,MAAM,EAAEE,IAAI,EAAE,GAAGH;QACjB,MAAMI,YAAY;YAAC;gBAAED;YAAK;SAAE;QAC5B,MAAMT,SAASU,WAAW,OAAO,EAAED,IAAI,EAAE;YACvC,8EAA8E;YAC9E,IAAIA,MAAME,cAAc;gBACtB,MAAMV,WAAWQ,KAAKE,YAAY;YACpC;QACF;IACF;AACF,EAAC"}
|
|
@@ -11,4 +11,4 @@ export const uploadFiles = async (payload, files, req)=>{
|
|
|
11
11
|
}
|
|
12
12
|
};
|
|
13
13
|
|
|
14
|
-
//# sourceMappingURL=
|
|
14
|
+
//# sourceMappingURL=uploadFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/uploadFiles.ts"],"sourcesContent":["import type { Payload } from '../index.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { FileToSave } from './types.js'\n\nimport { FileUploadError } from '../errors/index.js'\nimport saveBufferToFile from './saveBufferToFile.js'\n\nexport const uploadFiles = async (\n payload: Payload,\n files: FileToSave[],\n req: PayloadRequest,\n): Promise<void> => {\n try {\n await Promise.all(\n files.map(async ({ buffer, path }) => {\n await saveBufferToFile(buffer, path)\n }),\n )\n } catch (err) {\n payload.logger.error(err)\n throw new FileUploadError(req.t)\n }\n}\n"],"names":["FileUploadError","saveBufferToFile","uploadFiles","payload","files","req","Promise","all","map","buffer","path","err","logger","error","t"],"mappings":"AAIA,SAASA,eAAe,QAAQ,qBAAoB;AACpD,OAAOC,sBAAsB,wBAAuB;AAEpD,OAAO,MAAMC,cAAc,OACzBC,SACAC,OACAC;IAEA,IAAI;QACF,MAAMC,QAAQC,GAAG,CACfH,MAAMI,GAAG,CAAC,OAAO,EAAEC,MAAM,EAAEC,IAAI,EAAE;YAC/B,MAAMT,iBAAiBQ,QAAQC;QACjC;IAEJ,EAAE,OAAOC,KAAK;QACZR,QAAQS,MAAM,CAACC,KAAK,CAACF;QACrB,MAAM,IAAIX,gBAAgBK,IAAIS,CAAC;IACjC;AACF,EAAC"}
|
|
@@ -8,4 +8,4 @@ const checkDuplicateCollections = (collections)=>{
|
|
|
8
8
|
};
|
|
9
9
|
export default checkDuplicateCollections;
|
|
10
10
|
|
|
11
|
-
//# sourceMappingURL=
|
|
11
|
+
//# sourceMappingURL=checkDuplicateCollections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/checkDuplicateCollections.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../collections/config/types.js'\n\nimport DuplicateCollection from '../errors/DuplicateCollection.js'\n\nconst getDuplicates = (arr: string[]) => arr.filter((item, index) => arr.indexOf(item) !== index)\n\nconst checkDuplicateCollections = (collections: SanitizedCollectionConfig[]): void => {\n const duplicateSlugs = getDuplicates(collections.map((c) => c.slug))\n if (duplicateSlugs.length > 0) {\n throw new DuplicateCollection('slug', duplicateSlugs)\n }\n}\n\nexport default checkDuplicateCollections\n"],"names":["DuplicateCollection","getDuplicates","arr","filter","item","index","indexOf","checkDuplicateCollections","collections","duplicateSlugs","map","c","slug","length"],"mappings":"AAEA,OAAOA,yBAAyB,mCAAkC;AAElE,MAAMC,gBAAgB,CAACC,MAAkBA,IAAIC,MAAM,CAAC,CAACC,MAAMC,QAAUH,IAAII,OAAO,CAACF,UAAUC;AAE3F,MAAME,4BAA4B,CAACC;IACjC,MAAMC,iBAAiBR,cAAcO,YAAYE,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI;IAClE,IAAIH,eAAeI,MAAM,GAAG,GAAG;QAC7B,MAAM,IAAIb,oBAAoB,QAAQS;IACxC;AACF;AAEA,eAAeF,0BAAyB"}
|
|
@@ -13,4 +13,4 @@ export const combineMerge = (target, source, options)=>{
|
|
|
13
13
|
return destination;
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
-
//# sourceMappingURL=
|
|
16
|
+
//# sourceMappingURL=combineMerge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/combineMerge.ts"],"sourcesContent":["import merge from 'deepmerge'\n\nexport const combineMerge = (target, source, options) => {\n const destination = target.slice()\n\n source.forEach((item, index) => {\n if (typeof destination[index] === 'undefined') {\n destination[index] = options.cloneUnlessOtherwiseSpecified(item, options)\n } else if (options.isMergeableObject(item)) {\n destination[index] = merge(target[index], item, options)\n } else if (target.indexOf(item) === -1) {\n destination.push(item)\n }\n })\n return destination\n}\n"],"names":["merge","combineMerge","target","source","options","destination","slice","forEach","item","index","cloneUnlessOtherwiseSpecified","isMergeableObject","indexOf","push"],"mappings":"AAAA,OAAOA,WAAW,YAAW;AAE7B,OAAO,MAAMC,eAAe,CAACC,QAAQC,QAAQC;IAC3C,MAAMC,cAAcH,OAAOI,KAAK;IAEhCH,OAAOI,OAAO,CAAC,CAACC,MAAMC;QACpB,IAAI,OAAOJ,WAAW,CAACI,MAAM,KAAK,aAAa;YAC7CJ,WAAW,CAACI,MAAM,GAAGL,QAAQM,6BAA6B,CAACF,MAAMJ;QACnE,OAAO,IAAIA,QAAQO,iBAAiB,CAACH,OAAO;YAC1CH,WAAW,CAACI,MAAM,GAAGT,MAAME,MAAM,CAACO,MAAM,EAAED,MAAMJ;QAClD,OAAO,IAAIF,OAAOU,OAAO,CAACJ,UAAU,CAAC,GAAG;YACtCH,YAAYQ,IAAI,CAACL;QACnB;IACF;IACA,OAAOH;AACT,EAAC"}
|
|
@@ -6,4 +6,4 @@
|
|
|
6
6
|
delete req.transactionID;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
//# sourceMappingURL=
|
|
9
|
+
//# sourceMappingURL=commitTransaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/commitTransaction.ts"],"sourcesContent":["import type { PayloadRequest } from '../types/index.js'\n\n/**\n * complete a transaction calling adapter db.commitTransaction and delete the transactionID from req\n */\nexport async function commitTransaction(req: PayloadRequest): Promise<void> {\n const { payload, transactionID } = req\n\n await payload.db.commitTransaction(transactionID)\n delete req.transactionID\n}\n"],"names":["commitTransaction","req","payload","transactionID","db"],"mappings":"AAEA;;CAEC,GACD,OAAO,eAAeA,kBAAkBC,GAAmB;IACzD,MAAM,EAAEC,OAAO,EAAEC,aAAa,EAAE,GAAGF;IAEnC,MAAMC,QAAQE,EAAE,CAACJ,iBAAiB,CAACG;IACnC,OAAOF,IAAIE,aAAa;AAC1B"}
|
|
@@ -499,4 +499,4 @@ export function entityToJSONSchema(config, incomingEntity, interfaceNameDefiniti
|
|
|
499
499
|
};
|
|
500
500
|
}
|
|
501
501
|
|
|
502
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvY29uZmlnVG9KU09OU2NoZW1hLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgSlNPTlNjaGVtYTQsIEpTT05TY2hlbWE0VHlwZU5hbWUgfSBmcm9tICdqc29uLXNjaGVtYSdcblxuaW1wb3J0IHBsdXJhbGl6ZSBmcm9tICdwbHVyYWxpemUnXG5jb25zdCB7IHNpbmd1bGFyIH0gPSBwbHVyYWxpemVcblxuaW1wb3J0IHR5cGUgeyBTYW5pdGl6ZWRDb2xsZWN0aW9uQ29uZmlnIH0gZnJvbSAnLi4vY29sbGVjdGlvbnMvY29uZmlnL3R5cGVzLmpzJ1xuaW1wb3J0IHR5cGUgeyBTYW5pdGl6ZWRDb25maWcgfSBmcm9tICcuLi9jb25maWcvdHlwZXMuanMnXG5pbXBvcnQgdHlwZSB7IEZpZWxkLCBGaWVsZEFmZmVjdGluZ0RhdGEsIE9wdGlvbiB9IGZyb20gJy4uL2ZpZWxkcy9jb25maWcvdHlwZXMuanMnXG5pbXBvcnQgdHlwZSB7IFNhbml0aXplZEdsb2JhbENvbmZpZyB9IGZyb20gJy4uL2dsb2JhbHMvY29uZmlnL3R5cGVzLmpzJ1xuXG5pbXBvcnQgeyBmaWVsZEFmZmVjdHNEYXRhLCB0YWJIYXNOYW1lIH0gZnJvbSAnLi4vZmllbGRzL2NvbmZpZy90eXBlcy5qcydcbmltcG9ydCB7IGRlZXBDb3B5T2JqZWN0IH0gZnJvbSAnLi9kZWVwQ29weU9iamVjdC5qcydcbmltcG9ydCB7IHRvV29yZHMgfSBmcm9tICcuL2Zvcm1hdExhYmVscy5qcydcbmltcG9ydCB7IGdldENvbGxlY3Rpb25JREZpZWxkVHlwZXMgfSBmcm9tICcuL2dldENvbGxlY3Rpb25JREZpZWxkVHlwZXMuanMnXG5cbmNvbnN0IGZpZWxkSXNSZXF1aXJlZCA9IChmaWVsZDogRmllbGQpID0+IHtcbiAgY29uc3QgaXNDb25kaXRpb25hbCA9IEJvb2xlYW4oZmllbGQ/LmFkbWluICYmIGZpZWxkPy5hZG1pbj8uY29uZGl0aW9uKVxuICBpZiAoaXNDb25kaXRpb25hbCkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgaXNNYXJrZWRSZXF1aXJlZCA9ICdyZXF1aXJlZCcgaW4gZmllbGQgJiYgZmllbGQucmVxdWlyZWQgPT09IHRydWVcbiAgaWYgKGZpZWxkQWZmZWN0c0RhdGEoZmllbGQpICYmIGlzTWFya2VkUmVxdWlyZWQpIHJldHVybiB0cnVlXG5cbiAgLy8gaWYgYW55IHN1YmZpZWxkcyBhcmUgcmVxdWlyZWQsIHRoaXMgZmllbGQgaXMgcmVxdWlyZWRcbiAgaWYgKCdmaWVsZHMnIGluIGZpZWxkICYmIGZpZWxkLnR5cGUgIT09ICdhcnJheScpIHtcbiAgICByZXR1cm4gZmllbGQuZmllbGRzLnNvbWUoKHN1YkZpZWxkKSA9PiBmaWVsZElzUmVxdWlyZWQoc3ViRmllbGQpKVxuICB9XG5cbiAgLy8gaWYgYW55IHRhYiBzdWJmaWVsZHMgaGF2ZSByZXF1aXJlZCBmaWVsZHMsIHRoaXMgZmllbGQgaXMgcmVxdWlyZWRcbiAgaWYgKGZpZWxkLnR5cGUgPT09ICd0YWJzJykge1xuICAgIHJldHVybiBmaWVsZC50YWJzLnNvbWUoKHRhYikgPT4ge1xuICAgICAgaWYgKCduYW1lJyBpbiB0YWIpIHtcbiAgICAgICAgcmV0dXJuIHRhYi5maWVsZHMuc29tZSgoc3ViRmllbGQpID0+IGZpZWxkSXNSZXF1aXJlZChzdWJGaWVsZCkpXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGJ1aWxkT3B0aW9uRW51bXMob3B0aW9uczogT3B0aW9uW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBvcHRpb25zLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnICYmICd2YWx1ZScgaW4gb3B0aW9uKSB7XG4gICAgICByZXR1cm4gb3B0aW9uLnZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvblxuICB9KVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVudGl0eVNjaGVtYXMoXG4gIGVudGl0aWVzOiAoU2FuaXRpemVkQ29sbGVjdGlvbkNvbmZpZyB8IFNhbml0aXplZEdsb2JhbENvbmZpZylbXSxcbik6IEpTT05TY2hlbWE0IHtcbiAgY29uc3QgcHJvcGVydGllcyA9IFsuLi5lbnRpdGllc10ucmVkdWNlKChhY2MsIHsgc2x1ZyB9KSA9PiB7XG4gICAgYWNjW3NsdWddID0ge1xuICAgICAgJHJlZjogYCMvZGVmaW5pdGlvbnMvJHtzbHVnfWAsXG4gICAgfVxuXG4gICAgcmV0dXJuIGFjY1xuICB9LCB7fSlcblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdvYmplY3QnLFxuICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICBwcm9wZXJ0aWVzLFxuICAgIHJlcXVpcmVkOiBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKSxcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBKU09OIFNjaGVtYSBUeXBlIHdpdGggJ251bGwnIGFkZGVkIGlmIHRoZSBmaWVsZCBpcyBub3QgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoTnVsbGFibGVKU09OU2NoZW1hVHlwZShcbiAgZmllbGRUeXBlOiBKU09OU2NoZW1hNFR5cGVOYW1lLFxuICBpc1JlcXVpcmVkOiBib29sZWFuLFxuKTogSlNPTlNjaGVtYTRUeXBlTmFtZSB8IEpTT05TY2hlbWE0VHlwZU5hbWVbXSB7XG4gIGNvbnN0IGZpZWxkVHlwZXMgPSBbZmllbGRUeXBlXVxuICBpZiAoaXNSZXF1aXJlZCkgcmV0dXJuIGZpZWxkVHlwZVxuICBmaWVsZFR5cGVzLnB1c2goJ251bGwnKVxuICByZXR1cm4gZmllbGRUeXBlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmllbGRzVG9KU09OU2NoZW1hKFxuICAvKipcbiAgICogVXNlZCBmb3IgcmVsYXRpb25zaGlwIGZpZWxkcywgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gdXNlIGEgc3RyaW5nIG9yIG51bWJlciB0eXBlIGZvciB0aGUgSUQuXG4gICAqIFdoaWxlIHRoZXJlIGlzIGEgZGVmYXVsdCBJRCBmaWVsZCB0eXBlIHNldCBieSB0aGUgZGIgYWRhcHRlciwgdGhleSBjYW4gZGlmZmVyIG9uIGEgY29sbGVjdGlvbi1sZXZlbFxuICAgKiBpZiB0aGV5IGhhdmUgY3VzdG9tIElEIGZpZWxkcy5cbiAgICovXG4gIGNvbGxlY3Rpb25JREZpZWxkVHlwZXM6IHsgW2tleTogc3RyaW5nXTogJ251bWJlcicgfCAnc3RyaW5nJyB9LFxuICBmaWVsZHM6IEZpZWxkW10sXG4gIC8qKlxuICAgKiBBbGxvd3MgeW91IHRvIGRlZmluZSBuZXcgdG9wLWxldmVsIGludGVyZmFjZXMgdGhhdCBjYW4gYmUgcmUtdXNlZCBpbiB0aGUgb3V0cHV0IHNjaGVtYS5cbiAgICovXG4gIGludGVyZmFjZU5hbWVEZWZpbml0aW9uczogTWFwPHN0cmluZywgSlNPTlNjaGVtYTQ+LFxuICBjb25maWc/OiBTYW5pdGl6ZWRDb25maWcsXG4pOiB7XG4gIHByb3BlcnRpZXM6IHtcbiAgICBbazogc3RyaW5nXTogSlNPTlNjaGVtYTRcbiAgfVxuICByZXF1aXJlZDogc3RyaW5nW11cbn0ge1xuICBjb25zdCByZXF1aXJlZEZpZWxkTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gIHJldHVybiB7XG4gICAgcHJvcGVydGllczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgZmllbGRzLnJlZHVjZSgoZmllbGRTY2hlbWFzLCBmaWVsZCkgPT4ge1xuICAgICAgICBjb25zdCBpc1JlcXVpcmVkID0gZmllbGRBZmZlY3RzRGF0YShmaWVsZCkgJiYgZmllbGRJc1JlcXVpcmVkKGZpZWxkKVxuICAgICAgICBpZiAoaXNSZXF1aXJlZCkgcmVxdWlyZWRGaWVsZE5hbWVzLmFkZChmaWVsZC5uYW1lKVxuXG4gICAgICAgIGxldCBmaWVsZFNjaGVtYTogSlNPTlNjaGVtYTRcbiAgICAgICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgICAgICBpZiAoZmllbGQuaGFzTWFueSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBmaWVsZFNjaGVtYSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB3aXRoTnVsbGFibGVKU09OU2NoZW1hVHlwZSgnYXJyYXknLCBpc1JlcXVpcmVkKSxcbiAgICAgICAgICAgICAgICBpdGVtczogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmaWVsZFNjaGVtYSA9IHsgdHlwZTogd2l0aE51bGxhYmxlSlNPTlNjaGVtYVR5cGUoJ3N0cmluZycsIGlzUmVxdWlyZWQpIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgICAgIGNhc2UgJ2NvZGUnOlxuICAgICAgICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgICAgICBjYXNlICdkYXRlJzoge1xuICAgICAgICAgICAgZmllbGRTY2hlbWEgPSB7IHR5cGU6IHdpdGhOdWxsYWJsZUpTT05TY2hlbWFUeXBlKCdzdHJpbmcnLCBpc1JlcXVpcmVkKSB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgICAgIGlmIChmaWVsZC5oYXNNYW55ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIGZpZWxkU2NoZW1hID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IHdpdGhOdWxsYWJsZUpTT05TY2hlbWFUeXBlKCdhcnJheScsIGlzUmVxdWlyZWQpLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiB7IHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZpZWxkU2NoZW1hID0geyB0eXBlOiB3aXRoTnVsbGFibGVKU09OU2NoZW1hVHlwZSgnbnVtYmVyJywgaXNSZXF1aXJlZCkgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlICdjaGVja2JveCc6IHtcbiAgICAgICAgICAgIGZpZWxkU2NoZW1hID0geyB0eXBlOiB3aXRoTnVsbGFibGVKU09OU2NoZW1hVHlwZSgnYm9vbGVhbicsIGlzUmVxdWlyZWQpIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnanNvbic6IHtcbiAgICAgICAgICAgIGZpZWxkU2NoZW1hID0ge1xuICAgICAgICAgICAgICB0eXBlOiBbJ29iamVjdCcsICdhcnJheScsICdzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nLCAnbnVsbCddLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlICdyaWNoVGV4dCc6IHtcbiAgICAgICAgICAgIGlmIChmaWVsZC5lZGl0b3Iub3V0cHV0U2NoZW1hKSB7XG4gICAgICAgICAgICAgIGZpZWxkU2NoZW1hID0gZmllbGQuZWRpdG9yLm91dHB1dFNjaGVtYSh7XG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbklERmllbGRUeXBlcyxcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZURlZmluaXRpb25zLFxuICAgICAgICAgICAgICAgIGlzUmVxdWlyZWQsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBNYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHJpY2ggdGV4dCBlZGl0b3JzXG4gICAgICAgICAgICAgIGZpZWxkU2NoZW1hID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IHdpdGhOdWxsYWJsZUpTT05TY2hlbWFUeXBlKCdhcnJheScsIGlzUmVxdWlyZWQpLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAncmFkaW8nOiB7XG4gICAgICAgICAgICBmaWVsZFNjaGVtYSA9IHtcbiAgICAgICAgICAgICAgdHlwZTogd2l0aE51bGxhYmxlSlNPTlNjaGVtYVR5cGUoJ3N0cmluZycsIGlzUmVxdWlyZWQpLFxuICAgICAgICAgICAgICBlbnVtOiBidWlsZE9wdGlvbkVudW1zKGZpZWxkLm9wdGlvbnMpLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgJ3NlbGVjdCc6IHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbkVudW1zID0gYnVpbGRPcHRpb25FbnVtcyhmaWVsZC5vcHRpb25zKVxuXG4gICAgICAgICAgICBpZiAoZmllbGQuaGFzTWFueSkge1xuICAgICAgICAgICAgICBmaWVsZFNjaGVtYSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB3aXRoTnVsbGFibGVKU09OU2NoZW1hVHlwZSgnYXJyYXknLCBpc1JlcXVpcmVkKSxcbiAgICAgICAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICBlbnVtOiBvcHRpb25FbnVtcyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmaWVsZFNjaGVtYSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB3aXRoTnVsbGFibGVKU09OU2NoZW1hVHlwZSgnc3RyaW5nJywgaXNSZXF1aXJlZCksXG4gICAgICAgICAgICAgICAgZW51bTogb3B0aW9uRW51bXMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlICdwb2ludCc6IHtcbiAgICAgICAgICAgIGZpZWxkU2NoZW1hID0ge1xuICAgICAgICAgICAgICB0eXBlOiB3aXRoTnVsbGFibGVKU09OU2NoZW1hVHlwZSgnYXJyYXknLCBpc1JlcXVpcmVkKSxcbiAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIG1heEl0ZW1zOiAyLFxuICAgICAgICAgICAgICBtaW5JdGVtczogMixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAncmVsYXRpb25zaGlwJzoge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQucmVsYXRpb25UbykpIHtcbiAgICAgICAgICAgICAgaWYgKGZpZWxkLmhhc01hbnkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZFNjaGVtYSA9IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IHdpdGhOdWxsYWJsZUpTT05TY2hlbWFUeXBlKCdhcnJheScsIGlzUmVxdWlyZWQpLFxuICAgICAgICAgICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgb25lT2Y6IGZpZWxkLnJlbGF0aW9uVG8ubWFwKChyZWxhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25Ubzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0OiByZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVPZjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBjb2xsZWN0aW9uSURGaWVsZFR5cGVzW3JlbGF0aW9uXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWY6IGAjL2RlZmluaXRpb25zLyR7cmVsYXRpb259YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogWyd2YWx1ZScsICdyZWxhdGlvblRvJ10sXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpZWxkU2NoZW1hID0ge1xuICAgICAgICAgICAgICAgICAgb25lT2Y6IGZpZWxkLnJlbGF0aW9uVG8ubWFwKChyZWxhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHdpdGhOdWxsYWJsZUpTT05TY2hlbWFUeXBlKCdvYmplY3QnLCBpc1JlcXVpcmVkKSxcbiAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25Ubzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdDogcmVsYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25lT2Y6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBjb2xsZWN0aW9uSURGaWVsZFR5cGVzW3JlbGF0aW9uXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWY6IGAjL2RlZmluaXRpb25zLyR7cmVsYXRpb259YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBbJ3ZhbHVlJywgJ3JlbGF0aW9uVG8nXSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmhhc01hbnkpIHtcbiAgICAgICAgICAgICAgZmllbGRTY2hlbWEgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogd2l0aE51bGxhYmxlSlNPTlNjaGVtYVR5cGUoJ2FycmF5JywgaXNSZXF1aXJlZCksXG4gICAgICAgICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgICAgICAgIG9uZU9mOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBjb2xsZWN0aW9uSURGaWVsZFR5cGVzW2ZpZWxkLnJlbGF0aW9uVG9dLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgJHJlZjogYCMvZGVmaW5pdGlvbnMvJHtmaWVsZC5yZWxhdGlvblRvfWAsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZpZWxkU2NoZW1hID0ge1xuICAgICAgICAgICAgICAgIG9uZU9mOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHdpdGhOdWxsYWJsZUpTT05TY2hlbWFUeXBlKFxuICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25JREZpZWxkVHlwZXNbZmllbGQucmVsYXRpb25Ub10sXG4gICAgICAgICAgICAgICAgICAgICAgaXNSZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICRyZWY6IGAjL2RlZmluaXRpb25zLyR7ZmllbGQucmVsYXRpb25Ub31gLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAndXBsb2FkJzoge1xuICAgICAgICAgICAgZmllbGRTY2hlbWEgPSB7XG4gICAgICAgICAgICAgIG9uZU9mOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdHlwZTogY29sbGVjdGlvbklERmllbGRUeXBlc1tmaWVsZC5yZWxhdGlvblRvXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICRyZWY6IGAjL2RlZmluaXRpb25zLyR7ZmllbGQucmVsYXRpb25Ub31gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzUmVxdWlyZWQpIGZpZWxkU2NoZW1hLm9uZU9mLnB1c2goeyB0eXBlOiAnbnVsbCcgfSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnYmxvY2tzJzoge1xuICAgICAgICAgICAgZmllbGRTY2hlbWEgPSB7XG4gICAgICAgICAgICAgIHR5cGU6IHdpdGhOdWxsYWJsZUpTT05TY2hlbWFUeXBlKCdhcnJheScsIGlzUmVxdWlyZWQpLFxuICAgICAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgICAgIG9uZU9mOiBmaWVsZC5ibG9ja3MubWFwKChibG9jaykgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2tGaWVsZFNjaGVtYXMgPSBmaWVsZHNUb0pTT05TY2hlbWEoXG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25JREZpZWxkVHlwZXMsXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrLmZpZWxkcyxcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZURlZmluaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrU2NoZW1hOiBKU09OU2NoZW1hNCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLmJsb2NrRmllbGRTY2hlbWFzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgYmxvY2tUeXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdDogYmxvY2suc2x1ZyxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogWydibG9ja1R5cGUnLCAuLi5ibG9ja0ZpZWxkU2NoZW1hcy5yZXF1aXJlZF0sXG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGlmIChibG9jay5pbnRlcmZhY2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU5hbWVEZWZpbml0aW9ucy5zZXQoYmxvY2suaW50ZXJmYWNlTmFtZSwgYmxvY2tTY2hlbWEpXG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAkcmVmOiBgIy9kZWZpbml0aW9ucy8ke2Jsb2NrLmludGVyZmFjZU5hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2tTY2hlbWFcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnYXJyYXknOiB7XG4gICAgICAgICAgICBmaWVsZFNjaGVtYSA9IHtcbiAgICAgICAgICAgICAgdHlwZTogd2l0aE51bGxhYmxlSlNPTlNjaGVtYVR5cGUoJ2FycmF5JywgaXNSZXF1aXJlZCksXG4gICAgICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC4uLmZpZWxkc1RvSlNPTlNjaGVtYShcbiAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25JREZpZWxkVHlwZXMsXG4gICAgICAgICAgICAgICAgICBmaWVsZC5maWVsZHMsXG4gICAgICAgICAgICAgICAgICBpbnRlcmZhY2VOYW1lRGVmaW5pdGlvbnMsXG4gICAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZpZWxkLmludGVyZmFjZU5hbWUpIHtcbiAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZURlZmluaXRpb25zLnNldChmaWVsZC5pbnRlcmZhY2VOYW1lLCBmaWVsZFNjaGVtYSlcblxuICAgICAgICAgICAgICBmaWVsZFNjaGVtYSA9IHtcbiAgICAgICAgICAgICAgICAkcmVmOiBgIy9kZWZpbml0aW9ucy8ke2ZpZWxkLmludGVyZmFjZU5hbWV9YCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlICdyb3cnOlxuICAgICAgICAgIGNhc2UgJ2NvbGxhcHNpYmxlJzoge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRTY2hlbWEgPSBmaWVsZHNUb0pTT05TY2hlbWEoXG4gICAgICAgICAgICAgIGNvbGxlY3Rpb25JREZpZWxkVHlwZXMsXG4gICAgICAgICAgICAgIGZpZWxkLmZpZWxkcyxcbiAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZURlZmluaXRpb25zLFxuICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhjaGlsZFNjaGVtYS5wcm9wZXJ0aWVzKS5mb3JFYWNoKChbcHJvcE5hbWUsIHByb3BTY2hlbWFdKSA9PiB7XG4gICAgICAgICAgICAgIGZpZWxkU2NoZW1hcy5zZXQocHJvcE5hbWUsIHByb3BTY2hlbWEpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY2hpbGRTY2hlbWEucmVxdWlyZWQuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcbiAgICAgICAgICAgICAgcmVxdWlyZWRGaWVsZE5hbWVzLmFkZChwcm9wTmFtZSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgJ3RhYnMnOiB7XG4gICAgICAgICAgICBmaWVsZC50YWJzLmZvckVhY2goKHRhYikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjaGlsZFNjaGVtYSA9IGZpZWxkc1RvSlNPTlNjaGVtYShcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uSURGaWVsZFR5cGVzLFxuICAgICAgICAgICAgICAgIHRhYi5maWVsZHMsXG4gICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZURlZmluaXRpb25zLFxuICAgICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAodGFiSGFzTmFtZSh0YWIpKSB7XG4gICAgICAgICAgICAgICAgLy8gY291bGQgaGF2ZSBpbnRlcmZhY2VcbiAgICAgICAgICAgICAgICBmaWVsZFNjaGVtYXMuc2V0KHRhYi5uYW1lLCB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIC4uLmNoaWxkU2NoZW1hLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgcmVxdWlyZWRGaWVsZE5hbWVzLmFkZCh0YWIubmFtZSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhjaGlsZFNjaGVtYS5wcm9wZXJ0aWVzKS5mb3JFYWNoKChbcHJvcE5hbWUsIHByb3BTY2hlbWFdKSA9PiB7XG4gICAgICAgICAgICAgICAgICBmaWVsZFNjaGVtYXMuc2V0KHByb3BOYW1lLCBwcm9wU2NoZW1hKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgY2hpbGRTY2hlbWEucmVxdWlyZWQuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkRmllbGROYW1lcy5hZGQocHJvcE5hbWUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnZ3JvdXAnOiB7XG4gICAgICAgICAgICBmaWVsZFNjaGVtYSA9IHtcbiAgICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgLi4uZmllbGRzVG9KU09OU2NoZW1hKFxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25JREZpZWxkVHlwZXMsXG4gICAgICAgICAgICAgICAgZmllbGQuZmllbGRzLFxuICAgICAgICAgICAgICAgIGludGVyZmFjZU5hbWVEZWZpbml0aW9ucyxcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmaWVsZC5pbnRlcmZhY2VOYW1lKSB7XG4gICAgICAgICAgICAgIGludGVyZmFjZU5hbWVEZWZpbml0aW9ucy5zZXQoZmllbGQuaW50ZXJmYWNlTmFtZSwgZmllbGRTY2hlbWEpXG5cbiAgICAgICAgICAgICAgZmllbGRTY2hlbWEgPSB7XG4gICAgICAgICAgICAgICAgJHJlZjogYCMvZGVmaW5pdGlvbnMvJHtmaWVsZC5pbnRlcmZhY2VOYW1lfWAsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGRTY2hlbWEgJiYgZmllbGRBZmZlY3RzRGF0YShmaWVsZCkpIHtcbiAgICAgICAgICBmaWVsZFNjaGVtYXMuc2V0KGZpZWxkLm5hbWUsIGZpZWxkU2NoZW1hKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkU2NoZW1hc1xuICAgICAgfSwgbmV3IE1hcDxzdHJpbmcsIEpTT05TY2hlbWE0PigpKSxcbiAgICApLFxuICAgIHJlcXVpcmVkOiBBcnJheS5mcm9tKHJlcXVpcmVkRmllbGROYW1lcyksXG4gIH1cbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJIGFuZCBpcyBleHBvcnRlZCB0aHJvdWdoIHBheWxvYWQvdXRpbGl0aWVzXG5leHBvcnQgZnVuY3Rpb24gZW50aXR5VG9KU09OU2NoZW1hKFxuICBjb25maWc6IFNhbml0aXplZENvbmZpZyxcbiAgaW5jb21pbmdFbnRpdHk6IFNhbml0aXplZENvbGxlY3Rpb25Db25maWcgfCBTYW5pdGl6ZWRHbG9iYWxDb25maWcsXG4gIGludGVyZmFjZU5hbWVEZWZpbml0aW9uczogTWFwPHN0cmluZywgSlNPTlNjaGVtYTQ+LFxuICBkZWZhdWx0SURUeXBlOiAnbnVtYmVyJyB8ICd0ZXh0Jyxcbik6IEpTT05TY2hlbWE0IHtcbiAgY29uc3QgZW50aXR5OiBTYW5pdGl6ZWRDb2xsZWN0aW9uQ29uZmlnIHwgU2FuaXRpemVkR2xvYmFsQ29uZmlnID0gZGVlcENvcHlPYmplY3QoaW5jb21pbmdFbnRpdHkpXG4gIGNvbnN0IHRpdGxlID0gZW50aXR5LnR5cGVzY3JpcHQ/LmludGVyZmFjZVxuICAgID8gZW50aXR5LnR5cGVzY3JpcHQuaW50ZXJmYWNlXG4gICAgOiBzaW5ndWxhcih0b1dvcmRzKGVudGl0eS5zbHVnLCB0cnVlKSlcblxuICBjb25zdCBpZEZpZWxkOiBGaWVsZEFmZmVjdGluZ0RhdGEgPSB7IG5hbWU6ICdpZCcsIHR5cGU6IGRlZmF1bHRJRFR5cGUgYXMgJ3RleHQnLCByZXF1aXJlZDogdHJ1ZSB9XG4gIGNvbnN0IGN1c3RvbUlkRmllbGQgPSBlbnRpdHkuZmllbGRzLmZpbmQoXG4gICAgKGZpZWxkKSA9PiBmaWVsZEFmZmVjdHNEYXRhKGZpZWxkKSAmJiBmaWVsZC5uYW1lID09PSAnaWQnLFxuICApIGFzIEZpZWxkQWZmZWN0aW5nRGF0YVxuXG4gIGlmIChjdXN0b21JZEZpZWxkICYmIGN1c3RvbUlkRmllbGQudHlwZSAhPT0gJ2dyb3VwJyAmJiBjdXN0b21JZEZpZWxkLnR5cGUgIT09ICd0YWInKSB7XG4gICAgY3VzdG9tSWRGaWVsZC5yZXF1aXJlZCA9IHRydWVcbiAgfSBlbHNlIHtcbiAgICBlbnRpdHkuZmllbGRzLnVuc2hpZnQoaWRGaWVsZClcbiAgfVxuXG4gIC8vIG1hcmsgdGltZXN0YW1wIGZpZWxkcyByZXF1aXJlZFxuICBpZiAoJ3RpbWVzdGFtcHMnIGluIGVudGl0eSAmJiBlbnRpdHkudGltZXN0YW1wcyAhPT0gZmFsc2UpIHtcbiAgICBlbnRpdHkuZmllbGRzID0gZW50aXR5LmZpZWxkcy5tYXAoKGZpZWxkKSA9PiB7XG4gICAgICBpZiAoZmllbGRBZmZlY3RzRGF0YShmaWVsZCkgJiYgKGZpZWxkLm5hbWUgPT09ICdjcmVhdGVkQXQnIHx8IGZpZWxkLm5hbWUgPT09ICd1cGRhdGVkQXQnKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmZpZWxkLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmllbGRcbiAgICB9KVxuICB9XG5cbiAgaWYgKCdhdXRoJyBpbiBlbnRpdHkgJiYgZW50aXR5LmF1dGggJiYgIWVudGl0eS5hdXRoPy5kaXNhYmxlTG9jYWxTdHJhdGVneSkge1xuICAgIGVudGl0eS5maWVsZHMucHVzaCh7XG4gICAgICBuYW1lOiAncGFzc3dvcmQnLFxuICAgICAgdHlwZTogJ3RleHQnLFxuICAgIH0pXG4gIH1cblxuICAvLyAgVXNlZCBmb3IgcmVsYXRpb25zaGlwIGZpZWxkcywgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gdXNlIGEgc3RyaW5nIG9yIG51bWJlciB0eXBlIGZvciB0aGUgSUQuXG4gIGNvbnN0IGNvbGxlY3Rpb25JREZpZWxkVHlwZXMgPSBnZXRDb2xsZWN0aW9uSURGaWVsZFR5cGVzKHsgY29uZmlnLCBkZWZhdWx0SURUeXBlIH0pXG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgdGl0bGUsXG4gICAgLi4uZmllbGRzVG9KU09OU2NoZW1hKGNvbGxlY3Rpb25JREZpZWxkVHlwZXMsIGVudGl0eS5maWVsZHMsIGludGVyZmFjZU5hbWVEZWZpbml0aW9ucywgY29uZmlnKSxcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgdXNlZCBmb3IgZ2VuZXJhdGluZyB0aGUgVHlwZVNjcmlwdCB0eXBlcyAocGF5bG9hZC10eXBlcy50cykgd2l0aCB0aGUgcGF5bG9hZCBnZW5lcmF0ZTp0eXBlcyBjb21tYW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZmlnVG9KU09OU2NoZW1hKFxuICBjb25maWc6IFNhbml0aXplZENvbmZpZyxcbiAgZGVmYXVsdElEVHlwZT86ICdudW1iZXInIHwgJ3RleHQnLFxuKTogSlNPTlNjaGVtYTQge1xuICAvLyBhIG11dGFibGUgTWFwIHRvIHN0b3JlIGN1c3RvbSB0b3AtbGV2ZWwgYGludGVyZmFjZU5hbWVgIHR5cGVzLiBGaWVsZHMgd2l0aCBhbiBgaW50ZXJmYWNlTmFtZWAgcHJvcGVydHkgd2lsbCBiZSBtb3ZlZCB0byB0aGUgdG9wLWxldmVsIGRlZmluaXRpb25zIGhlcmVcbiAgY29uc3QgaW50ZXJmYWNlTmFtZURlZmluaXRpb25zOiBNYXA8c3RyaW5nLCBKU09OU2NoZW1hND4gPSBuZXcgTWFwKClcblxuICAvLyBDb2xsZWN0aW9ucyBhbmQgR2xvYmFscyBoYXZlIHRvIGJlIG1vdmVkIHRvIHRoZSB0b3AtbGV2ZWwgZGVmaW5pdGlvbnMgYXMgd2VsbC4gUmVhc29uOiBUaGUgdG9wLWxldmVsIHR5cGUgd2lsbCBiZSB0aGUgYENvbmZpZ2AgdHlwZSAtIHdlIGRvbid0IHdhbnQgYWxsIGNvbGxlY3Rpb24gYW5kIGdsb2JhbFxuICAvLyB0eXBlcyB0byBiZSBpbmxpbmVkIGluc2lkZSB0aGUgYENvbmZpZ2AgdHlwZVxuICBjb25zdCBlbnRpdHlEZWZpbml0aW9uczogeyBbazogc3RyaW5nXTogSlNPTlNjaGVtYTQgfSA9IFtcbiAgICAuLi5jb25maWcuZ2xvYmFscyxcbiAgICAuLi5jb25maWcuY29sbGVjdGlvbnMsXG4gIF0ucmVkdWNlKChhY2MsIGVudGl0eSkgPT4ge1xuICAgIGFjY1tlbnRpdHkuc2x1Z10gPSBlbnRpdHlUb0pTT05TY2hlbWEoY29uZmlnLCBlbnRpdHksIGludGVyZmFjZU5hbWVEZWZpbml0aW9ucywgZGVmYXVsdElEVHlwZSlcbiAgICByZXR1cm4gYWNjXG4gIH0sIHt9KVxuXG4gIHJldHVybiB7XG4gICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgIGRlZmluaXRpb25zOiB7IC4uLmVudGl0eURlZmluaXRpb25zLCAuLi5PYmplY3QuZnJvbUVudHJpZXMoaW50ZXJmYWNlTmFtZURlZmluaXRpb25zKSB9LFxuICAgIC8vIFRoZXNlIHByb3BlcnRpZXMgaGVyZSB3aWxsIGJlIHZlcnkgc2ltcGxlLCBhcyBhbGwgdGhlIGNvbXBsZXhpdHkgaXMgaW4gdGhlIGRlZmluaXRpb25zLiBUaGVzZSBhcmUganVzdCB0aGUgcHJvcGVydGllcyBmb3IgdGhlIHRvcC1sZXZlbCBgQ29uZmlnYCB0eXBlXG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgY29sbGVjdGlvbnM6IGdlbmVyYXRlRW50aXR5U2NoZW1hcyhjb25maWcuY29sbGVjdGlvbnMgfHwgW10pLFxuICAgICAgZ2xvYmFsczogZ2VuZXJhdGVFbnRpdHlTY2hlbWFzKGNvbmZpZy5nbG9iYWxzIHx8IFtdKSxcbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbJ2NvbGxlY3Rpb25zJywgJ2dsb2JhbHMnXSxcbiAgICB0aXRsZTogJ0NvbmZpZycsXG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJwbHVyYWxpemUiLCJzaW5ndWxhciIsImZpZWxkQWZmZWN0c0RhdGEiLCJ0YWJIYXNOYW1lIiwiZGVlcENvcHlPYmplY3QiLCJ0b1dvcmRzIiwiZ2V0Q29sbGVjdGlvbklERmllbGRUeXBlcyIsImZpZWxkSXNSZXF1aXJlZCIsImZpZWxkIiwiaXNDb25kaXRpb25hbCIsIkJvb2xlYW4iLCJhZG1pbiIsImNvbmRpdGlvbiIsImlzTWFya2VkUmVxdWlyZWQiLCJyZXF1aXJlZCIsInR5cGUiLCJmaWVsZHMiLCJzb21lIiwic3ViRmllbGQiLCJ0YWJzIiwidGFiIiwiYnVpbGRPcHRpb25FbnVtcyIsIm9wdGlvbnMiLCJtYXAiLCJvcHRpb24iLCJ2YWx1ZSIsImdlbmVyYXRlRW50aXR5U2NoZW1hcyIsImVudGl0aWVzIiwicHJvcGVydGllcyIsInJlZHVjZSIsImFjYyIsInNsdWciLCIkcmVmIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJPYmplY3QiLCJrZXlzIiwid2l0aE51bGxhYmxlSlNPTlNjaGVtYVR5cGUiLCJmaWVsZFR5cGUiLCJpc1JlcXVpcmVkIiwiZmllbGRUeXBlcyIsInB1c2giLCJmaWVsZHNUb0pTT05TY2hlbWEiLCJjb2xsZWN0aW9uSURGaWVsZFR5cGVzIiwiaW50ZXJmYWNlTmFtZURlZmluaXRpb25zIiwiY29uZmlnIiwicmVxdWlyZWRGaWVsZE5hbWVzIiwiU2V0IiwiZnJvbUVudHJpZXMiLCJmaWVsZFNjaGVtYXMiLCJhZGQiLCJuYW1lIiwiZmllbGRTY2hlbWEiLCJoYXNNYW55IiwiaXRlbXMiLCJlZGl0b3IiLCJvdXRwdXRTY2hlbWEiLCJlbnVtIiwib3B0aW9uRW51bXMiLCJtYXhJdGVtcyIsIm1pbkl0ZW1zIiwiQXJyYXkiLCJpc0FycmF5IiwicmVsYXRpb25UbyIsIm9uZU9mIiwicmVsYXRpb24iLCJjb25zdCIsImJsb2NrcyIsImJsb2NrIiwiYmxvY2tGaWVsZFNjaGVtYXMiLCJibG9ja1NjaGVtYSIsImJsb2NrVHlwZSIsImludGVyZmFjZU5hbWUiLCJzZXQiLCJjaGlsZFNjaGVtYSIsImVudHJpZXMiLCJmb3JFYWNoIiwicHJvcE5hbWUiLCJwcm9wU2NoZW1hIiwiTWFwIiwiZnJvbSIsImVudGl0eVRvSlNPTlNjaGVtYSIsImluY29taW5nRW50aXR5IiwiZGVmYXVsdElEVHlwZSIsImVudGl0eSIsInRpdGxlIiwidHlwZXNjcmlwdCIsImludGVyZmFjZSIsImlkRmllbGQiLCJjdXN0b21JZEZpZWxkIiwiZmluZCIsInVuc2hpZnQiLCJ0aW1lc3RhbXBzIiwiYXV0aCIsImRpc2FibGVMb2NhbFN0cmF0ZWd5IiwiY29uZmlnVG9KU09OU2NoZW1hIiwiZW50aXR5RGVmaW5pdGlvbnMiLCJnbG9iYWxzIiwiY29sbGVjdGlvbnMiLCJkZWZpbml0aW9ucyJdLCJtYXBwaW5ncyI6IkFBRUEsT0FBT0EsZUFBZSxZQUFXO0FBQ2pDLE1BQU0sRUFBRUMsUUFBUSxFQUFFLEdBQUdEO0FBT3JCLFNBQVNFLGdCQUFnQixFQUFFQyxVQUFVLFFBQVEsNEJBQTJCO0FBQ3hFLFNBQVNDLGNBQWMsUUFBUSxzQkFB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
|
|
502
|
+
//# sourceMappingURL=configToJSONSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/configToJSONSchema.ts"],"sourcesContent":["import type { JSONSchema4, JSONSchema4TypeName } from 'json-schema'\n\nimport pluralize from 'pluralize'\nconst { singular } = pluralize\n\nimport type { SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { Field, FieldAffectingData, Option } from '../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../globals/config/types.js'\n\nimport { fieldAffectsData, tabHasName } from '../fields/config/types.js'\nimport { deepCopyObject } from './deepCopyObject.js'\nimport { toWords } from './formatLabels.js'\nimport { getCollectionIDFieldTypes } from './getCollectionIDFieldTypes.js'\n\nconst fieldIsRequired = (field: Field) => {\n const isConditional = Boolean(field?.admin && field?.admin?.condition)\n if (isConditional) return false\n\n const isMarkedRequired = 'required' in field && field.required === true\n if (fieldAffectsData(field) && isMarkedRequired) return true\n\n // if any subfields are required, this field is required\n if ('fields' in field && field.type !== 'array') {\n return field.fields.some((subField) => fieldIsRequired(subField))\n }\n\n // if any tab subfields have required fields, this field is required\n if (field.type === 'tabs') {\n return field.tabs.some((tab) => {\n if ('name' in tab) {\n return tab.fields.some((subField) => fieldIsRequired(subField))\n }\n return false\n })\n }\n\n return false\n}\n\nfunction buildOptionEnums(options: Option[]): string[] {\n return options.map((option) => {\n if (typeof option === 'object' && 'value' in option) {\n return option.value\n }\n\n return option\n })\n}\n\nfunction generateEntitySchemas(\n entities: (SanitizedCollectionConfig | SanitizedGlobalConfig)[],\n): JSONSchema4 {\n const properties = [...entities].reduce((acc, { slug }) => {\n acc[slug] = {\n $ref: `#/definitions/${slug}`,\n }\n\n return acc\n }, {})\n\n return {\n type: 'object',\n additionalProperties: false,\n properties,\n required: Object.keys(properties),\n }\n}\n\n/**\n * Returns a JSON Schema Type with 'null' added if the field is not required.\n */\nexport function withNullableJSONSchemaType(\n fieldType: JSONSchema4TypeName,\n isRequired: boolean,\n): JSONSchema4TypeName | JSONSchema4TypeName[] {\n const fieldTypes = [fieldType]\n if (isRequired) return fieldType\n fieldTypes.push('null')\n return fieldTypes\n}\n\nexport function fieldsToJSONSchema(\n /**\n * Used for relationship fields, to determine whether to use a string or number type for the ID.\n * While there is a default ID field type set by the db adapter, they can differ on a collection-level\n * if they have custom ID fields.\n */\n collectionIDFieldTypes: { [key: string]: 'number' | 'string' },\n fields: Field[],\n /**\n * Allows you to define new top-level interfaces that can be re-used in the output schema.\n */\n interfaceNameDefinitions: Map<string, JSONSchema4>,\n config?: SanitizedConfig,\n): {\n properties: {\n [k: string]: JSONSchema4\n }\n required: string[]\n} {\n const requiredFieldNames = new Set<string>()\n\n return {\n properties: Object.fromEntries(\n fields.reduce((fieldSchemas, field) => {\n const isRequired = fieldAffectsData(field) && fieldIsRequired(field)\n if (isRequired) requiredFieldNames.add(field.name)\n\n let fieldSchema: JSONSchema4\n switch (field.type) {\n case 'text':\n if (field.hasMany === true) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: { type: 'string' },\n }\n } else {\n fieldSchema = { type: withNullableJSONSchemaType('string', isRequired) }\n }\n break\n case 'textarea':\n case 'code':\n case 'email':\n case 'date': {\n fieldSchema = { type: withNullableJSONSchemaType('string', isRequired) }\n break\n }\n\n case 'number': {\n if (field.hasMany === true) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: { type: 'number' },\n }\n } else {\n fieldSchema = { type: withNullableJSONSchemaType('number', isRequired) }\n }\n break\n }\n\n case 'checkbox': {\n fieldSchema = { type: withNullableJSONSchemaType('boolean', isRequired) }\n break\n }\n\n case 'json': {\n fieldSchema = {\n type: ['object', 'array', 'string', 'number', 'boolean', 'null'],\n }\n break\n }\n\n case 'richText': {\n if (field.editor.outputSchema) {\n fieldSchema = field.editor.outputSchema({\n collectionIDFieldTypes,\n config,\n field,\n interfaceNameDefinitions,\n isRequired,\n })\n } else {\n // Maintain backwards compatibility with existing rich text editors\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'object',\n },\n }\n }\n\n break\n }\n\n case 'radio': {\n fieldSchema = {\n type: withNullableJSONSchemaType('string', isRequired),\n enum: buildOptionEnums(field.options),\n }\n\n break\n }\n\n case 'select': {\n const optionEnums = buildOptionEnums(field.options)\n\n if (field.hasMany) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'string',\n enum: optionEnums,\n },\n }\n } else {\n fieldSchema = {\n type: withNullableJSONSchemaType('string', isRequired),\n enum: optionEnums,\n }\n }\n\n break\n }\n\n case 'point': {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: [\n {\n type: 'number',\n },\n {\n type: 'number',\n },\n ],\n maxItems: 2,\n minItems: 2,\n }\n break\n }\n\n case 'relationship': {\n if (Array.isArray(field.relationTo)) {\n if (field.hasMany) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n oneOf: field.relationTo.map((relation) => {\n return {\n type: 'object',\n additionalProperties: false,\n properties: {\n relationTo: {\n const: relation,\n },\n value: {\n oneOf: [\n {\n type: collectionIDFieldTypes[relation],\n },\n {\n $ref: `#/definitions/${relation}`,\n },\n ],\n },\n },\n required: ['value', 'relationTo'],\n }\n }),\n },\n }\n } else {\n fieldSchema = {\n oneOf: field.relationTo.map((relation) => {\n return {\n type: withNullableJSONSchemaType('object', isRequired),\n additionalProperties: false,\n properties: {\n relationTo: {\n const: relation,\n },\n value: {\n oneOf: [\n {\n type: collectionIDFieldTypes[relation],\n },\n {\n $ref: `#/definitions/${relation}`,\n },\n ],\n },\n },\n required: ['value', 'relationTo'],\n }\n }),\n }\n }\n } else if (field.hasMany) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n oneOf: [\n {\n type: collectionIDFieldTypes[field.relationTo],\n },\n {\n $ref: `#/definitions/${field.relationTo}`,\n },\n ],\n },\n }\n } else {\n fieldSchema = {\n oneOf: [\n {\n type: withNullableJSONSchemaType(\n collectionIDFieldTypes[field.relationTo],\n isRequired,\n ),\n },\n {\n $ref: `#/definitions/${field.relationTo}`,\n },\n ],\n }\n }\n\n break\n }\n\n case 'upload': {\n fieldSchema = {\n oneOf: [\n {\n type: collectionIDFieldTypes[field.relationTo],\n },\n {\n $ref: `#/definitions/${field.relationTo}`,\n },\n ],\n }\n if (!isRequired) fieldSchema.oneOf.push({ type: 'null' })\n break\n }\n\n case 'blocks': {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n oneOf: field.blocks.map((block) => {\n const blockFieldSchemas = fieldsToJSONSchema(\n collectionIDFieldTypes,\n block.fields,\n interfaceNameDefinitions,\n config,\n )\n\n const blockSchema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: {\n ...blockFieldSchemas.properties,\n blockType: {\n const: block.slug,\n },\n },\n required: ['blockType', ...blockFieldSchemas.required],\n }\n\n if (block.interfaceName) {\n interfaceNameDefinitions.set(block.interfaceName, blockSchema)\n\n return {\n $ref: `#/definitions/${block.interfaceName}`,\n }\n }\n\n return blockSchema\n }),\n },\n }\n break\n }\n\n case 'array': {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'object',\n additionalProperties: false,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.fields,\n interfaceNameDefinitions,\n config,\n ),\n },\n }\n\n if (field.interfaceName) {\n interfaceNameDefinitions.set(field.interfaceName, fieldSchema)\n\n fieldSchema = {\n $ref: `#/definitions/${field.interfaceName}`,\n }\n }\n break\n }\n\n case 'row':\n case 'collapsible': {\n const childSchema = fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.fields,\n interfaceNameDefinitions,\n config,\n )\n Object.entries(childSchema.properties).forEach(([propName, propSchema]) => {\n fieldSchemas.set(propName, propSchema)\n })\n childSchema.required.forEach((propName) => {\n requiredFieldNames.add(propName)\n })\n break\n }\n\n case 'tabs': {\n field.tabs.forEach((tab) => {\n const childSchema = fieldsToJSONSchema(\n collectionIDFieldTypes,\n tab.fields,\n interfaceNameDefinitions,\n config,\n )\n if (tabHasName(tab)) {\n // could have interface\n fieldSchemas.set(tab.name, {\n type: 'object',\n additionalProperties: false,\n ...childSchema,\n })\n requiredFieldNames.add(tab.name)\n } else {\n Object.entries(childSchema.properties).forEach(([propName, propSchema]) => {\n fieldSchemas.set(propName, propSchema)\n })\n childSchema.required.forEach((propName) => {\n requiredFieldNames.add(propName)\n })\n }\n })\n break\n }\n\n case 'group': {\n fieldSchema = {\n type: 'object',\n additionalProperties: false,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.fields,\n interfaceNameDefinitions,\n config,\n ),\n }\n\n if (field.interfaceName) {\n interfaceNameDefinitions.set(field.interfaceName, fieldSchema)\n\n fieldSchema = {\n $ref: `#/definitions/${field.interfaceName}`,\n }\n }\n break\n }\n\n default: {\n break\n }\n }\n\n if (fieldSchema && fieldAffectsData(field)) {\n fieldSchemas.set(field.name, fieldSchema)\n }\n\n return fieldSchemas\n }, new Map<string, JSONSchema4>()),\n ),\n required: Array.from(requiredFieldNames),\n }\n}\n\n// This function is part of the public API and is exported through payload/utilities\nexport function entityToJSONSchema(\n config: SanitizedConfig,\n incomingEntity: SanitizedCollectionConfig | SanitizedGlobalConfig,\n interfaceNameDefinitions: Map<string, JSONSchema4>,\n defaultIDType: 'number' | 'text',\n): JSONSchema4 {\n const entity: SanitizedCollectionConfig | SanitizedGlobalConfig = deepCopyObject(incomingEntity)\n const title = entity.typescript?.interface\n ? entity.typescript.interface\n : singular(toWords(entity.slug, true))\n\n const idField: FieldAffectingData = { name: 'id', type: defaultIDType as 'text', required: true }\n const customIdField = entity.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n ) as FieldAffectingData\n\n if (customIdField && customIdField.type !== 'group' && customIdField.type !== 'tab') {\n customIdField.required = true\n } else {\n entity.fields.unshift(idField)\n }\n\n // mark timestamp fields required\n if ('timestamps' in entity && entity.timestamps !== false) {\n entity.fields = entity.fields.map((field) => {\n if (fieldAffectsData(field) && (field.name === 'createdAt' || field.name === 'updatedAt')) {\n return {\n ...field,\n required: true,\n }\n }\n return field\n })\n }\n\n if ('auth' in entity && entity.auth && !entity.auth?.disableLocalStrategy) {\n entity.fields.push({\n name: 'password',\n type: 'text',\n })\n }\n\n // Used for relationship fields, to determine whether to use a string or number type for the ID.\n const collectionIDFieldTypes = getCollectionIDFieldTypes({ config, defaultIDType })\n\n return {\n type: 'object',\n additionalProperties: false,\n title,\n ...fieldsToJSONSchema(collectionIDFieldTypes, entity.fields, interfaceNameDefinitions, config),\n }\n}\n\n/**\n * This is used for generating the TypeScript types (payload-types.ts) with the payload generate:types command.\n */\nexport function configToJSONSchema(\n config: SanitizedConfig,\n defaultIDType?: 'number' | 'text',\n): JSONSchema4 {\n // a mutable Map to store custom top-level `interfaceName` types. Fields with an `interfaceName` property will be moved to the top-level definitions here\n const interfaceNameDefinitions: Map<string, JSONSchema4> = new Map()\n\n // Collections and Globals have to be moved to the top-level definitions as well. Reason: The top-level type will be the `Config` type - we don't want all collection and global\n // types to be inlined inside the `Config` type\n const entityDefinitions: { [k: string]: JSONSchema4 } = [\n ...config.globals,\n ...config.collections,\n ].reduce((acc, entity) => {\n acc[entity.slug] = entityToJSONSchema(config, entity, interfaceNameDefinitions, defaultIDType)\n return acc\n }, {})\n\n return {\n additionalProperties: false,\n definitions: { ...entityDefinitions, ...Object.fromEntries(interfaceNameDefinitions) },\n // These properties here will be very simple, as all the complexity is in the definitions. These are just the properties for the top-level `Config` type\n type: 'object',\n properties: {\n collections: generateEntitySchemas(config.collections || []),\n globals: generateEntitySchemas(config.globals || []),\n },\n required: ['collections', 'globals'],\n title: 'Config',\n }\n}\n"],"names":["pluralize","singular","fieldAffectsData","tabHasName","deepCopyObject","toWords","getCollectionIDFieldTypes","fieldIsRequired","field","isConditional","Boolean","admin","condition","isMarkedRequired","required","type","fields","some","subField","tabs","tab","buildOptionEnums","options","map","option","value","generateEntitySchemas","entities","properties","reduce","acc","slug","$ref","additionalProperties","Object","keys","withNullableJSONSchemaType","fieldType","isRequired","fieldTypes","push","fieldsToJSONSchema","collectionIDFieldTypes","interfaceNameDefinitions","config","requiredFieldNames","Set","fromEntries","fieldSchemas","add","name","fieldSchema","hasMany","items","editor","outputSchema","enum","optionEnums","maxItems","minItems","Array","isArray","relationTo","oneOf","relation","const","blocks","block","blockFieldSchemas","blockSchema","blockType","interfaceName","set","childSchema","entries","forEach","propName","propSchema","Map","from","entityToJSONSchema","incomingEntity","defaultIDType","entity","title","typescript","interface","idField","customIdField","find","unshift","timestamps","auth","disableLocalStrategy","configToJSONSchema","entityDefinitions","globals","collections","definitions"],"mappings":"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"}
|
|
@@ -65,4 +65,4 @@ describe('configToJSONSchema', ()=>{
|
|
|
65
65
|
});
|
|
66
66
|
});
|
|
67
67
|
|
|
68
|
-
//# sourceMappingURL=
|
|
68
|
+
//# sourceMappingURL=configToJSONSchema.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/configToJSONSchema.spec.ts"],"sourcesContent":["import type { Config } from '../config/types.js'\n\nimport { sanitizeConfig } from '../config/sanitize.js'\nimport { configToJSONSchema } from './configToJSONSchema.js'\n\ndescribe('configToJSONSchema', () => {\n it('should handle optional arrays with required fields', () => {\n const config: Config = {\n collections: [\n {\n fields: [\n {\n name: 'someRequiredField',\n type: 'array',\n fields: [\n {\n name: 'someRequiredField',\n required: true,\n type: 'text',\n },\n ],\n },\n ],\n slug: 'test',\n timestamps: false,\n },\n ],\n }\n\n const sanitizedConfig = sanitizeConfig(config)\n const schema = configToJSONSchema(sanitizedConfig, 'text')\n\n expect(schema?.definitions?.test).toStrictEqual({\n additionalProperties: false,\n properties: {\n id: {\n type: 'string',\n },\n someRequiredField: {\n items: {\n additionalProperties: false,\n properties: {\n id: {\n type: ['string', 'null'],\n },\n someRequiredField: {\n type: 'string',\n },\n },\n required: ['someRequiredField'],\n type: 'object',\n },\n type: ['array', 'null'],\n },\n },\n required: ['id'],\n title: 'Test',\n type: 'object',\n })\n })\n})\n"],"names":["sanitizeConfig","configToJSONSchema","describe","it","config","collections","fields","name","type","required","slug","timestamps","sanitizedConfig","schema","expect","definitions","test","toStrictEqual","additionalProperties","properties","id","someRequiredField","items","title"],"mappings":"AAEA,SAASA,cAAc,QAAQ,wBAAuB;AACtD,SAASC,kBAAkB,QAAQ,0BAAyB;AAE5DC,SAAS,sBAAsB;IAC7BC,GAAG,sDAAsD;QACvD,MAAMC,SAAiB;YACrBC,aAAa;gBACX;oBACEC,QAAQ;wBACN;4BACEC,MAAM;4BACNC,MAAM;4BACNF,QAAQ;gCACN;oCACEC,MAAM;oCACNE,UAAU;oCACVD,MAAM;gCACR;6BACD;wBACH;qBACD;oBACDE,MAAM;oBACNC,YAAY;gBACd;aACD;QACH;QAEA,MAAMC,kBAAkBZ,eAAeI;QACvC,MAAMS,SAASZ,mBAAmBW,iBAAiB;QAEnDE,OAAOD,QAAQE,aAAaC,MAAMC,aAAa,CAAC;YAC9CC,sBAAsB;YACtBC,YAAY;gBACVC,IAAI;oBACFZ,MAAM;gBACR;gBACAa,mBAAmB;oBACjBC,OAAO;wBACLJ,sBAAsB;wBACtBC,YAAY;4BACVC,IAAI;gCACFZ,MAAM;oCAAC;oCAAU;iCAAO;4BAC1B;4BACAa,mBAAmB;gCACjBb,MAAM;4BACR;wBACF;wBACAC,UAAU;4BAAC;yBAAoB;wBAC/BD,MAAM;oBACR;oBACAA,MAAM;wBAAC;wBAAS;qBAAO;gBACzB;YACF;YACAC,UAAU;gBAAC;aAAK;YAChBc,OAAO;YACPf,MAAM;QACR;IACF;AACF"}
|
|
@@ -13,4 +13,4 @@ const convertArrayToHash = (arr, key)=>arr.reduce((obj, item, i)=>{
|
|
|
13
13
|
}, {});
|
|
14
14
|
export { convertArrayToHash, convertArrayToObject, convertObjectToArray };
|
|
15
15
|
|
|
16
|
-
//# sourceMappingURL=
|
|
16
|
+
//# sourceMappingURL=convertData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/convertData.ts"],"sourcesContent":["/* eslint-disable no-param-reassign */\nconst convertArrayToObject = (arr, key) =>\n arr.reduce((obj, item) => {\n if (key) {\n obj[item[key]] = item\n return obj\n }\n\n obj[item] = {}\n return obj\n }, {})\n\nconst convertObjectToArray = (arr) => Object.values(arr)\n\nconst convertArrayToHash = (arr, key) =>\n arr.reduce((obj, item, i) => {\n obj[item[key]] = i\n return obj\n }, {})\n\nexport { convertArrayToHash, convertArrayToObject, convertObjectToArray }\n"],"names":["convertArrayToObject","arr","key","reduce","obj","item","convertObjectToArray","Object","values","convertArrayToHash","i"],"mappings":"AAAA,oCAAoC,GACpC,MAAMA,uBAAuB,CAACC,KAAKC,MACjCD,IAAIE,MAAM,CAAC,CAACC,KAAKC;QACf,IAAIH,KAAK;YACPE,GAAG,CAACC,IAAI,CAACH,IAAI,CAAC,GAAGG;YACjB,OAAOD;QACT;QAEAA,GAAG,CAACC,KAAK,GAAG,CAAC;QACb,OAAOD;IACT,GAAG,CAAC;AAEN,MAAME,uBAAuB,CAACL,MAAQM,OAAOC,MAAM,CAACP;AAEpD,MAAMQ,qBAAqB,CAACR,KAAKC,MAC/BD,IAAIE,MAAM,CAAC,CAACC,KAAKC,MAAMK;QACrBN,GAAG,CAACC,IAAI,CAACH,IAAI,CAAC,GAAGQ;QACjB,OAAON;IACT,GAAG,CAAC;AAEN,SAASK,kBAAkB,EAAET,oBAAoB,EAAEM,oBAAoB,GAAE"}
|
|
@@ -8,4 +8,4 @@ export function createArrayFromCommaDelineated(input) {
|
|
|
8
8
|
];
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
//# sourceMappingURL=
|
|
11
|
+
//# sourceMappingURL=createArrayFromCommaDelineated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/createArrayFromCommaDelineated.ts"],"sourcesContent":["export function createArrayFromCommaDelineated(input: string): string[] {\n if (Array.isArray(input)) return input\n if (input.indexOf(',') > -1) {\n return input.split(',')\n }\n return [input]\n}\n"],"names":["createArrayFromCommaDelineated","input","Array","isArray","indexOf","split"],"mappings":"AAAA,OAAO,SAASA,+BAA+BC,KAAa;IAC1D,IAAIC,MAAMC,OAAO,CAACF,QAAQ,OAAOA;IACjC,IAAIA,MAAMG,OAAO,CAAC,OAAO,CAAC,GAAG;QAC3B,OAAOH,MAAMI,KAAK,CAAC;IACrB;IACA,OAAO;QAACJ;KAAM;AAChB"}
|