From b480b56130b8336b2b1b3640e7da9fe97a8d9eaa Mon Sep 17 00:00:00 2001 From: Andrew Duthie Date: Wed, 6 Oct 2021 12:31:15 -0400 Subject: [PATCH 01/15] Bump Babel dependencies, drop class properties plugin (#5473) **Why**: Because class properties are now part of the ES2022 specification, it is no longer necessary to use a plugin to support the syntax. --- babel.config.js | 8 - package.json | 9 +- yarn.lock | 1290 +++++++++++++++++++++++++---------------------- 3 files changed, 679 insertions(+), 628 deletions(-) diff --git a/babel.config.js b/babel.config.js index 9b42969b91f..b886251164e 100644 --- a/babel.config.js +++ b/babel.config.js @@ -42,14 +42,6 @@ module.exports = function (api) { }, ], ].filter(Boolean), - plugins: [ - [ - '@babel/plugin-proposal-class-properties', - { - loose: true, - }, - ], - ], // For third-party dependencies compiled using Babel, don't assume module source type. Use // "unambiguous" for best-effort attempt to identify source type by patterns. overrides: [ diff --git a/package.json b/package.json index 60abdd5fdd0..aad8c2d3b60 100644 --- a/package.json +++ b/package.json @@ -18,11 +18,10 @@ "build": "true" }, "dependencies": { - "@babel/core": "^7.13.1", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/preset-env": "^7.13.5", - "@babel/preset-react": "^7.12.13", - "@babel/register": "^7.13.0", + "@babel/core": "^7.15.5", + "@babel/preset-env": "^7.15.6", + "@babel/preset-react": "^7.14.5", + "@babel/register": "^7.15.3", "@rails/webpacker": "^5.3.0", "basscss-sass": "^3.0.0", "classlist-polyfill": "^1.2.0", diff --git a/yarn.lock b/yarn.lock index 0dea33cc057..78054bcce12 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,32 +9,32 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== dependencies: "@babel/highlight" "^7.14.5" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4" - integrity sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA== - -"@babel/core@^7.13.1", "@babel/core@^7.13.16": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.16.tgz#7756ab24396cc9675f1c3fcd5b79fcce192ea96a" - integrity sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.16" - "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-module-transforms" "^7.13.14" - "@babel/helpers" "^7.13.16" - "@babel/parser" "^7.13.16" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.15" - "@babel/types" "^7.13.16" +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" + integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== + +"@babel/core@^7.13.16", "@babel/core@^7.15.5": + version "7.15.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.5.tgz#f8ed9ace730722544609f90c9bb49162dc3bf5b9" + integrity sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helpers" "^7.15.4" + "@babel/parser" "^7.15.5" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -58,63 +58,64 @@ dependencies: eslint-rule-composer "^0.3.0" -"@babel/generator@^7.13.16": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.16.tgz#0befc287031a201d84cdfc173b46b320ae472d14" - integrity sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg== +"@babel/generator@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0" + integrity sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw== dependencies: - "@babel/types" "^7.13.16" + "@babel/types" "^7.15.4" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" - integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== +"@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" + integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.15.4" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" - integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz#21ad815f609b84ee0e3058676c33cf6d1670525f" + integrity sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q== dependencies: - "@babel/helper-explode-assignable-expression" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/helper-explode-assignable-expression" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.13.8": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" - integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" + integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== dependencies: - "@babel/compat-data" "^7.13.15" - "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.14.5" + "@babel/compat-data" "^7.15.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.0.tgz#28d04ad9cfbd1ed1d8b988c9ea7b945263365846" - integrity sha512-twwzhthM4/+6o9766AW2ZBHpIHPSGrPGk1+WfHiu13u/lBnggXGNYCpeAyVfNwGDKfkhEDp+WOD/xafoJ2iLjA== +"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" + integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-member-expression-to-functions" "^7.13.0" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.13.0" - "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" -"@babel/helper-create-regexp-features-plugin@^7.12.13": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" - integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg== +"@babel/helper-create-regexp-features-plugin@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" + integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-annotate-as-pure" "^7.14.5" regexpu-core "^4.7.1" -"@babel/helper-define-polyfill-provider@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz#a640051772045fedaaecc6f0c6c69f02bdd34bf1" - integrity sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw== +"@babel/helper-define-polyfill-provider@^0.2.2": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" + integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== dependencies: "@babel/helper-compilation-targets" "^7.13.0" "@babel/helper-module-imports" "^7.12.13" @@ -125,145 +126,144 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-explode-assignable-expression@^7.12.13": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" - integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA== +"@babel/helper-explode-assignable-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" + integrity sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g== dependencies: - "@babel/types" "^7.13.0" + "@babel/types" "^7.15.4" -"@babel/helper-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" - integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== +"@babel/helper-function-name@^7.14.5", "@babel/helper-function-name@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== dependencies: - "@babel/helper-get-function-arity" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/helper-get-function-arity" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-get-function-arity@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" - integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== +"@babel/helper-get-function-arity@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.15.4" -"@babel/helper-hoist-variables@^7.13.0": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz#1b1651249e94b51f8f0d33439843e33e39775b30" - integrity sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg== +"@babel/helper-hoist-variables@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== dependencies: - "@babel/traverse" "^7.13.15" - "@babel/types" "^7.13.16" + "@babel/types" "^7.15.4" -"@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" - integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== +"@babel/helper-member-expression-to-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" + integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== dependencies: - "@babel/types" "^7.13.12" + "@babel/types" "^7.15.4" -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" - integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" + integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== dependencies: - "@babel/types" "^7.13.12" + "@babel/types" "^7.15.4" -"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.13.14": - version "7.13.14" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz#e600652ba48ccb1641775413cb32cfa4e8b495ef" - integrity sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g== +"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz#7da80c8cbc1f02655d83f8b79d25866afe50d226" + integrity sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw== dependencies: - "@babel/helper-module-imports" "^7.13.12" - "@babel/helper-replace-supers" "^7.13.12" - "@babel/helper-simple-access" "^7.13.12" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.12.11" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.13" - "@babel/types" "^7.13.14" - -"@babel/helper-optimise-call-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" - integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== + "@babel/helper-module-imports" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-simple-access" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.6" + +"@babel/helper-optimise-call-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" + integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.15.4" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" - integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== -"@babel/helper-remap-async-to-generator@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" - integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg== +"@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" + integrity sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-wrap-function" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-wrap-function" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" - integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw== +"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" + integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== dependencies: - "@babel/helper-member-expression-to-functions" "^7.13.12" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.12" + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-simple-access@^7.12.13", "@babel/helper-simple-access@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" - integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== +"@babel/helper-simple-access@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" + integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== dependencies: - "@babel/types" "^7.13.12" + "@babel/types" "^7.15.4" -"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" - integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== +"@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb" + integrity sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.15.4" -"@babel/helper-split-export-declaration@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" - integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== +"@babel/helper-split-export-declaration@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.15.4" -"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.5": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" - integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== -"@babel/helper-validator-option@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" - integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== -"@babel/helper-wrap-function@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" - integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA== +"@babel/helper-wrap-function@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7" + integrity sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/helper-function-name" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helpers@^7.13.16": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.17.tgz#b497c7a00e9719d5b613b8982bda6ed3ee94caf6" - integrity sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg== +"@babel/helpers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" + integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== dependencies: - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.17" - "@babel/types" "^7.13.17" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" "@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": version "7.14.5" @@ -274,128 +274,147 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.13", "@babel/parser@^7.13.16": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.16.tgz#0f18179b0448e6939b1f3f5c4c355a3a9bcdfd37" - integrity sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw== +"@babel/parser@^7.15.4", "@babel/parser@^7.15.5": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.7.tgz#0c3ed4a2eb07b165dfa85b3cc45c727334c4edae" + integrity sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g== -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" - integrity sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e" + integrity sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" -"@babel/plugin-proposal-async-generator-functions@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz#80e549df273a3b3050431b148c892491df1bcc5b" - integrity sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA== +"@babel/plugin-proposal-async-generator-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz#f82aabe96c135d2ceaa917feb9f5fca31635277e" + integrity sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.15.4" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" - integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== +"@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" + integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-dynamic-import@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d" - integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ== +"@babel/plugin-proposal-class-static-block@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz#3e7ca6128453c089e8b477a99f970c63fc1cb8d7" + integrity sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" + integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" - integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== +"@babel/plugin-proposal-export-namespace-from@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" + integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" - integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q== +"@babel/plugin-proposal-json-strings@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" + integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a" - integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A== +"@babel/plugin-proposal-logical-assignment-operators@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" + integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" - integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" + integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" - integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== +"@babel/plugin-proposal-numeric-separator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" + integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" - integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g== +"@babel/plugin-proposal-object-rest-spread@^7.13.8", "@babel/plugin-proposal-object-rest-spread@^7.15.6": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11" + integrity sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg== dependencies: - "@babel/compat-data" "^7.13.8" - "@babel/helper-compilation-targets" "^7.13.8" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/compat-data" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-parameters" "^7.15.4" -"@babel/plugin-proposal-optional-catch-binding@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107" - integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA== +"@babel/plugin-proposal-optional-catch-binding@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" + integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866" - integrity sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ== +"@babel/plugin-proposal-optional-chaining@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" + integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" - integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q== +"@babel/plugin-proposal-private-methods@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" + integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" - integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== +"@babel/plugin-proposal-private-property-in-object@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz#55c5e3b4d0261fd44fe637e3f624cfb0f484e3e5" + integrity sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" + integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -411,6 +430,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" @@ -432,12 +458,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" - integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== +"@babel/plugin-syntax-jsx@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" + integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" @@ -481,242 +507,249 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" - integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" - integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg== +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-async-to-generator@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" - integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg== +"@babel/plugin-transform-arrow-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" + integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-block-scoped-functions@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" - integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== +"@babel/plugin-transform-async-to-generator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" + integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" -"@babel/plugin-transform-block-scoping@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" - integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== +"@babel/plugin-transform-block-scoped-functions@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" + integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-classes@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" - integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g== +"@babel/plugin-transform-block-scoping@^7.15.3": + version "7.15.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf" + integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-replace-supers" "^7.13.0" - "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-classes@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz#50aee17aaf7f332ae44e3bce4c2e10534d5d3bf1" + integrity sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" - integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg== +"@babel/plugin-transform-computed-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" + integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-destructuring@^7.13.0", "@babel/plugin-transform-destructuring@^7.13.17": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz#678d96576638c19d5b36b332504d3fd6e06dea27" - integrity sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA== +"@babel/plugin-transform-destructuring@^7.13.17", "@babel/plugin-transform-destructuring@^7.14.7": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" + integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" - integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== +"@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" + integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-duplicate-keys@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" - integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== +"@babel/plugin-transform-duplicate-keys@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" + integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-exponentiation-operator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" - integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== +"@babel/plugin-transform-exponentiation-operator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" + integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-for-of@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" - integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg== +"@babel/plugin-transform-for-of@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz#25c62cce2718cfb29715f416e75d5263fb36a8c2" + integrity sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" - integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== +"@babel/plugin-transform-function-name@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" + integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" - integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== +"@babel/plugin-transform-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" + integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-member-expression-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" - integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== +"@babel/plugin-transform-member-expression-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" + integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-modules-amd@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3" - integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ== +"@babel/plugin-transform-modules-amd@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" + integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== dependencies: - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b" - integrity sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw== +"@babel/plugin-transform-modules-commonjs@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz#8201101240eabb5a76c08ef61b2954f767b6b4c1" + integrity sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA== dependencies: - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.15.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" - integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A== +"@babel/plugin-transform-modules-systemjs@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz#b42890c7349a78c827719f1d2d0cd38c7d268132" + integrity sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw== dependencies: - "@babel/helper-hoist-variables" "^7.13.0" - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.9" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b" - integrity sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw== +"@babel/plugin-transform-modules-umd@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" + integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== dependencies: - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" - integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2" + integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-create-regexp-features-plugin" "^7.14.5" -"@babel/plugin-transform-new-target@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" - integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== +"@babel/plugin-transform-new-target@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" + integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-object-super@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" - integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== +"@babel/plugin-transform-object-super@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" + integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" -"@babel/plugin-transform-parameters@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" - integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw== +"@babel/plugin-transform-parameters@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62" + integrity sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" - integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== +"@babel/plugin-transform-property-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" + integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-react-display-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz#c28effd771b276f4647411c9733dbb2d2da954bd" - integrity sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA== +"@babel/plugin-transform-react-display-name@^7.14.5": + version "7.15.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz#6aaac6099f1fcf6589d35ae6be1b6e10c8c602b9" + integrity sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-react-jsx-development@^7.12.12": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz#f510c0fa7cd7234153539f9a362ced41a5ca1447" - integrity sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ== +"@babel/plugin-transform-react-jsx-development@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz#1a6c73e2f7ed2c42eebc3d2ad60b0c7494fcb9af" + integrity sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ== dependencies: - "@babel/plugin-transform-react-jsx" "^7.12.17" + "@babel/plugin-transform-react-jsx" "^7.14.5" -"@babel/plugin-transform-react-jsx@^7.12.13", "@babel/plugin-transform-react-jsx@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.17.tgz#dd2c1299f5e26de584939892de3cfc1807a38f24" - integrity sha512-mwaVNcXV+l6qJOuRhpdTEj8sT/Z0owAVWf9QujTZ0d2ye9X/K+MTOTSizcgKOj18PGnTc/7g1I4+cIUjsKhBcw== +"@babel/plugin-transform-react-jsx@^7.14.5": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz#3314b2163033abac5200a869c4de242cd50a914c" + integrity sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-jsx" "^7.12.13" - "@babel/types" "^7.12.17" + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-jsx" "^7.14.5" + "@babel/types" "^7.14.9" -"@babel/plugin-transform-react-pure-annotations@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" - integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== +"@babel/plugin-transform-react-pure-annotations@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz#18de612b84021e3a9802cbc212c9d9f46d0d11fc" + integrity sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-regenerator@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz#e5eb28945bf8b6563e7f818945f966a8d2997f39" - integrity sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ== +"@babel/plugin-transform-regenerator@^7.13.15", "@babel/plugin-transform-regenerator@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" + integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" - integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== +"@babel/plugin-transform-reserved-words@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" + integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-runtime@^7.13.15": version "7.13.15" @@ -730,82 +763,85 @@ babel-plugin-polyfill-regenerator "^0.2.0" semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" - integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== +"@babel/plugin-transform-shorthand-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" + integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-spread@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" - integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg== +"@babel/plugin-transform-spread@^7.14.6": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144" + integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" -"@babel/plugin-transform-sticky-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" - integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== +"@babel/plugin-transform-sticky-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" + integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-template-literals@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" - integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw== +"@babel/plugin-transform-template-literals@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" + integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-typeof-symbol@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" - integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-unicode-escapes@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" - integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== +"@babel/plugin-transform-typeof-symbol@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" + integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-unicode-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" - integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== +"@babel/plugin-transform-unicode-escapes@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" + integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/preset-env@^7.13.15", "@babel/preset-env@^7.13.5": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.15.tgz#c8a6eb584f96ecba183d3d414a83553a599f478f" - integrity sha512-D4JAPMXcxk69PKe81jRJ21/fP/uYdcTZ3hJDF5QX2HSI9bBxxYw/dumdR6dGumhjxlprHPE4XWoPaqzZUVy2MA== - dependencies: - "@babel/compat-data" "^7.13.15" - "@babel/helper-compilation-targets" "^7.13.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-async-generator-functions" "^7.13.15" - "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-dynamic-import" "^7.13.8" - "@babel/plugin-proposal-export-namespace-from" "^7.12.13" - "@babel/plugin-proposal-json-strings" "^7.13.8" - "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" - "@babel/plugin-proposal-numeric-separator" "^7.12.13" - "@babel/plugin-proposal-object-rest-spread" "^7.13.8" - "@babel/plugin-proposal-optional-catch-binding" "^7.13.8" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-private-methods" "^7.13.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" +"@babel/plugin-transform-unicode-regex@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" + integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/preset-env@^7.13.15", "@babel/preset-env@^7.15.6": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.6.tgz#0f3898db9d63d320f21b17380d8462779de57659" + integrity sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.15.4" + "@babel/plugin-proposal-async-generator-functions" "^7.15.4" + "@babel/plugin-proposal-class-properties" "^7.14.5" + "@babel/plugin-proposal-class-static-block" "^7.15.4" + "@babel/plugin-proposal-dynamic-import" "^7.14.5" + "@babel/plugin-proposal-export-namespace-from" "^7.14.5" + "@babel/plugin-proposal-json-strings" "^7.14.5" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" + "@babel/plugin-proposal-numeric-separator" "^7.14.5" + "@babel/plugin-proposal-object-rest-spread" "^7.15.6" + "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-private-methods" "^7.14.5" + "@babel/plugin-proposal-private-property-in-object" "^7.15.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.3" @@ -815,45 +851,46 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.12.13" - "@babel/plugin-transform-arrow-functions" "^7.13.0" - "@babel/plugin-transform-async-to-generator" "^7.13.0" - "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.12.13" - "@babel/plugin-transform-classes" "^7.13.0" - "@babel/plugin-transform-computed-properties" "^7.13.0" - "@babel/plugin-transform-destructuring" "^7.13.0" - "@babel/plugin-transform-dotall-regex" "^7.12.13" - "@babel/plugin-transform-duplicate-keys" "^7.12.13" - "@babel/plugin-transform-exponentiation-operator" "^7.12.13" - "@babel/plugin-transform-for-of" "^7.13.0" - "@babel/plugin-transform-function-name" "^7.12.13" - "@babel/plugin-transform-literals" "^7.12.13" - "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.13.0" - "@babel/plugin-transform-modules-commonjs" "^7.13.8" - "@babel/plugin-transform-modules-systemjs" "^7.13.8" - "@babel/plugin-transform-modules-umd" "^7.13.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" - "@babel/plugin-transform-new-target" "^7.12.13" - "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.13.0" - "@babel/plugin-transform-property-literals" "^7.12.13" - "@babel/plugin-transform-regenerator" "^7.13.15" - "@babel/plugin-transform-reserved-words" "^7.12.13" - "@babel/plugin-transform-shorthand-properties" "^7.12.13" - "@babel/plugin-transform-spread" "^7.13.0" - "@babel/plugin-transform-sticky-regex" "^7.12.13" - "@babel/plugin-transform-template-literals" "^7.13.0" - "@babel/plugin-transform-typeof-symbol" "^7.12.13" - "@babel/plugin-transform-unicode-escapes" "^7.12.13" - "@babel/plugin-transform-unicode-regex" "^7.12.13" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.14.5" + "@babel/plugin-transform-async-to-generator" "^7.14.5" + "@babel/plugin-transform-block-scoped-functions" "^7.14.5" + "@babel/plugin-transform-block-scoping" "^7.15.3" + "@babel/plugin-transform-classes" "^7.15.4" + "@babel/plugin-transform-computed-properties" "^7.14.5" + "@babel/plugin-transform-destructuring" "^7.14.7" + "@babel/plugin-transform-dotall-regex" "^7.14.5" + "@babel/plugin-transform-duplicate-keys" "^7.14.5" + "@babel/plugin-transform-exponentiation-operator" "^7.14.5" + "@babel/plugin-transform-for-of" "^7.15.4" + "@babel/plugin-transform-function-name" "^7.14.5" + "@babel/plugin-transform-literals" "^7.14.5" + "@babel/plugin-transform-member-expression-literals" "^7.14.5" + "@babel/plugin-transform-modules-amd" "^7.14.5" + "@babel/plugin-transform-modules-commonjs" "^7.15.4" + "@babel/plugin-transform-modules-systemjs" "^7.15.4" + "@babel/plugin-transform-modules-umd" "^7.14.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9" + "@babel/plugin-transform-new-target" "^7.14.5" + "@babel/plugin-transform-object-super" "^7.14.5" + "@babel/plugin-transform-parameters" "^7.15.4" + "@babel/plugin-transform-property-literals" "^7.14.5" + "@babel/plugin-transform-regenerator" "^7.14.5" + "@babel/plugin-transform-reserved-words" "^7.14.5" + "@babel/plugin-transform-shorthand-properties" "^7.14.5" + "@babel/plugin-transform-spread" "^7.14.6" + "@babel/plugin-transform-sticky-regex" "^7.14.5" + "@babel/plugin-transform-template-literals" "^7.14.5" + "@babel/plugin-transform-typeof-symbol" "^7.14.5" + "@babel/plugin-transform-unicode-escapes" "^7.14.5" + "@babel/plugin-transform-unicode-regex" "^7.14.5" "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.13.14" - babel-plugin-polyfill-corejs2 "^0.2.0" - babel-plugin-polyfill-corejs3 "^0.2.0" - babel-plugin-polyfill-regenerator "^0.2.0" - core-js-compat "^3.9.0" + "@babel/types" "^7.15.6" + babel-plugin-polyfill-corejs2 "^0.2.2" + babel-plugin-polyfill-corejs3 "^0.2.2" + babel-plugin-polyfill-regenerator "^0.2.2" + core-js-compat "^3.16.0" semver "^6.3.0" "@babel/preset-modules@^0.1.4": @@ -867,24 +904,25 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.13.tgz#5f911b2eb24277fa686820d5bd81cad9a0602a0a" - integrity sha512-TYM0V9z6Abb6dj1K7i5NrEhA13oS5ujUYQYDfqIBXYHOc2c2VkFgc+q9kyssIyUfy4/hEwqrgSlJ/Qgv8zJLsA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-transform-react-display-name" "^7.12.13" - "@babel/plugin-transform-react-jsx" "^7.12.13" - "@babel/plugin-transform-react-jsx-development" "^7.12.12" - "@babel/plugin-transform-react-pure-annotations" "^7.12.1" - -"@babel/register@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.13.0.tgz#865eb78a3ed94c6ad72d0e550180b3d6566dfb8d" - integrity sha512-nswFANDBcO661RvGOHfVKVRBZIe9wJuFFIJYJWpO8LwYn8WI+h/2JZhceLvlxjxEvMH6/oGkEBgz5SnqUUMkCg== - dependencies: +"@babel/preset-react@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.14.5.tgz#0fbb769513f899c2c56f3a882fa79673c2d4ab3c" + integrity sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-react-display-name" "^7.14.5" + "@babel/plugin-transform-react-jsx" "^7.14.5" + "@babel/plugin-transform-react-jsx-development" "^7.14.5" + "@babel/plugin-transform-react-pure-annotations" "^7.14.5" + +"@babel/register@^7.15.3": + version "7.15.3" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.15.3.tgz#6b40a549e06ec06c885b2ec42c3dd711f55fe752" + integrity sha512-mj4IY1ZJkorClxKTImccn4T81+UKTo4Ux0+OFSV9hME1ooqS9UV+pJ6BjD0qXPK4T3XW/KNa79XByjeEMZz+fw== + dependencies: + clone-deep "^4.0.1" find-cache-dir "^2.0.0" - lodash "^4.17.19" make-dir "^2.1.0" pirates "^4.0.0" source-map-support "^0.5.16" @@ -904,35 +942,36 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" - integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13", "@babel/traverse@^7.13.15", "@babel/traverse@^7.13.17": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.17.tgz#c85415e0c7d50ac053d758baec98b28b2ecfeea3" - integrity sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.16" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.13.16" - "@babel/types" "^7.13.17" +"@babel/template@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.14", "@babel/types@^7.13.16", "@babel/types@^7.13.17", "@babel/types@^7.4.4": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.17.tgz#48010a115c9fba7588b4437dd68c9469012b38b4" - integrity sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA== +"@babel/types@^7.14.9", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.4.4": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" + integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" "@csstools/convert-colors@^1.4.0": @@ -1831,29 +1870,29 @@ babel-plugin-macros@^2.8.0: cosmiconfig "^6.0.0" resolve "^1.12.0" -babel-plugin-polyfill-corejs2@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz#686775bf9a5aa757e10520903675e3889caeedc4" - integrity sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg== +babel-plugin-polyfill-corejs2@^0.2.0, babel-plugin-polyfill-corejs2@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" + integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== dependencies: "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.2" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz#f4b4bb7b19329827df36ff56f6e6d367026cb7a2" - integrity sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg== +babel-plugin-polyfill-corejs3@^0.2.0, babel-plugin-polyfill-corejs3@^0.2.2: + version "0.2.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz#2779846a16a1652244ae268b1e906ada107faf92" + integrity sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.0" - core-js-compat "^3.9.1" + "@babel/helper-define-polyfill-provider" "^0.2.2" + core-js-compat "^3.16.2" -babel-plugin-polyfill-regenerator@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz#853f5f5716f4691d98c84f8069c7636ea8da7ab8" - integrity sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg== +babel-plugin-polyfill-regenerator@^0.2.0, babel-plugin-polyfill-regenerator@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" + integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.2" balanced-match@^1.0.0: version "1.0.2" @@ -2275,16 +2314,16 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.5, browserslist@^4.6.4: - version "4.16.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.5.tgz#952825440bca8913c62d0021334cbe928ef062ae" - integrity sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.17.3, browserslist@^4.6.4: + version "4.17.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.3.tgz#2844cd6eebe14d12384b0122d217550160d2d624" + integrity sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ== dependencies: - caniuse-lite "^1.0.30001214" - colorette "^1.2.2" - electron-to-chromium "^1.3.719" + caniuse-lite "^1.0.30001264" + electron-to-chromium "^1.3.857" escalade "^3.1.1" - node-releases "^1.1.71" + node-releases "^1.1.77" + picocolors "^0.2.1" buffer-from@^1.0.0: version "1.1.1" @@ -2436,10 +2475,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001214: - version "1.0.30001219" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001219.tgz#5bfa5d0519f41f993618bd318f606a4c4c16156b" - integrity sha512-c0yixVG4v9KBc/tQ2rlbB3A/bgBFRvl8h8M4IeUbqCca4gsiCfvtaheUssbnux/Mb66Vjz7x8yYjDgYcNQOhyQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001264: + version "1.0.30001265" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz#0613c9e6c922e422792e6fcefdf9a3afeee4f8c3" + integrity sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw== case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" @@ -2610,6 +2649,15 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + coa@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" @@ -2667,7 +2715,7 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.2" -colorette@^1.2.1, colorette@^1.2.2: +colorette@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== @@ -2816,12 +2864,12 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.9.0, core-js-compat@^3.9.1: - version "3.11.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.11.1.tgz#57a91e9b02d3bb8cf37f82eceaf44a3d646fa614" - integrity sha512-aZ0e4tmlG/aOBHj92/TuOuZwp6jFvn1WNabU5VOVixzhu5t5Ao+JZkQOPlgNXu6ynwLrwJxklT4Gw1G1VGEh+g== +core-js-compat@^3.16.0, core-js-compat@^3.16.2: + version "3.18.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.18.2.tgz#e40c266fbd613948dd8d2d2156345da8ac03c142" + integrity sha512-25VJYCJtGjZwLguj7d66oiHfmnVw3TMOZ0zV8DyMJp/aeQ3OjR519iOOeck08HMyVVRAqXxafc2Hl+5QstJrsQ== dependencies: - browserslist "^4.16.5" + browserslist "^4.17.3" semver "7.0.0" core-js-pure@^3.0.0: @@ -3478,10 +3526,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.719: - version "1.3.723" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.723.tgz#52769a75635342a4db29af5f1e40bd3dad02c877" - integrity sha512-L+WXyXI7c7+G1V8ANzRsPI5giiimLAUDC6Zs1ojHHPhYXb3k/iTABFmWjivEtsWrRQymjnO66/rO2ZTABGdmWg== +electron-to-chromium@^1.3.857: + version "1.3.860" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.860.tgz#d612e54ed75fa524c12af8da3ad8121ebfe2802b" + integrity sha512-gWwGZ+Wv4Mou2SJRH6JQzhTPjL5f95SX7n6VkLTQ/Q/INsZLZNQ1vH2GlZjozKyvT0kkFuCmWTwIoCj+/hUDPw== element-closest@^2.0.1: version "2.0.2" @@ -5611,7 +5659,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.5, lodash@^4.7.0: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6090,10 +6138,10 @@ node-modules-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= -node-releases@^1.1.71: - version "1.1.71" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" - integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== +node-releases@^1.1.77: + version "1.1.77" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" + integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== normalize-package-data@^2.3.2: version "2.5.0" @@ -6589,6 +6637,11 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" @@ -8159,6 +8212,13 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" From 54fc578169012bb06bad078b5f8a47286992fd8e Mon Sep 17 00:00:00 2001 From: Zach Margolis Date: Thu, 7 Oct 2021 08:29:52 -0700 Subject: [PATCH 02/15] Update CircleCI ruby image (LG-5120) (#5474) --- .circleci/config.yml | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8c929a74133..82ce51fb0fc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,6 +5,7 @@ version: 2.1 orbs: + browser-tools: circleci/browser-tools@1.1 jq: circleci/jq@2.2.0 slack: circleci/slack@3.4.2 executors: @@ -12,7 +13,7 @@ executors: ruby_browsers: docker: # Specify the Ruby version you desire here - - image: circleci/ruby:2.7.3-node-browsers + - image: cimg/ruby:2.7.3-browsers environment: CIRCLE_CI: 'true' RAILS_ENV: test @@ -49,26 +50,26 @@ commands: steps: - restore_cache: keys: - - v1-identity-idp-yarn-{{ checksum "yarn.lock" }} - - v1-identity-idp-yarn- + - v2-identity-idp-yarn-{{ checksum "yarn.lock" }} + - v2-identity-idp-yarn- - run: name: Install Yarn command: yarn install --frozen-lockfile --ignore-engines --cache-folder ~/.cache/yarn - save_cache: - key: v1-identity-idp-yarn-{{ checksum "yarn.lock" }} + key: v2-identity-idp-yarn-{{ checksum "yarn.lock" }} paths: - ~/.cache/yarn yarn-production-install: steps: - restore_cache: keys: - - v1-identity-idp-yarn-production-{{ checksum "yarn.lock" }} - - v1-identity-idp-yarn-production + - v2-identity-idp-yarn-production-{{ checksum "yarn.lock" }} + - v2-identity-idp-yarn-production - run: name: Install Yarn command: yarn install --production --frozen-lockfile --ignore-engines --cache-folder ~/.cache/yarn - save_cache: - key: v1-identity-idp-yarn-production-{{ checksum "yarn.lock" }} + key: v2-identity-idp-yarn-production-{{ checksum "yarn.lock" }} paths: - ~/.cache/yarn @@ -77,13 +78,13 @@ commands: - run: gem install bundler --version $BUNDLER_VERSION - restore_cache: keys: - - v2-identity-idp-bundle-{{ checksum "Gemfile.lock" }} + - v3-identity-idp-bundle-{{ checksum "Gemfile.lock" }} - run: name: Install dependencies command: | bundle check || bundle install --deployment --jobs=4 --retry=3 --without deploy development doc production --path vendor/bundle - save_cache: - key: v2-identity-idp-bundle-{{ checksum "Gemfile.lock" }} + key: v3-identity-idp-bundle-{{ checksum "Gemfile.lock" }} paths: - vendor/bundle # Custom version of "checkout" that checks out a SHA deployed to sha_url param @@ -180,6 +181,7 @@ jobs: working_directory: ~/identity-idp steps: + - browser-tools/install-browser-tools - checkout - node-install - yarn-install @@ -188,7 +190,7 @@ jobs: name: Install AWS CLI command: | sudo apt-get update - sudo apt-get install python-pip python-dev jq + sudo apt-get install python3-pip python-dev jq sudo pip install awscli - run: name: Install Code Climate Test Reporter @@ -246,6 +248,7 @@ jobs: working_directory: ~/identity-idp executor: ruby_browsers steps: + - browser-tools/install-browser-tools - checkout - node-install - yarn-install @@ -285,6 +288,7 @@ jobs: environment: MONITOR_ENV: DEV steps: + - browser-tools/install-browser-tools - jq/install - checkout-deployed-sha: sha_url: https://idp.dev.identitysandbox.gov/api/deploy.json @@ -303,6 +307,7 @@ jobs: environment: MONITOR_ENV: INT steps: + - browser-tools/install-browser-tools - jq/install - checkout-deployed-sha: sha_url: https://idp.int.identitysandbox.gov/api/deploy.json @@ -321,6 +326,7 @@ jobs: environment: MONITOR_ENV: STAGING steps: + - browser-tools/install-browser-tools - jq/install - checkout-deployed-sha: sha_url: https://idp.staging.login.gov/api/deploy.json @@ -339,6 +345,7 @@ jobs: environment: MONITOR_ENV: PROD steps: + - browser-tools/install-browser-tools - checkout - node-install - yarn-install From 9495eadbf6f8876885dcf24f66f16cfd1099604e Mon Sep 17 00:00:00 2001 From: Zach Margolis Date: Thu, 7 Oct 2021 09:22:25 -0700 Subject: [PATCH 03/15] Make PII-in-logs checks a little more strict (#5478) --- spec/services/analytics_spec.rb | 13 +++++++++++++ spec/support/fake_analytics.rb | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/spec/services/analytics_spec.rb b/spec/services/analytics_spec.rb index dd9af8ed352..f639cb38480 100644 --- a/spec/services/analytics_spec.rb +++ b/spec/services/analytics_spec.rb @@ -195,5 +195,18 @@ ) end.to_not raise_error end + + it 'does not alert when pii values are inside words' do + expect(ahoy).to receive(:track) + + stub_const('DocAuth::Mock::ResultResponseBuilder::DEFAULT_PII_FROM_DOC', zipcode: '12345') + + expect do + analytics.track_event( + 'Trackable Event', + some_uuid: '12345678-1234-1234-1234-123456789012', + ) + end.to_not raise_error + end end end diff --git a/spec/support/fake_analytics.rb b/spec/support/fake_analytics.rb index 6268cc926d7..7a4a6195afc 100644 --- a/spec/support/fake_analytics.rb +++ b/spec/support/fake_analytics.rb @@ -26,7 +26,7 @@ def track_event(event, original_attributes = {}) :dob, :state_id_number, ).each do |key, default_pii_value| - if string_payload.include?(default_pii_value) + if string_payload.match?(Regexp.new('\b' + Regexp.quote(default_pii_value) + '\b', 'i')) raise PiiDetected, <<~ERROR track_event example PII #{key} (#{default_pii_value}) detected in attributes event: #{event} (#{constant_name}) From e1e9da8f410bc3460e8217fa6cf85d6194085ed9 Mon Sep 17 00:00:00 2001 From: Andrew Duthie Date: Thu, 7 Oct 2021 12:49:53 -0400 Subject: [PATCH 04/15] Run ERBLint on ViewComponent markup (#5477) * Run ERBLint on ViewComponent markup **Why**: Because these ERB files live outside app/views, but should still be subject to linting. * Split paths passed to ERBLint Seems expansion support may be OS/shell-specific --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index e166803defe..ff7a5b1cc8c 100644 --- a/Makefile +++ b/Makefile @@ -51,7 +51,7 @@ lint: bundle exec scss-lint lint_erb: - bundle exec erblint app/views + bundle exec erblint app/views app/components lint_yaml: normalize_yaml (! git diff --name-only | grep "^config/.*\.yml$$") || (echo "Error: Run 'make normalize_yaml' to normalize YAML"; exit 1) From f0c9a8ca237b9755ccc8df9b99f20b87da354f46 Mon Sep 17 00:00:00 2001 From: Alex Mathews <44584810+amathews-fs@users.noreply.github.com> Date: Thu, 7 Oct 2021 14:33:50 -0400 Subject: [PATCH 05/15] LG-4770 Quick phone finder error content update. (#5479) --- config/locales/idv/en.yml | 2 +- config/locales/idv/es.yml | 3 ++- config/locales/idv/fr.yml | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/config/locales/idv/en.yml b/config/locales/idv/en.yml index 0be11f67a96..4542cd773dd 100644 --- a/config/locales/idv/en.yml +++ b/config/locales/idv/en.yml @@ -49,7 +49,7 @@ en: fail_html: 'Please try again in %{timeout}. For your security, we limit the number of times you can attempt to verify your phone number online.' - heading: We could not match your name and address to this phone number + heading: We could not match this phone number to other records jobfail: Something went wrong and we cannot process your request at this time. Please try again. timeout: Our request to verify your information timed out. Please try again. diff --git a/config/locales/idv/es.yml b/config/locales/idv/es.yml index 8fba1f3d01d..e77c8d10ae0 100644 --- a/config/locales/idv/es.yml +++ b/config/locales/idv/es.yml @@ -52,7 +52,8 @@ es: fail_html: 'Por favor, inténtelo de nuevo en %{timeout}. Por su seguridad, limitamos el número de veces que puede intentar verificar su número de teléfono en línea.' - heading: No hemos podido asociar su nombre y dirección a este número de teléfono + heading: No pudimos encontrar coincidencias entre este número de teléfono y + otros registros jobfail: Algo ha fallado y no podemos procesar tu solicitud en este momento. Vuelve a intentarlo. timeout: Nuestra solicitud para verificar tu información ha caducado. Vuelve a diff --git a/config/locales/idv/fr.yml b/config/locales/idv/fr.yml index 3eba5fd2544..2c1a077910e 100644 --- a/config/locales/idv/fr.yml +++ b/config/locales/idv/fr.yml @@ -55,8 +55,8 @@ fr: fail_html: 'Veuillez réessayer dans %{timeout}. Pour votre sécurité, nous limitons le nombre de fois où vous pouvez tenter de vérifier votre numéro de téléphone en ligne.' - heading: Nous n’avons pas pu associer votre nom et votre adresse à ce numéro de - téléphone + heading: Nous n'avons pas pu faire correspondre ce numéro de téléphone à + d'autres enregistrements jobfail: Un problème s’est produit et nous ne pouvons pas traiter votre demande pour le moment. Veuillez réessayer. timeout: Notre demande de vérification de vos renseignements a expiré. Veuillez From 7795355c52c9f8fa910178c6c764fbbf06e25daf Mon Sep 17 00:00:00 2001 From: Alex Mathews <44584810+amathews-fs@users.noreply.github.com> Date: Thu, 7 Oct 2021 15:08:45 -0400 Subject: [PATCH 06/15] LG-5217 Quick content update for IAL2 phone verification. (#5480) --- config/locales/idv/en.yml | 3 ++- config/locales/idv/es.yml | 3 ++- config/locales/idv/fr.yml | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/config/locales/idv/en.yml b/config/locales/idv/en.yml index 4542cd773dd..010ffac82c3 100644 --- a/config/locales/idv/en.yml +++ b/config/locales/idv/en.yml @@ -114,7 +114,8 @@ en: typically take 3 to 7 business days. mail_sent: Your letter is on its way otp_delivery_method: - phone_number_html: We’ll send a code to %{phone} + phone_number_html: We’ll send a code to %{phone} to verify that + the phone number belongs to you. personal_key: This is your new personal key. Write it down and keep it in a safe place. You will need it if you ever lose your password. phone: diff --git a/config/locales/idv/es.yml b/config/locales/idv/es.yml index e77c8d10ae0..2354296d798 100644 --- a/config/locales/idv/es.yml +++ b/config/locales/idv/es.yml @@ -120,7 +120,8 @@ es: clase de USPS y por lo general tardan entre 3 y 7 días laborables. mail_sent: Su carta está en camino otp_delivery_method: - phone_number_html: Te enviaremos un código a %{phone} + phone_number_html: Enviaremos un código a %{phone} para + verificar que el número de teléfono le pertenece. personal_key: Esta es su nueva clave personal. Escríbala y guárdela en un lugar seguro. La necesitará si pierde su contraseña. phone: diff --git a/config/locales/idv/fr.yml b/config/locales/idv/fr.yml index 2c1a077910e..24b51d53364 100644 --- a/config/locales/idv/fr.yml +++ b/config/locales/idv/fr.yml @@ -129,7 +129,8 @@ fr: ouvrables. mail_sent: Votre lettre est en route otp_delivery_method: - phone_number_html: Nous enverrons un code au %{phone} + phone_number_html: Nous enverrons un code à %{phone} pour + vérifier que le numéro de téléphone vous appartient. personal_key: Il s’agit de votre nouvelle clé personnelle. Notez-la et conservez-la dans un endroit sécuritaire. Vous en aurez besoin si vous perdez votre mot de passe. From 81251bdc64edfb9266bf78493ed4b4219745acc7 Mon Sep 17 00:00:00 2001 From: Andrew Duthie Date: Fri, 8 Oct 2021 08:06:20 -0400 Subject: [PATCH 07/15] Invert TypeScript include / exclude configuration (#5482) **Why**: So all new code is type-checked by default, saving us the risk / effort of opting-in. --- tsconfig.json | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 31ea0f46682..d94a9bc88b4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,17 +14,24 @@ "include": [ "app/javascript/app/phone-internationalization.js", "app/javascript/packages", - "app/javascript/packs/doc-capture-polling.js", - "app/javascript/packs/document-capture.jsx", - "app/javascript/packs/form-steps-wait.jsx", - "app/javascript/packs/form-validation.js", - "app/javascript/packs/masked-text-toggle.js", - "app/javascript/packs/one-time-code-input.js", - "app/javascript/packs/intl-tel-input.js", - "app/javascript/packs/spinner-button.js", - "app/javascript/packs/step-indicator.js", - "app/javascript/packs/session-expire-session.js", - "app/javascript/packs/session-timeout-ping.js" + "app/javascript/packs" ], - "exclude": ["**/fixtures", "**/*.spec.js"] + "exclude": [ + "**/fixtures", + "**/*.spec.js", + "app/javascript/packs/accept-terms-button.js", + "app/javascript/packs/application.js", + "app/javascript/packs/email-validation.js", + "app/javascript/packs/ial2-consent-button.js", + "app/javascript/packs/personal-key-page-controller.js", + "app/javascript/packs/pw-strength.js", + "app/javascript/packs/reactivate-account-modal.js", + "app/javascript/packs/saml-post.js", + "app/javascript/packs/ssn-field.js", + "app/javascript/packs/upload-step.js", + "app/javascript/packs/webauthn-authenticate.js", + "app/javascript/packs/webauthn-setup.js", + "app/javascript/packs/webauthn-unhide-signin.js", + "app/javascript/packs/webauthn-unhide-signup.js" + ] } From 5e70916501b88cc0aa12592459cae6637d864074 Mon Sep 17 00:00:00 2001 From: Mitchell Henke Date: Fri, 8 Oct 2021 13:05:53 -0500 Subject: [PATCH 08/15] Improve Logging of OIDC Token Event (#5485) * allow "bots" to log events * Add separate error for token expiration * set expiration in initialize * translate errors --- app/forms/openid_connect_token_form.rb | 12 +++++++++--- config/initializers/ahoy.rb | 1 + config/locales/openid_connect/en.yml | 6 +++--- config/locales/openid_connect/es.yml | 6 +++--- config/locales/openid_connect/fr.yml | 7 ++++--- spec/forms/openid_connect_token_form_spec.rb | 2 +- 6 files changed, 21 insertions(+), 13 deletions(-) diff --git a/app/forms/openid_connect_token_form.rb b/app/forms/openid_connect_token_form.rb index f7918dcfc62..17cc4b92187 100644 --- a/app/forms/openid_connect_token_form.rb +++ b/app/forms/openid_connect_token_form.rb @@ -22,6 +22,7 @@ class OpenidConnectTokenForm in: [CLIENT_ASSERTION_TYPE], if: :private_key_jwt? + validate :validate_expired validate :validate_code validate :validate_pkce_or_private_key_jwt validate :validate_code_verifier, if: :pkce? @@ -31,6 +32,7 @@ def initialize(params) ATTRS.each do |key| instance_variable_set(:"@#{key}", params[key]) end + @session_expiration = IdentityConfig.store.session_timeout_in_minutes.minutes.ago @identity = find_identity_with_code end @@ -61,14 +63,12 @@ def url_options private - attr_reader :identity + attr_reader :identity, :session_expiration def find_identity_with_code return if code.blank? || code.include?("\x00") - session_expiration = IdentityConfig.store.session_timeout_in_minutes.minutes.ago @identity = ServiceProviderIdentity.where(session_uuid: code). - where('updated_at >= ?', session_expiration). order(updated_at: :desc).first end @@ -94,6 +94,12 @@ def validate_pkce_or_private_key_jwt errors.add :code, t('openid_connect.token.errors.invalid_authentication') end + def validate_expired + if identity&.updated_at && identity.updated_at < session_expiration + errors.add :code, t('openid_connect.token.errors.expired_code') + end + end + def validate_code errors.add :code, t('openid_connect.token.errors.invalid_code') if identity.blank? || !identity.user diff --git a/config/initializers/ahoy.rb b/config/initializers/ahoy.rb index 6e2f32221d1..f6536015e79 100644 --- a/config/initializers/ahoy.rb +++ b/config/initializers/ahoy.rb @@ -6,6 +6,7 @@ Ahoy.server_side_visits = false Ahoy.geocode = false Ahoy.user_agent_parser = :device_detector +Ahoy.track_bots = true module Ahoy class Store < Ahoy::BaseStore diff --git a/config/locales/openid_connect/en.yml b/config/locales/openid_connect/en.yml index 80d99d89b74..4b64a5e9439 100644 --- a/config/locales/openid_connect/en.yml +++ b/config/locales/openid_connect/en.yml @@ -22,12 +22,12 @@ en: id_token_hint: id_token_hint was not recognized token: errors: + expired_code: is expired invalid_aud: Invalid audience claim, expected %{url} invalid_authentication: Client must authenticate via PKCE or private_key_jwt, missing either code_challenge or client_assertion - invalid_code: is invalid either because it expired, or it doesn’t match any - user. Please see our documentation at - https://developers.login.gov/oidc/#token + invalid_code: is invalid because doesn’t match any user. Please see our + documentation at https://developers.login.gov/oidc/#token invalid_code_verifier: code_verifier did not match code_challenge invalid_iat: iat must be an integer or floating point Unix timestamp representing a time in the past diff --git a/config/locales/openid_connect/es.yml b/config/locales/openid_connect/es.yml index 986d0c114ca..caf9b6527d2 100644 --- a/config/locales/openid_connect/es.yml +++ b/config/locales/openid_connect/es.yml @@ -22,12 +22,12 @@ es: id_token_hint: Id_token_hint no fue reconocido token: errors: + expired_code: ha expirado invalid_aud: Solicitud de audiencia no válida, esperada %{url} invalid_authentication: El cliente debe autenticarse a través de PKCE o private_key_jwt, faltando code_challenge o client_assertion - invalid_code: no es válido porque ha caducado o no coincide con ningún usuario. - Consulte nuestra documentación en - https://developers.login.gov/oidc/#token + invalid_code: no es válido porque no coincide con ningún usuario. Consulte + nuestra documentación en https://developers.login.gov/oidc/#token invalid_code_verifier: code_verifier no coincide con code_challenge invalid_iat: iat debe ser una marca de tiempo Unix de punto flotante o entero que represente un tiempo en el pasado diff --git a/config/locales/openid_connect/fr.yml b/config/locales/openid_connect/fr.yml index 5495dd1bd3b..84b20776555 100644 --- a/config/locales/openid_connect/fr.yml +++ b/config/locales/openid_connect/fr.yml @@ -22,12 +22,13 @@ fr: id_token_hint: id_token_hint n’a pas été reconnu token: errors: + expired_code: est expiré invalid_aud: Affirmation liée à l’auditoire non valide, attendu %{url} invalid_authentication: Le client doit s’authentifier par PKCE ou private_key_jwt, code_challenge ou client_assertion manquant - invalid_code: est non valide soit parce qu’il est périmé, soit parce qu’il ne - correspond à aucun utilisateur. Veuillez consulter notre documentation - à https://developers.login.gov/oidc/#token + invalid_code: n’est pas valide, car il ne correspond à aucun utilisateur. + Veuillez consulter notre documentation à + https://developers.login.gov/oidc/#token invalid_code_verifier: code_verifier ne correspondait pas à code_challenge invalid_iat: iat doit être un horodatage Unix entier ou à virgule flottante représentant une heure dans le passé diff --git a/spec/forms/openid_connect_token_form_spec.rb b/spec/forms/openid_connect_token_form_spec.rb index a873ff0e15d..3ff40d46b17 100644 --- a/spec/forms/openid_connect_token_form_spec.rb +++ b/spec/forms/openid_connect_token_form_spec.rb @@ -102,7 +102,7 @@ it 'is invalid' do expect(valid?).to eq(false) - expect(form.errors[:code]).to include(t('openid_connect.token.errors.invalid_code')) + expect(form.errors[:code]).to eq([t('openid_connect.token.errors.expired_code')]) end end From 5362caf6cce0ef53cf1ab2627657d524253a37b0 Mon Sep 17 00:00:00 2001 From: Zach Margolis Date: Fri, 8 Oct 2021 11:14:03 -0700 Subject: [PATCH 09/15] Update SMS country support due to spamming (#5487) --- config/country_dialing_codes.yml | 2 +- config/pinpoint_overrides.yml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/config/country_dialing_codes.yml b/config/country_dialing_codes.yml index 23866f10ceb..b2ab8081478 100644 --- a/config/country_dialing_codes.yml +++ b/config/country_dialing_codes.yml @@ -981,7 +981,7 @@ TJ: TL: country_code: '670' name: Timor-Leste - supports_sms: true + supports_sms: false supports_voice: false TM: country_code: '993' diff --git a/config/pinpoint_overrides.yml b/config/pinpoint_overrides.yml index 0187ab4821a..42df9fdfd06 100644 --- a/config/pinpoint_overrides.yml +++ b/config/pinpoint_overrides.yml @@ -178,6 +178,8 @@ TH: supports_voice_unconfirmed: false TJ: supports_voice: false +TL: + supports_sms: false TT: supports_voice: false TW: From d76a55702c5424561d87db6a740b3a97f1b86a2a Mon Sep 17 00:00:00 2001 From: Zach Margolis Date: Fri, 8 Oct 2021 13:33:53 -0700 Subject: [PATCH 10/15] Switch back to Browser gem (LG-5189) (#5483) - Seems to be updated more recently than DeviceDetector - See JIRA, examples of mobile being detected incorrectly - With a cache layer, performs similarly * Use an LRU cache for browser parsing + caching --- Gemfile | 3 +- Gemfile.lock | 5 ++- app/controllers/application_controller.rb | 3 +- app/helpers/application_helper.rb | 2 +- .../two_factor_options_presenter.rb | 2 +- app/services/analytics.rb | 10 ++--- app/services/browser_cache.rb | 14 +++++++ app/services/completions_decider.rb | 4 +- app/services/idv/steps/upload_step.rb | 5 +-- config/initializers/ahoy.rb | 2 +- config/initializers/browser.rb | 2 + ...o_factor_authentication_controller_spec.rb | 2 +- .../features/idv/doc_auth/upload_step_spec.rb | 6 +-- .../doc_capture/capture_complete_step_spec.rb | 2 +- .../doc_capture/document_capture_step_spec.rb | 2 +- .../backup_code_sign_up_spec.rb | 2 +- spec/features/users/sign_in_spec.rb | 4 +- spec/features/users/sign_up_spec.rb | 2 +- spec/services/analytics_spec.rb | 37 +++---------------- spec/services/browser_cache_spec.rb | 25 +++++++++++++ spec/support/features/doc_auth_helper.rb | 4 +- spec/support/features/doc_capture_helper.rb | 8 ++-- 22 files changed, 79 insertions(+), 67 deletions(-) create mode 100644 app/services/browser_cache.rb create mode 100644 config/initializers/browser.rb create mode 100644 spec/services/browser_cache_spec.rb diff --git a/Gemfile b/Gemfile index b2071d4e144..14a167b41b0 100644 --- a/Gemfile +++ b/Gemfile @@ -25,8 +25,8 @@ gem 'aws-sdk-ses', '~> 1.6' gem 'base32-crockford' gem 'bootsnap', '~> 1.9.0', require: false gem 'blueprinter', '~> 0.25.3' +gem 'browser' gem 'connection_pool' -gem 'device_detector' gem 'devise', '~> 4.8' gem 'dotiw', '>= 4.0.1' gem 'faraday' @@ -38,6 +38,7 @@ gem 'http_accept_language' gem 'jwt' gem 'local_time' gem 'lograge', '>= 0.11.2' +gem 'lru_redux' gem 'maxminddb' gem 'net-sftp' gem 'newrelic_rpm', '~> 7.0' diff --git a/Gemfile.lock b/Gemfile.lock index 4a5e744291e..05f39e04522 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -181,6 +181,7 @@ GEM bootsnap (1.9.1) msgpack (~> 1.0) brakeman (5.1.1) + browser (5.3.1) builder (3.2.4) bullet (6.1.5) activesupport (>= 3.0.0) @@ -357,6 +358,7 @@ GEM loofah (2.12.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) + lru_redux (1.1.0) lumberjack (1.2.8) macaddr (1.7.2) systemu (~> 2.6.5) @@ -703,13 +705,13 @@ DEPENDENCIES blueprinter (~> 0.25.3) bootsnap (~> 1.9.0) brakeman + browser bullet (>= 6.0.2) bundler-audit capybara-screenshot (>= 1.0.23) capybara-selenium (>= 0.0.6) connection_pool derailed_benchmarks (~> 1.8) - device_detector devise (~> 4.8) dotiw (>= 4.0.1) email_spec @@ -734,6 +736,7 @@ DEPENDENCIES knapsack local_time lograge (>= 0.11.2) + lru_redux maxminddb net-sftp newrelic_rpm (~> 7.0) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index bf0adcdc009..f9075929691 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -395,7 +395,6 @@ def add_sp_cost(token) end def mobile? - client = DeviceDetector.new(request.user_agent) - client.device_type != 'desktop' + BrowserCache.parse(request.user_agent).mobile? end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 51feb6c50ba..dae70e5e341 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -45,6 +45,6 @@ def cancel_link_text end def desktop_device? - DeviceDetector.new(request.user_agent)&.device_type == 'desktop' + !BrowserCache.parse(request.user_agent).mobile? end end diff --git a/app/presenters/two_factor_options_presenter.rb b/app/presenters/two_factor_options_presenter.rb index c38996d98a2..f5abd0c8f04 100644 --- a/app/presenters/two_factor_options_presenter.rb +++ b/app/presenters/two_factor_options_presenter.rb @@ -73,7 +73,7 @@ def backup_code_option end def current_device_is_desktop? - DeviceDetector.new(@user_agent)&.device_type == 'desktop' + !BrowserCache.parse(@user_agent).mobile? end def piv_cac_required? diff --git a/app/services/analytics.rb b/app/services/analytics.rb index 25b2acd8fd1..635d8ef11be 100644 --- a/app/services/analytics.rb +++ b/app/services/analytics.rb @@ -87,7 +87,7 @@ def request_attributes end def browser - @browser ||= DeviceDetector.new(request.user_agent) + @browser ||= BrowserCache.parse(request.user_agent) end def browser_attributes @@ -95,10 +95,10 @@ def browser_attributes user_agent: request.user_agent, browser_name: browser.name, browser_version: browser.full_version, - browser_platform_name: browser.os_name, - browser_platform_version: browser.os_full_version, - browser_device_name: browser.device_name, - browser_device_type: browser.device_type, + browser_platform_name: browser.platform.name, + browser_platform_version: browser.platform.version, + browser_device_name: browser.device.name, + browser_mobile: browser.device.mobile?, browser_bot: browser.bot?, } end diff --git a/app/services/browser_cache.rb b/app/services/browser_cache.rb new file mode 100644 index 00000000000..26c8f4223ef --- /dev/null +++ b/app/services/browser_cache.rb @@ -0,0 +1,14 @@ +class BrowserCache + @cache = LruRedux::Cache.new(1_000) + + # @param [String] user_agent + # @return [Browser] + def self.parse(user_agent) + @cache.getset(user_agent) { Browser.new(user_agent) } + end + + # Should probably only be used in tests + def self.clear + @cache.clear + end +end diff --git a/app/services/completions_decider.rb b/app/services/completions_decider.rb index 11835b3a288..33d8abee8d3 100644 --- a/app/services/completions_decider.rb +++ b/app/services/completions_decider.rb @@ -14,11 +14,11 @@ def go_back_to_mobile_app? attr_reader :user_agent, :request_url def desktop_and_app_redirect_uri? - client.device_type == 'desktop' && !redirect_uri.start_with?('http') + !client.mobile? && !redirect_uri.start_with?('http') end def client - @client ||= DeviceDetector.new(user_agent) + @client ||= BrowserCache.parse(user_agent) end def redirect_uri diff --git a/app/services/idv/steps/upload_step.rb b/app/services/idv/steps/upload_step.rb index debdd740f1c..23b96854881 100644 --- a/app/services/idv/steps/upload_step.rb +++ b/app/services/idv/steps/upload_step.rb @@ -60,10 +60,7 @@ def bypass_send_link_steps end def mobile_device? - return @mobile_device if defined?(@mobile_device) - - client = DeviceDetector.new(request.user_agent) - @mobile_device = client.device_type != 'desktop' + BrowserCache.parse(request.user_agent).mobile? end end end diff --git a/config/initializers/ahoy.rb b/config/initializers/ahoy.rb index f6536015e79..ebbcfb5ffb9 100644 --- a/config/initializers/ahoy.rb +++ b/config/initializers/ahoy.rb @@ -5,7 +5,7 @@ Ahoy.visit_duration = IdentityConfig.store.session_timeout_in_minutes.minutes Ahoy.server_side_visits = false Ahoy.geocode = false -Ahoy.user_agent_parser = :device_detector +Ahoy.user_agent_parser = :browser Ahoy.track_bots = true module Ahoy diff --git a/config/initializers/browser.rb b/config/initializers/browser.rb new file mode 100644 index 00000000000..cb1e61937e6 --- /dev/null +++ b/config/initializers/browser.rb @@ -0,0 +1,2 @@ +require 'browser/aliases' +Browser::Base.include(Browser::Aliases) diff --git a/spec/controllers/users/two_factor_authentication_controller_spec.rb b/spec/controllers/users/two_factor_authentication_controller_spec.rb index 79b4a28cc7a..77900d32631 100644 --- a/spec/controllers/users/two_factor_authentication_controller_spec.rb +++ b/spec/controllers/users/two_factor_authentication_controller_spec.rb @@ -69,7 +69,7 @@ def index describe '#show' do context 'when user is piv/cac enabled' do it 'renders the piv/cac entry screen' do - allow_any_instance_of(DeviceDetector).to receive(:device_type).and_return('desktop') + allow_any_instance_of(Browser).to receive(:mobile?).and_return(true) user = build(:user) stub_sign_in_before_2fa(user) allow_any_instance_of( diff --git a/spec/features/idv/doc_auth/upload_step_spec.rb b/spec/features/idv/doc_auth/upload_step_spec.rb index d563eb3740e..d79c63b56cb 100644 --- a/spec/features/idv/doc_auth/upload_step_spec.rb +++ b/spec/features/idv/doc_auth/upload_step_spec.rb @@ -11,7 +11,7 @@ context 'on a mobile device' do before do - allow_any_instance_of(DeviceDetector).to receive(:device_type).and_return('mobile') + allow(BrowserCache).to receive(:parse).and_return(mobile_device) end it 'is on the correct page' do @@ -30,10 +30,6 @@ end context 'on a desktop device' do - before do - allow_any_instance_of(DeviceDetector).to receive(:device_type).and_return('desktop') - end - it 'is on the correct page' do expect(page).to have_current_path(idv_doc_auth_upload_step) end diff --git a/spec/features/idv/doc_capture/capture_complete_step_spec.rb b/spec/features/idv/doc_capture/capture_complete_step_spec.rb index 3f4c752b6e4..24b8bf135f2 100644 --- a/spec/features/idv/doc_capture/capture_complete_step_spec.rb +++ b/spec/features/idv/doc_capture/capture_complete_step_spec.rb @@ -7,7 +7,7 @@ before do complete_doc_capture_steps_before_capture_complete_step - allow_any_instance_of(DeviceDetector).to receive(:device_type).and_return('mobile') + allow_any_instance_of(Browser).to receive(:mobile?).and_return(true) end it 'is on the correct page' do diff --git a/spec/features/idv/doc_capture/document_capture_step_spec.rb b/spec/features/idv/doc_capture/document_capture_step_spec.rb index 9646747fc3a..588a01976ee 100644 --- a/spec/features/idv/doc_capture/document_capture_step_spec.rb +++ b/spec/features/idv/doc_capture/document_capture_step_spec.rb @@ -23,7 +23,7 @@ else visit_idp_from_oidc_sp_with_ial2 end - allow_any_instance_of(DeviceDetector).to receive(:device_type).and_return('mobile') + allow_any_instance_of(Browser).to receive(:mobile?).and_return(true) end it 'offers the user the option to cancel and return to desktop' do diff --git a/spec/features/two_factor_authentication/backup_code_sign_up_spec.rb b/spec/features/two_factor_authentication/backup_code_sign_up_spec.rb index dcbba2296bd..4710b318b0e 100644 --- a/spec/features/two_factor_authentication/backup_code_sign_up_spec.rb +++ b/spec/features/two_factor_authentication/backup_code_sign_up_spec.rb @@ -22,7 +22,7 @@ end it 'does not show download button on a mobile device' do - allow(DeviceDetector).to receive(:new).and_return(mobile_device) + allow(BrowserCache).to receive(:parse).and_return(mobile_device) sign_up_and_set_password diff --git a/spec/features/users/sign_in_spec.rb b/spec/features/users/sign_in_spec.rb index 6854b131cce..cc3b5853b3a 100644 --- a/spec/features/users/sign_in_spec.rb +++ b/spec/features/users/sign_in_spec.rb @@ -110,14 +110,14 @@ end scenario 'user attempts sign in with a PIV/CAC on mobile' do - allow(DeviceDetector).to receive(:new).and_return(mobile_device) + allow(BrowserCache).to receive(:parse).and_return(mobile_device) visit root_path expect(page).to_not have_link t('account.login.piv_cac') end scenario 'user attempts sign in with the default MFA on mobile and a PIV/CAC configured' do - allow(DeviceDetector).to receive(:new).and_return(mobile_device) + allow(BrowserCache).to receive(:parse).and_return(mobile_device) sign_in_before_2fa(user_with_piv_cac) expect(current_path).to eq(login_otp_path(otp_delivery_preference: :sms)) diff --git a/spec/features/users/sign_up_spec.rb b/spec/features/users/sign_up_spec.rb index adc5d92a2fe..eae8aeab697 100644 --- a/spec/features/users/sign_up_spec.rb +++ b/spec/features/users/sign_up_spec.rb @@ -208,7 +208,7 @@ end it 'does not allow PIV/CAC during setup on mobile' do - allow(DeviceDetector).to receive(:new).and_return(mobile_device) + allow(BrowserCache).to receive(:parse).and_return(mobile_device) sign_in_user diff --git a/spec/services/analytics_spec.rb b/spec/services/analytics_spec.rb index f639cb38480..6ed71f1790f 100644 --- a/spec/services/analytics_spec.rb +++ b/spec/services/analytics_spec.rb @@ -5,12 +5,12 @@ { user_ip: FakeRequest.new.remote_ip, user_agent: FakeRequest.new.user_agent, - browser_name: nil, - browser_version: nil, - browser_platform_name: nil, - browser_platform_version: nil, - browser_device_name: nil, - browser_device_type: nil, + browser_name: 'Unknown Browser', + browser_version: '0.0', + browser_platform_name: 'Unknown', + browser_platform_version: '0', + browser_device_name: 'Unknown', + browser_mobile: false, browser_bot: false, hostname: FakeRequest.new.host, pid: Process.pid, @@ -111,31 +111,6 @@ end end - it 'uses the DeviceDetector gem to parse the user agent' do - user = build_stubbed(:user, uuid: '123') - analytics = Analytics.new( - user: user, - request: FakeRequest.new, - sp: nil, - session: {}, - ahoy: ahoy, - ) - - browser = instance_double(DeviceDetector) - allow(DeviceDetector).to receive(:new).and_return(browser) - - expect(ahoy).to receive(:track) - expect(browser).to receive(:name) - expect(browser).to receive(:full_version) - expect(browser).to receive(:os_name) - expect(browser).to receive(:os_full_version) - expect(browser).to receive(:device_name) - expect(browser).to receive(:device_type) - expect(browser).to receive(:bot?) - - analytics.track_event('Trackable Event') - end - it 'includes the locale of the current request' do locale = :fr allow(I18n).to receive(:locale).and_return(locale) diff --git a/spec/services/browser_cache_spec.rb b/spec/services/browser_cache_spec.rb new file mode 100644 index 00000000000..9e3addf8bb8 --- /dev/null +++ b/spec/services/browser_cache_spec.rb @@ -0,0 +1,25 @@ +require 'rails_helper' + +RSpec.describe BrowserCache do + let(:chrome_user_agent) do + 'Mozilla/5.0 (X11; CrOS x86_64 8172.45.0) AppleWebKit/537.36 (KHTML, like Gecko) \ + Chrome/51.0.2704.64 Safari/537.36' + end + + before { BrowserCache.clear } + + describe '.parse' do + it 'parses a user agent using Browser gem' do + browser = BrowserCache.parse(chrome_user_agent) + expect(browser.name).to eq('Chrome') + expect(browser.platform.name).to eq('Chrome OS') + expect(browser.mobile?).to eq(false) + end + + it 'caches by user agent' do + expect(Browser).to receive(:new).once.and_call_original + + 3.times { BrowserCache.parse(chrome_user_agent) } + end + end +end diff --git a/spec/support/features/doc_auth_helper.rb b/spec/support/features/doc_auth_helper.rb index 380ac483bae..f08ddc9a398 100644 --- a/spec/support/features/doc_auth_helper.rb +++ b/spec/support/features/doc_auth_helper.rb @@ -100,13 +100,13 @@ def complete_doc_auth_steps_before_document_capture_step(expect_accessible: fals end def complete_doc_auth_steps_before_email_sent_step - allow(DeviceDetector).to receive(:new).and_return(mobile_device) + allow(BrowserCache).to receive(:parse).and_return(mobile_device) complete_doc_auth_steps_before_upload_step click_on t('doc_auth.info.upload_computer_link') end def mobile_device - DeviceDetector.new( + Browser.new( 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) \ AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1', ) diff --git a/spec/support/features/doc_capture_helper.rb b/spec/support/features/doc_capture_helper.rb index 9ce68f43de7..047ac92a7e9 100644 --- a/spec/support/features/doc_capture_helper.rb +++ b/spec/support/features/doc_capture_helper.rb @@ -1,20 +1,20 @@ module DocCaptureHelper def doc_capture_request_uri(user = user_with_2fa) - allow_any_instance_of(DeviceDetector).to receive(:device_type).and_return('desktop') + allow_any_instance_of(Browser).to receive(:mobile?).and_return(false) sign_in_and_2fa_user(user) complete_doc_auth_steps_before_link_sent_step url = Telephony::Test::Message.messages.last.body.split(' ').first - allow_any_instance_of(DeviceDetector).to receive(:device_type).and_call_original + allow_any_instance_of(Browser).to receive(:mobile?).and_call_original URI.parse(url).request_uri end def in_doc_capture_session(user = user_with_2fa) request_uri = doc_capture_request_uri(user) Capybara.using_session 'doc capture' do - allow_any_instance_of(DeviceDetector).to receive(:device_type).and_return('mobile') + allow_any_instance_of(Browser).to receive(:mobile?).and_return(true) visit request_uri yield - allow_any_instance_of(DeviceDetector).to receive(:device_type).and_call_original + allow_any_instance_of(Browser).to receive(:mobile?).and_call_original end end From b9dfe98f326bf10f5f27b65dabc80b04cbe3496f Mon Sep 17 00:00:00 2001 From: Zach Margolis Date: Fri, 8 Oct 2021 15:27:17 -0700 Subject: [PATCH 11/15] Remove user_agent_parser gem, re-use browser gem (#5489) * Remove separate methods * Mac OS X => macOS --- Gemfile | 1 - Gemfile.lock | 2 -- app/models/device.rb | 2 +- app/services/device_tracking/device_name.rb | 22 ++++--------------- app/services/device_tracking/list_devices.rb | 4 +--- spec/features/account/device_spec.rb | 2 +- .../device_tracking/device_name_spec.rb | 3 +-- 7 files changed, 8 insertions(+), 28 deletions(-) diff --git a/Gemfile b/Gemfile index 14a167b41b0..2ae1fac3c20 100644 --- a/Gemfile +++ b/Gemfile @@ -68,7 +68,6 @@ gem 'stringex', require: false gem 'strong_migrations', '>= 0.4.2' gem 'subprocess', require: false gem 'uglifier', '~> 4.2' -gem 'user_agent_parser' gem 'valid_email', '>= 0.1.3' gem 'view_component', '~> 2.40.0', require: 'view_component/engine' gem 'webauthn', '~> 2.1' diff --git a/Gemfile.lock b/Gemfile.lock index 05f39e04522..b4e9497c8d7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -632,7 +632,6 @@ GEM execjs (>= 0.3.0, < 3) unicode-display_width (2.0.0) uniform_notifier (1.14.2) - user_agent_parser (2.7.0) uuid (2.3.9) macaddr (~> 1.0) valid_email (0.1.3) @@ -792,7 +791,6 @@ DEPENDENCIES strong_migrations (>= 0.4.2) subprocess uglifier (~> 4.2) - user_agent_parser valid_email (>= 0.1.3) view_component (~> 2.40.0) webauthn (~> 2.1) diff --git a/app/models/device.rb b/app/models/device.rb index 6ab102061b7..c3a07ea342c 100644 --- a/app/models/device.rb +++ b/app/models/device.rb @@ -14,6 +14,6 @@ def decorate end def device_name - DeviceTracking::DeviceName.call(UserAgentParser::Parser.new, self) + DeviceTracking::DeviceName.call(self) end end diff --git a/app/services/device_tracking/device_name.rb b/app/services/device_tracking/device_name.rb index 5a53649bcca..4e23d2ee108 100644 --- a/app/services/device_tracking/device_name.rb +++ b/app/services/device_tracking/device_name.rb @@ -1,26 +1,12 @@ module DeviceTracking class DeviceName - def self.call(parser, device) - device_user_agent = device.user_agent - user_agent = parser.parse(device_user_agent) + def self.call(device) + browser = BrowserCache.parse(device.user_agent) I18n.t( 'account.index.device', - browser: browser(user_agent), - os: os(user_agent), + browser: "#{browser.name} #{browser.version}", + os: "#{browser.platform.name} #{browser.platform.version.split('.').first}", ) end - - def self.browser(user_agent) - version = user_agent.version - "#{user_agent.family} #{version ? version.major : ''}" - end - private_class_method :browser - - def self.os(user_agent) - user_agent_os = user_agent.os - version = user_agent_os.version - "#{user_agent_os.family} #{version ? version.major : ''}" - end - private_class_method :os end end diff --git a/app/services/device_tracking/list_devices.rb b/app/services/device_tracking/list_devices.rb index 0b03a669d48..6df970c3c4f 100644 --- a/app/services/device_tracking/list_devices.rb +++ b/app/services/device_tracking/list_devices.rb @@ -3,9 +3,7 @@ class ListDevices def self.call(user_id, offset, limit) devices = Device.where(user_id: user_id).order(last_used_at: :desc).offset(offset). limit(limit) - # heavy cost to load; instantiate once and parse in bulk - parser = UserAgentParser::Parser.new - devices.each { |device| device.nice_name = DeviceName.call(parser, device) } + devices.each { |device| device.nice_name = DeviceName.call(device) } end end end diff --git a/spec/features/account/device_spec.rb b/spec/features/account/device_spec.rb index 4d699b2991e..ecba13fcf6b 100644 --- a/spec/features/account/device_spec.rb +++ b/spec/features/account/device_spec.rb @@ -18,6 +18,6 @@ end scenario 'viewing devices' do - expect(page).to have_content('Chrome 71 on Mac OS X 10') + expect(page).to have_content('Chrome 71 on macOS 10') end end diff --git a/spec/services/device_tracking/device_name_spec.rb b/spec/services/device_tracking/device_name_spec.rb index 4dc87ad070b..050e21f4d6e 100644 --- a/spec/services/device_tracking/device_name_spec.rb +++ b/spec/services/device_tracking/device_name_spec.rb @@ -2,11 +2,10 @@ describe DeviceTracking::DeviceName do subject { described_class } - let(:parser) { UserAgentParser::Parser } let(:device) { create(:device) } it 'gives a shortened os and browser name' do - result = subject.call(parser.new, device) + result = subject.call(device) expect(result).to eq('Chrome 58 on Windows 10') end From 6f75ed3cb8e8af09ceaef07d251d30490766b872 Mon Sep 17 00:00:00 2001 From: Zach Margolis Date: Tue, 12 Oct 2021 09:03:50 -0700 Subject: [PATCH 12/15] Remove some DeviceTracking namespace classes (#5491) * Remove DeviceTracking::DeviceName * Remove DeviceTracking::ListDevices * Remove DeviceTracking::UpdateDevice, move to Device * Remove DeviceTracking::LookupDeviceForUser * Remove DeviceTracking::CreateDevice * Remove DeviceTracking::ListDeviceEvents * Rename {DeviceTracking => }ForgetAllBrowsers --- app/controllers/events_controller.rb | 10 +++- .../users/forget_all_browsers_controller.rb | 2 +- app/decorators/device_decorator.rb | 11 +++- app/decorators/user_decorator.rb | 3 +- app/models/device.rb | 8 ++- app/services/device_tracking/create_device.rb | 15 ----- app/services/device_tracking/device_name.rb | 12 ---- .../device_tracking/forget_all_browsers.rb | 19 ------- .../device_tracking/list_device_events.rb | 9 --- app/services/device_tracking/list_devices.rb | 9 --- .../device_tracking/lookup_device_for_user.rb | 7 --- app/services/device_tracking/update_device.rb | 10 ---- app/services/forget_all_browsers.rb | 17 ++++++ app/services/reset_user_password.rb | 2 +- app/services/user_event_creator.rb | 16 ++++-- app/views/events/show.html.erb | 2 +- spec/decorators/device_decorator_spec.rb | 12 ++++ spec/models/device_spec.rb | 16 ++++++ .../device_tracking/create_device_spec.rb | 23 -------- .../device_tracking/device_name_spec.rb | 12 ---- .../list_device_events_spec.rb | 55 ------------------- .../device_tracking/list_devices_spec.rb | 44 --------------- .../lookup_device_for_user_spec.rb | 40 -------------- .../device_tracking/update_device_spec.rb | 19 ------- .../forget_all_browsers_spec.rb | 4 +- spec/services/idv/gpo_mail_spec.rb | 2 +- spec/services/user_event_creator_spec.rb | 31 ++++++++--- 27 files changed, 110 insertions(+), 300 deletions(-) delete mode 100644 app/services/device_tracking/create_device.rb delete mode 100644 app/services/device_tracking/device_name.rb delete mode 100644 app/services/device_tracking/forget_all_browsers.rb delete mode 100644 app/services/device_tracking/list_device_events.rb delete mode 100644 app/services/device_tracking/list_devices.rb delete mode 100644 app/services/device_tracking/lookup_device_for_user.rb delete mode 100644 app/services/device_tracking/update_device.rb create mode 100644 app/services/forget_all_browsers.rb create mode 100644 spec/decorators/device_decorator_spec.rb delete mode 100644 spec/services/device_tracking/create_device_spec.rb delete mode 100644 spec/services/device_tracking/device_name_spec.rb delete mode 100644 spec/services/device_tracking/list_device_events_spec.rb delete mode 100644 spec/services/device_tracking/list_devices_spec.rb delete mode 100644 spec/services/device_tracking/lookup_device_for_user_spec.rb delete mode 100644 spec/services/device_tracking/update_device_spec.rb rename spec/services/{device_tracking => }/forget_all_browsers_spec.rb (77%) diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index b57e8649a23..c7b6e6f885f 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -22,9 +22,13 @@ def show def device_and_events user_id = current_user.id - @events = DeviceTracking::ListDeviceEvents.call(user_id, device_id, 0, EVENTS_PAGE_SIZE). - map(&:decorate) - @device = Device.where(user_id: user_id).find(device_id) + device = Device.where(user_id: user_id).find(device_id) + return if !device + + @events = Event.where(user_id: user_id, device_id: device.id).order(created_at: :desc). + limit(EVENTS_PAGE_SIZE). + map(&:decorate) + @device = device.decorate end def device_id diff --git a/app/controllers/users/forget_all_browsers_controller.rb b/app/controllers/users/forget_all_browsers_controller.rb index ab8e41e12bf..544bfa3cfeb 100644 --- a/app/controllers/users/forget_all_browsers_controller.rb +++ b/app/controllers/users/forget_all_browsers_controller.rb @@ -7,7 +7,7 @@ def show end def destroy - DeviceTracking::ForgetAllBrowsers.new(current_user).call + ForgetAllBrowsers.new(current_user).call analytics.track_event(Analytics::FORGET_ALL_BROWSERS_SUBMITTED) diff --git a/app/decorators/device_decorator.rb b/app/decorators/device_decorator.rb index 491a4cd39b8..6b5b0bd56fa 100644 --- a/app/decorators/device_decorator.rb +++ b/app/decorators/device_decorator.rb @@ -1,5 +1,5 @@ DeviceDecorator = Struct.new(:device) do - delegate :nice_name, :last_used_at, :id, to: :device + delegate :last_used_at, :id, to: :device def last_sign_in_location_and_ip I18n.t('account.index.sign_in_location_and_ip', location: last_location, ip: device.last_ip) @@ -12,4 +12,13 @@ def last_location def happened_at device.last_used_at.utc end + + def nice_name + browser = BrowserCache.parse(device.user_agent) + I18n.t( + 'account.index.device', + browser: "#{browser.name} #{browser.version}", + os: "#{browser.platform.name} #{browser.platform.version.split('.').first}", + ) + end end diff --git a/app/decorators/user_decorator.rb b/app/decorators/user_decorator.rb index 6ec0cf2d5a8..e2d74f94588 100644 --- a/app/decorators/user_decorator.rb +++ b/app/decorators/user_decorator.rb @@ -143,7 +143,8 @@ def identity_events end def recent_devices - DeviceTracking::ListDevices.call(user.id, 0, MAX_RECENT_DEVICES).map(&:decorate) + @recent_devices ||= user.devices.order(last_used_at: :desc).limit(MAX_RECENT_DEVICES). + map(&:decorate) end def devices? diff --git a/app/models/device.rb b/app/models/device.rb index c3a07ea342c..89941e00b1a 100644 --- a/app/models/device.rb +++ b/app/models/device.rb @@ -13,7 +13,11 @@ def decorate DeviceDecorator.new(self) end - def device_name - DeviceTracking::DeviceName.call(self) + # @return [Device] + def update_last_used_ip(remote_ip, now: Time.zone.now) + self.last_used_at = now + self.last_ip = remote_ip + save + self end end diff --git a/app/services/device_tracking/create_device.rb b/app/services/device_tracking/create_device.rb deleted file mode 100644 index 4ae66eb4a8f..00000000000 --- a/app/services/device_tracking/create_device.rb +++ /dev/null @@ -1,15 +0,0 @@ -module DeviceTracking - class CreateDevice - COOKIE_LENGTH = 128 - - def self.call(user_id, remote_ip, user_agent, uuid) - Device.create!( - user_id: user_id, - user_agent: user_agent.to_s, - cookie_uuid: uuid.presence || SecureRandom.hex(COOKIE_LENGTH / 2), - last_used_at: Time.zone.now, - last_ip: remote_ip, - ) - end - end -end diff --git a/app/services/device_tracking/device_name.rb b/app/services/device_tracking/device_name.rb deleted file mode 100644 index 4e23d2ee108..00000000000 --- a/app/services/device_tracking/device_name.rb +++ /dev/null @@ -1,12 +0,0 @@ -module DeviceTracking - class DeviceName - def self.call(device) - browser = BrowserCache.parse(device.user_agent) - I18n.t( - 'account.index.device', - browser: "#{browser.name} #{browser.version}", - os: "#{browser.platform.name} #{browser.platform.version.split('.').first}", - ) - end - end -end diff --git a/app/services/device_tracking/forget_all_browsers.rb b/app/services/device_tracking/forget_all_browsers.rb deleted file mode 100644 index 2fb47b21a9e..00000000000 --- a/app/services/device_tracking/forget_all_browsers.rb +++ /dev/null @@ -1,19 +0,0 @@ -module DeviceTracking - class ForgetAllBrowsers - attr_reader :user, :remember_device_revoked_at - - def initialize(user, remember_device_revoked_at: nil) - @user = user - @remember_device_revoked_at = remember_device_revoked_at || Time.zone.now - end - - def call - UpdateUser.new( - user: user, - attributes: { - remember_device_revoked_at: remember_device_revoked_at, - }, - ).call - end - end -end diff --git a/app/services/device_tracking/list_device_events.rb b/app/services/device_tracking/list_device_events.rb deleted file mode 100644 index 3b1e6cc6b8a..00000000000 --- a/app/services/device_tracking/list_device_events.rb +++ /dev/null @@ -1,9 +0,0 @@ -module DeviceTracking - class ListDeviceEvents - def self.call(user_id, device_id, offset, limit) - return [] unless Device.where(user_id: user_id, id: device_id) - Event.where(user_id: user_id, device_id: device_id).order(created_at: :desc). - offset(offset).limit(limit) - end - end -end diff --git a/app/services/device_tracking/list_devices.rb b/app/services/device_tracking/list_devices.rb deleted file mode 100644 index 6df970c3c4f..00000000000 --- a/app/services/device_tracking/list_devices.rb +++ /dev/null @@ -1,9 +0,0 @@ -module DeviceTracking - class ListDevices - def self.call(user_id, offset, limit) - devices = Device.where(user_id: user_id).order(last_used_at: :desc).offset(offset). - limit(limit) - devices.each { |device| device.nice_name = DeviceName.call(device) } - end - end -end diff --git a/app/services/device_tracking/lookup_device_for_user.rb b/app/services/device_tracking/lookup_device_for_user.rb deleted file mode 100644 index 6c3d6554502..00000000000 --- a/app/services/device_tracking/lookup_device_for_user.rb +++ /dev/null @@ -1,7 +0,0 @@ -module DeviceTracking - class LookupDeviceForUser - def self.call(user_id, cookie_guid) - Device.find_by(user_id: user_id, cookie_uuid: cookie_guid) - end - end -end diff --git a/app/services/device_tracking/update_device.rb b/app/services/device_tracking/update_device.rb deleted file mode 100644 index 492a0ab684c..00000000000 --- a/app/services/device_tracking/update_device.rb +++ /dev/null @@ -1,10 +0,0 @@ -module DeviceTracking - class UpdateDevice - def self.call(device, remote_ip) - device.last_used_at = Time.zone.now - device.last_ip = remote_ip - device.save - device - end - end -end diff --git a/app/services/forget_all_browsers.rb b/app/services/forget_all_browsers.rb new file mode 100644 index 00000000000..2b992ea8a25 --- /dev/null +++ b/app/services/forget_all_browsers.rb @@ -0,0 +1,17 @@ +class ForgetAllBrowsers + attr_reader :user, :remember_device_revoked_at + + def initialize(user, remember_device_revoked_at: nil) + @user = user + @remember_device_revoked_at = remember_device_revoked_at || Time.zone.now + end + + def call + UpdateUser.new( + user: user, + attributes: { + remember_device_revoked_at: remember_device_revoked_at, + }, + ).call + end +end diff --git a/app/services/reset_user_password.rb b/app/services/reset_user_password.rb index 81522acc0db..0ef7277eb2d 100644 --- a/app/services/reset_user_password.rb +++ b/app/services/reset_user_password.rb @@ -20,7 +20,7 @@ def reset_user_password end def forget_all_browsers - DeviceTracking::ForgetAllBrowsers.new( + ForgetAllBrowsers.new( user, remember_device_revoked_at: remember_device_revoked_at, ).call diff --git a/app/services/user_event_creator.rb b/app/services/user_event_creator.rb index 78be4f358df..ac35072381f 100644 --- a/app/services/user_event_creator.rb +++ b/app/services/user_event_creator.rb @@ -1,4 +1,6 @@ class UserEventCreator + COOKIE_LENGTH = 128 + attr_reader :request, :current_user def initialize(current_user:, request: nil) @@ -8,7 +10,7 @@ def initialize(current_user:, request: nil) def create_user_event(event_type, user = current_user) return unless user&.id - existing_device = DeviceTracking::LookupDeviceForUser.call(user.id, cookies[:device]) + existing_device = Device.find_by(user_id: user.id, cookie_uuid: cookies[:device]) if existing_device.present? create_event_for_existing_device(event_type: event_type, user: user, device: existing_device) else @@ -30,7 +32,7 @@ def create_user_event_with_disavowal(event_type, user = current_user) private def create_event_for_existing_device(event_type:, user:, device:) - DeviceTracking::UpdateDevice.call(device, request.remote_ip) + device.update_last_used_ip(request.remote_ip) create_event_for_device(event_type: event_type, user: user, device: device) end @@ -47,8 +49,14 @@ def create_event_for_new_device(event_type:, user:) end def create_device_for_user(user) - device = DeviceTracking::CreateDevice.call( - user.id, request.remote_ip, request.user_agent, cookies[:device] + cookie_uuid = cookies[:device].presence || SecureRandom.hex(COOKIE_LENGTH / 2) + + device = Device.create!( + user: user, + user_agent: request.user_agent.to_s, + cookie_uuid: cookie_uuid, + last_used_at: Time.zone.now, + last_ip: request.remote_ip, ) assign_device_cookie(device.cookie_uuid) device diff --git a/app/views/events/show.html.erb b/app/views/events/show.html.erb index b52a9eecf64..f2f12b2a75f 100644 --- a/app/views/events/show.html.erb +++ b/app/views/events/show.html.erb @@ -11,7 +11,7 @@

- <%= @device.device_name %> + <%= @device.nice_name %>

<% @events.each do |event| %> diff --git a/spec/decorators/device_decorator_spec.rb b/spec/decorators/device_decorator_spec.rb new file mode 100644 index 00000000000..81ad17e80e6 --- /dev/null +++ b/spec/decorators/device_decorator_spec.rb @@ -0,0 +1,12 @@ +require 'rails_helper' + +RSpec.describe DeviceDecorator do + let(:device) { create(:device) } + subject(:decorator) { DeviceDecorator.new(device) } + + describe '#nice_name' do + it 'gives a shortened os and browser name' do + expect(decorator.nice_name).to eq('Chrome 58 on Windows 10') + end + end +end diff --git a/spec/models/device_spec.rb b/spec/models/device_spec.rb index 8b20994e2ce..2e040326538 100644 --- a/spec/models/device_spec.rb +++ b/spec/models/device_spec.rb @@ -15,4 +15,20 @@ expect(device).to be_valid end end + + describe '#update_last_used_ip' do + let(:user) { create(:user) } + let(:remote_ip) { '1.2.3.4' } + let(:user_agent) { 'Chrome/58.0.3029.110 Safari/537.36' } + let(:uuid) { 'abc123' } + let(:now) { Time.zone.now } + let(:old_timestamp) { now - 1.hour } + let(:device) { create(:device, last_used_at: old_timestamp) } + + it 'updates the last ip and last_used_at' do + expect { device.update_last_used_ip(remote_ip) }. + to(change { device.reload.last_used_at.to_i }.from(old_timestamp.to_i).to(now.to_i). + and(change { device.reload.last_ip }.to(remote_ip))) + end + end end diff --git a/spec/services/device_tracking/create_device_spec.rb b/spec/services/device_tracking/create_device_spec.rb deleted file mode 100644 index 20151fde42f..00000000000 --- a/spec/services/device_tracking/create_device_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'rails_helper' - -describe DeviceTracking::CreateDevice do - subject { described_class } - let(:user) { create(:user) } - let(:remote_ip) { '1.2.3.4' } - let(:user_agent) { 'Chrome/58.0.3029.110 Safari/537.36' } - let(:uuid) { 'abc123' } - - it 'creates a new device' do - device = subject.call(user.id, remote_ip, user_agent, uuid) - expect(device.cookie_uuid).to eq uuid - expect(device.user_agent).to eq user_agent - expect(device.last_ip).to eq remote_ip - expect(device.last_used_at).to be_present - end - - it 'uuid defaults to new random string if no cookie uuid is supplied' do - device = subject.call(user.id, remote_ip, user_agent, nil) - - expect(device.cookie_uuid.length).to eq(DeviceTracking::CreateDevice::COOKIE_LENGTH) - end -end diff --git a/spec/services/device_tracking/device_name_spec.rb b/spec/services/device_tracking/device_name_spec.rb deleted file mode 100644 index 050e21f4d6e..00000000000 --- a/spec/services/device_tracking/device_name_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require 'rails_helper' - -describe DeviceTracking::DeviceName do - subject { described_class } - let(:device) { create(:device) } - - it 'gives a shortened os and browser name' do - result = subject.call(device) - - expect(result).to eq('Chrome 58 on Windows 10') - end -end diff --git a/spec/services/device_tracking/list_device_events_spec.rb b/spec/services/device_tracking/list_device_events_spec.rb deleted file mode 100644 index 6ea72aa1d14..00000000000 --- a/spec/services/device_tracking/list_device_events_spec.rb +++ /dev/null @@ -1,55 +0,0 @@ -require 'rails_helper' - -describe DeviceTracking::ListDeviceEvents do - subject { described_class } - - let(:current_user) { create(:user) } - let(:other_user) { create(:user) } - - let(:current_device) { create(:device, user: current_user) } - let(:other_device) { create(:device) } - - let(:events) do - [ - create(:event, user: current_user, device: current_device, created_at: 2.hours.ago), - create(:event, user: current_user, device: current_device, created_at: 3.hours.ago), - create(:event, user: current_user, device: current_device, created_at: 1.hour.ago), - ] - end - - before do - # Memoize records to run creates for specs that query the table - current_user - other_user - current_device - other_device - events - end - - it 'returns an empty list if the device is not found' do - result = subject.call(current_user.id, other_device.id, 0, 1) - - expect(result).to eq([]) - end - - it 'returns an empty list if the device is found but the user is not' do - result = subject.call(other_user.id, current_device.id, 0, 1) - - expect(result).to eq([]) - end - - it 'returns a list containing a single most recent event' do - result = subject.call(current_user.id, current_device.id, 0, 1) - - expect(result.size).to eq(1) - expect(result[0].id).to eq(events[2].id) - end - - it 'returns a list containing multiple most recent events in order and using an offset' do - result = subject.call(current_user.id, current_device.id, 1, 2) - - expect(result.size).to eq(2) - expect(result[0].id).to eq(events[0].id) - expect(result[1].id).to eq(events[1].id) - end -end diff --git a/spec/services/device_tracking/list_devices_spec.rb b/spec/services/device_tracking/list_devices_spec.rb deleted file mode 100644 index 20539645d18..00000000000 --- a/spec/services/device_tracking/list_devices_spec.rb +++ /dev/null @@ -1,44 +0,0 @@ -require 'rails_helper' - -describe DeviceTracking::ListDevices do - subject { described_class } - - let(:current_user) { create(:user) } - let(:other_user) { create(:user) } - - let(:devices) do - [ - create(:device, user: current_user, last_used_at: 2.hours.ago), - create(:device, user: current_user, last_used_at: 3.hours.ago), - create(:device, user: current_user, last_used_at: 1.hour.ago), - ] - end - - before do - # Memoize records to run creates for specs that query the table - current_user - other_user - devices - end - - it 'returns an empty list if the device is not found' do - result = subject.call(other_user.id, 0, 1) - - expect(result).to eq([]) - end - - it 'returns a list containing a single most recent device' do - result = subject.call(current_user.id, 0, 1) - - expect(result.size).to eq(1) - expect(result[0].id).to eq(devices[2].id) - end - - it 'returns a list containing multiple most recent devices in order and using an offset' do - result = subject.call(current_user.id, 1, 2) - - expect(result.size).to eq(2) - expect(result[0].id).to eq(devices[0].id) - expect(result[1].id).to eq(devices[1].id) - end -end diff --git a/spec/services/device_tracking/lookup_device_for_user_spec.rb b/spec/services/device_tracking/lookup_device_for_user_spec.rb deleted file mode 100644 index 316dc110eb2..00000000000 --- a/spec/services/device_tracking/lookup_device_for_user_spec.rb +++ /dev/null @@ -1,40 +0,0 @@ -require 'rails_helper' - -describe DeviceTracking::LookupDeviceForUser do - subject { described_class } - let(:current_user) { create(:user) } - let(:other_user) { create(:user) } - - let(:device) { create(:device, user: current_user, cookie_uuid: device_uuid) } - - let(:device_uuid) { 'foo' } - let(:other_uuid) { 'bar' } - - before do - current_user - other_user - device - end - - it 'returns nil if the user is found but the cookie uuid is not' do - expect(Device.find_by(user_id: current_user.id)).to be_present - - result = subject.call(current_user.id, other_uuid) - - expect(result).to be_nil - end - - it 'returns nil if the user is not found and the cookie uuid is found' do - expect(Device.find_by(cookie_uuid: device_uuid)).to be_present - - result = subject.call(other_user.id, device_uuid) - - expect(result).to be_nil - end - - it 'returns the device' do - result = subject.call(current_user.id, device_uuid) - - expect(result).to be_present - end -end diff --git a/spec/services/device_tracking/update_device_spec.rb b/spec/services/device_tracking/update_device_spec.rb deleted file mode 100644 index dcd5eca3dc7..00000000000 --- a/spec/services/device_tracking/update_device_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'rails_helper' - -describe DeviceTracking::UpdateDevice do - subject { described_class } - let(:user) { create(:user) } - let(:remote_ip) { '1.2.3.4' } - let(:user_agent) { 'Chrome/58.0.3029.110 Safari/537.36' } - let(:uuid) { 'abc123' } - let(:old_timestamp) { Time.zone.now - 1.hour } - let(:device) { create(:device, last_used_at: old_timestamp) } - - it 'updates the device' do - expect(device.last_used_at).to eq(old_timestamp) - subject.call(device, remote_ip) - - expect(device.last_ip).to eq(remote_ip) - expect(device.last_used_at).to_not eq(old_timestamp) - end -end diff --git a/spec/services/device_tracking/forget_all_browsers_spec.rb b/spec/services/forget_all_browsers_spec.rb similarity index 77% rename from spec/services/device_tracking/forget_all_browsers_spec.rb rename to spec/services/forget_all_browsers_spec.rb index 0aee972e488..b37827e19ce 100644 --- a/spec/services/device_tracking/forget_all_browsers_spec.rb +++ b/spec/services/forget_all_browsers_spec.rb @@ -1,12 +1,12 @@ require 'rails_helper' -RSpec.describe DeviceTracking::ForgetAllBrowsers do +RSpec.describe ForgetAllBrowsers do let(:user) { build(:user, remember_device_revoked_at: original_revoked_at) } let(:now) { Time.zone.now } let(:original_revoked_at) { 30.days.from_now } subject(:service) do - DeviceTracking::ForgetAllBrowsers.new(user, remember_device_revoked_at: now) + ForgetAllBrowsers.new(user, remember_device_revoked_at: now) end describe '#call' do diff --git a/spec/services/idv/gpo_mail_spec.rb b/spec/services/idv/gpo_mail_spec.rb index 5a558e77c59..557633a60ae 100644 --- a/spec/services/idv/gpo_mail_spec.rb +++ b/spec/services/idv/gpo_mail_spec.rb @@ -52,7 +52,7 @@ def event_create(hash) event = hash[:event_type] now = Time.zone.now updated_at = hash[:updated_at] || now - device = DeviceTracking::LookupDeviceForUser.call(user.id, uuid) + device = Device.find_by(user_id: user.id, cookie_uuid: uuid) if device device.last_used_at = now device.last_ip = remote_ip diff --git a/spec/services/user_event_creator_spec.rb b/spec/services/user_event_creator_spec.rb index 6a84ae94491..5e37bff8a3e 100644 --- a/spec/services/user_event_creator_spec.rb +++ b/spec/services/user_event_creator_spec.rb @@ -4,16 +4,19 @@ let(:user_agent) { 'A computer on the internet' } let(:ip_address) { '4.4.4.4' } let(:existing_device_cookie) { 'existing_device_cookie' } + let(:cookie_jar) do + { + device: existing_device_cookie, + }.with_indifferent_access.tap do |cookie_jar| + allow(cookie_jar).to receive(:permanent).and_return({}) + end + end let(:request) do - request = double - - allow(request).to receive(:remote_ip).and_return(ip_address) - allow(request).to receive(:user_agent).and_return(user_agent) - - cookie_jar = { device: existing_device_cookie }.with_indifferent_access - allow(cookie_jar).to receive(:permanent).and_return({}) - allow(request).to receive(:cookie_jar).and_return(cookie_jar) - request + double( + remote_ip: ip_address, + user_agent: user_agent, + cookie_jar: cookie_jar, + ) end let(:user) { create(:user) } let(:device) { create(:device, user: user, cookie_uuid: existing_device_cookie) } @@ -81,6 +84,16 @@ expect(event.device.last_used_at).to be_within(1).of(Time.zone.now) end + context 'when there is no device cookie' do + let(:existing_device_cookie) { nil } + + it 'assigns one to the device' do + event = subject.create_user_event(event_type, user) + + expect(event.device.cookie_uuid.length).to eq(UserEventCreator::COOKIE_LENGTH) + end + end + it 'alerts the user if they have other devices' do allow(UserAlerts::AlertUserAboutNewDevice).to receive(:call) create(:device, user: user) From 0e83bdf1271e5c7b740923154c1380dca3c2b43b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Oct 2021 11:42:20 -0700 Subject: [PATCH 13/15] Bump puma from 5.3.2 to 5.5.1 (#5493) Bumps [puma](https://github.com/puma/puma) from 5.3.2 to 5.5.1. - [Release notes](https://github.com/puma/puma/releases) - [Changelog](https://github.com/puma/puma/blob/master/History.md) - [Commits](https://github.com/puma/puma/compare/v5.3.2...v5.5.1) --- updated-dependencies: - dependency-name: puma dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index b4e9497c8d7..9f3717fde32 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -423,7 +423,7 @@ GEM pry (>= 0.10.4) psych (3.2.1) public_suffix (4.0.6) - puma (5.3.2) + puma (5.5.1) nio4r (~> 2.0) raabro (1.4.0) racc (1.5.2) From ddfe61b5ee01d26c6214cd3eba08ee3389a6c819 Mon Sep 17 00:00:00 2001 From: Jessica Dembe Date: Wed, 13 Oct 2021 13:49:43 -0400 Subject: [PATCH 14/15] LG-5186: Implement New status icon on Upload ID page (#5494) * Add checkmark to success message * add solid border to successful upload status --- app/assets/stylesheets/components/_file-input.scss | 1 + app/assets/stylesheets/components/_form.scss | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/app/assets/stylesheets/components/_file-input.scss b/app/assets/stylesheets/components/_file-input.scss index 4f8403aca0d..85b951eb7c8 100644 --- a/app/assets/stylesheets/components/_file-input.scss +++ b/app/assets/stylesheets/components/_file-input.scss @@ -37,6 +37,7 @@ .usa-form-group--success .usa-file-input .usa-file-input__target { border-color: color('success'); + border-style: solid; &:hover { border-color: color('success-dark'); diff --git a/app/assets/stylesheets/components/_form.scss b/app/assets/stylesheets/components/_form.scss index 30e31afa9f2..7d772cb2ae3 100644 --- a/app/assets/stylesheets/components/_form.scss +++ b/app/assets/stylesheets/components/_form.scss @@ -96,7 +96,12 @@ input::-webkit-inner-spin-button { .usa-success-message { @include u-padding-y(.5); + background-image: url(image-path('alert/success.svg')); + background-position: 0 center; + background-repeat: no-repeat; + background-size: 1rem; color: color('success'); display: block; font-weight: font-weight('bold'); + padding-left: 1.5rem; } From e5307d467b8d69d7f58ddc75ab30c983444b4eef Mon Sep 17 00:00:00 2001 From: Zach Margolis Date: Wed, 13 Oct 2021 11:52:55 -0700 Subject: [PATCH 15/15] Remove Idv::ProfileActivator (#5495) * Move pending_profile from UserDecorator down to User * Remove Idv::ProfileActivator class --- .../idv/confirmations_controller.rb | 2 +- app/controllers/idv/gpo_controller.rb | 2 +- app/decorators/user_decorator.rb | 10 +---- app/forms/verify_account_form.rb | 4 +- app/models/user.rb | 8 ++++ app/presenters/idv/gpo_presenter.rb | 2 +- app/services/idv/profile_activator.rb | 15 ------- app/services/idv/session.rb | 2 +- spec/decorators/user_decorator_spec.rb | 42 ------------------- spec/models/user_spec.rb | 40 ++++++++++++++++++ spec/support/controller_helper.rb | 2 +- .../idv_examples/clearing_and_restarting.rb | 6 +-- 12 files changed, 60 insertions(+), 75 deletions(-) delete mode 100644 app/services/idv/profile_activator.rb diff --git a/app/controllers/idv/confirmations_controller.rb b/app/controllers/idv/confirmations_controller.rb index 91e46090ae9..46969fa1618 100644 --- a/app/controllers/idv/confirmations_controller.rb +++ b/app/controllers/idv/confirmations_controller.rb @@ -94,7 +94,7 @@ def generate_personal_key end def pending_profile? - current_user.decorate.pending_profile? + current_user.pending_profile? end end end diff --git a/app/controllers/idv/gpo_controller.rb b/app/controllers/idv/gpo_controller.rb index fa2244c56cd..ba417aeeec9 100644 --- a/app/controllers/idv/gpo_controller.rb +++ b/app/controllers/idv/gpo_controller.rb @@ -115,7 +115,7 @@ def confirmation_maker_perform confirmation_maker = GpoConfirmationMaker.new( pii: Pii::Cacher.new(current_user, user_session).fetch, issuer: sp_session[:issuer], - profile: current_user.decorate.pending_profile, + profile: current_user.pending_profile, ) confirmation_maker.perform confirmation_maker diff --git a/app/decorators/user_decorator.rb b/app/decorators/user_decorator.rb index e2d74f94588..3a7422f39e5 100644 --- a/app/decorators/user_decorator.rb +++ b/app/decorators/user_decorator.rb @@ -1,6 +1,8 @@ class UserDecorator include ActionView::Helpers::DateHelper + delegate :pending_profile, to: :user + attr_reader :user MAX_RECENT_EVENTS = 5 @@ -81,14 +83,6 @@ def pending_profile_requires_verification? true end - def pending_profile? - pending_profile.present? - end - - def pending_profile - user.profiles.verification_pending.order(created_at: :desc).first - end - def identity_not_verified? !identity_verified? end diff --git a/app/forms/verify_account_form.rb b/app/forms/verify_account_form.rb index cadc3ce22f7..57b634c0df2 100644 --- a/app/forms/verify_account_form.rb +++ b/app/forms/verify_account_form.rb @@ -33,7 +33,7 @@ def submit protected def pending_profile - @_pending_profile ||= user.decorate.pending_profile + @_pending_profile ||= user.pending_profile end def gpo_confirmation_code @@ -66,6 +66,6 @@ def reset_sensitive_fields end def activate_profile - Idv::ProfileActivator.new(user: user).call + user.pending_profile&.activate end end diff --git a/app/models/user.rb b/app/models/user.rb index 4004cdb476c..e52f1a8e733 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -88,6 +88,14 @@ def active_profile @_active_profile ||= profiles.verified.find(&:active?) end + def pending_profile? + pending_profile.present? + end + + def pending_profile + profiles.verification_pending.order(created_at: :desc).first + end + def default_phone_configuration phone_configurations.order('made_default_at DESC NULLS LAST, created_at').first end diff --git a/app/presenters/idv/gpo_presenter.rb b/app/presenters/idv/gpo_presenter.rb index 6c0e7fcf5fa..745a527b115 100644 --- a/app/presenters/idv/gpo_presenter.rb +++ b/app/presenters/idv/gpo_presenter.rb @@ -48,7 +48,7 @@ def letter_already_sent? end def user_needs_address_otp_verification? - current_user.decorate.pending_profile? + current_user.pending_profile? end end end diff --git a/app/services/idv/profile_activator.rb b/app/services/idv/profile_activator.rb deleted file mode 100644 index ea1c9d8d692..00000000000 --- a/app/services/idv/profile_activator.rb +++ /dev/null @@ -1,15 +0,0 @@ -module Idv - class ProfileActivator - def initialize(user:) - @user = user - end - - def call - user.decorate.pending_profile&.activate - end - - private - - attr_reader :user - end -end diff --git a/app/services/idv/session.rb b/app/services/idv/session.rb index 81e963e04bc..8c68067797f 100644 --- a/app/services/idv/session.rb +++ b/app/services/idv/session.rb @@ -81,7 +81,7 @@ def complete_session end def complete_profile - ProfileActivator.new(user: current_user).call + current_user.pending_profile&.activate move_pii_to_user_session end diff --git a/spec/decorators/user_decorator_spec.rb b/spec/decorators/user_decorator_spec.rb index ad5ae40a5ef..06ab69e8d1a 100644 --- a/spec/decorators/user_decorator_spec.rb +++ b/spec/decorators/user_decorator_spec.rb @@ -156,48 +156,6 @@ end end - describe '#pending_profile' do - context 'when a profile with a verification_pending deactivation_reason exists' do - it 'returns the most recent profile' do - user = User.new - _old_profile = create( - :profile, - deactivation_reason: :verification_pending, - created_at: 1.day.ago, - user: user, - ) - new_profile = create( - :profile, - deactivation_reason: :verification_pending, - user: user, - ) - user_decorator = UserDecorator.new(user) - - expect(user_decorator.pending_profile).to eq new_profile - end - end - - context 'when a verification_pending profile does not exist' do - it 'returns nil' do - user = User.new - create( - :profile, - deactivation_reason: :password_reset, - created_at: 1.day.ago, - user: user, - ) - create( - :profile, - deactivation_reason: :encryption_error, - user: user, - ) - user_decorator = UserDecorator.new(user) - - expect(user_decorator.pending_profile).to be_nil - end - end - end - describe '#identity_not_verified?' do it 'returns true if identity_verified returns false' do user = User.new diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 2ed0af794a0..19df29f3ccc 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -371,4 +371,44 @@ end end end + + describe '#pending_profile' do + context 'when a profile with a verification_pending deactivation_reason exists' do + it 'returns the most recent profile' do + user = User.new + _old_profile = create( + :profile, + deactivation_reason: :verification_pending, + created_at: 1.day.ago, + user: user, + ) + new_profile = create( + :profile, + deactivation_reason: :verification_pending, + user: user, + ) + + expect(user.pending_profile).to eq new_profile + end + end + + context 'when a verification_pending profile does not exist' do + it 'returns nil' do + user = User.new + create( + :profile, + deactivation_reason: :password_reset, + created_at: 1.day.ago, + user: user, + ) + create( + :profile, + deactivation_reason: :encryption_error, + user: user, + ) + + expect(user.pending_profile).to be_nil + end + end + end end diff --git a/spec/support/controller_helper.rb b/spec/support/controller_helper.rb index 7f5180880ae..d39a454b8d6 100644 --- a/spec/support/controller_helper.rb +++ b/spec/support/controller_helper.rb @@ -47,7 +47,7 @@ def stub_verify_steps_one_and_two(user) def stub_decorated_user_with_pending_profile(user) decorated_user = instance_double(UserDecorator) allow(user).to receive(:decorate).and_return(decorated_user) - allow(decorated_user).to receive(:pending_profile).and_return(pending_profile) + allow(user).to receive(:pending_profile).and_return(pending_profile) allow(decorated_user).to receive(:pending_profile_requires_verification?). and_return(has_pending_profile) decorated_user diff --git a/spec/support/idv_examples/clearing_and_restarting.rb b/spec/support/idv_examples/clearing_and_restarting.rb index ca8a6d06f22..d44e2c96ddb 100644 --- a/spec/support/idv_examples/clearing_and_restarting.rb +++ b/spec/support/idv_examples/clearing_and_restarting.rb @@ -2,7 +2,7 @@ it 'allows the user to retry verification with phone' do click_on t('idv.messages.clear_and_start_over') - expect(user.reload.decorate.pending_profile?).to eq(false) + expect(user.reload.pending_profile?).to eq(false) complete_all_doc_auth_steps click_idv_continue @@ -17,7 +17,7 @@ it 'allows the user to retry verification with gpo' do click_on t('idv.messages.clear_and_start_over') - expect(user.reload.decorate.pending_profile?).to eq(false) + expect(user.reload.pending_profile?).to eq(false) complete_all_doc_auth_steps click_on t('idv.troubleshooting.options.verify_by_mail') @@ -35,7 +35,7 @@ expect(page).to have_content(t('idv.messages.come_back_later', app: APP_NAME)) expect(page).to have_current_path(idv_come_back_later_path) expect(user.reload.decorate.identity_verified?).to eq(false) - expect(user.decorate.pending_profile?).to eq(true) + expect(user.pending_profile?).to eq(true) expect(gpo_confirmation.entry[:address1]).to eq('1 FAKE RD') end