diff --git a/docs/configuration/password_policy.md b/docs/configuration/password_policy.md new file mode 100644 index 000000000..9ce29cce9 --- /dev/null +++ b/docs/configuration/password_policy.md @@ -0,0 +1,110 @@ +--- +layout: default +title: Password Policy +parent: Configuration +nav_order: 17 +--- + +# Password Policy +_Authelia_ allows administrators to configure an enforced password policy. + +## Configuration + +```yaml +password_policy: + standard: + enabled: false + min_length: 8 + max_length: 0 + require_uppercase: true + require_lowercase: true + require_number: true + require_special: true + zxcvbn: + enabled: false +``` + +## Options + +### standard +
+type: list +{: .label .label-config .label-purple } +required: no +{: .label .label-config .label-green } +
+ +This section allows you to enable standard security policies. +#### enabled +type: bool +{: .label .label-config .label-purple } +required: no +{: .label .label-config .label-green } + +Enables standard password policy + +#### min_length +type: integer +{: .label .label-config .label-purple } +required: no +{: .label .label-config .label-green } + +Determines the minimum allowed password length + +#### max_length +type: integer +{: .label .label-config .label-purple } +required: no +{: .label .label-config .label-green } + +Determines the maximum allowed password length + +#### require_uppercase +type: bool +{: .label .label-config .label-purple } +required: no +{: .label .label-config .label-green } + +Indicates that at least one UPPERCASE letter must be provided as part of the password + +#### require_lowercase +type: bool +{: .label .label-config .label-purple } +required: no +{: .label .label-config .label-green } + +Indicates that at least one lowercase letter must be provided as part of the password + +#### require_number +type: bool +{: .label .label-config .label-purple } +required: no +{: .label .label-config .label-green } + +Indicates that at least one number must be provided as part of the password + +#### require_special +type: bool +{: .label .label-config .label-purple } +required: no +{: .label .label-config .label-green } + +Indicates that at least one special character must be provided as part of the password + + +### zxcvbn +This password policy enables advanced password strengh metering, using [Dropbox zxcvbn package](https://github.com/dropbox/zxcvbn). + +Note that this password policy do not restrict the user's entry, just warns the user that if their password is too weak + + +#### enabled +type: bool +{: .label .label-config .label-purple } +required: no +{: .label .label-config .label-green } + +Enables standard password policy + +Note: +* only one password policy can be applied at a time diff --git a/docs/features/password-policy.md b/docs/features/password-policy.md new file mode 100644 index 000000000..4ca1ae1ee --- /dev/null +++ b/docs/features/password-policy.md @@ -0,0 +1,36 @@ +--- +layout: default +title: Password Policy +parent: Features +nav_order: 8 +--- + +# Password Policy +Password policy enforces the security by requering the users to use strong passwords +Currently, two methods are supported: +## classic +* this mode of operation allows administrators to set the rules that user passwords must comply with +* the available options are: + * Minimum password length + * Require Uppercase + * Require Lowercase + * Require Numbers + * Require Special characters +* when changing the password users must meet these rules + + +

+ +

+ + +## zxcvbn +* this mode uses zxcvbn for password strength checking (see: https://github.com/dropbox/zxcvbn) +* in this mode of operation, the user is not forced to follow any rules. the user is notified if their passwords is weak or strong +

+ +

+ + + + diff --git a/docs/images/password-policy-classic-1.png b/docs/images/password-policy-classic-1.png new file mode 100644 index 000000000..3f844827d Binary files /dev/null and b/docs/images/password-policy-classic-1.png differ diff --git a/docs/images/password-policy-zxcvbn-1.png b/docs/images/password-policy-zxcvbn-1.png new file mode 100644 index 000000000..1aa2d14ee Binary files /dev/null and b/docs/images/password-policy-zxcvbn-1.png differ diff --git a/internal/configuration/schema/configuration.go b/internal/configuration/schema/configuration.go index bf75813d4..fe2803ada 100644 --- a/internal/configuration/schema/configuration.go +++ b/internal/configuration/schema/configuration.go @@ -10,14 +10,16 @@ type Configuration struct { Log LogConfiguration `koanf:"log"` IdentityProviders IdentityProvidersConfiguration `koanf:"identity_providers"` AuthenticationBackend AuthenticationBackendConfiguration `koanf:"authentication_backend"` - Session SessionConfiguration `koanf:"session"` TOTP TOTPConfiguration `koanf:"totp"` + Webauthn WebauthnConfiguration `koanf:"webauthn"` DuoAPI *DuoAPIConfiguration `koanf:"duo_api"` AccessControl AccessControlConfiguration `koanf:"access_control"` - NTP NTPConfiguration `koanf:"ntp"` Regulation RegulationConfiguration `koanf:"regulation"` - Storage StorageConfiguration `koanf:"storage"` - Notifier *NotifierConfiguration `koanf:"notifier"` - Server ServerConfiguration `koanf:"server"` - Webauthn WebauthnConfiguration `koanf:"webauthn"` + + Server ServerConfiguration `koanf:"server"` + Session SessionConfiguration `koanf:"session"` + NTP NTPConfiguration `koanf:"ntp"` + Storage StorageConfiguration `koanf:"storage"` + Notifier *NotifierConfiguration `koanf:"notifier"` + PasswordPolicy PasswordPolicyConfiguration `koanf:"password_policy"` } diff --git a/internal/configuration/schema/password_policy.go b/internal/configuration/schema/password_policy.go new file mode 100644 index 000000000..9c24815e3 --- /dev/null +++ b/internal/configuration/schema/password_policy.go @@ -0,0 +1,40 @@ +package schema + +// PasswordPolicyStandardParams represents the configuration related to standard parameters of password policy. +type PasswordPolicyStandardParams struct { + Enabled bool + MinLength int `koanf:"min_length"` + MaxLength int `koanf:"max_length"` + RequireUppercase bool `koanf:"require_uppercase"` + RequireLowercase bool `koanf:"require_lowercase"` + RequireNumber bool `koanf:"require_number"` + RequireSpecial bool `koanf:"require_special"` +} + +// PasswordPolicyZxcvbnParams represents the configuration related to zxcvbn parameters of password policy. +type PasswordPolicyZxcvbnParams struct { + Enabled bool + MinScore int `koanf:"min_score"` +} + +// PasswordPolicyConfiguration represents the configuration related to password policy. +type PasswordPolicyConfiguration struct { + Standard PasswordPolicyStandardParams `koanf:"standard"` + Zxcvbn PasswordPolicyZxcvbnParams `koanf:"zxcvbn"` +} + +// DefaultPasswordPolicyConfiguration is the default password policy configuration. +var DefaultPasswordPolicyConfiguration = PasswordPolicyConfiguration{ + Standard: PasswordPolicyStandardParams{ + Enabled: false, + MinLength: 8, + MaxLength: 0, + RequireUppercase: true, + RequireLowercase: true, + RequireNumber: true, + RequireSpecial: true, + }, + Zxcvbn: PasswordPolicyZxcvbnParams{ + Enabled: false, + }, +} diff --git a/internal/configuration/validator/configuration.go b/internal/configuration/validator/configuration.go index dd536b28d..ae34d6b74 100644 --- a/internal/configuration/validator/configuration.go +++ b/internal/configuration/validator/configuration.go @@ -60,4 +60,6 @@ func ValidateConfiguration(config *schema.Configuration, validator *schema.Struc ValidateIdentityProviders(&config.IdentityProviders, validator) ValidateNTP(config, validator) + + ValidatePasswordPolicy(&config.PasswordPolicy, validator) } diff --git a/internal/configuration/validator/const.go b/internal/configuration/validator/const.go index f2fe7920c..e5d79eb8b 100644 --- a/internal/configuration/validator/const.go +++ b/internal/configuration/validator/const.go @@ -482,6 +482,17 @@ var ValidKeys = []string{ "ntp.max_desync", "ntp.disable_startup_check", "ntp.disable_failure", + + // Password Policy keys. + "password_policy.standard.enabled", + "password_policy.standard.min_length", + "password_policy.standard.max_length", + "password_policy.standard.require_uppercase", + "password_policy.standard.require_lowercase", + "password_policy.standard.require_number", + "password_policy.standard.require_special", + "password_policy.zxcvbn.enabled", + "password_policy.zxcvbn.min_score", } var replacedKeys = map[string]string{ diff --git a/internal/configuration/validator/password_policy.go b/internal/configuration/validator/password_policy.go new file mode 100644 index 000000000..ba5cf570c --- /dev/null +++ b/internal/configuration/validator/password_policy.go @@ -0,0 +1,33 @@ +package validator + +import ( + "errors" + + "github.com/authelia/authelia/v4/internal/configuration/schema" + "github.com/authelia/authelia/v4/internal/utils" +) + +// ValidatePasswordPolicy validates and update Password Policy configuration. +func ValidatePasswordPolicy(configuration *schema.PasswordPolicyConfiguration, validator *schema.StructValidator) { + if !utils.IsBoolCountLessThanN(1, true, configuration.Standard.Enabled, configuration.Zxcvbn.Enabled) { + validator.Push(errors.New("password_policy:only one password policy can be enabled at a time")) + } + + if configuration.Standard.Enabled { + if configuration.Standard.MinLength == 0 { + configuration.Standard.MinLength = schema.DefaultPasswordPolicyConfiguration.Standard.MinLength + } else if configuration.Standard.MinLength < 0 { + validator.Push(errors.New("password_policy: min_length must be > 0")) + } + + if configuration.Standard.MaxLength == 0 { + configuration.Standard.MaxLength = schema.DefaultPasswordPolicyConfiguration.Standard.MaxLength + } + } else if configuration.Zxcvbn.Enabled { + if configuration.Zxcvbn.MinScore == 0 { + configuration.Zxcvbn.MinScore = schema.DefaultPasswordPolicyConfiguration.Zxcvbn.MinScore + } else if configuration.Zxcvbn.MinScore < 0 || configuration.Zxcvbn.MinScore > 4 { + validator.Push(errors.New("min_score must be between 0 and 4")) + } + } +} diff --git a/internal/handlers/const.go b/internal/handlers/const.go index 1b266f66f..64c174034 100644 --- a/internal/handlers/const.go +++ b/internal/handlers/const.go @@ -44,6 +44,7 @@ const ( messageUnableToRegisterSecurityKey = "Unable to register your security key." messageUnableToResetPassword = "Unable to reset your password." messageMFAValidationFailed = "Authentication failed, please retry later." + messagePasswordWeak = "Your supplied password does not meet the password policy requirements" ) const ( diff --git a/internal/handlers/errors.go b/internal/handlers/errors.go new file mode 100644 index 000000000..5111dc95d --- /dev/null +++ b/internal/handlers/errors.go @@ -0,0 +1,5 @@ +package handlers + +import "errors" + +var errPasswordPolicyNoMet = errors.New("the supplied password does not met the security policy") diff --git a/internal/handlers/handler_reset_password_step1.go b/internal/handlers/handler_reset_password_step1.go index 75cff5f0e..b7cc9a352 100644 --- a/internal/handlers/handler_reset_password_step1.go +++ b/internal/handlers/handler_reset_password_step1.go @@ -53,7 +53,28 @@ func resetPasswordIdentityFinish(ctx *middlewares.AutheliaCtx, username string) ctx.Logger.Errorf("Unable to clear password reset flag in session for user %s: %s", userSession.Username, err) } - ctx.ReplyOK() + mode := "" + if ctx.Configuration.PasswordPolicy.Standard.Enabled { + mode = "standard" + } else if ctx.Configuration.PasswordPolicy.Zxcvbn.Enabled { + mode = "zxcvbn" + } + + policyResponse := PassworPolicyBody{ + Mode: mode, + MinLength: ctx.Configuration.PasswordPolicy.Standard.MinLength, + MaxLength: ctx.Configuration.PasswordPolicy.Standard.MaxLength, + RequireLowercase: ctx.Configuration.PasswordPolicy.Standard.RequireLowercase, + RequireUppercase: ctx.Configuration.PasswordPolicy.Standard.RequireUppercase, + RequireNumber: ctx.Configuration.PasswordPolicy.Standard.RequireNumber, + RequireSpecial: ctx.Configuration.PasswordPolicy.Standard.RequireSpecial, + MinScore: ctx.Configuration.PasswordPolicy.Zxcvbn.MinScore, + } + + err = ctx.SetJSONBody(policyResponse) + if err != nil { + ctx.Logger.Errorf("Unable to send password Policy: %s", err) + } } // ResetPasswordIdentityFinish the handler for finishing the identity validation. diff --git a/internal/handlers/handler_reset_password_step2.go b/internal/handlers/handler_reset_password_step2.go index 45689b29d..c3f9dbb85 100644 --- a/internal/handlers/handler_reset_password_step2.go +++ b/internal/handlers/handler_reset_password_step2.go @@ -2,6 +2,7 @@ package handlers import ( "fmt" + "regexp" "github.com/authelia/authelia/v4/internal/middlewares" "github.com/authelia/authelia/v4/internal/utils" @@ -27,6 +28,11 @@ func ResetPasswordPost(ctx *middlewares.AutheliaCtx) { return } + if err := validatePassword(ctx, requestBody.Password); err != nil { + ctx.Error(err, messagePasswordWeak) + return + } + err = ctx.Providers.UserProvider.UpdatePassword(*userSession.PasswordResetUsername, requestBody.Password) if err != nil { @@ -54,3 +60,54 @@ func ResetPasswordPost(ctx *middlewares.AutheliaCtx) { ctx.ReplyOK() } + +// validatePassword validates if the password met the password policy rules. +func validatePassword(ctx *middlewares.AutheliaCtx, password string) error { + // password validation applies only to standard passwor policy. + if !ctx.Configuration.PasswordPolicy.Standard.Enabled { + return nil + } + + requireLowercase := ctx.Configuration.PasswordPolicy.Standard.RequireLowercase + requireUppercase := ctx.Configuration.PasswordPolicy.Standard.RequireUppercase + requireNumber := ctx.Configuration.PasswordPolicy.Standard.RequireNumber + requireSpecial := ctx.Configuration.PasswordPolicy.Standard.RequireSpecial + minLength := ctx.Configuration.PasswordPolicy.Standard.MinLength + maxlength := ctx.Configuration.PasswordPolicy.Standard.MaxLength + + var patterns []string + + if (minLength > 0 && len(password) < minLength) || (maxlength > 0 && len(password) > maxlength) { + return errPasswordPolicyNoMet + } + + if requireLowercase { + patterns = append(patterns, "[a-z]+") + } + + if requireUppercase { + patterns = append(patterns, "[A-Z]+") + } + + if requireNumber { + patterns = append(patterns, "[0-9]+") + } + + if requireSpecial { + patterns = append(patterns, "[^a-zA-Z0-9]+") + } + + for _, pattern := range patterns { + re, err := regexp.Compile(pattern) + + if err != nil { + return err + } + + if found := re.MatchString(password); !found { + return errPasswordPolicyNoMet + } + } + + return nil +} diff --git a/internal/handlers/types.go b/internal/handlers/types.go index 785d6f0d3..e4670220e 100644 --- a/internal/handlers/types.go +++ b/internal/handlers/types.go @@ -112,3 +112,15 @@ type resetPasswordStep1RequestBody struct { type resetPasswordStep2RequestBody struct { Password string `json:"password"` } + +// PassworPolicyBody represents the response sent by the password reset step 2. +type PassworPolicyBody struct { + Mode string `json:"mode"` + MinLength int `json:"min_length"` + MaxLength int `json:"max_length"` + MinScore int `json:"min_score"` + RequireUppercase bool `json:"require_uppercase"` + RequireLowercase bool `json:"require_lowercase"` + RequireNumber bool `json:"require_number"` + RequireSpecial bool `json:"require_special"` +} diff --git a/internal/suites/Standalone/configuration.yml b/internal/suites/Standalone/configuration.yml index 4f5e71510..cf6723d3d 100644 --- a/internal/suites/Standalone/configuration.yml +++ b/internal/suites/Standalone/configuration.yml @@ -99,4 +99,21 @@ ntp: max_desync: 3s ## You can enable or disable the NTP synchronization check on startup disable_startup_check: false + +password_policy: + standard: + # Enables standard password Policy + enabled: false + min_length: 8 + max_length: 0 + require_uppercase: true + require_lowercase: true + require_number: true + require_special: true + zxcvbn: + ## zxcvbn: uses zxcvbn for password strength checking (see: https://github.com/dropbox/zxcvbn) + ## Note that the zxcvbn option does not prohibit the user from using a weak password, + ## it only offers feedback about the strength of the password they are entering. + ## if you need to enforce password rules, you should use `mode=classic` + enabled: false ... diff --git a/internal/utils/bools.go b/internal/utils/bools.go new file mode 100644 index 000000000..7c8da8f05 --- /dev/null +++ b/internal/utils/bools.go @@ -0,0 +1,32 @@ +package utils + +// IsBoolCountLessThanN takes an int (n), bool (v), and then a variadic slice of bool (vals). If the number of bools in vals with +// the value v is more than n, it returns false, otherwise it returns true. +func IsBoolCountLessThanN(n int, v bool, vals ...bool) bool { + lvals := len(vals) + + // If lvals (len of vals) is less than n it can't possibly have more than n so we can short circuit here. + if lvals < n { + return true + } + + j := 0 + + for i, val := range vals { + if val == v { + j++ + } + + // If lvals (len of vals) minus the current index (the remainder) plus the number of positives + // is less than n we can short circuit here. + if lvals-i+j < n { + return true + } + + if j > n { + return false + } + } + + return true +} diff --git a/internal/utils/bools_test.go b/internal/utils/bools_test.go new file mode 100644 index 000000000..36bb2c017 --- /dev/null +++ b/internal/utils/bools_test.go @@ -0,0 +1,114 @@ +package utils + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestIsBoolCountLessThanN(t *testing.T) { + type h struct { + n int + v bool + vals []bool + } + + testCases := []struct { + have h + want bool + }{ + { + have: h{ + n: 1, + v: true, + vals: []bool{true, false, false}, + }, + want: true, + }, + { + have: h{ + n: 1, + v: true, + vals: []bool{true, true, false}, + }, + want: false, + }, + { + have: h{ + n: 2, + v: true, + vals: []bool{true, true, false}, + }, + want: true, + }, + { + have: h{ + n: 2, + v: true, + vals: []bool{true, true, true}, + }, + want: false, + }, + { + have: h{ + n: 300, + v: true, + vals: []bool{true, true, true}, + }, + want: true, + }, + { + have: h{ + n: 300, + v: false, + vals: []bool{true, true, true}, + }, + want: true, + }, + { + have: h{ + n: 2, + v: false, + vals: []bool{false, false, false}, + }, + want: false, + }, + { + have: h{ + n: 1, + v: false, + vals: []bool{false, true, true}, + }, + want: true, + }, + { + have: h{ + n: 20, + v: false, + vals: []bool{true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, + true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, + true, true, true, true, true}, + }, + want: true, + }, + } + + for _, tc := range testCases { + countTrue := 0 + countFalse := 0 + + for _, v := range tc.have.vals { + if v { + countTrue++ + } else { + countFalse++ + } + } + + t.Run(fmt.Sprintf("%d %t true(%d)-false(%d)/should be %t", tc.have.n, tc.have.v, countTrue, countFalse, tc.want), func(t *testing.T) { + assert.Equal(t, tc.want, IsBoolCountLessThanN(tc.have.n, tc.have.v, tc.have.vals...)) + }) + } +} diff --git a/web/package.json b/web/package.json index 3b0efd299..b50d6c59b 100644 --- a/web/package.json +++ b/web/package.json @@ -23,7 +23,8 @@ "react-i18next": "11.16.2", "react-loading": "2.0.3", "react-otp-input": "2.4.0", - "react-router-dom": "6.3.0" + "react-router-dom": "6.3.0", + "zxcvbn": "^4.4.2" }, "scripts": { "prepare": "cd .. && husky install .github", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 88ce78e78..ab6037ab4 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -56,6 +56,7 @@ specifiers: vite-plugin-istanbul: 2.5.1 vite-plugin-svgr: 1.1.0 vite-tsconfig-paths: 3.4.1 + zxcvbn: ^4.4.2 dependencies: '@fortawesome/fontawesome-svg-core': 6.1.1 @@ -79,6 +80,7 @@ dependencies: react-loading: 2.0.3_react@18.0.0 react-otp-input: 2.4.0_react-dom@18.0.0+react@18.0.0 react-router-dom: 6.3.0_react-dom@18.0.0+react@18.0.0 + zxcvbn: 4.4.2 devDependencies: '@commitlint/cli': 16.2.3 @@ -138,39 +140,11 @@ packages: '@babel/highlight': 7.16.10 dev: true - /@babel/compat-data/7.17.0: - resolution: {integrity: sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==} - engines: {node: '>=6.9.0'} - dev: true - /@babel/compat-data/7.17.7: resolution: {integrity: sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.17.5: - resolution: {integrity: sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.1.2 - '@babel/code-frame': 7.16.7 - '@babel/generator': 7.17.3 - '@babel/helper-compilation-targets': 7.16.7_@babel+core@7.17.5 - '@babel/helper-module-transforms': 7.17.6 - '@babel/helpers': 7.17.2 - '@babel/parser': 7.17.3 - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.3 - '@babel/types': 7.17.0 - convert-source-map: 1.8.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/core/7.17.8: resolution: {integrity: sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==} engines: {node: '>=6.9.0'} @@ -188,34 +162,25 @@ packages: convert-source-map: 1.8.0 debug: 4.3.4 gensync: 1.0.0-beta.2 - json5: 2.2.0 + json5: 2.2.1 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/eslint-parser/7.17.0_@babel+core@7.17.5: + /@babel/eslint-parser/7.17.0_@babel+core@7.17.8: resolution: {integrity: sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': '>=7.11.0' eslint: ^7.5.0 || ^8.0.0 dependencies: - '@babel/core': 7.17.5 + '@babel/core': 7.17.8 eslint-scope: 5.1.1 eslint-visitor-keys: 2.1.0 semver: 6.3.0 dev: true - /@babel/generator/7.17.3: - resolution: {integrity: sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - jsesc: 2.5.2 - source-map: 0.5.7 - dev: true - /@babel/generator/7.17.7: resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} engines: {node: '>=6.9.0'} @@ -240,19 +205,6 @@ packages: '@babel/types': 7.17.0 dev: true - /@babel/helper-compilation-targets/7.16.7_@babel+core@7.17.5: - resolution: {integrity: sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.17.0 - '@babel/core': 7.17.5 - '@babel/helper-validator-option': 7.16.7 - browserslist: 4.20.0 - semver: 6.3.0 - dev: true - /@babel/helper-compilation-targets/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} engines: {node: '>=6.9.0'} @@ -262,7 +214,7 @@ packages: '@babel/compat-data': 7.17.7 '@babel/core': 7.17.8 '@babel/helper-validator-option': 7.16.7 - browserslist: 4.20.0 + browserslist: 4.20.2 semver: 6.3.0 dev: true @@ -276,7 +228,7 @@ packages: '@babel/helper-annotate-as-pure': 7.16.7 '@babel/helper-environment-visitor': 7.16.7 '@babel/helper-function-name': 7.16.7 - '@babel/helper-member-expression-to-functions': 7.16.7 + '@babel/helper-member-expression-to-functions': 7.17.7 '@babel/helper-optimise-call-expression': 7.16.7 '@babel/helper-replace-supers': 7.16.7 '@babel/helper-split-export-declaration': 7.16.7 @@ -350,8 +302,8 @@ packages: '@babel/types': 7.17.0 dev: true - /@babel/helper-member-expression-to-functions/7.16.7: - resolution: {integrity: sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==} + /@babel/helper-member-expression-to-functions/7.17.7: + resolution: {integrity: sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.17.0 @@ -364,22 +316,6 @@ packages: '@babel/types': 7.17.0 dev: true - /@babel/helper-module-transforms/7.17.6: - resolution: {integrity: sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-simple-access': 7.16.7 - '@babel/helper-split-export-declaration': 7.16.7 - '@babel/helper-validator-identifier': 7.16.7 - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.3 - '@babel/types': 7.17.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-module-transforms/7.17.7: resolution: {integrity: sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==} engines: {node: '>=6.9.0'} @@ -424,7 +360,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-member-expression-to-functions': 7.16.7 + '@babel/helper-member-expression-to-functions': 7.17.7 '@babel/helper-optimise-call-expression': 7.16.7 '@babel/traverse': 7.17.3 '@babel/types': 7.17.0 @@ -432,13 +368,6 @@ packages: - supports-color dev: true - /@babel/helper-simple-access/7.16.7: - resolution: {integrity: sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - /@babel/helper-simple-access/7.17.7: resolution: {integrity: sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==} engines: {node: '>=6.9.0'} @@ -482,17 +411,6 @@ packages: - supports-color dev: true - /@babel/helpers/7.17.2: - resolution: {integrity: sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.3 - '@babel/types': 7.17.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helpers/7.17.8: resolution: {integrity: sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==} engines: {node: '>=6.9.0'} @@ -513,12 +431,6 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser/7.17.3: - resolution: {integrity: sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==} - engines: {node: '>=6.0.0'} - hasBin: true - dev: true - /@babel/parser/7.17.8: resolution: {integrity: sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==} engines: {node: '>=6.0.0'} @@ -588,8 +500,8 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-decorators/7.17.2_@babel+core@7.17.8: - resolution: {integrity: sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw==} + /@babel/plugin-proposal-decorators/7.17.8_@babel+core@7.17.8: + resolution: {integrity: sha512-U69odN4Umyyx1xO1rTII0IDkAEC+RNlcKXtqOblfpzqy1C+aOplb76BQNq0+XdpVkOaPlpEDwd++joY8FNFJKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -746,15 +658,6 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.17.5: - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.17.8: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -764,15 +667,6 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.17.5: - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.17.8: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: @@ -782,15 +676,6 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.17.5: - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.17.8: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -848,15 +733,6 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.17.5: - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.17.8: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -866,15 +742,6 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.17.5: - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.17.8: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -894,15 +761,6 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.17.5: - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.17.8: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -912,15 +770,6 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.17.5: - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.17.8: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: @@ -930,15 +779,6 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.17.5: - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.17.8: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: @@ -948,15 +788,6 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.17.5: - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.17.8: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -966,15 +797,6 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.17.5: - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.17.8: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -984,15 +806,6 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.17.5: - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.17.8: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: @@ -1012,16 +825,6 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.17.5: - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.17.8: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} @@ -1115,8 +918,8 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true - /@babel/plugin-transform-destructuring/7.17.3_@babel+core@7.17.8: - resolution: {integrity: sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg==} + /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.17.8: + resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1224,38 +1027,23 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs/7.16.8_@babel+core@7.17.5: - resolution: {integrity: sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-module-transforms': 7.17.6 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-simple-access': 7.16.7 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-commonjs/7.16.8_@babel+core@7.17.8: - resolution: {integrity: sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==} + /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.17.8: + resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-module-transforms': 7.17.6 + '@babel/helper-module-transforms': 7.17.7 '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-simple-access': 7.16.7 + '@babel/helper-simple-access': 7.17.7 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs/7.16.7_@babel+core@7.17.8: - resolution: {integrity: sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==} + /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.17.8: + resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1572,7 +1360,7 @@ packages: '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.17.8 '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.17.8 '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-transform-destructuring': 7.17.3_@babel+core@7.17.8 + '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.17.8 '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.17.8 '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.17.8 '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.17.8 @@ -1581,8 +1369,8 @@ packages: '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.17.8 '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.17.8 '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-transform-modules-commonjs': 7.16.8_@babel+core@7.17.8 - '@babel/plugin-transform-modules-systemjs': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.17.8 + '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.17.8 '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.17.8 '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8_@babel+core@7.17.8 '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.17.8 @@ -1651,16 +1439,16 @@ packages: - supports-color dev: true - /@babel/runtime-corejs3/7.17.2: - resolution: {integrity: sha512-NcKtr2epxfIrNM4VOmPKO46TvDMCBhgi2CrSHaEarrz+Plk2K5r9QemmOFTGpZaoKnWoGH5MO+CzeRsih/Fcgg==} + /@babel/runtime-corejs3/7.17.8: + resolution: {integrity: sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ==} engines: {node: '>=6.9.0'} dependencies: core-js-pure: 3.21.1 regenerator-runtime: 0.13.9 dev: true - /@babel/runtime/7.17.2: - resolution: {integrity: sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==} + /@babel/runtime/7.17.8: + resolution: {integrity: sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.9 @@ -1670,7 +1458,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.16.7 - '@babel/parser': 7.17.3 + '@babel/parser': 7.17.8 '@babel/types': 7.17.0 dev: true @@ -1679,12 +1467,12 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.16.7 - '@babel/generator': 7.17.3 + '@babel/generator': 7.17.7 '@babel/helper-environment-visitor': 7.16.7 '@babel/helper-function-name': 7.16.7 '@babel/helper-hoist-variables': 7.16.7 '@babel/helper-split-export-declaration': 7.16.7 - '@babel/parser': 7.17.3 + '@babel/parser': 7.17.8 '@babel/types': 7.17.0 debug: 4.3.4 globals: 11.12.0 @@ -1726,7 +1514,7 @@ packages: lodash: 4.17.21 resolve-from: 5.0.0 resolve-global: 1.0.0 - yargs: 17.3.1 + yargs: 17.4.0 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -1899,7 +1687,7 @@ packages: ajv: 6.12.6 debug: 4.3.4 espree: 7.3.1 - globals: 13.12.1 + globals: 13.13.0 ignore: 4.0.6 import-fresh: 3.3.0 js-yaml: 3.14.1 @@ -2026,7 +1814,7 @@ packages: jest-util: 27.5.1 jest-validate: 27.5.1 jest-watcher: 27.5.1 - micromatch: 4.0.4 + micromatch: 4.0.5 rimraf: 3.0.2 slash: 3.0.0 strip-ansi: 6.0.1 @@ -2152,7 +1940,7 @@ packages: jest-haste-map: 26.6.2 jest-regex-util: 26.0.0 jest-util: 26.6.2 - micromatch: 4.0.4 + micromatch: 4.0.5 pirates: 4.0.5 slash: 3.0.0 source-map: 0.6.1 @@ -2175,7 +1963,7 @@ packages: jest-haste-map: 27.5.1 jest-regex-util: 27.5.1 jest-util: 27.5.1 - micromatch: 4.0.4 + micromatch: 4.0.5 pirates: 4.0.5 slash: 3.0.0 source-map: 0.6.1 @@ -2234,7 +2022,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 '@material-ui/styles': 4.11.4_c13207e15fed56fc7b9b70ab319ad0ff '@material-ui/system': 4.12.1_c13207e15fed56fc7b9b70ab319ad0ff '@material-ui/types': 5.1.0_@types+react@17.0.43 @@ -2264,7 +2052,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 '@material-ui/core': 4.12.3_c13207e15fed56fc7b9b70ab319ad0ff '@types/react': 17.0.43 react: 18.0.0 @@ -2283,7 +2071,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 '@emotion/hash': 0.8.0 '@material-ui/types': 5.1.0_@types+react@17.0.43 '@material-ui/utils': 4.11.2_react-dom@18.0.0+react@18.0.0 @@ -2316,7 +2104,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 '@material-ui/utils': 4.11.2_react-dom@18.0.0+react@18.0.0 '@types/react': 17.0.43 csstype: 2.6.20 @@ -2343,7 +2131,7 @@ packages: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 prop-types: 15.8.1 react: 18.0.0 react-dom: 18.0.0_react@18.0.0 @@ -2379,8 +2167,8 @@ packages: picomatch: 2.3.1 dev: true - /@rushstack/eslint-patch/1.1.0: - resolution: {integrity: sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A==} + /@rushstack/eslint-patch/1.1.1: + resolution: {integrity: sha512-BUyKJGdDWqvWC5GEhyOiUrGNi9iJUr4CU0O2WxJL6QJhHeeA/NVBalH+FeK0r/x/W0rPymXt5s78TDS7d6lCwg==} dev: true /@sinonjs/commons/1.8.3: @@ -2518,12 +2306,12 @@ packages: - supports-color dev: true - /@testing-library/dom/8.11.3: - resolution: {integrity: sha512-9LId28I+lx70wUiZjLvi1DB/WT2zGOxUh46glrSNMaWVx849kKAluezVzZrXJfTKKoQTmEOutLes/bHg4Bj3aA==} + /@testing-library/dom/8.12.0: + resolution: {integrity: sha512-rBrJk5WjI02X1edtiUcZhgyhgBhiut96r5Jp8J5qktKdcvLcZpKDW8i2hkGMMItxrghjXuQ5AM6aE0imnFawaw==} engines: {node: '>=12'} dependencies: '@babel/code-frame': 7.16.7 - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 '@types/aria-query': 4.2.2 aria-query: 5.0.0 chalk: 4.1.2 @@ -2536,7 +2324,7 @@ packages: resolution: {integrity: sha512-u5DfKj4wfSt6akfndfu1eG06jsdyA/IUrlX2n3pyq5UXgXMhXY+NJb8eNK/7pqPWAhCKsCGWDdDO0zKMKAYkEA==} engines: {node: '>=8', npm: '>=6', yarn: '>=1'} dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 '@types/testing-library__jest-dom': 5.14.3 aria-query: 5.0.0 chalk: 3.0.0 @@ -2554,8 +2342,8 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@babel/runtime': 7.17.2 - '@testing-library/dom': 8.11.3 + '@babel/runtime': 7.17.8 + '@testing-library/dom': 8.12.0 '@types/react-dom': 17.0.14 react: 18.0.0 react-dom: 18.0.0_react@18.0.0 @@ -2586,8 +2374,8 @@ packages: resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} dev: true - /@types/babel__core/7.1.18: - resolution: {integrity: sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==} + /@types/babel__core/7.1.19: + resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} dependencies: '@babel/parser': 7.17.8 '@babel/types': 7.17.0 @@ -2644,8 +2432,8 @@ packages: pretty-format: 27.5.1 dev: true - /@types/json-schema/7.0.9: - resolution: {integrity: sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==} + /@types/json-schema/7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true /@types/json5/0.0.29: @@ -2755,13 +2543,13 @@ packages: - supports-color dev: true - /@typescript-eslint/experimental-utils/5.14.0_typescript@4.6.3: - resolution: {integrity: sha512-ke48La1A/TWAn949cdgQiP3oK0NT7ArhDAOVOmNLVjT/uAXlFyrJY8dM4qqxHrATzIp8glg+G2OZjy2lRKBIUA==} + /@typescript-eslint/experimental-utils/5.17.0_typescript@4.6.3: + resolution: {integrity: sha512-U4sM5z0/ymSYqQT6I7lz8l0ZZ9zrya5VIwrwAP5WOJVabVtVsIpTMxPQe+D3qLyePT+VlETUTO2nA1+PufPx9Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.14.0_typescript@4.6.3 + '@typescript-eslint/utils': 5.17.0_typescript@4.6.3 transitivePeerDependencies: - supports-color - typescript @@ -2786,14 +2574,6 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager/5.14.0: - resolution: {integrity: sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.14.0 - '@typescript-eslint/visitor-keys': 5.14.0 - dev: true - /@typescript-eslint/scope-manager/5.17.0: resolution: {integrity: sha512-062iCYQF/doQ9T2WWfJohQKKN1zmmXVfAcS3xaiialiw8ZUGy05Em6QVNYJGO34/sU1a7a+90U3dUNfqUDHr3w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2820,37 +2600,11 @@ packages: - supports-color dev: true - /@typescript-eslint/types/5.14.0: - resolution: {integrity: sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@typescript-eslint/types/5.17.0: resolution: {integrity: sha512-AgQ4rWzmCxOZLioFEjlzOI3Ch8giDWx8aUDxyNw9iOeCvD3GEYAB7dxWGQy4T/rPVe8iPmu73jPHuaSqcjKvxw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.14.0_typescript@4.6.3: - resolution: {integrity: sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.14.0 - '@typescript-eslint/visitor-keys': 5.14.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.3.5 - tsutils: 3.21.0_typescript@4.6.3 - typescript: 4.6.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/typescript-estree/5.17.0_typescript@4.6.3: resolution: {integrity: sha512-X1gtjEcmM7Je+qJRhq7ZAAaNXYhTgqMkR10euC4Si6PIjb+kwEQHSxGazXUQXFyqfEXdkGf6JijUu5R0uceQzg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2872,30 +2626,13 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.14.0_typescript@4.6.3: - resolution: {integrity: sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.9 - '@typescript-eslint/scope-manager': 5.14.0 - '@typescript-eslint/types': 5.14.0 - '@typescript-eslint/typescript-estree': 5.14.0_typescript@4.6.3 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@typescript-eslint/utils/5.17.0_typescript@4.6.3: resolution: {integrity: sha512-DVvndq1QoxQH+hFv+MUQHrrWZ7gQ5KcJzyjhzcqB1Y2Xes1UQQkTRPUfRpqhS8mhTWsSb2+iyvDW1Lef5DD7vA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@types/json-schema': 7.0.9 + '@types/json-schema': 7.0.11 '@typescript-eslint/scope-manager': 5.17.0 '@typescript-eslint/types': 5.17.0 '@typescript-eslint/typescript-estree': 5.17.0_typescript@4.6.3 @@ -2906,14 +2643,6 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys/5.14.0: - resolution: {integrity: sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.14.0 - eslint-visitor-keys: 3.3.0 - dev: true - /@typescript-eslint/visitor-keys/5.17.0: resolution: {integrity: sha512-6K/zlc4OfCagUu7Am/BD5k8PSWQOgh34Nrv9Rxe2tBzlJ7uOeJ/h7ugCGDCeEZHT6k2CJBhbk9IsbkPI0uvUkA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3005,8 +2734,8 @@ packages: uri-js: 4.4.1 dev: true - /ajv/8.10.0: - resolution: {integrity: sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==} + /ajv/8.11.0: + resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 @@ -3084,8 +2813,8 @@ packages: resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} engines: {node: '>=6.0'} dependencies: - '@babel/runtime': 7.17.2 - '@babel/runtime-corejs3': 7.17.2 + '@babel/runtime': 7.17.8 + '@babel/runtime-corejs3': 7.17.8 dev: true /aria-query/5.0.0: @@ -3118,7 +2847,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.19.1 + es-abstract: 1.19.2 get-intrinsic: 1.1.1 is-string: 1.0.7 dev: true @@ -3139,7 +2868,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.19.1 + es-abstract: 1.19.2 dev: true /array.prototype.flatmap/1.2.5: @@ -3148,7 +2877,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.19.1 + es-abstract: 1.19.2 dev: true /arrify/1.0.1: @@ -3197,18 +2926,18 @@ packages: resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} dev: true - /babel-jest/26.6.3_@babel+core@7.17.5: + /babel-jest/26.6.3_@babel+core@7.17.8: resolution: {integrity: sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==} engines: {node: '>= 10.14.2'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.17.5 + '@babel/core': 7.17.8 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/babel__core': 7.1.18 + '@types/babel__core': 7.1.19 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 26.6.2_@babel+core@7.17.5 + babel-preset-jest: 26.6.2_@babel+core@7.17.8 chalk: 4.1.2 graceful-fs: 4.2.9 slash: 3.0.0 @@ -3225,7 +2954,7 @@ packages: '@babel/core': 7.17.8 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/babel__core': 7.1.18 + '@types/babel__core': 7.1.19 babel-plugin-istanbul: 6.1.1 babel-preset-jest: 27.5.1_@babel+core@7.17.8 chalk: 4.1.2 @@ -3260,7 +2989,7 @@ packages: dependencies: '@babel/template': 7.16.7 '@babel/types': 7.17.0 - '@types/babel__core': 7.1.18 + '@types/babel__core': 7.1.19 '@types/babel__traverse': 7.14.2 dev: true @@ -3270,7 +2999,7 @@ packages: dependencies: '@babel/template': 7.16.7 '@babel/types': 7.17.0 - '@types/babel__core': 7.1.18 + '@types/babel__core': 7.1.19 '@types/babel__traverse': 7.14.2 dev: true @@ -3278,7 +3007,7 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 cosmiconfig: 7.0.1 resolve: 1.22.0 dev: true @@ -3323,26 +3052,6 @@ packages: resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} dev: true - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.17.5: - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.17.5 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.5 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.17.5 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.17.5 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.17.5 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.17.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.17.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.5 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.17.5 - dev: true - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.17.8: resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: @@ -3363,15 +3072,15 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.17.8 dev: true - /babel-preset-jest/26.6.2_@babel+core@7.17.5: + /babel-preset-jest/26.6.2_@babel+core@7.17.8: resolution: {integrity: sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==} engines: {node: '>= 10.14.2'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.17.5 + '@babel/core': 7.17.8 babel-plugin-jest-hoist: 26.6.2 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.5 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.8 dev: true /babel-preset-jest/27.5.1_@babel+core@7.17.8: @@ -3390,7 +3099,7 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-proposal-decorators': 7.17.2_@babel+core@7.17.8 + '@babel/plugin-proposal-decorators': 7.17.8_@babel+core@7.17.8 '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.17.8 '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.17.8 '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.17.8 @@ -3401,7 +3110,7 @@ packages: '@babel/preset-env': 7.16.11_@babel+core@7.17.8 '@babel/preset-react': 7.16.7_@babel+core@7.17.8 '@babel/preset-typescript': 7.16.7_@babel+core@7.17.8 - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 babel-plugin-macros: 3.1.0 babel-plugin-transform-react-remove-prop-types: 0.4.24 transitivePeerDependencies: @@ -3459,13 +3168,13 @@ packages: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} dev: true - /browserslist/4.20.0: - resolution: {integrity: sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==} + /browserslist/4.20.2: + resolution: {integrity: sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001314 - electron-to-chromium: 1.4.79 + caniuse-lite: 1.0.30001324 + electron-to-chromium: 1.4.103 escalade: 3.1.1 node-releases: 2.0.2 picocolors: 1.0.0 @@ -3527,8 +3236,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite/1.0.30001314: - resolution: {integrity: sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw==} + /caniuse-lite/1.0.30001324: + resolution: {integrity: sha512-/eYp1J6zYh1alySQB4uzYFkLmxxI8tk0kxldbNHXp8+v+rdMKdUBNjRLz7T7fz6Iox+1lIdYpc7rq6ZcXfTukg==} dev: true /capture-exit/2.0.0: @@ -3725,7 +3434,7 @@ packages: /core-js-compat/3.21.1: resolution: {integrity: sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==} dependencies: - browserslist: 4.20.0 + browserslist: 4.20.2 semver: 7.0.0 dev: true @@ -3796,7 +3505,7 @@ packages: /css-vendor/2.0.8: resolution: {integrity: sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==} dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 is-in-browser: 1.1.3 dev: false @@ -3864,18 +3573,6 @@ packages: ms: 2.1.3 dev: true - /debug/4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - /debug/4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -3999,7 +3696,7 @@ packages: /dom-helpers/5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 csstype: 3.0.11 dev: false @@ -4017,8 +3714,8 @@ packages: is-obj: 2.0.0 dev: true - /electron-to-chromium/1.4.79: - resolution: {integrity: sha512-nWfAxof87mGHkbORCwVRPst4FlSVdprOKS6dBMrcwn3sjwf8iHXEhsu1+FU5Psd7Ps3KKeBufAdfsPK5BmbSUg==} + /electron-to-chromium/1.4.103: + resolution: {integrity: sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==} dev: true /emittery/0.8.1: @@ -4058,8 +3755,8 @@ packages: is-arrayish: 0.2.1 dev: true - /es-abstract/1.19.1: - resolution: {integrity: sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==} + /es-abstract/1.19.2: + resolution: {integrity: sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -4073,7 +3770,7 @@ packages: is-callable: 1.2.4 is-negative-zero: 2.0.2 is-regex: 1.1.4 - is-shared-array-buffer: 1.0.1 + is-shared-array-buffer: 1.0.2 is-string: 1.0.7 is-weakref: 1.0.2 object-inspect: 1.12.0 @@ -4093,8 +3790,8 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild-android-64/0.14.25: - resolution: {integrity: sha512-L5vCUk7TzFbBnoESNoXjU3x9+/+7TDIE/1mTfy/erAfvZAqC+S3sp/Qa9wkypFMcFvN9FzvESkTlpeQDolREtQ==} + /esbuild-android-64/0.14.30: + resolution: {integrity: sha512-vdJ7t8A8msPfKpYUGUV/KaTQRiZ0vDa2XSTlzXVkGGVHLKPeb85PBUtYJcEgw3htW3IdX5i1t1IMdQCwJJgNAg==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -4102,8 +3799,8 @@ packages: dev: true optional: true - /esbuild-android-arm64/0.14.25: - resolution: {integrity: sha512-4jv5xPjM/qNm27T5j3ZEck0PvjgQtoMHnz4FzwF5zNP56PvY2CT0WStcAIl6jNlsuDdN63rk2HRBIsO6xFbcFw==} + /esbuild-android-arm64/0.14.30: + resolution: {integrity: sha512-BdgGfxeA5hBQNErLr7BWJUA8xjflEfyaARICy8e0OJYNSAwDbEzOf8LyiKWSrDcgV129mWhi3VpbNQvOIDEHcg==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -4111,8 +3808,8 @@ packages: dev: true optional: true - /esbuild-darwin-64/0.14.25: - resolution: {integrity: sha512-TGp8tuudIxOyWd1+8aYPxQmC1ZQyvij/AfNBa35RubixD0zJ1vkKHVAzo0Zao1zcG6pNqiSyzfPto8vmg0s7oA==} + /esbuild-darwin-64/0.14.30: + resolution: {integrity: sha512-VRaOXMMrsG5n53pl4qFZQdXy2+E0NoLP/QH3aDUI0+bQP+ZHDmbINKcDy2IX7GVFI9kqPS18iJNAs5a6/G2LZg==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -4120,8 +3817,8 @@ packages: dev: true optional: true - /esbuild-darwin-arm64/0.14.25: - resolution: {integrity: sha512-oTcDgdm0MDVEmw2DWu8BV68pYuImpFgvWREPErBZmNA4MYKGuBRaCiJqq6jZmBR1x+3y1DWCjez+5uLtuAm6mw==} + /esbuild-darwin-arm64/0.14.30: + resolution: {integrity: sha512-qDez+fHMOrO9Oc9qjt/x+sy09RJVh62kik5tVybKRLmezeV4qczM9/sAYY57YN0aWLdHbcCj2YqJUWYJNsgKnw==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -4129,8 +3826,8 @@ packages: dev: true optional: true - /esbuild-freebsd-64/0.14.25: - resolution: {integrity: sha512-ueAqbnMZ8arnuLH8tHwTCQYeptnHOUV7vA6px6j4zjjQwDx7TdP7kACPf3TLZLdJQ3CAD1XCvQ2sPhX+8tacvQ==} + /esbuild-freebsd-64/0.14.30: + resolution: {integrity: sha512-mec1jENcImVVagddZlGWsdAUwBnzR5cgnhzCxv+9fSMxKbx1uZYLLUAnLPp8m/i934zrumR1xGjJ5VoWdPlI2w==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -4138,8 +3835,8 @@ packages: dev: true optional: true - /esbuild-freebsd-arm64/0.14.25: - resolution: {integrity: sha512-+ZVWud2HKh+Ob6k/qiJWjBtUg4KmJGGmbvEXXW1SNKS7hW7HU+Zq2ZCcE1akFxOPkVB+EhOty/sSek30tkCYug==} + /esbuild-freebsd-arm64/0.14.30: + resolution: {integrity: sha512-cpjbTs6Iok/AfeB0JgTzyUJTMStC1SQULmany5nHx6S4GTkSgaAHuJzZO0GcVWqghI4e0YL/bjXAhN5Mn6feNw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -4152,15 +3849,15 @@ packages: peerDependencies: esbuild: '>=0.8.50' dependencies: - '@babel/core': 7.17.5 - '@babel/plugin-transform-modules-commonjs': 7.16.8_@babel+core@7.17.5 - babel-jest: 26.6.3_@babel+core@7.17.5 + '@babel/core': 7.17.8 + '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.17.8 + babel-jest: 26.6.3_@babel+core@7.17.8 transitivePeerDependencies: - supports-color dev: true - /esbuild-linux-32/0.14.25: - resolution: {integrity: sha512-3OP/lwV3kCzEz45tobH9nj+uE4ubhGsfx+tn0L26WAGtUbmmcRpqy7XRG/qK7h1mClZ+eguIANcQntYMdYklfw==} + /esbuild-linux-32/0.14.30: + resolution: {integrity: sha512-liIONVT4F2kZmOMwtwASqZ8WkIjb5HHBR9HUffdHiuotSTF3CyZO+EJf+Og+SYYuuVIvt0qHNSFjBA/iSESteQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -4168,8 +3865,8 @@ packages: dev: true optional: true - /esbuild-linux-64/0.14.25: - resolution: {integrity: sha512-+aKHdHZmX9qwVlQmu5xYXh7GsBFf4TWrePgeJTalhXHOG7NNuUwoHmketGiZEoNsWyyqwH9rE5BC+iwcLY30Ug==} + /esbuild-linux-64/0.14.30: + resolution: {integrity: sha512-LUnpzoMpRqFON5En4qEj6NWiyH6a1K+Y2qYNKrCy5qPTjDoG/EWeqMz69n8Uv7pRuvDKl3FNGJ1dufTrA5i0sw==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -4177,8 +3874,8 @@ packages: dev: true optional: true - /esbuild-linux-arm/0.14.25: - resolution: {integrity: sha512-aTLcE2VBoLydL943REcAcgnDi3bHtmULSXWLbjtBdtykRatJVSxKMjK9YlBXUZC4/YcNQfH7AxwVeQr9fNxPhw==} + /esbuild-linux-arm/0.14.30: + resolution: {integrity: sha512-97T+bbXnpqf7mfIG49UR7ZSJFGgvc22byn74qw3Kx2GDCBSQoVFjyWuKOHGXp8nXk3XYrdFF+mQ8yQ7aNsgQvg==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -4186,8 +3883,8 @@ packages: dev: true optional: true - /esbuild-linux-arm64/0.14.25: - resolution: {integrity: sha512-UxfenPx/wSZx55gScCImPtXekvZQLI2GW3qe5dtlmU7luiqhp5GWPzGeQEbD3yN3xg/pHc671m5bma5Ns7lBHw==} + /esbuild-linux-arm64/0.14.30: + resolution: {integrity: sha512-DHZHn6FK5q/KL0fpNT/0jE38Nnyk2rXxKE9WENi95EXtqfOLPgE8tzjTZQNgpr61R95QX4ymQU26ni3IZk8buQ==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -4195,8 +3892,8 @@ packages: dev: true optional: true - /esbuild-linux-mips64le/0.14.25: - resolution: {integrity: sha512-wLWYyqVfYx9Ur6eU5RT92yJVsaBGi5RdkoWqRHOqcJ38Kn60QMlcghsKeWfe9jcYut8LangYZ98xO1LxIoSXrQ==} + /esbuild-linux-mips64le/0.14.30: + resolution: {integrity: sha512-fLUzTFZ7uknC0aPTk7/lM7NmaG/9ZqE3SaHEphcaM009SZK/mDOvZugWi1ss6WGNhk13dUrhkfHcc4FSb9hYhg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -4204,8 +3901,8 @@ packages: dev: true optional: true - /esbuild-linux-ppc64le/0.14.25: - resolution: {integrity: sha512-0dR6Csl6Zas3g4p9ULckEl8Mo8IInJh33VCJ3eaV1hj9+MHGdmDOakYMN8MZP9/5nl+NU/0ygpd14cWgy8uqRw==} + /esbuild-linux-ppc64le/0.14.30: + resolution: {integrity: sha512-2Oudm2WEfj0dNU9bzIl5L/LrsMEmHWsOsYgJJqu8fDyUDgER+J1d33qz3cUdjsJk7gAENayIxDSpsuCszx0w3A==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -4213,8 +3910,8 @@ packages: dev: true optional: true - /esbuild-linux-riscv64/0.14.25: - resolution: {integrity: sha512-J4d20HDmTrgvhR0bdkDhvvJGaikH3LzXQnNaseo8rcw9Yqby9A90gKUmWpfwqLVNRILvNnAmKLfBjCKU9ajg8w==} + /esbuild-linux-riscv64/0.14.30: + resolution: {integrity: sha512-RPMucPW47rV4t2jlelaE948iCRtbZf5RhifxSwzlpM1Mqdyu99MMNK0w4jFreGTmLN+oGomxIOxD6n+2E/XqHw==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -4222,8 +3919,8 @@ packages: dev: true optional: true - /esbuild-linux-s390x/0.14.25: - resolution: {integrity: sha512-YI2d5V6nTE73ZnhEKQD7MtsPs1EtUZJ3obS21oxQxGbbRw1G+PtJKjNyur+3t6nzHP9oTg6GHQ3S3hOLLmbDIQ==} + /esbuild-linux-s390x/0.14.30: + resolution: {integrity: sha512-OZ68r7ok6qO7hdwrwQn2p5jbIRRcUcVaAykB7e0uCA0ODwfeGunILM6phJtq2Oz4dlEEFvd+tSuma3paQKwt+A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -4231,8 +3928,8 @@ packages: dev: true optional: true - /esbuild-netbsd-64/0.14.25: - resolution: {integrity: sha512-TKIVgNWLUOkr+Exrye70XTEE1lJjdQXdM4tAXRzfHE9iBA7LXWcNtVIuSnphTqpanPzTDFarF0yqq4kpbC6miA==} + /esbuild-netbsd-64/0.14.30: + resolution: {integrity: sha512-iyejQUKn0TzpPkufq8pSCxOg9NheycQbMbPCmjefTe9wYuUlBt1TcHvdoJnYbQzsAhAh1BNq+s0ycRsIJFZzaQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -4240,8 +3937,8 @@ packages: dev: true optional: true - /esbuild-openbsd-64/0.14.25: - resolution: {integrity: sha512-QgFJ37A15D7NIXBTYEqz29+uw3nNBOIyog+3kFidANn6kjw0GHZ0lEYQn+cwjyzu94WobR+fes7cTl/ZYlHb1A==} + /esbuild-openbsd-64/0.14.30: + resolution: {integrity: sha512-UyK1MTMcy4j5fH260fsE1o6MVgWNhb62eCK2yCKCRazZv8Nqdc2WiP9ygjWidmEdCDS+A6MuVp9ozk9uoQtQpA==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -4249,8 +3946,8 @@ packages: dev: true optional: true - /esbuild-sunos-64/0.14.25: - resolution: {integrity: sha512-rmWfjUItYIVlqr5EnTH1+GCxXiBOC42WBZ3w++qh7n2cS9Xo0lO5pGSG2N+huOU2fX5L+6YUuJ78/vOYvefeFw==} + /esbuild-sunos-64/0.14.30: + resolution: {integrity: sha512-aQRtRTNKHB4YuG+xXATe5AoRTNY48IJg5vjE8ElxfmjO9+KdX7MHFkTLhlKevCD6rNANtB3qOlSIeAiXTwHNqw==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -4258,8 +3955,8 @@ packages: dev: true optional: true - /esbuild-windows-32/0.14.25: - resolution: {integrity: sha512-HGAxVUofl3iUIz9W10Y9XKtD0bNsK9fBXv1D55N/ljNvkrAYcGB8YCm0v7DjlwtyS6ws3dkdQyXadbxkbzaKOA==} + /esbuild-windows-32/0.14.30: + resolution: {integrity: sha512-9/fb1tPtpacMqxAXp3fGHowUDg/l9dVch5hKmCLEZC6PdGljh6h372zMdJwYfH0Bd5CCPT0Wx95uycBLJiqpXA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -4267,8 +3964,8 @@ packages: dev: true optional: true - /esbuild-windows-64/0.14.25: - resolution: {integrity: sha512-TirEohRkfWU9hXLgoDxzhMQD1g8I2mOqvdQF2RS9E/wbkORTAqJHyh7wqGRCQAwNzdNXdg3JAyhQ9/177AadWA==} + /esbuild-windows-64/0.14.30: + resolution: {integrity: sha512-DHgITeUhPAnN9I5O6QBa1GVyPOhiYCn4S4TtQr7sO4+X0LNyqnlmA1M0qmGkUdDC1QQfjI8uQ4G/whdWb2pWIQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -4276,8 +3973,8 @@ packages: dev: true optional: true - /esbuild-windows-arm64/0.14.25: - resolution: {integrity: sha512-4ype9ERiI45rSh+R8qUoBtaj6kJvUOI7oVLhKqPEpcF4Pa5PpT3hm/mXAyotJHREkHpM87PAJcA442mLnbtlNA==} + /esbuild-windows-arm64/0.14.30: + resolution: {integrity: sha512-F1kLyQH7zSgjh5eLxogGZN7C9+KNs9m+s7Q6WZoMmCWT/6j998zlaoECHyM8izJRRfsvw2eZlEa1jO6/IOU1AQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -4285,32 +3982,32 @@ packages: dev: true optional: true - /esbuild/0.14.25: - resolution: {integrity: sha512-4JHEIOMNFvK09ziiL+iVmldIhLbn49V4NAVo888tcGFKedEZY/Y8YapfStJ6zSE23tzYPKxqKwQBnQoIO0BI/Q==} + /esbuild/0.14.30: + resolution: {integrity: sha512-wCecQSBkIjp2xjuXY+wcXS/PpOQo9rFh4NAKPh4Pm9f3fuLcnxkR0rDzA+mYP88FtXIUcXUyYmaIgfrzRl55jA==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - esbuild-android-64: 0.14.25 - esbuild-android-arm64: 0.14.25 - esbuild-darwin-64: 0.14.25 - esbuild-darwin-arm64: 0.14.25 - esbuild-freebsd-64: 0.14.25 - esbuild-freebsd-arm64: 0.14.25 - esbuild-linux-32: 0.14.25 - esbuild-linux-64: 0.14.25 - esbuild-linux-arm: 0.14.25 - esbuild-linux-arm64: 0.14.25 - esbuild-linux-mips64le: 0.14.25 - esbuild-linux-ppc64le: 0.14.25 - esbuild-linux-riscv64: 0.14.25 - esbuild-linux-s390x: 0.14.25 - esbuild-netbsd-64: 0.14.25 - esbuild-openbsd-64: 0.14.25 - esbuild-sunos-64: 0.14.25 - esbuild-windows-32: 0.14.25 - esbuild-windows-64: 0.14.25 - esbuild-windows-arm64: 0.14.25 + esbuild-android-64: 0.14.30 + esbuild-android-arm64: 0.14.30 + esbuild-darwin-64: 0.14.30 + esbuild-darwin-arm64: 0.14.30 + esbuild-freebsd-64: 0.14.30 + esbuild-freebsd-arm64: 0.14.30 + esbuild-linux-32: 0.14.30 + esbuild-linux-64: 0.14.30 + esbuild-linux-arm: 0.14.30 + esbuild-linux-arm64: 0.14.30 + esbuild-linux-mips64le: 0.14.30 + esbuild-linux-ppc64le: 0.14.30 + esbuild-linux-riscv64: 0.14.30 + esbuild-linux-s390x: 0.14.30 + esbuild-netbsd-64: 0.14.30 + esbuild-openbsd-64: 0.14.30 + esbuild-sunos-64: 0.14.30 + esbuild-windows-32: 0.14.30 + esbuild-windows-64: 0.14.30 + esbuild-windows-arm64: 0.14.30 dev: true /escalade/3.1.1: @@ -4359,9 +4056,9 @@ packages: peerDependencies: eslint: ^8.0.0 dependencies: - '@babel/core': 7.17.5 - '@babel/eslint-parser': 7.17.0_@babel+core@7.17.5 - '@rushstack/eslint-patch': 1.1.0 + '@babel/core': 7.17.8 + '@babel/eslint-parser': 7.17.0_@babel+core@7.17.8 + '@rushstack/eslint-patch': 1.1.1 '@typescript-eslint/eslint-plugin': 5.17.0_4ad50a0fa85b91f236c35644695e4e45 '@typescript-eslint/parser': 5.17.0_typescript@4.6.3 babel-preset-react-app: 10.0.1 @@ -4372,7 +4069,7 @@ packages: eslint-plugin-jsx-a11y: 6.5.1 eslint-plugin-react: 7.29.4 eslint-plugin-react-hooks: 4.4.0 - eslint-plugin-testing-library: 5.0.6_typescript@4.6.3 + eslint-plugin-testing-library: 5.2.0_typescript@4.6.3 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' @@ -4447,7 +4144,7 @@ packages: minimatch: 3.1.2 object.values: 1.1.5 resolve: 1.22.0 - tsconfig-paths: 3.13.0 + tsconfig-paths: 3.14.1 dev: true /eslint-plugin-jest/25.7.0_4f8effa95756196a8dff211513f1ec41: @@ -4464,7 +4161,7 @@ packages: optional: true dependencies: '@typescript-eslint/eslint-plugin': 5.17.0_4ad50a0fa85b91f236c35644695e4e45 - '@typescript-eslint/experimental-utils': 5.14.0_typescript@4.6.3 + '@typescript-eslint/experimental-utils': 5.17.0_typescript@4.6.3 jest: 27.5.1 transitivePeerDependencies: - supports-color @@ -4477,7 +4174,7 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 aria-query: 4.2.2 array-includes: 3.1.4 ast-types-flow: 0.0.7 @@ -4486,7 +4183,7 @@ packages: damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 has: 1.0.3 - jsx-ast-utils: 3.2.1 + jsx-ast-utils: 3.2.2 language-tags: 1.0.5 minimatch: 3.1.2 dev: true @@ -4524,7 +4221,7 @@ packages: array.prototype.flatmap: 1.2.5 doctrine: 2.1.0 estraverse: 5.3.0 - jsx-ast-utils: 3.2.1 + jsx-ast-utils: 3.2.2 minimatch: 3.1.2 object.entries: 1.1.5 object.fromentries: 2.0.5 @@ -4533,11 +4230,11 @@ packages: prop-types: 15.8.1 resolve: 2.0.0-next.3 semver: 6.3.0 - string.prototype.matchall: 4.0.6 + string.prototype.matchall: 4.0.7 dev: true - /eslint-plugin-testing-library/5.0.6_typescript@4.6.3: - resolution: {integrity: sha512-mMU4+slZsWKHNxtxc5TE2+bs9S//e2uFPlcpTapPhVdnctgn0+G/DaUu6VbT0JLiVMcbBjy3IcfddK+abZawbw==} + /eslint-plugin-testing-library/5.2.0_typescript@4.6.3: + resolution: {integrity: sha512-fYFH8lA1hbc1Epr9laNm/+YIR2d+R7WI8sFz9jIRAUfqCf21Nb5BzZwhNeZlu9wKXwDtuf+hUM5QJxG1PuDsTQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 @@ -4612,7 +4309,7 @@ packages: file-entry-cache: 6.0.1 functional-red-black-tree: 1.0.1 glob-parent: 5.1.2 - globals: 13.12.1 + globals: 13.13.0 ignore: 4.0.6 import-fresh: 3.3.0 imurmurhash: 0.1.4 @@ -4789,7 +4486,7 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.4 + micromatch: 4.0.5 dev: true /fast-json-stable-stringify/2.1.0: @@ -4897,7 +4594,7 @@ packages: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 - mime-types: 2.1.34 + mime-types: 2.1.35 dev: true /fragment-cache/0.2.1: @@ -5030,8 +4727,8 @@ packages: engines: {node: '>=4'} dev: true - /globals/13.12.1: - resolution: {integrity: sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==} + /globals/13.13.0: + resolution: {integrity: sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -5129,7 +4826,7 @@ packages: /history/5.3.0: resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 dev: false /hoist-non-react-statics/3.3.2: @@ -5204,7 +4901,7 @@ packages: /i18next-browser-languagedetector/6.1.4: resolution: {integrity: sha512-wukWnFeU7rKIWT66VU5i8I+3Zc4wReGcuDK2+kuFhtoxBRGWGdvYI9UQmqNL/yQH1KogWwh+xGEaIPH8V/i2Zg==} dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 dev: false /i18next-http-backend/1.4.0: @@ -5218,7 +4915,7 @@ packages: /i18next/21.6.14: resolution: {integrity: sha512-XL6WyD+xlwQwbieXRlXhKWoLb/rkch50/rA+vl6untHnJ+aYnkQ0YDZciTWE78PPhOpbi2gR0LTJCJpiAhA+uQ==} dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 dev: false /iconv-lite/0.4.24: @@ -5425,8 +5122,8 @@ packages: engines: {node: '>= 0.4'} dev: true - /is-number-object/1.0.6: - resolution: {integrity: sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==} + /is-number-object/1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 @@ -5473,8 +5170,10 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-shared-array-buffer/1.0.1: - resolution: {integrity: sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==} + /is-shared-array-buffer/1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 dev: true /is-stream/1.1.0: @@ -5695,7 +5394,7 @@ packages: jest-runner: 27.5.1 jest-util: 27.5.1 jest-validate: 27.5.1 - micromatch: 4.0.4 + micromatch: 4.0.5 parse-json: 5.2.0 pretty-format: 27.5.1 slash: 3.0.0 @@ -5784,7 +5483,7 @@ packages: jest-serializer: 26.6.2 jest-util: 26.6.2 jest-worker: 26.6.2 - micromatch: 4.0.4 + micromatch: 4.0.5 sane: 4.1.0 walker: 1.0.8 optionalDependencies: @@ -5805,7 +5504,7 @@ packages: jest-serializer: 27.5.1 jest-util: 27.5.1 jest-worker: 27.5.1 - micromatch: 4.0.4 + micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: fsevents: 2.3.2 @@ -5863,7 +5562,7 @@ packages: '@types/stack-utils': 2.0.1 chalk: 4.1.2 graceful-fs: 4.2.9 - micromatch: 4.0.4 + micromatch: 4.0.5 pretty-format: 27.5.1 slash: 3.0.0 stack-utils: 2.0.5 @@ -6047,7 +5746,7 @@ packages: chalk: 4.1.2 graceful-fs: 4.2.9 is-ci: 2.0.0 - micromatch: 4.0.4 + micromatch: 4.0.5 dev: true /jest-util/27.5.1: @@ -6229,12 +5928,10 @@ packages: minimist: 1.2.6 dev: true - /json5/2.2.0: - resolution: {integrity: sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==} + /json5/2.2.1: + resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} engines: {node: '>=6'} hasBin: true - dependencies: - minimist: 1.2.6 dev: true /jsonfile/6.1.0: @@ -6253,7 +5950,7 @@ packages: /jss-plugin-camel-case/10.9.0: resolution: {integrity: sha512-UH6uPpnDk413/r/2Olmw4+y54yEF2lRIV8XIZyuYpgPYTITLlPOsq6XB9qeqv+75SQSg3KLocq5jUBXW8qWWww==} dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 hyphenate-style-name: 1.0.4 jss: 10.9.0 dev: false @@ -6261,21 +5958,21 @@ packages: /jss-plugin-default-unit/10.9.0: resolution: {integrity: sha512-7Ju4Q9wJ/MZPsxfu4T84mzdn7pLHWeqoGd/D8O3eDNNJ93Xc8PxnLmV8s8ZPNRYkLdxZqKtm1nPQ0BM4JRlq2w==} dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 jss: 10.9.0 dev: false /jss-plugin-global/10.9.0: resolution: {integrity: sha512-4G8PHNJ0x6nwAFsEzcuVDiBlyMsj2y3VjmFAx/uHk/R/gzJV+yRHICjT4MKGGu1cJq2hfowFWCyrr/Gg37FbgQ==} dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 jss: 10.9.0 dev: false /jss-plugin-nested/10.9.0: resolution: {integrity: sha512-2UJnDrfCZpMYcpPYR16oZB7VAC6b/1QLsRiAutOt7wJaaqwCBvNsosLEu/fUyKNQNGdvg2PPJFDO5AX7dwxtoA==} dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 jss: 10.9.0 tiny-warning: 1.0.3 dev: false @@ -6283,14 +5980,14 @@ packages: /jss-plugin-props-sort/10.9.0: resolution: {integrity: sha512-7A76HI8bzwqrsMOJTWKx/uD5v+U8piLnp5bvru7g/3ZEQOu1+PjHvv7bFdNO3DwNPC9oM0a//KwIJsIcDCjDzw==} dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 jss: 10.9.0 dev: false /jss-plugin-rule-value-function/10.9.0: resolution: {integrity: sha512-IHJv6YrEf8pRzkY207cPmdbBstBaE+z8pazhPShfz0tZSDtRdQua5jjg6NMz3IbTasVx9FdnmptxPqSWL5tyJg==} dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 jss: 10.9.0 tiny-warning: 1.0.3 dev: false @@ -6298,7 +5995,7 @@ packages: /jss-plugin-vendor-prefixer/10.9.0: resolution: {integrity: sha512-MbvsaXP7iiVdYVSEoi+blrW+AYnTDvHTW6I6zqi7JcwXdc6I9Kbm234nEblayhF38EftoenbM+5218pidmC5gA==} dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 css-vendor: 2.0.8 jss: 10.9.0 dev: false @@ -6306,14 +6003,14 @@ packages: /jss/10.9.0: resolution: {integrity: sha512-YpzpreB6kUunQBbrlArlsMpXYyndt9JATbt95tajx0t4MTJJcCJdd4hdNpHmOIDiUJrF/oX5wtVFrS3uofWfGw==} dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 csstype: 3.0.11 is-in-browser: 1.1.3 tiny-warning: 1.0.3 dev: false - /jsx-ast-utils/3.2.1: - resolution: {integrity: sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==} + /jsx-ast-utils/3.2.2: + resolution: {integrity: sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw==} engines: {node: '>=4.0'} dependencies: array-includes: 3.1.4 @@ -6524,24 +6221,24 @@ packages: to-regex: 3.0.2 dev: true - /micromatch/4.0.4: - resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: braces: 3.0.2 picomatch: 2.3.1 dev: true - /mime-db/1.51.0: - resolution: {integrity: sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==} + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} dev: true - /mime-types/2.1.34: - resolution: {integrity: sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==} + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: - mime-db: 1.51.0 + mime-db: 1.52.0 dev: true /mimic-fn/2.1.0: @@ -6593,8 +6290,8 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /nanoid/3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} + /nanoid/3.3.2: + resolution: {integrity: sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true @@ -6738,7 +6435,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.19.1 + es-abstract: 1.19.2 dev: true /object.fromentries/2.0.5: @@ -6747,14 +6444,14 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.19.1 + es-abstract: 1.19.2 dev: true /object.hasown/1.1.0: resolution: {integrity: sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==} dependencies: define-properties: 1.1.3 - es-abstract: 1.19.1 + es-abstract: 1.19.2 dev: true /object.pick/1.3.0: @@ -6770,7 +6467,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.19.1 + es-abstract: 1.19.2 dev: true /once/1.4.0: @@ -6957,11 +6654,11 @@ packages: engines: {node: '>=0.10.0'} dev: true - /postcss/8.4.8: - resolution: {integrity: sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==} + /postcss/8.4.12: + resolution: {integrity: sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.1 + nanoid: 3.3.2 picocolors: 1.0.0 source-map-js: 1.0.2 dev: true @@ -7098,7 +6795,7 @@ packages: react-native: optional: true dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 html-escaper: 2.0.2 html-parse-stringify: 3.0.1 i18next: 21.6.14 @@ -7188,7 +6885,7 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -7231,8 +6928,8 @@ packages: util-deprecate: 1.0.2 dev: true - /recrawl-sync/2.2.1: - resolution: {integrity: sha512-A2yLDgeXNaduJJMlqyUdIN7fewopnNm/mVeeGytS1d2HLXKpS5EthQ0j8tWeX+as9UXiiwQRwfoslKC+/gjqxg==} + /recrawl-sync/2.2.2: + resolution: {integrity: sha512-E2sI4F25Fu2nrfV+KsnC7/qfk/spQIYXlonfQoS4rwxeNK5BjxnLPbWiRXHVXPwYBOTWtPX5765kTm/zJiL+LQ==} dependencies: '@cush/relative': 1.0.0 glob-regex: 0.3.2 @@ -7265,7 +6962,7 @@ packages: /regenerator-transform/0.14.5: resolution: {integrity: sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==} dependencies: - '@babel/runtime': 7.17.2 + '@babel/runtime': 7.17.8 dev: true /regex-not/1.0.2: @@ -7403,8 +7100,8 @@ packages: glob: 7.2.0 dev: true - /rollup/2.70.0: - resolution: {integrity: sha512-iEzYw+syFxQ0X9RefVwhr8BA2TNJsTaX8L8dhyeyMECDbmiba+8UQzcu+xZdji0+JQ+s7kouQnw+9Oz5M19XKA==} + /rollup/2.70.1: + resolution: {integrity: sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==} engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: @@ -7735,12 +7432,12 @@ packages: strip-ansi: 6.0.1 dev: true - /string.prototype.matchall/4.0.6: - resolution: {integrity: sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==} + /string.prototype.matchall/4.0.7: + resolution: {integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==} dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - es-abstract: 1.19.1 + es-abstract: 1.19.2 get-intrinsic: 1.1.1 has-symbols: 1.0.3 internal-slot: 1.0.3 @@ -7860,7 +7557,7 @@ packages: resolution: {integrity: sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==} engines: {node: '>=10.0.0'} dependencies: - ajv: 8.10.0 + ajv: 8.11.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -8008,15 +7705,6 @@ packages: yn: 3.1.1 dev: true - /tsconfig-paths/3.13.0: - resolution: {integrity: sha512-nWuffZppoaYK0vQ1SQmkSsQzJoHA4s6uzdb2waRpD806x9yfq153AdVsWz4je2qZcW+pENrMQXbGQ3sMCkXuhw==} - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.1 - minimist: 1.2.6 - strip-bom: 3.0.0 - dev: true - /tsconfig-paths/3.14.1: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: @@ -8207,7 +7895,7 @@ packages: dependencies: '@rollup/pluginutils': 4.2.0 eslint: 7.32.0 - rollup: 2.70.0 + rollup: 2.70.1 vite: 2.8.6 transitivePeerDependencies: - supports-color @@ -8239,10 +7927,10 @@ packages: peerDependencies: vite: '>2.0.0-0' dependencies: - debug: 4.3.3 + debug: 4.3.4 globrex: 0.1.2 - recrawl-sync: 2.2.1 - tsconfig-paths: 3.13.0 + recrawl-sync: 2.2.2 + tsconfig-paths: 3.14.1 vite: 2.8.6 transitivePeerDependencies: - supports-color @@ -8264,10 +7952,10 @@ packages: stylus: optional: true dependencies: - esbuild: 0.14.25 - postcss: 8.4.8 + esbuild: 0.14.30 + postcss: 8.4.12 resolve: 1.22.0 - rollup: 2.70.0 + rollup: 2.70.1 optionalDependencies: fsevents: 2.3.2 dev: true @@ -8341,7 +8029,7 @@ packages: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 - is-number-object: 1.0.6 + is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 dev: true @@ -8446,8 +8134,8 @@ packages: yargs-parser: 20.2.9 dev: true - /yargs/17.3.1: - resolution: {integrity: sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==} + /yargs/17.4.0: + resolution: {integrity: sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA==} engines: {node: '>=12'} dependencies: cliui: 7.0.4 @@ -8468,3 +8156,7 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true + + /zxcvbn/4.4.2: + resolution: {integrity: sha1-KOwXzwl0PtyrBW3dixsGJizHPDA=} + dev: false diff --git a/web/src/components/PasswordMeter.test.tsx b/web/src/components/PasswordMeter.test.tsx new file mode 100644 index 000000000..e3e3bcba6 --- /dev/null +++ b/web/src/components/PasswordMeter.test.tsx @@ -0,0 +1,13 @@ +import React from "react"; + +import { render } from "@testing-library/react"; + +import PasswordMeter from "@components/PasswordMeter"; + +it("renders without crashing", () => { + render(); +}); + +it("renders adjusted height without crashing", () => { + render(); +}); diff --git a/web/src/components/PasswordMeter.tsx b/web/src/components/PasswordMeter.tsx new file mode 100644 index 000000000..359df648c --- /dev/null +++ b/web/src/components/PasswordMeter.tsx @@ -0,0 +1,138 @@ +import React, { useState, useEffect } from "react"; + +import { makeStyles } from "@material-ui/core"; +import classnames from "classnames"; +import { useTranslation } from "react-i18next"; +import zxcvbn from "zxcvbn"; + +export interface Props { + value: string; + /** + * mode password meter mode + * classic: classic mode (checks lowercase, uppercase, specials and numbers) + * zxcvbn: uses zxcvbn package to get the password strength + **/ + mode: string; + minLength: number; + maxLength: number; + requireLowerCase: boolean; + requireUpperCase: boolean; + requireNumber: boolean; + requireSpecial: boolean; +} + +const PasswordMeter = function (props: Props) { + const [progressColor] = useState(["#D32F2F", "#FF5722", "#FFEB3B", "#AFB42B", "#62D32F"]); + const [passwordScore, setPasswordScore] = useState(0); + const [maxScores, setMaxScores] = useState(0); + const [feedback, setFeedback] = useState(""); + const { t: translate } = useTranslation("Portal"); + const style = makeStyles((theme) => ({ + progressBar: { + height: "5px", + marginTop: "2px", + backgroundColor: "red", + width: "50%", + transition: "width .5s linear", + }, + }))(); + + useEffect(() => { + const password = props.value; + if (props.mode === "standard") { + //use mode mode + setMaxScores(4); + if (password.length < props.minLength) { + setPasswordScore(0); + setFeedback(translate("Must be at least {{len}} characters in length", { len: props.minLength })); + return; + } + if (password.length > props.maxLength) { + setPasswordScore(0); + setFeedback(translate("Must not be more than {{len}} characters in length", { len: props.maxLength })); + return; + } + setFeedback(""); + let score = 1; + let required = 0; + let hits = 0; + let warning = ""; + if (props.requireLowerCase) { + required++; + const hasLowercase = /[a-z]/.test(password); + if (hasLowercase) { + hits++; + } else { + warning += "* " + translate("Must have at least one lowercase letter") + "\n"; + } + } + + if (props.requireUpperCase) { + required++; + const hasUppercase = /[A-Z]/.test(password); + if (hasUppercase) { + hits++; + } else { + warning += "* " + translate("Must have at least one UPPERCASE letter") + "\n"; + } + } + + if (props.requireNumber) { + required++; + const hasNumber = /[0-9]/.test(password); + if (hasNumber) { + hits++; + } else { + warning += "* " + translate("Must have at least one number") + "\n"; + } + } + + if (props.requireSpecial) { + required++; + const hasSpecial = /[^0-9\w]/i.test(password); + if (hasSpecial) { + hits++; + } else { + warning += "* " + translate("Must have at least one special character") + "\n"; + } + } + score += hits > 0 ? 1 : 0; + score += required === hits ? 1 : 0; + if (warning !== "") { + setFeedback(translate("The password does not meet the password policy") + ":\n" + warning); + } + setPasswordScore(score); + } else if (props.mode === "zxcvbn") { + //use zxcvbn mode + setMaxScores(5); + const { score, feedback } = zxcvbn(password); + setFeedback(feedback.warning); + setPasswordScore(score); + } + }, [props, translate]); + + if (props.mode === "" || props.mode === "none") return ; + + return ( +
+
+
+ ); +}; + +PasswordMeter.defaultProps = { + minLength: 0, +}; + +export default PasswordMeter; diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index 4031dfe7f..b2378a408 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -55,6 +55,13 @@ "Access your email addresses": "Access your email addresses", "Accept": "Accept", "Deny": "Deny", - "The above application is requesting the following permissions": "The above application is requesting the following permissions" + "The above application is requesting the following permissions": "The above application is requesting the following permissions", + "The password does not meet the password policy": "The password does not meet the password policy", + "Must have at least one lowercase letter": "Must have at least one lowercase letter", + "Must have at least one UPPERCASE letter": "Must have at least one UPPERCASE letter", + "Must have at least one number": "Must have at least one number", + "Must have at least one special character": "Must have at least one special character", + "Must be at least {{len}} characters in length": "Must be at least {{len}} characters in length", + "Must not be more than {{len}} characters in length": "Must not be more than {{len}} characters in length" } } diff --git a/web/src/i18n/locales/es.json b/web/src/i18n/locales/es.json index 8e3244680..34b6e1b22 100644 --- a/web/src/i18n/locales/es.json +++ b/web/src/i18n/locales/es.json @@ -55,6 +55,13 @@ "Access your email addresses": "Acceso a su dirección de correo", "Accept": "Aceptar", "Deny": "Denegar", - "The above application is requesting the following permissions": "La aplicación solicita los siguientes permisos" + "The above application is requesting the following permissions": "La aplicación solicita los siguientes permisos", + "The password does not meet the password policy": "La contraseña no cumple con la política de contraseñas", + "Must have at least one lowercase letter": "Debe contener al menos una letra minúscula", + "Must have at least one UPPERCASE letter": "Debe contener al menos una letra MAYUSCULA", + "Must have at least one number": "Debe contener al menos un número", + "Must have at least one special character": "Debe contener al menos un caracter especial", + "Must be at least {{len}} characters in length": "La longitud mínima es de {{len}} caracteres", + "Must not be more than {{len}} characters in length": "La longitud máxima es de {{len}} caracteres" } } diff --git a/web/src/views/ResetPassword/ResetPasswordStep2.tsx b/web/src/views/ResetPassword/ResetPasswordStep2.tsx index b1e1aa0af..12c8cce56 100644 --- a/web/src/views/ResetPassword/ResetPasswordStep2.tsx +++ b/web/src/views/ResetPassword/ResetPasswordStep2.tsx @@ -1,11 +1,13 @@ import React, { useState, useCallback, useEffect } from "react"; -import { Grid, Button, makeStyles } from "@material-ui/core"; +import { Grid, Button, makeStyles, InputAdornment, IconButton } from "@material-ui/core"; +import { Visibility, VisibilityOff } from "@material-ui/icons"; import classnames from "classnames"; import { useTranslation } from "react-i18next"; import { useLocation, useNavigate } from "react-router-dom"; import FixedTextField from "@components/FixedTextField"; +import PasswordMeter from "@components/PasswordMeter"; import { IndexRoute } from "@constants/Routes"; import { useNotifications } from "@hooks/NotificationsContext"; import LoginLayout from "@layouts/LoginLayout"; @@ -23,6 +25,15 @@ const ResetPasswordStep2 = function () { const { createSuccessNotification, createErrorNotification } = useNotifications(); const { t: translate } = useTranslation("Portal"); const navigate = useNavigate(); + const [showPassword, setShowPassword] = useState(false); + const [pPolicyMode, setPPolicyMode] = useState("none"); + const [pPolicyMinLength, setPPolicyMinLength] = useState(0); + const [pPolicyMaxLength, setPPolicyMaxLength] = useState(0); + const [pPolicyRequireUpperCase, setPPolicyRequireUpperCase] = useState(false); + const [pPolicyRequireLowerCase, setPPolicyRequireLowerCase] = useState(false); + const [pPolicyRequireNumber, setPPolicyRequireNumber] = useState(false); + const [pPolicyRequireSpecial, setPPolicyRequireSpecial] = useState(false); + // Get the token from the query param to give it back to the API when requesting // the secret for OTP. const processToken = extractIdentityToken(location.search); @@ -36,7 +47,22 @@ const ResetPasswordStep2 = function () { try { setFormDisabled(true); - await completeResetPasswordProcess(processToken); + const { + mode, + min_length, + max_length, + require_uppercase, + require_lowercase, + require_number, + require_special, + } = await completeResetPasswordProcess(processToken); + setPPolicyMode(mode); + setPPolicyMinLength(min_length); + setPPolicyMaxLength(max_length); + setPPolicyRequireLowerCase(require_lowercase); + setPPolicyRequireUpperCase(require_uppercase); + setPPolicyRequireNumber(require_number); + setPPolicyRequireSpecial(require_special); setFormDisabled(false); } catch (err) { console.error(err); @@ -76,9 +102,9 @@ const ResetPasswordStep2 = function () { } catch (err) { console.error(err); if ((err as Error).message.includes("0000052D.")) { - createErrorNotification( - translate("Your supplied password does not meet the password policy requirements"), - ); + createErrorNotification("Your supplied password does not meet the password policy requirements."); + } else if ((err as Error).message.includes("policy")) { + createErrorNotification("Your supplied password does not meet the password policy requirements."); } else { createErrorNotification(translate("There was an issue resetting the password")); } @@ -97,21 +123,44 @@ const ResetPasswordStep2 = function () { id="password1-textfield" label={translate("New password")} variant="outlined" - type="password" + type={showPassword ? "text" : "password"} value={password1} disabled={formDisabled} onChange={(e) => setPassword1(e.target.value)} error={errorPassword1} className={classnames(style.fullWidth)} autoComplete="new-password" + InputProps={{ + endAdornment: ( + + setShowPassword(!showPassword)} + edge="end" + > + {showPassword ? : } + + + ), + }} /> + setPassword2(e.target.value)}