diff --git a/package-lock.json b/package-lock.json index a54aa72..99386ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -74,16 +74,16 @@ } }, "@babel/core": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", - "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.4.tgz", + "integrity": "sha512-5deljj5HlqRXN+5oJTY7Zs37iH3z3b++KjiKtIsJy1NrjOOVSEaJHEetLBhyu0aQOSNNZ/0IuEAan9GzRuDXHg==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", + "@babel/generator": "^7.11.4", "@babel/helper-module-transforms": "^7.11.0", "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.1", + "@babel/parser": "^7.11.4", "@babel/template": "^7.10.4", "@babel/traverse": "^7.11.0", "@babel/types": "^7.11.0", @@ -127,9 +127,9 @@ } }, "@babel/generator": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", - "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.4.tgz", + "integrity": "sha512-Rn26vueFx0eOoz7iifCN2UHT6rGtnkSGWSoDRIy8jZN3B91PzeSULbswfLoOWuTuAcNwpG/mxy+uCTDnZ9Mp1g==", "dev": true, "requires": { "@babel/types": "^7.11.0", @@ -222,12 +222,11 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", - "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", + "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", "dev": true, "requires": { - "@babel/traverse": "^7.10.4", "@babel/types": "^7.10.4" } }, @@ -318,15 +317,14 @@ } }, "@babel/helper-remap-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", - "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", + "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.10.4", "@babel/helper-wrap-function": "^7.10.4", "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", "@babel/types": "^7.10.4" } }, @@ -411,9 +409,9 @@ } }, "@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", - "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.4.tgz", + "integrity": "sha512-MggwidiH+E9j5Sh8pbrX5sJvMcsqS5o+7iB42M9/k0CD63MjYbdP4nhSh7uB5wnv2/RVzTZFTxzF/kIa5mrCqA==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -1169,19 +1167,19 @@ } }, "@commitlint/cli": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-9.1.2.tgz", - "integrity": "sha512-ctRrrPqjZ8r4Vc4FXpPaScEpkPwfvB0Us3NK2SD2AnLwXGMxOLFTabDmNySU1Xc40ud2CmJsaV8lpavvzs8ZZA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-10.0.0.tgz", + "integrity": "sha512-a+dLjNovvMyom0GNcKj9ebmgtbJEKuhJuqwPUmfNy3yPoM4h12b3hjVOS33IyvpbKmlYUJg8dgcr4S5FhFvhFg==", "dev": true, "requires": { "@babel/runtime": "^7.9.6", - "@commitlint/format": "^9.1.2", - "@commitlint/lint": "^9.1.2", - "@commitlint/load": "^9.1.2", - "@commitlint/read": "^9.1.2", + "@commitlint/format": "^10.0.0", + "@commitlint/lint": "^10.0.0", + "@commitlint/load": "^10.0.0", + "@commitlint/read": "^10.0.0", "chalk": "4.1.0", "core-js": "^3.6.1", - "get-stdin": "7.0.0", + "get-stdin": "8.0.0", "lodash": "^4.17.19", "resolve-from": "5.0.0", "resolve-global": "1.0.0", @@ -1250,28 +1248,28 @@ } }, "@commitlint/ensure": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-9.1.2.tgz", - "integrity": "sha512-hwQICwpNSTsZgj/1/SdPvYAzhwjwgCJI4vLbT879+Jc+AJ6sj2bUDGw/F89vzgKz1VnaMm4D65bNhoWhG3pdhQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-10.0.0.tgz", + "integrity": "sha512-OBlv6Hw91u4Gqz4ocKO7IyIvQ6ZmKbJaLFf8MD0EOH3Prn0aatiiqUB0+paBELKt3yWdwQNYI8ZkzZWtj4EcYw==", "dev": true, "requires": { - "@commitlint/types": "^9.1.2", + "@commitlint/types": "^10.0.0", "lodash": "^4.17.19" } }, "@commitlint/execute-rule": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-9.1.2.tgz", - "integrity": "sha512-NGbeo0KCVYo1yj9vVPFHv6RGFpIF6wcQxpFYUKGIzZVV9Vz1WyiKS689JXa99Dt1aN0cZlEJJLnTNDIgYls0Vg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-10.0.0.tgz", + "integrity": "sha512-vRIp6Cwy+C1dOh5VAcoBks+8UI+rpxOB5cwhU/RQZhlVd2hgFiAPXnyKWMOB7HDO9XFI5amLJehvaaDI+eLDnA==", "dev": true }, "@commitlint/format": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-9.1.2.tgz", - "integrity": "sha512-+ZWTOSGEU6dbn3NRh1q7sY5K5QLiSs7E2uSzuYnWHXcQk8nlTvnE0ibwMCQxdKLaOTZiN57fHM/7M9Re2gsRuw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-10.0.0.tgz", + "integrity": "sha512-EpCmMCcjloeaoUtgmzlpYmIYJzAvZhYfLJ7YCrOlnmt5/MAeywuNgxcr/EM2xHgEKotTWqRQdiIgAtkIWHhgrQ==", "dev": true, "requires": { - "@commitlint/types": "^9.1.2", + "@commitlint/types": "^10.0.0", "chalk": "^4.0.0" }, "dependencies": { @@ -1328,12 +1326,12 @@ } }, "@commitlint/is-ignored": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-9.1.2.tgz", - "integrity": "sha512-423W/+Ro+Cc8cg81+t9gds1EscMZNjnGT31nKDvxVxJxXiXQsYYoFEQbU+nfUrRGQsUikEgEJ3ppVGr1linvcQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-10.0.0.tgz", + "integrity": "sha512-OLjUs/0HaQGh5iSqv/jF/TXqQ8sJ5VShujTmADSvnGTyruZu+d1Hfgw9QM1FMjzcx2NpMDsX/EFBU0ZMx9hmEg==", "dev": true, "requires": { - "@commitlint/types": "^9.1.2", + "@commitlint/types": "^10.0.0", "semver": "7.3.2" }, "dependencies": { @@ -1346,28 +1344,28 @@ } }, "@commitlint/lint": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-9.1.2.tgz", - "integrity": "sha512-XvggqHZ4XSTKOgzJhCzz52cWRRO57QQnEviwGj0qnD4jdwC+8h2u9LNZwoa2tGAuaNM3nSm//wNK7FRZhgiiFA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-10.0.0.tgz", + "integrity": "sha512-KcDzOMQYVLziWIXNedTDnf5LS9NMYKzcdzjuCH8jTZLx/oX3kuOVB0jYZHVaKPwjj0miZSOhONqIMJDlLZpn+g==", "dev": true, "requires": { - "@commitlint/is-ignored": "^9.1.2", - "@commitlint/parse": "^9.1.2", - "@commitlint/rules": "^9.1.2", - "@commitlint/types": "^9.1.2" + "@commitlint/is-ignored": "^10.0.0", + "@commitlint/parse": "^10.0.0", + "@commitlint/rules": "^10.0.0", + "@commitlint/types": "^10.0.0" } }, "@commitlint/load": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-9.1.2.tgz", - "integrity": "sha512-FPL82xBuF7J3EJ57kLVoligQP4BFRwrknooP+vNT787AXmQ/Fddc/iYYwHwy67pNkk5N++/51UyDl/CqiHb6nA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-10.0.0.tgz", + "integrity": "sha512-pUwGshEpxkU2R9U3O5hwHU4VT0zkyIs5gzGrGbR2c/aurI9qe00LZ9DquYVVYVmfwG6UaQpatCG4TrXNXIj5Mg==", "dev": true, "requires": { - "@commitlint/execute-rule": "^9.1.2", - "@commitlint/resolve-extends": "^9.1.2", - "@commitlint/types": "^9.1.2", + "@commitlint/execute-rule": "^10.0.0", + "@commitlint/resolve-extends": "^10.0.0", + "@commitlint/types": "^10.0.0", "chalk": "4.1.0", - "cosmiconfig": "^6.0.0", + "cosmiconfig": "^7.0.0", "lodash": "^4.17.19", "resolve-from": "^5.0.0" }, @@ -1425,15 +1423,15 @@ } }, "@commitlint/message": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-9.1.2.tgz", - "integrity": "sha512-ndlx5z7bPVLG347oYJUHuQ41eTcsw+aUYT1ZwQyci0Duy2atpuoeeSw9SuM1PjufzRCpb6ExzFEgGzcCRKAJsg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-10.0.0.tgz", + "integrity": "sha512-2ZDgHc6v3t1C/zkAkRwPDIRVD/jbrQAu+Iqe7VH1/Y//cJhwte6OuSGfs2Qze/6gh+/RbvUIBskR8OUIY6VTrA==", "dev": true }, "@commitlint/parse": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-9.1.2.tgz", - "integrity": "sha512-d+/VYbkotctW+lzDpus/R6xTerOqFQkW1myH+3PwnqYSE6JU/uHT4MlZNGJBv8pX9SPlR66t6X9puFobqtezEw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-10.0.0.tgz", + "integrity": "sha512-xIBD0w85FVhrlX4pI/m4xF9MvTQNMbvilPSr42yIds2xn7GJcJidN4Z8O6qCqcjwl6f3ruQ8G8Pdi3PggVjZrw==", "dev": true, "requires": { "conventional-changelog-angular": "^5.0.0", @@ -1441,20 +1439,20 @@ } }, "@commitlint/read": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-9.1.2.tgz", - "integrity": "sha512-C2sNBQOqeQXMxpWtRnXYKYB3D9yuybPtQNY/P67A6o8XH/UMHkFaUTyIx1KRgu0IG0yTTItRt46FGnsMWLotvA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-10.0.0.tgz", + "integrity": "sha512-ARebcoJMDNtlCTV9jpSacN9gCvua+JiGQLQlq4PsaNo/e4hyyIWu+wOEAXO8IhD5xycoTBaJRVWzgXRncEyrkg==", "dev": true, "requires": { - "@commitlint/top-level": "^9.1.2", - "fs-extra": "^8.1.0", + "@commitlint/top-level": "^10.0.0", + "fs-extra": "^9.0.0", "git-raw-commits": "^2.0.0" } }, "@commitlint/resolve-extends": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-9.1.2.tgz", - "integrity": "sha512-HcoL+qFGmWEu9VM4fY0HI+VzF4yHcg3x+9Hx6pYFZ+r2wLbnKs964y0v68oyMO/mS/46MVoLNXZGR8U3adpadg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-10.0.0.tgz", + "integrity": "sha512-ltj4LvdCEJeYzWdzFS9AhLMkc4rweKvfju/JYBgbLqFx7lAGz3e2Wub0uuuWuLBJqCjL7UJbYiA0T2Hzhhd91Q==", "dev": true, "requires": { "import-fresh": "^3.0.0", @@ -1464,36 +1462,75 @@ } }, "@commitlint/rules": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-9.1.2.tgz", - "integrity": "sha512-1vecFuzqVqjiT57ocXq1bL8V6GEF1NZs3BR0dQzObaqHftImIxBVII299gasckTkcuxNc8M+7XxZyKxUthukpQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-10.0.0.tgz", + "integrity": "sha512-myHG8pgUHIOtceJsALRRXvYBuLbTwWl7/6soDrIJudDhKsyhV3yFtAbRX40pujg25IlAUra6nuy8JDU86bVxog==", "dev": true, "requires": { - "@commitlint/ensure": "^9.1.2", - "@commitlint/message": "^9.1.2", - "@commitlint/to-lines": "^9.1.2", - "@commitlint/types": "^9.1.2" + "@commitlint/ensure": "^10.0.0", + "@commitlint/message": "^10.0.0", + "@commitlint/to-lines": "^10.0.0", + "@commitlint/types": "^10.0.0" } }, "@commitlint/to-lines": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-9.1.2.tgz", - "integrity": "sha512-o4zWcMf9EnzA3MOqx01780SgrKq5hqDJmUBPk30g6an0XcDuDy3OSZHHTJFdzsg4V9FjC4OY44sFeK7GN7NaxQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-10.0.0.tgz", + "integrity": "sha512-qUHuYiLgE7ioBRgHUR2EOwXuEhb2TnAktEc9NBZcQNzfqu5nbOaf2iOBx5mlDK0heTJyTjLboAmzojXxuqJNcA==", "dev": true }, "@commitlint/top-level": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-9.1.2.tgz", - "integrity": "sha512-KMPP5xVePcz3B1dKqcZdU4FZBVOkT+bG3ip4RQX2TeCJoomMkTjd0utALs7rpTGLID6BXbwwXepZCZJREjR/Bw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-10.0.0.tgz", + "integrity": "sha512-FHlDD31gTQptInSuRGQt/9fNiSQ4euBZtcBZD4NImCtQCkwBP1cyxClN6wr9DmqISG0KSJybReF4z8rm5znNDA==", "dev": true, "requires": { - "find-up": "^4.0.0" + "find-up": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + } } }, "@commitlint/types": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-9.1.2.tgz", - "integrity": "sha512-r3fwVbVH+M8W0qYlBBZFsUwKe6NT5qvz+EmU7sr8VeN1cQ63z+3cfXyTo7WGGEMEgKiT0jboNAK3b1FZp8k9LQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-10.0.0.tgz", + "integrity": "sha512-b7uumSfDI1guYnNc11BpkTZjiY7gC1DPedeUa0r+csd/1DiFyRo4oNOaxXHve0cC4NzaHaOHa0aPktWMTYJlVQ==", "dev": true }, "@gfx/zopfli": { @@ -1597,13 +1634,13 @@ } }, "@jest/core": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.4.0.tgz", - "integrity": "sha512-mpXm4OjWQbz7qbzGIiSqvfNZ1FxX6ywWgLtdSD2luPORt5zKPtqcdDnX7L8RdfMaj1znDBgN2+gB094ZIr7vnA==", + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.4.1.tgz", + "integrity": "sha512-EFziH1tJC5N8xb8OjUcQgyWdezJh6+zBX5p+9S7HR1jzBVeG8jCE/Edp7yqxW/cToLG/QKj8qrpox+HV9Qw1rw==", "dev": true, "requires": { "@jest/console": "^26.3.0", - "@jest/reporters": "^26.4.0", + "@jest/reporters": "^26.4.1", "@jest/test-result": "^26.3.0", "@jest/transform": "^26.3.0", "@jest/types": "^26.3.0", @@ -1613,15 +1650,15 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-changed-files": "^26.3.0", - "jest-config": "^26.4.0", + "jest-config": "^26.4.1", "jest-haste-map": "^26.3.0", "jest-message-util": "^26.3.0", "jest-regex-util": "^26.0.0", "jest-resolve": "^26.4.0", - "jest-resolve-dependencies": "^26.4.0", - "jest-runner": "^26.4.0", - "jest-runtime": "^26.4.0", - "jest-snapshot": "^26.4.0", + "jest-resolve-dependencies": "^26.4.1", + "jest-runner": "^26.4.1", + "jest-runtime": "^26.4.1", + "jest-snapshot": "^26.4.1", "jest-util": "^26.3.0", "jest-validate": "^26.4.0", "jest-watcher": "^26.3.0", @@ -1760,20 +1797,20 @@ } }, "@jest/globals": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.4.0.tgz", - "integrity": "sha512-QKwoVAeL9d0xaEM9ebPvfc+bolN04F+o3zM2jswGDBiiNjCogZ3LvOaqumRdDyz6kLmbx+UhgMBAVuLunbXZ2A==", + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.4.1.tgz", + "integrity": "sha512-gdsHefnwjck+AwDUwW+6rmctmKEcZEEZ4F3PB5kKnub7r0dUoN1KVSyNRXtB5qpZgRYESnxgDXhpw/XYKIsAeg==", "dev": true, "requires": { "@jest/environment": "^26.3.0", "@jest/types": "^26.3.0", - "expect": "^26.4.0" + "expect": "^26.4.1" } }, "@jest/reporters": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.4.0.tgz", - "integrity": "sha512-14OPAAuYhgRBSNxAocVluX6ksdMdK/EuP9NmtBXU9g1uKaVBrPnohn/CVm6iMot1a9iU8BCxa5715YRf8FEg/A==", + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.4.1.tgz", + "integrity": "sha512-aROTkCLU8++yiRGVxLsuDmZsQEKO6LprlrxtAuzvtpbIFl3eIjgIf3EUxDKgomkS25R9ZzwGEdB5weCcBZlrpQ==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", @@ -1795,7 +1832,7 @@ "jest-resolve": "^26.4.0", "jest-util": "^26.3.0", "jest-worker": "^26.3.0", - "node-notifier": "^7.0.0", + "node-notifier": "^8.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -1885,16 +1922,16 @@ } }, "@jest/test-sequencer": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.4.0.tgz", - "integrity": "sha512-9Z7lCShS7vERp+DRwIVNH/6sHMWwJK1DPnGCpGeVLGJJWJ4Y08sQI3vIKdmKHu2KmwlUBpRM+BFf7NlVUkl5XA==", + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.4.1.tgz", + "integrity": "sha512-YR4PNPu1RVHxyv/HSQMjc+pBEWa6wuM7xbEX/u5M5FFg6ZM6m00m7Jf0fjRxGN6hZlY5vECmNhJu/kvJLrxR8w==", "dev": true, "requires": { "@jest/test-result": "^26.3.0", "graceful-fs": "^4.2.4", "jest-haste-map": "^26.3.0", - "jest-runner": "^26.4.0", - "jest-runtime": "^26.4.0" + "jest-runner": "^26.4.1", + "jest-runtime": "^26.4.1" } }, "@jest/transform": { @@ -2568,9 +2605,9 @@ "dev": true }, "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -2828,6 +2865,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -3411,9 +3454,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001114", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001114.tgz", - "integrity": "sha512-ml/zTsfNBM+T1+mjglWRPgVsu2L76GAaADKX5f4t0pbhttEp0WMawJsHDYlFkVZkoA+89uvBRrVrEE4oqenzXQ==", + "version": "1.0.30001117", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001117.tgz", + "integrity": "sha512-4tY0Fatzdx59kYjQs+bNxUwZB03ZEBgVmJ1UkFPz/Q8OLiUUbjct2EdpnXj0fvFTPej2EkbPIG0w8BWsjAyk1Q==", "dev": true }, "capture-exit": { @@ -4477,16 +4520,16 @@ "dev": true }, "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, "requires": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", + "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.7.2" + "yaml": "^1.10.0" } }, "create-ecdh": { @@ -5093,9 +5136,9 @@ } }, "electron-to-chromium": { - "version": "1.3.533", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.533.tgz", - "integrity": "sha512-YqAL+NXOzjBnpY+dcOKDlZybJDCOzgsq4koW3fvyty/ldTmsb4QazZpOWmVvZ2m0t5jbBf7L0lIGU3BUipwG+A==", + "version": "1.3.540", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.540.tgz", + "integrity": "sha512-IoGiZb8SMqTtkDYJtP8EtCdvv3VMtd1QoTlypO2RUBxRq/Wk0rU5IzhzhMckPaC9XxDqUvWsL0XKOBhTiYVN3w==", "dev": true }, "elliptic": { @@ -5868,15 +5911,15 @@ } }, "expect": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.4.0.tgz", - "integrity": "sha512-dbYDJhFcqQsamlos6nEwAMe+ahdckJBk5fmw1DYGLQGabGSlUuT+Fm2jHYw5119zG3uIhP+lCQbjJhFEdZMJtg==", + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.4.1.tgz", + "integrity": "sha512-PnsyF/VmPRH/HAWELjrIAgQ5h+4JLTiomA1A2djx+jXrCQzQ/4egZYBOEx9hShoX+mQLS4enYk6Ouxk8b4kcEw==", "dev": true, "requires": { "@jest/types": "^26.3.0", "ansi-styles": "^4.0.0", "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.4.0", + "jest-matcher-utils": "^26.4.1", "jest-message-util": "^26.3.0", "jest-regex-util": "^26.0.0" }, @@ -6309,14 +6352,15 @@ "dev": true }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "dev": true, "requires": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" } }, "fs-minipass": { @@ -6597,9 +6641,9 @@ } }, "get-stdin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", - "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", "dev": true }, "get-stream": { @@ -7052,6 +7096,19 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7575,14 +7632,14 @@ } }, "jest": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.4.0.tgz", - "integrity": "sha512-lNCOS+ckRHE1wFyVtQClBmbsOVuH2GWUTJMDL3vunp9DXcah+V8vfvVVApngClcdoc3rgZpqOfCNKLjxjj2l4g==", + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.4.1.tgz", + "integrity": "sha512-q+az+ZXFOTxTlD6BRIMcZC+a33O9lsryV4Wo9gU4D/AI+Y6KKgVRCmyzpc4H2gWv0rn45lACukmMS2uSB7e1LA==", "dev": true, "requires": { - "@jest/core": "^26.4.0", + "@jest/core": "^26.4.1", "import-local": "^3.0.2", - "jest-cli": "^26.4.0" + "jest-cli": "^26.4.1" }, "dependencies": { "ansi-styles": { @@ -7627,12 +7684,12 @@ "dev": true }, "jest-cli": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.4.0.tgz", - "integrity": "sha512-kw2Pr3V2x9/WzSDGsbz/MJBNlCoPMxMudrIavft4bqRlv5tASjU51tyO+1Os1LdW2dAnLQZYsxFUZ8oWPyssGQ==", + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.4.1.tgz", + "integrity": "sha512-c6px+IOO0OsZ7X/uSr65wcjZnd7NYNUDWFT5OETyCnJRkkwoTER7gneRDrwgr3Ex5+gCGO7D/IMWxUHB/L624A==", "dev": true, "requires": { - "@jest/core": "^26.4.0", + "@jest/core": "^26.4.1", "@jest/test-result": "^26.3.0", "@jest/types": "^26.3.0", "chalk": "^4.0.0", @@ -7640,7 +7697,7 @@ "graceful-fs": "^4.2.4", "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^26.4.0", + "jest-config": "^26.4.1", "jest-util": "^26.3.0", "jest-validate": "^26.4.0", "prompts": "^2.0.1", @@ -7754,13 +7811,13 @@ } }, "jest-config": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.4.0.tgz", - "integrity": "sha512-MxsvrBug8YY+C4QcUBtmgnHyFeW7w3Ouk/w9eplCDN8VJGVyBEZFe8Lxzfp2pSqh0Dqurqv8Oik2YkbekGUlxg==", + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.4.1.tgz", + "integrity": "sha512-0kUnVceEax0sYN+wdkNYF7fxjYKbsvmKmjVWwJvsSYA2p94bIL6wSy3oehewev7L9Dp/FDZFhmc9dyOoavdT6A==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.4.0", + "@jest/test-sequencer": "^26.4.1", "@jest/types": "^26.3.0", "babel-jest": "^26.3.0", "chalk": "^4.0.0", @@ -7770,7 +7827,7 @@ "jest-environment-jsdom": "^26.3.0", "jest-environment-node": "^26.3.0", "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.4.0", + "jest-jasmine2": "^26.4.1", "jest-regex-util": "^26.0.0", "jest-resolve": "^26.4.0", "jest-util": "^26.3.0", @@ -8132,9 +8189,9 @@ } }, "jest-jasmine2": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.4.0.tgz", - "integrity": "sha512-cGBxwzDDKB09EPJ4pE69BMDv+2lO442IB1xQd+vL3cua2OKdeXQK6iDlQKoRX/iP0RgU5T8sn9yahLcx/+ox8Q==", + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.4.1.tgz", + "integrity": "sha512-GMPqJXyAWpohCg4wfA82lwac65lmgANH4/rOhNNaAN9yjInMAeMExQcWE1xb3fcCgLwibqeAuqVrV83oQl+szg==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", @@ -8145,13 +8202,13 @@ "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^26.4.0", + "expect": "^26.4.1", "is-generator-fn": "^2.0.0", "jest-each": "^26.4.0", - "jest-matcher-utils": "^26.4.0", + "jest-matcher-utils": "^26.4.1", "jest-message-util": "^26.3.0", - "jest-runtime": "^26.4.0", - "jest-snapshot": "^26.4.0", + "jest-runtime": "^26.4.1", + "jest-snapshot": "^26.4.1", "jest-util": "^26.3.0", "pretty-format": "^26.4.0", "throat": "^5.0.0" @@ -8220,9 +8277,9 @@ } }, "jest-matcher-utils": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.4.0.tgz", - "integrity": "sha512-u+xdCdq+F262DH+PutJKXLGr2H5P3DImdJCir51PGSfi3TtbLQ5tbzKaN8BkXbiTIU6ayuAYBWTlU1nyckVdzA==", + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.4.1.tgz", + "integrity": "sha512-nmHWaOz54R/w6zJju5tuW0bw6+m38Rb1jnDKehKM/bOngDDL0UwtN634cRxpFoUNVRUrX8Wa0Z34xq/f8iuP5A==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -8497,20 +8554,20 @@ } }, "jest-resolve-dependencies": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.4.0.tgz", - "integrity": "sha512-hznK/hlrlhu8hwdbieRdHFKmcV83GW8t30libt/v6j1L3IEzb8iN21SaWzV8KRAAK4ijiU0kuge0wnHn+0rytQ==", + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.4.1.tgz", + "integrity": "sha512-Gx4JfQ1k/hGb4lqVOOx8TPOkNtyJIQSHcJU68pB+sdyDJi9rbMxD1XXiYyaEq9WXufiZo90k9GTK6z6a5m0SQw==", "dev": true, "requires": { "@jest/types": "^26.3.0", "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.4.0" + "jest-snapshot": "^26.4.1" } }, "jest-runner": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.4.0.tgz", - "integrity": "sha512-XF+tnUGolnPriu6Gg+HHWftspMjD5NkTV2mQppQnpZe39GcUangJ0al7aBGtA3GbVAcRd048DQiJPmsQRdugjw==", + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.4.1.tgz", + "integrity": "sha512-QcKwn1YNlzFumTtFsocETgIm13KNt2X8sae4wcqsF3JnxGUcYYUGBstCQhtAG4fKD/TKThHkgE/ZgQVKipj7oA==", "dev": true, "requires": { "@jest/console": "^26.3.0", @@ -8522,13 +8579,13 @@ "emittery": "^0.7.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^26.4.0", + "jest-config": "^26.4.1", "jest-docblock": "^26.0.0", "jest-haste-map": "^26.3.0", "jest-leak-detector": "^26.4.0", "jest-message-util": "^26.3.0", "jest-resolve": "^26.4.0", - "jest-runtime": "^26.4.0", + "jest-runtime": "^26.4.1", "jest-util": "^26.3.0", "jest-worker": "^26.3.0", "source-map-support": "^0.5.6", @@ -8588,15 +8645,15 @@ } }, "jest-runtime": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.4.0.tgz", - "integrity": "sha512-1fjZgGpkyQBUTo59Vi19I4IcsBwzY6uwVFNjUmR06iIi3XRErkY28yimi4IUDRrofQErqcDEw2n3DF9WmQ6vEg==", + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.4.1.tgz", + "integrity": "sha512-zXPQBS4iL/CEZtDfX+rDz+oZ/inQK/EYOeVt3uDWu8kwSdP/Cw4yOZtCTPApeNsGtZy6X5WQ1U+fyagN1B/Qkw==", "dev": true, "requires": { "@jest/console": "^26.3.0", "@jest/environment": "^26.3.0", "@jest/fake-timers": "^26.3.0", - "@jest/globals": "^26.4.0", + "@jest/globals": "^26.4.1", "@jest/source-map": "^26.3.0", "@jest/test-result": "^26.3.0", "@jest/transform": "^26.3.0", @@ -8607,13 +8664,13 @@ "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^26.4.0", + "jest-config": "^26.4.1", "jest-haste-map": "^26.3.0", "jest-message-util": "^26.3.0", "jest-mock": "^26.3.0", "jest-regex-util": "^26.0.0", "jest-resolve": "^26.4.0", - "jest-snapshot": "^26.4.0", + "jest-snapshot": "^26.4.1", "jest-util": "^26.3.0", "jest-validate": "^26.4.0", "slash": "^3.0.0", @@ -8696,21 +8753,21 @@ } }, "jest-snapshot": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.4.0.tgz", - "integrity": "sha512-vFGmNGWHMBomrlOpheTMoqihymovuH3GqfmaEIWoPpsxUXyxT3IlbxI5I4m2vg0uv3HUJYg5JoGrkgMzVsAwCg==", + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.4.1.tgz", + "integrity": "sha512-5DsxbSSuYA8rZ/ynO+l5J65wSIyzDB2AXjuIvep90YmtslrROqDtba2hBgq1Cj6L6A0j/jv6h8JydEe2WYPM/g==", "dev": true, "requires": { "@babel/types": "^7.0.0", "@jest/types": "^26.3.0", "@types/prettier": "^2.0.0", "chalk": "^4.0.0", - "expect": "^26.4.0", + "expect": "^26.4.1", "graceful-fs": "^4.2.4", "jest-diff": "^26.4.0", "jest-get-type": "^26.3.0", "jest-haste-map": "^26.3.0", - "jest-matcher-utils": "^26.4.0", + "jest-matcher-utils": "^26.4.1", "jest-message-util": "^26.3.0", "jest-resolve": "^26.4.0", "natural-compare": "^1.4.0", @@ -9170,12 +9227,13 @@ } }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" } }, "jsonparse": { @@ -9312,6 +9370,19 @@ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -10189,6 +10260,15 @@ "universalify": "^0.1.0" } }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -10219,6 +10299,12 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true } } }, @@ -10324,9 +10410,9 @@ "dev": true }, "node-notifier": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-7.0.2.tgz", - "integrity": "sha512-ux+n4hPVETuTL8+daJXTOC6uKLgMsl1RYfFv7DKRzyvzBapqco0rZZ9g72ZN8VS6V+gvNYHYa/ofcCY8fkJWsA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", + "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", "dev": true, "optional": true, "requires": { @@ -10334,7 +10420,7 @@ "is-wsl": "^2.2.0", "semver": "^7.3.2", "shellwords": "^0.1.1", - "uuid": "^8.2.0", + "uuid": "^8.3.0", "which": "^2.0.2" }, "dependencies": { @@ -12911,9 +12997,9 @@ } }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", "dev": true }, "unset-value": { diff --git a/package.json b/package.json index 8550870..684a7b7 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,9 @@ }, "devDependencies": { "@babel/cli": "^7.10.5", - "@babel/core": "^7.11.1", + "@babel/core": "^7.11.4", "@babel/preset-env": "^7.11.0", - "@commitlint/cli": "^9.1.2", + "@commitlint/cli": "^10.0.0", "@commitlint/config-conventional": "^10.0.0", "@gfx/zopfli": "^1.0.15", "@webpack-contrib/defaults": "^6.3.0", @@ -65,7 +65,7 @@ "eslint-plugin-import": "^2.22.0", "file-loader": "^6.0.0", "husky": "^4.2.5", - "jest": "^26.4.0", + "jest": "^26.4.1", "lint-staged": "^10.2.11", "memfs": "^3.2.0", "npm-run-all": "^4.1.5", diff --git a/src/Webpack4Cache.js b/src/Webpack4Cache.js index 0c5b059..144b0ca 100644 --- a/src/Webpack4Cache.js +++ b/src/Webpack4Cache.js @@ -5,42 +5,59 @@ import findCacheDir from 'find-cache-dir'; import serialize from 'serialize-javascript'; export default class Webpack4Cache { - constructor(compilation, options) { - this.cacheDir = + constructor(compilation, options, weakCache) { + this.cache = options.cache === true ? Webpack4Cache.getCacheDirectory() : options.cache; + this.weakCache = weakCache; } static getCacheDirectory() { return findCacheDir({ name: 'compression-webpack-plugin' }) || os.tmpdir(); } - isEnabled() { - return Boolean(this.cacheDir); - } + async get(task, sources) { + const weakOutput = this.weakCache.get(task.assetSource); + + if (weakOutput) { + return weakOutput; + } + + if (!this.cache) { + // eslint-disable-next-line no-undefined + return undefined; + } - async get(task) { // eslint-disable-next-line no-param-reassign task.cacheIdent = task.cacheIdent || serialize(task.cacheKeys); let cachedResult; try { - cachedResult = await cacache.get(this.cacheDir, task.cacheIdent); + cachedResult = await cacache.get(this.cache, task.cacheIdent); } catch (ignoreError) { // eslint-disable-next-line no-undefined return undefined; } - return Buffer.from(JSON.parse(cachedResult.data).data); + return new sources.RawSource( + Buffer.from(JSON.parse(cachedResult.data).data) + ); } async store(task) { - return cacache.put( - this.cacheDir, - task.cacheIdent, - JSON.stringify(task.output) - ); + if (!this.weakCache.has(task.assetSource)) { + this.weakCache.set(task.assetSource, task.output); + } + + if (!this.cache) { + // eslint-disable-next-line no-undefined + return undefined; + } + + const { cacheIdent, output } = task; + + return cacache.put(this.cache, cacheIdent, JSON.stringify(output.source())); } } diff --git a/src/Webpack5Cache.js b/src/Webpack5Cache.js index b48ca37..2bbcb89 100644 --- a/src/Webpack5Cache.js +++ b/src/Webpack5Cache.js @@ -1,14 +1,8 @@ export default class Cache { - // eslint-disable-next-line no-unused-vars - constructor(compilation, ignored) { + constructor(compilation) { this.cache = compilation.getCache('CompressionWebpackPlugin'); } - // eslint-disable-next-line class-methods-use-this - isEnabled() { - return true; - } - async get(task) { // eslint-disable-next-line no-param-reassign task.eTag = task.eTag || this.cache.getLazyHashedEtag(task.assetSource); diff --git a/src/index.js b/src/index.js index 7e6fe15..dc5b66e 100644 --- a/src/index.js +++ b/src/index.js @@ -7,12 +7,18 @@ import crypto from 'crypto'; import url from 'url'; import path from 'path'; -import RawSource from 'webpack-sources/lib/RawSource'; -import { ModuleFilenameHelpers, version as webpackVersion } from 'webpack'; +import webpack, { + ModuleFilenameHelpers, + version as webpackVersion, +} from 'webpack'; import validateOptions from 'schema-utils'; import schema from './options.json'; +const { RawSource } = + // eslint-disable-next-line global-require + webpack.sources || require('webpack-sources'); + class CompressionPlugin { constructor(options = {}) { validateOptions(schema, options, { @@ -203,29 +209,20 @@ class CompressionPlugin { yield task; } - afterTask(compilation, task, weakCache) { + afterTask(compilation, task) { const { output, input } = task; - if (output.length / input.length > this.options.minRatio) { + if (output.source().length / input.length > this.options.minRatio) { return; } const { assetSource, assetName } = task; - - let weakOutput = weakCache.get(assetSource); - - if (!weakOutput) { - weakOutput = new RawSource(output); - - weakCache.set(assetSource, weakOutput); - } - const newAssetName = CompressionPlugin.interpolateName( assetName, this.options.filename ); - CompressionPlugin.emitAsset(compilation, newAssetName, weakOutput, { + CompressionPlugin.emitAsset(compilation, newAssetName, output, { compressed: true, }); @@ -241,28 +238,15 @@ class CompressionPlugin { async runTasks(compilation, assetNames, CacheEngine, weakCache) { const scheduledTasks = []; - const cache = new CacheEngine(compilation, { - cache: this.options.cache, - }); + const cache = new CacheEngine( + compilation, + { + cache: this.options.cache, + }, + weakCache + ); for (const assetName of assetNames) { - const enqueue = async (task) => { - try { - // eslint-disable-next-line no-param-reassign - task.output = await this.compress(task.input); - } catch (error) { - compilation.errors.push(error); - - return; - } - - if (cache.isEnabled()) { - await cache.store(task); - } - - this.afterTask(compilation, task, weakCache); - }; - scheduledTasks.push( (async () => { const task = this.getTask(compilation, assetName).next().value; @@ -271,23 +255,24 @@ class CompressionPlugin { return Promise.resolve(); } - if (cache.isEnabled()) { + task.output = await cache.get(task, { RawSource }); + + if (!task.output) { try { - task.output = await cache.get(task); - } catch (ignoreError) { - return enqueue(task); - } + // eslint-disable-next-line no-param-reassign + task.output = new RawSource(await this.compress(task.input)); + } catch (error) { + compilation.errors.push(error); - if (!task.output) { - return enqueue(task); + return Promise.resolve(); } - this.afterTask(compilation, task, weakCache); - - return Promise.resolve(); + await cache.store(task); } - return enqueue(task); + this.afterTask(compilation, task); + + return Promise.resolve(); })() ); } @@ -306,8 +291,12 @@ class CompressionPlugin { undefined, this.options ); - const weakCache = new WeakMap(); - const compressionFn = async (compilation, CacheEngine, assets) => { + const compressionFn = async ( + compilation, + assets, + CacheEngine, + weakCache + ) => { const assetNames = Object.keys( typeof assets === 'undefined' ? compilation.assets : assets ).filter((assetName) => matchObject(assetName)); @@ -324,11 +313,11 @@ class CompressionPlugin { if (CompressionPlugin.isWebpack4()) { // eslint-disable-next-line global-require const CacheEngine = require('./Webpack4Cache').default; + const weakCache = new WeakMap(); - compiler.hooks.emit.tapPromise( - { name: pluginName }, + compiler.hooks.emit.tapPromise({ name: pluginName }, (compilation) => // eslint-disable-next-line no-undefined - (compilation) => compressionFn(compilation, CacheEngine) + compressionFn(compilation, undefined, CacheEngine, weakCache) ); } else { // eslint-disable-next-line global-require @@ -343,7 +332,7 @@ class CompressionPlugin { name: pluginName, stage: Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_TRANSFER, }, - (assets) => compressionFn(compilation, CacheEngine, assets) + (assets) => compressionFn(compilation, assets, CacheEngine) ); compilation.hooks.statsPrinter.tap(pluginName, (stats) => { diff --git a/test/CompressionPlugin.test.js b/test/CompressionPlugin.test.js index 39097f7..706a937 100644 --- a/test/CompressionPlugin.test.js +++ b/test/CompressionPlugin.test.js @@ -213,4 +213,34 @@ describe('CompressionPlugin', () => { resolve(); }); }); + + it('should work in watch mode when "cache" is "false"', async () => { + if (getCompiler.isWebpack4()) { + expect(true).toBe(true); + } else { + const compiler = getCompiler('./entry.js', { + cache: false, + }); + + new CompressionPlugin().apply(compiler); + + const stats = await compile(compiler); + + expect(stats.compilation.emittedAssets.size).toBe(7); + expect(getAssetsNameAndSize(stats)).toMatchSnapshot('assets'); + expect(getWarnings(stats)).toMatchSnapshot('errors'); + expect(getErrors(stats)).toMatchSnapshot('warnings'); + + await new Promise(async (resolve) => { + const newStats = await compile(compiler); + + expect(newStats.compilation.emittedAssets.size).toBe(0); + expect(getAssetsNameAndSize(newStats)).toMatchSnapshot('assets'); + expect(getWarnings(newStats)).toMatchSnapshot('errors'); + expect(getErrors(newStats)).toMatchSnapshot('warnings'); + + resolve(); + }); + } + }); }); diff --git a/test/__snapshots__/CompressionPlugin.test.js.snap.webpack5 b/test/__snapshots__/CompressionPlugin.test.js.snap.webpack5 index 87c2464..97924e7 100644 --- a/test/__snapshots__/CompressionPlugin.test.js.snap.webpack5 +++ b/test/__snapshots__/CompressionPlugin.test.js.snap.webpack5 @@ -39,6 +39,7 @@ Array [ "async.async.js?ver=73440247c3513e8f18d5", 269, Object { + "fullhash": "73440247c3513e8f18d5", "immutable": true, "related": Object { "gziped": "async.async.js.gz", @@ -77,6 +78,7 @@ Array [ "main.js?var=73440247c3513e8f18d5", 15312, Object { + "fullhash": "73440247c3513e8f18d5", "immutable": true, "related": Object { "gziped": "main.js.gz", @@ -91,6 +93,80 @@ exports[`CompressionPlugin should work child compilations: errors 1`] = `Array [ exports[`CompressionPlugin should work child compilations: warnings 1`] = `Array []`; +exports[`CompressionPlugin should work in watch mode when "cache" is "false": assets 1`] = ` +Array [ + Array [ + "09a1a1112c577c2794359715edfcb5ac.png", + 78117, + ], + Array [ + "23fc1d3ac606d117e05a140e0de79806.svg", + 672, + ], + Array [ + "23fc1d3ac606d117e05a140e0de79806.svg.gz", + 393, + ], + Array [ + "async.async.81ea6697ed82fa2176bb.js", + 269, + ], + Array [ + "async.async.81ea6697ed82fa2176bb.js.gz", + 181, + ], + Array [ + "main.f1e836b35a2623bafe34.js", + 15156, + ], + Array [ + "main.f1e836b35a2623bafe34.js.gz", + 3556, + ], +] +`; + +exports[`CompressionPlugin should work in watch mode when "cache" is "false": assets 2`] = ` +Array [ + Array [ + "09a1a1112c577c2794359715edfcb5ac.png", + 78117, + ], + Array [ + "23fc1d3ac606d117e05a140e0de79806.svg", + 672, + ], + Array [ + "23fc1d3ac606d117e05a140e0de79806.svg.gz", + 393, + ], + Array [ + "async.async.81ea6697ed82fa2176bb.js", + 269, + ], + Array [ + "async.async.81ea6697ed82fa2176bb.js.gz", + 181, + ], + Array [ + "main.f1e836b35a2623bafe34.js", + 15156, + ], + Array [ + "main.f1e836b35a2623bafe34.js.gz", + 3556, + ], +] +`; + +exports[`CompressionPlugin should work in watch mode when "cache" is "false": errors 1`] = `Array []`; + +exports[`CompressionPlugin should work in watch mode when "cache" is "false": errors 2`] = `Array []`; + +exports[`CompressionPlugin should work in watch mode when "cache" is "false": warnings 1`] = `Array []`; + +exports[`CompressionPlugin should work in watch mode when "cache" is "false": warnings 2`] = `Array []`; + exports[`CompressionPlugin should work in watch mode: assets 1`] = ` Array [ Array [ @@ -212,6 +288,7 @@ Array [ "async.async.js?ver=8cdf224bcea94552590b", 334, Object { + "fullhash": "8cdf224bcea94552590b", "immutable": true, "related": Object { "gziped": "async.async.js.gz", @@ -270,6 +347,7 @@ Array [ "main.js?var=8cdf224bcea94552590b", 15373, Object { + "fullhash": "8cdf224bcea94552590b", "immutable": true, "related": Object { "gziped": "main.js.gz", @@ -375,6 +453,7 @@ Array [ "async.async.js?ver=8cdf224bcea94552590b", 269, Object { + "fullhash": "8cdf224bcea94552590b", "immutable": true, "related": Object { "brotliCompressed": "async.async.js.br", @@ -421,6 +500,7 @@ Array [ "main.js?var=8cdf224bcea94552590b", 15315, Object { + "fullhash": "8cdf224bcea94552590b", "immutable": true, "related": Object { "brotliCompressed": "main.js.br", diff --git a/test/cache-option.test.js b/test/cache-option.test.js index e2eb62f..3acaa2f 100644 --- a/test/cache-option.test.js +++ b/test/cache-option.test.js @@ -15,17 +15,19 @@ import { getWarnings, } from './helpers/index'; +const falseCacheDirectory = findCacheDir({ name: 'false-cache-directory' }); const cacheDir = findCacheDir({ name: 'compression-webpack-plugin' }); const otherCacheDir = findCacheDir({ name: 'other-cache-directory' }); -const uniqueDirectory = findCacheDir({ name: 'unique-cache-directory' }); +const uniqueCacheDirectory = findCacheDir({ name: 'unique-cache-directory' }); if (getCompiler.isWebpack4()) { describe('"cache" option', () => { beforeEach(() => { return Promise.all([ + cacache.rm.all(falseCacheDirectory), cacache.rm.all(cacheDir), cacache.rm.all(otherCacheDir), - cacache.rm.all(uniqueDirectory), + cacache.rm.all(uniqueCacheDirectory), ]); }); @@ -41,6 +43,12 @@ if (getCompiler.isWebpack4()) { cacache.get = jest.fn(cacache.get); cacache.put = jest.fn(cacache.put); + const getCacheDirectorySpy = jest + .spyOn(Webpack4Cache, 'getCacheDirectory') + .mockImplementation(() => { + return falseCacheDirectory; + }); + const stats = await compile(compiler); expect(getAssetsNameAndSize(stats)).toMatchSnapshot('assets'); @@ -51,10 +59,12 @@ if (getCompiler.isWebpack4()) { expect(cacache.get.mock.calls.length).toBe(0); expect(cacache.put.mock.calls.length).toBe(0); - const cacheEntriesList = await cacache.ls(cacheDir); + const cacheEntriesList = await cacache.ls(falseCacheDirectory); const cacheKeys = Object.keys(cacheEntriesList); expect(cacheKeys.length).toBe(0); + + getCacheDirectorySpy.mockRestore(); }); it('matches snapshot for `true` value ({Boolean})', async () => { @@ -70,7 +80,7 @@ if (getCompiler.isWebpack4()) { const getCacheDirectorySpy = jest .spyOn(Webpack4Cache, 'getCacheDirectory') .mockImplementation(() => { - return uniqueDirectory; + return uniqueCacheDirectory; }); const stats = await compile(beforeCacheCompiler); @@ -86,7 +96,7 @@ if (getCompiler.isWebpack4()) { // Put files in cache expect(cacache.put.mock.calls.length).toBe(countAssets / 2); - const cacheEntriesList = await cacache.ls(uniqueDirectory); + const cacheEntriesList = await cacache.ls(uniqueCacheDirectory); const cacheKeys = Object.keys(cacheEntriesList);