From ef6071de56d54750cf9a485bce65ab2e704fa078 Mon Sep 17 00:00:00 2001 From: nadvolod Date: Fri, 30 Sep 2022 09:29:27 -0400 Subject: [PATCH 1/3] install happo --- web-testing-2022/cypress/support/commands.js | 25 - web-testing-2022/package-lock.json | 1175 +++++++++++++++++- web-testing-2022/package.json | 5 +- 3 files changed, 1178 insertions(+), 27 deletions(-) diff --git a/web-testing-2022/cypress/support/commands.js b/web-testing-2022/cypress/support/commands.js index e7bd080..119ab03 100644 --- a/web-testing-2022/cypress/support/commands.js +++ b/web-testing-2022/cypress/support/commands.js @@ -23,28 +23,3 @@ // // -- This will overwrite an existing command -- // Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) - -/** - * Set the test context - * - * @param {object} data - * @param {object} data.user - * @param {string} data.user.username - * @param {string} data.user.password - * @param {string} data.path - * @param {array} data.products - */ - Cypress.Commands.add("setTestContext", (data = {}) => { - const {path, products = [], user} = data; - const {username} = user; - const productStorage = products.length > 0 ? `[${products.toString()}]` : '[]'; - - // Go to the domain and set the storage - cy.visit(''); - window.sessionStorage.setItem("session-username", username); - window.sessionStorage.setItem("cart-contents", productStorage); - cy.reload(); - - // Now got to the page - cy.visit(path); - }); \ No newline at end of file diff --git a/web-testing-2022/package-lock.json b/web-testing-2022/package-lock.json index 05bbdb7..b0474a5 100644 --- a/web-testing-2022/package-lock.json +++ b/web-testing-2022/package-lock.json @@ -18,7 +18,10 @@ "web-vitals": "^2.1.4" }, "devDependencies": { - "cypress": "^10.4.0" + "cypress": "^10.4.0", + "happo-cypress": "^3.0.1", + "happo-e2e": "^1.2.1", + "happo.io": "^8.1.1" } }, "node_modules/@adobe/css-tools": { @@ -4725,6 +4728,75 @@ } ] }, + "node_modules/archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dev": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/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==", + "dev": true + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -4871,6 +4943,15 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "dependencies": { + "retry": "0.13.1" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -5216,6 +5297,12 @@ } ] }, + "node_modules/base64-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", + "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", + "dev": true + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -5260,6 +5347,17 @@ "node": ">=8" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/blob-util": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", @@ -5449,6 +5547,12 @@ "node": "*" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -5901,6 +6005,21 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dev": true, + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -6062,6 +6181,31 @@ "node": ">=10" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -6075,6 +6219,12 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==", + "dev": true + }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -6943,6 +7093,15 @@ "safer-buffer": "^2.1.0" } }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -8417,6 +8576,12 @@ "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -8720,6 +8885,125 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, + "node_modules/happo-cypress": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/happo-cypress/-/happo-cypress-3.0.1.tgz", + "integrity": "sha512-x95Nhj1tjPzBZS8MyCyCbzXSJBJwjK2R/EJ5WQJQDHpj+bPoBP6JmT2wM5Pzoq7gt9+BhQm5IE8SIM05ltOSxQ==", + "dev": true, + "dependencies": { + "happo-e2e": "^1.0.3" + }, + "bin": { + "happo-cypress": "bin/happo-cypress.js" + } + }, + "node_modules/happo-e2e": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/happo-e2e/-/happo-e2e-1.2.1.tgz", + "integrity": "sha512-JAQ3wvoG6sgfO/qqqUeP5RjEoUXDp4UH2EBpTWS8sTdk0YkN6uYAIAYqLg4trgK3ub1/R2XU22y3vQNk7qNpjw==", + "dev": true, + "dependencies": { + "archiver": "^5.3.0", + "base64-stream": "^1.0.0", + "crypto-js": "^4.1.1", + "https-proxy-agent": "^5.0.0", + "image-size": "^1.0.1", + "mkdirp": "^1.0.4", + "node-fetch": "^2.0.0", + "parse-srcset": "^1.0.2", + "string.prototype.replaceall": "^1.0.6" + }, + "bin": { + "happo-e2e": "bin/happo-e2e.js" + } + }, + "node_modules/happo-e2e/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/happo.io": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/happo.io/-/happo.io-8.1.1.tgz", + "integrity": "sha512-yVHvxreQaqAQgqqvjKf/jEKpWjc4j4vp92wze+UvZkVoV2U+McBS8liRr4ebZHs2qTbJYZ15nFE3v+wlO2Tfrg==", + "dev": true, + "dependencies": { + "@babel/preset-react": "^7.12.1", + "archiver": "^5.0.2", + "async-retry": "^1.3.1", + "babel-plugin-dynamic-import-node": "^2.1.0", + "commander": "^2.15.1", + "form-data": "^4.0.0", + "glob": "^7.1.2", + "https-proxy-agent": "^5.0.0", + "jsdom": "^16.4.0", + "jsonwebtoken": "^8.2.1", + "lcs-image-diff": "^2.0.0", + "node-fetch": "^2.6.6", + "parse-srcset": "^1.0.2", + "pngjs": "^3.4.0", + "prettier": "^2.2.0", + "require-relative": "^0.8.7", + "rimraf": "^3.0.0", + "source-map-support": "^0.5.9", + "string.prototype.matchall": "^4.0.0", + "supports-color": "^7.1.0" + }, + "bin": { + "happo": "build/cli.js", + "happo-ci": "bin/happo-ci", + "happo-ci-azure-pipelines": "bin/happo-ci-azure-pipelines", + "happo-ci-circleci": "bin/happo-ci-circleci", + "happo-ci-github-actions": "bin/happo-ci-github-actions", + "happo-ci-travis": "bin/happo-ci-travis" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "babel-loader": "^7.0.0 || ^8.0.0", + "webpack": "^3.5.5 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/happo.io/node_modules/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 + }, + "node_modules/happo.io/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/happo.io/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/harmony-reflect": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", @@ -9106,6 +9390,27 @@ "node": ">= 4" } }, + "node_modules/image-size": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", + "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "dev": true, + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/imagetracerjs": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/imagetracerjs/-/imagetracerjs-1.2.6.tgz", + "integrity": "sha512-LKJlnKmXFzDdh6IZtXTyBxXcCLTAkwgKYS+NMiPXiXVnlTLjQC8fq7U89laUSgHtypJB3TdMMDK4ecG5NI/Cgw==", + "dev": true + }, "node_modules/immer": { "version": "9.0.15", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz", @@ -11761,6 +12066,37 @@ "node": ">=0.10.0" } }, + "node_modules/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "dev": true, + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=4", + "npm": ">=1.4.28" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/jsprim": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", @@ -11788,6 +12124,27 @@ "node": ">=4.0" } }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dev": true, + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dev": true, + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -11834,6 +12191,57 @@ "node": "> 0.8" } }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/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==", + "dev": true + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lcs-image-diff": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/lcs-image-diff/-/lcs-image-diff-2.1.1.tgz", + "integrity": "sha512-pMsEXSN3GibFRxP5oH3b+3sJ6DA926XCeFLmkdxbp9QucwiAQ2nmMOaQECTP+NZ8+zo1ZIbs+Qqfa6Jm9Qtb0Q==", + "dev": true, + "dependencies": { + "imagetracerjs": "^1.2.5" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -11939,6 +12347,60 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -11960,6 +12422,12 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true + }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -12368,6 +12836,48 @@ "tslib": "^2.0.3" } }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -12747,6 +13257,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", + "dev": true + }, "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -12980,6 +13496,15 @@ "node": ">=4" } }, + "node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/postcss": { "version": "8.4.16", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", @@ -14152,6 +14677,21 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -14308,6 +14848,15 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.3" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -14611,6 +15160,36 @@ "node": ">= 6" } }, + "node_modules/readdir-glob": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", + "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==", + "dev": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -14802,6 +15381,12 @@ "node": ">=0.10.0" } }, + "node_modules/require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==", + "dev": true + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -15629,6 +16214,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.replaceall": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.replaceall/-/string.prototype.replaceall-1.0.6.tgz", + "integrity": "sha512-OA8VDhE7ssNFlyoDXUHxw6V5cjgPrtosyJKqJX5i1P5tV9eUynsbhx1yz0g+Ye4fjFwAxhKLxt8GSRx2Aqc+Sw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", @@ -15996,6 +16598,22 @@ "node": ">=6" } }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -17451,6 +18069,20 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dev": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } } }, "dependencies": { @@ -20814,6 +21446,71 @@ "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", "dev": true }, + "archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -20924,6 +21621,15 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, + "async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "requires": { + "retry": "0.13.1" + } + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -21177,6 +21883,12 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "base64-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", + "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", + "dev": true + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -21212,6 +21924,17 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "blob-util": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", @@ -21351,6 +22074,12 @@ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -21685,6 +22414,18 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, + "compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -21815,6 +22556,22 @@ "yaml": "^1.10.0" } }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true + }, + "crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dev": true, + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -21825,6 +22582,12 @@ "which": "^2.0.1" } }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==", + "dev": true + }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -22448,6 +23211,15 @@ "safer-buffer": "^2.1.0" } }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -23532,6 +24304,12 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -23755,6 +24533,96 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, + "happo-cypress": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/happo-cypress/-/happo-cypress-3.0.1.tgz", + "integrity": "sha512-x95Nhj1tjPzBZS8MyCyCbzXSJBJwjK2R/EJ5WQJQDHpj+bPoBP6JmT2wM5Pzoq7gt9+BhQm5IE8SIM05ltOSxQ==", + "dev": true, + "requires": { + "happo-e2e": "^1.0.3" + } + }, + "happo-e2e": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/happo-e2e/-/happo-e2e-1.2.1.tgz", + "integrity": "sha512-JAQ3wvoG6sgfO/qqqUeP5RjEoUXDp4UH2EBpTWS8sTdk0YkN6uYAIAYqLg4trgK3ub1/R2XU22y3vQNk7qNpjw==", + "dev": true, + "requires": { + "archiver": "^5.3.0", + "base64-stream": "^1.0.0", + "crypto-js": "^4.1.1", + "https-proxy-agent": "^5.0.0", + "image-size": "^1.0.1", + "mkdirp": "^1.0.4", + "node-fetch": "^2.0.0", + "parse-srcset": "^1.0.2", + "string.prototype.replaceall": "^1.0.6" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "happo.io": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/happo.io/-/happo.io-8.1.1.tgz", + "integrity": "sha512-yVHvxreQaqAQgqqvjKf/jEKpWjc4j4vp92wze+UvZkVoV2U+McBS8liRr4ebZHs2qTbJYZ15nFE3v+wlO2Tfrg==", + "dev": true, + "requires": { + "@babel/preset-react": "^7.12.1", + "archiver": "^5.0.2", + "async-retry": "^1.3.1", + "babel-plugin-dynamic-import-node": "^2.1.0", + "commander": "^2.15.1", + "form-data": "^4.0.0", + "glob": "^7.1.2", + "https-proxy-agent": "^5.0.0", + "jsdom": "^16.4.0", + "jsonwebtoken": "^8.2.1", + "lcs-image-diff": "^2.0.0", + "node-fetch": "^2.6.6", + "parse-srcset": "^1.0.2", + "pngjs": "^3.4.0", + "prettier": "^2.2.0", + "require-relative": "^0.8.7", + "rimraf": "^3.0.0", + "source-map-support": "^0.5.9", + "string.prototype.matchall": "^4.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "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 + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "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" + } + } + } + }, "harmony-reflect": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", @@ -24029,6 +24897,21 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" }, + "image-size": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", + "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "dev": true, + "requires": { + "queue": "6.0.2" + } + }, + "imagetracerjs": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/imagetracerjs/-/imagetracerjs-1.2.6.tgz", + "integrity": "sha512-LKJlnKmXFzDdh6IZtXTyBxXcCLTAkwgKYS+NMiPXiXVnlTLjQC8fq7U89laUSgHtypJB3TdMMDK4ecG5NI/Cgw==", + "dev": true + }, "immer": { "version": "9.0.15", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz", @@ -26083,6 +26966,32 @@ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==" }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "dev": true, + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "jsprim": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", @@ -26104,6 +27013,27 @@ "object.assign": "^4.1.3" } }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dev": true, + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dev": true, + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -26138,6 +27068,56 @@ "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", "dev": true }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "lcs-image-diff": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/lcs-image-diff/-/lcs-image-diff-2.1.1.tgz", + "integrity": "sha512-pMsEXSN3GibFRxP5oH3b+3sJ6DA926XCeFLmkdxbp9QucwiAQ2nmMOaQECTP+NZ8+zo1ZIbs+Qqfa6Jm9Qtb0Q==", + "dev": true, + "requires": { + "imagetracerjs": "^1.2.5" + } + }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -26211,6 +27191,60 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -26232,6 +27266,12 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -26532,6 +27572,39 @@ "tslib": "^2.0.3" } }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + }, + "dependencies": { + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -26794,6 +27867,12 @@ "lines-and-columns": "^1.1.6" } }, + "parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", + "dev": true + }, "parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -26965,6 +28044,12 @@ } } }, + "pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "dev": true + }, "postcss": { "version": "8.4.16", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", @@ -27623,6 +28708,12 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true + }, "pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -27751,6 +28842,15 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, + "queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dev": true, + "requires": { + "inherits": "~2.0.3" + } + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -27981,6 +29081,35 @@ "util-deprecate": "^1.0.1" } }, + "readdir-glob": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", + "integrity": "sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==", + "dev": true, + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -28131,6 +29260,12 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, + "require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==", + "dev": true + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -28741,6 +29876,20 @@ "side-channel": "^1.0.4" } }, + "string.prototype.replaceall": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.replaceall/-/string.prototype.replaceall-1.0.6.tgz", + "integrity": "sha512-OA8VDhE7ssNFlyoDXUHxw6V5cjgPrtosyJKqJX5i1P5tV9eUynsbhx1yz0g+Ye4fjFwAxhKLxt8GSRx2Aqc+Sw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "is-regex": "^1.1.4" + } + }, "string.prototype.trimend": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", @@ -29013,6 +30162,19 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, "temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -30114,6 +31276,17 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + }, + "zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + } } } } diff --git a/web-testing-2022/package.json b/web-testing-2022/package.json index 615a290..726caed 100644 --- a/web-testing-2022/package.json +++ b/web-testing-2022/package.json @@ -16,7 +16,10 @@ "web-vitals": "^2.1.4" }, "devDependencies": { - "cypress": "^10.4.0" + "cypress": "^10.4.0", + "happo-cypress": "^3.0.1", + "happo-e2e": "^1.2.1", + "happo.io": "^8.1.1" }, "scripts": { "start": "react-scripts start", From 0b7fb8f93f6843fa495dcb11b9c12e6c938567a0 Mon Sep 17 00:00:00 2001 From: nadvolod Date: Fri, 30 Sep 2022 09:50:18 -0400 Subject: [PATCH 2/3] working visual tests --- web-testing-2022/.eslintrc | 3 +++ web-testing-2022/.happo.js | 13 +++++++++++++ web-testing-2022/cypress.config.js | 9 ++++----- web-testing-2022/cypress/e2e/visual.cy.js | 13 +++++++++++++ ...ue shopping -- before each hook (failed).png | Bin 66058 -> 0 bytes web-testing-2022/cypress/support/commands.js | 2 ++ web-testing-2022/package.json | 2 +- 7 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 web-testing-2022/.happo.js create mode 100644 web-testing-2022/cypress/e2e/visual.cy.js delete mode 100644 web-testing-2022/cypress/screenshots/checkout.cy.js/Checkout -- should validate that we can continue shopping -- before each hook (failed).png diff --git a/web-testing-2022/.eslintrc b/web-testing-2022/.eslintrc index 4383690..1a64179 100644 --- a/web-testing-2022/.eslintrc +++ b/web-testing-2022/.eslintrc @@ -3,6 +3,9 @@ "browser": true, "node": true }, + "globals": { + "cy": true + }, // parser not working w/ react // "parser": "babel-eslint", "parserOptions": { diff --git a/web-testing-2022/.happo.js b/web-testing-2022/.happo.js new file mode 100644 index 0000000..d435eb4 --- /dev/null +++ b/web-testing-2022/.happo.js @@ -0,0 +1,13 @@ +// .happo.js +const { RemoteBrowserTarget } = require('happo.io'); + +module.exports = { + apiKey: process.env.HAPPO_API_KEY, + apiSecret: process.env.HAPPO_API_SECRET, + project: "web-test-2022", + targets: { + chrome: new RemoteBrowserTarget('chrome', { + viewport: '1024x768', + }), + }, +}; diff --git a/web-testing-2022/cypress.config.js b/web-testing-2022/cypress.config.js index 22ba3b0..5a70d18 100644 --- a/web-testing-2022/cypress.config.js +++ b/web-testing-2022/cypress.config.js @@ -1,14 +1,13 @@ -const { defineConfig } = require("cypress"); +const { defineConfig } = require('cypress'); +const happoTask = require('happo-cypress/task'); module.exports = defineConfig({ e2e: { setupNodeEvents(on, config) { // implement node event listeners here + happoTask.register(on); + return config; }, baseUrl: 'http://localhost:3000', - 'chromeWebSecurity': false, - 'failOnStatusCode': false, - 'experimentalSessionSupport': true, - 'experimentalSessionAndOrigin': true }, }); diff --git a/web-testing-2022/cypress/e2e/visual.cy.js b/web-testing-2022/cypress/e2e/visual.cy.js new file mode 100644 index 0000000..f70810a --- /dev/null +++ b/web-testing-2022/cypress/e2e/visual.cy.js @@ -0,0 +1,13 @@ +describe('home page', () => { + beforeEach(() => { + cy.visit('/'); + // need to scroll to handle lazy loading + // since our page is tiny, it's not scrollable + cy.scrollTo('bottom', { duration: 5000, ensureScrollable: false }); + cy.scrollTo('top', { duration: 3000, ensureScrollable: false }); + }); + + it('looks good', () => { + cy.get('body').happoScreenshot(); + }); +}); diff --git a/web-testing-2022/cypress/screenshots/checkout.cy.js/Checkout -- should validate that we can continue shopping -- before each hook (failed).png b/web-testing-2022/cypress/screenshots/checkout.cy.js/Checkout -- should validate that we can continue shopping -- before each hook (failed).png deleted file mode 100644 index 84ca9ea846a4e1eb9cbb359e14776fbaa155c357..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66058 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 diff --git a/web-testing-2022/cypress/support/commands.js b/web-testing-2022/cypress/support/commands.js index 119ab03..691c25e 100644 --- a/web-testing-2022/cypress/support/commands.js +++ b/web-testing-2022/cypress/support/commands.js @@ -1,3 +1,4 @@ +import 'happo-cypress'; // *********************************************** // This example commands.js shows you how to // create various custom commands and overwrite @@ -23,3 +24,4 @@ // // -- This will overwrite an existing command -- // Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) + diff --git a/web-testing-2022/package.json b/web-testing-2022/package.json index 726caed..6c52185 100644 --- a/web-testing-2022/package.json +++ b/web-testing-2022/package.json @@ -26,7 +26,7 @@ "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", - "test.atomic.checkout": "cypress run --spec \"cypress/e2e/checkout.cy.js\" --browser chrome" + "test:visual": "npx happo-e2e -- npx cypress run --spec 'cypress/e2e/visual.cy.js'" }, "eslintConfig": { "extends": [ From f64b373909fe886426f365478bd7580ba77c2a6e Mon Sep 17 00:00:00 2001 From: nadvolod Date: Fri, 30 Sep 2022 11:17:18 -0400 Subject: [PATCH 3/3] working visual tests --- web-testing-2022/.happo.js | 49 +++++++++++++++++++++++++++++++-- web-testing-2022/docs/VISUAL.md | 25 +++-------------- 2 files changed, 51 insertions(+), 23 deletions(-) diff --git a/web-testing-2022/.happo.js b/web-testing-2022/.happo.js index d435eb4..26b871f 100644 --- a/web-testing-2022/.happo.js +++ b/web-testing-2022/.happo.js @@ -6,8 +6,53 @@ module.exports = { apiSecret: process.env.HAPPO_API_SECRET, project: "web-test-2022", targets: { - chrome: new RemoteBrowserTarget('chrome', { - viewport: '1024x768', + "chrome-1080p": new RemoteBrowserTarget("chrome", { + viewport: "1920x1080", + freezeAnimations: "last-frame", + }), + // all viewports https://viewportsizer.com/devices/ + // Samsung Galaxy S10+, S10 + "chrome-galaxy-s10": new RemoteBrowserTarget("chrome", { + viewport: "360x740", + freezeAnimations: "last-frame", + }), + // iphone viewports https://yesviz.com/iphones.php + "safari-1080p": new RemoteBrowserTarget("safari", { + viewport: "1920x1080", + freezeAnimations: "last-frame", + // so that safari won't cut off the screenshot at window height + scrollStitch: true, + }), + // iphone 12 pro + "safari-iphone-12-pro": new RemoteBrowserTarget("safari", { + viewport: "390x844", + freezeAnimations: "last-frame", + scrollStitch: true, + }), + "Apple-iPad-Pro-12.9": new RemoteBrowserTarget("safari", { + viewport: "1024x1366", + freezeAnimations: "last-frame", + scrollStitch: true, + }), + "Apple-iPad-Air": new RemoteBrowserTarget("safari", { + viewport: "834x1112", + freezeAnimations: "last-frame", + scrollStitch: true, + }), + "MacBook Pro 13.3": new RemoteBrowserTarget("safari", { + viewport: "1280x800", + freezeAnimations: "last-frame", + scrollStitch: true, + }), + "MacBook Pro 16": new RemoteBrowserTarget("safari", { + viewport: "1536x960", + freezeAnimations: "last-frame", + scrollStitch: true, + }), + // iphone 12 pro + "chrome-650": new RemoteBrowserTarget("chrome", { + viewport: "650x415", + freezeAnimations: "last-frame", }), }, }; diff --git a/web-testing-2022/docs/VISUAL.md b/web-testing-2022/docs/VISUAL.md index f9c6318..78d5bdf 100644 --- a/web-testing-2022/docs/VISUAL.md +++ b/web-testing-2022/docs/VISUAL.md @@ -39,31 +39,14 @@ follow setup instructions [Let's fill out the Test coverage](./TEST-COVERAGE.md) ---- - -### 🏋️‍♀️❓ Let's change our image, what tests should that break❓ - ---- +## 📝 Visual gotchas -We're going to update the React image to something better. What tests should break? - -1. Drag'n drop a new image to the `/src` folder -2. In `App.js`, Fix the path of the image to match your new image name `import logo from './mia.jpg';` -3. Save all files -4. Stop the React app `ctrl + C` in the server terminal -5. Restart the app with `npm start` -6. Rerun the visual tests with `npm run test:visual` -7. Notice the results in your terminal - -## 🏋️‍♀️ How can you make the tests also run on Safari desktop and Safari mobile resolutions? - -1. Do it -2. Rerun visual tests `npm run test:visual` +- Animations such as spinners and carousels +- Lazy loading +- Long pages ## 📝Summary ✅Visual e2e testing is a simple and efficient way to ensure visual consistency cross-platform and cross-OS -✅We used WebdriverIO + Screener.io to write our visual e2e tests - ## ⏭️[Let's make our tests run in CI](./CICD.md)