diff --git a/gulp-tasks/test-node.js b/gulp-tasks/test-node.js index a54c683bb..b1e9f1ddd 100644 --- a/gulp-tasks/test-node.js +++ b/gulp-tasks/test-node.js @@ -56,7 +56,14 @@ async function runNodeTestsWithEnv(testGroup, nodeEnv) { const packagesToTest = glob.sync(`test/${testGroup}/node`, globConfig); for (const packageToTest of packagesToTest) { - await runNodeTestSuite(packageToTest, nodeEnv); + // Hardcode special logic for webpack v4 and v5 tests, which need to + // be run in separate processes. + if (packageToTest.includes('workbox-webpack-plugin')) { + await runNodeTestSuite(`${packageToTest}/v4`, nodeEnv); + await runNodeTestSuite(`${packageToTest}/v5`, nodeEnv); + } else { + await runNodeTestSuite(packageToTest, nodeEnv); + } } } diff --git a/infra/testing/webpack-build-check.js b/infra/testing/webpack-build-check.js index b017416cf..382d71312 100644 --- a/infra/testing/webpack-build-check.js +++ b/infra/testing/webpack-build-check.js @@ -6,6 +6,13 @@ https://opensource.org/licenses/MIT. */ +function joinMessages(errorsOrWarnings) { + if ('message' in errorsOrWarnings[0]) { + return errorsOrWarnings.map((item) => item.message).join('\n'); + } else { + return errorsOrWarnings.join('\n'); + } +} module.exports = (webpackError, stats) => { if (webpackError) { @@ -15,10 +22,10 @@ module.exports = (webpackError, stats) => { const statsJson = stats.toJson('verbose'); if (statsJson.errors.length > 0) { - throw new Error(statsJson.errors.join('\n')); + throw new Error(joinMessages(statsJson.errors)); } if (statsJson.warnings.length > 0) { - throw new Error(statsJson.warnings.join('\n')); + throw new Error(joinMessages(statsJson.warnings)); } }; diff --git a/package-lock.json b/package-lock.json index dd80c9c44..2a23ff853 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@babel/cli": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.10.5.tgz", - "integrity": "sha512-j9H9qSf3kLdM0Ao3aGPbGZ73mEA9XazuupcS6cDGWuiyAcANoguhP0r2Lx32H5JGw4sSSoHG3x/mxVnHgvOoyA==", + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.11.6.tgz", + "integrity": "sha512-+w7BZCvkewSmaRM6H4L2QM3RL90teqEIHDIFXAmrW33+0jhlymnDAEdqVeCZATvxhQuio1ifoGVlJJbIiH9Ffg==", "dev": true, "requires": { "chokidar": "^2.1.8", @@ -50,19 +50,19 @@ } }, "@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.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", + "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", + "@babel/generator": "^7.11.6", "@babel/helper-module-transforms": "^7.11.0", "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.1", + "@babel/parser": "^7.11.5", "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.0", - "@babel/types": "^7.11.0", + "@babel/traverse": "^7.11.5", + "@babel/types": "^7.11.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -74,12 +74,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -97,12 +97,12 @@ } }, "@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.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", + "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", "dev": true, "requires": { - "@babel/types": "^7.11.0", + "@babel/types": "^7.11.5", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -184,12 +184,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" } }, @@ -280,15 +279,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" } }, @@ -386,9 +384,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.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -948,9 +946,9 @@ } }, "@babel/preset-env": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz", - "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", + "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", "dev": true, "requires": { "@babel/compat-data": "^7.11.0", @@ -1015,7 +1013,7 @@ "@babel/plugin-transform-unicode-escapes": "^7.10.4", "@babel/plugin-transform-unicode-regex": "^7.10.4", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.11.0", + "@babel/types": "^7.11.5", "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", @@ -1032,9 +1030,9 @@ } }, "@babel/preset-modules": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", - "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -1065,29 +1063,29 @@ } }, "@babel/traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", - "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", + "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.0", + "@babel/generator": "^7.11.5", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.0", - "@babel/types": "^7.11.0", + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -1099,9 +1097,9 @@ } }, "@babel/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", - "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -1109,6 +1107,56 @@ "to-fast-properties": "^2.0.0" } }, + "@eslint/eslintrc": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", + "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "@evocateur/libnpmaccess": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz", @@ -1368,9 +1416,9 @@ } }, "@google-cloud/common": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.3.2.tgz", - "integrity": "sha512-W7JRLBEJWYtZQQuGQX06U6GBOSLrSrlvZxv6kGNwJtFrusu6AVgZltQ9Pajuz9Dh9aSXy9aTnBcyxn2/O0EGUw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.4.0.tgz", + "integrity": "sha512-bVMQlK4aZEeopo2oJwDUJiBhPVjRRQHfFCCv9JowmKS3L//PBHNDJzC/LxJixGZEU3fh3YXkUwm67JZ5TBCCNQ==", "dev": true, "requires": { "@google-cloud/projectify": "^2.0.0", @@ -1410,9 +1458,9 @@ } }, "@google-cloud/paginator": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.4.tgz", - "integrity": "sha512-fKI+jYQdV1F9jtG6tSRro3ilNSeBWVmTzxc8Z0kiPRXcj8eshh9fiF8TtxfDefyUKgTdWgHpzGBwLbZ/OGikJg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.5.tgz", + "integrity": "sha512-N4Uk4BT1YuskfRhKXBs0n9Lg2YTROZc6IMpkO/8DIHODtm5s3xY8K5vVBo23v/2XulY3azwITQlYWgT4GdLsUw==", "dev": true, "requires": { "arrify": "^2.0.0", @@ -1426,15 +1474,15 @@ "dev": true }, "@google-cloud/promisify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.2.tgz", - "integrity": "sha512-EvuabjzzZ9E2+OaYf+7P9OAiiwbTxKYL0oGLnREQd+Su2NTQBpomkdlkBowFvyWsaV0d1sSGxrKpSNcrhPqbxg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.3.tgz", + "integrity": "sha512-d4VSA86eL/AFTe5xtyZX+ePUjE8dIFu2T8zmdeNBSa5/kNgXPCx/o/wbFNHAGLJdGnk1vddRuMESD9HbOC8irw==", "dev": true }, "@google-cloud/storage": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.2.0.tgz", - "integrity": "sha512-zxHXZajtVA0Qx9IOnDUDb76mtKn5M20LKV/phmnVos7foozG9YZ6yYod90pRC/GgP3eOgxNYdt6KQcapssPsFw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.3.0.tgz", + "integrity": "sha512-3t5UF3SZ14Bw2kcBHubCai6EIugU2GnQOstYWVSFuoO8IJ94RAaIOPq/dtexvQbUTpBTAGpd5smVR9WPL1mJVw==", "dev": true, "requires": { "@google-cloud/common": "^3.3.0", @@ -3045,9 +3093,9 @@ } }, "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", "dev": true, "requires": { "is-obj": "^1.0.0" @@ -3716,20 +3764,20 @@ } }, "@octokit/endpoint": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.5.tgz", - "integrity": "sha512-70K5u6zd45ItOny6aHQAsea8HHQjlQq85yqOMe+Aj8dkhN2qSJ9T+Q3YjUjEYfPRBcuUWNgMn62DQnP/4LAIiQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.6.tgz", + "integrity": "sha512-7Cc8olaCoL/mtquB7j/HTbPM+sY6Ebr4k2X2y4JoXpVKQ7r5xB4iGQE0IoO58wIPsUk4AzoT65AMEpymSbWTgQ==", "dev": true, "requires": { "@octokit/types": "^5.0.0", - "is-plain-object": "^4.0.0", + "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, "dependencies": { "is-plain-object": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-4.1.1.tgz", - "integrity": "sha512-5Aw8LLVsDlZsETVMhoMXzqsXwQqr/0vlnBYzIXJbYo2F4yYlhLHs+Ez7Bod7IIQKWkJbJfxrWD7pA1Dw1TKrwA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true }, "universal-user-agent": { @@ -3794,17 +3842,17 @@ } }, "@octokit/request": { - "version": "5.4.7", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.7.tgz", - "integrity": "sha512-FN22xUDP0i0uF38YMbOfx6TotpcENP5W8yJM1e/LieGXn6IoRxDMnBf7tx5RKSW4xuUZ/1P04NFZy5iY3Rax1A==", + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.9.tgz", + "integrity": "sha512-CzwVvRyimIM1h2n9pLVYfTDmX9m+KHSgCpqPsY8F1NdEK8IaWqXhSBXsdjOBFZSpEcxNEeg4p0UO9cQ8EnOCLA==", "dev": true, "requires": { "@octokit/endpoint": "^6.0.1", "@octokit/request-error": "^2.0.0", "@octokit/types": "^5.0.0", "deprecation": "^2.0.0", - "is-plain-object": "^4.0.0", - "node-fetch": "^2.3.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.1", "once": "^1.4.0", "universal-user-agent": "^6.0.0" }, @@ -3821,9 +3869,9 @@ } }, "is-plain-object": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-4.1.1.tgz", - "integrity": "sha512-5Aw8LLVsDlZsETVMhoMXzqsXwQqr/0vlnBYzIXJbYo2F4yYlhLHs+Ez7Bod7IIQKWkJbJfxrWD7pA1Dw1TKrwA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true }, "universal-user-agent": { @@ -3937,18 +3985,18 @@ } }, "@octokit/types": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.4.0.tgz", - "integrity": "sha512-D/uotqF69M50OIlwMqgyIg9PuLT2daOiBAYF0P40I2ekFA2ESwwBY5dxZe/UhXdPvIbNKDzuZmQrO7rMpuFbcg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.5.0.tgz", + "integrity": "sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==", "dev": true, "requires": { "@types/node": ">= 8" } }, "@rollup/plugin-babel": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.2.0.tgz", - "integrity": "sha512-CPABsajaKjINgBQ3it+yMnfVO3ibsrMBxRzbUOUw2cL1hsZJ7aogU8mgglQm3S2hHJgjnAmxPz0Rq7DVdmHsTw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.2.1.tgz", + "integrity": "sha512-Jd7oqFR2dzZJ3NWANDyBjwTtX/lYbZpVcmkHrfQcpvawHs9E4c0nYk5U2mfZ6I/DZcIvy506KZJi54XK/jxH7A==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.10.4", @@ -3956,9 +4004,9 @@ } }, "@rollup/plugin-commonjs": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-15.0.0.tgz", - "integrity": "sha512-8uAdikHqVyrT32w1zB9VhW6uGwGjhKgnDNP4pQJsjdnyF4FgCj6/bmv24c7v2CuKhq32CcyCwRzMPEElaKkn0w==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-15.1.0.tgz", + "integrity": "sha512-xCQqz4z/o0h2syQ7d9LskIMvBSH4PX5PjYdpSSvgS+pQik3WahkQVNWg3D8XJeYjZoVWnIUQYDghuEMRGrmQYQ==", "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", @@ -4027,6 +4075,14 @@ "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + } } }, "@sinonjs/commons": { @@ -4092,6 +4148,26 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/eslint": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.4.tgz", + "integrity": "sha512-YCY4kzHMsHoyKspQH+nwSe+70Kep7Vjt2X+dZe5Vs2vkRudqtoFoUIv1RlJmZB8Hbp7McneupoZij4PadxsK5Q==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", + "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -4099,9 +4175,9 @@ "dev": true }, "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "version": "0.0.45", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", + "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==", "dev": true }, "@types/glob": { @@ -4115,15 +4191,15 @@ } }, "@types/html-minifier-terser": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz", - "integrity": "sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==", "dev": true }, "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, "@types/minimatch": { @@ -4139,9 +4215,9 @@ "dev": true }, "@types/node": { - "version": "14.0.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", - "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==", + "version": "14.11.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz", + "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==", "dev": true }, "@types/normalize-package-data": { @@ -4178,9 +4254,9 @@ "dev": true }, "@types/uglify-js": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.9.3.tgz", - "integrity": "sha512-KswB5C7Kwduwjj04Ykz+AjvPcfgv/37Za24O2EDzYNbwyzOo8+ydtvzUfZ5UMguiVu29Gx44l1A6VsPPcmYu9w==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.11.0.tgz", + "integrity": "sha512-I0Yd8TUELTbgRHq2K65j8rnDPAzAP+DiaF/syLem7yXwYLsHZhPd+AM2iXsWmf9P2F2NlFCgl5erZPQx9IbM9Q==", "dev": true, "requires": { "source-map": "^0.6.1" @@ -4195,9 +4271,9 @@ } }, "@types/webpack": { - "version": "4.41.21", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.21.tgz", - "integrity": "sha512-2j9WVnNrr/8PLAB5csW44xzQSJwS26aOnICsP3pSGCEdsu6KYtfQ6QJsVUKHWRnm1bL7HziJsfh5fHqth87yKA==", + "version": "4.41.22", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.22.tgz", + "integrity": "sha512-JQDJK6pj8OMV9gWOnN1dcLCyU9Hzs6lux0wBO4lr1+gyEhIBR9U3FMrz12t2GPkg110XAxEAw2WHF6g7nZIbRQ==", "dev": true, "requires": { "@types/anymatch": "*", @@ -4217,9 +4293,9 @@ } }, "@types/webpack-sources": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-1.4.2.tgz", - "integrity": "sha512-77T++JyKow4BQB/m9O96n9d/UUHWLQHlcqXb9Vsf4F1+wKNrrlWNFPDLKNT92RJnCSL6CieTc+NDXtCVZswdTw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.0.0.tgz", + "integrity": "sha512-a5kPx98CNFRKQ+wqawroFunvFqv7GHm/3KOI52NY9xWADgc8smu4R6prt4EU/M4QfVjvgBkMqU4fBhw3QfMVkg==", "dev": true, "requires": { "@types/node": "*", @@ -4287,12 +4363,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -4543,15 +4619,15 @@ } }, "acorn": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.1.tgz", - "integrity": "sha512-dmKn4pqZ29iQl2Pvze1zTrps2luvls2PBY//neO2WJ0s10B3AxJXshN+Ph7B4GrhfGhHXrl4dnUwyNNXQcnWGQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.2.tgz", + "integrity": "sha512-t0Dw7AOyeKs4nez4dhzkBDHB28ICo1pxk3UFsLfsCHOkLW+CwbAZJPMa0vBbq0Mqsslhb7n/7H4qB5txaVQ4ew==", "dev": true }, "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true }, "adm-zip": { @@ -4570,12 +4646,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -4596,9 +4672,9 @@ } }, "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==", "dev": true, "requires": { "clean-stack": "^2.0.0", @@ -4606,9 +4682,9 @@ } }, "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -4901,6 +4977,27 @@ "es-abstract": "^1.17.0-next.1", "es-array-method-boxes-properly": "^1.0.0", "is-string": "^1.0.4" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "arrify": { @@ -4995,6 +5092,15 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, "async-done": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", @@ -5191,9 +5297,9 @@ "dev": true }, "bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", "dev": true }, "binary-extensions": { @@ -5219,9 +5325,9 @@ "dev": true }, "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", "dev": true }, "body-parser": { @@ -5400,15 +5506,15 @@ } }, "browserslist": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", - "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", + "version": "4.14.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", + "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001111", - "electron-to-chromium": "^1.3.523", - "escalade": "^3.0.2", - "node-releases": "^1.1.60" + "caniuse-lite": "^1.0.30001135", + "electron-to-chromium": "^1.3.571", + "escalade": "^3.1.0", + "node-releases": "^1.1.61" } }, "btoa-lite": { @@ -5417,6 +5523,17 @@ "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", "dev": true }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -5628,9 +5745,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.30001140", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001140.tgz", + "integrity": "sha512-xFtvBtfGrpjTOxTpjP5F2LmN04/ZGfYV8EQzUIC/RmKpdrmzJrjqlJ4ho7sGuAMPko2/Jl08h7x9uObCfBFaAA==", "dev": true }, "caseless": { @@ -5713,9 +5830,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -6015,9 +6132,9 @@ "dev": true }, "comment-parser": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.5.tgz", - "integrity": "sha512-iH9YA35ccw94nx5244GVkpyC9eVTsL71jZz6iz5w6RIf79JLF2AsXHXq9p6Oaohyl3sx5qSMnGsWUDFIAfWL4w==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.6.tgz", + "integrity": "sha512-GKNxVA7/iuTnAqGADlTWX4tkhzxZKXp5fLJqKTlQLHkE65XDUKutZ3BHaJC5IGcper2tT3QRD1xr4o3jNpgXXg==", "dev": true }, "common-tags": { @@ -6311,6 +6428,16 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true + }, + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } } } }, @@ -6343,6 +6470,16 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true + }, + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } } } }, @@ -6369,6 +6506,18 @@ "split2": "^2.0.0", "through2": "^3.0.0", "trim-off-newlines": "^1.0.0" + }, + "dependencies": { + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } } }, "conventional-recommended-bump": { @@ -6664,21 +6813,21 @@ } }, "copy-webpack-plugin": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.3.tgz", - "integrity": "sha512-q5m6Vz4elsuyVEIUXr7wJdIdePWTubsqVbEMvf1WQnHGv0Q+9yPRu7MtYFPt+GBOXRav9lvIINifTQ1vSCs+eA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.1.1.tgz", + "integrity": "sha512-4TlkHFYkrZ3WppLA5XkPmBLI5lnEpFsXvpeqxCf5PzkratZiVklNXsvoQkLhUU43q7ZL3AOXtaHAd9jLNJoU0w==", "dev": true, "requires": { - "cacache": "^15.0.4", + "cacache": "^15.0.5", "fast-glob": "^3.2.4", "find-cache-dir": "^3.3.1", "glob-parent": "^5.1.1", "globby": "^11.0.1", "loader-utils": "^2.0.0", "normalize-path": "^3.0.0", - "p-limit": "^3.0.1", - "schema-utils": "^2.7.0", - "serialize-javascript": "^4.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^2.7.1", + "serialize-javascript": "^5.0.1", "webpack-sources": "^1.4.3" }, "dependencies": { @@ -6896,9 +7045,9 @@ } }, "date-and-time": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.14.0.tgz", - "integrity": "sha512-0wY8b90XjQkRxv3XGT8k1ffyDQOf4+T+2hiWp7rwYgoEn8OyYDsHZdnVrPlzxbwjLUY66mVBXr59eKOwpSV7lw==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.14.1.tgz", + "integrity": "sha512-M4RggEH5OF2ZuCOxgOU67R6Z9ohjKbxGvAQz48vj53wLmL0bAgumkBvycR32f30pK+Og9pIR+RFDyChbaE4oLA==", "dev": true }, "dateformat": { @@ -7188,12 +7337,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -7338,9 +7487,9 @@ }, "dependencies": { "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", "dev": true } } @@ -7396,9 +7545,9 @@ } }, "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "requires": { "is-obj": "^2.0.0" @@ -7500,9 +7649,9 @@ "dev": true }, "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.576", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.576.tgz", + "integrity": "sha512-uSEI0XZ//5ic+0NdOqlxp0liCD44ck20OAGyLMSymIWTEAtHKVJi6JM18acOnRgUgX7Q65QqnI+sNncNvIy8ew==", "dev": true }, "elliptic": { @@ -7614,9 +7763,9 @@ "dev": true }, "envinfo": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.2.tgz", - "integrity": "sha512-k3Eh5bKuQnZjm49/L7H4cHzs2FlL5QjbTB3JrPxoTI8aJG7hVMe4uKyJxSYH4ahseby2waUwk5OaKX/nAsaYgg==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", + "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==", "dev": true }, "err-code": { @@ -7644,9 +7793,9 @@ } }, "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.18.0-next.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", + "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", @@ -7654,8 +7803,9 @@ "has": "^1.0.3", "has-symbols": "^1.0.1", "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", "object.assign": "^4.1.0", "string.prototype.trimend": "^1.0.1", @@ -7683,6 +7833,25 @@ "isarray": "^2.0.5" }, "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, "isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -7768,9 +7937,9 @@ } }, "escalade": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", - "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", + "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==", "dev": true }, "escape-html": { @@ -7786,22 +7955,23 @@ "dev": true }, "eslint": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.6.0.tgz", - "integrity": "sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.10.0.tgz", + "integrity": "sha512-BDVffmqWl7JJXqCjAK6lWtcQThZB/aP1HXSH1JKwGwv0LQEdvpR7qzNrUT487RM39B5goWuboFad5ovMBmD8yA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.1.3", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", - "eslint-scope": "^5.1.0", + "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^1.3.0", - "espree": "^7.2.0", + "espree": "^7.3.0", "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", @@ -7841,12 +8011,12 @@ } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "glob-parent": { @@ -7918,33 +8088,33 @@ "dev": true }, "eslint-plugin-header": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.0.0.tgz", - "integrity": "sha512-OIu2ciVW8jK4Ove4JHm1I7X0C98PZuLCyCsoUhAm2HpyGS+zr34qLM6iV06unnDvssvvEh5BkOfaLRF+N7cGoQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.0.tgz", + "integrity": "sha512-jKKcwMsB0/ftBv3UVmuQir1f8AmXzTS9rdzPkileW8/Nz9ivdea8vOU1ZrMbX+WH6CpwnHEo3403baSHk40Mag==", "dev": true }, "eslint-plugin-jsdoc": { - "version": "30.2.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.2.2.tgz", - "integrity": "sha512-588zVyRy+g7s8VU3D0AL75r7xBYN0UX6tZEwP5EQ4JvpVavwu2iPJRaBxwuG3QAj99WZkUBlrLU16p4qST6vSw==", + "version": "30.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.6.2.tgz", + "integrity": "sha512-LlRdsSQBSPsI3MvhWoGc+Ev3PfFRBk41wwkmbOgC7KP7WQlbeWPpASF5Vdv17XEZ7J+xvPB3KCMyR//6Dbjnnw==", "dev": true, "requires": { - "comment-parser": "^0.7.5", + "comment-parser": "^0.7.6", "debug": "^4.1.1", "jsdoctypeparser": "^9.0.0", - "lodash": "^4.17.19", + "lodash": "^4.17.20", "regextras": "^0.7.1", "semver": "^7.3.2", "spdx-expression-parse": "^3.0.1" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -7956,12 +8126,12 @@ } }, "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -7981,12 +8151,12 @@ "dev": true }, "espree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.2.0.tgz", - "integrity": "sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", "dev": true, "requires": { - "acorn": "^7.3.1", + "acorn": "^7.4.0", "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.3.0" }, @@ -8023,12 +8193,20 @@ } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "estraverse": { @@ -8253,9 +8431,9 @@ }, "dependencies": { "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", "dev": true } } @@ -8854,18 +9032,6 @@ "requires": { "graceful-fs": "^4.1.11", "through2": "^2.0.3" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } } }, "fs-readdir-recursive": { @@ -8969,9 +9135,9 @@ } }, "gaxios": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.1.0.tgz", - "integrity": "sha512-DDTn3KXVJJigtz+g0J3vhcfbDbKtAroSTxauWsdnP57sM5KZ3d2c/3D9RKFJ86s43hfw6WULg6TXYw/AYiBlpA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.2.0.tgz", + "integrity": "sha512-+6WPeVzPvOshftpxJwRi2Ozez80tn/hdtOUag7+gajDHRJvAblKxTFSSMPtr2hmnLy7p0mvYz0rMXLBl8pSO7Q==", "dev": true, "requires": { "abort-controller": "^3.0.0", @@ -8982,9 +9148,9 @@ } }, "gcp-metadata": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.1.4.tgz", - "integrity": "sha512-5J/GIH0yWt/56R3dNaNWPGQ/zXsZOddYECfJaqxFWgrZ9HC2Kvc5vl9upOgUUHKzURjAVf2N+f6tEJiojqXUuA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.2.0.tgz", + "integrity": "sha512-vQZD57cQkqIA6YPGXM/zc+PIZfNRFdukWGsGZ5+LcJzesi5xp6Gn7a02wRJi4eXPyArNMIYpPET4QMxGqtlk6Q==", "dev": true, "requires": { "gaxios": "^3.0.0", @@ -9117,16 +9283,6 @@ "get-stdin": "^4.0.1" } }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -9381,16 +9537,6 @@ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", "dev": true }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "trim-newlines": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", @@ -9649,9 +9795,9 @@ } }, "git-url-parse": { - "version": "11.1.3", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.3.tgz", - "integrity": "sha512-GPsfwticcu52WQ+eHp0IYkAyaOASgYdtsQDIt4rUp6GbiNt1P9ddrh3O0kQB0eD4UJZszVqNT3+9Zwcg40fywA==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.3.0.tgz", + "integrity": "sha512-i3XNa8IKmqnUqWBcdWBjOcnyZYfN3C1WRvnKI6ouFWwsXCZEnlgbwbm55ZpJ3OJMhfEP/ryFhqW8bBhej3C5Ug==", "dev": true, "requires": { "git-up": "^4.0.0" @@ -9825,9 +9971,9 @@ } }, "google-auth-library": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.0.6.tgz", - "integrity": "sha512-fWYdRdg55HSJoRq9k568jJA1lrhg9i2xgfhVIMJbskUmbDpJGHsbv9l41DGhCDXM21F9Kn4kUwdysgxSYBYJUw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.0.tgz", + "integrity": "sha512-GbalszIADE1YPWhUyfFMrkLhFHnlAgoRcqGVW+MsLDPsuaOB5MRPk7NNafPDv9SherNE4EKzcYuxMJjaxzXMOw==", "dev": true, "requires": { "arrify": "^2.0.0", @@ -9842,12 +9988,12 @@ } }, "google-p12-pem": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.2.tgz", - "integrity": "sha512-tbjzndQvSIHGBLzHnhDs3cL4RBjLbLXc2pYvGH+imGVu5b4RMAttUTdnmW2UH0t11QeBTXZ7wlXPS7hrypO/tg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.3.tgz", + "integrity": "sha512-wS0ek4ZtFx/ACKYF3JhyGe5kzH7pgiQ7J5otlumqR9psmWMYc+U9cErKlCYVYHoUaidXHdZ2xbo34kB+S+24hA==", "dev": true, "requires": { - "node-forge": "^0.9.0" + "node-forge": "^0.10.0" } }, "graceful-fs": { @@ -10210,25 +10356,10 @@ } }, "hash-stream-validation": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.3.tgz", - "integrity": "sha512-OEohGLoUOh+bwsIpHpdvhIXFyRGjeLqJbT8Yc5QTZPbRM7LKywagTQxnX/6mghLDOrD9YGz88hy5mLN2eKflYQ==", - "dev": true, - "requires": { - "through2": "^2.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz", + "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==", + "dev": true }, "hash.js": { "version": "1.1.7", @@ -10241,9 +10372,9 @@ } }, "hasha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", - "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.1.tgz", + "integrity": "sha512-x15jnRSHTi3VmH+oHtVb9kgU/HuKOK8mjK8iCL3dPQXh4YJlUb9YSI8ZLiiqLAIvY2wuDIlZYZppy8vB2XISkQ==", "dev": true, "requires": { "is-stream": "^2.0.0", @@ -10304,9 +10435,9 @@ } }, "html-webpack-plugin": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz", - "integrity": "sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", + "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", "dev": true, "requires": { "@types/html-minifier-terser": "^5.0.0", @@ -10414,12 +10545,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -10458,12 +10589,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -10490,15 +10621,15 @@ } }, "husky": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", - "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz", + "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==", "dev": true, "requires": { "chalk": "^4.0.0", "ci-info": "^2.0.0", "compare-versions": "^3.6.0", - "cosmiconfig": "^6.0.0", + "cosmiconfig": "^7.0.0", "find-versions": "^3.2.0", "opencollective-postinstall": "^2.0.2", "pkg-dir": "^4.2.0", @@ -10507,8 +10638,21 @@ "which-pm-runs": "^1.0.0" }, "dependencies": { - "slash": { - "version": "3.0.0", + "cosmiconfig": { + "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.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "slash": { + "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true @@ -10887,9 +11031,9 @@ "dev": true }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", "dev": true }, "is-ci": { @@ -11003,6 +11147,12 @@ "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", "dev": true }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -11353,9 +11503,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -11375,12 +11525,12 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -11441,9 +11591,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -11452,16 +11602,16 @@ } }, "js-beautify": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.12.0.tgz", - "integrity": "sha512-hZCm93+sWHqrsB2ac38cPX4A9t6mfReq13ZUr/0dk6rCXNLIq0R4lu0EiuJc0Ip6RiWNtE0vECjXOhcy/jMt9Q==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.13.0.tgz", + "integrity": "sha512-/Tbp1OVzZjbwzwJQFIlYLm9eWQ+3aYbBXLSaqb1mEJzhcQAfrqMMQYtjb6io+U6KpD0ID4F+Id3/xcjH3l/sqA==", "dev": true, "requires": { "config-chain": "^1.1.12", "editorconfig": "^0.15.3", "glob": "^7.1.3", "mkdirp": "^1.0.4", - "nopt": "^4.0.3" + "nopt": "^5.0.0" } }, "js-tokens": { @@ -11496,9 +11646,9 @@ "dev": true }, "jsdoc": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.5.tgz", - "integrity": "sha512-SbY+i9ONuxSK35cgVHaI8O9senTE4CDYAmGSDJ5l3+sfe62Ff4gy96osy6OW84t4K4A8iGnMrlRrsSItSNp3RQ==", + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.6.tgz", + "integrity": "sha512-znR99e1BHeyEkSvgDDpX0sTiTu+8aQyDl9DawrkOGZTTW8hv0deIFXx87114zJ7gRaDZKVQD/4tr1ifmJp9xhQ==", "dev": true, "requires": { "@babel/parser": "^7.9.4", @@ -11579,6 +11729,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -11659,9 +11815,9 @@ "dev": true }, "just-extend": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", - "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.1.tgz", + "integrity": "sha512-aWgeGFW67BP3e5181Ep1Fv2v8z//iBJfrvyTnq8wG86vEESwmonn1zPBJ0VfmT9CJq2FIT0VsETtrNFm2a+SHA==", "dev": true }, "jwa": { @@ -11907,9 +12063,9 @@ } }, "lodash-match-pattern": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/lodash-match-pattern/-/lodash-match-pattern-2.2.1.tgz", - "integrity": "sha512-OVAOY0KVcTNOGN9KVDmt41e3VA133AqJgzNrf9oVX1thJGVYRXvQ7+Ul9Z7FY0PDnSZ6NkYGR9tvLERlyjCzxQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/lodash-match-pattern/-/lodash-match-pattern-2.2.3.tgz", + "integrity": "sha512-8SQw6J1wLzPF6fS4D01yN0xVIFtUz+o3hLfsp/4RTtlSMrEWJRCOGFvp8Ce0070oxnM8ZhxlfB8Tcu4Uxm9vQg==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -11991,25 +12147,12 @@ "dev": true }, "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "dev": true, "requires": { - "chalk": "^2.4.2" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } + "chalk": "^4.0.0" } }, "loose-envify": { @@ -12355,9 +12498,9 @@ } }, "meow": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.0.tgz", - "integrity": "sha512-kq5F0KVteskZ3JdfyQFivJEj2RaA8NFsS4+r9DaMKLcUHpk5OcHS3Q0XkCXONB1mZRPsu/Y/qImKri0nwSEZog==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", + "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", "dev": true, "requires": { "@types/minimist": "^1.2.0", @@ -12513,9 +12656,9 @@ "dev": true }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", "dev": true }, "mime-types": { @@ -12525,6 +12668,14 @@ "dev": true, "requires": { "mime-db": "1.44.0" + }, + "dependencies": { + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + } } }, "mimic-fn": { @@ -12622,9 +12773,9 @@ } }, "minizlib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", - "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "requires": { "minipass": "^3.0.0", @@ -12683,16 +12834,6 @@ } } } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } } } }, @@ -12733,23 +12874,23 @@ } }, "mocha": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.1.tgz", - "integrity": "sha512-p7FuGlYH8t7gaiodlFreseLxEmxTgvyG9RgPHODFPySNhwUehu8NIb0vdSt3WFckSneswZ0Un5typYcWElk7HQ==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.3.tgz", + "integrity": "sha512-ZbaYib4hT4PpF4bdSO2DohooKXIn4lDeiYqB+vTmCdr6l2woW0b6H3pf5x4sM5nwQMru9RvjjHYWVGltR50ZBw==", "dev": true, "requires": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.3.1", - "debug": "3.2.6", + "chokidar": "3.4.2", + "debug": "4.1.1", "diff": "4.0.2", - "escape-string-regexp": "1.0.5", - "find-up": "4.1.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", "glob": "7.1.6", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", + "js-yaml": "3.14.0", + "log-symbols": "4.0.0", "minimatch": "3.0.4", "ms": "2.1.2", "object.assign": "4.1.0", @@ -12803,9 +12944,9 @@ "dev": true }, "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", "dev": true, "requires": { "anymatch": "~3.1.1", @@ -12815,7 +12956,7 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" + "readdirp": "~3.4.0" } }, "cliui": { @@ -12830,9 +12971,9 @@ } }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -12844,6 +12985,12 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -12853,6 +13000,16 @@ "to-regex-range": "^5.0.1" } }, + "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" + } + }, "fsevents": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", @@ -12896,24 +13053,13 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "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": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^5.0.0" } }, "ms": { @@ -12922,37 +13068,43 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { - "p-try": "^2.0.0" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "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": "^2.0.0" + "p-limit": "^3.0.2" } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, "requires": { - "picomatch": "^2.0.7" + "randombytes": "^2.1.0" } }, "string-width": { @@ -13045,6 +13197,40 @@ "requires": { "locate-path": "^3.0.0" } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true } } }, @@ -13066,6 +13252,12 @@ "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", "dev": true }, + "module-alias": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", + "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==", + "dev": true + }, "module-not-found-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", @@ -13245,9 +13437,9 @@ } }, "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", "dev": true }, "node-fetch-npm": { @@ -13262,9 +13454,9 @@ } }, "node-forge": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz", - "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", "dev": true }, "node-gyp": { @@ -13329,6 +13521,16 @@ "minimist": "^1.2.5" } }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -13398,17 +13600,6 @@ "vm-browserify": "^1.0.1" }, "dependencies": { - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -13449,19 +13640,18 @@ } }, "node-releases": { - "version": "1.1.60", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", - "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", + "version": "1.1.61", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", + "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==", "dev": true }, "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dev": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1" } }, "normalize-package-data": { @@ -13885,15 +14075,15 @@ } }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, "object.defaults": { @@ -13916,6 +14106,27 @@ "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "object.map": { @@ -14224,14 +14435,14 @@ "dev": true }, "parse-json": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", - "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", + "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, @@ -14512,6 +14723,27 @@ "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", "iterate-value": "^1.0.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "promzard": { @@ -14743,14 +14975,13 @@ } }, "read-package-json": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.1.tgz", - "integrity": "sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", "dev": true, "requires": { "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "json-parse-better-errors": "^1.0.1", + "json-parse-even-better-errors": "^2.3.0", "normalize-package-data": "^2.0.0", "npm-normalize-package-bin": "^1.0.0" } @@ -14931,9 +15162,9 @@ "dev": true }, "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "dev": true, "requires": { "regenerate": "^1.4.0", @@ -15007,18 +15238,6 @@ "remove-bom-buffer": "^3.0.0", "safe-buffer": "^5.1.0", "through2": "^2.0.3" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } } }, "remove-trailing-separator": { @@ -15267,22 +15486,21 @@ "dev": true }, "retry-request": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.2.tgz", - "integrity": "sha512-fa4OwUcplhOYIhTm7zt6xsUfoApWo+auhvxbpPR4XLxHj0k67MhPItpCzYWzOEjtJlCH4MJ5V0qUrXiu/pOpag==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.3.tgz", + "integrity": "sha512-QnRZUpuPNgX0+D1xVxul6DbJ9slvo4Rm6iV/dn63e048MvGbUZiKySVt6Tenp04JqmchxjiLltGerOJys7kJYQ==", "dev": true, "requires": { - "debug": "^4.1.1", - "through2": "^3.0.1" + "debug": "^4.1.1" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -15338,9 +15556,9 @@ } }, "rollup-plugin-terser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.0.tgz", - "integrity": "sha512-p/N3lLiFusCjYTLfVkoaiRTOGr5AESEaljMPH12MhOtoMkmTBhIAfuadrcWy4am1U0vU4WTxO9fi0K09O4CboQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", @@ -15355,29 +15573,38 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true }, "terser": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.1.0.tgz", - "integrity": "sha512-pwC1Jbzahz1ZPU87NQ8B3g5pKbhyJSiHih4gLH6WZiPU8mmS1IlGbB0A2Nuvkj/LCNsgIKctg6GkYwWCeTvXZQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.3.tgz", + "integrity": "sha512-vRQDIlD+2Pg8YMwVK9kMM3yGylG95EIwzBai1Bw7Ot4OBfn3VP1TZn3EWx4ep2jERN/AmnVaTiGuelZSN7ds/A==", "dev": true, "requires": { "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" } } } }, "rollup-plugin-typescript2": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.27.2.tgz", - "integrity": "sha512-zarMH2F8oT/NO6p20gl/jkts+WxyzOlhOIUwUU/EDx5e6ewdDPS/flwLj5XFuijUCr64bZwqKuRVwCPdXXYefQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.27.3.tgz", + "integrity": "sha512-gmYPIFmALj9D3Ga1ZbTZAKTXq1JKlTQBtj299DXhqYz9cL3g/AQfUvbb2UhH+Nf++cCq941W2Mv7UcrcgLzJJg==", "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", @@ -15443,9 +15670,9 @@ } }, "rxjs": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", - "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -15473,9 +15700,9 @@ "dev": true }, "sass": { - "version": "1.26.10", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.10.tgz", - "integrity": "sha512-bzN0uvmzfsTvjz0qwccN1sPm2HxxpNI/Xa+7PlUEMS+nQvbyuEK7Y0qFqxlPHhiNHb1Ze8WQJtU31olMObkAMw==", + "version": "1.26.11", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.11.tgz", + "integrity": "sha512-W1l/+vjGjIamsJ6OnTe0K37U2DBO/dgsv2Z4c89XQ8ZOO6l/VwkqwLSqoYzJeJs6CLuGSTRWc91GbQFL3lvrvw==", "dev": true, "requires": { "chokidar": ">=2.0.0 <4.0.0" @@ -15494,15 +15721,6 @@ "rimraf": "^2.5.4" }, "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -15515,14 +15733,14 @@ } }, "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" } }, "selenium-assistant": { @@ -15692,9 +15910,9 @@ } }, "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -15856,9 +16074,9 @@ "dev": true }, "sinon": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.3.tgz", - "integrity": "sha512-IKo9MIM111+smz9JGwLmw5U1075n1YXeAq8YeSFlndCLhAL5KGn6bLgu7b/4AYHTV/LcEMcRm2wU2YiL55/6Pg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.1.0.tgz", + "integrity": "sha512-9zQShgaeylYH6qtsnNXlTvv0FGTTckuDfHBi+qhgj5PvW2r2WslHZpgc3uy3e/ZAoPkqaOASPi+juU6EdYRYxA==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.2", @@ -15877,9 +16095,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -16205,15 +16423,15 @@ } }, "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", "dev": true }, "spdx-license-list": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/spdx-license-list/-/spdx-license-list-6.2.0.tgz", - "integrity": "sha512-sHM1eQz+yYrKRIO5j/tzu3yWhbouQc2RYmCn5nNC296nVztW0VSlpJvmgsWPKAMEIqjfghXy3vvIwCbEOJPSHg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/spdx-license-list/-/spdx-license-list-6.3.0.tgz", + "integrity": "sha512-Qz8ru5VVK5T4cFOBrshIzggzrQ15fVBcpjpZLCVz2j9KNnpslGbw8w1r06v2vi6YP6bnUSY5CXsFCfUypLZ2GA==", "dev": true }, "split": { @@ -16241,18 +16459,6 @@ "dev": true, "requires": { "through2": "^2.0.2" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } } }, "sprintf-js": { @@ -16393,6 +16599,27 @@ "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "string.prototype.trimstart": { @@ -16403,6 +16630,27 @@ "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "string_decoder": { @@ -16560,28 +16808,28 @@ "dev": true }, "tar": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", - "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", + "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", "dev": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^3.0.0", - "minizlib": "^2.1.0", + "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "teeny-request": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.0.0.tgz", - "integrity": "sha512-kWD3sdGmIix6w7c8ZdVKxWq+3YwVPGWz+Mq0wRZXayEKY/YHb63b8uphfBzcFDmyq8frD9+UTc3wLyOhltRbtg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.0.1.tgz", + "integrity": "sha512-sasJmQ37klOlplL4Ia/786M5YlOcoLGQyq2TE4WHSRupbAuDaQW0PfVxV4MtdBtRJ4ngzS+1qim8zP6Zp35qCw==", "dev": true, "requires": { "http-proxy-agent": "^4.0.0", "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.2.0", + "node-fetch": "^2.6.1", "stream-events": "^1.0.5", "uuid": "^8.0.0" } @@ -16833,6 +17081,15 @@ "ajv-keywords": "^3.1.0" } }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -16904,13 +17161,13 @@ "dev": true }, "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, "through2-filter": { @@ -16921,18 +17178,6 @@ "requires": { "through2": "~2.0.0", "xtend": "~4.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } } }, "time-stamp": { @@ -17030,18 +17275,6 @@ "dev": true, "requires": { "through2": "^2.0.3" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } } }, "toidentifier": { @@ -17182,9 +17415,9 @@ "dev": true }, "uglify-js": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.1.tgz", - "integrity": "sha512-RjxApKkrPJB6kjJxQS3iZlf///REXWYxYJxO/MpmlQzVkDWVI3PSnCBWezMecmTU/TRkNxrl8bmsfFQCp+LO+Q==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.0.tgz", + "integrity": "sha512-e1KQFRCpOxnrJsJVqDUCjURq+wXvIn7cK2sRAx9XL3HYLL9aezOP4Pb1+Y3/o693EPk111Yj2Q+IUXxcpHlygQ==", "dev": true, "optional": true }, @@ -17213,9 +17446,9 @@ "dev": true }, "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", "dev": true, "requires": { "arr-flatten": "^1.0.1", @@ -17223,10 +17456,19 @@ "bach": "^1.0.0", "collection-map": "^1.0.0", "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", "last-run": "^1.1.0", "object.defaults": "^1.0.0", "object.reduce": "^1.0.0", "undertaker-registry": "^1.0.0" + }, + "dependencies": { + "fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=", + "dev": true + } } }, "undertaker-registry": { @@ -17380,9 +17622,9 @@ "dev": true }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -17548,9 +17790,9 @@ } }, "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", "dev": true, "requires": { "clone": "^2.1.1", @@ -17606,16 +17848,6 @@ "inherits": "^2.0.3", "pump": "^2.0.0" } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } } } }, @@ -17652,9 +17884,9 @@ "dev": true }, "vue-template-compiler": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.11.tgz", - "integrity": "sha512-KIq15bvQDrcCjpGjrAhx4mUlyyHfdmTaoNfeoATHLAiWB+MU3cx4lOzMwrnUh9cCxy0Lt1T11hAFY6TQgroUAA==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz", + "integrity": "sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==", "dev": true, "requires": { "de-indent": "^1.0.2", @@ -17809,10 +18041,28 @@ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, - "webpack": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz", - "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==", + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-v4": { + "version": "npm:webpack@4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", @@ -17841,9 +18091,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, "eslint-scope": { @@ -17908,21 +18158,188 @@ } } }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "webpack-v5": { + "version": "npm:webpack@5.0.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.0.0.tgz", + "integrity": "sha512-OK+Q9xGgda3idw/DgCf75XsVFxRLPu48qPwygqI3W9ls5sDdKif5Ay4SM/1UVob0w4juJy14Zv9nNv0WeyV0aA==", "dev": true, "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.45", + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^8.0.3", + "browserslist": "^4.14.3", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.2.0", + "eslint-scope": "^5.1.0", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.1.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "pkg-dir": "^4.2.0", + "schema-utils": "^3.0.0", + "tapable": "^2.0.0", + "terser-webpack-plugin": "^4.1.0", + "watchpack": "^2.0.0", + "webpack-sources": "^2.0.1" }, "dependencies": { + "acorn": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz", + "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.2.0.tgz", + "integrity": "sha512-NZlGLl8DxmZoq0uqPPtJfsCAir68uR047+Udsh1FH4+5ydGQdMurn/A430A1BtxASVmMEuS7/XiJ5OxJ9apAzQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.0.0" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-worker": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", + "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "loader-runner": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz", + "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==", + "dev": true + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tapable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.0.0.tgz", + "integrity": "sha512-bjzn0C0RWoffnNdTzNi7rNDhs1Zlwk2tRXgk8EiHKAOX1Mag3d6T0Y5zNa7l9CJ+EoUne/0UHdwS8tMbkh9zDg==", + "dev": true + }, + "terser": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.5.tgz", + "integrity": "sha512-Qw3CZAMmmfU824AoGKalx+riwocSI5Cs0PoGp9RdSLfmxkmJgyBxqLBP/isDNtFyhHnitikvRMZzyVgeq+U+Tg==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "dev": true, + "requires": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "watchpack": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.0.0.tgz", + "integrity": "sha512-xSdCxxYZWNk3VK13bZRYhsQpfa8Vg63zXG+3pyU8ouqSLRCv4IGXIp9Kr226q6GBkGRlZrST2wwKtjfKz2m7Cg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack-sources": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.0.1.tgz", + "integrity": "sha512-A9oYz7ANQBK5EN19rUXbvNgfdfZf5U2gP0769OXsj9CvYkCR6OHOsd6OKyEy4H38GGxpsQPKIL83NC64QY6Xmw==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + } } } }, diff --git a/package.json b/package.json index b9a0657ba..7897ce9e6 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "@rollup/plugin-multi-entry": "^4.0.0", "@rollup/plugin-node-resolve": "^9.0.0", "@rollup/plugin-replace": "^2.3.3", + "@types/estree": "0.0.45", "@typescript-eslint/eslint-plugin": "^2.30.0", "@typescript-eslint/parser": "^2.30.0", "acorn": "^8.0.1", @@ -76,7 +77,7 @@ "globby": "^11.0.1", "gulp": "^4.0.2", "gzip-size": "^5.1.1", - "html-webpack-plugin": "^4.3.0", + "html-webpack-plugin": "^4.5.0", "husky": "^4.2.5", "jsdoc": "^3.6.5", "jsdoc-baseline": "^0.1.5", @@ -84,6 +85,7 @@ "memory-fs": "^0.5.0", "minimist": "^1.2.5", "mocha": "^8.1.1", + "module-alias": "^2.2.2", "nunjucks": "^3.2.2", "nyc": "^15.1.0", "proxyquire": "^2.1.3", @@ -99,7 +101,8 @@ "tempy": "^0.6.0", "typescript": "^3.9.7", "upath": "^1.2.0", - "webpack": "^4.44.1", + "webpack-v4": "npm:webpack@^4.44.2", + "webpack-v5": "npm:webpack@^5.0.0", "worker-plugin": "^5.0.0" } } diff --git a/packages/workbox-webpack-plugin/package-lock.json b/packages/workbox-webpack-plugin/package-lock.json index 2294f26d4..56f4d6dd7 100644 --- a/packages/workbox-webpack-plugin/package-lock.json +++ b/packages/workbox-webpack-plugin/package-lock.json @@ -4,1617 +4,15 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/compat-data": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.4.tgz", - "integrity": "sha512-t+rjExOrSVvjQQXNp5zAIYDp00KjdvGl/TpDX5REPr0S9IAIPQMTilcfG6q8c0QFmj9lSTVySV2VTsyggvtNIw==", - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } - }, - "@babel/core": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.4.tgz", - "integrity": "sha512-3A0tS0HWpy4XujGc7QtOIHTeNwUgWaZc/WuS5YQrfhU67jnVmsD6OGPc1AKHH0LJHQICGncy3+YUjIhVlfDdcA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.4", - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", - "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", - "requires": { - "@babel/types": "^7.10.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", - "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", - "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", - "requires": { - "@babel/compat-data": "^7.10.4", - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.4.tgz", - "integrity": "sha512-9raUiOsXPxzzLjCXeosApJItoMnX3uyT4QdM2UldffuGApNrF8e938MwNpDCK9CPoyxrEoCgT+hObJc3mZa6lQ==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" - } - }, - "@babel/helper-define-map": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.4.tgz", - "integrity": "sha512-nIij0oKErfCnLUCWaCaHW0Bmtl2RO9cN7+u2QT8yqTywgALKlyUVOvHDElh+b5DwVC6YB1FOYFOTWcN/+41EDA==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.4", - "lodash": "^4.17.13" - } - }, - "@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==", - "requires": { - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", - "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz", - "integrity": "sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4", - "lodash": "^4.17.13" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "@babel/helper-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.4.tgz", - "integrity": "sha512-inWpnHGgtg5NOF0eyHlC0/74/VkdRITY9dtTpB2PrxKKn+AkVMRiZz/Adrx+Ssg+MLDesi2zohBW6MVq6b4pOQ==", - "requires": { - "lodash": "^4.17.13" - } - }, - "@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==", - "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" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==" - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz", - "integrity": "sha512-MJbxGSmejEFVOANAezdO39SObkURO5o/8b6fSH6D1pi9RZQt+ldppKPXfqgUWpSQ9asM6xaSaSJIaeWMDRP0Zg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz", - "integrity": "sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz", - "integrity": "sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", - "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.4.tgz", - "integrity": "sha512-J3b5CluMg3hPUii2onJDRiaVbPtKFPLEaV5dOPY5OeAbDi1iU/UbbFFTgwb7WnanaDy7bjU35kc26W3eM5Qa0A==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "lodash": "^4.17.13" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.4.tgz", - "integrity": "sha512-3Fw+H3WLUrTlzi3zMiZWp3AR4xadAEMv6XRCYnd5jAlLM61Rn+CRJaZMaNvIpcJpQ3vs1kyifYvEVPFfoSkKOA==", - "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", - "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.4.tgz", - "integrity": "sha512-Tb28LlfxrTiOTGtZFsvkjpyjCl9IoaRI52AEU/VIwOwvDQWtbNJsAqTXzh+5R7i74e/OZHH2c2w2fsOqAfnQYQ==", - "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", - "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.4.tgz", - "integrity": "sha512-RurVtZ/D5nYfEg0iVERXYKEgDFeesHrHfx8RT05Sq57ucj2eOYAP6eu5fynL4Adju4I/mP/I6SO0DqNWAXjfLQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz", - "integrity": "sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.4.tgz", - "integrity": "sha512-4NErciJkAYe+xI5cqfS8pV/0ntlY5N5Ske/4ImxAVX7mk9Rxt2bwDTGv1Msc2BRJvWQcmYEC+yoMLdX22aE4VQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", - "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/preset-env": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.4.tgz", - "integrity": "sha512-tcmuQ6vupfMZPrLrc38d0sF2OjLT3/bZ0dry5HchNCQbrokoQi4reXqclvkkAT5b+gWc23meVWpve5P/7+w/zw==", - "requires": { - "@babel/compat-data": "^7.10.4", - "@babel/helper-compilation-targets": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-proposal-async-generator-functions": "^7.10.4", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-json-strings": "^7.10.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-numeric-separator": "^7.10.4", - "@babel/plugin-proposal-object-rest-spread": "^7.10.4", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.10.4", - "@babel/plugin-proposal-private-methods": "^7.10.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.10.4", - "@babel/plugin-transform-arrow-functions": "^7.10.4", - "@babel/plugin-transform-async-to-generator": "^7.10.4", - "@babel/plugin-transform-block-scoped-functions": "^7.10.4", - "@babel/plugin-transform-block-scoping": "^7.10.4", - "@babel/plugin-transform-classes": "^7.10.4", - "@babel/plugin-transform-computed-properties": "^7.10.4", - "@babel/plugin-transform-destructuring": "^7.10.4", - "@babel/plugin-transform-dotall-regex": "^7.10.4", - "@babel/plugin-transform-duplicate-keys": "^7.10.4", - "@babel/plugin-transform-exponentiation-operator": "^7.10.4", - "@babel/plugin-transform-for-of": "^7.10.4", - "@babel/plugin-transform-function-name": "^7.10.4", - "@babel/plugin-transform-literals": "^7.10.4", - "@babel/plugin-transform-member-expression-literals": "^7.10.4", - "@babel/plugin-transform-modules-amd": "^7.10.4", - "@babel/plugin-transform-modules-commonjs": "^7.10.4", - "@babel/plugin-transform-modules-systemjs": "^7.10.4", - "@babel/plugin-transform-modules-umd": "^7.10.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", - "@babel/plugin-transform-new-target": "^7.10.4", - "@babel/plugin-transform-object-super": "^7.10.4", - "@babel/plugin-transform-parameters": "^7.10.4", - "@babel/plugin-transform-property-literals": "^7.10.4", - "@babel/plugin-transform-regenerator": "^7.10.4", - "@babel/plugin-transform-reserved-words": "^7.10.4", - "@babel/plugin-transform-shorthand-properties": "^7.10.4", - "@babel/plugin-transform-spread": "^7.10.4", - "@babel/plugin-transform-sticky-regex": "^7.10.4", - "@babel/plugin-transform-template-literals": "^7.10.4", - "@babel/plugin-transform-typeof-symbol": "^7.10.4", - "@babel/plugin-transform-unicode-escapes": "^7.10.4", - "@babel/plugin-transform-unicode-regex": "^7.10.4", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.10.4", - "browserslist": "^4.12.0", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", - "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.4.tgz", - "integrity": "sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", - "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" - }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", - "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" - } - }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", - "requires": { - "@hapi/hoek": "^8.3.0" - } - }, - "@rollup/plugin-node-resolve": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", - "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", - "requires": { - "@rollup/pluginutils": "^3.0.8", - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.14.2" - } - }, - "@rollup/plugin-replace": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.3.3.tgz", - "integrity": "sha512-XPmVXZ7IlaoWaJLkSCDaa0Y6uVo5XQYHhiMFzOd5qSv5rE+t/UJToPIOE56flKIxBFQI27ONsxb7dqHnwSsjKQ==", - "requires": { - "@rollup/pluginutils": "^3.0.8", - "magic-string": "^0.25.5" - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - }, - "@surma/rollup-plugin-off-main-thread": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.1.tgz", - "integrity": "sha512-ZPBWYQDdO4JZiTmTP3DABsHhIPA7bEJk9Znk7tZsrbPGanoGo8YxMv//WLx5Cvb+lRgS42+6yiOIYYHCKDmkpQ==", - "requires": { - "ejs": "^2.6.1", - "magic-string": "^0.25.0" - } - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" - }, - "@types/node": { - "version": "14.0.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.14.tgz", - "integrity": "sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ==" - }, - "@types/resolve": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", - "requires": { - "@types/node": "*" - } - }, - "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-extract-comments": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", - "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", - "requires": { - "babylon": "^6.18.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "browserslist": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.2.tgz", - "integrity": "sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw==", - "requires": { - "caniuse-lite": "^1.0.30001088", - "electron-to-chromium": "^1.3.483", - "escalade": "^3.0.1", - "node-releases": "^1.1.58" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==" - }, - "caniuse-lite": { - "version": "1.0.30001090", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001090.tgz", - "integrity": "sha512-QzPRKDCyp7RhjczTPZaqK3CjPA5Ht2UnXhZhCI4f7QiB5JK6KEuZBxIzyWnB3wO4hgAj4GMRxAhuiacfw0Psjg==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" - }, - "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", - "requires": { - "browserslist": "^4.8.5", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" - }, - "electron-to-chromium": { - "version": "1.3.483", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.483.tgz", - "integrity": "sha512-+05RF8S9rk8S0G8eBCqBRBaRq7+UN3lDs2DAvnG8SBSgQO3hjy0+qt4CmRk5eiuGbTcaicgXfPmBi31a+BD3lg==" - }, - "escalade": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.1.tgz", - "integrity": "sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "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==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "requires": { - "leven": "^3.1.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node-releases": { - "version": "1.1.58", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", - "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" - }, "pretty-bytes": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", - "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==" - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" - }, - "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==" - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - }, - "regenerator-transform": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", - "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", - "requires": { - "@babel/runtime": "^7.8.4", - "private": "^0.1.8" - } - }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - } - } - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "rollup": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", - "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", - "requires": { - "@types/estree": "*", - "@types/node": "*", - "acorn": "^7.1.0" - } - }, - "rollup-plugin-babel": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", - "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "rollup-pluginutils": "^2.8.1" - } - }, - "rollup-plugin-terser": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.0.tgz", - "integrity": "sha512-XGMJihTIO3eIBsVGq7jiNYOdDMb3pVxuzY0uhOE/FM4x/u9nQgr3+McsjzqBn3QfHIpNSZmFnpoKAwHBEcsT7g==", - "requires": { - "@babel/code-frame": "^7.5.5", - "jest-worker": "^24.9.0", - "rollup-pluginutils": "^2.8.2", - "serialize-javascript": "^2.1.2", - "terser": "^4.6.2" - } - }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "requires": { - "estree-walker": "^0.6.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.4.1.tgz", + "integrity": "sha512-s1Iam6Gwz3JI5Hweaz4GoCD1WUNUIyzePFy5+Js2hjwGVt2Z79wNN+ZKOZ2vB6C+Xs6njyB84Z1IthQg8d9LxA==" }, "source-list-map": { "version": "2.0.1", @@ -1626,124 +24,11 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - } - }, - "strip-comments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", - "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", - "requires": { - "babel-extract-comments": "^1.0.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" - }, - "tempy": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", - "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", - "requires": { - "temp-dir": "^1.0.0", - "type-fest": "^0.3.1", - "unique-string": "^1.0.0" - } - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -1757,172 +42,6 @@ "source-list-map": "^2.0.0", "source-map": "~0.6.1" } - }, - "workbox-background-sync": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.3.tgz", - "integrity": "sha512-V/R95aPxYjbKCaVzUTihrZ9ObGOnzoA5n60r0DQ747p8Pj15/dDTYixonKhhlvavTiNezUrp+wTQBvZvcd/ETA==", - "requires": { - "workbox-core": "^5.1.3" - } - }, - "workbox-broadcast-update": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.3.tgz", - "integrity": "sha512-HJ7FDmgweRcYp8fMiFbkmhaTjMYhMByURe5+TempnCi7cT5NNbyaG4T+rg8NWYxAeumSAB3JQF6XD/z34vRRHA==", - "requires": { - "workbox-core": "^5.1.3" - } - }, - "workbox-build": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.3.tgz", - "integrity": "sha512-cssa2cKAi/FNp2P2m2DjF/UsXlVX6b1HgkXOjBTraFkIeyZEKxN1F1DnxOpGkdM/bPPRa7y5OmUvjOpgOd9apA==", - "requires": { - "@babel/core": "^7.8.4", - "@babel/preset-env": "^7.8.4", - "@babel/runtime": "^7.8.4", - "@hapi/joi": "^15.1.0", - "@rollup/plugin-node-resolve": "^7.1.1", - "@rollup/plugin-replace": "^2.3.1", - "@surma/rollup-plugin-off-main-thread": "^1.1.1", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^8.1.0", - "glob": "^7.1.6", - "lodash.template": "^4.5.0", - "pretty-bytes": "^5.3.0", - "rollup": "^1.31.1", - "rollup-plugin-babel": "^4.3.3", - "rollup-plugin-terser": "^5.2.0", - "source-map": "^0.7.3", - "source-map-url": "^0.4.0", - "stringify-object": "^3.3.0", - "strip-comments": "^1.0.2", - "tempy": "^0.3.0", - "upath": "^1.2.0", - "workbox-background-sync": "^5.1.3", - "workbox-broadcast-update": "^5.1.3", - "workbox-cacheable-response": "^5.1.3", - "workbox-core": "^5.1.3", - "workbox-expiration": "^5.1.3", - "workbox-google-analytics": "^5.1.3", - "workbox-navigation-preload": "^5.1.3", - "workbox-precaching": "^5.1.3", - "workbox-range-requests": "^5.1.3", - "workbox-routing": "^5.1.3", - "workbox-strategies": "^5.1.3", - "workbox-streams": "^5.1.3", - "workbox-sw": "^5.1.3", - "workbox-window": "^5.1.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } - }, - "workbox-cacheable-response": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.3.tgz", - "integrity": "sha512-lOJEwK2T4KWFNdhRFUKxTPBIO5hIYm9E/nYgMq5h/IH3iHPHlBPuFwRMaQy+TTCGWWTA85NomQOjVw1bj65RLw==", - "requires": { - "workbox-core": "^5.1.3" - } - }, - "workbox-core": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.3.tgz", - "integrity": "sha512-TFSIPxxciX9sFaj0FDiohBeIKpwMcCyNduydi9i3LChItcndDS6TJpErxybv8aBWeCMraXt33TWtF6kKuIObNw==" - }, - "workbox-expiration": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.3.tgz", - "integrity": "sha512-8YhpmIHqIx+xmtxONADc+di4a3zzCsvVHLiKq6T3vJZUPnqV2jzx+51+UHMUh3T5w5Z5SFC14l0V/jesRbuMKg==", - "requires": { - "workbox-core": "^5.1.3" - } - }, - "workbox-google-analytics": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.3.tgz", - "integrity": "sha512-ouK6xIJa+raFcO29TgwKFU/Hv1ejqSYzCzH9lI2B/4z/Wdnb8maL6mMIojQ8j5SohwKswMZmLDl0Az2PCmX11w==", - "requires": { - "workbox-background-sync": "^5.1.3", - "workbox-core": "^5.1.3", - "workbox-routing": "^5.1.3", - "workbox-strategies": "^5.1.3" - } - }, - "workbox-navigation-preload": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.3.tgz", - "integrity": "sha512-29SPQMAccOgbq3BT9Gz7k+ydy0mcKKR0Rmkmd46tnujutiL4ooE57fBhwsA+c6OlLcYdisvilKlV2YWEtKWfgQ==", - "requires": { - "workbox-core": "^5.1.3" - } - }, - "workbox-precaching": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.3.tgz", - "integrity": "sha512-9jjBiB00AOI0NnI320ddnhvlL3bjMrDoI3211kEaxcRWh0N2fX25uVn0O8N8u1gWY4tIfwZAn/DgtAU13cFhYA==", - "requires": { - "workbox-core": "^5.1.3" - } - }, - "workbox-range-requests": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.3.tgz", - "integrity": "sha512-uUvEoyEUx86LJc7mtmy/6U8xuK0guXU2FnPimt17zDbsC8FSOaPxc92rxtD6xmDSYrI4FqIebypBCjgIe+sfxA==", - "requires": { - "workbox-core": "^5.1.3" - } - }, - "workbox-routing": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.3.tgz", - "integrity": "sha512-F+sAp9Iy3lVl3BEG+pzXWVq4AftzjiFpHDaZ4Kf4vLoBoKQE0hIHet4zE5DpHqYdyw+Udhp4wrfHamX6PN6z1Q==", - "requires": { - "workbox-core": "^5.1.3" - } - }, - "workbox-strategies": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.3.tgz", - "integrity": "sha512-wiXHfmOKnWABeIVW+/ye0e00+2CcS5y7SIj2f9zcdy2ZLEbcOf7B+yOl5OrWpBGlTUwRjIYhV++ZqiKm3Dc+8w==", - "requires": { - "workbox-core": "^5.1.3", - "workbox-routing": "^5.1.3" - } - }, - "workbox-streams": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.3.tgz", - "integrity": "sha512-8kt70eBd1RXL0qenxEnch3Cd7VyW3O0CkeGBN4Bikt307nIV5Q0JciLA5o0CRteijawYOiTq0/px4GDBv1obgQ==", - "requires": { - "workbox-core": "^5.1.3", - "workbox-routing": "^5.1.3" - } - }, - "workbox-sw": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.3.tgz", - "integrity": "sha512-Syk6RhYr/8VdFwXrxo5IpVz8Og2xapHTWJhqsZRF+TbxSvlaJs8hrvVPd7edn5ZiiVdPhE9NTeOTOg1+D+FGoA==" - }, - "workbox-window": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.3.tgz", - "integrity": "sha512-oYvfVtPLET7FUrhOzbk0R+aATVmpdQBkmDqwyFH4W2dfVqJXTvTXzuGP5Pn9oZ8jMTB3AYW43yhYBlLYM3mYyg==", - "requires": { - "workbox-core": "^5.1.3" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" } } } diff --git a/packages/workbox-webpack-plugin/package.json b/packages/workbox-webpack-plugin/package.json index 801a1e6c3..7cacf2d95 100644 --- a/packages/workbox-webpack-plugin/package.json +++ b/packages/workbox-webpack-plugin/package.json @@ -24,13 +24,14 @@ }, "dependencies": { "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", "source-map-url": "^0.4.0", "upath": "^1.2.0", "webpack-sources": "^1.4.3", "workbox-build": "^6.0.0-alpha.2" }, "peerDependencies": { - "webpack": "^4.0.0" + "webpack": "^4.4.0 || ^5.0.0" }, "author": "Google's Web DevRel Team", "license": "MIT", diff --git a/packages/workbox-webpack-plugin/src/generate-sw.js b/packages/workbox-webpack-plugin/src/generate-sw.js index 32cc31a31..48eac8eca 100644 --- a/packages/workbox-webpack-plugin/src/generate-sw.js +++ b/packages/workbox-webpack-plugin/src/generate-sw.js @@ -6,11 +6,12 @@ https://opensource.org/licenses/MIT. */ -const {RawSource} = require('webpack-sources'); const bundle = require('workbox-build/build/lib/bundle'); const populateSWTemplate = require('workbox-build/build/lib/populate-sw-template'); +const prettyBytes = require('pretty-bytes'); const validate = require('workbox-build/build/lib/validate-options'); +const webpack = require('webpack'); const webpackGenerateSWSchema = require( 'workbox-build/build/options/schema/webpack-generate-sw'); @@ -19,6 +20,10 @@ const getManifestEntriesFromCompilation = require('./lib/get-manifest-entries-from-compilation'); const relativeToOutputPath = require('./lib/relative-to-output-path'); +// webpack v4/v5 compatibility: +// https://github.com/webpack/webpack/issues/11425#issuecomment-686607633 +const {RawSource} = webpack.sources || require('webpack-sources'); + // Used to keep track of swDest files written by *any* instance of this plugin. // See https://github.com/GoogleChrome/workbox/issues/2181 const _generatedAssetNames = new Set(); @@ -213,11 +218,29 @@ class GenerateSW { apply(compiler) { this.propagateWebpackConfig(compiler); - compiler.hooks.emit.tapPromise( - this.constructor.name, - (compilation) => this.handleEmit(compilation).catch( - (error) => compilation.errors.push(error)), - ); + // webpack v4/v5 compatibility: + // https://github.com/webpack/webpack/issues/11425#issuecomment-690387207 + if (webpack.version.startsWith('4.')) { + compiler.hooks.emit.tapPromise( + this.constructor.name, + (compilation) => this.addAssets(compilation).catch( + (error) => compilation.errors.push(error)), + ); + } else { + // Specifically hook into thisCompilation, as per + // https://github.com/webpack/webpack/issues/11425#issuecomment-690547848 + compiler.hooks.thisCompilation.tap( + this.constructor.name, (compilation) => { + compilation.hooks.processAssets.tapPromise({ + name: this.constructor.name, + // See https://github.com/webpack/webpack/blob/9230acbf1a39a8afb2e34f41e2fd7326eef84968/lib/Compilation.js#L3376-L3381 + stage: webpack.Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE, + }, () => this.addAssets(compilation).catch( + (error) => compilation.errors.push(error)), + ); + }, + ); + } } /** @@ -225,7 +248,7 @@ class GenerateSW { * * @private */ - async handleEmit(compilation) { + async addAssets(compilation) { // See https://github.com/GoogleChrome/workbox/issues/1790 if (this.alreadyCalled) { compilation.warnings.push(`${this.constructor.name} has been called ` + @@ -265,8 +288,9 @@ class GenerateSW { .concat(scripts); } - config.manifestEntries = await getManifestEntriesFromCompilation( + const {size, sortedEntries} = await getManifestEntriesFromCompilation( compilation, config); + config.manifestEntries = sortedEntries; const unbundledCode = populateSWTemplate(config); @@ -280,9 +304,15 @@ class GenerateSW { }); for (const file of files) { - compilation.assets[file.name] = new RawSource(file.contents); + compilation.emitAsset(file.name, new RawSource(file.contents)); _generatedAssetNames.add(file.name); } + + if (compilation.getLogger) { + const logger = compilation.getLogger(this.constructor.name); + logger.info(`The service worker at ${config.swDest} will precache + ${config.manifestEntries.length} URLs, totaling ${prettyBytes(size)}.`); + } } } diff --git a/packages/workbox-webpack-plugin/src/inject-manifest.js b/packages/workbox-webpack-plugin/src/inject-manifest.js index 5d566c4b8..9731347f6 100644 --- a/packages/workbox-webpack-plugin/src/inject-manifest.js +++ b/packages/workbox-webpack-plugin/src/inject-manifest.js @@ -6,13 +6,13 @@ https://opensource.org/licenses/MIT. */ -const {RawSource} = require('webpack-sources'); -const {SingleEntryPlugin} = require('webpack'); +const prettyBytes = require('pretty-bytes'); const replaceAndUpdateSourceMap = require( 'workbox-build/build/lib/replace-and-update-source-map'); const stringify = require('fast-json-stable-stringify'); const upath = require('upath'); const validate = require('workbox-build/build/lib/validate-options'); +const webpack = require('webpack'); const webpackInjectManifestSchema = require( 'workbox-build/build/options/schema/webpack-inject-manifest'); @@ -25,6 +25,13 @@ const relativeToOutputPath = require('./lib/relative-to-output-path'); // See https://github.com/GoogleChrome/workbox/issues/2181 const _generatedAssetNames = new Set(); +// SingleEntryPlugin in v4 was renamed to EntryPlugin in v5. +const SingleEntryPlugin = webpack.EntryPlugin || webpack.SingleEntryPlugin; + +// webpack v4/v5 compatibility: +// https://github.com/webpack/webpack/issues/11425#issuecomment-686607633 +const {RawSource} = webpack.sources || require('webpack-sources'); + /** * This class supports compiling a service worker file provided via `swSrc`, * and injecting into that service worker a list of URLs and revision @@ -150,11 +157,29 @@ class InjectManifest { (error) => compilation.errors.push(error)), ); - compiler.hooks.emit.tapPromise( - this.constructor.name, - (compilation) => this.handleEmit(compilation).catch( - (error) => compilation.errors.push(error)), - ); + // webpack v4/v5 compatibility: + // https://github.com/webpack/webpack/issues/11425#issuecomment-690387207 + if (webpack.version.startsWith('4.')) { + compiler.hooks.emit.tapPromise( + this.constructor.name, + (compilation) => this.addAssets(compilation).catch( + (error) => compilation.errors.push(error)), + ); + } else { + // Specifically hook into thisCompilation, as per + // https://github.com/webpack/webpack/issues/11425#issuecomment-690547848 + compiler.hooks.thisCompilation.tap( + this.constructor.name, (compilation) => { + compilation.hooks.processAssets.tapPromise({ + name: this.constructor.name, + // See https://github.com/webpack/webpack/blob/9230acbf1a39a8afb2e34f41e2fd7326eef84968/lib/Compilation.js#L3376-L3381 + stage: webpack.Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE, + }, () => this.addAssets(compilation).catch( + (error) => compilation.errors.push(error)), + ); + }, + ); + } } /** @@ -215,7 +240,7 @@ class InjectManifest { addSrcToAssets(compilation, parentCompiler) { const source = parentCompiler.inputFileSystem.readFileSync( this.config.swSrc).toString(); - compilation.assets[this.config.swDest] = new RawSource(source); + compilation.emitAsset(this.config.swDest, new RawSource(source)); } /** @@ -247,7 +272,7 @@ class InjectManifest { * * @private */ - async handleEmit(compilation) { + async addAssets(compilation) { // See https://github.com/GoogleChrome/workbox/issues/1790 if (this.alreadyCalled) { const warningMessage = `${this.constructor.name} has been called ` + @@ -273,42 +298,49 @@ class InjectManifest { const absoluteSwSrc = upath.resolve(this.config.swSrc); compilation.fileDependencies.add(absoluteSwSrc); - const swAsset = compilation.assets[config.swDest]; - const initialSWAssetString = swAsset.source(); + const swAsset = compilation.getAsset(config.swDest); + const swAssetString = swAsset.source.source(); - if (!initialSWAssetString.includes(config.injectionPoint)) { + if (!swAssetString.includes(config.injectionPoint)) { throw new Error(`Can't find ${config.injectionPoint} in your SW source.`); } - const manifestEntries = await getManifestEntriesFromCompilation( + const {size, sortedEntries} = await getManifestEntriesFromCompilation( compilation, config); - let manifestString = stringify(manifestEntries); + let manifestString = stringify(sortedEntries); if (this.config.compileSrc) { // See https://github.com/GoogleChrome/workbox/issues/2263 manifestString = manifestString.replace(/"/g, `'`); } const sourcemapAssetName = getSourcemapAssetName( - compilation, initialSWAssetString, config.swDest); + compilation, swAssetString, config.swDest); if (sourcemapAssetName) { - const sourcemapAsset = compilation.assets[sourcemapAssetName]; + _generatedAssetNames.add(sourcemapAssetName); + const sourcemapAsset = compilation.getAsset(sourcemapAssetName); const {source, map} = await replaceAndUpdateSourceMap({ jsFilename: config.swDest, - originalMap: JSON.parse(sourcemapAsset.source()), - originalSource: initialSWAssetString, + originalMap: JSON.parse(sourcemapAsset.source.source()), + originalSource: swAssetString, replaceString: manifestString, searchString: config.injectionPoint, }); - compilation.assets[sourcemapAssetName] = new RawSource(map); - compilation.assets[config.swDest] = new RawSource(source); + compilation.updateAsset(sourcemapAssetName, new RawSource(map)); + compilation.updateAsset(config.swDest, new RawSource(source)); } else { // If there's no sourcemap associated with swDest, a simple string // replacement will suffice. - compilation.assets[config.swDest] = new RawSource( - initialSWAssetString.replace(config.injectionPoint, manifestString)); + compilation.updateAsset(config.swDest, new RawSource( + swAssetString.replace(config.injectionPoint, manifestString))); + } + + if (compilation.getLogger) { + const logger = compilation.getLogger(this.constructor.name); + logger.info(`The service worker at ${config.swDest} will precache + ${sortedEntries.length} URLs, totaling ${prettyBytes(size)}.`); } } } diff --git a/packages/workbox-webpack-plugin/src/lib/get-asset-hash.js b/packages/workbox-webpack-plugin/src/lib/get-asset-hash.js index cb7aff48e..b68b7e650 100644 --- a/packages/workbox-webpack-plugin/src/lib/get-asset-hash.js +++ b/packages/workbox-webpack-plugin/src/lib/get-asset-hash.js @@ -15,7 +15,12 @@ const crypto = require('crypto'); * @private */ module.exports = (asset) => { + // TODO: Check asset.info.immutable and use null when set. + // if (asset.info.immutable) { + // return null; + // } + return crypto.createHash('md5') - .update(Buffer.from(asset.source())) + .update(Buffer.from(asset.source.source())) .digest('hex'); }; diff --git a/packages/workbox-webpack-plugin/src/lib/get-manifest-entries-from-compilation.js b/packages/workbox-webpack-plugin/src/lib/get-manifest-entries-from-compilation.js index 24ab767f4..1eaf7abbc 100644 --- a/packages/workbox-webpack-plugin/src/lib/get-manifest-entries-from-compilation.js +++ b/packages/workbox-webpack-plugin/src/lib/get-manifest-entries-from-compilation.js @@ -41,38 +41,22 @@ function checkConditions(asset, compilation, conditions = []) { } /** - * Creates a mapping of an asset name to an Set of zero or more chunk names - * that the asset is associated with. + * Returns the names of all the assets in a chunk group. * - * Those chunk names come from a combination of the `chunkName` property on the - * asset, as well as the `stats.namedChunkGroups` property. That is the only - * way to find out if an asset has an implicit descendent relationship with a - * chunk, if it was, e.g., created by `SplitChunksPlugin`. - * - * See https://github.com/GoogleChrome/workbox/issues/1859 - * See https://github.com/webpack/webpack/issues/7073 - * - * @param {Object} stats The webpack compilation stats. - * @return {object>} + * @param {ChunkGroup} chunkGroup + * @return {Array} * @private */ -function assetToChunkNameMapping(stats) { - const mapping = {}; - - for (const asset of stats.assets) { - mapping[asset.name] = new Set(asset.chunkNames); - } - - for (const [chunkName, {assets}] of Object.entries(stats.namedChunkGroups)) { - for (const assetName of assets) { - // See https://github.com/GoogleChrome/workbox/issues/2194 - if (mapping[assetName]) { - mapping[assetName].add(chunkName); - } +function getNamesOfAssetsInChunkGroup(chunkGroup) { + const assetNames = []; + for (const chunk of chunkGroup.chunks) { + assetNames.splice(0, 0, ...chunk.files); + // This only appears to be set in webpack v5. + if (chunk.auxiliaryFiles) { + assetNames.splice(0, 0, ...chunk.auxiliaryFiles); } } - - return mapping; + return assetNames; } /** @@ -88,47 +72,51 @@ function assetToChunkNameMapping(stats) { */ function filterAssets(compilation, config) { const filteredAssets = new Set(); - // See https://webpack.js.org/configuration/stats/#stats - // We only need assets and chunkGroups here. - const stats = compilation.getStats().toJson({ - assets: true, - chunkGroups: true, - }); - - const assetNameToChunkNames = assetToChunkNameMapping(stats); + const assets = compilation.getAssets(); + const allowedAssetNames = new Set(); // See https://github.com/GoogleChrome/workbox/issues/1287 if (Array.isArray(config.chunks)) { - for (const chunk of config.chunks) { - if (!(chunk in stats.namedChunkGroups)) { - compilation.warnings.push(`The chunk '${chunk}' was provided in ` + - `your Workbox chunks config, but was not found in the compilation.`); + for (const chunkName of config.chunks) { + const namedChunkGroup = compilation.namedChunkGroups.get(chunkName); + if (namedChunkGroup) { + for (const assetName of getNamesOfAssetsInChunkGroup(namedChunkGroup)) { + allowedAssetNames.add(assetName); + } + } else { + compilation.warnings.push(`The chunk '${chunkName}' was ` + + `provided in your Workbox chunks config, but was not found in the ` + + `compilation.`); } } } - // See https://webpack.js.org/api/stats/#asset-objects - for (const asset of stats.assets) { - // chunkName based filtering is funky because: - // - Each asset might belong to one or more chunkNames. + const deniedAssetNames = new Set(); + if (Array.isArray(config.excludeChunks)) { + for (const chunkName of config.excludeChunks) { + const namedChunkGroup = compilation.namedChunkGroups.get(chunkName); + if (namedChunkGroup) { + for (const assetName of getNamesOfAssetsInChunkGroup(namedChunkGroup)) { + deniedAssetNames.add(assetName); + } + } // Don't warn if the chunk group isn't found. + } + } + + for (const asset of assets) { + // chunk based filtering is funky because: + // - Each asset might belong to one or more chunks. // - If *any* of those chunk names match our config.excludeChunks, // then we skip that asset. // - If the config.chunks is defined *and* there's no match // between at least one of the chunkNames and one entry, then // we skip that assets as well. - const isExcludedChunk = Array.isArray(config.excludeChunks) && - config.excludeChunks.some((chunkName) => { - return assetNameToChunkNames[asset.name].has(chunkName); - }); - if (isExcludedChunk) { + + if (deniedAssetNames.has(asset.name)) { continue; } - const isIncludedChunk = !Array.isArray(config.chunks) || - config.chunks.some((chunkName) => { - return assetNameToChunkNames[asset.name].has(chunkName); - }); - if (!isIncludedChunk) { + if (Array.isArray(config.chunks) && !allowedAssetNames.has(asset.name)) { continue; } @@ -152,48 +140,40 @@ function filterAssets(compilation, config) { return filteredAssets; } -module.exports = async (compilation, config) => { - const filteredAssets = filterAssets(compilation, config); - - const {publicPath} = compilation.options.output; - const fileDetails = []; - - for (const asset of filteredAssets) { - // Not sure why this would be false, but checking just in case, since - // our original list of assets comes from compilation.getStats().toJson(), - // not from compilation.assets. - if (asset.name in compilation.assets) { - // This matches the format expected by transformManifest(). - fileDetails.push({ - file: resolveWebpackURL(publicPath, asset.name), - hash: getAssetHash(compilation.assets[asset.name]), - size: asset.size || 0, - }); - } else { - compilation.warnings.push(`Could not precache ${asset.name}, as it's ` + - `missing from compilation.assets. Please open a bug against Workbox ` + - `with details about your webpack config.`); +module.exports = async (mainCompilation, config) => { + const filteredAssets = new Set(); + // children will be set for, e.g., html-webpack-plugin. + for (const compilation of [mainCompilation, ...mainCompilation.children]) { + for (const asset of filterAssets(compilation, config)) { + filteredAssets.add(asset); } } - // We also get back `size` and `count`, and it would be nice to log that - // somewhere, but... webpack doesn't offer info-level logs? - // https://github.com/webpack/webpack/issues/3996 - const {manifestEntries, warnings} = await transformManifest({ + const {publicPath} = mainCompilation.options.output; + + const fileDetails = Array.from(filteredAssets).map((asset) => { + return { + file: resolveWebpackURL(publicPath, asset.name), + hash: getAssetHash(asset), + size: asset.source.size() || 0, + }; + }); + + const {manifestEntries, size, warnings} = await transformManifest({ fileDetails, additionalManifestEntries: config.additionalManifestEntries, dontCacheBustURLsMatching: config.dontCacheBustURLsMatching, manifestTransforms: config.manifestTransforms, maximumFileSizeToCacheInBytes: config.maximumFileSizeToCacheInBytes, modifyURLPrefix: config.modifyURLPrefix, - transformParam: compilation, + transformParam: mainCompilation, }); - compilation.warnings = compilation.warnings.concat(warnings || []); + mainCompilation.warnings = mainCompilation.warnings.concat(warnings || []); // Ensure that the entries are properly sorted by URL. const sortedEntries = manifestEntries.sort( (a, b) => a.url === b.url ? 0 : (a.url > b.url ? 1 : -1)); - return sortedEntries; + return {size, sortedEntries}; }; diff --git a/packages/workbox-webpack-plugin/src/lib/get-sourcemap-asset-name.js b/packages/workbox-webpack-plugin/src/lib/get-sourcemap-asset-name.js index 71bc50e5a..eebd58e7c 100644 --- a/packages/workbox-webpack-plugin/src/lib/get-sourcemap-asset-name.js +++ b/packages/workbox-webpack-plugin/src/lib/get-sourcemap-asset-name.js @@ -39,7 +39,8 @@ module.exports = (compilation, swContents, swDest) => { const sourcemapURLAssetName = upath.normalize( upath.join(swAssetDirname, url)); - if (sourcemapURLAssetName in compilation.assets) { + // Not sure if there's a better way to check for asset existence? + if (compilation.getAsset(sourcemapURLAssetName)) { return sourcemapURLAssetName; } } diff --git a/packages/workbox-webpack-plugin/src/lib/resolve-webpack-url.js b/packages/workbox-webpack-plugin/src/lib/resolve-webpack-url.js index 661874d0f..bdac0c76f 100644 --- a/packages/workbox-webpack-plugin/src/lib/resolve-webpack-url.js +++ b/packages/workbox-webpack-plugin/src/lib/resolve-webpack-url.js @@ -13,9 +13,18 @@ * https://webpack.js.org/configuration/output/#output-publicpath * * @function resolveWebpackURL + * @param {string} publicPath The publicPath value from webpack's compilation. * @param {Array} paths File paths to join * @return {string} Joined file path * * @private */ -module.exports = (...paths) => paths.join(''); +module.exports = (publicPath, ...paths) => { + // This is a change in webpack v5. + // See https://github.com/jantimon/html-webpack-plugin/pull/1516 + if (publicPath === 'auto') { + return paths.join(''); + } else { + return [publicPath, ...paths].join(''); + } +}; diff --git a/test/workbox-webpack-plugin/node/generate-sw.js b/test/workbox-webpack-plugin/node/v4/generate-sw.js similarity index 95% rename from test/workbox-webpack-plugin/node/generate-sw.js rename to test/workbox-webpack-plugin/node/v4/generate-sw.js index 132541fe0..dd4cc7488 100644 --- a/test/workbox-webpack-plugin/node/generate-sw.js +++ b/test/workbox-webpack-plugin/node/v4/generate-sw.js @@ -6,24 +6,36 @@ https://opensource.org/licenses/MIT. */ +// workbox-webpack-plugin needs to do require('webpack'), and in order to test +// against multiple webpack versions, we need that to resolve to whatever the +// correct webpack is for this test. +// See https://jeffy.info/2020/10/01/testing-multiple-webpack-versions.html +try { + delete require.cache[require.resolve('webpack')]; +} catch (error) { + // Ignore if require.resolve('webpack') fails. +} +const upath = require('upath'); +require('module-alias').addAlias( + 'webpack', upath.resolve('node_modules', 'webpack-v4')); + const CopyWebpackPlugin = require('copy-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const MemoryFS = require('memory-fs'); const WorkerPlugin = require('worker-plugin'); const expect = require('chai').expect; const globby = require('globby'); -const upath = require('upath'); const tempy = require('tempy'); const webpack = require('webpack'); -const CreateWebpackAssetPlugin = require('../../../infra/testing/create-webpack-asset-plugin'); -const validateServiceWorkerRuntime = require('../../../infra/testing/validator/service-worker-runtime'); -const webpackBuildCheck = require('../../../infra/testing/webpack-build-check'); -const {GenerateSW} = require('../../../packages/workbox-webpack-plugin/src/index'); +const CreateWebpackAssetPlugin = require('./lib/create-webpack-asset-plugin'); +const validateServiceWorkerRuntime = require('../../../../infra/testing/validator/service-worker-runtime'); +const webpackBuildCheck = require('../../../../infra/testing/webpack-build-check'); +const {GenerateSW} = require('../../../../packages/workbox-webpack-plugin/src/index'); -describe(`[workbox-webpack-plugin] GenerateSW (End to End)`, function() { +describe(`[workbox-webpack-plugin] GenerateSW with webpack v4`, function() { const WEBPACK_ENTRY_FILENAME = 'webpackEntry.js'; - const SRC_DIR = upath.join(__dirname, '..', 'static', 'example-project-1'); + const SRC_DIR = upath.join(__dirname, '..', '..', 'static', 'example-project-1'); describe(`[workbox-webpack-plugin] Runtime errors`, function() { it(`should lead to a webpack compilation error when passed invalid config`, function(done) { @@ -140,7 +152,7 @@ describe(`[workbox-webpack-plugin] GenerateSW (End to End)`, function() { try { const statsJson = stats.toJson('verbose'); expect(webpackError).not.to.exist; - expect(statsJson.errors).to.be.empty; + expect(statsJson.errors, JSON.stringify(statsJson.errors)).to.be.empty; // There should be a warning logged, due to INVALID_CHUNK_NAME. expect(statsJson.warnings).to.have.length(1); @@ -464,18 +476,20 @@ describe(`[workbox-webpack-plugin] GenerateSW (End to End)`, function() { await validateServiceWorkerRuntime({swFile, expectedMethodCalls: { importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], - precacheAndRoute: [[[ - { - revision: /^[0-9a-f]{32}$/, - url: /^entry1-[0-9a-f]{20}\.js$/, - }, { - revision: /^[0-9a-f]{32}$/, - url: /^entry2-[0-9a-f]{20}\.js$/, - }, { - revision: /^[0-9a-f]{32}$/, - url: 'index.html', - }, - ], {}]], + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + // See https://github.com/webpack/webpack/issues/11425#issuecomment-692809539 + url: '__child-HtmlWebpackPlugin_0', + }, { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, { + revision: /^[0-9a-f]{32}$/, + url: /^entry2-[0-9a-f]{20}\.js$/, + }, { + revision: /^[0-9a-f]{32}$/, + url: 'index.html', + }], {}]], }}); done(); @@ -993,7 +1007,7 @@ describe(`[workbox-webpack-plugin] GenerateSW (End to End)`, function() { // See https://github.com/GoogleChrome/workbox/issues/1916 it(`should support projects that bundle WASM code`, function(done) { const outputDir = tempy.directory(); - const srcDir = upath.join(__dirname, '..', 'static', 'wasm-project'); + const srcDir = upath.join(__dirname, '..', '..', 'static', 'wasm-project'); const config = { mode: 'production', entry: { @@ -1082,7 +1096,7 @@ describe(`[workbox-webpack-plugin] GenerateSW (End to End)`, function() { // See https://github.com/GoogleChrome/workbox/issues/2158 it(`should support multiple compilations using the same plugin instance`, async function() { const outputDir = tempy.directory(); - const srcDir = upath.join(__dirname, '..', 'static', 'example-project-1'); + const srcDir = upath.join(__dirname, '..', '..', 'static', 'example-project-1'); const config = { mode: 'production', entry: { @@ -1131,7 +1145,7 @@ describe(`[workbox-webpack-plugin] GenerateSW (End to End)`, function() { it(`should not list the swDest from one plugin in the other's manifest`, function(done) { const outputDir = tempy.directory(); - const srcDir = upath.join(__dirname, '..', 'static', 'example-project-1'); + const srcDir = upath.join(__dirname, '..', '..', 'static', 'example-project-1'); const config = { mode: 'production', entry: { @@ -1397,7 +1411,7 @@ describe(`[workbox-webpack-plugin] GenerateSW (End to End)`, function() { new GenerateSW({ manifestTransforms: [(manifest, compilation) => { expect(manifest).to.have.lengthOf(1); - expect(manifest[0].size).to.eql(930); + expect(manifest[0].size).to.eql(959); expect(manifest[0].url.startsWith('main.')).to.be.true; expect(manifest[0].revision).to.have.lengthOf(32); expect(compilation).to.exist; diff --git a/test/workbox-webpack-plugin/node/inject-manifest.js b/test/workbox-webpack-plugin/node/v4/inject-manifest.js similarity index 94% rename from test/workbox-webpack-plugin/node/inject-manifest.js rename to test/workbox-webpack-plugin/node/v4/inject-manifest.js index 0a7b7e585..948ca3555 100644 --- a/test/workbox-webpack-plugin/node/inject-manifest.js +++ b/test/workbox-webpack-plugin/node/v4/inject-manifest.js @@ -6,6 +6,19 @@ https://opensource.org/licenses/MIT. */ +// workbox-webpack-plugin needs to do require('webpack'), and in order to test +// against multiple webpack versions, we need that to resolve to whatever the +// correct webpack is for this test. +// See https://jeffy.info/2020/10/01/testing-multiple-webpack-versions.html +try { + delete require.cache[require.resolve('webpack')]; +} catch (error) { + // Ignore if require.resolve('webpack') fails. +} +const upath = require('upath'); +require('module-alias').addAlias( + 'webpack', upath.resolve('node_modules', 'webpack-v4')); + const chai = require('chai'); const chaiMatchPattern = require('chai-match-pattern'); const CopyWebpackPlugin = require('copy-webpack-plugin'); @@ -13,22 +26,21 @@ const fse = require('fs-extra'); const globby = require('globby'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const tempy = require('tempy'); -const upath = require('upath'); const webpack = require('webpack'); const WorkerPlugin = require('worker-plugin'); -const CreateWebpackAssetPlugin = require('../../../infra/testing/create-webpack-asset-plugin'); -const validateServiceWorkerRuntime = require('../../../infra/testing/validator/service-worker-runtime'); -const webpackBuildCheck = require('../../../infra/testing/webpack-build-check'); -const {InjectManifest} = require('../../../packages/workbox-webpack-plugin/src/index'); +const CreateWebpackAssetPlugin = require('./lib/create-webpack-asset-plugin'); +const validateServiceWorkerRuntime = require('../../../../infra/testing/validator/service-worker-runtime'); +const webpackBuildCheck = require('../../../../infra/testing/webpack-build-check'); +const {InjectManifest} = require('../../../../packages/workbox-webpack-plugin/src/index'); chai.use(chaiMatchPattern); const {expect} = chai; -describe(`[workbox-webpack-plugin] InjectManifest (End to End)`, function() { +describe(`[workbox-webpack-plugin] InjectManifest with webpack v4`, function() { const WEBPACK_ENTRY_FILENAME = 'webpackEntry.js'; - const SRC_DIR = upath.join(__dirname, '..', 'static', 'example-project-1'); - const SW_SRC = upath.join(__dirname, '..', 'static', 'sw-src.js'); + const SRC_DIR = upath.join(__dirname, '..', '..', 'static', 'example-project-1'); + const SW_SRC = upath.join(__dirname, '..', '..', 'static', 'sw-src.js'); describe(`[workbox-webpack-plugin] Runtime errors`, function() { it(`should lead to a webpack compilation error when passed invalid config`, function(done) { @@ -375,18 +387,20 @@ describe(`[workbox-webpack-plugin] InjectManifest (End to End)`, function() { swFile, entryPoint: 'injectManifest', expectedMethodCalls: { - precacheAndRoute: [[[ - { - revision: /^[0-9a-f]{32}$/, - url: /^entry1-[0-9a-f]{20}\.js$/, - }, { - revision: /^[0-9a-f]{32}$/, - url: /^entry2-[0-9a-f]{20}\.js$/, - }, { - revision: /^[0-9a-f]{32}$/, - url: 'index.html', - }, - ], {}]], + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + // See https://github.com/webpack/webpack/issues/11425#issuecomment-692809539 + url: '__child-HtmlWebpackPlugin_0', + }, { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, { + revision: /^[0-9a-f]{32}$/, + url: /^entry2-[0-9a-f]{20}\.js$/, + }, { + revision: /^[0-9a-f]{32}$/, + url: 'index.html', + }], {}]], }, }); @@ -511,7 +525,7 @@ describe(`[workbox-webpack-plugin] InjectManifest (End to End)`, function() { expect(files).to.have.length(4); const expectedSourcemap = await fse.readJSON( - upath.join(__dirname, '..', 'static', 'expected-service-worker.js.map')); + upath.join(__dirname, '..', '..', 'static', 'expected-service-worker.js.map')); const actualSourcemap = await fse.readJSON(upath.join(outputDir, 'service-worker.js.map')); // The mappings will vary depending on the webpack version. @@ -569,7 +583,7 @@ describe(`[workbox-webpack-plugin] InjectManifest (End to End)`, function() { expect(files).to.have.length(4); const expectedSourcemap = await fse.readJSON( - upath.join(__dirname, '..', 'static', 'expected-service-worker.js.map')); + upath.join(__dirname, '..', '..', 'static', 'expected-service-worker.js.map')); const actualSourcemap = await fse.readJSON( upath.join(outputDir, 'subdir', 'service-worker.js.map')); @@ -599,7 +613,7 @@ describe(`[workbox-webpack-plugin] InjectManifest (End to End)`, function() { it(`should not fail if the sourcemap is missing from the assets`, function(done) { const outputDir = tempy.directory(); - const swSrc = upath.join(__dirname, '..', 'static', 'sw-src-missing-sourcemap.js'); + const swSrc = upath.join(__dirname, '..', '..', 'static', 'sw-src-missing-sourcemap.js'); const config = { mode: 'development', @@ -733,9 +747,6 @@ describe(`[workbox-webpack-plugin] InjectManifest (End to End)`, function() { entryPoint: 'injectManifest', expectedMethodCalls: { precacheAndRoute: [[[{ - revision: /^[0-9a-f]{32}$/, - url: 'service-worker.js.map', - }, { revision: /^[0-9a-f]{32}$/, url: 'webpackEntry.js', }, { @@ -1113,7 +1124,7 @@ describe(`[workbox-webpack-plugin] InjectManifest (End to End)`, function() { // See https://github.com/GoogleChrome/workbox/issues/1916 it(`should support projects that bundle WASM code`, function(done) { const outputDir = tempy.directory(); - const srcDir = upath.join(__dirname, '..', 'static', 'wasm-project'); + const srcDir = upath.join(__dirname, '..', '..', 'static', 'wasm-project'); const config = { mode: 'production', entry: { @@ -1249,7 +1260,7 @@ describe(`[workbox-webpack-plugin] InjectManifest (End to End)`, function() { it(`should use webpackCompilationPlugins with DefinePlugin`, function(done) { const prefix = 'replaced-by-define-plugin'; - const swSrc = upath.join(__dirname, '..', 'static', 'sw-src-define-plugin.js'); + const swSrc = upath.join(__dirname, '..', '..', 'static', 'sw-src-define-plugin.js'); const outputDir = tempy.directory(); const config = { mode: 'production', @@ -1314,7 +1325,7 @@ describe(`[workbox-webpack-plugin] InjectManifest (End to End)`, function() { swDest: 'service-worker.js', manifestTransforms: [(manifest, compilation) => { expect(manifest).to.have.lengthOf(1); - expect(manifest[0].size).to.eql(930); + expect(manifest[0].size).to.eql(959); expect(manifest[0].url.startsWith('main.')).to.be.true; expect(manifest[0].revision).to.have.lengthOf(32); expect(compilation).to.exist; @@ -1377,7 +1388,7 @@ describe(`[workbox-webpack-plugin] InjectManifest (End to End)`, function() { }, plugins: [ new InjectManifest({ - swSrc: upath.join(__dirname, '..', 'static', 'sw.ts'), + swSrc: upath.join(__dirname, '..', '..', 'static', 'sw.ts'), }), ], }; @@ -1517,12 +1528,12 @@ describe(`[workbox-webpack-plugin] InjectManifest (End to End)`, function() { plugins: [ new InjectManifest({ exclude: [/sw\d.js/], - swSrc: upath.join(__dirname, '..', 'static', 'sw.ts'), + swSrc: upath.join(__dirname, '..', '..', 'static', 'sw.ts'), swDest: 'sw1.js', }), new InjectManifest({ exclude: [/sw\d.js/], - swSrc: upath.join(__dirname, '..', 'static', 'sw.ts'), + swSrc: upath.join(__dirname, '..', '..', 'static', 'sw.ts'), swDest: 'sw2.js', }), ], @@ -1583,7 +1594,7 @@ describe(`[workbox-webpack-plugin] InjectManifest (End to End)`, function() { new InjectManifest({ exclude: [/sw\d.js/], swDest: 'sw.js', - swSrc: upath.join(__dirname, '..', 'static', 'sw-src.js'), + swSrc: upath.join(__dirname, '..', '..', 'static', 'sw-src.js'), }), ], }; @@ -1632,7 +1643,7 @@ describe(`[workbox-webpack-plugin] InjectManifest (End to End)`, function() { new InjectManifest({ compileSrc: false, swDest: 'injected-manifest.json', - swSrc: upath.join(__dirname, '..', 'static', 'injected-manifest.json'), + swSrc: upath.join(__dirname, '..', '..', 'static', 'injected-manifest.json'), webpackCompilationPlugins: [{}], }), ], @@ -1669,7 +1680,7 @@ describe(`[workbox-webpack-plugin] InjectManifest (End to End)`, function() { new InjectManifest({ compileSrc: false, swDest: 'injected-manifest.json', - swSrc: upath.join(__dirname, '..', 'static', 'injected-manifest.json'), + swSrc: upath.join(__dirname, '..', '..', 'static', 'injected-manifest.json'), }), ], }; @@ -1710,7 +1721,7 @@ describe(`[workbox-webpack-plugin] InjectManifest (End to End)`, function() { new InjectManifest({ compileSrc: false, swDest: 'injected-manifest.js', - swSrc: upath.join(__dirname, '..', 'static', 'injected-manifest.js'), + swSrc: upath.join(__dirname, '..', '..', 'static', 'injected-manifest.js'), }), ], }; diff --git a/infra/testing/create-webpack-asset-plugin.js b/test/workbox-webpack-plugin/node/v4/lib/create-webpack-asset-plugin.js similarity index 100% rename from infra/testing/create-webpack-asset-plugin.js rename to test/workbox-webpack-plugin/node/v4/lib/create-webpack-asset-plugin.js diff --git a/test/workbox-webpack-plugin/node/v5/generate-sw.js b/test/workbox-webpack-plugin/node/v5/generate-sw.js new file mode 100644 index 000000000..dd61aa662 --- /dev/null +++ b/test/workbox-webpack-plugin/node/v5/generate-sw.js @@ -0,0 +1,1414 @@ +/* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ + +// workbox-webpack-plugin needs to do require('webpack'), and in order to test +// against multiple webpack versions, we need that to resolve to whatever the +// correct webpack is for this test. +// See https://jeffy.info/2020/10/01/testing-multiple-webpack-versions.html +try { + delete require.cache[require.resolve('webpack')]; +} catch (error) { + // Ignore if require.resolve('webpack') fails. +} +const upath = require('upath'); +require('module-alias').addAlias( + 'webpack', upath.resolve('node_modules', 'webpack-v5')); + +const CopyWebpackPlugin = require('copy-webpack-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const MemoryFS = require('memory-fs'); +const expect = require('chai').expect; +const globby = require('globby'); +const tempy = require('tempy'); +const webpack = require('webpack'); + +const CreateWebpackAssetPlugin = require('./lib/create-webpack-asset-plugin'); +const validateServiceWorkerRuntime = require('../../../../infra/testing/validator/service-worker-runtime'); +const webpackBuildCheck = require('../../../../infra/testing/webpack-build-check'); +const {GenerateSW} = require('../../../../packages/workbox-webpack-plugin/src/index'); + +describe(`[workbox-webpack-plugin] GenerateSW with webpack v5`, function() { + const WEBPACK_ENTRY_FILENAME = 'webpackEntry.js'; + const SRC_DIR = upath.join(__dirname, '..', '..', 'static', 'example-project-1'); + + describe(`[workbox-webpack-plugin] Runtime errors`, function() { + it(`should lead to a webpack compilation error when passed invalid config`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new GenerateSW({ + invalid: 'invalid', + }), + ], + }; + + const compiler = webpack(config); + compiler.run((webpackError, stats) => { + try { + expect(webpackError).not.to.exist; + const statsJson = stats.toJson(); + expect(statsJson.warnings).to.be.empty; + expect(statsJson.errors).to.have.length(1); + expect(statsJson.errors[0].message).to.eql(`Please check your GenerateSW plugin configuration:\n"invalid" is not allowed`); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Multiple chunks`, function() { + it(`should work when called without any parameters`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry2: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new GenerateSW(), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(4); + + await validateServiceWorkerRuntime({ + swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, { + revision: /^[0-9a-f]{32}$/, + url: /^entry2-[0-9a-f]{20}\.js$/, + }, + ], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should work when called with importScriptsViaChunks`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + devtool: 'source-map', + entry: { + main: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + imported: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash:20].js', + path: outputDir, + }, + plugins: [ + new GenerateSW({ + importScriptsViaChunks: [ + 'imported', + 'INVALID_CHUNK_NAME', + ], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + const statsJson = stats.toJson('verbose'); + expect(webpackError).not.to.exist; + expect(statsJson.errors).to.be.empty; + // There should be a warning logged, due to INVALID_CHUNK_NAME. + expect(statsJson.warnings).to.have.length(1); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(8); + + await validateServiceWorkerRuntime({ + swFile, expectedMethodCalls: { + // imported-[chunkhash].js.map should *not* be included. + importScripts: [ + [/^\.\/workbox-[0-9a-f]{8}$/], + [/^imported-[0-9a-f]{20}\.js$/], + ], + // imported-[chunkhash].js should *not* be included. + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: /^main-[0-9a-f]{20}\.js$/, + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should work when called with additionalManifestEntries`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry2: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new GenerateSW({ + additionalManifestEntries: [ + {url: 'one', revision: null}, + {url: 'two', revision: null}, + {url: 'three', revision: '333'}, + ], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + const statsJson = stats.toJson(); + expect(webpackError).not.to.exist; + expect(statsJson.errors).to.be.empty; + expect(statsJson.warnings).to.have.length(0); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(4); + + await validateServiceWorkerRuntime({ + swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, { + revision: /^[0-9a-f]{32}$/, + url: /^entry2-[0-9a-f]{20}\.js$/, + }, { + revision: null, + url: 'one', + }, { + revision: '333', + url: 'three', + }, { + revision: null, + url: 'two', + }, + ], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should honor the 'chunks' allowlist config`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry2: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry3: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new GenerateSW({ + chunks: ['entry1', 'entry2'], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(5); + + await validateServiceWorkerRuntime({swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, { + revision: /^[0-9a-f]{32}$/, + url: /^entry2-[0-9a-f]{20}\.js$/, + }, + ], {}]], + }}); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should honor the 'chunks' allowlist config, including children created via SplitChunksPlugin`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + main: upath.join(SRC_DIR, 'splitChunksEntry.js'), + }, + output: { + filename: '[chunkhash].js', + path: outputDir, + }, + optimization: { + minimize: false, + splitChunks: { + chunks: 'all', + }, + }, + performance: { + hints: false, + }, + plugins: [ + new GenerateSW({ + chunks: ['main'], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(4); + + await validateServiceWorkerRuntime({swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^[0-9a-f]{20}\.js$/, + }, { + revision: /^[0-9a-f]{32}$/, + url: /^[0-9a-f]{20}\.js$/, + }, + ], {}]], + }}); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should honor the 'excludeChunks' denylist config`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry2: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry3: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new GenerateSW({ + excludeChunks: ['entry3'], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(5); + + await validateServiceWorkerRuntime({swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, { + revision: /^[0-9a-f]{32}$/, + url: /^entry2-[0-9a-f]{20}\.js$/, + }, + ], {}]], + }}); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should honor setting both the 'chunks' and 'excludeChunks', with the denylist taking precedence`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry2: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry3: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new GenerateSW({ + chunks: ['entry1', 'entry2'], + excludeChunks: ['entry2', 'entry3'], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(5); + + await validateServiceWorkerRuntime({swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, + ], {}]], + }}); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] html-webpack-plugin and a single chunk`, function() { + it(`should work when called without any parameters`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry2: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new HtmlWebpackPlugin(), + new GenerateSW(), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(5); + + await validateServiceWorkerRuntime({swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + // See https://github.com/webpack/webpack/issues/11425#issuecomment-692809539 + url: '__child-HtmlWebpackPlugin_0', + }, { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, { + revision: /^[0-9a-f]{32}$/, + url: /^entry2-[0-9a-f]{20}\.js$/, + }], {}]], + }}); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] copy-webpack-plugin and a single chunk`, function() { + it(`should work when called without any parameters`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: WEBPACK_ENTRY_FILENAME, + path: outputDir, + }, + plugins: [ + new CopyWebpackPlugin({patterns: [{ + from: SRC_DIR, + to: outputDir, + }]}), + new GenerateSW(), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(11); + + await validateServiceWorkerRuntime({ + swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: 'images/example-jpeg.jpg', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'images/web-fundamentals-icon192x192.png', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'index.html', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'page-1.html', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'page-2.html', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'splitChunksEntry.js', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'styles/stylesheet-1.css', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'styles/stylesheet-2.css', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'webpackEntry.js', + }, + ], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Filtering via include/exclude`, function() { + it(`should exclude .map and manifest.js files by default`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: WEBPACK_ENTRY_FILENAME, + path: outputDir, + }, + devtool: 'source-map', + plugins: [ + new CreateWebpackAssetPlugin('manifest.js'), + new CreateWebpackAssetPlugin('manifest.json'), + new CreateWebpackAssetPlugin('not-ignored.js'), + new GenerateSW(), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(9); + + await validateServiceWorkerRuntime({swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: 'manifest.json', + }, { + revision: /^[0-9a-f]{32}$/, + url: 'not-ignored.js', + }, { + revision: /^[0-9a-f]{32}$/, + url: 'webpackEntry.js', + }], {}]], + }}); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should allow developers to override the default exclude filter`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: 'manifest-normally-ignored.js', + path: outputDir, + }, + plugins: [ + new GenerateSW({ + exclude: [], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(3); + + await validateServiceWorkerRuntime({swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: 'manifest-normally-ignored.js', + }], {}]], + }}); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should allow developers to allowlist via include`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: WEBPACK_ENTRY_FILENAME, + path: outputDir, + }, + plugins: [ + new CopyWebpackPlugin({patterns: [{ + from: SRC_DIR, + to: outputDir, + }]}), + new GenerateSW({ + include: [/.html$/], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(11); + + await validateServiceWorkerRuntime({swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: 'index.html', + }, { + revision: /^[0-9a-f]{32}$/, + url: 'page-1.html', + }, { + revision: /^[0-9a-f]{32}$/, + url: 'page-2.html', + }], {}]], + }}); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should allow developers to combine the include and exclude filters`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: WEBPACK_ENTRY_FILENAME, + path: outputDir, + }, + plugins: [ + new CopyWebpackPlugin({patterns: [{ + from: SRC_DIR, + to: outputDir, + }]}), + new GenerateSW({ + include: [/.html$/], + exclude: [/index/], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(11); + + await validateServiceWorkerRuntime({swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: 'page-1.html', + }, { + revision: /^[0-9a-f]{32}$/, + url: 'page-2.html', + }], {}]], + }}); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] swDest variations`, function() { + it(`should work when swDest is an absolute path`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: WEBPACK_ENTRY_FILENAME, + path: outputDir, + }, + plugins: [ + new GenerateSW({ + // upath.resolve() will always return an absolute upath. + swDest: upath.resolve(upath.join(outputDir, 'service-worker.js')), + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(3); + + await validateServiceWorkerRuntime({swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: 'webpackEntry.js', + }], {}]], + }}); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Reporting webpack warnings`, function() { + it(`should warn when when passed a non-existent chunk`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new GenerateSW({ + chunks: ['entry1', 'doesNotExist'], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + expect(webpackError).not.to.exist; + const statsJson = stats.toJson(); + expect(statsJson.errors).to.be.empty; + expect(statsJson.warnings[0].message).to.eql( + `The chunk 'doesNotExist' was provided in your Workbox chunks config, but was not found in the compilation.`, + ); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(3); + + await validateServiceWorkerRuntime({ + swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, + ], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should add maximumFileSizeToCacheInBytes warnings to compilation.warnings`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new CopyWebpackPlugin({patterns: [{ + from: SRC_DIR, + to: outputDir, + }]}), + new GenerateSW({ + // Make this large enough to cache some, but not all, files. + maximumFileSizeToCacheInBytes: 14 * 1024, + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + if (webpackError) { + return done(webpackError); + } + + try { + const statsJson = stats.toJson('verbose'); + expect(statsJson.warnings[0].message).to.eql( + `images/example-jpeg.jpg is 15.3 kB, and won't be precached. Configure maximumFileSizeToCacheInBytes to change this limit.`, + ); + + const swFile = upath.join(outputDir, 'service-worker.js'); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(12); + + await validateServiceWorkerRuntime({swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'images/web-fundamentals-icon192x192.png', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'index.html', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'page-1.html', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'page-2.html', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'splitChunksEntry.js', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'styles/stylesheet-1.css', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'styles/stylesheet-2.css', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'webpackEntry.js', + }, + ], {}]], + }}); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Customizing output paths and names`, function() { + it(`should honor publicPath`, function(done) { + const outputDir = tempy.directory(); + const publicPath = '/testing/'; + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + publicPath, + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new GenerateSW(), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(3); + + await validateServiceWorkerRuntime({swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^\/testing\/entry1-[0-9a-f]{20}\.js$/, + }, + ], {}]], + }}); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Filesystem options`, function() { + it(`should support using MemoryFS as the outputFileSystem`, function(done) { + const memoryFS = new MemoryFS(); + const outputDir = '/output/dir'; + memoryFS.mkdirpSync(outputDir); + + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new GenerateSW(), + ], + }; + + const compiler = webpack(config); + compiler.outputFileSystem = memoryFS; + + compiler.run(async (webpackError, stats) => { + try { + webpackBuildCheck(webpackError, stats); + + const files = memoryFS.readdirSync(outputDir); + expect(files).to.have.length(3); + + const swString = memoryFS.readFileSync(`${outputDir}/service-worker.js`, 'utf-8'); + + await validateServiceWorkerRuntime({swString, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }], {}]], + }}); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Multiple invocation scenarios`, function() { + // See https://github.com/GoogleChrome/workbox/issues/2158 + it(`should support multiple compilations using the same plugin instance`, async function() { + const outputDir = tempy.directory(); + const srcDir = upath.join(__dirname, '..', '..', 'static', 'example-project-1'); + const config = { + mode: 'production', + entry: { + index: upath.join(srcDir, 'webpackEntry.js'), + }, + output: { + filename: '[name].js', + path: outputDir, + }, + plugins: [ + new GenerateSW(), + ], + }; + + const compiler = webpack(config); + for (const i of [1, 2, 3]) { + await new Promise((resolve, reject) => { + compiler.run(async (webpackError, stats) => { + try { + if (webpackError) { + throw new Error(webpackError.message); + } + + const statsJson = stats.toJson('verbose'); + expect(statsJson.errors).to.have.length(0); + + // There should be a warning logged after the first compilation. + // See https://github.com/GoogleChrome/workbox/issues/1790 + if (i > 1) { + expect(statsJson.warnings).to.have.length(1); + } else { + expect(statsJson.warnings).to.have.length(0); + } + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(3); + + resolve(); + } catch (error) { + reject(new Error(`Failure during compilation ${i}: ${error}`)); + } + }); + }); + } + }); + + it(`should not list the swDest from one plugin in the other's manifest`, function(done) { + const outputDir = tempy.directory(); + const srcDir = upath.join(__dirname, '..', '..', 'static', 'example-project-1'); + const config = { + mode: 'production', + entry: { + index: upath.join(srcDir, 'webpackEntry.js'), + }, + output: { + filename: '[name].js', + path: outputDir, + }, + plugins: [ + new GenerateSW({ + swDest: 'sw1.js', + }), + new GenerateSW({ + swDest: 'sw2.js', + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const sw1File = upath.join(outputDir, 'sw1.js'); + const sw2File = upath.join(outputDir, 'sw2.js'); + + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(4); + + await validateServiceWorkerRuntime({ + swFile: sw1File, + expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: 'index.js', + }], {}]], + }, + }); + + await validateServiceWorkerRuntime({ + swFile: sw2File, + expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: 'index.js', + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Rollup plugin configuration options`, function() { + it(`should support inlining the Workbox runtime`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:6].js', + path: outputDir, + publicPath: '/public/', + }, + plugins: [ + new GenerateSW({ + inlineWorkboxRuntime: true, + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + try { + webpackBuildCheck(webpackError, stats); + + // We can't really mock evaluation of the service worker script when + // the Workbox runtime is inlined, so just check to make sure the + // correct files are output. + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(2); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should support inlining the Workbox runtime and generating sourcemaps`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:6].js', + path: outputDir, + publicPath: '/public/', + }, + plugins: [ + new GenerateSW({ + inlineWorkboxRuntime: true, + sourcemap: true, + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + try { + webpackBuildCheck(webpackError, stats); + + // We can't really mock evaluation of the service worker script when + // the Workbox runtime is inlined, so just check to make sure the + // correct files are output. + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(3); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should support using a swDest that includes a subdirectory`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + path: outputDir, + }, + plugins: [ + new GenerateSW({ + swDest: upath.join('sub', 'directory', 'service-worker.js'), + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + try { + webpackBuildCheck(webpackError, stats); + + // Make sure that the expected generated service worker files are + // output into the subdirectory. + const files = await globby('**/*', { + cwd: upath.join(outputDir, 'sub', 'directory'), + }); + expect(files).to.have.length(2); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Manifest transformations`, function() { + it(`should use dontCacheBustURLsMatching`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:20].js', + path: outputDir, + }, + plugins: [ + new GenerateSW({ + dontCacheBustURLsMatching: /\.[0-9a-f]{20}\./, + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(3); + + await validateServiceWorkerRuntime({swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[{ + url: /^main\.[0-9a-f]{20}\.js$/, + revision: null, + }], {}]], + }}); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should use modifyURLPrefix`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:20].js', + path: outputDir, + publicPath: '/public/', + }, + plugins: [ + new GenerateSW({ + modifyURLPrefix: { + '/public/': 'https://example.org/', + }, + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(3); + + await validateServiceWorkerRuntime({swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: /^https:\/\/example\.org\/main\.[0-9a-f]{20}\.js/, + }], {}]], + }}); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should use manifestTransforms`, function(done) { + const outputDir = tempy.directory(); + const warningMessage = 'test warning'; + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:20].js', + path: outputDir, + }, + plugins: [ + new GenerateSW({ + manifestTransforms: [(manifest, compilation) => { + expect(manifest).to.have.lengthOf(1); + expect(manifest[0].size).to.eql(30); + expect(manifest[0].url.startsWith('main.')).to.be.true; + expect(manifest[0].revision).to.have.lengthOf(32); + expect(compilation).to.exist; + + manifest = manifest.map((entry) => { + entry.url += '-suffix'; + entry.revision = null; + return entry; + }); + + return { + manifest, + warnings: [warningMessage], + }; + }], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + expect(webpackError).not.to.exist; + const statsJson = stats.toJson(); + expect(statsJson.errors, JSON.stringify(statsJson.errors)).to.be.empty; + expect(statsJson.warnings[0].message).to.eql(warningMessage); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(3); + + await validateServiceWorkerRuntime({swFile, expectedMethodCalls: { + importScripts: [[/^\.\/workbox-[0-9a-f]{8}$/]], + precacheAndRoute: [[[{ + revision: null, + url: /^main\.[0-9a-f]{20}\.js-suffix$/, + }], {}]], + }}); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); +}); diff --git a/test/workbox-webpack-plugin/node/v5/inject-manifest.js b/test/workbox-webpack-plugin/node/v5/inject-manifest.js new file mode 100644 index 000000000..3ffc52eb8 --- /dev/null +++ b/test/workbox-webpack-plugin/node/v5/inject-manifest.js @@ -0,0 +1,1701 @@ +/* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ + +// workbox-webpack-plugin needs to do require('webpack'), and in order to test +// against multiple webpack versions, we need that to resolve to whatever the +// correct webpack is for this test. +// See https://jeffy.info/2020/10/01/testing-multiple-webpack-versions.html +try { + delete require.cache[require.resolve('webpack')]; +} catch (error) { + // Ignore if require.resolve('webpack') fails. +} +const upath = require('upath'); +require('module-alias').addAlias( + 'webpack', upath.resolve('node_modules', 'webpack-v5')); + +const chai = require('chai'); +const chaiMatchPattern = require('chai-match-pattern'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); +const fse = require('fs-extra'); +const globby = require('globby'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const tempy = require('tempy'); +const webpack = require('webpack'); + +const CreateWebpackAssetPlugin = require('./lib/create-webpack-asset-plugin'); +const validateServiceWorkerRuntime = require('../../../../infra/testing/validator/service-worker-runtime'); +const webpackBuildCheck = require('../../../../infra/testing/webpack-build-check'); +const {InjectManifest} = require('../../../../packages/workbox-webpack-plugin/src/index'); + +chai.use(chaiMatchPattern); +const {expect} = chai; + +describe(`[workbox-webpack-plugin] InjectManifest with webpack v5`, function() { + const WEBPACK_ENTRY_FILENAME = 'webpackEntry.js'; + const SRC_DIR = upath.join(__dirname, '..', '..', 'static', 'example-project-1'); + const SW_SRC = upath.join(__dirname, '..', '..', 'static', 'sw-src.js'); + + describe(`[workbox-webpack-plugin] Runtime errors`, function() { + it(`should lead to a webpack compilation error when passed invalid config`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + invalid: 'invalid', + }), + ], + }; + + const compiler = webpack(config); + compiler.run((webpackError, stats) => { + try { + expect(webpackError).not.to.exist; + const statsJson = stats.toJson(); + expect(statsJson.warnings).to.be.empty; + expect(statsJson.errors[0].message).to.eql( + `Please check your InjectManifest plugin configuration:\n"invalid" is not allowed`, + ); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Multiple chunks`, function() { + it(`should work when called without any parameters`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry2: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(3); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, { + revision: /^[0-9a-f]{32}$/, + url: /^entry2-[0-9a-f]{20}\.js$/, + }, + ], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should honor the 'chunks' allowlist config`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry2: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry3: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + chunks: ['entry1', 'entry2'], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(4); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, { + revision: /^[0-9a-f]{32}$/, + url: /^entry2-[0-9a-f]{20}\.js$/, + }, + ], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should honor the 'chunks' allowlist config, including children created via SplitChunksPlugin`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + main: upath.join(SRC_DIR, 'splitChunksEntry.js'), + }, + output: { + filename: '[chunkhash].js', + path: outputDir, + }, + optimization: { + minimize: false, + splitChunks: { + chunks: 'all', + }, + }, + performance: { + hints: false, + }, + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + chunks: ['main'], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(3); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^[0-9a-f]{20}\.js$/, + }, { + revision: /^[0-9a-f]{32}$/, + url: /^[0-9a-f]{20}\.js$/, + }, + ], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should honor the 'excludeChunks' denylist config`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry2: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry3: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + excludeChunks: ['entry3'], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(4); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, { + revision: /^[0-9a-f]{32}$/, + url: /^entry2-[0-9a-f]{20}\.js$/, + }, + ], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should honor setting both the 'chunks' and 'excludeChunks', with the denylist taking precedence`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry2: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry3: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + chunks: ['entry1', 'entry2'], + excludeChunks: ['entry2', 'entry3'], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(4); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, + ], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] html-webpack-plugin and a single chunk`, function() { + it(`should work when called without any parameters`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + entry2: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new HtmlWebpackPlugin(), + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(4); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + // See https://github.com/webpack/webpack/issues/11425#issuecomment-692809539 + url: '__child-HtmlWebpackPlugin_0', + }, { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, { + revision: /^[0-9a-f]{32}$/, + url: /^entry2-[0-9a-f]{20}\.js$/, + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] copy-webpack-plugin and a single chunk`, function() { + it(`should work when called without any parameters`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: WEBPACK_ENTRY_FILENAME, + path: outputDir, + }, + plugins: [ + new CopyWebpackPlugin({patterns: [{ + from: SRC_DIR, + to: outputDir, + }]}), + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(10); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: 'images/example-jpeg.jpg', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'images/web-fundamentals-icon192x192.png', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'index.html', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'page-1.html', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'page-2.html', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'splitChunksEntry.js', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'styles/stylesheet-1.css', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'styles/stylesheet-2.css', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'webpackEntry.js', + }, + ], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Sourcemap manipulation`, function() { + it(`should update the sourcemap to account for manifest injection`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: WEBPACK_ENTRY_FILENAME, + path: outputDir, + }, + devtool: 'source-map', + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(4); + + const expectedSourcemap = await fse.readJSON( + upath.join(__dirname, 'static', 'expected-service-worker.js.map')); + const actualSourcemap = await fse.readJSON( + upath.join(outputDir, 'service-worker.js.map')); + + // The mappings will vary depending on the webpack version. + delete expectedSourcemap.mappings; + delete actualSourcemap.mappings; + + expect(actualSourcemap).to.eql(expectedSourcemap); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: 'webpackEntry.js', + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should handle a custom output.sourceMapFilename`, function(done) { + const outputDir = tempy.directory(); + + const sourceMapFilename = upath.join('subdir', '[file].map'); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + sourceMapFilename, + filename: WEBPACK_ENTRY_FILENAME, + path: outputDir, + }, + devtool: 'source-map', + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(4); + + const expectedSourcemap = await fse.readJSON( + upath.join(__dirname, 'static', 'expected-service-worker.js.map')); + const actualSourcemap = await fse.readJSON( + upath.join(outputDir, 'subdir', 'service-worker.js.map')); + + // The mappings will vary depending on the webpack version. + delete expectedSourcemap.mappings; + delete actualSourcemap.mappings; + + expect(actualSourcemap).to.eql(expectedSourcemap); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: 'webpackEntry.js', + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should not fail if the sourcemap is missing from the assets`, function(done) { + const outputDir = tempy.directory(); + const swSrc = upath.join(__dirname, '..', '..', 'static', 'sw-src-missing-sourcemap.js'); + + const config = { + mode: 'development', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: WEBPACK_ENTRY_FILENAME, + path: outputDir, + }, + devtool: false, + plugins: [ + new InjectManifest({ + swSrc, + swDest: 'service-worker.js', + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(2); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: 'webpackEntry.js', + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Filtering via include/exclude`, function() { + it(`should exclude .map and manifest.js files by default`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: WEBPACK_ENTRY_FILENAME, + path: outputDir, + }, + devtool: 'source-map', + plugins: [ + new CreateWebpackAssetPlugin('manifest.js'), + new CreateWebpackAssetPlugin('manifest.json'), + new CreateWebpackAssetPlugin('not-ignored.js'), + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(7); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: 'manifest.json', + }, { + revision: /^[0-9a-f]{32}$/, + url: 'not-ignored.js', + }, { + revision: /^[0-9a-f]{32}$/, + url: 'webpackEntry.js', + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should allow developers to override the default exclude filter`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: 'manifest-normally-ignored.js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + exclude: [], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(2); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: 'manifest-normally-ignored.js', + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should allow developers to allowlist via include`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: WEBPACK_ENTRY_FILENAME, + path: outputDir, + }, + plugins: [ + new CopyWebpackPlugin({patterns: [{ + from: SRC_DIR, + to: outputDir, + }]}), + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + include: [/.html$/], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(10); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: 'index.html', + }, { + revision: /^[0-9a-f]{32}$/, + url: 'page-1.html', + }, { + revision: /^[0-9a-f]{32}$/, + url: 'page-2.html', + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should allow developers to combine the include and exclude filters`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: WEBPACK_ENTRY_FILENAME, + path: outputDir, + }, + plugins: [ + new CopyWebpackPlugin({patterns: [{ + from: SRC_DIR, + to: outputDir, + }]}), + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + include: [/.html$/], + exclude: [/index/], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(10); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: 'page-1.html', + }, { + revision: /^[0-9a-f]{32}$/, + url: 'page-2.html', + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] swDest variations`, function() { + it(`should work when swDest is an absolute path`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: WEBPACK_ENTRY_FILENAME, + path: outputDir, + }, + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + swDest: upath.resolve(upath.join(outputDir, 'service-worker.js')), + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(2); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: 'webpackEntry.js', + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Reporting webpack warnings`, function() { + it(`should warn when when passed a non-existent chunk`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + chunks: ['entry1', 'doesNotExist'], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + expect(webpackError).not.to.exist; + const statsJson = stats.toJson(); + expect(statsJson.errors).to.be.empty; + expect(statsJson.warnings[0].message).to.eql( + `The chunk 'doesNotExist' was provided in your Workbox chunks config, but was not found in the compilation.`, + ); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(2); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, + ], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should add maximumFileSizeToCacheInBytes warnings to compilation.warnings`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new CopyWebpackPlugin({patterns: [{ + from: SRC_DIR, + to: outputDir, + }]}), + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + // Make this large enough to cache some, but not all, files. + maximumFileSizeToCacheInBytes: 14 * 1024, + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + if (webpackError) { + return done(webpackError); + } + + try { + const statsJson = stats.toJson('verbose'); + expect(statsJson.warnings[0].message).to.eql( + `images/example-jpeg.jpg is 15.3 kB, and won't be precached. Configure maximumFileSizeToCacheInBytes to change this limit.`, + ); + + const swFile = upath.join(outputDir, 'service-worker.js'); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(11); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^entry1-[0-9a-f]{20}\.js$/, + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'images/web-fundamentals-icon192x192.png', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'index.html', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'page-1.html', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'page-2.html', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'splitChunksEntry.js', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'styles/stylesheet-1.css', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'styles/stylesheet-2.css', + }, + { + revision: /^[0-9a-f]{32}$/, + url: 'webpackEntry.js', + }, + ], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Customizing output paths and names`, function() { + it(`should honor publicPath`, function(done) { + const outputDir = tempy.directory(); + const publicPath = '/testing/'; + const config = { + mode: 'production', + entry: { + entry1: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + }, + output: { + publicPath, + filename: '[name]-[chunkhash].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(2); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[ + { + revision: /^[0-9a-f]{32}$/, + url: /^\/testing\/entry1-[0-9a-f]{20}\.js$/, + }, + ], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Manifest transformations`, function() { + it(`should use dontCacheBustURLsMatching`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:20].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + dontCacheBustURLsMatching: /\.[0-9a-f]{20}\./, + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(2); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[{ + url: /^main\.[0-9a-f]{20}\.js$/, + revision: null, + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should use modifyURLPrefix`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:20].js', + path: outputDir, + publicPath: '/public/', + }, + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + modifyURLPrefix: { + '/public/': 'https://example.org/', + }, + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(2); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: /^https:\/\/example\.org\/main\.[0-9a-f]{20}\.js/, + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should use webpackCompilationPlugins with DefinePlugin`, function(done) { + const prefix = 'replaced-by-define-plugin'; + const swSrc = upath.join(__dirname, '..', '..', 'static', 'sw-src-define-plugin.js'); + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:20].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + swSrc, + swDest: 'service-worker.js', + webpackCompilationPlugins: [ + new webpack.DefinePlugin({ + __PREFIX__: JSON.stringify(prefix), + }), + ], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(2); + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + setCacheNameDetails: [[{prefix}]], + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: /^main\.[0-9a-f]{20}\.js$/, + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should use manifestTransforms`, function(done) { + const outputDir = tempy.directory(); + const warningMessage = 'test warning'; + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:20].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + manifestTransforms: [(manifest, compilation) => { + expect(manifest).to.have.lengthOf(1); + expect(manifest[0].size).to.eql(30); + expect(manifest[0].url.startsWith('main.')).to.be.true; + expect(manifest[0].revision).to.have.lengthOf(32); + expect(compilation).to.exist; + + manifest = manifest.map((entry) => { + entry.url += '-suffix'; + entry.revision = null; + return entry; + }); + + return { + manifest, + warnings: [warningMessage], + }; + }], + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'service-worker.js'); + try { + expect(webpackError).not.to.exist; + const statsJson = stats.toJson(); + expect(statsJson.errors).to.be.empty; + expect(statsJson.warnings[0].message).to.eql(warningMessage); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(2); + + await validateServiceWorkerRuntime({ + swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[{ + revision: null, + url: /^main.[0-9a-f]{20}\.js-suffix$/, + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] TypeScript compilation`, function() { + it(`should rename a swSrc with a .ts extension to .js`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:6].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + swSrc: upath.join(__dirname, '..', '..', 'static', 'sw.ts'), + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('*', {cwd: outputDir}); + expect(files).to.contain('sw.js'); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Multiple invocation scenarios`, function() { + // See https://github.com/GoogleChrome/workbox/issues/2158 + it(`should support multiple compilations using the same plugin instance`, async function() { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:6].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker.js', + }), + ], + }; + + const compiler = webpack(config); + for (const i of [1, 2, 3]) { + await new Promise((resolve, reject) => { + compiler.run(async (webpackError, stats) => { + try { + if (webpackError) { + throw new Error(webpackError.message); + } + + const statsJson = stats.toJson('verbose'); + expect(statsJson.errors).to.have.length(0); + + // There should be a warning logged after the first compilation. + // See https://github.com/GoogleChrome/workbox/issues/1790 + if (i > 1) { + expect(statsJson.warnings).to.have.length(1); + } else { + expect(statsJson.warnings).to.have.length(0); + } + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(2); + + resolve(); + } catch (error) { + reject(new Error(`Failure during compilation ${i}: ${error}`)); + } + }); + }); + } + }); + + it(`should only log once per invocation when using multiple plugin instances`, async function() { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:6].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker1.js', + }), + new InjectManifest({ + swSrc: SW_SRC, + swDest: 'service-worker2.js', + }), + ], + }; + + const compiler = webpack(config); + for (const i of [1, 2, 3]) { + await new Promise((resolve, reject) => { + compiler.run(async (webpackError, stats) => { + try { + if (webpackError) { + throw new Error(webpackError.message); + } + + const statsJson = stats.toJson('verbose'); + expect(statsJson.errors).to.have.length(0); + + // There should be a single warning logged after the first compilation. + // See https://github.com/GoogleChrome/workbox/issues/1790#issuecomment-640132556 + if (i > 1) { + expect(statsJson.warnings).to.have.length(1); + } else { + expect(statsJson.warnings).to.have.length(0); + } + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(3); + + resolve(); + } catch (error) { + reject(new Error(`Failure during compilation ${i}: ${error}`)); + } + }); + }); + } + }); + }); + + describe(`[workbox-webpack-plugin] Multiple plugin instances`, function() { + // See https://github.com/GoogleChrome/workbox/issues/2181 + it(`should not list the swDest from one plugin in the other's manifest`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:20].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + exclude: [/sw\d.js/], + swSrc: upath.join(__dirname, '..', '..', 'static', 'sw.ts'), + swDest: 'sw1.js', + }), + new InjectManifest({ + exclude: [/sw\d.js/], + swSrc: upath.join(__dirname, '..', '..', 'static', 'sw.ts'), + swDest: 'sw2.js', + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const sw1File = upath.join(outputDir, 'sw1.js'); + const sw2File = upath.join(outputDir, 'sw2.js'); + + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(3); + + await validateServiceWorkerRuntime({ + swFile: sw1File, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: /^main\.[0-9a-f]{20}\.js$/, + }], {}]], + }, + }); + + await validateServiceWorkerRuntime({ + swFile: sw2File, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: /^main\.[0-9a-f]{20}\.js$/, + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Manifest injection in development mode`, function() { + it(`should produce valid, parsable JavaScript`, function(done) { + const outputDir = tempy.directory(); + const config = { + mode: 'development', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:20].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + exclude: [/sw\d.js/], + swDest: 'sw.js', + swSrc: upath.join(__dirname, '..', '..', 'static', 'sw-src.js'), + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + const swFile = upath.join(outputDir, 'sw.js'); + + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(2); + + await validateServiceWorkerRuntime({ + swFile: swFile, + entryPoint: 'injectManifest', + expectedMethodCalls: { + precacheAndRoute: [[[{ + revision: /^[0-9a-f]{32}$/, + url: /^main\.[0-9a-f]{20}\.js$/, + }], {}]], + }, + }); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + describe(`[workbox-webpack-plugin] Non-compilation scenarios`, function() { + it(`should error when compileSrc is false and webpackCompilationPlugins is used`, function(done) { + const outputDir = tempy.directory(); + + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:20].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + compileSrc: false, + swDest: 'injected-manifest.json', + swSrc: upath.join(__dirname, '..', 'static', 'injected-manifest.json'), + webpackCompilationPlugins: [{}], + }), + ], + }; + + const compiler = webpack(config); + compiler.run((webpackError, stats) => { + try { + expect(webpackError).not.to.exist; + const statsJson = stats.toJson(); + expect(statsJson.warnings).to.be.empty; + expect(statsJson.errors[0].message).to.eql( + `Please check your InjectManifest plugin configuration:\n"webpackCompilationPlugins" is not allowed`, + ); + + done(); + } catch (error) { + done(error); + } + }); + }); + + it(`should support injecting a manifest into a JSON file`, function(done) { + const outputDir = tempy.directory(); + + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:20].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + compileSrc: false, + swDest: 'injected-manifest.json', + swSrc: upath.join(__dirname, '..', '..', 'static', 'injected-manifest.json'), + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(2); + + const manifest = await fse.readJSON(upath.join(outputDir, 'injected-manifest.json')); + expect(manifest).to.matchPattern([{ + revision: /^[0-9a-f]{32}$/, + url: /^main\.[0-9a-f]{20}\.js$/, + }]); + + done(); + } catch (error) { + done(error); + } + }); + }); + }); + + it(`should support injecting a manifest into a CJS module`, function(done) { + const outputDir = tempy.directory(); + + const config = { + mode: 'production', + entry: upath.join(SRC_DIR, WEBPACK_ENTRY_FILENAME), + output: { + filename: '[name].[contenthash:20].js', + path: outputDir, + }, + plugins: [ + new InjectManifest({ + compileSrc: false, + swDest: 'injected-manifest.js', + swSrc: upath.join(__dirname, '..', '..', 'static', 'injected-manifest.js'), + }), + ], + }; + + const compiler = webpack(config); + compiler.run(async (webpackError, stats) => { + try { + webpackBuildCheck(webpackError, stats); + + const files = await globby('**', {cwd: outputDir}); + expect(files).to.have.length(2); + + const manifest = require(upath.join(outputDir, 'injected-manifest.js')); + expect(manifest).to.matchPattern([{ + revision: /^[0-9a-f]{32}$/, + url: /^main\.[0-9a-f]{20}\.js$/, + }]); + + done(); + } catch (error) { + done(error); + } + }); + }); +}); diff --git a/test/workbox-webpack-plugin/node/v5/lib/create-webpack-asset-plugin.js b/test/workbox-webpack-plugin/node/v5/lib/create-webpack-asset-plugin.js new file mode 100644 index 000000000..a1c4a6c6c --- /dev/null +++ b/test/workbox-webpack-plugin/node/v5/lib/create-webpack-asset-plugin.js @@ -0,0 +1,30 @@ +/* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ + +const {sources} = require('webpack'); + +class CreateWebpackAssetPlugin { + constructor(name) { + if (typeof name !== 'string') { + throw new Error('Please pass in a string.'); + } + this.name = name; + } + + apply(compiler) { + compiler.hooks.thisCompilation.tap( + this.constructor.name, + (compilation) => compilation.emitAsset( + this.name, + new sources.RawSource(this.name), + ), + ); + } +} + +module.exports = CreateWebpackAssetPlugin; diff --git a/test/workbox-webpack-plugin/node/v5/static/expected-service-worker.js.map b/test/workbox-webpack-plugin/node/v5/static/expected-service-worker.js.map new file mode 100644 index 000000000..803473a7b --- /dev/null +++ b/test/workbox-webpack-plugin/node/v5/static/expected-service-worker.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack://workbox/./test/workbox-webpack-plugin/static/sw-src.js"],"names":["workbox","precaching","precacheAndRoute","self","__WB_MANIFEST"],"mappings":"AAQA,QAAQ,WAAW,iBAAiB,4DAAK,cAAe","file":"service-worker.js","sourceRoot":"","sourcesContent":["/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nworkbox.precaching.precacheAndRoute(self.__WB_MANIFEST, {});\n"]} diff --git a/test/workbox-webpack-plugin/static/example-project-1/webpackEntry.js b/test/workbox-webpack-plugin/static/example-project-1/webpackEntry.js index 4f48fbe29..e196554bd 100644 --- a/test/workbox-webpack-plugin/static/example-project-1/webpackEntry.js +++ b/test/workbox-webpack-plugin/static/example-project-1/webpackEntry.js @@ -6,4 +6,4 @@ https://opensource.org/licenses/MIT. */ -// Just a test. +console.log('I am an entry.');